diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c index 5126e90494..949a3f8121 100644 --- a/gdk/wayland/gdkdevice-wayland.c +++ b/gdk/wayland/gdkdevice-wayland.c @@ -385,411 +385,6 @@ _gdk_wayland_device_get_keymap (GdkDevice *device) return GDK_DEVICE_CORE (device)->device->keymap; } -#if 0 -static void -input_handle_motion(void *data, struct wl_input_device *input_device, - uint32_t time, - int32_t x, int32_t y, int32_t sx, int32_t sy) -{ - GdkWaylandDevice *device = data; - GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (device->display); - GdkEvent *event; - - event = gdk_event_new (GDK_NOTHING); - - device->time = time; - device->x = x; - device->y = y; - device->surface_x = sx; - device->surface_y = sy; - - event->motion.type = GDK_MOTION_NOTIFY; - event->motion.window = g_object_ref (device->pointer_focus); - gdk_event_set_device (event, device->pointer); - event->motion.time = time; - event->motion.x = (gdouble) sx; - event->motion.y = (gdouble) sy; - event->motion.x_root = (gdouble) x; - event->motion.y_root = (gdouble) y; - event->motion.axes = NULL; - event->motion.state = device->modifiers; - event->motion.is_hint = 0; - gdk_event_set_screen (event, display->screen); - - GDK_NOTE (EVENTS, - g_message ("motion %d %d, state %d", - sx, sy, event->button.state)); - - _gdk_wayland_display_deliver_event (device->display, event); -} - -static void -input_handle_button(void *data, struct wl_input_device *input_device, - uint32_t time, uint32_t button, uint32_t state) -{ - GdkWaylandDevice *device = data; - GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (device->display); - GdkEvent *event; - uint32_t modifier; - int gdk_button; - - switch (button) { - case 273: - gdk_button = 3; - break; - case 274: - gdk_button = 2; - break; - default: - gdk_button = button - 271; - break; - } - - device->time = time; - event = gdk_event_new (state ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE); - event->button.window = g_object_ref (device->pointer_focus); - gdk_event_set_device (event, device->pointer); - event->button.time = time; - event->button.x = (gdouble) device->surface_x; - event->button.y = (gdouble) device->surface_y; - event->button.x_root = (gdouble) device->x; - event->button.y_root = (gdouble) device->y; - event->button.axes = NULL; - event->button.state = device->modifiers; - event->button.button = gdk_button; - gdk_event_set_screen (event, display->screen); - - modifier = 1 << (8 + gdk_button - 1); - if (state) - device->modifiers |= modifier; - else - device->modifiers &= ~modifier; - - GDK_NOTE (EVENTS, - g_message ("button %d %s, state %d", - event->button.button, - state ? "press" : "release", event->button.state)); - - _gdk_wayland_display_deliver_event (device->display, event); -} - -static void -translate_keyboard_string (GdkEventKey *event) -{ - gunichar c = 0; - gchar buf[7]; - - /* Fill in event->string crudely, since various programs - * depend on it. - */ - event->string = NULL; - - if (event->keyval != GDK_KEY_VoidSymbol) - c = gdk_keyval_to_unicode (event->keyval); - - if (c) - { - gsize bytes_written; - gint len; - - /* Apply the control key - Taken from Xlib - */ - if (event->state & GDK_CONTROL_MASK) - { - if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F; - else if (c == '2') - { - event->string = g_memdup ("\0\0", 2); - event->length = 1; - buf[0] = '\0'; - return; - } - else if (c >= '3' && c <= '7') c -= ('3' - '\033'); - else if (c == '8') c = '\177'; - else if (c == '/') c = '_' & 0x1F; - } - - len = g_unichar_to_utf8 (c, buf); - buf[len] = '\0'; - - event->string = g_locale_from_utf8 (buf, len, - NULL, &bytes_written, - NULL); - if (event->string) - event->length = bytes_written; - } - else if (event->keyval == GDK_KEY_Escape) - { - event->length = 1; - event->string = g_strdup ("\033"); - } - else if (event->keyval == GDK_KEY_Return || - event->keyval == GDK_KEY_KP_Enter) - { - event->length = 1; - event->string = g_strdup ("\r"); - } - - if (!event->string) - { - event->length = 0; - event->string = g_strdup (""); - } -} - -static gboolean -keyboard_repeat (gpointer data); - -static gboolean -deliver_key_event(GdkWaylandDevice *device, - uint32_t time, uint32_t key, uint32_t state) -{ - GdkEvent *event; - uint32_t code, modifier, level; - struct xkb_desc *xkb; - GdkKeymap *keymap; - - keymap = gdk_keymap_get_for_display (device->display); - xkb = _gdk_wayland_keymap_get_xkb_desc (keymap); - - device->time = time; - event = gdk_event_new (state ? GDK_KEY_PRESS : GDK_KEY_RELEASE); - event->key.window = g_object_ref (device->keyboard_focus); - gdk_event_set_device (event, device->keyboard); - event->button.time = time; - event->key.state = device->modifiers; - event->key.group = 0; - code = key + xkb->min_key_code; - event->key.hardware_keycode = code; - - level = 0; - if (device->modifiers & XKB_COMMON_SHIFT_MASK && - XkbKeyGroupWidth(xkb, code, 0) > 1) - level = 1; - - event->key.keyval = XkbKeySymEntry(xkb, code, level, 0); - - modifier = xkb->map->modmap[code]; - if (state) - device->modifiers |= modifier; - else - device->modifiers &= ~modifier; - - event->key.is_modifier = modifier > 0; - - translate_keyboard_string (&event->key); - - _gdk_wayland_display_deliver_event (device->display, event); - - GDK_NOTE (EVENTS, - g_message ("keyboard event, code %d, sym %d, " - "string %s, mods 0x%x", - code, event->key.keyval, - event->key.string, event->key.state)); - - device->repeat_count++; - device->repeat_key = key; - - if (state == 0) - { - if (device->repeat_timer) - { - g_source_remove (device->repeat_timer); - device->repeat_timer = 0; - } - return FALSE; - } - else if (modifier) - { - return FALSE; - } - else switch (device->repeat_count) - { - case 1: - if (device->repeat_timer) - { - g_source_remove (device->repeat_timer); - device->repeat_timer = 0; - } - - device->repeat_timer = - gdk_threads_add_timeout (400, keyboard_repeat, device); - return TRUE; - case 2: - device->repeat_timer = - gdk_threads_add_timeout (80, keyboard_repeat, device); - return FALSE; - default: - return TRUE; - } -} - -static gboolean -keyboard_repeat (gpointer data) -{ - GdkWaylandDevice *device = data; - - return deliver_key_event (device, device->time, device->repeat_key, 1); -} - -static void -input_handle_key(void *data, struct wl_input_device *input_device, - uint32_t time, uint32_t key, uint32_t state) -{ - GdkWaylandDevice *device = data; - - device->repeat_count = 0; - deliver_key_event (data, time, key, state); -} - -static void -input_handle_pointer_focus(void *data, - struct wl_input_device *input_device, - uint32_t time, struct wl_surface *surface, - int32_t x, int32_t y, int32_t sx, int32_t sy) -{ - GdkWaylandDevice *device = data; - GdkEvent *event; - - device->time = time; - if (device->pointer_focus) - { - event = gdk_event_new (GDK_LEAVE_NOTIFY); - event->crossing.window = g_object_ref (device->pointer_focus); - gdk_event_set_device (event, device->pointer); - event->crossing.subwindow = NULL; - event->crossing.time = time; - event->crossing.x = (gdouble) device->surface_x; - event->crossing.y = (gdouble) device->surface_y; - event->crossing.x_root = (gdouble) device->x; - event->crossing.y_root = (gdouble) device->y; - - event->crossing.mode = GDK_CROSSING_NORMAL; - event->crossing.detail = GDK_NOTIFY_ANCESTOR; - event->crossing.focus = TRUE; - event->crossing.state = 0; - - _gdk_wayland_display_deliver_event (device->display, event); - - GDK_NOTE (EVENTS, - g_message ("leave, device %p surface %p", - device, device->pointer_focus)); - - g_object_unref(device->pointer_focus); - device->pointer_focus = NULL; - } - - if (surface) - { - device->pointer_focus = wl_surface_get_user_data(surface); - g_object_ref(device->pointer_focus); - - event = gdk_event_new (GDK_ENTER_NOTIFY); - event->crossing.window = g_object_ref (device->pointer_focus); - gdk_event_set_device (event, device->pointer); - event->crossing.subwindow = NULL; - event->crossing.time = time; - event->crossing.x = (gdouble) sx; - event->crossing.y = (gdouble) sy; - event->crossing.x_root = (gdouble) x; - event->crossing.y_root = (gdouble) y; - - event->crossing.mode = GDK_CROSSING_NORMAL; - event->crossing.detail = GDK_NOTIFY_ANCESTOR; - event->crossing.focus = TRUE; - event->crossing.state = 0; - - device->surface_x = sx; - device->surface_y = sy; - device->x = x; - device->y = y; - - _gdk_wayland_display_deliver_event (device->display, event); - - GDK_NOTE (EVENTS, - g_message ("enter, device %p surface %p", - device, device->pointer_focus)); - } -} - -static void -update_modifiers(GdkWaylandDevice *device, struct wl_array *keys) -{ - uint32_t *k, *end; - GdkKeymap *keymap; - struct xkb_desc *xkb; - - keymap = gdk_keymap_get_for_display (device->display); - xkb = _gdk_wayland_keymap_get_xkb_desc (keymap); - - end = keys->data + keys->size; - device->modifiers = 0; - for (k = keys->data; k < end; k++) - device->modifiers |= xkb->map->modmap[*k]; -} - -static void -input_handle_keyboard_focus(void *data, - struct wl_input_device *input_device, - uint32_t time, - struct wl_surface *surface, - struct wl_array *keys) -{ - GdkWaylandDevice *device = data; - GdkEvent *event; - - device->time = time; - if (device->keyboard_focus) - { - _gdk_wayland_window_remove_focus (device->keyboard_focus); - event = gdk_event_new (GDK_FOCUS_CHANGE); - event->focus_change.window = g_object_ref (device->keyboard_focus); - event->focus_change.send_event = FALSE; - event->focus_change.in = FALSE; - gdk_event_set_device (event, device->keyboard); - - g_object_unref(device->keyboard_focus); - device->keyboard_focus = NULL; - - GDK_NOTE (EVENTS, - g_message ("focus out, device %p surface %p", - device, device->keyboard_focus)); - - _gdk_wayland_display_deliver_event (device->display, event); - } - - if (surface) - { - device->keyboard_focus = wl_surface_get_user_data(surface); - g_object_ref(device->keyboard_focus); - - event = gdk_event_new (GDK_FOCUS_CHANGE); - event->focus_change.window = g_object_ref (device->keyboard_focus); - event->focus_change.send_event = FALSE; - event->focus_change.in = TRUE; - gdk_event_set_device (event, device->keyboard); - - update_modifiers (device, keys); - - GDK_NOTE (EVENTS, - g_message ("focus int, device %p surface %p", - device, device->keyboard_focus)); - - _gdk_wayland_display_deliver_event (device->display, event); - - _gdk_wayland_window_add_focus (device->keyboard_focus); - } -} - -static const struct wl_input_device_listener input_device_listener = { - input_handle_motion, - input_handle_button, - input_handle_key, - input_handle_pointer_focus, - input_handle_keyboard_focus, -}; -#endif - struct _DataOffer { struct wl_data_offer *offer; gint ref_count;