From: Doyun Kang <doyoun.kang@samsung.com>

Add support for shape input setting and modification (with
fixes/modifications and extensions added tomake it more complete).



SVN revision: 58621
This commit is contained in:
Doyun Kang 2011-04-13 09:06:05 +00:00 committed by Carsten Haitzler
parent 1dac813ace
commit 631f94a523
7 changed files with 687 additions and 84 deletions

View File

@ -127,3 +127,7 @@
2011-04-11 Hannes Janetzek
* Fix removal of windows from ignore_list with ecore_x_window_ignore_set
2011-04-13 Doyun Kang
* Ecore_X + Ecore_Evas: Add more support for shape input setting

View File

@ -363,7 +363,13 @@ EAPI Eina_List *ecore_evas_ecore_evas_list_get(void);
EAPI void ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win);
EAPI Ecore_X_Window ecore_evas_x11_leader_get(Ecore_Evas *ee);
EAPI void ecore_evas_x11_leader_default_set(Ecore_Evas *ee);
EAPI void ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h);
EAPI void ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h);
EAPI void ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h);
EAPI void ecore_evas_x11_shape_input_empty(Ecore_Evas *ee);
EAPI void ecore_evas_x11_shape_input_reset(Ecore_Evas *ee);
EAPI void ecore_evas_x11_shape_input_apply(Ecore_Evas *ee);
#ifdef __cplusplus
}
#endif

View File

@ -226,6 +226,7 @@ struct _Ecore_Evas_Engine
unsigned char above : 1;
unsigned char below : 1;
} state;
Ecore_X_Window win_shaped_input;
} x;
#endif
#ifdef BUILD_ECORE_EVAS_FB

View File

@ -1297,6 +1297,7 @@ _ecore_evas_x_free(Ecore_Evas *ee)
{
_ecore_evas_x_group_leader_unset(ee);
_ecore_evas_x_sync_set(ee);
if (ee->engine.x.win_shaped_input) ecore_x_window_free(ee->engine.x.win_shaped_input);
ecore_x_window_free(ee->prop.window);
if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
@ -4572,3 +4573,221 @@ ecore_evas_x11_leader_default_set(Ecore_Evas *ee)
#endif
}
static Eina_Bool
_ecore_evas_x11_convert_rectangle_with_angle(Ecore_Evas *ee, Ecore_X_Rectangle *dst_rect, Ecore_X_Rectangle *src_rect)
{
#ifdef BUILD_ECORE_EVAS_X11
if (!src_rect || !dst_rect) return 0;
if (ee->rotation == 0)
{
dst_rect->x = src_rect->x;
dst_rect->y = src_rect->y;
dst_rect->width = src_rect->width;
dst_rect->height = src_rect->height;
}
else if (ee->rotation == 90)
{
dst_rect->x = src_rect->y;
dst_rect->y = ee->req.h - src_rect->x - src_rect->width;
dst_rect->width = src_rect->height;
dst_rect->height = src_rect->width;
}
else if (ee->rotation == 180)
{
dst_rect->x = ee->req.w - src_rect->x - src_rect->width;
dst_rect->y = ee->req.h - src_rect->y - src_rect->height;
dst_rect->width = src_rect->width;
dst_rect->height = src_rect->height;
}
else if (ee->rotation == 270)
{
dst_rect->x = ee->req.w - src_rect->y - src_rect->height;
dst_rect->y = src_rect->x;
dst_rect->width = src_rect->height;
dst_rect->height = src_rect->width;
}
else
{
return 0;
}
return 1;
#else
return 0;
#endif
}
EAPI void
ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h)
{
#ifdef BUILD_ECORE_EVAS_X11
Eina_Bool ret;
Ecore_X_Rectangle src_rect;
Ecore_X_Rectangle dst_rect;
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
"ecore_evas_x11_shape_input_rectangle_set");
return;
}
src_rect.x = x;
src_rect.y = y;
src_rect.width = w;
src_rect.height = h;
ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
if (!ee->engine.x.win_shaped_input)
ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
if (ret)
ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, dst_rect.x, dst_rect.y, dst_rect.width, dst_rect.height);
#else
return;
ee = NULL;
x = 0;
y = 0;
w = 0;
h = 0;
#endif
}
EAPI void
ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h)
{
#ifdef BUILD_ECORE_EVAS_X11
Eina_Bool ret;
Ecore_X_Rectangle src_rect;
Ecore_X_Rectangle dst_rect;
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
"ecore_evas_x11_shape_input_rectangle_add");
return;
}
src_rect.x = x;
src_rect.y = y;
src_rect.width = w;
src_rect.height = h;
ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
if (!ee->engine.x.win_shaped_input)
ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
if (ret)
ecore_x_window_shape_input_rectangle_add(ee->engine.x.win_shaped_input, dst_rect.x, dst_rect.y, dst_rect.width, dst_rect.height);
#else
return;
ee = NULL;
x = 0;
y = 0;
w = 0;
h = 0;
#endif
}
EAPI void
ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h)
{
#ifdef BUILD_ECORE_EVAS_X11
Eina_Bool ret;
Ecore_X_Rectangle src_rect;
Ecore_X_Rectangle dst_rect;
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
"ecore_evas_x11_shape_input_rectangle_subtract");
return;
}
src_rect.x = x;
src_rect.y = y;
src_rect.width = w;
src_rect.height = h;
ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
if (!ee->engine.x.win_shaped_input)
ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
if (ret)
ecore_x_window_shape_input_rectangle_subtract(ee->engine.x.win_shaped_input, dst_rect.x, dst_rect.y, dst_rect.width, dst_rect.height);
#else
return;
ee = NULL;
x = 0;
y = 0;
w = 0;
h = 0;
#endif
}
EAPI void
ecore_evas_x11_shape_input_empty(Ecore_Evas *ee)
{
#ifdef BUILD_ECORE_EVAS_X11
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
"ecore_evas_x11_shape_input_empty");
return;
}
if (!ee->engine.x.win_shaped_input)
ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 0, 0);
#else
return;
ee = NULL;
#endif
}
EAPI void
ecore_evas_x11_shape_input_reset(Ecore_Evas *ee)
{
#ifdef BUILD_ECORE_EVAS_X11
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
"ecore_evas_x11_shape_input_reset");
return;
}
if (!ee->engine.x.win_shaped_input)
ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 65535, 65535);
#else
return;
ee = NULL;
#endif
}
EAPI void
ecore_evas_x11_shape_input_apply(Ecore_Evas *ee)
{
#ifdef BUILD_ECORE_EVAS_X11
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
"ecore_evas_x11_shape_input_apply");
return;
}
if (!ee->engine.x.win_shaped_input) return;
ecore_x_window_shape_input_window_set(ee->prop.window, ee->engine.x.win_shaped_input);
#else
return;
ee = NULL;
#endif
}

View File

@ -1505,6 +1505,11 @@ EAPI void ecore_x_window_shape_window_set_xy(
Ecore_X_Window shape_win,
int x,
int y);
EAPI void ecore_x_window_shape_window_set_xy(
Ecore_X_Window win,
Ecore_X_Window shape_win,
int x,
int y);
EAPI void ecore_x_window_shape_rectangle_set(
Ecore_X_Window win,
int x,
@ -1515,6 +1520,42 @@ EAPI void ecore_x_window_shape_rectangles_set(
Ecore_X_Window win,
Ecore_X_Rectangle *rects,
int num);
EAPI void ecore_x_window_shape_input_rectangle_set(
Ecore_X_Window win,
int x,
int y,
int w,
int h);
EAPI void ecore_x_window_shape_input_rectangles_set(
Ecore_X_Window win,
Ecore_X_Rectangle *rects,
int num);
EAPI void ecore_x_window_shape_input_rectangle_add(
Ecore_X_Window win,
int x,
int y,
int w,
int h);
EAPI void ecore_x_window_shape_rectangle_subtract(
Ecore_X_Window win,
int x,
int y,
int w,
int h);
EAPI void ecore_x_window_shape_input_rectangle_subtract(
Ecore_X_Window win,
int x,
int y,
int w,
int h);
EAPI void ecore_x_window_shape_input_window_set_xy(
Ecore_X_Window win,
Ecore_X_Window shape_win,
int x,
int y);
EAPI void ecore_x_window_shape_input_window_set(
Ecore_X_Window win,
Ecore_X_Window shape_win);
EAPI void ecore_x_window_shape_window_add(
Ecore_X_Window win,
Ecore_X_Window shape_win);
@ -1523,6 +1564,11 @@ EAPI void ecore_x_window_shape_window_add_xy(
Ecore_X_Window shape_win,
int x,
int y);
EAPI void ecore_x_window_shape_input_window_add_xy(
Ecore_X_Window win,
Ecore_X_Window shape_win,
int x,
int y);
EAPI void ecore_x_window_shape_rectangle_add(
Ecore_X_Window win,
int x,
@ -1535,16 +1581,29 @@ EAPI void ecore_x_window_shape_rectangle_clip(
int y,
int w,
int h);
EAPI void ecore_x_window_shape_input_rectangle_clip(
Ecore_X_Window win,
int x,
int y,
int w,
int h);
EAPI void ecore_x_window_shape_rectangles_add(
Ecore_X_Window win,
Ecore_X_Rectangle *rects,
int num);
EAPI void ecore_x_window_shape_input_rectangles_add(
Ecore_X_Window win,
Ecore_X_Rectangle *rects,
int num);
EAPI void ecore_x_window_shape_rectangles_get_prefetch(
Ecore_X_Window window);
EAPI void ecore_x_window_shape_rectangles_get_fetch(void);
EAPI Ecore_X_Rectangle * ecore_x_window_shape_rectangles_get(
Ecore_X_Window win,
int *num_ret);
EAPI Ecore_X_Rectangle * ecore_x_window_shape_input_rectangles_get(
Ecore_X_Window win,
int *num_ret);
EAPI void ecore_x_window_shape_events_select(
Ecore_X_Window win,
Eina_Bool on);

View File

@ -131,12 +131,10 @@ EAPI Ecore_X_Pixmap
ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
{
Ecore_X_Pixmap pixmap = None;
#ifdef ECORE_XCOMPOSITE
LOGFN(__FILE__, __LINE__, __FUNCTION__);
pixmap = XCompositeNameWindowPixmap(_ecore_x_disp, win);
#endif /* ifdef ECORE_XCOMPOSITE */
return pixmap;
} /* ecore_x_composite_name_window_pixmap_get */
@ -144,13 +142,7 @@ EAPI void
ecore_x_composite_window_events_disable(Ecore_X_Window win)
{
#ifdef ECORE_XCOMPOSITE
XRectangle rect;
rect.x = -1;
rect.y = -1;
rect.width = 1;
rect.height = 1;
XShapeCombineRectangles(_ecore_x_disp, win, ShapeInput, 0, 0, &rect, 1,
ShapeSet, Unsorted);
ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
#endif /* ifdef ECORE_XCOMPOSITE */
}
@ -158,13 +150,7 @@ EAPI void
ecore_x_composite_window_events_enable(Ecore_X_Window win)
{
#ifdef ECORE_XCOMPOSITE
XRectangle rect;
rect.x = 0;
rect.y = 0;
rect.width = 65535;
rect.height = 65535;
XShapeCombineRectangles(_ecore_x_disp, win, ShapeInput, 0, 0, &rect, 1,
ShapeSet, Unsorted);
ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
#endif /* ifdef ECORE_XCOMPOSITE */
}
@ -173,16 +159,8 @@ ecore_x_composite_render_window_enable(Ecore_X_Window root)
{
Ecore_X_Window win = 0;
#ifdef ECORE_XCOMPOSITE
XRectangle rect;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
win = XCompositeGetOverlayWindow(_ecore_x_disp, root);
rect.x = -1;
rect.y = -1;
rect.width = 1;
rect.height = 1;
XShapeCombineRectangles(_ecore_x_disp, win, ShapeInput, 0, 0, &rect, 1,
ShapeSet, Unsorted);
ecore_x_composite_window_events_disable(win);
#endif /* ifdef ECORE_XCOMPOSITE */
return win;
} /* ecore_x_composite_render_window_enable */

View File

@ -29,6 +29,25 @@ ecore_x_window_shape_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask)
XShapeCombineMask(_ecore_x_disp, win, ShapeBounding, 0, 0, mask, ShapeSet);
} /* ecore_x_window_shape_mask_set */
/**
* Sets the input shape of the given window to that given by the pixmap @p mask.
* @param win The given window.
* @param mask A 1-bit depth pixmap that provides the new input shape of the
* window.
* @ingroup Ecore_X_Window_Shape
*/
EAPI void
ecore_x_window_shape_input_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
#ifdef ShapeInput
XShapeCombineMask(_ecore_x_disp, win, ShapeInput, 0, 0, mask, ShapeSet);
#else /* ifdef ShapeInput */
return;
win = mask = 0;
#endif /* ifdef ShapeInput */
} /* ecore_x_window_shape_input_mask_set */
EAPI void
ecore_x_window_shape_window_set(Ecore_X_Window win, Ecore_X_Window shape_win)
{
@ -43,6 +62,26 @@ ecore_x_window_shape_window_set(Ecore_X_Window win, Ecore_X_Window shape_win)
ShapeSet);
} /* ecore_x_window_shape_window_set */
EAPI void
ecore_x_window_shape_input_window_set(Ecore_X_Window win,
Ecore_X_Window shape_win)
{
#ifdef ShapeInput
LOGFN(__FILE__, __LINE__, __FUNCTION__);
XShapeCombineShape(_ecore_x_disp,
win,
ShapeInput,
0,
0,
shape_win,
ShapeInput,
ShapeSet);
#else
return;
win = shape_win = 0;
#endif
} /* ecore_x_window_shape_input_window_set */
EAPI void
ecore_x_window_shape_window_set_xy(Ecore_X_Window win,
Ecore_X_Window shape_win,
@ -60,6 +99,28 @@ ecore_x_window_shape_window_set_xy(Ecore_X_Window win,
ShapeSet);
} /* ecore_x_window_shape_window_set_xy */
EAPI void
ecore_x_window_shape_input_window_set_xy(Ecore_X_Window win,
Ecore_X_Window shape_win,
int x,
int y)
{
#ifdef ShapeInput
LOGFN(__FILE__, __LINE__, __FUNCTION__);
XShapeCombineShape(_ecore_x_disp,
win,
ShapeInput,
x,
y,
shape_win,
ShapeInput,
ShapeSet);
#else
return;
win = shape_win = x = y = 0;
#endif
} /* ecore_x_window_shape_input_window_set_xy */
EAPI void
ecore_x_window_shape_rectangle_set(Ecore_X_Window win,
int x,
@ -85,30 +146,59 @@ ecore_x_window_shape_rectangle_set(Ecore_X_Window win,
Unsorted);
} /* ecore_x_window_shape_rectangle_set */
EAPI void
ecore_x_window_shape_input_rectangle_set(Ecore_X_Window win,
int x,
int y,
int w,
int h)
{
#ifdef ShapeInput
XRectangle rect;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
rect.x = x;
rect.y = y;
rect.width = w;
rect.height = h;
XShapeCombineRectangles(_ecore_x_disp,
win,
ShapeInput,
0,
0,
&rect,
1,
ShapeSet,
Unsorted);
#else
return;
win = x = y = w = h = 0;
#endif
} /* ecore_x_window_shape_input_rectangle_set */
EAPI void
ecore_x_window_shape_rectangles_set(Ecore_X_Window win,
Ecore_X_Rectangle *rects,
int num)
{
#ifdef ShapeInput
XRectangle *rect = NULL;
int i;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!rects) return;
if (num > 0)
{
rect = malloc(sizeof(XRectangle) * num);
if (rect)
for (i = 0; i < num; i++)
{
rect[i].x = rects[i].x;
rect[i].y = rects[i].y;
rect[i].width = rects[i].width;
rect[i].height = rects[i].height;
}
else
num = 0;
if (!rect) return;
for (i = 0; i < num; i++)
{
rect[i].x = rects[i].x;
rect[i].y = rects[i].y;
rect[i].width = rects[i].width;
rect[i].height = rects[i].height;
}
}
XShapeCombineRectangles(_ecore_x_disp,
win,
ShapeBounding,
@ -118,10 +208,107 @@ ecore_x_window_shape_rectangles_set(Ecore_X_Window win,
num,
ShapeSet,
Unsorted);
if (rect)
free(rect);
if (rect) free(rect);
#else
return;
win = rects = num = 0;
#endif
} /* ecore_x_window_shape_rectangles_set */
EAPI void
ecore_x_window_shape_input_rectangles_set(Ecore_X_Window win,
Ecore_X_Rectangle *rects,
int num)
{
#ifdef ShapeInput
XRectangle *rect = NULL;
int i;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!rects) return;
if (num > 0)
{
rect = malloc(sizeof(XRectangle) * num);
if (!rect) return;
for (i = 0; i < num; i++)
{
rect[i].x = rects[i].x;
rect[i].y = rects[i].y;
rect[i].width = rects[i].width;
rect[i].height = rects[i].height;
}
}
XShapeCombineRectangles(_ecore_x_disp,
win,
ShapeInput,
0,
0,
rect,
num,
ShapeSet,
Unsorted);
if (rect) free(rect);
#else
return;
win = rects = num = 0;
#endif
} /* ecore_x_window_shape_input_rectangles_set */
EAPI void
ecore_x_window_shape_rectangle_subtract(Ecore_X_Window win,
int x,
int y,
int w,
int h)
{
XRectangle rect;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
rect.x = x;
rect.y = y;
rect.width = w;
rect.height = h;
XShapeCombineRectangles(_ecore_x_disp,
win,
ShapeBounding,
0,
0,
&rect,
1,
ShapeSubtract,
Unsorted);
} /* ecore_x_window_shape_rectangle_subtract */
EAPI void
ecore_x_window_shape_input_rectangle_subtract(Ecore_X_Window win,
int x,
int y,
int w,
int h)
{
#ifdef ShapeInput
XRectangle rect;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
rect.x = x;
rect.y = y;
rect.width = w;
rect.height = h;
XShapeCombineRectangles(_ecore_x_disp,
win,
ShapeInput,
0,
0,
&rect,
1,
ShapeSubtract,
Unsorted);
#else
return;
win = x = y = w = h = 0;
#endif
} /* ecore_x_window_shape_input_rectangle_subtract */
EAPI void
ecore_x_window_shape_window_add(Ecore_X_Window win, Ecore_X_Window shape_win)
{
@ -153,6 +340,28 @@ ecore_x_window_shape_window_add_xy(Ecore_X_Window win,
ShapeUnion);
} /* ecore_x_window_shape_window_add_xy */
EAPI void
ecore_x_window_shape_input_window_add_xy(Ecore_X_Window win,
Ecore_X_Window shape_win,
int x,
int y)
{
#ifdef ShapeInput
LOGFN(__FILE__, __LINE__, __FUNCTION__);
XShapeCombineShape(_ecore_x_disp,
win,
ShapeInput,
x,
y,
shape_win,
ShapeInput,
ShapeUnion);
#else
return;
win = shape_win = x = y = 0;
#endif
} /* ecore_x_window_shape_input_window_add_xy */
EAPI void
ecore_x_window_shape_rectangle_add(Ecore_X_Window win,
int x,
@ -178,6 +387,36 @@ ecore_x_window_shape_rectangle_add(Ecore_X_Window win,
Unsorted);
} /* ecore_x_window_shape_rectangle_add */
EAPI void
ecore_x_window_shape_input_rectangle_add(Ecore_X_Window win,
int x,
int y,
int w,
int h)
{
#ifdef ShapeInput
XRectangle rect;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
rect.x = x;
rect.y = y;
rect.width = w;
rect.height = h;
XShapeCombineRectangles(_ecore_x_disp,
win,
ShapeInput,
0,
0,
&rect,
1,
ShapeUnion,
Unsorted);
#else
return;
win = x = y = w = h = 0;
#endif
} /* ecore_x_window_shape_input_rectangle_add */
EAPI void
ecore_x_window_shape_rectangle_clip(Ecore_X_Window win,
int x,
@ -203,6 +442,36 @@ ecore_x_window_shape_rectangle_clip(Ecore_X_Window win,
Unsorted);
} /* ecore_x_window_shape_rectangle_clip */
EAPI void
ecore_x_window_shape_input_rectangle_clip(Ecore_X_Window win,
int x,
int y,
int w,
int h)
{
#ifdef ShapeInput
XRectangle rect;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
rect.x = x;
rect.y = y;
rect.width = w;
rect.height = h;
XShapeCombineRectangles(_ecore_x_disp,
win,
ShapeInput,
0,
0,
&rect,
1,
ShapeIntersect,
Unsorted);
#else
return;
win = x = y = w = h = 0;
#endif
} /* ecore_x_window_shape_input_rectangle_clip */
EAPI void
ecore_x_window_shape_rectangles_add(Ecore_X_Window win,
Ecore_X_Rectangle *rects,
@ -215,18 +484,16 @@ ecore_x_window_shape_rectangles_add(Ecore_X_Window win,
if (num > 0)
{
rect = malloc(sizeof(XRectangle) * num);
if (rect)
for (i = 0; i < num; i++)
{
rect[i].x = rects[i].x;
rect[i].y = rects[i].y;
rect[i].width = rects[i].width;
rect[i].height = rects[i].height;
}
else
num = 0;
if (!rect) return;
for (i = 0; i < num; i++)
{
rect[i].x = rects[i].x;
rect[i].y = rects[i].y;
rect[i].width = rects[i].width;
rect[i].height = rects[i].height;
}
}
XShapeCombineRectangles(_ecore_x_disp,
win,
ShapeBounding,
@ -236,10 +503,48 @@ ecore_x_window_shape_rectangles_add(Ecore_X_Window win,
num,
ShapeUnion,
Unsorted);
if (rect)
free(rect);
if (rect) free(rect);
} /* ecore_x_window_shape_rectangles_add */
EAPI void
ecore_x_window_shape_input_rectangles_add(Ecore_X_Window win,
Ecore_X_Rectangle *rects,
int num)
{
#ifdef ShapeInput
XRectangle *rect = NULL;
int i;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (num > 0)
{
rect = malloc(sizeof(XRectangle) * num);
if (!rect) return;
for (i = 0; i < num; i++)
{
rect[i].x = rects[i].x;
rect[i].y = rects[i].y;
rect[i].width = rects[i].width;
rect[i].height = rects[i].height;
}
}
XShapeCombineRectangles(_ecore_x_disp,
win,
ShapeBounding,
0,
0,
rect,
num,
ShapeUnion,
Unsorted);
if (rect) free(rect);
#else
return;
win = rects = num = 0;
#endif
} /* ecore_x_window_shape_input_rectangles_add */
EAPI Ecore_X_Rectangle *
ecore_x_window_shape_rectangles_get(Ecore_X_Window win, int *num_ret)
{
@ -251,25 +556,75 @@ ecore_x_window_shape_rectangles_get(Ecore_X_Window win, int *num_ret)
rect = XShapeGetRectangles(_ecore_x_disp, win, ShapeBounding, &num, &ord);
if (rect)
{
if (num < 1)
{
XFree(rect);
if (num_ret) *num_ret = 0;
return NULL;
}
rects = malloc(sizeof(Ecore_X_Rectangle) * num);
if (rects)
for (i = 0; i < num; i++)
{
rects[i].x = rect[i].x;
rects[i].y = rect[i].y;
rects[i].width = rect[i].width;
rects[i].height = rect[i].height;
}
if (!rects)
{
XFree(rect);
if (num_ret) *num_ret = 0;
return NULL;
}
for (i = 0; i < num; i++)
{
rects[i].x = rect[i].x;
rects[i].y = rect[i].y;
rects[i].width = rect[i].width;
rects[i].height = rect[i].height;
}
XFree(rect);
}
if (num_ret)
*num_ret = num;
if (num_ret) *num_ret = num;
return rects;
} /* ecore_x_window_shape_rectangles_get */
EAPI Ecore_X_Rectangle *
ecore_x_window_shape_input_rectangles_get(Ecore_X_Window win, int *num_ret)
{
#ifdef ShapeInput
XRectangle *rect;
Ecore_X_Rectangle *rects = NULL;
int i, num = 0, ord;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
rect = XShapeGetRectangles(_ecore_x_disp, win, ShapeInput, &num, &ord);
if (rect)
{
if (num < 1)
{
XFree(rect);
if (num_ret) *num_ret = 0;
return NULL;
}
rects = malloc(sizeof(Ecore_X_Rectangle) * num);
if (!rects)
{
XFree(rect);
if (num_ret) *num_ret = 0;
return NULL;
}
for (i = 0; i < num; i++)
{
rects[i].x = rect[i].x;
rects[i].y = rect[i].y;
rects[i].width = rect[i].width;
rects[i].height = rect[i].height;
}
XFree(rect);
}
if (num_ret) *num_ret = num;
return rects;
#else
if (num_ret) *num_ret = 0;
return NULL;
win = 0;
#endif
} /* ecore_x_window_shape_input_rectangles_get */
EAPI void
ecore_x_window_shape_events_select(Ecore_X_Window win, Eina_Bool on)
{
@ -279,22 +634,3 @@ ecore_x_window_shape_events_select(Ecore_X_Window win, Eina_Bool on)
else
XShapeSelectInput(_ecore_x_disp, win, 0);
} /* ecore_x_window_shape_events_select */
/**
* Sets the input shape of the given window to that given by the pixmap @p mask.
* @param win The given window.
* @param mask A 2-bit depth pixmap that provides the new input shape of the
* window.
* @ingroup Ecore_X_Window_Shape
*/
EAPI void
ecore_x_window_shape_input_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
#ifdef ShapeInput
XShapeCombineMask(_ecore_x_disp, win, ShapeInput, 0, 0, mask, ShapeSet);
#else /* ifdef ShapeInput */
XShapeCombineMask(_ecore_x_disp, win, ShapeBounding, 0, 0, mask, ShapeSet);
#endif /* ifdef ShapeInput */
} /* ecore_x_window_shape_input_mask_set */