2 * Copyright © 2010 Intel Corporation
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.
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.
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.
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"
33 typedef struct _GdkScreenWayland GdkScreenWayland;
34 typedef struct _GdkScreenWaylandClass GdkScreenWaylandClass;
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))
43 typedef struct _GdkWaylandMonitor GdkWaylandMonitor;
45 struct _GdkScreenWayland
47 GdkScreen parent_instance;
50 GdkWindow *root_window;
53 int width_mm, height_mm;
58 /* Xinerama/RandR 1.2 */
60 GdkWaylandMonitor *monitors;
64 struct _GdkScreenWaylandClass
66 GdkScreenClass parent_class;
68 void (* window_manager_changed) (GdkScreenWayland *screen_wayland);
71 struct _GdkWaylandMonitor
73 GdkRectangle geometry;
80 G_DEFINE_TYPE (GdkScreenWayland, _gdk_screen_wayland, GDK_TYPE_SCREEN)
83 init_monitor_geometry (GdkWaylandMonitor *monitor,
84 int x, int y, int width, int height)
86 monitor->geometry.x = x;
87 monitor->geometry.y = y;
88 monitor->geometry.width = width;
89 monitor->geometry.height = height;
91 monitor->width_mm = -1;
92 monitor->height_mm = -1;
93 monitor->output_name = NULL;
94 monitor->manufacturer = NULL;
98 free_monitors (GdkWaylandMonitor *monitors,
103 for (i = 0; i < n_monitors; ++i)
105 g_free (monitors[i].output_name);
106 g_free (monitors[i].manufacturer);
113 deinit_multihead (GdkScreen *screen)
115 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
117 free_monitors (screen_wayland->monitors, screen_wayland->n_monitors);
119 screen_wayland->n_monitors = 0;
120 screen_wayland->monitors = NULL;
124 init_multihead (GdkScreen *screen)
126 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
128 /* No multihead support of any kind for this screen */
129 screen_wayland->n_monitors = 1;
130 screen_wayland->monitors = g_new0 (GdkWaylandMonitor, 1);
131 screen_wayland->primary_monitor = 0;
133 init_monitor_geometry (screen_wayland->monitors, 0, 0,
134 screen_wayland->width, screen_wayland->height);
138 gdk_wayland_screen_dispose (GObject *object)
140 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (object);
142 if (screen_wayland->root_window)
143 _gdk_window_destroy (screen_wayland->root_window, TRUE);
145 G_OBJECT_CLASS (_gdk_screen_wayland_parent_class)->dispose (object);
149 gdk_wayland_screen_finalize (GObject *object)
151 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (object);
153 if (screen_wayland->root_window)
154 g_object_unref (screen_wayland->root_window);
156 g_object_unref (screen_wayland->visual);
158 deinit_multihead (GDK_SCREEN (object));
160 G_OBJECT_CLASS (_gdk_screen_wayland_parent_class)->finalize (object);
164 gdk_wayland_screen_get_display (GdkScreen *screen)
166 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
168 return GDK_SCREEN_WAYLAND (screen)->display;
172 gdk_wayland_screen_get_width (GdkScreen *screen)
174 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
176 return GDK_SCREEN_WAYLAND (screen)->width;
180 gdk_wayland_screen_get_height (GdkScreen *screen)
182 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
184 return GDK_SCREEN_WAYLAND (screen)->height;
188 gdk_wayland_screen_get_width_mm (GdkScreen *screen)
190 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
192 return GDK_SCREEN_WAYLAND (screen)->width_mm;
196 gdk_wayland_screen_get_height_mm (GdkScreen *screen)
198 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
200 return GDK_SCREEN_WAYLAND (screen)->height_mm;
204 gdk_wayland_screen_get_number (GdkScreen *screen)
206 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
212 gdk_wayland_screen_get_root_window (GdkScreen *screen)
214 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
216 return GDK_SCREEN_WAYLAND (screen)->root_window;
220 gdk_wayland_screen_get_n_monitors (GdkScreen *screen)
222 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
224 return GDK_SCREEN_WAYLAND (screen)->n_monitors;
228 gdk_wayland_screen_get_primary_monitor (GdkScreen *screen)
230 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
232 return GDK_SCREEN_WAYLAND (screen)->primary_monitor;
236 gdk_wayland_screen_get_monitor_width_mm (GdkScreen *screen,
239 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
241 g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
242 g_return_val_if_fail (monitor_num >= 0, -1);
243 g_return_val_if_fail (monitor_num < screen_wayland->n_monitors, -1);
245 return screen_wayland->monitors[monitor_num].width_mm;
249 gdk_wayland_screen_get_monitor_height_mm (GdkScreen *screen,
252 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
254 g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
255 g_return_val_if_fail (monitor_num >= 0, -1);
256 g_return_val_if_fail (monitor_num < screen_wayland->n_monitors, -1);
258 return screen_wayland->monitors[monitor_num].height_mm;
262 gdk_wayland_screen_get_monitor_plug_name (GdkScreen *screen,
265 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
267 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
268 g_return_val_if_fail (monitor_num >= 0, NULL);
269 g_return_val_if_fail (monitor_num < screen_wayland->n_monitors, NULL);
271 return g_strdup (screen_wayland->monitors[monitor_num].output_name);
275 gdk_wayland_screen_get_monitor_geometry (GdkScreen *screen,
279 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
281 g_return_if_fail (GDK_IS_SCREEN (screen));
282 g_return_if_fail (monitor_num >= 0);
283 g_return_if_fail (monitor_num < screen_wayland->n_monitors);
286 *dest = screen_wayland->monitors[monitor_num].geometry;
290 gdk_wayland_screen_get_system_visual (GdkScreen * screen)
292 return (GdkVisual *) GDK_SCREEN_WAYLAND (screen)->visual;
296 gdk_wayland_screen_get_rgba_visual (GdkScreen *screen)
298 return (GdkVisual *) GDK_SCREEN_WAYLAND (screen)->visual;
302 gdk_wayland_screen_is_composited (GdkScreen *screen)
308 gdk_wayland_screen_make_display_name (GdkScreen *screen)
314 gdk_wayland_screen_get_active_window (GdkScreen *screen)
316 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
322 gdk_wayland_screen_get_window_stack (GdkScreen *screen)
328 gdk_wayland_screen_broadcast_client_message (GdkScreen *screen,
334 gdk_wayland_screen_get_setting (GdkScreen *screen,
341 typedef struct _GdkWaylandVisual GdkWaylandVisual;
342 typedef struct _GdkWaylandVisualClass GdkWaylandVisualClass;
344 struct _GdkWaylandVisual
349 struct _GdkWaylandVisualClass
351 GdkVisualClass parent_class;
354 G_DEFINE_TYPE (GdkWaylandVisual, _gdk_wayland_visual, GDK_TYPE_VISUAL)
357 _gdk_wayland_visual_class_init (GdkWaylandVisualClass *klass)
362 _gdk_wayland_visual_init (GdkWaylandVisual *visual)
367 gdk_wayland_screen_visual_get_best_depth (GdkScreen *screen)
373 gdk_wayland_screen_visual_get_best_type (GdkScreen *screen)
375 return GDK_VISUAL_TRUE_COLOR;
379 gdk_wayland_screen_visual_get_best (GdkScreen *screen)
381 return GDK_SCREEN_WAYLAND (screen)->visual;
385 gdk_wayland_screen_visual_get_best_with_depth (GdkScreen *screen,
388 return GDK_SCREEN_WAYLAND (screen)->visual;
392 gdk_wayland_screen_visual_get_best_with_type (GdkScreen *screen,
393 GdkVisualType visual_type)
395 return GDK_SCREEN_WAYLAND (screen)->visual;
399 gdk_wayland_screen_visual_get_best_with_both (GdkScreen *screen,
401 GdkVisualType visual_type)
403 return GDK_SCREEN_WAYLAND (screen)->visual;
407 gdk_wayland_screen_query_depths (GdkScreen *screen,
411 static gint static_depths[] = { 32 };
413 *count = G_N_ELEMENTS(static_depths);
414 *depths = static_depths;
418 gdk_wayland_screen_query_visual_types (GdkScreen *screen,
419 GdkVisualType **visual_types,
422 static GdkVisualType static_visual_types[] = { GDK_VISUAL_TRUE_COLOR };
424 *count = G_N_ELEMENTS(static_visual_types);
425 *visual_types = static_visual_types;
429 gdk_wayland_screen_list_visuals (GdkScreen *screen)
432 GdkScreenWayland *screen_wayland;
434 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
435 screen_wayland = GDK_SCREEN_WAYLAND (screen);
437 list = g_list_append (NULL, screen_wayland->visual);
442 #define GDK_TYPE_WAYLAND_VISUAL (_gdk_wayland_visual_get_type ())
443 #define GDK_WAYLAND_VISUAL(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WAYLAND_VISUAL, GdkWaylandVisual))
446 gdk_wayland_visual_new (GdkScreen *screen)
450 visual = g_object_new (GDK_TYPE_WAYLAND_VISUAL, NULL);
451 visual->screen = GDK_SCREEN (screen);
452 visual->type = GDK_VISUAL_TRUE_COLOR;
459 _gdk_wayland_screen_new (GdkDisplay *display)
462 GdkScreenWayland *screen_wayland;
464 screen = g_object_new (GDK_TYPE_SCREEN_WAYLAND, NULL);
466 screen_wayland = GDK_SCREEN_WAYLAND (screen);
467 screen_wayland->display = display;
468 screen_wayland->width = 8192;
469 screen_wayland->height = 8192;
471 screen_wayland->visual = gdk_wayland_visual_new (screen);
473 screen_wayland->root_window =
474 _gdk_wayland_screen_create_root_window (screen,
475 screen_wayland->width,
476 screen_wayland->height);
478 init_multihead (screen);
484 _gdk_screen_wayland_class_init (GdkScreenWaylandClass *klass)
486 GObjectClass *object_class = G_OBJECT_CLASS (klass);
487 GdkScreenClass *screen_class = GDK_SCREEN_CLASS (klass);
489 object_class->dispose = gdk_wayland_screen_dispose;
490 object_class->finalize = gdk_wayland_screen_finalize;
492 screen_class->get_display = gdk_wayland_screen_get_display;
493 screen_class->get_width = gdk_wayland_screen_get_width;
494 screen_class->get_height = gdk_wayland_screen_get_height;
495 screen_class->get_width_mm = gdk_wayland_screen_get_width_mm;
496 screen_class->get_height_mm = gdk_wayland_screen_get_height_mm;
497 screen_class->get_number = gdk_wayland_screen_get_number;
498 screen_class->get_root_window = gdk_wayland_screen_get_root_window;
499 screen_class->get_n_monitors = gdk_wayland_screen_get_n_monitors;
500 screen_class->get_primary_monitor = gdk_wayland_screen_get_primary_monitor;
501 screen_class->get_monitor_width_mm = gdk_wayland_screen_get_monitor_width_mm;
502 screen_class->get_monitor_height_mm = gdk_wayland_screen_get_monitor_height_mm;
503 screen_class->get_monitor_plug_name = gdk_wayland_screen_get_monitor_plug_name;
504 screen_class->get_monitor_geometry = gdk_wayland_screen_get_monitor_geometry;
505 screen_class->get_monitor_workarea = gdk_wayland_screen_get_monitor_geometry;
506 screen_class->get_system_visual = gdk_wayland_screen_get_system_visual;
507 screen_class->get_rgba_visual = gdk_wayland_screen_get_rgba_visual;
508 screen_class->is_composited = gdk_wayland_screen_is_composited;
509 screen_class->make_display_name = gdk_wayland_screen_make_display_name;
510 screen_class->get_active_window = gdk_wayland_screen_get_active_window;
511 screen_class->get_window_stack = gdk_wayland_screen_get_window_stack;
512 screen_class->broadcast_client_message = gdk_wayland_screen_broadcast_client_message;
513 screen_class->get_setting = gdk_wayland_screen_get_setting;
514 screen_class->visual_get_best_depth = gdk_wayland_screen_visual_get_best_depth;
515 screen_class->visual_get_best_type = gdk_wayland_screen_visual_get_best_type;
516 screen_class->visual_get_best = gdk_wayland_screen_visual_get_best;
517 screen_class->visual_get_best_with_depth = gdk_wayland_screen_visual_get_best_with_depth;
518 screen_class->visual_get_best_with_type = gdk_wayland_screen_visual_get_best_with_type;
519 screen_class->visual_get_best_with_both = gdk_wayland_screen_visual_get_best_with_both;
520 screen_class->query_depths = gdk_wayland_screen_query_depths;
521 screen_class->query_visual_types = gdk_wayland_screen_query_visual_types;
522 screen_class->list_visuals = gdk_wayland_screen_list_visuals;
526 _gdk_screen_wayland_init (GdkScreenWayland *screen_wayland)