diff --git a/patches/0008-quartz-Implement-better-stubs-for-AMCertifiedOutputPro.patch b/patches/0008-quartz-Implement-better-stubs-for-AMCertifiedOutputPro.patch deleted file mode 100644 index 53e22101..00000000 --- a/patches/0008-quartz-Implement-better-stubs-for-AMCertifiedOutputPro.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 95de7ce5572ff82805bbee85a2af72d0b221371c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Sun, 10 Nov 2013 20:44:10 +0100 -Subject: quartz: Implement better stubs for AMCertifiedOutputProtection - ---- - dlls/quartz/vmr9.c | 8 ++++---- - include/vfwmsgs.h | 1 + - 2 files changed, 5 insertions(+), 4 deletions(-) - -diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c -index 2dc12a6..0acdd26 100644 ---- a/dlls/quartz/vmr9.c -+++ b/dlls/quartz/vmr9.c -@@ -1120,7 +1120,7 @@ static HRESULT WINAPI AMCertifiedOutputProtection_KeyExchange(IAMCertifiedOutput - struct quartz_vmr *This = impl_from_IAMCertifiedOutputProtection(iface); - - FIXME("(%p/%p)->(%p, %p, %p) stub\n", iface, This, pRandom, VarLenCertGH, pdwLengthCertGH); -- return E_NOTIMPL; -+ return VFW_E_NO_COPP_HW; - } - - static HRESULT WINAPI AMCertifiedOutputProtection_SessionSequenceStart(IAMCertifiedOutputProtection *iface, -@@ -1129,7 +1129,7 @@ static HRESULT WINAPI AMCertifiedOutputProtection_SessionSequenceStart(IAMCertif - struct quartz_vmr *This = impl_from_IAMCertifiedOutputProtection(iface); - - FIXME("(%p/%p)->(%p) stub\n", iface, This, pSig); -- return E_NOTIMPL; -+ return VFW_E_NO_COPP_HW; - } - - static HRESULT WINAPI AMCertifiedOutputProtection_ProtectionCommand(IAMCertifiedOutputProtection *iface, -@@ -1138,7 +1138,7 @@ static HRESULT WINAPI AMCertifiedOutputProtection_ProtectionCommand(IAMCertified - struct quartz_vmr *This = impl_from_IAMCertifiedOutputProtection(iface); - - FIXME("(%p/%p)->(%p) stub\n", iface, This, cmd); -- return E_NOTIMPL; -+ return VFW_E_NO_COPP_HW; - } - - static HRESULT WINAPI AMCertifiedOutputProtection_ProtectionStatus(IAMCertifiedOutputProtection *iface, -@@ -1148,7 +1148,7 @@ static HRESULT WINAPI AMCertifiedOutputProtection_ProtectionStatus(IAMCertifiedO - struct quartz_vmr *This = impl_from_IAMCertifiedOutputProtection(iface); - - FIXME("(%p/%p)->(%p, %p) stub\n", iface, This, pStatusInput, pStatusOutput); -- return E_NOTIMPL; -+ return VFW_E_NO_COPP_HW; - } - - static const IAMCertifiedOutputProtectionVtbl IAMCertifiedOutputProtection_Vtbl = -diff --git a/include/vfwmsgs.h b/include/vfwmsgs.h -index 16b25c3..660ee40 100644 ---- a/include/vfwmsgs.h -+++ b/include/vfwmsgs.h -@@ -156,6 +156,7 @@ - #define VFW_E_VMR_NO_AP_SUPPLIED ((HRESULT)0x80040297) - #define VFW_E_VMR_NO_DEINTERLACE_HW ((HRESULT)0x80040298) - #define VFW_E_DVD_VMR9_INCOMPATIBLEDEC ((HRESULT)0x8004029A) -+#define VFW_E_NO_COPP_HW ((HRESULT)0x8004029B) - #define VFW_E_BAD_KEY ((HRESULT)0x800403F2) - - #ifndef E_PROP_ID_UNSUPPORTED --- -1.7.9.5 - diff --git a/patches/0009-quartz-Partial-implementation-of-VMR7MonitorConfig.patch b/patches/0009-quartz-Partial-implementation-of-VMR7MonitorConfig.patch deleted file mode 100644 index 187f6fbf..00000000 --- a/patches/0009-quartz-Partial-implementation-of-VMR7MonitorConfig.patch +++ /dev/null @@ -1,122 +0,0 @@ -From beed64a33606fd3de77f41708f8a2b590521ea51 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Sun, 10 Nov 2013 21:40:10 +0100 -Subject: quartz: Partial implementation of VMR7MonitorConfig - ---- - dlls/quartz/vmr9.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 64 insertions(+), 6 deletions(-) - -diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c -index 0acdd26..6b2970b 100644 ---- a/dlls/quartz/vmr9.c -+++ b/dlls/quartz/vmr9.c -@@ -1309,7 +1309,7 @@ static HRESULT WINAPI VMR7MonitorConfig_SetMonitor(IVMRMonitorConfig *iface, con - struct quartz_vmr *This = impl_from_IVMRMonitorConfig(iface); - - FIXME("(%p/%p)->(%p) stub\n", iface, This, pGUID); -- return E_NOTIMPL; -+ return S_OK; - } - - static HRESULT WINAPI VMR7MonitorConfig_GetMonitor(IVMRMonitorConfig *iface, VMRGUID *pGUID) -@@ -1317,7 +1317,11 @@ static HRESULT WINAPI VMR7MonitorConfig_GetMonitor(IVMRMonitorConfig *iface, VMR - struct quartz_vmr *This = impl_from_IVMRMonitorConfig(iface); - - FIXME("(%p/%p)->(%p) stub\n", iface, This, pGUID); -- return E_NOTIMPL; -+ -+ if (pGUID) -+ pGUID->pGUID = NULL; /* default DirectDraw device */ -+ -+ return S_OK; - } - - static HRESULT WINAPI VMR7MonitorConfig_SetDefaultMonitor(IVMRMonitorConfig *iface, -@@ -1326,7 +1330,7 @@ static HRESULT WINAPI VMR7MonitorConfig_SetDefaultMonitor(IVMRMonitorConfig *ifa - struct quartz_vmr *This = impl_from_IVMRMonitorConfig(iface); - - FIXME("(%p/%p)->(%p) stub\n", iface, This, pGUID); -- return E_NOTIMPL; -+ return S_OK; - } - - static HRESULT WINAPI VMR7MonitorConfig_GetDefaultMonitor(IVMRMonitorConfig *iface, VMRGUID *pGUID) -@@ -1334,7 +1338,11 @@ static HRESULT WINAPI VMR7MonitorConfig_GetDefaultMonitor(IVMRMonitorConfig *ifa - struct quartz_vmr *This = impl_from_IVMRMonitorConfig(iface); - - FIXME("(%p/%p)->(%p) stub\n", iface, This, pGUID); -- return E_NOTIMPL; -+ -+ if (pGUID) -+ pGUID->pGUID = NULL; /* default DirectDraw device */ -+ -+ return S_OK; - } - - static HRESULT WINAPI VMR7MonitorConfig_GetAvailableMonitors(IVMRMonitorConfig *iface, -@@ -1342,9 +1350,59 @@ static HRESULT WINAPI VMR7MonitorConfig_GetAvailableMonitors(IVMRMonitorConfig * - DWORD *numdev) - { - struct quartz_vmr *This = impl_from_IVMRMonitorConfig(iface); -+ DISPLAY_DEVICEW device; -+ DWORD devnum, count; -+ DEVMODEW mode; - -- FIXME("(%p/%p)->(%p, %u, %p) stub\n", iface, This, info, arraysize, numdev); -- return E_NOTIMPL; -+ FIXME("(%p/%p)->(%p, %u, %p) semi-stub\n", iface, This, info, arraysize, numdev); -+ -+ if (!numdev) -+ return E_POINTER; -+ -+ device.cb = sizeof(DISPLAY_DEVICEW); -+ -+ /* return the number of available monitors if info == NULL */ -+ if (info == NULL) -+ { -+ for (devnum = 0; EnumDisplayDevicesW(NULL, devnum, &device, 0); ++devnum); -+ *numdev = devnum; -+ return S_OK; -+ } -+ -+ /* at least one entry */ -+ if (arraysize == 0) -+ return E_INVALIDARG; -+ -+ for (count = 0, devnum = 0; count < arraysize && EnumDisplayDevicesW(NULL, devnum, &device, 0); ++devnum) -+ { -+ -+ mode.dmSize = sizeof(DEVMODEW); -+ mode.dmDriverExtra = 0; -+ -+ if (!EnumDisplaySettingsExW(device.DeviceName, ENUM_CURRENT_SETTINGS, &mode, EDS_RAWMODE)) -+ continue; -+ -+ memset(info, 0, sizeof(VMRMONITORINFO)); -+ -+ info->guid.pGUID = NULL; /* default DirectDraw device */ -+ -+ info->rcMonitor.left = mode.u1.s2.dmPosition.x; -+ info->rcMonitor.top = mode.u1.s2.dmPosition.y; -+ info->rcMonitor.right = mode.u1.s2.dmPosition.x + mode.dmPelsWidth; -+ info->rcMonitor.bottom = mode.u1.s2.dmPosition.y + mode.dmPelsHeight; -+ -+ info->hMon = 0; /* FIXME: return monitor handle */ -+ info->dwFlags = (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) ? MONITORINFOF_PRIMARY : 0; -+ -+ lstrcpynW(info->szDevice, device.DeviceName, sizeof(info->szDevice)/sizeof(WCHAR)); -+ lstrcpynW(info->szDescription, device.DeviceString, sizeof(info->szDescription)/sizeof(WCHAR)); -+ -+ count++; -+ info++; -+ } -+ -+ *numdev = count; -+ return S_OK; - } - - static const IVMRMonitorConfigVtbl VMR7_MonitorConfig_Vtbl = --- -1.7.9.5 - diff --git a/patches/0011-winex11-Implement-additional-XEMBED-events.patch b/patches/0011-winex11-Implement-additional-XEMBED-events.patch deleted file mode 100644 index d391602c..00000000 --- a/patches/0011-winex11-Implement-additional-XEMBED-events.patch +++ /dev/null @@ -1,247 +0,0 @@ -From d4a65db7d42bcae783cf5357e4a38a3c27820047 Mon Sep 17 00:00:00 2001 -From: Sebastian Lackner -Date: Sat, 26 Oct 2013 18:34:32 +0200 -Subject: winex11: Implement additional XEMBED events - ---- - dlls/winex11.drv/event.c | 145 ++++++++++++++++++++++++++++++--------------- - dlls/winex11.drv/window.c | 2 +- - 2 files changed, 98 insertions(+), 49 deletions(-) - -diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c -index 4218949..64188bc 100644 ---- a/dlls/winex11.drv/event.c -+++ b/dlls/winex11.drv/event.c -@@ -748,34 +748,22 @@ static void X11DRV_FocusIn( HWND hwnd, XEvent *xev ) - else SetForegroundWindow( hwnd ); - } - -- - /********************************************************************** -- * X11DRV_FocusOut -- * -- * Note: only top-level windows get FocusOut events. -+ * focus_out - */ --static void X11DRV_FocusOut( HWND hwnd, XEvent *xev ) --{ -- XFocusChangeEvent *event = &xev->xfocus; -+ static void focus_out( Display *display , HWND hwnd ) -+ { - HWND hwnd_tmp; - Window focus_win; - int revert; - XIC xic; - -- TRACE( "win %p xwin %lx detail=%s\n", hwnd, event->window, focus_details[event->detail] ); -- -- if (event->detail == NotifyPointer) -- { -- if (!hwnd && event->window == x11drv_thread_data()->clip_window) reset_clipping_window(); -- return; -- } -- if (!hwnd) return; - if (ximInComposeMode) return; - - x11drv_thread_data()->last_focus = hwnd; - if ((xic = X11DRV_get_ic( hwnd ))) XUnsetICFocus( xic ); - -- if (root_window != DefaultRootWindow(event->display)) -+ if (root_window != DefaultRootWindow(display)) - { - if (hwnd == GetDesktopWindow()) reset_clipping_window(); - return; -@@ -786,10 +774,10 @@ static void X11DRV_FocusOut( HWND hwnd, XEvent *xev ) - /* don't reset the foreground window, if the window which is - getting the focus is a Wine window */ - -- XGetInputFocus( event->display, &focus_win, &revert ); -+ XGetInputFocus( display, &focus_win, &revert ); - if (focus_win) - { -- if (XFindContext( event->display, focus_win, winContext, (char **)&hwnd_tmp ) != 0) -+ if (XFindContext( display, focus_win, winContext, (char **)&hwnd_tmp ) != 0) - focus_win = 0; - } - -@@ -805,6 +793,26 @@ static void X11DRV_FocusOut( HWND hwnd, XEvent *xev ) - SetForegroundWindow( GetDesktopWindow() ); - } - } -+ } -+ -+/********************************************************************** -+ * X11DRV_FocusOut -+ * -+ * Note: only top-level windows get FocusOut events. -+ */ -+static void X11DRV_FocusOut( HWND hwnd, XEvent *xev ) -+{ -+ XFocusChangeEvent *event = &xev->xfocus; -+ -+ TRACE( "win %p xwin %lx detail=%s\n", hwnd, event->window, focus_details[event->detail] ); -+ -+ if (event->detail == NotifyPointer) -+ { -+ if (!hwnd && event->window == x11drv_thread_data()->clip_window) reset_clipping_window(); -+ return; -+ } -+ if (!hwnd) return; -+ focus_out( event->display, hwnd ); - } - - -@@ -940,6 +948,37 @@ static BOOL is_net_wm_state_maximized( Display *display, struct x11drv_win_data - return (ret == 2); - } - -+/*********************************************************************** -+ * reparent_notify -+ */ -+static void reparent_notify( Display *display, HWND hwnd, Window xparent, int x, int y ) -+{ -+ HWND parent, old_parent; -+ DWORD style; -+ -+ style = GetWindowLongW( hwnd, GWL_STYLE ); -+ if (xparent == root_window) -+ { -+ parent = GetDesktopWindow(); -+ style = (style & ~WS_CHILD) | WS_POPUP; -+ } -+ else -+ { -+ if (!(parent = create_foreign_window( display, xparent ))) return; -+ style = (style & ~WS_POPUP) | WS_CHILD; -+ } -+ -+ ShowWindow( hwnd, SW_HIDE ); -+ old_parent = SetParent( hwnd, parent ); -+ SetWindowLongW( hwnd, GWL_STYLE, style ); -+ SetWindowPos( hwnd, HWND_TOP, x, y, 0, 0, -+ SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOCOPYBITS | -+ ((style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0) ); -+ -+ /* make old parent destroy itself if it no longer has children */ -+ if (old_parent != GetDesktopWindow()) PostMessageW( old_parent, WM_CLOSE, 0, 0 ); -+} -+ - - /*********************************************************************** - * X11DRV_ReparentNotify -@@ -948,8 +987,6 @@ static void X11DRV_ReparentNotify( HWND hwnd, XEvent *xev ) - { - XReparentEvent *event = &xev->xreparent; - struct x11drv_win_data *data; -- HWND parent, old_parent; -- DWORD style; - - if (!(data = get_win_data( hwnd ))) return; - -@@ -975,27 +1012,7 @@ static void X11DRV_ReparentNotify( HWND hwnd, XEvent *xev ) - TRACE( "%p/%lx reparented to %lx\n", hwnd, data->whole_window, event->parent ); - release_win_data( data ); - -- style = GetWindowLongW( hwnd, GWL_STYLE ); -- if (event->parent == root_window) -- { -- parent = GetDesktopWindow(); -- style = (style & ~WS_CHILD) | WS_POPUP; -- } -- else -- { -- if (!(parent = create_foreign_window( event->display, event->parent ))) return; -- style = (style & ~WS_POPUP) | WS_CHILD; -- } -- -- ShowWindow( hwnd, SW_HIDE ); -- old_parent = SetParent( hwnd, parent ); -- SetWindowLongW( hwnd, GWL_STYLE, style ); -- SetWindowPos( hwnd, HWND_TOP, event->x, event->y, 0, 0, -- SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOCOPYBITS | -- ((style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0) ); -- -- /* make old parent destroy itself if it no longer has children */ -- if (old_parent != GetDesktopWindow()) PostMessageW( old_parent, WM_CLOSE, 0, 0 ); -+ reparent_notify( event->display, hwnd, event->parent, event->x, event->y ); - } - - -@@ -1594,22 +1611,54 @@ static void EVENT_DropURLs( HWND hWnd, XClientMessageEvent *event ) - */ - static void handle_xembed_protocol( HWND hwnd, XClientMessageEvent *event ) - { -- struct x11drv_win_data *data = get_win_data( hwnd ); -- -- if (!data) return; -- - switch (event->data.l[1]) - { - case XEMBED_EMBEDDED_NOTIFY: -- TRACE( "win %p/%lx XEMBED_EMBEDDED_NOTIFY owner %lx\n", hwnd, event->window, event->data.l[3] ); -- data->embedder = event->data.l[3]; -+ { -+ struct x11drv_win_data *data = get_win_data( hwnd ); -+ if (!data) break; -+ -+ TRACE( "win %p/%lx XEMBED_EMBEDDED_NOTIFY owner %lx\n", hwnd, event->window, event->data.l[3] ); -+ data->embedder = event->data.l[3]; -+ -+ /* window has been marked as embedded before (e.g. systray) */ -+ if (data->embedded) -+ { -+ release_win_data( data ); -+ break; -+ } -+ -+ make_window_embedded( data ); -+ release_win_data( data ); -+ reparent_notify( event->display, hwnd, event->data.l[3], 0, 0 ); -+ } -+ break; -+ -+ case XEMBED_WINDOW_DEACTIVATE: -+ TRACE( "win %p/%lx XEMBED_WINDOW_DEACTIVATE message\n", hwnd, event->window ); -+ focus_out( event->display, GetAncestor( hwnd, GA_ROOT ) ); -+ break; -+ -+ case XEMBED_FOCUS_OUT: -+ TRACE( "win %p/%lx XEMBED_FOCUS_OUT message\n", hwnd, event->window ); -+ focus_out( event->display, GetAncestor( hwnd, GA_ROOT ) ); - break; -+ -+ case XEMBED_MODALITY_ON: -+ TRACE( "win %p/%lx XEMBED_MODALITY_ON message\n", hwnd, event->window ); -+ EnableWindow( hwnd, FALSE ); -+ break; -+ -+ case XEMBED_MODALITY_OFF: -+ TRACE( "win %p/%lx XEMBED_MODALITY_OFF message\n", hwnd, event->window ); -+ EnableWindow( hwnd, TRUE ); -+ break; -+ - default: - TRACE( "win %p/%lx XEMBED message %lu(%lu)\n", - hwnd, event->window, event->data.l[1], event->data.l[2] ); - break; - } -- release_win_data( data ); - } - - -diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c -index a76e80d..e78f226 100644 ---- a/dlls/winex11.drv/window.c -+++ b/dlls/winex11.drv/window.c -@@ -1137,7 +1137,7 @@ void make_window_embedded( struct x11drv_win_data *data ) - data->embedded = TRUE; - data->managed = TRUE; - sync_window_style( data ); -- set_xembed_flags( data, data->mapped ? XEMBED_MAPPED : 0 ); -+ set_xembed_flags( data, (data->mapped || data->embedder) ? XEMBED_MAPPED : 0 ); - } - - --- -1.7.9.5 - diff --git a/patches/0012-winex11-Send-XEMBED_REQUEST_FOCUS-request-for-embedded.patch b/patches/0012-winex11-Send-XEMBED_REQUEST_FOCUS-request-for-embedded.patch deleted file mode 100644 index c5ec07a1..00000000 --- a/patches/0012-winex11-Send-XEMBED_REQUEST_FOCUS-request-for-embedded.patch +++ /dev/null @@ -1,165 +0,0 @@ -From 3db647fef4b506c88dfbe028271135945dbaec39 Mon Sep 17 00:00:00 2001 -From: Sebastian Lackner -Date: Sat, 26 Oct 2013 18:39:07 +0200 -Subject: winex11: Send XEMBED_REQUEST_FOCUS request for embedded windows - ---- - dlls/winex11.drv/event.c | 73 ++++++++++++++++++++++++++++++++------------- - dlls/winex11.drv/window.c | 16 ++++++++++ - dlls/winex11.drv/x11drv.h | 1 + - 3 files changed, 70 insertions(+), 20 deletions(-) - -diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c -index 64188bc..df27468 100644 ---- a/dlls/winex11.drv/event.c -+++ b/dlls/winex11.drv/event.c -@@ -182,6 +182,32 @@ static inline void free_event_data( XEvent *event ) - #endif - } - -+ -+/*********************************************************************** -+ * xembed_request_focus -+ */ -+static void xembed_request_focus( Display *display, Window window, DWORD timestamp ) -+{ -+ XEvent xev; -+ -+ xev.xclient.type = ClientMessage; -+ xev.xclient.window = window; -+ xev.xclient.message_type = x11drv_atom(_XEMBED); -+ xev.xclient.serial = 0; -+ xev.xclient.display = display; -+ xev.xclient.send_event = True; -+ xev.xclient.format = 32; -+ -+ xev.xclient.data.l[0] = timestamp; -+ xev.xclient.data.l[1] = XEMBED_REQUEST_FOCUS; -+ xev.xclient.data.l[2] = 0; -+ xev.xclient.data.l[3] = 0; -+ xev.xclient.data.l[4] = 0; -+ -+ XSendEvent(display, window, False, NoEventMask, &xev); -+ XSync(display, False); -+} -+ - /*********************************************************************** - * X11DRV_register_event_handler - * -@@ -532,26 +558,37 @@ static inline BOOL can_activate_window( HWND hwnd ) - /********************************************************************** - * set_input_focus - * -- * Try to force focus for non-managed windows. -+ * Try to force focus for embedded or non-managed windows. - */ --static void set_input_focus( Display *display, Window window ) -+static void set_input_focus( HWND hwnd ) - { - XWindowChanges changes; - DWORD timestamp; -+ struct x11drv_win_data *data; -+ if (!(data = get_win_data( hwnd ))) return; - -- if (!window) return; -+ if (data->whole_window && (data->embedder || !data->managed)) -+ { - -- if (EVENT_x11_time_to_win32_time(0)) -- /* ICCCM says don't use CurrentTime, so try to use last message time if possible */ -- /* FIXME: this is not entirely correct */ -- timestamp = GetMessageTime() - EVENT_x11_time_to_win32_time(0); -- else -- timestamp = CurrentTime; -+ if (EVENT_x11_time_to_win32_time(0)) -+ /* ICCCM says don't use CurrentTime, so try to use last message time if possible */ -+ /* FIXME: this is not entirely correct */ -+ timestamp = GetMessageTime() - EVENT_x11_time_to_win32_time(0); -+ else -+ timestamp = CurrentTime; - -- /* Set X focus and install colormap */ -- changes.stack_mode = Above; -- XConfigureWindow( display, window, CWStackMode, &changes ); -- XSetInputFocus( display, window, RevertToParent, timestamp ); -+ /* Set X focus and install colormap */ -+ changes.stack_mode = Above; -+ XConfigureWindow( data->display, data->whole_window, CWStackMode, &changes ); -+ -+ if (data->embedder) -+ xembed_request_focus( data->display, data->embedder, timestamp ); -+ else -+ XSetInputFocus( data->display, data->whole_window, RevertToParent, timestamp ); -+ -+ } -+ -+ release_win_data( data ); - } - - /********************************************************************** -@@ -904,7 +941,7 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event ) - { - HWND hwndFocus = GetFocus(); - if (hwndFocus && IsChild( hwnd, hwndFocus )) -- set_input_focus( data->display, data->whole_window ); -+ set_input_focus( hwnd ); - } - release_win_data( data ); - } -@@ -1363,12 +1400,8 @@ void wait_for_withdrawn_state( HWND hwnd, BOOL set ) - */ - void CDECL X11DRV_SetFocus( HWND hwnd ) - { -- struct x11drv_win_data *data; -- -- if (!(hwnd = GetAncestor( hwnd, GA_ROOT ))) return; -- if (!(data = get_win_data( hwnd ))) return; -- if (!data->managed) set_input_focus( data->display, data->whole_window ); -- release_win_data( data ); -+ if (!(hwnd = get_ancestor_root_embedded( hwnd ))) return; -+ set_input_focus( hwnd ); - } - - -diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c -index e78f226..ebbfd45 100644 ---- a/dlls/winex11.drv/window.c -+++ b/dlls/winex11.drv/window.c -@@ -1140,6 +1140,22 @@ void make_window_embedded( struct x11drv_win_data *data ) - set_xembed_flags( data, (data->mapped || data->embedder) ? XEMBED_MAPPED : 0 ); - } - -+/*********************************************************************** -+ * get_ancestor_root_embedded -+ */ -+HWND get_ancestor_root_embedded( HWND hwnd ) -+{ -+ HWND parent; -+ if (!hwnd) return NULL; -+ for (;;) -+ { -+ parent = GetAncestor(hwnd, GA_PARENT); -+ if (!parent || parent == GetDesktopWindow() || (Window)GetPropA( parent, foreign_window_prop )) -+ break; -+ hwnd = parent; -+ } -+ return hwnd; -+} - - /*********************************************************************** - * X11DRV_window_to_X_rect -diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h -index 98386ce..71881fe 100644 ---- a/dlls/winex11.drv/x11drv.h -+++ b/dlls/winex11.drv/x11drv.h -@@ -582,6 +582,7 @@ extern Window init_clip_window(void) DECLSPEC_HIDDEN; - extern void update_user_time( Time time ) DECLSPEC_HIDDEN; - extern void update_net_wm_states( struct x11drv_win_data *data ) DECLSPEC_HIDDEN; - extern void make_window_embedded( struct x11drv_win_data *data ) DECLSPEC_HIDDEN; -+extern HWND get_ancestor_root_embedded( HWND hwnd ) DECLSPEC_HIDDEN; - extern Window create_client_window( struct x11drv_win_data *data, const XVisualInfo *visual ) DECLSPEC_HIDDEN; - extern void set_window_visual( struct x11drv_win_data *data, const XVisualInfo *vis ) DECLSPEC_HIDDEN; - extern void change_systray_owner( Display *display, Window systray_window ) DECLSPEC_HIDDEN; --- -1.7.9.5 -