Mercurial > sdl-ios-xcode
diff test/testwm.c @ 0:74212992fb08
Initial revision
author | Sam Lantinga <slouken@lokigames.com> |
---|---|
date | Thu, 26 Apr 2001 16:45:43 +0000 |
parents | |
children | 3ef4bc90c388 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/testwm.c Thu Apr 26 16:45:43 2001 +0000 @@ -0,0 +1,350 @@ + +/* Test out the window manager interaction functions */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "SDL.h" + +/* Is the cursor visible? */ +static int visible = 1; + +SDL_Surface *LoadIconSurface(char *file, Uint8 **maskp) +{ + SDL_Surface *icon; + Uint8 *pixels; + Uint8 *mask; + int mlen, i; + + *maskp = NULL; + + /* Load the icon surface */ + icon = SDL_LoadBMP(file); + if ( icon == NULL ) { + fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError()); + return(NULL); + } + + /* Check width and height */ + if ( (icon->w%8) != 0 ) { + fprintf(stderr, "Icon width must be a multiple of 8!\n"); + SDL_FreeSurface(icon); + return(NULL); + } + if ( icon->format->palette == NULL ) { + fprintf(stderr, "Icon must have a palette!\n"); + SDL_FreeSurface(icon); + return(NULL); + } + + /* Set the colorkey */ + SDL_SetColorKey(icon, SDL_SRCCOLORKEY, *((Uint8 *)icon->pixels)); + + /* Create the mask */ + pixels = (Uint8 *)icon->pixels; + printf("Transparent pixel: (%d,%d,%d)\n", + icon->format->palette->colors[*pixels].r, + icon->format->palette->colors[*pixels].g, + icon->format->palette->colors[*pixels].b); + mlen = icon->w*icon->h; + mask = (Uint8 *)malloc(mlen/8); + if ( mask == NULL ) { + fprintf(stderr, "Out of memory!\n"); + SDL_FreeSurface(icon); + return(NULL); + } + memset(mask, 0, mlen/8); + for ( i=0; i<mlen; ) { + if ( pixels[i] != *pixels ) + mask[i/8] |= 0x01; + ++i; + if ( (i%8) != 0 ) + mask[i/8] <<= 1; + } + *maskp = mask; + return(icon); +} + +void HotKey_ToggleFullScreen(void) +{ + SDL_Surface *screen; + + screen = SDL_GetVideoSurface(); + if ( SDL_WM_ToggleFullScreen(screen) ) { + printf("Toggled fullscreen mode - now %s\n", + (screen->flags&SDL_FULLSCREEN) ? "fullscreen" : "windowed"); + } else { + printf("Unable to toggle fullscreen mode\n"); + } +} + +void HotKey_ToggleGrab(void) +{ + SDL_GrabMode mode; + + printf("Ctrl-G: toggling input grab!\n"); + mode = SDL_WM_GrabInput(SDL_GRAB_QUERY); + if ( mode == SDL_GRAB_ON ) { + printf("Grab was on\n"); + } else { + printf("Grab was off\n"); + } + mode = SDL_WM_GrabInput(!mode); + if ( mode == SDL_GRAB_ON ) { + printf("Grab is now on\n"); + } else { + printf("Grab is now off\n"); + } +} + +void HotKey_Iconify(void) +{ + printf("Ctrl-Z: iconifying window!\n"); + SDL_WM_IconifyWindow(); +} + +void HotKey_Quit(void) +{ + SDL_Event event; + + printf("Posting internal quit request\n"); + event.type = SDL_USEREVENT; + SDL_PushEvent(&event); +} + +int FilterEvents(const SDL_Event *event) +{ + static int reallyquit = 0; + + switch (event->type) { + + case SDL_ACTIVEEVENT: + /* See what happened */ + printf("App %s ", + event->active.gain ? "gained" : "lost"); + if ( event->active.state & SDL_APPACTIVE ) + printf("active "); + if ( event->active.state & SDL_APPMOUSEFOCUS ) + printf("mouse "); + if ( event->active.state & SDL_APPINPUTFOCUS ) + printf("input "); + printf("focus\n"); + + /* See if we are iconified or restored */ + if ( event->active.state & SDL_APPACTIVE ) { + printf("App has been %s\n", + event->active.gain ? + "restored" : "iconified"); + } + return(0); + + /* We want to toggle visibility on buttonpress */ + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + if ( event->button.state == SDL_PRESSED ) { + visible = !visible; + SDL_ShowCursor(visible); + } + printf("Mouse button %d has been %s\n", + event->button.button, + (event->button.state == SDL_PRESSED) ? + "pressed" : "released"); + return(0); + + /* Show relative mouse motion */ + case SDL_MOUSEMOTION: +#if 0 + printf("Mouse relative motion: {%d,%d}\n", + event->motion.xrel, event->motion.yrel); +#endif + return(0); + + case SDL_KEYDOWN: + if ( event->key.keysym.sym == SDLK_ESCAPE ) { + HotKey_Quit(); + } + if ( (event->key.keysym.sym == SDLK_g) && + (event->key.keysym.mod & KMOD_CTRL) ) { + HotKey_ToggleGrab(); + } + if ( (event->key.keysym.sym == SDLK_z) && + (event->key.keysym.mod & KMOD_CTRL) ) { + HotKey_Iconify(); + } + if ( (event->key.keysym.sym == SDLK_RETURN) && + (event->key.keysym.mod & KMOD_ALT) ) { + HotKey_ToggleFullScreen(); + } + return(0); + + /* Pass the video resize event through .. */ + case SDL_VIDEORESIZE: + return(1); + + /* This is important! Queue it if we want to quit. */ + case SDL_QUIT: + if ( ! reallyquit ) { + reallyquit = 1; + printf("Quit requested\n"); + return(0); + } + printf("Quit demanded\n"); + return(1); + + /* This will never happen because events queued directly + to the event queue are not filtered. + */ + case SDL_USEREVENT: + return(1); + + /* Drop all other events */ + default: + return(0); + } +} + +static Uint8 video_bpp; +static Uint32 video_flags; + +int SetVideoMode(int w, int h) +{ + SDL_Surface *screen; + int i; + Uint8 *buffer; + SDL_Color palette[256]; + + screen = SDL_SetVideoMode(w, h, video_bpp, video_flags); + if ( screen == NULL ) { + fprintf(stderr, "Couldn't set %dx%dx%d video mode: %s\n", + w, h, video_bpp, SDL_GetError()); + return(-1); + } + printf("Running in %s mode\n", screen->flags & SDL_FULLSCREEN ? + "fullscreen" : "windowed"); + + /* Set the surface pixels and refresh! */ + for ( i=0; i<256; ++i ) { + palette[i].r = 255-i; + palette[i].g = 255-i; + palette[i].b = 255-i; + } + SDL_SetColors(screen, palette, 0, 256); + if ( SDL_LockSurface(screen) < 0 ) { + fprintf(stderr, "Couldn't lock display surface: %s\n", + SDL_GetError()); + return(-1); + } + buffer = (Uint8 *)screen->pixels; + for ( i=0; i<screen->h; ++i ) { + memset(buffer,(i*255)/screen->h, + screen->w*screen->format->BytesPerPixel); + buffer += screen->pitch; + } + SDL_UnlockSurface(screen); + SDL_UpdateRect(screen, 0, 0, 0, 0); + + return(0); +} + +int main(int argc, char *argv[]) +{ + SDL_Event event; + char *title; + SDL_Surface *icon; + Uint8 *icon_mask; + int parsed; + + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { + fprintf(stderr, + "Couldn't initialize SDL: %s\n", SDL_GetError()); + exit(1); + } + atexit(SDL_Quit); + + /* Check command line arguments */ + video_bpp = 8; + video_flags = SDL_SWSURFACE; + parsed = 1; + while ( parsed ) { + if ( (argc >= 2) && (strcmp(argv[1], "-fullscreen") == 0) ) { + video_flags |= SDL_FULLSCREEN; + argc -= 1; + argv += 1; + } else + if ( (argc >= 2) && (strcmp(argv[1], "-resize") == 0) ) { + video_flags |= SDL_RESIZABLE; + argc -= 1; + argv += 1; + } else + if ( (argc >= 2) && (strcmp(argv[1], "-noframe") == 0) ) { + video_flags |= SDL_NOFRAME; + argc -= 1; + argv += 1; + } else + if ( (argc >= 3) && (strcmp(argv[1], "-bpp") == 0) ) { + video_bpp = atoi(argv[2]); + argc -= 2; + argv += 2; + } else { + parsed = 0; + } + } + + /* Set the icon -- this must be done before the first mode set */ + icon = LoadIconSurface("icon.bmp", &icon_mask); + if ( icon != NULL ) { + SDL_WM_SetIcon(icon, icon_mask); + } + if ( icon_mask != NULL ) + free(icon_mask); + + /* Set the title bar */ + if ( argv[1] == NULL ) + title = "Testing 1.. 2.. 3..."; + else + title = argv[1]; + SDL_WM_SetCaption(title, "testwm"); + + /* See if it's really set */ + SDL_WM_GetCaption(&title, NULL); + if ( title ) + printf("Title was set to: %s\n", title); + else + printf("No window title was set!\n"); + + /* Initialize the display */ + if ( SetVideoMode(640, 480) < 0 ) { + return(1); + } + + /* Set an event filter that discards everything but QUIT */ + SDL_SetEventFilter(FilterEvents); + + /* Ignore key up events, they don't even get filtered */ + SDL_EventState(SDL_KEYUP, SDL_IGNORE); + + /* Loop, waiting for QUIT */ + while ( SDL_WaitEvent(&event) ) { + switch (event.type) { + case SDL_VIDEORESIZE: + printf("Got a resize event: %dx%d\n", + event.resize.w, event.resize.h); + SetVideoMode(event.resize.w, event.resize.h); + break; + case SDL_USEREVENT: + printf("Handling internal quit request\n"); + /* Fall through to the quit handler */ + case SDL_QUIT: + printf("Bye bye..\n"); + return(0); + default: + /* This should never happen */ + printf("Warning: Event %d wasn't filtered\n", + event.type); + break; + } + } + printf("SDL_WaitEvent() error: %s\n", SDL_GetError()); + return(255); +}