add multipress functionality for superkey

iterate through the focus chain by repeatedly pressing the superkey
This commit is contained in:
Mike Blumenkrantz 2015-11-09 15:58:17 -05:00
parent 29a28405b9
commit 26bf74f991
1 changed files with 63 additions and 2 deletions

View File

@ -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();
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;
}