diff options
-rw-r--r-- | src/lib/ecore_wl2/Ecore_Wl2.h | 6 | ||||
-rw-r--r-- | src/lib/ecore_wl2/ecore_wl2.c | 3 | ||||
-rw-r--r-- | src/lib/ecore_wl2/ecore_wl2_display.c | 26 |
3 files changed, 17 insertions, 18 deletions
diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h index 6c91e79d8d..dc050e021a 100644 --- a/src/lib/ecore_wl2/Ecore_Wl2.h +++ b/src/lib/ecore_wl2/Ecore_Wl2.h | |||
@@ -126,6 +126,11 @@ typedef struct _Ecore_Wl2_Event_Window_Configure | |||
126 | int x, y, w, h; | 126 | int x, y, w, h; |
127 | } Ecore_Wl2_Event_Window_Configure; | 127 | } Ecore_Wl2_Event_Window_Configure; |
128 | 128 | ||
129 | typedef struct _Ecore_Wl2_Event_Sync_Done | ||
130 | { | ||
131 | Ecore_Wl2_Display *display; | ||
132 | } Ecore_Wl2_Event_Sync_Done; | ||
133 | |||
129 | typedef enum _Ecore_Wl2_Window_Type | 134 | typedef enum _Ecore_Wl2_Window_Type |
130 | { | 135 | { |
131 | ECORE_WL2_WINDOW_TYPE_NONE, | 136 | ECORE_WL2_WINDOW_TYPE_NONE, |
@@ -156,6 +161,7 @@ EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_TARGET; | |||
156 | EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_SEND; | 161 | EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_SEND; |
157 | EAPI extern int ECORE_WL2_EVENT_SELECTION_DATA_READY; | 162 | EAPI extern int ECORE_WL2_EVENT_SELECTION_DATA_READY; |
158 | EAPI extern int ECORE_WL2_EVENT_WINDOW_CONFIGURE; | 163 | EAPI extern int ECORE_WL2_EVENT_WINDOW_CONFIGURE; |
164 | EAPI extern int ECORE_WL2_EVENT_SYNC_DONE; | ||
159 | 165 | ||
160 | /** | 166 | /** |
161 | * @file | 167 | * @file |
diff --git a/src/lib/ecore_wl2/ecore_wl2.c b/src/lib/ecore_wl2/ecore_wl2.c index c0edc56f2a..a8d328b7d0 100644 --- a/src/lib/ecore_wl2/ecore_wl2.c +++ b/src/lib/ecore_wl2/ecore_wl2.c | |||
@@ -25,6 +25,7 @@ EAPI int ECORE_WL2_EVENT_DATA_SOURCE_TARGET = 0; | |||
25 | EAPI int ECORE_WL2_EVENT_DATA_SOURCE_SEND = 0; | 25 | EAPI int ECORE_WL2_EVENT_DATA_SOURCE_SEND = 0; |
26 | EAPI int ECORE_WL2_EVENT_SELECTION_DATA_READY = 0; | 26 | EAPI int ECORE_WL2_EVENT_SELECTION_DATA_READY = 0; |
27 | EAPI int ECORE_WL2_EVENT_WINDOW_CONFIGURE = 0; | 27 | EAPI int ECORE_WL2_EVENT_WINDOW_CONFIGURE = 0; |
28 | EAPI int ECORE_WL2_EVENT_SYNC_DONE = 0; | ||
28 | 29 | ||
29 | /* public API functions */ | 30 | /* public API functions */ |
30 | EAPI int | 31 | EAPI int |
@@ -75,6 +76,7 @@ ecore_wl2_init(void) | |||
75 | ECORE_WL2_EVENT_DATA_SOURCE_SEND = ecore_event_type_new(); | 76 | ECORE_WL2_EVENT_DATA_SOURCE_SEND = ecore_event_type_new(); |
76 | ECORE_WL2_EVENT_SELECTION_DATA_READY = ecore_event_type_new(); | 77 | ECORE_WL2_EVENT_SELECTION_DATA_READY = ecore_event_type_new(); |
77 | ECORE_WL2_EVENT_WINDOW_CONFIGURE = ecore_event_type_new(); | 78 | ECORE_WL2_EVENT_WINDOW_CONFIGURE = ecore_event_type_new(); |
79 | ECORE_WL2_EVENT_SYNC_DONE = ecore_event_type_new(); | ||
78 | } | 80 | } |
79 | 81 | ||
80 | return _ecore_wl2_init_count; | 82 | return _ecore_wl2_init_count; |
@@ -117,6 +119,7 @@ ecore_wl2_shutdown(void) | |||
117 | ECORE_WL2_EVENT_DATA_SOURCE_SEND = 0; | 119 | ECORE_WL2_EVENT_DATA_SOURCE_SEND = 0; |
118 | ECORE_WL2_EVENT_SELECTION_DATA_READY = 0; | 120 | ECORE_WL2_EVENT_SELECTION_DATA_READY = 0; |
119 | ECORE_WL2_EVENT_WINDOW_CONFIGURE = 0; | 121 | ECORE_WL2_EVENT_WINDOW_CONFIGURE = 0; |
122 | ECORE_WL2_EVENT_SYNC_DONE = 0; | ||
120 | 123 | ||
121 | /* shutdown Ecore_Event */ | 124 | /* shutdown Ecore_Event */ |
122 | ecore_event_shutdown(); | 125 | ecore_event_shutdown(); |
diff --git a/src/lib/ecore_wl2/ecore_wl2_display.c b/src/lib/ecore_wl2/ecore_wl2_display.c index f38db3b714..57f1af3bf2 100644 --- a/src/lib/ecore_wl2/ecore_wl2_display.c +++ b/src/lib/ecore_wl2/ecore_wl2_display.c | |||
@@ -106,6 +106,7 @@ _cb_global_add(void *data, struct wl_registry *registry, unsigned int id, const | |||
106 | wl_registry_bind(registry, id, &xdg_shell_interface, 1); | 106 | wl_registry_bind(registry, id, &xdg_shell_interface, 1); |
107 | xdg_shell_use_unstable_version(ewd->wl.xdg_shell, XDG_VERSION); | 107 | xdg_shell_use_unstable_version(ewd->wl.xdg_shell, XDG_VERSION); |
108 | xdg_shell_add_listener(ewd->wl.xdg_shell, &_xdg_shell_listener, NULL); | 108 | xdg_shell_add_listener(ewd->wl.xdg_shell, &_xdg_shell_listener, NULL); |
109 | |||
109 | EINA_INLIST_FOREACH(ewd->windows, window) | 110 | EINA_INLIST_FOREACH(ewd->windows, window) |
110 | _ecore_wl2_window_shell_surface_init(window); | 111 | _ecore_wl2_window_shell_surface_init(window); |
111 | } | 112 | } |
@@ -309,12 +310,19 @@ err: | |||
309 | static void | 310 | static void |
310 | _cb_sync_done(void *data, struct wl_callback *cb, uint32_t serial EINA_UNUSED) | 311 | _cb_sync_done(void *data, struct wl_callback *cb, uint32_t serial EINA_UNUSED) |
311 | { | 312 | { |
313 | Ecore_Wl2_Event_Sync_Done *ev; | ||
312 | Ecore_Wl2_Display *ewd; | 314 | Ecore_Wl2_Display *ewd; |
313 | 315 | ||
314 | ewd = data; | 316 | ewd = data; |
315 | ewd->sync_done = EINA_TRUE; | 317 | ewd->sync_done = EINA_TRUE; |
316 | 318 | ||
317 | wl_callback_destroy(cb); | 319 | wl_callback_destroy(cb); |
320 | |||
321 | ev = calloc(1, sizeof(Ecore_Wl2_Event_Sync_Done)); | ||
322 | if (!ev) return; | ||
323 | |||
324 | ev->display = ewd; | ||
325 | ecore_event_add(ECORE_WL2_EVENT_SYNC_DONE, ev, NULL, NULL); | ||
318 | } | 326 | } |
319 | 327 | ||
320 | static const struct wl_callback_listener _sync_listener = | 328 | static const struct wl_callback_listener _sync_listener = |
@@ -597,24 +605,6 @@ ecore_wl2_display_connect(const char *name) | |||
597 | while (!ewd->sync_done) | 605 | while (!ewd->sync_done) |
598 | wl_display_dispatch(ewd->wl.display); | 606 | wl_display_dispatch(ewd->wl.display); |
599 | } | 607 | } |
600 | else | ||
601 | { | ||
602 | /* this client is on same pid as server so we need to iterate | ||
603 | * main loop until the "server" advertises it's globals | ||
604 | * | ||
605 | * NB: DO NOT REMOVE THIS !! | ||
606 | * | ||
607 | * This is NEEDED for E's internal dialogs to function because the | ||
608 | * "server" and "client" are on the same PID | ||
609 | * and thus the "server" never advertises out it's globals | ||
610 | * (wl_compositor, wl_shm, etc) unless we sit here and iterate the | ||
611 | * main loop until it's done. | ||
612 | * | ||
613 | * If we remove this, E will never show an internal dialog as it | ||
614 | * just sits and waits for the globals */ | ||
615 | while (!ewd->sync_done) | ||
616 | ecore_main_loop_iterate(); | ||
617 | } | ||
618 | 608 | ||
619 | return ewd; | 609 | return ewd; |
620 | 610 | ||