Commit 413aad39 authored by Zhiyi Zhang's avatar Zhiyi Zhang Committed by Alexandre Julliard

winex11.drv: Handle display device events in the desktop thread.

This fixes a regression from 22795243, which calls thread_init_display() and eventually XOpenIM() before X11DRV_InitXIM() is called. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47821Signed-off-by: 's avatarZhiyi Zhang <zzhang@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 9ae8da6b
......@@ -241,6 +241,12 @@ void X11DRV_DisplayDevices_SetHandler(const struct x11drv_display_device_handler
}
}
void X11DRV_DisplayDevices_RegisterEventHandlers(void)
{
if (handler.register_event_handlers)
handler.register_event_handlers();
}
/* Initialize a GPU instance and return its GUID string in guid_string and driver value in driver parameter */
static BOOL X11DRV_InitGpu(HDEVINFO devinfo, const struct x11drv_gpu *gpu, INT gpu_index, WCHAR *guid_string,
WCHAR *driver)
......
......@@ -1833,6 +1833,7 @@ BOOL CDECL X11DRV_CreateWindow( HWND hwnd )
XFlush( data->display );
SetPropA( hwnd, clip_window_prop, (HANDLE)data->clip_window );
X11DRV_InitClipboard();
X11DRV_DisplayDevices_RegisterEventHandlers();
}
return TRUE;
}
......
......@@ -743,10 +743,15 @@ struct x11drv_display_device_handler
/* free_monitors will be called to free a monitor list from get_monitors */
void (*free_monitors)(struct x11drv_monitor *monitors);
/* register_event_handlers will be called to register event handlers.
* This function pointer is optional and can be NULL when driver doesn't support it */
void (*register_event_handlers)(void);
};
extern void X11DRV_DisplayDevices_SetHandler(const struct x11drv_display_device_handler *handler) DECLSPEC_HIDDEN;
extern void X11DRV_DisplayDevices_Init(BOOL force) DECLSPEC_HIDDEN;
extern void X11DRV_DisplayDevices_RegisterEventHandlers(void) DECLSPEC_HIDDEN;
/* XIM support */
extern BOOL X11DRV_InitXIM( const char *input_style ) DECLSPEC_HIDDEN;
......
......@@ -344,5 +344,6 @@ void xinerama_init( unsigned int width, unsigned int height )
handler.free_gpus = xinerama_free_gpus;
handler.free_adapters = xinerama_free_adapters;
handler.free_monitors = xinerama_free_monitors;
handler.register_event_handlers = NULL;
X11DRV_DisplayDevices_SetHandler( &handler );
}
......@@ -1063,10 +1063,29 @@ static void xrandr14_free_monitors( struct x11drv_monitor *monitors )
heap_free( monitors );
}
static BOOL xrandr14_device_change_event( HWND hwnd, XEvent *event )
static BOOL xrandr14_device_change_handler( HWND hwnd, XEvent *event )
{
X11DRV_DisplayDevices_Init( TRUE );
return TRUE;
if (hwnd == GetDesktopWindow() && GetWindowThreadProcessId( hwnd, NULL ) == GetCurrentThreadId())
X11DRV_DisplayDevices_Init( TRUE );
return FALSE;
}
static void xrandr14_register_event_handlers(void)
{
Display *display = thread_init_display();
int event_base, error_base;
if (!pXRRQueryExtension( display, &event_base, &error_base ))
return;
pXRRSelectInput( display, root_window,
RRCrtcChangeNotifyMask | RROutputChangeNotifyMask | RRProviderChangeNotifyMask );
X11DRV_register_event_handler( event_base + RRNotify_CrtcChange, xrandr14_device_change_handler,
"XRandR CrtcChange" );
X11DRV_register_event_handler( event_base + RRNotify_OutputChange, xrandr14_device_change_handler,
"XRandR OutputChange" );
X11DRV_register_event_handler( event_base + RRNotify_ProviderChange, xrandr14_device_change_handler,
"XRandR ProviderChange" );
}
#endif
......@@ -1115,16 +1134,8 @@ void X11DRV_XRandR_Init(void)
handler.free_gpus = xrandr14_free_gpus;
handler.free_adapters = xrandr14_free_adapters;
handler.free_monitors = xrandr14_free_monitors;
handler.register_event_handlers = xrandr14_register_event_handlers;
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
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment