/** Initialize the Lua VM * \param xdg An xdg handle to use to get XDG basedir. */ void luaA_init(xdgHandle* xdg) { lua_State *L; static const struct luaL_reg awesome_lib[] = { { "quit", luaA_quit }, { "exec", luaA_exec }, { "spawn", luaA_spawn }, { "restart", luaA_restart }, { "add_signal", luaA_awesome_add_signal }, { "remove_signal", luaA_awesome_remove_signal }, { "emit_signal", luaA_awesome_emit_signal }, { "__index", luaA_awesome_index }, { "__newindex", luaA_awesome_newindex }, { NULL, NULL } }; L = globalconf.L = luaL_newstate(); /* Set panic function */ lua_atpanic(L, luaA_panic); /* Set error handling function */ lualib_dofunction_on_error = luaA_dofunction_on_error; luaL_openlibs(L); luaA_fixups(L); luaA_object_setup(L); /* Export awesome lib */ luaA_openlib(L, "awesome", awesome_lib, awesome_lib); /* Export root lib */ luaL_register(L, "root", awesome_root_lib); lua_pop(L, 1); /* luaL_register() leaves the table on stack */ /* Export hooks lib */ luaL_register(L, "hooks", awesome_hooks_lib); lua_pop(L, 1); /* luaL_register() leaves the table on stack */ #ifdef WITH_DBUS /* Export D-Bus lib */ luaL_register(L, "dbus", awesome_dbus_lib); lua_pop(L, 1); /* luaL_register() leaves the table on stack */ #endif /* Export keygrabber lib */ luaL_register(L, "keygrabber", awesome_keygrabber_lib); lua_pop(L, 1); /* luaL_register() leaves the table on stack */ /* Export mousegrabber lib */ luaL_register(L, "mousegrabber", awesome_mousegrabber_lib); lua_pop(L, 1); /* luaL_register() leaves the table on stack */ /* Export screen */ luaA_openlib(L, "screen", awesome_screen_methods, awesome_screen_meta); /* Export mouse */ luaA_openlib(L, "mouse", awesome_mouse_methods, awesome_mouse_meta); /* Export button */ button_class_setup(L); /* Export image */ image_class_setup(L); /* Export tag */ tag_class_setup(L); /* Export wibox */ wibox_class_setup(L); /* Export widget */ widget_class_setup(L); /* Export client */ client_class_setup(L); /* Export keys */ key_class_setup(L); /* Export timer */ timer_class_setup(L); /* init hooks */ globalconf.hooks.manage = LUA_REFNIL; globalconf.hooks.unmanage = LUA_REFNIL; globalconf.hooks.focus = LUA_REFNIL; globalconf.hooks.unfocus = LUA_REFNIL; globalconf.hooks.mouse_enter = LUA_REFNIL; globalconf.hooks.mouse_leave = LUA_REFNIL; globalconf.hooks.clients = LUA_REFNIL; globalconf.hooks.tags = LUA_REFNIL; globalconf.hooks.tagged = LUA_REFNIL; globalconf.hooks.property = LUA_REFNIL; globalconf.hooks.timer = LUA_REFNIL; globalconf.hooks.exit = LUA_REFNIL; /* add Lua search paths */ lua_getglobal(L, "package"); if (LUA_TTABLE != lua_type(L, 1)) { warn("package is not a table"); return; } lua_getfield(L, 1, "path"); if (LUA_TSTRING != lua_type(L, 2)) { warn("package.path is not a string"); lua_pop(L, 1); return; } /* add XDG_CONFIG_DIR as include path */ const char * const *xdgconfigdirs = xdgSearchableConfigDirectories(xdg); for(; *xdgconfigdirs; xdgconfigdirs++) { size_t len = a_strlen(*xdgconfigdirs); lua_pushliteral(L, ";"); lua_pushlstring(L, *xdgconfigdirs, len); lua_pushliteral(L, "/awesome/?.lua"); lua_concat(L, 3); lua_pushliteral(L, ";"); lua_pushlstring(L, *xdgconfigdirs, len); lua_pushliteral(L, "/awesome/?/init.lua"); lua_concat(L, 3); lua_concat(L, 3); /* concatenate with package.path */ } /* add Lua lib path (/usr/share/awesome/lib by default) */ lua_pushliteral(L, ";" AWESOME_LUA_LIB_PATH "/?.lua"); lua_pushliteral(L, ";" AWESOME_LUA_LIB_PATH "/?/init.lua"); lua_concat(L, 3); /* concatenate with package.path */ lua_setfield(L, 1, "path"); /* package.path = "concatenated string" */ }
void luaH_init(void) { lua_State *L; static const struct luaL_reg luakit_lib[] = { { "quit", luaH_quit }, { "add_signal", luaH_luakit_add_signal }, { "remove_signal", luaH_luakit_remove_signal }, { "emit_signal", luaH_luakit_emit_signal }, { "__index", luaH_luakit_index }, { "__newindex", luaH_luakit_newindex }, { NULL, NULL } }; /* Lua VM init */ L = globalconf.L = luaL_newstate(); /* Set panic fuction */ lua_atpanic(L, luaH_panic); /* Set error handling function */ lualib_dofunction_on_error = luaH_dofunction_on_error; luaL_openlibs(L); luaH_fixups(L); luaH_object_setup(L); /* Export luakit lib */ luaH_openlib(L, "luakit", luakit_lib, luakit_lib); /* Export widget */ widget_class_setup(L); /* add Lua search paths */ lua_getglobal(L, "package"); if(LUA_TTABLE != lua_type(L, 1)) { warn("package is not a table"); return; } lua_getfield(L, 1, "path"); if(LUA_TSTRING != lua_type(L, 2)) { warn("package.path is not a string"); lua_pop(L, 1); return; } /* compile list of package search paths */ GPtrArray *paths = g_ptr_array_new_with_free_func(g_free); #if DEVELOPMENT_PATHS /* allows for testing luakit in the project directory */ g_ptr_array_add(paths, g_strdup("./lib")); g_ptr_array_add(paths, g_strdup("./config")); #endif /* add users config dir (see: XDG_CONFIG_DIR) */ g_ptr_array_add(paths, g_strdup(globalconf.config_dir)); /* add system config dirs (see: XDG_CONFIG_DIRS) */ const gchar* const *config_dirs = g_get_system_config_dirs(); for (; *config_dirs; config_dirs++) g_ptr_array_add(paths, g_build_filename(*config_dirs, "luakit", NULL)); /* add luakit install path */ g_ptr_array_add(paths, g_build_filename(LUAKIT_INSTALL_PATH, "lib", NULL)); for (gpointer *path = paths->pdata; *path; path++) { lua_pushliteral(L, ";"); lua_pushstring(L, *path); lua_pushliteral(L, "/?.lua"); lua_concat(L, 3); lua_pushliteral(L, ";"); lua_pushstring(L, *path); lua_pushliteral(L, "/?/init.lua"); lua_concat(L, 3); /* concat with package.path */ lua_concat(L, 3); } g_ptr_array_free(paths, TRUE); /* package.path = "concatenated string" */ lua_setfield(L, 1, "path"); }