client: check for visibility before arranging

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-08-21 15:36:54 +02:00
parent c3d4ce3e42
commit 5449374e3d
7 changed files with 52 additions and 37 deletions

View File

@ -255,7 +255,7 @@ client_focus(client_t *c)
/* Some layouts use focused client differently, so call them back.
* And anyway, we have maybe unhidden */
globalconf.screens[c->screen].need_arrange = true;
client_need_arrange(c);
/* execute hook */
luaA_client_userdata_new(globalconf.L, globalconf.screen_focus->client_focus);
@ -623,8 +623,7 @@ client_setfloating(client_t *c, bool floating)
}
else
client_setlayer(c, c->oldlayer);
if(client_isvisible(c, c->screen))
globalconf.screens[c->screen].need_arrange = true;
client_need_arrange(c);
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
client_saveprops(c);
}
@ -928,10 +927,13 @@ client_setborder(client_t *c, int width)
xcb_configure_window(globalconf.connection, c->win,
XCB_CONFIG_WINDOW_BORDER_WIDTH, &w);
if(c->isfloating || layout_get_current(c->screen) == layout_floating)
titlebar_update_geometry_floating(c);
else
globalconf.screens[c->screen].need_arrange = true;
if(client_isvisible(c, c->screen))
{
if(c->isfloating || layout_get_current(c->screen) == layout_floating)
titlebar_update_geometry_floating(c);
else
globalconf.screens[c->screen].need_arrange = true;
}
}
/** Kill a client.
@ -960,8 +962,8 @@ luaA_client_swap(lua_State *L)
client_t **c = luaA_checkudata(L, 1, "client");
client_t **swap = luaA_checkudata(L, 2, "client");
client_list_swap(&globalconf.clients, *swap, *c);
globalconf.screens[(*c)->screen].need_arrange = true;
globalconf.screens[(*swap)->screen].need_arrange = true;
client_need_arrange(*c);
client_need_arrange(*swap);
widget_invalidate_cache((*c)->screen, WIDGET_CACHE_CLIENTS);
widget_invalidate_cache((*swap)->screen, WIDGET_CACHE_CLIENTS);
return 0;
@ -1155,9 +1157,9 @@ luaA_client_newindex(lua_State *L)
b = luaA_checkboolean(L, 3);
if(b != (*c)->ishidden)
{
client_need_arrange(*c);
(*c)->ishidden = b;
if(client_maybevisible(*c, (*c)->screen))
globalconf.screens[(*c)->screen].need_arrange = true;
client_need_arrange(*c);
}
break;
case A_TK_ICON_PATH:
@ -1181,8 +1183,7 @@ luaA_client_newindex(lua_State *L)
break;
case A_TK_HONORSIZEHINTS:
(*c)->honorsizehints = luaA_checkboolean(L, 3);
if(client_isvisible(*c, (*c)->screen))
globalconf.screens[(*c)->screen].need_arrange = true;
client_need_arrange(*c);
break;
case A_TK_BORDER_WIDTH:
client_setborder(*c, luaL_checknumber(L, 3));
@ -1211,7 +1212,7 @@ luaA_client_newindex(lua_State *L)
simplewindow_delete(&(*c)->titlebar->sw);
titlebar_unref(&(*c)->titlebar);
(*c)->titlebar = NULL;
globalconf.screens[(*c)->screen].need_arrange = true;
client_need_arrange(*c);
}
if(t)

View File

@ -26,6 +26,13 @@
#include "structs.h"
#define client_need_arrange(c) \
do { \
if(!globalconf.screens[(c)->screen].need_arrange \
&& client_isvisible(c, (c)->screen)) \
globalconf.screens[(c)->screen].need_arrange = true; \
} while(0)
bool client_maybevisible(client_t *, int);
bool client_isvisible(client_t *, int);
client_t * client_getbywin(xcb_window_t);

22
event.c
View File

@ -221,7 +221,7 @@ event_handle_configurerequest(void *data __attribute__ ((unused)),
}
else
{
globalconf.screens[c->screen].need_arrange = true;
client_need_arrange(c);
/* If we do not resize the client, at least tell it that it
* has its new configuration. That fixes at least
* gnome-terminal */
@ -531,7 +531,6 @@ event_handle_propertynotify(void *data __attribute__ ((unused)),
xcb_connection_t *connection, xcb_property_notify_event_t *ev)
{
client_t *c;
xcb_window_t trans;
xembed_window_t *emwin;
xcb_size_hints_t size_hints;
@ -543,13 +542,16 @@ event_handle_propertynotify(void *data __attribute__ ((unused)),
{
if(ev->atom == WM_TRANSIENT_FOR)
{
xcb_get_wm_transient_for_reply(connection,
xcb_get_wm_transient_for_unchecked(connection,
c->win),
&trans, NULL);
if(!c->isfloating
&& (c->isfloating = (client_getbywin(trans) != NULL)))
globalconf.screens[c->screen].need_arrange = true;
if(!c->isfloating)
{
xcb_window_t trans;
xcb_get_wm_transient_for_reply(connection,
xcb_get_wm_transient_for_unchecked(connection,
c->win),
&trans, NULL);
if(client_getbywin(trans))
client_setfloating(c, true);
}
}
else if (ev->atom == WM_NORMAL_HINTS)
client_updatesizehints(c, &size_hints);
@ -652,8 +654,8 @@ event_handle_clientmessage(void *data __attribute__ ((unused)),
&& ev->format == 32
&& ev->data.data32[0] == XCB_WM_STATE_ICONIC)
{
client_need_arrange(c);
c->ishidden = true;
globalconf.screens[c->screen].need_arrange = true;
}
}
else if(ev->type == _XEMBED)

7
ewmh.c
View File

@ -343,10 +343,15 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
else if(state == _NET_WM_STATE_HIDDEN)
{
if(set == _NET_WM_STATE_REMOVE)
{
client_need_arrange(c);
c->ishidden = false;
}
else if(set == _NET_WM_STATE_ADD)
{
client_need_arrange(c);
c->ishidden = true;
globalconf.screens[c->screen].need_arrange = true;
}
}
else if(state == _NET_WM_STATE_DEMANDS_ATTENTION)
{

View File

@ -132,6 +132,7 @@ screen_client_moveto(client_t *c, int new_screen, bool doresize)
tag_array_t *old_tags = &globalconf.screens[old_screen].tags,
*new_tags = &globalconf.screens[new_screen].tags;
area_t from, to;
bool wasvisible = client_isvisible(c, c->screen);
c->screen = new_screen;
@ -210,8 +211,9 @@ screen_client_moveto(client_t *c, int new_screen, bool doresize)
else
{
c->f_geometry = new_f_geometry;
globalconf.screens[old_screen].need_arrange = true;
globalconf.screens[c->screen].need_arrange = true;
if(wasvisible)
globalconf.screens[old_screen].need_arrange = true;
client_need_arrange(c);
}
}
}

6
tag.c
View File

@ -135,7 +135,7 @@ tag_client(client_t *c, tag_t *t)
client_array_append(&t->clients, c);
client_saveprops(c);
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
globalconf.screens[c->screen].need_arrange = true;
client_need_arrange(c);
}
/** Untag a client with specified tag.
@ -148,11 +148,11 @@ untag_client(client_t *c, tag_t *t)
for(int i = 0; i < t->clients.len; i++)
if(t->clients.tab[i] == c)
{
client_need_arrange(c);
client_array_take(&t->clients, i);
tag_unref(&t);
client_saveprops(c);
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
globalconf.screens[c->screen].need_arrange = true;
return;
}
}
@ -471,7 +471,7 @@ luaA_tag_newindex(lua_State *L)
return 0;
}
if((*tag)->screen != SCREEN_UNDEF)
if((*tag)->screen != SCREEN_UNDEF && (*tag)->selected)
globalconf.screens[(*tag)->screen].need_arrange = true;
return 0;

View File

@ -290,8 +290,7 @@ titlebar_init(client_t *c)
xcb_change_window_attributes(globalconf.connection, c->titlebar->sw->window,
XCB_CW_BORDER_PIXEL, &c->titlebar->border.color.pixel);
if(client_isvisible(c, c->screen))
globalconf.screens[c->screen].need_arrange = true;
client_need_arrange(c);
c->titlebar->need_update = true;
}
@ -388,7 +387,7 @@ luaA_titlebar_newindex(lua_State *L)
simplewindow_delete(&(*newc)->titlebar->sw);
titlebar_unref(&(*newc)->titlebar);
(*newc)->titlebar = NULL;
globalconf.screens[(*newc)->screen].need_arrange = true;
client_need_arrange(*newc);
}
/* Attach titlebar to client */
(*newc)->titlebar = *titlebar;
@ -404,7 +403,7 @@ luaA_titlebar_newindex(lua_State *L)
/* unref and NULL the ref */
titlebar_unref(&c->titlebar);
c->titlebar = NULL;
globalconf.screens[c->screen].need_arrange = true;
client_need_arrange(c);
}
}
break;
@ -463,9 +462,8 @@ luaA_titlebar_newindex(lua_State *L)
return 0;
}
if((c || (c = client_getbytitlebar(*titlebar)))
&& client_isvisible(c, c->screen))
globalconf.screens[c->screen].need_arrange = true;
if((c || (c = client_getbytitlebar(*titlebar))))
client_need_arrange(c);
return 0;
}