Signal config errors via a naughty popup

If loading of any config file fails, awesome will now remember the error message
and make it available to lua. The default config is modified to open a naughty
popup on errors.

This should help all those people who modify their config and then wonder why
there change is ignored, not noticing awesome's error message on stderr.

Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2011-10-23 15:59:15 +02:00
parent d8f0bd13bf
commit 2354c6a623
4 changed files with 37 additions and 2 deletions

View File

@ -339,6 +339,7 @@ main(int argc, char **argv)
p_clear(&globalconf, 1); p_clear(&globalconf, 1);
globalconf.keygrabber = LUA_REFNIL; globalconf.keygrabber = LUA_REFNIL;
globalconf.mousegrabber = LUA_REFNIL; globalconf.mousegrabber = LUA_REFNIL;
buffer_init(&globalconf.startup_errors);
/* save argv */ /* save argv */
for(i = 0; i < argc; i++) for(i = 0; i < argc; i++)

View File

@ -9,6 +9,16 @@ require("beautiful")
-- Notification library -- Notification library
require("naughty") require("naughty")
-- {{{ Error handling
-- Check if awesome encountered an error during startup and fell back to
-- another config (This code will only ever execute for the fallback config)
if awesome.startup_errors then
naughty.notify({ preset = naughty.config.presets.critical,
title = "Oops, there were errors during startup!",
text = awesome.startup_errors })
end
-- }}}
-- {{{ Variable definitions -- {{{ Variable definitions
-- Themes define colours, icons, and wallpapers -- Themes define colours, icons, and wallpapers
beautiful.init("@AWESOME_THEMES_PATH@/default/theme.lua") beautiful.init("@AWESOME_THEMES_PATH@/default/theme.lua")

View File

@ -33,6 +33,7 @@
#include "objects/key.h" #include "objects/key.h"
#include "color.h" #include "color.h"
#include "common/xembed.h" #include "common/xembed.h"
#include "common/buffer.h"
#define ROOT_WINDOW_EVENT_MASK \ #define ROOT_WINDOW_EVENT_MASK \
(const uint32_t []) { \ (const uint32_t []) { \
@ -87,6 +88,8 @@ typedef struct
client_array_t stack; client_array_t stack;
/** Lua VM state */ /** Lua VM state */
lua_State *L; lua_State *L;
/** All errors messages from loading config files */
buffer_t startup_errors;
/** The event loop */ /** The event loop */
struct ev_loop *loop; struct ev_loop *loop;
/** The key grabber function */ /** The key grabber function */

25
luaa.c
View File

@ -396,6 +396,13 @@ luaA_awesome_index(lua_State *L)
lua_pushliteral(L, AWESOME_VERSION); lua_pushliteral(L, AWESOME_VERSION);
else if(a_strcmp(buf, "release") == 0) else if(a_strcmp(buf, "release") == 0)
lua_pushliteral(L, AWESOME_RELEASE); lua_pushliteral(L, AWESOME_RELEASE);
else if(a_strcmp(buf, "startup_errors") == 0)
{
if (globalconf.startup_errors.len == 0)
return 0;
lua_pushstring(L, globalconf.startup_errors.s);
return 1;
}
else else
return 0; return 0;
@ -632,6 +639,14 @@ luaA_init(xdgHandle* xdg)
signal_add(&global_signals, "exit"); signal_add(&global_signals, "exit");
} }
static void
luaA_startup_error(const char *err)
{
if (globalconf.startup_errors.len > 0)
buffer_addsl(&globalconf.startup_errors, "\n\n");
buffer_adds(&globalconf.startup_errors, err);
}
static bool static bool
luaA_loadrc(const char *confpath, bool run) luaA_loadrc(const char *confpath, bool run)
{ {
@ -644,7 +659,9 @@ luaA_loadrc(const char *confpath, bool run)
conffile = a_strdup(confpath); conffile = a_strdup(confpath);
if(lua_pcall(globalconf.L, 0, LUA_MULTRET, 0)) if(lua_pcall(globalconf.L, 0, LUA_MULTRET, 0))
{ {
fprintf(stderr, "%s\n", lua_tostring(globalconf.L, -1)); const char *err = lua_tostring(globalconf.L, -1);
luaA_startup_error(err);
fprintf(stderr, "%s\n", err);
/* An error happened, so reset this. */ /* An error happened, so reset this. */
conffile = NULL; conffile = NULL;
} }
@ -658,7 +675,11 @@ luaA_loadrc(const char *confpath, bool run)
} }
} }
else else
fprintf(stderr, "%s\n", lua_tostring(globalconf.L, -1)); {
const char *err = lua_tostring(globalconf.L, -1);
luaA_startup_error(err);
fprintf(stderr, "%s\n", err);
}
return false; return false;
} }