Window hints cleanup.

SVN revision: 14480
This commit is contained in:
sebastid 2005-04-29 08:02:29 +00:00 committed by sebastid
parent c3e4650e8b
commit b57ff00be7
4 changed files with 100 additions and 122 deletions

View File

@ -3047,32 +3047,7 @@ _e_border_eval(E_Border *bd)
ecore_event_add(E_EVENT_BORDER_ADD, ev, _e_border_event_border_add_free, NULL);
/* Recreate state */
if (ecore_x_netwm_window_type_get(bd->client.win) == ECORE_X_WINDOW_TYPE_DESKTOP)
bd->layer = 0;
else if (ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_BELOW))
bd->layer = 50;
else if (ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_ABOVE))
bd->layer = 150;
else if (ecore_x_netwm_window_type_get(bd->client.win) == ECORE_X_WINDOW_TYPE_DOCK)
bd->layer = 150;
else if (ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_FULLSCREEN))
bd->layer = 200;
else
bd->layer = 100;
e_container_window_raise(bd->zone->container, bd->win, bd->layer);
if (e_hints_window_sticky_isset(bd->client.win))
e_border_stick(bd);
if (e_hints_window_shaded_isset(bd->client.win))
e_border_shade(bd, e_hints_window_shade_direction_get(bd->client.win));
if (e_hints_window_maximized_isset(bd->client.win))
e_border_maximize(bd);
if (e_hints_window_iconic_isset(bd->client.win))
e_border_iconify(bd);
/* If a window isn't iconic, and is one the current desk,
* show it! */
else if (bd->desk == e_desk_current_get(bd->zone))
e_border_show(bd);
e_hints_window_init(bd);
ecore_x_icccm_move_resize_send(bd->client.win,
bd->x + bd->client_inset.l,

View File

@ -107,6 +107,7 @@ struct _E_Border
int start_x, start_y;
double min_aspect, max_aspect;
Ecore_X_Window_State_Hint initial_state;
Ecore_X_Window_State_Hint state;
Ecore_X_Pixmap icon_pixmap;
Ecore_X_Pixmap icon_mask;
Ecore_X_Window icon_window;
@ -116,8 +117,6 @@ struct _E_Border
unsigned char accepts_focus : 1;
unsigned char urgent : 1;
unsigned char delete_request : 1;
unsigned char withdrawn : 1;
unsigned char iconic : 1;
unsigned char request_pos : 1;
struct {
unsigned int title : 1;
@ -150,6 +149,9 @@ struct _E_Border
/* NetWM Window state */
struct {
unsigned char modal : 1;
unsigned char sticky : 1;
unsigned char shaded : 1;
unsigned char hidden : 1;
unsigned char maximized_v : 1;
unsigned char maximized_h : 1;
unsigned char skip_taskbar : 1;
@ -157,6 +159,8 @@ struct _E_Border
unsigned char fullscreen : 1;
unsigned char stacking : 2; /* 0 = None, 1 = Above, 2 = Below */
} state;
Ecore_X_Window_Type type;
} netwm;
Ecore_X_Window_Attributes initial_attributes;

View File

@ -236,75 +236,122 @@ e_hints_desktop_config_set(void)
}
void
e_hints_window_state_set(Ecore_X_Window win)
e_hints_window_init(E_Border *bd)
{
E_Border *bd;
e_hints_window_state_get(bd);
e_hints_window_type_get(bd);
bd = e_border_find_by_client_window(win);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_MODAL,
bd->client.icccm.state = ecore_x_icccm_state_get(bd->client.win);
if (bd->client.icccm.state == ECORE_X_WINDOW_STATE_HINT_NONE)
{
if (bd->client.netwm.state.hidden)
bd->client.icccm.state = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
else
bd->client.icccm.state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
}
if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DESKTOP)
bd->layer = 0;
else if (bd->client.netwm.state.stacking == 2)
bd->layer = 50;
else if (bd->client.netwm.state.stacking == 1)
bd->layer = 150;
else if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DOCK)
bd->layer = 150;
else if (bd->client.netwm.state.fullscreen)
bd->layer = 200;
else
bd->layer = 100;
e_container_window_raise(bd->zone->container, bd->win, bd->layer);
if (bd->client.netwm.state.sticky)
e_border_stick(bd);
if (bd->client.netwm.state.shaded)
e_border_shade(bd, e_hints_window_shade_direction_get(bd->client.win));
if (bd->client.netwm.state.maximized_v && bd->client.netwm.state.maximized_h)
e_border_maximize(bd);
if (bd->client.icccm.state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
e_border_iconify(bd);
/* If a window isn't iconic, and is one the current desk,
* show it! */
else if ((bd->client.icccm.state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
&& (bd->desk == e_desk_current_get(bd->zone)))
e_border_show(bd);
}
void
e_hints_window_state_set(E_Border *bd)
{
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_MODAL,
bd->client.netwm.state.modal);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_STICKY,
bd->sticky);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_MAXIMIZED_VERT,
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_STICKY,
bd->client.netwm.state.sticky);
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_MAXIMIZED_VERT,
bd->client.netwm.state.maximized_v);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ,
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ,
bd->client.netwm.state.maximized_h);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_SHADED,
bd->shaded);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_SKIP_TASKBAR,
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_SHADED,
bd->client.netwm.state.shaded);
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_SKIP_TASKBAR,
bd->client.netwm.state.skip_taskbar);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_SKIP_PAGER,
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_SKIP_PAGER,
bd->client.netwm.state.skip_pager);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_HIDDEN,
!(bd->visible));
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_FULLSCREEN,
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_HIDDEN,
bd->client.netwm.state.hidden);
ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_FULLSCREEN,
bd->client.netwm.state.fullscreen);
switch (bd->client.netwm.state.stacking)
{
case 1:
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_ABOVE, 1);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_BELOW, 0);
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:
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_ABOVE, 0);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_BELOW, 1);
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);
default:
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_ABOVE, 0);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_BELOW, 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);
break;
}
}
void
e_hints_window_state_get(Ecore_X_Window win)
void e_hints_window_type_set(E_Border *bd)
{
ecore_x_netwm_window_type_set(bd->client.win, bd->client.netwm.type);
}
void e_hints_window_type_get(E_Border *bd)
{
bd->client.netwm.type = ecore_x_netwm_window_type_get(bd->client.win);
}
void
e_hints_window_state_get(E_Border *bd)
{
E_Border *bd;
int above, below;
bd = e_border_find_by_client_window(win);
bd->client.netwm.state.modal =
ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_MODAL);
bd->sticky =
ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_STICKY);
ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_MODAL);
bd->client.netwm.state.sticky =
ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_STICKY);
bd->client.netwm.state.maximized_v =
ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_MAXIMIZED_VERT);
ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_MAXIMIZED_VERT);
bd->client.netwm.state.maximized_h =
ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ);
bd->shaded =
ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_SHADED);
ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ);
bd->client.netwm.state.shaded =
ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_SHADED);
bd->client.netwm.state.skip_taskbar =
ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_SKIP_TASKBAR);
ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_SKIP_TASKBAR);
bd->client.netwm.state.skip_pager =
ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_SKIP_PAGER);
bd->visible =
!ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_HIDDEN);
ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_SKIP_PAGER);
bd->client.netwm.state.hidden =
ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_HIDDEN);
bd->client.netwm.state.fullscreen =
ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_FULLSCREEN);
ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_FULLSCREEN);
above = ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_ABOVE);
below = ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_BELOW);
above = ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_ABOVE);
below = ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_BELOW);
bd->client.netwm.state.stacking = (above << 0) + (below << 1);
}
@ -315,13 +362,6 @@ e_hints_window_visible_set(Ecore_X_Window win)
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_HIDDEN, 0);
}
int
e_hints_window_visible_isset(Ecore_X_Window win)
{
return !ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_HIDDEN)
|| (ecore_x_icccm_state_get(win) == ECORE_X_WINDOW_STATE_HINT_NORMAL);
}
void
e_hints_window_iconic_set(Ecore_X_Window win)
{
@ -329,12 +369,6 @@ e_hints_window_iconic_set(Ecore_X_Window win)
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_HIDDEN, 1);
}
int
e_hints_window_iconic_isset(Ecore_X_Window win)
{
return (ecore_x_icccm_state_get(win) == ECORE_X_WINDOW_STATE_HINT_ICONIC);
}
void
e_hints_window_hidden_set(Ecore_X_Window win)
{
@ -342,25 +376,12 @@ e_hints_window_hidden_set(Ecore_X_Window win)
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_HIDDEN, 1);
}
int
e_hints_window_hidden_isset(Ecore_X_Window win)
{
return ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_HIDDEN)
|| (ecore_x_icccm_state_get(win) != ECORE_X_WINDOW_STATE_HINT_NORMAL);
}
void
e_hints_window_shaded_set(Ecore_X_Window win, int on)
{
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_SHADED, on);
}
int
e_hints_window_shaded_isset(Ecore_X_Window win)
{
return ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_SHADED);
}
void
e_hints_window_shade_direction_set(Ecore_X_Window win, E_Direction dir)
{
@ -389,37 +410,18 @@ e_hints_window_maximized_set(Ecore_X_Window win, int on)
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ, on);
}
int
e_hints_window_maximized_isset(Ecore_X_Window win)
{
return ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_MAXIMIZED_VERT)
&& ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ);
}
void
e_hints_window_fullscreen_set(Ecore_X_Window win, int on)
{
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_FULLSCREEN, on);
}
int
e_hints_window_fullscreen_isset(Ecore_X_Window win)
{
return ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_FULLSCREEN);
}
void
e_hints_window_sticky_set(Ecore_X_Window win, int on)
{
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_STICKY, on);
}
int
e_hints_window_sticky_isset(Ecore_X_Window win)
{
return ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_STICKY);
}
/*
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

@ -13,24 +13,21 @@ EAPI void e_hints_active_window_set(E_Manager *man, Ecore_X_Window win);
EAPI void e_hints_window_name_set(Ecore_X_Window win, const char *name);
EAPI char *e_hints_window_name_get(Ecore_X_Window win);
EAPI void e_hints_desktop_config_set(void);
EAPI void e_hints_window_state_set(Ecore_X_Window win);
EAPI void e_hints_window_init(E_Border *bd);
EAPI void e_hints_window_state_set(E_Border *bd);
EAPI void e_hints_window_state_get(E_Border *bd);
EAPI void e_hints_window_type_set(E_Border *bd);
EAPI void e_hints_window_type_get(E_Border *bd);
EAPI void e_hints_window_visible_set(Ecore_X_Window win);
EAPI int e_hints_window_visible_isset(Ecore_X_Window win);
EAPI void e_hints_window_iconic_set(Ecore_X_Window win);
EAPI int e_hints_window_iconic_isset(Ecore_X_Window win);
EAPI void e_hints_window_hidden_set(Ecore_X_Window win);
EAPI int e_hints_window_hidden_isset(Ecore_X_Window win);
EAPI void e_hints_window_shaded_set(Ecore_X_Window win, int on);
EAPI int e_hints_window_shaded_isset(Ecore_X_Window win);
EAPI void e_hints_window_shade_direction_set(Ecore_X_Window win, E_Direction dir);
EAPI E_Direction e_hints_window_shade_direction_get(Ecore_X_Window win);
EAPI void e_hints_window_maximized_set(Ecore_X_Window win, int on);
EAPI int e_hints_window_maximized_isset(Ecore_X_Window win);
EAPI void e_hints_window_sticky_set(Ecore_X_Window win, int on);
EAPI int e_hints_window_sticky_isset(Ecore_X_Window win);
EAPI void e_hints_window_fullscreen_set(Ecore_X_Window win, int on);
EAPI int e_hints_window_fullscreen_isset(Ecore_X_Window win);
EAPI void e_hints_window_icon_name_get(Ecore_X_Window win);
#endif