summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2008-12-19 17:08:05 -0500
committerRay Strode <rstrode@redhat.com>2008-12-20 02:02:15 -0500
commit05a2b476ee9f1224299982195e27d0e973465211 (patch)
tree56a868fb410c9eab2a749ecfb7edfb890fd442f0
parent246f4522b4699832a4fb3a44310742770f9d4a58 (diff)
start of dbus
-rw-r--r--Makefile.in1
-rw-r--r--configure.ac2
-rw-r--r--dbus.c73
-rw-r--r--wayland-system-compositor.c4
-rw-r--r--wayland-system-compositor.h6
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])
diff --git a/dbus.c b/dbus.c
new file mode 100644
index 0000000..b42bb39
--- /dev/null
+++ b/dbus.c
@@ -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);