Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_evas


Modified Files:
        Ecore_Evas.h ecore_evas.c ecore_evas_private.h ecore_evas_x.c 


Log Message:


properly support shaped windows with xrender engine... :)

===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/Ecore_Evas.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- Ecore_Evas.h        24 Sep 2005 09:00:22 -0000      1.12
+++ Ecore_Evas.h        3 Oct 2005 06:45:45 -0000       1.13
@@ -53,7 +53,8 @@
    ECORE_EVAS_ENGINE_SOFTWARE_X11,
    ECORE_EVAS_ENGINE_SOFTWARE_FB,
    ECORE_EVAS_ENGINE_GL_X11,
-   ECORE_EVAS_ENGINE_SOFTWARE_BUFFER
+   ECORE_EVAS_ENGINE_SOFTWARE_BUFFER,
+   ECORE_EVAS_ENGINE_XRENDER_X11
 } Ecore_Evas_Engine_Type;
 
 #ifndef _ECORE_X_H
@@ -88,6 +89,13 @@
 EAPI int             ecore_evas_gl_x11_direct_resize_get(Ecore_Evas *ee);
 EAPI void            ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, 
Ecore_X_Window win);
 
+EAPI Ecore_Evas     *ecore_evas_xrender_x11_new(const char *disp_name, 
Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI Ecore_X_Window  ecore_evas_xrender_x11_window_get(Ecore_Evas *ee);
+EAPI Ecore_X_Window  ecore_evas_xrender_x11_subwindow_get(Ecore_Evas *ee);
+EAPI void            ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee, 
int on);
+EAPI int             ecore_evas_xrender_x11_direct_resize_get(Ecore_Evas *ee);
+EAPI void            ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas 
*ee, Ecore_X_Window win);
+
 EAPI Ecore_Evas     *ecore_evas_fb_new(char *disp_name, int rotation, int w, 
int h);
 
 EAPI Ecore_Evas     *ecore_evas_buffer_new(int w, int h);
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -3 -r1.20 -r1.21
--- ecore_evas.c        29 Jul 2005 21:47:33 -0000      1.20
+++ ecore_evas.c        3 Oct 2005 06:45:45 -0000       1.21
@@ -42,6 +42,13 @@
        return 0;
 #endif 
        break;
+      case ECORE_EVAS_ENGINE_XRENDER_X11:
+#ifdef BUILD_ECORE_EVAS_XRENDER
+       return 1;
+#else
+       return 0;
+#endif 
+       break;
       case ECORE_EVAS_ENGINE_SOFTWARE_BUFFER:
 #ifdef BUILD_ECORE_EVAS_BUFFER
        return 1;
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas_private.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -3 -r1.16 -r1.17
--- ecore_evas_private.h        24 Sep 2005 09:00:22 -0000      1.16
+++ ecore_evas_private.h        3 Oct 2005 06:45:45 -0000       1.17
@@ -26,6 +26,9 @@
 #ifdef BUILD_ECORE_EVAS_GL
 #include <Evas_Engine_GL_X11.h>
 #endif
+#ifdef BUILD_ECORE_EVAS_XRENDER
+#include <Evas_Engine_XRender_X11.h>
+#endif
 #endif
 #ifdef BUILD_ECORE_EVAS_FB
 #include <Evas_Engine_FB.h>
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas_x.c,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -3 -r1.57 -r1.58
--- ecore_evas_x.c      24 Sep 2005 09:00:22 -0000      1.57
+++ ecore_evas_x.c      3 Oct 2005 06:45:45 -0000       1.58
@@ -1048,41 +1048,78 @@
 static void
 _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
 {
-   Evas_Engine_Info_Software_X11 *einfo;
-   
-   if (((ee->shaped) && (shaped)) ||
-       ((!ee->shaped) && (!shaped)))
+   if (((ee->shaped) && (shaped)) || ((!ee->shaped) && (!shaped)))
      return;
-   if (!strcmp(ee->driver, "gl_x11")) return;
-   ee->shaped = shaped;
-   einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
-   if (einfo)
+   if (!strcmp(ee->driver, "software_x11"))
      {
-       if (ee->shaped)
+       Evas_Engine_Info_Software_X11 *einfo;
+       
+       ee->shaped = shaped;
+       einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
+       if (einfo)
          {
-            GC gc;
-            XGCValues gcv;
-            
-            ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, 
ee->h, 1);
-            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);
-            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);
+            if (ee->shaped)
+              {
+                 GC gc;
+                 XGCValues gcv;
+                 
+                 ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, 
ee->w, ee->h, 1);
+                 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);
+                 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);
+              }
+            else
+              {
+                 if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
+                 ee->engine.x.mask = 0;
+                 einfo->info.mask = 0;
+                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+                 ecore_x_window_shape_mask_set(ee->engine.x.win, 0);
+                 ecore_x_window_shape_mask_set(ee->engine.x.win_container, 0);
+              }
          }
-       else
+     }
+   else if (!strcmp(ee->driver, "xrender_x11"))
+     {
+       Evas_Engine_Info_XRender_X11 *einfo;
+       
+       ee->shaped = shaped;
+       einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
+       if (einfo)
          {
-            if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-            ee->engine.x.mask = 0;
-            einfo->info.mask = 0;
-            evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-            ecore_x_window_shape_mask_set(ee->engine.x.win, 0);
-            ecore_x_window_shape_mask_set(ee->engine.x.win_container, 0);
+            if (ee->shaped)
+              {
+                 GC gc;
+                 XGCValues gcv;
+                 
+                 ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, 
ee->w, ee->h, 1);
+                 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);
+                 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);
+              }
+            else
+              {
+                 if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
+                 ee->engine.x.mask = 0;
+                 einfo->info.mask = 0;
+                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+                 ecore_x_window_shape_mask_set(ee->engine.x.win, 0);
+                 ecore_x_window_shape_mask_set(ee->engine.x.win_container, 0);
+              }
          }
      }
 }
@@ -1932,7 +1969,7 @@
 Ecore_X_Window
 ecore_evas_gl_x11_window_get(Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_GL 
+#ifdef BUILD_ECORE_X
    return ee->engine.x.win_container;
 #else
    return 0;
@@ -1995,3 +2032,213 @@
    ecore_evas_software_x11_extra_event_window_add(ee, win);
 }
 
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+Ecore_Evas *
+ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent, 
+                     int x, int y, int w, int h)
+{
+#ifdef BUILD_ECORE_EVAS_XRENDER
+   Evas_Engine_Info_XRender_X11 *einfo;
+   Ecore_Evas *ee;
+   int rmethod;
+
+   rmethod = evas_render_method_lookup("xrender_x11");
+   if (!rmethod) return NULL;
+   if (!ecore_x_init(disp_name)) return NULL;
+   ee = calloc(1, sizeof(Ecore_Evas));
+   if (!ee) return NULL;
+   
+   ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
+   
+   _ecore_evas_x_init();
+   
+   ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
+   
+   ee->driver = strdup("xrender_x11");
+   if (disp_name) ee->name = strdup(disp_name);
+
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+   ee->x = x;
+   ee->y = y;
+   ee->w = w;
+   ee->h = h;
+   
+   ee->prop.max.w = 32767;
+   ee->prop.max.h = 32767;
+   ee->prop.layer = 4;
+   ee->prop.request_pos = 0;
+   
+   /* init evas here */
+   ee->evas = evas_new();
+   evas_output_method_set(ee->evas, rmethod);
+   evas_output_size_set(ee->evas, w, h);
+   evas_output_viewport_set(ee->evas, 0, 0, w, h);
+   
+   ee->engine.x.win_root = parent;
+   ee->engine.x.win_container = ecore_x_window_new(parent, x, y, w, h);
+   if (getenv("DESKTOP_STARTUP_ID"))
+     {
+       ecore_x_netwm_startup_id_set(ee->engine.x.win_container,
+                                    getenv("DESKTOP_STARTUP_ID"));
+       putenv("DESKTOP_STARTUP_ID");
+     }
+   einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
+   if (einfo)
+     {
+       XSetWindowAttributes attr;
+       int screen;
+
+       /* FIXME: this is inefficient as its a round trip */
+       screen = DefaultScreen(ecore_x_display_get());
+       if (ScreenCount(ecore_x_display_get()) > 1)
+         {
+            Ecore_X_Window *roots;
+            int num, i;
+            
+            num = 0;
+            roots = ecore_x_window_root_list(&num);
+            if (roots)
+              {
+                 XWindowAttributes at;
+                 
+                 if (XGetWindowAttributes(ecore_x_display_get(),
+                                          parent, &at))
+                   {
+                      for (i = 0; i < num; i++)
+                        {
+                           if (at.root == roots[i])
+                             {
+                                screen = i;
+                                break;
+                             }
+                        }
+                   }
+                 free(roots);
+              }
+         }
+       attr.backing_store = NotUseful;
+       attr.override_redirect = True;
+       attr.colormap = DefaultColormap(ecore_x_display_get(), screen);
+       attr.border_pixel = 0;
+       attr.background_pixmap = None;
+       attr.event_mask =
+         KeyPressMask | KeyReleaseMask |
+         ExposureMask | ButtonPressMask | ButtonReleaseMask | 
+         EnterWindowMask | LeaveWindowMask |
+         PointerMotionMask | StructureNotifyMask | VisibilityChangeMask |
+         FocusChangeMask | PropertyChangeMask | ColormapChangeMask;
+       attr.bit_gravity = ForgetGravity;
+       
+       ee->engine.x.win = 
+         XCreateWindow(ecore_x_display_get(), 
+                       ee->engine.x.win_container,
+                       0, 0, 
+                       w, h, 0,
+                       DefaultDepth(ecore_x_display_get(), screen),
+                       InputOutput,
+                       DefaultVisual(ecore_x_display_get(), screen),
+                       CWBackingStore | CWColormap |
+                       CWBackPixmap | CWBorderPixel |
+                       CWBitGravity | CWEventMask |
+                       CWOverrideRedirect,
+                       &attr);
+       einfo->info.display  = ecore_x_display_get();
+       einfo->info.visual   = DefaultVisual(ecore_x_display_get(), screen);
+       einfo->info.drawable = ee->engine.x.win;
+       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+     }
+   evas_key_modifier_add(ee->evas, "Shift");
+   evas_key_modifier_add(ee->evas, "Control");
+   evas_key_modifier_add(ee->evas, "Alt");
+   evas_key_modifier_add(ee->evas, "Meta");
+   evas_key_modifier_add(ee->evas, "Hyper");
+   evas_key_modifier_add(ee->evas, "Super");
+   evas_key_lock_add(ee->evas, "Caps_Lock");
+   evas_key_lock_add(ee->evas, "Num_Lock");
+   evas_key_lock_add(ee->evas, "Scroll_Lock");
+
+   ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
+   ecore_evases_hash = evas_hash_add(ecore_evases_hash, 
_ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
+   ecore_evases_hash = evas_hash_add(ecore_evases_hash, 
_ecore_evas_x_winid_str_get(ee->engine.x.win_container), ee);
+   return ee;
+#else
+   return NULL;
+#endif
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+Ecore_X_Window
+ecore_evas_xrender_x11_window_get(Ecore_Evas *ee)
+{
+#ifdef BUILD_ECORE_X 
+   return ee->engine.x.win_container;
+#else
+   return 0;
+#endif
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+Ecore_X_Window
+ecore_evas_xrender_x11_subwindow_get(Ecore_Evas *ee)
+{
+#ifdef BUILD_ECORE_X
+   return ee->engine.x.win;
+#else
+   return 0;
+#endif   
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+void
+ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee, int on)
+{
+#ifdef BUILD_ECORE_X
+   ee->engine.x.direct_resize = on;
+#else
+   return;
+#endif   
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+int
+ecore_evas_xrender_x11_direct_resize_get(Ecore_Evas *ee)
+{
+#ifdef BUILD_ECORE_X
+   return ee->engine.x.direct_resize;
+#else
+   return 0;
+#endif   
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+void
+ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window 
win)
+{
+   ecore_evas_software_x11_extra_event_window_add(ee, win);
+}
+




-------------------------------------------------------
This SF.Net email is sponsored by:
Power Architecture Resource Center: Free content, downloads, discussions,
and more. http://solutions.newsforge.com/ibmarch.tmpl
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to