diff options
author | Derek Foreman <derek.foreman.samsung@gmail.com> | 2018-08-08 09:37:29 -0400 |
---|---|---|
committer | Mike Blumenkrantz <zmike@samsung.com> | 2018-08-08 09:37:30 -0400 |
commit | e382bac1a01a152d32a0f95df7a2ad6b84ae80d4 (patch) | |
tree | 337a9d04375fc4bb6680cf0172b644a2dffc967e | |
parent | a7f65c75d9073e624e129f4bc423d7854838c2c0 (diff) | |
download | efl-e382bac1a01a152d32a0f95df7a2ad6b84ae80d4.tar.gz |
wayland: Fix elementary setting window parents at creation time
Summary:
We need to pass the entire pointer, not just 32-bits of it.
Fixes a crash with enlightenment sandbox gadgets where
ecore_wl2_window_alpha_get() is called with an invalid pointer while
trying to display a pop-up.
Reviewers: zmike, devilhorns
Reviewed By: zmike, devilhorns
Subscribers: devilhorns, cedric, #reviewers, #committers, zmike
Tags: #efl
Differential Revision: https://phab.enlightenment.org/D6775
-rw-r--r-- | src/lib/ecore_evas/ecore_evas.c | 53 | ||||
-rw-r--r-- | src/lib/ecore_evas/ecore_evas_private.h | 8 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_win.c | 7 | ||||
-rw-r--r-- | src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c | 2 | ||||
-rw-r--r-- | src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c | 2 |
5 files changed, 64 insertions, 8 deletions
diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index 004896de90..cce53df4e9 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -4,6 +4,7 @@ #define ECORE_EVAS_INTERNAL #define EFL_INPUT_EVENT_PROTECTED +#define IPA_YLNO_ESU_LANRETNI_MLE #include <stdlib.h> #include <string.h> @@ -4339,14 +4340,16 @@ ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame) { Ecore_Evas *ee; - Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int, Eina_Bool); + Ecore_Evas *(*new)(const char *, Ecore_Window, int, int, int, int, Eina_Bool); Eina_Module *m = _ecore_evas_engine_load("wayland"); EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL); new = eina_module_symbol_get(m, "ecore_evas_wayland_shm_new_internal"); EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL); - ee = new(disp_name, parent, x, y, w, h, frame); + if (parent) ERR("Wayland windows with parents not supported through legacy API"); + + ee = new(disp_name, 0, x, y, w, h, frame); if (!_ecore_evas_cursors_init(ee)) { ecore_evas_free(ee); @@ -4360,7 +4363,51 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame) { Ecore_Evas *ee; - Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int, Eina_Bool); + Ecore_Evas *(*new)(const char *, Ecore_Window, int, int, int, int, Eina_Bool); + Eina_Module *m = _ecore_evas_engine_load("wayland"); + EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL); + + new = eina_module_symbol_get(m, "ecore_evas_wayland_egl_new_internal"); + EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL); + + if (parent) ERR("Wayland windows with parents not supported through legacy API"); + + ee = new(disp_name, 0, x, y, w, h, frame); + if (!_ecore_evas_cursors_init(ee)) + { + ecore_evas_free(ee); + return NULL; + } + return ee; +} + +Ecore_Evas * +_wayland_shm_new(const char *disp_name, Ecore_Window parent, + int x, int y, int w, int h, Eina_Bool frame) +{ + Ecore_Evas *ee; + Ecore_Evas *(*new)(const char *, Ecore_Window, int, int, int, int, Eina_Bool); + Eina_Module *m = _ecore_evas_engine_load("wayland"); + EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL); + + new = eina_module_symbol_get(m, "ecore_evas_wayland_shm_new_internal"); + EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL); + + ee = new(disp_name, parent, x, y, w, h, frame); + if (!_ecore_evas_cursors_init(ee)) + { + ecore_evas_free(ee); + return NULL; + } + return ee; +} + +Ecore_Evas * +_wayland_egl_new(const char *disp_name, Ecore_Window parent, + int x, int y, int w, int h, Eina_Bool frame) +{ + Ecore_Evas *ee; + Ecore_Evas *(*new)(const char *, Ecore_Window, int, int, int, int, Eina_Bool); Eina_Module *m = _ecore_evas_engine_load("wayland"); EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL); diff --git a/src/lib/ecore_evas/ecore_evas_private.h b/src/lib/ecore_evas/ecore_evas_private.h index c419699296..c9f158ee9b 100644 --- a/src/lib/ecore_evas/ecore_evas_private.h +++ b/src/lib/ecore_evas/ecore_evas_private.h @@ -490,6 +490,14 @@ EAPI Eina_Bool ecore_evas_render(Ecore_Evas *ee); EAPI Evas *ecore_evas_evas_new(Ecore_Evas *ee, int w, int h); EAPI void ecore_evas_done(Ecore_Evas *ee, Eina_Bool single_window); +#ifdef IPA_YLNO_ESU_LANRETNI_MLE +EAPI Ecore_Evas *_wayland_shm_new(const char *disp_name, Ecore_Window parent, int x, int y, int w, int h, Eina_Bool frame); +EAPI Ecore_Evas *_wayland_egl_new(const char *disp_name, Ecore_Window parent, int x, int y, int w, int h, Eina_Bool frame); +#else +#define _wayland_shm_new DONT_USE_INTERNAL_API +#define _wayland_egl_new DONT_USE_INTERNAL_API +#endif + static inline Eina_Bool ecore_evas_render_prepare(Ecore_Evas *ee) { diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index ebab8fecd0..9a2a9ab1ba 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -16,6 +16,7 @@ #define EFL_CANVAS_SCENE_BETA #define EFL_UI_WIDGET_FOCUS_MANAGER_PROTECTED #define EFL_PART_PROTECTED +#define IPA_YLNO_ESU_LANRETNI_MLE #include <Elementary.h> #include <Elementary_Cursor.h> @@ -4953,7 +4954,7 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, const char *name, Efl_U Eina_Stringshare *accel = NULL; Eina_Bool is_gl_accel; int i, p = 0; - int parent_id = 0; + Ecore_Window parent_id = 0; Efl_Ui_Win_Data tmp_sd; @@ -5254,9 +5255,9 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, const char *name, Efl_U tmp_sd.ee = ecore_evas_gl_x11_new(NULL, 0, 0, 0, 0, 0); } else if (!strcmp(enginelist[i], ELM_WAYLAND_SHM)) - tmp_sd.ee = ecore_evas_wayland_shm_new(NULL, parent_id, 0, 0, 0, 0, 0); + tmp_sd.ee = _wayland_shm_new(NULL, parent_id, 0, 0, 0, 0, 0); else if (!strcmp(enginelist[i], ELM_WAYLAND_EGL)) - tmp_sd.ee = ecore_evas_wayland_egl_new(NULL, parent_id, 0, 0, 0, 0, 0); + tmp_sd.ee = _wayland_egl_new(NULL, parent_id, 0, 0, 0, 0, 0); else if (!strcmp(enginelist[i], ELM_SOFTWARE_WIN32)) tmp_sd.ee = ecore_evas_software_gdi_new(NULL, 0, 0, 1, 1); else if (!strcmp(enginelist[i], ELM_SOFTWARE_DDRAW)) diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c index 0ecd868975..8cfd1b180b 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c @@ -29,7 +29,7 @@ /* external functions */ EAPI Ecore_Evas * -ecore_evas_wayland_egl_new_internal(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame) +ecore_evas_wayland_egl_new_internal(const char *disp_name, Ecore_Window parent, int x, int y, int w, int h, Eina_Bool frame) { LOGFN(__FILE__, __LINE__, __FUNCTION__); diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c index b01d02bf18..c722a07ab6 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c @@ -29,7 +29,7 @@ /* external functions */ EAPI Ecore_Evas * -ecore_evas_wayland_shm_new_internal(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame) +ecore_evas_wayland_shm_new_internal(const char *disp_name, Ecore_Window parent, int x, int y, int w, int h, Eina_Bool frame) { LOGFN(__FILE__, __LINE__, __FUNCTION__); |