]> Pileus Git - ~andy/gtk/blob - gdk/wayland/gdkscreen-wayland.c
Change FSF Address
[~andy/gtk] / gdk / wayland / gdkscreen-wayland.c
1 /*
2  * Copyright © 2010 Intel Corporation
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library 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.
8  *
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  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include "config.h"
19
20 #include <stdlib.h>
21 #include <string.h>
22
23 #include <glib.h>
24 #include "gdkscreenprivate.h"
25 #include "gdkvisualprivate.h"
26 #include "gdkdisplay.h"
27 #include "gdkdisplay-wayland.h"
28 #include "gdkwayland.h"
29 #include "gdkprivate-wayland.h"
30
31 typedef struct _GdkScreenWayland      GdkScreenWayland;
32 typedef struct _GdkScreenWaylandClass GdkScreenWaylandClass;
33
34 #define GDK_TYPE_SCREEN_WAYLAND              (_gdk_screen_wayland_get_type ())
35 #define GDK_SCREEN_WAYLAND(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_SCREEN_WAYLAND, GdkScreenWayland))
36 #define GDK_SCREEN_WAYLAND_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_SCREEN_WAYLAND, GdkScreenWaylandClass))
37 #define GDK_IS_SCREEN_WAYLAND(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_SCREEN_WAYLAND))
38 #define GDK_IS_SCREEN_WAYLAND_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_SCREEN_WAYLAND))
39 #define GDK_SCREEN_WAYLAND_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_SCREEN_WAYLAND, GdkScreenWaylandClass))
40
41 typedef struct _GdkWaylandMonitor GdkWaylandMonitor;
42
43 struct _GdkScreenWayland
44 {
45   GdkScreen parent_instance;
46
47   GdkDisplay *display;
48   GdkWindow *root_window;
49
50   int width, height;
51   int width_mm, height_mm;
52
53   /* Visual Part */
54   GdkVisual *visual;
55
56   /* Xinerama/RandR 1.2 */
57   gint               n_monitors;
58   GdkWaylandMonitor *monitors;
59   gint               primary_monitor;
60 };
61
62 struct _GdkScreenWaylandClass
63 {
64   GdkScreenClass parent_class;
65
66   void (* window_manager_changed) (GdkScreenWayland *screen_wayland);
67 };
68
69 struct _GdkWaylandMonitor
70 {
71   GdkRectangle  geometry;
72   int           width_mm;
73   int           height_mm;
74   char *        output_name;
75   char *        manufacturer;
76 };
77
78 G_DEFINE_TYPE (GdkScreenWayland, _gdk_screen_wayland, GDK_TYPE_SCREEN)
79
80 static void
81 init_monitor_geometry (GdkWaylandMonitor *monitor,
82                        int x, int y, int width, int height)
83 {
84   monitor->geometry.x = x;
85   monitor->geometry.y = y;
86   monitor->geometry.width = width;
87   monitor->geometry.height = height;
88
89   monitor->width_mm = -1;
90   monitor->height_mm = -1;
91   monitor->output_name = NULL;
92   monitor->manufacturer = NULL;
93 }
94
95 static void
96 free_monitors (GdkWaylandMonitor *monitors,
97                gint           n_monitors)
98 {
99   int i;
100
101   for (i = 0; i < n_monitors; ++i)
102     {
103       g_free (monitors[i].output_name);
104       g_free (monitors[i].manufacturer);
105     }
106
107   g_free (monitors);
108 }
109
110 static void
111 deinit_multihead (GdkScreen *screen)
112 {
113   GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
114
115   free_monitors (screen_wayland->monitors, screen_wayland->n_monitors);
116
117   screen_wayland->n_monitors = 0;
118   screen_wayland->monitors = NULL;
119 }
120
121 static void
122 init_multihead (GdkScreen *screen)
123 {
124   GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
125
126   /* No multihead support of any kind for this screen */
127   screen_wayland->n_monitors = 1;
128   screen_wayland->monitors = g_new0 (GdkWaylandMonitor, 1);
129   screen_wayland->primary_monitor = 0;
130
131   init_monitor_geometry (screen_wayland->monitors, 0, 0,
132                          screen_wayland->width, screen_wayland->height);
133 }
134
135 static void
136 gdk_wayland_screen_dispose (GObject *object)
137 {
138   GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (object);
139
140   if (screen_wayland->root_window)
141     _gdk_window_destroy (screen_wayland->root_window, TRUE);
142
143   G_OBJECT_CLASS (_gdk_screen_wayland_parent_class)->dispose (object);
144 }
145
146 static void
147 gdk_wayland_screen_finalize (GObject *object)
148 {
149   GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (object);
150
151   if (screen_wayland->root_window)
152     g_object_unref (screen_wayland->root_window);
153
154   g_object_unref (screen_wayland->visual);
155
156   deinit_multihead (GDK_SCREEN (object));
157
158   G_OBJECT_CLASS (_gdk_screen_wayland_parent_class)->finalize (object);
159 }
160
161 static GdkDisplay *
162 gdk_wayland_screen_get_display (GdkScreen *screen)
163 {
164   return GDK_SCREEN_WAYLAND (screen)->display;
165 }
166
167 static gint
168 gdk_wayland_screen_get_width (GdkScreen *screen)
169 {
170   return GDK_SCREEN_WAYLAND (screen)->width;
171 }
172
173 static gint
174 gdk_wayland_screen_get_height (GdkScreen *screen)
175 {
176   return GDK_SCREEN_WAYLAND (screen)->height;
177 }
178
179 static gint
180 gdk_wayland_screen_get_width_mm (GdkScreen *screen)
181 {
182   return GDK_SCREEN_WAYLAND (screen)->width_mm;
183 }
184
185 static gint
186 gdk_wayland_screen_get_height_mm (GdkScreen *screen)
187 {
188   return GDK_SCREEN_WAYLAND (screen)->height_mm;
189 }
190
191 static gint
192 gdk_wayland_screen_get_number (GdkScreen *screen)
193 {
194   return 0;
195 }
196
197 static GdkWindow *
198 gdk_wayland_screen_get_root_window (GdkScreen *screen)
199 {
200   return GDK_SCREEN_WAYLAND (screen)->root_window;
201 }
202
203 static gint
204 gdk_wayland_screen_get_n_monitors (GdkScreen *screen)
205 {
206   return GDK_SCREEN_WAYLAND (screen)->n_monitors;
207 }
208
209 static gint
210 gdk_wayland_screen_get_primary_monitor (GdkScreen *screen)
211 {
212   return GDK_SCREEN_WAYLAND (screen)->primary_monitor;
213 }
214
215 static gint
216 gdk_wayland_screen_get_monitor_width_mm (GdkScreen *screen,
217                                          gint       monitor_num)
218 {
219   GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
220
221   return screen_wayland->monitors[monitor_num].width_mm;
222 }
223
224 static gint
225 gdk_wayland_screen_get_monitor_height_mm (GdkScreen *screen,
226                                           gint       monitor_num)
227 {
228   GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
229
230   return screen_wayland->monitors[monitor_num].height_mm;
231 }
232
233 static gchar *
234 gdk_wayland_screen_get_monitor_plug_name (GdkScreen *screen,
235                                           gint       monitor_num)
236 {
237   GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
238
239   return g_strdup (screen_wayland->monitors[monitor_num].output_name);
240 }
241
242 static void
243 gdk_wayland_screen_get_monitor_geometry (GdkScreen    *screen,
244                                          gint          monitor_num,
245                                          GdkRectangle *dest)
246 {
247   GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
248
249   if (dest)
250     *dest = screen_wayland->monitors[monitor_num].geometry;
251 }
252
253 static GdkVisual *
254 gdk_wayland_screen_get_system_visual (GdkScreen * screen)
255 {
256   return (GdkVisual *) GDK_SCREEN_WAYLAND (screen)->visual;
257 }
258
259 static GdkVisual *
260 gdk_wayland_screen_get_rgba_visual (GdkScreen *screen)
261 {
262   return (GdkVisual *) GDK_SCREEN_WAYLAND (screen)->visual;
263 }
264
265 static gboolean
266 gdk_wayland_screen_is_composited (GdkScreen *screen)
267 {
268   return TRUE;
269 }
270
271 static gchar *
272 gdk_wayland_screen_make_display_name (GdkScreen *screen)
273 {
274   return NULL;
275 }
276
277 static GdkWindow *
278 gdk_wayland_screen_get_active_window (GdkScreen *screen)
279 {
280   return NULL;
281 }
282
283 static GList *
284 gdk_wayland_screen_get_window_stack (GdkScreen *screen)
285 {
286   return NULL;
287 }
288
289 static void
290 gdk_wayland_screen_broadcast_client_message (GdkScreen *screen,
291                                              GdkEvent  *event)
292 {
293 }
294
295 static gboolean
296 gdk_wayland_screen_get_setting (GdkScreen   *screen,
297                                 const gchar *name,
298                                 GValue      *value)
299 {
300   return FALSE;
301 }
302
303 typedef struct _GdkWaylandVisual        GdkWaylandVisual;
304 typedef struct _GdkWaylandVisualClass   GdkWaylandVisualClass;
305
306 struct _GdkWaylandVisual
307 {
308   GdkVisual visual;
309 };
310
311 struct _GdkWaylandVisualClass
312 {
313   GdkVisualClass parent_class;
314 };
315
316 G_DEFINE_TYPE (GdkWaylandVisual, _gdk_wayland_visual, GDK_TYPE_VISUAL)
317
318 static void
319 _gdk_wayland_visual_class_init (GdkWaylandVisualClass *klass)
320 {
321 }
322
323 static void
324 _gdk_wayland_visual_init (GdkWaylandVisual *visual)
325 {
326 }
327
328 static gint
329 gdk_wayland_screen_visual_get_best_depth (GdkScreen *screen)
330 {
331   return 32;
332 }
333
334 static GdkVisualType
335 gdk_wayland_screen_visual_get_best_type (GdkScreen *screen)
336 {
337   return GDK_VISUAL_TRUE_COLOR;
338 }
339
340 static GdkVisual*
341 gdk_wayland_screen_visual_get_best (GdkScreen *screen)
342 {
343   return GDK_SCREEN_WAYLAND (screen)->visual;
344 }
345
346 static GdkVisual*
347 gdk_wayland_screen_visual_get_best_with_depth (GdkScreen *screen,
348                                                gint       depth)
349 {
350   return GDK_SCREEN_WAYLAND (screen)->visual;
351 }
352
353 static GdkVisual*
354 gdk_wayland_screen_visual_get_best_with_type (GdkScreen     *screen,
355                                               GdkVisualType  visual_type)
356 {
357   return GDK_SCREEN_WAYLAND (screen)->visual;
358 }
359
360 static GdkVisual*
361 gdk_wayland_screen_visual_get_best_with_both (GdkScreen     *screen,
362                                               gint           depth,
363                                               GdkVisualType  visual_type)
364 {
365   return GDK_SCREEN_WAYLAND (screen)->visual;
366 }
367
368 static void
369 gdk_wayland_screen_query_depths  (GdkScreen  *screen,
370                                   gint      **depths,
371                                   gint       *count)
372 {
373   static gint static_depths[] = { 32 };
374
375   *count = G_N_ELEMENTS(static_depths);
376   *depths = static_depths;
377 }
378
379 static void
380 gdk_wayland_screen_query_visual_types (GdkScreen      *screen,
381                                        GdkVisualType **visual_types,
382                                        gint           *count)
383 {
384   static GdkVisualType static_visual_types[] = { GDK_VISUAL_TRUE_COLOR };
385
386   *count = G_N_ELEMENTS(static_visual_types);
387   *visual_types = static_visual_types;
388 }
389
390 static GList *
391 gdk_wayland_screen_list_visuals (GdkScreen *screen)
392 {
393   GList *list;
394   GdkScreenWayland *screen_wayland;
395
396   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
397   screen_wayland = GDK_SCREEN_WAYLAND (screen);
398
399   list = g_list_append (NULL, screen_wayland->visual);
400
401   return list;
402 }
403
404 #define GDK_TYPE_WAYLAND_VISUAL              (_gdk_wayland_visual_get_type ())
405 #define GDK_WAYLAND_VISUAL(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WAYLAND_VISUAL, GdkWaylandVisual))
406
407 static GdkVisual *
408 gdk_wayland_visual_new (GdkScreen *screen)
409 {
410   GdkVisual *visual;
411
412   visual = g_object_new (GDK_TYPE_WAYLAND_VISUAL, NULL);
413   visual->screen = GDK_SCREEN (screen);
414   visual->type = GDK_VISUAL_TRUE_COLOR;
415   visual->depth = 32;
416
417   return visual;
418 }
419
420 GdkScreen *
421 _gdk_wayland_screen_new (GdkDisplay *display)
422 {
423   GdkScreen *screen;
424   GdkScreenWayland *screen_wayland;
425
426   screen = g_object_new (GDK_TYPE_SCREEN_WAYLAND, NULL);
427
428   screen_wayland = GDK_SCREEN_WAYLAND (screen);
429   screen_wayland->display = display;
430   screen_wayland->width = 8192;
431   screen_wayland->height = 8192;
432
433   screen_wayland->visual = gdk_wayland_visual_new (screen);
434
435   screen_wayland->root_window =
436     _gdk_wayland_screen_create_root_window (screen,
437                                             screen_wayland->width,
438                                             screen_wayland->height);
439
440   init_multihead (screen);
441
442   return screen;
443 }
444
445 static void
446 _gdk_screen_wayland_class_init (GdkScreenWaylandClass *klass)
447 {
448   GObjectClass *object_class = G_OBJECT_CLASS (klass);
449   GdkScreenClass *screen_class = GDK_SCREEN_CLASS (klass);
450
451   object_class->dispose = gdk_wayland_screen_dispose;
452   object_class->finalize = gdk_wayland_screen_finalize;
453
454   screen_class->get_display = gdk_wayland_screen_get_display;
455   screen_class->get_width = gdk_wayland_screen_get_width;
456   screen_class->get_height = gdk_wayland_screen_get_height;
457   screen_class->get_width_mm = gdk_wayland_screen_get_width_mm;
458   screen_class->get_height_mm = gdk_wayland_screen_get_height_mm;
459   screen_class->get_number = gdk_wayland_screen_get_number;
460   screen_class->get_root_window = gdk_wayland_screen_get_root_window;
461   screen_class->get_n_monitors = gdk_wayland_screen_get_n_monitors;
462   screen_class->get_primary_monitor = gdk_wayland_screen_get_primary_monitor;
463   screen_class->get_monitor_width_mm = gdk_wayland_screen_get_monitor_width_mm;
464   screen_class->get_monitor_height_mm = gdk_wayland_screen_get_monitor_height_mm;
465   screen_class->get_monitor_plug_name = gdk_wayland_screen_get_monitor_plug_name;
466   screen_class->get_monitor_geometry = gdk_wayland_screen_get_monitor_geometry;
467   screen_class->get_monitor_workarea = gdk_wayland_screen_get_monitor_geometry;
468   screen_class->get_system_visual = gdk_wayland_screen_get_system_visual;
469   screen_class->get_rgba_visual = gdk_wayland_screen_get_rgba_visual;
470   screen_class->is_composited = gdk_wayland_screen_is_composited;
471   screen_class->make_display_name = gdk_wayland_screen_make_display_name;
472   screen_class->get_active_window = gdk_wayland_screen_get_active_window;
473   screen_class->get_window_stack = gdk_wayland_screen_get_window_stack;
474   screen_class->broadcast_client_message = gdk_wayland_screen_broadcast_client_message;
475   screen_class->get_setting = gdk_wayland_screen_get_setting;
476   screen_class->visual_get_best_depth = gdk_wayland_screen_visual_get_best_depth;
477   screen_class->visual_get_best_type = gdk_wayland_screen_visual_get_best_type;
478   screen_class->visual_get_best = gdk_wayland_screen_visual_get_best;
479   screen_class->visual_get_best_with_depth = gdk_wayland_screen_visual_get_best_with_depth;
480   screen_class->visual_get_best_with_type = gdk_wayland_screen_visual_get_best_with_type;
481   screen_class->visual_get_best_with_both = gdk_wayland_screen_visual_get_best_with_both;
482   screen_class->query_depths = gdk_wayland_screen_query_depths;
483   screen_class->query_visual_types = gdk_wayland_screen_query_visual_types;
484   screen_class->list_visuals = gdk_wayland_screen_list_visuals;
485 }
486
487 static void
488 _gdk_screen_wayland_init (GdkScreenWayland *screen_wayland)
489 {
490 }