From a3d8df0869e33423425e63ea242339fbe92cd321 Mon Sep 17 00:00:00 2001 From: Jonas Zetterberg Date: Sat, 1 Dec 2018 11:45:38 +0100 Subject: [PATCH] tabwin: Place tabwin in center when display is scaled On scaled display the tabwin is using unscaled window coordinates to calculate its position, expose scale factor from xfwm-common and use when calculating window position. This bug was introduced in: be929b2a common: Convert monitor geometry to device geometry Signed-off-by: Jonas Zetterberg --- common/xfwm-common.c | 19 ++++++++++++------- common/xfwm-common.h | 3 ++- src/screen.c | 8 ++++---- src/tabwin.c | 19 ++++++++++--------- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/common/xfwm-common.c b/common/xfwm-common.c index a991b355..61d9d94b 100644 --- a/common/xfwm-common.c +++ b/common/xfwm-common.c @@ -78,25 +78,30 @@ xfwm_get_screen_dimensions (gint *width, gint *height) void xfwm_get_monitor_geometry (GdkScreen *screen, gint monitor_num, - GdkRectangle *geometry) + GdkRectangle *geometry, + gint *scale) { #if GTK_CHECK_VERSION(3, 22, 0) GdkDisplay *display; GdkMonitor *monitor; - int scale; + int scalefactor; 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; + scalefactor = gdk_monitor_get_scale_factor (monitor); + geometry->x *= scalefactor; + geometry->y *= scalefactor; + geometry->width *= scalefactor; + geometry->height *= scalefactor; + if (scale) + *scale = scalefactor; #else gdk_screen_get_monitor_geometry (screen, monitor_num, geometry); + if (scale) + *scale = 1; #endif } diff --git a/common/xfwm-common.h b/common/xfwm-common.h index e2e8c97b..b86bbe63 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, + gint *scale); void xfwm_get_primary_monitor_geometry (GdkScreen *screen, GdkRectangle *geometry); diff --git a/src/screen.c b/src/screen.c index a40e3db6..c03df0f0 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, NULL); 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, NULL); 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, NULL); 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, NULL); 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..7800f6b1 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, NULL); 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, NULL); if (min_height == 0 || monitor.height < min_height) { min_height = monitor.height; @@ -562,7 +562,7 @@ static gboolean tabwinConfigure (TabwinWidget *tabwin_widget, GdkEventConfigure *event) { GdkRectangle monitor; - gint x, y; + gint x, y, scale; g_return_val_if_fail (tabwin_widget != NULL, FALSE); TRACE ("entering"); @@ -573,9 +573,9 @@ tabwinConfigure (TabwinWidget *tabwin_widget, GdkEventConfigure *event) } xfwm_get_monitor_geometry (gtk_widget_get_screen (GTK_WIDGET (tabwin_widget)), - tabwin_widget->monitor_num, &monitor); - x = monitor.x + (monitor.width - event->width) / 2; - y = monitor.y + (monitor.height - event->height) / 2; + tabwin_widget->monitor_num, &monitor, &scale); + x = monitor.x + (monitor.width - event->width) / (2 * scale); + y = monitor.y + (monitor.height - event->height) / (2 * scale); gtk_window_move (GTK_WINDOW (tabwin_widget), x, y); tabwin_widget->width = event->width; @@ -740,6 +740,7 @@ tabwinCreateWidget (Tabwin *tabwin, ScreenInfo *screen_info, gint monitor_num) GdkRectangle monitor; gint border_radius = 0; GtkBorder border, padding; + gint scale; TRACE ("monitor %i", monitor_num); @@ -784,9 +785,9 @@ 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); - gtk_window_move (GTK_WINDOW (tabwin_widget), monitor.x + monitor.width / 2, - monitor.y + monitor.height / 2); + xfwm_get_monitor_geometry (screen_info->gscr, tabwin_widget->monitor_num, &monitor, &scale); + gtk_window_move (GTK_WINDOW (tabwin_widget), monitor.x + monitor.width / (2 * scale), + monitor.y + monitor.height / (2 * scale)); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3); gtk_container_add (GTK_CONTAINER (tabwin_widget), vbox); -- 2.20.0.rc1