diff --git a/README.md b/README.md index cd98d4cd..7d2d9eda 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,9 @@ Wine. All those differences are also documented on the Included bug fixes and improvements ----------------------------------- -**Bug fixes and features included in the next upcoming release [1]:** +**Bug fixes and features included in the next upcoming release [2]:** +* Globally invalidate key state on changes in other threads ([Wine Bug #29871](https://bugs.winehq.org/show_bug.cgi?id=29871)) * SecuROM 5.x media validation fails ([Wine Bug #21448](https://bugs.winehq.org/show_bug.cgi?id=21448)) diff --git a/debian/changelog b/debian/changelog index c8d74c8f..b0914302 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,7 @@ wine-staging (1.7.46) UNRELEASED; urgency=low * Add reference to upstream bug report for various patchsets. * Added patch to improve IoGetDeviceObjectPointer stub to appease SecuROM 5.x. + * Added patch to globally invalidate key state on changes in other threads. * Removed patch for implementation of GdipCreateRegionRgnData (accepted upstream). * Removed patch to fix output buffer size for IOCTL_DVD_READ_STRUCTURE diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index f8be68bb..ab2c8806 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -237,6 +237,7 @@ patch_enable_all () enable_user32_Dialog_Paint_Event="$1" enable_user32_DrawTextExW="$1" enable_user32_GetSystemMetrics="$1" + enable_user32_Invalidate_Key_State="$1" enable_user32_Mouse_Message_Hwnd="$1" enable_user32_Painting="$1" enable_user32_ScrollWindowEx="$1" @@ -790,6 +791,9 @@ patch_enable () user32-GetSystemMetrics) enable_user32_GetSystemMetrics="$2" ;; + user32-Invalidate_Key_State) + enable_user32_Invalidate_Key_State="$2" + ;; user32-Mouse_Message_Hwnd) enable_user32_Mouse_Message_Hwnd="$2" ;; @@ -4750,6 +4754,21 @@ if test "$enable_user32_GetSystemMetrics" -eq 1; then ) >> "$patchlist" fi +# Patchset user32-Invalidate_Key_State +# | +# | This patchset fixes the following Wine bugs: +# | * [#29871] Globally invalidate key state on changes in other threads +# | +# | Modified files: +# | * dlls/user32/input.c +# | +if test "$enable_user32_Invalidate_Key_State" -eq 1; then + patch_apply user32-Invalidate_Key_State/0001-user32-Globally-invalidate-key-state-on-changes-in-o.patch + ( + echo '+ { "Sebastian Lackner", "user32: Globally invalidate key state on changes in other threads.", 1 },'; + ) >> "$patchlist" +fi + # Patchset user32-Mouse_Message_Hwnd # | # | This patchset fixes the following Wine bugs: @@ -5058,57 +5077,6 @@ if test "$enable_wined3d_CSMT_Helper" -eq 1; then ) >> "$patchlist" fi -# Patchset wined3d-UnhandledBlendFactor -# | -# | Modified files: -# | * dlls/wined3d/state.c -# | -if test "$enable_wined3d_UnhandledBlendFactor" -eq 1; then - patch_apply wined3d-UnhandledBlendFactor/0001-wined3d-Silence-repeated-Unhandled-blend-factor-0-me.patch - ( - echo '+ { "Sebastian Lackner", "wined3d: Silence repeated '\''Unhandled blend factor 0'\'' messages.", 1 },'; - ) >> "$patchlist" -fi - -# Patchset wined3d-wined3d_swapchain_present -# | -# | Modified files: -# | * dlls/wined3d/swapchain.c -# | -if test "$enable_wined3d_wined3d_swapchain_present" -eq 1; then - patch_apply wined3d-wined3d_swapchain_present/0001-wined3d-Silence-repeated-wined3d_swapchain_present-F.patch - ( - echo '+ { "Sebastian Lackner", "wined3d: Silence repeated wined3d_swapchain_present FIXME.", 1 },'; - ) >> "$patchlist" -fi - -# Patchset wined3d-resource_check_usage -# | -# | Modified files: -# | * dlls/wined3d/resource.c -# | -if test "$enable_wined3d_resource_check_usage" -eq 1; then - patch_apply wined3d-resource_check_usage/0001-wined3d-Silence-repeated-resource_check_usage-FIXME.patch - ( - echo '+ { "Erich E. Hoover", "wined3d: Silence repeated resource_check_usage FIXME.", 2 },'; - ) >> "$patchlist" -fi - -# Patchset wined3d-Multisampling -# | -# | This patchset fixes the following Wine bugs: -# | * [#12652] Allow to override number of quality levels for D3DMULTISAMPLE_NONMASKABLE. -# | -# | Modified files: -# | * dlls/wined3d/directx.c, dlls/wined3d/wined3d_main.c, dlls/wined3d/wined3d_private.h -# | -if test "$enable_wined3d_Multisampling" -eq 1; then - patch_apply wined3d-Multisampling/0001-wined3d-Allow-to-specify-multisampling-AA-quality-le.patch - ( - echo '+ { "Austin English", "wined3d: Allow to specify multisampling AA quality levels via registry.", 1 },'; - ) >> "$patchlist" -fi - # Patchset wined3d-Revert_PixelFormat # | # | This patchset fixes the following Wine bugs: @@ -5143,6 +5111,57 @@ if test "$enable_wined3d_Revert_PixelFormat" -eq 1; then ) >> "$patchlist" fi +# Patchset wined3d-resource_check_usage +# | +# | Modified files: +# | * dlls/wined3d/resource.c +# | +if test "$enable_wined3d_resource_check_usage" -eq 1; then + patch_apply wined3d-resource_check_usage/0001-wined3d-Silence-repeated-resource_check_usage-FIXME.patch + ( + echo '+ { "Erich E. Hoover", "wined3d: Silence repeated resource_check_usage FIXME.", 2 },'; + ) >> "$patchlist" +fi + +# Patchset wined3d-UnhandledBlendFactor +# | +# | Modified files: +# | * dlls/wined3d/state.c +# | +if test "$enable_wined3d_UnhandledBlendFactor" -eq 1; then + patch_apply wined3d-UnhandledBlendFactor/0001-wined3d-Silence-repeated-Unhandled-blend-factor-0-me.patch + ( + echo '+ { "Sebastian Lackner", "wined3d: Silence repeated '\''Unhandled blend factor 0'\'' messages.", 1 },'; + ) >> "$patchlist" +fi + +# Patchset wined3d-wined3d_swapchain_present +# | +# | Modified files: +# | * dlls/wined3d/swapchain.c +# | +if test "$enable_wined3d_wined3d_swapchain_present" -eq 1; then + patch_apply wined3d-wined3d_swapchain_present/0001-wined3d-Silence-repeated-wined3d_swapchain_present-F.patch + ( + echo '+ { "Sebastian Lackner", "wined3d: Silence repeated wined3d_swapchain_present FIXME.", 1 },'; + ) >> "$patchlist" +fi + +# Patchset wined3d-Multisampling +# | +# | This patchset fixes the following Wine bugs: +# | * [#12652] Allow to override number of quality levels for D3DMULTISAMPLE_NONMASKABLE. +# | +# | Modified files: +# | * dlls/wined3d/directx.c, dlls/wined3d/wined3d_main.c, dlls/wined3d/wined3d_private.h +# | +if test "$enable_wined3d_Multisampling" -eq 1; then + patch_apply wined3d-Multisampling/0001-wined3d-Allow-to-specify-multisampling-AA-quality-le.patch + ( + echo '+ { "Austin English", "wined3d: Allow to specify multisampling AA quality levels via registry.", 1 },'; + ) >> "$patchlist" +fi + # Patchset wined3d-CSMT_Main # | # | This patchset fixes the following Wine bugs: diff --git a/patches/user32-Invalidate_Key_State/0001-user32-Globally-invalidate-key-state-on-changes-in-o.patch b/patches/user32-Invalidate_Key_State/0001-user32-Globally-invalidate-key-state-on-changes-in-o.patch new file mode 100644 index 00000000..21682f7f --- /dev/null +++ b/patches/user32-Invalidate_Key_State/0001-user32-Globally-invalidate-key-state-on-changes-in-o.patch @@ -0,0 +1,50 @@ +From 6ef2ab6c2318d4fb15220891ce16768e84354a88 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Tue, 16 Jun 2015 02:56:25 +0200 +Subject: user32: Globally invalidate key state on changes in other threads. + +--- + dlls/user32/input.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/dlls/user32/input.c b/dlls/user32/input.c +index 40e35a9..95f3c2f 100644 +--- a/dlls/user32/input.c ++++ b/dlls/user32/input.c +@@ -371,6 +371,7 @@ SHORT WINAPI DECLSPEC_HOTPATCH GetAsyncKeyState( INT key ) + { + struct user_key_state_info *key_state_info = get_user_thread_info()->key_state; + INT counter = global_key_state_counter; ++ BYTE prev_key_state; + SHORT ret; + + if (key < 0 || key >= 256) return 0; +@@ -398,14 +399,23 @@ SHORT WINAPI DECLSPEC_HOTPATCH GetAsyncKeyState( INT key ) + { + req->tid = 0; + req->key = key; +- if (key_state_info) wine_server_set_reply( req, key_state_info->state, +- sizeof(key_state_info->state) ); ++ if (key_state_info) ++ { ++ prev_key_state = key_state_info->state[key]; ++ wine_server_set_reply( req, key_state_info->state, sizeof(key_state_info->state) ); ++ } + if (!wine_server_call( req )) + { + if (reply->state & 0x40) ret |= 0x0001; + if (reply->state & 0x80) ret |= 0x8000; + if (key_state_info) + { ++ /* force refreshing the key state cache - some multithreaded programs ++ * (like Adobe Photoshop CS5) expect that changes to the async key state ++ * are also immediately available in other threads. */ ++ if (prev_key_state != key_state_info->state[key]) ++ counter = interlocked_xchg_add( &global_key_state_counter, 1 ) + 1; ++ + key_state_info->time = GetTickCount(); + key_state_info->counter = counter; + } +-- +2.4.3 + diff --git a/patches/user32-Invalidate_Key_State/definition b/patches/user32-Invalidate_Key_State/definition new file mode 100644 index 00000000..975f6b0e --- /dev/null +++ b/patches/user32-Invalidate_Key_State/definition @@ -0,0 +1 @@ +Fixes: [29871] Globally invalidate key state on changes in other threads