client: split out of setfloating layer handling

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-06-25 22:26:53 +02:00
parent 775e634e13
commit 086bada825
3 changed files with 42 additions and 24 deletions

View File

@ -92,7 +92,8 @@ client_loadprops(client_t * c, screen_t *screen)
else else
untag_client(c, tags->tab[i]); untag_client(c, tags->tab[i]);
client_setfloating(c, prop[tags->len] == '1', prop[tags->len + 1] - '0'); client_setlayer(c, prop[tags->len + 1] - '0');
client_setfloating(c, prop[tags->len] == '1');
p_delete(&prop); p_delete(&prop);
return true; return true;
} }
@ -409,7 +410,7 @@ client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int screen)
/* should be floating if transsient or fixed */ /* should be floating if transsient or fixed */
if(rettrans || c->isfixed) if(rettrans || c->isfixed)
client_setfloating(c, true, c->layer != LAYER_TILE ? c->layer : LAYER_FLOAT); client_setfloating(c, true);
xcb_change_window_attributes(globalconf.connection, w, XCB_CW_EVENT_MASK, select_input_val); xcb_change_window_attributes(globalconf.connection, w, XCB_CW_EVENT_MASK, select_input_val);
@ -581,34 +582,43 @@ client_resize(client_t *c, area_t geometry, bool hints)
return resized; return resized;
} }
/* Set the client layer.
* \param c The client.
* \param layer The layer.
*/
void
client_setlayer(client_t *c, layer_t layer)
{
c->layer = layer;
client_raise(c);
}
/** Set a clinet floating. /** Set a clinet floating.
* \param c The client. * \param c The client.
* \param floating Set floating, or not. * \param floating Set floating, or not.
* \param layer Layer to put the floating window onto. * \param layer Layer to put the floating window onto.
*/ */
void void
client_setfloating(client_t *c, bool floating, layer_t layer) client_setfloating(client_t *c, bool floating)
{ {
if(c->isfloating != floating) if(c->isfloating != floating)
{ {
if((c->isfloating = floating)) if((c->isfloating = floating))
{
client_setlayer(c, MAX(c->layer, LAYER_FLOAT));
client_resize(c, c->f_geometry, false); client_resize(c, c->f_geometry, false);
}
else if(c->ismax) else if(c->ismax)
{ {
c->ismax = false; c->ismax = false;
client_setlayer(c, c->oldlayer);
client_resize(c, c->m_geometry, false); client_resize(c, c->m_geometry, false);
} }
else
client_setlayer(c, c->oldlayer);
if(client_isvisible(c, c->screen)) if(client_isvisible(c, c->screen))
globalconf.screens[c->screen].need_arrange = true; globalconf.screens[c->screen].need_arrange = true;
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS); widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
if(floating)
{
c->oldlayer = c->layer;
c->layer = layer;
}
else
c->layer = c->oldlayer;
client_raise(c);
client_saveprops(c); client_saveprops(c);
} }
} }
@ -1200,7 +1210,7 @@ luaA_client_floating_set(lua_State *L)
{ {
client_t **c = luaA_checkudata(L, 1, "client"); client_t **c = luaA_checkudata(L, 1, "client");
bool f = luaA_checkboolean(L, 2); bool f = luaA_checkboolean(L, 2);
client_setfloating(*c, f, (*c)->layer == LAYER_FLOAT ? LAYER_TILE : LAYER_FLOAT); client_setfloating(*c, f);
return 0; return 0;
} }

View File

@ -29,6 +29,7 @@
bool client_isvisible(client_t *, int); bool client_isvisible(client_t *, int);
client_t * client_getbywin(xcb_window_t); client_t * client_getbywin(xcb_window_t);
bool client_focus(client_t *, int); bool client_focus(client_t *, int);
void client_setlayer(client_t *, layer_t);
void client_raise(client_t *); void client_raise(client_t *);
void client_ban(client_t *); void client_ban(client_t *);
void client_unban(client_t *); void client_unban(client_t *);
@ -41,7 +42,7 @@ xcb_size_hints_t *client_updatesizehints(client_t *);
void client_updatetitle(client_t *); void client_updatetitle(client_t *);
void client_saveprops(client_t *); void client_saveprops(client_t *);
void client_kill(client_t *); void client_kill(client_t *);
void client_setfloating(client_t *, bool, layer_t); void client_setfloating(client_t *, bool);
char * client_markup_parse(client_t *, const char *, ssize_t); char * client_markup_parse(client_t *, const char *, ssize_t);
void client_setborder(client_t *, int); void client_setborder(client_t *, int);

29
ewmh.c
View File

@ -389,8 +389,9 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
xcb_map_window(globalconf.connection, c->titlebar->sw->window); xcb_map_window(globalconf.connection, c->titlebar->sw->window);
c->noborder = false; c->noborder = false;
c->ismax = false; c->ismax = false;
client_setlayer(c, c->oldlayer);
client_setborder(c, c->oldborder); client_setborder(c, c->oldborder);
client_setfloating(c, c->wasfloating, c->oldlayer); client_setfloating(c, c->wasfloating);
} }
else if(set == _NET_WM_STATE_ADD) else if(set == _NET_WM_STATE_ADD)
{ {
@ -408,7 +409,9 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
c->oldborder = c->border; c->oldborder = c->border;
client_setborder(c, 0); client_setborder(c, 0);
c->noborder = true; c->noborder = true;
client_setfloating(c, true, LAYER_FULLSCREEN); c->oldlayer = c->layer;
client_setlayer(c, LAYER_FULLSCREEN);
client_setfloating(c, true);
} }
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS); widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
client_resize(c, geometry, false); client_resize(c, geometry, false);
@ -416,31 +419,31 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
else if(state == net_wm_state_above) else if(state == net_wm_state_above)
{ {
if(set == _NET_WM_STATE_REMOVE) if(set == _NET_WM_STATE_REMOVE)
c->layer = c->oldlayer; client_setlayer(c, c->oldlayer);
else if(set == _NET_WM_STATE_ADD) else if(set == _NET_WM_STATE_ADD)
{ {
c->oldlayer = c->layer; c->oldlayer = c->layer;
c->layer = LAYER_ABOVE; client_setlayer(c, LAYER_ABOVE);
} }
} }
else if(state == net_wm_state_below) else if(state == net_wm_state_below)
{ {
if(set == _NET_WM_STATE_REMOVE) if(set == _NET_WM_STATE_REMOVE)
c->layer = c->oldlayer; client_setlayer(c, c->oldlayer);
else if(set == _NET_WM_STATE_ADD) else if(set == _NET_WM_STATE_ADD)
{ {
c->oldlayer = c->layer; c->oldlayer = c->layer;
c->layer = LAYER_BELOW; client_setlayer(c, LAYER_BELOW);
} }
} }
else if(state == net_wm_state_modal) else if(state == net_wm_state_modal)
{ {
if(set == _NET_WM_STATE_REMOVE) if(set == _NET_WM_STATE_REMOVE)
c->layer = c->oldlayer; client_setlayer(c, c->oldlayer);
else if(set == _NET_WM_STATE_ADD) else if(set == _NET_WM_STATE_ADD)
{ {
c->oldlayer = c->layer; c->oldlayer = c->layer;
c->layer = LAYER_MODAL; client_setlayer(c, LAYER_MODAL);
} }
} }
else if(state == net_wm_state_hidden) else if(state == net_wm_state_hidden)
@ -485,17 +488,21 @@ ewmh_process_window_type_atom(client_t *c, xcb_atom_t state)
} }
client_setborder(c, 0); client_setborder(c, 0);
c->noborder = true; c->noborder = true;
client_setfloating(c, true, LAYER_ABOVE); client_setlayer(c, LAYER_ABOVE);
client_setfloating(c, true);
} }
else if(state == net_wm_window_type_dialog) else if(state == net_wm_window_type_dialog)
client_setfloating(c, true, LAYER_MODAL); {
client_setlayer(c, LAYER_MODAL);
client_setfloating(c, true);
}
else if(state == net_wm_window_type_desktop) else if(state == net_wm_window_type_desktop)
{ {
tag_array_t *tags = &globalconf.screens[c->screen].tags; tag_array_t *tags = &globalconf.screens[c->screen].tags;
c->noborder = true; c->noborder = true;
c->isfixed = true; c->isfixed = true;
c->skip = true; c->skip = true;
c->layer = LAYER_DESKTOP; client_setlayer(c, LAYER_DESKTOP);
for(int i = 0; i < tags->len; i++) for(int i = 0; i < tags->len; i++)
tag_client(c, tags->tab[i]); tag_client(c, tags->tab[i]);
} }