/** awesome global table. * \param L The Lua VM state. * \return The number of elements pushed on stack. * \luastack * \lfield font The default font. * \lfield font_height The default font height. * \lfield conffile The configuration file which has been loaded. */ static int luaA_awesome_index(lua_State *L) { if(luaA_usemetatable(L, 1, 2)) return 1; const char *buf = luaL_checkstring(L, 2); if(A_STREQ(buf, "conffile")) { lua_pushstring(L, conffile); return 1; } if(A_STREQ(buf, "version")) { lua_pushliteral(L, AWESOME_VERSION); return 1; } if(A_STREQ(buf, "release")) { lua_pushliteral(L, AWESOME_RELEASE); return 1; } if(A_STREQ(buf, "startup_errors") && globalconf.startup_errors.len != 0) { lua_pushstring(L, globalconf.startup_errors.s); return 1; } return 0; }
/** Send fake events. Usually the current focused client will get it. * \param L The Lua VM state. * \return The number of element pushed on stack. * \luastack * \lparam The event type: key_press, key_release, button_press, button_release * or motion_notify. * \lparam The detail: in case of a key event, this is the keycode to send, in * case of a button event this is the number of the button. In case of a motion * event, this is a boolean value which if true make the coordinates relatives. * \lparam In case of a motion event, this is the X coordinate. * \lparam In case of a motion event, this is the Y coordinate. * If not specified, the current one is used. */ static int luaA_root_fake_input(lua_State *L) { if(!globalconf.have_xtest) { luaA_warn(L, "XTest extension is not available, cannot fake input."); return 0; } const char *stype = luaL_checkstring(L, 1); uint8_t type, detail; int x = 0, y = 0; if (A_STREQ(stype, "key_press")) { type = XCB_KEY_PRESS; if(lua_type(L, 2) == LUA_TSTRING) { detail = _string_to_key_code(lua_tostring(L, 2)); /* keysym */ } else { detail = luaL_checknumber(L, 2); /* keycode */ } } else if(A_STREQ(stype, "key_release")) { type = XCB_KEY_RELEASE; if(lua_type(L, 2) == LUA_TSTRING) { detail = _string_to_key_code(lua_tostring(L, 2)); /* keysym */ } else { detail = luaL_checknumber(L, 2); /* keycode */ } } else if(A_STREQ(stype, "button_press")) { type = XCB_BUTTON_PRESS; detail = luaL_checknumber(L, 2); /* button number */ } else if(A_STREQ(stype, "button_release")) { type = XCB_BUTTON_RELEASE; detail = luaL_checknumber(L, 2); /* button number */ } else if(A_STREQ(stype, "motion_notify")) { type = XCB_MOTION_NOTIFY; detail = luaA_checkboolean(L, 2); /* relative to the current position or not */ x = luaL_checknumber(L, 3); y = luaL_checknumber(L, 4); } else return 0; xcb_test_fake_input(globalconf.connection, type, detail, XCB_CURRENT_TIME, XCB_NONE, x, y, 0); return 0; }
static xproperty_t * luaA_find_xproperty(lua_State *L, int idx) { const char *name = luaL_checkstring(L, idx); foreach(prop, globalconf.xproperties) if (A_STREQ(prop->name, name)) return prop; luaL_argerror(L, idx, "Unknown xproperty"); return NULL; }
/** awesome global table. * \param L The Lua VM state. * \return The number of elements pushed on stack. * \luastack * \lfield conffile The configuration file which has been loaded. * \lfield version The version of awesome. * \lfield release The release name of awesome. * \lfield startup True if we are still in startup, false otherwise. * \lfield startup_errors Error message for errors that occured during startup. * \lfield composite_manager_running True if a composite manager is running. */ static int luaA_awesome_index(lua_State *L) { if(luaA_usemetatable(L, 1, 2)) return 1; const char *buf = luaL_checkstring(L, 2); if(A_STREQ(buf, "conffile")) { lua_pushstring(L, conffile); return 1; } if(A_STREQ(buf, "version")) { lua_pushstring(L, awesome_version_string()); return 1; } if(A_STREQ(buf, "release")) { lua_pushstring(L, awesome_release_string()); return 1; } if(A_STREQ(buf, "startup")) { lua_pushboolean(L, globalconf.loop == NULL); return 1; } if(A_STREQ(buf, "startup_errors")) { if (globalconf.startup_errors.len == 0) return 0; lua_pushstring(L, globalconf.startup_errors.s); return 1; } if(A_STREQ(buf, "composite_manager_running")) { lua_pushboolean(L, composite_manager_running()); return 1; } return luaA_default_index(L); }
/** Set the window type. * \param L The Lua VM state. * \param window The window object. * \return The number of elements pushed on stack. */ int luaA_window_set_type(lua_State *L, window_t *w) { window_type_t type; const char *buf = luaL_checkstring(L, -1); if (A_STREQ(buf, "desktop")) type = WINDOW_TYPE_DESKTOP; else if(A_STREQ(buf, "dock")) type = WINDOW_TYPE_DOCK; else if(A_STREQ(buf, "splash")) type = WINDOW_TYPE_SPLASH; else if(A_STREQ(buf, "dialog")) type = WINDOW_TYPE_DIALOG; else if(A_STREQ(buf, "menu")) type = WINDOW_TYPE_MENU; else if(A_STREQ(buf, "toolbar")) type = WINDOW_TYPE_TOOLBAR; else if(A_STREQ(buf, "utility")) type = WINDOW_TYPE_UTILITY; else if(A_STREQ(buf, "dropdown_menu")) type = WINDOW_TYPE_DROPDOWN_MENU; else if(A_STREQ(buf, "popup_menu")) type = WINDOW_TYPE_POPUP_MENU; else if(A_STREQ(buf, "tooltip")) type = WINDOW_TYPE_TOOLTIP; else if(A_STREQ(buf, "notification")) type = WINDOW_TYPE_NOTIFICATION; else if(A_STREQ(buf, "combo")) type = WINDOW_TYPE_COMBO; else if(A_STREQ(buf, "dnd")) type = WINDOW_TYPE_DND; else if(A_STREQ(buf, "normal")) type = WINDOW_TYPE_NORMAL; else { warn("Unknown window type '%s'", buf); return 0; } if(w->type != type) { w->type = type; if(w->window != XCB_WINDOW_NONE) ewmh_update_window_type(w->window, window_translate_type(w->type)); luaA_object_emit_signal(globalconf.L, -3, "property::type", 0); } return 0; }