summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2008-11-24 00:31:49 -0500
committerKristian Høgsberg <krh@redhat.com>2008-11-24 00:31:49 -0500
commitcddc0ad502a03040916b47fc75647cd05a9b5e18 (patch)
tree3b5377e7416a1a658f263b3777fe6ef7c3e96023
parentec8ef722e90338c631734d1a1f72b06b6678de6b (diff)
downloadwayland-cddc0ad502a03040916b47fc75647cd05a9b5e18.tar.gz
wayland-cddc0ad502a03040916b47fc75647cd05a9b5e18.tar.xz
wayland-cddc0ad502a03040916b47fc75647cd05a9b5e18.zip
Add keyboard input, move input device creation to compositor.
-rw-r--r--Makefile3
-rw-r--r--egl-compositor.c45
-rw-r--r--evdev.c10
-rw-r--r--wayland.c59
-rw-r--r--wayland.h11
5 files changed, 88 insertions, 40 deletions
diff --git a/Makefile b/Makefile
index 2d98d70..9999cfc 100644
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,6 @@ wayland_objs = \
wayland.o \
event-loop.o \
connection.o \
- evdev.o \
wayland-util.o
wayland : CFLAGS += $(shell pkg-config --cflags libffi)
@@ -29,7 +28,7 @@ libwayland.so : $(libwayland_objs)
$(compositors) $(clients) : CFLAGS += $(shell pkg-config --cflags libdrm)
-egl_compositor_objs = egl-compositor.o cairo-util.o
+egl_compositor_objs = egl-compositor.o evdev.o cairo-util.o
egl-compositor.so : CFLAGS += $(EAGLE_CFLAGS) $(shell pkg-config --cflags libpng cairo gdk-pixbuf-2.0)
egl-compositor.so : LDLIBS += $(EAGLE_LDLIBS) $(shell pkg-config --libs libpng cairo gdk-pixbuf-2.0) -rdynamic
diff --git a/egl-compositor.c b/egl-compositor.c
index 8d723b8..d24ab00 100644
--- a/egl-compositor.c
+++ b/egl-compositor.c
@@ -14,6 +14,7 @@
#include <glib.h>
#include <png.h>
#include <math.h>
+#include <linux/input.h>
#include "wayland.h"
#include "cairo-util.h"
@@ -630,6 +631,16 @@ notify_pointer_motion(struct wl_compositor *compositor,
schedule_repaint(ec);
}
+static void
+notify_key(struct wl_compositor *compositor,
+ struct wl_object *source, uint32_t key, uint32_t state)
+{
+ struct egl_compositor *ec = (struct egl_compositor *) compositor;
+
+ if (key == KEY_ESC)
+ schedule_repaint(ec);
+}
+
static const struct wl_compositor_interface interface = {
notify_surface_create,
notify_surface_destroy,
@@ -637,9 +648,38 @@ static const struct wl_compositor_interface interface = {
notify_surface_map,
notify_surface_copy,
notify_surface_damage,
- notify_pointer_motion
+ notify_pointer_motion,
+ notify_key
};
+static const char pointer_device_file[] =
+ "/dev/input/by-id/usb-Apple__Inc._Apple_Internal_Keyboard_._Trackpad-event-mouse";
+static const char keyboard_device_file[] =
+ "/dev/input/by-id/usb-Apple__Inc._Apple_Internal_Keyboard_._Trackpad-event-kbd";
+
+static void
+create_input_devices(struct wl_display *display)
+{
+ struct wl_object *obj;
+ const char *path;
+
+ path = getenv("WAYLAND_POINTER");
+ if (path == NULL)
+ path = pointer_device_file;
+
+ obj = wl_input_device_create(display, path);
+ if (obj != NULL)
+ wl_display_add_object(display, obj);
+
+ path = getenv("WAYLAND_KEYBOARD");
+ if (path == NULL)
+ path = keyboard_device_file;
+
+ obj = wl_input_device_create(display, path);
+ if (obj != NULL)
+ wl_display_add_object(display, obj);
+}
+
static const char gem_device[] = "/dev/dri/card0";
WL_EXPORT struct wl_compositor *
@@ -701,7 +741,8 @@ wl_compositor_create(struct wl_display *display)
glLoadIdentity();
glOrtho(0, ec->width, ec->height, 0, 0, 1000.0);
glMatrixMode(GL_MODELVIEW);
- glClearColor(0.0, 0.05, 0.2, 0.0);
+
+ create_input_devices(display);
filename = getenv("WAYLAND_BACKGROUND");
if (filename == NULL)
diff --git a/evdev.c b/evdev.c
index ee51e0e..3682321 100644
--- a/evdev.c
+++ b/evdev.c
@@ -104,6 +104,11 @@ static void wl_input_device_data(int fd, uint32_t mask, void *data)
wl_display_post_button_event(device->display,
&device->base, 1, value);
break;
+
+ default:
+ wl_display_post_key_event(device->display,
+ &device->base, e->code, value);
+ break;
}
}
}
@@ -117,9 +122,8 @@ static void wl_input_device_data(int fd, uint32_t mask, void *data)
device->x, device->y);
}
-struct wl_object *
-wl_input_device_create(struct wl_display *display,
- const char *path, uint32_t id)
+WL_EXPORT struct wl_object *
+wl_input_device_create(struct wl_display *display, const char *path)
{
struct wl_input_device *device;
struct wl_event_loop *loop;
diff --git a/wayland.c b/wayland.c
index 5639564..5b883c9 100644
--- a/wayland.c
+++ b/wayland.c
@@ -511,27 +511,6 @@ static const struct wl_interface display_interface = {
ARRAY_LENGTH(display_events), display_events,
};
-static const char input_device_file[] =
- "/dev/input/by-id/usb-Apple__Inc._Apple_Internal_Keyboard_._Trackpad-event-mouse";
-
-static void
-wl_display_create_input_devices(struct wl_display *display)
-{
- const char *path;
-
- path = getenv("WAYLAND_POINTER");
- if (path == NULL)
- path = input_device_file;
-
- display->pointer = wl_input_device_create(display, path, 1);
-
- if (display->pointer != NULL)
- wl_display_add_object(display, display->pointer);
-
- display->pointer_x = 100;
- display->pointer_y = 100;
-}
-
static struct wl_display *
wl_display_create(void)
{
@@ -551,7 +530,8 @@ wl_display_create(void)
wl_list_init(&display->client_list);
wl_list_init(&display->global_list);
- wl_display_create_input_devices(display);
+ display->pointer_x = 100;
+ display->pointer_y = 100;
display->client_id_range = 256; /* Gah, arbitrary... */
@@ -604,10 +584,11 @@ wl_display_send_event(struct wl_display *display, uint32_t *data, size_t size)
}
}
-#define WL_POINTER_MOTION 0
-#define WL_POINTER_BUTTON 1
+#define WL_INPUT_MOTION 0
+#define WL_INPUT_BUTTON 1
+#define WL_INPUT_KEY 2
-void
+WL_EXPORT void
wl_display_post_relative_event(struct wl_display *display,
struct wl_object *source, int dx, int dy)
{
@@ -622,14 +603,14 @@ wl_display_post_relative_event(struct wl_display *display,
display->pointer_x, display->pointer_y);
p[0] = source->id;
- p[1] = (sizeof p << 16) | WL_POINTER_MOTION;
+ p[1] = (sizeof p << 16) | WL_INPUT_MOTION;
p[2] = display->pointer_x;
p[3] = display->pointer_y;
wl_display_send_event(display, p, sizeof p);
}
-void
+WL_EXPORT void
wl_display_post_absolute_event(struct wl_display *display,
struct wl_object *source, int x, int y)
{
@@ -644,27 +625,45 @@ wl_display_post_absolute_event(struct wl_display *display,
display->pointer_x, display->pointer_y);
p[0] = source->id;
- p[1] = (sizeof p << 16) | WL_POINTER_MOTION;
+ p[1] = (sizeof p << 16) | WL_INPUT_MOTION;
p[2] = display->pointer_x;
p[3] = display->pointer_y;
wl_display_send_event(display, p, sizeof p);
}
-void
+WL_EXPORT void
wl_display_post_button_event(struct wl_display *display,
struct wl_object *source, int button, int state)
{
uint32_t p[4];
p[0] = source->id;
- p[1] = (sizeof p << 16) | WL_POINTER_BUTTON;
+ p[1] = (sizeof p << 16) | WL_INPUT_BUTTON;
p[2] = button;
p[3] = state;
wl_display_send_event(display, p, sizeof p);
}
+WL_EXPORT void
+wl_display_post_key_event(struct wl_display *display,
+ struct wl_object *source, int key, int state)
+{
+ const struct wl_compositor_interface *interface;
+ uint32_t p[4];
+
+ interface = display->compositor->interface;
+ interface->notify_key(display->compositor, source, key, state);
+
+ p[0] = source->id;
+ p[1] = (sizeof p << 16) | WL_INPUT_KEY;
+ p[2] = key;
+ p[3] = state;
+
+ wl_display_send_event(display, p, sizeof p);
+}
+
void
wl_display_set_compositor(struct wl_display *display,
struct wl_compositor *compositor)
diff --git a/wayland.h b/wayland.h
index d15229f..061f4b2 100644
--- a/wayland.h
+++ b/wayland.h
@@ -90,8 +90,8 @@ int wl_surface_iterator_next(struct wl_surface_iterator *iterator,
void wl_surface_iterator_destroy(struct wl_surface_iterator *iterator);
struct wl_object *
-wl_input_device_create(struct wl_display *display,
- const char *path, uint32_t id);
+wl_input_device_create(struct wl_display *display, const char *path);
+
void
wl_display_add_object(struct wl_display *display, struct wl_object *object);
int
@@ -106,6 +106,9 @@ wl_display_post_absolute_event(struct wl_display *display,
void
wl_display_post_button_event(struct wl_display *display,
struct wl_object *source, int button, int state);
+void
+wl_display_post_key_event(struct wl_display *display,
+ struct wl_object *source, int key, int state);
struct wl_compositor {
const struct wl_compositor_interface *interface;
@@ -137,7 +140,9 @@ struct wl_compositor_interface {
void (*notify_pointer_motion)(struct wl_compositor *compositor,
struct wl_object *source,
int32_t x, int32_t y);
-
+ void (*notify_key)(struct wl_compositor *compositor,
+ struct wl_object *source,
+ uint32_t key, uint32_t state);
};
void wl_display_set_compositor(struct wl_display *display,