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