discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=8e44652a4261114a42ac4932fd9b44ffcd35d7f4

commit 8e44652a4261114a42ac4932fd9b44ffcd35d7f4
Author: Mike Blumenkrantz <zm...@osg.samsung.com>
Date:   Mon May 18 15:26:50 2015 -0400

    ecore-x: add function to init ecore-x from external Display* object
    
    when using glx it's necessary to share a Display* object, and this object
    may be created externally
    
    no tests provided since they would not be run, would require direct linkage 
to xlib,
    and is literally a 2 LoC change from regular ecore_x_init()
    
    @feature
---
 src/lib/ecore_x/Ecore_X.h      |   1 +
 src/lib/ecore_x/xlib/ecore_x.c | 142 +++++++++++++++++++++++++++--------------
 2 files changed, 95 insertions(+), 48 deletions(-)

diff --git a/src/lib/ecore_x/Ecore_X.h b/src/lib/ecore_x/Ecore_X.h
index bc79e84..86a33c9 100644
--- a/src/lib/ecore_x/Ecore_X.h
+++ b/src/lib/ecore_x/Ecore_X.h
@@ -1392,6 +1392,7 @@ typedef enum _Ecore_X_Illume_Window_State
 #define ECORE_X_PROP_LIST_TOGGLE    2
 
 EAPI int                       ecore_x_init(const char *name);
+EAPI int                       ecore_x_init_from_display(Ecore_X_Display 
*display); /**< @since 1.15 */
 EAPI int                       ecore_x_shutdown(void);
 EAPI int                       ecore_x_disconnect(void);
 EAPI Ecore_X_Display          *ecore_x_display_get(void);
diff --git a/src/lib/ecore_x/xlib/ecore_x.c b/src/lib/ecore_x/xlib/ecore_x.c
index d1b9896..096f64d 100644
--- a/src/lib/ecore_x/xlib/ecore_x.c
+++ b/src/lib/ecore_x/xlib/ecore_x.c
@@ -339,23 +339,41 @@ _ecore_x_modifiers_get(void)
    ECORE_X_LOCK_SHIFT = _ecore_x_key_mask_get(XK_Shift_Lock);
 }
 
-/**
- * @defgroup Ecore_X_Init_Group X Library Init and Shutdown Functions
- *
- * Functions that start and shut down the Ecore X Library.
- */
+static Eina_Bool
+_ecore_x_init1(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+#ifdef LOGRT
+   _logrt_init();
+#endif /* ifdef LOGRT */
 
-/**
- * Initialize the X display connection to the given display.
- *
- * @param   name Display target name.  If @c NULL, the default display is
- *               assumed.
- * @return  The number of times the library has been initialized without
- *          being shut down.  0 is returned if an error occurs.
- * @ingroup Ecore_X_Init_Group
- */
-EAPI int
-ecore_x_init(const char *name)
+   eina_init();
+   _ecore_xlib_log_dom = eina_log_domain_register
+       ("ecore_x", ECORE_XLIB_DEFAULT_LOG_COLOR);
+   if (_ecore_xlib_log_dom < 0)
+     {
+        EINA_LOG_ERR(
+          "Impossible to create a log domain for the Ecore Xlib module.");
+        return EINA_FALSE;
+     }
+
+   if (!ecore_init())
+     goto shutdown_eina;
+   if (!ecore_event_init())
+     goto shutdown_ecore;
+
+   return EINA_TRUE;
+shutdown_ecore:
+   ecore_shutdown();
+shutdown_eina:
+   eina_log_domain_unregister(_ecore_xlib_log_dom);
+   _ecore_xlib_log_dom = -1;
+   eina_shutdown();
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_x_init2(void)
 {
    int shape_base = 0;
    int shape_err_base = 0;
@@ -384,35 +402,6 @@ ecore_x_init(const char *name)
 #ifdef ECORE_XKB
    int xkb_base = 0;
 #endif /* ifdef ECORE_XKB */
-   if (++_ecore_x_init_count != 1)
-     return _ecore_x_init_count;
-
-   LOGFN(__FILE__, __LINE__, __FUNCTION__);
-#ifdef LOGRT
-   _logrt_init();
-#endif /* ifdef LOGRT */
-
-   eina_init();
-   _ecore_xlib_log_dom = eina_log_domain_register
-       ("ecore_x", ECORE_XLIB_DEFAULT_LOG_COLOR);
-   if (_ecore_xlib_log_dom < 0)
-     {
-        EINA_LOG_ERR(
-          "Impossible to create a log domain for the Ecore Xlib module.");
-        return --_ecore_x_init_count;
-     }
-
-   if (!ecore_init())
-     goto shutdown_eina;
-   if (!ecore_event_init())
-     goto shutdown_ecore;
-
-#ifdef EVAS_FRAME_QUEUING
-   XInitThreads();
-#endif /* ifdef EVAS_FRAME_QUEUING */
-   _ecore_x_disp = XOpenDisplay((char *)name);
-   if (!_ecore_x_disp)
-     goto shutdown_ecore_event;
 
    _ecore_x_error_handler_init();
    _ecore_x_event_handlers_num = LASTEvent;
@@ -703,7 +692,7 @@ ecore_x_init(const char *name)
    _ecore_x_private_win = ecore_x_window_override_new(0, -77, -777, 123, 456);
    _ecore_xlib_sync = !!getenv("ECORE_X_SYNC");
 
-   return _ecore_x_init_count;
+   return EINA_TRUE;
 
 free_event_handlers:
    free(_ecore_x_event_handlers);
@@ -712,15 +701,72 @@ close_display:
    XCloseDisplay(_ecore_x_disp);
    _ecore_x_fd_handler_handle = NULL;
    _ecore_x_disp = NULL;
+   ecore_event_shutdown();
+   ecore_shutdown();
+   eina_log_domain_unregister(_ecore_xlib_log_dom);
+   _ecore_xlib_log_dom = -1;
+   eina_shutdown();
+   return EINA_FALSE;
+}
+
+/**
+ * @defgroup Ecore_X_Init_Group X Library Init and Shutdown Functions
+ *
+ * Functions that start and shut down the Ecore X Library.
+ */
+
+/**
+ * Initialize the X display connection to the given display.
+ *
+ * @param   name Display target name.  If @c NULL, the default display is
+ *               assumed.
+ * @return  The number of times the library has been initialized without
+ *          being shut down.  0 is returned if an error occurs.
+ * @ingroup Ecore_X_Init_Group
+ */
+EAPI int
+ecore_x_init(const char *name)
+{
+   if (++_ecore_x_init_count != 1)
+     return _ecore_x_init_count;
+
+   if (!_ecore_x_init1())
+     return --_ecore_x_init_count;
+
+#ifdef EVAS_FRAME_QUEUING
+   XInitThreads();
+#endif /* ifdef EVAS_FRAME_QUEUING */
+   _ecore_x_disp = XOpenDisplay((char *)name);
+   if (!_ecore_x_disp)
+     goto shutdown_ecore_event;
+   if (_ecore_x_init2())
+     return _ecore_x_init_count;
 shutdown_ecore_event:
    ecore_event_shutdown();
-shutdown_ecore:
    ecore_shutdown();
-shutdown_eina:
    eina_log_domain_unregister(_ecore_xlib_log_dom);
    _ecore_xlib_log_dom = -1;
    eina_shutdown();
+   return --_ecore_x_init_count;
+}
+
+EAPI int
+ecore_x_init_from_display(Ecore_X_Display *display)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(display, 0);
+   if (++_ecore_x_init_count != 1)
+     return _ecore_x_init_count;
 
+   if (!_ecore_x_init1())
+     return --_ecore_x_init_count;
+   _ecore_x_disp = display;
+   if (_ecore_x_init2())
+     return _ecore_x_init_count;
+   ecore_event_shutdown();
+   ecore_shutdown();
+   eina_log_domain_unregister(_ecore_xlib_log_dom);
+   _ecore_xlib_log_dom = -1;
+   eina_shutdown();
    return --_ecore_x_init_count;
 }
 

-- 


Reply via email to