winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
February 2022
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
1495 discussions
Start a n
N
ew thread
Jacek Caban : win32u: Move NtUserGetCursorInfo implementation from user32.
by Alexandre Julliard
24 Feb '22
24 Feb '22
Module: wine Branch: master Commit: 47ca0f49c7fe3d439993a8c7e885bfea4b5bae40 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=47ca0f49c7fe3d439993a8c7…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Feb 24 01:28:18 2022 +0100 win32u: Move NtUserGetCursorInfo implementation from user32. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/input.c | 24 ------------------------ dlls/user32/user32.spec | 2 +- dlls/win32u/gdiobj.c | 1 + dlls/win32u/input.c | 23 +++++++++++++++++++++++ dlls/win32u/win32u.spec | 2 +- dlls/win32u/win32u_private.h | 1 + dlls/win32u/wrappers.c | 6 ++++++ include/ntuser.h | 1 + 8 files changed, 34 insertions(+), 26 deletions(-) diff --git a/dlls/user32/input.c b/dlls/user32/input.c index 781896fd16b..6cf60abeae2 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -307,30 +307,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetCursorPos( POINT *pt ) } -/*********************************************************************** - * GetCursorInfo (USER32.@) - */ -BOOL WINAPI GetCursorInfo( PCURSORINFO pci ) -{ - BOOL ret; - - if (!pci) return FALSE; - - SERVER_START_REQ( get_thread_input ) - { - req->tid = 0; - if ((ret = !wine_server_call( req ))) - { - pci->hCursor = wine_server_ptr_handle( reply->cursor ); - pci->flags = (reply->show_count >= 0) ? CURSOR_SHOWING : 0; - } - } - SERVER_END_REQ; - GetCursorPos(&pci->ptScreenPos); - return ret; -} - - /********************************************************************** * SetCapture (USER32.@) */ diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index 5204852bef5..40044023bf4 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -284,7 +284,7 @@ @ stdcall GetCurrentInputMessageSource(ptr) @ stdcall GetCursor() NtUserGetCursor @ stdcall GetCursorFrameInfo(long long long ptr ptr) -@ stdcall GetCursorInfo(ptr) +@ stdcall GetCursorInfo(ptr) NtUserGetCursorInfo @ stdcall GetCursorPos(ptr) @ stdcall GetDC(long) @ stdcall GetDCEx(long long long) diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index 2ac40d71e3c..1d54865bf46 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -1162,6 +1162,7 @@ static struct unix_funcs unix_funcs = NtUserEnumDisplayMonitors, NtUserEnumDisplaySettings, NtUserGetAsyncKeyState, + NtUserGetCursorInfo, NtUserGetDisplayConfigBufferSizes, NtUserGetIconInfo, NtUserGetKeyNameText, diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index f8f4d41ad2c..72af32fd471 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -131,6 +131,29 @@ BOOL get_cursor_pos( POINT *pt ) return ret; } +/*********************************************************************** + * NtUserGetCursorInfo (win32u.@) + */ +BOOL WINAPI NtUserGetCursorInfo( CURSORINFO *info ) +{ + BOOL ret; + + if (!info) return FALSE; + + SERVER_START_REQ( get_thread_input ) + { + req->tid = 0; + if ((ret = !wine_server_call( req ))) + { + info->hCursor = wine_server_ptr_handle( reply->cursor ); + info->flags = reply->show_count >= 0 ? CURSOR_SHOWING : 0; + } + } + SERVER_END_REQ; + get_cursor_pos( &info->ptScreenPos ); + return ret; +} + static void check_for_events( UINT flags ) { if (user_driver->pMsgWaitForMultipleObjectsEx( 0, NULL, 0, flags, 0 ) == WAIT_TIMEOUT) diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 4a743c7d37e..c1dca3d425c 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -914,7 +914,7 @@ @ stub NtUserGetCurrentInputMessageSource @ stdcall -syscall NtUserGetCursor() @ stdcall -syscall NtUserGetCursorFrameInfo(long long ptr ptr) -@ stub NtUserGetCursorInfo +@ stdcall NtUserGetCursorInfo(ptr) @ stub NtUserGetDC @ stub NtUserGetDCEx @ stub NtUserGetDManipHookInitFunction diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 9b94387be79..002524a18f4 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -199,6 +199,7 @@ struct unix_funcs BOOL (WINAPI *pNtUserEnumDisplaySettings)( UNICODE_STRING *device, DWORD mode, DEVMODEW *dev_mode, DWORD flags ); SHORT (WINAPI *pNtUserGetAsyncKeyState)( INT key ); + BOOL (WINAPI *pNtUserGetCursorInfo)( CURSORINFO *info ); LONG (WINAPI *pNtUserGetDisplayConfigBufferSizes)( UINT32 flags, UINT32 *num_path_info, UINT32 *num_mode_info ); BOOL (WINAPI *pNtUserGetIconInfo)( HICON icon, ICONINFO *info, UNICODE_STRING *module, diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c index 8d57fc20036..ca69422f086 100644 --- a/dlls/win32u/wrappers.c +++ b/dlls/win32u/wrappers.c @@ -777,6 +777,12 @@ SHORT WINAPI NtUserGetAsyncKeyState( INT key ) return unix_funcs->pNtUserGetAsyncKeyState( key ); } +BOOL WINAPI NtUserGetCursorInfo( CURSORINFO *info ) +{ + if (!unix_funcs) return FALSE; + return unix_funcs->pNtUserGetCursorInfo( info ); +} + LONG WINAPI NtUserGetDisplayConfigBufferSizes( UINT32 flags, UINT32 *num_path_info, UINT32 *num_mode_info ) { diff --git a/include/ntuser.h b/include/ntuser.h index fdc33ce7e70..8730c739b11 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -205,6 +205,7 @@ HWND WINAPI NtUserGetClipboardViewer(void); HCURSOR WINAPI NtUserGetCursor(void); HCURSOR WINAPI NtUserGetCursorFrameInfo( HCURSOR hCursor, DWORD istep, DWORD *rate_jiffies, DWORD *num_steps ); +BOOL WINAPI NtUserGetCursorInfo( CURSORINFO *info ); LONG WINAPI NtUserGetDisplayConfigBufferSizes( UINT32 flags, UINT32 *num_path_info, UINT32 *num_mode_info ); UINT WINAPI NtUserGetDoubleClickTime(void);
1
0
0
0
Jacek Caban : win32u: Move NtUserRegisterHotKey implementation from user32.
by Alexandre Julliard
24 Feb '22
24 Feb '22
Module: wine Branch: master Commit: e560357df12fc42957504ffb5b6cbe13cded197e URL:
https://source.winehq.org/git/wine.git/?a=commit;h=e560357df12fc42957504ffb…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Feb 24 01:27:57 2022 +0100 win32u: Move NtUserRegisterHotKey implementation from user32. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/driver.c | 25 ++------------------ dlls/user32/input.c | 35 --------------------------- dlls/user32/user32.spec | 2 +- dlls/user32/win.h | 3 --- dlls/win32u/driver.c | 6 +++++ dlls/win32u/gdiobj.c | 1 + dlls/win32u/input.c | 35 +++++++++++++++++++++++++++ dlls/win32u/ntuser_private.h | 3 +++ dlls/win32u/win32u.spec | 2 +- dlls/win32u/win32u_private.h | 15 +++++++++--- dlls/win32u/window.c | 56 ++++++++++++++++++++++++++++++++++++++++++++ dlls/win32u/wrappers.c | 6 +++++ include/ntuser.h | 1 + 13 files changed, 124 insertions(+), 66 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=e560357df12fc4295750…
1
0
0
0
Jacek Caban : win32u: Move get_icon_param and set_icon_param from user32.
by Alexandre Julliard
24 Feb '22
24 Feb '22
Module: wine Branch: master Commit: 439fb2519091c282094d484ecdae98959fe26142 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=439fb2519091c282094d484e…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Feb 24 01:27:36 2022 +0100 win32u: Move get_icon_param and set_icon_param from user32. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/cursoricon.c | 23 ++----------------- dlls/win32u/cursoricon.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ dlls/win32u/ntuser_private.h | 24 -------------------- dlls/win32u/sysparams.c | 4 ++++ dlls/win32u/win32u_private.h | 2 ++ include/ntuser.h | 2 ++ 6 files changed, 63 insertions(+), 45 deletions(-) diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c index d0aaceb14a0..cab9fbde32e 100644 --- a/dlls/user32/cursoricon.c +++ b/dlls/user32/cursoricon.c @@ -81,31 +81,12 @@ static void free_icon_frame( struct cursoricon_frame *frame ) ULONG_PTR get_icon_param( HICON handle ) { - ULONG_PTR ret = 0; - struct cursoricon_object *obj = get_user_handle_ptr( handle, NTUSER_OBJ_ICON ); - - if (obj == OBJ_OTHER_PROCESS) WARN( "icon handle %p from other process\n", handle ); - else if (obj) - { - ret = obj->param; - release_user_handle_ptr( obj ); - } - return ret; + return NtUserCallOneParam( HandleToUlong(handle), NtUserGetIconParam ); } ULONG_PTR set_icon_param( HICON handle, ULONG_PTR param ) { - ULONG_PTR ret = 0; - struct cursoricon_object *obj = get_user_handle_ptr( handle, NTUSER_OBJ_ICON ); - - if (obj == OBJ_OTHER_PROCESS) WARN( "icon handle %p from other process\n", handle ); - else if (obj) - { - ret = obj->param; - obj->param = param; - release_user_handle_ptr( obj ); - } - return ret; + return NtUserCallTwoParam( HandleToUlong(handle), param, NtUserSetIconParam ); } diff --git a/dlls/win32u/cursoricon.c b/dlls/win32u/cursoricon.c index e2c121d6c1e..0249eb3da50 100644 --- a/dlls/win32u/cursoricon.c +++ b/dlls/win32u/cursoricon.c @@ -37,6 +37,30 @@ WINE_DEFAULT_DEBUG_CHANNEL(cursor); WINE_DECLARE_DEBUG_CHANNEL(icon); +struct cursoricon_object +{ + struct user_object obj; /* object header */ + struct list entry; /* entry in shared icons list */ + ULONG_PTR param; /* opaque param used by 16-bit code */ + UNICODE_STRING module; /* module for icons loaded from resources */ + WCHAR *resname; /* resource name for icons loaded from resources */ + HRSRC rsrc; /* resource for shared icons */ + BOOL is_shared; /* whether this object is shared */ + BOOL is_icon; /* whether icon or cursor */ + BOOL is_ani; /* whether this object is a static cursor or an animated cursor */ + UINT delay; /* delay between this frame and the next (in jiffies) */ + union + { + struct cursoricon_frame frame; /* frame-specific icon data */ + struct + { + UINT num_frames; /* number of frames in the icon/cursor */ + UINT num_steps; /* number of sequence steps in the icon/cursor */ + HICON *frames; /* list of animated cursor frames */ + } ani; + }; +}; + static struct list icon_cache = LIST_INIT( icon_cache ); static struct cursoricon_object *get_icon_ptr( HICON handle ) @@ -733,3 +757,32 @@ failed: release_user_handle_ptr( obj ); return result; } + +ULONG_PTR get_icon_param( HICON handle ) +{ + ULONG_PTR ret = 0; + struct cursoricon_object *obj = get_user_handle_ptr( handle, NTUSER_OBJ_ICON ); + + if (obj == OBJ_OTHER_PROCESS) WARN( "icon handle %p from other process\n", handle ); + else if (obj) + { + ret = obj->param; + release_user_handle_ptr( obj ); + } + return ret; +} + +ULONG_PTR set_icon_param( HICON handle, ULONG_PTR param ) +{ + ULONG_PTR ret = 0; + struct cursoricon_object *obj = get_user_handle_ptr( handle, NTUSER_OBJ_ICON ); + + if (obj == OBJ_OTHER_PROCESS) WARN( "icon handle %p from other process\n", handle ); + else if (obj) + { + ret = obj->param; + obj->param = param; + release_user_handle_ptr( obj ); + } + return ret; +} diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h index db1a08ff102..f79930ba229 100644 --- a/dlls/win32u/ntuser_private.h +++ b/dlls/win32u/ntuser_private.h @@ -125,30 +125,6 @@ struct user_key_state_info BYTE state[256]; /* State for each key */ }; -struct cursoricon_object -{ - struct user_object obj; /* object header */ - struct list entry; /* entry in shared icons list */ - ULONG_PTR param; /* opaque param used by 16-bit code */ - UNICODE_STRING module; /* module for icons loaded from resources */ - LPWSTR resname; /* resource name for icons loaded from resources */ - HRSRC rsrc; /* resource for shared icons */ - BOOL is_shared; /* whether this object is shared */ - BOOL is_icon; /* whether icon or cursor */ - BOOL is_ani; /* whether this object is a static cursor or an animated cursor */ - UINT delay; /* delay between this frame and the next (in jiffies) */ - union - { - struct cursoricon_frame frame; /* frame-specific icon data */ - struct - { - UINT num_frames; /* number of frames in the icon/cursor */ - UINT num_steps; /* number of sequence steps in the icon/cursor */ - HICON *frames; /* list of animated cursor frames */ - } ani; - }; -}; - /* cursoricon.c */ HICON alloc_cursoricon_handle( BOOL is_icon ) DECLSPEC_HIDDEN; diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 70d310646ef..4eaaceb2892 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -4558,6 +4558,8 @@ ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code ) return get_clip_cursor( (RECT *)arg ); case NtUserGetCursorPos: return get_cursor_pos( (POINT *)arg ); + case NtUserGetIconParam: + return get_icon_param( UlongToHandle(arg) ); case NtUserGetSysColor: return get_sys_color( arg ); case NtUserRealizePalette: @@ -4616,6 +4618,8 @@ ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code return mirror_window_region( UlongToHandle(arg1), UlongToHandle(arg2) ); case NtUserMonitorFromRect: return HandleToUlong( monitor_from_rect( (const RECT *)arg1, arg2, get_thread_dpi() )); + case NtUserSetIconParam: + return set_icon_param( UlongToHandle(arg1), arg2 ); case NtUserUnhookWindowsHook: return unhook_windows_hook( arg1, (HOOKPROC)arg2 ); /* temporary exports */ diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 9ff6d3143db..64712a66e12 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -247,6 +247,8 @@ struct unix_funcs /* cursoricon.c */ extern HICON alloc_cursoricon_handle( BOOL is_icon ) DECLSPEC_HIDDEN; extern BOOL get_clip_cursor( RECT *rect ) DECLSPEC_HIDDEN; +extern ULONG_PTR get_icon_param( HICON handle ) DECLSPEC_HIDDEN; +extern ULONG_PTR set_icon_param( HICON handle, ULONG_PTR param ) DECLSPEC_HIDDEN; /* hook.c */ extern BOOL unhook_windows_hook( INT id, HOOKPROC proc ) DECLSPEC_HIDDEN; diff --git a/include/ntuser.h b/include/ntuser.h index ecefd2d68cb..a4184c944d4 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -80,6 +80,7 @@ enum NtUserCreateCursorIcon, NtUserGetClipCursor, NtUserGetCursorPos, + NtUserGetIconParam, NtUserGetPrimaryMonitorRect, NtUserGetSysColor, NtUserGetSysColorBrush, @@ -104,6 +105,7 @@ enum NtUserGetSystemMetricsForDpi, NtUserMirrorRgn, NtUserMonitorFromRect, + NtUserSetIconParam, NtUserUnhookWindowsHook, /* temporary exports */ NtUserAllocHandle,
1
0
0
0
Jacek Caban : user32: Don't access cursoricon_object directly in CopyImage.
by Alexandre Julliard
24 Feb '22
24 Feb '22
Module: wine Branch: master Commit: 4f3f1c985adff0332fd6a34962da530922fd655d URL:
https://source.winehq.org/git/wine.git/?a=commit;h=4f3f1c985adff0332fd6a349…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Feb 24 01:27:24 2022 +0100 user32: Don't access cursoricon_object directly in CopyImage. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/cursoricon.c | 110 ++++++++++++++++++----------------------------- 1 file changed, 41 insertions(+), 69 deletions(-) diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c index 509a5c3f4ed..d0aaceb14a0 100644 --- a/dlls/user32/cursoricon.c +++ b/dlls/user32/cursoricon.c @@ -72,37 +72,6 @@ static int get_display_bpp(void) return ret; } -static struct cursoricon_object *get_icon_ptr( HICON handle ) -{ - struct cursoricon_object *obj = get_user_handle_ptr( handle, NTUSER_OBJ_ICON ); - if (obj == OBJ_OTHER_PROCESS) - { - WARN( "icon handle %p from other process\n", handle ); - obj = NULL; - } - return obj; -} - -static struct cursoricon_frame *get_icon_frame( struct cursoricon_object *obj, int istep ) -{ - struct cursoricon_object *req_frame; - - if (!obj->is_ani) return &obj->frame; - if (!(req_frame = get_icon_ptr( obj->ani.frames[istep] ))) return 0; - return &req_frame->frame; -} - -static void release_icon_frame( struct cursoricon_object *obj, struct cursoricon_frame *frame ) -{ - if (obj->is_ani) - { - struct cursoricon_object *frameobj; - - frameobj = (struct cursoricon_object *) (((char *)frame) - FIELD_OFFSET(struct cursoricon_object, frame)); - release_user_handle_ptr( frameobj ); - } -} - static void free_icon_frame( struct cursoricon_frame *frame ) { if (frame->color) DeleteObject( frame->color ); @@ -2481,29 +2450,31 @@ HANDLE WINAPI CopyImage( HANDLE hnd, UINT type, INT desiredx, case IMAGE_ICON: case IMAGE_CURSOR: { - struct cursoricon_frame *frame; - struct cursoricon_object *icon; + ICONINFOEXW icon_info; int depth = (flags & LR_MONOCHROME) ? 1 : get_display_bpp(); - HICON resource_icon = NULL; - HINSTANCE module; + HICON resource_icon = 0; + LONG width, height; ICONINFO info; + HANDLE module; HICON res; - if (!(icon = get_icon_ptr( hnd ))) return 0; + icon_info.cbSize = sizeof(icon_info); + if (!GetIconInfoExW( hnd, &icon_info )) return 0; - if (icon->rsrc && (flags & LR_COPYFROMRESOURCE) && icon->module.Length && - !LdrGetDllHandle( NULL, 0, &icon->module, &module )) + if (icon_info.szModName[0] && (flags & LR_COPYFROMRESOURCE) && + (module = GetModuleHandleW( icon_info.szModName ))) { - resource_icon = CURSORICON_Load( module, icon->resname, desiredx, - desiredy, depth, !icon->is_icon, flags ); - release_user_handle_ptr( icon ); - if (!(icon = get_icon_ptr( resource_icon ))) - { - if (resource_icon) DestroyIcon( resource_icon ); - return 0; - } + const WCHAR *res = icon_info.szResName[0] ? icon_info.szResName + : MAKEINTRESOURCEW( icon_info.wResID ); + resource_icon = CURSORICON_Load( module, res, desiredx, desiredy, depth, + !icon_info.fIcon, flags ); + DeleteObject( icon_info.hbmColor ); + DeleteObject( icon_info.hbmMask ); + NtUserGetIconSize( resource_icon, 0, &width, &height ); + if (!GetIconInfoExW( resource_icon, &icon_info )) return 0; } - frame = get_icon_frame( icon, 0 ); + else NtUserGetIconSize( hnd, 0, &width, &height ); + height /= 2; if (flags & LR_DEFAULTSIZE) { @@ -2512,44 +2483,44 @@ HANDLE WINAPI CopyImage( HANDLE hnd, UINT type, INT desiredx, } else { - if (!desiredx) desiredx = frame->width; - if (!desiredy) desiredy = frame->height; + if (!desiredx) desiredx = width; + if (!desiredy) desiredy = height; } - info.fIcon = icon->is_icon; - info.xHotspot = frame->hotspot.x; - info.yHotspot = frame->hotspot.y; + info.fIcon = icon_info.fIcon; + info.xHotspot = icon_info.xHotspot; + info.yHotspot = icon_info.yHotspot; - if (desiredx == frame->width && desiredy == frame->height) + if (desiredx == width && desiredy == height) { - info.hbmColor = frame->color; - info.hbmMask = frame->mask; + info.hbmColor = icon_info.hbmColor; + info.hbmMask = icon_info.hbmMask; res = CreateIconIndirect( &info ); } else { - if (frame->color) + if (icon_info.hbmColor) { if (!(info.hbmColor = create_color_bitmap( desiredx, desiredy ))) { - release_icon_frame( icon, frame ); - release_user_handle_ptr( icon ); + DeleteObject( icon_info.hbmColor ); + DeleteObject( icon_info.hbmMask ); if (resource_icon) DestroyIcon( resource_icon ); return 0; } - stretch_bitmap( info.hbmColor, frame->color, desiredx, desiredy, - frame->width, frame->height ); + stretch_bitmap( info.hbmColor, icon_info.hbmColor, desiredx, desiredy, + width, height ); if (!(info.hbmMask = CreateBitmap( desiredx, desiredy, 1, 1, NULL ))) { + DeleteObject( icon_info.hbmColor ); + DeleteObject( icon_info.hbmMask ); DeleteObject( info.hbmColor ); - release_icon_frame( icon, frame ); - release_user_handle_ptr( icon ); if (resource_icon) DestroyIcon( resource_icon ); return 0; } - stretch_bitmap( info.hbmMask, frame->mask, desiredx, desiredy, - frame->width, frame->height ); + stretch_bitmap( info.hbmMask, icon_info.hbmMask, desiredx, desiredy, + width, height ); } else { @@ -2557,12 +2528,13 @@ HANDLE WINAPI CopyImage( HANDLE hnd, UINT type, INT desiredx, if (!(info.hbmMask = CreateBitmap( desiredx, desiredy * 2, 1, 1, NULL ))) { - release_user_handle_ptr( icon ); + DeleteObject( icon_info.hbmColor ); + DeleteObject( icon_info.hbmMask ); if (resource_icon) DestroyIcon( resource_icon ); return 0; } - stretch_bitmap( info.hbmMask, frame->mask, desiredx, desiredy * 2, - frame->width, frame->height * 2 ); + stretch_bitmap( info.hbmMask, icon_info.hbmMask, desiredx, desiredy * 2, + width, height * 2 ); } res = CreateIconIndirect( &info ); @@ -2571,8 +2543,8 @@ HANDLE WINAPI CopyImage( HANDLE hnd, UINT type, INT desiredx, DeleteObject( info.hbmMask ); } - release_icon_frame( icon, frame ); - release_user_handle_ptr( icon ); + DeleteObject( icon_info.hbmColor ); + DeleteObject( icon_info.hbmMask ); if (res && (flags & LR_COPYDELETEORG)) DestroyIcon( hnd ); if (resource_icon) DestroyIcon( resource_icon );
1
0
0
0
Alexandre Julliard : include: Add a few locale definitions.
by Alexandre Julliard
24 Feb '22
24 Feb '22
Module: wine Branch: master Commit: 0fef0daa9cc4f13d7d43a98d7738ef8eaeb2e4f5 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=0fef0daa9cc4f13d7d43a98d…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Feb 24 18:36:01 2022 +0100 include: Add a few locale definitions. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- include/winnls.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/winnls.h b/include/winnls.h index 4b1323cc694..80066b3b897 100644 --- a/include/winnls.h +++ b/include/winnls.h @@ -316,6 +316,9 @@ extern "C" { #define LOCALE_SSHORTTIME 0x0079 #define LOCALE_SOPENTYPELANGUAGETAG 0X007A #define LOCALE_SSORTLOCALE 0x007B +#define LOCALE_SRELATIVELONGDATE 0x007C +#define LOCALE_SSHORTESTAM 0x007E +#define LOCALE_SSHORTESTPM 0x007F #define LOCALE_IDEFAULTEBCDICCODEPAGE 0x1012 #define LOCALE_IPAPERSIZE 0x100A @@ -538,6 +541,9 @@ static const WCHAR LOCALE_NAME_SYSTEM_DEFAULT[] = {'!','s','y','s','-','d','e',' #define CAL_SSHORTESTDAYNAME7 0x37 #define CAL_SMONTHDAY 0x38 #define CAL_SABBREVERASTRING 0x39 +#define CAL_SRELATIVELONGDATE 0x3a +#define CAL_SENGLISHERANAME 0x3b +#define CAL_SENGLISHABBREVERANAME 0x3c /* Calendar types */ #define CAL_GREGORIAN 1
1
0
0
0
Zebediah Figura : winegstreamer: Flatten wg_parser_event into a wg_parser_buffer structure.
by Alexandre Julliard
24 Feb '22
24 Feb '22
Module: wine Branch: master Commit: a4be9e85687f7a8d7476ee3d3ced80eeec720f57 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=a4be9e85687f7a8d7476ee3d…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Wed Feb 23 15:46:50 2022 -0600 winegstreamer: Flatten wg_parser_event into a wg_parser_buffer structure. Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winegstreamer/gst_private.h | 2 +- dlls/winegstreamer/main.c | 8 +++--- dlls/winegstreamer/media_source.c | 18 ++++++------- dlls/winegstreamer/quartz_parser.c | 38 +++++++++++++-------------- dlls/winegstreamer/unixlib.h | 31 +++++++--------------- dlls/winegstreamer/wg_parser.c | 54 +++++++++++++++++--------------------- dlls/winegstreamer/wm_reader.c | 38 +++++++++++++-------------- 7 files changed, 84 insertions(+), 105 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=a4be9e85687f7a8d7476…
1
0
0
0
Zebediah Figura : winegstreamer: Get rid of the queue_stream_event() helper.
by Alexandre Julliard
24 Feb '22
24 Feb '22
Module: wine Branch: master Commit: 0c59cfc14e33a5706c1873151780d5b2dcc536ca URL:
https://source.winehq.org/git/wine.git/?a=commit;h=0c59cfc14e33a5706c187315…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Wed Feb 23 15:46:49 2022 -0600 winegstreamer: Get rid of the queue_stream_event() helper. Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winegstreamer/wg_parser.c | 76 +++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index 3cdeeeb5374..e114a19a26b 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -415,43 +415,6 @@ static void no_more_pads_cb(GstElement *element, gpointer user) pthread_cond_signal(&parser->init_cond); } -static GstFlowReturn queue_stream_event(struct wg_parser_stream *stream, - const struct wg_parser_event *event, GstBuffer *buffer) -{ - struct wg_parser *parser = stream->parser; - - /* Unlike request_buffer_src() [q.v.], we need to watch for GStreamer - * flushes here. The difference is that we can be blocked by the streaming - * thread not running (or itself flushing on the DirectShow side). - * request_buffer_src() can only be blocked by the upstream source, and that - * is solved by flushing the upstream source. */ - - pthread_mutex_lock(&parser->mutex); - while (!stream->flushing && stream->event.type != WG_PARSER_EVENT_NONE) - pthread_cond_wait(&stream->event_empty_cond, &parser->mutex); - if (stream->flushing) - { - pthread_mutex_unlock(&parser->mutex); - GST_DEBUG("Filter is flushing; discarding event."); - return GST_FLOW_FLUSHING; - } - - assert(GST_IS_BUFFER(buffer)); - if (!gst_buffer_map(buffer, &stream->map_info, GST_MAP_READ)) - { - pthread_mutex_unlock(&parser->mutex); - GST_ERROR("Failed to map buffer.\n"); - return GST_FLOW_ERROR; - } - - stream->event = *event; - stream->buffer = buffer; - pthread_mutex_unlock(&parser->mutex); - pthread_cond_signal(&stream->event_cond); - GST_LOG("Event queued."); - return GST_FLOW_OK; -} - static gboolean sink_event_cb(GstPad *pad, GstObject *parent, GstEvent *event) { struct wg_parser_stream *stream = gst_pad_get_element_private(pad); @@ -550,8 +513,8 @@ static gboolean sink_event_cb(GstPad *pad, GstObject *parent, GstEvent *event) static GstFlowReturn sink_chain_cb(GstPad *pad, GstObject *parent, GstBuffer *buffer) { struct wg_parser_stream *stream = gst_pad_get_element_private(pad); + struct wg_parser *parser = stream->parser; struct wg_parser_event stream_event; - GstFlowReturn ret; GST_LOG("stream %p, buffer %p.", stream, buffer); @@ -576,10 +539,41 @@ static GstFlowReturn sink_chain_cb(GstPad *pad, GstObject *parent, GstBuffer *bu stream_event.u.buffer.delta = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT); stream_event.u.buffer.size = gst_buffer_get_size(buffer); - /* Transfer our reference to the buffer to the stream object. */ - if ((ret = queue_stream_event(stream, &stream_event, buffer)) != GST_FLOW_OK) + /* Allow this buffer to be flushed by GStreamer. We are effectively + * implementing a queue object here. */ + + pthread_mutex_lock(&parser->mutex); + + while (!stream->flushing && stream->event.type != WG_PARSER_EVENT_NONE) + pthread_cond_wait(&stream->event_empty_cond, &parser->mutex); + if (stream->flushing) + { + pthread_mutex_unlock(&parser->mutex); + GST_DEBUG("Stream is flushing; discarding buffer."); gst_buffer_unref(buffer); - return ret; + return GST_FLOW_FLUSHING; + } + + if (!gst_buffer_map(buffer, &stream->map_info, GST_MAP_READ)) + { + pthread_mutex_unlock(&parser->mutex); + GST_ERROR("Failed to map buffer.\n"); + gst_buffer_unref(buffer); + return GST_FLOW_ERROR; + } + + stream->event = stream_event; + stream->buffer = buffer; + + pthread_mutex_unlock(&parser->mutex); + pthread_cond_signal(&stream->event_cond); + + /* The chain callback is given a reference to the buffer. Transfer that + * reference to the stream object, which will release it in + * wg_parser_stream_release_buffer(). */ + + GST_LOG("Buffer queued."); + return GST_FLOW_OK; } static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query)
1
0
0
0
Zebediah Figura : winegstreamer: Return S_FALSE from wg_parser_stream_get_event() if the stream is EOS.
by Alexandre Julliard
24 Feb '22
24 Feb '22
Module: wine Branch: master Commit: 28c9c138d2658a4c3252a94d45a1e8b7ac28be7f URL:
https://source.winehq.org/git/wine.git/?a=commit;h=28c9c138d2658a4c3252a94d…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Wed Feb 23 15:46:48 2022 -0600 winegstreamer: Return S_FALSE from wg_parser_stream_get_event() if the stream is EOS. Instead of using WG_PARSER_EVENT_EOS. Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winegstreamer/gst_private.h | 2 +- dlls/winegstreamer/main.c | 4 +- dlls/winegstreamer/media_source.c | 30 ++----- dlls/winegstreamer/quartz_parser.c | 26 +++--- dlls/winegstreamer/unixlib.h | 1 - dlls/winegstreamer/wg_parser.c | 56 ++++++------- dlls/winegstreamer/wm_reader.c | 164 +++++++++++++++++-------------------- 7 files changed, 120 insertions(+), 163 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=28c9c138d2658a4c3252…
1
0
0
0
Zebediah Figura : winegstreamer: Remove support for flushing the wg_parser object.
by Alexandre Julliard
24 Feb '22
24 Feb '22
Module: wine Branch: master Commit: 5144b27661fcd6705353d832e0383085f8afe842 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=5144b27661fcd6705353d832…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Wed Feb 23 15:46:47 2022 -0600 winegstreamer: Remove support for flushing the wg_parser object. Aside from EOS logic, which is now handled entirely on the client side, wg_parser_stream_get_event() now only waits for data processing—that is, demuxing, decoding, and format conversion. While unblocking waits in wg_parser_stream_get_event() does allow that function to return immediately, a subsequent seek request in GStreamer will still have to wait for that data processing to complete and for the stream thread to return to the demuxer's main loop. In essence, wg_parser_begin_flush() is only moving costs around. In theory we could force the GStreamer pipeline to complete faster by actually flushing it. In practice this isn't really true. Individual elements do check whether they are flushing before processing, but even elements which take a relatively long time (i.e. multiple milliseconds) to process data don't periodically check whether they are flushing while doing so. Although there is arguably a benefit to skipping some elements by flushing the GStreamer pipeline, it does not seem worth the added code complexity in Wine. The real point of flushing in DirectShow or GStreamer is to unblock long or unbounded waits in sink elements (i.e. waits for PTS, or waits for running state while rendering preroll frames). None of these waits apply here. Waits for actual sample processing complete in bounded time, and should ideally take less than the sample DTS to complete (or we are already in trouble). Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winegstreamer/gst_private.h | 5 +---- dlls/winegstreamer/main.c | 14 ++---------- dlls/winegstreamer/media_source.c | 6 +----- dlls/winegstreamer/quartz_parser.c | 12 +---------- dlls/winegstreamer/unixlib.h | 3 --- dlls/winegstreamer/wg_parser.c | 44 ++------------------------------------ dlls/winegstreamer/wm_reader.c | 7 +----- 7 files changed, 8 insertions(+), 83 deletions(-) diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index a63daaf04b9..288d127b23b 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -70,9 +70,6 @@ void wg_parser_destroy(struct wg_parser *parser); HRESULT wg_parser_connect(struct wg_parser *parser, uint64_t file_size); void wg_parser_disconnect(struct wg_parser *parser); -void wg_parser_begin_flush(struct wg_parser *parser); -void wg_parser_end_flush(struct wg_parser *parser); - bool wg_parser_get_next_read_offset(struct wg_parser *parser, uint64_t *offset, uint32_t *size); void wg_parser_push_data(struct wg_parser *parser, const void *data, uint32_t size); @@ -83,7 +80,7 @@ void wg_parser_stream_get_preferred_format(struct wg_parser_stream *stream, stru void wg_parser_stream_enable(struct wg_parser_stream *stream, const struct wg_format *format); void wg_parser_stream_disable(struct wg_parser_stream *stream); -bool wg_parser_stream_get_event(struct wg_parser_stream *stream, struct wg_parser_event *event); +void wg_parser_stream_get_event(struct wg_parser_stream *stream, struct wg_parser_event *event); bool wg_parser_stream_copy_buffer(struct wg_parser_stream *stream, void *data, uint32_t offset, uint32_t size); void wg_parser_stream_release_buffer(struct wg_parser_stream *stream); diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c index f85e9995525..13db07c6edb 100644 --- a/dlls/winegstreamer/main.c +++ b/dlls/winegstreamer/main.c @@ -96,16 +96,6 @@ void wg_parser_disconnect(struct wg_parser *parser) __wine_unix_call(unix_handle, unix_wg_parser_disconnect, parser); } -void wg_parser_begin_flush(struct wg_parser *parser) -{ - __wine_unix_call(unix_handle, unix_wg_parser_begin_flush, parser); -} - -void wg_parser_end_flush(struct wg_parser *parser) -{ - __wine_unix_call(unix_handle, unix_wg_parser_end_flush, parser); -} - bool wg_parser_get_next_read_offset(struct wg_parser *parser, uint64_t *offset, uint32_t *size) { struct wg_parser_get_next_read_offset_params params = @@ -182,7 +172,7 @@ void wg_parser_stream_disable(struct wg_parser_stream *stream) __wine_unix_call(unix_handle, unix_wg_parser_stream_disable, stream); } -bool wg_parser_stream_get_event(struct wg_parser_stream *stream, struct wg_parser_event *event) +void wg_parser_stream_get_event(struct wg_parser_stream *stream, struct wg_parser_event *event) { struct wg_parser_stream_get_event_params params = { @@ -190,7 +180,7 @@ bool wg_parser_stream_get_event(struct wg_parser_stream *stream, struct wg_parse .event = event, }; - return !__wine_unix_call(unix_handle, unix_wg_parser_stream_get_event, ¶ms); + __wine_unix_call(unix_handle, unix_wg_parser_stream_get_event, ¶ms); } bool wg_parser_stream_copy_buffer(struct wg_parser_stream *stream, diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index 32006964f3b..694497da259 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -388,7 +388,6 @@ static void start_pipeline(struct media_source *source, struct source_async_comm if (position->vt == VT_I8) wg_parser_stream_seek(source->streams[0]->wg_stream, 1.0, position->hVal.QuadPart, 0, AM_SEEKING_AbsolutePositioning, AM_SEEKING_NoPositioning); - wg_parser_end_flush(source->wg_parser); for (i = 0; i < source->stream_count; i++) flush_token_queue(source->streams[i], position->vt == VT_EMPTY); @@ -416,8 +415,6 @@ static void stop_pipeline(struct media_source *source) { unsigned int i; - wg_parser_begin_flush(source->wg_parser); - for (i = 0; i < source->stream_count; i++) { struct media_stream *stream = source->streams[i]; @@ -543,8 +540,7 @@ static void wait_on_sample(struct media_stream *stream, IUnknown *token) for (;;) { - if (!wg_parser_stream_get_event(stream->wg_stream, &event)) - return; + wg_parser_stream_get_event(stream->wg_stream, &event); TRACE("Got event of type %#x.\n", event.type); diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index 30afd0874ea..628758b838b 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -833,11 +833,7 @@ static DWORD CALLBACK stream_thread(void *arg) continue; } - if (!wg_parser_stream_get_event(pin->wg_stream, &event)) - { - LeaveCriticalSection(&pin->flushing_cs); - continue; - } + wg_parser_stream_get_event(pin->wg_stream, &event); TRACE("Got event of type %#x.\n", event.type); @@ -971,7 +967,6 @@ static HRESULT parser_init_stream(struct strmbase_filter *iface) return S_OK; filter->streaming = true; - wg_parser_end_flush(filter->wg_parser); /* DirectShow retains the old seek positions, but resets to them every time * it transitions from stopped -> paused. */ @@ -1011,7 +1006,6 @@ static HRESULT parser_cleanup_stream(struct strmbase_filter *iface) return S_OK; filter->streaming = false; - wg_parser_begin_flush(filter->wg_parser); for (i = 0; i < filter->source_count; ++i) { @@ -1336,8 +1330,6 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface, if (!(current_flags & AM_SEEKING_NoFlush)) { - wg_parser_begin_flush(filter->wg_parser); - for (i = 0; i < filter->source_count; ++i) { if (filter->sources[i]->pin.pin.peer) @@ -1365,8 +1357,6 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface, if (!(current_flags & AM_SEEKING_NoFlush)) { - wg_parser_end_flush(filter->wg_parser); - for (i = 0; i < filter->source_count; ++i) { struct parser_source *flush_pin = filter->sources[i]; diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h index f445fc7ac7e..1ef80991fb4 100644 --- a/dlls/winegstreamer/unixlib.h +++ b/dlls/winegstreamer/unixlib.h @@ -238,9 +238,6 @@ enum unix_funcs unix_wg_parser_connect, unix_wg_parser_disconnect, - unix_wg_parser_begin_flush, - unix_wg_parser_end_flush, - unix_wg_parser_get_next_read_offset, unix_wg_parser_push_data, diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index 85c28895159..61120a72da8 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -87,7 +87,7 @@ struct wg_parser GstFlowReturn ret; } read_request; - bool flushing, sink_connected; + bool sink_connected; bool unlimited_buffering; }; @@ -127,35 +127,6 @@ static NTSTATUS wg_parser_get_stream(void *args) return S_OK; } -static NTSTATUS wg_parser_begin_flush(void *args) -{ - struct wg_parser *parser = args; - unsigned int i; - - pthread_mutex_lock(&parser->mutex); - parser->flushing = true; - pthread_mutex_unlock(&parser->mutex); - - for (i = 0; i < parser->stream_count; ++i) - { - if (parser->streams[i]->enabled) - pthread_cond_signal(&parser->streams[i]->event_cond); - } - - return S_OK; -} - -static NTSTATUS wg_parser_end_flush(void *args) -{ - struct wg_parser *parser = args; - - pthread_mutex_lock(&parser->mutex); - parser->flushing = false; - pthread_mutex_unlock(&parser->mutex); - - return S_OK; -} - static NTSTATUS wg_parser_get_next_read_offset(void *args) { struct wg_parser_get_next_read_offset_params *params = args; @@ -288,16 +259,9 @@ static NTSTATUS wg_parser_stream_get_event(void *args) pthread_mutex_lock(&parser->mutex); - while (!parser->flushing && stream->event.type == WG_PARSER_EVENT_NONE) + while (stream->event.type == WG_PARSER_EVENT_NONE) pthread_cond_wait(&stream->event_cond, &parser->mutex); - if (parser->flushing) - { - pthread_mutex_unlock(&parser->mutex); - GST_DEBUG("Filter is flushing.\n"); - return VFW_E_WRONG_STATE; - } - *params->event = stream->event; if (stream->event.type != WG_PARSER_EVENT_BUFFER) @@ -1593,7 +1557,6 @@ static NTSTATUS wg_parser_create(void *args) pthread_cond_init(&parser->init_cond, NULL); pthread_cond_init(&parser->read_cond, NULL); pthread_cond_init(&parser->read_done_cond, NULL); - parser->flushing = true; parser->init_gst = init_funcs[params->type]; parser->unlimited_buffering = params->unlimited_buffering; @@ -1630,9 +1593,6 @@ const unixlib_entry_t __wine_unix_call_funcs[] = X(wg_parser_connect), X(wg_parser_disconnect), - X(wg_parser_begin_flush), - X(wg_parser_end_flush), - X(wg_parser_get_next_read_offset), X(wg_parser_push_data), diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index f49d99071e0..6d2b9edbd09 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1512,7 +1512,6 @@ static HRESULT init_stream(struct wm_reader *reader, QWORD file_size) wg_parser_stream_enable(stream->wg_stream, &stream->format); } - wg_parser_end_flush(reader->wg_parser); /* We probably discarded events because streams weren't enabled yet. * Now that they're all enabled seek back to the start again. */ wg_parser_stream_seek(reader->streams[0].wg_stream, 1.0, 0, 0, @@ -1836,11 +1835,7 @@ HRESULT wm_reader_get_stream_sample(struct wm_stream *stream, for (;;) { - if (!wg_parser_stream_get_event(wg_stream, &event)) - { - FIXME("Stream is flushing.\n"); - return E_NOTIMPL; - } + wg_parser_stream_get_event(wg_stream, &event); TRACE("Got event of type %#x for %s stream %p.\n", event.type, get_major_type_string(stream->format.major_type), stream);
1
0
0
0
Zebediah Figura : winegstreamer: Explicitly sleep in the DirectShow streaming thread after receiving EOS.
by Alexandre Julliard
24 Feb '22
24 Feb '22
Module: wine Branch: master Commit: 7da1828c4927faec011d1c15d2f3f9bbb43435b7 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=7da1828c4927faec011d1c15…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Wed Feb 23 15:46:46 2022 -0600 winegstreamer: Explicitly sleep in the DirectShow streaming thread after receiving EOS. Instead of waiting for another event from the wg_parser object. Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winegstreamer/quartz_parser.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index 4afd265bca7..30afd0874ea 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -74,6 +74,7 @@ struct parser_source SourceSeeking seek; CRITICAL_SECTION flushing_cs; + CONDITION_VARIABLE eos_cv; HANDLE thread; /* This variable is read and written by both the streaming thread and @@ -81,6 +82,8 @@ struct parser_source * thread when the streaming thread is not running, or when it is blocked * by flushing_cs. */ bool need_segment; + + bool eos; }; static inline struct parser *impl_from_strmbase_filter(struct strmbase_filter *iface) @@ -823,6 +826,13 @@ static DWORD CALLBACK stream_thread(void *arg) EnterCriticalSection(&pin->flushing_cs); + if (pin->eos) + { + SleepConditionVariableCS(&pin->eos_cv, &pin->flushing_cs, INFINITE); + LeaveCriticalSection(&pin->flushing_cs); + continue; + } + if (!wg_parser_stream_get_event(pin->wg_stream, &event)) { LeaveCriticalSection(&pin->flushing_cs); @@ -839,6 +849,7 @@ static DWORD CALLBACK stream_thread(void *arg) case WG_PARSER_EVENT_EOS: IPin_EndOfStream(pin->pin.pin.peer); + pin->eos = true; break; case WG_PARSER_EVENT_NONE: @@ -973,17 +984,19 @@ static HRESULT parser_init_stream(struct strmbase_filter *iface) for (i = 0; i < filter->source_count; ++i) { + struct parser_source *pin = filter->sources[i]; HRESULT hr; - if (!filter->sources[i]->pin.pin.peer) + if (!pin->pin.pin.peer) continue; - if (FAILED(hr = IMemAllocator_Commit(filter->sources[i]->pin.pAllocator))) + if (FAILED(hr = IMemAllocator_Commit(pin->pin.pAllocator))) ERR("Failed to commit allocator, hr %#lx.\n", hr); - filter->sources[i]->need_segment = true; + pin->need_segment = true; + pin->eos = false; - filter->sources[i]->thread = CreateThread(NULL, 0, stream_thread, filter->sources[i], 0, NULL); + pin->thread = CreateThread(NULL, 0, stream_thread, pin, 0, NULL); } return S_OK; @@ -1009,6 +1022,7 @@ static HRESULT parser_cleanup_stream(struct strmbase_filter *iface) IMemAllocator_Decommit(pin->pin.pAllocator); + WakeConditionVariable(&pin->eos_cv); WaitForSingleObject(pin->thread, INFINITE); CloseHandle(pin->thread); pin->thread = NULL; @@ -1371,9 +1385,13 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface, struct parser_source *flush_pin = filter->sources[i]; flush_pin->need_segment = true; + flush_pin->eos = false; if (flush_pin->pin.pin.peer) + { LeaveCriticalSection(&flush_pin->flushing_cs); + WakeConditionVariable(&flush_pin->eos_cv); + } } return S_OK; @@ -1613,6 +1631,7 @@ static struct parser_source *create_pin(struct parser *filter, InitializeCriticalSection(&pin->flushing_cs); pin->flushing_cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": pin.flushing_cs"); + InitializeConditionVariable(&pin->eos_cv); filter->sources[filter->source_count++] = pin; return pin;
1
0
0
0
← Newer
1
...
20
21
22
23
24
25
26
...
150
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
Results per page:
10
25
50
100
200