add some sync stuff.. wil be used soon
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 30 Jan 2010 10:42:22 +0000 (10:42 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 30 Jan 2010 10:42:22 +0000 (10:42 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@45733 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore_evas/ecore_evas_private.h
src/lib/ecore_evas/ecore_evas_x.c
src/lib/ecore_x/Ecore_X.h
src/lib/ecore_x/Ecore_X_Atoms.h
src/lib/ecore_x/ecore_x_atoms_decl.h
src/lib/ecore_x/xlib/ecore_x_atoms.c
src/lib/ecore_x/xlib/ecore_x_e.c
src/lib/ecore_x/xlib/ecore_x_sync.c

index 691eca1..9b04335 100644 (file)
@@ -199,6 +199,7 @@ struct _Ecore_Evas_Engine
       Ecore_X_Pixmap mask;
       Ecore_X_GC     gc;
       Ecore_X_XRegion *damages;
+      Ecore_X_Sync_Counter sync_counter;
       int            screen_num;
       int            px, py, pw, ph;
       unsigned char  direct_resize : 1;
index 517625e..44ee667 100644 (file)
@@ -36,6 +36,22 @@ _ecore_evas_x_protocols_set(Ecore_Evas *ee)
    ecore_x_icccm_protocol_atoms_set(ee->prop.window, protos, num);
 }
 
+static void
+_ecore_evas_x_sync_set(Ecore_Evas *ee)
+{
+   if (!ee->engine.x.sync_counter)
+     ee->engine.x.sync_counter = ecore_x_sync_counter_new(0);
+   ecore_x_e_comp_sync_counter_set(ee->prop.window, ee->engine.x.sync_counter);
+}
+
+static void
+_ecore_evas_x_sync_clear(Ecore_Evas *ee)
+{
+   if (!ee->engine.x.sync_counter) return;
+   ecore_x_sync_counter_free(ee->engine.x.sync_counter);
+   ee->engine.x.sync_counter = 0;
+}
+
 #ifdef HAVE_ECORE_X_XCB
 static xcb_visualtype_t *
 xcb_visualtype_get(xcb_screen_t *screen, xcb_visualid_t visual)
@@ -140,6 +156,7 @@ _ecore_evas_x_gl_window_new(Ecore_Evas *ee, Ecore_X_Window parent, int x, int y,
        evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
         ecore_x_window_defaults_set(win);
         _ecore_evas_x_protocols_set(ee);
+        _ecore_evas_x_sync_set(ee);
     }
    else
      {
@@ -1033,6 +1050,7 @@ _ecore_evas_x_init(void)
 static void
 _ecore_evas_x_free(Ecore_Evas *ee)
 {
+   _ecore_evas_x_sync_set(ee);
    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);
@@ -1061,6 +1079,7 @@ _ecore_evas_x_callback_delete_request_set(Ecore_Evas *ee, void (*func) (Ecore_Ev
 {
    ee->func.fn_delete_request = func;
    _ecore_evas_x_protocols_set(ee);
+   _ecore_evas_x_sync_set(ee);
 }
 
 static void
@@ -1532,6 +1551,7 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
                                0 /* window_group */,
                                0 /* is_urgent */);
         _ecore_evas_x_protocols_set(ee);
+        _ecore_evas_x_sync_set(ee);
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
      }
    else if (!strcmp(ee->driver, "xrender_x11"))
@@ -1607,6 +1627,7 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
                                0 /* window_group */,
                                0 /* is_urgent */);
         _ecore_evas_x_protocols_set(ee);
+        _ecore_evas_x_sync_set(ee);
 #endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
      }
    else if (!strcmp(ee->driver, "software_16_x11"))
@@ -1675,6 +1696,7 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
                                0 /* window_group */,
                                0 /* is_urgent */);
         _ecore_evas_x_protocols_set(ee);
+        _ecore_evas_x_sync_set(ee);
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
      }
 }
index 61845dc..9107e48 100644 (file)
@@ -1598,7 +1598,22 @@ EAPI int                 ecore_x_e_illume_top_shelf_geometry_get(Ecore_X_Window
 EAPI void                ecore_x_e_illume_bottom_panel_geometry_set(Ecore_X_Window win, int x, int y, int w, int h);
 EAPI int                 ecore_x_e_illume_bottom_panel_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h);
 
-
+EAPI void                 ecore_x_e_comp_sync_counter_set(Ecore_X_Window win, Ecore_X_Sync_Counter counter);
+EAPI Ecore_X_Sync_Counter ecore_x_e_comp_sync_counter_get(Ecore_X_Window win);
+EAPI void                 ecore_x_e_comp_sync_draw_done_send(Ecore_X_Window win);
+EAPI void                 ecore_x_e_comp_sync_supported_set(Ecore_X_Window root, Eina_Bool enabled);
+EAPI Eina_Bool            ecore_x_e_comp_sync_supported_get(Ecore_X_Window root);
+EAPI void                 ecore_x_e_comp_sync_begin_send(Ecore_X_Window win);
+EAPI void                 ecore_x_e_comp_sync_end_send(Ecore_X_Window win);
+       
+EAPI Ecore_X_Sync_Alarm   ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter);
+EAPI int                  ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm);
+EAPI int                  ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter, unsigned int *val);
+EAPI Ecore_X_Sync_Counter ecore_x_sync_counter_new(int val);
+EAPI void                 ecore_x_sync_counter_free(Ecore_X_Sync_Counter counter);
+EAPI void                 ecore_x_sync_counter_inc(Ecore_X_Sync_Counter counter, int val);
+EAPI void                 ecore_x_sync_counter_inc_wait(Ecore_X_Sync_Counter counter, int val);
+       
 EAPI void                ecore_x_xinerama_query_screens_prefetch(void);
 EAPI void                ecore_x_xinerama_query_screens_fetch(void);
 EAPI int                 ecore_x_xinerama_screen_count_get(void);
@@ -1704,11 +1719,6 @@ EAPI int              ecore_x_xregion_is_equal(Ecore_X_XRegion *r1, Ecore_X_XReg
 EAPI int              ecore_x_xregion_point_contain(Ecore_X_XRegion *region, int x, int y);
 EAPI int              ecore_x_xregion_rect_contain(Ecore_X_XRegion *region, Ecore_X_Rectangle *rect);
 
-/* ecore_x_sync.c */
-EAPI Ecore_X_Sync_Alarm ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter);
-EAPI int                ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm);
-EAPI int                ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter, unsigned int *val);
-
 /* ecore_x_randr.c */
 typedef struct _Ecore_X_Screen_Size Ecore_X_Screen_Size;
 struct _Ecore_X_Screen_Size
index a063194..f4ae744 100644 (file)
@@ -229,4 +229,10 @@ EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_TOP_SHELF_GEOMETRY;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_BOTTOM_PANEL_GEOMETRY;
 
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_COUNTER;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_BEGIN;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_END;
+
 #endif /* _ECORE_X_ATOMS_H */
index f0b1cc7..c3956c2 100644 (file)
@@ -251,3 +251,9 @@ EAPI Ecore_X_Atom  ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE_REQUEST    = 0;
 EAPI Ecore_X_Atom  ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE = 0;
 EAPI Ecore_X_Atom  ECORE_X_ATOM_E_ILLUME_TOP_SHELF_GEOMETRY    = 0;
 EAPI Ecore_X_Atom  ECORE_X_ATOM_E_ILLUME_BOTTOM_PANEL_GEOMETRY = 0;
+
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_COUNTER = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_BEGIN = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_END = 0;
index e43dcb9..20a98f2 100644 (file)
@@ -243,7 +243,13 @@ _ecore_x_atoms_init(void)
         { "_E_ILLUME_QUICKPANEL_ZONE_REQUEST", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE_REQUEST }, 
         { "_E_ILLUME_QUICKPANEL_POSITION_UPDATE", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE }, 
         { "_E_ILLUME_TOP_SHELF_GEOMETRY", &ECORE_X_ATOM_E_ILLUME_TOP_SHELF_GEOMETRY }, 
-        { "_E_ILLUME_BOTTOM_PANEL_GEOMETRY", &ECORE_X_ATOM_E_ILLUME_BOTTOM_PANEL_GEOMETRY }
+        { "_E_ILLUME_BOTTOM_PANEL_GEOMETRY", &ECORE_X_ATOM_E_ILLUME_BOTTOM_PANEL_GEOMETRY },
+
+        { "_E_COMP_SYNC_COUNTER", &ECORE_X_ATOM_E_COMP_SYNC_COUNTER },
+        { "_E_COMP_SYNC_DRAW_DONE", &ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE },
+        { "_E_COMP_SYNC_SUPPORTED", &ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED },
+        { "_E_COMP_SYNC_BEGIN", &ECORE_X_ATOM_E_COMP_SYNC_BEGIN },
+        { "_E_COMP_SYNC_END", &ECORE_X_ATOM_E_COMP_SYNC_END }
      };
    Atom *atoms;
    char **names;
index 2fcc924..b9ef508 100644 (file)
@@ -518,3 +518,145 @@ ecore_x_e_illume_bottom_panel_geometry_get(Ecore_X_Window win, int *x, int *y, i
    if (h) *h = geom[3];
    return 1;
 }
+
+EAPI void 
+ecore_x_e_comp_sync_counter_set(Ecore_X_Window win, Ecore_X_Sync_Counter counter)
+{
+   if (counter)
+     ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER,
+                                  ECORE_X_ATOM_CARDINAL, &counter, 1);
+   else
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER);
+}
+
+EAPI Ecore_X_Sync_Counter
+ecore_x_e_comp_sync_counter_get(Ecore_X_Window win)
+{
+   int ret = 0;
+   Ecore_X_Sync_Counter counter = 0;
+
+   ret = 
+     ecore_x_window_prop_xid_get(win, 
+                                 ECORE_X_ATOM_E_COMP_SYNC_COUNTER,
+                                 ECORE_X_ATOM_CARDINAL,
+                                 &counter, 1);
+   if (ret != 1) return 0;
+   return counter;
+}
+
+EAPI void
+ecore_x_e_comp_sync_draw_done_send(Ecore_X_Window win)
+{
+   XEvent xev;
+   
+   xev.xclient.type = ClientMessage;
+   xev.xclient.display = _ecore_x_disp;
+   xev.xclient.window = win;
+   xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = win;
+   xev.xclient.data.l[1] = 0; // later
+   xev.xclient.data.l[2] = 0; // later
+   xev.xclient.data.l[3] = 0; // later
+   xev.xclient.data.l[4] = 0; // later
+   
+   XSendEvent(_ecore_x_disp, win, False,
+              SubstructureRedirectMask | SubstructureNotifyMask, &xev);
+}
+
+EAPI void
+ecore_x_e_comp_sync_supported_set(Ecore_X_Window root, Eina_Bool enabled)
+{
+   Ecore_X_Window win;
+
+   if (enabled)
+     {
+        win = ecore_x_window_new(root, 1, 2, 3, 4);
+        ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                     ECORE_X_ATOM_WINDOW, &win, 1);
+        ecore_x_window_prop_xid_set(root, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                     ECORE_X_ATOM_WINDOW, &win, 1);
+     }
+   else
+     {
+        int ret;
+        
+        ret = 
+          ecore_x_window_prop_xid_get(root, 
+                                      ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                      ECORE_X_ATOM_WINDOW,
+                                      &win, 1);
+        if ((ret == 1) && (win))
+          {
+             ecore_x_window_prop_property_del(root, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED);
+             ecore_x_window_del(win);
+          }
+     }
+}
+
+EAPI Eina_Bool
+ecore_x_e_comp_sync_supported_get(Ecore_X_Window root)
+{
+   Ecore_X_Window win, win2;
+   int ret;
+   
+   ret = 
+     ecore_x_window_prop_xid_get(root, 
+                                 ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                 ECORE_X_ATOM_WINDOW,
+                                 &win, 1);
+   if ((ret == 1) && (win))
+     {
+        ret = 
+          ecore_x_window_prop_xid_get(win, 
+                                      ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                      ECORE_X_ATOM_WINDOW,
+                                      &win2, 1);
+        if ((ret == 1) && (win2 == win))
+          {
+             return 1;
+          }
+     }
+   return 0;
+}
+
+EAPI void
+ecore_x_e_comp_sync_begin_send(Ecore_X_Window win)
+{
+   XEvent xev;
+   
+   xev.xclient.type = ClientMessage;
+   xev.xclient.display = _ecore_x_disp;
+   xev.xclient.window = win;
+   xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_BEGIN;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = win;
+   xev.xclient.data.l[1] = 0; // later
+   xev.xclient.data.l[2] = 0; // later
+   xev.xclient.data.l[3] = 0; // later
+   xev.xclient.data.l[4] = 0; // later
+   
+   XSendEvent(_ecore_x_disp, win, False,
+              SubstructureRedirectMask | SubstructureNotifyMask, &xev);
+}
+
+EAPI void
+ecore_x_e_comp_sync_end_send(Ecore_X_Window win)
+{
+   XEvent xev;
+   
+   xev.xclient.type = ClientMessage;
+   xev.xclient.display = _ecore_x_disp;
+   xev.xclient.window = win;
+   xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_END;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = win;
+   xev.xclient.data.l[1] = 0; // later
+   xev.xclient.data.l[2] = 0; // later
+   xev.xclient.data.l[3] = 0; // later
+   xev.xclient.data.l[4] = 0; // later
+   
+   XSendEvent(_ecore_x_disp, win, False,
+              SubstructureRedirectMask | SubstructureNotifyMask, &xev);
+}
+
index a9d1e65..52ff52b 100644 (file)
@@ -66,3 +66,46 @@ ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter, unsigned int *val)
 
   return 0;
 }
+
+EAPI Ecore_X_Sync_Counter
+ecore_x_sync_counter_new(int val)
+{
+   XSyncCounter counter;
+   XSyncValue v;
+   
+   XSyncIntToValue(&v, val);
+   counter = XSyncCreateCounter(_ecore_x_disp, v);
+   return counter;
+}
+
+EAPI void
+ecore_x_sync_counter_free(Ecore_X_Sync_Counter counter)
+{
+   XSyncDestroyCounter(_ecore_x_disp, counter);
+}
+
+EAPI void
+ecore_x_sync_counter_inc(Ecore_X_Sync_Counter counter, int val)
+{
+   XSyncValue v;
+   
+   XSyncIntToValue(&v, val);
+   XSyncChangeCounter(_ecore_x_disp, counter, v);
+}
+
+EAPI void
+ecore_x_sync_counter_inc_wait(Ecore_X_Sync_Counter counter, int val)
+{
+   XSyncWaitCondition cond;
+   XSyncValue v, v2;
+   
+   XSyncIntToValue(&v, val);
+   XSyncIntToValue(&v2, val + 2);
+   cond.trigger.counter = counter;
+   cond.trigger.value_type = XSyncRelative;
+   cond.trigger.wait_value = v;
+   cond.trigger.test_type = XSyncPositiveTransition;
+   cond.event_threshold = v2;
+   XSyncAwait(_ecore_x_disp, &cond, 1);
+   XSync(_ecore_x_disp, False);
+}