Module: wine Branch: master Commit: 22795243b2d21e1a667215f54c3a15634735749c URL: https://source.winehq.org/git/wine.git/?a=commit;h=22795243b2d21e1a667215f54... Author: Zhiyi Zhang <zzhang(a)codeweavers.com> Date: Fri Sep 20 16:55:40 2019 +0800 winex11.drv: Handle XRandR display device changes. Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winex11.drv/xrandr.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index ad8438252f..2a1c7ce594 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -68,6 +68,7 @@ static int primary_crtc; #endif #ifdef HAVE_XRRGETPROVIDERRESOURCES +MAKE_FUNCPTR(XRRSelectInput) MAKE_FUNCPTR(XRRGetOutputPrimary) MAKE_FUNCPTR(XRRGetProviderResources) MAKE_FUNCPTR(XRRFreeProviderResources) @@ -119,6 +120,7 @@ static int load_xrandr(void) #endif #ifdef HAVE_XRRGETPROVIDERRESOURCES + LOAD_FUNCPTR(XRRSelectInput) LOAD_FUNCPTR(XRRGetOutputPrimary) LOAD_FUNCPTR(XRRGetProviderResources) LOAD_FUNCPTR(XRRFreeProviderResources) @@ -1030,6 +1032,12 @@ static void xrandr14_free_monitors( struct x11drv_monitor *monitors ) heap_free( monitors ); } +static BOOL xrandr14_device_change_event( HWND hwnd, XEvent *event ) +{ + X11DRV_DisplayDevices_Init( TRUE ); + return TRUE; +} + #endif void X11DRV_XRandR_Init(void) @@ -1077,6 +1085,15 @@ void X11DRV_XRandR_Init(void) handler.pGetMonitors = xrandr14_get_monitors; handler.pFreeMonitors = xrandr14_free_monitors; X11DRV_DisplayDevices_SetHandler( &handler ); + + pXRRSelectInput( thread_init_display(), root_window, + RRCrtcChangeNotifyMask | RROutputChangeNotifyMask | RRProviderChangeNotifyMask); + X11DRV_register_event_handler( event_base + RRNotify_CrtcChange, xrandr14_device_change_event, + "XRandR CrtcChange" ); + X11DRV_register_event_handler( event_base + RRNotify_OutputChange, xrandr14_device_change_event, + "XRandR OutputChange" ); + X11DRV_register_event_handler( event_base + RRNotify_ProviderChange, xrandr14_device_change_event, + "XRandR ProviderChange" ); } #endif }