[PATCH] avicap32: Partially implement capCreateCaptureWindowW.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Tue Aug 31 12:10:12 CDT 2021
On 8/31/21 8:59 AM, Gijs Vermeulen wrote:
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=38011
> Signed-off-by: Gijs Vermeulen <gijsvrm at gmail.com>
> ---
> dlls/avicap32/Makefile.in | 1 +
> dlls/avicap32/avicap32_main.c | 72 ++++++++++++++++++++++++++---------
> 2 files changed, 56 insertions(+), 17 deletions(-)
>
> diff --git a/dlls/avicap32/Makefile.in b/dlls/avicap32/Makefile.in
> index 8f5a1089d5c..f320a58f04b 100644
> --- a/dlls/avicap32/Makefile.in
> +++ b/dlls/avicap32/Makefile.in
> @@ -1,4 +1,5 @@
> MODULE = avicap32.dll
> IMPORTLIB = avicap32
> +IMPORTS = user32
>
> C_SRCS = avicap32_main.c
> diff --git a/dlls/avicap32/avicap32_main.c b/dlls/avicap32/avicap32_main.c
> index 9e2a99d4c7c..6ed8db1d552 100644
> --- a/dlls/avicap32/avicap32_main.c
> +++ b/dlls/avicap32/avicap32_main.c
> @@ -56,36 +56,74 @@
>
> WINE_DEFAULT_DEBUG_CHANNEL(avicap);
>
> +static ATOM registered_class = 0;
> +static WCHAR class_nameW[] = {'W','i','n','e','A','v','i','C','a','p','C','l','a','s','s',0};
> +
> +static LRESULT CALLBACK avicap_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
> +{
> + switch(msg)
> + {
> + /* FIXME: handle WM_CAP_* messages */
Could we maybe have a FIXME for these?
> + default:
> + return DefWindowProcW(hwnd, msg, wparam, lparam);
> + }
> +}
> +
> +static ATOM register_class(void)
> +{
> + WNDCLASSEXW class;
> +
> + class.cbSize = sizeof(WNDCLASSEXW);
> + class.style = 0;
> + class.lpfnWndProc = avicap_wndproc;
> + class.cbClsExtra = 0;
> + class.cbWndExtra = 0;
> + class.hInstance = GetModuleHandleW(NULL);
> + class.hIcon = NULL;
> + class.hCursor = LoadCursorW(NULL, (LPWSTR)IDC_ARROW);
> + class.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
> + class.lpszMenuName = NULL;
> + class.lpszClassName = class_nameW;
> + class.hIconSm = NULL;
> +
> + return RegisterClassExW(&class);
> +}
>
> /***********************************************************************
> * capCreateCaptureWindowW (AVICAP32.@)
> */
> -HWND VFWAPI capCreateCaptureWindowW(LPCWSTR lpszWindowName, DWORD dwStyle, INT x,
> - INT y, INT nWidth, INT nHeight, HWND hWnd,
> - INT nID)
> +HWND VFWAPI capCreateCaptureWindowW(const WCHAR *window_name, DWORD style, INT x,
> + INT y, INT width, INT height, HWND hWnd, INT id)
> {
> - FIXME("(%s, %08x, %08x, %08x, %08x, %08x, %p, %08x): stub\n",
> - debugstr_w(lpszWindowName), dwStyle, x, y, nWidth, nHeight, hWnd, nID);
> - return 0;
> + FIXME("(%s, %08x, %08x, %08x, %08x, %08x, %p, %08x): semi-stub\n",
> + debugstr_w(window_name), style, x, y, width, height, hWnd, id);
> +
> + if (!registered_class && !(registered_class = register_class()))
> + {
> + ERR("Failed to register class!\n");
> + return NULL;
> + }
> +
> + return CreateWindowExW(style, class_nameW, window_name, style, x, y, width, height,
> + hWnd, NULL, GetModuleHandleW(NULL), NULL);
> }
>
This is thread-safe, but it really doesn't look like it. I'm honestly
inclined to advocate for just not caching "registered_class" at all.
Also, can you please unregister the window class on DLL unload?
More information about the wine-devel
mailing list