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);
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);
}

View File

@ -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;

View File

@ -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);

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_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);