diff --git a/clutter/Makefile.am b/clutter/Makefile.am index fc153b69e..813ca61af 100644 --- a/clutter/Makefile.am +++ b/clutter/Makefile.am @@ -22,6 +22,7 @@ INCLUDES = \ -I$(top_srcdir)/clutter/$(CLUTTER_WINSYS) \ -I$(top_srcdir)/clutter/$(CLUTTER_WINSYS_BASE) \ -I$(top_srcdir)/clutter/cally \ + -I$(top_srcdir)/clutter/evdev \ -I$(top_builddir) \ -I$(top_builddir)/clutter \ -I$(top_builddir)/clutter/cogl \ @@ -513,13 +514,15 @@ backend_source_h += \ $(srcdir)/wayland/clutter-wayland.h backend_source_h_priv += \ - $(srcdir)/wayland/clutter-backend-wayland.h \ + $(srcdir)/evdev/clutter-xkb-utils.h \ + $(srcdir)/wayland/clutter-backend-wayland.h \ $(srcdir)/wayland/clutter-stage-wayland.h backend_source_c += \ - $(srcdir)/wayland/clutter-backend-wayland.c \ - $(srcdir)/wayland/clutter-stage-wayland.c \ - $(srcdir)/wayland/clutter-event-wayland.c \ + $(srcdir)/evdev/clutter-xkb-utils.c \ + $(srcdir)/wayland/clutter-backend-wayland.c \ + $(srcdir)/wayland/clutter-stage-wayland.c \ + $(srcdir)/wayland/clutter-event-wayland.c \ $(srcdir)/wayland/clutter-input-device-wayland.c clutterwayland_includedir = $(clutter_includedir)/wayland diff --git a/clutter/evdev/clutter-xkb-utils.c b/clutter/evdev/clutter-xkb-utils.c new file mode 100644 index 000000000..f0c3b5859 --- /dev/null +++ b/clutter/evdev/clutter-xkb-utils.c @@ -0,0 +1,111 @@ +/* + * Clutter. + * + * An OpenGL based 'interactive canvas' library. + * + * Copyright (C) 2010 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + + * Authors: + * Kristian Høgsberg + */ + +#include "clutter-keysyms.h" +#include "clutter-xkb-utils.h" + +/* + * _clutter_event_new_from_evdev: Create a new Clutter ClutterKeyEvent + * @device: a ClutterInputDevice + * @stage: the stage the event should be delivered to + * @xkb: XKB rules to translate the event + * @_time: timestamp of the event + * @key: a key code coming from a Linux input device + * @state: TRUE if a press event, FALSE if a release event + * @modifer_state: in/out + * + * Translate @key to a #ClutterKeyEvent using rules from xbbcommon. + * + * Return value: the new #ClutterEvent + */ +ClutterEvent * +_clutter_key_event_new_from_evdev (ClutterInputDevice *device, + ClutterStage *stage, + struct xkb_desc *xkb, + uint32_t _time, + uint32_t key, + uint32_t state, + uint32_t *modifier_state) +{ + ClutterEvent *event; + uint32_t code, sym, level; + char buffer[128]; + int n; + + if (state) + event = clutter_event_new (CLUTTER_KEY_PRESS); + else + event = clutter_event_new (CLUTTER_KEY_RELEASE); + + code = key + xkb->min_key_code; + level = 0; + + if (*modifier_state & CLUTTER_SHIFT_MASK && + XkbKeyGroupWidth (xkb, code, 0) > 1) + level = 1; + + sym = XkbKeySymEntry (xkb, code, level, 0); + if (state) + *modifier_state |= xkb->map->modmap[code]; + else + *modifier_state &= ~xkb->map->modmap[code]; + + event->key.device = device; + event->key.stage = stage; + event->key.time = _time; + event->key.modifier_state = *modifier_state; + event->key.hardware_keycode = key; + event->key.keyval = sym; + event->key.unicode_value = sym; + + return event; +} + +/* + * _clutter_xkb_desc_new: + * + * Create a new xkbcommon keymap. + * + * FIXME: We need a way to override the layout here, a fixed or runtime + * detected layout is provided by the backend calling _clutter_xkb_desc_new(); + */ +struct xkb_desc * +_clutter_xkb_desc_new (const gchar *model, + const gchar *layout, + const gchar *variant, + const gchar *options) +{ + struct xkb_rule_names names; + + names.rules = "evdev"; + if (model) + names.model = model; + else + names.model = "pc105"; + names.layout = layout; + names.variant = variant; + names.options = options; + + return xkb_compile_keymap_from_rules (&names); +} diff --git a/clutter/evdev/clutter-xkb-utils.h b/clutter/evdev/clutter-xkb-utils.h new file mode 100644 index 000000000..34e65c616 --- /dev/null +++ b/clutter/evdev/clutter-xkb-utils.h @@ -0,0 +1,41 @@ +/* + * Clutter. + * + * An OpenGL based 'interactive canvas' library. + * + * Copyright (C) 2010 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + + * Authors: + * Damien Lespiau + */ + +#include + +#include "clutter-stage.h" +#include "clutter-event.h" +#include "clutter-input-device.h" + +ClutterEvent * _clutter_key_event_new_from_evdev (ClutterInputDevice *device, + ClutterStage *stage, + struct xkb_desc *xkb, + uint32_t _time, + uint32_t key, + uint32_t state, + uint32_t *modifier_state); +struct xkb_desc * _clutter_xkb_desc_new (const gchar *model, + const gchar *layout, + const gchar *variant, + const gchar *options); diff --git a/clutter/wayland/clutter-input-device-wayland.c b/clutter/wayland/clutter-input-device-wayland.c index 81c1dbc63..2e624035d 100644 --- a/clutter/wayland/clutter-input-device-wayland.c +++ b/clutter/wayland/clutter-input-device-wayland.c @@ -32,12 +32,11 @@ #include #include -#include - #include "clutter-debug.h" #include "clutter-device-manager-private.h" #include "clutter-private.h" #include "clutter-keysyms.h" +#include "clutter-xkb-utils.h" #include "clutter-stage-wayland.h" @@ -147,33 +146,12 @@ clutter_backend_wayland_handle_key (void *data, ClutterStageWayland *stage_wayland = device->keyboard_focus; ClutterMainContext *clutter_context; ClutterEvent *event; - uint32_t code, sym, level; - if (state) - event = clutter_event_new (CLUTTER_KEY_PRESS); - else - event = clutter_event_new (CLUTTER_KEY_RELEASE); - - code = key + device->xkb->min_key_code; - level = 0; - - if (device->modifier_state & CLUTTER_SHIFT_MASK && - XkbKeyGroupWidth (device->xkb, code, 0) > 1) - level = 1; - - sym = XkbKeySymEntry (device->xkb, code, level, 0); - if (state) - device->modifier_state |= device->xkb->map->modmap[code]; - else - device->modifier_state &= ~device->xkb->map->modmap[code]; - - event->key.device = CLUTTER_INPUT_DEVICE (device); - event->key.stage = stage_wayland->wrapper; - event->key.time = _time; - event->key.modifier_state = device->modifier_state; - event->key.hardware_keycode = key; - event->key.keyval = sym; - event->key.unicode_value = sym; + event = _clutter_key_event_new_from_evdev ((ClutterInputDevice *) device, + stage_wayland->wrapper, + device->xkb, + _time, key, state + &device->modifier_state); clutter_context = _clutter_context_get_default (); g_queue_push_head (clutter_context->events_queue, event); @@ -315,7 +293,6 @@ _clutter_backend_add_input_device (ClutterBackendWayland *backend_wayland, uint32_t id) { ClutterInputDeviceWayland *device; - struct xkb_rule_names names; device = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_WAYLAND, "id", id, @@ -329,13 +306,10 @@ _clutter_backend_add_input_device (ClutterBackendWayland *backend_wayland, &input_device_listener, device); wl_input_device_set_user_data (device->input_device, device); - names.rules = "evdev"; - names.model = "pc105"; - names.layout = option_xkb_layout; - names.variant = option_xkb_variant; - names.options = option_xkb_options; - - device->xkb = xkb_compile_keymap_from_rules (&names); + device->xkb = _clutter_xkb_desc_new (NULL, + option_xkb_layout, + option_xkb_variant, + option_xkb_options); if (!device->xkb) CLUTTER_NOTE (BACKEND, "Failed to compile keymap"); }