1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2 /* SPDX-FileCopyrightText: 2001 Mikael Hallendal <micke@imendio.com>
3 * SPDX-FileCopyrightText: 2004, 2008 Imendio AB
4 * SPDX-FileCopyrightText: 2015, 2017, 2018 Sébastien Wilmet <swilmet@gnome.org>
5 * SPDX-License-Identifier: GPL-3.0-or-later
6 */
7
8 #include "config.h"
9
10 #include "dh-util-app.h"
11
12 static void
introspect_window_gsettings(GSettings * window_settings,gboolean * has_required_keys,gboolean * has_maximized_key)13 introspect_window_gsettings (GSettings *window_settings,
14 gboolean *has_required_keys,
15 gboolean *has_maximized_key)
16 {
17 GSettingsSchema *schema = NULL;
18
19 g_object_get (window_settings,
20 "settings-schema", &schema,
21 NULL);
22
23 *has_required_keys = (g_settings_schema_has_key (schema, "width") &&
24 g_settings_schema_has_key (schema, "height"));
25
26 *has_maximized_key = g_settings_schema_has_key (schema, "maximized");
27
28 g_settings_schema_unref (schema);
29 }
30
31 void
dh_util_window_settings_save(GtkWindow * window,GSettings * settings)32 dh_util_window_settings_save (GtkWindow *window,
33 GSettings *settings)
34 {
35 gboolean has_required_keys;
36 gboolean has_maximized_key;
37 gint width;
38 gint height;
39
40 g_return_if_fail (GTK_IS_WINDOW (window));
41 g_return_if_fail (G_IS_SETTINGS (settings));
42
43 introspect_window_gsettings (settings, &has_required_keys, &has_maximized_key);
44 g_return_if_fail (has_required_keys);
45
46 if (has_maximized_key) {
47 GdkWindowState state;
48 gboolean maximized;
49
50 state = gdk_window_get_state (gtk_widget_get_window (GTK_WIDGET (window)));
51 maximized = (state & GDK_WINDOW_STATE_MAXIMIZED) != 0;
52
53 g_settings_set_boolean (settings, "maximized", maximized);
54
55 /* If maximized don't save the size. */
56 if (maximized)
57 return;
58 }
59
60 /* Store the dimensions */
61 gtk_window_get_size (GTK_WINDOW (window), &width, &height);
62 g_settings_set_int (settings, "width", width);
63 g_settings_set_int (settings, "height", height);
64 }
65
66 /* This should be called when @gtk_window is realized (i.e. its GdkWindow is
67 * created) but not yet mapped (i.e. gtk_widget_show() has not yet been called,
68 * so that when it is shown it already has the good size).
69 */
70 void
dh_util_window_settings_restore(GtkWindow * gtk_window,GSettings * settings)71 dh_util_window_settings_restore (GtkWindow *gtk_window,
72 GSettings *settings)
73 {
74 gboolean has_required_keys;
75 gboolean has_maximized_key;
76 gint width;
77 gint height;
78
79 g_return_if_fail (GTK_IS_WINDOW (gtk_window));
80 g_return_if_fail (gtk_widget_get_realized (GTK_WIDGET (gtk_window)));
81 g_return_if_fail (G_IS_SETTINGS (settings));
82
83 introspect_window_gsettings (settings, &has_required_keys, &has_maximized_key);
84 g_return_if_fail (has_required_keys);
85
86 width = g_settings_get_int (settings, "width");
87 height = g_settings_get_int (settings, "height");
88
89 if (width > 1 && height > 1) {
90 GdkDisplay *display;
91 GdkWindow *gdk_window;
92 GdkMonitor *monitor;
93 GdkRectangle monitor_workarea;
94 gint max_width;
95 gint max_height;
96
97 display = gtk_widget_get_display (GTK_WIDGET (gtk_window));
98 /* To get the GdkWindow the widget must be realized. */
99 gdk_window = gtk_widget_get_window (GTK_WIDGET (gtk_window));
100 monitor = gdk_display_get_monitor_at_window (display, gdk_window);
101 gdk_monitor_get_workarea (monitor, &monitor_workarea);
102
103 max_width = monitor_workarea.width;
104 max_height = monitor_workarea.height;
105
106 width = CLAMP (width, 0, max_width);
107 height = CLAMP (height, 0, max_height);
108
109 gtk_window_set_default_size (gtk_window, width, height);
110 }
111
112 if (has_maximized_key && g_settings_get_boolean (settings, "maximized"))
113 gtk_window_maximize (gtk_window);
114 }
115
116 gboolean
dh_util_is_devel_build(void)117 dh_util_is_devel_build (void)
118 {
119 #if DEVEL_BUILD
120 return TRUE;
121 #else
122 return FALSE;
123 #endif
124 }
125