diff options
| author | Eduard Braun <eduard.braun2@gmx.de> | 2018-01-09 20:37:43 +0000 |
|---|---|---|
| committer | Eduard Braun <eduard.braun2@gmx.de> | 2018-01-09 21:32:06 +0000 |
| commit | 87661ee65e9faccb22adeca6a37de7b065e8a702 (patch) | |
| tree | 474f2e077578ae8524f1697ad37dd61c7b267863 /src/ui/monitor.cpp | |
| parent | Fix profiling build (diff) | |
| parent | Limit default window size to monitor dimensions (diff) | |
| download | inkscape-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.cpp | 107 |
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: |
