forked from enlightenment/efl
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:
parent
1dac813ace
commit
631f94a523
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in New Issue