From 048656c31f9ef8d19d866dafa7223f8949fc423a Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Wed, 13 Apr 2005 15:47:53 +0000 Subject: [PATCH] basic core of shape support SVN revision: 14172 --- legacy/ecore/src/bin/ecore_evas_test_bg.c | 12 +- legacy/ecore/src/lib/ecore_x/Ecore_X.h | 15 ++- legacy/ecore/src/lib/ecore_x/ecore_x.c | 2 + legacy/ecore/src/lib/ecore_x/ecore_x_events.c | 12 +- .../src/lib/ecore_x/ecore_x_window_shape.c | 124 ++++++++++++++++++ 5 files changed, 159 insertions(+), 6 deletions(-) diff --git a/legacy/ecore/src/bin/ecore_evas_test_bg.c b/legacy/ecore/src/bin/ecore_evas_test_bg.c index a427c6deeb..2784df0a5b 100644 --- a/legacy/ecore/src/bin/ecore_evas_test_bg.c +++ b/legacy/ecore/src/bin/ecore_evas_test_bg.c @@ -332,9 +332,17 @@ bg_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info) if (!strcmp(ev->keyname, "s")) { if (!ecore_evas_shaped_get(ee)) - ecore_evas_shaped_set(ee, 1); + { + evas_object_hide(o_bg_rect); + evas_object_hide(o_bg); + ecore_evas_shaped_set(ee, 1); + } else - ecore_evas_shaped_set(ee, 0); + { + evas_object_show(o_bg_rect); + evas_object_show(o_bg); + ecore_evas_shaped_set(ee, 0); + } } if (!strcmp(ev->keyname, "Up")) { diff --git a/legacy/ecore/src/lib/ecore_x/Ecore_X.h b/legacy/ecore/src/lib/ecore_x/Ecore_X.h index 85e25741d1..44246686d1 100644 --- a/legacy/ecore/src/lib/ecore_x/Ecore_X.h +++ b/legacy/ecore/src/lib/ecore_x/Ecore_X.h @@ -977,8 +977,19 @@ EAPI int ecore_x_window_prop_window_opacity_get(Ecore_X_Window win) EAPI void ecore_x_window_prop_state_set(Ecore_X_Window win, Ecore_X_Window_State s); EAPI int ecore_x_window_prop_state_isset(Ecore_X_Window win, Ecore_X_Window_State s); EAPI void ecore_x_window_prop_state_unset(Ecore_X_Window win, Ecore_X_Window_State s); -EAPI void ecore_x_window_shape_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask); - + +EAPI void ecore_x_window_shape_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask); +EAPI void ecore_x_window_shape_window_set(Ecore_X_Window win, Ecore_X_Window shape_win); +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, int y, int w, int h); +EAPI void ecore_x_window_shape_rectangles_set(Ecore_X_Window win, Ecore_X_Rectangle *rects, int num); +EAPI void ecore_x_window_shape_window_add(Ecore_X_Window win, Ecore_X_Window shape_win); +EAPI void ecore_x_window_shape_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, 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 Ecore_X_Rectangle *ecore_x_window_shape_rectangles_get(Ecore_X_Window win, int *num_ret); +EAPI void ecore_x_window_shape_events_select(Ecore_X_Window win, int on); + EAPI Ecore_X_Pixmap ecore_x_pixmap_new(Ecore_X_Window win, int w, int h, int dep); EAPI void ecore_x_pixmap_del(Ecore_X_Pixmap pmap); EAPI void ecore_x_pixmap_paste(Ecore_X_Pixmap pmap, Ecore_X_Drawable dest, Ecore_X_GC gc, int sx, int sy, int w, int h, int dx, int dy); diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x.c b/legacy/ecore/src/lib/ecore_x/ecore_x.c index f8fdb93d78..c5619ace60 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x.c +++ b/legacy/ecore/src/lib/ecore_x/ecore_x.c @@ -939,6 +939,7 @@ ecore_x_window_client_manage(Ecore_X_Window win) VisibilityChangeMask | StructureNotifyMask ); + XShapeSelectInput(_ecore_x_disp, win, ShapeNotifyMask); } void @@ -959,6 +960,7 @@ ecore_x_window_client_sniff(Ecore_X_Window win) ColormapChangeMask | VisibilityChangeMask | StructureNotifyMask); + XShapeSelectInput(_ecore_x_disp, win, ShapeNotifyMask); } /** diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_events.c b/legacy/ecore/src/lib/ecore_x/ecore_x_events.c index 1169850c97..8ff37b7460 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x_events.c +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_events.c @@ -1382,7 +1382,15 @@ _ecore_x_event_handle_mapping_notify(XEvent *xevent __UNUSED__) } void -_ecore_x_event_handle_shape_change(XEvent *xevent __UNUSED__) +_ecore_x_event_handle_shape_change(XEvent *xevent) { - /* FIXME: handle this event type */ + XShapeEvent *shape_event; + Ecore_X_Event_Window_Shape *e; + + shape_event = (XShapeEvent *)xevent; + e = calloc(1, sizeof(Ecore_X_Event_Window_Shape)); + if (!e) return; + e->win = shape_event->window; + e->time = shape_event->time; + ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL); } diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_window_shape.c b/legacy/ecore/src/lib/ecore_x/ecore_x_window_shape.c index e3cefb585d..23a8f39993 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x_window_shape.c +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_window_shape.c @@ -21,3 +21,127 @@ ecore_x_window_shape_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask) { XShapeCombineMask(_ecore_x_disp, win, ShapeBounding, 0, 0, mask, ShapeSet); } + +void +ecore_x_window_shape_window_set(Ecore_X_Window win, Ecore_X_Window shape_win) +{ + XShapeCombineShape(_ecore_x_disp, win, ShapeBounding, 0, 0, shape_win, ShapeBounding, ShapeSet); +} + +void +ecore_x_window_shape_window_set_xy(Ecore_X_Window win, Ecore_X_Window shape_win, int x, int y) +{ + XShapeCombineShape(_ecore_x_disp, win, ShapeBounding, x, y, shape_win, ShapeBounding, ShapeSet); +} + +void +ecore_x_window_shape_rectangle_set(Ecore_X_Window win, int x, int y, int w, int h) +{ + XRectangle rect; + + rect.x = x; + rect.y = y; + rect.width = w; + rect.height = h; + XShapeCombineRectangles(_ecore_x_disp, win, ShapeBounding, 0, 0, &rect, 1, ShapeSet, Unsorted); +} + +void +ecore_x_window_shape_rectangles_set(Ecore_X_Window win, Ecore_X_Rectangle *rects, int num) +{ + XRectangle *rect = NULL; + int i; + + if (num > 0) + { + rect = alloca(sizeof(XRectangle) * num); + 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, ShapeSet, Unsorted); +} + +void +ecore_x_window_shape_window_add(Ecore_X_Window win, Ecore_X_Window shape_win) +{ + XShapeCombineShape(_ecore_x_disp, win, ShapeBounding, 0, 0, shape_win, ShapeBounding, ShapeUnion); +} + +void +ecore_x_window_shape_window_add_xy(Ecore_X_Window win, Ecore_X_Window shape_win, int x, int y) +{ + XShapeCombineShape(_ecore_x_disp, win, ShapeBounding, x, y, shape_win, ShapeBounding, ShapeUnion); +} + +void +ecore_x_window_shape_rectangle_add(Ecore_X_Window win, int x, int y, int w, int h) +{ + XRectangle rect; + + rect.x = x; + rect.y = y; + rect.width = w; + rect.height = h; + XShapeCombineRectangles(_ecore_x_disp, win, ShapeBounding, 0, 0, &rect, 1, ShapeUnion, Unsorted); +} + +void +ecore_x_window_shape_rectangles_add(Ecore_X_Window win, Ecore_X_Rectangle *rects, int num) +{ + XRectangle *rect = NULL; + int i; + + if (num > 0) + { + rect = alloca(sizeof(XRectangle) * num); + 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); +} + +Ecore_X_Rectangle * +ecore_x_window_shape_rectangles_get(Ecore_X_Window win, int *num_ret) +{ + XRectangle *rect; + Ecore_X_Rectangle *rects = NULL; + int i, num = 0, ord; + + rect = XShapeGetRectangles(_ecore_x_disp, win, ShapeBounding, &num, &ord); + if (rect) + { + 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; + } + } + XFree(rect); + } + if (num_ret) *num_ret = num; + return rects; +} + +void +ecore_x_window_shape_events_select(Ecore_X_Window win, int on) +{ + if (on) + XShapeSelectInput(_ecore_x_disp, win, ShapeNotifyMask); + else + XShapeSelectInput(_ecore_x_disp, win, 0); +}