Merge pull request #1097 from psychon/lazy_client_geometry_update

Lazy client geometry update
This commit is contained in:
Daniel Hahler 2016-09-18 12:49:52 +02:00 committed by GitHub
commit 3e562dfa53
3 changed files with 68 additions and 57 deletions

View File

@ -35,8 +35,8 @@ void luaA_emit_refresh(void);
void drawin_refresh(void);
/* objects/client.c */
void client_refresh(void);
void client_focus_refresh(void);
void client_border_refresh(void);
/* objects/screen.c */
void screen_refresh(void);
@ -49,8 +49,7 @@ awesome_refresh(void)
banning_refresh();
stack_refresh();
drawin_refresh();
client_border_refresh();
client_focus_refresh();
client_refresh();
return xcb_flush(globalconf.connection);
}

View File

@ -757,7 +757,7 @@
static area_t titlebar_get_area(client_t *c, client_titlebar_t bar);
static drawable_t *titlebar_get_drawable(lua_State *L, client_t *c, int cl_idx, client_titlebar_t bar);
static void client_resize_do(client_t *c, area_t geometry, bool force_notice);
static void client_resize_do(client_t *c, area_t geometry);
/** Collect a client.
* \param L The Lua VM state.
@ -1128,13 +1128,66 @@ client_focus_refresh(void)
win, globalconf.timestamp);
}
void
static void
client_border_refresh(void)
{
foreach(c, globalconf.clients)
window_border_refresh((window_t *) *c);
}
static void
client_geometry_refresh(void)
{
client_ignore_enterleave_events();
foreach(_c, globalconf.clients)
{
client_t *c = *_c;
/* Compute the client window's and frame window's geometry */
area_t geometry = c->geometry;
area_t real_geometry = c->geometry;
if (!c->fullscreen)
{
real_geometry.x = c->titlebar[CLIENT_TITLEBAR_LEFT].size;
real_geometry.y = c->titlebar[CLIENT_TITLEBAR_TOP].size;
real_geometry.width -= c->titlebar[CLIENT_TITLEBAR_LEFT].size;
real_geometry.width -= c->titlebar[CLIENT_TITLEBAR_RIGHT].size;
real_geometry.height -= c->titlebar[CLIENT_TITLEBAR_TOP].size;
real_geometry.height -= c->titlebar[CLIENT_TITLEBAR_BOTTOM].size;
} else {
real_geometry.x = 0;
real_geometry.y = 0;
}
/* Is there anything to do? */
if (AREA_EQUAL(geometry, c->x11_frame_geometry)
&& AREA_EQUAL(real_geometry, c->x11_client_geometry))
continue;
xcb_configure_window(globalconf.connection, c->frame_window,
XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT,
(uint32_t[]) { geometry.x, geometry.y, geometry.width, geometry.height });
xcb_configure_window(globalconf.connection, c->window,
XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT,
(uint32_t[]) { real_geometry.x, real_geometry.y, real_geometry.width, real_geometry.height });
c->x11_frame_geometry = geometry;
c->x11_client_geometry = real_geometry;
/* ICCCM 4.2.3 says something else, but Java always needs this... */
client_send_configure(c);
}
client_restore_enterleave_events();
}
void
client_refresh(void)
{
client_geometry_refresh();
client_border_refresh();
client_focus_refresh();
}
static void
border_width_callback(client_t *c, uint16_t old_width, uint16_t new_width)
{
@ -1148,8 +1201,8 @@ border_width_callback(client_t *c, uint16_t old_width, uint16_t new_width)
&diff_x, &diff_y);
geometry.x += diff_x;
geometry.y += diff_y;
/* force_notice = true -> inform client about changes */
client_resize_do(c, geometry, true);
/* inform client about changes */
client_resize_do(c, geometry);
}
}
@ -1498,59 +1551,18 @@ client_apply_size_hints(client_t *c, area_t geometry)
}
static void
client_resize_do(client_t *c, area_t geometry, bool force_notice)
client_resize_do(client_t *c, area_t geometry)
{
lua_State *L = globalconf_get_lua_State();
bool send_notice = force_notice;
bool hide_titlebars = c->fullscreen;
bool java_is_broken = true;
screen_t *new_screen = c->screen;
if(!screen_area_in_screen(new_screen, geometry))
new_screen = screen_getbycoord(geometry.x, geometry.y);
if(c->geometry.width == geometry.width
&& c->geometry.height == geometry.height)
/* We are moving without changing the size, see ICCCM 4.2.3 */
send_notice = true;
if(java_is_broken)
/* Java strong. Java Hulk. Java make own rules! */
send_notice = true;
/* Also store geometry including border */
area_t old_geometry = c->geometry;
c->geometry = geometry;
/* Ignore all spurious enter/leave notify events */
client_ignore_enterleave_events();
/* Configure the client for its new size */
area_t real_geometry = geometry;
if (!hide_titlebars)
{
real_geometry.x = c->titlebar[CLIENT_TITLEBAR_LEFT].size;
real_geometry.y = c->titlebar[CLIENT_TITLEBAR_TOP].size;
real_geometry.width -= c->titlebar[CLIENT_TITLEBAR_LEFT].size;
real_geometry.width -= c->titlebar[CLIENT_TITLEBAR_RIGHT].size;
real_geometry.height -= c->titlebar[CLIENT_TITLEBAR_TOP].size;
real_geometry.height -= c->titlebar[CLIENT_TITLEBAR_BOTTOM].size;
} else {
real_geometry.x = 0;
real_geometry.y = 0;
}
xcb_configure_window(globalconf.connection, c->frame_window,
XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT,
(uint32_t[]) { geometry.x, geometry.y, geometry.width, geometry.height });
xcb_configure_window(globalconf.connection, c->window,
XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT,
(uint32_t[]) { real_geometry.x, real_geometry.y, real_geometry.width, real_geometry.height });
if(send_notice)
client_send_configure(c);
client_restore_enterleave_events();
luaA_object_push(L, c);
if (!AREA_EQUAL(old_geometry, geometry))
luaA_object_emit_signal(L, -1, "property::geometry", 0);
@ -1580,7 +1592,7 @@ client_resize_do(client_t *c, area_t geometry, bool force_notice)
/* Convert to global coordinates */
area.x += geometry.x;
area.y += geometry.y;
if (hide_titlebars)
if (c->fullscreen)
area.width = area.height = 0;
drawable_set_geometry(L, -1, area);
@ -1624,12 +1636,9 @@ client_resize(client_t *c, area_t geometry, bool honor_hints)
if (honor_hints)
geometry = client_apply_size_hints(c, geometry);
if(c->geometry.x != geometry.x
|| c->geometry.y != geometry.y
|| c->geometry.width != geometry.width
|| c->geometry.height != geometry.height)
if(!AREA_EQUAL(c->geometry, geometry))
{
client_resize_do(c, geometry, false);
client_resize_do(c, geometry);
return true;
}
@ -1799,7 +1808,7 @@ client_set_fullscreen(lua_State *L, int cidx, bool s)
luaA_object_emit_signal(L, abs_cidx, "request::geometry", 1);
luaA_object_emit_signal(L, abs_cidx, "property::fullscreen", 0);
/* Force a client resize, so that titlebars get shown/hidden */
client_resize_do(c, c->geometry, true);
client_resize_do(c, c->geometry);
stack_windows();
}
}
@ -2631,7 +2640,7 @@ titlebar_resize(lua_State *L, int cidx, client_t *c, client_titlebar_t bar, int
}
c->titlebar[bar].size = size;
client_resize_do(c, geometry, true);
client_resize_do(c, geometry);
luaA_object_emit_signal(L, cidx, property_name, 0);
}

View File

@ -61,6 +61,9 @@ struct client_t
char *class, *instance;
/** Window geometry */
area_t geometry;
/** Old window geometry currently configured in X11 */
area_t x11_client_geometry;
area_t x11_frame_geometry;
/** Startup ID */
char *startup_id;
/** True if the client is sticky */