From 26bf74f9912ed77109f08f8e1b8eff94833d96f3 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 9 Nov 2015 15:58:17 -0500 Subject: [PATCH] add multipress functionality for superkey iterate through the focus chain by repeatedly pressing the superkey --- src/e_mod_main.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/src/e_mod_main.c b/src/e_mod_main.c index 830122b..5dad574 100644 --- a/src/e_mod_main.c +++ b/src/e_mod_main.c @@ -13,6 +13,8 @@ static Eina_List *urgent; static Eina_List *focus_list; static Eina_List *handlers; +static Ecore_Timer *ds_key_focus_timeout; +static Eina_List *ds_key_focus_desks; static void _ds_fade_end(Ecore_Cb cb, Efx_Map_Data *emd EINA_UNUSED, Evas_Object *obj EINA_UNUSED) @@ -75,23 +77,80 @@ ds_client_urgent_pop(E_Client *ec) return !!e_object_unref(E_OBJECT(ec)) ? ec : NULL; } +static Eina_List * +ds_key_list_init(const E_Zone *zone) +{ + int i; + Eina_List *desks = NULL; + + for (i = 0; i < zone->desk_x_count * zone->desk_y_count; i++) + { + if (zone->desks[i]->visible) continue; + e_object_ref(E_OBJECT(zone->desks[i])); + desks = eina_list_append(desks, zone->desks[i]); + } + return desks; +} + +static Eina_Bool +ds_key_focus_timeout_cb(void *d EINA_UNUSED) +{ + E_Client *ec; + + e_client_focus_track_thaw(); + ec = e_client_focused_get(); + if (ec) + e_client_focus_latest_set(ec); + ds_key_focus_timeout = NULL; + E_FREE_LIST(ds_key_focus_desks, e_object_unref); + return EINA_FALSE; +} + static void ds_key_focus(void) { Eina_List *l; E_Client *ec; E_Zone *focus_zone = NULL; + static double last; + double t = 0.0; + Eina_Bool skip = EINA_FALSE; if (!focus_list) - focus_zone = e_zone_current_get(); + { + focus_zone = e_zone_current_get(); + if (!ds_key_focus_desks) + ds_key_focus_desks = ds_key_list_init(focus_zone); + if (!ds_key_focus_timeout) + { + e_client_focus_track_freeze(); + ds_key_focus_timeout = ecore_timer_add(0.25, ds_key_focus_timeout_cb, NULL); + } + t = ecore_time_unix_get(); + skip = (t - last < 0.25); + if (skip) + ecore_timer_reset(ds_key_focus_timeout); + } + else + { + E_FREE_FUNC(ds_key_focus_timeout, ecore_timer_del); + E_FREE_LIST(ds_key_focus_desks, e_object_unref); + e_client_focus_track_thaw(); + } EINA_LIST_FOREACH(focus_list ?: e_client_focus_stack_get(), l, ec) if ((!ec->iconic) && (!ec->focused) && - ((!focus_zone) || ((ec->zone == focus_zone) && (!ec->desk->visible)))) + ((!focus_zone) || ((ec->zone == focus_zone) && eina_list_data_find(ds_key_focus_desks, ec->desk)))) { + if (ds_key_focus_desks) + { + ds_key_focus_desks = eina_list_remove(ds_key_focus_desks, ec->desk); + e_object_unref(E_OBJECT(ec->desk)); + } e_client_activate(ec, 1); break; } + last = t; focus_list = eina_list_free(focus_list); } @@ -205,6 +264,8 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) E_FREE_LIST(handlers, ecore_event_handler_del); E_FREE_LIST(urgent, e_object_unref); focus_list = eina_list_free(focus_list); + E_FREE_FUNC(ds_key_focus_timeout, ecore_timer_del); + E_FREE_LIST(ds_key_focus_desks, e_object_unref); //efx_shutdown(); broken... return 1; }