add Super Ultimate Window Management binding under Desksanity actions

the superkey is an optimized way of managing windows when a screen has
<= 4 vdesks. it provides smart desk flipping and greatly reduces wrist
strain from the alt+FX claw binding

the superkey is designed to be bound to the Menu key
This commit is contained in:
Mike Blumenkrantz 2015-11-09 14:41:48 -05:00
parent c82393c2a4
commit 29a28405b9
1 changed files with 97 additions and 0 deletions

View File

@ -8,6 +8,12 @@ EINTERN Config *ds_config = NULL;
static Evas_Object *fade_obj = NULL;
static E_Action *act;
static Eina_List *urgent;
static Eina_List *focus_list;
static Eina_List *handlers;
static void
_ds_fade_end(Ecore_Cb cb, Efx_Map_Data *emd EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
{
@ -57,6 +63,85 @@ _e_mod_ds_config_load(void)
ds_config->config_version = MOD_CONFIG_FILE_VERSION;
}
static E_Client *
ds_client_urgent_pop(E_Client *ec)
{
Eina_List *l;
if (!urgent) return NULL;
l = eina_list_data_find_list(urgent, ec);
if (!l) return NULL;
urgent = eina_list_remove_list(urgent, l);
return !!e_object_unref(E_OBJECT(ec)) ? ec : NULL;
}
static void
ds_key_focus(void)
{
Eina_List *l;
E_Client *ec;
E_Zone *focus_zone = NULL;
if (!focus_list)
focus_zone = e_zone_current_get();
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))))
{
e_client_activate(ec, 1);
break;
}
focus_list = eina_list_free(focus_list);
}
static void
ds_key(E_Object *obj EINA_UNUSED, const char *params EINA_UNUSED)
{
E_Client *ec = NULL;
if (!urgent)
{
ds_key_focus();
return;
}
while (!ec)
ec = ds_client_urgent_pop(eina_list_data_get(urgent));
if (ec)
{
eina_list_free(focus_list);
focus_list = eina_list_clone(e_client_focus_stack_get());
e_client_activate(ec, 1);
}
else
ds_key_focus();
}
static Eina_Bool
ds_client_remove(void *d EINA_UNUSED, int t EINA_UNUSED, E_Event_Client *ev)
{
ds_client_urgent_pop(ev->ec);
if (focus_list)
focus_list = eina_list_remove(focus_list, ev->ec);
return ECORE_CALLBACK_RENEW;
}
static Eina_Bool
ds_client_urgent(void *d EINA_UNUSED, int t EINA_UNUSED, E_Event_Client_Property *ev)
{
if (!(ev->property & E_CLIENT_PROPERTY_URGENCY)) return ECORE_CALLBACK_RENEW;
if (ev->ec->urgent)
{
e_object_ref(E_OBJECT(ev->ec));
urgent = eina_list_append(urgent, ev->ec);
}
else
ds_client_urgent_pop(ev->ec);
return ECORE_CALLBACK_RENEW;
}
EAPI void *
e_modapi_init(E_Module *m)
{
@ -87,6 +172,13 @@ e_modapi_init(E_Module *m)
zoom_init();
mag_init();
E_LIST_HANDLER_APPEND(handlers, E_EVENT_CLIENT_PROPERTY, ds_client_urgent, NULL);
E_LIST_HANDLER_APPEND(handlers, E_EVENT_CLIENT_REMOVE, ds_client_remove, NULL);
act = e_action_add("ds_key");
e_action_predef_name_set(D_("Desksanity"), D_("Manage Window Focus For Me"), "ds_key", NULL, NULL, 0);
act->func.go = ds_key;
return m;
}
@ -108,6 +200,11 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED)
E_CONFIG_DD_FREE(conf_edd);
eina_stringshare_del(mod->edje_file);
E_FREE(mod);
E_FREE_FUNC(act, e_action_del);
e_action_predef_name_del(D_("Desksanity"), "ds_key");
E_FREE_LIST(handlers, ecore_event_handler_del);
E_FREE_LIST(urgent, e_object_unref);
focus_list = eina_list_free(focus_list);
//efx_shutdown(); broken...
return 1;
}