summaryrefslogtreecommitdiffstats
path: root/src/ui/monitor.cpp
diff options
context:
space:
mode:
authorEduard Braun <eduard.braun2@gmx.de>2018-01-09 20:37:43 +0000
committerEduard Braun <eduard.braun2@gmx.de>2018-01-09 21:32:06 +0000
commit87661ee65e9faccb22adeca6a37de7b065e8a702 (patch)
tree474f2e077578ae8524f1697ad37dd61c7b267863 /src/ui/monitor.cpp
parentFix profiling build (diff)
parentLimit default window size to monitor dimensions (diff)
downloadinkscape-87661ee65e9faccb22adeca6a37de7b065e8a702.tar.gz
inkscape-87661ee65e9faccb22adeca6a37de7b065e8a702.zip
Fix and improve window size/position handling/restoration
- Fix broken window size/position restoration after gtk3 deprecation fixes in fa8a2ee7e2539b145a87ac9af0d9748effa91631 - Use monitor geometry of the monitor Inkscape will be shown on instead of defaulting to the primary monitor which is often wrong - Let gtk+ / window manager handle window size/position sanitization (confirmed working on Windows and Ubuntu 16.04) and remove custom code which was prone to errors and did not always work as desired - Make default window size "Small" work again (was broken in gtk3) and add a new preference "Default" which uses the native window size (i.e. tries to make just enough room for all controls)
Diffstat (limited to 'src/ui/monitor.cpp')
-rw-r--r--src/ui/monitor.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/ui/monitor.cpp b/src/ui/monitor.cpp
new file mode 100644
index 000000000..3e0c983fe
--- /dev/null
+++ b/src/ui/monitor.cpp
@@ -0,0 +1,107 @@
+/**
+ * \file
+ * \brief helper functions for retrieving monitor geometry, etc.
+ *//*
+ * Authors:
+ * Eduard Braun <eduard.braun2@gmx.de>
+ *
+ * Copyright 2018 Authors
+ *
+ * This file is part of Inkscape.
+ *
+ * Inkscape is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Inkscape is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Inkscape. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gdkmm/rectangle.h>
+#include <gdkmm/window.h>
+
+#if GTKMM_CHECK_VERSION(3,22,0)
+# include <gdkmm/monitor.h>
+#else
+# include <gdkmm/screen.h>
+#endif
+
+
+namespace Inkscape {
+namespace UI {
+
+/** get monitor geometry of primary monitor */
+Gdk::Rectangle get_monitor_geometry_primary() {
+ Gdk::Rectangle monitor_geometry;
+#if GTKMM_CHECK_VERSION(3,22,0)
+ auto const display = Gdk::Display::get_default();
+ auto const monitor = display->get_primary_monitor();
+
+ // Fallback to monitor number 0 if the user hasn't configured a primary monitor
+ if (!monitor) {
+ monitor = display->get_monitor(0);
+ }
+
+ monitor->get_geometry(monitor_geometry);
+#else
+ auto const default_screen = Gdk::Screen::get_default();
+ auto const monitor_number = default_screen->get_primary_monitor();
+ default_screen->get_monitor_geometry(monitor_number, monitor_geometry);
+#endif
+ return monitor_geometry;
+}
+
+/** get monitor geometry of monitor containing largest part of window */
+Gdk::Rectangle get_monitor_geometry_at_window(const Glib::RefPtr<Gdk::Window>& window) {
+ Gdk::Rectangle monitor_geometry;
+#if GTKMM_CHECK_VERSION(3,22,0)
+ auto const display = Gdk::Display::get_default();
+ auto const monitor = display->get_monitor_at_window(window);
+ monitor->get_geometry(monitor_geometry);
+#else
+ auto const default_screen = Gdk::Screen::get_default();
+ auto const monitor_number = default_screen->get_monitor_at_window(window);
+ default_screen->get_monitor_geometry(monitor_number, monitor_geometry);
+#endif
+ return monitor_geometry;
+}
+
+/** get monitor geometry of monitor at (or closest to) point on combined screen area */
+Gdk::Rectangle get_monitor_geometry_at_point(int x, int y) {
+ Gdk::Rectangle monitor_geometry;
+#if GTKMM_CHECK_VERSION(3,22,0)
+ auto const display = Gdk::Display::get_default();
+ auto const monitor = display->get_monitor_at_point(x ,y);
+ monitor->get_geometry(monitor_geometry);
+#else
+ auto const default_screen = Gdk::Screen::get_default();
+ auto const monitor_number = default_screen->get_monitor_at_point(x, y);
+ default_screen->get_monitor_geometry(monitor_number, monitor_geometry);
+#endif
+ return monitor_geometry;
+}
+
+}
+}
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace .0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim:filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99: