Mercurial > sdl-ios-xcode
annotate test/testjoystick.c @ 3877:81f66f258d77 SDL-1.2
Fixed bug #281
------- Comment #2 From Christian Walther 2006-07-23 07:37 [reply] -------
Wow, that was an interesting bug to chase. It was a timing issue: it seems that
for some reason, a certain time must pass between ShowMenuBar() being called in
QZ_UnsetVideoMode() and the application quitting. Before rev. 1885, this delay
was provided by the slow hand-coded fade. With the asynchronous Core Graphics
fading introduced in rev. 1885, that delay was no longer present (most of the
time) and the bug became apparent. Adding an SDL_Delay(100) somewhere between
ShowMenuBar() and the end of QZ_VideoQuit() lowered the frequency of the bug
appearing from "almost every time" to "very rarely" here.
However, there is another solution: doing the ShowMenuBar() before releasing
the captured display instead of afterwards. Apparently, no delay is necessary
in that case, and it looks nicer to me anyway because it is the reverse order
of the way things are set up in the beginning: capture display - set video mode
- hide menu bar - ... - show menu bar - reset video mode - release captured
display. So, this is what the attached patch does.
In addition, I've taken the liberty of
- removing some unused code that I forgot to remove in rev. 1885,
- fixing two warnings about undeclared functions in SDL_QuartzVideo.m by
including OpenGL.h (whose name is a bit misleading - it only declares CGL
stuff, so there's no interference with SDL_opengl.h).
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 24 Sep 2006 01:27:40 +0000 |
parents | 5ff2c01e475e |
children | c121d94672cb 3d9040dcc47e |
rev | line source |
---|---|
0 | 1 |
2 /* Simple program to test the SDL joystick routines */ | |
3 | |
4 #include <stdio.h> | |
5 #include <stdlib.h> | |
6 #include <string.h> | |
7 | |
8 #include "SDL.h" | |
9 | |
10 #define SCREEN_WIDTH 640 | |
11 #define SCREEN_HEIGHT 480 | |
12 | |
13 void WatchJoystick(SDL_Joystick *joystick) | |
14 { | |
15 SDL_Surface *screen; | |
16 const char *name; | |
17 int i, done; | |
18 SDL_Event event; | |
19 int x, y, draw; | |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
20 SDL_Rect axis_area[2]; |
0 | 21 |
22 /* Set a video mode to display joystick axis position */ | |
23 screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, 0); | |
24 if ( screen == NULL ) { | |
25 fprintf(stderr, "Couldn't set video mode: %s\n",SDL_GetError()); | |
26 return; | |
27 } | |
28 | |
29 /* Print info about the joystick we are watching */ | |
30 name = SDL_JoystickName(SDL_JoystickIndex(joystick)); | |
31 printf("Watching joystick %d: (%s)\n", SDL_JoystickIndex(joystick), | |
32 name ? name : "Unknown Joystick"); | |
33 printf("Joystick has %d axes, %d hats, %d balls, and %d buttons\n", | |
34 SDL_JoystickNumAxes(joystick), SDL_JoystickNumHats(joystick), | |
35 SDL_JoystickNumBalls(joystick),SDL_JoystickNumButtons(joystick)); | |
36 | |
37 /* Initialize drawing rectangles */ | |
38 memset(axis_area, 0, (sizeof axis_area)); | |
39 draw = 0; | |
40 | |
41 /* Loop, getting joystick events! */ | |
42 done = 0; | |
43 while ( ! done ) { | |
44 while ( SDL_PollEvent(&event) ) { | |
45 switch (event.type) { | |
46 case SDL_JOYAXISMOTION: | |
47 printf("Joystick %d axis %d value: %d\n", | |
48 event.jaxis.which, | |
49 event.jaxis.axis, | |
50 event.jaxis.value); | |
51 break; | |
52 case SDL_JOYHATMOTION: | |
53 printf("Joystick %d hat %d value:", | |
54 event.jhat.which, | |
55 event.jhat.hat); | |
56 if ( event.jhat.value == SDL_HAT_CENTERED ) | |
57 printf(" centered"); | |
58 if ( event.jhat.value & SDL_HAT_UP ) | |
59 printf(" up"); | |
60 if ( event.jhat.value & SDL_HAT_RIGHT ) | |
61 printf(" right"); | |
62 if ( event.jhat.value & SDL_HAT_DOWN ) | |
63 printf(" down"); | |
64 if ( event.jhat.value & SDL_HAT_LEFT ) | |
65 printf(" left"); | |
66 printf("\n"); | |
67 break; | |
68 case SDL_JOYBALLMOTION: | |
69 printf("Joystick %d ball %d delta: (%d,%d)\n", | |
70 event.jball.which, | |
71 event.jball.ball, | |
72 event.jball.xrel, | |
73 event.jball.yrel); | |
74 break; | |
75 case SDL_JOYBUTTONDOWN: | |
76 printf("Joystick %d button %d down\n", | |
77 event.jbutton.which, | |
78 event.jbutton.button); | |
79 break; | |
80 case SDL_JOYBUTTONUP: | |
81 printf("Joystick %d button %d up\n", | |
82 event.jbutton.which, | |
83 event.jbutton.button); | |
84 break; | |
85 case SDL_KEYDOWN: | |
86 if ( event.key.keysym.sym != SDLK_ESCAPE ) { | |
87 break; | |
88 } | |
89 /* Fall through to signal quit */ | |
90 case SDL_QUIT: | |
91 done = 1; | |
92 break; | |
93 default: | |
94 break; | |
95 } | |
96 } | |
97 /* Update visual joystick state */ | |
98 for ( i=0; i<SDL_JoystickNumButtons(joystick); ++i ) { | |
99 SDL_Rect area; | |
100 | |
101 area.x = i*34; | |
102 area.y = SCREEN_HEIGHT-34; | |
103 area.w = 32; | |
104 area.h = 32; | |
105 if (SDL_JoystickGetButton(joystick, i) == SDL_PRESSED) { | |
106 SDL_FillRect(screen, &area, 0xFFFF); | |
107 } else { | |
108 SDL_FillRect(screen, &area, 0x0000); | |
109 } | |
110 SDL_UpdateRects(screen, 1, &area); | |
111 } | |
112 | |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
113 /* Erase previous axes */ |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
114 SDL_FillRect(screen, &axis_area[draw], 0x0000); |
0 | 115 |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
116 /* Draw the X/Y axis */ |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
117 draw = !draw; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
118 x = (((int)SDL_JoystickGetAxis(joystick, 0))+32768); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
119 x *= SCREEN_WIDTH; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
120 x /= 65535; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
121 if ( x < 0 ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
122 x = 0; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
123 } else |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
124 if ( x > (SCREEN_WIDTH-16) ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
125 x = SCREEN_WIDTH-16; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
126 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
127 y = (((int)SDL_JoystickGetAxis(joystick, 1))+32768); |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
128 y *= SCREEN_HEIGHT; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
129 y /= 65535; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
130 if ( y < 0 ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
131 y = 0; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
132 } else |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
133 if ( y > (SCREEN_HEIGHT-16) ) { |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
134 y = SCREEN_HEIGHT-16; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
135 } |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
136 axis_area[draw].x = (Sint16)x; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
137 axis_area[draw].y = (Sint16)y; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
138 axis_area[draw].w = 16; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
139 axis_area[draw].h = 16; |
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
140 SDL_FillRect(screen, &axis_area[draw], 0xFFFF); |
1854 | 141 |
1855
5ff2c01e475e
Moved DirectInput joystick code to 1.3 branch
Sam Lantinga <slouken@libsdl.org>
parents:
1854
diff
changeset
|
142 SDL_UpdateRects(screen, 2, axis_area); |
0 | 143 } |
144 } | |
145 | |
146 int main(int argc, char *argv[]) | |
147 { | |
148 const char *name; | |
149 int i; | |
150 SDL_Joystick *joystick; | |
151 | |
152 /* Initialize SDL (Note: video is required to start event loop) */ | |
153 if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0 ) { | |
154 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); | |
155 exit(1); | |
156 } | |
157 | |
158 /* Print information about the joysticks */ | |
159 printf("There are %d joysticks attached\n", SDL_NumJoysticks()); | |
160 for ( i=0; i<SDL_NumJoysticks(); ++i ) { | |
161 name = SDL_JoystickName(i); | |
162 printf("Joystick %d: %s\n",i,name ? name : "Unknown Joystick"); | |
163 } | |
164 | |
165 if ( argv[1] ) { | |
166 joystick = SDL_JoystickOpen(atoi(argv[1])); | |
167 if ( joystick == NULL ) { | |
168 printf("Couldn't open joystick %d: %s\n", atoi(argv[1]), | |
169 SDL_GetError()); | |
170 } else { | |
171 WatchJoystick(joystick); | |
172 SDL_JoystickClose(joystick); | |
173 } | |
174 } | |
175 SDL_QuitSubSystem(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK); | |
176 | |
177 return(0); | |
178 } |