Add awesome.load_image()
This uses imlib2 for loading the image and thus supports more image formats than just PNG. Almost fixes: FS#958 Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
c6e92081e2
commit
9451fec6f1
|
@ -144,6 +144,7 @@ pkg_check_modules(AWESOME_REQUIRED REQUIRED
|
||||||
cairo-xcb
|
cairo-xcb
|
||||||
libstartup-notification-1.0>=0.10
|
libstartup-notification-1.0>=0.10
|
||||||
xproto>=7.0.15
|
xproto>=7.0.15
|
||||||
|
imlib2
|
||||||
libxdg-basedir>=1.0.0)
|
libxdg-basedir>=1.0.0)
|
||||||
|
|
||||||
if(NOT AWESOME_REQUIRED_FOUND OR NOT AWESOME_COMMON_REQUIRED_FOUND)
|
if(NOT AWESOME_REQUIRED_FOUND OR NOT AWESOME_COMMON_REQUIRED_FOUND)
|
||||||
|
|
67
draw.c
67
draw.c
|
@ -29,6 +29,8 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <Imlib2.h>
|
||||||
|
|
||||||
#include "globalconf.h"
|
#include "globalconf.h"
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
|
|
||||||
|
@ -160,4 +162,69 @@ draw_dup_image_surface(cairo_surface_t *surface)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
image_imlib_load_strerror(Imlib_Load_Error e)
|
||||||
|
{
|
||||||
|
switch(e)
|
||||||
|
{
|
||||||
|
case IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST:
|
||||||
|
return "no such file or directory";
|
||||||
|
case IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY:
|
||||||
|
return "file is a directory";
|
||||||
|
case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ:
|
||||||
|
return "read permission denied";
|
||||||
|
case IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT:
|
||||||
|
return "no loader for file format";
|
||||||
|
case IMLIB_LOAD_ERROR_PATH_TOO_LONG:
|
||||||
|
return "path too long";
|
||||||
|
case IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT:
|
||||||
|
return "path component non existent";
|
||||||
|
case IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY:
|
||||||
|
return "path component not a directory";
|
||||||
|
case IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE:
|
||||||
|
return "path points outside address space";
|
||||||
|
case IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS:
|
||||||
|
return "too many symbolic links";
|
||||||
|
case IMLIB_LOAD_ERROR_OUT_OF_MEMORY:
|
||||||
|
return "out of memory";
|
||||||
|
case IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS:
|
||||||
|
return "out of file descriptors";
|
||||||
|
case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE:
|
||||||
|
return "write permission denied";
|
||||||
|
case IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE:
|
||||||
|
return "out of disk space";
|
||||||
|
case IMLIB_LOAD_ERROR_UNKNOWN:
|
||||||
|
return "unknown error, that's really bad";
|
||||||
|
case IMLIB_LOAD_ERROR_NONE:
|
||||||
|
return "no error, oops";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "unknown error";
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load the specified path into a cairo surface
|
||||||
|
* \param L Lua state
|
||||||
|
* \param path file to load
|
||||||
|
* \return A cairo image surface or NULL on error.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
draw_load_image(lua_State *L, const char *path)
|
||||||
|
{
|
||||||
|
Imlib_Image imimage;
|
||||||
|
Imlib_Load_Error e = IMLIB_LOAD_ERROR_NONE;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
imimage = imlib_load_image_with_error_return(path, &e);
|
||||||
|
if (!imimage) {
|
||||||
|
luaL_error(L, "Cannot load image '%s': %s", path, image_imlib_load_strerror(e));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
imlib_context_set_image(imimage);
|
||||||
|
ret = luaA_surface_from_data(L, imlib_image_get_width(),
|
||||||
|
imlib_image_get_height(), imlib_image_get_data_for_reading_only());
|
||||||
|
imlib_free_image_and_decache();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
||||||
|
|
1
draw.h
1
draw.h
|
@ -67,6 +67,7 @@ a_iso2utf8(const char *str, ssize_t len, char **dest, ssize_t *dlen)
|
||||||
|
|
||||||
int luaA_surface_from_data(lua_State *L, int width, int height, uint32_t *data);
|
int luaA_surface_from_data(lua_State *L, int width, int height, uint32_t *data);
|
||||||
cairo_surface_t *draw_dup_image_surface(cairo_surface_t *surface);
|
cairo_surface_t *draw_dup_image_surface(cairo_surface_t *surface);
|
||||||
|
int draw_load_image(lua_State *L, const char *path);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
||||||
|
|
14
luaa.c
14
luaa.c
|
@ -102,6 +102,19 @@ luaA_restart(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Load an image from a given path.
|
||||||
|
* \param L The Lua VM state.
|
||||||
|
* \return The number of elements pushed on stack.
|
||||||
|
* \luastack
|
||||||
|
* \lparam The command line to execute.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
luaA_load_image(lua_State *L)
|
||||||
|
{
|
||||||
|
const char *filename = luaL_checkstring(L, 1);
|
||||||
|
return draw_load_image(L, filename);
|
||||||
|
}
|
||||||
|
|
||||||
/** UTF-8 aware string length computing.
|
/** UTF-8 aware string length computing.
|
||||||
* \param L The Lua VM state.
|
* \param L The Lua VM state.
|
||||||
* \return The number of elements pushed on stack.
|
* \return The number of elements pushed on stack.
|
||||||
|
@ -516,6 +529,7 @@ luaA_init(xdgHandle* xdg)
|
||||||
{ "disconnect_signal", luaA_awesome_disconnect_signal },
|
{ "disconnect_signal", luaA_awesome_disconnect_signal },
|
||||||
{ "emit_signal", luaA_awesome_emit_signal },
|
{ "emit_signal", luaA_awesome_emit_signal },
|
||||||
{ "systray", luaA_systray },
|
{ "systray", luaA_systray },
|
||||||
|
{ "load_image", luaA_load_image },
|
||||||
{ "__index", luaA_awesome_index },
|
{ "__index", luaA_awesome_index },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,6 +35,12 @@ module("awesome")
|
||||||
-- @param use_sn Use startup-notification, true or false, default to true.
|
-- @param use_sn Use startup-notification, true or false, default to true.
|
||||||
-- @return Process ID if everything is OK, or an error string if an error occured.
|
-- @return Process ID if everything is OK, or an error string if an error occured.
|
||||||
|
|
||||||
|
--- Load an image
|
||||||
|
-- @param name The file name
|
||||||
|
-- @return An oocairo image surface
|
||||||
|
-- @name load_image
|
||||||
|
-- @class function
|
||||||
|
|
||||||
--- Add a global signal.
|
--- Add a global signal.
|
||||||
-- @param name A string with the event name.
|
-- @param name A string with the event name.
|
||||||
-- @param func The function to call.
|
-- @param func The function to call.
|
||||||
|
|
Loading…
Reference in New Issue