* API BREAK: ecore_gc_new can create now a graphic context
authorcaro <caro@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 23 Mar 2009 13:28:59 +0000 (13:28 +0000)
committercaro <caro@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 23 Mar 2009 13:28:59 +0000 (13:28 +0000)
   with all the values that the X protocol allows. See
   documentation for more info about its use
 * use it in ecore_evas

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/ecore@39654 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore_evas/ecore_evas_x.c
src/lib/ecore_x/Ecore_X.h
src/lib/ecore_x/xcb/ecore_xcb_gc.c
src/lib/ecore_x/xlib/ecore_x_gc.c

index 7353868..0505227 100644 (file)
@@ -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))
index b14ee12..b114dbc 100644 (file)
@@ -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);
index 0a4ec22..826f3b5 100644 (file)
@@ -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
  * 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;
 }
index 721522d..84c4201 100644 (file)
  * 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);
 }