Skip to content

Commit 87a3769

Browse files
committed
Scale monitor geometries down to device pixels to support multiple monitors in HiDPI
1 parent b08bc13 commit 87a3769

File tree

4 files changed

+44
-26
lines changed

4 files changed

+44
-26
lines changed

mate-panel/panel-multiscreen.c

+27-6
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,14 @@ panel_multiscreen_get_randr_monitors_for_screen (GdkScreen *screen,
8888
GdkRectangle **geometries_ret)
8989
{
9090
#ifdef HAVE_RANDR
91+
GdkDisplay *display;
92+
GdkMonitor *monitor;
9193
Display *xdisplay;
9294
Window xroot;
9395
XRRScreenResources *resources;
9496
RROutput primary;
9597
GArray *geometries;
98+
int scale;
9699
int i;
97100

98101
if (!have_randr)
@@ -138,6 +141,11 @@ panel_multiscreen_get_randr_monitors_for_screen (GdkScreen *screen,
138141
return FALSE;
139142

140143
primary = XRRGetOutputPrimary (xdisplay, xroot);
144+
display = gdk_screen_get_display (screen);
145+
monitor = gdk_display_get_primary_monitor (display);
146+
147+
/* Use scale factor to bring geometries down to device pixels to support HiDPI displays */
148+
scale = gdk_monitor_get_scale_factor (monitor);
141149

142150
geometries = g_array_sized_new (FALSE, FALSE,
143151
sizeof (GdkRectangle),
@@ -157,10 +165,10 @@ panel_multiscreen_get_randr_monitors_for_screen (GdkScreen *screen,
157165
crtc = XRRGetCrtcInfo (xdisplay, resources,
158166
output->crtc);
159167

160-
rect.x = crtc->x;
161-
rect.y = crtc->y;
162-
rect.width = crtc->width;
163-
rect.height = crtc->height;
168+
rect.x = crtc->x / scale;
169+
rect.y = crtc->y / scale;
170+
rect.width = crtc->width / scale;
171+
rect.height = crtc->height / scale;
164172

165173
XRRFreeCrtcInfo (crtc);
166174

@@ -211,8 +219,21 @@ panel_multiscreen_get_gdk_monitors_for_screen (GdkScreen *screen,
211219
num_monitors = gdk_display_get_n_monitors (display);
212220
geometries = g_new (GdkRectangle, num_monitors);
213221

214-
for (i = 0; i < num_monitors; i++)
215-
gdk_monitor_get_geometry (gdk_display_get_monitor (display, i), &(geometries[i]));
222+
for (i = 0; i < num_monitors; i++) {
223+
GdkMonitor *monitor;
224+
int scale;
225+
226+
monitor = gdk_display_get_monitor (display, i);
227+
scale = gdk_monitor_get_scale_factor (monitor);
228+
229+
gdk_monitor_get_geometry (monitor, &(geometries[i]));
230+
231+
/* Scale geometries down to device pixels to support HiDPI displays */
232+
geometries[i].x /= scale;
233+
geometries[i].y /= scale;
234+
geometries[i].width /= scale;
235+
geometries[i].height /= scale;
236+
}
216237

217238
*monitors_ret = num_monitors;
218239
*geometries_ret = geometries;

mate-panel/panel-run-dialog.c

+1-3
Original file line numberDiff line numberDiff line change
@@ -1708,7 +1708,6 @@ panel_run_dialog_setup_entry (PanelRunDialog *dialog,
17081708
GdkScreen *screen;
17091709
int width_request;
17101710
GtkWidget *entry;
1711-
gint scale;
17121711

17131712
dialog->combobox = PANEL_GTK_BUILDER_GET (gui, "comboboxentry");
17141713

@@ -1721,10 +1720,9 @@ panel_run_dialog_setup_entry (PanelRunDialog *dialog,
17211720
(GTK_COMBO_BOX (dialog->combobox), 0);
17221721

17231722
screen = gtk_window_get_screen (GTK_WINDOW (dialog->run_dialog));
1724-
scale = gtk_widget_get_scale_factor (GTK_WIDGET (dialog->run_dialog));
17251723

17261724
/* 1/4 the width of the first monitor should be a good value */
1727-
width_request = panel_multiscreen_width (screen, 0) / (4 * scale);
1725+
width_request = panel_multiscreen_width (screen, 0) / 4;
17281726
g_object_set (G_OBJECT (dialog->combobox),
17291727
"width_request", width_request,
17301728
NULL);

mate-panel/panel-struts.c

+11-4
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,17 @@ panel_struts_get_monitor_geometry (GdkScreen *screen,
7575
int *width,
7676
int *height)
7777
{
78-
*x = panel_multiscreen_x (screen, monitor);
79-
*y = panel_multiscreen_y (screen, monitor);
80-
*width = panel_multiscreen_width (screen, monitor);
81-
*height = panel_multiscreen_height (screen, monitor);
78+
GdkDisplay *display;
79+
int scale;
80+
81+
/* Use scale factor to bring strut dimensions up to application pixels to support HiDPI displays */
82+
display = gdk_screen_get_display (screen);
83+
scale = gdk_monitor_get_scale_factor (gdk_display_get_monitor (display, monitor));
84+
85+
*x = panel_multiscreen_x (screen, monitor) * scale;
86+
*y = panel_multiscreen_y (screen, monitor) * scale;
87+
*width = panel_multiscreen_width (screen, monitor) * scale;
88+
*height = panel_multiscreen_height (screen, monitor) * scale;
8289
}
8390

8491
static PanelStrut *

mate-panel/panel-toplevel.c

+5-13
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,7 @@ static GdkScreen* panel_toplevel_get_screen_geometry(PanelToplevel* toplevel, in
290290
* sorts of awful misalignments and pretend it's all good. Or we can just
291291
* make this thing think that the screen is scaled down, and because GTK+
292292
* already scaled everything up without the panel knowing about it, the whole
293-
* thing somehow works well... sigh.
294-
* @see panel_toplevel_get_monitor_geometry() */
293+
* thing somehow works well... sigh. */
295294
*width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / toplevel->priv->scale;
296295
*height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / toplevel->priv->scale;
297296

@@ -307,24 +306,17 @@ static GdkScreen* panel_toplevel_get_monitor_geometry(PanelToplevel* toplevel, i
307306

308307
screen = gtk_window_get_screen(GTK_WINDOW(toplevel));
309308

310-
if (x) *x = panel_multiscreen_x(screen, toplevel->priv->monitor) / toplevel->priv->scale;
311-
if (y) *y = panel_multiscreen_y(screen, toplevel->priv->monitor) / toplevel->priv->scale;
309+
if (x) *x = panel_multiscreen_x(screen, toplevel->priv->monitor);
310+
if (y) *y = panel_multiscreen_y(screen, toplevel->priv->monitor);
312311

313-
/* To scale the panels up for HiDPI displays, we can either multiply a lot of
314-
* toplevel geometry attributes by the scale factor, then correct for all
315-
* sorts of awful misalignments and pretend it's all good. Or we can just
316-
* make this thing think that the screen is scaled down, and because GTK+
317-
* already scaled everything up without the panel knowing about it, the whole
318-
* thing somehow works well... sigh.
319-
* @see panel_toplevel_get_screen_geometry() */
320312
if (width)
321313
{
322-
*width = panel_multiscreen_width(screen, toplevel->priv->monitor) / toplevel->priv->scale;
314+
*width = panel_multiscreen_width(screen, toplevel->priv->monitor);
323315
}
324316

325317
if (height)
326318
{
327-
*height = panel_multiscreen_height(screen, toplevel->priv->monitor) / toplevel->priv->scale;
319+
*height = panel_multiscreen_height(screen, toplevel->priv->monitor);
328320
}
329321

330322
return screen;

0 commit comments

Comments
 (0)