test6.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:13k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994, 1997. */
  2. /* This program is freely distributable without licensing fees 
  3.    and is provided without guarantee or warrantee expressed or 
  4.    implied. This program is -not- in the public domain. */
  5. /* This is an interactive test (not automatically run by "make
  6.    test") that requires user interaction to verify that input
  7.    callbacks operate as expected. */
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <GL/glut.h>
  11. static int mouseButtons;
  12. void
  13. display(void)
  14. {
  15.   glClear(GL_COLOR_BUFFER_BIT);
  16.   glFlush();
  17. }
  18. void
  19. time7(int value)
  20. {
  21.   if (value != 7) {
  22.     printf("FAIL: time7 expected 6n");
  23.     exit(1);
  24.   }
  25.   printf("PASS: test6n");
  26.   exit(0);
  27. }
  28. void
  29. mstatus(int state)
  30. {
  31.   printf("state: %dn", state);
  32. }
  33. void
  34. mstatus2(int state, int x, int y)
  35. {
  36.   printf("state: %d, x=%d, y=%dn", state, x, y);
  37. }
  38. void
  39. menu2(int value)
  40. {
  41.   printf("menu item selected: %dn", value);
  42.   if (value != 46) {
  43.     printf("FAIL: time6 expected 45n");
  44.     exit(1);
  45.   }
  46.   glutDestroyMenu(glutGetMenu());
  47.   glutDestroyWindow(glutGetWindow());
  48.   glutTimerFunc(1000, time7, 7);
  49. }
  50. void
  51. time6(int value)
  52. {
  53.   if (value != 6) {
  54.     printf("FAIL: time6 expected 6n");
  55.     exit(1);
  56.   }
  57.   glutMenuStateFunc(mstatus);
  58.   glutMenuStatusFunc(mstatus2);
  59.   glutCreateMenu(menu2);
  60.   glutAddMenuEntry("name", 46);
  61.   glutAttachMenu(GLUT_LEFT_BUTTON);
  62.   glutAttachMenu(GLUT_MIDDLE_BUTTON);
  63.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  64.   printf("Pop up menu with any mouse button and select the itemn");
  65. }
  66. int estate = 0;
  67. void
  68. entry(int state)
  69. {
  70.   printf("entry: %sn", state == GLUT_LEFT ? "left" : "entered");
  71.   switch (estate) {
  72.   case 0:
  73.     if (state == GLUT_LEFT)
  74.       estate++;
  75.     break;
  76.   case 1:
  77.     if (state == GLUT_ENTERED)
  78.       estate++;
  79.     glutTimerFunc(1000, time6, 6);
  80.     glutEntryFunc(NULL);
  81.     break;
  82.   }
  83. }
  84. void
  85. time5(int value)
  86. {
  87.   if (value != 5) {
  88.     printf("FAIL: time5 expected 5n");
  89.     exit(1);
  90.   }
  91.   glutEntryFunc(entry);
  92.   printf("In the black window, leave it, then enter itn");
  93. }
  94. void
  95. motion(int x, int y)
  96. {
  97.   printf("motion x=%d, y=%dn", x, y);
  98.   glutMotionFunc(NULL);
  99.   glutTimerFunc(1000, time5, 5);
  100. }
  101. void
  102. time4(int value)
  103. {
  104.   if (value != 4) {
  105.     printf("FAIL: time4 expected 4n");
  106.     exit(1);
  107.   }
  108.   glutMotionFunc(motion);
  109.   printf("In the black window, move mouse with some button held downn");
  110. }
  111. void
  112. passive(int x, int y)
  113. {
  114.   printf("passive x=%d, y=%dn", x, y);
  115.   glutTimerFunc(1000, time4, 4);
  116.   glutPassiveMotionFunc(NULL);
  117. }
  118. void
  119. time3(int value)
  120. {
  121.   if (value != 3) {
  122.     printf("FAIL: time3 expected 3n");
  123.     exit(1);
  124.   }
  125.   glutPassiveMotionFunc(passive);
  126.   printf("In the black window, mouse the mouse around with NO buttons downn");
  127. }
  128. static int mode = 0;
  129. void
  130. mouse(int button, int state, int x, int y)
  131. {
  132.   printf("but=%d, state=%d, x=%d, y=%d, modifiers=0x%xn",
  133.     button, state, x, y, glutGetModifiers());
  134.   switch (mode) {
  135.   case 0:
  136.     if (button != GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
  137.       printf("FAIL: mouse left down not foundn");
  138.       exit(1);
  139.     }
  140.     if (glutGetModifiers() != 0) {
  141.       printf("FAIL: mouse expected no modifiern");
  142.       exit(1);
  143.     }
  144.     mode++;
  145.     break;
  146.   case 1:
  147.     if (button != GLUT_LEFT_BUTTON && state == GLUT_UP) {
  148.       printf("FAIL: mouse left up not foundn");
  149.       exit(1);
  150.     }
  151.     if (glutGetModifiers() != 0) {
  152.       printf("FAIL: mouse expected no modifiern");
  153.       exit(1);
  154.     }
  155.     switch (mouseButtons) {
  156.     case 1:
  157.       mode = 6;         /* Skip right or middle button tests. */
  158.       printf("In the black window, please click: Shift-left, Ctrl-left, then Alt-left (in that order)n");
  159.       break;
  160.     case 2:
  161.       mode = 4;         /* Continue with right button test
  162.                            (skip middle button). */
  163.       break;
  164.     case 3:
  165.       mode = 2;         /* Continue with middle button test. */
  166.       break;
  167.     }
  168.     break;
  169.   case 2:
  170.     if (button != GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) {
  171.       printf("FAIL: mouse center down not foundn");
  172.       exit(1);
  173.     }
  174.     if (glutGetModifiers() != 0) {
  175.       printf("FAIL: mouse expected no modifiern");
  176.       exit(1);
  177.     }
  178.     mode++;
  179.     break;
  180.   case 3:
  181.     if (button != GLUT_MIDDLE_BUTTON && state == GLUT_UP) {
  182.       printf("FAIL: mouse center up not foundn");
  183.       exit(1);
  184.     }
  185.     if (glutGetModifiers() != 0) {
  186.       printf("FAIL: mouse expected no modifiern");
  187.       exit(1);
  188.     }
  189.     mode++;
  190.     break;
  191.   case 4:
  192.     if (button != GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {
  193.       printf("FAIL: mouse right down not foundn");
  194.       exit(1);
  195.     }
  196.     if (glutGetModifiers() != 0) {
  197.       printf("FAIL: mouse expected no modifiern");
  198.       exit(1);
  199.     }
  200.     mode++;
  201.     break;
  202.   case 5:
  203.     if (button != GLUT_RIGHT_BUTTON && state == GLUT_UP) {
  204.       printf("FAIL: mouse right up not foundn");
  205.       exit(1);
  206.     }
  207.     if (glutGetModifiers() != 0) {
  208.       printf("FAIL: mouse expected no modifiern");
  209.       exit(1);
  210.     }
  211.     printf("In the black window, please click: Shift-left, Ctrl-left, then Alt-left (in that order)n");
  212.     mode++;
  213.     break;
  214.   case 6:
  215.     if (button != GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
  216.       printf("FAIL: mouse right down not foundn");
  217.       exit(1);
  218.     }
  219.     if (glutGetModifiers() != GLUT_ACTIVE_SHIFT) {
  220.       printf("FAIL: mouse expected shift modifiern");
  221.       exit(1);
  222.     }
  223.     mode++;
  224.     break;
  225.   case 7:
  226.     if (button != GLUT_LEFT_BUTTON && state == GLUT_UP) {
  227.       printf("FAIL: mouse right down not foundn");
  228.       exit(1);
  229.     }
  230.     if (glutGetModifiers() != GLUT_ACTIVE_SHIFT) {
  231.       printf("FAIL: mouse expected shift modifiern");
  232.       exit(1);
  233.     }
  234.     mode++;
  235.     break;
  236.   case 8:
  237.     if (button != GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
  238.       printf("FAIL: mouse right down not foundn");
  239.       exit(1);
  240.     }
  241.     if (glutGetModifiers() != GLUT_ACTIVE_CTRL) {
  242.       printf("FAIL: mouse expected ctrl modifiern");
  243.       exit(1);
  244.     }
  245.     mode++;
  246.     break;
  247.   case 9:
  248.     if (button != GLUT_LEFT_BUTTON && state == GLUT_UP) {
  249.       printf("FAIL: mouse right down not foundn");
  250.       exit(1);
  251.     }
  252.     if (glutGetModifiers() != GLUT_ACTIVE_CTRL) {
  253.       printf("FAIL: mouse expected ctrl modifiern");
  254.       exit(1);
  255.     }
  256.     mode++;
  257.     break;
  258.   case 10:
  259.     if (button != GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
  260.       printf("FAIL: mouse right down not foundn");
  261.       exit(1);
  262.     }
  263.     if (glutGetModifiers() != GLUT_ACTIVE_ALT) {
  264.       printf("FAIL: mouse expected alt modifiern");
  265.       exit(1);
  266.     }
  267.     mode++;
  268.     break;
  269.   case 11:
  270.     if (button != GLUT_LEFT_BUTTON && state == GLUT_UP) {
  271.       printf("FAIL: mouse right down not foundn");
  272.       exit(1);
  273.     }
  274.     if (glutGetModifiers() != GLUT_ACTIVE_ALT) {
  275.       printf("FAIL: mouse expected alt modifiern");
  276.       exit(1);
  277.     }
  278.     glutTimerFunc(1000, time3, 3);
  279.     glutMouseFunc(NULL);
  280.     mode++;
  281.     break;
  282.   default:
  283.     printf("FAIL: mouse called with bad mode: %dn", mode);
  284.     exit(1);
  285.   }
  286. }
  287. /* ARGSUSED */
  288. void
  289. menu(int selection)
  290. {
  291.   printf("FAIL: menu callback should never be calledn");
  292.   exit(1);
  293. }
  294. void
  295. time2(int value)
  296. {
  297.   if (value != 2) {
  298.     printf("FAIL: time2 expected 2n");
  299.     exit(1);
  300.   }
  301.   glutMouseFunc(mouse);
  302.   /* By attaching and detaching a menu to each button, make
  303.      sure button usage for menus does not mess up normal button 
  304.      callback. */
  305.   glutCreateMenu(menu);
  306.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  307.   glutAttachMenu(GLUT_MIDDLE_BUTTON);
  308.   glutAttachMenu(GLUT_LEFT_BUTTON);
  309.   glutDetachMenu(GLUT_RIGHT_BUTTON);
  310.   glutDetachMenu(GLUT_MIDDLE_BUTTON);
  311.   glutDetachMenu(GLUT_LEFT_BUTTON);
  312.   glutDestroyMenu(glutGetMenu());
  313.   switch (mouseButtons) {
  314.   case 3:
  315.     printf("In the black window, please click: left, then middle, then right buttons (in that order)n");
  316.     break;
  317.   case 2:
  318.     printf("In the black window, please click: left, then right buttons (in that order)n");
  319.     break;
  320.   case 1:
  321.     printf("In the black window, please click: left buttonn");
  322.     break;
  323.   case 0:
  324.     /* No mouse buttons??  Skip all subsequent tests since they 
  325.        involve the mouse. */
  326.     glutTimerFunc(1000, time7, 7);
  327.     glutMouseFunc(NULL);
  328.     break;
  329.   }
  330. }
  331. int smode = 0;
  332. /* XXX Warning, sometimes an X window manager will intercept
  333.    some keystroke like Alt-F2.  Be careful about window manager
  334.    interference when running test6. */
  335. void
  336. special(int key, int x, int y)
  337. {
  338.   printf("key=%d, x=%d, y=%d, modifiers=0x%xn",
  339.     key, x, y, glutGetModifiers());
  340.   switch (smode) {
  341.   case 0:
  342.     if (key != GLUT_KEY_F2) {
  343.       printf("FAIL: special expected F2n");
  344.       exit(1);
  345.     }
  346.     if (glutGetModifiers() != 0) {
  347.       printf("FAIL: special expected no modifiern");
  348.       exit(1);
  349.     }
  350.     break;
  351.   case 1:
  352.     if (key != GLUT_KEY_F2) {
  353.       printf("FAIL: special expected F2n");
  354.       exit(1);
  355.     }
  356.     if (glutGetModifiers() != GLUT_ACTIVE_SHIFT) {
  357.       printf("FAIL: special expected shift modifiern");
  358.       exit(1);
  359.     }
  360.     break;
  361.   case 2:
  362.     if (key != GLUT_KEY_F2) {
  363.       printf("FAIL: special expected F2n");
  364.       exit(1);
  365.     }
  366.     if (glutGetModifiers() != GLUT_ACTIVE_CTRL) {
  367.       printf("FAIL: special expected ctrl modifiern");
  368.       exit(1);
  369.     }
  370.     break;
  371.   case 3:
  372.     if (key != GLUT_KEY_F2) {
  373.       printf("FAIL: special expected F2n");
  374.       exit(1);
  375.     }
  376.     if (glutGetModifiers() != GLUT_ACTIVE_ALT) {
  377.       printf("FAIL: special expected alt modifiern");
  378.       exit(1);
  379.     }
  380.     glutSpecialFunc(NULL);
  381.     glutTimerFunc(1000, time2, 2);
  382.     break;
  383.   default:
  384.     printf("FAIL: special called with bad mode: %dn", smode);
  385.     exit(1);
  386.   }
  387.   smode++;
  388. }
  389. void
  390. time1(int value)
  391. {
  392.   printf("PLEASE EXPECT TO SEE A WARNING ON THE NEXT LINE:n");
  393.   glutGetModifiers();
  394.   printf("DID YOU SEE A WARNING?  IT IS AN ERROR NOT TO SEE ONE.n");
  395.   if (value != 1) {
  396.     printf("FAIL: time1 expected 1n");
  397.     exit(1);
  398.   }
  399.   glutSpecialFunc(special);
  400.   printf("In the black window, please press: F2, Shift-F2, Ctrl-F2, then Alt-F2n");
  401. }
  402. int kmode = 0;
  403. void
  404. keyboard(unsigned char c, int x, int y)
  405. {
  406.   printf("char=%d, x=%d, y=%d, modifiers=0x%xn",
  407.     c, x, y, glutGetModifiers());
  408.   switch (kmode) {
  409.   case 0:
  410.     if (c != 'g') {
  411.       printf("FAIL: keyboard expected gn");
  412.       exit(1);
  413.     }
  414.     if (glutGetModifiers() != 0) {
  415.       printf("FAIL: keyboard expected no modifiern");
  416.       exit(1);
  417.     }
  418.     break;
  419.   case 1:
  420.     if (c != 'G') {
  421.       printf("FAIL: keyboard expected Gn");
  422.       exit(1);
  423.     }
  424.     if (glutGetModifiers() != GLUT_ACTIVE_SHIFT) {
  425.       printf("FAIL: keyboard expected shift modifiern");
  426.       exit(1);
  427.     }
  428.     break;
  429.   case 2:
  430.     if (c != 0x7) {     /* Bell, Ctrl-g */
  431.       printf("FAIL: keyboard expected gn");
  432.       exit(1);
  433.     }
  434.     if (glutGetModifiers() != GLUT_ACTIVE_CTRL) {
  435.       printf("FAIL: keyboard expected ctrl modifiern");
  436.       exit(1);
  437.     }
  438.     break;
  439.   case 3:
  440.     if (c != 'g') {
  441.       printf("FAIL: keyboard expected gn");
  442.       exit(1);
  443.     }
  444.     if (glutGetModifiers() != GLUT_ACTIVE_ALT) {
  445.       printf("FAIL: keyboard expected alt modifiern");
  446.       exit(1);
  447.     }
  448.     break;
  449.   case 4:
  450.     if (c != 'b') {
  451.       printf("FAIL: keyboard expected BACKSPACEn");
  452.       exit(1);
  453.     }
  454.     if (glutGetModifiers() != 0) {
  455.       printf("FAIL: keyboard expected alt modifiern");
  456.       exit(1);
  457.     }
  458.     break;
  459.   case 5:
  460.     if (c != 127) {
  461.       printf("FAIL: keyboard expected DELn");
  462.       exit(1);
  463.     }
  464.     if (glutGetModifiers() != 0) {
  465.       printf("FAIL: keyboard expected no modifiern");
  466.       exit(1);
  467.     }
  468.     glutKeyboardFunc(NULL);
  469.     glutTimerFunc(1000, time1, 1);
  470.     break;
  471.   default:
  472.     printf("FAIL: keyboard called with bad mode: %dn", kmode);
  473.     exit(1);
  474.   }
  475.   kmode++;
  476. }
  477. void
  478. time0(int value)
  479. {
  480.   if (value != 0) {
  481.     printf("FAIL: time0 expected 0n");
  482.     exit(1);
  483.   }
  484.   glutKeyboardFunc(keyboard);
  485.   printf("In the black window, please press: g, G, Ctrl-g, Alt-g, Backspace, Deleten");
  486. }
  487. int
  488. main(int argc, char **argv)
  489. {
  490.   glutInit(&argc, argv);
  491.   mouseButtons = glutDeviceGet(GLUT_NUM_MOUSE_BUTTONS);
  492.   if (mouseButtons < 0) {
  493.     printf("FAIL: negative mouse buttons? mouseButtons=%dn",
  494.       mouseButtons);
  495.     exit(1);
  496.   }
  497.   if (mouseButtons > 3) {
  498.     printf("More than 3 mouse buttons (ok).  mouseButtons=%dn",
  499.       mouseButtons);
  500.     mouseButtons = 3;  /* Testing only of 3 mouse buttons. */
  501.   }
  502.   glutCreateWindow("test");
  503.   glutDisplayFunc(display);
  504.   glutTimerFunc(1000, time0, 0);
  505.   glutMainLoop();
  506.   return 0;             /* ANSI C requires main to return int. */
  507. }