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