discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=a4ea6e7f23959954f5eaa1b3254165f8fb27319c

commit a4ea6e7f23959954f5eaa1b3254165f8fb27319c
Author: Mike Blumenkrantz <zm...@osg.samsung.com>
Date:   Wed Apr 22 18:14:55 2015 -0400

    add a small screen management interface to E_Comp, remove hardcoded x11 
randr calls
    
    this interface is extremely basic and should allow easy additions for other 
display
    backends
---
 src/bin/e_comp.h         | 16 ++++++++++++++++
 src/bin/e_comp_x.c       |  1 +
 src/bin/e_comp_x_randr.c | 16 ++++++++++++++++
 src/bin/e_comp_x_randr.h |  1 +
 src/bin/e_includes.h     |  4 ++--
 src/bin/e_randr2.c       | 18 ++++++++++--------
 6 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/src/bin/e_comp.h b/src/bin/e_comp.h
index fcf79e6..dbab276 100644
--- a/src/bin/e_comp.h
+++ b/src/bin/e_comp.h
@@ -57,6 +57,20 @@ extern EAPI int E_EVENT_COMPOSITOR_ENABLE;
 
 typedef void (*E_Comp_Grab_Cb)(void);
 
+typedef struct E_Comp_Screen_Iface
+{
+   /* can screen changes be made at all */
+   Eina_Bool (*available)(void);
+   /* begin listening for screen events */
+   void (*init)(void);
+   /* stop listening for screen events */
+   void (*shutdown)(void);
+   /* gather screen info */
+   E_Randr2 *(*create)(void);
+   /* apply current config */
+   void (*apply)(void);
+} E_Comp_Screen_Iface;
+
 struct _E_Comp
 {
    E_Object e_obj_inherit;
@@ -98,6 +112,8 @@ struct _E_Comp
       void *data;
    } autoclose;
 
+   E_Comp_Screen_Iface *screen;
+
    Eina_List *debug_rects;
    Eina_List *ignore_wins;
 
diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c
index 4990d63..fcb06e6 100644
--- a/src/bin/e_comp_x.c
+++ b/src/bin/e_comp_x.c
@@ -4559,6 +4559,7 @@ _e_comp_x_xinerama_setup(int rw, int rh)
    E_Randr2_Screen *s, *s2, *s_chosen;
    Eina_Bool removed;
 
+   e_comp_x_randr_screen_iface_set();
    if (!e_randr2_init()) return 0;
 
    // put screens in tmp list
diff --git a/src/bin/e_comp_x_randr.c b/src/bin/e_comp_x_randr.c
index b0a6460..a0ca058 100644
--- a/src/bin/e_comp_x_randr.c
+++ b/src/bin/e_comp_x_randr.c
@@ -15,6 +15,14 @@ static Ecore_X_Randr_Mode _mode_screen_find(Ecore_X_Window 
root, E_Randr2_Screen
 
 static Eina_List *handlers;
 
+E_Comp_Screen_Iface xiface =
+{
+   .available = e_comp_x_randr_available,
+   .init = e_comp_x_randr_init,
+   .shutdown = e_comp_x_randr_shutdown,
+   .create = e_comp_x_randr_create,
+   .apply = e_comp_x_randr_config_apply
+};
 
 static void
 _e_comp_x_randr_pre_swap(void *data EINA_UNUSED, Evas *e EINA_UNUSED)
@@ -818,6 +826,14 @@ e_comp_x_randr_create(void)
    return r;
 }
 
+EAPI void
+e_comp_x_randr_screen_iface_set(void)
+{
+   if (e_comp->screen)
+     CRI("CANNOT SET XIFACE; IFACE ALREADY EXISTS!");
+   e_comp->screen = &xiface;
+}
+
 EAPI Eina_Bool
 e_comp_x_randr_canvas_new(Ecore_Window parent, int w, int h)
 {
diff --git a/src/bin/e_comp_x_randr.h b/src/bin/e_comp_x_randr.h
index 9b3812c..84932d6 100644
--- a/src/bin/e_comp_x_randr.h
+++ b/src/bin/e_comp_x_randr.h
@@ -7,5 +7,6 @@ EAPI void e_comp_x_randr_config_apply(void);
 EAPI Eina_Bool e_comp_x_randr_available(void);
 EAPI E_Randr2 *e_comp_x_randr_create(void);
 
+EAPI void e_comp_x_randr_screen_iface_set(void);
 EAPI Eina_Bool e_comp_x_randr_canvas_new(Ecore_Window parent, int w, int h);
 #endif
diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h
index 0e68417..ccdaa2a 100644
--- a/src/bin/e_includes.h
+++ b/src/bin/e_includes.h
@@ -7,10 +7,9 @@
 #include "e_zone.h"
 #include "e_desk.h"
 #include "e_auth.h"
+#include "e_randr2.h"
 #ifdef NEED_X
 # include "e_comp_x.h"
-# include "e_randr2.h"
-# include "e_comp_x_randr.h"
 #endif
 #include "e_pixmap.h"
 #include "e_comp_object.h"
@@ -149,6 +148,7 @@
 #include "e_comp_canvas.h"
 #include "e_utils.h"
 #include "e_hints.h"
+#include "e_comp_x_randr.h"
 
 #if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
 # include "e_comp_wl.h"
diff --git a/src/bin/e_randr2.c b/src/bin/e_randr2.c
index e25d30f..1c2e438 100644
--- a/src/bin/e_randr2.c
+++ b/src/bin/e_randr2.c
@@ -45,7 +45,7 @@ EINTERN Eina_Bool
 e_randr2_init(void)
 {
    if (!E_EVENT_RANDR_CHANGE) E_EVENT_RANDR_CHANGE = ecore_event_type_new();
-   if (!e_comp_x_randr_available()) return EINA_FALSE;
+   if ((!e_comp->screen) || (!e_comp->screen->available) || 
(!e_comp->screen->available())) return EINA_FALSE;
    // create data descriptors for config storage
    _e_randr2_cfg_screen_edd =
      E_CONFIG_DD_NEW("E_Config_Randr2_Screen", E_Config_Randr2_Screen);
@@ -76,9 +76,10 @@ e_randr2_init(void)
    E_CONFIG_VAL(D, T, ignore_acpi_events, UCHAR);
 
    // set up events from the driver
-   e_comp_x_randr_init();
+   if (e_comp->screen->init)
+     e_comp->screen->init();
    // get current screen info
-   e_randr2 = e_comp_x_randr_create();
+   e_randr2 = e_comp->screen->create();
    // from screen info calculate screen max dimensions
    _screen_config_maxsize();
    // load config and apply it
@@ -106,7 +107,8 @@ e_randr2_shutdown(void)
    if (_screen_delay_timer) ecore_timer_del(_screen_delay_timer);
    _screen_delay_timer = NULL;
    // stop listening to driver info
-   e_comp_x_randr_shutdown();
+   if (e_comp->screen->shutdown)
+     e_comp->screen->shutdown();
    // clear up all event handlers
    E_FREE_LIST(_ev_handlers, ecore_event_handler_del);
    // free up screen info
@@ -138,7 +140,7 @@ e_randr2_screeninfo_update(void)
 {
    // re-fetch/update current screen info
    _info_free(e_randr2);
-   e_randr2 = e_comp_x_randr_create();
+   e_randr2 = e_comp->screen->create();
    _screen_config_maxsize();
 }
 
@@ -244,7 +246,7 @@ _do_apply(void)
    // take current screen config and apply it to the driver
    printf("RRR: re-get info before applying..\n");
    _info_free(e_randr2);
-   e_randr2 = e_comp_x_randr_create();
+   e_randr2 = e_comp->screen->create();
    _screen_config_maxsize();
    printf("RRR: apply config...\n");
    _config_apply(e_randr2, e_randr2_cfg);
@@ -253,7 +255,7 @@ _do_apply(void)
    printf("RRR: eval config...\n");
    _screen_config_eval();
    printf("RRR: really apply config...\n");
-   e_comp_x_randr_config_apply();
+   e_comp->screen->apply();
    printf("RRR: done config...\n");
 }
 
@@ -525,7 +527,7 @@ _cb_screen_change_delay(void *data EINA_UNUSED)
         Eina_Bool change = EINA_FALSE;
 
         printf("RRR: reconfigure screens due to event...\n");
-        rtemp = e_comp_x_randr_create();
+        rtemp = e_comp->screen->create();
         if (rtemp)
           {
              if (_screens_differ(e_randr2, rtemp)) change = EINA_TRUE;

-- 


Reply via email to