discomfitor pushed a commit to branch master.

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

commit 542079d84100cccda3c5004ce7ddc9e155d571f1
Author: Mike Blumenkrantz <zm...@osg.samsung.com>
Date:   Fri Jan 22 15:58:52 2016 -0500

    move all wayland extension implementations into e_comp_wl_extensions.c
    
    e_comp_wl.c getting a bit hard to manage already, future extension additions
    are going to make it a lot worse
---
 src/bin/Makefile.mk             |   3 +-
 src/bin/e_comp_wl.c             | 134 ++--------------------------------------
 src/bin/e_comp_wl.h             |  16 +++--
 src/bin/e_comp_wl_extensions.c  | 134 ++++++++++++++++++++++++++++++++++++++++
 src/modules/wl_drm/e_mod_main.c |   2 +-
 5 files changed, 151 insertions(+), 138 deletions(-)

diff --git a/src/bin/Makefile.mk b/src/bin/Makefile.mk
index 09027cd..5d41bc8 100644
--- a/src/bin/Makefile.mk
+++ b/src/bin/Makefile.mk
@@ -376,7 +376,8 @@ src/bin/generated/e_comp_wl_screenshooter_server.c \
 src/bin/generated/e_comp_wl_screenshooter_server.h \
 src/bin/e_comp_wl_data.c \
 src/bin/e_comp_wl_input.c \
-src/bin/e_comp_wl.c
+src/bin/e_comp_wl.c \
+src/bin/e_comp_wl_extensions.c
 endif
 
 src_bin_enlightenment_CPPFLAGS = $(E_CPPFLAGS) -DE_LOGGING=1 @WAYLAND_CFLAGS@ 
@WAYLAND_EGL_CFLAGS@ @ECORE_X_CFLAGS@
diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c
index 00fe697..075cfa4 100644
--- a/src/bin/e_comp_wl.c
+++ b/src/bin/e_comp_wl.c
@@ -1,6 +1,5 @@
 #define E_COMP_WL
 #include "e.h"
-#include "e_comp_wl_screenshooter_server.h"
 
 /* handle include for printing uint64_t */
 #define __STDC_FORMAT_MACROS
@@ -15,8 +14,6 @@
 
 E_API int E_EVENT_WAYLAND_GLOBAL_ADD = -1;
 
-#include "session-recovery-server-protocol.h"
-
 #ifndef EGL_HEIGHT
 # define EGL_HEIGHT                    0x3056
 #endif
@@ -34,6 +31,8 @@ E_API int E_EVENT_WAYLAND_GLOBAL_ADD = -1;
 
 static void _e_comp_wl_subsurface_parent_commit(E_Client *ec, Eina_Bool 
parent_synchronized);
 
+EINTERN Eina_Bool e_comp_wl_extensions_init(void);
+
 /* local variables */
 /* static Eina_Hash *clients_win_hash = NULL; */
 static Eina_List *handlers = NULL;
@@ -1620,9 +1619,6 @@ _e_comp_wl_compositor_cb_del(void *data EINA_UNUSED)
 {
    E_Comp_Wl_Output *output;
 
-   if (e_comp_wl->screenshooter.global)
-     wl_global_destroy(e_comp_wl->screenshooter.global);
-
    EINA_LIST_FREE(e_comp_wl->outputs, output)
      {
         if (output->id) eina_stringshare_del(output->id);
@@ -1636,6 +1632,7 @@ _e_comp_wl_compositor_cb_del(void *data EINA_UNUSED)
    /* if (e_comp_wl->fd_hdlr) ecore_main_fd_handler_del(e_comp_wl->fd_hdlr); */
 
    /* free allocated data structure */
+   free(e_comp_wl->extensions);
    free(e_comp_wl);
 }
 
@@ -2056,114 +2053,6 @@ _e_comp_wl_subcompositor_cb_bind(struct wl_client 
*client, void *data EINA_UNUSE
 }
 
 static void
-_e_comp_wl_sr_cb_provide_uuid(struct wl_client *client EINA_UNUSED, struct 
wl_resource *resource EINA_UNUSED, const char *uuid)
-{
-   DBG("Provide UUID callback called for UUID: %s", uuid);
-}
-
-static const struct zwp_e_session_recovery_interface 
_e_session_recovery_interface =
-{
-   _e_comp_wl_sr_cb_provide_uuid,
-};
-
-static void
-_e_comp_wl_session_recovery_cb_bind(struct wl_client *client, void *data 
EINA_UNUSED, uint32_t version EINA_UNUSED, uint32_t id)
-{
-   struct wl_resource *res;
-
-   if (!(res = wl_resource_create(client, &zwp_e_session_recovery_interface, 
1, id)))
-     {
-        ERR("Could not create session_recovery interface");
-        wl_client_post_no_memory(client);
-        return;
-     }
-
-   /* set implementation on resource */
-   wl_resource_set_implementation(res, &_e_session_recovery_interface, e_comp, 
NULL);
-}
-
-static void
-_e_comp_wl_screenshooter_cb_shoot(struct wl_client *client EINA_UNUSED, struct 
wl_resource *resource, struct wl_resource *output_resource, struct wl_resource 
*buffer_resource)
-{
-   E_Comp_Wl_Output *output;
-   E_Comp_Wl_Buffer *buffer;
-   struct wl_shm_buffer *shm_buffer;
-   int stride;
-   void *pixels, *d;
-
-   output = wl_resource_get_user_data(output_resource);
-   buffer = e_comp_wl_buffer_get(buffer_resource);
-
-   if (!buffer)
-     {
-        wl_resource_post_no_memory(resource);
-        return;
-     }
-
-   if ((buffer->w < output->w) || (buffer->h < output->h))
-     {
-        ERR("Buffer size less than output");
-        /* send done with bad buffer error */
-        return;
-     }
-
-   stride = buffer->w * sizeof(int);
-
-   pixels = malloc(stride * buffer->h);
-   if (!pixels)
-     {
-        /* send done with bad buffer error */
-        ERR("Could not allocate space for destination");
-        return;
-     }
-
-   if (e_comp_wl->screenshooter.read_pixels)
-     e_comp_wl->screenshooter.read_pixels(output, pixels);
-
-   shm_buffer = wl_shm_buffer_get(buffer->resource);
-   if (!shm_buffer)
-     {
-        ERR("Could not get shm_buffer from resource");
-        return;
-     }
-
-   stride = wl_shm_buffer_get_stride(shm_buffer);
-   d = wl_shm_buffer_get_data(shm_buffer);
-   if (!d)
-     {
-        ERR("Could not get buffer data");
-        return;
-     }
-
-   wl_shm_buffer_begin_access(shm_buffer);
-   memcpy(d, pixels, buffer->h * stride);
-   wl_shm_buffer_end_access(shm_buffer);
-
-   screenshooter_send_done(resource);
-}
-
-static const struct screenshooter_interface _e_screenshooter_interface =
-{
-   _e_comp_wl_screenshooter_cb_shoot
-};
-
-static void
-_e_comp_wl_screenshooter_cb_bind(struct wl_client *client, void *data, 
uint32_t version EINA_UNUSED, uint32_t id)
-{
-   struct wl_resource *res;
-
-   res = wl_resource_create(client, &screenshooter_interface, 1, id);
-   if (!res)
-     {
-        ERR("Could not create screenshooter resource");
-        wl_client_post_no_memory(client);
-        return;
-     }
-
-   wl_resource_set_implementation(res, &_e_screenshooter_interface, data, 
NULL);
-}
-
-static void
 _e_comp_wl_client_cb_new(void *data EINA_UNUSED, E_Client *ec)
 {
    uint64_t win;
@@ -2461,26 +2350,11 @@ _e_comp_wl_compositor_create(void)
         goto comp_global_err;
      }
 
-   /* try to add session_recovery to wayland globals */
-   if (!wl_global_create(cdata->wl.disp, &zwp_e_session_recovery_interface, 1,
-                         e_comp, _e_comp_wl_session_recovery_cb_bind))
-     {
-        ERR("Could not add session_recovery to wayland globals");
-        goto comp_global_err;
-     }
+   if (!e_comp_wl_extensions_init()) goto comp_global_err;
 
    /* initialize shm mechanism */
    wl_display_init_shm(cdata->wl.disp);
 
-   cdata->screenshooter.global =
-     wl_global_create(cdata->wl.disp, &screenshooter_interface, 1,
-                      e_comp, _e_comp_wl_screenshooter_cb_bind);
-   if (!cdata->screenshooter.global)
-     {
-        ERR("Could not create screenshooter global");
-        goto comp_global_err;
-     }
-
    /* _e_comp_wl_cb_randr_change(NULL, 0, NULL); */
 
    /* try to init data manager */
diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h
index 48c085f..7857db1 100644
--- a/src/bin/e_comp_wl.h
+++ b/src/bin/e_comp_wl.h
@@ -97,6 +97,15 @@ struct _E_Comp_Wl_Subsurf_Data
    Eina_Bool synchronized;
 };
 
+typedef struct E_Comp_Wl_Extension_Data
+{
+   struct
+   {
+      struct wl_client *client;
+      void (*read_pixels)(E_Comp_Wl_Output *output, void *pixels);
+   } screenshooter;
+} E_Comp_Wl_Extension_Data;
+
 struct _E_Comp_Wl_Data
 {
    Ecore_Wl2_Display *ewd;
@@ -231,12 +240,7 @@ struct _E_Comp_Wl_Data
         char *area;
      } xkb;
 
-   struct
-     {
-        struct wl_global *global;
-        struct wl_client *client;
-        void (*read_pixels)(E_Comp_Wl_Output *output, void *pixels);
-     } screenshooter;
+   E_Comp_Wl_Extension_Data *extensions;
 
    Eina_List *outputs;
 
diff --git a/src/bin/e_comp_wl_extensions.c b/src/bin/e_comp_wl_extensions.c
new file mode 100644
index 0000000..803fbea
--- /dev/null
+++ b/src/bin/e_comp_wl_extensions.c
@@ -0,0 +1,134 @@
+#define E_COMP_WL
+#include "e.h"
+
+#include "e_comp_wl_screenshooter_server.h"
+#include "session-recovery-server-protocol.h"
+
+static void
+_e_comp_wl_sr_cb_provide_uuid(struct wl_client *client EINA_UNUSED, struct 
wl_resource *resource EINA_UNUSED, const char *uuid)
+{
+   DBG("Provide UUID callback called for UUID: %s", uuid);
+}
+
+static const struct zwp_e_session_recovery_interface 
_e_session_recovery_interface =
+{
+   _e_comp_wl_sr_cb_provide_uuid,
+};
+
+static void
+_e_comp_wl_session_recovery_cb_bind(struct wl_client *client, void *data 
EINA_UNUSED, uint32_t version EINA_UNUSED, uint32_t id)
+{
+   struct wl_resource *res;
+
+   if (!(res = wl_resource_create(client, &zwp_e_session_recovery_interface, 
1, id)))
+     {
+        ERR("Could not create session_recovery interface");
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   /* set implementation on resource */
+   wl_resource_set_implementation(res, &_e_session_recovery_interface, e_comp, 
NULL);
+}
+
+static void
+_e_comp_wl_screenshooter_cb_shoot(struct wl_client *client EINA_UNUSED, struct 
wl_resource *resource, struct wl_resource *output_resource, struct wl_resource 
*buffer_resource)
+{
+   E_Comp_Wl_Output *output;
+   E_Comp_Wl_Buffer *buffer;
+   struct wl_shm_buffer *shm_buffer;
+   int stride;
+   void *pixels, *d;
+
+   output = wl_resource_get_user_data(output_resource);
+   buffer = e_comp_wl_buffer_get(buffer_resource);
+
+   if (!buffer)
+     {
+        wl_resource_post_no_memory(resource);
+        return;
+     }
+
+   if ((buffer->w < output->w) || (buffer->h < output->h))
+     {
+        ERR("Buffer size less than output");
+        /* send done with bad buffer error */
+        return;
+     }
+
+   stride = buffer->w * sizeof(int);
+
+   pixels = malloc(stride * buffer->h);
+   if (!pixels)
+     {
+        /* send done with bad buffer error */
+        ERR("Could not allocate space for destination");
+        return;
+     }
+
+   if (e_comp_wl->extensions->screenshooter.read_pixels)
+     e_comp_wl->extensions->screenshooter.read_pixels(output, pixels);
+
+   shm_buffer = wl_shm_buffer_get(buffer->resource);
+   if (!shm_buffer)
+     {
+        ERR("Could not get shm_buffer from resource");
+        return;
+     }
+
+   stride = wl_shm_buffer_get_stride(shm_buffer);
+   d = wl_shm_buffer_get_data(shm_buffer);
+   if (!d)
+     {
+        ERR("Could not get buffer data");
+        return;
+     }
+
+   wl_shm_buffer_begin_access(shm_buffer);
+   memcpy(d, pixels, buffer->h * stride);
+   wl_shm_buffer_end_access(shm_buffer);
+
+   screenshooter_send_done(resource);
+}
+
+static const struct screenshooter_interface _e_screenshooter_interface =
+{
+   _e_comp_wl_screenshooter_cb_shoot
+};
+
+static void
+_e_comp_wl_screenshooter_cb_bind(struct wl_client *client, void *data, 
uint32_t version EINA_UNUSED, uint32_t id)
+{
+   struct wl_resource *res;
+
+   res = wl_resource_create(client, &screenshooter_interface, 1, id);
+   if (!res)
+     {
+        ERR("Could not create screenshooter resource");
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   wl_resource_set_implementation(res, &_e_screenshooter_interface, data, 
NULL);
+}
+
+EINTERN Eina_Bool
+e_comp_wl_extensions_init(void)
+{
+   /* try to add session_recovery to wayland globals */
+   if (!wl_global_create(e_comp_wl->wl.disp, 
&zwp_e_session_recovery_interface, 1,
+                         e_comp, _e_comp_wl_session_recovery_cb_bind))
+     {
+        ERR("Could not add session_recovery to wayland globals");
+        return EINA_FALSE;
+     }
+
+   if (!wl_global_create(e_comp_wl->wl.disp, &screenshooter_interface, 1,
+                      e_comp, _e_comp_wl_screenshooter_cb_bind))
+     {
+        ERR("Could not create screenshooter global");
+        return EINA_FALSE;
+     }
+   e_comp_wl->extensions = E_NEW(E_Comp_Wl_Extension_Data, 1);
+   return EINA_TRUE;
+}
diff --git a/src/modules/wl_drm/e_mod_main.c b/src/modules/wl_drm/e_mod_main.c
index 9277d52..4e82e4c 100644
--- a/src/modules/wl_drm/e_mod_main.c
+++ b/src/modules/wl_drm/e_mod_main.c
@@ -742,7 +742,7 @@ e_modapi_init(E_Module *m)
    if (!e_comp_wl_init()) return NULL;
    if (!e_comp_canvas_init(w, h)) return NULL;
 
-   e_comp_wl->screenshooter.read_pixels = _drm_read_pixels;
+   e_comp_wl->extensions->screenshooter.read_pixels = _drm_read_pixels;
 
    ecore_evas_pointer_xy_get(e_comp->ee, &e_comp_wl->ptr.x,
                              &e_comp_wl->ptr.y);

-- 


Reply via email to