@@ -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 ;
0 commit comments