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/sp-namedview.cpp') 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/sp-namedview.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'src/sp-namedview.cpp') 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(); -- 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/sp-namedview.cpp') 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 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/sp-namedview.cpp') 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/sp-namedview.cpp') 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/sp-namedview.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src/sp-namedview.cpp') 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; -- 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/sp-namedview.cpp') 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