test/checkkeys.c
author Patrice Mandin <patmandin@gmail.com>
Thu, 19 Jan 2006 21:28:52 +0000
changeset 1257 448a9a64537b
parent 1253 7c7ddaf195bf
child 1662 782fd950bd46
child 1895 c121d94672cb
permissions -rw-r--r--
[PATCH] SDL_GetVideoMode() does not find best mode, part 2

Following commit 1.51, I come accross a problem when SDL must choose between
several video modes that could suit the one asked.

If I ask 320x240 with this list:
768x480 768x240 640x400 640x200 384x480 384x240 320x400 320x200

The smallest selectables modes are 384x240 and 320x400. And SDL choose the later
in this list, but 384x240 is more suitable. So I added a check to compare
the pixel count (surface) of modes, and select the one which has the smallest
pixel count.

In my example, 384x240 has 92160 pixels, and 320x400 has 128000 pixels. So now
SDL will choose 384x240 for the asked 320x240 mode.
     1 
     2 /* Simple program:  Loop, watching keystrokes
     3    Note that you need to call SDL_PollEvent() or SDL_WaitEvent() to 
     4    pump the event loop and catch keystrokes.
     5 */
     6 
     7 #include <stdio.h>
     8 #include <stdlib.h>
     9 #include <string.h>
    10 
    11 #include "SDL.h"
    12 
    13 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
    14 static void quit(int rc)
    15 {
    16 	SDL_Quit();
    17 	exit(rc);
    18 }
    19 
    20 static void print_modifiers(void)
    21 {
    22 	int mod;
    23 	printf(" modifiers:");
    24 	mod = SDL_GetModState();
    25 	if(!mod) {
    26 		printf(" (none)");
    27 		return;
    28 	}
    29 	if(mod & KMOD_LSHIFT)
    30 		printf(" LSHIFT");
    31 	if(mod & KMOD_RSHIFT)
    32 		printf(" RSHIFT");
    33 	if(mod & KMOD_LCTRL)
    34 		printf(" LCTRL");
    35 	if(mod & KMOD_RCTRL)
    36 		printf(" RCTRL");
    37 	if(mod & KMOD_LALT)
    38 		printf(" LALT");
    39 	if(mod & KMOD_RALT)
    40 		printf(" RALT");
    41 	if(mod & KMOD_LMETA)
    42 		printf(" LMETA");
    43 	if(mod & KMOD_RMETA)
    44 		printf(" RMETA");
    45 	if(mod & KMOD_NUM)
    46 		printf(" NUM");
    47 	if(mod & KMOD_CAPS)
    48 		printf(" CAPS");
    49 	if(mod & KMOD_MODE)
    50 		printf(" MODE");
    51 }
    52 
    53 static void PrintKey(SDL_keysym *sym, int pressed)
    54 {
    55 	/* Print the keycode, name and state */
    56 	if ( sym->sym ) {
    57 		printf("Key %s:  %d-%s ", pressed ?  "pressed" : "released",
    58 					sym->sym, SDL_GetKeyName(sym->sym));
    59 	} else {
    60 		printf("Unknown Key (scancode = %d) %s ", sym->scancode,
    61 					pressed ?  "pressed" : "released");
    62 	}
    63 
    64 	/* Print the translated character, if one exists */
    65 	if ( sym->unicode ) {
    66 		/* Is it a control-character? */
    67 		if ( sym->unicode < ' ' ) {
    68 			printf(" (^%c)", sym->unicode+'@');
    69 		} else {
    70 #ifdef UNICODE
    71 			printf(" (%c)", sym->unicode);
    72 #else
    73 			/* This is a Latin-1 program, so only show 8-bits */
    74 			if ( !(sym->unicode & 0xFF00) )
    75 				printf(" (%c)", sym->unicode);
    76 			else
    77 				printf(" (0x%X)", sym->unicode);
    78 #endif
    79 		}
    80 	}
    81 	print_modifiers();
    82 	printf("\n");
    83 }
    84 
    85 int main(int argc, char *argv[])
    86 {
    87 	SDL_Event event;
    88 	int done;
    89 	Uint32 videoflags;
    90 
    91 	/* Initialize SDL */
    92 	if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    93 		fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
    94 		return(1);
    95 	}
    96 
    97 	videoflags = SDL_SWSURFACE;
    98 	while( argc > 1 ) {
    99 		--argc;
   100 		if ( argv[argc] && !strcmp(argv[argc], "-fullscreen") ) {
   101 			videoflags |= SDL_FULLSCREEN;
   102 		} else {
   103 			fprintf(stderr, "Usage: %s [-fullscreen]\n", argv[0]);
   104 			quit(1);
   105 		}
   106 	}
   107 
   108 	/* Set 640x480 video mode */
   109 	if ( SDL_SetVideoMode(640, 480, 0, videoflags) == NULL ) {
   110 		fprintf(stderr, "Couldn't set 640x480 video mode: %s\n",
   111 							SDL_GetError());
   112 		quit(2);
   113 	}
   114 
   115 	/* Enable UNICODE translation for keyboard input */
   116 	SDL_EnableUNICODE(1);
   117 
   118 	/* Enable auto repeat for keyboard input */
   119 	SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,
   120 	                    SDL_DEFAULT_REPEAT_INTERVAL);
   121 
   122 	/* Watch keystrokes */
   123 	done = 0;
   124 	while ( !done ) {
   125 		/* Check for events */
   126 		SDL_WaitEvent(&event);
   127 		switch (event.type) {
   128 			case SDL_KEYDOWN:
   129 				PrintKey(&event.key.keysym, 1);
   130 				break;
   131 			case SDL_KEYUP:
   132 				PrintKey(&event.key.keysym, 0);
   133 				break;
   134 			case SDL_MOUSEBUTTONDOWN:
   135 				/* Any button press quits the app... */
   136 			case SDL_QUIT:
   137 				done = 1;
   138 				break;
   139 			default:
   140 				break;
   141 		}
   142 	}
   143 
   144 	SDL_Quit();
   145 	return(0);
   146 }