Henri Verbeet : wined3d: Set an A window proc on non-unicode windows.
Alexandre Julliard
julliard at winehq.org
Tue Nov 2 11:11:00 CDT 2010
Module: wine
Branch: master
Commit: b66478dfbcc57e2f9cde12c1e0ae34ffcff12714
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b66478dfbcc57e2f9cde12c1e0ae34ffcff12714
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Tue Nov 2 12:02:47 2010 +0100
wined3d: Set an A window proc on non-unicode windows.
---
dlls/wined3d/device.c | 12 +++++++++---
dlls/wined3d/wined3d_main.c | 26 ++++++++++++++++++++++----
dlls/wined3d/wined3d_private.h | 2 +-
3 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 1416e59..6e78f04 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -6916,14 +6916,17 @@ void get_drawable_size_backbuffer(struct wined3d_context *context, UINT *width,
*height = swapchain->presentParms.BackBufferHeight;
}
-LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window,
+LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window, BOOL unicode,
UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc)
{
if (device->filter_messages)
{
TRACE("Filtering message: window %p, message %#x, wparam %#lx, lparam %#lx.\n",
window, message, wparam, lparam);
- return DefWindowProcW(window, message, wparam, lparam);
+ if (unicode)
+ return DefWindowProcW(window, message, wparam, lparam);
+ else
+ return DefWindowProcA(window, message, wparam, lparam);
}
if (message == WM_DESTROY)
@@ -6935,5 +6938,8 @@ LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window,
else ERR("Window %p is not the focus window for device %p.\n", window, device);
}
- return CallWindowProcW(proc, window, message, wparam, lparam);
+ if (unicode)
+ return CallWindowProcW(proc, window, message, wparam, lparam);
+ else
+ return CallWindowProcA(proc, window, message, wparam, lparam);
}
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 26945ef..0932351 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -32,6 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
struct wined3d_wndproc
{
HWND window;
+ BOOL unicode;
WNDPROC proc;
IWineD3DDeviceImpl *device;
};
@@ -394,6 +395,7 @@ static LRESULT CALLBACK wined3d_wndproc(HWND window, UINT message, WPARAM wparam
{
struct wined3d_wndproc *entry;
IWineD3DDeviceImpl *device;
+ BOOL unicode;
WNDPROC proc;
wined3d_mutex_lock();
@@ -407,10 +409,11 @@ static LRESULT CALLBACK wined3d_wndproc(HWND window, UINT message, WPARAM wparam
}
device = entry->device;
+ unicode = entry->unicode;
proc = entry->proc;
wined3d_mutex_unlock();
- return device_process_message(device, window, message, wparam, lparam, proc);
+ return device_process_message(device, window, unicode, message, wparam, lparam, proc);
}
BOOL wined3d_register_window(HWND window, IWineD3DDeviceImpl *device)
@@ -440,7 +443,14 @@ BOOL wined3d_register_window(HWND window, IWineD3DDeviceImpl *device)
entry = &wndproc_table.entries[wndproc_table.count++];
entry->window = window;
- entry->proc = (WNDPROC)SetWindowLongPtrW(window, GWLP_WNDPROC, (LONG_PTR)wined3d_wndproc);
+ entry->unicode = IsWindowUnicode(window);
+ /* Set a window proc that matches the window. Some applications (e.g. NoX)
+ * replace the window proc after we've set ours, and expect to be able to
+ * call the previous one (ours) directly, without using CallWindowProc(). */
+ if (entry->unicode)
+ entry->proc = (WNDPROC)SetWindowLongPtrW(window, GWLP_WNDPROC, (LONG_PTR)wined3d_wndproc);
+ else
+ entry->proc = (WNDPROC)SetWindowLongPtrA(window, GWLP_WNDPROC, (LONG_PTR)wined3d_wndproc);
entry->device = device;
wined3d_mutex_unlock();
@@ -460,8 +470,16 @@ void wined3d_unregister_window(HWND window)
struct wined3d_wndproc *entry = &wndproc_table.entries[i];
struct wined3d_wndproc *last = &wndproc_table.entries[--wndproc_table.count];
- if (GetWindowLongPtrW(window, GWLP_WNDPROC) == (LONG_PTR)wined3d_wndproc)
- SetWindowLongPtrW(window, GWLP_WNDPROC, (LONG_PTR)entry->proc);
+ if (entry->unicode)
+ {
+ if (GetWindowLongPtrW(window, GWLP_WNDPROC) == (LONG_PTR)wined3d_wndproc)
+ SetWindowLongPtrW(window, GWLP_WNDPROC, (LONG_PTR)entry->proc);
+ }
+ else
+ {
+ if (GetWindowLongPtrA(window, GWLP_WNDPROC) == (LONG_PTR)wined3d_wndproc)
+ SetWindowLongPtrA(window, GWLP_WNDPROC, (LONG_PTR)entry->proc);
+ }
if (entry != last) *entry = *last;
wined3d_mutex_unlock();
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 18da56a..f710d0a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1769,7 +1769,7 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
UINT adapter_idx, WINED3DDEVTYPE device_type, HWND focus_window, DWORD flags,
IWineD3DDeviceParent *device_parent) DECLSPEC_HIDDEN;
void device_preload_textures(IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
-LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window,
+LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window, BOOL unicode,
UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN;
void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN;
void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list