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;
56 char *window_manager_name;
57 /* TRUE if wmspec_check_window has changed since last
58 * fetch of _NET_SUPPORTED
60 guint need_refetch_net_supported : 1;
61 /* TRUE if wmspec_check_window has changed since last
62 * fetch of window manager name
64 guint need_refetch_wm_name : 1;
67 GdkVisual *argb_visual;
68 GdkVisual *premultiplied_argb_visual;
69 GdkVisual *rgb_visual;
71 /* Xinerama/RandR 1.2 */
73 GdkWaylandMonitor *monitors;
76 /* Xft resources for the display, used for default values for
79 gboolean xft_init; /* Whether we've intialized these values yet */
80 gboolean xft_antialias;
86 GdkAtom cm_selection_atom;
87 gboolean is_composited;
90 struct _GdkScreenWaylandClass
92 GdkScreenClass parent_class;
94 void (* window_manager_changed) (GdkScreenWayland *screen_wayland);
97 struct _GdkWaylandMonitor
99 GdkRectangle geometry;
106 G_DEFINE_TYPE (GdkScreenWayland, _gdk_screen_wayland, GDK_TYPE_SCREEN)
109 init_monitor_geometry (GdkWaylandMonitor *monitor,
110 int x, int y, int width, int height)
112 monitor->geometry.x = x;
113 monitor->geometry.y = y;
114 monitor->geometry.width = width;
115 monitor->geometry.height = height;
117 monitor->width_mm = -1;
118 monitor->height_mm = -1;
119 monitor->output_name = NULL;
120 monitor->manufacturer = NULL;
124 free_monitors (GdkWaylandMonitor *monitors,
129 for (i = 0; i < n_monitors; ++i)
131 g_free (monitors[i].output_name);
132 g_free (monitors[i].manufacturer);
139 deinit_multihead (GdkScreen *screen)
141 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
143 free_monitors (screen_wayland->monitors, screen_wayland->n_monitors);
145 screen_wayland->n_monitors = 0;
146 screen_wayland->monitors = NULL;
150 init_multihead (GdkScreen *screen)
152 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
154 /* No multihead support of any kind for this screen */
155 screen_wayland->n_monitors = 1;
156 screen_wayland->monitors = g_new0 (GdkWaylandMonitor, 1);
157 screen_wayland->primary_monitor = 0;
159 init_monitor_geometry (screen_wayland->monitors, 0, 0,
160 screen_wayland->width, screen_wayland->height);
164 gdk_wayland_screen_dispose (GObject *object)
166 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (object);
168 if (screen_wayland->root_window)
169 _gdk_window_destroy (screen_wayland->root_window, TRUE);
171 G_OBJECT_CLASS (_gdk_screen_wayland_parent_class)->dispose (object);
175 gdk_wayland_screen_finalize (GObject *object)
177 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (object);
179 if (screen_wayland->root_window)
180 g_object_unref (screen_wayland->root_window);
183 g_object_unref (screen_wayland->argb_visual);
184 g_object_unref (screen_wayland->premultiplied_argb_visual);
185 g_object_unref (screen_wayland->rgb_visual);
187 g_free (screen_wayland->window_manager_name);
189 deinit_multihead (GDK_SCREEN (object));
191 G_OBJECT_CLASS (_gdk_screen_wayland_parent_class)->finalize (object);
195 gdk_wayland_screen_get_display (GdkScreen *screen)
197 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
199 return GDK_SCREEN_WAYLAND (screen)->display;
203 gdk_wayland_screen_get_width (GdkScreen *screen)
205 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
207 return GDK_SCREEN_WAYLAND (screen)->width;
211 gdk_wayland_screen_get_height (GdkScreen *screen)
213 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
215 return GDK_SCREEN_WAYLAND (screen)->height;
219 gdk_wayland_screen_get_width_mm (GdkScreen *screen)
221 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
223 return GDK_SCREEN_WAYLAND (screen)->width_mm;
227 gdk_wayland_screen_get_height_mm (GdkScreen *screen)
229 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
231 return GDK_SCREEN_WAYLAND (screen)->height_mm;
235 gdk_wayland_screen_get_number (GdkScreen *screen)
237 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
243 gdk_wayland_screen_get_root_window (GdkScreen *screen)
245 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
247 return GDK_SCREEN_WAYLAND (screen)->root_window;
251 gdk_wayland_screen_get_n_monitors (GdkScreen *screen)
253 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
255 return GDK_SCREEN_WAYLAND (screen)->n_monitors;
259 gdk_wayland_screen_get_primary_monitor (GdkScreen *screen)
261 g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
263 return GDK_SCREEN_WAYLAND (screen)->primary_monitor;
267 gdk_wayland_screen_get_monitor_width_mm (GdkScreen *screen,
270 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
272 g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
273 g_return_val_if_fail (monitor_num >= 0, -1);
274 g_return_val_if_fail (monitor_num < screen_wayland->n_monitors, -1);
276 return screen_wayland->monitors[monitor_num].width_mm;
280 gdk_wayland_screen_get_monitor_height_mm (GdkScreen *screen,
283 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
285 g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
286 g_return_val_if_fail (monitor_num >= 0, -1);
287 g_return_val_if_fail (monitor_num < screen_wayland->n_monitors, -1);
289 return screen_wayland->monitors[monitor_num].height_mm;
293 gdk_wayland_screen_get_monitor_plug_name (GdkScreen *screen,
296 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
298 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
299 g_return_val_if_fail (monitor_num >= 0, NULL);
300 g_return_val_if_fail (monitor_num < screen_wayland->n_monitors, NULL);
302 return g_strdup (screen_wayland->monitors[monitor_num].output_name);
306 gdk_wayland_screen_get_monitor_geometry (GdkScreen *screen,
310 GdkScreenWayland *screen_wayland = GDK_SCREEN_WAYLAND (screen);
312 g_return_if_fail (GDK_IS_SCREEN (screen));
313 g_return_if_fail (monitor_num >= 0);
314 g_return_if_fail (monitor_num < screen_wayland->n_monitors);
317 *dest = screen_wayland->monitors[monitor_num].geometry;
321 gdk_wayland_screen_get_system_visual (GdkScreen * screen)
323 return (GdkVisual *) GDK_SCREEN_WAYLAND (screen)->argb_visual;
327 gdk_wayland_screen_get_rgba_visual (GdkScreen *screen)
329 return (GdkVisual *) GDK_SCREEN_WAYLAND (screen)->argb_visual;
333 gdk_wayland_screen_is_composited (GdkScreen *screen)
339 gdk_wayland_screen_make_display_name (GdkScreen *screen)
345 gdk_wayland_screen_get_active_window (GdkScreen *screen)
347 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
353 gdk_wayland_screen_get_window_stack (GdkScreen *screen)
359 gdk_wayland_screen_broadcast_client_message (GdkScreen *screen,
365 gdk_wayland_screen_get_setting (GdkScreen *screen,
372 typedef struct _GdkWaylandVisual GdkWaylandVisual;
373 typedef struct _GdkWaylandVisualClass GdkWaylandVisualClass;
375 struct _GdkWaylandVisual
378 struct wl_visual *wl_visual;
381 struct _GdkWaylandVisualClass
383 GdkVisualClass parent_class;
386 G_DEFINE_TYPE (GdkWaylandVisual, _gdk_wayland_visual, GDK_TYPE_VISUAL)
389 _gdk_wayland_visual_class_init (GdkWaylandVisualClass *klass)
394 _gdk_wayland_visual_init (GdkWaylandVisual *visual)
399 gdk_wayland_screen_visual_get_best_depth (GdkScreen *screen)
405 gdk_wayland_screen_visual_get_best_type (GdkScreen *screen)
407 return GDK_VISUAL_TRUE_COLOR;
411 gdk_wayland_screen_visual_get_best (GdkScreen *screen)
413 return GDK_SCREEN_WAYLAND (screen)->argb_visual;
417 gdk_wayland_screen_visual_get_best_with_depth (GdkScreen *screen,
420 return GDK_SCREEN_WAYLAND (screen)->argb_visual;
424 gdk_wayland_screen_visual_get_best_with_type (GdkScreen *screen,
425 GdkVisualType visual_type)
427 return GDK_SCREEN_WAYLAND (screen)->argb_visual;
431 gdk_wayland_screen_visual_get_best_with_both (GdkScreen *screen,
433 GdkVisualType visual_type)
435 return GDK_SCREEN_WAYLAND (screen)->argb_visual;
439 gdk_wayland_screen_query_depths (GdkScreen *screen,
443 static gint static_depths[] = { 32 };
445 *count = G_N_ELEMENTS(static_depths);
446 *depths = static_depths;
450 gdk_wayland_screen_query_visual_types (GdkScreen *screen,
451 GdkVisualType **visual_types,
454 static GdkVisualType static_visual_types[] = { GDK_VISUAL_TRUE_COLOR };
456 *count = G_N_ELEMENTS(static_visual_types);
457 *visual_types = static_visual_types;
461 gdk_wayland_screen_list_visuals (GdkScreen *screen)
464 GdkScreenWayland *screen_wayland;
466 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
467 screen_wayland = GDK_SCREEN_WAYLAND (screen);
469 list = g_list_append (NULL, screen_wayland->argb_visual);
470 list = g_list_append (NULL, screen_wayland->premultiplied_argb_visual);
471 list = g_list_append (NULL, screen_wayland->rgb_visual);
476 #define GDK_TYPE_WAYLAND_VISUAL (_gdk_wayland_visual_get_type ())
477 #define GDK_WAYLAND_VISUAL(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WAYLAND_VISUAL, GdkWaylandVisual))
480 gdk_wayland_visual_new (GdkScreen *screen, struct wl_visual *wl_visual)
484 visual = g_object_new (GDK_TYPE_WAYLAND_VISUAL, NULL);
485 visual->screen = GDK_SCREEN (screen);
486 visual->type = GDK_VISUAL_TRUE_COLOR;
489 GDK_WAYLAND_VISUAL (visual)->wl_visual = wl_visual;
495 _gdk_wayland_screen_new (GdkDisplay *display)
498 GdkScreenWayland *screen_wayland;
499 GdkDisplayWayland *display_wayland;
500 struct wl_visual *visual;
502 display_wayland = GDK_DISPLAY_WAYLAND (display);
504 screen = g_object_new (GDK_TYPE_SCREEN_WAYLAND, NULL);
506 screen_wayland = GDK_SCREEN_WAYLAND (screen);
507 screen_wayland->display = display;
508 /* we want this to be always non-null */
509 screen_wayland->window_manager_name = g_strdup ("unknown");
511 screen_wayland->width = 8192;
512 screen_wayland->height = 8192;
514 visual = wl_display_get_argb_visual(display_wayland->wl_display);
515 screen_wayland->argb_visual = gdk_wayland_visual_new (screen, visual);
518 wl_display_get_premultiplied_argb_visual(display_wayland->wl_display);
519 screen_wayland->premultiplied_argb_visual =
520 gdk_wayland_visual_new (screen, visual);
522 visual = wl_display_get_rgb_visual(display_wayland->wl_display);
523 screen_wayland->rgb_visual = gdk_wayland_visual_new (screen, visual);
525 screen_wayland->root_window =
526 _gdk_wayland_screen_create_root_window (screen,
527 screen_wayland->width,
528 screen_wayland->height);
530 init_multihead (screen);
536 _gdk_screen_wayland_class_init (GdkScreenWaylandClass *klass)
538 GObjectClass *object_class = G_OBJECT_CLASS (klass);
539 GdkScreenClass *screen_class = GDK_SCREEN_CLASS (klass);
541 object_class->dispose = gdk_wayland_screen_dispose;
542 object_class->finalize = gdk_wayland_screen_finalize;
544 screen_class->get_display = gdk_wayland_screen_get_display;
545 screen_class->get_width = gdk_wayland_screen_get_width;
546 screen_class->get_height = gdk_wayland_screen_get_height;
547 screen_class->get_width_mm = gdk_wayland_screen_get_width_mm;
548 screen_class->get_height_mm = gdk_wayland_screen_get_height_mm;
549 screen_class->get_number = gdk_wayland_screen_get_number;
550 screen_class->get_root_window = gdk_wayland_screen_get_root_window;
551 screen_class->get_n_monitors = gdk_wayland_screen_get_n_monitors;
552 screen_class->get_primary_monitor = gdk_wayland_screen_get_primary_monitor;
553 screen_class->get_monitor_width_mm = gdk_wayland_screen_get_monitor_width_mm;
554 screen_class->get_monitor_height_mm = gdk_wayland_screen_get_monitor_height_mm;
555 screen_class->get_monitor_plug_name = gdk_wayland_screen_get_monitor_plug_name;
556 screen_class->get_monitor_geometry = gdk_wayland_screen_get_monitor_geometry;
557 screen_class->get_system_visual = gdk_wayland_screen_get_system_visual;
558 screen_class->get_rgba_visual = gdk_wayland_screen_get_rgba_visual;
559 screen_class->is_composited = gdk_wayland_screen_is_composited;
560 screen_class->make_display_name = gdk_wayland_screen_make_display_name;
561 screen_class->get_active_window = gdk_wayland_screen_get_active_window;
562 screen_class->get_window_stack = gdk_wayland_screen_get_window_stack;
563 screen_class->broadcast_client_message = gdk_wayland_screen_broadcast_client_message;
564 screen_class->get_setting = gdk_wayland_screen_get_setting;
565 screen_class->visual_get_best_depth = gdk_wayland_screen_visual_get_best_depth;
566 screen_class->visual_get_best_type = gdk_wayland_screen_visual_get_best_type;
567 screen_class->visual_get_best = gdk_wayland_screen_visual_get_best;
568 screen_class->visual_get_best_with_depth = gdk_wayland_screen_visual_get_best_with_depth;
569 screen_class->visual_get_best_with_type = gdk_wayland_screen_visual_get_best_with_type;
570 screen_class->visual_get_best_with_both = gdk_wayland_screen_visual_get_best_with_both;
571 screen_class->query_depths = gdk_wayland_screen_query_depths;
572 screen_class->query_visual_types = gdk_wayland_screen_query_visual_types;
573 screen_class->list_visuals = gdk_wayland_screen_list_visuals;
577 _gdk_screen_wayland_init (GdkScreenWayland *screen_wayland)