Cómo hacer que la ventana X11 abarque varios monitores

2 minutos de lectura

Estoy tratando de usar XResizeWindow() para crear una ventana que abarque 2 monitores, pero el ?administrador de ventanas? lo está limitando a uno.

¿Hay alguna pista o propiedad que pueda asociar con la ventana para decirle al WM que no la limite?

Para mi caso de prueba, tengo dos monitores de 1600×1200 que nVidia presenta como una pantalla de 3200×1200 para KDE4. XDisplayWidth(pantalla, 0); devuelve 3200 y XDisplayHeight(pantalla, 0); devuelve 1200.

cuando llamo

XCreateWindow(display, DefaultRootWindow(display),
              220, 0, 1700, 930,
              1, DefaultDepth(display,screen),
              InputOutput, CopyFromParent,
              CWCursor, &attributes);

para una ventana de 1700×930 a 220,0 obtengo una ventana de 1593×930 a 0,0, manteniéndola completamente en el monitor izquierdo. Cualquier XResizeWindow más grande que eso se reduce a 1593. (Supongo que los 7 píxeles son decoración de ventana, lo cual está bien).

Pero, si luego XMoveWindow (display, win, 800, 0), moverá la ventana para abarcar las pantallas, y luego puedo ampliarla hasta 3200 de ancho (menos unos pocos píxeles).

¿Hay algo que pueda hacer para decirle al administrador de ventanas, o a quien sea que esté haciendo esto, que no limite la ventana a un solo monitor y me permita usar toda la pantalla?

¡Gracias!

%xrandr -q --verbose
xrandr: Failed to get size of gamma for output default
Screen 0: minimum 3200 x 1200, current 3200 x 1200, maximum 3200 x 1200
default connected 3200x1200+0+0 (0x161) normal (normal) 0mm x 0mm
    Identifier: 0x160
    Timestamp:  64409661
    Subpixel:   unknown
    Clones:    
    CRTC:       0
    CRTCs:      0
    Transform:  1.000000 0.000000 0.000000
                0.000000 1.000000 0.000000
                0.000000 0.000000 1.000000
               filter: 
3200x1200 (0x161)  192.0MHz *current
    h: width  3200 start    0 end    0 total 3200 skew    0 clock   60.0KHz
    v: height 1200 start    0 end    0 total 1200           clock   50.0Hz

Como hacer que la ventana X11 abarque varios monitores
norte. 1.8e9-dónde-está-mi-participación m.

En general, una aplicación no debe tratar de controlar rígidamente el tamaño y la posición de su ventana, ya que se supone que WM es inteligente y coloca las ventanas de la mejor manera posible. Si quieres controlar de todos modos, intenta usar XSizeHints Me gusta esto:

XSizeHints sh;
sh.width = sh.min_width = 1700;
sh.height = sh.min_height = 930;
sh.h = 220;
sh.y = 0;
sh.flags = PSize | PMinSize | PPosition;
XSetWMNormalHints(dpy, win, &sh);
XMapWindow(dpy, win);

Los WM respetarán min_width y no encogerá la ventana más pequeña que esto.

Si necesita una ventana de pantalla completa que abarque varios monitores, esto se hace de manera diferente, con _NET_WM_FULLSCREEN_MONITORS propiedad. Ver aquí.

  • ¡Ajá! Establecer min_width hace el truco. La aplicación intenta ser rígida con respecto al tamaño solo cuando el usuario le dice explícitamente a la aplicación qué tan grande quiere que sea la ventana. Entonces puedo verificar el tamaño de la pantalla y si es lo suficientemente grande, forzarlo manualmente con min_width, luego establecer min_width nuevamente a 640 después de que se haya cambiado el tamaño. ¡Gracias!

    – Ken Martín

    17 de junio de 2013 a las 19:36


  • Para el tamaño especificado usado, se necesita usar USSize/USMinSize, etc. en lugar de P* (se supone que las preferencias especificadas por el usuario deben respetarse más).

    – norte 1.8e9-dónde-está-mi-participación m.

    18 de junio de 2013 a las 4:54

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad