From 7939322078af85900e32b5120c1fbcaf9c73f616 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sat, 6 Jan 2018 20:36:01 +0100 Subject: Simplify code to restore new windows to previous position GTK+ / window managers handle positioning of new windows on the screen just fine, so don't do "our own thing" that is prone to errors. Notably the previous code for gtkmm >=3.22 was broken as it assumed Inkscape to be shown on the primary monitor and mixed coordinates relative to the primary display with absolute screen coordinates --- src/ui/interface.cpp | 45 ++++----------------------------------------- 1 file changed, 4 insertions(+), 41 deletions(-) (limited to 'src') diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp index 826737c2c..3671380fe 100644 --- a/src/ui/interface.cpp +++ b/src/ui/interface.cpp @@ -30,10 +30,6 @@ #include "file.h" #include -#if GTKMM_CHECK_VERSION(3,22,0) -# include -#endif - #include "inkscape.h" #include "extension/db.h" #include "extension/effect.h" @@ -165,8 +161,7 @@ sp_create_window(SPViewWidget *vw, bool editable) win->signal_focus_in_event().connect(sigc::mem_fun(*desktop_widget, &SPDesktopWidget::onFocusInEvent)); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - gint prefs_geometry = - (2==prefs->getInt("/options/savewindowgeometry/value", 0)); + gint prefs_geometry = (2==prefs->getInt("/options/savewindowgeometry/value", 0)); if (prefs_geometry) { gint pw = prefs->getInt("/desktop/geometry/width", -1); gint ph = prefs->getInt("/desktop/geometry/height", -1); @@ -175,39 +170,8 @@ sp_create_window(SPViewWidget *vw, bool editable) gint full = prefs->getBool("/desktop/geometry/fullscreen"); gint maxed = prefs->getBool("/desktop/geometry/maximized"); if (pw>0 && ph>0) { -#if GTKMM_CHECK_VERSION(3,22,0) - auto const display = Gdk::Display::get_default(); - auto const monitor = display->get_primary_monitor(); - - // A Gdk::Rectangle in "application pixel" units - Gdk::Rectangle screen_geometry; - monitor->get_geometry(screen_geometry); - auto const screen_width = screen_geometry.get_width(); - auto const screen_height = screen_geometry.get_height(); -#else - auto const screen_width = gdk_screen_width(); - auto const screen_height = gdk_screen_height(); -#endif - gint w = MIN(screen_width, pw); - gint h = MIN(screen_height, ph); - gint x = MIN(screen_width - MIN_ONSCREEN_DISTANCE, px); - gint y = MIN(screen_height - MIN_ONSCREEN_DISTANCE, py); - if (w>0 && h>0) { - x = MIN(screen_width - w, x); - y = MIN(screen_height - h, y); - desktop->setWindowSize(w, h); - } - - // Only restore xy for the first window so subsequent windows don't overlap exactly - // with first. (Maybe rule should be only restore xy if it's different from xy of - // other desktops?) - - // Empirically it seems that active_desktop==this desktop only the first time a - // desktop is created. - SPDesktop *active_desktop = SP_ACTIVE_DESKTOP; - if (active_desktop == desktop || active_desktop==NULL) { - desktop->setWindowPosition(Geom::Point(x, y)); - } + desktop->setWindowSize(pw, ph); + desktop->setWindowPosition(Geom::Point(px, py)); } if (maxed) { win->maximize(); @@ -216,8 +180,7 @@ sp_create_window(SPViewWidget *vw, bool editable) win->fullscreen(); } } - - } + } if ( completeDropTargets == 0 || completeDropTargetsCount == 0 ) { -- cgit v1.2.3 From c448e88e60ed70526cae42f22277701efbfd6ac2 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sat, 6 Jan 2018 22:54:56 +0100 Subject: Namedview: Use proper monitor to derive monitor_geometry Inkscape does not necessarily start on the primary monitor. GTK+ did not reveal it's secrets (i.e. it seems undocumented) but empirically the monitor having the cursor is the monitor the initial window will be placed on. --- src/sp-namedview.cpp | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index 99cc6fbfc..4e5da13c3 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -785,33 +785,24 @@ void sp_namedview_window_from_document(SPDesktop *desktop) bool show_dialogs = true; // restore window size and position stored with the document + Gtk::Window *win = desktop->getToplevel(); + g_assert(win); if (geometry_from_last) { // do nothing, as we already have code for that in interface.cpp // TODO: Probably should not do similar things in two places } else if ((geometry_from_file && nv->window_maximized) || (new_document && (default_geometry == 2))) { - Gtk::Window *win = desktop->getToplevel(); - if (win) { - win->maximize(); - } + win->maximize(); } else { - - // TODO: account for multi-monitor setups (i.e. on which monitor do we want to display Inkscape?) 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(); - - // If user hasn't configured a primary monitor, nullptr is returned. - if (monitor) { - monitor->get_geometry(monitor_geometry); - } + auto const monitor = display->get_monitor_at_window(win->get_window()); + monitor->get_geometry(monitor_geometry); #else auto const default_screen = Gdk::Screen::get_default(); - auto const monitor_number = default_screen->get_primary_monitor(); + auto const monitor_number = default_screen->get_monitor_at_window(win->get_window()); default_screen->get_monitor_geometry(monitor_number, monitor_geometry); #endif - int w = monitor_geometry.get_width(); int h = monitor_geometry.get_height(); -- cgit v1.2.3 From df4cb22cc7e5935293af6bb17e1c26959dc300ba Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 7 Jan 2018 04:35:34 +0100 Subject: Make stored geometry and default window size enums --- src/enums.h | 16 ++++++++++++++++ src/sp-namedview.cpp | 22 ++++++++++++---------- src/ui/dialog/inkscape-preferences.cpp | 10 +++++----- src/ui/interface.cpp | 5 +++-- 4 files changed, 36 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/enums.h b/src/enums.h index 2a30fc4a8..99bb5648c 100644 --- a/src/enums.h +++ b/src/enums.h @@ -111,5 +111,21 @@ enum PrefsMaskobjectGrouping { PREFS_MASKOBJECT_GROUPING_ALL = 2, }; +/* save window geometry preference values (/options/savewindowgeometry/value) */ + +enum PrefsSaveWindowGeometry { + PREFS_WINDOW_GEOMETRY_NONE = 0, + PREFS_WINDOW_GEOMETRY_FILE = 1, + PREFS_WINDOW_GEOMETRY_LAST = 2, +}; + +/* default window size preference values (/options/defaultwindowsize/value) */ + +enum PrefsDefaultWindowSize { + PREFS_WINDOW_SIZE_SMALL = 0, + PREFS_WINDOW_SIZE_LARGE = 1, + PREFS_WINDOW_SIZE_MAXIMIZED = 2, +}; + #endif diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index 4e5da13c3..8fdb34af0 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -27,6 +27,7 @@ #include "document.h" #include "document-undo.h" #include "desktop-events.h" +#include "enums.h" #include "sp-guide.h" #include "sp-item-group.h" @@ -778,19 +779,19 @@ void sp_namedview_window_from_document(SPDesktop *desktop) { SPNamedView *nv = desktop->namedview; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - bool geometry_from_file = (1 == prefs->getInt("/options/savewindowgeometry/value", 0)); - bool geometry_from_last = (2 == prefs->getInt("/options/savewindowgeometry/value", 0)); - gint default_geometry = prefs->getInt("/options/defaultwindowsize/value", 1); + int window_geometry = prefs->getInt("/options/savewindowgeometry/value", PREFS_WINDOW_GEOMETRY_NONE); + int default_size = prefs->getInt("/options/defaultwindowsize/value", PREFS_WINDOW_SIZE_LARGE); bool new_document = (nv->window_width <= 0) || (nv->window_height <= 0); bool show_dialogs = true; // restore window size and position stored with the document Gtk::Window *win = desktop->getToplevel(); g_assert(win); - if (geometry_from_last) { + if (window_geometry == PREFS_WINDOW_GEOMETRY_LAST) { // do nothing, as we already have code for that in interface.cpp // TODO: Probably should not do similar things in two places - } else if ((geometry_from_file && nv->window_maximized) || (new_document && (default_geometry == 2))) { + } else if ((window_geometry == PREFS_WINDOW_GEOMETRY_FILE && nv->window_maximized) || + (new_document && (default_size == PREFS_WINDOW_SIZE_MAXIMIZED))) { win->maximize(); } else { Gdk::Rectangle monitor_geometry; @@ -807,14 +808,14 @@ void sp_namedview_window_from_document(SPDesktop *desktop) int h = monitor_geometry.get_height(); bool move_to_screen = false; - if (geometry_from_file and !new_document) { + if (window_geometry == PREFS_WINDOW_GEOMETRY_FILE && !new_document) { w = MIN(w, nv->window_width); - h = MIN(h, nv->window_height); + h = MIN(h, nv->window_height); move_to_screen = true; - } else if (default_geometry == 1) { + } else if (default_size == PREFS_WINDOW_SIZE_LARGE) { w *= NEWDOC_X_SCALE; h *= NEWDOC_Y_SCALE; - } else if (default_geometry == 0) { + } else if (default_size == PREFS_WINDOW_SIZE_SMALL) { w = h = 0; // use the smallest possible window size; could be a factor like NEWDOC_X_SCALE in future } if ((w > 0) && (h > 0)) { @@ -903,7 +904,8 @@ void sp_namedview_update_layers_from_document (SPDesktop *desktop) void sp_namedview_document_from_window(SPDesktop *desktop) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - bool save_geometry_in_file = (1 == prefs->getInt("/options/savewindowgeometry/value", 0)); + int window_geometry = prefs->getInt("/options/savewindowgeometry/value", PREFS_WINDOW_GEOMETRY_NONE); + bool save_geometry_in_file = window_geometry == PREFS_WINDOW_GEOMETRY_FILE; bool save_viewport_in_file = prefs->getBool("/options/savedocviewport/value", true); Inkscape::XML::Node *view = desktop->namedview->getRepr(); Geom::Rect const r = desktop->get_display_area(); diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index 0ac12d15c..ba0758d3c 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -684,9 +684,9 @@ void InkscapePreferences::initPageUI() } // Windows - _win_save_geom.init ( _("Save and restore window geometry for each document"), "/options/savewindowgeometry/value", 1, true, 0); - _win_save_geom_prefs.init ( _("Remember and use last window's geometry"), "/options/savewindowgeometry/value", 2, false, &_win_save_geom); - _win_save_geom_off.init ( _("Don't save window geometry"), "/options/savewindowgeometry/value", 0, false, &_win_save_geom); + _win_save_geom.init ( _("Save and restore window geometry for each document"), "/options/savewindowgeometry/value", PREFS_WINDOW_GEOMETRY_FILE, true, 0); + _win_save_geom_prefs.init ( _("Remember and use last window's geometry"), "/options/savewindowgeometry/value", PREFS_WINDOW_GEOMETRY_LAST, false, &_win_save_geom); + _win_save_geom_off.init ( _("Don't save window geometry"), "/options/savewindowgeometry/value", PREFS_WINDOW_GEOMETRY_NONE, false, &_win_save_geom); _win_save_dialog_pos_on.init ( _("Save and restore dialogs status"), "/options/savedialogposition/value", 1, true, 0); _win_save_dialog_pos_off.init ( _("Don't save dialogs status"), "/options/savedialogposition/value", 0, false, &_win_save_dialog_pos_on); @@ -708,9 +708,9 @@ void InkscapePreferences::initPageUI() { Glib::ustring defaultSizeLabels[] = {C_("Window size", "Small"), C_("Window size", "Large"), C_("Window size", "Maximized")}; - int defaultSizeValues[] = {0, 1, 2}; + int defaultSizeValues[] = {PREFS_WINDOW_SIZE_SMALL, PREFS_WINDOW_SIZE_LARGE, PREFS_WINDOW_SIZE_MAXIMIZED}; - _win_default_size.init( "/options/defaultwindowsize/value", defaultSizeLabels, defaultSizeValues, G_N_ELEMENTS(defaultSizeLabels), 1 ); + _win_default_size.init( "/options/defaultwindowsize/value", defaultSizeLabels, defaultSizeValues, G_N_ELEMENTS(defaultSizeLabels), PREFS_WINDOW_SIZE_LARGE); _page_windows.add_line( false, _("Default window size:"), _win_default_size, "", _("Set the default window size"), false); } diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp index 3671380fe..816f4e337 100644 --- a/src/ui/interface.cpp +++ b/src/ui/interface.cpp @@ -30,6 +30,7 @@ #include "file.h" #include +#include "enums.h" #include "inkscape.h" #include "extension/db.h" #include "extension/effect.h" @@ -161,8 +162,8 @@ sp_create_window(SPViewWidget *vw, bool editable) win->signal_focus_in_event().connect(sigc::mem_fun(*desktop_widget, &SPDesktopWidget::onFocusInEvent)); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - gint prefs_geometry = (2==prefs->getInt("/options/savewindowgeometry/value", 0)); - if (prefs_geometry) { + int window_geometry = prefs->getInt("/options/savewindowgeometry/value", PREFS_WINDOW_GEOMETRY_NONE); + if (window_geometry == PREFS_WINDOW_GEOMETRY_LAST) { gint pw = prefs->getInt("/desktop/geometry/width", -1); gint ph = prefs->getInt("/desktop/geometry/height", -1); gint px = prefs->getInt("/desktop/geometry/x", -1); -- cgit v1.2.3 From c946cb832fc4206a0ec8a21a0d343d55e88cb4ba Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 7 Jan 2018 14:40:03 +0100 Subject: Let GTK+ / window managers handle window position sanitizing Exploit that an unmapped window's size/position is automatically adjusted when it is first mapped which can be emulated by moving the window while it is hidden. --- src/sp-namedview.cpp | 44 +++++--------------------------------------- 1 file changed, 5 insertions(+), 39 deletions(-) (limited to 'src') diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index 8fdb34af0..a61cf22e1 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -737,41 +737,6 @@ void SPNamedView::show(SPDesktop *desktop) desktop->showGrids(grids_visible, false); } -namespace { - -gint const MIN_ONSCREEN_DISTANCE = 100; -gdouble const NEWDOC_X_SCALE = 0.75; -gdouble const NEWDOC_Y_SCALE = NEWDOC_X_SCALE; - -Geom::Point calcAnchorPoint(gint const x, gint const y, - gint const w, gint const h, gint const minOnscreen) -{ -#if GTKMM_CHECK_VERSION(3,22,0) - Gdk::Rectangle screen_geometry; - - auto const display = Gdk::Display::get_default(); - auto const monitor = display->get_primary_monitor(); - monitor->get_geometry(screen_geometry); - int screen_width = screen_geometry.get_width(); - int screen_height = screen_geometry.get_height(); -#else - int screen_width = gdk_screen_width(); - int screen_height = gdk_screen_height(); -#endif - - // prevent the window from moving off the screen to the right or to the bottom - gint ax = MIN(screen_width - minOnscreen, x); - gint ay = MIN(screen_height - minOnscreen, y); - - // prevent the window from moving off the screen to the left or to the top - ax = MAX(minOnscreen - w, ax); - ay = MAX(minOnscreen - h, ay); - - return Geom::Point(ax, ay); -} - -} // namespace - /* * Restores window geometry from the document settings or defaults in prefs */ @@ -813,8 +778,8 @@ void sp_namedview_window_from_document(SPDesktop *desktop) h = MIN(h, nv->window_height); move_to_screen = true; } else if (default_size == PREFS_WINDOW_SIZE_LARGE) { - w *= NEWDOC_X_SCALE; - h *= NEWDOC_Y_SCALE; + w *= 0.75; + h *= 0.75; } else if (default_size == PREFS_WINDOW_SIZE_SMALL) { w = h = 0; // use the smallest possible window size; could be a factor like NEWDOC_X_SCALE in future } @@ -833,8 +798,9 @@ void sp_namedview_window_from_document(SPDesktop *desktop) #endif desktop->setWindowSize(w, h); if (move_to_screen) { - Geom::Point origin = calcAnchorPoint(nv->window_x, nv->window_y, w, h, MIN_ONSCREEN_DISTANCE); - desktop->setWindowPosition(origin); + win->hide(); + desktop->setWindowPosition(Geom::Point(nv->window_x, nv->window_y)); + win->show(); } } } -- cgit v1.2.3 From b706e529a4c10be331a1ca5d0d004cf24e8e5e9a Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 7 Jan 2018 16:30:32 +0100 Subject: Add convenience functions to obtain monitor geometry --- src/ui/CMakeLists.txt | 2 + src/ui/monitor.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/ui/monitor.h | 51 ++++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 src/ui/monitor.cpp create mode 100644 src/ui/monitor.h (limited to 'src') diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index fecb14a91..b9933bba6 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -5,6 +5,7 @@ set(ui_SRC dialog-events.cpp draw-anchor.cpp interface.cpp + monitor.cpp previewholder.cpp selected-color.cpp shape-editor.cpp @@ -186,6 +187,7 @@ set(ui_SRC event-debug.h icon-names.h interface.h + monitor.h previewable.h previewfillable.h previewholder.h 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 + * + * 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 . + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#if GTKMM_CHECK_VERSION(3,22,0) +# include +#else +# include +#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& 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: diff --git a/src/ui/monitor.h b/src/ui/monitor.h new file mode 100644 index 000000000..696a8ed73 --- /dev/null +++ b/src/ui/monitor.h @@ -0,0 +1,51 @@ +/** + * \file + * \brief helper functions for retrieving monitor geometry, etc. + *//* + * Authors: + * Eduard Braun + * + * 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 . + */ + +#ifndef SEEN_MONITOR_H +#define SEEN_MONITOR_H + +#include +#include + +namespace Inkscape { +namespace UI { + Gdk::Rectangle get_monitor_geometry_primary(); + Gdk::Rectangle get_monitor_geometry_at_window(const Glib::RefPtr& window); + Gdk::Rectangle get_monitor_geometry_at_point(int x, int y); +} +} + +#endif // SEEN_MONITOR_H + +/* + 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: -- cgit v1.2.3 From 7730fad0990fea927c0017bca6855de45bdd4915 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 7 Jan 2018 16:30:38 +0100 Subject: Switch sp-namedview.cpp to use the convenience function --- src/sp-namedview.cpp | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index a61cf22e1..6fb6e4bfc 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -28,6 +28,7 @@ #include "document-undo.h" #include "desktop-events.h" #include "enums.h" +#include "ui/monitor.h" #include "sp-guide.h" #include "sp-item-group.h" @@ -38,12 +39,6 @@ #include "sp-root.h" #include -#if GTKMM_CHECK_VERSION(3,22,0) -# include -#else -# include -#endif - using Inkscape::DocumentUndo; using Inkscape::Util::unit_table; @@ -759,16 +754,7 @@ void sp_namedview_window_from_document(SPDesktop *desktop) (new_document && (default_size == PREFS_WINDOW_SIZE_MAXIMIZED))) { win->maximize(); } else { - 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(win->get_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(win->get_window()); - default_screen->get_monitor_geometry(monitor_number, monitor_geometry); -#endif + Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_at_window(win->get_window()); int w = monitor_geometry.get_width(); int h = monitor_geometry.get_height(); -- cgit v1.2.3 From 9082a13eda5ff7c4f596241ff538e0f8a267cb5c Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 7 Jan 2018 16:36:54 +0100 Subject: Use proper monitor for deriving geometry - when restoring from document: use monitor closest to stored document location on screen - when using default size: use monitor Inkscape is launched on (we always used this before) --- src/sp-namedview.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index 6fb6e4bfc..84aacfb60 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -754,18 +754,18 @@ void sp_namedview_window_from_document(SPDesktop *desktop) (new_document && (default_size == PREFS_WINDOW_SIZE_MAXIMIZED))) { win->maximize(); } else { - Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_at_window(win->get_window()); - int w = monitor_geometry.get_width(); - int h = monitor_geometry.get_height(); - + int w = 0; + int h = 0; bool move_to_screen = false; - if (window_geometry == PREFS_WINDOW_GEOMETRY_FILE && !new_document) { - w = MIN(w, nv->window_width); - h = MIN(h, nv->window_height); + if (window_geometry == PREFS_WINDOW_GEOMETRY_FILE && !new_document) { + Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_at_point(nv->window_x, nv->window_y); + w = MIN(monitor_geometry.get_width(), nv->window_width); + h = MIN(monitor_geometry.get_height(), nv->window_height); move_to_screen = true; } else if (default_size == PREFS_WINDOW_SIZE_LARGE) { - w *= 0.75; - h *= 0.75; + Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_at_window(win->get_window()); + w = 0.75 * monitor_geometry.get_width(); + h = 0.75 * monitor_geometry.get_height(); } else if (default_size == PREFS_WINDOW_SIZE_SMALL) { w = h = 0; // use the smallest possible window size; could be a factor like NEWDOC_X_SCALE in future } -- cgit v1.2.3 From dd958b6024fb9f68500eb583f4c3d981ed27e08c Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 7 Jan 2018 17:36:45 +0100 Subject: Make natural window size default and fix small window size - Clamp "Small" window size to 600x600 Everything smaller seems pretty unusable but can be discussed. This fixes bug #1659256. - Make sure "Large" window size is at least as large as "Small" to avoid embarassing user reports. - add "Default" as new window size and (surprise) make it the default This will not influence the initial size request at all and should result in the natural window size (unless overriden by the window manager) and should be a suitable default for all cases. Fixed bug: - https://bugs.launchpad.net/inkscape/+bug/1659256 --- src/enums.h | 1 + src/sp-namedview.cpp | 13 ++++++++----- src/ui/dialog/inkscape-preferences.cpp | 14 ++++++++++---- 3 files changed, 19 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/enums.h b/src/enums.h index 99bb5648c..592cb81e9 100644 --- a/src/enums.h +++ b/src/enums.h @@ -122,6 +122,7 @@ enum PrefsSaveWindowGeometry { /* default window size preference values (/options/defaultwindowsize/value) */ enum PrefsDefaultWindowSize { + PREFS_WINDOW_SIZE_NATURAL = -1, PREFS_WINDOW_SIZE_SMALL = 0, PREFS_WINDOW_SIZE_LARGE = 1, PREFS_WINDOW_SIZE_MAXIMIZED = 2, diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index 84aacfb60..e47587734 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -740,7 +740,7 @@ void sp_namedview_window_from_document(SPDesktop *desktop) SPNamedView *nv = desktop->namedview; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); int window_geometry = prefs->getInt("/options/savewindowgeometry/value", PREFS_WINDOW_GEOMETRY_NONE); - int default_size = prefs->getInt("/options/defaultwindowsize/value", PREFS_WINDOW_SIZE_LARGE); + int default_size = prefs->getInt("/options/defaultwindowsize/value", PREFS_WINDOW_SIZE_NATURAL); bool new_document = (nv->window_width <= 0) || (nv->window_height <= 0); bool show_dialogs = true; @@ -754,6 +754,7 @@ void sp_namedview_window_from_document(SPDesktop *desktop) (new_document && (default_size == PREFS_WINDOW_SIZE_MAXIMIZED))) { win->maximize(); } else { + const int MIN_WINDOW_SIZE = 600; int w = 0; int h = 0; bool move_to_screen = false; @@ -764,11 +765,13 @@ void sp_namedview_window_from_document(SPDesktop *desktop) move_to_screen = true; } else if (default_size == PREFS_WINDOW_SIZE_LARGE) { Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_at_window(win->get_window()); - w = 0.75 * monitor_geometry.get_width(); - h = 0.75 * monitor_geometry.get_height(); + w = MAX(0.75 * monitor_geometry.get_width(), MIN_WINDOW_SIZE); + h = MAX(0.75 * monitor_geometry.get_height(), MIN_WINDOW_SIZE); } else if (default_size == PREFS_WINDOW_SIZE_SMALL) { - w = h = 0; // use the smallest possible window size; could be a factor like NEWDOC_X_SCALE in future - } + w = h = MIN_WINDOW_SIZE; + } else if (default_size == PREFS_WINDOW_SIZE_NATURAL) { + // don't set size (i.e. keep the gtk+ default, which will be the natural size) + } if ((w > 0) && (h > 0)) { #ifndef WIN32 gint dx= 0; diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index ba0758d3c..7b7bd6548 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -707,10 +707,16 @@ void InkscapePreferences::initPageUI() _win_ontop_agressive.init ( _("Aggressive"), "/options/transientpolicy/value", 2, false, &_win_ontop_none); { - Glib::ustring defaultSizeLabels[] = {C_("Window size", "Small"), C_("Window size", "Large"), C_("Window size", "Maximized")}; - int defaultSizeValues[] = {PREFS_WINDOW_SIZE_SMALL, PREFS_WINDOW_SIZE_LARGE, PREFS_WINDOW_SIZE_MAXIMIZED}; - - _win_default_size.init( "/options/defaultwindowsize/value", defaultSizeLabels, defaultSizeValues, G_N_ELEMENTS(defaultSizeLabels), PREFS_WINDOW_SIZE_LARGE); + Glib::ustring defaultSizeLabels[] = {C_("Window size", "Default"), + C_("Window size", "Small"), + C_("Window size", "Large"), + C_("Window size", "Maximized")}; + int defaultSizeValues[] = {PREFS_WINDOW_SIZE_NATURAL, + PREFS_WINDOW_SIZE_SMALL, + PREFS_WINDOW_SIZE_LARGE, + PREFS_WINDOW_SIZE_MAXIMIZED}; + + _win_default_size.init( "/options/defaultwindowsize/value", defaultSizeLabels, defaultSizeValues, G_N_ELEMENTS(defaultSizeLabels), PREFS_WINDOW_SIZE_NATURAL); _page_windows.add_line( false, _("Default window size:"), _win_default_size, "", _("Set the default window size"), false); } -- cgit v1.2.3 From 0ab95408b8cd74e560ec30535f6cc4dc9dff3881 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 7 Jan 2018 17:53:16 +0100 Subject: Limit geometry from file to width/height of monitor --- src/ui/interface.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp index 816f4e337..7df3502f7 100644 --- a/src/ui/interface.cpp +++ b/src/ui/interface.cpp @@ -40,6 +40,7 @@ #include "document.h" #include "ui/interface.h" +#include "ui/monitor.h" #include "desktop.h" #include "selection-chemistry.h" #include "svg-view-widget.h" @@ -133,8 +134,6 @@ static void sp_ui_menu_item_set_name(GtkWidget *data, Glib::ustring const &name); static void sp_recent_open(GtkRecentChooser *, gpointer); -static const int MIN_ONSCREEN_DISTANCE = 50; - void sp_create_window(SPViewWidget *vw, bool editable) { @@ -171,6 +170,9 @@ sp_create_window(SPViewWidget *vw, bool editable) gint full = prefs->getBool("/desktop/geometry/fullscreen"); gint maxed = prefs->getBool("/desktop/geometry/maximized"); if (pw>0 && ph>0) { + Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_at_point(px, py); + pw = std::min(pw, monitor_geometry.get_width()); + ph = std::min(ph, monitor_geometry.get_height()); desktop->setWindowSize(pw, ph); desktop->setWindowPosition(Geom::Point(px, py)); } -- cgit v1.2.3 From b35da777e89166e572344dce1247efccbb53fcf4 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 7 Jan 2018 19:13:08 +0100 Subject: Use convenience functions to obtain monitor geometry --- src/svg-view-slideshow.cpp | 41 ++++------------------------------------- src/ui/dialog/dialog.cpp | 28 ++++------------------------ src/ui/uxmanager.cpp | 28 +++++----------------------- 3 files changed, 13 insertions(+), 84 deletions(-) (limited to 'src') diff --git a/src/svg-view-slideshow.cpp b/src/svg-view-slideshow.cpp index 0e50d582b..430fd9ce5 100644 --- a/src/svg-view-slideshow.cpp +++ b/src/svg-view-slideshow.cpp @@ -30,11 +30,6 @@ #endif #include - -#if GTKMM_CHECK_VERSION(3,22,0) -# include -#endif - #include #include #include @@ -42,16 +37,13 @@ #include "document.h" #include "ui/icon-names.h" +#include "ui/monitor.h" #include "util/units.h" #include "svg-view.h" #include "svg-view-slideshow.h" #include "svg-view-widget.h" -#if GTKMM_CHECK_VERSION(3,22,0) -# include -#endif - SPSlideShow::SPSlideShow(std::vector const &slides, bool full_screen, int timer, double scale) : _slides(slides) @@ -64,34 +56,9 @@ SPSlideShow::SPSlideShow(std::vector const &slides, bool full_scr , _ctrlwin(NULL) { // setup initial document -#if GTKMM_CHECK_VERSION(3,22,0) - auto display = Gdk::Display::get_default(); - auto 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); - } - - if (monitor) { - Gdk::Rectangle monitor_geometry; - monitor->get_geometry(monitor_geometry); - - auto const monitor_width = monitor_geometry.get_width(); - auto const monitor_height = monitor_geometry.get_height(); - -#else - auto default_screen = Gdk::Screen::get_default(); - - if (default_screen) { - auto const monitor_width = default_screen->get_width(); - auto const monitor_height = default_screen->get_height(); -#endif - - set_default_size(MIN ((int)_doc->getWidth().value("px")*_scale, monitor_width - 64), - MIN ((int)_doc->getHeight().value("px")*_scale, monitor_height - 64)); - - } + Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_primary(); // TODO: is inkview always launched on primary monitor? + set_default_size(MIN ((int)_doc->getWidth().value("px")*_scale, monitor_geometry.get_width() - 64), + MIN ((int)_doc->getHeight().value("px")*_scale, monitor_geometry.get_height() - 64)); _view = sp_svg_view_widget_new(_doc); SP_SVG_VIEW_WIDGET(_view)->setResize( false, _doc->getWidth().value("px"), _doc->getHeight().value("px") ); diff --git a/src/ui/dialog/dialog.cpp b/src/ui/dialog/dialog.cpp index 3d949a8c9..f7e9a1bed 100644 --- a/src/ui/dialog/dialog.cpp +++ b/src/ui/dialog/dialog.cpp @@ -20,13 +20,10 @@ #include "dialog-manager.h" #include -#if GTKMM_CHECK_VERSION(3,22,0) -# include -#endif - #include #include "inkscape.h" +#include "ui/monitor.h" #include "ui/tools/tool-base.h" #include "desktop.h" @@ -166,26 +163,9 @@ void Dialog::read_geometry() resize(w, h); } -#if GTKMM_CHECK_VERSION(3,22,0) - auto const display = Gdk::Display::get_default(); - auto monitor = display->get_primary_monitor(); - - // If user hasn't configured a primary monitor, nullptr is returned so try first monitor. - if (!monitor) { - std::cerr << "Dialog::read_geometry: no primary monitor configured!" << std::endl; - monitor = display->get_monitor(0); - } - - Gdk::Rectangle screen_geometry; - if (monitor) { - monitor->get_geometry(screen_geometry); - } - auto const screen_width = screen_geometry.get_width(); - auto const screen_height = screen_geometry.get_height(); -#else - auto const screen_width = gdk_screen_width(); - auto const screen_height = gdk_screen_height(); -#endif + Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_primary(); + auto const screen_width = monitor_geometry.get_width(); + auto const screen_height = monitor_geometry.get_height(); // If there are stored values for where the dialog should be // located, then restore the dialog to that position. diff --git a/src/ui/uxmanager.cpp b/src/ui/uxmanager.cpp index f48f40879..3ec38edf9 100644 --- a/src/ui/uxmanager.cpp +++ b/src/ui/uxmanager.cpp @@ -17,12 +17,10 @@ #include "uxmanager.h" #include "desktop.h" +#include "ui/monitor.h" #include "util/ege-tags.h" #include "widgets/toolbox.h" -#if GTKMM_CHECK_VERSION(3,22,0) -# include -#endif using std::vector; @@ -125,27 +123,11 @@ UXManagerImpl::UXManagerImpl() : tags.addTag(ege::Tag("Icons")); // Figure out if we're on a widescreen display -#if GTKMM_CHECK_VERSION(3,22,0) - auto display = Gdk::Display::get_default(); - auto 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); - } + Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_primary(); + int const width = monitor_geometry.get_width(); + int const height = monitor_geometry.get_height(); - if(monitor) { - Gdk::Rectangle monitor_geometry; - monitor->get_geometry(monitor_geometry); - - int const width = monitor_geometry.get_width(); - int const height = monitor_geometry.get_height(); -#else - Glib::RefPtr defaultScreen = Gdk::Screen::get_default(); - if (defaultScreen) { - int width = defaultScreen->get_width(); - int height = defaultScreen->get_height(); -#endif + if (width && height) { gdouble aspect = static_cast(width) / static_cast(height); if (aspect > 1.65) { _widescreen = true; -- cgit v1.2.3 From 0d1885407b9d1dfcf3ddd5c16aeb23bf4f34df3a Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 7 Jan 2018 19:34:57 +0100 Subject: Limit default window size to monitor dimensions --- src/sp-namedview.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src') diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index e47587734..59c7129f6 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -771,6 +771,16 @@ void sp_namedview_window_from_document(SPDesktop *desktop) w = h = MIN_WINDOW_SIZE; } else if (default_size == PREFS_WINDOW_SIZE_NATURAL) { // don't set size (i.e. keep the gtk+ default, which will be the natural size) + // unless gtk+ decided it would be a good idea to show a window that is larger than the screen + Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_at_window(win->get_window()); + int monitor_width = monitor_geometry.get_width(); + int monitor_height = monitor_geometry.get_height(); + int window_width, window_height; + win->get_size(window_width, window_height); + if (window_width > monitor_width || window_height > monitor_height) { + w = std::min(monitor_width, window_width); + h = std::min(monitor_height, window_height); + } } if ((w > 0) && (h > 0)) { #ifndef WIN32 -- cgit v1.2.3