3dxware_test

view main.cc @ 0:0219182eb47b

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