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

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. /* glut_menu2.c implements the little used GLUT menu calls in
  6.    a distinct file from glut_menu.c for slim static linking. */
  7. /* The Win32 GLUT file win32_menu.c completely re-implements all
  8.    the menuing functionality implemented.  This file is used only by
  9.    the X Window System version of GLUT. */
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <stdio.h>
  13. #include <errno.h>
  14. #include <assert.h>
  15. #include <X11/Xlib.h>
  16. #include "glutint.h"
  17. #include "layerutil.h"
  18. /* CENTRY */
  19. /* DEPRICATED, use glutMenuStatusFunc instead. */
  20. void APIENTRY 
  21. glutMenuStateFunc(GLUTmenuStateCB menuStateFunc)
  22. {
  23.   __glutMenuStatusFunc = (GLUTmenuStatusCB) menuStateFunc;
  24. }
  25. void APIENTRY 
  26. glutMenuStatusFunc(GLUTmenuStatusCB menuStatusFunc)
  27. {
  28.   __glutMenuStatusFunc = menuStatusFunc;
  29. }
  30. void APIENTRY 
  31. glutDestroyMenu(int menunum)
  32. {
  33.   GLUTmenu *menu = __glutGetMenuByNum(menunum);
  34.   GLUTmenuItem *item, *next;
  35.   if (__glutMappedMenu)
  36.     __glutMenuModificationError();
  37.   assert(menu->id == menunum - 1);
  38.   XDestroySubwindows(__glutDisplay, menu->win);
  39.   XDestroyWindow(__glutDisplay, menu->win);
  40.   __glutMenuList[menunum - 1] = NULL;
  41.   /* free all menu entries */
  42.   item = menu->list;
  43.   while (item) {
  44.     assert(item->menu == menu);
  45.     next = item->next;
  46.     free(item->label);
  47.     free(item);
  48.     item = next;
  49.   }
  50.   if (__glutCurrentMenu == menu) {
  51.     __glutCurrentMenu = NULL;
  52.   }
  53.   free(menu);
  54. }
  55. void APIENTRY 
  56. glutChangeToMenuEntry(int num, const char *label, int value)
  57. {
  58.   GLUTmenuItem *item;
  59.   int i;
  60.   if (__glutMappedMenu)
  61.     __glutMenuModificationError();
  62.   i = __glutCurrentMenu->num;
  63.   item = __glutCurrentMenu->list;
  64.   while (item) {
  65.     if (i == num) {
  66.       if (item->isTrigger) {
  67.         /* If changing a submenu trigger to a menu entry, we
  68.            need to account for submenus.  */
  69.         item->menu->submenus--;
  70.       }
  71.       free(item->label);
  72.       __glutSetMenuItem(item, label, value, False);
  73.       return;
  74.     }
  75.     i--;
  76.     item = item->next;
  77.   }
  78.   __glutWarning("Current menu has no %d item.", num);
  79. }
  80. void APIENTRY 
  81. glutChangeToSubMenu(int num, const char *label, int menu)
  82. {
  83.   GLUTmenuItem *item;
  84.   int i;
  85.   if (__glutMappedMenu)
  86.     __glutMenuModificationError();
  87.   i = __glutCurrentMenu->num;
  88.   item = __glutCurrentMenu->list;
  89.   while (item) {
  90.     if (i == num) {
  91.       if (!item->isTrigger) {
  92.         /* If changing a menu entry to as submenu trigger, we
  93.            need to account for submenus.  */
  94.         item->menu->submenus++;
  95.       }
  96.       free(item->label);
  97.       __glutSetMenuItem(item, label, /* base 0 */ menu - 1, True);
  98.       return;
  99.     }
  100.     i--;
  101.     item = item->next;
  102.   }
  103.   __glutWarning("Current menu has no %d item.", num);
  104. }
  105. void APIENTRY 
  106. glutRemoveMenuItem(int num)
  107. {
  108.   GLUTmenuItem *item, **prev, *remaining;
  109.   int pixwidth, i;
  110.   if (__glutMappedMenu)
  111.     __glutMenuModificationError();
  112.   i = __glutCurrentMenu->num;
  113.   prev = &__glutCurrentMenu->list;
  114.   item = __glutCurrentMenu->list;
  115.   /* If menu item is removed, the menu's pixwidth may need to
  116.      be recomputed. */
  117.   pixwidth = 1;
  118.   while (item) {
  119.     if (i == num) {
  120.       /* If this menu item's pixwidth is as wide as the menu's
  121.          pixwidth, removing this menu item will necessitate
  122.          shrinking the menu's pixwidth. */
  123.       if (item->pixwidth >= __glutCurrentMenu->pixwidth) {
  124.         /* Continue recalculating menu pixwidth, first skipping
  125.            the removed item. */
  126.         remaining = item->next;
  127.         while (remaining) {
  128.           if (remaining->pixwidth > pixwidth) {
  129.             pixwidth = remaining->pixwidth;
  130.           }
  131.           remaining = remaining->next;
  132.         }
  133.         __glutCurrentMenu->pixwidth = pixwidth;
  134.       }
  135.       __glutCurrentMenu->num--;
  136.       __glutCurrentMenu->managed = False;
  137.       /* Patch up menu's item list. */
  138.       *prev = item->next;
  139.       free(item->label);
  140.       free(item);
  141.       return;
  142.     }
  143.     if (item->pixwidth > pixwidth) {
  144.       pixwidth = item->pixwidth;
  145.     }
  146.     i--;
  147.     prev = &item->next;
  148.     item = item->next;
  149.   }
  150.   __glutWarning("Current menu has no %d item.", num);
  151. }
  152. void APIENTRY 
  153. glutDetachMenu(int button)
  154. {
  155.   if (__glutMappedMenu)
  156.     __glutMenuModificationError();
  157.   if (__glutCurrentWindow->menu[button] > 0) {
  158.     __glutCurrentWindow->buttonUses--;
  159.     __glutChangeWindowEventMask(ButtonPressMask | ButtonReleaseMask,
  160.       __glutCurrentWindow->buttonUses > 0);
  161.     __glutCurrentWindow->menu[button] = 0;
  162.   }
  163. }
  164. /* ENDCENTRY */