testwm.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* Test out the window manager interaction functions */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "SDL.h"
  6. /* Is the cursor visible? */
  7. static int visible = 1;
  8. SDL_Surface *LoadIconSurface(char *file, Uint8 **maskp)
  9. {
  10. SDL_Surface *icon;
  11. Uint8       *pixels;
  12. Uint8       *mask;
  13. int          mlen, i;
  14. *maskp = NULL;
  15. /* Load the icon surface */
  16. icon = SDL_LoadBMP(file);
  17. if ( icon == NULL ) {
  18. fprintf(stderr, "Couldn't load %s: %sn", file, SDL_GetError());
  19. return(NULL);
  20. }
  21. /* Check width and height */
  22. if ( (icon->w%8) != 0 ) {
  23. fprintf(stderr, "Icon width must be a multiple of 8!n");
  24. SDL_FreeSurface(icon);
  25. return(NULL);
  26. }
  27. if ( icon->format->palette == NULL ) {
  28. fprintf(stderr, "Icon must have a palette!n");
  29. SDL_FreeSurface(icon);
  30. return(NULL);
  31. }
  32. /* Set the colorkey */
  33. SDL_SetColorKey(icon, SDL_SRCCOLORKEY, *((Uint8 *)icon->pixels));
  34. /* Create the mask */
  35. pixels = (Uint8 *)icon->pixels;
  36. printf("Transparent pixel: (%d,%d,%d)n",
  37. icon->format->palette->colors[*pixels].r,
  38. icon->format->palette->colors[*pixels].g,
  39. icon->format->palette->colors[*pixels].b);
  40. mlen = icon->w*icon->h;
  41. mask = (Uint8 *)malloc(mlen/8);
  42. if ( mask == NULL ) {
  43. fprintf(stderr, "Out of memory!n");
  44. SDL_FreeSurface(icon);
  45. return(NULL);
  46. }
  47. memset(mask, 0, mlen/8);
  48. for ( i=0; i<mlen; ) {
  49. if ( pixels[i] != *pixels )
  50. mask[i/8] |= 0x01;
  51. ++i;
  52. if ( (i%8) != 0 )
  53. mask[i/8] <<= 1;
  54. }
  55. *maskp = mask;
  56. return(icon);
  57. }
  58. void HotKey_ToggleFullScreen(void)
  59. {
  60. SDL_Surface *screen;
  61. screen = SDL_GetVideoSurface();
  62. if ( SDL_WM_ToggleFullScreen(screen) ) {
  63. printf("Toggled fullscreen mode - now %sn",
  64.     (screen->flags&SDL_FULLSCREEN) ? "fullscreen" : "windowed");
  65. } else {
  66. printf("Unable to toggle fullscreen moden");
  67. }
  68. }
  69. void HotKey_ToggleGrab(void)
  70. {
  71. SDL_GrabMode mode;
  72. printf("Ctrl-G: toggling input grab!n");
  73. mode = SDL_WM_GrabInput(SDL_GRAB_QUERY);
  74. if ( mode == SDL_GRAB_ON ) {
  75. printf("Grab was onn");
  76. } else {
  77. printf("Grab was offn");
  78. }
  79. mode = SDL_WM_GrabInput(!mode);
  80. if ( mode == SDL_GRAB_ON ) {
  81. printf("Grab is now onn");
  82. } else {
  83. printf("Grab is now offn");
  84. }
  85. }
  86. void HotKey_Iconify(void)
  87. {
  88. printf("Ctrl-Z: iconifying window!n");
  89. SDL_WM_IconifyWindow();
  90. }
  91. void HotKey_Quit(void)
  92. {
  93. SDL_Event event;
  94. printf("Posting internal quit requestn");
  95. event.type = SDL_USEREVENT;
  96. SDL_PushEvent(&event);
  97. }
  98. int FilterEvents(const SDL_Event *event)
  99. {
  100. static int reallyquit = 0;
  101. switch (event->type) {
  102. case SDL_ACTIVEEVENT:
  103. /* See what happened */
  104. printf("App %s ",
  105. event->active.gain ? "gained" : "lost");
  106. if ( event->active.state & SDL_APPACTIVE )
  107. printf("active ");
  108. if ( event->active.state & SDL_APPMOUSEFOCUS )
  109. printf("mouse ");
  110. if ( event->active.state & SDL_APPINPUTFOCUS )
  111. printf("input ");
  112. printf("focusn");
  113. /* See if we are iconified or restored */
  114. if ( event->active.state & SDL_APPACTIVE ) {
  115. printf("App has been %sn",
  116. event->active.gain ?
  117.  "restored" : "iconified");
  118. }
  119. return(0);
  120. /* We want to toggle visibility on buttonpress */
  121. case SDL_MOUSEBUTTONDOWN:
  122. case SDL_MOUSEBUTTONUP:
  123. if ( event->button.state == SDL_PRESSED ) {
  124. visible = !visible;
  125. SDL_ShowCursor(visible);
  126. }
  127. printf("Mouse button %d has been %sn",
  128. event->button.button,
  129. (event->button.state == SDL_PRESSED) ?
  130. "pressed" : "released");
  131. return(0);
  132. /* Show relative mouse motion */
  133. case SDL_MOUSEMOTION:
  134. #if 0
  135. printf("Mouse relative motion: {%d,%d}n",
  136. event->motion.xrel, event->motion.yrel);
  137. #endif
  138. return(0);
  139. case SDL_KEYDOWN:
  140. if ( event->key.keysym.sym == SDLK_ESCAPE ) {
  141. HotKey_Quit();
  142. }
  143. if ( (event->key.keysym.sym == SDLK_g) &&
  144.      (event->key.keysym.mod & KMOD_CTRL) ) {
  145. HotKey_ToggleGrab();
  146. }
  147. if ( (event->key.keysym.sym == SDLK_z) &&
  148.      (event->key.keysym.mod & KMOD_CTRL) ) {
  149. HotKey_Iconify();
  150. }
  151. if ( (event->key.keysym.sym == SDLK_RETURN) &&
  152.      (event->key.keysym.mod & KMOD_ALT) ) {
  153. HotKey_ToggleFullScreen();
  154. }
  155. return(0);
  156. /* Pass the video resize event through .. */
  157. case SDL_VIDEORESIZE:
  158. return(1);
  159. /* This is important!  Queue it if we want to quit. */
  160. case SDL_QUIT:
  161. if ( ! reallyquit ) {
  162. reallyquit = 1;
  163. printf("Quit requestedn");
  164. return(0);
  165. }
  166. printf("Quit demandedn");
  167. return(1);
  168. /* This will never happen because events queued directly
  169.    to the event queue are not filtered.
  170.  */
  171. case SDL_USEREVENT:
  172. return(1);
  173. /* Drop all other events */
  174. default:
  175. return(0);
  176. }
  177. }
  178. static Uint8  video_bpp;
  179. static Uint32 video_flags;
  180. int SetVideoMode(int w, int h)
  181. {
  182. SDL_Surface *screen;
  183. int i;
  184. Uint8 *buffer;
  185. SDL_Color palette[256];
  186. screen = SDL_SetVideoMode(w, h, video_bpp, video_flags);
  187. if (  screen == NULL ) {
  188. fprintf(stderr, "Couldn't set %dx%dx%d video mode: %sn",
  189. w, h, video_bpp, SDL_GetError());
  190. return(-1);
  191. }
  192. printf("Running in %s moden", screen->flags & SDL_FULLSCREEN ?
  193. "fullscreen" : "windowed");
  194. /* Set the surface pixels and refresh! */
  195. for ( i=0; i<256; ++i ) {
  196. palette[i].r = 255-i;
  197. palette[i].g = 255-i;
  198. palette[i].b = 255-i;
  199. }
  200. SDL_SetColors(screen, palette, 0, 256);
  201. if ( SDL_LockSurface(screen) < 0 ) {
  202. fprintf(stderr, "Couldn't lock display surface: %sn",
  203. SDL_GetError());
  204. return(-1);
  205. }
  206. buffer = (Uint8 *)screen->pixels;
  207. for ( i=0; i<screen->h; ++i ) {
  208. memset(buffer,(i*255)/screen->h,
  209. screen->w*screen->format->BytesPerPixel);
  210. buffer += screen->pitch;
  211. }
  212. SDL_UnlockSurface(screen);
  213. SDL_UpdateRect(screen, 0, 0, 0, 0);
  214. return(0);
  215. }
  216. int main(int argc, char *argv[])
  217. {
  218. SDL_Event event;
  219. char *title;
  220. SDL_Surface *icon;
  221. Uint8 *icon_mask;
  222. int parsed;
  223. int w, h;
  224. if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
  225. fprintf(stderr,
  226. "Couldn't initialize SDL: %sn", SDL_GetError());
  227. exit(1);
  228. }
  229. atexit(SDL_Quit);
  230. /* Check command line arguments */
  231. w = 640;
  232. h = 480;
  233. video_bpp = 8;
  234. video_flags = SDL_SWSURFACE;
  235. parsed = 1;
  236. while ( parsed ) {
  237. if ( (argc >= 2) && (strcmp(argv[1], "-fullscreen") == 0) ) {
  238. video_flags |= SDL_FULLSCREEN;
  239. argc -= 1;
  240. argv += 1;
  241. } else
  242. if ( (argc >= 2) && (strcmp(argv[1], "-resize") == 0) ) {
  243. video_flags |= SDL_RESIZABLE;
  244. argc -= 1;
  245. argv += 1;
  246. } else
  247. if ( (argc >= 2) && (strcmp(argv[1], "-noframe") == 0) ) {
  248. video_flags |= SDL_NOFRAME;
  249. argc -= 1;
  250. argv += 1;
  251. } else
  252. if ( (argc >= 3) && (strcmp(argv[1], "-width") == 0) ) {
  253. w = atoi(argv[2]);
  254. argc -= 2;
  255. argv += 2;
  256. } else
  257. if ( (argc >= 3) && (strcmp(argv[1], "-height") == 0) ) {
  258. h = atoi(argv[2]);
  259. argc -= 2;
  260. argv += 2;
  261. } else
  262. if ( (argc >= 3) && (strcmp(argv[1], "-bpp") == 0) ) {
  263. video_bpp = atoi(argv[2]);
  264. argc -= 2;
  265. argv += 2;
  266. } else {
  267. parsed = 0;
  268. }
  269. }
  270. /* Set the icon -- this must be done before the first mode set */
  271. icon = LoadIconSurface("icon.bmp", &icon_mask);
  272. if ( icon != NULL ) {
  273. SDL_WM_SetIcon(icon, icon_mask);
  274. }
  275. if ( icon_mask != NULL )
  276. free(icon_mask);
  277. /* Set the title bar */
  278. if ( argv[1] == NULL )
  279. title = "Testing  1.. 2.. 3...";
  280. else
  281. title = argv[1];
  282. SDL_WM_SetCaption(title, "testwm");
  283. /* See if it's really set */
  284. SDL_WM_GetCaption(&title, NULL);
  285. if ( title )
  286. printf("Title was set to: %sn", title);
  287. else
  288. printf("No window title was set!n");
  289. /* Initialize the display */
  290. if ( SetVideoMode(w, h) < 0 ) {
  291. return(1);
  292. }
  293. /* Set an event filter that discards everything but QUIT */
  294. SDL_SetEventFilter(FilterEvents);
  295. /* Ignore key up events, they don't even get filtered */
  296. SDL_EventState(SDL_KEYUP, SDL_IGNORE);
  297. /* Loop, waiting for QUIT */
  298. while ( SDL_WaitEvent(&event) ) {
  299. switch (event.type) {
  300. case SDL_VIDEORESIZE:
  301. printf("Got a resize event: %dx%dn",
  302.        event.resize.w, event.resize.h);
  303. SetVideoMode(event.resize.w, event.resize.h);
  304. break;
  305. case SDL_USEREVENT:
  306. printf("Handling internal quit requestn");
  307. /* Fall through to the quit handler */
  308. case SDL_QUIT:
  309. printf("Bye bye..n");
  310. return(0);
  311. default:
  312. /* This should never happen */
  313. printf("Warning: Event %d wasn't filteredn",
  314. event.type);
  315. break;
  316. }
  317. }
  318. printf("SDL_WaitEvent() error: %sn", SDL_GetError());
  319. return(255);
  320. }