luaclass: register class in an array
That should permit class identification. Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
c1d99f0960
commit
706d545076
|
@ -22,6 +22,53 @@
|
||||||
#include "common/luaclass.h"
|
#include "common/luaclass.h"
|
||||||
#include "common/luaobject.h"
|
#include "common/luaobject.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int id;
|
||||||
|
lua_class_t *class;
|
||||||
|
} lua_class_id_t;
|
||||||
|
|
||||||
|
DO_ARRAY(lua_class_id_t, lua_class_id, DO_NOTHING)
|
||||||
|
|
||||||
|
static lua_class_id_array_t luaA_classes;
|
||||||
|
|
||||||
|
void
|
||||||
|
luaA_openlib(lua_State *L, const char *name,
|
||||||
|
const struct luaL_reg methods[],
|
||||||
|
const struct luaL_reg meta[])
|
||||||
|
{
|
||||||
|
luaL_newmetatable(L, name); /* 1 */
|
||||||
|
lua_pushvalue(L, -1); /* dup metatable 2 */
|
||||||
|
lua_setfield(L, -2, "__index"); /* metatable.__index = metatable 1 */
|
||||||
|
|
||||||
|
luaL_register(L, NULL, meta); /* 1 */
|
||||||
|
luaL_register(L, name, methods); /* 2 */
|
||||||
|
lua_pushvalue(L, -1); /* dup self as metatable 3 */
|
||||||
|
lua_setmetatable(L, -2); /* set self as metatable 2 */
|
||||||
|
lua_pop(L, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
luaA_class_setup(lua_State *L, lua_class_t *class,
|
||||||
|
const char *name,
|
||||||
|
lua_class_allocator_t allocator,
|
||||||
|
const struct luaL_reg methods[],
|
||||||
|
const struct luaL_reg meta[])
|
||||||
|
{
|
||||||
|
static int class_type_counter = LUA_TTHREAD + 1;
|
||||||
|
|
||||||
|
luaA_openlib(L, name, methods, meta);
|
||||||
|
|
||||||
|
class->allocator = allocator;
|
||||||
|
class->name = name;
|
||||||
|
|
||||||
|
lua_class_id_array_append(&luaA_classes, (lua_class_id_t)
|
||||||
|
{
|
||||||
|
.id = ++class_type_counter,
|
||||||
|
.class = class,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
luaA_class_add_signal(lua_State *L, lua_class_t *lua_class,
|
luaA_class_add_signal(lua_State *L, lua_class_t *lua_class,
|
||||||
const char *name, int ud)
|
const char *name, int ud)
|
||||||
|
|
|
@ -24,15 +24,36 @@
|
||||||
|
|
||||||
#include "common/signal.h"
|
#include "common/signal.h"
|
||||||
|
|
||||||
|
#define LUA_OBJECT_HEADER \
|
||||||
|
signal_array_t signals;
|
||||||
|
|
||||||
|
/** Generic type for all objects.
|
||||||
|
* All Lua objects can be casted to this type.
|
||||||
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
LUA_OBJECT_HEADER
|
||||||
|
} lua_object_t;
|
||||||
|
|
||||||
|
typedef lua_object_t *(*lua_class_allocator_t)(lua_State *);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Class name */
|
||||||
|
const char *name;
|
||||||
signal_array_t signals;
|
signal_array_t signals;
|
||||||
|
/** Allocator for creating new objects of that class */
|
||||||
|
lua_class_allocator_t allocator;
|
||||||
} lua_class_t;
|
} lua_class_t;
|
||||||
|
|
||||||
void luaA_class_add_signal(lua_State *, lua_class_t *, const char *, int);
|
void luaA_class_add_signal(lua_State *, lua_class_t *, const char *, int);
|
||||||
void luaA_class_remove_signal(lua_State *, lua_class_t *, const char *, int);
|
void luaA_class_remove_signal(lua_State *, lua_class_t *, const char *, int);
|
||||||
void luaA_class_emit_signal(lua_State *, lua_class_t *, const char *, int);
|
void luaA_class_emit_signal(lua_State *, lua_class_t *, const char *, int);
|
||||||
|
|
||||||
|
void luaA_openlib(lua_State *, const char *, const struct luaL_reg[], const struct luaL_reg[]);
|
||||||
|
void luaA_class_setup(lua_State *, lua_class_t *, const char *, lua_class_allocator_t,
|
||||||
|
const struct luaL_reg[], const struct luaL_reg[]);
|
||||||
|
|
||||||
#define LUA_CLASS_FUNCS(prefix, lua_class) \
|
#define LUA_CLASS_FUNCS(prefix, lua_class) \
|
||||||
static inline int \
|
static inline int \
|
||||||
luaA_##prefix##_class_add_signal(lua_State *L) \
|
luaA_##prefix##_class_add_signal(lua_State *L) \
|
||||||
|
|
|
@ -149,17 +149,6 @@ int luaA_object_add_signal_simple(lua_State *);
|
||||||
int luaA_object_remove_signal_simple(lua_State *);
|
int luaA_object_remove_signal_simple(lua_State *);
|
||||||
int luaA_object_emit_signal_simple(lua_State *);
|
int luaA_object_emit_signal_simple(lua_State *);
|
||||||
|
|
||||||
#define LUA_OBJECT_HEADER \
|
|
||||||
signal_array_t signals;
|
|
||||||
|
|
||||||
/** Generic type for all objects.
|
|
||||||
* All Lua objects can be casted to this type.
|
|
||||||
*/
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
LUA_OBJECT_HEADER
|
|
||||||
} lua_object_t;
|
|
||||||
|
|
||||||
#define LUA_OBJECT_FUNCS(lua_class, type, prefix, lua_type) \
|
#define LUA_OBJECT_FUNCS(lua_class, type, prefix, lua_type) \
|
||||||
LUA_CLASS_FUNCS(prefix, lua_class) \
|
LUA_CLASS_FUNCS(prefix, lua_class) \
|
||||||
static inline type * \
|
static inline type * \
|
||||||
|
|
37
luaa.c
37
luaa.c
|
@ -108,22 +108,6 @@ luaA_restart(lua_State *L __attribute__ ((unused)))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
luaA_openlib(lua_State *L, const char *name,
|
|
||||||
const struct luaL_reg methods[],
|
|
||||||
const struct luaL_reg meta[])
|
|
||||||
{
|
|
||||||
luaL_newmetatable(L, name); /* 1 */
|
|
||||||
lua_pushvalue(L, -1); /* dup metatable 2 */
|
|
||||||
lua_setfield(L, -2, "__index"); /* metatable.__index = metatable 1 */
|
|
||||||
|
|
||||||
luaL_register(L, NULL, meta); /* 1 */
|
|
||||||
luaL_register(L, name, methods); /* 2 */
|
|
||||||
lua_pushvalue(L, -1); /* dup self as metatable 3 */
|
|
||||||
lua_setmetatable(L, -2); /* set self as metatable 2 */
|
|
||||||
lua_pop(L, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** UTF-8 aware string length computing.
|
/** UTF-8 aware string length computing.
|
||||||
* \param L The Lua VM state.
|
* \param L The Lua VM state.
|
||||||
* \return The number of elements pushed on stack.
|
* \return The number of elements pushed on stack.
|
||||||
|
@ -709,25 +693,32 @@ luaA_init(xdgHandle* xdg)
|
||||||
luaA_openlib(L, "mouse", awesome_mouse_methods, awesome_mouse_meta);
|
luaA_openlib(L, "mouse", awesome_mouse_methods, awesome_mouse_meta);
|
||||||
|
|
||||||
/* Export button */
|
/* Export button */
|
||||||
luaA_openlib(L, "button", awesome_button_methods, awesome_button_meta);
|
luaA_class_setup(L, &button_class, "button", (lua_class_allocator_t) button_new,
|
||||||
|
awesome_button_methods, awesome_button_meta);
|
||||||
|
|
||||||
/* Export image */
|
/* Export image */
|
||||||
luaA_openlib(L, "image", awesome_image_methods, awesome_image_meta);
|
luaA_class_setup(L, &image_class, "image", (lua_class_allocator_t) image_new,
|
||||||
|
awesome_image_methods, awesome_image_meta);
|
||||||
|
|
||||||
/* Export tag */
|
/* Export tag */
|
||||||
luaA_openlib(L, "tag", awesome_tag_methods, awesome_tag_meta);
|
luaA_class_setup(L, &tag_class, "tag", (lua_class_allocator_t) tag_new,
|
||||||
|
awesome_tag_methods, awesome_tag_meta);
|
||||||
|
|
||||||
/* Export wibox */
|
/* Export wibox */
|
||||||
luaA_openlib(L, "wibox", awesome_wibox_methods, awesome_wibox_meta);
|
luaA_class_setup(L, &wibox_class, "wibox", (lua_class_allocator_t) wibox_new,
|
||||||
|
awesome_wibox_methods, awesome_wibox_meta);
|
||||||
|
|
||||||
/* Export widget */
|
/* Export widget */
|
||||||
luaA_openlib(L, "widget", awesome_widget_methods, awesome_widget_meta);
|
luaA_class_setup(L, &widget_class, "widget", (lua_class_allocator_t) widget_new,
|
||||||
|
awesome_widget_methods, awesome_widget_meta);
|
||||||
|
|
||||||
/* Export client */
|
/* Export client */
|
||||||
luaA_openlib(L, "client", awesome_client_methods, awesome_client_meta);
|
luaA_class_setup(L, &client_class, "client", (lua_class_allocator_t) client_new,
|
||||||
|
awesome_client_methods, awesome_client_meta);
|
||||||
|
|
||||||
/* Export keys */
|
/* Export keys */
|
||||||
luaA_openlib(L, "key", awesome_key_methods, awesome_key_meta);
|
luaA_class_setup(L, &key_class, "key", (lua_class_allocator_t) key_new,
|
||||||
|
awesome_key_methods, awesome_key_meta);
|
||||||
|
|
||||||
/* init hooks */
|
/* init hooks */
|
||||||
globalconf.hooks.manage = LUA_REFNIL;
|
globalconf.hooks.manage = LUA_REFNIL;
|
||||||
|
|
Loading…
Reference in New Issue