pager - allow pager popup action to stay up and dnd windows

This commit is contained in:
Carsten Haitzler 2021-05-18 12:14:28 +01:00
parent b94fe921a0
commit 9243554dd8
3 changed files with 133 additions and 188 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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 =