Eu fiz algumas escavações. A versão moderna da mágica do X11 que eu formulei é, na verdade, mágica do gerenciador de janelas, _NET_WM_STATE_FULLSCREEN . Meu cliente VNC está de fato usando essa solicitação e sendo expandido para um único monitor. Parece que ele deve primeiro definir _NET_WM_FULLSCREEN_MONITORS para descrever quais monitores usar como as bordas superior / inferior / esquerda / direita, mas não é. No entanto, eu puxei a fonte do dpkg e procurei para hack-lo. Mesmo com _NET_WM_FULLSCREEN_MONITORS, não consegui obter o comportamento correto. O cliente VNC sabe que quer chegar a 3200x900 e tenta várias vezes (30) redimensionar para isso (configurando as larguras e alturas máximas e básicas em XA_WM_NORMAL_HINTS e, em seguida, usando XResizeWindow ()) na janela superior, mas é sempre ignorado. Talvez o compiz esteja se comportando mal?
Mas o cliente VNC também tem código para lidar com X diretamente, em vez de passar por um gerenciador de janelas. Quando eu cortar o código de detecção WM, ele modifica a janela raiz mais diretamente (XtNoverrideRedirect, XReparentWindow para o topo, XMapRaised, etc) e que funciona como um encanto (desde que eu também desative o código de detecção na função un-fullscreen ). Ele funciona indiscutivelmente ainda melhor - alt-tab e outras chaves de gerenciamento de janela agora passam para a máquina remota até que eu descomplique a janela do cliente VNC.
Portanto, pode ser hacky e, de outra forma, ter algumas armadilhas *, mas pelo menos por agora eu consegui que ele se comportasse de maneira aceitável em minha mente.
*: un-fullscreening não redesenhar corretamente a janela raiz ou outras janelas que foram encobertas. Mas mudar para uma viewport diferente e, em seguida, voltar a força um redesenho, que é uma solução aceitável.