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 */
58 GdkWaylandMonitor *monitors;
62 struct _GdkWaylandScreenClass
64 GdkScreenClass parent_class;
66 void (* window_manager_changed) (GdkWaylandScreen *screen_wayland);
69 struct _GdkWaylandMonitor
71 GdkRectangle geometry;
78 G_DEFINE_TYPE (GdkWaylandScreen, _gdk_wayland_screen, GDK_TYPE_SCREEN)
80 #define MM_PER_INCH 25
81 #define DEFAULT_DPI 96
84 init_monitor_geometry (GdkWaylandMonitor *monitor,
85 int x, int y, int width, int height)
87 monitor->geometry.x = x;
88 monitor->geometry.y = y;
89 monitor->geometry.width = width;
90 monitor->geometry.height = height;
92 monitor->width_mm = width/DEFAULT_DPI*MM_PER_INCH;
93 monitor->height_mm = height/DEFAULT_DPI*MM_PER_INCH;
94 monitor->output_name = NULL;
95 monitor->manufacturer = NULL;
99 free_monitors (GdkWaylandMonitor *monitors,
104 for (i = 0; i < n_monitors; ++i)
106 g_free (monitors[i].output_name);
107 g_free (monitors[i].manufacturer);
114 deinit_multihead (GdkScreen *screen)
116 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
118 free_monitors (screen_wayland->monitors, screen_wayland->n_monitors);
120 screen_wayland->n_monitors = 0;
121 screen_wayland->monitors = NULL;
125 init_multihead (GdkScreen *screen)
127 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
129 /* No multihead support of any kind for this screen */
130 screen_wayland->n_monitors = 1;
131 screen_wayland->monitors = g_new0 (GdkWaylandMonitor, 1);
132 screen_wayland->primary_monitor = 0;
134 init_monitor_geometry (screen_wayland->monitors, 0, 0,
135 screen_wayland->width, screen_wayland->height);
139 gdk_wayland_screen_dispose (GObject *object)
141 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (object);
143 if (screen_wayland->root_window)
144 _gdk_window_destroy (screen_wayland->root_window, TRUE);
146 G_OBJECT_CLASS (_gdk_wayland_screen_parent_class)->dispose (object);
150 gdk_wayland_screen_finalize (GObject *object)
152 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (object);
154 if (screen_wayland->root_window)
155 g_object_unref (screen_wayland->root_window);
157 g_object_unref (screen_wayland->visual);
159 deinit_multihead (GDK_SCREEN (object));
161 G_OBJECT_CLASS (_gdk_wayland_screen_parent_class)->finalize (object);
165 gdk_wayland_screen_get_display (GdkScreen *screen)
167 return GDK_WAYLAND_SCREEN (screen)->display;
171 gdk_wayland_screen_get_width (GdkScreen *screen)
173 return GDK_WAYLAND_SCREEN (screen)->width;
177 gdk_wayland_screen_get_height (GdkScreen *screen)
179 return GDK_WAYLAND_SCREEN (screen)->height;
183 gdk_wayland_screen_get_width_mm (GdkScreen *screen)
185 return GDK_WAYLAND_SCREEN (screen)->width_mm;
189 gdk_wayland_screen_get_height_mm (GdkScreen *screen)
191 return GDK_WAYLAND_SCREEN (screen)->height_mm;
195 gdk_wayland_screen_get_number (GdkScreen *screen)
201 gdk_wayland_screen_get_root_window (GdkScreen *screen)
203 return GDK_WAYLAND_SCREEN (screen)->root_window;
207 gdk_wayland_screen_get_n_monitors (GdkScreen *screen)
209 return GDK_WAYLAND_SCREEN (screen)->n_monitors;
213 gdk_wayland_screen_get_primary_monitor (GdkScreen *screen)
215 return GDK_WAYLAND_SCREEN (screen)->primary_monitor;
219 gdk_wayland_screen_get_monitor_width_mm (GdkScreen *screen,
222 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
224 return screen_wayland->monitors[monitor_num].width_mm;
228 gdk_wayland_screen_get_monitor_height_mm (GdkScreen *screen,
231 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
233 return screen_wayland->monitors[monitor_num].height_mm;
237 gdk_wayland_screen_get_monitor_plug_name (GdkScreen *screen,
240 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
242 return g_strdup (screen_wayland->monitors[monitor_num].output_name);
246 gdk_wayland_screen_get_monitor_geometry (GdkScreen *screen,
250 GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
253 *dest = screen_wayland->monitors[monitor_num].geometry;
257 gdk_wayland_screen_get_system_visual (GdkScreen * screen)
259 return (GdkVisual *) GDK_WAYLAND_SCREEN (screen)->visual;
263 gdk_wayland_screen_get_rgba_visual (GdkScreen *screen)
265 return (GdkVisual *) GDK_WAYLAND_SCREEN (screen)->visual;
269 gdk_wayland_screen_is_composited (GdkScreen *screen)
275 gdk_wayland_screen_make_display_name (GdkScreen *screen)
281 gdk_wayland_screen_get_active_window (GdkScreen *screen)
287 gdk_wayland_screen_get_window_stack (GdkScreen *screen)
293 gdk_wayland_screen_broadcast_client_message (GdkScreen *screen,
299 gdk_wayland_screen_get_setting (GdkScreen *screen,
303 g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
305 if (strcmp ("gtk-theme-name", name) == 0)
307 const gchar *s = "Adwaita";
308 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %s\n", name, s));
309 g_value_set_static_string (value, s);
312 if (strcmp ("gtk-cursor-theme-name", name) == 0)
314 const gchar *s = "Adwaita";
315 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %s\n", name, s));
316 g_value_set_static_string (value, s);
319 else if (strcmp ("gtk-icon-theme-name", name) == 0)
321 const gchar *s = "gnome";
322 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %s\n", name, s));
323 g_value_set_static_string (value, s);
326 else if (strcmp ("gtk-double-click-time", name) == 0)
329 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %d\n", name, i));
330 g_value_set_int (value, i);
333 else if (strcmp ("gtk-double-click-distance", name) == 0)
336 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %d\n", name, i));
337 g_value_set_int (value, i);
340 else if (strcmp ("gtk-dnd-drag-threshold", name) == 0)
343 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %d\n", name, i));
344 g_value_set_int (value, i);
347 else if (strcmp ("gtk-split-cursor", name) == 0)
349 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : FALSE\n", name));
350 g_value_set_boolean (value, FALSE);
353 else if (strcmp ("gtk-alternative-button-order", name) == 0)
355 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : TRUE\n", name));
356 g_value_set_boolean (value, TRUE);
359 else if (strcmp ("gtk-alternative-sort-arrows", name) == 0)
361 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : TRUE\n", name));
362 g_value_set_boolean (value, TRUE);
365 else if (strcmp ("gtk-xft-dpi", name) == 0)
368 GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : TRUE\n", name));
369 g_value_set_int (value, i);
376 typedef struct _GdkWaylandVisual GdkWaylandVisual;
377 typedef struct _GdkWaylandVisualClass GdkWaylandVisualClass;
379 struct _GdkWaylandVisual
384 struct _GdkWaylandVisualClass
386 GdkVisualClass parent_class;
389 G_DEFINE_TYPE (GdkWaylandVisual, _gdk_wayland_visual, GDK_TYPE_VISUAL)
392 _gdk_wayland_visual_class_init (GdkWaylandVisualClass *klass)
397 _gdk_wayland_visual_init (GdkWaylandVisual *visual)
402 gdk_wayland_screen_visual_get_best_depth (GdkScreen *screen)
408 gdk_wayland_screen_visual_get_best_type (GdkScreen *screen)
410 return GDK_VISUAL_TRUE_COLOR;
414 gdk_wayland_screen_visual_get_best (GdkScreen *screen)
416 return GDK_WAYLAND_SCREEN (screen)->visual;
420 gdk_wayland_screen_visual_get_best_with_depth (GdkScreen *screen,
423 return GDK_WAYLAND_SCREEN (screen)->visual;
427 gdk_wayland_screen_visual_get_best_with_type (GdkScreen *screen,
428 GdkVisualType visual_type)
430 return GDK_WAYLAND_SCREEN (screen)->visual;
434 gdk_wayland_screen_visual_get_best_with_both (GdkScreen *screen,
436 GdkVisualType visual_type)
438 return GDK_WAYLAND_SCREEN (screen)->visual;
442 gdk_wayland_screen_query_depths (GdkScreen *screen,
446 static gint static_depths[] = { 32 };
448 *count = G_N_ELEMENTS(static_depths);
449 *depths = static_depths;
453 gdk_wayland_screen_query_visual_types (GdkScreen *screen,
454 GdkVisualType **visual_types,
457 static GdkVisualType static_visual_types[] = { GDK_VISUAL_TRUE_COLOR };
459 *count = G_N_ELEMENTS(static_visual_types);
460 *visual_types = static_visual_types;
464 gdk_wayland_screen_list_visuals (GdkScreen *screen)
467 GdkWaylandScreen *screen_wayland;
469 g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
470 screen_wayland = GDK_WAYLAND_SCREEN (screen);
472 list = g_list_append (NULL, screen_wayland->visual);
477 #define GDK_TYPE_WAYLAND_VISUAL (_gdk_wayland_visual_get_type ())
478 #define GDK_WAYLAND_VISUAL(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WAYLAND_VISUAL, GdkWaylandVisual))
481 gdk_wayland_visual_new (GdkScreen *screen)
485 visual = g_object_new (GDK_TYPE_WAYLAND_VISUAL, NULL);
486 visual->screen = GDK_SCREEN (screen);
487 visual->type = GDK_VISUAL_TRUE_COLOR;
494 _gdk_wayland_screen_new (GdkDisplay *display)
497 GdkWaylandScreen *screen_wayland;
499 screen = g_object_new (GDK_TYPE_WAYLAND_SCREEN, NULL);
501 screen_wayland = GDK_WAYLAND_SCREEN (screen);
502 screen_wayland->display = display;
503 screen_wayland->width = 8192;
504 screen_wayland->height = 8192;
506 screen_wayland->visual = gdk_wayland_visual_new (screen);
508 screen_wayland->root_window =
509 _gdk_wayland_screen_create_root_window (screen,
510 screen_wayland->width,
511 screen_wayland->height);
513 init_multihead (screen);
519 _gdk_wayland_screen_class_init (GdkWaylandScreenClass *klass)
521 GObjectClass *object_class = G_OBJECT_CLASS (klass);
522 GdkScreenClass *screen_class = GDK_SCREEN_CLASS (klass);
524 object_class->dispose = gdk_wayland_screen_dispose;
525 object_class->finalize = gdk_wayland_screen_finalize;
527 screen_class->get_display = gdk_wayland_screen_get_display;
528 screen_class->get_width = gdk_wayland_screen_get_width;
529 screen_class->get_height = gdk_wayland_screen_get_height;
530 screen_class->get_width_mm = gdk_wayland_screen_get_width_mm;
531 screen_class->get_height_mm = gdk_wayland_screen_get_height_mm;
532 screen_class->get_number = gdk_wayland_screen_get_number;
533 screen_class->get_root_window = gdk_wayland_screen_get_root_window;
534 screen_class->get_n_monitors = gdk_wayland_screen_get_n_monitors;
535 screen_class->get_primary_monitor = gdk_wayland_screen_get_primary_monitor;
536 screen_class->get_monitor_width_mm = gdk_wayland_screen_get_monitor_width_mm;
537 screen_class->get_monitor_height_mm = gdk_wayland_screen_get_monitor_height_mm;
538 screen_class->get_monitor_plug_name = gdk_wayland_screen_get_monitor_plug_name;
539 screen_class->get_monitor_geometry = gdk_wayland_screen_get_monitor_geometry;
540 screen_class->get_monitor_workarea = gdk_wayland_screen_get_monitor_geometry;
541 screen_class->get_system_visual = gdk_wayland_screen_get_system_visual;
542 screen_class->get_rgba_visual = gdk_wayland_screen_get_rgba_visual;
543 screen_class->is_composited = gdk_wayland_screen_is_composited;
544 screen_class->make_display_name = gdk_wayland_screen_make_display_name;
545 screen_class->get_active_window = gdk_wayland_screen_get_active_window;
546 screen_class->get_window_stack = gdk_wayland_screen_get_window_stack;
547 screen_class->broadcast_client_message = gdk_wayland_screen_broadcast_client_message;
548 screen_class->get_setting = gdk_wayland_screen_get_setting;
549 screen_class->visual_get_best_depth = gdk_wayland_screen_visual_get_best_depth;
550 screen_class->visual_get_best_type = gdk_wayland_screen_visual_get_best_type;
551 screen_class->visual_get_best = gdk_wayland_screen_visual_get_best;
552 screen_class->visual_get_best_with_depth = gdk_wayland_screen_visual_get_best_with_depth;
553 screen_class->visual_get_best_with_type = gdk_wayland_screen_visual_get_best_with_type;
554 screen_class->visual_get_best_with_both = gdk_wayland_screen_visual_get_best_with_both;
555 screen_class->query_depths = gdk_wayland_screen_query_depths;
556 screen_class->query_visual_types = gdk_wayland_screen_query_visual_types;
557 screen_class->list_visuals = gdk_wayland_screen_list_visuals;
561 _gdk_wayland_screen_init (GdkWaylandScreen *screen_wayland)