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); ecore_event_add(E_EVENT_BORDER_ADD, ev, _e_border_event_border_add_free, NULL);
/* Recreate state */ /* Recreate state */
if (ecore_x_netwm_window_type_get(bd->client.win) == ECORE_X_WINDOW_TYPE_DESKTOP) e_hints_window_init(bd);
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);
ecore_x_icccm_move_resize_send(bd->client.win, ecore_x_icccm_move_resize_send(bd->client.win,
bd->x + bd->client_inset.l, bd->x + bd->client_inset.l,

View File

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

View File

@ -236,75 +236,122 @@ e_hints_desktop_config_set(void)
} }
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); 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;
}
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_MODAL, 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); bd->client.netwm.state.modal);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_STICKY, ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_STICKY,
bd->sticky); bd->client.netwm.state.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_MAXIMIZED_VERT,
bd->client.netwm.state.maximized_v); 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); bd->client.netwm.state.maximized_h);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_SHADED, ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_SHADED,
bd->shaded); bd->client.netwm.state.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_SKIP_TASKBAR,
bd->client.netwm.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); bd->client.netwm.state.skip_pager);
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_HIDDEN, ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_HIDDEN,
!(bd->visible)); bd->client.netwm.state.hidden);
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_FULLSCREEN,
bd->client.netwm.state.fullscreen); bd->client.netwm.state.fullscreen);
switch (bd->client.netwm.state.stacking) switch (bd->client.netwm.state.stacking)
{ {
case 1: case 1:
ecore_x_netwm_window_state_set(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(win, ECORE_X_WINDOW_STATE_BELOW, 0); ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 0);
case 2: case 2:
ecore_x_netwm_window_state_set(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(win, ECORE_X_WINDOW_STATE_BELOW, 1); ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 1);
default: default:
ecore_x_netwm_window_state_set(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(win, ECORE_X_WINDOW_STATE_BELOW, 0); ecore_x_netwm_window_state_set(bd->client.win, ECORE_X_WINDOW_STATE_BELOW, 0);
break; break;
} }
} }
void void e_hints_window_type_set(E_Border *bd)
e_hints_window_state_get(Ecore_X_Window win) {
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; int above, below;
bd = e_border_find_by_client_window(win);
bd->client.netwm.state.modal = bd->client.netwm.state.modal =
ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_MODAL); ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_MODAL);
bd->sticky = bd->client.netwm.state.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_STICKY);
bd->client.netwm.state.maximized_v = 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 = bd->client.netwm.state.maximized_h =
ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ); ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ);
bd->shaded = bd->client.netwm.state.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_SHADED);
bd->client.netwm.state.skip_taskbar = 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 = bd->client.netwm.state.skip_pager =
ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_SKIP_PAGER); ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_SKIP_PAGER);
bd->visible = bd->client.netwm.state.hidden =
!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_HIDDEN);
bd->client.netwm.state.fullscreen = 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); above = ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_ABOVE);
below = ecore_x_netwm_window_state_isset(win, ECORE_X_WINDOW_STATE_BELOW); below = ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_BELOW);
bd->client.netwm.state.stacking = (above << 0) + (below << 1); 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); 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 void
e_hints_window_iconic_set(Ecore_X_Window win) 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); 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 void
e_hints_window_hidden_set(Ecore_X_Window win) 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); 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 void
e_hints_window_shaded_set(Ecore_X_Window win, int on) e_hints_window_shaded_set(Ecore_X_Window win, int on)
{ {
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_SHADED, 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 void
e_hints_window_shade_direction_set(Ecore_X_Window win, E_Direction dir) 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); 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 void
e_hints_window_fullscreen_set(Ecore_X_Window win, int on) e_hints_window_fullscreen_set(Ecore_X_Window win, int on)
{ {
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_FULLSCREEN, 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 void
e_hints_window_sticky_set(Ecore_X_Window win, int on) e_hints_window_sticky_set(Ecore_X_Window win, int on)
{ {
ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_STICKY, 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_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

@ -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 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 char *e_hints_window_name_get(Ecore_X_Window win);
EAPI void e_hints_desktop_config_set(void); 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 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 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 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 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 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 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 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 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 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); EAPI void e_hints_window_icon_name_get(Ecore_X_Window win);
#endif #endif