Cleanup always on top.

SVN revision: 14691
This commit is contained in:
sebastid 2005-05-10 10:11:34 +00:00 committed by sebastid
parent 66fa6c445f
commit 110ab2c9a7
4 changed files with 66 additions and 27 deletions

View File

@ -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); mi = e_menu_item_new(m);
e_menu_item_label_set(mi, _("Always On Top")); e_menu_item_label_set(mi, _("Always On Top"));
e_menu_item_check_set(mi, 1); 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_callback_set(mi, _e_border_menu_cb_on_top, bd);
e_menu_item_icon_edje_set(mi, e_menu_item_icon_edje_set(mi,
(char *)e_theme_edje_file_get("base/theme/borders", (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; E_Border *bd;
bd = data; bd = data;
if (bd->layer == 175) if (bd->layer == 150)
{
bd->layer = 100; bd->layer = 100;
e_hints_window_stacking_set(bd, E_STACKING_NONE);
}
else 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); e_container_window_raise(bd->zone->container, bd->win, bd->layer);
} }

View File

@ -19,6 +19,13 @@ typedef enum _E_Transition
E_TRANSITION_DECELERATE E_TRANSITION_DECELERATE
} E_Transition; } 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 E_Border;
typedef struct _E_Border_Pending_Move_Resize E_Border_Pending_Move_Resize; typedef struct _E_Border_Pending_Move_Resize E_Border_Pending_Move_Resize;
typedef struct _E_Event_Border_Resize E_Event_Border_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_taskbar : 1;
unsigned char skip_pager : 1; unsigned char skip_pager : 1;
unsigned char fullscreen : 1; unsigned char fullscreen : 1;
unsigned char stacking : 2; /* 0 = None, 1 = Above, 2 = Below */ E_Stacking stacking;
} state; } state;
Ecore_X_Window_Type type; Ecore_X_Window_Type type;

View File

@ -256,9 +256,9 @@ e_hints_window_init(E_Border *bd)
if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DESKTOP) if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DESKTOP)
bd->layer = 0; bd->layer = 0;
else if (bd->client.netwm.state.stacking == 2) else if (bd->client.netwm.state.stacking == E_STACKING_ABOVE)
bd->layer = 50; bd->layer = 50;
else if (bd->client.netwm.state.stacking == 1) else if (bd->client.netwm.state.stacking == E_STACKING_BELOW)
bd->layer = 150; bd->layer = 150;
else if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DOCK) else if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DOCK)
bd->layer = 150; bd->layer = 150;
@ -306,12 +306,15 @@ e_hints_window_state_set(E_Border *bd)
switch (bd->client.netwm.state.stacking) 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_ABOVE, 1);
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 0); 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_ABOVE, 0);
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 1); ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 1);
break;
case E_STACKING_NONE:
default: 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_ABOVE, 0);
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 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) switch (action)
{ {
case ECORE_X_WINDOW_STATE_ACTION_REMOVE: 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; changed = 1;
} }
break; break;
case ECORE_X_WINDOW_STATE_ACTION_ADD: 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; changed = 1;
} }
break; break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE: 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; 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; changed = 1;
} }
break; break;
@ -658,28 +661,28 @@ e_hints_window_state_update(E_Border *bd, Ecore_X_Window_State state,
switch (action) switch (action)
{ {
case ECORE_X_WINDOW_STATE_ACTION_REMOVE: 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; changed = 1;
} }
break; break;
case ECORE_X_WINDOW_STATE_ACTION_ADD: 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; changed = 1;
} }
break; break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE: 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; 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; changed = 1;
} }
break; break;
@ -858,7 +861,6 @@ e_hints_window_fullscreen_set(E_Border *bd, int on)
void void
e_hints_window_sticky_set(E_Border *bd, int on) 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)) if ((!bd->client.netwm.state.sticky) && (on))
{ {
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_STICKY, 1); 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_MODAL, on);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_SKIP_TASKBAR, on); ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_SKIP_TASKBAR, on);

View File

@ -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_shaded_set(E_Border *bd, int on);
EAPI void e_hints_window_maximized_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_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); EAPI void e_hints_window_icon_name_get(E_Border *bd);