From da4b542ae6938e2747a2c8573d41e063cabb93ed Mon Sep 17 00:00:00 2001 From: Brenden Matthews Date: Tue, 28 Jul 2009 12:38:43 -0600 Subject: [PATCH] Added some Lua API stuff. Added conky_set_update_interval() API call, which allows you to change Conky's update interval from a Lua script. Added the 'conky_info' table to global Lua context, which still needs populating with stuff (right now it only contains the current update interval and the system uptime). --- doc/lua.xml | 334 +++++++++++++++++++++++++++++----------------------- src/conky.c | 21 +++- src/conky.h | 10 +- src/llua.c | 90 ++++++++++---- src/llua.h | 3 + 5 files changed, 281 insertions(+), 177 deletions(-) diff --git a/doc/lua.xml b/doc/lua.xml index c4155865..2c397ef2 100644 --- a/doc/lua.xml +++ b/doc/lua.xml @@ -1,150 +1,188 @@ - - - - - - - - - This function takes a string that is evaluated as - per Conky's TEXT section, and then returns a string - with the result. - - - - - - - - - - - This table contains some information about - Conky's window. The following table describes the - values contained: - - - drawable - - - - visual - - - - display - - - - width - - - - height - - - - border_inner_margin - - - - border_outer_margin - - - - border_width - - - - text_start_x - - - - text_start_y - - - - text_width - - - - text_height - - - - NOTE: This table is only defined when X support - is enabled. - - - - - - - - - - - A string containing the build info for this - particular instance of Conky, including the version, - build date, and architecture. - - - - - - - - - - - A string containing the build date for this - particular instance of Conky. - - - - - - - - - - - A string containing the build architecture for - this particular instance of Conky. - - - - - - - - - - - A string containing the version of the current - instance of Conky. - - - - - - - - - - - A string containing the path of the current Conky - configuration file. - - + + + + + + + + + This function takes a string that is evaluated as + per Conky's TEXT section, and then returns a string + with the result. + + + + + + + + + + + + Sets Conky's update interval (in seconds) to 'number'. + + + + + + + + + + + + This table contains some information about + Conky's window. The following table describes the + values contained: + + + drawable + + + + visual + + + + display + + + + width + + + + height + + + + border_inner_margin + + + + border_outer_margin + + + + border_width + + + + text_start_x + + + + text_start_y + + + + text_width + + + + text_height + + + + NOTE: This table is only defined when X support + is enabled. + + + + + + + + + + + This table contains some information about + Conky's internal data. The following table describes the + values contained: + + + update_interval + + + + uptime + + + + + + + + + + + + + + A string containing the build info for this + particular instance of Conky, including the version, + build date, and architecture. + + + + + + + + + + + A string containing the build date for this + particular instance of Conky. + + + + + + + + + + + A string containing the build architecture for + this particular instance of Conky. + + + + + + + + + + + A string containing the version of the current + instance of Conky. + + + + + + + + + + + A string containing the path of the current Conky + configuration file. + + diff --git a/src/conky.c b/src/conky.c index f44be464..55fefb62 100644 --- a/src/conky.c +++ b/src/conky.c @@ -6136,6 +6136,12 @@ static void generate_text(void) total_updates++; } +void set_update_interval(double interval) +{ + update_interval = interval; + update_interval_old = interval; +} + static inline int get_string_width(const char *s) { #ifdef X11 @@ -7104,6 +7110,9 @@ static void update_text(void) clear_text(1); #endif /* X11 */ need_to_update = 1; +#ifdef HAVE_LUA + llua_update_info(&info, update_interval); +#endif /* HAVE_LUA */ } #ifdef HAVE_SYS_INOTIFY_H @@ -7552,6 +7561,9 @@ static void main_loop(void) } #endif /* HAVE_SYS_INOTIFY_H */ +#ifdef HAVE_LUA + llua_update_info(&info, update_interval); +#endif /* HAVE_LUA */ g_signal_pending = 0; } clean_up(NULL, NULL); @@ -7884,8 +7896,7 @@ static void set_default_configurations(void) } no_buffers = 1; - update_interval = 3.0; - update_interval_old = update_interval; + set_update_interval(3); update_interval_bat = NOBATTERY; info.music_player_interval = 1.0; stuff_in_uppercase = 0; @@ -8653,8 +8664,7 @@ static void load_config_file(const char *f) } CONF("update_interval") { if (value) { - update_interval = strtod(value, 0); - update_interval_old = update_interval; + set_update_interval(strtod(value, 0)); } else { CONF_ERR; } @@ -9298,6 +9308,9 @@ void initialisation(int argc, char **argv) { xargv = argv; X11_create_window(); #endif /* X11 */ +#ifdef HAVE_LUA + llua_setup_info(&info, update_interval); +#endif /* HAVE_LUA */ /* Set signal handlers */ act.sa_handler = signal_handler; diff --git a/src/conky.h b/src/conky.h index 3189311b..0f7bbcc8 100644 --- a/src/conky.h +++ b/src/conky.h @@ -107,10 +107,6 @@ char *strndup(const char *s, size_t n); #include "weather.h" #endif /* WEATHER */ -#ifdef HAVE_LUA -#include "llua.h" -#endif /* HAVE_LUA */ - #ifdef TCP_PORT_MONITOR #include "tcp-portmon.h" #endif @@ -309,6 +305,10 @@ struct information { short kflags; /* kernel settings, see enum KFLAG */ }; +#ifdef HAVE_LUA +#include "llua.h" +#endif /* HAVE_LUA */ + /* needed by linux.c and top.c -> outsource somewhere */ enum { /* set to true if kernel uses "long" format for /proc/stats */ @@ -374,6 +374,8 @@ enum x_initialiser_state { extern int output_methods; extern enum x_initialiser_state x_initialised; +void set_update_interval(double interval); + #define DEFAULT_TEXT_BUFFER_SIZE_S "##DEFAULT_TEXT_BUFFER_SIZE" #define NOBATTERY 0 diff --git a/src/llua.c b/src/llua.c index 442608cd..5c1468f7 100644 --- a/src/llua.c +++ b/src/llua.c @@ -63,6 +63,23 @@ static int llua_conky_parse(lua_State *L) return 1; /* number of results */ } +static int llua_conky_set_update_interval(lua_State *L) +{ + int n = lua_gettop(L); /* number of arguments */ + double value; + if (n != 1) { + lua_pushstring(L, "incorrect arguments, conky_set_update_interval(number) takes exactly 1 argument"); + lua_error(L); + } + if (!lua_isnumber(L, 1)) { + lua_pushstring(L, "incorrect argument (expecting a string)"); + lua_error(L); + } + value = lua_tonumber(L, 1); + set_update_interval(value); + return 0; /* number of results */ +} + void llua_init(void) { const char *libs = PACKAGE_LIBDIR"/lib?.so;"; @@ -102,6 +119,9 @@ void llua_init(void) lua_pushcfunction(lua_L, &llua_conky_parse); lua_setglobal(lua_L, "conky_parse"); + lua_pushcfunction(lua_L, &llua_conky_set_update_interval); + lua_setglobal(lua_L, "conky_set_update_interval"); + #if defined(X11) && defined(LUA_EXTRAS) /* register tolua++ user types */ tolua_open(lua_L); @@ -360,6 +380,12 @@ void llua_inotify_query(int wd, int mask) } #endif /* HAVE_SYS_INOTIFY_H */ +void llua_set_number(const char *key, double value) +{ + lua_pushnumber(lua_L, value); + lua_setfield(lua_L, -2, key); +} + #ifdef X11 void llua_draw_pre_hook(void) { @@ -383,12 +409,6 @@ void llua_set_draw_post_hook(const char *args) draw_post = strdup(args); } -void llua_set_long(const char *key, long value) -{ - lua_pushnumber(lua_L, value); - lua_setfield(lua_L, -2, key); -} - #ifdef LUA_EXTRAS void llua_set_userdata(const char *key, const char *type, void *value) { @@ -410,16 +430,16 @@ void llua_setup_window_table(int text_start_x, int text_start_y, int text_width, #endif /* LUA_EXTRAS */ - llua_set_long("width", window.width); - llua_set_long("height", window.height); - llua_set_long("border_inner_margin", window.border_inner_margin); - llua_set_long("border_outer_margin", window.border_outer_margin); - llua_set_long("border_width", window.border_width); + llua_set_number("width", window.width); + llua_set_number("height", window.height); + llua_set_number("border_inner_margin", window.border_inner_margin); + llua_set_number("border_outer_margin", window.border_outer_margin); + llua_set_number("border_width", window.border_width); - llua_set_long("text_start_x", text_start_x); - llua_set_long("text_start_y", text_start_y); - llua_set_long("text_width", text_width); - llua_set_long("text_height", text_height); + llua_set_number("text_start_x", text_start_x); + llua_set_number("text_start_y", text_start_y); + llua_set_number("text_width", text_width); + llua_set_number("text_height", text_height); lua_setglobal(lua_L, "conky_window"); } @@ -436,15 +456,43 @@ void llua_update_window_table(int text_start_x, int text_start_y, int text_width return; } - llua_set_long("width", window.width); - llua_set_long("height", window.height); + llua_set_number("width", window.width); + llua_set_number("height", window.height); - llua_set_long("text_start_x", text_start_x); - llua_set_long("text_start_y", text_start_y); - llua_set_long("text_width", text_width); - llua_set_long("text_height", text_height); + llua_set_number("text_start_x", text_start_x); + llua_set_number("text_start_y", text_start_y); + llua_set_number("text_width", text_width); + llua_set_number("text_height", text_height); lua_setglobal(lua_L, "conky_window"); } #endif /* X11 */ +void llua_setup_info(struct information *i, double u_interval) +{ + if (!lua_L) return; + lua_newtable(lua_L); + + llua_set_number("update_interval", u_interval); + llua_set_number("uptime", i->uptime); + + lua_setglobal(lua_L, "conky_info"); +} + +void llua_update_info(struct information *i, double u_interval) +{ + if (!lua_L) return; + + lua_getglobal(lua_L, "conky_info"); + if (lua_isnil(lua_L, -1)) { + /* window table isn't populated yet */ + lua_pop(lua_L, 1); + return; + } + + llua_set_number("update_interval", u_interval); + llua_set_number("uptime", i->uptime); + + lua_setglobal(lua_L, "conky_info"); +} + diff --git a/src/llua.h b/src/llua.h index f19da187..5d5123d5 100644 --- a/src/llua.h +++ b/src/llua.h @@ -59,4 +59,7 @@ void llua_setup_window_table(int text_start_x, int text_start_y, int text_width, void llua_update_window_table(int text_start_x, int text_start_y, int text_width, int text_height); #endif /* X11 */ +void llua_setup_info(struct information *i, double u_interval); +void llua_update_info(struct information *i, double u_interval); + #endif /* LUA_H_*/