From 1fe61efafc92a23b75c62dc0ec62e0e5d3c8cd4a Mon Sep 17 00:00:00 2001 From: Jonas Zetterberg Date: Sat, 1 Dec 2018 12:53:46 +0100 Subject: [PATCH] tabwin: Place tabwin in center when display is scaled Bug: 14931 On scaled display the tabwin is using unscaled window coordinates to calculate its position. Let the callert choose scaled or unscaled display size and use scaled in tabwin. fixes: 9d5ac6a4 Introduce xfwm-common static library Signed-off-by: Jonas Zetterberg --- common/xfwm-common.c | 16 +++++++++------- common/xfwm-common.h | 3 ++- src/screen.c | 8 ++++---- src/tabwin.c | 8 ++++---- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/common/xfwm-common.c b/common/xfwm-common.c index a991b355..04fe6a96 100644 --- a/common/xfwm-common.c +++ b/common/xfwm-common.c @@ -78,23 +78,25 @@ xfwm_get_screen_dimensions (gint *width, gint *height) void xfwm_get_monitor_geometry (GdkScreen *screen, gint monitor_num, - GdkRectangle *geometry) + GdkRectangle *geometry, + gboolean scaled) { #if GTK_CHECK_VERSION(3, 22, 0) GdkDisplay *display; GdkMonitor *monitor; - int scale; display = gdk_screen_get_display (screen); monitor = gdk_display_get_monitor (display, monitor_num); gdk_monitor_get_geometry (monitor, geometry); /* Convert to device pixels */ - scale = gdk_monitor_get_scale_factor (monitor); - geometry->x *= scale; - geometry->y *= scale; - geometry->width *= scale; - geometry->height *= scale; + if (scaled) { + int scale = gdk_monitor_get_scale_factor (monitor); + geometry->x *= scale; + geometry->y *= scale; + geometry->width *= scale; + geometry->height *= scale; + } #else gdk_screen_get_monitor_geometry (screen, monitor_num, geometry); #endif diff --git a/common/xfwm-common.h b/common/xfwm-common.h index e2e8c97b..3cd2b627 100644 --- a/common/xfwm-common.h +++ b/common/xfwm-common.h @@ -31,7 +31,8 @@ void xfwm_get_screen_dimensions (gint *width, void xfwm_get_monitor_geometry (GdkScreen *screen, gint monitor_num, - GdkRectangle *geometry); + GdkRectangle *geometry, + gboolean scaled); void xfwm_get_primary_monitor_geometry (GdkScreen *screen, GdkRectangle *geometry); diff --git a/src/screen.c b/src/screen.c index a40e3db6..f112432c 100644 --- a/src/screen.c +++ b/src/screen.c @@ -642,7 +642,7 @@ myScreenComputeSize (ScreenInfo *screen_info) for (i = 0; i < num_monitors; i++) { - xfwm_get_monitor_geometry (screen_info->gscr, i, &monitor); + xfwm_get_monitor_geometry (screen_info->gscr, i, &monitor, TRUE); width = MAX (monitor.x + monitor.width, width); height = MAX (monitor.y + monitor.height, height); } @@ -717,11 +717,11 @@ myScreenRebuildMonitorIndex (ScreenInfo *screen_info) num_monitors = xfwm_get_n_monitors (screen_info->gscr); for (i = 0; i < num_monitors; i++) { - xfwm_get_monitor_geometry (screen_info->gscr, i, &monitor); + xfwm_get_monitor_geometry (screen_info->gscr, i, &monitor, TRUE); cloned = FALSE; for (j = 0; j < (gint) screen_info->monitors_index->len; j++) { - xfwm_get_monitor_geometry (screen_info->gscr, j, &previous); + xfwm_get_monitor_geometry (screen_info->gscr, j, &previous, TRUE); if ((previous.x == monitor.x) && (previous.y == monitor.y)) { cloned = TRUE; @@ -784,7 +784,7 @@ myScreenFindMonitorAtPoint (ScreenInfo *screen_info, gint x, gint y, GdkRectangl gint monitor_index; monitor_index = myScreenGetMonitorIndex (screen_info, i); - xfwm_get_monitor_geometry (screen_info->gscr, monitor_index, &monitor); + xfwm_get_monitor_geometry (screen_info->gscr, monitor_index, &monitor, TRUE); if ((x >= monitor.x) && (x < (monitor.x + monitor.width)) && (y >= monitor.y) && (y < (monitor.y + monitor.height))) diff --git a/src/tabwin.c b/src/tabwin.c index 4be61fbc..fe875de5 100644 --- a/src/tabwin.c +++ b/src/tabwin.c @@ -329,7 +329,7 @@ getMinMonitorWidth (ScreenInfo *screen_info) for (min_width = i = 0; i < num_monitors; i++) { GdkRectangle monitor; - xfwm_get_monitor_geometry (screen_info->gscr, i, &monitor); + xfwm_get_monitor_geometry (screen_info->gscr, i, &monitor, FALSE); if (min_width == 0 || monitor.width < min_width) min_width = monitor.width; } @@ -343,7 +343,7 @@ getMinMonitorHeight (ScreenInfo *screen_info) for (min_height = i = 0; i < num_monitors; i++) { GdkRectangle monitor; - xfwm_get_monitor_geometry (screen_info->gscr, i, &monitor); + xfwm_get_monitor_geometry (screen_info->gscr, i, &monitor, FALSE); if (min_height == 0 || monitor.height < min_height) { min_height = monitor.height; @@ -573,7 +573,7 @@ tabwinConfigure (TabwinWidget *tabwin_widget, GdkEventConfigure *event) } xfwm_get_monitor_geometry (gtk_widget_get_screen (GTK_WIDGET (tabwin_widget)), - tabwin_widget->monitor_num, &monitor); + tabwin_widget->monitor_num, &monitor, FALSE); x = monitor.x + (monitor.width - event->width) / 2; y = monitor.y + (monitor.height - event->height) / 2; gtk_window_move (GTK_WINDOW (tabwin_widget), x, y); @@ -784,7 +784,7 @@ tabwinCreateWidget (Tabwin *tabwin, ScreenInfo *screen_info, gint monitor_num) MAX (border.left, MAX (border.top, (MAX (border.right, border.bottom)))) + MAX (padding.left, MAX (padding.top, (MAX (padding.right, padding.bottom))))); gtk_window_set_position (GTK_WINDOW (tabwin_widget), GTK_WIN_POS_NONE); - xfwm_get_monitor_geometry (screen_info->gscr, tabwin_widget->monitor_num, &monitor); + xfwm_get_monitor_geometry (screen_info->gscr, tabwin_widget->monitor_num, &monitor, FALSE); gtk_window_move (GTK_WINDOW (tabwin_widget), monitor.x + monitor.width / 2, monitor.y + monitor.height / 2); -- 2.20.0.rc2