diff --git a/src/bin/e_border.c b/src/bin/e_border.c index b89e61aaa..9cb393bc8 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -3689,7 +3689,7 @@ _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key) mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Always On Top")); e_menu_item_check_set(mi, 1); - e_menu_item_toggle_set(mi, (bd->layer == 175 ? 1 : 0)); + e_menu_item_toggle_set(mi, (bd->layer == 150 ? 1 : 0)); e_menu_item_callback_set(mi, _e_border_menu_cb_on_top, bd); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/borders", @@ -3844,10 +3844,16 @@ _e_border_menu_cb_on_top(void *data, E_Menu *m, E_Menu_Item *mi) E_Border *bd; bd = data; - if (bd->layer == 175) - bd->layer = 100; + if (bd->layer == 150) + { + bd->layer = 100; + e_hints_window_stacking_set(bd, E_STACKING_NONE); + } else - bd->layer = 175; + { + bd->layer = 150; + e_hints_window_stacking_set(bd, E_STACKING_ABOVE); + } e_container_window_raise(bd->zone->container, bd->win, bd->layer); } diff --git a/src/bin/e_border.h b/src/bin/e_border.h index e0efe0733..00955482d 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -19,6 +19,13 @@ typedef enum _E_Transition E_TRANSITION_DECELERATE } E_Transition; +typedef enum _E_Stacking +{ + E_STACKING_NONE, + E_STACKING_ABOVE, + E_STACKING_BELOW +} E_Stacking; + typedef struct _E_Border E_Border; typedef struct _E_Border_Pending_Move_Resize E_Border_Pending_Move_Resize; typedef struct _E_Event_Border_Resize E_Event_Border_Resize; @@ -157,7 +164,7 @@ struct _E_Border unsigned char skip_taskbar : 1; unsigned char skip_pager : 1; unsigned char fullscreen : 1; - unsigned char stacking : 2; /* 0 = None, 1 = Above, 2 = Below */ + E_Stacking stacking; } state; Ecore_X_Window_Type type; diff --git a/src/bin/e_hints.c b/src/bin/e_hints.c index 102aab2d3..7f17bd9fe 100644 --- a/src/bin/e_hints.c +++ b/src/bin/e_hints.c @@ -256,9 +256,9 @@ e_hints_window_init(E_Border *bd) if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DESKTOP) bd->layer = 0; - else if (bd->client.netwm.state.stacking == 2) + else if (bd->client.netwm.state.stacking == E_STACKING_ABOVE) bd->layer = 50; - else if (bd->client.netwm.state.stacking == 1) + else if (bd->client.netwm.state.stacking == E_STACKING_BELOW) bd->layer = 150; else if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DOCK) bd->layer = 150; @@ -306,12 +306,15 @@ e_hints_window_state_set(E_Border *bd) switch (bd->client.netwm.state.stacking) { - case 1: + case E_STACKING_ABOVE: ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_ABOVE, 1); ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 0); - case 2: + break; + case E_STACKING_BELOW: ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_ABOVE, 0); ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 1); + break; + case E_STACKING_NONE: default: ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_ABOVE, 0); ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 0); @@ -615,28 +618,28 @@ e_hints_window_state_update(E_Border *bd, Ecore_X_Window_State state, switch (action) { case ECORE_X_WINDOW_STATE_ACTION_REMOVE: - if (bd->client.netwm.state.stacking == 1) + if (bd->client.netwm.state.stacking == E_STACKING_ABOVE) { - bd->client.netwm.state.stacking = 0; + bd->client.netwm.state.stacking = E_STACKING_NONE; changed = 1; } break; case ECORE_X_WINDOW_STATE_ACTION_ADD: - if (bd->client.netwm.state.stacking == 0) + if (bd->client.netwm.state.stacking == E_STACKING_NONE) { - bd->client.netwm.state.stacking = 1; + bd->client.netwm.state.stacking = E_STACKING_ABOVE; changed = 1; } break; case ECORE_X_WINDOW_STATE_ACTION_TOGGLE: - if (bd->client.netwm.state.stacking == 1) + if (bd->client.netwm.state.stacking == E_STACKING_ABOVE) { - bd->client.netwm.state.stacking = 0; + bd->client.netwm.state.stacking = E_STACKING_NONE; changed = 1; } - else if (bd->client.netwm.state.stacking == 0) + else if (bd->client.netwm.state.stacking == E_STACKING_NONE) { - bd->client.netwm.state.stacking = 1; + bd->client.netwm.state.stacking = E_STACKING_ABOVE; changed = 1; } break; @@ -658,28 +661,28 @@ e_hints_window_state_update(E_Border *bd, Ecore_X_Window_State state, switch (action) { case ECORE_X_WINDOW_STATE_ACTION_REMOVE: - if (bd->client.netwm.state.stacking == 2) + if (bd->client.netwm.state.stacking == E_STACKING_BELOW) { - bd->client.netwm.state.stacking = 0; + bd->client.netwm.state.stacking = E_STACKING_NONE; changed = 1; } break; case ECORE_X_WINDOW_STATE_ACTION_ADD: - if (bd->client.netwm.state.stacking == 0) + if (bd->client.netwm.state.stacking == E_STACKING_NONE) { - bd->client.netwm.state.stacking = 2; + bd->client.netwm.state.stacking = E_STACKING_BELOW; changed = 1; } break; case ECORE_X_WINDOW_STATE_ACTION_TOGGLE: - if (bd->client.netwm.state.stacking == 2) + if (bd->client.netwm.state.stacking == E_STACKING_BELOW) { - bd->client.netwm.state.stacking = 0; + bd->client.netwm.state.stacking = E_STACKING_NONE; changed = 1; } - else if (bd->client.netwm.state.stacking == 0) + else if (bd->client.netwm.state.stacking == E_STACKING_NONE) { - bd->client.netwm.state.stacking = 2; + bd->client.netwm.state.stacking = E_STACKING_BELOW; changed = 1; } break; @@ -858,7 +861,6 @@ e_hints_window_fullscreen_set(E_Border *bd, int on) void e_hints_window_sticky_set(E_Border *bd, int on) { - ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_STICKY, on); if ((!bd->client.netwm.state.sticky) && (on)) { ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_STICKY, 1); @@ -871,6 +873,29 @@ e_hints_window_sticky_set(E_Border *bd, int on) } } +void +e_hints_window_stacking_set(E_Border *bd, E_Stacking stacking) +{ + if (bd->client.netwm.state.stacking == stacking) return; + switch (stacking) + { + case E_STACKING_ABOVE: + ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_ABOVE, 1); + ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 0); + break; + case E_STACKING_BELOW: + ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_ABOVE, 0); + ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 1); + break; + case E_STACKING_NONE: + default: + ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_ABOVE, 0); + ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 0); + break; + } + bd->client.netwm.state.stacking = stacking; +} + /* ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_MODAL, on); ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_SKIP_TASKBAR, on); diff --git a/src/bin/e_hints.h b/src/bin/e_hints.h index 2b6337c17..4b56b418a 100644 --- a/src/bin/e_hints.h +++ b/src/bin/e_hints.h @@ -35,8 +35,9 @@ EAPI E_Direction e_hints_window_shade_direction_get(E_Border *bd); EAPI void e_hints_window_shaded_set(E_Border *bd, int on); EAPI void e_hints_window_maximized_set(E_Border *bd, int on); -EAPI void e_hints_window_sticky_set(E_Border *bd, int on); EAPI void e_hints_window_fullscreen_set(E_Border *bd, int on); +EAPI void e_hints_window_sticky_set(E_Border *bd, int on); +EAPI void e_hints_window_stacking_set(E_Border *bd, E_Stacking stacking); EAPI void e_hints_window_icon_name_get(E_Border *bd);