-
Notifications
You must be signed in to change notification settings - Fork 0
/
proxy_idi.c
110 lines (92 loc) · 4.24 KB
/
proxy_idi.c
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
#include "dinputproxy.h"
HRESULT STDMETHODCALLTYPE proxy_IDirectInput_QueryInterface(struct IDirectInput *idi, REFIID riid, LPVOID * ppvObj)
{
proxy_IDirectInput *proxydi = (proxy_IDirectInput *)idi;
return proxydi->di->lpVtbl->QueryInterface(proxydi->di, riid, ppvObj);
}
ULONG STDMETHODCALLTYPE proxy_IDirectInput_AddRef(struct IDirectInput *idi)
{
proxy_IDirectInput *proxydi = (proxy_IDirectInput *)idi;
proxydi->refcount++;
return proxydi->di->lpVtbl->AddRef(proxydi->di);
}
ULONG STDMETHODCALLTYPE proxy_IDirectInput_Release(struct IDirectInput *idi)
{
proxy_IDirectInput *proxydi = (proxy_IDirectInput *)idi;
ULONG ret;
ret = proxydi->di->lpVtbl->Release(proxydi->di);
proxydi->refcount--;
if (!proxydi->refcount)
{
free(proxydi);
}
return ret;
}
HRESULT STDMETHODCALLTYPE proxy_IDirectInput_CreateDevice(struct IDirectInput *idi, REFGUID rguid, LPDIRECTINPUTDEVICEA *lplpDirectInputDevice, LPUNKNOWN pUnkOuter)
{
proxy_IDirectInput *proxydi = (proxy_IDirectInput *)idi;
proxy_IDirectInputDevice *proxydid;
IDirectInputDevice *did;
HRESULT ret;
ret = proxydi->di->lpVtbl->CreateDevice(proxydi->di, rguid, &did, pUnkOuter);
if (ret != DI_OK)
{
return ret;
}
proxydid = (proxy_IDirectInputDevice *)malloc(sizeof(proxy_IDirectInputDevice));
proxydid->vtbl.QueryInterface = proxy_IDirectInputDevice_QueryInterface;
proxydid->vtbl.AddRef = proxy_IDirectInputDevice_AddRef;
proxydid->vtbl.Release = proxy_IDirectInputDevice_Release;
proxydid->vtbl.GetCapabilities = proxy_IDirectInputDevice_GetCapabilities;
proxydid->vtbl.EnumObjects = proxy_IDirectInputDevice_EnumObjects;
proxydid->vtbl.GetProperty = proxy_IDirectInputDevice_GetProperty;
proxydid->vtbl.SetProperty = proxy_IDirectInputDevice_SetProperty;
proxydid->vtbl.Acquire = proxy_IDirectInputDevice_Acquire;
proxydid->vtbl.Unacquire = proxy_IDirectInputDevice_Unacquire;
proxydid->vtbl.GetDeviceState = proxy_IDirectInputDevice_GetDeviceState;
proxydid->vtbl.GetDeviceData = proxy_IDirectInputDevice_GetDeviceData;
proxydid->vtbl.SetDataFormat = proxy_IDirectInputDevice_SetDataFormat;
proxydid->vtbl.SetEventNotification = proxy_IDirectInputDevice_SetEventNotification;
proxydid->vtbl.SetCooperativeLevel = proxy_IDirectInputDevice_SetCooperativeLevel;
proxydid->vtbl.GetObjectInfo = proxy_IDirectInputDevice_GetObjectInfo;
proxydid->vtbl.GetDeviceInfo = proxy_IDirectInputDevice_GetDeviceInfo;
proxydid->vtbl.RunControlPanel = proxy_IDirectInputDevice_RunControlPanel;
proxydid->vtbl.Initialize = proxy_IDirectInputDevice_Initialize;
proxydid->lpVtbl = &proxydid->vtbl;
proxydid->did = did;
proxydid->refcount = 1;
proxydid->bKeyboard = FALSE;
proxydid->bMouse = FALSE;
proxydid->sequence = 0;
if (IsEqualGUID(rguid, &GUID_SysKeyboard))
{
proxydid->bKeyboard = TRUE;
proxydid->bControlDown = FALSE;
}
else if (IsEqualGUID(rguid, &GUID_SysMouse))
{
proxydid->bMouse = TRUE;
}
*lplpDirectInputDevice = (LPDIRECTINPUTDEVICE)proxydid;
return DI_OK;
}
HRESULT STDMETHODCALLTYPE proxy_IDirectInput_EnumDevices(struct IDirectInput *idi, DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags)
{
proxy_IDirectInput *proxydi = (proxy_IDirectInput *)idi;
return proxydi->di->lpVtbl->EnumDevices(proxydi->di, dwDevType, lpCallback, pvRef, dwFlags);
}
HRESULT STDMETHODCALLTYPE proxy_IDirectInput_GetDeviceStatus(struct IDirectInput *idi, REFGUID rguidInstance)
{
proxy_IDirectInput *proxydi = (proxy_IDirectInput *)idi;
return proxydi->di->lpVtbl->GetDeviceStatus(proxydi->di, rguidInstance);
}
HRESULT STDMETHODCALLTYPE proxy_IDirectInput_RunControlPanel(struct IDirectInput *idi, HWND hwndOwner, DWORD dwFlags)
{
proxy_IDirectInput *proxydi = (proxy_IDirectInput *)idi;
return proxydi->di->lpVtbl->RunControlPanel(proxydi->di, hwndOwner, dwFlags);
}
HRESULT STDMETHODCALLTYPE proxy_IDirectInput_Initialize(struct IDirectInput *idi, HINSTANCE hinst, DWORD dwVersion)
{
proxy_IDirectInput *proxydi = (proxy_IDirectInput *)idi;
return proxydi->di->lpVtbl->Initialize(proxydi->di, hinst, dwVersion);
}