diff options
author | Kristian Høgsberg <krh@redhat.com> | 2008-12-19 17:08:05 -0500 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2008-12-20 02:02:15 -0500 |
commit | 05a2b476ee9f1224299982195e27d0e973465211 (patch) | |
tree | 56a868fb410c9eab2a749ecfb7edfb890fd442f0 | |
parent | 246f4522b4699832a4fb3a44310742770f9d4a58 (diff) |
start of dbus
-rw-r--r-- | Makefile.in | 1 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | dbus.c | 73 | ||||
-rw-r--r-- | wayland-system-compositor.c | 4 | ||||
-rw-r--r-- | wayland-system-compositor.h | 6 |
5 files changed, 85 insertions, 1 deletions
diff --git a/Makefile.in b/Makefile.in index 0f269a3..0f8b96f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -31,6 +31,7 @@ $(compositors) $(clients) : CFLAGS += @LIBDRM_CFLAGS@ wayland-system-compositor : \ wayland-system-compositor.o \ + dbus.o \ evdev.o \ cairo-util.o \ wayland-util.o diff --git a/configure.ac b/configure.ac index 5a08af5..ce44897 100644 --- a/configure.ac +++ b/configure.ac @@ -5,7 +5,7 @@ PKG_PROG_PKG_CONFIG() PKG_CHECK_MODULES(FFI, [libffi]) PKG_CHECK_MODULES(LIBDRM, [libdrm]) -PKG_CHECK_MODULES(EGL_COMPOSITOR, [eagle libpng cairo gdk-pixbuf-2.0]) +PKG_CHECK_MODULES(EGL_COMPOSITOR, [eagle libpng cairo gdk-pixbuf-2.0 dbus-1]) PKG_CHECK_MODULES(GL_COMPOSITOR, [gl x11]) PKG_CHECK_MODULES(CLIENT, [eagle cairo glib-2.0]) @@ -0,0 +1,73 @@ +#include <stdlib.h> +#include <stdio.h> +#include <stdint.h> +#include <dbus/dbus.h> + +#include "wayland.h" +#include "wayland-system-compositor.h" + +struct wlsc_dbus { + DBusConnection *connection; + struct wl_event_source *source; +}; + +static DBusHandlerResult +wlsc_dbus_filter(DBusConnection *connection, DBusMessage *message, void *data) +{ + printf("dbus filter!\n"); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static void wlsc_dbus_data(int fd, uint32_t mask, void *data) +{ + struct wlsc_dbus *dbus = data; + + printf("dbus data!\n"); + + while (dbus_connection_get_dispatch_status(dbus->connection) == DBUS_DISPATCH_DATA_REMAINS) + dbus_connection_read_write_dispatch(dbus->connection, 0); +} + +struct wlsc_dbus * +wlsc_dbus_init(struct egl_compositor *ec, struct wl_event_loop *loop) +{ + struct wlsc_dbus *dbus; + DBusError error; + int fd; + + dbus = malloc(sizeof *dbus); + if (dbus == NULL) + return NULL; + + dbus_error_init(&error); + dbus->connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); + if (dbus_error_is_set(&error)) { + free(dbus); + fprintf(stderr, "failed to get system bus %s (%s)\n", + error.name, error.message); + return NULL; + } + + if (!dbus_connection_add_filter(dbus->connection, + wlsc_dbus_filter, dbus, NULL)) + fprintf(stderr, "failed to add filter\n"); + + if (!dbus_connection_get_unix_fd(dbus->connection, &fd)) { + dbus_connection_unref(dbus->connection); + free(dbus); + fprintf(stderr, "failed to get d-bus fd\n"); + return NULL; + } + + dbus->source = wl_event_loop_add_fd(loop, fd, + WL_EVENT_READABLE, + wlsc_dbus_data, dbus); + if (dbus->source == NULL) { + dbus_connection_unref(dbus->connection); + free(dbus); + return NULL; + } + + return dbus; +} diff --git a/wayland-system-compositor.c b/wayland-system-compositor.c index 791e594..3ff6026 100644 --- a/wayland-system-compositor.c +++ b/wayland-system-compositor.c @@ -93,6 +93,8 @@ struct egl_compositor { struct wl_event_source *enter_vt_source; struct wl_event_source *leave_vt_source; + struct wlsc_dbus *dbus; + /* Modesetting info. */ struct drm_mode_modeinfo *mode; uint32_t fb_id; @@ -1070,6 +1072,8 @@ egl_compositor_create(struct wl_display *display) ec->repaint_needed = 0; ec->repaint_on_timeout = 0; + ec->dbus = wlsc_dbus_init(ec, loop); + schedule_repaint(ec); return ec; diff --git a/wayland-system-compositor.h b/wayland-system-compositor.h index 7ff340c..bdd861f 100644 --- a/wayland-system-compositor.h +++ b/wayland-system-compositor.h @@ -19,6 +19,12 @@ #ifndef _WAYLAND_SYSTEM_COMPOSITOR_H_ #define _WAYLAND_SYSTEM_COMPOSITOR_H_ +struct egl_compositor; + +struct wlsc_dbus; +struct wlsc_dbus * +wlsc_dbus_init(struct egl_compositor *ec, struct wl_event_loop *loop); + struct wlsc_input_device; void wlsc_device_get_position(struct wlsc_input_device *device, int32_t *x, int32_t *y); |