Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FVWM does not track global monitor size correctly during RandR changes #1172

Open
farblos opened this issue Feb 15, 2025 · 3 comments
Open
Labels
type:bug Something's broken!

Comments

@farblos
Copy link
Contributor

farblos commented Feb 15, 2025

Upfront Information

Please provide the following information by running the command and providing
the output.

  • Fvwm3 version (run: fvwm3 --version)

      [~]$ /home/farblos/fvwm3/bin/fvwm3 --version
      fvwm3 1.1.3 (7b901c04)
      with support for:  ReadLine, XPM, PNG, SVG, Shape, XShm, SM, Bidi text, XRandR, XRender, XCursor, XFT, XFixes, NLS
      
      fvwm3 comes with NO WARRANTY, to the extent permitted by law. You may
      redistribute copies of fvwm under the terms of the GNU General Public License.
      For more information about these matters, see the file named COPYING.
    
  • Linux distribution or BSD name/version

      Debian testing
    
  • Platform (run: uname -sp)

      Linux unknown
    

Reproducer

Scale down display resolution with:

xrandr --output eDP-1 --primary --auto --scale 0.75

Restart FVWM with default configuration, open an XTerm, move it to the bottom right corner with:

echo 'Next ("xterm") Move -2p -2p ewmhiwa' | nc -U $FVWMMFL_SOCKET

Remove display scale so that the XTerm now is some 25% away from the bottom right corner:

xrandr --output eDP-1 --primary --auto --transform none

Try to move the XTerm again to new bottom right corner:

echo 'Next ("xterm") Move -2p -2p ewmhiwa' | nc -U $FVWMMFL_SOCKET

Expected Behaviour

XTerm moves to the new bottom right corner.

Actual Behaviour

XTerm does not change position.

Enabling logging

In the state after above reproducer, dump the monitor state with

echo 'BugOpts DebugRandR True' | nc -U $FVWMMFL_SOCKET

This results for me in:

fvwm3[36486]: [1739643857.113858] monitor_dump_state: Monitor Debug
fvwm3[36486]: [1739643857.113870] monitor_dump_state:         number of outputs: 1
fvwm3[36486]: [1739643857.113878] monitor_dump_state:         Number:        0
fvwm3[36486]:         Name:        eDP-1
fvwm3[36486]:         Disabled:        false
fvwm3[36486]:         Is Primary:        yes
fvwm3[36486]:         Is Current:        yes
fvwm3[36486]:         Is Previous:        no
fvwm3[36486]:         Output:        66
fvwm3[36486]:         Coords:        {x: 0, y: 0, w: 2256, h: 1504}
fvwm3[36486]:         VirtScr: {
fvwm3[36486]:                 VxMax: 1504, VyMax: 1002, Vx: 0, Vy: 0
fvwm3[36486]:                 EdgeScrollX: 1504, EdgeScrollY: 1002
fvwm3[36486]:                 CurrentDesk: 0
fvwm3[36486]:                 CurrentPage: {x: 0, y: 0}
fvwm3[36486]:                 MyDisplayWidth: 1504, MyDisplayHeight: 1002
fvwm3[36486]:         }
fvwm3[36486]:         EWMH: {
fvwm3[36486]:                 BaseStrut Top:    0
fvwm3[36486]:                 BaseStrut Bottom: 0
fvwm3[36486]:                 BaseStrut Left:   0
fvwm3[36486]:                 BaseStrut Right:  120
fvwm3[36486]:         }
fvwm3[36486]:         Desktops:        yes
fvwm3[36486]:         Flags:global

Notice the difference in dimensions shown by parameters Coords (untransformed monitor dimensions) and VirtScr (still showing dimensions scaled by 75%).

More Information

My educated guess is that the Xlib macros DisplayWidth and DisplayHeight, which FVWM uses to determine the global monitor size, are not suitable when using RandR. See also the following test program:

/* gcc -o randrinfo randrinfo.c -lX11 -lXrandr */
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
#include <unistd.h>

int main(void) {
    Display *d = XOpenDisplay(getenv("DISPLAY"));
    Window   w = DefaultRootWindow(d);
    XRRScreenResources *xrrr;
    XRRCrtcInfo *xrrci;
    while ( 1 ) {
        printf("display size is %d x %d\n",
               DisplayWidth(d, DefaultScreen(d)),
               DisplayHeight(d, DefaultScreen(d)));

        xrrr = XRRGetScreenResources(d, w);
        for (int i = 0; i < xrrr->ncrtc; ++i) {
            xrrci = XRRGetCrtcInfo(d, xrrr, xrrr->crtcs[i]);
            if (xrrci->mode != None)
                printf("%dx%d+%d+%d\n", xrrci->width, xrrci->height, xrrci->x, xrrci->y);
            XRRFreeCrtcInfo(xrrci);
        }
        XRRFreeScreenResources(xrrr);
        sleep(10);
    }
    return 0;
}

When executing that, the display resolution determined by DisplayWidth and DisplayHeight does not change when changing display scale with xrandr.

@farblos farblos added the type:bug Something's broken! label Feb 15, 2025
@farblos
Copy link
Contributor Author

farblos commented Feb 15, 2025

I can try to come up with a PR but would need some guidance while doing so...

@ThomasAdam
Copy link
Member

Hi @farblos

Yep -- this is a known problem, and I already have a patch for this.

@farblos
Copy link
Contributor Author

farblos commented Feb 15, 2025

Hi @ThomasAdam,

Yep -- this is a known problem, and I already have a patch for this.

great! Is that patch available on some branch? Should I test ist?

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type:bug Something's broken!
Projects
None yet
Development

No branches or pull requests

2 participants