Needed for mingw Firefox build.
The WIDL error points to the wrong function, specifically the one after it.
include/windows.ui.composition.interop.idl:35:63: error: parameter 'swapchain' of function 'CreateCompositionSurfaceForHandle' cannot derive from void *
HRESULT CreateCompositionSurfaceForSwapChain([in] IUnknown *swapchain, [out, retval] ICompositionSurface **result); ^ make[1]: *** [Makefile:163749: include/windows.ui.composition.interop.h] Error 1
-- v3: include: Add windows.ui.composition.interop.idl file. widl: Add support for WinRT HANDLE parameter type.
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
Needed by windows.ui.composition.interop.idl. --- tools/widl/typegen.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index b3373ded11d..cf1b499aae1 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -342,6 +342,8 @@ enum typegen_type typegen_detect_type(const type_t *type, const attr_list_t *att return TGT_IFACE_POINTER; else if (is_aliaschain_attr(type_pointer_get_ref_type(type), ATTR_CONTEXTHANDLE)) return TGT_CTXT_HANDLE_POINTER; + else if (type_get_type(type_pointer_get_ref_type(type)) == TYPE_VOID) + return TGT_CTXT_HANDLE; else return TGT_POINTER; case TYPE_STRUCT:
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
Needed for mingw Firefox build. --- include/Makefile.in | 1 + include/windows.ui.composition.interop.idl | 40 ++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 include/windows.ui.composition.interop.idl
diff --git a/include/Makefile.in b/include/Makefile.in index f52314e745d..54d6dca234d 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -838,6 +838,7 @@ SOURCES = \ windows.system.threading.idl \ windows.system.userprofile.idl \ windows.ui.composition.idl \ + windows.ui.composition.interop.idl \ windows.ui.core.idl \ windows.ui.idl \ windows.ui.viewmanagement.idl \ diff --git a/include/windows.ui.composition.interop.idl b/include/windows.ui.composition.interop.idl new file mode 100644 index 00000000000..cde3e62f533 --- /dev/null +++ b/include/windows.ui.composition.interop.idl @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2023 Mohamad Al-Jaf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifdef __WIDL__ +#pragma winrt ns_prefix +#endif + +import "windows.ui.composition.idl"; +import "sdkddkver.h"; + +namespace Windows.UI.Composition { + interface ICompositorInterop; + + [ + object, + uuid(25297d5c-3ad4-4c9c-b5cf-e36a38512330), + pointer_default(unique) + ] + interface ICompositorInterop : IInspectable + { + HRESULT CreateCompositionSurfaceForHandle([in] HANDLE swapchain, [out, retval] ICompositionSurface **result); + HRESULT CreateCompositionSurfaceForSwapChain([in] IUnknown *swapchain, [out, retval] ICompositionSurface **result); + HRESULT CreateGraphicsDevice([in] IUnknown *device, [out, retval] ICompositionGraphicsDevice **result); + }; +}
Instead of returning `TGT_CTXT_HANDLE` when type is void, which will then make void parameters incorrectly succeed some checks, I'd suggest adding some logic in the `TYPE_POINTER` case, checking whether the type is an alias to `void*` which name is `HANDLE`.
Checking the name leads to a segmentation fault in dlls/actxprxy. Is the current way fine?
Probably the simplest thing to do, is to add it to the `TYPE_POINTER` case in check_field_common, to avoid overloading the `TGT_CTXT_HANDLE` meaning, or having to add a specific `TGT_HANDLE` value.
I couldn't find `TYPE_POINTER` case in check_field_common, unless you meant `TGT_POINTER`. Regardless, it doesn't seem like it would work because `typegen_detect_type` returns `TGT_INVALID` for TYPE_VOID.
Note that this is a problem only because we're trying to use an IDL here. As far as I can see, the SDK doesn't have one and uses a .h directly instead (though it's probably fine and cleaner to use an IDL).
Yeah, I thought it was preferred to add an IDL if possible. I don't mind doing it either way though.