2 /* Test out the window manager interaction functions */
10 /* Is the cursor visible? */
11 static int visible
= 1;
13 static Uint8 video_bpp
;
14 static Uint32 video_flags
;
16 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
17 static void quit(int rc
)
23 int SetVideoMode(int w
, int h
)
28 SDL_Color palette
[256];
30 screen
= SDL_SetVideoMode(w
, h
, video_bpp
, video_flags
);
31 if ( screen
== NULL
) {
32 fprintf(stderr
, "Couldn't set %dx%dx%d video mode: %s\n",
33 w
, h
, video_bpp
, SDL_GetError());
36 printf("Running in %s mode\n", screen
->flags
& SDL_FULLSCREEN
?
37 "fullscreen" : "windowed");
39 /* Set the surface pixels and refresh! */
40 for ( i
=0; i
<256; ++i
) {
45 SDL_SetColors(screen
, palette
, 0, 256);
46 if ( SDL_LockSurface(screen
) < 0 ) {
47 fprintf(stderr
, "Couldn't lock display surface: %s\n",
51 buffer
= (Uint8
*)screen
->pixels
;
52 for ( i
=0; i
<screen
->h
; ++i
) {
53 memset(buffer
,(i
*255)/screen
->h
,
54 screen
->w
*screen
->format
->BytesPerPixel
);
55 buffer
+= screen
->pitch
;
57 SDL_UnlockSurface(screen
);
58 SDL_UpdateRect(screen
, 0, 0, 0, 0);
63 SDL_Surface
*LoadIconSurface(char *file
, Uint8
**maskp
)
72 /* Load the icon surface */
73 icon
= SDL_LoadBMP(file
);
75 fprintf(stderr
, "Couldn't load %s: %s\n", file
, SDL_GetError());
79 /* Check width and height
80 if ( (icon->w%8) != 0 ) {
81 fprintf(stderr, "Icon width must be a multiple of 8!\n");
82 SDL_FreeSurface(icon);
88 if ( icon
->format
->palette
== NULL
) {
89 fprintf(stderr
, "Icon must have a palette!\n");
90 SDL_FreeSurface(icon
);
94 /* Set the colorkey */
95 SDL_SetColorKey(icon
, SDL_SRCCOLORKEY
, *((Uint8
*)icon
->pixels
));
98 pixels
= (Uint8
*)icon
->pixels
;
99 printf("Transparent pixel: (%d,%d,%d)\n",
100 icon
->format
->palette
->colors
[*pixels
].r
,
101 icon
->format
->palette
->colors
[*pixels
].g
,
102 icon
->format
->palette
->colors
[*pixels
].b
);
103 mlen
= (icon
->w
*icon
->h
+ 7) / 8;
104 mask
= (Uint8
*)malloc(mlen
);
105 if ( mask
== NULL
) {
106 fprintf(stderr
, "Out of memory!\n");
107 SDL_FreeSurface(icon
);
110 memset(mask
, 0, mlen
);
111 for ( i
=0; i
< icon
->h
; i
++)
112 for (j
=0; j
< icon
->w
; j
++) {
113 int pindex
= i
* icon
->pitch
+ j
;
114 int mindex
= i
* icon
->w
+ j
;
115 if ( pixels
[pindex
] != *pixels
)
116 mask
[mindex
>>3] |= 1 << (7 - (mindex
& 7));
122 void HotKey_ToggleFullScreen(void)
126 screen
= SDL_GetVideoSurface();
127 if ( SDL_WM_ToggleFullScreen(screen
) ) {
128 printf("Toggled fullscreen mode - now %s\n",
129 (screen
->flags
&SDL_FULLSCREEN
) ? "fullscreen" : "windowed");
131 printf("Unable to toggle fullscreen mode\n");
132 video_flags
^= SDL_FULLSCREEN
;
133 SetVideoMode(screen
->w
, screen
->h
);
137 void HotKey_ToggleGrab(void)
141 printf("Ctrl-G: toggling input grab!\n");
142 mode
= SDL_WM_GrabInput(SDL_GRAB_QUERY
);
143 if ( mode
== SDL_GRAB_ON
) {
144 printf("Grab was on\n");
146 printf("Grab was off\n");
148 mode
= SDL_WM_GrabInput(mode
? SDL_GRAB_OFF
: SDL_GRAB_ON
);
149 if ( mode
== SDL_GRAB_ON
) {
150 printf("Grab is now on\n");
152 printf("Grab is now off\n");
156 void HotKey_Iconify(void)
158 printf("Ctrl-Z: iconifying window!\n");
159 SDL_WM_IconifyWindow();
162 void HotKey_Quit(void)
166 printf("Posting internal quit request\n");
167 event
.type
= SDL_USEREVENT
;
168 SDL_PushEvent(&event
);
171 int SDLCALL
FilterEvents(const SDL_Event
*event
)
173 static int reallyquit
= 0;
175 switch (event
->type
) {
177 case SDL_ACTIVEEVENT
:
178 /* See what happened */
180 event
->active
.gain
? "gained" : "lost");
181 if ( event
->active
.state
& SDL_APPACTIVE
)
183 if ( event
->active
.state
& SDL_APPINPUTFOCUS
)
185 if ( event
->active
.state
& SDL_APPMOUSEFOCUS
)
189 /* See if we are iconified or restored */
190 if ( event
->active
.state
& SDL_APPACTIVE
) {
191 printf("App has been %s\n",
193 "restored" : "iconified");
197 /* We want to toggle visibility on buttonpress */
198 case SDL_MOUSEBUTTONDOWN
:
199 case SDL_MOUSEBUTTONUP
:
200 if ( event
->button
.state
== SDL_PRESSED
) {
202 SDL_ShowCursor(visible
);
204 printf("Mouse button %d has been %s\n",
205 event
->button
.button
,
206 (event
->button
.state
== SDL_PRESSED
) ?
207 "pressed" : "released");
210 /* Show relative mouse motion */
211 case SDL_MOUSEMOTION
:
213 printf("Mouse motion: {%d,%d} (%d,%d)\n",
214 event
->motion
.x
, event
->motion
.y
,
215 event
->motion
.xrel
, event
->motion
.yrel
);
220 if ( event
->key
.keysym
.sym
== SDLK_ESCAPE
) {
223 if ( (event
->key
.keysym
.sym
== SDLK_g
) &&
224 (event
->key
.keysym
.mod
& KMOD_CTRL
) ) {
227 if ( (event
->key
.keysym
.sym
== SDLK_z
) &&
228 (event
->key
.keysym
.mod
& KMOD_CTRL
) ) {
231 if ( (event
->key
.keysym
.sym
== SDLK_RETURN
) &&
232 (event
->key
.keysym
.mod
& KMOD_ALT
) ) {
233 HotKey_ToggleFullScreen();
237 /* Pass the video resize event through .. */
238 case SDL_VIDEORESIZE
:
241 /* This is important! Queue it if we want to quit. */
243 if ( ! reallyquit
) {
245 printf("Quit requested\n");
248 printf("Quit demanded\n");
251 /* This will never happen because events queued directly
252 to the event queue are not filtered.
257 /* Drop all other events */
263 int main(int argc
, char *argv
[])
272 if ( SDL_Init(SDL_INIT_VIDEO
) < 0 ) {
274 "Couldn't initialize SDL: %s\n", SDL_GetError());
278 /* Check command line arguments */
282 video_flags
= SDL_SWSURFACE
;
285 if ( (argc
>= 2) && (strcmp(argv
[1], "-fullscreen") == 0) ) {
286 video_flags
|= SDL_FULLSCREEN
;
290 if ( (argc
>= 2) && (strcmp(argv
[1], "-resize") == 0) ) {
291 video_flags
|= SDL_RESIZABLE
;
295 if ( (argc
>= 2) && (strcmp(argv
[1], "-noframe") == 0) ) {
296 video_flags
|= SDL_NOFRAME
;
300 if ( (argc
>= 3) && (strcmp(argv
[1], "-width") == 0) ) {
305 if ( (argc
>= 3) && (strcmp(argv
[1], "-height") == 0) ) {
310 if ( (argc
>= 3) && (strcmp(argv
[1], "-bpp") == 0) ) {
311 video_bpp
= atoi(argv
[2]);
319 /* Set the icon -- this must be done before the first mode set */
320 icon
= LoadIconSurface("icon.bmp", &icon_mask
);
321 if ( icon
!= NULL
) {
322 SDL_WM_SetIcon(icon
, icon_mask
);
324 if ( icon_mask
!= NULL
)
327 /* Set the title bar */
328 if ( argv
[1] == NULL
)
329 title
= "Testing 1.. 2.. 3...";
332 SDL_WM_SetCaption(title
, "testwm");
334 /* See if it's really set */
335 SDL_WM_GetCaption(&title
, NULL
);
337 printf("Title was set to: %s\n", title
);
339 printf("No window title was set!\n");
341 /* Initialize the display */
342 if ( SetVideoMode(w
, h
) < 0 ) {
346 /* Set an event filter that discards everything but QUIT */
347 SDL_SetEventFilter(FilterEvents
);
349 /* Ignore key up events, they don't even get filtered */
350 SDL_EventState(SDL_KEYUP
, SDL_IGNORE
);
352 /* Loop, waiting for QUIT */
353 while ( SDL_WaitEvent(&event
) ) {
354 switch (event
.type
) {
355 case SDL_VIDEORESIZE
:
356 printf("Got a resize event: %dx%d\n",
357 event
.resize
.w
, event
.resize
.h
);
358 SetVideoMode(event
.resize
.w
, event
.resize
.h
);
361 printf("Handling internal quit request\n");
362 /* Fall through to the quit handler */
364 printf("Bye bye..\n");
367 /* This should never happen */
368 printf("Warning: Event %d wasn't filtered\n",
373 printf("SDL_WaitEvent() error: %s\n", SDL_GetError());