# HG changeset patch # User Myhailo Danylenko # Date 1234179576 -7200 # Node ID 4fd19a188509abdcda6485d5121e89b05de7b82a # Parent 34b6fedde9eb8a6a9bf917c1bd20236cad4badca Separation of glib diff -r 34b6fedde9eb -r 4fd19a188509 CMakeLists.txt --- a/CMakeLists.txt Mon Feb 09 13:00:42 2009 +0200 +++ b/CMakeLists.txt Mon Feb 09 13:39:36 2009 +0200 @@ -3,11 +3,8 @@ # Define targets add_library(loudmouth MODULE util.c lm_types.c lm_proxy.c lm_ssl.c lm_connection.c lm_message.c lm_message_node.c lm_message_handler.c lm.c) -add_library(glib MODULE glib.c glib_types.c glib_main_context.c glib_source.c glib_timeout.c util.c) # Check for dependencies -find_package(ZLIB REQUIRED) - find_package(Lua51 REQUIRED) find_package(PkgConfig REQUIRED) @@ -17,6 +14,5 @@ # Set building options include_directories(SYSTEM ${LUA_INCLUDE_DIR} ${GLIB_INCLUDE_DIRS} ${LM_INCLUDE_DIRS}) target_link_libraries(loudmouth ${LUA_LIBRARIES} ${GLIB_LIBRARIES} ${LM_LIBRARIES}) -target_link_libraries(glib ${LUA_LIBRARIES} ${GLIB_LIBRARIES}) -set_target_properties(loudmouth glib PROPERTIES PREFIX "") +set_target_properties(loudmouth PROPERTIES PREFIX "") diff -r 34b6fedde9eb -r 4fd19a188509 glib.c --- a/glib.c Mon Feb 09 13:00:42 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ - -#include - -#include "glib_types.h" -#include "glib_main_context.h" -#include "glib_timeout.h" -#include "glib_source.h" - -int luaopen_glib (lua_State *L) -{ - lua_pushstring (L, LGLIB_OBJREGISTRY); - lua_newtable (L); - lua_createtable (L, 0, 1); - lua_pushstring (L, "__mode"); - lua_pushstring (L, "v"); - lua_settable (L, -3); - lua_setmetatable (L, -2); - lua_rawset (L, LUA_REGISTRYINDEX); - - lua_createtable (L, 3, 0); - lua_pushvalue (L, -1); - lua_setglobal (L, "g"); - - luaopen_glib_main_context (L); - luaopen_glib_source (L); - luaopen_glib_timeout (L); - lua_pop (L, 3); - - return 1; -} - diff -r 34b6fedde9eb -r 4fd19a188509 glib_io.c --- a/glib_io.c Mon Feb 09 13:00:42 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ - -#include -#include -#include -#include // popen, pclose, fileno - -#include "util.h" -#include "glib_types.h" - -static gchar lglib_io_buffer[128]; - -void lglib_io_callback_destroy (lglib_io_callback_t *cb) -{ - luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference); - pclose (cb->fd); - luaL_free (cb->L, cb); -} - -// data/nil -static gboolean lglib_io_callback (GIOChannel *source, GIOCondition *condition, lglib_io_callback_t *cb) -{ - gsize read = 0; - int status; - lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference); - status = g_io_channel_read_chars (source, lglib_io_buffer, 128, &read, NULL); - if (read) { - lua_pushlstring (cb->L, lglib_io_buffer, read); - } else if (status == G_IO_STATUS_EOF) { - lua_pushnil (cb->L); - } else { - return status != G_IO_STATUS_ERROR; - } - if (lua_pcall (cb->L, 1, 1, 0)) - lua_error (cb->L); - return lua_toboolean (cb->L, -1); -} - -// command function -static int lglib_io_new (lua_State *L) -{ - const char *command = luaL_checkstring (L, 1); - lglib_io_callback_t *cb; - FILE *fd; - GIOChannel *channel; - //const char *charset; - luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected"); - - fd = popen (command, "r"); - if (!fd) { - lua_pushstring (L, "Error opening pipe"); - lua_error (L); - } - channel = g_io_channel_unix_new (fileno (fd)); - //if (!g_get_charset (&charset)) - // g_io_channel_set_encoding (channel, charset, NULL); - - cb = luaL_malloc (L, sizeof (lglib_io_callback_t)); - cb->reference = luaL_ref (L, LUA_REGISTRYINDEX); - cb->L = L; - cb->fd = fd; - - g_io_add_watch_full (channel, G_PRIORITY_HIGH_IDLE, G_IO_IN, - (GSourceFunc)lglib_io_callback, cb, - (GDestroyNotify)lglib_io_callback_destroy); - return 0; -} - -static const luaL_Reg lglib_io_reg_f[] = { - { "new", lglib_io_new }, - { NULL, NULL }, -}; - -int luaopen_glib_io (lua_State *L) -{ - luaL_register (L, "g.io", lglib_io_reg_f); - return 1; -} - diff -r 34b6fedde9eb -r 4fd19a188509 glib_main_context.c --- a/glib_main_context.c Mon Feb 09 13:00:42 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,248 +0,0 @@ - -#include -#include -#include - -#include "glib_types.h" - -/// g.main_context -/// Glib main context object. Mainly useful when lua needs to -/// manage glib-based libs. - -/// g.main_context.new -/// Creates new main context object. -/// R: g main context object -static int lglib_main_context_new (lua_State *L) -{ - GMainContext *context = g_main_context_new (); - lglib_main_context_bless (L, context); - g_main_context_unref (context); - return 1; -} - -/// g.main_context.bless -/// Blesses given pointer to g main context object. -/// A: lightuserdata (C g main context object) -/// R: g main context object -static int lglib_main_context_bless_lua (lua_State *L) -{ - luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "g main context lightuserdata expected"); - lglib_main_context_bless (L, lua_touserdata (L, 1)); - return 1; -} - -/// g.main_context.default -/// Returns default main context object. -/// R: g main context object -static int lglib_main_context_default (lua_State *L) -{ - GMainContext *context = g_main_context_default (); - lglib_main_context_bless (L, context); - // XXX g_main_context_unref (context); - return 1; -} - -/// main_context:iteration -/// Performs single full iteration in blocking or non-blocking manner, -/// depending on value of argument. -/// Returns true, if some events have been handled. -/// A: boolean (optional) -/// R: boolean -static int lglib_main_context_iteration (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - int may_block = 0; - if ( lua_gettop (L) > 1 ) { - luaL_checktype (L, 2, LUA_TBOOLEAN); - may_block = lua_toboolean (L, 2); - } - lua_pushboolean (L, g_main_context_iteration (object->main_context, may_block)); - return 1; -} - -/// main_context:pending -/// Indicates, if there are present events in sources. -/// R: boolean -static int lglib_main_context_pending (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - lua_pushboolean (L, g_main_context_pending (object->main_context)); - return 1; -} - -/// main_context:find_source -/// Returns source with given id. -/// A: integer (source id) -/// R: g main context object or nil -static int lglib_main_context_find_source (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - int id = luaL_checkint (L, 2); - GSource *source = g_main_context_find_source_by_id (object->main_context, id); - if (source) { - lglib_source_bless (L, source); - // XXX g_source_unref (source) - } else - lua_pushnil (L); - return 1; -} - -/// main_context:wakeup -/// Awakes main context if it currently poll() ing. -/// XXX Seems to be threading-related routine, how lua will work in this case? -static int lglib_main_context_wakeup (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - g_main_context_wakeup (object->main_context); - return 0; -} - -/// main_context:acquire -/// Tries to own main context. -/// R: boolean (success) -static int lglib_main_context_acquire (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - lua_pushboolean (L, g_main_context_acquire (object->main_context)); - return 1; -} - -/// main_context:release -/// Disowns acquired context. -/// Note: release context as many times, as you acquired it. -static int lglib_main_context_release (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - g_main_context_release (object->main_context); - return 0; -} - -/// main_context:owner -/// Indicates if current thread is owner of context. -/// R: boolean -static int lglib_main_context_owner (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - lua_pushboolean (L, g_main_context_is_owner (object->main_context)); - return 1; -} - -/// main_context:wait -/// For now this will not be implemented, as it requires threading part of glib - -/// WARNING: conventions for next four methods are likely to change -/// as I become more familiar with all that stuff. - -/// main_context:prepare -/// Polling preparation step. -/// R: boolean (indicates readiness for dispatching before polling), integer (priority of most important ready source, if first value is true) -static int lglib_main_context_prepare (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - gint priority; - gboolean ready = g_main_context_prepare (object->main_context, &priority); - lua_pushboolean (L, ready); - if (!ready) - return 1; - lua_pushnumber (L, priority); - return 0; -} - -/// main_context:query -/// Get necessary for polling information. -/// A: integer (maximum priority), integer (number of fds to allocate) -/// R: userdata (GPollFDs), integer (number of fds required), integer (timeout) -static int lglib_main_context_query (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - int priority = luaL_checkint (L, 2); - int nfds = luaL_checkint (L, 3); - gint timeout; - GPollFD *fds = lua_newuserdata (L, sizeof (GPollFD) * nfds); - lua_pushnumber (L, g_main_context_query (object->main_context, priority, &timeout, fds, nfds)); - lua_pushnumber (L, timeout); - return 3; -} - -/// main_context:check -/// Passes results of polling back to main loop. -/// A: integer (priority), userdata (GPollFDs), integer (number of fds) -/// R: boolean (readiness for dispatching) -static int lglib_main_context_check (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - int priority = luaL_checkint (L, 2); - GPollFD *fds = lua_touserdata (L, 3); // FIXME - int nfds = luaL_checkint (L, 4); - lua_pushboolean (L, g_main_context_check (object->main_context, priority, fds, nfds)); - return 1; -} - -/// main_context:dispatch -/// Actually dispatches pending event sources -static int lglib_main_context_dispatch (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - g_main_context_dispatch (object->main_context); - return 0; -} - -/// main_context:poll_function -/// main_context:add_poll -/// main_context:remove_poll -/// Let's delay implementing this until fd objects will be ready... - -/// main_context:pointer -/// Returns pointe to underlying C structure. -/// A: g main context object -/// R: lightuserdata -static int lglib_main_context_pointer (lua_State *L) -{ - lglib_main_context_t *object = luaL_checklglib_main_context (L, 1); - lua_pushlightuserdata (L, object->main_context); - return 1; -} - -static int lglib_main_context_gc (lua_State *L) -{ - lglib_main_context_t *object = lua_touserdata (L, 1); - g_main_context_unref (object->main_context); - return 0; -} - -static const luaL_Reg lglib_main_context_reg_f[] = { - { "new", lglib_main_context_new }, - { "bless", lglib_main_context_bless_lua }, - { "default", lglib_main_context_default }, - { NULL, NULL }, -}; - -static const luaL_Reg lglib_main_context_reg_m[] = { - { "iteration", lglib_main_context_iteration }, - { "pending", lglib_main_context_pending }, - { "find_source", lglib_main_context_find_source }, - { "wakeup", lglib_main_context_wakeup }, - { "acquire", lglib_main_context_acquire }, - { "release", lglib_main_context_release }, - { "owner", lglib_main_context_owner }, - { "prepare", lglib_main_context_prepare }, - { "query", lglib_main_context_query }, - { "check", lglib_main_context_check }, - { "dispatch", lglib_main_context_dispatch }, - { "pointer", lglib_main_context_pointer }, - { "__gc", lglib_main_context_gc }, - { NULL, NULL }, -}; - -int luaopen_glib_main_context (lua_State *L) -{ - luaL_newmetatable (L, "glib.main_context" ); - lua_pushstring (L, "__index"); - lua_pushvalue (L, -2); - lua_settable (L, -3); - luaL_register (L, NULL, lglib_main_context_reg_m); - lua_pop (L, 1); - luaL_register (L, "g.main_context", lglib_main_context_reg_f); - return 1; -} - diff -r 34b6fedde9eb -r 4fd19a188509 glib_main_context.h --- a/glib_main_context.h Mon Feb 09 13:00:42 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ - -#ifndef LGLIB_MAIN_CONTEXT -#define LGLIB_MAIN_CONTEXT - -#include - -int luaopen_glib_main_context (lua_State *L); - -#endif - diff -r 34b6fedde9eb -r 4fd19a188509 glib_source.c --- a/glib_source.c Mon Feb 09 13:00:42 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ - -#include -#include -#include - -#include "glib_types.h" -#include "util.h" - -/// g.source.bless -/// Blesses given pointer to g source object. -/// A: lightuserdata (pointer to C glib event source object) -/// R: g source object -static int lglib_source_bless_lua (lua_State *L) -{ - luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "glib source lightuserdata expected"); - lglib_source_bless (L, lua_touserdata (L, 1)); - return 1; -} - -/// source:context -/// Connects event source to main context or returns context, -/// to which this source is connected. -/// A: lglib main context object -/// R: int (source id, when called with args) or g main context object or nil (if called with no args) -static int lglib_source_context (lua_State *L) -{ - lglib_source_t *object = luaL_checklglib_source (L, 1); - if (lua_gettop (L) > 1) { // Attach - lglib_main_context_t *context = luaL_checklglib_main_context (L, 2); - lua_pushnumber (L, g_source_attach (object->source, context->main_context)); - } else { // Get - GMainContext *context = g_source_get_context (object->source); - if (context) { - lglib_main_context_bless (L, context); - // XXX g_main_context_unref (context); - } else - lua_pushnil (L); - } - return 1; -} - -/// source callback function -/// Does processing of events. Return value indicates, if source should not be destroyed. -/// R: boolean (continue) -static gboolean lglib_source_callback (lglib_callback_t *cb) -{ - lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference); - if (lua_pcall (cb->L, 0, 1, 0)) { - // XXX lua_error (cb->L); - lua_pop (cb->L, 1); - return FALSE; - } - return lua_toboolean (cb->L, -1); -} - -/// source:callback -/// Sets callback function for given event source. -/// A: source callback function -static int lglib_source_set_callback (lua_State *L) -{ - lglib_source_t *object = luaL_checklglib_source (L, 1); - lglib_callback_t *cb; - luaL_argcheck (L, lua_isfunction (L, 2), 2, "function expected"); - - cb = luaL_malloc (L, sizeof (lglib_callback_t)); - cb->reference = luaL_ref (L, LUA_REGISTRYINDEX); - cb->L = L; - - g_source_set_callback (object->source, (GSourceFunc)lglib_source_callback, - cb, (GDestroyNotify)lglib_callback_destroy); - return 0; -} - -/// source:priority -/// Sets or gets priority of source. -/// A: integer (optional priority) -/// R: integer (when called with no args) -static int lglib_source_priority (lua_State *L) -{ - lglib_source_t *object = luaL_checklglib_source (L, 1); - if (lua_gettop (L) > 1) { - g_source_set_priority (object->source, luaL_checkint (L, 2)); - return 0; - } else { - lua_pushnumber (L, g_source_get_priority (object->source)); - return 1; - } -} - -/// source:pointer -/// Returns pointer to underlying C structure. -/// A: g source object -/// R: lightuserdata -static int lglib_source_pointer (lua_State *L) -{ - lglib_source_t *object = luaL_checklglib_source (L, 1); - lua_pushlightuserdata (L, object->source); - return 1; -} - -static int lglib_source_gc (lua_State *L) -{ - lglib_source_t *object = lua_touserdata (L, 1); - g_source_unref (object->source); - return 0; -} - -const luaL_Reg lglib_source_reg_f[] = { - { "bless", lglib_source_bless_lua }, - { NULL, NULL }, -}; - -const luaL_Reg lglib_source_reg_m[] = { - { "context", lglib_source_context }, - { "priority", lglib_source_priority }, - { "callback", lglib_source_set_callback }, - { "pointer", lglib_source_pointer }, - { "__gc", lglib_source_gc }, - { NULL, NULL }, -}; - -int luaopen_glib_source (lua_State *L) -{ - luaL_newmetatable (L, "glib.source"); - lua_pushstring (L, "__index"); - lua_pushvalue (L, -2); - lua_settable (L, -3); - luaL_register (L, NULL, lglib_source_reg_m); - lua_pop (L, 1); - luaL_register (L, "g.source", lglib_source_reg_f); - return 1; -} - diff -r 34b6fedde9eb -r 4fd19a188509 glib_source.h --- a/glib_source.h Mon Feb 09 13:00:42 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ - -#ifndef LGLIB_SOURCE_H -#define LGLIB_SOURCE_H - -#include - -int luaopen_glib_source (lua_State *L); - -#endif - diff -r 34b6fedde9eb -r 4fd19a188509 glib_timeout.c --- a/glib_timeout.c Mon Feb 09 13:00:42 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ - -#include -#include -#include - -#include "util.h" -#include "glib_types.h" - -/// timeout callback function -/// Function, that will be called periodically until it returns false. -/// R: boolean -static gboolean lglib_timeout_callback (lglib_callback_t *cb) -{ - lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference); - if (lua_pcall (cb->L, 0, 1, 0)) { - // XXX lua_error (cb->L); - lua_pop (cb->L, 1); - return FALSE; - } - return lua_toboolean (cb->L, -1); -} - -/// g.timeout.new -/// Creates new timeout in default context. -/// A: integer (priority), integer (interval, seconds), timeout callback function -/// R: integer (id of the event source) -static int lglib_timeout_new (lua_State *L) -{ - int priority = luaL_checkint (L, 1); - int interval = luaL_checkint (L, 2); - lglib_callback_t *cb; - luaL_argcheck (L, lua_isfunction (L, 3), 3, "function expected"); - - cb = luaL_malloc (L, sizeof (lglib_callback_t)); - cb->reference = luaL_ref (L, LUA_REGISTRYINDEX); - cb->L = L; - - lua_pushnumber (L, g_timeout_add_seconds_full (priority, interval, - (GSourceFunc)lglib_timeout_callback, - cb, - (GDestroyNotify)lglib_callback_destroy)); - return 1; -} - -/// g.timeout.source -/// Creates new timeout source. -/// A: interval -/// R: g source object -static int lglib_timeout_source (lua_State *L) -{ - int interval = luaL_checkint (L, 1); - GSource *source = g_timeout_source_new_seconds (interval); - lglib_source_bless (L, source); - // XXX s_source_unref (source); - return 1; -} - -static const luaL_Reg lglib_timeout_reg_f[] = { - { "new", lglib_timeout_new }, - { "source", lglib_timeout_source }, - { NULL, NULL }, -}; - -int luaopen_glib_timeout (lua_State *L) -{ - luaL_register (L, "g.timeout", lglib_timeout_reg_f); - return 1; -} - diff -r 34b6fedde9eb -r 4fd19a188509 glib_timeout.h --- a/glib_timeout.h Mon Feb 09 13:00:42 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ - -#ifndef LGLIB_TIMEOUT_H -#define LGLIB_TIMEOUT_H - -#include - -int luaopen_glib_timeout (lua_State *L); - -#endif - diff -r 34b6fedde9eb -r 4fd19a188509 glib_types.c --- a/glib_types.c Mon Feb 09 13:00:42 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ - -#include -#include -#include - -#include "glib_types.h" -#include "util.h" - -void lglib_callback_destroy (lglib_callback_t *cb) -{ - luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference); - luaL_free (cb->L, cb); -} - -#define LGLIB_CHECK(WHAT, TYPE) \ -lglib_##WHAT##_t *luaL_checklglib_##WHAT (lua_State *L, int index) \ -{ \ - lglib_##WHAT##_t *object = luaL_checkudata (L, index, "glib." #WHAT); \ - luaL_argcheck (L, object != NULL, index, "glib " #WHAT " expected"); \ - return object; \ -} - -#define LGLIB_BLESS(WHAT, TYPE) \ -lglib_##WHAT##_t *lglib_##WHAT##_bless (lua_State *L, TYPE *WHAT) \ -{ \ - lglib_##WHAT##_t *object; /* top of stack */ \ - lua_pushstring (L, LGLIB_OBJREGISTRY); /* 1 registry table name */ \ - lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \ - lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \ - lua_rawget (L, -2); /* 2 object/nil */ \ - if (!lua_isnil (L, -1)) { /* 2 object */ \ - lua_remove (L, -2); /* 1 object */ \ - object = lua_touserdata (L, -1); \ - return object; \ - } \ - /* 2 nil */ \ - lua_remove (L, -1); /* 1 registry table */ \ - object = lua_newuserdata (L, sizeof (lglib_##WHAT##_t)); /* 2 userdata */ \ - luaL_getmetatable (L, "glib." #WHAT); /* 3 metatable */ \ - lua_setmetatable (L, -2); /* 2 object */ \ - lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \ - lua_pushvalue (L, -2); /* 4 object */ \ - lua_rawset (L, -4); /* 2 object */ \ - lua_remove (L, -2); /* 1 object */ \ - object->WHAT = WHAT; \ - g_##WHAT##_ref (WHAT); \ - return object; \ -} - -#define LGLIB_DEFINE(WHAT, TYPE) \ -LGLIB_CHECK (WHAT, TYPE) \ -LGLIB_BLESS (WHAT, TYPE) - -LGLIB_DEFINE (main_context, GMainContext) -LGLIB_DEFINE (source, GSource) - -#undef LGLIB_DEFINE - diff -r 34b6fedde9eb -r 4fd19a188509 glib_types.h --- a/glib_types.h Mon Feb 09 13:00:42 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ - -#ifndef LGLIB_TYPES_H -#define LGLIB_TYPES_H - -#include -#include - -#ifndef LGLIB_OBJREGISTRY -#define LGLIB_OBJREGISTRY ( "lglib.obj_registry" ) -#endif - -typedef struct { - int reference; - lua_State *L; -} lglib_callback_t; - -void lglib_callback_destroy (lglib_callback_t *cb); - - -#define LGLIB_DECLARE(WHAT, TYPE) \ -typedef struct { \ - TYPE *WHAT; \ -} lglib_##WHAT##_t; \ - \ -lglib_##WHAT##_t *luaL_checklglib_##WHAT (lua_State *L, int index); \ -lglib_##WHAT##_t *lglib_##WHAT##_bless (lua_State *L, TYPE *WHAT); - -LGLIB_DECLARE (main_context, GMainContext) -LGLIB_DECLARE (source, GSource) - -#undef LGLIB_DECLARE - -#endif -