mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-11-21 16:46:54 -08:00
Remove patches recently included in upstream Wine.
This commit is contained in:
parent
ef02629fc5
commit
33161ff40a
@ -1,65 +0,0 @@
|
||||
From 95de7ce5572ff82805bbee85a2af72d0b221371c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
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
|
||||
|
@ -1,122 +0,0 @@
|
||||
From beed64a33606fd3de77f41708f8a2b590521ea51 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
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
|
||||
|
@ -1,247 +0,0 @@
|
||||
From d4a65db7d42bcae783cf5357e4a38a3c27820047 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
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
|
||||
|
@ -1,165 +0,0 @@
|
||||
From 3db647fef4b506c88dfbe028271135945dbaec39 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user