rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@0
|
3 #include <windows.h>
|
nuclear@0
|
4 #include "si.h"
|
nuclear@0
|
5 #include "siapp.h"
|
nuclear@0
|
6
|
nuclear@0
|
7 HWND create_window();
|
nuclear@0
|
8 void destroy_window(HWND win);
|
nuclear@0
|
9 bool connect_spnav(HWND win);
|
nuclear@0
|
10 void close_spnav();
|
nuclear@0
|
11 LRESULT CALLBACK winmsg_handler(HWND win, unsigned int msg, WPARAM wparam, LPARAM lparam);
|
nuclear@0
|
12
|
nuclear@0
|
13 SiHdl si_dev;
|
nuclear@0
|
14
|
nuclear@0
|
15 int main()
|
nuclear@0
|
16 {
|
nuclear@0
|
17 HWND win = create_window();
|
nuclear@0
|
18 if(!win) {
|
nuclear@0
|
19 return 1;
|
nuclear@0
|
20 }
|
nuclear@0
|
21 if(!connect_spnav(win)) {
|
nuclear@0
|
22 return 1;
|
nuclear@0
|
23 }
|
nuclear@0
|
24
|
nuclear@0
|
25 MSG msg;
|
nuclear@0
|
26 while(GetMessage(&msg, win, 0, 0)) {
|
nuclear@0
|
27 TranslateMessage(&msg);
|
nuclear@0
|
28 DispatchMessage(&msg);
|
nuclear@0
|
29 }
|
nuclear@0
|
30 destroy_window(win);
|
nuclear@0
|
31 return 0;
|
nuclear@0
|
32 }
|
nuclear@0
|
33
|
nuclear@0
|
34 HWND create_window()
|
nuclear@0
|
35 {
|
nuclear@0
|
36 HINSTANCE hinst = GetModuleHandle(0);
|
nuclear@0
|
37
|
nuclear@0
|
38 WNDCLASS wc;
|
nuclear@0
|
39 memset(&wc, 0, sizeof wc);
|
nuclear@0
|
40 wc.lpfnWndProc = winmsg_handler;
|
nuclear@0
|
41 wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
|
nuclear@0
|
42 wc.hCursor = LoadCursor(0, IDC_ARROW);
|
nuclear@0
|
43 wc.hIcon = LoadIcon(0, IDI_APPLICATION);
|
nuclear@0
|
44 wc.lpszClassName = "foobar_window";
|
nuclear@0
|
45 wc.style = CS_HREDRAW | CS_VREDRAW;
|
nuclear@0
|
46 RegisterClass(&wc);
|
nuclear@0
|
47
|
nuclear@0
|
48 HWND win = CreateWindow("foobar_window", "test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
|
nuclear@0
|
49 100, 100, 0, 0, hinst, 0);
|
nuclear@0
|
50 if(!win) {
|
nuclear@0
|
51 return 0;
|
nuclear@0
|
52 }
|
nuclear@0
|
53 ShowWindow(win, 1);
|
nuclear@0
|
54 UpdateWindow(win);
|
nuclear@0
|
55
|
nuclear@0
|
56 return win;
|
nuclear@0
|
57 }
|
nuclear@0
|
58
|
nuclear@0
|
59 void destroy_window(HWND win)
|
nuclear@0
|
60 {
|
nuclear@0
|
61 DestroyWindow(win);
|
nuclear@0
|
62 UnregisterClass("foobar_window", GetModuleHandle(0));
|
nuclear@0
|
63 }
|
nuclear@0
|
64
|
nuclear@0
|
65 bool connect_spnav(HWND win)
|
nuclear@0
|
66 {
|
nuclear@0
|
67 SiOpenData sidata;
|
nuclear@0
|
68
|
nuclear@0
|
69 if(SiInitialize() != 0) {
|
nuclear@0
|
70 fprintf(stderr, "SiInitialize failed\n");
|
nuclear@0
|
71 return false;
|
nuclear@0
|
72 }
|
nuclear@0
|
73 SiOpenWinInit(&sidata, win);
|
nuclear@0
|
74
|
nuclear@0
|
75 if(!(si_dev = SiOpen("spnavtest", SI_ANY_DEVICE, SI_NO_MASK, SI_EVENT, &sidata))) {
|
nuclear@0
|
76 fprintf(stderr, "SiOpen failed\n");
|
nuclear@0
|
77 return false;
|
nuclear@0
|
78 }
|
nuclear@0
|
79 return true;
|
nuclear@0
|
80 }
|
nuclear@0
|
81
|
nuclear@0
|
82 void close_spnav()
|
nuclear@0
|
83 {
|
nuclear@0
|
84 if(si_dev) {
|
nuclear@0
|
85 SiClose(si_dev);
|
nuclear@0
|
86 }
|
nuclear@0
|
87 SiTerminate();
|
nuclear@0
|
88 }
|
nuclear@0
|
89
|
nuclear@0
|
90 void handle_si_event(SiSpwEvent *ev)
|
nuclear@0
|
91 {
|
nuclear@0
|
92 int bn;
|
nuclear@0
|
93
|
nuclear@0
|
94 switch(ev->type) {
|
nuclear@0
|
95 case SI_BUTTON_EVENT:
|
nuclear@0
|
96 if((bn = SiButtonPressed(ev)) != SI_NO_BUTTON) {
|
nuclear@0
|
97 printf("button %d pressed\n", bn);
|
nuclear@0
|
98 }
|
nuclear@0
|
99 if((bn = SiButtonReleased(ev)) != SI_NO_BUTTON) {
|
nuclear@0
|
100 printf("button %d released\n", bn);
|
nuclear@0
|
101 }
|
nuclear@0
|
102 break;
|
nuclear@0
|
103
|
nuclear@0
|
104 case SI_MOTION_EVENT:
|
nuclear@0
|
105 printf("motion: ");
|
nuclear@0
|
106 for(int i=0; i<6; i++) {
|
nuclear@0
|
107 printf("%ld ", ev->u.spwData.mData[i]);
|
nuclear@0
|
108 if(i == 2) {
|
nuclear@0
|
109 printf("- ");
|
nuclear@0
|
110 }
|
nuclear@0
|
111 }
|
nuclear@0
|
112 fputc('\n', stdout);
|
nuclear@0
|
113 break;
|
nuclear@0
|
114
|
nuclear@0
|
115 default:
|
nuclear@0
|
116 break;
|
nuclear@0
|
117 }
|
nuclear@0
|
118 }
|
nuclear@0
|
119
|
nuclear@0
|
120 LRESULT CALLBACK winmsg_handler(HWND win, unsigned int msg, WPARAM wparam, LPARAM lparam)
|
nuclear@0
|
121 {
|
nuclear@0
|
122 SiSpwEvent siev;
|
nuclear@0
|
123 SiGetEventData siev_data;
|
nuclear@0
|
124
|
nuclear@0
|
125 SiGetEventWinInit(&siev_data, msg, wparam, lparam);
|
nuclear@0
|
126 SpwRetVal val = SiGetEvent(si_dev, 0, &siev_data, &siev);
|
nuclear@0
|
127 if(val == SI_SKIP_EVENT) {
|
nuclear@0
|
128 return 0;
|
nuclear@0
|
129 } else if(val == SI_IS_EVENT) {
|
nuclear@0
|
130 handle_si_event(&siev);
|
nuclear@0
|
131 return 0;
|
nuclear@0
|
132 }
|
nuclear@0
|
133
|
nuclear@0
|
134 switch(msg) {
|
nuclear@0
|
135 case WM_CLOSE:
|
nuclear@0
|
136 printf("WM_CLOSE\n");
|
nuclear@0
|
137 DestroyWindow(win);
|
nuclear@0
|
138 break;
|
nuclear@0
|
139
|
nuclear@0
|
140 case WM_DESTROY:
|
nuclear@0
|
141 printf("WM_DESTROY\n");
|
nuclear@0
|
142 PostQuitMessage(0);
|
nuclear@0
|
143 break;
|
nuclear@0
|
144
|
nuclear@0
|
145 default:
|
nuclear@0
|
146 return DefWindowProc(win, msg, wparam, lparam);
|
nuclear@0
|
147 }
|
nuclear@0
|
148 return 0;
|
nuclear@0
|
149 } |