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 _GdkWaylandScreen GdkWaylandScreen;
32 typedef struct _GdkWaylandScreenClass GdkWaylandScreenClass;
34 #define GDK_TYPE_WAYLAND_SCREEN (_gdk_wayland_screen_get_type ())
35 #define GDK_WAYLAND_SCREEN(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WAYLAND_SCREEN, GdkWaylandScreen))
36 #define GDK_WAYLAND_SCREEN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_WAYLAND_SCREEN, GdkWaylandScreenClass))
37 #define GDK_IS_WAYLAND_SCREEN(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_WAYLAND_SCREEN))
38 #define GDK_IS_WAYLAND_SCREEN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WAYLAND_SCREEN))
39 #define GDK_WAYLAND_SCREEN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_WAYLAND_SCREEN, GdkWaylandScreenClass))
41 typedef struct _GdkWaylandMonitor GdkWaylandMonitor;
43 struct _GdkWaylandScreen
45 GdkScreen parent_instance;
48 GdkWindow *root_window;
51 int width_mm, height_mm;
56 /* Xinerama/RandR 1.2 */
61 struct _GdkWaylandScreenClass
63 GdkScreenClass parent_class;
65 void (* window_manager_changed) (GdkWaylandScreen *screen_wayland);
68 struct _GdkWaylandMonitor
70 struct wl_output *output;
71 GdkRectangle geometry;
78 G_DEFINE_TYPE (GdkWaylandScreen, _gdk_wayland_screen, GDK_TYPE_SCREEN)
81 free_monitor (gpointer data)
83 GdkWaylandMonitor *monitor = data;
88 g_free (monitor->output_name);
89 g_free (monitor->manufacturer);
95 deinit_multihead (GdkScreen *screen)
97 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
99 g_ptr_array_free (screen_wayland->monitors, TRUE);
101 screen_wayland->monitors = NULL;
105 init_multihead (GdkScreen *screen)
107 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
109 screen_wayland->monitors = g_ptr_array_new_with_free_func (free_monitor);
110 screen_wayland->primary_monitor = 0;
114 gdk_wayland_screen_dispose (GObject *object)
116 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (object);
118 if (screen_wayland->root_window)
119 _gdk_window_destroy (screen_wayland->root_window, TRUE);
121 G_OBJECT_CLASS (_gdk_wayland_screen_parent_class)->dispose (object);
125 gdk_wayland_screen_finalize (GObject *object)
127 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (object);
129 if (screen_wayland->root_window)
130 g_object_unref (screen_wayland->root_window);
132 g_object_unref (screen_wayland->visual);
134 deinit_multihead (GDK_SCREEN (object));
136 G_OBJECT_CLASS (_gdk_wayland_screen_parent_class)->finalize (object);
140 gdk_wayland_screen_get_display (GdkScreen *screen)
142 return GDK_WAYLAND_SCREEN (screen)->display;
146 gdk_wayland_screen_get_width (GdkScreen *screen)
148 return GDK_WAYLAND_SCREEN (screen)->width;
152 gdk_wayland_screen_get_height (GdkScreen *screen)
154 return GDK_WAYLAND_SCREEN (screen)->height;
158 gdk_wayland_screen_get_width_mm (GdkScreen *screen)
160 return GDK_WAYLAND_SCREEN (screen)->width_mm;
164 gdk_wayland_screen_get_height_mm (GdkScreen *screen)
166 return GDK_WAYLAND_SCREEN (screen)->height_mm;
170 gdk_wayland_screen_get_number (GdkScreen *screen)
176 gdk_wayland_screen_get_root_window (GdkScreen *screen)
178 return GDK_WAYLAND_SCREEN (screen)->root_window;
182 gdk_wayland_screen_get_n_monitors (GdkScreen *screen)
184 return GDK_WAYLAND_SCREEN (screen)->monitors->len;
188 gdk_wayland_screen_get_primary_monitor (GdkScreen *screen)
190 return GDK_WAYLAND_SCREEN (screen)->primary_monitor;
194 gdk_wayland_screen_get_monitor_width_mm (GdkScreen *screen,
197 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
198 GdkWaylandMonitor *monitor = g_ptr_array_index(screen_wayland->monitors, monitor_num);
200 return monitor->width_mm;
204 gdk_wayland_screen_get_monitor_height_mm (GdkScreen *screen,
207 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
208 GdkWaylandMonitor *monitor = g_ptr_array_index(screen_wayland->monitors, monitor_num);
210 return monitor->height_mm;
214 gdk_wayland_screen_get_monitor_plug_name (GdkScreen *screen,
217 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
218 GdkWaylandMonitor *monitor = g_ptr_array_index(screen_wayland->monitors, monitor_num);
220 return g_strdup (monitor->output_name);
224 gdk_wayland_screen_get_monitor_geometry (GdkScreen *screen,
228 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
229 GdkWaylandMonitor *monitor = g_ptr_array_index(screen_wayland->monitors, monitor_num);
232 *dest = monitor->geometry;
236 gdk_wayland_screen_get_system_visual (GdkScreen * screen)
238 return (GdkVisual *) GDK_WAYLAND_SCREEN (screen)->visual;
242 gdk_wayland_screen_get_rgba_visual (GdkScreen *screen)
244 return (GdkVisual *) GDK_WAYLAND_SCREEN (screen)->visual;
248 gdk_wayland_screen_is_composited (GdkScreen *screen)
254 gdk_wayland_screen_make_display_name (GdkScreen *screen)
260 gdk_wayland_screen_get_active_window (GdkScreen *screen)
266 gdk_wayland_screen_get_window_stack (GdkScreen *screen)
272 gdk_wayland_screen_broadcast_client_message (GdkScreen *screen,
278 gdk_wayland_screen_get_setting (GdkScreen *screen,
282 g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
284 if (strcmp ("gtk-theme-name", name) == 0)
286 const gchar *s = "Adwaita";
287 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %s\n", name, s));
288 g_value_set_static_string (value, s);
291 if (strcmp ("gtk-cursor-theme-name", name) == 0)
293 const gchar *s = "Adwaita";
294 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %s\n", name, s));
295 g_value_set_static_string (value, s);
298 else if (strcmp ("gtk-icon-theme-name", name) == 0)
300 const gchar *s = "gnome";
301 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %s\n", name, s));
302 g_value_set_static_string (value, s);
305 else if (strcmp ("gtk-double-click-time", name) == 0)
308 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %d\n", name, i));
309 g_value_set_int (value, i);
312 else if (strcmp ("gtk-double-click-distance", name) == 0)
315 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %d\n", name, i));
316 g_value_set_int (value, i);
319 else if (strcmp ("gtk-dnd-drag-threshold", name) == 0)
322 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %d\n", name, i));
323 g_value_set_int (value, i);
326 else if (strcmp ("gtk-split-cursor", name) == 0)
328 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : FALSE\n", name));
329 g_value_set_boolean (value, FALSE);
332 else if (strcmp ("gtk-alternative-button-order", name) == 0)
334 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : TRUE\n", name));
335 g_value_set_boolean (value, TRUE);
338 else if (strcmp ("gtk-alternative-sort-arrows", name) == 0)
340 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : TRUE\n", name));
341 g_value_set_boolean (value, TRUE);
344 else if (strcmp ("gtk-xft-dpi", name) == 0)
347 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : TRUE\n", name));
348 g_value_set_int (value, i);
355 typedef struct _GdkWaylandVisual GdkWaylandVisual;
356 typedef struct _GdkWaylandVisualClass GdkWaylandVisualClass;
358 struct _GdkWaylandVisual
363 struct _GdkWaylandVisualClass
365 GdkVisualClass parent_class;
368 G_DEFINE_TYPE (GdkWaylandVisual, _gdk_wayland_visual, GDK_TYPE_VISUAL)
371 _gdk_wayland_visual_class_init (GdkWaylandVisualClass *klass)
376 _gdk_wayland_visual_init (GdkWaylandVisual *visual)
381 gdk_wayland_screen_visual_get_best_depth (GdkScreen *screen)
387 gdk_wayland_screen_visual_get_best_type (GdkScreen *screen)
389 return GDK_VISUAL_TRUE_COLOR;
393 gdk_wayland_screen_visual_get_best (GdkScreen *screen)
395 return GDK_WAYLAND_SCREEN (screen)->visual;
399 gdk_wayland_screen_visual_get_best_with_depth (GdkScreen *screen,
402 return GDK_WAYLAND_SCREEN (screen)->visual;
406 gdk_wayland_screen_visual_get_best_with_type (GdkScreen *screen,
407 GdkVisualType visual_type)
409 return GDK_WAYLAND_SCREEN (screen)->visual;
413 gdk_wayland_screen_visual_get_best_with_both (GdkScreen *screen,
415 GdkVisualType visual_type)
417 return GDK_WAYLAND_SCREEN (screen)->visual;
421 gdk_wayland_screen_query_depths (GdkScreen *screen,
425 static gint static_depths[] = { 32 };
427 *count = G_N_ELEMENTS(static_depths);
428 *depths = static_depths;
432 gdk_wayland_screen_query_visual_types (GdkScreen *screen,
433 GdkVisualType **visual_types,
436 static GdkVisualType static_visual_types[] = { GDK_VISUAL_TRUE_COLOR };
438 *count = G_N_ELEMENTS(static_visual_types);
439 *visual_types = static_visual_types;
443 gdk_wayland_screen_list_visuals (GdkScreen *screen)
446 GdkWaylandScreen *screen_wayland;
448 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
449 screen_wayland = GDK_WAYLAND_SCREEN (screen);
451 list = g_list_append (NULL, screen_wayland->visual);
456 #define GDK_TYPE_WAYLAND_VISUAL (_gdk_wayland_visual_get_type ())
457 #define GDK_WAYLAND_VISUAL(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WAYLAND_VISUAL, GdkWaylandVisual))
460 gdk_wayland_visual_new (GdkScreen *screen)
464 visual = g_object_new (GDK_TYPE_WAYLAND_VISUAL, NULL);
465 visual->screen = GDK_SCREEN (screen);
466 visual->type = GDK_VISUAL_TRUE_COLOR;
473 _gdk_wayland_screen_new (GdkDisplay *display)
476 GdkWaylandScreen *screen_wayland;
478 screen = g_object_new (GDK_TYPE_WAYLAND_SCREEN, NULL);
480 screen_wayland = GDK_WAYLAND_SCREEN (screen);
481 screen_wayland->display = display;
482 screen_wayland->width = 8192;
483 screen_wayland->height = 8192;
485 screen_wayland->visual = gdk_wayland_visual_new (screen);
487 screen_wayland->root_window =
488 _gdk_wayland_screen_create_root_window (screen,
489 screen_wayland->width,
490 screen_wayland->height);
492 init_multihead (screen);
498 _gdk_wayland_screen_class_init (GdkWaylandScreenClass *klass)
500 GObjectClass *object_class = G_OBJECT_CLASS (klass);
501 GdkScreenClass *screen_class = GDK_SCREEN_CLASS (klass);
503 object_class->dispose = gdk_wayland_screen_dispose;
504 object_class->finalize = gdk_wayland_screen_finalize;
506 screen_class->get_display = gdk_wayland_screen_get_display;
507 screen_class->get_width = gdk_wayland_screen_get_width;
508 screen_class->get_height = gdk_wayland_screen_get_height;
509 screen_class->get_width_mm = gdk_wayland_screen_get_width_mm;
510 screen_class->get_height_mm = gdk_wayland_screen_get_height_mm;
511 screen_class->get_number = gdk_wayland_screen_get_number;
512 screen_class->get_root_window = gdk_wayland_screen_get_root_window;
513 screen_class->get_n_monitors = gdk_wayland_screen_get_n_monitors;
514 screen_class->get_primary_monitor = gdk_wayland_screen_get_primary_monitor;
515 screen_class->get_monitor_width_mm = gdk_wayland_screen_get_monitor_width_mm;
516 screen_class->get_monitor_height_mm = gdk_wayland_screen_get_monitor_height_mm;
517 screen_class->get_monitor_plug_name = gdk_wayland_screen_get_monitor_plug_name;
518 screen_class->get_monitor_geometry = gdk_wayland_screen_get_monitor_geometry;
519 screen_class->get_monitor_workarea = gdk_wayland_screen_get_monitor_geometry;
520 screen_class->get_system_visual = gdk_wayland_screen_get_system_visual;
521 screen_class->get_rgba_visual = gdk_wayland_screen_get_rgba_visual;
522 screen_class->is_composited = gdk_wayland_screen_is_composited;
523 screen_class->make_display_name = gdk_wayland_screen_make_display_name;
524 screen_class->get_active_window = gdk_wayland_screen_get_active_window;
525 screen_class->get_window_stack = gdk_wayland_screen_get_window_stack;
526 screen_class->broadcast_client_message = gdk_wayland_screen_broadcast_client_message;
527 screen_class->get_setting = gdk_wayland_screen_get_setting;
528 screen_class->visual_get_best_depth = gdk_wayland_screen_visual_get_best_depth;
529 screen_class->visual_get_best_type = gdk_wayland_screen_visual_get_best_type;
530 screen_class->visual_get_best = gdk_wayland_screen_visual_get_best;
531 screen_class->visual_get_best_with_depth = gdk_wayland_screen_visual_get_best_with_depth;
532 screen_class->visual_get_best_with_type = gdk_wayland_screen_visual_get_best_with_type;
533 screen_class->visual_get_best_with_both = gdk_wayland_screen_visual_get_best_with_both;
534 screen_class->query_depths = gdk_wayland_screen_query_depths;
535 screen_class->query_visual_types = gdk_wayland_screen_query_visual_types;
536 screen_class->list_visuals = gdk_wayland_screen_list_visuals;
540 _gdk_wayland_screen_init (GdkWaylandScreen *screen_wayland)
545 output_handle_geometry(void *data,
546 struct wl_output *wl_output,
547 int x, int y, int physical_width, int physical_height,
548 int subpixel, const char *make, const char *model,
551 GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data;
553 monitor->geometry.x = x;
554 monitor->geometry.y = y;
556 monitor->width_mm = physical_width;
557 monitor->height_mm = physical_height;
559 monitor->manufacturer = g_strdup (make);
560 monitor->output_name = g_strdup (model);
564 output_handle_mode(void *data,
565 struct wl_output *wl_output,
571 GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data;
573 if ((flags & WL_OUTPUT_MODE_CURRENT) == 0)
576 monitor->geometry.width = width;
577 monitor->geometry.height = height;
580 static const struct wl_output_listener output_listener =
582 output_handle_geometry,
587 _gdk_wayland_screen_add_output (GdkScreen *screen,
588 struct wl_output *output)
590 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
591 GdkWaylandMonitor *monitor = g_new0(GdkWaylandMonitor, 1);
593 monitor->output = output;
594 g_ptr_array_add(screen_wayland->monitors, monitor);
596 wl_output_add_listener(output, &output_listener, monitor);
600 _gdk_wayland_screen_remove_output_by_id (GdkScreen *screen,
603 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
606 for (i = 0; i < screen_wayland->monitors->len; i++)
608 GdkWaylandMonitor *monitor = screen_wayland->monitors->pdata[i];
610 if (wl_proxy_get_id ((struct wl_proxy *)monitor->output) == id)
612 g_ptr_array_remove (screen_wayland->monitors, monitor);