[PATCH v2] dinput8: Share source with dinput.
Zebediah Figura
z.figura12 at gmail.com
Mon Aug 20 10:49:28 CDT 2018
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
On 20/08/18 10:25, Zebediah Figura wrote:
> From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
>
> Based on a patch by Andrew Wesie.
>
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45568
> ---
> v2: remove unnecessary #ifs, clean up formatting
>
> dlls/dinput/Makefile.in | 1 +
> dlls/dinput/dinput_main.c | 62 ++++++++++-
> dlls/dinput8/Makefile.in | 17 ++-
> dlls/dinput8/dinput8_main.c | 247 --------------------------------------------
> 4 files changed, 77 insertions(+), 250 deletions(-)
> delete mode 100644 dlls/dinput8/dinput8_main.c
>
> diff --git a/dlls/dinput/Makefile.in b/dlls/dinput/Makefile.in
> index 5d287a3..b1107ee 100644
> --- a/dlls/dinput/Makefile.in
> +++ b/dlls/dinput/Makefile.in
> @@ -1,6 +1,7 @@
> MODULE = dinput.dll
> IMPORTLIB = dinput
> IMPORTS = dxguid uuid comctl32 ole32 user32 advapi32
> +EXTRADEFS = -DDIRECTINPUT_VERSION=0x0700
> EXTRALIBS = $(IOKIT_LIBS) $(FORCEFEEDBACK_LIBS)
>
> C_SRCS = \
> diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
> index e4538a0..32eedf1 100644
> --- a/dlls/dinput/dinput_main.c
> +++ b/dlls/dinput/dinput_main.c
> @@ -165,6 +165,63 @@ HRESULT WINAPI DirectInputCreateEx(
> }
>
> /******************************************************************************
> + * DirectInput8Create (DINPUT8.@)
> + */
> +HRESULT WINAPI DECLSPEC_HOTPATCH DirectInput8Create(HINSTANCE hinst,
> + DWORD version, REFIID iid, void **out, IUnknown *outer)
> +{
> + IDirectInputImpl *This;
> + HRESULT hr;
> +
> + TRACE("hinst %p, version %#x, iid %s, out %p, outer %p.\n",
> + hinst, version, debugstr_guid(iid), out, outer);
> +
> + if (!out)
> + return E_POINTER;
> +
> + if (!IsEqualGUID(&IID_IDirectInput8A, iid) &&
> + !IsEqualGUID(&IID_IDirectInput8W, iid) &&
> + !IsEqualGUID(&IID_IUnknown, iid))
> + {
> + *out = NULL;
> + return DIERR_NOINTERFACE;
> + }
> +
> + hr = create_directinput_instance(iid, out, &This);
> +
> + if (FAILED(hr))
> + {
> + ERR("Failed to create DirectInput, hr %#x.\n", hr);
> + return hr;
> + }
> +
> + /* When aggregation is used, the application needs to manually call Initialize(). */
> + if (!outer && IsEqualGUID(&IID_IDirectInput8A, iid))
> + {
> + hr = IDirectInput8_Initialize(&This->IDirectInput8A_iface, hinst, version);
> + if (FAILED(hr))
> + {
> + IDirectInput8_Release(&This->IDirectInput8A_iface);
> + *out = NULL;
> + return hr;
> + }
> + }
> +
> + if (!outer && IsEqualGUID(&IID_IDirectInput8W, iid))
> + {
> + hr = IDirectInput8_Initialize(&This->IDirectInput8W_iface, hinst, version);
> + if (FAILED(hr))
> + {
> + IDirectInput8_Release(&This->IDirectInput8W_iface);
> + *out = NULL;
> + return hr;
> + }
> + }
> +
> + return S_OK;
> +}
> +
> +/******************************************************************************
> * DirectInputCreateA (DINPUT.@)
> */
> HRESULT WINAPI DECLSPEC_HOTPATCH DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter)
> @@ -1519,7 +1576,10 @@ static HRESULT WINAPI DICF_CreateInstance(
> IsEqualGUID( &IID_IDirectInput2A, riid ) ||
> IsEqualGUID( &IID_IDirectInput2W, riid ) ||
> IsEqualGUID( &IID_IDirectInput7A, riid ) ||
> - IsEqualGUID( &IID_IDirectInput7W, riid ) ) {
> + IsEqualGUID( &IID_IDirectInput7W, riid ) ||
> + IsEqualGUID( &IID_IDirectInput8A, riid ) ||
> + IsEqualGUID( &IID_IDirectInput8W, riid ) )
> + {
> return create_directinput_instance(riid, ppobj, NULL);
> }
>
> diff --git a/dlls/dinput8/Makefile.in b/dlls/dinput8/Makefile.in
> index 26672ae..6b62969 100644
> --- a/dlls/dinput8/Makefile.in
> +++ b/dlls/dinput8/Makefile.in
> @@ -1,9 +1,22 @@
> MODULE = dinput8.dll
> IMPORTLIB = dinput8
> -IMPORTS = uuid dxguid dinput ole32 advapi32
> +IMPORTS = dxguid uuid comctl32 ole32 user32 advapi32
> +EXTRADEFS = -DDIRECTINPUT_VERSION=0x0800
> +EXTRALIBS = $(IOKIT_LIBS) $(FORCEFEEDBACK_LIBS)
> +PARENTSRC = ../dinput
>
> C_SRCS = \
> - dinput8_main.c
> + config.c \
> + data_formats.c \
> + device.c \
> + dinput_main.c \
> + effect_linuxinput.c \
> + joystick.c \
> + joystick_linux.c \
> + joystick_linuxinput.c \
> + joystick_osx.c \
> + keyboard.c \
> + mouse.c
>
> IDL_SRCS = dinput8.idl
>
> diff --git a/dlls/dinput8/dinput8_main.c b/dlls/dinput8/dinput8_main.c
> deleted file mode 100644
> index 9824c76..0000000
> --- a/dlls/dinput8/dinput8_main.c
> +++ /dev/null
> @@ -1,247 +0,0 @@
> -/* DirectInput 8
> - *
> - * Copyright 2002 TransGaming Technologies Inc.
> - * Copyright 2006 Roderick Colenbrander
> - *
> - * 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
> - */
> -
> -#include "config.h"
> -#include <assert.h>
> -#include <stdarg.h>
> -#include <string.h>
> -
> -#define COBJMACROS
> -
> -#include "wine/debug.h"
> -#include "windef.h"
> -#include "winbase.h"
> -#include "winerror.h"
> -#include "objbase.h"
> -#include "rpcproxy.h"
> -#include "dinput.h"
> -
> -WINE_DEFAULT_DEBUG_CHANNEL(dinput);
> -
> -static HINSTANCE instance;
> -static LONG dll_count;
> -
> -/*
> - * Dll lifetime tracking declaration
> - */
> -static void LockModule(void)
> -{
> - InterlockedIncrement(&dll_count);
> -}
> -
> -static void UnlockModule(void)
> -{
> - InterlockedDecrement(&dll_count);
> -}
> -
> -/******************************************************************************
> - * DirectInput8Create (DINPUT8.@)
> - */
> -HRESULT WINAPI DECLSPEC_HOTPATCH DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riid, LPVOID *ppDI, LPUNKNOWN punkOuter) {
> - IDirectInputA *pDI;
> - HRESULT hr, hrCo;
> -
> - TRACE("hInst (%p), dwVersion: %d, riid (%s), punkOuter (%p)\n", hinst, dwVersion, debugstr_guid(riid), punkOuter);
> -
> - if (!ppDI)
> - return E_POINTER;
> -
> - if (!IsEqualGUID(&IID_IDirectInput8A, riid) &&
> - !IsEqualGUID(&IID_IDirectInput8W, riid) &&
> - !IsEqualGUID(&IID_IUnknown, riid))
> - {
> - *ppDI = NULL;
> - return DIERR_NOINTERFACE;
> - }
> -
> - hrCo = CoInitialize(NULL);
> -
> - hr = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInputA, (void **)&pDI);
> -
> - /* Ensure balance of calls. */
> - if (SUCCEEDED(hrCo))
> - CoUninitialize();
> -
> - if (FAILED(hr)) {
> - ERR("CoCreateInstance failed with hr = 0x%08x\n", hr);
> - return hr;
> - }
> -
> - hr = IDirectInput_QueryInterface(pDI, riid, ppDI);
> - IDirectInput_Release(pDI);
> -
> - if (FAILED(hr))
> - return hr;
> -
> - /* When aggregation is used (punkOuter!=NULL) the application needs to manually call Initialize. */
> - if(punkOuter == NULL && IsEqualGUID(&IID_IDirectInput8A, riid)) {
> - IDirectInput8A *DI = *ppDI;
> -
> - hr = IDirectInput8_Initialize(DI, hinst, dwVersion);
> - if (FAILED(hr))
> - {
> - IDirectInput8_Release(DI);
> - *ppDI = NULL;
> - return hr;
> - }
> - }
> -
> - if(punkOuter == NULL && IsEqualGUID(&IID_IDirectInput8W, riid)) {
> - IDirectInput8W *DI = *ppDI;
> -
> - hr = IDirectInput8_Initialize(DI, hinst, dwVersion);
> - if (FAILED(hr))
> - {
> - IDirectInput8_Release(DI);
> - *ppDI = NULL;
> - return hr;
> - }
> - }
> -
> - return S_OK;
> -}
> -
> -/*******************************************************************************
> - * DirectInput8 ClassFactory
> - */
> -typedef struct
> -{
> - /* IUnknown fields */
> - IClassFactory IClassFactory_iface;
> -} IClassFactoryImpl;
> -
> -static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
> -{
> - return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
> -}
> -
> -static HRESULT WINAPI DI8CF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
> - IClassFactoryImpl *This = impl_from_IClassFactory(iface);
> - FIXME("%p %s %p\n",This,debugstr_guid(riid),ppobj);
> - return E_NOINTERFACE;
> -}
> -
> -static ULONG WINAPI DI8CF_AddRef(LPCLASSFACTORY iface) {
> - LockModule();
> - return 2;
> -}
> -
> -static ULONG WINAPI DI8CF_Release(LPCLASSFACTORY iface) {
> - UnlockModule();
> - return 1;
> -}
> -
> -static HRESULT WINAPI DI8CF_CreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj) {
> - IClassFactoryImpl *This = impl_from_IClassFactory(iface);
> -
> - TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
> - if( IsEqualGUID( &IID_IDirectInput8A, riid ) || IsEqualGUID( &IID_IDirectInput8W, riid ) || IsEqualGUID( &IID_IUnknown, riid )) {
> - IDirectInputA *ppDI;
> - HRESULT hr;
> -
> - hr = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInputA, (void **)&ppDI);
> - if (FAILED(hr))
> - return hr;
> -
> - hr = IDirectInput_QueryInterface(ppDI, riid, ppobj);
> - IDirectInput_Release(ppDI);
> -
> - return hr;
> - }
> -
> - ERR("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);
> - return E_NOINTERFACE;
> -}
> -
> -static HRESULT WINAPI DI8CF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
> - TRACE("(%p)->(%d)\n", iface, dolock);
> -
> - if(dolock)
> - LockModule();
> - else
> - UnlockModule();
> -
> - return S_OK;
> -}
> -
> -static const IClassFactoryVtbl DI8CF_Vtbl = {
> - DI8CF_QueryInterface,
> - DI8CF_AddRef,
> - DI8CF_Release,
> - DI8CF_CreateInstance,
> - DI8CF_LockServer
> -};
> -static IClassFactoryImpl DINPUT8_CF = { { &DI8CF_Vtbl } };
> -
> -
> -/***********************************************************************
> - * DllCanUnloadNow (DINPUT8.@)
> - */
> -HRESULT WINAPI DllCanUnloadNow(void)
> -{
> - return dll_count == 0 ? S_OK : S_FALSE;
> -}
> -
> -/***********************************************************************
> - * DllGetClassObject (DINPUT8.@)
> - */
> -HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
> -{
> - TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
> - if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {
> - *ppv = &DINPUT8_CF;
> - IClassFactory_AddRef((IClassFactory*)*ppv);
> - return S_OK;
> - }
> -
> - FIXME("(%s,%s,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
> - return CLASS_E_CLASSNOTAVAILABLE;
> -}
> -
> -/***********************************************************************
> - * DllMain
> - */
> -BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD reason, LPVOID lpv)
> -{
> - switch (reason)
> - {
> - case DLL_PROCESS_ATTACH:
> - instance = hInstDLL;
> - DisableThreadLibraryCalls( hInstDLL );
> - break;
> - }
> - return TRUE;
> -}
> -
> -/***********************************************************************
> - * DllRegisterServer (DINPUT8.@)
> - */
> -HRESULT WINAPI DllRegisterServer(void)
> -{
> - return __wine_register_resources( instance );
> -}
> -
> -/***********************************************************************
> - * DllUnregisterServer (DINPUT8.@)
> - */
> -HRESULT WINAPI DllUnregisterServer(void)
> -{
> - return __wine_unregister_resources( instance );
> -}
>
More information about the wine-devel
mailing list