1 /* GDK - The GIMP Drawing Kit
2 * gdkdisplaymanager-wayland.c
4 * Copyright 2010 Red Hat, Inc.
6 * Author: Matthias clasen
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
26 #include "gdkdisplaymanagerprivate.h"
27 #include "gdkdisplay-wayland.h"
28 #include "gdkprivate-wayland.h"
30 #include "gdkinternals.h"
32 #include <X11/extensions/XKBcommon.h>
34 typedef struct _GdkWaylandDisplayManager GdkWaylandDisplayManager;
35 typedef struct _GdkWaylandDisplayManagerClass GdkWaylandDisplayManagerClass;
37 #define GDK_TYPE_WAYLAND_DISPLAY_MANAGER (gdk_wayland_display_manager_get_type())
38 #define GDK_WAYLAND_DISPLAY_MANAGER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WAYLAND_DISPLAY_MANAGER, GdkWaylandDisplayManager))
39 #define GDK_WAYLAND_DISPLAY_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_WAYLAND_DISPLAY_MANAGER, GdkWaylandDisplayManagerClass))
40 #define GDK_IS_WAYLAND_DISPLAY_MANAGER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_WAYLAND_DISPLAY_MANAGER))
41 #define GDK_IS_WAYLAND_DISPLAY_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WAYLAND_DISPLAY_MANAGER))
42 #define GDK_WAYLAND_DISPLAY_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_WAYLAND_DISPLAY_MANAGER, GdkWaylandDisplayManagerClass))
44 struct _GdkWaylandDisplayManager
46 GdkDisplayManager parent;
48 GdkDisplay *default_display;
52 struct _GdkWaylandDisplayManagerClass
54 GdkDisplayManagerClass parent_class;
57 G_DEFINE_TYPE (GdkWaylandDisplayManager, gdk_wayland_display_manager, GDK_TYPE_DISPLAY_MANAGER)
60 gdk_wayland_display_manager_finalize (GObject *object)
62 g_error ("A GdkWaylandDisplayManager object was finalized. This should not happen");
63 G_OBJECT_CLASS (gdk_wayland_display_manager_parent_class)->finalize (object);
67 gdk_wayland_display_manager_open_display (GdkDisplayManager *manager,
70 return _gdk_wayland_display_open (name);
74 gdk_wayland_display_manager_list_displays (GdkDisplayManager *manager)
76 return g_slist_copy (GDK_WAYLAND_DISPLAY_MANAGER (manager)->displays);
80 gdk_wayland_display_manager_set_default_display (GdkDisplayManager *manager,
83 GDK_WAYLAND_DISPLAY_MANAGER (manager)->default_display = display;
85 _gdk_wayland_display_make_default (display);
89 gdk_wayland_display_manager_get_default_display (GdkDisplayManager *manager)
91 return GDK_WAYLAND_DISPLAY_MANAGER (manager)->default_display;
95 gdk_wayland_display_manager_atom_intern (GdkDisplayManager *manager,
96 const gchar *atom_name,
103 gdk_wayland_display_manager_get_atom_name (GdkDisplayManager *manager,
110 gdk_wayland_display_manager_lookup_keyval (GdkDisplayManager *manager,
111 const gchar *keyval_name)
113 g_return_val_if_fail (keyval_name != NULL, 0);
115 return xkb_string_to_keysym(keyval_name);
119 gdk_wayland_display_manager_get_keyval_name (GdkDisplayManager *manager,
122 static char buf[128];
126 case GDK_KEY_Page_Up:
128 case GDK_KEY_Page_Down:
130 case GDK_KEY_KP_Page_Up:
132 case GDK_KEY_KP_Page_Down:
133 return "KP_Page_Down";
136 xkb_keysym_to_string(keyval, buf, sizeof buf);
142 gdk_wayland_display_manager_keyval_convert_case (GdkDisplayManager *manager,
147 guint xlower = symbol;
148 guint xupper = symbol;
150 /* Check for directly encoded 24-bit UCS characters: */
151 if ((symbol & 0xff000000) == 0x01000000)
154 *lower = gdk_unicode_to_keyval (g_unichar_tolower (symbol & 0x00ffffff));
156 *upper = gdk_unicode_to_keyval (g_unichar_toupper (symbol & 0x00ffffff));
162 case 0: /* Latin 1 */
163 if ((symbol >= GDK_KEY_A) && (symbol <= GDK_KEY_Z))
164 xlower += (GDK_KEY_a - GDK_KEY_A);
165 else if ((symbol >= GDK_KEY_a) && (symbol <= GDK_KEY_z))
166 xupper -= (GDK_KEY_a - GDK_KEY_A);
167 else if ((symbol >= GDK_KEY_Agrave) && (symbol <= GDK_KEY_Odiaeresis))
168 xlower += (GDK_KEY_agrave - GDK_KEY_Agrave);
169 else if ((symbol >= GDK_KEY_agrave) && (symbol <= GDK_KEY_odiaeresis))
170 xupper -= (GDK_KEY_agrave - GDK_KEY_Agrave);
171 else if ((symbol >= GDK_KEY_Ooblique) && (symbol <= GDK_KEY_Thorn))
172 xlower += (GDK_KEY_oslash - GDK_KEY_Ooblique);
173 else if ((symbol >= GDK_KEY_oslash) && (symbol <= GDK_KEY_thorn))
174 xupper -= (GDK_KEY_oslash - GDK_KEY_Ooblique);
177 case 1: /* Latin 2 */
178 /* Assume the KeySym is a legal value (ignore discontinuities) */
179 if (symbol == GDK_KEY_Aogonek)
180 xlower = GDK_KEY_aogonek;
181 else if (symbol >= GDK_KEY_Lstroke && symbol <= GDK_KEY_Sacute)
182 xlower += (GDK_KEY_lstroke - GDK_KEY_Lstroke);
183 else if (symbol >= GDK_KEY_Scaron && symbol <= GDK_KEY_Zacute)
184 xlower += (GDK_KEY_scaron - GDK_KEY_Scaron);
185 else if (symbol >= GDK_KEY_Zcaron && symbol <= GDK_KEY_Zabovedot)
186 xlower += (GDK_KEY_zcaron - GDK_KEY_Zcaron);
187 else if (symbol == GDK_KEY_aogonek)
188 xupper = GDK_KEY_Aogonek;
189 else if (symbol >= GDK_KEY_lstroke && symbol <= GDK_KEY_sacute)
190 xupper -= (GDK_KEY_lstroke - GDK_KEY_Lstroke);
191 else if (symbol >= GDK_KEY_scaron && symbol <= GDK_KEY_zacute)
192 xupper -= (GDK_KEY_scaron - GDK_KEY_Scaron);
193 else if (symbol >= GDK_KEY_zcaron && symbol <= GDK_KEY_zabovedot)
194 xupper -= (GDK_KEY_zcaron - GDK_KEY_Zcaron);
195 else if (symbol >= GDK_KEY_Racute && symbol <= GDK_KEY_Tcedilla)
196 xlower += (GDK_KEY_racute - GDK_KEY_Racute);
197 else if (symbol >= GDK_KEY_racute && symbol <= GDK_KEY_tcedilla)
198 xupper -= (GDK_KEY_racute - GDK_KEY_Racute);
201 case 2: /* Latin 3 */
202 /* Assume the KeySym is a legal value (ignore discontinuities) */
203 if (symbol >= GDK_KEY_Hstroke && symbol <= GDK_KEY_Hcircumflex)
204 xlower += (GDK_KEY_hstroke - GDK_KEY_Hstroke);
205 else if (symbol >= GDK_KEY_Gbreve && symbol <= GDK_KEY_Jcircumflex)
206 xlower += (GDK_KEY_gbreve - GDK_KEY_Gbreve);
207 else if (symbol >= GDK_KEY_hstroke && symbol <= GDK_KEY_hcircumflex)
208 xupper -= (GDK_KEY_hstroke - GDK_KEY_Hstroke);
209 else if (symbol >= GDK_KEY_gbreve && symbol <= GDK_KEY_jcircumflex)
210 xupper -= (GDK_KEY_gbreve - GDK_KEY_Gbreve);
211 else if (symbol >= GDK_KEY_Cabovedot && symbol <= GDK_KEY_Scircumflex)
212 xlower += (GDK_KEY_cabovedot - GDK_KEY_Cabovedot);
213 else if (symbol >= GDK_KEY_cabovedot && symbol <= GDK_KEY_scircumflex)
214 xupper -= (GDK_KEY_cabovedot - GDK_KEY_Cabovedot);
217 case 3: /* Latin 4 */
218 /* Assume the KeySym is a legal value (ignore discontinuities) */
219 if (symbol >= GDK_KEY_Rcedilla && symbol <= GDK_KEY_Tslash)
220 xlower += (GDK_KEY_rcedilla - GDK_KEY_Rcedilla);
221 else if (symbol >= GDK_KEY_rcedilla && symbol <= GDK_KEY_tslash)
222 xupper -= (GDK_KEY_rcedilla - GDK_KEY_Rcedilla);
223 else if (symbol == GDK_KEY_ENG)
224 xlower = GDK_KEY_eng;
225 else if (symbol == GDK_KEY_eng)
226 xupper = GDK_KEY_ENG;
227 else if (symbol >= GDK_KEY_Amacron && symbol <= GDK_KEY_Umacron)
228 xlower += (GDK_KEY_amacron - GDK_KEY_Amacron);
229 else if (symbol >= GDK_KEY_amacron && symbol <= GDK_KEY_umacron)
230 xupper -= (GDK_KEY_amacron - GDK_KEY_Amacron);
233 case 6: /* Cyrillic */
234 /* Assume the KeySym is a legal value (ignore discontinuities) */
235 if (symbol >= GDK_KEY_Serbian_DJE && symbol <= GDK_KEY_Serbian_DZE)
236 xlower -= (GDK_KEY_Serbian_DJE - GDK_KEY_Serbian_dje);
237 else if (symbol >= GDK_KEY_Serbian_dje && symbol <= GDK_KEY_Serbian_dze)
238 xupper += (GDK_KEY_Serbian_DJE - GDK_KEY_Serbian_dje);
239 else if (symbol >= GDK_KEY_Cyrillic_YU && symbol <= GDK_KEY_Cyrillic_HARDSIGN)
240 xlower -= (GDK_KEY_Cyrillic_YU - GDK_KEY_Cyrillic_yu);
241 else if (symbol >= GDK_KEY_Cyrillic_yu && symbol <= GDK_KEY_Cyrillic_hardsign)
242 xupper += (GDK_KEY_Cyrillic_YU - GDK_KEY_Cyrillic_yu);
246 /* Assume the KeySym is a legal value (ignore discontinuities) */
247 if (symbol >= GDK_KEY_Greek_ALPHAaccent && symbol <= GDK_KEY_Greek_OMEGAaccent)
248 xlower += (GDK_KEY_Greek_alphaaccent - GDK_KEY_Greek_ALPHAaccent);
249 else if (symbol >= GDK_KEY_Greek_alphaaccent && symbol <= GDK_KEY_Greek_omegaaccent &&
250 symbol != GDK_KEY_Greek_iotaaccentdieresis &&
251 symbol != GDK_KEY_Greek_upsilonaccentdieresis)
252 xupper -= (GDK_KEY_Greek_alphaaccent - GDK_KEY_Greek_ALPHAaccent);
253 else if (symbol >= GDK_KEY_Greek_ALPHA && symbol <= GDK_KEY_Greek_OMEGA)
254 xlower += (GDK_KEY_Greek_alpha - GDK_KEY_Greek_ALPHA);
255 else if (symbol >= GDK_KEY_Greek_alpha && symbol <= GDK_KEY_Greek_omega &&
256 symbol != GDK_KEY_Greek_finalsmallsigma)
257 xupper -= (GDK_KEY_Greek_alpha - GDK_KEY_Greek_ALPHA);
268 gdk_wayland_display_manager_class_init (GdkWaylandDisplayManagerClass *class)
270 GObjectClass *object_class = G_OBJECT_CLASS (class);
271 GdkDisplayManagerClass *manager_class = GDK_DISPLAY_MANAGER_CLASS (class);
273 object_class->finalize = gdk_wayland_display_manager_finalize;
275 manager_class->open_display = gdk_wayland_display_manager_open_display;
276 manager_class->list_displays = gdk_wayland_display_manager_list_displays;
277 manager_class->set_default_display = gdk_wayland_display_manager_set_default_display;
278 manager_class->get_default_display = gdk_wayland_display_manager_get_default_display;
279 manager_class->atom_intern = gdk_wayland_display_manager_atom_intern;
280 manager_class->get_atom_name = gdk_wayland_display_manager_get_atom_name;
281 manager_class->lookup_keyval = gdk_wayland_display_manager_lookup_keyval;
282 manager_class->get_keyval_name = gdk_wayland_display_manager_get_keyval_name;
283 manager_class->keyval_convert_case = gdk_wayland_display_manager_keyval_convert_case;
287 gdk_wayland_display_manager_init (GdkWaylandDisplayManager *manager)
292 _gdk_wayland_display_manager_add_display (GdkDisplayManager *manager,
295 GdkWaylandDisplayManager *manager_wayland = GDK_WAYLAND_DISPLAY_MANAGER (manager);
297 if (manager_wayland->displays == NULL)
298 gdk_display_manager_set_default_display (manager, display);
300 manager_wayland->displays = g_slist_prepend (manager_wayland->displays, display);
304 _gdk_wayland_display_manager_remove_display (GdkDisplayManager *manager,
307 GdkWaylandDisplayManager *manager_wayland = GDK_WAYLAND_DISPLAY_MANAGER (manager);
309 manager_wayland->displays = g_slist_remove (manager_wayland->displays, display);
311 if (manager_wayland->default_display == display)
313 if (manager_wayland->displays)
314 gdk_display_manager_set_default_display (manager, manager_wayland->displays->data);
316 gdk_display_manager_set_default_display (manager, NULL);