forked from enlightenment/enlightenment
tiling: save the split type per desk
this allows you to have different types per virtual desktop
This commit is contained in:
parent
44b5aec991
commit
d1e2d1068a
|
@ -52,6 +52,11 @@ typedef struct _Instance
|
||||||
E_Menu *lmenu;
|
E_Menu *lmenu;
|
||||||
} Instance;
|
} Instance;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
E_Desk *desk;
|
||||||
|
Tiling_Split_Type type;
|
||||||
|
} Desk_Split_Type;
|
||||||
|
|
||||||
struct tiling_g tiling_g = {
|
struct tiling_g tiling_g = {
|
||||||
.module = NULL,
|
.module = NULL,
|
||||||
.config = NULL,
|
.config = NULL,
|
||||||
|
@ -89,7 +94,7 @@ static struct tiling_mod_main_g
|
||||||
Ecore_Event_Handler *handler_client_resize, *handler_client_move,
|
Ecore_Event_Handler *handler_client_resize, *handler_client_move,
|
||||||
*handler_client_iconify, *handler_client_uniconify,
|
*handler_client_iconify, *handler_client_uniconify,
|
||||||
*handler_desk_set, *handler_compositor_resize,
|
*handler_desk_set, *handler_compositor_resize,
|
||||||
*mouse_up;
|
*mouse_up, *handler_desk_show;
|
||||||
E_Client_Hook *handler_client_resize_begin, *handler_client_add,
|
E_Client_Hook *handler_client_resize_begin, *handler_client_add,
|
||||||
*handler_move_begin, *handler_move_end;
|
*handler_move_begin, *handler_move_end;
|
||||||
E_Client_Menu_Hook *client_menu_hook;
|
E_Client_Menu_Hook *client_menu_hook;
|
||||||
|
@ -97,11 +102,12 @@ static struct tiling_mod_main_g
|
||||||
Tiling_Info *tinfo;
|
Tiling_Info *tinfo;
|
||||||
Eina_Hash *info_hash;
|
Eina_Hash *info_hash;
|
||||||
Eina_Hash *client_extras;
|
Eina_Hash *client_extras;
|
||||||
|
Eina_Hash *desk_type;
|
||||||
|
|
||||||
E_Action *act_togglefloat, *act_move_up, *act_move_down, *act_move_left,
|
E_Action *act_togglefloat, *act_move_up, *act_move_down, *act_move_left,
|
||||||
*act_move_right, *act_toggle_split_mode, *act_swap_window;
|
*act_move_right, *act_toggle_split_mode, *act_swap_window;
|
||||||
|
|
||||||
Tiling_Split_Type split_type;
|
Desk_Split_Type *current_split_type;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
Evas_Object *comp_obj;
|
Evas_Object *comp_obj;
|
||||||
|
@ -111,7 +117,7 @@ static struct tiling_mod_main_g
|
||||||
} split_popup;
|
} split_popup;
|
||||||
} _G =
|
} _G =
|
||||||
{
|
{
|
||||||
.split_type = TILING_SPLIT_HORIZONTAL,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Define the class and gadcon functions this module provides */
|
/* Define the class and gadcon functions this module provides */
|
||||||
|
@ -136,13 +142,18 @@ get_current_desk(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Tiling_Split_Type
|
static Tiling_Split_Type
|
||||||
_current_tiled_state(void)
|
_current_tiled_state(Eina_Bool allow_float)
|
||||||
{
|
{
|
||||||
Tiling_Split_Type type = _G.split_type;
|
if (!_G.current_split_type)
|
||||||
|
{
|
||||||
|
ERR("Invalid state, the current field can never be NULL");
|
||||||
|
return TILING_SPLIT_HORIZONTAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (type == TILING_SPLIT_FLOAT)
|
if (!allow_float &&
|
||||||
|
_G.current_split_type->type == TILING_SPLIT_FLOAT)
|
||||||
return TILING_SPLIT_HORIZONTAL;
|
return TILING_SPLIT_HORIZONTAL;
|
||||||
return type;
|
return _G.current_split_type->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Tiling_Info *
|
static Tiling_Info *
|
||||||
|
@ -530,7 +541,7 @@ _desk_config_apply(E_Desk *d, int old_nb_stacks, int new_nb_stacks)
|
||||||
|
|
||||||
E_CLIENT_FOREACH(ec)
|
E_CLIENT_FOREACH(ec)
|
||||||
{
|
{
|
||||||
_add_client(ec, _G.split_type);
|
_add_client(ec, _current_tiled_state(EINA_TRUE));
|
||||||
}
|
}
|
||||||
|
|
||||||
_reapply_tree();
|
_reapply_tree();
|
||||||
|
@ -681,7 +692,7 @@ _insert_client_prefered(E_Client *ec)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_G.tinfo->tree = tiling_window_tree_add(_G.tinfo->tree, NULL, ec, _G.split_type);
|
_G.tinfo->tree = tiling_window_tree_add(_G.tinfo->tree, NULL, ec, _current_tiled_state(EINA_FALSE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -827,7 +838,7 @@ toggle_floating(E_Client *ec)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_add_client(ec, _current_tiled_state());
|
_add_client(ec, _current_tiled_state(EINA_FALSE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1043,13 +1054,20 @@ _tiling_split_type_next(void)
|
||||||
{
|
{
|
||||||
Instance *inst;
|
Instance *inst;
|
||||||
Eina_List *itr;
|
Eina_List *itr;
|
||||||
_G.split_type = (_G.split_type + 1) % TILING_SPLIT_LAST;
|
|
||||||
|
if (!_G.current_split_type)
|
||||||
|
{
|
||||||
|
ERR("Invalid state, current split type is NULL");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_G.current_split_type->type = (_G.current_split_type->type + 1) % TILING_SPLIT_LAST;
|
||||||
|
|
||||||
/* If we don't allow floating, skip it. */
|
/* If we don't allow floating, skip it. */
|
||||||
if (!tiling_g.config->have_floating_mode &&
|
if (!tiling_g.config->have_floating_mode &&
|
||||||
(_G.split_type == TILING_SPLIT_FLOAT))
|
(_G.current_split_type->type == TILING_SPLIT_FLOAT))
|
||||||
{
|
{
|
||||||
_G.split_type = (_G.split_type + 1) % TILING_SPLIT_LAST;
|
_G.current_split_type->type = (_G.current_split_type->type + 1) % TILING_SPLIT_LAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
EINA_LIST_FOREACH(tiling_g.gadget_instances, itr, inst)
|
EINA_LIST_FOREACH(tiling_g.gadget_instances, itr, inst)
|
||||||
|
@ -1345,7 +1363,7 @@ _add_hook(void *data EINA_UNUSED, E_Client *ec)
|
||||||
if (e_object_is_del(E_OBJECT(ec)))
|
if (e_object_is_del(E_OBJECT(ec)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_add_client(ec, _G.split_type);
|
_add_client(ec, _current_tiled_state(EINA_TRUE));
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
|
@ -1374,7 +1392,7 @@ _toggle_tiling_based_on_state(E_Client *ec, Eina_Bool restore)
|
||||||
}
|
}
|
||||||
else if (!extra->tiled && is_tilable(ec))
|
else if (!extra->tiled && is_tilable(ec))
|
||||||
{
|
{
|
||||||
_add_client(ec, _current_tiled_state());
|
_add_client(ec, _current_tiled_state(EINA_FALSE));
|
||||||
|
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1415,7 +1433,7 @@ _desk_set_hook(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||||
if (!desk_should_tile_check(ev->ec->desk))
|
if (!desk_should_tile_check(ev->ec->desk))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
_add_client(ev->ec, _current_tiled_state());
|
_add_client(ev->ec, _current_tiled_state(EINA_FALSE));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1498,6 +1516,12 @@ _clear_border_extras(void *data)
|
||||||
E_FREE(extra);
|
E_FREE(extra);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_clear_desk_types(void *data)
|
||||||
|
{
|
||||||
|
free(data);
|
||||||
|
}
|
||||||
|
|
||||||
E_API E_Module_Api e_modapi = {
|
E_API E_Module_Api e_modapi = {
|
||||||
E_MODULE_API_VERSION,
|
E_MODULE_API_VERSION,
|
||||||
"Tiling"
|
"Tiling"
|
||||||
|
@ -1637,6 +1661,39 @@ _client_move_begin(void *data EINA_UNUSED, E_Client *ec)
|
||||||
_reapply_tree();
|
_reapply_tree();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_update_current_desk(E_Desk *new)
|
||||||
|
{
|
||||||
|
Desk_Split_Type *type;
|
||||||
|
|
||||||
|
type = eina_hash_find(_G.desk_type, &new);
|
||||||
|
|
||||||
|
if (!type)
|
||||||
|
{
|
||||||
|
type = calloc(1, sizeof(Desk_Split_Type));
|
||||||
|
type->desk = new;
|
||||||
|
type->type = TILING_SPLIT_HORIZONTAL;
|
||||||
|
eina_hash_add(_G.desk_type, &new, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
_G.current_split_type = type;
|
||||||
|
printf("Set to %p\n", type);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_desk_shown(void *data EINA_UNUSED, int types EINA_UNUSED, void *event_info)
|
||||||
|
{
|
||||||
|
E_Event_Desk_Show *ev = event_info;
|
||||||
|
|
||||||
|
if (!ev->desk)
|
||||||
|
{
|
||||||
|
ERR("The shown desk can never be NULL!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_update_current_desk(ev->desk);
|
||||||
|
}
|
||||||
|
|
||||||
E_API void *
|
E_API void *
|
||||||
e_modapi_init(E_Module *m)
|
e_modapi_init(E_Module *m)
|
||||||
{
|
{
|
||||||
|
@ -1656,7 +1713,7 @@ e_modapi_init(E_Module *m)
|
||||||
|
|
||||||
_G.info_hash = eina_hash_pointer_new(_clear_info_hash);
|
_G.info_hash = eina_hash_pointer_new(_clear_info_hash);
|
||||||
_G.client_extras = eina_hash_pointer_new(_clear_border_extras);
|
_G.client_extras = eina_hash_pointer_new(_clear_border_extras);
|
||||||
|
_G.desk_type = eina_hash_pointer_new(_clear_desk_types);
|
||||||
#define HANDLER(_h, _e, _f) \
|
#define HANDLER(_h, _e, _f) \
|
||||||
_h = ecore_event_handler_add(E_EVENT_##_e, \
|
_h = ecore_event_handler_add(E_EVENT_##_e, \
|
||||||
(Ecore_Event_Handler_Cb)_f, \
|
(Ecore_Event_Handler_Cb)_f, \
|
||||||
|
@ -1681,6 +1738,7 @@ e_modapi_init(E_Module *m)
|
||||||
HANDLER(_G.handler_desk_set, CLIENT_DESK_SET, _desk_set_hook);
|
HANDLER(_G.handler_desk_set, CLIENT_DESK_SET, _desk_set_hook);
|
||||||
HANDLER(_G.handler_compositor_resize, COMPOSITOR_RESIZE,
|
HANDLER(_G.handler_compositor_resize, COMPOSITOR_RESIZE,
|
||||||
_compositor_resize_hook);
|
_compositor_resize_hook);
|
||||||
|
HANDLER(_G.handler_desk_show, DESK_SHOW, _desk_shown);
|
||||||
#undef HANDLER
|
#undef HANDLER
|
||||||
|
|
||||||
#define ACTION_ADD(_action, _cb, _title, _value, _params, _example, _editable) \
|
#define ACTION_ADD(_action, _cb, _title, _value, _params, _example, _editable) \
|
||||||
|
@ -1768,19 +1826,22 @@ e_modapi_init(E_Module *m)
|
||||||
desk = get_current_desk();
|
desk = get_current_desk();
|
||||||
_G.tinfo = _initialize_tinfo(desk);
|
_G.tinfo = _initialize_tinfo(desk);
|
||||||
|
|
||||||
|
_update_current_desk(get_current_desk());
|
||||||
|
|
||||||
/* Add all the existing windows. */
|
/* Add all the existing windows. */
|
||||||
{
|
{
|
||||||
E_Client *ec;
|
E_Client *ec;
|
||||||
|
|
||||||
E_CLIENT_FOREACH(ec)
|
E_CLIENT_FOREACH(ec)
|
||||||
{
|
{
|
||||||
_add_client(ec, _G.split_type);
|
_add_client(ec, _current_tiled_state(EINA_TRUE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
started = EINA_TRUE;
|
started = EINA_TRUE;
|
||||||
_reapply_tree();
|
_reapply_tree();
|
||||||
e_gadcon_provider_register(&_gc_class);
|
e_gadcon_provider_register(&_gc_class);
|
||||||
|
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1913,7 +1974,7 @@ static Eina_Stringshare *_current_gad_id = NULL;
|
||||||
static void
|
static void
|
||||||
_edje_tiling_icon_set(Evas_Object *o)
|
_edje_tiling_icon_set(Evas_Object *o)
|
||||||
{
|
{
|
||||||
switch (_G.split_type)
|
switch (_current_tiled_state(EINA_TRUE))
|
||||||
{
|
{
|
||||||
case TILING_SPLIT_HORIZONTAL:
|
case TILING_SPLIT_HORIZONTAL:
|
||||||
edje_object_signal_emit(o, "tiling,mode,horizontal", "e");
|
edje_object_signal_emit(o, "tiling,mode,horizontal", "e");
|
||||||
|
|
Loading…
Reference in New Issue