Use an id for watches
This commit is contained in:
16
glfw/backend_utils.c
vendored
16
glfw/backend_utils.c
vendored
@@ -28,22 +28,24 @@ update_fds(EventLoopData *eld) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static id_type watch_counter = 0;
|
||||||
|
|
||||||
|
id_type
|
||||||
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, events);
|
|
||||||
if (eld->watches_count >= sizeof(eld->watches)/sizeof(eld->watches[0])) return 0;
|
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;
|
||||||
|
w->id = ++watch_counter;
|
||||||
update_fds(eld);
|
update_fds(eld);
|
||||||
return 1;
|
return w->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
removeWatch(EventLoopData *eld, int fd, int events) {
|
removeWatch(EventLoopData *eld, id_type watch_id) {
|
||||||
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 && eld->watches[i].events == events) {
|
if (eld->watches[i].id == watch_id) {
|
||||||
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));
|
||||||
@@ -55,9 +57,9 @@ removeWatch(EventLoopData *eld, int fd, int events) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
toggleWatch(EventLoopData *eld, int fd, int events, int enabled) {
|
toggleWatch(EventLoopData *eld, id_type watch_id, 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 && eld->watches[i].events == events) {
|
if (eld->watches[i].fd == watch_id) {
|
||||||
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);
|
||||||
|
|||||||
8
glfw/backend_utils.h
vendored
8
glfw/backend_utils.h
vendored
@@ -29,11 +29,13 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
typedef void(*watch_callback_func)(int, int, void*);
|
typedef void(*watch_callback_func)(int, int, void*);
|
||||||
|
typedef unsigned long long id_type;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int fd, events, enabled, ready;
|
int fd, events, enabled, ready;
|
||||||
watch_callback_func callback;
|
watch_callback_func callback;
|
||||||
void *callback_data;
|
void *callback_data;
|
||||||
|
id_type id;
|
||||||
} Watch;
|
} Watch;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -44,9 +46,9 @@ typedef struct {
|
|||||||
} EventLoopData;
|
} EventLoopData;
|
||||||
|
|
||||||
|
|
||||||
int addWatch(EventLoopData *eld, int fd, int events, int enabled, watch_callback_func cb, void *cb_data);
|
id_type addWatch(EventLoopData *eld, int fd, int events, int enabled, watch_callback_func cb, void *cb_data);
|
||||||
void removeWatch(EventLoopData *eld, int fd, int events);
|
void removeWatch(EventLoopData *eld, id_type watch_id);
|
||||||
void toggleWatch(EventLoopData *eld, int fd, int events, int enabled);
|
void toggleWatch(EventLoopData *eld, id_type watch_id, 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);
|
||||||
|
|||||||
15
glfw/dbus_glfw.c
vendored
15
glfw/dbus_glfw.c
vendored
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "dbus_glfw.h"
|
#include "dbus_glfw.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
report_error(DBusError *err, const char *fmt, ...) {
|
report_error(DBusError *err, const char *fmt, ...) {
|
||||||
@@ -71,18 +72,24 @@ events_for_watch(DBusWatch *watch) {
|
|||||||
|
|
||||||
static dbus_bool_t
|
static dbus_bool_t
|
||||||
add_dbus_watch(DBusWatch *watch, void *data) {
|
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;
|
id_type watch_id = 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 FALSE;
|
if (!watch_id) return FALSE;
|
||||||
|
id_type *idp = malloc(sizeof(id_type));
|
||||||
|
if (!idp) return FALSE;
|
||||||
|
dbus_watch_set_data(watch, idp, free);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_dbus_watch(DBusWatch *watch, void *data) {
|
remove_dbus_watch(DBusWatch *watch, void *data) {
|
||||||
removeWatch(dbus_data->eld, dbus_watch_get_unix_fd(watch), events_for_watch(watch));
|
id_type *idp = dbus_watch_get_data(watch);
|
||||||
|
if (idp) removeWatch(dbus_data->eld, *idp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
toggle_dbus_watch(DBusWatch *watch, void *data) {
|
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));
|
id_type *idp = dbus_watch_get_data(watch);
|
||||||
|
if (idp) toggleWatch(dbus_data->eld, *idp, dbus_watch_get_enabled(watch));
|
||||||
}
|
}
|
||||||
|
|
||||||
DBusConnection*
|
DBusConnection*
|
||||||
|
|||||||
Reference in New Issue
Block a user