bu5hm4n pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=d1e2d1068a53d7dc761f50f694bc0ecdc18fd4c2
commit d1e2d1068a53d7dc761f50f694bc0ecdc18fd4c2 Author: Marcel Hollerbach <[email protected]> Date: Thu Mar 9 23:06:23 2017 +0100 tiling: save the split type per desk this allows you to have different types per virtual desktop --- src/modules/tiling/e_mod_tiling.c | 99 +++++++++++++++++++++++++++++++-------- 1 file changed, 80 insertions(+), 19 deletions(-) diff --git a/src/modules/tiling/e_mod_tiling.c b/src/modules/tiling/e_mod_tiling.c index f09be8f..80654c8 100644 --- a/src/modules/tiling/e_mod_tiling.c +++ b/src/modules/tiling/e_mod_tiling.c @@ -52,6 +52,11 @@ typedef struct _Instance E_Menu *lmenu; } Instance; +typedef struct { + E_Desk *desk; + Tiling_Split_Type type; +} Desk_Split_Type; + struct tiling_g tiling_g = { .module = NULL, .config = NULL, @@ -89,7 +94,7 @@ static struct tiling_mod_main_g Ecore_Event_Handler *handler_client_resize, *handler_client_move, *handler_client_iconify, *handler_client_uniconify, *handler_desk_set, *handler_compositor_resize, - *mouse_up; + *mouse_up, *handler_desk_show; E_Client_Hook *handler_client_resize_begin, *handler_client_add, *handler_move_begin, *handler_move_end; E_Client_Menu_Hook *client_menu_hook; @@ -97,11 +102,12 @@ static struct tiling_mod_main_g Tiling_Info *tinfo; Eina_Hash *info_hash; Eina_Hash *client_extras; + Eina_Hash *desk_type; E_Action *act_togglefloat, *act_move_up, *act_move_down, *act_move_left, *act_move_right, *act_toggle_split_mode, *act_swap_window; - Tiling_Split_Type split_type; + Desk_Split_Type *current_split_type; struct { Evas_Object *comp_obj; @@ -111,7 +117,7 @@ static struct tiling_mod_main_g } split_popup; } _G = { - .split_type = TILING_SPLIT_HORIZONTAL, + }; /* Define the class and gadcon functions this module provides */ @@ -136,13 +142,18 @@ get_current_desk(void) } 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 type; + return _G.current_split_type->type; } 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) { - _add_client(ec, _G.split_type); + _add_client(ec, _current_tiled_state(EINA_TRUE)); } _reapply_tree(); @@ -681,7 +692,7 @@ _insert_client_prefered(E_Client *ec) } 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 { - _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; 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 (!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) @@ -1345,7 +1363,7 @@ _add_hook(void *data EINA_UNUSED, E_Client *ec) if (e_object_is_del(E_OBJECT(ec))) return; - _add_client(ec, _G.split_type); + _add_client(ec, _current_tiled_state(EINA_TRUE)); } 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)) { - _add_client(ec, _current_tiled_state()); + _add_client(ec, _current_tiled_state(EINA_FALSE)); 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)) return true; - _add_client(ev->ec, _current_tiled_state()); + _add_client(ev->ec, _current_tiled_state(EINA_FALSE)); return true; } @@ -1498,6 +1516,12 @@ _clear_border_extras(void *data) E_FREE(extra); } +static void +_clear_desk_types(void *data) +{ + free(data); +} + E_API E_Module_Api e_modapi = { E_MODULE_API_VERSION, "Tiling" @@ -1637,6 +1661,39 @@ _client_move_begin(void *data EINA_UNUSED, E_Client *ec) _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_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.client_extras = eina_hash_pointer_new(_clear_border_extras); - + _G.desk_type = eina_hash_pointer_new(_clear_desk_types); #define HANDLER(_h, _e, _f) \ _h = ecore_event_handler_add(E_EVENT_##_e, \ (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_compositor_resize, COMPOSITOR_RESIZE, _compositor_resize_hook); + HANDLER(_G.handler_desk_show, DESK_SHOW, _desk_shown); #undef HANDLER #define ACTION_ADD(_action, _cb, _title, _value, _params, _example, _editable) \ @@ -1768,19 +1826,22 @@ e_modapi_init(E_Module *m) desk = get_current_desk(); _G.tinfo = _initialize_tinfo(desk); + _update_current_desk(get_current_desk()); + /* Add all the existing windows. */ { E_Client *ec; E_CLIENT_FOREACH(ec) { - _add_client(ec, _G.split_type); + _add_client(ec, _current_tiled_state(EINA_TRUE)); } } started = EINA_TRUE; _reapply_tree(); e_gadcon_provider_register(&_gc_class); + return m; } @@ -1913,7 +1974,7 @@ static Eina_Stringshare *_current_gad_id = NULL; static void _edje_tiling_icon_set(Evas_Object *o) { - switch (_G.split_type) + switch (_current_tiled_state(EINA_TRUE)) { case TILING_SPLIT_HORIZONTAL: edje_object_signal_emit(o, "tiling,mode,horizontal", "e"); --
