From 3e94ac52b66ce88a4195c6e3ec2c1c0c1583fbc2 Mon Sep 17 00:00:00 2001 From: Vincent Torri Date: Mon, 23 Mar 2009 13:28:59 +0000 Subject: [PATCH] * API BREAK: ecore_gc_new can create now a graphic context with all the values that the X protocol allows. See documentation for more info about its use * use it in ecore_evas SVN revision: 39654 --- .../ecore/src/lib/ecore_evas/ecore_evas_x.c | 102 +++++---------- legacy/ecore/src/lib/ecore_x/Ecore_X.h | 28 ++++- .../ecore/src/lib/ecore_x/xcb/ecore_xcb_gc.c | 7 +- .../ecore/src/lib/ecore_x/xlib/ecore_x_gc.c | 116 +++++++++++++++++- 4 files changed, 176 insertions(+), 77 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c index 7353868d9d..05052270b6 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c @@ -325,38 +325,30 @@ _ecore_evas_x_resize_shape(Ecore_Evas *ee) einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas); if (einfo) { + unsigned int foreground; + Ecore_X_GC gc; # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB - xcb_rectangle_t rectangle; - Ecore_X_GC gc; - uint32_t value_list; -# else - GC gc; - XGCValues gcv; -# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */ + xcb_rectangle_t rectangle; +# endif /* BUILD_ECORE_EVAS_SOFTWARE_XCB */ if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask); ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1); + foreground = 0; + gc = ecore_x_gc_new(ee->engine.x.mask, + ECORE_X_GC_VALUE_MASK_FOREGROUND, + &foreground); # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB - gc = xcb_generate_id(ecore_x_connection_get()); - value_list = 0; - xcb_create_gc(ecore_x_connection_get(), gc, ee->engine.x.mask, - XCB_GC_FOREGROUND, &value_list); rectangle.x = 0; rectangle.y = 0; rectangle.width = ee->w; rectangle.height = ee->h; xcb_poly_fill_rectangle(ecore_x_connection_get(), ee->engine.x.mask, gc, 1, &rectangle); - xcb_free_gc(ecore_x_connection_get(), gc); # else - gcv.foreground = 0; - gc = XCreateGC(ecore_x_display_get(), ee->engine.x.mask, - GCForeground, - &gcv); XFillRectangle(ecore_x_display_get(), ee->engine.x.mask, gc, 0, 0, ee->w, ee->h); - XFreeGC(ecore_x_display_get(), gc); # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */ + ecore_x_gc_del(gc); einfo->info.mask = ee->engine.x.mask; evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); @@ -371,38 +363,30 @@ _ecore_evas_x_resize_shape(Ecore_Evas *ee) einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas); if (einfo) { + unsigned int foreground; + Ecore_X_GC gc; # ifdef BUILD_ECORE_EVAS_XRENDER_XCB xcb_rectangle_t rectangle; - Ecore_X_GC gc; - uint32_t value_list; -# else - GC gc; - XGCValues gcv; -# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */ +# endif /* BUILD_ECORE_EVAS_XRENDER_XCB */ if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask); ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1); + foreground = 0; + ecore_x_gc_new(ee->engine.x.mask, + ECORE_X_GC_VALUE_MASK_FOREGROUND, + &foreground); # ifdef BUILD_ECORE_EVAS_XRENDER_XCB - gc = xcb_generate_id(ecore_x_connection_get()); - value_list = 0; - xcb_create_gc(ecore_x_connection_get(), gc, ee->engine.x.mask, - XCB_GC_FOREGROUND, &value_list); rectangle.x = 0; rectangle.y = 0; rectangle.width = ee->w; rectangle.height = ee->h; xcb_poly_fill_rectangle(ecore_x_connection_get(), ee->engine.x.mask, gc, 1, &rectangle); - xcb_free_gc(ecore_x_connection_get(), gc); # else - gcv.foreground = 0; - gc = XCreateGC(ecore_x_display_get(), ee->engine.x.mask, - GCForeground, - &gcv); XFillRectangle(ecore_x_display_get(), ee->engine.x.mask, gc, 0, 0, ee->w, ee->h); - XFreeGC(ecore_x_display_get(), gc); # endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */ + ecore_x_gc_del(gc); einfo->info.mask = ee->engine.x.mask; evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); @@ -1418,24 +1402,19 @@ _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped) { if (ee->shaped) { + unsigned int foreground; + Ecore_X_GC gc; # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB xcb_rectangle_t rectangle; - Ecore_X_GC gc; - uint32_t value_list; -# else - GC gc; - XGCValues gcv; # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */ if (!ee->engine.x.mask) ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1); + foreground = 0; + gc = ecore_x_gc_new(ee->engine.x.mask, + ECORE_X_GC_VALUE_MASK_FOREGROUND, + &foreground); # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB - gc = xcb_generate_id(ecore_x_connection_get()); - value_list = 0; - xcb_create_gc(ecore_x_connection_get(), - gc, ee->engine.x.mask, - XCB_GC_FOREGROUND, - &value_list); rectangle.x = 0; rectangle.y = 0; rectangle.width = ee->w; @@ -1443,16 +1422,11 @@ _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped) xcb_poly_fill_rectangle(ecore_x_connection_get(), ee->engine.x.mask, gc, 1, &rectangle); - xcb_free_gc(ecore_x_connection_get(), gc); # else - gcv.foreground = 0; - gc = XCreateGC(ecore_x_display_get(), ee->engine.x.mask, - GCForeground, - &gcv); XFillRectangle(ecore_x_display_get(), ee->engine.x.mask, gc, 0, 0, ee->w, ee->h); - XFreeGC(ecore_x_display_get(), gc); # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */ + ecore_x_gc_del(gc); einfo->info.mask = ee->engine.x.mask; evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); @@ -1481,24 +1455,19 @@ _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped) { if (ee->shaped) { + unsigned int foreground; + Ecore_X_GC gc; # ifdef BUILD_ECORE_EVAS_XRENDER_XCB xcb_rectangle_t rectangle; - Ecore_X_GC gc; - uint32_t value_list; -# else - GC gc; - XGCValues gcv; # endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */ if (!ee->engine.x.mask) ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1); + foreground = 0; + gc = ecore_x_gc_new(ee->engine.x.mask, + ECORE_X_GC_VALUE_MASK_FOREGROUND, + &foreground); # ifdef BUILD_ECORE_EVAS_XRENDER_XCB - gc = xcb_generate_id(ecore_x_connection_get()); - value_list = 0; - xcb_create_gc(ecore_x_connection_get(), - gc, ee->engine.x.mask, - XCB_GC_FOREGROUND, - &value_list); rectangle.x = 0; rectangle.y = 0; rectangle.width = ee->w; @@ -1506,16 +1475,11 @@ _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped) xcb_poly_fill_rectangle(ecore_x_connection_get(), ee->engine.x.mask, gc, 1, &rectangle); - xcb_free_gc(ecore_x_connection_get(), gc); # else - gcv.foreground = 0; - gc = XCreateGC(ecore_x_display_get(), ee->engine.x.mask, - GCForeground, - &gcv); XFillRectangle(ecore_x_display_get(), ee->engine.x.mask, gc, 0, 0, ee->w, ee->h); - XFreeGC(ecore_x_display_get(), gc); # endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */ + ecore_x_gc_del(gc); einfo->info.mask = ee->engine.x.mask; evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); @@ -2167,7 +2131,7 @@ _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on) if (ee->prop.avoid_damage) { ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth); - ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap); + ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL); einfo->info.drawable = ee->engine.x.pmap; evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); if ((ee->rotation == 90) || (ee->rotation == 270)) @@ -2218,7 +2182,7 @@ _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on) if (ee->prop.avoid_damage) { ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 16); - ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap); + ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL); einfo->info.drawable = ee->engine.x.pmap; evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); if ((ee->rotation == 90) || (ee->rotation == 270)) diff --git a/legacy/ecore/src/lib/ecore_x/Ecore_X.h b/legacy/ecore/src/lib/ecore_x/Ecore_X.h index b14ee12d3b..b114dbcdad 100644 --- a/legacy/ecore/src/lib/ecore_x/Ecore_X.h +++ b/legacy/ecore/src/lib/ecore_x/Ecore_X.h @@ -81,6 +81,32 @@ typedef struct _Ecore_X_Icon { unsigned int *data; } Ecore_X_Icon; +typedef enum _Ecore_X_GC_Value_Mask { + ECORE_X_GC_VALUE_MASK_FUNCTION = (1L << 0), + ECORE_X_GC_VALUE_MASK_PLANE_MASK = (1L << 1), + ECORE_X_GC_VALUE_MASK_FOREGROUND = (1L << 2), + ECORE_X_GC_VALUE_MASK_BACKGROUND = (1L << 3), + ECORE_X_GC_VALUE_MASK_LINE_WIDTH = (1L << 4), + ECORE_X_GC_VALUE_MASK_LINE_STYLE = (1L << 5), + ECORE_X_GC_VALUE_MASK_CAP_STYLE = (1L << 6), + ECORE_X_GC_VALUE_MASK_JOIN_STYLE = (1L << 7), + ECORE_X_GC_VALUE_MASK_FILL_STYLE = (1L << 8), + ECORE_X_GC_VALUE_MASK_FILL_RULE = (1L << 9), + ECORE_X_GC_VALUE_MASK_TILE = (1L << 10), + ECORE_X_GC_VALUE_MASK_STIPPLE = (1L << 11), + ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_X = (1L << 12), + ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_Y = (1L << 13), + ECORE_X_GC_VALUE_MASK_FONT = (1L << 14), + ECORE_X_GC_VALUE_MASK_SUBWINDOW_MODE = (1L << 15), + ECORE_X_GC_VALUE_MASK_GRAPHICS_EXPOSURES = (1L << 16), + ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_X = (1L << 17), + ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_Y = (1L << 18), + ECORE_X_GC_VALUE_MASK_CLIP_MASK = (1L << 19), + ECORE_X_GC_VALUE_MASK_DASH_OFFSET = (1L << 20), + ECORE_X_GC_VALUE_MASK_DASH_LIST = (1L << 21), + ECORE_X_GC_VALUE_MASK_ARC_MODE = (1L << 22) +} Ecore_X_GC_Value_Mask; + typedef enum _Ecore_X_Window_State { /** The window is iconified. */ ECORE_X_WINDOW_STATE_ICONIFIED, @@ -1160,7 +1186,7 @@ EAPI void ecore_x_pixmap_paste(Ecore_X_Pixmap pmap, Ecore_X_Drawable EAPI void ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap, int *x, int *y, int *w, int *h); EAPI int ecore_x_pixmap_depth_get(Ecore_X_Pixmap pmap); -EAPI Ecore_X_GC ecore_x_gc_new(Ecore_X_Drawable draw); +EAPI Ecore_X_GC ecore_x_gc_new(Ecore_X_Drawable draw, Ecore_X_GC_Value_Mask value_mask, const unsigned int *value_list); EAPI void ecore_x_gc_del(Ecore_X_GC gc); EAPI int ecore_x_client_message32_send(Ecore_X_Window win, Ecore_X_Atom type, Ecore_X_Event_Mask mask, long d0, long d1, long d2, long d3, long d4); diff --git a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_gc.c b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_gc.c index 0a4ec22442..826f3b5979 100644 --- a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_gc.c +++ b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_gc.c @@ -10,6 +10,9 @@ * drawable. * @param drawable Drawable to create graphics context with. If @c 0 is * given instead, the default root window is used. + * @param value_mask Bitmask values. + * @param value_list List of values. The order of values must be the + * same than the corresponding bitmaks. * @return The new default graphics context. * * Creates a new default graphics context associated with @p @@ -18,14 +21,14 @@ * other drawables results in a BadMatch error. */ EAPI Ecore_X_GC -ecore_x_gc_new(Ecore_X_Drawable drawable) +ecore_x_gc_new(Ecore_X_Drawable drawable, Ecore_X_GC_Value_Mask value_mask, const unsigned int *value_list) { xcb_gcontext_t gc; if (!drawable) drawable = ((xcb_screen_t *)_ecore_xcb_screen)->root; gc = xcb_generate_id(_ecore_xcb_conn); - xcb_create_gc(_ecore_xcb_conn, gc, drawable, 0, NULL); + xcb_create_gc(_ecore_xcb_conn, gc, drawable, value_mask, value_list); return gc; } diff --git a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_gc.c b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_gc.c index 721522df2b..84c420136f 100644 --- a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_gc.c +++ b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_gc.c @@ -15,15 +15,121 @@ * drawable. * @param draw Drawable to create graphics context with. If @c 0 is * given instead, the default root window is used. + * @param value_mask Bitmask values. + * @param value_list List of values. The order of values must be the + * same than the corresponding bitmaks. * @return The new default graphics context. */ EAPI Ecore_X_GC -ecore_x_gc_new(Ecore_X_Drawable draw) +ecore_x_gc_new(Ecore_X_Drawable draw, Ecore_X_GC_Value_Mask value_mask, const unsigned int *value_list) { - XGCValues gcv; + XGCValues gcv; + int mask; + int index; + int i; - if (!draw) draw = DefaultRootWindow(_ecore_x_disp); - return XCreateGC(_ecore_x_disp, draw, 0, &gcv); + if (!draw) draw = DefaultRootWindow(_ecore_x_disp); + + for (i = 0, index = 0, mask = 1; i <= 22; i++, mask <<= 1) + { + switch (mask & value_mask) + { + case ECORE_X_GC_VALUE_MASK_FUNCTION: + gcv.function = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_PLANE_MASK: + gcv.plane_mask = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_FOREGROUND: + gcv.foreground = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_BACKGROUND: + gcv.background = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_LINE_WIDTH: + gcv.line_width = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_LINE_STYLE: + gcv.line_style = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_CAP_STYLE: + gcv.cap_style = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_JOIN_STYLE: + gcv.join_style = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_FILL_STYLE: + gcv.fill_style = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_FILL_RULE: + gcv.fill_rule = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_TILE: + gcv.tile = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_STIPPLE: + gcv.stipple = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_X: + gcv.ts_x_origin = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_Y: + gcv.ts_y_origin = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_FONT: + gcv.font = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_SUBWINDOW_MODE: + gcv.subwindow_mode = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_GRAPHICS_EXPOSURES: + gcv.graphics_exposures = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_X: + gcv.clip_x_origin = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_Y: + gcv.clip_y_origin = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_CLIP_MASK: + gcv.clip_mask = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_DASH_OFFSET: + gcv.dash_offset = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_DASH_LIST: + gcv.dashes = value_list[index]; + index++; + break; + case ECORE_X_GC_VALUE_MASK_ARC_MODE: + gcv.arc_mode = value_list[index]; + index++; + break; + } + } + + return XCreateGC(_ecore_x_disp, draw, value_mask, &gcv); } /** @@ -33,5 +139,5 @@ ecore_x_gc_new(Ecore_X_Drawable draw) EAPI void ecore_x_gc_del(Ecore_X_GC gc) { - XFreeGC(_ecore_x_disp, gc); + XFreeGC(_ecore_x_disp, gc); }