root.wallpaper: Cleanup and correctness fixes

Turns out that my rant about "we can't query the pixmap's values" was wrong.
This commit makes awesome use a GetGeometry request to get the properties of the
(old) root window's back pixmap.

This also converts code to p_delete() instead of free() for consistency. Bad me
for doing multiple things in one commit...

Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2014-03-06 18:35:17 +01:00
parent 20afb26080
commit 069a8e84a2
1 changed files with 21 additions and 9 deletions

30
root.c
View File

@ -63,7 +63,7 @@ root_set_wallpaper_pixmap(xcb_connection_t *c, xcb_pixmap_t p)
if (rootpix)
xcb_kill_client(c, *rootpix);
}
free(prop_r);
p_delete(&prop_r);
}
static bool
@ -347,6 +347,8 @@ luaA_root_wallpaper(lua_State *L)
{
xcb_get_property_cookie_t prop_c;
xcb_get_property_reply_t *prop_r;
xcb_get_geometry_cookie_t geom_c;
xcb_get_geometry_reply_t *geom_r;
xcb_pixmap_t *rootpix;
cairo_surface_t *surface;
@ -364,27 +366,37 @@ luaA_root_wallpaper(lua_State *L)
if (!prop_r || !prop_r->value_len)
{
free(prop_r);
p_delete(&prop_r);
return 0;
}
rootpix = xcb_get_property_value(prop_r);
if (!rootpix)
{
free(prop_r);
p_delete(&prop_r);
return 0;
}
/* We can't query the pixmap's values (or even if that pixmap exists at
* all), so let's just assume that it uses the default visual and is as
* large as the root window. Everything else wouldn't make sense.
*/
geom_c = xcb_get_geometry_unchecked(globalconf.connection, *rootpix);
geom_r = xcb_get_geometry_reply(globalconf.connection, geom_c, NULL);
if (!geom_r)
{
p_delete(&prop_r);
return 0;
}
/* Only the default visual makes sense, so just the default depth */
if (geom_r->depth != draw_visual_depth(globalconf.screen, globalconf.default_visual->visual_id))
warn("Got a pixmap with depth %d, but the default depth is %d, continuing anyway",
geom_r->depth, draw_visual_depth(globalconf.screen, globalconf.default_visual->visual_id));
surface = cairo_xcb_surface_create(globalconf.connection, *rootpix, globalconf.default_visual,
globalconf.screen->width_in_pixels, globalconf.screen->height_in_pixels);
geom_r->width, geom_r->height);
/* lua has to make sure this surface gets destroyed */
lua_pushlightuserdata(L, surface);
free(prop_r);
p_delete(&prop_r);
p_delete(&geom_r);
return 1;
}