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, see <http://www.gnu.org/licenses/>.
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"
31 typedef struct _GdkScreenWayland GdkScreenWayland;
32 typedef struct _GdkScreenWaylandClass GdkScreenWaylandClass;
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))
41 typedef struct _GdkWaylandMonitor GdkWaylandMonitor;
43 struct _GdkScreenWayland
45 GdkScreen parent_instance;
48 GdkWindow *root_window;
51 int width_mm, height_mm;
56 /* Xinerama/RandR 1.2 */
58 GdkWaylandMonitor *monitors;
62 struct _GdkScreenWaylandClass
64 GdkScreenClass parent_class;
66 void (* window_manager_changed) (GdkScreenWayland *screen_wayland);
69 struct _GdkWaylandMonitor
71 GdkRectangle geometry;
78 G_DEFINE_TYPE (GdkScreenWayland, _gdk_screen_wayland, GDK_TYPE_SCREEN)
81 init_monitor_geometry (GdkWaylandMonitor *monitor,
82 int x, int y, int width, int height)
84 monitor->geometry.x = x;
85 monitor->geometry.y = y;
86 monitor->geometry.width = width;
87 monitor->geometry.height = height;
89 monitor->width_mm = -1;
90 monitor->height_mm = -1;
91 monitor->output_name = NULL;
92 monitor->manufacturer = NULL;
96 free_monitors (GdkWaylandMonitor *monitors,
101 for (i = 0; i < n_monitors; ++i)
103 g_free (monitors[i].output_name);
104 g_free (monitors[i].manufacturer);
111 deinit_multihead (GdkScreen *screen)
113 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
115 free_monitors (screen_wayland->monitors, screen_wayland->n_monitors);
117 screen_wayland->n_monitors = 0;
118 screen_wayland->monitors = NULL;
122 init_multihead (GdkScreen *screen)
124 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
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;
131 init_monitor_geometry (screen_wayland->monitors, 0, 0,
132 screen_wayland->width, screen_wayland->height);
136 gdk_wayland_screen_dispose (GObject *object)
138 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (object);
140 if (screen_wayland->root_window)
141 _gdk_window_destroy (screen_wayland->root_window, TRUE);
143 G_OBJECT_CLASS (_gdk_screen_wayland_parent_class)->dispose (object);
147 gdk_wayland_screen_finalize (GObject *object)
149 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (object);
151 if (screen_wayland->root_window)
152 g_object_unref (screen_wayland->root_window);
154 g_object_unref (screen_wayland->visual);
156 deinit_multihead (GDK_SCREEN (object));
158 G_OBJECT_CLASS (_gdk_screen_wayland_parent_class)->finalize (object);
162 gdk_wayland_screen_get_display (GdkScreen *screen)
164 return GDK_SCREEN_WAYLAND (screen)->display;
168 gdk_wayland_screen_get_width (GdkScreen *screen)
170 return GDK_SCREEN_WAYLAND (screen)->width;
174 gdk_wayland_screen_get_height (GdkScreen *screen)
176 return GDK_SCREEN_WAYLAND (screen)->height;
180 gdk_wayland_screen_get_width_mm (GdkScreen *screen)
182 return GDK_SCREEN_WAYLAND (screen)->width_mm;
186 gdk_wayland_screen_get_height_mm (GdkScreen *screen)
188 return GDK_SCREEN_WAYLAND (screen)->height_mm;
192 gdk_wayland_screen_get_number (GdkScreen *screen)
198 gdk_wayland_screen_get_root_window (GdkScreen *screen)
200 return GDK_SCREEN_WAYLAND (screen)->root_window;
204 gdk_wayland_screen_get_n_monitors (GdkScreen *screen)
206 return GDK_SCREEN_WAYLAND (screen)->n_monitors;
210 gdk_wayland_screen_get_primary_monitor (GdkScreen *screen)
212 return GDK_SCREEN_WAYLAND (screen)->primary_monitor;
216 gdk_wayland_screen_get_monitor_width_mm (GdkScreen *screen,
219 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
221 return screen_wayland->monitors[monitor_num].width_mm;
225 gdk_wayland_screen_get_monitor_height_mm (GdkScreen *screen,
228 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
230 return screen_wayland->monitors[monitor_num].height_mm;
234 gdk_wayland_screen_get_monitor_plug_name (GdkScreen *screen,
237 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
239 return g_strdup (screen_wayland->monitors[monitor_num].output_name);
243 gdk_wayland_screen_get_monitor_geometry (GdkScreen *screen,
247 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
250 *dest = screen_wayland->monitors[monitor_num].geometry;
254 gdk_wayland_screen_get_system_visual (GdkScreen * screen)
256 return (GdkVisual *) GDK_SCREEN_WAYLAND (screen)->visual;
260 gdk_wayland_screen_get_rgba_visual (GdkScreen *screen)
262 return (GdkVisual *) GDK_SCREEN_WAYLAND (screen)->visual;
266 gdk_wayland_screen_is_composited (GdkScreen *screen)
272 gdk_wayland_screen_make_display_name (GdkScreen *screen)
278 gdk_wayland_screen_get_active_window (GdkScreen *screen)
284 gdk_wayland_screen_get_window_stack (GdkScreen *screen)
290 gdk_wayland_screen_broadcast_client_message (GdkScreen *screen,
296 gdk_wayland_screen_get_setting (GdkScreen *screen,
303 typedef struct _GdkWaylandVisual GdkWaylandVisual;
304 typedef struct _GdkWaylandVisualClass GdkWaylandVisualClass;
306 struct _GdkWaylandVisual
311 struct _GdkWaylandVisualClass
313 GdkVisualClass parent_class;
316 G_DEFINE_TYPE (GdkWaylandVisual, _gdk_wayland_visual, GDK_TYPE_VISUAL)
319 _gdk_wayland_visual_class_init (GdkWaylandVisualClass *klass)
324 _gdk_wayland_visual_init (GdkWaylandVisual *visual)
329 gdk_wayland_screen_visual_get_best_depth (GdkScreen *screen)
335 gdk_wayland_screen_visual_get_best_type (GdkScreen *screen)
337 return GDK_VISUAL_TRUE_COLOR;
341 gdk_wayland_screen_visual_get_best (GdkScreen *screen)
343 return GDK_SCREEN_WAYLAND (screen)->visual;
347 gdk_wayland_screen_visual_get_best_with_depth (GdkScreen *screen,
350 return GDK_SCREEN_WAYLAND (screen)->visual;
354 gdk_wayland_screen_visual_get_best_with_type (GdkScreen *screen,
355 GdkVisualType visual_type)
357 return GDK_SCREEN_WAYLAND (screen)->visual;
361 gdk_wayland_screen_visual_get_best_with_both (GdkScreen *screen,
363 GdkVisualType visual_type)
365 return GDK_SCREEN_WAYLAND (screen)->visual;
369 gdk_wayland_screen_query_depths (GdkScreen *screen,
373 static gint static_depths[] = { 32 };
375 *count = G_N_ELEMENTS(static_depths);
376 *depths = static_depths;
380 gdk_wayland_screen_query_visual_types (GdkScreen *screen,
381 GdkVisualType **visual_types,
384 static GdkVisualType static_visual_types[] = { GDK_VISUAL_TRUE_COLOR };
386 *count = G_N_ELEMENTS(static_visual_types);
387 *visual_types = static_visual_types;
391 gdk_wayland_screen_list_visuals (GdkScreen *screen)
394 GdkScreenWayland *screen_wayland;
396 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
397 screen_wayland = GDK_SCREEN_WAYLAND (screen);
399 list = g_list_append (NULL, screen_wayland->visual);
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))
408 gdk_wayland_visual_new (GdkScreen *screen)
412 visual = g_object_new (GDK_TYPE_WAYLAND_VISUAL, NULL);
413 visual->screen = GDK_SCREEN (screen);
414 visual->type = GDK_VISUAL_TRUE_COLOR;
421 _gdk_wayland_screen_new (GdkDisplay *display)
424 GdkScreenWayland *screen_wayland;
426 screen = g_object_new (GDK_TYPE_SCREEN_WAYLAND, NULL);
428 screen_wayland = GDK_SCREEN_WAYLAND (screen);
429 screen_wayland->display = display;
430 screen_wayland->width = 8192;
431 screen_wayland->height = 8192;
433 screen_wayland->visual = gdk_wayland_visual_new (screen);
435 screen_wayland->root_window =
436 _gdk_wayland_screen_create_root_window (screen,
437 screen_wayland->width,
438 screen_wayland->height);
440 init_multihead (screen);
446 _gdk_screen_wayland_class_init (GdkScreenWaylandClass *klass)
448 GObjectClass *object_class = G_OBJECT_CLASS (klass);
449 GdkScreenClass *screen_class = GDK_SCREEN_CLASS (klass);
451 object_class->dispose = gdk_wayland_screen_dispose;
452 object_class->finalize = gdk_wayland_screen_finalize;
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;
488 _gdk_screen_wayland_init (GdkScreenWayland *screen_wayland)