* check the returned value of the _init() functions
authorcaro <caro@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 10 Oct 2009 05:28:43 +0000 (05:28 +0000)
committercaro <caro@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 10 Oct 2009 05:28:43 +0000 (05:28 +0000)
 * simplify a bit the init/shutdown functions

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@42995 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

20 files changed:
src/lib/ecore/ecore.c
src/lib/ecore_con/ecore_con.c
src/lib/ecore_con/ecore_con_ssl.c
src/lib/ecore_directfb/ecore_directfb.c
src/lib/ecore_evas/ecore_evas.c
src/lib/ecore_fb/ecore_fb.c
src/lib/ecore_file/ecore_file.c
src/lib/ecore_file/ecore_file_download.c
src/lib/ecore_file/ecore_file_monitor.c
src/lib/ecore_file/ecore_file_path.c
src/lib/ecore_file/ecore_file_private.h
src/lib/ecore_imf/ecore_imf.c
src/lib/ecore_input/ecore_input.c
src/lib/ecore_ipc/ecore_ipc.c
src/lib/ecore_job/ecore_job.c
src/lib/ecore_quartz/ecore_quartz.m
src/lib/ecore_sdl/Makefile.am
src/lib/ecore_sdl/ecore_sdl.c
src/lib/ecore_x/xcb/ecore_xcb.c
src/lib/ecore_x/xlib/ecore_x.c

index 4d8b26b..4c0da13 100644 (file)
@@ -70,31 +70,39 @@ int _ecore_fps_debug = 0;
 EAPI int
 ecore_init(void)
 {
-   if (++_ecore_init_count == 1)
-     {
+   if (++_ecore_init_count != 1)
+     return _ecore_init_count;
+
 #ifdef HAVE_LOCALE_H
-       setlocale(LC_CTYPE, "");
+   setlocale(LC_CTYPE, "");
 #endif
-       /*
-       if (strcmp(nl_langinfo(CODESET), "UTF-8"))
-         {
-            printf("WARNING: not a utf8 locale!\n");
-         }
-        */
+   /*
+     if (strcmp(nl_langinfo(CODESET), "UTF-8"))
+     {
+       printf("WARNING: not a utf8 locale!\n");
+     }
+   */
 #ifdef HAVE_EVIL
-        evil_init();
+   if (!evil_init())
+     return --_ecore_init_count;
 #endif
-       eina_init();
-       if (getenv("ECORE_FPS_DEBUG")) _ecore_fps_debug = 1;
-       if (_ecore_fps_debug) _ecore_fps_debug_init();
-       _ecore_signal_init();
-       _ecore_exe_init();
-       _ecore_thread_init();
-       _ecore_glib_init();
-       _ecore_loop_time = ecore_time_get();
-     }
+   if (!eina_init())
+     goto shutdown_evil;
+   if (getenv("ECORE_FPS_DEBUG")) _ecore_fps_debug = 1;
+   if (_ecore_fps_debug) _ecore_fps_debug_init();
+   _ecore_signal_init();
+   _ecore_exe_init();
+   _ecore_thread_init();
+   _ecore_glib_init();
+   _ecore_loop_time = ecore_time_get();
 
    return _ecore_init_count;
+
+ shutdown_evil:
+#ifdef HAVE_EVIL
+   evil_shutdown();
+#endif
+   return --_ecore_init_count;
 }
 
 /**
@@ -110,8 +118,8 @@ ecore_init(void)
 EAPI int
 ecore_shutdown(void)
 {
-   if (--_ecore_init_count)
-      return _ecore_init_count;
+   if (--_ecore_init_count != 0)
+     return _ecore_init_count;
 
    if (_ecore_fps_debug) _ecore_fps_debug_shutdown();
    _ecore_poller_shutdown();
index e0ce6dd..e119ac3 100644 (file)
@@ -62,7 +62,7 @@ EAPI int ECORE_CON_EVENT_CLIENT_DATA = 0;
 EAPI int ECORE_CON_EVENT_SERVER_DATA = 0;
 
 static Eina_List *servers = NULL;
-static int init_count = 0;
+static int _ecore_con_init_count = 0;
 
 #define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct sockaddr_un *)NULL)->sun_path))
 #define LENGTH_OF_ABSTRACT_SOCKADDR_UN(s, path) (strlen(path) + 1 + (size_t)(((struct sockaddr_un *)NULL)->sun_path))
@@ -83,9 +83,12 @@ static int init_count = 0;
 EAPI int
 ecore_con_init(void)
 {
-   if (++init_count != 1) return init_count;
+   if (++_ecore_con_init_count != 1)
+     return _ecore_con_init_count;
+
+   if (!ecore_init())
+     return --_ecore_con_init_count;
 
-   ecore_init();
    ECORE_CON_EVENT_CLIENT_ADD = ecore_event_type_new();
    ECORE_CON_EVENT_CLIENT_DEL = ecore_event_type_new();
    ECORE_CON_EVENT_SERVER_ADD = ecore_event_type_new();
@@ -98,7 +101,7 @@ ecore_con_init(void)
    ecore_con_dns_init();
    ecore_con_info_init();
 
-   return init_count;
+   return _ecore_con_init_count;
 }
 
 /**
@@ -110,7 +113,8 @@ ecore_con_init(void)
 EAPI int
 ecore_con_shutdown(void)
 {
-   if (--init_count != 0) return init_count;
+   if (--_ecore_con_init_count != 0)
+     return _ecore_con_init_count;
 
    while (servers)
      _ecore_con_server_free(eina_list_data_get(servers));
@@ -121,7 +125,7 @@ ecore_con_shutdown(void)
 
    ecore_shutdown();
 
-   return init_count;
+   return _ecore_con_init_count;
 }
 
 /**
index dd3344d..2d678ea 100644 (file)
@@ -15,7 +15,7 @@
 #include "ecore_con_private.h"
 #include "Ecore.h"
 
-static int _init_count = 0;
+static int _init_con_ssl_init_count = 0;
 
 #if USE_GNUTLS
 static int _client_connected = 0;
@@ -69,19 +69,19 @@ SSL_SUFFIX(_ecore_con_ssl_client_write)(Ecore_Con_Client *cl, unsigned char *buf
 Ecore_Con_Ssl_Error
 ecore_con_ssl_init(void)
 {
-  if (!_init_count++)
+  if (!_init_con_ssl_init_count++)
     SSL_SUFFIX(_ecore_con_ssl_init)();
 
-  return _init_count;
+  return _init_con_ssl_init_count;
 }
 
 Ecore_Con_Ssl_Error
 ecore_con_ssl_shutdown(void)
 {
-  if (!--_init_count)
+  if (!--_init_con_ssl_init_count)
     SSL_SUFFIX(_ecore_con_ssl_shutdown)();
 
-  return _init_count;
+  return _init_con_ssl_init_count;
 }
 
 /**
index 4b7daf3..191be53 100644 (file)
@@ -658,8 +658,7 @@ ecore_directfb_init(const char *name __UNUSED__)
 {
        int i = 0;
        
-       _ecore_directfb_init_count++;
-       if (_ecore_directfb_init_count > 1) return _ecore_directfb_init_count;
+       if (++_ecore_directfb_init_count != 1) return _ecore_directfb_init_count;
        
        DFBCHECK(DirectFBInit(NULL,NULL));
        DFBCHECK(DirectFBCreate(&_dfb));
@@ -706,13 +705,8 @@ ecore_directfb_init(const char *name __UNUSED__)
 EAPI int
 ecore_directfb_shutdown(void)
 {
-       _ecore_directfb_init_count--;
-       if (_ecore_directfb_init_count > 0) return _ecore_directfb_init_count;
-       if (_ecore_directfb_init_count < 0)
-       {
-               _ecore_directfb_init_count = 0;
-               return 0;
-       }
+       if (--_ecore_directfb_init_count != 0) return _ecore_directfb_init_count;
+
        ecore_main_fd_handler_del(_window_event_fd_handler_handle);
        eina_hash_free(_ecore_directfb_key_symbols_hash);
 
@@ -725,5 +719,5 @@ ecore_directfb_shutdown(void)
        DFBCHECK(_layer->Release(_layer));
        DFBCHECK(_dfb->Release(_dfb));
        
-       return 1;
+       return _ecore_directfb_init_count;
 }
index 9722f29..caa32ea 100644 (file)
@@ -141,73 +141,82 @@ ecore_evas_engine_type_supported_get(Ecore_Evas_Engine_Type engine)
  * Init the Evas system.
  * @return greater than 0 on success, 0 on failure
  *
- * Set up the Evas wrapper system.
+ * Set up the Evas wrapper system. Init Evas and Ecore libraries.
  */
 EAPI int
 ecore_evas_init(void)
 {
-   if (_ecore_evas_init_count == 0)
-     {
-       int fd;
+   int fd;
 
-       evas_init();
-       ecore_init();
+   if (++_ecore_evas_init_count != 1)
+     return _ecore_evas_init_count;
 
-       _ecore_evas_log_dom = eina_log_domain_register("Ecore_Evas", ECORE_EVAS_DEFAULT_LOG_COLOR);
-       if(_ecore_evas_log_dom < 0) 
-         {
-           EINA_LOG_ERR("Impossible to create a log domain for Ecore_Evas.\n");
-           ecore_shutdown();
-           evas_shutdown();
-           return 0;
-         }
-       fd = evas_async_events_fd_get();
-       if (fd > 0)
-         _ecore_evas_async_events_fd = ecore_main_fd_handler_add(fd,
-                                                                 ECORE_FD_READ,
-                                                                 _ecore_evas_async_events_fd_handler, NULL,
-                                                                 NULL, NULL);
+   if (!evas_init())
+     return --_ecore_evas_init_count;
+
+   if (!ecore_init())
+     goto shutdown_evas;
+
+   _ecore_evas_log_dom = eina_log_domain_register("Ecore_Evas", ECORE_EVAS_DEFAULT_LOG_COLOR);
+   if(_ecore_evas_log_dom < 0) 
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for Ecore_Evas.\n");
+       goto shutdown_ecore;
      }
-   return ++_ecore_evas_init_count;
+
+   fd = evas_async_events_fd_get();
+   if (fd > 0)
+     _ecore_evas_async_events_fd = ecore_main_fd_handler_add(fd,
+                                                            ECORE_FD_READ,
+                                                            _ecore_evas_async_events_fd_handler, NULL,
+                                                            NULL, NULL);
+   return _ecore_evas_init_count;
+
+ shutdown_ecore:
+   ecore_shutdown();
+ shutdown_evas:
+   evas_shutdown();
+
+   return --_ecore_evas_init_count;
 }
 
 /**
  * Shut down the Evas system.
  * @return 0 if ecore evas is fully shut down, or > 0 if it still needs to be shut down
  *
- * This closes the Evas system down.
+ * This closes the Evas wrapper system down. Shut down Evas and Ecore libraries.
  */
 EAPI int
 ecore_evas_shutdown(void)
 {
-   _ecore_evas_init_count--;
-   if (_ecore_evas_init_count == 0)
-     {
+   if (--_ecore_evas_init_count != 0)
+     return _ecore_evas_init_count;
+
 #ifdef BUILD_ECORE_EVAS_X11
-       while (_ecore_evas_x_shutdown());
+   while (_ecore_evas_x_shutdown());
 #endif
 #ifdef BUILD_ECORE_EVAS_WIN32
-       while (_ecore_evas_win32_shutdown());
+   while (_ecore_evas_win32_shutdown());
 #endif
 #ifdef BUILD_ECORE_EVAS_FB
-       while (_ecore_evas_fb_shutdown());
+   while (_ecore_evas_fb_shutdown());
 #endif
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
-       while (_ecore_evas_buffer_shutdown());
+   while (_ecore_evas_buffer_shutdown());
 #endif
 #ifdef BUILD_ECORE_EVAS_DIRECTFB
-       while (_ecore_evas_directfb_shutdown());
+   while (_ecore_evas_directfb_shutdown());
 #endif
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
-       while (_ecore_evas_wince_shutdown());
+   while (_ecore_evas_wince_shutdown());
 #endif
-       if (_ecore_evas_async_events_fd)
-         ecore_main_fd_handler_del(_ecore_evas_async_events_fd);
-       eina_log_domain_unregister(_ecore_evas_log_dom);
-       ecore_shutdown();
-       evas_shutdown();
-     }
-   if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
+   if (_ecore_evas_async_events_fd)
+     ecore_main_fd_handler_del(_ecore_evas_async_events_fd);
+
+   eina_log_domain_unregister(_ecore_evas_log_dom);
+   ecore_shutdown();
+   evas_shutdown();
+
    return _ecore_evas_init_count;
 }
 
index 83b36b5..acc380a 100644 (file)
@@ -41,18 +41,21 @@ static double _ecore_fb_double_click_time = 0.25;
 EAPI int
 ecore_fb_init(const char *name __UNUSED__)
 {
-       if(!_ecore_fb_init_count)
-       {
-               if(!ecore_fb_vt_init()) return 0;
-               ECORE_FB_EVENT_KEY_DOWN          = ecore_event_type_new();
-               ECORE_FB_EVENT_KEY_UP            = ecore_event_type_new();
-               ECORE_FB_EVENT_MOUSE_BUTTON_DOWN = ecore_event_type_new();
-               ECORE_FB_EVENT_MOUSE_BUTTON_UP   = ecore_event_type_new();
-               ECORE_FB_EVENT_MOUSE_MOVE        = ecore_event_type_new();
-               ECORE_FB_EVENT_MOUSE_WHEEL       = ecore_event_type_new();
-               _ecore_fb_size_get(&_ecore_fb_console_w, &_ecore_fb_console_h);
-       }
-       return ++_ecore_fb_init_count;
+   if (++_ecore_fb_init_count != 1)
+     return _ecore_fb_init_count;
+
+   if (!ecore_fb_vt_init())
+     return --_ecore_fb_init_count;
+
+   ECORE_FB_EVENT_KEY_DOWN          = ecore_event_type_new();
+   ECORE_FB_EVENT_KEY_UP            = ecore_event_type_new();
+   ECORE_FB_EVENT_MOUSE_BUTTON_DOWN = ecore_event_type_new();
+   ECORE_FB_EVENT_MOUSE_BUTTON_UP   = ecore_event_type_new();
+   ECORE_FB_EVENT_MOUSE_MOVE        = ecore_event_type_new();
+   ECORE_FB_EVENT_MOUSE_WHEEL       = ecore_event_type_new();
+   _ecore_fb_size_get(&_ecore_fb_console_w, &_ecore_fb_console_h);
+
+   return _ecore_fb_init_count;
 }
 
 /**
@@ -64,13 +67,12 @@ ecore_fb_init(const char *name __UNUSED__)
 EAPI int
 ecore_fb_shutdown(void)
 {    
-       _ecore_fb_init_count--;
-       if(!_ecore_fb_init_count)
-       {
-               ecore_fb_vt_shutdown();
-               return 0;
-       }
-       return _ecore_fb_init_count;
+   if (--_ecore_fb_init_count != 0)
+     return _ecore_fb_init_count;
+
+   ecore_fb_vt_shutdown();
+
+   return _ecore_fb_init_count;
 }
 
 
index 31a8e88..064016a 100644 (file)
@@ -27,7 +27,7 @@
 #include "ecore_file_private.h"
 
 
-static int init = 0;
+static int _ecore_file_init_count = 0;
 
 /* externally accessible functions */
 /**
@@ -39,29 +39,33 @@ static int init = 0;
 EAPI int
 ecore_file_init()
 {
-   if (++init != 1) return init;
-
-//   if (!
-       ecore_file_monitor_init();
-//       )
-//     goto error;
-//   if (!
-       ecore_file_path_init();
-//       )
-//     goto error;
-//   if (!
-       ecore_file_download_init();
-//       )
-//     goto error;
-   return init;
-
-//error:
+   if (++_ecore_file_init_count != 1)
+     return _ecore_file_init_count;
 
+   ecore_file_path_init();
+   ecore_file_monitor_init();
+   ecore_file_download_init();
+
+   /* FIXME: were the tests disabled for a good reason ? */
+
+   /*
+   if (!ecore_file_monitor_init())
+     goto shutdown_ecore_file_path;
+
+   if (!ecore_file_download_init())
+     goto shutdown_ecore_file_monitor;
+   */
+
+   return _ecore_file_init_count;
+
+   /*
+ shutdown_ecore_file_monitor:
    ecore_file_monitor_shutdown();
+ shutdown_ecore_file_path:
    ecore_file_path_shutdown();
-   ecore_file_download_shutdown();
 
-   return --init;
+   return --_ecore_file_init_count;
+   */
 }
 
 /**
@@ -71,13 +75,14 @@ ecore_file_init()
 EAPI int
 ecore_file_shutdown()
 {
-   if (--init != 0) return init;
+   if (--_ecore_file_init_count != 0)
+     return _ecore_file_init_count;
 
+   ecore_file_download_shutdown();
    ecore_file_monitor_shutdown();
    ecore_file_path_shutdown();
-   ecore_file_download_shutdown();
 
-   return init;
+   return _ecore_file_init_count;
 }
 
 /**
index c855c71..a46fce9 100644 (file)
@@ -42,24 +42,21 @@ static int _ecore_file_download_url_progress_cb(void *data, int type, void *even
 #endif
 static void _ecore_file_download_abort(Ecore_File_Download_Job *job);
 
-static int                      init = 0;
 static Ecore_Event_Handler     *_url_complete_handler = NULL;
 static Ecore_Event_Handler     *_url_progress_download = NULL;
 static Eina_List               *_job_list;
 
-EAPI int
+int
 ecore_file_download_init(void)
 {
 #ifndef _WIN32
-   ecore_con_url_init();
+  if (!ecore_con_url_init())
+    return 0;
 
-   if (init++ == 0)
-     {
 #ifdef HAVE_CURL
-       _url_complete_handler = ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _ecore_file_download_url_complete_cb, NULL);
-       _url_progress_download = ecore_event_handler_add(ECORE_CON_EVENT_URL_PROGRESS, _ecore_file_download_url_progress_cb, NULL);
+  _url_complete_handler = ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _ecore_file_download_url_complete_cb, NULL);
+  _url_progress_download = ecore_event_handler_add(ECORE_CON_EVENT_URL_PROGRESS, _ecore_file_download_url_progress_cb, NULL);
 #endif
-     }
 
    return 1;
 #else
@@ -67,31 +64,26 @@ ecore_file_download_init(void)
 #endif
 }
 
-EAPI int
+void
 ecore_file_download_shutdown(void)
 {
 #ifndef _WIN32
-   if (--init == 0)
-     {
-       if (_url_complete_handler)
-         ecore_event_handler_del(_url_complete_handler);
-       if (_url_progress_download)
-         ecore_event_handler_del(_url_progress_download);
-       _url_complete_handler = NULL;
-       _url_progress_download = NULL;
-       ecore_file_download_abort_all();
-     }
-
-   return ecore_con_url_shutdown();
-#else
-   return 0;
+  if (_url_complete_handler)
+    ecore_event_handler_del(_url_complete_handler);
+  if (_url_progress_download)
+    ecore_event_handler_del(_url_progress_download);
+  _url_complete_handler = NULL;
+  _url_progress_download = NULL;
+  ecore_file_download_abort_all();
+
+  ecore_con_url_shutdown();
 #endif
 }
 
 EAPI void
 ecore_file_download_abort_all(void)
 {
-       Ecore_File_Download_Job *job;
+   Ecore_File_Download_Job *job;
 
    EINA_LIST_FREE(_job_list, job)
             _ecore_file_download_abort(job);
index 32c1b20..3eec572 100644 (file)
@@ -8,8 +8,6 @@
 
 #include "ecore_file_private.h"
 
-static int init = 0;
-
 typedef enum {
      ECORE_FILE_MONITOR_TYPE_NONE,
 #ifdef HAVE_INOTIFY
@@ -25,27 +23,23 @@ static Ecore_File_Monitor_Type monitor_type = ECORE_FILE_MONITOR_TYPE_NONE;
 int
 ecore_file_monitor_init(void)
 {
-   if (++init != 1) return init;
-
 #ifdef HAVE_INOTIFY
    monitor_type = ECORE_FILE_MONITOR_TYPE_INOTIFY;
    if (ecore_file_monitor_inotify_init())
-     return init;
+     return 1;
 #endif
 #ifdef HAVE_POLL
    monitor_type = ECORE_FILE_MONITOR_TYPE_POLL;
    if (ecore_file_monitor_poll_init())
-     return init;
+     return 1;
 #endif
    monitor_type = ECORE_FILE_MONITOR_TYPE_NONE;
-   return --init;
+   return 0;
 }
 
-int
+void
 ecore_file_monitor_shutdown(void)
 {
-   if (--init != 0) return init;
-
    switch (monitor_type)
      {
       case ECORE_FILE_MONITOR_TYPE_NONE:
@@ -61,7 +55,6 @@ ecore_file_monitor_shutdown(void)
         break;
 #endif
      }
-   return init;
 }
 
 /**
index dd1e95f..2e66074 100644 (file)
 
 #include "ecore_file_private.h"
 
-static int init = 0;
 static Eina_List *__ecore_file_path_bin = NULL;
 
 static Eina_List *_ecore_file_path_from_env(const char *env);
 
-int
+void
 ecore_file_path_init(void)
 {
-   if (++init != 1) return init;
    __ecore_file_path_bin = _ecore_file_path_from_env("PATH");
-   return init;
 }
 
-int
+void
 ecore_file_path_shutdown(void)
 {
    char *dir;
 
-   if (--init != 0) return init;
    EINA_LIST_FREE(__ecore_file_path_bin, dir)
      free(dir);
-   return init;
 }
 
 Eina_List *
index 22d3b30..6b781a2 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef ECORE_FILE_PRIVATE_H_
+#define ECORE_FILE_PRIVATE_H_
+
 #ifndef _FILE_OFFSET_BITS
 # define _FILE_OFFSET_BITS  64
 #endif
@@ -16,8 +19,8 @@
 #include "Ecore_File.h"
 
 /* ecore_file_monitor */
-int ecore_file_monitor_init(void);
-int ecore_file_monitor_shutdown(void);
+int  ecore_file_monitor_init(void);
+void ecore_file_monitor_shutdown(void);
 
 #define ECORE_FILE_MONITOR(x) ((Ecore_File_Monitor *)(x))
 
@@ -66,12 +69,14 @@ Ecore_File_Monitor *ecore_file_monitor_poll_add(const char *path,
                                                void *data);
 void                ecore_file_monitor_poll_del(Ecore_File_Monitor *ecore_file_monitor);
 
+#endif
+
 /* ecore_file_path */
-int ecore_file_path_init(void);
-int ecore_file_path_shutdown(void);
+void ecore_file_path_init(void);
+void ecore_file_path_shutdown(void);
 
 /* ecore_file_download */
-int ecore_file_download_init(void);
-int ecore_file_download_shutdown(void);
+int  ecore_file_download_init(void);
+void ecore_file_download_shutdown(void);
 
 #endif
index 66470eb..ff5d251 100644 (file)
@@ -18,7 +18,7 @@ EAPI int ECORE_IMF_EVENT_PREEDIT_CHANGED = 0;
 EAPI int ECORE_IMF_EVENT_COMMIT = 0;
 EAPI int ECORE_IMF_EVENT_DELETE_SURROUNDING = 0;
 
-static int init_count = 0;
+static int _ecore_imf_init_count = 0;
 
 /**
  * @defgroup Ecore_IMF_Lib_Group Ecore Input Method Library Functions
@@ -36,9 +36,12 @@ static int init_count = 0;
 EAPI int
 ecore_imf_init(void)
 {
-   if (++init_count != 1) return init_count;
+   if (++_ecore_imf_init_count != 1)
+     return _ecore_imf_init_count;
+
+   if (!ecore_init())
+     return --_ecore_imf_init_count;
 
-   ecore_init();
    ecore_imf_module_init();
 
    ECORE_IMF_EVENT_PREEDIT_START = ecore_event_type_new();
@@ -47,7 +50,7 @@ ecore_imf_init(void)
    ECORE_IMF_EVENT_COMMIT = ecore_event_type_new();
    ECORE_IMF_EVENT_DELETE_SURROUNDING = ecore_event_type_new();
 
-   return init_count;
+   return _ecore_imf_init_count;
 }
 
 /**
@@ -59,10 +62,11 @@ ecore_imf_init(void)
 EAPI int
 ecore_imf_shutdown(void)
 {
-   if (--init_count != 0) return init_count;
+   if (--_ecore_imf_init_count != 0)
+     return _ecore_imf_init_count;
 
    ecore_shutdown();
    ecore_imf_module_shutdown();
 
-   return init_count;
+   return _ecore_imf_init_count;
 }
index 79f5b43..3f41785 100644 (file)
@@ -34,11 +34,46 @@ EAPI int ECORE_EVENT_MOUSE_IN = 0;
 EAPI int ECORE_EVENT_MOUSE_OUT = 0;
 
 static int _ecore_event_init_count = 0;
+static int _ecore_event_evas_init_count = 0;
 
 static Ecore_Event_Handler *ecore_event_evas_handlers[8];
 static Eina_Hash *_window_hash = NULL;
 
-static int _ecore_event_evas_init_count = 0;
+EAPI int
+ecore_event_init(void)
+{
+   if (++_ecore_event_init_count != 1)
+     return _ecore_event_init_count;
+
+   ECORE_EVENT_KEY_DOWN = ecore_event_type_new();
+   ECORE_EVENT_KEY_UP = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_BUTTON_DOWN = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_BUTTON_UP = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_MOVE = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_WHEEL = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_IN = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_OUT = ecore_event_type_new();
+
+   return _ecore_event_init_count;
+}
+
+EAPI int
+ecore_event_shutdown(void)
+{
+   if (--_ecore_event_init_count != 0)
+     return _ecore_event_init_count;
+
+   ECORE_EVENT_KEY_DOWN = 0;
+   ECORE_EVENT_KEY_UP = 0;
+   ECORE_EVENT_MOUSE_BUTTON_DOWN = 0;
+   ECORE_EVENT_MOUSE_BUTTON_UP = 0;
+   ECORE_EVENT_MOUSE_MOVE = 0;
+   ECORE_EVENT_MOUSE_WHEEL = 0;
+   ECORE_EVENT_MOUSE_IN = 0;
+   ECORE_EVENT_MOUSE_OUT = 0;
+
+   return ++_ecore_event_init_count;
+}
 
 EAPI void
 ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers)
@@ -267,60 +302,75 @@ ecore_event_evas_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *eve
 EAPI int
 ecore_event_evas_init(void)
 {
-   if (!_ecore_event_evas_init_count)
+   if (++_ecore_event_evas_init_count != 1)
+     return _ecore_event_evas_init_count;
+
+   if (!ecore_init())
+     {
+       return --_ecore_event_evas_init_count;
+     }
+
+   if (!ecore_event_init())
      {
-       ecore_init();
-       ecore_event_init();
-
-       ecore_event_evas_handlers[0] = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
-                                                              ecore_event_evas_key_down,
-                                                              NULL);
-       ecore_event_evas_handlers[1] = ecore_event_handler_add(ECORE_EVENT_KEY_UP,
-                                                              ecore_event_evas_key_up,
-                                                              NULL);
-       ecore_event_evas_handlers[2] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
-                                                              ecore_event_evas_mouse_button_down,
-                                                              NULL);
-       ecore_event_evas_handlers[3] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
-                                                              ecore_event_evas_mouse_button_up,
-                                                              NULL);
-       ecore_event_evas_handlers[4] = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
-                                                              ecore_event_evas_mouse_move,
-                                                              NULL);
-       ecore_event_evas_handlers[5] = ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL,
-                                                              ecore_event_evas_mouse_wheel,
-                                                              NULL);
-       ecore_event_evas_handlers[6] = ecore_event_handler_add(ECORE_EVENT_MOUSE_IN,
-                                                              ecore_event_evas_mouse_in,
-                                                              NULL);
-       ecore_event_evas_handlers[7] = ecore_event_handler_add(ECORE_EVENT_MOUSE_OUT,
-                                                              ecore_event_evas_mouse_out,
-                                                              NULL);
-
-       _window_hash = eina_hash_pointer_new(free);
+       goto shutdown_ecore;
      }
-   return ++_ecore_event_evas_init_count;
+
+   ecore_event_evas_handlers[0] = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
+                                                         ecore_event_evas_key_down,
+                                                         NULL);
+   ecore_event_evas_handlers[1] = ecore_event_handler_add(ECORE_EVENT_KEY_UP,
+                                                         ecore_event_evas_key_up,
+                                                         NULL);
+   ecore_event_evas_handlers[2] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
+                                                         ecore_event_evas_mouse_button_down,
+                                                         NULL);
+   ecore_event_evas_handlers[3] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
+                                                         ecore_event_evas_mouse_button_up,
+                                                         NULL);
+   ecore_event_evas_handlers[4] = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
+                                                         ecore_event_evas_mouse_move,
+                                                         NULL);
+   ecore_event_evas_handlers[5] = ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL,
+                                                         ecore_event_evas_mouse_wheel,
+                                                         NULL);
+   ecore_event_evas_handlers[6] = ecore_event_handler_add(ECORE_EVENT_MOUSE_IN,
+                                                         ecore_event_evas_mouse_in,
+                                                         NULL);
+   ecore_event_evas_handlers[7] = ecore_event_handler_add(ECORE_EVENT_MOUSE_OUT,
+                                                         ecore_event_evas_mouse_out,
+                                                         NULL);
+
+   _window_hash = eina_hash_pointer_new(free);
+
+   return _ecore_event_evas_init_count;
+
+ shutdown_ecore:
+   ecore_shutdown();
+
+   return --_ecore_event_evas_init_count;
 }
 
 EAPI int
 ecore_event_evas_shutdown(void)
 {
-   if (_ecore_event_evas_init_count == 1)
+   int i;
+
+   if (--_ecore_event_evas_init_count != 0)
+     return _ecore_event_evas_init_count;
+
+
+   eina_hash_free(_window_hash);
+   _window_hash = NULL;
+   for (i = 0; i < sizeof(ecore_event_evas_handlers)/sizeof(Ecore_Event_Handler*); ++i)
      {
-       int i;
-
-        eina_hash_free(_window_hash);
-        _window_hash = NULL;
-       for (i = 0; i < sizeof(ecore_event_evas_handlers)/sizeof(Ecore_Event_Handler*); ++i)
-         {
-            ecore_event_handler_del(ecore_event_evas_handlers[i]);
-            ecore_event_evas_handlers[i] = NULL;
-         }
-
-       ecore_event_shutdown();
-       ecore_shutdown();
+       ecore_event_handler_del(ecore_event_evas_handlers[i]);
+       ecore_event_evas_handlers[i] = NULL;
      }
-   return --_ecore_event_evas_init_count;
+
+   ecore_event_shutdown();
+   ecore_shutdown();
+
+   return _ecore_event_evas_init_count;
 }
 
 typedef struct _Ecore_Event_Modifier_Match Ecore_Event_Modifier_Match;
@@ -371,37 +421,3 @@ ecore_event_update_modifier(const char *key, Ecore_Event_Modifiers *modifiers, i
 
    return ECORE_NONE;
 }
-
-EAPI int
-ecore_event_init(void)
-{
-   if (!_ecore_event_init_count)
-     {
-       ECORE_EVENT_KEY_DOWN = ecore_event_type_new();
-       ECORE_EVENT_KEY_UP = ecore_event_type_new();
-       ECORE_EVENT_MOUSE_BUTTON_DOWN = ecore_event_type_new();
-       ECORE_EVENT_MOUSE_BUTTON_UP = ecore_event_type_new();
-       ECORE_EVENT_MOUSE_MOVE = ecore_event_type_new();
-       ECORE_EVENT_MOUSE_WHEEL = ecore_event_type_new();
-       ECORE_EVENT_MOUSE_IN = ecore_event_type_new();
-       ECORE_EVENT_MOUSE_OUT = ecore_event_type_new();
-     }
-   return ++_ecore_event_init_count;
-}
-
-EAPI int
-ecore_event_shutdown(void)
-{
-   if (_ecore_event_init_count == 1)
-     {
-       ECORE_EVENT_KEY_DOWN = 0;
-       ECORE_EVENT_KEY_UP = 0;
-       ECORE_EVENT_MOUSE_BUTTON_DOWN = 0;
-       ECORE_EVENT_MOUSE_BUTTON_UP = 0;
-       ECORE_EVENT_MOUSE_MOVE = 0;
-       ECORE_EVENT_MOUSE_WHEEL = 0;
-       ECORE_EVENT_MOUSE_IN = 0;
-       ECORE_EVENT_MOUSE_OUT = 0;
-     }
-   return ++_ecore_event_init_count;
-}
index bc0bc40..6e1f0b2 100644 (file)
@@ -240,7 +240,7 @@ EAPI int ECORE_IPC_EVENT_SERVER_DEL = 0;
 EAPI int ECORE_IPC_EVENT_CLIENT_DATA = 0;
 EAPI int ECORE_IPC_EVENT_SERVER_DATA = 0;
 
-static int                  init_count = 0;
+static int                  _ecore_ipc_init_count = 0;
 static Eina_List           *servers = NULL;
 static Ecore_Event_Handler *handler[6];
 
@@ -261,9 +261,11 @@ ecore_ipc_init(void)
 {
    int i = 0;
 
-   if (++init_count != 1) return init_count;
+   if (++_ecore_ipc_init_count != 1)
+     return _ecore_ipc_init_count;
 
-   ecore_con_init();
+   if (!ecore_con_init())
+     return --_ecore_ipc_init_count;
 
    ECORE_IPC_EVENT_CLIENT_ADD = ecore_event_type_new();
    ECORE_IPC_EVENT_CLIENT_DEL = ecore_event_type_new();
@@ -284,7 +286,7 @@ ecore_ipc_init(void)
                                          _ecore_ipc_event_client_data, NULL);
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
                                          _ecore_ipc_event_server_data, NULL);
-   return init_count;
+   return _ecore_ipc_init_count;
 }
 
 /**
@@ -298,7 +300,8 @@ ecore_ipc_shutdown(void)
 {
    int i;
 
-   if (--init_count != 0) return init_count;
+   if (--_ecore_ipc_init_count != 0)
+     return _ecore_ipc_init_count;
 
    while (servers) ecore_ipc_server_del(eina_list_data_get(servers));
 
@@ -307,7 +310,7 @@ ecore_ipc_shutdown(void)
 
    ecore_con_shutdown();
 
-   return init_count;
+   return _ecore_ipc_init_count;
 }
 
 /**
index ee82d63..706ee3f 100644 (file)
@@ -17,33 +17,35 @@ static int _ecore_job_event_handler(void *data, int type, void *ev);
 static void _ecore_job_event_free(void *data, void *ev);
     
 static int ecore_event_job_type = 0;
-static int _ecore_init_job_count = 0;
+static int _ecore_job_init_count = 0;
 static Ecore_Event_Handler* _ecore_job_handler = NULL;
 
 EAPI int
 ecore_job_init(void)
 {
-   if (++_ecore_init_job_count == 1)
-     {
-        ecore_init();
-       ecore_event_job_type = ecore_event_type_new();
-       _ecore_job_handler = ecore_event_handler_add(ecore_event_job_type, _ecore_job_event_handler, NULL);
-     }
+   if (++_ecore_job_init_count != 1)
+     return _ecore_job_init_count;
+
+   if (!ecore_init())
+     return --_ecore_job_init_count;
+
+   ecore_event_job_type = ecore_event_type_new();
+   _ecore_job_handler = ecore_event_handler_add(ecore_event_job_type, _ecore_job_event_handler, NULL);
 
-   return _ecore_init_job_count;
+   return _ecore_job_init_count;
 }
 
 EAPI int
 ecore_job_shutdown(void)
 {
-   if (--_ecore_init_job_count)
-     return _ecore_init_job_count;
+   if (--_ecore_job_init_count != 0)
+     return _ecore_job_init_count;
 
    ecore_event_handler_del(_ecore_job_handler);
    _ecore_job_handler = NULL;
    ecore_shutdown();
 
-   return _ecore_init_job_count;
+   return _ecore_job_init_count;
 }
 
 /**
index ff6dc56..ff39dec 100644 (file)
@@ -25,17 +25,18 @@ static int old_flags;
 EAPI int
 ecore_quartz_init(const char *name __UNUSED__)
 {
-   if (!_ecore_quartz_init_count)
-     {
-        ECORE_QUARTZ_EVENT_GOT_FOCUS         = ecore_event_type_new();
-        ECORE_QUARTZ_EVENT_LOST_FOCUS        = ecore_event_type_new();
-        ECORE_QUARTZ_EVENT_RESIZE            = ecore_event_type_new();
-        ECORE_QUARTZ_EVENT_EXPOSE            = ecore_event_type_new();
-     }
+   if (++_ecore_quartz_init_count != 1)
+     return _ecore_quartz_init_count;
 
-   ecore_event_init();
+   if (!ecore_event_init())
+     return --_ecore_quartz_init_count;
 
-   return ++_ecore_quartz_init_count;
+   ECORE_QUARTZ_EVENT_GOT_FOCUS         = ecore_event_type_new();
+   ECORE_QUARTZ_EVENT_LOST_FOCUS        = ecore_event_type_new();
+   ECORE_QUARTZ_EVENT_RESIZE            = ecore_event_type_new();
+   ECORE_QUARTZ_EVENT_EXPOSE            = ecore_event_type_new();
+
+   return _ecore_quartz_init_count;
 }
 
 /**
@@ -47,7 +48,8 @@ ecore_quartz_init(const char *name __UNUSED__)
 EAPI int
 ecore_quartz_shutdown(void)
 {
-   _ecore_quartz_init_count--;
+   if (--_ecore_quartz_init_count != 0)
+     return _ecore_quartz_init_count;
 
    ecore_event_shutdown();
 
index 7e4ed4b..2b3c269 100644 (file)
@@ -9,6 +9,7 @@ AM_CPPFLAGS = \
 -I$(top_builddir)/src/lib/ecore_input \
 @EFL_ECORE_SDL_BUILD@ \
 @SDL_CFLAGS@ \
+@EVAS_CFLAGS@ \
 @EINA_CFLAGS@
 
 if BUILD_ECORE_SDL
index 2d0f49b..115ed57 100644 (file)
@@ -66,17 +66,20 @@ _ecore_sdl_pressed_node(const Ecore_SDL_Pressed *node,
 EAPI int
 ecore_sdl_init(const char *name __UNUSED__)
 {
-   if(!_ecore_sdl_init_count)
-     {
-       ECORE_SDL_EVENT_GOT_FOCUS         = ecore_event_type_new();
-       ECORE_SDL_EVENT_LOST_FOCUS        = ecore_event_type_new();
-       ECORE_SDL_EVENT_RESIZE            = ecore_event_type_new();
-       ECORE_SDL_EVENT_EXPOSE            = ecore_event_type_new();
+   if(++_ecore_sdl_init_count != 1)
+     return _ecore_sdl_init_count;
 
-       SDL_EnableKeyRepeat(200, 100);
-     }
-   ecore_event_init();
-   return ++_ecore_sdl_init_count;
+   if (!ecore_event_init())
+     return --_ecore_sdl_init_count;
+
+   ECORE_SDL_EVENT_GOT_FOCUS  = ecore_event_type_new();
+   ECORE_SDL_EVENT_LOST_FOCUS = ecore_event_type_new();
+   ECORE_SDL_EVENT_RESIZE     = ecore_event_type_new();
+   ECORE_SDL_EVENT_EXPOSE     = ecore_event_type_new();
+
+   SDL_EnableKeyRepeat(200, 100);
+
+   return _ecore_sdl_init_count;
 }
 
 /**
@@ -88,8 +91,11 @@ ecore_sdl_init(const char *name __UNUSED__)
 EAPI int
 ecore_sdl_shutdown(void)
 {
-   _ecore_sdl_init_count--;
+   if (--_ecore_sdl_init_count != 0);
+   return _ecore_sdl_init_count;
+
    ecore_event_shutdown();
+
    return _ecore_sdl_init_count;
 }
 
index ecf72a3..a3927fd 100644 (file)
@@ -193,13 +193,12 @@ ecore_x_init(const char *name)
 
    xcb_intern_atom_cookie_t           atom_cookies[ECORE_X_ATOMS_COUNT];
 
-   if (_ecore_xcb_init_count > 0)
-     {
-       _ecore_xcb_init_count++;
-       return _ecore_xcb_init_count;
-     }
+   if (--_ecore_xcb_init_count != 1)
+     return _ecore_xcb_init_count;
+
    _ecore_xcb_conn = xcb_connect(name, &screen);
-   if (!_ecore_xcb_conn) return 0;
+   if (!_ecore_xcb_conn)
+     return --_ecore_xcb_init_count;
 
    /* FIXME: no error code right now */
    /* _ecore_xcb_error_handler_init(); */
@@ -268,7 +267,9 @@ ecore_x_init(const char *name)
 #endif /* ECORE_XCB_XPRINT */
 
    /* We init some components (not related to XCB) */
-   ecore_event_init();
+   if (!ecore_event_init())
+     goto close_connection;
+
    _ecore_x_reply_init();
    _ecore_x_dnd_init();
    ecore_x_netwm_init();
@@ -411,42 +412,7 @@ ecore_x_init(const char *name)
 
    _ecore_xcb_event_handlers = calloc(_ecore_xcb_event_handlers_num, sizeof(void *));
    if (!_ecore_xcb_event_handlers)
-     {
-        /* We get the replies of the QueryVersion request because we leave */
-#ifdef ECORE_XCB_DAMAGE
-        _ecore_x_damage_init_finalize();
-#endif /* ECORE_XCB_DAMAGE */
-#ifdef ECORE_XCB_COMPOSITE
-        _ecore_x_composite_init_finalize();
-#endif /* ECORE_XCB_COMPOSITE */
-#ifdef ECORE_XCB_DPMS
-        _ecore_x_dpms_init_finalize();
-#endif /* ECORE_XCB_DPMS */
-#ifdef ECORE_XCB_RANDR
-        _ecore_x_randr_init_finalize();
-#endif /* ECORE_XCB_RANDR */
-#ifdef ECORE_XCB_SCREENSAVER
-        _ecore_x_screensaver_init_finalize();
-#endif /* ECORE_XCB_SCREENSAVER */
-#ifdef ECORE_XCB_SHAPE
-        _ecore_x_shape_init_finalize();
-#endif /* ECORE_XCB_SHAPE */
-#ifdef ECORE_XCB_SYNC
-        _ecore_x_sync_init_finalize();
-#endif /* ECORE_XCB_SYNC */
-#ifdef ECORE_XCB_FIXES
-        _ecore_x_xfixes_init_finalize();
-#endif /* ECORE_XCB_FIXES */
-#ifdef ECORE_XCB_XINERAMA
-        _ecore_x_xinerama_init_finalize();
-#endif /* ECORE_XCB_XINERAMA */
-
-        ecore_event_shutdown();
-        xcb_disconnect(_ecore_xcb_conn);
-       _ecore_xcb_fd_handler_handle = NULL;
-       _ecore_xcb_conn = NULL;
-       return 0;
-     }
+     goto finalize_extensions;
 
 #ifdef ECORE_XCB_CURSOR
    _ecore_xcb_xcursor = XcursorSupportsARGB(_ecore_xcb_conn);
@@ -607,58 +573,57 @@ ecore_x_init(const char *name)
                               _ecore_xcb_fd_handler, _ecore_xcb_conn,
                               _ecore_xcb_fd_handler_buf, _ecore_xcb_conn);
    if (!_ecore_xcb_fd_handler_handle)
-     {
-        /* We get the replies of the QueryVersion request because we leave */
+     goto free_event_handlers;
+
+   _ecore_xcb_filter_handler = ecore_event_filter_add(_ecore_xcb_event_filter_start, _ecore_xcb_event_filter_filter, _ecore_xcb_event_filter_end, NULL);
+
+   /* This is just to be anal about naming conventions */
+
+   _ecore_xcb_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_DELETE_REQUEST] = ECORE_X_ATOM_WM_DELETE_WINDOW;
+   _ecore_xcb_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_TAKE_FOCUS] = ECORE_X_ATOM_WM_TAKE_FOCUS;
+   _ecore_xcb_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_PING] = ECORE_X_ATOM_NET_WM_PING;
+   _ecore_xcb_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
+
+   _ecore_xcb_init_count++;
+
+   _ecore_xcb_private_window = ecore_x_window_override_new(0, -77, -777, 123, 456);
+
+   /* We finally get the replies of the QueryVersion request */
 #ifdef ECORE_XCB_DAMAGE
-        _ecore_x_damage_init_finalize();
+   _ecore_x_damage_init_finalize();
 #endif /* ECORE_XCB_DAMAGE */
 #ifdef ECORE_XCB_COMPOSITE
-        _ecore_x_composite_init_finalize();
+   _ecore_x_composite_init_finalize();
 #endif /* ECORE_XCB_COMPOSITE */
 #ifdef ECORE_XCB_DPMS
-        _ecore_x_dpms_init_finalize();
+   _ecore_x_dpms_init_finalize();
 #endif /* ECORE_XCB_DPMS */
 #ifdef ECORE_XCB_RANDR
-        _ecore_x_randr_init_finalize();
+   _ecore_x_randr_init_finalize();
 #endif /* ECORE_XCB_RANDR */
 #ifdef ECORE_XCB_SCREENSAVER
-        _ecore_x_screensaver_init_finalize();
+   _ecore_x_screensaver_init_finalize();
 #endif /* ECORE_XCB_SCREENSAVER */
 #ifdef ECORE_XCB_SHAPE
-        _ecore_x_shape_init_finalize();
+   _ecore_x_shape_init_finalize();
 #endif /* ECORE_XCB_SHAPE */
 #ifdef ECORE_XCB_SYNC
-        _ecore_x_sync_init_finalize();
+   _ecore_x_sync_init_finalize();
 #endif /* ECORE_XCB_SYNC */
 #ifdef ECORE_XCB_FIXES
-        _ecore_x_xfixes_init_finalize();
+   _ecore_x_xfixes_init_finalize();
 #endif /* ECORE_XCB_FIXES */
 #ifdef ECORE_XCB_XINERAMA
-        _ecore_x_xinerama_init_finalize();
+   _ecore_x_xinerama_init_finalize();
 #endif /* ECORE_XCB_XINERAMA */
 
-        ecore_event_shutdown();
-       xcb_disconnect(_ecore_xcb_conn);
-       free(_ecore_xcb_event_handlers);
-       _ecore_xcb_fd_handler_handle = NULL;
-       _ecore_xcb_conn = NULL;
-       _ecore_xcb_event_handlers = NULL;
-       return 0;
-     }
-   _ecore_xcb_filter_handler = ecore_event_filter_add(_ecore_xcb_event_filter_start, _ecore_xcb_event_filter_filter, _ecore_xcb_event_filter_end, NULL);
-
-   /* This is just to be anal about naming conventions */
-
-   _ecore_xcb_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_DELETE_REQUEST] = ECORE_X_ATOM_WM_DELETE_WINDOW;
-   _ecore_xcb_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_TAKE_FOCUS] = ECORE_X_ATOM_WM_TAKE_FOCUS;
-   _ecore_xcb_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_PING] = ECORE_X_ATOM_NET_WM_PING;
-   _ecore_xcb_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
-
-   _ecore_xcb_init_count++;
-
-   _ecore_xcb_private_window = ecore_x_window_override_new(0, -77, -777, 123, 456);
+   return _ecore_xcb_init_count;
 
-   /* We finally get the replies of the QueryVersion request */
+ free_event_handlers:
+   free(_ecore_xcb_event_handlers);
+   _ecore_xcb_event_handlers = NULL;
+ finalize_extensions:
+   /* We get the replies of the QueryVersion request because we leave */
 #ifdef ECORE_XCB_DAMAGE
    _ecore_x_damage_init_finalize();
 #endif /* ECORE_XCB_DAMAGE */
@@ -686,16 +651,24 @@ ecore_x_init(const char *name)
 #ifdef ECORE_XCB_XINERAMA
    _ecore_x_xinerama_init_finalize();
 #endif /* ECORE_XCB_XINERAMA */
+   ecore_event_shutdown();
+ close_connection:
+   _ecore_x_atom_init_finalize(atom_cookies);
+   xcb_disconnect(_ecore_xcb_conn);
+   _ecore_xcb_fd_handler_handle = NULL;
+   _ecore_xcb_conn = NULL;
 
-   return _ecore_xcb_init_count;
+   return --_ecore_xcb_init_count;
 }
 
 static int
 _ecore_x_shutdown(int close_display)
 {
-   _ecore_xcb_init_count--;
-   if (_ecore_xcb_init_count > 0) return _ecore_xcb_init_count;
+   if (--_ecore_xcb_init_count != 0)
+     return _ecore_xcb_init_count;
+
    if (!_ecore_xcb_conn) return _ecore_xcb_init_count;
+
    if (close_display)
       xcb_disconnect(_ecore_xcb_conn);
    else
@@ -712,7 +685,7 @@ _ecore_x_shutdown(int close_display)
    _ecore_x_dnd_shutdown();
    ecore_x_netwm_shutdown();
    _ecore_x_reply_shutdown();
-   if (_ecore_xcb_init_count < 0) _ecore_xcb_init_count = 0;
+
    return _ecore_xcb_init_count;
 }
 
index f9f9b79..a653d14 100644 (file)
@@ -166,15 +166,16 @@ ecore_x_init(const char *name)
    int damage_err_base = 0;
 #endif
    
-   if (_ecore_x_init_count > 0) 
-     {
-       _ecore_x_init_count++;
-       return _ecore_x_init_count;
-     }
-   ecore_event_init();
+   if (++_ecore_x_init_count != 1) 
+     return _ecore_x_init_count;
+
+   if (!ecore_event_init())
+     return --_ecore_x_init_count;
 
    _ecore_x_disp = XOpenDisplay((char *)name);
-   if (!_ecore_x_disp) return 0;
+   if (!_ecore_x_disp)
+     goto shutdown_ecore_event;
+
    _ecore_x_error_handler_init();
    _ecore_x_event_handlers_num = LASTEvent;
 
@@ -224,12 +225,8 @@ ecore_x_init(const char *name)
 
    _ecore_x_event_handlers = calloc(_ecore_x_event_handlers_num, sizeof(void *));
    if (!_ecore_x_event_handlers)
-     {
-        XCloseDisplay(_ecore_x_disp);
-       _ecore_x_fd_handler_handle = NULL;
-       _ecore_x_disp = NULL;
-       return 0;       
-     }
+     goto close_display;
+
 #ifdef ECORE_XCURSOR   
    _ecore_x_xcursor = XcursorSupportsARGB(_ecore_x_disp);
 #endif
@@ -400,15 +397,7 @@ ecore_x_init(const char *name)
                               _ecore_x_fd_handler, _ecore_x_disp,
                               _ecore_x_fd_handler_buf, _ecore_x_disp);
    if (!_ecore_x_fd_handler_handle)
-     {
-       XCloseDisplay(_ecore_x_disp);
-       free(_ecore_x_event_handlers);
-       _ecore_x_fd_handler_handle = NULL;
-       _ecore_x_disp = NULL;
-       _ecore_x_event_handlers = NULL;
-       return 0;
-     }
-   
+     goto free_event_handlers;
 
    _ecore_x_atoms_init();
 
@@ -435,8 +424,6 @@ ecore_x_init(const char *name)
    _ecore_x_composite_init();
    _ecore_x_dpms_init();
    _ecore_x_randr_init();
-
-   _ecore_x_init_count++;
    
    _ecore_x_private_win = ecore_x_window_override_new(0, -77, -777, 123, 456);
 
@@ -476,13 +463,26 @@ _im_create_error:
 _im_create_end:
 #endif
    return _ecore_x_init_count;
+
+ free_event_handlers:
+   free(_ecore_x_event_handlers);
+   _ecore_x_event_handlers = NULL;
+ close_display:
+   XCloseDisplay(_ecore_x_disp);
+   _ecore_x_fd_handler_handle = NULL;
+   _ecore_x_disp = NULL;
+ shutdown_ecore_event:
+   ecore_event_shutdown();
+
+   return --_ecore_x_init_count;
 }
 
 static int
 _ecore_x_shutdown(int close_display)
 {
-   _ecore_x_init_count--;
-   if (_ecore_x_init_count > 0) return _ecore_x_init_count;
+   if (--_ecore_x_init_count != 0)
+     return _ecore_x_init_count;
+
    if (!_ecore_x_disp) return _ecore_x_init_count;
 
 #ifdef ENABLE_XIM
@@ -508,7 +508,7 @@ _ecore_x_shutdown(int close_display)
    _ecore_x_dnd_shutdown();
    ecore_x_netwm_shutdown();
    ecore_event_shutdown();
-   if (_ecore_x_init_count < 0) _ecore_x_init_count = 0;
+
    return _ecore_x_init_count;
 }