1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 2009 Carlos Garnacho <carlosg@gnome.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
22 #include "gdkdevicemanager-broadway.h"
25 #include "gdkdevicemanager.h"
26 #include "gdkdevice-broadway.h"
27 #include "gdkkeysyms.h"
28 #include "gdkprivate-broadway.h"
32 #include <X11/XKBlib.h>
36 #define HAS_FOCUS(toplevel) \
37 ((toplevel)->has_focus || (toplevel)->has_pointer_focus)
39 static void gdk_device_manager_core_finalize (GObject *object);
40 static void gdk_device_manager_core_constructed (GObject *object);
42 static GList * gdk_device_manager_core_list_devices (GdkDeviceManager *device_manager,
44 static GdkDevice * gdk_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager);
46 G_DEFINE_TYPE (GdkDeviceManagerCore, gdk_device_manager_core, GDK_TYPE_DEVICE_MANAGER)
49 gdk_device_manager_core_class_init (GdkDeviceManagerCoreClass *klass)
51 GdkDeviceManagerClass *device_manager_class = GDK_DEVICE_MANAGER_CLASS (klass);
52 GObjectClass *object_class = G_OBJECT_CLASS (klass);
54 object_class->finalize = gdk_device_manager_core_finalize;
55 object_class->constructed = gdk_device_manager_core_constructed;
56 device_manager_class->list_devices = gdk_device_manager_core_list_devices;
57 device_manager_class->get_client_pointer = gdk_device_manager_core_get_client_pointer;
61 create_core_pointer (GdkDeviceManager *device_manager,
64 return g_object_new (GDK_TYPE_DEVICE_CORE,
65 "name", "Core Pointer",
66 "type", GDK_DEVICE_TYPE_MASTER,
67 "input-source", GDK_SOURCE_MOUSE,
68 "input-mode", GDK_MODE_SCREEN,
71 "device-manager", device_manager,
76 create_core_keyboard (GdkDeviceManager *device_manager,
79 return g_object_new (GDK_TYPE_DEVICE_CORE,
80 "name", "Core Keyboard",
81 "type", GDK_DEVICE_TYPE_MASTER,
82 "input-source", GDK_SOURCE_KEYBOARD,
83 "input-mode", GDK_MODE_SCREEN,
86 "device-manager", device_manager,
91 gdk_device_manager_core_init (GdkDeviceManagerCore *device_manager)
96 gdk_device_manager_core_finalize (GObject *object)
98 GdkDeviceManagerCore *device_manager_core;
100 device_manager_core = GDK_DEVICE_MANAGER_CORE (object);
102 g_object_unref (device_manager_core->core_pointer);
103 g_object_unref (device_manager_core->core_keyboard);
105 G_OBJECT_CLASS (gdk_device_manager_core_parent_class)->finalize (object);
109 gdk_device_manager_core_constructed (GObject *object)
111 GdkDeviceManagerCore *device_manager;
114 device_manager = GDK_DEVICE_MANAGER_CORE (object);
115 display = gdk_device_manager_get_display (GDK_DEVICE_MANAGER (object));
116 device_manager->core_pointer = create_core_pointer (GDK_DEVICE_MANAGER (device_manager), display);
117 device_manager->core_keyboard = create_core_keyboard (GDK_DEVICE_MANAGER (device_manager), display);
119 _gdk_device_set_associated_device (device_manager->core_pointer, device_manager->core_keyboard);
120 _gdk_device_set_associated_device (device_manager->core_keyboard, device_manager->core_pointer);
124 translate_key_event (GdkDisplay *display,
125 GdkDeviceManagerCore *device_manager,
129 GdkKeymap *keymap = gdk_keymap_get_for_display (display);
130 GdkModifierType consumed, state;
134 event->key.type = xevent->xany.type == KeyPress ? GDK_KEY_PRESS : GDK_KEY_RELEASE;
135 event->key.time = xevent->xkey.time;
136 gdk_event_set_device (event, device_manager->core_keyboard);
138 event->key.state = (GdkModifierType) xevent->xkey.state;
139 event->key.group = _gdk_x11_get_group_for_state (display, xevent->xkey.state);
140 event->key.hardware_keycode = xevent->xkey.keycode;
142 event->key.keyval = GDK_KEY_VoidSymbol;
144 gdk_keymap_translate_keyboard_state (keymap,
145 event->key.hardware_keycode,
149 NULL, NULL, &consumed);
151 state = event->key.state & ~consumed;
152 _gdk_keymap_add_virtual_modifiers_compat (keymap, &state);
153 event->key.state |= state;
155 event->key.is_modifier = _gdk_keymap_key_is_modifier (keymap, event->key.hardware_keycode);
157 /* Fill in event->string crudely, since various programs
160 event->key.string = NULL;
162 if (event->key.keyval != GDK_KEY_VoidSymbol)
163 c = gdk_keyval_to_unicode (event->key.keyval);
170 /* Apply the control key - Taken from Xlib
172 if (event->key.state & GDK_CONTROL_MASK)
174 if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
177 event->key.string = g_memdup ("\0\0", 2);
178 event->key.length = 1;
182 else if (c >= '3' && c <= '7') c -= ('3' - '\033');
183 else if (c == '8') c = '\177';
184 else if (c == '/') c = '_' & 0x1F;
187 len = g_unichar_to_utf8 (c, buf);
190 event->key.string = g_locale_from_utf8 (buf, len,
191 NULL, &bytes_written,
193 if (event->key.string)
194 event->key.length = bytes_written;
196 else if (event->key.keyval == GDK_KEY_Escape)
198 event->key.length = 1;
199 event->key.string = g_strdup ("\033");
201 else if (event->key.keyval == GDK_KEY_Return ||
202 event->key.keyval == GDK_KEY_KP_Enter)
204 event->key.length = 1;
205 event->key.string = g_strdup ("\r");
208 if (!event->key.string)
210 event->key.length = 0;
211 event->key.string = g_strdup ("");
215 #ifdef G_ENABLE_DEBUG
216 if (_gdk_debug_flags & GDK_DEBUG_EVENTS)
218 g_message ("%s:\t\twindow: %ld key: %12s %d",
219 event->type == GDK_KEY_PRESS ? "key press " : "key release",
221 event->key.keyval ? gdk_keyval_name (event->key.keyval) : "(none)",
224 if (event->key.length > 0)
225 g_message ("\t\tlength: %4d string: \"%s\"",
226 event->key.length, buf);
228 #endif /* G_ENABLE_DEBUG */
232 #ifdef G_ENABLE_DEBUG
233 static const char notify_modes[][19] = {
240 static const char notify_details[][23] = {
245 "NotifyNonlinearVirtual",
253 set_user_time (GdkWindow *window,
256 g_return_if_fail (event != NULL);
258 window = gdk_window_get_toplevel (event->client.window);
259 g_return_if_fail (GDK_IS_WINDOW (window));
261 /* If an event doesn't have a valid timestamp, we shouldn't use it
262 * to update the latest user interaction time.
264 if (gdk_event_get_time (event) != GDK_CURRENT_TIME)
265 gdk_x11_window_set_user_time (gdk_window_get_toplevel (window),
266 gdk_event_get_time (event));
270 generate_focus_event (GdkDeviceManagerCore *device_manager,
276 event = gdk_event_new (GDK_FOCUS_CHANGE);
277 event->focus_change.window = g_object_ref (window);
278 event->focus_change.send_event = FALSE;
279 event->focus_change.in = in;
280 gdk_event_set_device (event, device_manager->core_keyboard);
282 gdk_event_put (event);
283 gdk_event_free (event);
287 set_screen_from_root (GdkDisplay *display,
293 screen = _gdk_x11_display_screen_for_xrootwin (display, xrootwin);
297 gdk_event_set_screen (event, screen);
305 static GdkCrossingMode
306 translate_crossing_mode (int mode)
311 return GDK_CROSSING_NORMAL;
313 return GDK_CROSSING_GRAB;
315 return GDK_CROSSING_UNGRAB;
317 g_assert_not_reached ();
322 translate_notify_type (int detail)
327 return GDK_NOTIFY_INFERIOR;
329 return GDK_NOTIFY_ANCESTOR;
331 return GDK_NOTIFY_VIRTUAL;
332 case NotifyNonlinear:
333 return GDK_NOTIFY_NONLINEAR;
334 case NotifyNonlinearVirtual:
335 return GDK_NOTIFY_NONLINEAR_VIRTUAL;
337 g_assert_not_reached ();
342 is_parent_of (GdkWindow *parent,
353 w = gdk_window_get_parent (w);
360 gdk_device_manager_core_list_devices (GdkDeviceManager *device_manager,
363 GdkDeviceManagerCore *device_manager_core;
364 GList *devices = NULL;
366 if (type == GDK_DEVICE_TYPE_MASTER)
368 device_manager_core = (GdkDeviceManagerCore *) device_manager;
369 devices = g_list_prepend (devices, device_manager_core->core_keyboard);
370 devices = g_list_prepend (devices, device_manager_core->core_pointer);
377 gdk_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager)
379 GdkDeviceManagerCore *device_manager_core;
381 device_manager_core = (GdkDeviceManagerCore *) device_manager;
382 return device_manager_core->core_pointer;
386 _gdk_device_manager_new (GdkDisplay *display)
388 return g_object_new (GDK_TYPE_DEVICE_MANAGER_CORE,