[gnome-initial-setup/rm-warnings] driver: Account for multi monitor when checking for small screen
- From: Philip Chimento <pchimento src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-initial-setup/rm-warnings] driver: Account for multi monitor when checking for small screen
- Date: Fri, 19 Jul 2019 18:10:13 +0000 (UTC)
commit 52a19c4104abdfc7e2c1c74bff4a0c4f9ad59565
Author: Philip Chimento <philip endlessm com>
Date: Fri Jul 19 11:07:44 2019 -0700
driver: Account for multi monitor when checking for small screen
gdk_screen_get_height() is deprecated in favour of per-monitor APIs. So,
when deciding whether to show the window in small-screen mode, we check
the height of the monitor on which the window is currently displaying.
If the window isn't realized yet, we check the primary monitor, assuming
that's where the window will eventually be realized onto.
gnome-initial-setup/gis-driver.c | 60 ++++++++++++++++++++++++++++++----------
1 file changed, 45 insertions(+), 15 deletions(-)
---
diff --git a/gnome-initial-setup/gis-driver.c b/gnome-initial-setup/gis-driver.c
index a377f55..64fe7ba 100644
--- a/gnome-initial-setup/gis-driver.c
+++ b/gnome-initial-setup/gis-driver.c
@@ -320,12 +320,15 @@ gis_driver_is_small_screen (GisDriver *driver)
}
static gboolean
-screen_is_small (GdkScreen *screen)
+monitor_is_small (GdkMonitor *monitor)
{
+ GdkRectangle geom;
+
if (g_getenv ("GIS_SMALL_SCREEN"))
return TRUE;
- return gdk_screen_get_height (screen) < 800;
+ gdk_monitor_get_geometry (monitor, &geom);
+ return geom.height < 800;
}
static void
@@ -409,6 +412,42 @@ unmaximize (gpointer data)
return G_SOURCE_REMOVE;
}
+static void
+set_small_screen_based_on_primary_monitor (GisDriver *driver)
+{
+ GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
+ GdkDisplay *default_display = gdk_display_get_default ();
+ GdkMonitor *primary_monitor = gdk_display_get_primary_monitor (default_display);
+
+ priv->small_screen = monitor_is_small (primary_monitor);
+}
+
+/* Recompute priv->small_screen based on the monitor where the window is
+ * located, if the window is actually realized. If not, recompute it based on
+ * the primary monitor of the default display. */
+static void
+recompute_small_screen (GisDriver *driver) {
+ GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
+ GdkWindow *window;
+ GdkDisplay *default_display = gdk_display_get_default ();
+ GdkMonitor *active_monitor;
+ gboolean old_value = priv->small_screen;
+
+ if (!gtk_widget_get_realized (GTK_WIDGET (priv->main_window)))
+ {
+ set_small_screen_based_on_primary_monitor (driver);
+ }
+ else
+ {
+ window = gtk_widget_get_window (GTK_WIDGET (priv->main_window));
+ active_monitor = gdk_display_get_monitor_at_window (default_display, window);
+ priv->small_screen = monitor_is_small (active_monitor);
+ }
+
+ if (priv->small_screen != old_value)
+ g_object_notify (G_OBJECT (driver), "small-screen");
+}
+
static void
update_screen_size (GisDriver *driver)
{
@@ -417,6 +456,8 @@ update_screen_size (GisDriver *driver)
GdkGeometry size_hints;
GtkWidget *sw;
+ recompute_small_screen (driver);
+
if (!gtk_widget_get_realized (GTK_WIDGET (priv->main_window)))
return;
@@ -468,17 +509,7 @@ update_screen_size (GisDriver *driver)
static void
screen_size_changed (GdkScreen *screen, GisDriver *driver)
{
- GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
- gboolean small_screen;
-
- small_screen = screen_is_small (screen);
-
- if (priv->small_screen != small_screen)
- {
- priv->small_screen = small_screen;
- update_screen_size (driver);
- g_object_notify (G_OBJECT (driver), "small-screen");
- }
+ update_screen_size (driver);
}
static void
@@ -544,12 +575,11 @@ gis_driver_startup (GApplication *app)
static void
gis_driver_init (GisDriver *driver)
{
- GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
GdkScreen *screen;
screen = gdk_screen_get_default ();
- priv->small_screen = screen_is_small (screen);
+ set_small_screen_based_on_primary_monitor (driver);
g_signal_connect (screen, "size-changed",
G_CALLBACK (screen_size_changed), driver);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]