From 9243554dd809e2d61a5173d748e33405e7b66488 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Tue, 18 May 2021 12:14:28 +0100 Subject: [PATCH] pager - allow pager popup action to stay up and dnd windows --- src/bin/e_deskmirror.c | 4 + src/modules/pager/e_mod_config.c | 4 +- src/modules/pager/e_mod_main.c | 313 +++++++++++++------------------ 3 files changed, 133 insertions(+), 188 deletions(-) diff --git a/src/bin/e_deskmirror.c b/src/bin/e_deskmirror.c index d602143df..25a091612 100644 --- a/src/bin/e_deskmirror.c +++ b/src/bin/e_deskmirror.c @@ -990,11 +990,15 @@ e_deskmirror_util_wins_print(Evas_Object *obj) E_API void e_deskmirror_update_force(Evas_Object *obj) { + Mirror *m; + API_ENTRY(obj); e_layout_freeze(sd->layout); sd->force = EINA_TRUE; _e_deskmirror_smart_hide(obj); + EINA_INLIST_FOREACH(sd->mirrors, m) + _e_deskmirror_mirror_reconfigure(m); _e_deskmirror_smart_reconfigure(sd); _e_deskmirror_smart_show(obj); sd->force = EINA_FALSE; diff --git a/src/modules/pager/e_mod_config.c b/src/modules/pager/e_mod_config.c index b70bb988c..5f13a628e 100644 --- a/src/modules/pager/e_mod_config.c +++ b/src/modules/pager/e_mod_config.c @@ -221,7 +221,7 @@ _adv_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) cfdata->gui.popup_list = eina_list_append(cfdata->gui.popup_list, ow); e_widget_disabled_set(ow, !cfdata->popup.show); e_widget_list_object_append(ol, ow, 1, 0, 0.5); - ow = e_widget_slider_add(evas, 1, 0, _("%.0f pixels"), 20.0, 200.0, 1.0, 0, NULL, + ow = e_widget_slider_add(evas, 1, 0, _("%.0f pixels"), 20.0, 1000.0, 1.0, 0, NULL, &(cfdata->popup.height), 100); cfdata->gui.popup_list = eina_list_append(cfdata->gui.popup_list, ow); e_widget_disabled_set(ow, !cfdata->popup.show); @@ -240,7 +240,7 @@ _adv_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) cfdata->gui.popup_list); ow = e_widget_label_add(evas, _("Pager action popup height")); e_widget_list_object_append(ol, ow, 1, 0, 0.5); - ow = e_widget_slider_add(evas, 1, 0, _("%.0f pixels"), 20.0, 200.0, 1.0, 0, NULL, + ow = e_widget_slider_add(evas, 1, 0, _("%.0f pixels"), 20.0, 1000.0, 1.0, 0, NULL, &(cfdata->popup.act_height), 100); e_widget_list_object_append(ol, ow, 1, 0, 0.5); e_widget_toolbook_page_append(otb, NULL, _("Popup"), ol, 1, 1, 1, 0, diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c index 5aefc284b..b7b317cf6 100644 --- a/src/modules/pager/e_mod_main.c +++ b/src/modules/pager/e_mod_main.c @@ -144,7 +144,7 @@ static Pager_Desk *_pager_desk_find(Pager *p, E_Desk *desk); static void _pager_desk_switch(Pager_Desk *pd1, Pager_Desk *pd2); static Pager_Win *_pager_window_new(Pager_Desk *pd, Evas_Object *mirror, E_Client *client); static void _pager_window_free(Pager_Win *pw); -static Pager_Popup *_pager_popup_new(E_Zone *zone, int keyaction); +static Pager_Popup *_pager_popup_new(E_Zone *zone, int keyaction, Eina_Bool pass_events); static void _pager_popup_free(Pager_Popup *pp); static Pager_Popup *_pager_popup_find(E_Zone *zone); @@ -153,11 +153,8 @@ static int _pager_popup_show(void); static void _pager_popup_hide(int switch_desk); static Eina_Bool _pager_popup_cb_mouse_wheel(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); static void _pager_popup_desk_switch(int x, int y); -static void _pager_popup_modifiers_set(int mod); -static Eina_Bool _pager_popup_cb_key_down(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); -static Eina_Bool _pager_popup_cb_key_up(void *data EINA_UNUSED, int type EINA_UNUSED, void *event); static void _pager_popup_cb_action_show(E_Object *obj EINA_UNUSED, const char *params EINA_UNUSED, Ecore_Event_Key *ev EINA_UNUSED); -static void _pager_popup_cb_action_switch(E_Object *obj EINA_UNUSED, const char *params, Ecore_Event_Key *ev); +static void _pager_popup_cb_action_switch(E_Object *obj EINA_UNUSED, const char *params, Ecore_Event_Key *ev EINA_UNUSED); /* variables for pager popup on key actions */ static E_Action *act_popup_show = NULL; @@ -165,8 +162,6 @@ static E_Action *act_popup_switch = NULL; static Ecore_Window input_window = 0; static Eina_List *handlers = NULL; static Pager_Popup *act_popup = NULL; /* active popup */ -static int hold_count = 0; -static int hold_mod = 0; static E_Desk *current_desk = NULL; static Eina_List *pagers = NULL; static double _pager_start_time = 0.0; @@ -303,7 +298,6 @@ _gc_shutdown(E_Gadcon_Client *gcc) inst = gcc->data; if (pager_config) instances = eina_list_remove(instances, inst); - e_drop_handler_del(inst->pager->drop_handler); if (inst->o_base) { evas_object_del(inst->o_base); @@ -458,6 +452,8 @@ _pager_free(Pager *p) { pagers = eina_list_remove(pagers, p); _pager_empty(p); + if (p->drop_handler) e_drop_handler_del(p->drop_handler); + p->drop_handler = NULL; evas_object_del(p->o_table); p->o_table = NULL; ecore_job_del(p->recalc); @@ -811,8 +807,76 @@ _pager_popup_cb_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSE free(pp); } +static void +_popup_autoclose_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED) +{ + if (act_popup) _pager_popup_hide(0); +} + +static Eina_Bool +_popup_autoclose_key_cb(void *data EINA_UNUSED, Ecore_Event_Key *ev) +{ + if (!strcmp(ev->key, "Up")) _pager_popup_desk_switch(0, -1); + else if (!strcmp(ev->key, "Down")) _pager_popup_desk_switch(0, 1); + else if (!strcmp(ev->key, "Left")) _pager_popup_desk_switch(-1, 0); + else if (!strcmp(ev->key, "Right")) _pager_popup_desk_switch(1, 0); + else if (!strcmp(ev->key, "Escape")) return EINA_FALSE; + else if ((!strcmp(ev->key, "Return")) || + (!strcmp(ev->key, "KP_Enter")) || + (!strcmp(ev->key, "space"))) + { + Pager_Popup *pp = act_popup; + + if (pp) + { + E_Desk *desk = e_desk_at_xy_get(pp->pager->zone, + current_desk->x, + current_desk->y); + if (desk) e_desk_show(desk); + } + return EINA_FALSE; + } + else + { + E_Config_Binding_Key *binding; + Eina_List *l; + + EINA_LIST_FOREACH(e_bindings->key_bindings, l, binding) + { + E_Binding_Modifier mod = 0; + + if ((binding->action) && (strcmp(binding->action, "pager_switch"))) + continue; + + if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) + mod |= E_BINDING_MODIFIER_SHIFT; + if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) + mod |= E_BINDING_MODIFIER_CTRL; + if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) + mod |= E_BINDING_MODIFIER_ALT; + if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN) + mod |= E_BINDING_MODIFIER_WIN; + + if (binding->key && (!strcmp(binding->key, ev->key)) && + ((binding->modifiers == mod))) + { + E_Action *act; + + act = e_action_find(binding->action); + + if (act) + { + if (act->func.go_key) + act->func.go_key(NULL, binding->params, ev); + } + } + } + } + return EINA_TRUE; +} + static Pager_Popup * -_pager_popup_new(E_Zone *zone, int keyaction) +_pager_popup_new(E_Zone *zone, int keyaction, Eina_Bool pass_events) { Pager_Popup *pp; Evas_Coord w, h, zx, zy, zw, zh; @@ -831,8 +895,8 @@ _pager_popup_new(E_Zone *zone, int keyaction) e_zone_desk_count_get(zone, &x, &y); - if (keyaction) height = pager_config->popup_act_height; - else height = pager_config->popup_height; + if (keyaction) height = pager_config->popup_act_height * e_scale; + else height = pager_config->popup_height * e_scale; pd = eina_list_data_get(pp->pager->desks); if (!pd) @@ -869,13 +933,32 @@ _pager_popup_new(E_Zone *zone, int keyaction) pp->popup = e_comp_object_util_add(pp->o_bg, E_COMP_OBJECT_TYPE_POPUP); evas_object_layer_set(pp->popup, E_LAYER_CLIENT_POPUP); - evas_object_pass_events_set(pp->popup, 1); + evas_object_pass_events_set(pp->popup, pass_events); e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh); evas_object_geometry_set(pp->popup, zx, zy, w, h); e_comp_object_util_center(pp->popup); evas_object_event_callback_add(pp->popup, EVAS_CALLBACK_DEL, _pager_popup_cb_del, pp); evas_object_show(pp->popup); + if (!pass_events) + { + const char *drop[] = { + "enlightenment/pager_win", + "enlightenment/border", + "enlightenment/vdesktop" + }; + + evas_object_geometry_get(pp->pager->o_table, &x, &y, &w, &h); + pp->pager->drop_handler = + e_drop_handler_add(E_OBJECT(zone), NULL, pp->pager, + _pager_drop_cb_enter, _pager_drop_cb_move, + _pager_drop_cb_leave, _pager_drop_cb_drop, + drop, 3, x, y, w, h); + e_comp_object_util_autoclose(pp->popup, + _popup_autoclose_cb, + _popup_autoclose_key_cb, NULL); + } + pp->timer = NULL; return pp; @@ -897,6 +980,7 @@ _pager_popup_find(E_Zone *zone) EINA_LIST_FOREACH(pagers, l, p) { + if (!p->inst) continue; if ((p->popup) && (p->zone == zone)) return p->popup; } return NULL; @@ -1111,7 +1195,7 @@ _pager_cb_event_desk_show(void *data EINA_UNUSED, int type EINA_UNUSED, void *ev if ((pp = _pager_popup_find(ev->desk->zone))) evas_object_show(pp->popup); else - pp = _pager_popup_new(ev->desk->zone, 0); + pp = _pager_popup_new(ev->desk->zone, 0, EINA_TRUE); if (pp->timer) ecore_timer_loop_reset(pp->timer); else @@ -1168,7 +1252,7 @@ _pager_cb_event_client_urgent_change(void *data EINA_UNUSED, int type EINA_UNUSE if ((!pp) && (ev->ec->urgent || ev->ec->icccm.urgent) && (!ev->ec->iconic)) { - pp = _pager_popup_new(ev->ec->zone, 0); + pp = _pager_popup_new(ev->ec->zone, 0, EINA_TRUE); if (!pp) return ECORE_CALLBACK_RENEW; if (!pager_config->popup_urgent_stick) @@ -1387,10 +1471,10 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped) if (act_popup) { if (e_comp->comp_type == E_PIXMAP_TYPE_X) - e_grabinput_get(input_window, 0, input_window); + e_grabinput_get(0, 0, input_window); else - e_comp_grab_input(1, 1); - if (!hold_count) _pager_popup_hide(1); + e_comp_grab_input(0, 1); + if (p->inst) _pager_popup_hide(1); } } @@ -1589,6 +1673,23 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info) if (max) e_client_maximize(ec, max); if (fullscreen) e_client_fullscreen(ec, fs); e_deskmirror_update_force(pd->o_layout); + if (!p->inst) + { + Instance *inst; + Eina_List *ll; + + EINA_LIST_FOREACH(instances, l, inst) + { + EINA_LIST_FOREACH(inst->pager->desks, ll, pd2) + { + if (pd2->desk == pd->desk) + { + printf("update pager desk %p\n", pd2); + e_deskmirror_update_force(pd2->o_layout); + } + } + } + } } } @@ -1744,10 +1845,10 @@ _pager_desk_cb_drag_finished(E_Drag *drag, int dropped) if (act_popup) { if (e_comp->comp_type == E_PIXMAP_TYPE_X) - e_grabinput_get(input_window, 0, input_window); + e_grabinput_get(0, 0, input_window); else - e_comp_grab_input(1, 1); - if (!hold_count) _pager_popup_hide(1); + e_comp_grab_input(0, 1); + if (pd->pager->inst) _pager_popup_hide(1); } } @@ -1799,11 +1900,6 @@ _pager_popup_show(void) E_Zone *zone; int x, y, w, h; Pager_Popup *pp; -// const char *drop[] = { -// "enlightenment/pager_win", -// "enlightenment/border", -// "enlightenment/vdesktop" -// }; if ((act_popup) || (input_window)) return 0; @@ -1816,7 +1912,7 @@ _pager_popup_show(void) { input_window = ecore_x_window_input_new(e_comp->win, 0, 0, 1, 1); ecore_x_window_show(input_window); - if (!e_grabinput_get(input_window, 0, input_window)) + if (!e_grabinput_get(0, 0, input_window)) { ecore_x_window_free(input_window); input_window = 0; @@ -1827,20 +1923,14 @@ _pager_popup_show(void) if (e_comp->comp_type == E_PIXMAP_TYPE_WL) { input_window = e_comp->ee_win; - e_comp_grab_input(1, 1); + e_comp_grab_input(0, 1); } - handlers = eina_list_append - (handlers, ecore_event_handler_add - (ECORE_EVENT_KEY_DOWN, _pager_popup_cb_key_down, NULL)); - handlers = eina_list_append - (handlers, ecore_event_handler_add - (ECORE_EVENT_KEY_UP, _pager_popup_cb_key_up, NULL)); handlers = eina_list_append (handlers, ecore_event_handler_add (ECORE_EVENT_MOUSE_WHEEL, _pager_popup_cb_mouse_wheel, NULL)); - act_popup = _pager_popup_new(zone, 1); + act_popup = _pager_popup_new(zone, 1, EINA_FALSE); evas_object_geometry_get(act_popup->pager->o_table, &x, &y, &w, &h); current_desk = e_desk_current_get(zone); return 1; @@ -1849,8 +1939,6 @@ _pager_popup_show(void) static void _pager_popup_hide(int switch_desk) { - hold_count = 0; - hold_mod = 0; while (handlers) { ecore_event_handler_del(handlers->data); @@ -1864,18 +1952,6 @@ _pager_popup_hide(int switch_desk) act_popup = NULL; } -static void -_pager_popup_modifiers_set(int mod) -{ - if (!act_popup) return; - hold_mod = mod; - hold_count = 0; - if (hold_mod & ECORE_EVENT_MODIFIER_SHIFT) hold_count++; - if (hold_mod & ECORE_EVENT_MODIFIER_CTRL) hold_count++; - if (hold_mod & ECORE_EVENT_MODIFIER_ALT) hold_count++; - if (hold_mod & ECORE_EVENT_MODIFIER_WIN) hold_count++; -} - static void _pager_popup_desk_switch(int x, int y) { @@ -1905,22 +1981,16 @@ _pager_popup_desk_switch(int x, int y) static void _pager_popup_cb_action_show(E_Object *obj EINA_UNUSED, const char *params EINA_UNUSED, Ecore_Event_Key *ev EINA_UNUSED) { - if (_pager_popup_show()) - _pager_popup_modifiers_set(ev->modifiers); + _pager_popup_show(); } static void -_pager_popup_cb_action_switch(E_Object *obj EINA_UNUSED, const char *params, Ecore_Event_Key *ev) +_pager_popup_cb_action_switch(E_Object *obj EINA_UNUSED, const char *params, Ecore_Event_Key *ev EINA_UNUSED) { int max_x, max_y, desk_x; int x = 0, y = 0; - if (!act_popup) - { - if (_pager_popup_show()) - _pager_popup_modifiers_set(ev->modifiers); - else return; - } + if (!act_popup) _pager_popup_show(); e_zone_desk_count_get(act_popup->pager->zone, &max_x, &max_y); desk_x = current_desk->x /* + x <=this is always 0 */; @@ -1958,135 +2028,6 @@ _pager_popup_cb_mouse_wheel(void *data EINA_UNUSED, int type EINA_UNUSED, void * return ECORE_CALLBACK_PASS_ON; } -static Eina_Bool -_pager_popup_cb_key_down(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) -{ - Ecore_Event_Key *ev = event; - - if (ev->window != input_window) return ECORE_CALLBACK_PASS_ON; - if (!strcmp(ev->key, "Up")) _pager_popup_desk_switch(0, -1); - else if (!strcmp(ev->key, "Down")) _pager_popup_desk_switch(0, 1); - else if (!strcmp(ev->key, "Left")) _pager_popup_desk_switch(-1, 0); - else if (!strcmp(ev->key, "Right")) _pager_popup_desk_switch(1, 0); - else if (!strcmp(ev->key, "Escape")) _pager_popup_hide(0); - else if ((!strcmp(ev->key, "Return")) || - (!strcmp(ev->key, "KP_Enter")) || - (!strcmp(ev->key, "space"))) - { - Pager_Popup *pp = act_popup; - - if (pp) - { - E_Desk *desk = e_desk_at_xy_get(pp->pager->zone, - current_desk->x, - current_desk->y); - if (desk) e_desk_show(desk); - } - _pager_popup_hide(0); - } - else - { - E_Config_Binding_Key *binding; - Eina_List *l; - - EINA_LIST_FOREACH(e_bindings->key_bindings, l, binding) - { - E_Binding_Modifier mod = 0; - - if ((binding->action) && (strcmp(binding->action, "pager_switch"))) - continue; - - if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) - mod |= E_BINDING_MODIFIER_SHIFT; - if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) - mod |= E_BINDING_MODIFIER_CTRL; - if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) - mod |= E_BINDING_MODIFIER_ALT; - if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN) - mod |= E_BINDING_MODIFIER_WIN; - - if (binding->key && (!strcmp(binding->key, ev->key)) && - ((binding->modifiers == mod))) - { - E_Action *act; - - act = e_action_find(binding->action); - - if (act) - { - if (act->func.go_key) - act->func.go_key(NULL, binding->params, ev); - } - } - } - } - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_pager_popup_cb_key_up(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) -{ - Ecore_Event_Key *ev; - - ev = event; - if (!(act_popup)) return ECORE_CALLBACK_PASS_ON; - - if (hold_mod) - { - if ((hold_mod & ECORE_EVENT_MODIFIER_SHIFT) && - (!strcmp(ev->key, "Shift_L"))) hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_SHIFT) && - (!strcmp(ev->key, "Shift_R"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_CTRL) && - (!strcmp(ev->key, "Control_L"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_CTRL) && - (!strcmp(ev->key, "Control_R"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && - (!strcmp(ev->key, "Alt_L"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && - (!strcmp(ev->key, "Alt_R"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && - (!strcmp(ev->key, "Meta_L"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && - (!strcmp(ev->key, "Meta_R"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && - (!strcmp(ev->key, "Super_L"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_ALT) && - (!strcmp(ev->key, "Super_R"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && - (!strcmp(ev->key, "Super_L"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && - (!strcmp(ev->key, "Super_R"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && - (!strcmp(ev->key, "Mode_switch"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && - (!strcmp(ev->key, "Meta_L"))) - hold_count--; - else if ((hold_mod & ECORE_EVENT_MODIFIER_WIN) && - (!strcmp(ev->key, "Meta_R"))) - hold_count--; - if ((hold_count <= 0) && (!act_popup->pager->dragging)) - { - _pager_popup_hide(1); - return ECORE_CALLBACK_PASS_ON; - } - } - - return ECORE_CALLBACK_PASS_ON; -} - /***************************************************************************/ /* module setup */ E_API E_Module_Api e_modapi =