Add root.wallpaper() for querying the wallpaper
Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
3ce52aaab2
commit
f9d7ac595c
|
@ -419,9 +419,10 @@ main(int argc, char **argv)
|
||||||
fatal("cannot open display");
|
fatal("cannot open display");
|
||||||
|
|
||||||
globalconf.screen = xcb_aux_get_screen(globalconf.connection, globalconf.default_screen);
|
globalconf.screen = xcb_aux_get_screen(globalconf.connection, globalconf.default_screen);
|
||||||
|
globalconf.default_visual = a_default_visual(globalconf.screen);
|
||||||
/* FIXME The following two assignments were swapped on purpose */
|
/* FIXME The following two assignments were swapped on purpose */
|
||||||
if(!no_argb)
|
if(!no_argb)
|
||||||
globalconf.visual = a_default_visual(globalconf.screen);
|
globalconf.visual = globalconf.default_visual;
|
||||||
if(!globalconf.visual)
|
if(!globalconf.visual)
|
||||||
globalconf.visual = a_argb_visual(globalconf.screen);
|
globalconf.visual = a_argb_visual(globalconf.screen);
|
||||||
globalconf.default_depth = a_visual_depth(globalconf.screen, globalconf.visual->visual_id);
|
globalconf.default_depth = a_visual_depth(globalconf.screen, globalconf.visual->visual_id);
|
||||||
|
|
|
@ -119,8 +119,10 @@ typedef struct
|
||||||
} systray;
|
} systray;
|
||||||
/** The monitor of startup notifications */
|
/** The monitor of startup notifications */
|
||||||
SnMonitorContext *snmonitor;
|
SnMonitorContext *snmonitor;
|
||||||
/** The default visual, used to draw */
|
/** The visual, used to draw */
|
||||||
xcb_visualtype_t *visual;
|
xcb_visualtype_t *visual;
|
||||||
|
/** The screen's default visual */
|
||||||
|
xcb_visualtype_t *default_visual;
|
||||||
/** The screen's information */
|
/** The screen's information */
|
||||||
xcb_screen_t *screen;
|
xcb_screen_t *screen;
|
||||||
/** A graphic context. */
|
/** A graphic context. */
|
||||||
|
|
|
@ -38,3 +38,9 @@ module("root")
|
||||||
-- @return A table with all wiboxes.
|
-- @return A table with all wiboxes.
|
||||||
-- @name wiboxes
|
-- @name wiboxes
|
||||||
-- @class function
|
-- @class function
|
||||||
|
|
||||||
|
--- Get the wallpaper as a cairo surface.
|
||||||
|
-- @param -
|
||||||
|
-- @return A cairo surface or nothing.
|
||||||
|
-- @name wallpaper
|
||||||
|
-- @class function
|
||||||
|
|
39
root.c
39
root.c
|
@ -22,6 +22,7 @@
|
||||||
#include <X11/keysym.h>
|
#include <X11/keysym.h>
|
||||||
#include <X11/XF86keysym.h>
|
#include <X11/XF86keysym.h>
|
||||||
#include <xcb/xtest.h>
|
#include <xcb/xtest.h>
|
||||||
|
#include <cairo-xcb.h>
|
||||||
|
|
||||||
#include "globalconf.h"
|
#include "globalconf.h"
|
||||||
#include "objects/button.h"
|
#include "objects/button.h"
|
||||||
|
@ -249,6 +250,43 @@ luaA_root_drawins(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get the screen's wallpaper
|
||||||
|
* \param L The Lua VM state.
|
||||||
|
* \return The number of element pushed on stack.
|
||||||
|
* \luastack
|
||||||
|
* \lreturn A cairo surface for the wallpaper.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
luaA_root_wallpaper(lua_State *L)
|
||||||
|
{
|
||||||
|
xcb_get_property_cookie_t prop_c;
|
||||||
|
xcb_get_property_reply_t *prop_r;
|
||||||
|
xcb_pixmap_t *rootpix;
|
||||||
|
cairo_surface_t *surface;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
prop_c = xcb_get_property_unchecked(globalconf.connection, false,
|
||||||
|
globalconf.screen->root, _XROOTPMAP_ID, XCB_ATOM_PIXMAP, 0, 1);
|
||||||
|
prop_r = xcb_get_property_reply(globalconf.connection, prop_c, NULL);
|
||||||
|
|
||||||
|
if (!prop_r || !prop_r->value_len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
rootpix = xcb_get_property_value(prop_r);
|
||||||
|
if (!rootpix)
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
surface = cairo_xcb_surface_create(globalconf.connection, *rootpix, globalconf.default_visual,
|
||||||
|
globalconf.screen->width_in_pixels, globalconf.screen->height_in_pixels);
|
||||||
|
ret = oocairo_surface_push(globalconf.L, surface);
|
||||||
|
cairo_surface_destroy(surface);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
const struct luaL_reg awesome_root_lib[] =
|
const struct luaL_reg awesome_root_lib[] =
|
||||||
{
|
{
|
||||||
{ "buttons", luaA_root_buttons },
|
{ "buttons", luaA_root_buttons },
|
||||||
|
@ -256,6 +294,7 @@ const struct luaL_reg awesome_root_lib[] =
|
||||||
{ "cursor", luaA_root_cursor },
|
{ "cursor", luaA_root_cursor },
|
||||||
{ "fake_input", luaA_root_fake_input },
|
{ "fake_input", luaA_root_fake_input },
|
||||||
{ "drawins", luaA_root_drawins },
|
{ "drawins", luaA_root_drawins },
|
||||||
|
{ "wallpaper", luaA_root_wallpaper },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue