Work on integration of DBUS into event loop
This commit is contained in:
parent
e91eb27e56
commit
3d6995d1e6
15
glfw/backend_utils.c
vendored
15
glfw/backend_utils.c
vendored
@ -28,21 +28,22 @@ update_fds(EventLoopData *eld) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
int
|
||||||
addWatch(EventLoopData *eld, int fd, int events, int enabled, watch_callback_func cb, void *cb_data) {
|
addWatch(EventLoopData *eld, int fd, int events, int enabled, watch_callback_func cb, void *cb_data) {
|
||||||
removeWatch(eld, fd);
|
removeWatch(eld, fd, events);
|
||||||
if (eld->watches_count >= sizeof(eld->watches)/sizeof(eld->watches[0])) return;
|
if (eld->watches_count >= sizeof(eld->watches)/sizeof(eld->watches[0])) return 0;
|
||||||
Watch *w = eld->watches + eld->watches_count++;
|
Watch *w = eld->watches + eld->watches_count++;
|
||||||
w->fd = fd; w->events = events; w->enabled = enabled;
|
w->fd = fd; w->events = events; w->enabled = enabled;
|
||||||
w->callback = cb;
|
w->callback = cb;
|
||||||
w->callback_data = cb_data;
|
w->callback_data = cb_data;
|
||||||
update_fds(eld);
|
update_fds(eld);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
removeWatch(EventLoopData *eld, int fd) {
|
removeWatch(EventLoopData *eld, int fd, int events) {
|
||||||
for (nfds_t i = 0; i < eld->watches_count; i++) {
|
for (nfds_t i = 0; i < eld->watches_count; i++) {
|
||||||
if (eld->watches[i].fd == fd) {
|
if (eld->watches[i].fd == fd && eld->watches[i].events == events) {
|
||||||
eld->watches_count--;
|
eld->watches_count--;
|
||||||
if (i < eld->watches_count) {
|
if (i < eld->watches_count) {
|
||||||
memmove(eld->watches + i, eld->watches + i + 1, sizeof(eld->watches[0]) * (eld->watches_count - i));
|
memmove(eld->watches + i, eld->watches + i + 1, sizeof(eld->watches[0]) * (eld->watches_count - i));
|
||||||
@ -54,9 +55,9 @@ removeWatch(EventLoopData *eld, int fd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
toggleWatch(EventLoopData *eld, int fd, int enabled) {
|
toggleWatch(EventLoopData *eld, int fd, int events, int enabled) {
|
||||||
for (nfds_t i = 0; i < eld->watches_count; i++) {
|
for (nfds_t i = 0; i < eld->watches_count; i++) {
|
||||||
if (eld->watches[i].fd == fd) {
|
if (eld->watches[i].fd == fd && eld->watches[i].events == events) {
|
||||||
if (eld->watches[i].enabled != enabled) {
|
if (eld->watches[i].enabled != enabled) {
|
||||||
eld->watches[i].enabled = enabled;
|
eld->watches[i].enabled = enabled;
|
||||||
update_fds(eld);
|
update_fds(eld);
|
||||||
|
|||||||
6
glfw/backend_utils.h
vendored
6
glfw/backend_utils.h
vendored
@ -44,9 +44,9 @@ typedef struct {
|
|||||||
} EventLoopData;
|
} EventLoopData;
|
||||||
|
|
||||||
|
|
||||||
void addWatch(EventLoopData *eld, int fd, int events, int enabled, watch_callback_func cb, void *cb_data);
|
int addWatch(EventLoopData *eld, int fd, int events, int enabled, watch_callback_func cb, void *cb_data);
|
||||||
void removeWatch(EventLoopData *eld, int fd);
|
void removeWatch(EventLoopData *eld, int fd, int events);
|
||||||
void toggleWatch(EventLoopData *eld, int fd, int enabled);
|
void toggleWatch(EventLoopData *eld, int fd, int events, int enabled);
|
||||||
void prepareForPoll(EventLoopData *eld);
|
void prepareForPoll(EventLoopData *eld);
|
||||||
int pollWithTimeout(struct pollfd *fds, nfds_t nfds, double timeout);
|
int pollWithTimeout(struct pollfd *fds, nfds_t nfds, double timeout);
|
||||||
void dispatchEvents(EventLoopData *eld);
|
void dispatchEvents(EventLoopData *eld);
|
||||||
|
|||||||
48
glfw/dbus_glfw.c
vendored
48
glfw/dbus_glfw.c
vendored
@ -40,11 +40,51 @@ report_error(DBusError *err, const char *fmt, ...) {
|
|||||||
dbus_error_free(err);
|
dbus_error_free(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static _GLFWDBUSData *dbus_data = NULL;
|
||||||
|
|
||||||
GLFWbool
|
GLFWbool
|
||||||
glfw_dbus_init(_GLFWDBUSData *dbus) {
|
glfw_dbus_init(_GLFWDBUSData *dbus, EventLoopData *eld) {
|
||||||
|
dbus->eld = eld;
|
||||||
|
dbus_data = dbus;
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_dbus_watch_ready(int fd, int events, void *data) {
|
||||||
|
DBusWatch *watch = (DBusWatch*)data;
|
||||||
|
unsigned int flags = 0;
|
||||||
|
if (events & POLLERR) flags |= DBUS_WATCH_ERROR;
|
||||||
|
if (events & POLLHUP) flags |= DBUS_WATCH_HANGUP;
|
||||||
|
if (events & POLLIN) flags |= DBUS_WATCH_READABLE;
|
||||||
|
if (events & POLLOUT) flags |= DBUS_WATCH_WRITABLE;
|
||||||
|
dbus_watch_handle(watch, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
events_for_watch(DBusWatch *watch) {
|
||||||
|
int events = 0;
|
||||||
|
unsigned int flags = dbus_watch_get_flags(watch);
|
||||||
|
if (flags & DBUS_WATCH_READABLE) events |= POLLIN;
|
||||||
|
if (flags & DBUS_WATCH_WRITABLE) events |= POLLOUT;
|
||||||
|
return events;
|
||||||
|
}
|
||||||
|
|
||||||
|
static dbus_bool_t
|
||||||
|
add_dbus_watch(DBusWatch *watch, void *data) {
|
||||||
|
if (addWatch(dbus_data->eld, dbus_watch_get_unix_fd(watch), events_for_watch(watch), dbus_watch_get_enabled(watch), on_dbus_watch_ready, watch)) return TRUE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
remove_dbus_watch(DBusWatch *watch, void *data) {
|
||||||
|
removeWatch(dbus_data->eld, dbus_watch_get_unix_fd(watch), events_for_watch(watch));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
toggle_dbus_watch(DBusWatch *watch, void *data) {
|
||||||
|
toggleWatch(dbus_data->eld, dbus_watch_get_unix_fd(watch), events_for_watch(watch), dbus_watch_get_enabled(watch));
|
||||||
|
}
|
||||||
|
|
||||||
DBusConnection*
|
DBusConnection*
|
||||||
glfw_dbus_connect_to(const char *path, const char* err_msg) {
|
glfw_dbus_connect_to(const char *path, const char* err_msg) {
|
||||||
DBusError err;
|
DBusError err;
|
||||||
@ -61,6 +101,12 @@ glfw_dbus_connect_to(const char *path, const char* err_msg) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
dbus_connection_flush(ans);
|
dbus_connection_flush(ans);
|
||||||
|
if (!dbus_connection_set_watch_functions(ans, add_dbus_watch, remove_dbus_watch, toggle_dbus_watch, NULL, NULL)) {
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR, "Failed to set DBUS watches on connection to: %s", path);
|
||||||
|
dbus_connection_close(ans);
|
||||||
|
dbus_connection_unref(ans);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
4
glfw/dbus_glfw.h
vendored
4
glfw/dbus_glfw.h
vendored
@ -28,13 +28,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <dbus/dbus.h>
|
#include <dbus/dbus.h>
|
||||||
|
#include "backend_utils.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DBusConnection *session_conn;
|
DBusConnection *session_conn;
|
||||||
|
EventLoopData* eld;
|
||||||
} _GLFWDBUSData;
|
} _GLFWDBUSData;
|
||||||
|
|
||||||
|
|
||||||
GLFWbool glfw_dbus_init(_GLFWDBUSData *dbus);
|
GLFWbool glfw_dbus_init(_GLFWDBUSData *dbus, EventLoopData *eld);
|
||||||
void glfw_dbus_terminate(_GLFWDBUSData *dbus);
|
void glfw_dbus_terminate(_GLFWDBUSData *dbus);
|
||||||
DBusConnection* glfw_dbus_connect_to(const char *path, const char* err_msg);
|
DBusConnection* glfw_dbus_connect_to(const char *path, const char* err_msg);
|
||||||
void glfw_dbus_close_connection(DBusConnection *conn);
|
void glfw_dbus_close_connection(DBusConnection *conn);
|
||||||
|
|||||||
1
glfw/wl_init.c
vendored
1
glfw/wl_init.c
vendored
@ -665,6 +665,7 @@ int _glfwPlatformInit(void)
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
initPollData(&_glfw.wl.eventLoopData, _glfw.wl.eventLoopData.wakeupFds[0], wl_display_get_fd(_glfw.wl.display));
|
initPollData(&_glfw.wl.eventLoopData, _glfw.wl.eventLoopData.wakeupFds[0], wl_display_get_fd(_glfw.wl.display));
|
||||||
|
glfw_dbus_init(&_glfw.wl.dbus, &_glfw.wl.eventLoopData);
|
||||||
|
|
||||||
_glfw.wl.registry = wl_display_get_registry(_glfw.wl.display);
|
_glfw.wl.registry = wl_display_get_registry(_glfw.wl.display);
|
||||||
wl_registry_add_listener(_glfw.wl.registry, ®istryListener, NULL);
|
wl_registry_add_listener(_glfw.wl.registry, ®istryListener, NULL);
|
||||||
|
|||||||
1
glfw/x11_init.c
vendored
1
glfw/x11_init.c
vendored
@ -641,6 +641,7 @@ int _glfwPlatformInit(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
initPollData(&_glfw.x11.eventLoopData, _glfw.x11.eventLoopData.wakeupFds[0], ConnectionNumber(_glfw.x11.display));
|
initPollData(&_glfw.x11.eventLoopData, _glfw.x11.eventLoopData.wakeupFds[0], ConnectionNumber(_glfw.x11.display));
|
||||||
|
glfw_dbus_init(&_glfw.x11.dbus, &_glfw.x11.eventLoopData);
|
||||||
|
|
||||||
_glfw.x11.screen = DefaultScreen(_glfw.x11.display);
|
_glfw.x11.screen = DefaultScreen(_glfw.x11.display);
|
||||||
_glfw.x11.root = RootWindow(_glfw.x11.display, _glfw.x11.screen);
|
_glfw.x11.root = RootWindow(_glfw.x11.display, _glfw.x11.screen);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user