]> Pileus Git - ~andy/gtk/blob - gdk/wayland/gdkdisplaymanager-wayland.c
Merge branch 'gdk-backend-wayland'
[~andy/gtk] / gdk / wayland / gdkdisplaymanager-wayland.c
1 /* GDK - The GIMP Drawing Kit
2  * gdkdisplaymanager-wayland.c
3  *
4  * Copyright 2010 Red Hat, Inc.
5  *
6  * Author: Matthias clasen
7  *
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.
12  *
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.
17  *
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.
22  */
23
24 #include "config.h"
25
26 #include "gdkdisplaymanagerprivate.h"
27 #include "gdkdisplay-wayland.h"
28 #include "gdkprivate-wayland.h"
29
30 #include "gdkinternals.h"
31
32 #include <X11/extensions/XKBcommon.h>
33
34 typedef struct _GdkWaylandDisplayManager GdkWaylandDisplayManager;
35 typedef struct _GdkWaylandDisplayManagerClass GdkWaylandDisplayManagerClass;
36
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))
43
44 struct _GdkWaylandDisplayManager
45 {
46   GdkDisplayManager parent;
47
48   GdkDisplay *default_display;
49   GSList *displays;
50 };
51
52 struct _GdkWaylandDisplayManagerClass
53 {
54   GdkDisplayManagerClass parent_class;
55 };
56
57 G_DEFINE_TYPE (GdkWaylandDisplayManager, gdk_wayland_display_manager, GDK_TYPE_DISPLAY_MANAGER)
58
59 static void
60 gdk_wayland_display_manager_finalize (GObject *object)
61 {
62   g_error ("A GdkWaylandDisplayManager object was finalized. This should not happen");
63   G_OBJECT_CLASS (gdk_wayland_display_manager_parent_class)->finalize (object);
64 }
65
66 static GdkDisplay *
67 gdk_wayland_display_manager_open_display (GdkDisplayManager *manager,
68                                           const gchar       *name)
69 {
70   return _gdk_wayland_display_open (name);
71 }
72
73 static GSList *
74 gdk_wayland_display_manager_list_displays (GdkDisplayManager *manager)
75 {
76   return g_slist_copy (GDK_WAYLAND_DISPLAY_MANAGER (manager)->displays);
77 }
78
79 static void
80 gdk_wayland_display_manager_set_default_display (GdkDisplayManager *manager,
81                                                  GdkDisplay        *display)
82 {
83   GDK_WAYLAND_DISPLAY_MANAGER (manager)->default_display = display;
84
85   _gdk_wayland_display_make_default (display);
86 }
87
88 static GdkDisplay *
89 gdk_wayland_display_manager_get_default_display (GdkDisplayManager *manager)
90 {
91   return GDK_WAYLAND_DISPLAY_MANAGER (manager)->default_display;
92 }
93
94 static GdkAtom
95 gdk_wayland_display_manager_atom_intern (GdkDisplayManager *manager,
96                                          const gchar       *atom_name,
97                                          gboolean           dup)
98 {
99   return 0;
100 }
101
102 static gchar *
103 gdk_wayland_display_manager_get_atom_name (GdkDisplayManager *manager,
104                                            GdkAtom            atom)
105 {
106   return 0;
107 }
108
109 static guint
110 gdk_wayland_display_manager_lookup_keyval (GdkDisplayManager *manager,
111                                            const gchar       *keyval_name)
112 {
113   g_return_val_if_fail (keyval_name != NULL, 0);
114
115   return xkb_string_to_keysym(keyval_name);
116 }
117
118 static gchar *
119 gdk_wayland_display_manager_get_keyval_name (GdkDisplayManager *manager,
120                                              guint              keyval)
121 {
122   static char buf[128];
123
124   switch (keyval)
125     {
126     case GDK_KEY_Page_Up:
127       return "Page_Up";
128     case GDK_KEY_Page_Down:
129       return "Page_Down";
130     case GDK_KEY_KP_Page_Up:
131       return "KP_Page_Up";
132     case GDK_KEY_KP_Page_Down:
133       return "KP_Page_Down";
134     }
135
136   xkb_keysym_to_string(keyval, buf, sizeof buf);
137
138   return buf;
139 }
140
141 static void
142 gdk_wayland_display_manager_keyval_convert_case (GdkDisplayManager *manager,
143                                                  guint              symbol,
144                                                  guint             *lower,
145                                                  guint             *upper)
146 {
147   guint xlower = symbol;
148   guint xupper = symbol;
149
150   /* Check for directly encoded 24-bit UCS characters: */
151   if ((symbol & 0xff000000) == 0x01000000)
152     {
153       if (lower)
154         *lower = gdk_unicode_to_keyval (g_unichar_tolower (symbol & 0x00ffffff));
155       if (upper)
156         *upper = gdk_unicode_to_keyval (g_unichar_toupper (symbol & 0x00ffffff));
157       return;
158     }
159
160   switch (symbol >> 8)
161     {
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);
175       break;
176
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);
199       break;
200
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);
215       break;
216
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);
231       break;
232
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);
243       break;
244
245     case 7: /* Greek */
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);
258       break;
259     }
260
261   if (lower)
262     *lower = xlower;
263   if (upper)
264     *upper = xupper;
265 }
266
267 static void
268 gdk_wayland_display_manager_class_init (GdkWaylandDisplayManagerClass *class)
269 {
270   GObjectClass *object_class = G_OBJECT_CLASS (class);
271   GdkDisplayManagerClass *manager_class = GDK_DISPLAY_MANAGER_CLASS (class);
272
273   object_class->finalize = gdk_wayland_display_manager_finalize;
274
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;
284 }
285
286 static void
287 gdk_wayland_display_manager_init (GdkWaylandDisplayManager *manager)
288 {
289 }
290
291 void
292 _gdk_wayland_display_manager_add_display (GdkDisplayManager *manager,
293                                           GdkDisplay        *display)
294 {
295   GdkWaylandDisplayManager *manager_wayland = GDK_WAYLAND_DISPLAY_MANAGER (manager);
296
297   if (manager_wayland->displays == NULL)
298     gdk_display_manager_set_default_display (manager, display);
299
300   manager_wayland->displays = g_slist_prepend (manager_wayland->displays, display);
301 }
302
303 void
304 _gdk_wayland_display_manager_remove_display (GdkDisplayManager *manager,
305                                              GdkDisplay        *display)
306 {
307   GdkWaylandDisplayManager *manager_wayland = GDK_WAYLAND_DISPLAY_MANAGER (manager);
308
309   manager_wayland->displays = g_slist_remove (manager_wayland->displays, display);
310
311   if (manager_wayland->default_display == display)
312     {
313       if (manager_wayland->displays)
314         gdk_display_manager_set_default_display (manager, manager_wayland->displays->data);
315       else
316         gdk_display_manager_set_default_display (manager, NULL);
317     }
318 }