/** Record that the given drawable contains the pointer. */ void event_drawable_under_mouse(lua_State *L, int ud) { void *d; lua_pushvalue(L, ud); d = luaA_object_ref(L, -1); if (d == globalconf.drawable_under_mouse) { /* Nothing to do */ luaA_object_unref(L, d); return; } if (globalconf.drawable_under_mouse != NULL) { /* Emit leave on previous drawable */ luaA_object_push(L, globalconf.drawable_under_mouse); luaA_object_emit_signal(L, -1, "mouse::leave", 0); lua_pop(L, 1); /* Unref the previous drawable */ luaA_object_unref(L, globalconf.drawable_under_mouse); globalconf.drawable_under_mouse = NULL; } if (d != NULL) { /* Reference the drawable for leave event later */ globalconf.drawable_under_mouse = d; /* Emit enter */ luaA_object_emit_signal(L, ud, "mouse::enter", 0); } }
/** Convert a Lua table to a list of widget nodes. * \param L The Lua VM state. * \param widgets The linked list of widget node. */ static void luaA_table2widgets(lua_State *L, widget_node_array_t *widgets) { if(lua_istable(L, -1)) { lua_pushnil(L); while(luaA_next(L, -2)) luaA_table2widgets(L, widgets); /* remove the table */ lua_pop(L, 1); } else { widget_t *widget = luaA_toudata(L, -1, &widget_class); if(widget) { widget_node_t w; p_clear(&w, 1); w.widget = luaA_object_ref(L, -1); widget_node_array_append(widgets, w); } else lua_pop(L, 1); /* remove value */ } }
/** Get or set global mouse bindings. * This binding will be available when you'll click on root window. * \param L The Lua VM state. * \return The number of element pushed on stack. * \luastack * \lparam An array of mouse button bindings objects, or nothing. * \lreturn The array of mouse button bindings objects. */ static int luaA_root_buttons(lua_State *L) { if(lua_gettop(L) == 1) { luaA_checktable(L, 1); foreach(button, globalconf.buttons) luaA_object_unref(globalconf.L, *button); button_array_wipe(&globalconf.buttons); button_array_init(&globalconf.buttons); lua_pushnil(L); while(lua_next(L, 1)) button_array_append(&globalconf.buttons, luaA_object_ref(L, -1)); return 1; } lua_createtable(L, globalconf.buttons.len, 0); for(int i = 0; i < globalconf.buttons.len; i++) { luaA_object_push(L, globalconf.buttons.tab[i]); lua_rawseti(L, -2, i + 1); } return 1; }
/** Add a global signal. * \param L The Lua VM state. * \return The number of elements pushed on stack. * \luastack * \lparam A string with the event name. * \lparam The function to call. */ static int luaA_awesome_add_signal(lua_State *L) { const char *name = luaL_checkstring(L, 1); luaA_checkfunction(L, 2); signal_add(&global_signals, name, luaA_object_ref(L, 2)); return 0; }
static screen_t * screen_add(lua_State *L, screen_array_t *screens) { screen_t *new_screen = screen_new(L); luaA_object_ref(L, -1); screen_array_append(screens, new_screen); return new_screen; }
static int luaA_timer_again(lua_State *L) { atimer_t *timer = luaA_checkudata(L, 1, &timer_class); if (timer->started) g_source_remove(timer->source_id); else luaA_object_ref(L, 1); timer->started = true; timer->source_id = g_timeout_add(timer->timeout * 1000, timer_emit_signal, timer); return 0; }
static int luaA_timer_start(lua_State *L) { atimer_t *timer = luaA_checkudata(L, 1, &timer_class); if(timer->started) luaA_warn(L, "timer already started"); else { luaA_object_ref(L, 1); timer->started = true; timer->source_id = g_timeout_add(timer->timeout * 1000, timer_emit_signal, timer); } return 0; }