Subversion Repositories spk

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
11 cycrow 1
#pragma once
2
 
3
#include "../Overlay.h"
4
 
5
class KeyboardDevice : public IDirectInputDevice8
6
{
7
public:
8
	KeyboardDevice(IDirectInputDevice8* device, COverlay *o) : m_device(device), m_pOverlay(o)//, m_serverPipe(FULL_PIPE_NAME)
9
	{
10
		m_pOverlay->SetKeyboardDevice ( device );
11
	}
12
 
13
	/*** IUnknown methods ***/
14
	STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj)
15
	{
16
		return m_device->QueryInterface(riid, ppvObj);
17
	}
18
 
19
	STDMETHOD_(ULONG,AddRef)()
20
	{
21
		return m_device->AddRef();
22
	}
23
 
24
	STDMETHOD_(ULONG,Release)()
25
	{
26
		ULONG count = m_device->Release();
27
		if(0 == count)
28
			delete this;
29
 
30
		return count;
31
	}
32
 
33
	/*** IDirectInputDevice8 methods ***/
34
	STDMETHOD(GetCapabilities)(LPDIDEVCAPS devCaps)
35
	{
36
		return m_device->GetCapabilities(devCaps);
37
	}
38
 
39
	STDMETHOD(EnumObjects)(LPDIENUMDEVICEOBJECTSCALLBACK callback, LPVOID ref, DWORD flags)	
40
	{
41
		return m_device->EnumObjects(callback, ref, flags);
42
	}
43
 
44
	STDMETHOD(GetProperty)(REFGUID rguid, LPDIPROPHEADER ph)
45
	{
46
		return m_device->GetProperty(rguid, ph);
47
	}
48
 
49
	STDMETHOD(SetProperty)(REFGUID rguid, LPCDIPROPHEADER ph)
50
	{
51
		return m_device->SetProperty(rguid, ph);
52
 
53
		/*
54
		You can detect immediate/buffered modes as such:
55
 
56
		HRESULT hr = m_device->SetProperty(rguid, ph);
57
 
58
		if(SUCCEEDED(hr) && rguid == DIPROP_BUFFERSIZE)
59
		{
60
			DWORD data = *reinterpret_cast<const DWORD*>(ph + 1);
61
			m_is_immediate = (data == 0);
62
		}
63
 
64
		return hr;
65
		*/
66
	}
67
 
68
	STDMETHOD(Acquire)()
69
	{
70
		return m_device->Acquire();
71
	}
72
 
73
	STDMETHOD(Unacquire)()
74
	{
75
		return m_device->Unacquire();
76
	}
77
 
78
	STDMETHOD(GetDeviceState)(DWORD size, LPVOID data)
79
	{
80
		HRESULT hr = m_device->GetDeviceState(size, data);
81
 
82
		if ( m_pOverlay->SetKeyBuffer ( size, (char *)data ) )
83
			hr = E_PENDING;
84
 
85
		return hr;
86
	}
87
 
88
	STDMETHOD(GetDeviceData)(DWORD size, LPDIDEVICEOBJECTDATA data, LPDWORD numElements, DWORD flags)
89
	{
90
		HRESULT hr = m_device->GetDeviceData(size, data, numElements, flags);
91
 
92
		for ( unsigned int i = 0; i < *numElements; i++ )
93
		{
94
			DIDEVICEOBJECTDATA *d = &data[i];
95
			if ( d->dwData )
96
			{
97
				if ( m_pOverlay->KeyDown ( (int)d->dwOfs ) )
98
					d->dwData = 0;
99
			}
100
			else
101
				m_pOverlay->KeyReleased ( (int)d->dwOfs );
102
		}
103
/*
104
		if ( m_pOverlay->GetKeyboard () )
105
		{
106
			char data[256];
107
			if ( !FAILED (m_device->GetDeviceState(256, data)) )
108
			{
109
				if ( m_pOverlay->SetKeyBuffer ( 256, data ) )
110
					return DIERR_INPUTLOST;
111
			}
112
		}*/
113
		return hr;
114
	}
115
 
116
	STDMETHOD(SetDataFormat)(LPCDIDATAFORMAT df)
117
	{
118
		return m_device->SetDataFormat(df);
119
	}
120
 
121
	STDMETHOD(SetEventNotification)(HANDLE event)
122
	{
123
		return m_device->SetEventNotification(event);
124
	}
125
 
126
	STDMETHOD(SetCooperativeLevel)(HWND window, DWORD level)
127
	{
128
		return m_device->SetCooperativeLevel(window, level);
129
	}
130
 
131
	STDMETHOD(GetObjectInfo)(LPDIDEVICEOBJECTINSTANCE object, DWORD objId, DWORD objHow)
132
	{
133
		return m_device->GetObjectInfo(object, objId, objHow);
134
	}
135
 
136
	STDMETHOD(GetDeviceInfo)(LPDIDEVICEINSTANCE di)
137
	{
138
		return m_device->GetDeviceInfo(di);
139
	}
140
 
141
	STDMETHOD(RunControlPanel)(HWND owner, DWORD flags)
142
	{
143
		return m_device->RunControlPanel(owner, flags);
144
	}
145
 
146
	STDMETHOD(Initialize)(HINSTANCE instance, DWORD version, REFGUID rguid)
147
	{
148
		return m_device->Initialize(instance, version, rguid);
149
	}
150
 
151
	STDMETHOD(CreateEffect)(REFGUID rguid, LPCDIEFFECT effect_params, LPDIRECTINPUTEFFECT* effect, LPUNKNOWN unknown)
152
	{
153
		return m_device->CreateEffect(rguid, effect_params, effect, unknown);
154
	}
155
 
156
    STDMETHOD(EnumEffects)(LPDIENUMEFFECTSCALLBACK callback, LPVOID ref, DWORD type)
157
	{
158
		return m_device->EnumEffects(callback, ref, type);
159
	}
160
 
161
    STDMETHOD(GetEffectInfo)(LPDIEFFECTINFO effect_info, REFGUID rguid)
162
	{
163
		return m_device->GetEffectInfo(effect_info, rguid);
164
	}
165
 
166
    STDMETHOD(GetForceFeedbackState)(LPDWORD state)
167
	{
168
		return m_device->GetForceFeedbackState(state);
169
	}
170
 
171
    STDMETHOD(SendForceFeedbackCommand)(DWORD flags)
172
	{
173
		return m_device->SendForceFeedbackCommand(flags);
174
	}
175
 
176
    STDMETHOD(EnumCreatedEffectObjects)(LPDIENUMCREATEDEFFECTOBJECTSCALLBACK callback, LPVOID ref, DWORD flags)
177
	{
178
		return m_device->EnumCreatedEffectObjects(callback, ref, flags);
179
	}
180
 
181
    STDMETHOD(Escape)(LPDIEFFESCAPE escape)
182
	{
183
		return m_device->Escape(escape);
184
	}
185
 
186
    STDMETHOD(Poll)()
187
	{
188
		return m_device->Poll();
189
	}
190
 
191
	STDMETHOD(SendDeviceData)(DWORD size, LPCDIDEVICEOBJECTDATA data, LPDWORD num_elements, DWORD flags)
192
	{
193
		return m_device->SendDeviceData(size, data, num_elements, flags);
194
	}
195
 
196
	STDMETHOD(EnumEffectsInFile)(LPCTSTR file_name, LPDIENUMEFFECTSINFILECALLBACK callback, LPVOID ref, DWORD flags)
197
	{
198
		return m_device->EnumEffectsInFile(file_name, callback, ref, flags);
199
	}
200
 
201
    STDMETHOD(WriteEffectToFile)(LPCTSTR file_name, DWORD num_entries, LPDIFILEEFFECT effects, DWORD flags)
202
	{
203
		return m_device->WriteEffectToFile(file_name, num_entries, effects, flags);
204
	}
205
 
206
    STDMETHOD(BuildActionMap)(LPDIACTIONFORMAT format, LPCTSTR username, DWORD flags)
207
	{
208
		return m_device->BuildActionMap(format, username, flags);
209
	}
210
 
211
    STDMETHOD(SetActionMap)(LPDIACTIONFORMAT format, LPCTSTR username, DWORD flags)
212
	{
213
		return m_device->SetActionMap(format, username, flags);
214
	}
215
 
216
    STDMETHOD(GetImageInfo)(LPDIDEVICEIMAGEINFOHEADER image_header)
217
	{
218
		return m_device->GetImageInfo(image_header);
219
	}
220
 
221
private:
222
	IDirectInputDevice8* m_device;	
223
	COverlay *m_pOverlay;
224
//	NamedPipeServer m_serverPipe;
225
};
226