On Tue, 19 Jan 2021 00:57:31 GMT, Sergey Bylokhov <s...@openjdk.org> wrote:

> We use two different approaches to listing the display modes on the system:
>  - For single-screen configuration use version 1.1 protocol 
> XRRGetScreenInfo/XRRConfigRates/XRRConfigSizes
>  - For multi-screen configuration use version 1.2 protocol: 
> XRRGetScreenResources/XRRGetOutputInfo/XRRModeInfo
> 
> Unfortunately, the current code does not work for some specific double scan 
> modes, it doubles the real refresh rate. If this refresh rate will be passed 
> to the Xserver later it could hang/crash.
> 
> The same bug existed in xrandr utility before version 1.4:
> https://bugs.freedesktop.org/show_bug.cgi?id=37043
> https://gitlab.freedesktop.org/xorg/app/xrandr/commit/7fd4f18b649f22fad4dbf9fc64b69b3e7f172207
> 
> As suggested in the bug report I have tried to unify the code for single and 
> multiscreen systems and use updated code currently used on the multiscreen.
> 
> But unfortunately, I have found that the multi-screen code is even more 
> broken. The problematic code is this:
> 
>     int scr = 0, out = 0;
>     if (usingXinerama && XScreenCount(awt_display) > 0) {
>         out = screen;
>     } else {
>         scr = screen;
>     }
> The idea of the code is: if the passed screen is Xinerama index used by the 
> java2d, then the "scr" will be zero, and "out" will be the "virtual" index 
> for that screen. If the screen is X11 screen then "src" will be the correct 
> screen and "out" will be zero.
> 
> The problem is that the code assumes that xrandr expect the "virtual" index 
> as the "out" parameter, but this is not. This parameter is the index of the 
> "output" such as DP1, DP2, other ports/etc.
> 
> So sometimes the code works when the first screen is connected to the first 
> port on the video card and the second screen to the second port, otherwise, 
> we just report data for the wrong screen or report nothing.
> 
> I did not found a reliable way to map Xinerama srceens to the xrandr. It is 
> better to rework the java2d to use the xrandr instead of xinerama.
> 
> As a fix, I suggest dropping the code which uses the incorrect mapping 
> screen->output. This includes the code related to the display modes added in 
> the JDK-8167486 + JDK-8022810, and also the code related to the calculation 
> of scale factor from the "ubuntu property" which does not work on the recent 
> ubuntu version after migration to gnome3 added in the JDK-8149115
> 
> I will file a separate two bugs to reimplement this functionality, most 
> probably the "display modes" will be implementing when we fully migrate to 
> the xrandr, and calculation of the scale factor will be implemented via the 
> gtk library.

I guess not having this functionality at all is better than having a code that 
hangs. Can we have these new bugs about re-implementing this functionality 
linked in the initial bug so they can be tracked easier?

-------------

Marked as reviewed by kizune (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/2136

Reply via email to