diff --git a/config/mobile/e.src b/config/mobile/e.src index 88c318732..4f74b74d5 100644 --- a/config/mobile/e.src +++ b/config/mobile/e.src @@ -554,6 +554,22 @@ group "E_Config" struct { value "params" string: "default horizontal"; value "any_mod" uchar: 0; } + group "E_Config_Binding_Key" struct { + value "context" int: 9; + value "modifiers" int: 8; + value "key" string: "Left"; + value "action" string: "window_maximized_toggle"; + value "params" string: "default left"; + value "any_mod" uchar: 0; + } + group "E_Config_Binding_Key" struct { + value "context" int: 9; + value "modifiers" int: 8; + value "key" string: "Right"; + value "action" string: "window_maximized_toggle"; + value "params" string: "default right"; + value "any_mod" uchar: 0; + } group "E_Config_Binding_Key" struct { value "context" int: 9; value "modifiers" int: 6; diff --git a/config/standard/e.src b/config/standard/e.src index c9efef7ae..98cd62a49 100644 --- a/config/standard/e.src +++ b/config/standard/e.src @@ -1340,6 +1340,22 @@ group "E_Config" struct { value "params" string: "default horizontal"; value "any_mod" uchar: 0; } + group "E_Config_Binding_Key" struct { + value "context" int: 9; + value "modifiers" int: 8; + value "key" string: "Left"; + value "action" string: "window_maximized_toggle"; + value "params" string: "default left"; + value "any_mod" uchar: 0; + } + group "E_Config_Binding_Key" struct { + value "context" int: 9; + value "modifiers" int: 8; + value "key" string: "Right"; + value "action" string: "window_maximized_toggle"; + value "params" string: "default right"; + value "any_mod" uchar: 0; + } group "E_Config_Binding_Key" struct { value "context" int: 9; value "modifiers" int: 6; diff --git a/src/bin/e_actions.c b/src/bin/e_actions.c index 03bafcd45..54e3a9878 100644 --- a/src/bin/e_actions.c +++ b/src/bin/e_actions.c @@ -589,6 +589,20 @@ ACT_FN_GO(window_maximized_toggle, ) else goto maximize; } + else if (max == E_MAXIMIZE_LEFT) + { + if (bd->maximized & E_MAXIMIZE_LEFT) + e_border_unmaximize(bd, E_MAXIMIZE_LEFT); + else + goto maximize; + } + else if (max == E_MAXIMIZE_RIGHT) + { + if (bd->maximized & E_MAXIMIZE_RIGHT) + e_border_unmaximize(bd, E_MAXIMIZE_RIGHT); + else + goto maximize; + } else e_border_unmaximize(bd, E_MAXIMIZE_BOTH); } @@ -3612,6 +3626,10 @@ _e_actions_maximize_parse(const char *params) max = E_MAXIMIZE_HORIZONTAL; else if (!strcmp(s2, "vertical")) max = E_MAXIMIZE_VERTICAL; + else if (!strcmp(s2, "left")) + max = E_MAXIMIZE_LEFT; + else if (!strcmp(s2, "right")) + max = E_MAXIMIZE_RIGHT; else max = E_MAXIMIZE_BOTH; } diff --git a/src/bin/e_border.c b/src/bin/e_border.c index cf68a8d6e..7ddc37f5d 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -2631,12 +2631,28 @@ _e_border_maximize(E_Border *bd, E_Maximize max) /* center y-direction */ yy1 = bd->zone->y + (bd->zone->h - h) / 2; - if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH) - e_border_move_resize(bd, x1, yy1, w, h); - else if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL) - e_border_move_resize(bd, bd->x, yy1, bd->w, h); - else if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL) - e_border_move_resize(bd, x1, bd->y, w, bd->h); + switch (max & E_MAXIMIZE_DIRECTION) + { + case E_MAXIMIZE_BOTH: + e_border_move_resize(bd, x1, yy1, w, h); + break; + + case E_MAXIMIZE_VERTICAL: + e_border_move_resize(bd, bd->x, yy1, bd->w, h); + break; + + case E_MAXIMIZE_HORIZONTAL: + e_border_move_resize(bd, x1, bd->y, w, bd->h); + break; + + case E_MAXIMIZE_LEFT: + e_border_move_resize(bd, bd->zone->x, bd->zone->y, w / 2, h); + break; + + case E_MAXIMIZE_RIGHT: + e_border_move_resize(bd, x1, bd->zone->y, w / 2, h); + break; + } break; case E_MAXIMIZE_SMART: @@ -2668,12 +2684,29 @@ _e_border_maximize(E_Border *bd, E_Maximize max) else // window normal position yy1 = bd->y; - if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH) - e_border_move_resize(bd, zx, zy, zw, zh); - else if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL) - e_border_move_resize(bd, x1, zy, w, zh); - else if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL) - e_border_move_resize(bd, zx, yy1, zw, h); + switch (max & E_MAXIMIZE_DIRECTION) + { + case E_MAXIMIZE_BOTH: + e_border_move_resize(bd, zx, zy, zw, zh); + break; + + case E_MAXIMIZE_VERTICAL: + e_border_move_resize(bd, x1, zy, w, zh); + break; + + case E_MAXIMIZE_HORIZONTAL: + e_border_move_resize(bd, zx, yy1, zw, h); + break; + + case E_MAXIMIZE_LEFT: + e_border_move_resize(bd, zx, zy, zw / 2, zh); + break; + + case E_MAXIMIZE_RIGHT: + e_border_move_resize(bd, zx + zw / 2, zy, zw / 2, zh); + break; + } + edje_object_signal_emit(bd->bg_object, "e,action,maximize", "e"); break; @@ -2698,12 +2731,29 @@ _e_border_maximize(E_Border *bd, E_Maximize max) x1 = x1 + (pw - w) / 2; /* center y-direction */ yy1 = yy1 + (ph - h) / 2; - if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH) - e_border_move_resize(bd, x1, yy1, w, h); - else if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL) - e_border_move_resize(bd, bd->x, yy1, bd->w, h); - else if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL) - e_border_move_resize(bd, x1, bd->y, w, bd->h); + + switch (max & E_MAXIMIZE_DIRECTION) + { + case E_MAXIMIZE_BOTH: + e_border_move_resize(bd, x1, yy1, w, h); + break; + + case E_MAXIMIZE_VERTICAL: + e_border_move_resize(bd, bd->x, yy1, bd->w, h); + break; + + case E_MAXIMIZE_HORIZONTAL: + e_border_move_resize(bd, x1, bd->y, w, bd->h); + break; + + case E_MAXIMIZE_LEFT: + e_border_move_resize(bd, bd->zone->x, bd->zone->y, w / 2, h); + break; + + case E_MAXIMIZE_RIGHT: + e_border_move_resize(bd, x1, bd->zone->y, w / 2, h); + break; + } break; } } @@ -2818,6 +2868,8 @@ e_border_unmaximize(E_Border *bd, y = bd->saved.y + bd->zone->y; bd->saved.h = bd->saved.y = 0; bd->maximized &= ~E_MAXIMIZE_VERTICAL; + bd->maximized &= ~E_MAXIMIZE_LEFT; + bd->maximized &= ~E_MAXIMIZE_RIGHT; } if (max & E_MAXIMIZE_HORIZONTAL) { diff --git a/src/bin/e_border.h b/src/bin/e_border.h index 888094fd1..e64324ba6 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -61,6 +61,8 @@ typedef enum _E_Maximize E_MAXIMIZE_VERTICAL = 0x00000010, E_MAXIMIZE_HORIZONTAL = 0x00000020, E_MAXIMIZE_BOTH = 0x00000030, + E_MAXIMIZE_LEFT = 0x00000060, + E_MAXIMIZE_RIGHT = 0x00000090, E_MAXIMIZE_DIRECTION = 0x000000f0 } E_Maximize; diff --git a/src/bin/e_int_border_menu.c b/src/bin/e_int_border_menu.c index e05726cb5..3ac8d228d 100644 --- a/src/bin/e_int_border_menu.c +++ b/src/bin/e_int_border_menu.c @@ -13,6 +13,8 @@ static void _e_border_menu_cb_maximize_pre(void *data, E_Menu *m, E_Menu_Item *m static void _e_border_menu_cb_maximize(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_border_menu_cb_maximize_vertically(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_border_menu_cb_maximize_horizontally(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_border_menu_cb_maximize_left(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_border_menu_cb_maximize_right(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_border_menu_cb_unmaximize(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_border_menu_cb_shade(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_border_menu_cb_resistance(void *data, E_Menu *m, E_Menu_Item *mi); @@ -411,6 +413,28 @@ _e_border_menu_cb_maximize_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi "e/widgets/border/default/maximize"), "e/widgets/border/default/maximize"); + submi = e_menu_item_new(subm); + e_menu_item_label_set(submi, _("Maximize left")); + e_menu_item_radio_set(submi, 1); + e_menu_item_radio_group_set(submi, 3); + e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_LEFT); + e_menu_item_callback_set(submi, _e_border_menu_cb_maximize_left, bd); + e_menu_item_icon_edje_set(submi, + e_theme_edje_file_get("base/theme/borders", + "e/widgets/border/default/maximize"), + "e/widgets/border/default/maximize"); + + submi = e_menu_item_new(subm); + e_menu_item_label_set(submi, _("Maximize right")); + e_menu_item_radio_set(submi, 1); + e_menu_item_radio_group_set(submi, 3); + e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_RIGHT); + e_menu_item_callback_set(submi, _e_border_menu_cb_maximize_right, bd); + e_menu_item_icon_edje_set(submi, + e_theme_edje_file_get("base/theme/borders", + "e/widgets/border/default/maximize"), + "e/widgets/border/default/maximize"); + submi = e_menu_item_new(subm); e_menu_item_label_set(submi, _("Unmaximize")); e_menu_item_radio_set(submi, 1); @@ -465,6 +489,36 @@ _e_border_menu_cb_maximize_horizontally(void *data, E_Menu *m __UNUSED__, E_Menu } } +static void +_e_border_menu_cb_maximize_left(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) +{ + E_Border *bd; + + bd = data; + if (!bd->lock_user_maximize) + { + if ((bd->maximized & E_MAXIMIZE_DIRECTION)) + e_border_unmaximize(bd, bd->maximized & E_MAXIMIZE_DIRECTION); + e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | + E_MAXIMIZE_LEFT); + } +} + +static void +_e_border_menu_cb_maximize_right(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) +{ + E_Border *bd; + + bd = data; + if (!bd->lock_user_maximize) + { + if ((bd->maximized & E_MAXIMIZE_DIRECTION)) + e_border_unmaximize(bd, bd->maximized & E_MAXIMIZE_DIRECTION); + e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | + E_MAXIMIZE_RIGHT); + } +} + static void _e_border_menu_cb_unmaximize(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { diff --git a/src/modules/conf_keybindings/e_int_config_keybindings.c b/src/modules/conf_keybindings/e_int_config_keybindings.c index 083a4e08a..7fb959bce 100644 --- a/src/modules/conf_keybindings/e_int_config_keybindings.c +++ b/src/modules/conf_keybindings/e_int_config_keybindings.c @@ -531,6 +531,12 @@ _restore_key_binding_defaults_cb(void *data, CFG_KEYBIND_DFLT(E_BINDING_CONTEXT_ANY, "F10", E_BINDING_MODIFIER_CTRL, 0, "window_maximized_toggle", "default horizontal"); + CFG_KEYBIND_DFLT(E_BINDING_CONTEXT_ANY, "Left", + E_BINDING_MODIFIER_WIN, 0, + "window_maximized_toggle", "default left"); + CFG_KEYBIND_DFLT(E_BINDING_CONTEXT_ANY, "Right", + E_BINDING_MODIFIER_WIN, 0, + "window_maximized_toggle", "default right"); CFG_KEYBIND_DFLT(E_BINDING_CONTEXT_ANY, "r", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, "window_shaded_toggle", NULL);