Use glib instead of libev
This commit ports awesome from libev to the glib main loop. This means that awesome has fewer dependencies, because we were already depending on glib before and now no longer need glib. However, the main reason for this change is that, thanks to lgi, we have glib bindings for lua. This means that lua code can add all kinds of event sources to the main loop (timeouts, fd watchers, SIGCHLD watchers, ....). Yay Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
dbf20000a5
commit
ea30119410
97
awesome.c
97
awesome.c
|
@ -35,6 +35,8 @@
|
||||||
|
|
||||||
#include <X11/Xlib-xcb.h>
|
#include <X11/Xlib-xcb.h>
|
||||||
|
|
||||||
|
#include <glib-unix.h>
|
||||||
|
|
||||||
#include "awesome.h"
|
#include "awesome.h"
|
||||||
#include "spawn.h"
|
#include "spawn.h"
|
||||||
#include "objects/client.h"
|
#include "objects/client.h"
|
||||||
|
@ -76,8 +78,6 @@ awesome_atexit(bool restart)
|
||||||
|
|
||||||
/* Disconnect *after* closing lua */
|
/* Disconnect *after* closing lua */
|
||||||
xcb_disconnect(globalconf.connection);
|
xcb_disconnect(globalconf.connection);
|
||||||
|
|
||||||
ev_default_destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Scan X to find windows to manage.
|
/** Scan X to find windows to manage.
|
||||||
|
@ -156,13 +156,7 @@ scan(xcb_query_tree_cookie_t tree_c)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
a_refresh_cb(EV_P_ ev_prepare *w, int revents)
|
a_xcb_check(void)
|
||||||
{
|
|
||||||
awesome_refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
a_xcb_check_cb(EV_P_ ev_check *w, int revents)
|
|
||||||
{
|
{
|
||||||
xcb_generic_event_t *mouse = NULL, *event;
|
xcb_generic_event_t *mouse = NULL, *event;
|
||||||
|
|
||||||
|
@ -200,13 +194,25 @@ a_xcb_check_cb(EV_P_ ev_check *w, int revents)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
a_xcb_io_cb(EV_P_ ev_io *w, int revents)
|
a_xcb_io_cb(GIOChannel *source, GIOCondition cond, gpointer data)
|
||||||
{
|
{
|
||||||
/* a_xcb_check_cb() already handled all events */
|
/* a_xcb_check() already handled all events */
|
||||||
|
|
||||||
if(xcb_connection_has_error(globalconf.connection))
|
if(xcb_connection_has_error(globalconf.connection))
|
||||||
fatal("X server connection broke");
|
fatal("X server connection broke");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gint
|
||||||
|
a_glib_poll(GPollFD *ufds, guint nfsd, gint timeout)
|
||||||
|
{
|
||||||
|
guint res;
|
||||||
|
awesome_refresh();
|
||||||
|
res = g_poll(ufds, nfsd, timeout);
|
||||||
|
a_xcb_check();
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -218,13 +224,13 @@ signal_fatal(int signum)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Function to exit on some signals.
|
/** Function to exit on some signals.
|
||||||
* \param w the signal received, unused
|
* \param data currently unused
|
||||||
* \param revents currently unused
|
|
||||||
*/
|
*/
|
||||||
static void
|
static gboolean
|
||||||
exit_on_signal(EV_P_ ev_signal *w, int revents)
|
exit_on_signal(gpointer data)
|
||||||
{
|
{
|
||||||
ev_unloop(EV_A_ 1);
|
g_main_loop_quit(globalconf.loop);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -235,13 +241,13 @@ awesome_restart(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Function to restart awesome on some signals.
|
/** Function to restart awesome on some signals.
|
||||||
* \param w the signal received, unused
|
* \param data currently unused
|
||||||
* \param revents Currently unused
|
|
||||||
*/
|
*/
|
||||||
static void
|
static gboolean
|
||||||
restart_on_signal(EV_P_ ev_signal *w, int revents)
|
restart_on_signal(gpointer data)
|
||||||
{
|
{
|
||||||
awesome_restart();
|
awesome_restart();
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Print help and exit(2) with given exit_code.
|
/** Print help and exit(2) with given exit_code.
|
||||||
|
@ -285,14 +291,6 @@ main(int argc, char **argv)
|
||||||
{ NULL, 0, NULL, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
/* event loop watchers */
|
|
||||||
ev_io xio = { .fd = -1 };
|
|
||||||
ev_check xcheck;
|
|
||||||
ev_prepare a_refresh;
|
|
||||||
ev_signal sigint;
|
|
||||||
ev_signal sigterm;
|
|
||||||
ev_signal sighup;
|
|
||||||
|
|
||||||
/* clear the globalconf structure */
|
/* clear the globalconf structure */
|
||||||
p_clear(&globalconf, 1);
|
p_clear(&globalconf, 1);
|
||||||
globalconf.keygrabber = LUA_REFNIL;
|
globalconf.keygrabber = LUA_REFNIL;
|
||||||
|
@ -354,18 +352,10 @@ main(int argc, char **argv)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
globalconf.loop = ev_default_loop(EVFLAG_NOSIGFD);
|
|
||||||
|
|
||||||
/* register function for signals */
|
/* register function for signals */
|
||||||
ev_signal_init(&sigint, exit_on_signal, SIGINT);
|
g_unix_signal_add(SIGINT, exit_on_signal, NULL);
|
||||||
ev_signal_init(&sigterm, exit_on_signal, SIGTERM);
|
g_unix_signal_add(SIGTERM, exit_on_signal, NULL);
|
||||||
ev_signal_init(&sighup, restart_on_signal, SIGHUP);
|
g_unix_signal_add(SIGHUP, restart_on_signal, NULL);
|
||||||
ev_signal_start(globalconf.loop, &sigint);
|
|
||||||
ev_signal_start(globalconf.loop, &sigterm);
|
|
||||||
ev_signal_start(globalconf.loop, &sighup);
|
|
||||||
ev_unref(globalconf.loop);
|
|
||||||
ev_unref(globalconf.loop);
|
|
||||||
ev_unref(globalconf.loop);
|
|
||||||
|
|
||||||
struct sigaction sa = { .sa_handler = signal_fatal, .sa_flags = 0 };
|
struct sigaction sa = { .sa_handler = signal_fatal, .sa_flags = 0 };
|
||||||
sigemptyset(&sa.sa_mask);
|
sigemptyset(&sa.sa_mask);
|
||||||
|
@ -408,19 +398,17 @@ main(int argc, char **argv)
|
||||||
xcb_prefetch_extension_data(globalconf.connection, &xcb_xinerama_id);
|
xcb_prefetch_extension_data(globalconf.connection, &xcb_xinerama_id);
|
||||||
xcb_prefetch_extension_data(globalconf.connection, &xcb_shape_id);
|
xcb_prefetch_extension_data(globalconf.connection, &xcb_shape_id);
|
||||||
|
|
||||||
|
/* Setup the main context */
|
||||||
|
g_main_context_set_poll_func(g_main_context_default(), &a_glib_poll);
|
||||||
|
|
||||||
/* initialize dbus */
|
/* initialize dbus */
|
||||||
a_dbus_init();
|
a_dbus_init();
|
||||||
|
|
||||||
/* Get the file descriptor corresponding to the X connection */
|
/* Get the file descriptor corresponding to the X connection */
|
||||||
xfd = xcb_get_file_descriptor(globalconf.connection);
|
xfd = xcb_get_file_descriptor(globalconf.connection);
|
||||||
ev_io_init(&xio, &a_xcb_io_cb, xfd, EV_READ);
|
GIOChannel *channel = g_io_channel_unix_new(xfd);
|
||||||
ev_io_start(globalconf.loop, &xio);
|
g_io_add_watch(channel, G_IO_IN, a_xcb_io_cb, NULL);
|
||||||
ev_check_init(&xcheck, &a_xcb_check_cb);
|
g_io_channel_unref(channel);
|
||||||
ev_check_start(globalconf.loop, &xcheck);
|
|
||||||
ev_unref(globalconf.loop);
|
|
||||||
ev_prepare_init(&a_refresh, &a_refresh_cb);
|
|
||||||
ev_prepare_start(globalconf.loop, &a_refresh);
|
|
||||||
ev_unref(globalconf.loop);
|
|
||||||
|
|
||||||
/* Grab server */
|
/* Grab server */
|
||||||
xcb_grab_server(globalconf.connection);
|
xcb_grab_server(globalconf.connection);
|
||||||
|
@ -531,15 +519,10 @@ main(int argc, char **argv)
|
||||||
xcb_flush(globalconf.connection);
|
xcb_flush(globalconf.connection);
|
||||||
|
|
||||||
/* main event loop */
|
/* main event loop */
|
||||||
ev_loop(globalconf.loop, 0);
|
globalconf.loop = g_main_loop_new(NULL, FALSE);
|
||||||
|
g_main_loop_run(globalconf.loop);
|
||||||
/* cleanup event loop */
|
g_main_loop_unref(globalconf.loop);
|
||||||
ev_ref(globalconf.loop);
|
globalconf.loop = NULL;
|
||||||
ev_check_stop(globalconf.loop, &xcheck);
|
|
||||||
ev_ref(globalconf.loop);
|
|
||||||
ev_prepare_stop(globalconf.loop, &a_refresh);
|
|
||||||
ev_ref(globalconf.loop);
|
|
||||||
ev_io_stop(globalconf.loop, &xio);
|
|
||||||
|
|
||||||
awesome_atexit(false);
|
awesome_atexit(false);
|
||||||
|
|
||||||
|
|
|
@ -159,9 +159,6 @@ macro(a_find_library variable library)
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
# Check for libev
|
|
||||||
a_find_library(LIB_EV ev)
|
|
||||||
|
|
||||||
# Check for backtrace_symbols()
|
# Check for backtrace_symbols()
|
||||||
include(CheckFunctionExists)
|
include(CheckFunctionExists)
|
||||||
check_function_exists(backtrace_symbols HAS_EXECINFO)
|
check_function_exists(backtrace_symbols HAS_EXECINFO)
|
||||||
|
@ -198,7 +195,6 @@ endif()
|
||||||
set(AWESOME_REQUIRED_LDFLAGS
|
set(AWESOME_REQUIRED_LDFLAGS
|
||||||
${AWESOME_COMMON_REQUIRED_LDFLAGS}
|
${AWESOME_COMMON_REQUIRED_LDFLAGS}
|
||||||
${AWESOME_REQUIRED_LDFLAGS}
|
${AWESOME_REQUIRED_LDFLAGS}
|
||||||
${LIB_EV}
|
|
||||||
${LUA_LIBRARIES})
|
${LUA_LIBRARIES})
|
||||||
|
|
||||||
set(AWESOME_REQUIRED_INCLUDE_DIRS
|
set(AWESOME_REQUIRED_INCLUDE_DIRS
|
||||||
|
|
58
dbus.c
58
dbus.c
|
@ -22,10 +22,10 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "dbus.h"
|
#include "dbus.h"
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
#ifdef WITH_DBUS
|
#ifdef WITH_DBUS
|
||||||
|
|
||||||
#include <ev.h>
|
|
||||||
#include <dbus/dbus.h>
|
#include <dbus/dbus.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -35,8 +35,8 @@
|
||||||
|
|
||||||
static DBusConnection *dbus_connection_session = NULL;
|
static DBusConnection *dbus_connection_session = NULL;
|
||||||
static DBusConnection *dbus_connection_system = NULL;
|
static DBusConnection *dbus_connection_system = NULL;
|
||||||
ev_io dbusio_ses = { .fd = -1 };
|
static GSource *session_source = NULL;
|
||||||
ev_io dbusio_sys = { .fd = -1 };
|
static GSource *system_source = NULL;
|
||||||
|
|
||||||
static signal_array_t dbus_signals;
|
static signal_array_t dbus_signals;
|
||||||
|
|
||||||
|
@ -45,17 +45,14 @@ static signal_array_t dbus_signals;
|
||||||
* \param dbusio The D-Bus event watcher
|
* \param dbusio The D-Bus event watcher
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
a_dbus_cleanup_bus(DBusConnection *dbus_connection, ev_io *dbusio)
|
a_dbus_cleanup_bus(DBusConnection *dbus_connection, GSource **source)
|
||||||
{
|
{
|
||||||
if(!dbus_connection)
|
if(!dbus_connection)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(dbusio->fd >= 0)
|
if (*source != NULL)
|
||||||
{
|
g_source_destroy(*source);
|
||||||
ev_ref(EV_DEFAULT_UC);
|
*source = NULL;
|
||||||
ev_io_stop(EV_DEFAULT_UC_ dbusio);
|
|
||||||
dbusio->fd = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is a shared connection owned by libdbus
|
/* This is a shared connection owned by libdbus
|
||||||
* Do not close it, only unref
|
* Do not close it, only unref
|
||||||
|
@ -462,7 +459,7 @@ a_dbus_process_request(DBusConnection *dbus_connection, DBusMessage *msg)
|
||||||
* \param dbusio The D-Bus event watcher
|
* \param dbusio The D-Bus event watcher
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
a_dbus_process_requests_on_bus(DBusConnection *dbus_connection, ev_io *dbusio)
|
a_dbus_process_requests_on_bus(DBusConnection *dbus_connection, GSource **source)
|
||||||
{
|
{
|
||||||
DBusMessage *msg;
|
DBusMessage *msg;
|
||||||
int nmsg = 0;
|
int nmsg = 0;
|
||||||
|
@ -476,7 +473,7 @@ a_dbus_process_requests_on_bus(DBusConnection *dbus_connection, ev_io *dbusio)
|
||||||
|
|
||||||
if(dbus_message_is_signal(msg, DBUS_INTERFACE_LOCAL, "Disconnected"))
|
if(dbus_message_is_signal(msg, DBUS_INTERFACE_LOCAL, "Disconnected"))
|
||||||
{
|
{
|
||||||
a_dbus_cleanup_bus(dbus_connection, dbusio);
|
a_dbus_cleanup_bus(dbus_connection, source);
|
||||||
dbus_message_unref(msg);
|
dbus_message_unref(msg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -496,20 +493,22 @@ a_dbus_process_requests_on_bus(DBusConnection *dbus_connection, ev_io *dbusio)
|
||||||
* \param w The D-Bus event watcher
|
* \param w The D-Bus event watcher
|
||||||
* \param revents (not used)
|
* \param revents (not used)
|
||||||
*/
|
*/
|
||||||
static void
|
static gboolean
|
||||||
a_dbus_process_requests_session(EV_P_ ev_io *w, int revents)
|
a_dbus_process_requests_session(GIOChannel *source, GIOCondition cond, gpointer data)
|
||||||
{
|
{
|
||||||
a_dbus_process_requests_on_bus(dbus_connection_session, w);
|
a_dbus_process_requests_on_bus(dbus_connection_session, &session_source);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Foreword D-Bus process system requests on too the correct function.
|
/** Foreword D-Bus process system requests on too the correct function.
|
||||||
* \param w The D-Bus event watcher
|
* \param w The D-Bus event watcher
|
||||||
* \param revents (not used)
|
* \param revents (not used)
|
||||||
*/
|
*/
|
||||||
static void
|
static gboolean
|
||||||
a_dbus_process_requests_system(EV_P_ ev_io *w, int revents)
|
a_dbus_process_requests_system(GIOChannel *source, GIOCondition cond, gpointer data)
|
||||||
{
|
{
|
||||||
a_dbus_process_requests_on_bus(dbus_connection_system, w);
|
a_dbus_process_requests_on_bus(dbus_connection_system, &system_source);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Attempt to request a D-Bus name
|
/** Attempt to request a D-Bus name
|
||||||
|
@ -588,13 +587,12 @@ a_dbus_release_name(DBusConnection *dbus_connection, const char *name)
|
||||||
/** Attempt to create a new connection to D-Bus
|
/** Attempt to create a new connection to D-Bus
|
||||||
* \param type The bus type to use when connecting to D-Bus
|
* \param type The bus type to use when connecting to D-Bus
|
||||||
* \param type_name The bus type name eg: "session" or "system"
|
* \param type_name The bus type name eg: "session" or "system"
|
||||||
* \param dbusio The D-Bus event watcher
|
|
||||||
* \param cb Function callback to use when processing requests
|
* \param cb Function callback to use when processing requests
|
||||||
|
* \param source A new GSource that will be used for watching the dbus connection.
|
||||||
* \return The requested D-Bus connection on success, NULL on failure.
|
* \return The requested D-Bus connection on success, NULL on failure.
|
||||||
*/
|
*/
|
||||||
static DBusConnection *
|
static DBusConnection *
|
||||||
a_dbus_connect(DBusBusType type, const char *type_name,
|
a_dbus_connect(DBusBusType type, const char *type_name, GIOFunc cb, GSource **source)
|
||||||
ev_io *dbusio, void *cb)
|
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
DBusConnection *dbus_connection;
|
DBusConnection *dbus_connection;
|
||||||
|
@ -614,16 +612,16 @@ a_dbus_connect(DBusBusType type, const char *type_name,
|
||||||
dbus_connection_set_exit_on_disconnect(dbus_connection, false);
|
dbus_connection_set_exit_on_disconnect(dbus_connection, false);
|
||||||
if(dbus_connection_get_unix_fd(dbus_connection, &fd))
|
if(dbus_connection_get_unix_fd(dbus_connection, &fd))
|
||||||
{
|
{
|
||||||
fcntl(fd, F_SETFD, FD_CLOEXEC);
|
GIOChannel *channel = g_io_channel_unix_new(fd);
|
||||||
|
*source = g_io_create_watch(channel, G_IO_IN);
|
||||||
|
g_io_channel_unref(channel);
|
||||||
|
|
||||||
ev_io_init(dbusio, cb, fd, EV_READ);
|
fcntl(fd, F_SETFD, FD_CLOEXEC);
|
||||||
ev_io_start(EV_DEFAULT_UC_ dbusio);
|
|
||||||
ev_unref(EV_DEFAULT_UC);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
warn("cannot get D-Bus connection file descriptor");
|
warn("cannot get D-Bus connection file descriptor");
|
||||||
a_dbus_cleanup_bus(dbus_connection, dbusio);
|
a_dbus_cleanup_bus(dbus_connection, source);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -636,9 +634,9 @@ void
|
||||||
a_dbus_init(void)
|
a_dbus_init(void)
|
||||||
{
|
{
|
||||||
dbus_connection_session = a_dbus_connect(DBUS_BUS_SESSION, "session",
|
dbus_connection_session = a_dbus_connect(DBUS_BUS_SESSION, "session",
|
||||||
&dbusio_ses, a_dbus_process_requests_session);
|
a_dbus_process_requests_session, &session_source);
|
||||||
dbus_connection_system = a_dbus_connect(DBUS_BUS_SYSTEM, "system",
|
dbus_connection_system = a_dbus_connect(DBUS_BUS_SYSTEM, "system",
|
||||||
&dbusio_sys, a_dbus_process_requests_system);
|
a_dbus_process_requests_system, &system_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Cleanup the D-Bus session and system
|
/** Cleanup the D-Bus session and system
|
||||||
|
@ -646,8 +644,8 @@ a_dbus_init(void)
|
||||||
void
|
void
|
||||||
a_dbus_cleanup(void)
|
a_dbus_cleanup(void)
|
||||||
{
|
{
|
||||||
a_dbus_cleanup_bus(dbus_connection_session, &dbusio_ses);
|
a_dbus_cleanup_bus(dbus_connection_session, &session_source);
|
||||||
a_dbus_cleanup_bus(dbus_connection_system, &dbusio_sys);
|
a_dbus_cleanup_bus(dbus_connection_system, &system_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Retrieve the D-Bus bus by it's name
|
/** Retrieve the D-Bus bus by it's name
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#define SN_API_NOT_YET_FROZEN
|
#define SN_API_NOT_YET_FROZEN
|
||||||
#include <libsn/sn.h>
|
#include <libsn/sn.h>
|
||||||
|
|
||||||
#include <ev.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#include <xcb/xcb_icccm.h>
|
#include <xcb/xcb_icccm.h>
|
||||||
#include <xcb/xcb_keysyms.h>
|
#include <xcb/xcb_keysyms.h>
|
||||||
|
@ -94,8 +94,8 @@ typedef struct
|
||||||
lua_State *L;
|
lua_State *L;
|
||||||
/** All errors messages from loading config files */
|
/** All errors messages from loading config files */
|
||||||
buffer_t startup_errors;
|
buffer_t startup_errors;
|
||||||
/** The event loop */
|
/** main loop that awesome is running on */
|
||||||
struct ev_loop *loop;
|
GMainLoop *loop;
|
||||||
/** The key grabber function */
|
/** The key grabber function */
|
||||||
int keygrabber;
|
int keygrabber;
|
||||||
/** The mouse pointer grabber function */
|
/** The mouse pointer grabber function */
|
||||||
|
|
4
luaa.c
4
luaa.c
|
@ -21,8 +21,6 @@
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
#include <ev.h>
|
|
||||||
|
|
||||||
#include <lua.h>
|
#include <lua.h>
|
||||||
#include <lauxlib.h>
|
#include <lauxlib.h>
|
||||||
#include <lualib.h>
|
#include <lualib.h>
|
||||||
|
@ -69,7 +67,7 @@ static char *conffile;
|
||||||
static int
|
static int
|
||||||
luaA_quit(lua_State *L)
|
luaA_quit(lua_State *L)
|
||||||
{
|
{
|
||||||
ev_unloop(globalconf.loop, 1);
|
g_main_loop_quit(globalconf.loop);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
luaa.h
2
luaa.h
|
@ -22,8 +22,6 @@
|
||||||
#ifndef AWESOME_LUA_H
|
#ifndef AWESOME_LUA_H
|
||||||
#define AWESOME_LUA_H
|
#define AWESOME_LUA_H
|
||||||
|
|
||||||
#include <ev.h>
|
|
||||||
|
|
||||||
#include <lua.h>
|
#include <lua.h>
|
||||||
#include <lauxlib.h>
|
#include <lauxlib.h>
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,6 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ev.h>
|
|
||||||
|
|
||||||
#include "globalconf.h"
|
#include "globalconf.h"
|
||||||
#include "luaa.h"
|
#include "luaa.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
@ -30,27 +28,26 @@ typedef struct
|
||||||
{
|
{
|
||||||
LUA_OBJECT_HEADER
|
LUA_OBJECT_HEADER
|
||||||
bool started;
|
bool started;
|
||||||
struct ev_timer timer;
|
guint source_id;
|
||||||
|
double timeout;
|
||||||
} atimer_t;
|
} atimer_t;
|
||||||
|
|
||||||
static lua_class_t timer_class;
|
static lua_class_t timer_class;
|
||||||
LUA_OBJECT_FUNCS(timer_class, atimer_t, timer)
|
LUA_OBJECT_FUNCS(timer_class, atimer_t, timer)
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
ev_timer_emit_signal(struct ev_loop *loop, struct ev_timer *w, int revents)
|
timer_emit_signal(gpointer data)
|
||||||
{
|
{
|
||||||
luaA_object_push(globalconf.L, w->data);
|
luaA_object_push(globalconf.L, data);
|
||||||
luaA_object_emit_signal(globalconf.L, -1, "timeout", 0);
|
luaA_object_emit_signal(globalconf.L, -1, "timeout", 0);
|
||||||
lua_pop(globalconf.L, 1);
|
lua_pop(globalconf.L, 1);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
luaA_timer_new(lua_State *L)
|
luaA_timer_new(lua_State *L)
|
||||||
{
|
{
|
||||||
luaA_class_new(L, &timer_class);
|
luaA_class_new(L, &timer_class);
|
||||||
atimer_t *timer = luaA_checkudata(L, -1, &timer_class);
|
|
||||||
timer->timer.data = timer;
|
|
||||||
ev_set_cb(&timer->timer, ev_timer_emit_signal);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +55,7 @@ static int
|
||||||
luaA_timer_set_timeout(lua_State *L, atimer_t *timer)
|
luaA_timer_set_timeout(lua_State *L, atimer_t *timer)
|
||||||
{
|
{
|
||||||
double timeout = luaL_checknumber(L, -1);
|
double timeout = luaL_checknumber(L, -1);
|
||||||
ev_timer_set(&timer->timer, timeout, timeout);
|
timer->timeout = timeout;
|
||||||
luaA_object_emit_signal(L, -3, "property::timeout", 0);
|
luaA_object_emit_signal(L, -3, "property::timeout", 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -66,7 +63,7 @@ luaA_timer_set_timeout(lua_State *L, atimer_t *timer)
|
||||||
static int
|
static int
|
||||||
luaA_timer_get_timeout(lua_State *L, atimer_t *timer)
|
luaA_timer_get_timeout(lua_State *L, atimer_t *timer)
|
||||||
{
|
{
|
||||||
lua_pushnumber(L, timer->timer.repeat);
|
lua_pushnumber(L, timer->timeout);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,8 +76,8 @@ luaA_timer_start(lua_State *L)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
luaA_object_ref(L, 1);
|
luaA_object_ref(L, 1);
|
||||||
ev_timer_start(globalconf.loop, &timer->timer);
|
|
||||||
timer->started = true;
|
timer->started = true;
|
||||||
|
timer->source_id = g_timeout_add(timer->timeout * 1000, timer_emit_signal, timer);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -91,7 +88,7 @@ luaA_timer_stop(lua_State *L)
|
||||||
atimer_t *timer = luaA_checkudata(L, 1, &timer_class);
|
atimer_t *timer = luaA_checkudata(L, 1, &timer_class);
|
||||||
if(timer->started)
|
if(timer->started)
|
||||||
{
|
{
|
||||||
ev_timer_stop(globalconf.loop, &timer->timer);
|
g_source_remove(timer->source_id);
|
||||||
luaA_object_unref(L, timer);
|
luaA_object_unref(L, timer);
|
||||||
timer->started = false;
|
timer->started = false;
|
||||||
}
|
}
|
||||||
|
@ -105,13 +102,12 @@ luaA_timer_again(lua_State *L)
|
||||||
{
|
{
|
||||||
atimer_t *timer = luaA_checkudata(L, 1, &timer_class);
|
atimer_t *timer = luaA_checkudata(L, 1, &timer_class);
|
||||||
|
|
||||||
ev_timer_again(globalconf.loop, &timer->timer);
|
if (timer->started)
|
||||||
|
g_source_remove(timer->source_id);
|
||||||
if(!timer->started)
|
else
|
||||||
{
|
|
||||||
luaA_object_ref(L, 1);
|
luaA_object_ref(L, 1);
|
||||||
timer->started = true;
|
timer->started = true;
|
||||||
}
|
timer->source_id = g_timeout_add(timer->timeout * 1000, timer_emit_signal, timer);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
32
spawn.c
32
spawn.c
|
@ -64,10 +64,10 @@ spawn_sequence_remove(SnStartupSequence *s)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
spawn_monitor_timeout(struct ev_loop *loop, ev_timer *w, int revents)
|
spawn_monitor_timeout(gpointer sequence)
|
||||||
{
|
{
|
||||||
if(spawn_sequence_remove(w->data))
|
if(spawn_sequence_remove(sequence))
|
||||||
{
|
{
|
||||||
signal_t *sig = signal_array_getbyid(&global_signals,
|
signal_t *sig = signal_array_getbyid(&global_signals,
|
||||||
a_strhash((const unsigned char *) "spawn::timeout"));
|
a_strhash((const unsigned char *) "spawn::timeout"));
|
||||||
|
@ -75,7 +75,7 @@ spawn_monitor_timeout(struct ev_loop *loop, ev_timer *w, int revents)
|
||||||
{
|
{
|
||||||
/* send a timeout signal */
|
/* send a timeout signal */
|
||||||
lua_createtable(globalconf.L, 0, 2);
|
lua_createtable(globalconf.L, 0, 2);
|
||||||
lua_pushstring(globalconf.L, sn_startup_sequence_get_id(w->data));
|
lua_pushstring(globalconf.L, sn_startup_sequence_get_id(sequence));
|
||||||
lua_setfield(globalconf.L, -2, "id");
|
lua_setfield(globalconf.L, -2, "id");
|
||||||
foreach(func, sig->sigfuncs)
|
foreach(func, sig->sigfuncs)
|
||||||
{
|
{
|
||||||
|
@ -88,8 +88,8 @@ spawn_monitor_timeout(struct ev_loop *loop, ev_timer *w, int revents)
|
||||||
else
|
else
|
||||||
warn("spawn::timeout signal is missing");
|
warn("spawn::timeout signal is missing");
|
||||||
}
|
}
|
||||||
sn_startup_sequence_unref(w->data);
|
sn_startup_sequence_unref(sequence);
|
||||||
p_delete(&w);
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -114,12 +114,9 @@ spawn_monitor_event(SnMonitorEvent *event, void *data)
|
||||||
|
|
||||||
/* Add a timeout function so we do not wait for this event to complete
|
/* Add a timeout function so we do not wait for this event to complete
|
||||||
* for ever */
|
* for ever */
|
||||||
struct ev_timer *ev_timeout = p_new(struct ev_timer, 1);
|
g_timeout_add_seconds(AWESOME_SPAWN_TIMEOUT, spawn_monitor_timeout, sequence);
|
||||||
ev_timer_init(ev_timeout, spawn_monitor_timeout, AWESOME_SPAWN_TIMEOUT, 0.);
|
|
||||||
/* ref the sequence for the callback event */
|
/* ref the sequence for the callback event */
|
||||||
sn_startup_sequence_ref(sequence);
|
sn_startup_sequence_ref(sequence);
|
||||||
ev_timeout->data = sequence;
|
|
||||||
ev_timer_start(globalconf.loop, ev_timeout);
|
|
||||||
break;
|
break;
|
||||||
case SN_MONITOR_EVENT_CHANGED:
|
case SN_MONITOR_EVENT_CHANGED:
|
||||||
event_type_str = "spawn::change";
|
event_type_str = "spawn::change";
|
||||||
|
@ -252,12 +249,12 @@ spawn_init(void)
|
||||||
signal_add(&global_signals, "spawn::timeout");
|
signal_add(&global_signals, "spawn::timeout");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
spawn_launchee_timeout(struct ev_loop *loop, ev_timer *w, int revents)
|
spawn_launchee_timeout(gpointer context)
|
||||||
{
|
{
|
||||||
sn_launcher_context_complete(w->data);
|
sn_launcher_context_complete(context);
|
||||||
sn_launcher_context_unref(w->data);
|
sn_launcher_context_unref(context);
|
||||||
p_delete(&w);
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -335,10 +332,7 @@ luaA_spawn(lua_State *L)
|
||||||
|
|
||||||
/* app will have AWESOME_SPAWN_TIMEOUT seconds to complete,
|
/* app will have AWESOME_SPAWN_TIMEOUT seconds to complete,
|
||||||
* or the timeout function will terminate the launch sequence anyway */
|
* or the timeout function will terminate the launch sequence anyway */
|
||||||
struct ev_timer *ev_timeout = p_new(struct ev_timer, 1);
|
g_timeout_add_seconds(AWESOME_SPAWN_TIMEOUT, spawn_launchee_timeout, context);
|
||||||
ev_timer_init(ev_timeout, spawn_launchee_timeout, AWESOME_SPAWN_TIMEOUT, 0.);
|
|
||||||
ev_timeout->data = context;
|
|
||||||
ev_timer_start(globalconf.loop, ev_timeout);
|
|
||||||
sn_launcher_context_setup_child_process(context);
|
sn_launcher_context_setup_child_process(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue