{
_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);
#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
+}
+
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)
{
} /* 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,
int x,
} /* 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,
int y,
} /* 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,
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)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
} /* 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,
int y,
} /* 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,
int y,
} /* 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,
int num)
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,
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)
{
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;
+ return rects;
+} /* ecore_x_window_shape_rectangles_get */
- if (num_ret)
- *num_ret = num;
+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;
-} /* ecore_x_window_shape_rectangles_get */
+#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)
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 */
-