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:
parent
c82393c2a4
commit
29a28405b9
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue