Fix restore window geometry

The monitor was not being correctly identified so when Gnucash was
running on the second monitor, a dialogue could be started on the first
which could be confusing. Also when a dialogue is restored a check is
made to try and make sure it fits on the monitor.
This commit is contained in:
Robert Fewell 2018-07-28 17:05:59 +01:00
parent 2c6fbfba6e
commit 0a0d4755c4

View File

@ -104,35 +104,50 @@ gnc_restore_window_size(const char *group, GtkWindow *window)
geometry = gnc_prefs_get_value (group, GNC_PREF_LAST_GEOMETRY); geometry = gnc_prefs_get_value (group, GNC_PREF_LAST_GEOMETRY);
if (g_variant_is_of_type (geometry, (const GVariantType *) "(iiii)") ) if (g_variant_is_of_type (geometry, (const GVariantType *) "(iiii)") )
{ {
gint screen_width;
gint screen_height;
#if GTK_CHECK_VERSION(3,22,0)
GdkWindow *win = gdk_screen_get_root_window (gtk_window_get_screen (window));
GdkMonitor *mon = gdk_display_get_monitor_at_window (gtk_widget_get_display (GTK_WIDGET(window)), win);
GdkRectangle monitor_size; GdkRectangle monitor_size;
gdk_monitor_get_geometry (mon, &monitor_size); #if GTK_CHECK_VERSION(3,22,0)
GdkDisplay *display = gdk_display_get_default ();
screen_width = monitor_size.width; GdkMonitor *mon;
screen_height = monitor_size.height;
#else #else
screen_width = gdk_screen_width(); //default screen GdkScreen *screen = gdk_screen_get_default ();
screen_height = gdk_screen_height(); //default screen gint mon_num;
#endif #endif
g_variant_get (geometry, "(iiii)", g_variant_get (geometry, "(iiii)",
&wpos[0], &wpos[1], &wpos[0], &wpos[1],
&wsize[0], &wsize[1]); &wsize[0], &wsize[1]);
DEBUG("geometry from preferences - wpos[0]: %d, wpos[1]: %d, wsize[0]: %d, wsize[1]: %d",
wpos[0], wpos[1], wsize[0], wsize[1]); #if GTK_CHECK_VERSION(3,22,0)
mon = gdk_display_get_monitor_at_point (display, wpos[0], wpos[1]);
gdk_monitor_get_geometry (mon, &monitor_size);
#else
mon_num = gdk_screen_get_monitor_at_point (screen, wpos[0], wpos[1]);
gdk_screen_get_monitor_geometry (screen, mon_num, &monitor_size);
#endif
DEBUG("monitor left top corner x: %d, y: %d, width: %d, height: %d",
monitor_size.x, monitor_size.y, monitor_size.width, monitor_size.height);
DEBUG("geometry from preferences - group, %s, wpos[0]: %d, wpos[1]: %d, wsize[0]: %d, wsize[1]: %d",
group, wpos[0], wpos[1], wsize[0], wsize[1]);
/* (-1, -1) means no geometry was saved (default preferences value) */ /* (-1, -1) means no geometry was saved (default preferences value) */
if ((wpos[0] != -1) && (wpos[1] != -1)) if ((wpos[0] != -1) && (wpos[1] != -1))
{ {
/* Keep the window on screen if possible */ /* Keep the window on screen if possible */
if (screen_width != 0) if (wpos[0] - monitor_size.x + wsize[0] > monitor_size.x + monitor_size.width)
wpos[0] = wpos[0] % screen_width; wpos[0] = monitor_size.x + monitor_size.width - wsize[0];
if (screen_height != 0)
wpos[1] = wpos[1] % screen_height; if (wpos[1] - monitor_size.y + wsize[1] > monitor_size.y + monitor_size.height)
wpos[1] = monitor_size.y + monitor_size.height - wsize[1];
/* make sure the cordinates have not left the monitor */
if (wpos[0] < monitor_size.x)
wpos[0] = monitor_size.x;
if (wpos[1] < monitor_size.y)
wpos[1] = monitor_size.y;
DEBUG("geometry after screen adaption - wpos[0]: %d, wpos[1]: %d, wsize[0]: %d, wsize[1]: %d", DEBUG("geometry after screen adaption - wpos[0]: %d, wpos[1]: %d, wsize[0]: %d, wsize[1]: %d",
wpos[0], wpos[1], wsize[0], wsize[1]); wpos[0], wpos[1], wsize[0], wsize[1]);
@ -141,8 +156,13 @@ gnc_restore_window_size(const char *group, GtkWindow *window)
/* Don't attempt to restore invalid sizes */ /* Don't attempt to restore invalid sizes */
if ((wsize[0] > 0) && (wsize[1] > 0)) if ((wsize[0] > 0) && (wsize[1] > 0))
{
wsize[0] = MIN(wsize[0], monitor_size.width - 10);
wsize[1] = MIN(wsize[1], monitor_size.height - 10);
gtk_window_resize(window, wsize[0], wsize[1]); gtk_window_resize(window, wsize[0], wsize[1]);
} }
}
g_variant_unref (geometry); g_variant_unref (geometry);
LEAVE(""); LEAVE("");