diff --git a/client.c b/client.c index 05e5e0f9e..680647c05 100644 --- a/client.c +++ b/client.c @@ -43,6 +43,16 @@ extern awesome_t globalconf; +int +luaA_client_userdata_new(lua_State *L, client_t *p) +{ + client_t **pp = lua_newuserdata(L, sizeof(client_t *)); + *pp = p; + return luaA_settype(L, "client"); +} + +DO_LUA_EQ(client_t, client, "client") + /** Load windows properties, restoring client's tag * and floating state before awesome was restarted if any. * \todo This may bug if number of tags is != than before. @@ -187,7 +197,7 @@ client_updatetitle(client_t *c) a_iso2utf8(name, &c->name); /* call hook */ - luaA_client_userdata_new(c); + luaA_client_userdata_new(globalconf.L, c); luaA_dofunction(globalconf.L, globalconf.hooks.titleupdate, 1); widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS); @@ -200,7 +210,7 @@ static void client_unfocus(client_t *c) { /* Call hook */ - luaA_client_userdata_new(globalconf.focus->client); + luaA_client_userdata_new(globalconf.L, globalconf.focus->client); luaA_dofunction(globalconf.L, globalconf.hooks.unfocus, 1); focus_client_push(NULL); @@ -256,7 +266,7 @@ client_focus(client_t *c, int screen) globalconf.screens[c->screen].need_arrange = true; /* execute hook */ - luaA_client_userdata_new(globalconf.focus->client); + luaA_client_userdata_new(globalconf.L, globalconf.focus->client); luaA_dofunction(globalconf.L, globalconf.hooks.focus, 1); } else @@ -403,7 +413,7 @@ client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int screen) widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS); /* call hook */ - luaA_client_userdata_new(c); + luaA_client_userdata_new(globalconf.L, c); luaA_dofunction(globalconf.L, globalconf.hooks.manage, 1); } @@ -628,7 +638,7 @@ client_unmanage(client_t *c) tag_t *tag; /* call hook */ - luaA_client_userdata_new(c); + luaA_client_userdata_new(globalconf.L, c); luaA_dofunction(globalconf.L, globalconf.hooks.unmanage, 1); /* The server grab construct avoids race conditions. */ @@ -680,7 +690,7 @@ client_updatewmhints(client_t *c) if((c->isurgent = (wm_hints_flags & XCB_WM_X_URGENCY_HINT))) { /* execute hook */ - luaA_client_userdata_new(c); + luaA_client_userdata_new(globalconf.L, c); luaA_dofunction(globalconf.L, globalconf.hooks.urgent, 1); widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS); @@ -827,7 +837,7 @@ luaA_client_get(lua_State *L) for(c = globalconf.clients; c; c = c->next) { - luaA_client_userdata_new(c); + luaA_client_userdata_new(globalconf.L, c); lua_rawseti(L, -2, i++); } @@ -886,7 +896,7 @@ luaA_client_visible_get(lua_State *L) for(c = globalconf.clients; c; c = c->next) if(!c->skip && !c->ishidden && client_isvisible(c, screen)) { - luaA_client_userdata_new(c); + luaA_client_userdata_new(globalconf.L, c); lua_rawseti(L, -2, i++); } @@ -902,7 +912,7 @@ static int luaA_client_focus_get(lua_State *L __attribute__ ((unused))) { if(globalconf.focus->client) - return luaA_client_userdata_new(globalconf.focus->client); + return luaA_client_userdata_new(globalconf.L, globalconf.focus->client); return 0; } @@ -1328,7 +1338,7 @@ luaA_client_titlebar_get(lua_State *L) client_t **c = luaA_checkudata(L, 1, "client"); if((*c)->titlebar) - return luaA_titlebar_userdata_new((*c)->titlebar); + return luaA_titlebar_userdata_new(globalconf.L, (*c)->titlebar); return 0; } @@ -1392,20 +1402,6 @@ luaA_client_ishidden(lua_State *L) return 1; } -/** Create and push a client userdata. - * \param c The client. - * \return The number of pushed value. - */ -int -luaA_client_userdata_new(client_t *c) -{ - client_t **lc = lua_newuserdata(globalconf.L, sizeof(client_t *)); - *lc = c; - return luaA_settype(globalconf.L, "client"); -} - -DO_LUA_EQ(client_t, client, "client") - const struct luaL_reg awesome_client_methods[] = { { "get", luaA_client_get }, diff --git a/client.h b/client.h index e6ed99b9c..ff304d344 100644 --- a/client.h +++ b/client.h @@ -44,7 +44,7 @@ void client_setfloating(client_t *, bool, layer_t); char * client_markup_parse(client_t *, const char *, ssize_t); void client_setborder(client_t *, int); -int luaA_client_userdata_new(client_t *); +int luaA_client_userdata_new(lua_State *, client_t *); DO_SLIST(client_t, client, p_delete) diff --git a/event.c b/event.c index 5d330d4b4..d1e8bb162 100644 --- a/event.c +++ b/event.c @@ -61,7 +61,7 @@ event_handle_mouse_button_press(client_t *c, { if(c) { - luaA_client_userdata_new(c); + luaA_client_userdata_new(globalconf.L, c); luaA_dofunction(globalconf.L, b->fct, 1); } else @@ -335,7 +335,7 @@ event_handle_enternotify(void *data __attribute__ ((unused)), globalconf.pointer_x = ev->root_x; globalconf.pointer_y = ev->root_y; - luaA_client_userdata_new(c); + luaA_client_userdata_new(globalconf.L, c); luaA_dofunction(globalconf.L, globalconf.hooks.mouseover, 1); } else if((emwin = xembed_getbywin(globalconf.embedded, ev->event))) diff --git a/ewmh.c b/ewmh.c index d2f3bceca..c28d4e0ba 100644 --- a/ewmh.c +++ b/ewmh.c @@ -470,7 +470,7 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set) { c->isurgent = true; /* execute hook */ - luaA_client_userdata_new(c); + luaA_client_userdata_new(globalconf.L, c); luaA_dofunction(globalconf.L, globalconf.hooks.urgent, 1); widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS); } diff --git a/keybinding.c b/keybinding.c index 54795dad4..97bfe0f6d 100644 --- a/keybinding.c +++ b/keybinding.c @@ -28,6 +28,9 @@ extern awesome_t globalconf; +DO_LUA_NEW(static, keybinding_t, keybinding, "keybinding", keybinding_ref) +DO_LUA_GC(keybinding_t, keybinding, "keybinding", keybinding_unref) + static void __luaA_keystore(keybinding_t *key, const char *str) { @@ -59,7 +62,7 @@ static int luaA_keybinding_new(lua_State *L) { size_t i, len; - keybinding_t *k, **keyb; + keybinding_t *k; const char *key; /* arg 1 is key mod table */ @@ -81,10 +84,7 @@ luaA_keybinding_new(lua_State *L) k->mod |= xutil_keymask_fromstr(luaL_checkstring(L, -1)); } - keyb = lua_newuserdata(globalconf.L, sizeof(client_t *)); - *keyb = k; - keybinding_ref(keyb); - return luaA_settype(L, "keybinding"); + return luaA_keybinding_userdata_new(L, k); } /** Add a global key binding. This key binding will always be available. @@ -132,8 +132,6 @@ luaA_keybinding_remove(lua_State *L) return 0; } -DO_LUA_GC(keybinding_t, keybinding, "keybinding", keybinding_unref) - /** Convert a keybinding to a printable string. * \return A string. */ diff --git a/lua.c b/lua.c index 781460746..9cdb6e57d 100644 --- a/lua.c +++ b/lua.c @@ -434,15 +434,15 @@ luaA_colors_set(lua_State *L) * \param type Its type. */ void -luaA_pushpointer(void *p, awesome_type_t type) +luaA_pushpointer(lua_State *L, void *p, awesome_type_t type) { switch(type) { case AWESOME_TYPE_STATUSBAR: - luaA_statusbar_userdata_new(p); + luaA_statusbar_userdata_new(L, p); break; case AWESOME_TYPE_TITLEBAR: - luaA_titlebar_userdata_new(p); + luaA_titlebar_userdata_new(L, p); break; } } diff --git a/lua.h b/lua.h index aeb534c79..8ff8195af 100644 --- a/lua.h +++ b/lua.h @@ -38,6 +38,16 @@ typedef enum /** Type for Lua function */ typedef int luaA_function; +#define DO_LUA_NEW(decl, type, prefix, lua_type, type_ref) \ + decl int \ + luaA_##prefix##_userdata_new(lua_State *L, type *p) \ + { \ + type **pp = lua_newuserdata(L, sizeof(type *)); \ + *pp = p; \ + type_ref(pp); \ + return luaA_settype(L, lua_type); \ + } + #define DO_LUA_GC(type, prefix, lua_type, type_unref) \ static int \ luaA_##prefix##_gc(lua_State *L) \ @@ -171,7 +181,7 @@ luaA_name_init(lua_State *L) void luaA_init(void); bool luaA_parserc(const char *); -void luaA_pushpointer(void *, awesome_type_t); +void luaA_pushpointer(lua_State *, void *, awesome_type_t); void luaA_cs_init(void); void luaA_cs_cleanup(void); void luaA_on_timer(EV_P_ ev_timer *w, int revents); diff --git a/mouse.c b/mouse.c index 2726c4c51..49ffacf81 100644 --- a/mouse.c +++ b/mouse.c @@ -41,6 +41,10 @@ extern awesome_t globalconf; +DO_LUA_NEW(static, button_t, mouse, "mouse", button_ref) +DO_LUA_GC(button_t, mouse, "mouse", button_unref) +DO_LUA_EQ(button_t, mouse, "mouse") + /** Define corners. */ typedef enum { @@ -1008,18 +1012,6 @@ luaA_mouse_screen_get(lua_State *L) return 1; } -/** Create a new mouse userdata. - * \param bt The mouse button binding. - */ -static int -luaA_mouse_userdata_new(button_t *bt) -{ - button_t **b = lua_newuserdata(globalconf.L, sizeof(button_t *)); - *b = bt; - button_ref(b); - return luaA_settype(globalconf.L, "mouse"); -} - /** Create a new mouse button bindings. * \param L The Lua VM state. * \luastack @@ -1051,12 +1043,9 @@ luaA_mouse_new(lua_State *L) button->mod |= xutil_keymask_fromstr(luaL_checkstring(L, -1)); } - return luaA_mouse_userdata_new(button); + return luaA_mouse_userdata_new(L, button); } -DO_LUA_GC(button_t, mouse, "mouse", button_unref) -DO_LUA_EQ(button_t, mouse, "mouse") - const struct luaL_reg awesome_mouse_methods[] = { { "new", luaA_mouse_new }, diff --git a/statusbar.c b/statusbar.c index 47ab01451..73c979ea4 100644 --- a/statusbar.c +++ b/statusbar.c @@ -31,6 +31,10 @@ extern awesome_t globalconf; +DO_LUA_NEW(extern, statusbar_t, statusbar, "statusbar", statusbar_ref) +DO_LUA_GC(statusbar_t, statusbar, "statusbar", statusbar_unref) +DO_LUA_EQ(statusbar_t, statusbar, "statusbar") + /** Draw a statusbar. * \param statusbar The statusbar to draw. */ @@ -523,19 +527,7 @@ luaA_statusbar_new(lua_State *L) sb->position = position_get_from_str(luaA_getopt_string(L, 1, "position", "top")); - return luaA_statusbar_userdata_new(sb); -} - -/** Create a new statusbar userdata. - * \param t The statusbar. - */ -int -luaA_statusbar_userdata_new(statusbar_t *t) -{ - statusbar_t **sb = lua_newuserdata(globalconf.L, sizeof(statusbar_t *)); - *sb = t; - statusbar_ref(sb); - return luaA_settype(globalconf.L, "statusbar"); + return luaA_statusbar_userdata_new(L, sb); } /** Get all widget from a statusbar. @@ -556,7 +548,7 @@ luaA_statusbar_widget_get(lua_State *L) for(widget = (*sb)->widgets; widget; widget = widget->next) { - luaA_widget_userdata_new(widget->widget); + luaA_widget_userdata_new(L, widget->widget); /* ref again for the list */ widget_ref(&widget->widget); lua_rawseti(L, -2, i++); @@ -565,9 +557,6 @@ luaA_statusbar_widget_get(lua_State *L) return 1; } -DO_LUA_GC(statusbar_t, statusbar, "statusbar", statusbar_unref) -DO_LUA_EQ(statusbar_t, statusbar, "statusbar") - const struct luaL_reg awesome_statusbar_methods[] = { { "new", luaA_statusbar_new }, diff --git a/statusbar.h b/statusbar.h index 580c8b348..b199ed3cb 100644 --- a/statusbar.h +++ b/statusbar.h @@ -37,7 +37,7 @@ statusbar_delete(statusbar_t **statusbar) void statusbar_refresh(void); -int luaA_statusbar_userdata_new(statusbar_t *); +int luaA_statusbar_userdata_new(lua_State *, statusbar_t *); DO_RCNT(statusbar_t, statusbar, statusbar_delete) DO_SLIST(statusbar_t, statusbar, statusbar_delete) diff --git a/tag.c b/tag.c index 719434910..99d6f3be7 100644 --- a/tag.c +++ b/tag.c @@ -38,6 +38,10 @@ extern awesome_t globalconf; +DO_LUA_NEW(extern, tag_t, tag, "tag", tag_ref) +DO_LUA_GC(tag_t, tag, "tag", tag_unref) +DO_LUA_EQ(tag_t, tag, "tag") + /** View or unview a tag. * \param tag the tag * \param view set visible or not @@ -296,7 +300,7 @@ luaA_tag_get(lua_State *L) for(tag = globalconf.screens[screen].tags; tag; tag = tag->next) { - luaA_tag_userdata_new(tag); + luaA_tag_userdata_new(L, tag); lua_setfield(L, -2, tag->name); } @@ -323,7 +327,7 @@ luaA_tag_geti(lua_State *L) for(tag = globalconf.screens[screen].tags; tag; tag = tag->next) { - luaA_tag_userdata_new(tag); + luaA_tag_userdata_new(L, tag); lua_rawseti(L, -2, i++); } @@ -361,7 +365,7 @@ luaA_tag_new(lua_State *L) layout, mwfact, nmaster, ncol); - return luaA_tag_userdata_new(tag); + return luaA_tag_userdata_new(L, tag); } /** Add or remove a tag from the current view. @@ -589,22 +593,6 @@ luaA_tag_layout_set(lua_State *L) } -/** Create a new userdata from a tag. - * \param t The tag. - * \return The luaA_settype returnn value. - */ -int -luaA_tag_userdata_new(tag_t *t) -{ - tag_t **lt = lua_newuserdata(globalconf.L, sizeof(tag_t *)); - *lt = t; - tag_ref(lt); - return luaA_settype(globalconf.L, "tag"); -} - -DO_LUA_GC(tag_t, tag, "tag", tag_unref) -DO_LUA_EQ(tag_t, tag, "tag") - const struct luaL_reg awesome_tag_methods[] = { { "new", luaA_tag_new }, diff --git a/tag.h b/tag.h index cde5759dc..0f6bd8cc2 100644 --- a/tag.h +++ b/tag.h @@ -45,7 +45,7 @@ bool is_client_tagged(client_t *, tag_t *); void tag_client_with_current_selected(client_t *); void tag_view_only_byindex(int, int); void tag_append_to_screen(tag_t *, int); -int luaA_tag_userdata_new(tag_t *); +int luaA_tag_userdata_new(lua_State *, tag_t *); DO_RCNT(tag_t, tag, tag_delete) DO_SLIST(tag_t, tag, tag_delete) diff --git a/titlebar.c b/titlebar.c index f8c2f10a9..730774a4c 100644 --- a/titlebar.c +++ b/titlebar.c @@ -32,6 +32,10 @@ extern awesome_t globalconf; +DO_LUA_NEW(extern, titlebar_t, titlebar, "titlebar", titlebar_ref) +DO_LUA_GC(titlebar_t, titlebar, "titlebar", titlebar_unref) +DO_LUA_EQ(titlebar_t, titlebar, "titlebar") + /** Get a client by its titlebar. * \param titlebar The titlebar. * \return A client. @@ -327,7 +331,7 @@ luaA_titlebar_new(lua_State *L) tb->border.width = luaA_getopt_number(L, 1, "border_width", 0); - return luaA_titlebar_userdata_new(tb); + return luaA_titlebar_userdata_new(globalconf.L, tb); } /** Add a widget to a titlebar. @@ -382,7 +386,7 @@ luaA_titlebar_widget_get(lua_State *L) for(witer = (*tb)->widgets; witer; witer = witer->next) { - luaA_widget_userdata_new(witer->widget); + luaA_widget_userdata_new(L, witer->widget); lua_setfield(L, -2, witer->widget->name); } @@ -404,7 +408,7 @@ luaA_titlebar_client_get(lua_State *L) client_t *c; if((c = client_getbytitlebar(*titlebar))) - return luaA_client_userdata_new(c); + return luaA_client_userdata_new(L, c); return 0; } @@ -481,19 +485,6 @@ luaA_titlebar_border_set(lua_State *L) return 0; } -/** Create a new titlebar userdata. - * \param t The titlebar. - * \return The number of value pushed. - */ -int -luaA_titlebar_userdata_new(titlebar_t *t) -{ - titlebar_t **tb = lua_newuserdata(globalconf.L, sizeof(titlebar_t *)); - *tb = t; - titlebar_ref(tb); - return luaA_settype(globalconf.L, "titlebar"); -} - /** Convert a titlebar to a printable string. * \param L The Lua VM state. * \return The number of value pushed. @@ -510,9 +501,6 @@ luaA_titlebar_tostring(lua_State *L) return 1; } -DO_LUA_GC(titlebar_t, titlebar, "titlebar", titlebar_unref) -DO_LUA_EQ(titlebar_t, titlebar, "titlebar") - const struct luaL_reg awesome_titlebar_methods[] = { { "new", luaA_titlebar_new }, diff --git a/titlebar.h b/titlebar.h index b1ea0d56f..106b64937 100644 --- a/titlebar.h +++ b/titlebar.h @@ -30,7 +30,7 @@ void titlebar_geometry_compute(client_t *, area_t, area_t *); void titlebar_draw(client_t *); void titlebar_init(client_t *); -int luaA_titlebar_userdata_new(titlebar_t *); +int luaA_titlebar_userdata_new(lua_State *, titlebar_t *); /** Add the titlebar geometry to a geometry. * \param t The titlebar diff --git a/widget.c b/widget.c index 547e30071..37daf3c6e 100644 --- a/widget.c +++ b/widget.c @@ -34,6 +34,10 @@ extern awesome_t globalconf; +DO_LUA_NEW(extern, widget_t, widget, "widget", widget_ref) +DO_LUA_GC(widget_t, widget, "widget", widget_unref) +DO_LUA_EQ(widget_t, widget, "widget") + #include "widgetgen.h" /** Compute offset for drawing the first pixel of a widget. @@ -94,7 +98,7 @@ widget_common_button_press(widget_node_t *w, for(b = w->widget->buttons; b; b = b->next) if(ev->detail == b->button && CLEANMASK(ev->state) == b->mod && b->fct) { - luaA_pushpointer(p, type); + luaA_pushpointer(globalconf.L, p, type); luaA_dofunction(globalconf.L, b->fct, 1); } } @@ -291,19 +295,6 @@ widget_invalidate_bywidget(widget_t *widget) titlebar_draw(c); } -/** Create a new widget userdata. The object is pushed on the stack. - * \param widget The widget. - * \return Return luaA_settype() return value. - */ -int -luaA_widget_userdata_new(widget_t *widget) -{ - widget_t **w = lua_newuserdata(globalconf.L, sizeof(widget_t *)); - *w = widget; - widget_ref(w); - return luaA_settype(globalconf.L, "widget"); -} - /** Create a new widget. * \param L The Lua VM state. * @@ -337,7 +328,7 @@ luaA_widget_new(lua_State *L) w->name = luaA_name_init(L); - return luaA_widget_userdata_new(w); + return luaA_widget_userdata_new(L, w); } /** Add a mouse button bindings to a widget. @@ -517,9 +508,6 @@ luaA_widget_visible_get(lua_State *L) return 1; } -DO_LUA_GC(widget_t, widget, "widget", widget_unref) -DO_LUA_EQ(widget_t, widget, "widget") - const struct luaL_reg awesome_widget_methods[] = { { "new", luaA_widget_new }, diff --git a/widget.h b/widget.h index 3040aa19f..27108a40e 100644 --- a/widget.h +++ b/widget.h @@ -37,7 +37,7 @@ widget_t * widget_getbyname(const char *); void widget_tell_managestatus(widget_t *, widget_tell_status_t, const char *); void widget_render(widget_node_t *, draw_context_t *, xcb_gcontext_t, xcb_drawable_t, int, position_t, int, int, void *); -int luaA_widget_userdata_new(widget_t *); +int luaA_widget_userdata_new(lua_State *, widget_t *); widget_constructor_t taglist_new; widget_constructor_t textbox_new; diff --git a/widgets/taglist.c b/widgets/taglist.c index 209439633..60988eaa3 100644 --- a/widgets/taglist.c +++ b/widgets/taglist.c @@ -231,8 +231,8 @@ taglist_button_press(widget_node_t *w, && ev->event_x < AREA_RIGHT(*area) && (data->show_empty || tag->selected || tag_isoccupied(tag)) ) { - luaA_pushpointer(object, type); - luaA_tag_userdata_new(tag); + luaA_pushpointer(globalconf.L, object, type); + luaA_tag_userdata_new(globalconf.L, tag); luaA_dofunction(globalconf.L, b->fct, 2); return; } diff --git a/widgets/tasklist.c b/widgets/tasklist.c index 845f138b1..2d774e4cf 100644 --- a/widgets/tasklist.c +++ b/widgets/tasklist.c @@ -228,8 +228,8 @@ tasklist_button_press(widget_node_t *w, for(b = w->widget->buttons; b; b = b->next) if(ev->detail == b->button && CLEANMASK(ev->state) == b->mod && b->fct) { - luaA_pushpointer(object, type); - luaA_client_userdata_new(c); + luaA_pushpointer(globalconf.L, object, type); + luaA_client_userdata_new(globalconf.L, c); luaA_dofunction(globalconf.L, b->fct, 2); } }