only use first-added window for gadget interfaces in sandboxing

popups and tooltips are not valid for gadget api use, only the base window
for a gadget should receive/use gadget methods
This commit is contained in:
Mike Blumenkrantz 2018-01-05 12:03:16 -05:00
parent e78c1843ae
commit 99f1f21665
1 changed files with 13 additions and 10 deletions

View File

@ -33,32 +33,30 @@ win_display_get(Evas_Object *win)
} }
static void static void
wins_emit(Ecore_Wl2_Display *d, const char *sig, uint32_t val) win_emit(Ecore_Wl2_Display *d, const char *sig, uint32_t val)
{ {
Eina_List *l, *ll;
Evas_Object *win; Evas_Object *win;
l = eina_hash_find(wins, &d); win = eina_list_data_get(eina_hash_find(wins, &d));
EINA_LIST_FOREACH(l, ll, win) evas_object_smart_callback_call(win, sig, (uintptr_t*)(uintptr_t)val);
evas_object_smart_callback_call(win, sig, (uintptr_t*)(uintptr_t)val);
} }
static void static void
_gadget_anchor(void *data, struct e_gadget *e_gadget EINA_UNUSED, uint32_t anchor) _gadget_anchor(void *data, struct e_gadget *e_gadget EINA_UNUSED, uint32_t anchor)
{ {
wins_emit(data, "gadget_site_anchor", anchor); win_emit(data, "gadget_site_anchor", anchor);
} }
static void static void
_gadget_orient(void *data, struct e_gadget *e_gadget EINA_UNUSED, uint32_t orient) _gadget_orient(void *data, struct e_gadget *e_gadget EINA_UNUSED, uint32_t orient)
{ {
wins_emit(data, "gadget_site_orient", orient); win_emit(data, "gadget_site_orient", orient);
} }
static void static void
_gadget_gravity(void *data, struct e_gadget *e_gadget EINA_UNUSED, uint32_t gravity) _gadget_gravity(void *data, struct e_gadget *e_gadget EINA_UNUSED, uint32_t gravity)
{ {
wins_emit(data, "gadget_site_gravity", gravity); win_emit(data, "gadget_site_gravity", gravity);
} }
static const struct e_gadget_listener _gadget_listener = static const struct e_gadget_listener _gadget_listener =
@ -269,6 +267,7 @@ static Evas_Object *
win_add(Evas_Object *win) win_add(Evas_Object *win)
{ {
Ecore_Wl2_Display *d; Ecore_Wl2_Display *d;
Eina_Bool first;
if (!win) return NULL; if (!win) return NULL;
d = win_display_get(win); d = win_display_get(win);
_gadget_init(d); _gadget_init(d);
@ -284,9 +283,13 @@ win_add(Evas_Object *win)
} }
if (!wins) if (!wins)
wins = eina_hash_pointer_new(NULL); wins = eina_hash_pointer_new(NULL);
first = !eina_hash_find(wins, &d);
eina_hash_list_append(wins, &d, win); eina_hash_list_append(wins, &d, win);
evas_object_smart_callback_add(win, "gadget_action_request", action_request, d); if (first)
evas_object_smart_callback_add(win, "gadget_open_uri", uriopen_request, d); {
evas_object_smart_callback_add(win, "gadget_action_request", action_request, d);
evas_object_smart_callback_add(win, "gadget_open_uri", uriopen_request, d);
}
evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, win_del, NULL); evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, win_del, NULL);
elm_win_borderless_set(win, 1); elm_win_borderless_set(win, 1);
return win; return win;