From cddc0ad502a03040916b47fc75647cd05a9b5e18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Mon, 24 Nov 2008 00:31:49 -0500 Subject: [PATCH] Add keyboard input, move input device creation to compositor. --- Makefile | 3 +-- egl-compositor.c | 45 ++++++++++++++++++++++++++++++++++-- evdev.c | 10 +++++--- wayland.c | 59 ++++++++++++++++++++++++------------------------ wayland.h | 11 ++++++--- 5 files changed, 88 insertions(+), 40 deletions(-) diff --git a/Makefile b/Makefile index 2d98d704..9999cfc6 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 8d723b82..d24ab003 100644 --- a/egl-compositor.c +++ b/egl-compositor.c @@ -14,6 +14,7 @@ #include #include #include +#include #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 ee51e0ef..36823213 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 56395643..5b883c90 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 d15229f6..061f4b2c 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,