From 81eba6f5f442109194cb380d76f88b4dc84edb24 Mon Sep 17 00:00:00 2001 From: raster Date: Wed, 30 Mar 2011 10:10:04 +0000 Subject: [PATCH] ecore-evas: feature++ : support netm sync protocol for clients git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@58198 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- ChangeLog | 5 +++++ src/lib/ecore_evas/ecore_evas_private.h | 4 ++++ src/lib/ecore_evas/ecore_evas_x.c | 27 +++++++++++++++++++++++++ src/lib/ecore_x/Ecore_X.h | 6 +++++- src/lib/ecore_x/xlib/ecore_x_sync.c | 35 +++++++++++++++++++++++++++++++++ 5 files changed, 76 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 764e88c..d0daefd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -103,3 +103,8 @@ * Add ecore_con_url_ssl_ca_set to manually set a certificate authority. +2011-03-30 Carsten Haitzler (The Rasterman) + + * Ecore_X gains some more x sync counter controls and Ecore_Evas + now uses the netwm sync protocol to get wm's to only configure + as fast as it can keep drawing. diff --git a/src/lib/ecore_evas/ecore_evas_private.h b/src/lib/ecore_evas/ecore_evas_private.h index 510be70..3bbf1c7 100644 --- a/src/lib/ecore_evas/ecore_evas_private.h +++ b/src/lib/ecore_evas/ecore_evas_private.h @@ -202,6 +202,9 @@ struct _Ecore_Evas_Engine Ecore_X_XRegion *damages; Ecore_X_Sync_Counter sync_counter; Ecore_X_Window leader; + Ecore_X_Sync_Counter netwm_sync_counter; + int netwm_sync_val_hi; + unsigned int netwm_sync_val_lo; int sync_val; // bigger! this will screw up at 2 billion frames (414 days of continual rendering @ 60fps) int screen_num; int px, py, pw, ph; @@ -210,6 +213,7 @@ struct _Ecore_Evas_Engine unsigned char managed : 1; unsigned char sync_began : 1; unsigned char sync_cancel : 1; + unsigned char netwm_sync_set : 1; struct { unsigned char modal : 1; unsigned char sticky : 1; diff --git a/src/lib/ecore_evas/ecore_evas_x.c b/src/lib/ecore_evas/ecore_evas_x.c index 7115afe..9dfbf6c 100644 --- a/src/lib/ecore_evas/ecore_evas_x.c +++ b/src/lib/ecore_evas/ecore_evas_x.c @@ -81,7 +81,18 @@ _ecore_evas_x_protocols_set(Ecore_Evas *ee) if (ee->func.fn_delete_request) protos[num++] = ECORE_X_ATOM_WM_DELETE_WINDOW; protos[num++] = ECORE_X_ATOM_NET_WM_PING; + protos[num++] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST; ecore_x_icccm_protocol_atoms_set(ee->prop.window, protos, num); + + if (!ee->engine.x.netwm_sync_counter) + ee->engine.x.netwm_sync_counter = ecore_x_sync_counter_new(0); + //////// + { + unsigned int tmp = ee->engine.x.netwm_sync_counter; + ecore_x_window_prop_card32_set(ee->prop.window, + ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER, + &tmp, 1); + } } static void @@ -739,6 +750,15 @@ _ecore_evas_x_event_client_message(void *data __UNUSED__, int type __UNUSED__, v ee->engine.x.sync_began = 0; ee->engine.x.sync_cancel = 1; } + else if ((e->message_type == ECORE_X_ATOM_WM_PROTOCOLS) && + (e->data.l[0] == (int)ECORE_X_ATOM_NET_WM_SYNC_REQUEST)) + { + ee = ecore_event_window_match(e->win); + if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */ + ee->engine.x.netwm_sync_val_lo = (unsigned int)e->data.l[2]; + ee->engine.x.netwm_sync_val_hi = (int)e->data.l[3]; + ee->engine.x.netwm_sync_set = 1; + } return ECORE_CALLBACK_PASS_ON; } @@ -2996,6 +3016,13 @@ _ecore_evas_x_flush_post(void *data, Evas *e __UNUSED__, void *event_info __UNUS { Ecore_Evas *ee = data; + if (ee->engine.x.netwm_sync_set) + { + ecore_x_sync_counter_2_set(ee->engine.x.netwm_sync_counter, + ee->engine.x.netwm_sync_val_hi, + ee->engine.x.netwm_sync_val_lo); + ee->engine.x.netwm_sync_set = 0; + } if (ee->no_comp_sync) return; if (!_ecore_evas_app_comp_sync) return; if (ee->engine.x.sync_counter) diff --git a/src/lib/ecore_x/Ecore_X.h b/src/lib/ecore_x/Ecore_X.h index 7ac0f53..6c7da95 100644 --- a/src/lib/ecore_x/Ecore_X.h +++ b/src/lib/ecore_x/Ecore_X.h @@ -2257,7 +2257,11 @@ EAPI void ecore_x_sync_counter_inc( EAPI void ecore_x_sync_counter_val_wait( Ecore_X_Sync_Counter counter, int val); - + + EAPI void ecore_x_sync_counter_set(Ecore_X_Sync_Counter counter, int val); + EAPI void ecore_x_sync_counter_2_set(Ecore_X_Sync_Counter counter, int val_hi, unsigned int val_lo); + EAPI Eina_Bool ecore_x_sync_counter_2_query(Ecore_X_Sync_Counter counter, int *val_hi, unsigned int *val_lo); + EAPI void ecore_x_xinerama_query_screens_prefetch( void); EAPI void ecore_x_xinerama_query_screens_fetch(void); diff --git a/src/lib/ecore_x/xlib/ecore_x_sync.c b/src/lib/ecore_x/xlib/ecore_x_sync.c index 540ade4..28276e5 100644 --- a/src/lib/ecore_x/xlib/ecore_x_sync.c +++ b/src/lib/ecore_x/xlib/ecore_x_sync.c @@ -114,3 +114,38 @@ ecore_x_sync_counter_val_wait(Ecore_X_Sync_Counter counter, int val) // XSync(_ecore_x_disp, False); // dont need this } /* ecore_x_sync_counter_val_wait */ +EAPI void +ecore_x_sync_counter_set(Ecore_X_Sync_Counter counter, int val) +{ + XSyncValue v; + + LOGFN(__FILE__, __LINE__, __FUNCTION__); + XSyncIntToValue(&v, val); + XSyncSetCounter(_ecore_x_disp, counter, v); +} + +EAPI void +ecore_x_sync_counter_2_set(Ecore_X_Sync_Counter counter, int val_hi, unsigned int val_lo) +{ + XSyncValue v; + + LOGFN(__FILE__, __LINE__, __FUNCTION__); + XSyncIntsToValue(&v, val_lo, val_hi); + XSyncSetCounter(_ecore_x_disp, counter, v); +} + +EAPI Eina_Bool +ecore_x_sync_counter_2_query(Ecore_X_Sync_Counter counter, int *val_hi, unsigned int *val_lo) +{ + XSyncValue value; + + LOGFN(__FILE__, __LINE__, __FUNCTION__); + if (XSyncQueryCounter(_ecore_x_disp, counter, &value)) + { + *val_lo = (unsigned int)XSyncValueLow32(value); + *val_hi = (int)XSyncValueHigh32(value); + return EINA_TRUE; + } + return EINA_FALSE; +} + -- 2.7.4