3dxware_test

annotate main.cc @ 0:0219182eb47b

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 09 Jul 2013 04:46:51 +0300
parents
children
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 }