add client_set_undecorated().

add support for the _OB_WM_STATE_UNDECORATED state hint.
This commit is contained in:
Dana Jansens 2003-09-25 23:07:15 +00:00
parent b2dd343095
commit b4fa843575
3 changed files with 180 additions and 152 deletions

View file

@ -1214,8 +1214,7 @@ void action_toggle_decorations(union ActionData *data)
ObClient *c = data->client.any.c;
client_action_start(data);
c->decorate = !c->decorate;
client_setup_decor_and_functions(c);
client_set_undecorated(c, !c->undecorated);
client_action_end(data);
}

View file

@ -244,7 +244,6 @@ void client_manage(Window window)
self->title_count = 1;
self->wmstate = NormalState;
self->layer = -1;
self->decorate = TRUE;
self->desktop = screen_num_desktops; /* always an invalid value */
client_get_all(self);
@ -794,6 +793,8 @@ static void client_get_state(ObClient *self)
self->above = TRUE;
else if (state[i] == prop_atoms.net_wm_state_below)
self->below = TRUE;
else if (state[i] == prop_atoms.ob_wm_state_undecorated)
self->undecorated = TRUE;
}
g_free(state);
@ -1157,7 +1158,7 @@ void client_setup_decor_and_functions(ObClient *self)
/* finally, the user can have requested no decorations, which overrides
everything */
if (!self->decorate)
if (self->undecorated)
self->decorations = OB_FRAME_DECOR_BORDER;
/* if we don't have a titlebar, then we cannot shade! */
@ -1585,7 +1586,7 @@ void client_update_icons(ObClient *self)
static void client_change_state(ObClient *self)
{
guint32 state[2];
guint32 netstate[10];
guint32 netstate[11];
guint num;
state[0] = self->wmstate;
@ -1613,6 +1614,8 @@ static void client_change_state(ObClient *self)
netstate[num++] = prop_atoms.net_wm_state_above;
if (self->below)
netstate[num++] = prop_atoms.net_wm_state_below;
if (self->undecorated)
netstate[num++] = prop_atoms.ob_wm_state_undecorated;
PROP_SETA32(self->window, net_wm_state, atom, netstate, num);
client_calc_layer(self);
@ -1753,6 +1756,10 @@ static void client_apply_startup_state(ObClient *self)
self->fullscreen = FALSE;
client_fullscreen(self, TRUE, FALSE);
}
if (self->undecorated) {
self->undecorated = FALSE;
client_set_undecorated(self, TRUE);
}
if (self->shaded) {
self->shaded = FALSE;
client_shade(self, TRUE);
@ -2352,6 +2359,7 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
{
gboolean shaded = self->shaded;
gboolean fullscreen = self->fullscreen;
gboolean undecorated = self->undecorated;
gboolean max_horz = self->max_horz;
gboolean max_vert = self->max_vert;
int i;
@ -2379,7 +2387,7 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
action = self->max_horz ? prop_atoms.net_wm_state_remove :
prop_atoms.net_wm_state_add;
else if (state == prop_atoms.net_wm_state_shaded)
action = self->shaded ? prop_atoms.net_wm_state_remove :
action = shaded ? prop_atoms.net_wm_state_remove :
prop_atoms.net_wm_state_add;
else if (state == prop_atoms.net_wm_state_skip_taskbar)
action = self->skip_taskbar ?
@ -2390,7 +2398,7 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
prop_atoms.net_wm_state_remove :
prop_atoms.net_wm_state_add;
else if (state == prop_atoms.net_wm_state_fullscreen)
action = self->fullscreen ?
action = fullscreen ?
prop_atoms.net_wm_state_remove :
prop_atoms.net_wm_state_add;
else if (state == prop_atoms.net_wm_state_above)
@ -2399,6 +2407,9 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
else if (state == prop_atoms.net_wm_state_below)
action = self->below ? prop_atoms.net_wm_state_remove :
prop_atoms.net_wm_state_add;
else if (state == prop_atoms.ob_wm_state_undecorated)
action = undecorated ? prop_atoms.net_wm_state_remove :
prop_atoms.net_wm_state_add;
}
if (action == prop_atoms.net_wm_state_add) {
@ -2421,6 +2432,8 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
self->above = TRUE;
} else if (state == prop_atoms.net_wm_state_below) {
self->below = TRUE;
} else if (state == prop_atoms.ob_wm_state_undecorated) {
undecorated = TRUE;
}
} else { /* action == prop_atoms.net_wm_state_remove */
@ -2442,6 +2455,8 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
self->above = FALSE;
} else if (state == prop_atoms.net_wm_state_below) {
self->below = FALSE;
} else if (state == prop_atoms.ob_wm_state_undecorated) {
undecorated = FALSE;
}
}
}
@ -2468,6 +2483,8 @@ void client_set_state(ObClient *self, Atom action, long data1, long data2)
client_fullscreen(self, fullscreen, TRUE);
if (shaded != self->shaded)
client_shade(self, shaded);
if (undecorated != self->undecorated)
client_set_undecorated(self, undecorated);
client_calc_layer(self);
client_change_state(self); /* change the hint to reflect these changes */
}
@ -2745,6 +2762,15 @@ void client_set_layer(ObClient *self, int layer)
client_change_state(self); /* reflect this in the state hints */
}
void client_set_undecorated(ObClient *self, gboolean undecorated)
{
if (self->undecorated != undecorated) {
self->undecorated = undecorated;
client_setup_decor_and_functions(self);
client_change_state(self); /* reflect this in the state hints */
}
}
guint client_monitor(ObClient *self)
{
guint i;

View file

@ -250,10 +250,10 @@ struct _ObClient
*/
guint decorations;
/*! A user option. When this is set to FALSE the client will not ever
/*! A user option. When this is set to TRUE the client will not ever
be decorated.
*/
gboolean decorate;
gboolean undecorated;
/*! A bitmask of values in the ObFunctions enum
The values in the variable specify the ways in which the user is allowed
@ -520,6 +520,9 @@ int client_directional_edge_search(ObClient *c, ObDirection dir);
*/
void client_set_layer(ObClient *self, int layer);
/*! Set a client window to have decorations or not */
void client_set_undecorated(ObClient *self, gboolean undecorated);
guint client_monitor(ObClient *self);
void client_update_sm_client_id(ObClient *self);