PCem
view src/win-joystick.cc @ 154:d0d530adce12
Initial port to Linux (using Allegro).
64-bit fixes.
Some changes to aid portability.
A few other tweaks.
| author | TomW |
|---|---|
| date | Thu Sep 04 21:07:24 2014 +0100 |
| parents | 457f666b38c1 |
| children |
line source
1 #define DIRECTINPUT_VERSION 0x0700
2 #include <dinput.h>
3 #include "plat-joystick.h"
4 #include "win.h"
6 extern "C" int video_fullscreen;
8 extern "C" void fatal(const char *format, ...);
9 extern "C" void pclog(const char *format, ...);
11 extern "C" void joystick_init();
12 extern "C" void joystick_close();
13 extern "C" void poll_joystick();
15 joystick_t joystick_state[2];
17 static LPDIRECTINPUT lpdi;
18 static LPDIRECTINPUTDEVICE2 lpdi_joystick[2] = {NULL, NULL};
20 int joysticks_present = 0;
21 static GUID joystick_guids[2];
23 static BOOL CALLBACK joystick_enum_callback(LPCDIDEVICEINSTANCE lpddi, LPVOID data)
24 {
25 if (joysticks_present >= 2)
26 return DIENUM_STOP;
28 pclog("joystick_enum_callback : found joystick %i : %s\n", joysticks_present, lpddi->tszProductName);
30 joystick_guids[joysticks_present++] = lpddi->guidInstance;
32 if (joysticks_present >= 2)
33 return DIENUM_STOP;
35 return DIENUM_CONTINUE;
36 }
38 void joystick_init()
39 {
40 int c;
42 atexit(joystick_close);
44 joysticks_present = 0;
46 if (FAILED(DirectInputCreate(hinstance, DIRECTINPUT_VERSION, &lpdi, NULL)))
47 fatal("joystick_init : DirectInputCreate failed\n");
49 if (FAILED(lpdi->EnumDevices(DIDEVTYPE_JOYSTICK, joystick_enum_callback, NULL, DIEDFL_ATTACHEDONLY)))
50 fatal("joystick_init : EnumDevices failed\n");
52 pclog("joystick_init: joysticks_present=%i\n", joysticks_present);
54 for (c = 0; c < joysticks_present; c++)
55 {
56 LPDIRECTINPUTDEVICE lpdi_joystick_temp = NULL;
57 DIPROPRANGE joy_axis_range;
59 if (FAILED(lpdi->CreateDevice(joystick_guids[c], &lpdi_joystick_temp, NULL)))
60 fatal("joystick_init : CreateDevice failed\n");
61 if (FAILED(lpdi_joystick_temp->QueryInterface(IID_IDirectInputDevice2, (void **)&lpdi_joystick[c])))
62 fatal("joystick_init : CreateDevice failed\n");
63 lpdi_joystick_temp->Release();
64 if (FAILED(lpdi_joystick[c]->SetCooperativeLevel(ghwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE)))
65 fatal("joystick_init : SetCooperativeLevel failed\n");
66 if (FAILED(lpdi_joystick[c]->SetDataFormat(&c_dfDIJoystick)))
67 fatal("joystick_init : SetDataFormat failed\n");
69 joy_axis_range.lMin = -32768;
70 joy_axis_range.lMax = 32767;
71 joy_axis_range.diph.dwSize = sizeof(DIPROPRANGE);
72 joy_axis_range.diph.dwHeaderSize = sizeof(DIPROPHEADER);
73 joy_axis_range.diph.dwObj = DIJOFS_X;
74 joy_axis_range.diph.dwHow = DIPH_BYOFFSET;
75 lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph);
77 joy_axis_range.lMin = -32768;
78 joy_axis_range.lMax = 32767;
79 joy_axis_range.diph.dwSize = sizeof(DIPROPRANGE);
80 joy_axis_range.diph.dwHeaderSize = sizeof(DIPROPHEADER);
81 joy_axis_range.diph.dwObj = DIJOFS_Y;
82 joy_axis_range.diph.dwHow = DIPH_BYOFFSET;
83 lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph);
85 if (FAILED(lpdi_joystick[c]->Acquire()))
86 fatal("joystick_init : Acquire failed\n");
87 }
88 }
90 void joystick_close()
91 {
92 if (lpdi_joystick[1])
93 {
94 lpdi_joystick[1]->Release();
95 lpdi_joystick[1] = NULL;
96 }
97 if (lpdi_joystick[0])
98 {
99 lpdi_joystick[0]->Release();
100 lpdi_joystick[0] = NULL;
101 }
102 }
104 void joystick_poll()
105 {
106 int c;
108 for (c = 0; c < joysticks_present; c++)
109 {
110 DIJOYSTATE joystate;
112 if (FAILED(lpdi_joystick[c]->Poll()))
113 {
114 lpdi_joystick[c]->Acquire();
115 lpdi_joystick[c]->Poll();
116 }
117 if (FAILED(lpdi_joystick[c]->GetDeviceState(sizeof(DIJOYSTATE), (LPVOID)&joystate)))
118 {
119 lpdi_joystick[c]->Acquire();
120 lpdi_joystick[c]->Poll();
121 lpdi_joystick[c]->GetDeviceState(sizeof(DIJOYSTATE), (LPVOID)&joystate);
122 }
124 joystick_state[c].x = joystate.lX;
125 joystick_state[c].y = joystate.lY;
126 joystick_state[c].b[0] = joystate.rgbButtons[0] & 0x80;
127 joystick_state[c].b[1] = joystate.rgbButtons[1] & 0x80;
128 joystick_state[c].b[2] = joystate.rgbButtons[2] & 0x80;
129 joystick_state[c].b[3] = joystate.rgbButtons[3] & 0x80;
131 // pclog("joystick %i - x=%i y=%i b[0]=%i b[1]=%i %i\n", c, joystick_state[c].x, joystick_state[c].y, joystick_state[c].b[0], joystick_state[c].b[1], joysticks_present);
132 }
133 }
