home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / xaes_new / formwind.c < prev    next >
C/C++ Source or Header  |  1994-12-12  |  19KB  |  608 lines

  1. /********************************************************************
  2.  *                                                                0.50*
  3.  *    XAES: Custom window handling                                    *
  4.  *    Code by Ken Hollis, GNU C Extensions by Sascha Blank            *
  5.  *                                                                    *
  6.  *    Copyright (c) 1994, Bitgate Software.  All Rights Reserved.        *
  7.  *                                                                    *
  8.  *    Well, at least it's half-way done.  I still need to get the        *
  9.  *    small-window elements working decently.  Hell, I've still got    *
  10.  *    to add them!                                                    *
  11.  *                                                                    *
  12.  ********************************************************************/
  13.  
  14. #include <string.h>
  15. #include <stddef.h>
  16. #include "xaes.h"
  17.  
  18. #define W_ULSIZE 1   /* BOX dans l'arbre WINDOW */
  19. #define W_PCLOSE 2   /* BOX dans l'arbre WINDOW */
  20. #define W_CLOSER 3   /* BOXTEXT dans l'arbre WINDOW */
  21. #define W_TSIZE  4   /* BOX dans l'arbre WINDOW */
  22. #define W_URSIZE 5   /* BOX dans l'arbre WINDOW */
  23. #define W_PCASC  6   /* BOX dans l'arbre WINDOW */
  24. #define W_FULLER 7   /* BOXTEXT dans l'arbre WINDOW */
  25. #define W_LSIZE  8   /* BOX dans l'arbre WINDOW */
  26. #define W_RSIZE  9   /* BOX dans l'arbre WINDOW */
  27. #define W_LLSIZE 10  /* BOX dans l'arbre WINDOW */
  28. #define W_PSLLT  11  /* BOX dans l'arbre WINDOW */
  29. #define W_SLLT   12  /* BOXTEXT dans l'arbre WINDOW */
  30. #define W_BSIZE  13  /* BOX dans l'arbre WINDOW */
  31. #define W_LRSIZE 14  /* BOX dans l'arbre WINDOW */
  32. #define W_PSLDN  15  /* BOX dans l'arbre WINDOW */
  33. #define W_SLDN   16  /* BOXTEXT dans l'arbre WINDOW */
  34. #define W_MOVER  17  /* BOXTEXT dans l'arbre WINDOW */
  35. #define W_CASCADE 18  /* BOXTEXT dans l'arbre WINDOW */
  36. #define W_MENU   19  /* BOX dans l'arbre WINDOW */
  37. #define W_MENU_L 20  /* BOXTEXT dans l'arbre WINDOW */
  38. #define W_MENU_R 21  /* BOXTEXT dans l'arbre WINDOW */
  39. #define W_INFO   22  /* BOXTEXT dans l'arbre WINDOW */
  40. #define W_INFO_R 24  /* BOXTEXT dans l'arbre WINDOW */ /* SWITCHED */
  41. #define W_INFO_L 23  /* BOXTEXT dans l'arbre WINDOW */ /* SWITCHED */
  42. #define WORKAREA 25  /* BOXTEXT dans l'arbre WINDOW */
  43. #define W_SLUP   26  /* BOXTEXT dans l'arbre WINDOW */
  44. #define W_VERTRK 27  /* BOX dans l'arbre WINDOW */
  45. #define W_VERSL  28  /* BOX dans l'arbre WINDOW */
  46. #define W_HORTRK 29  /* BOX dans l'arbre WINDOW */
  47. #define W_HORSL  30  /* BOX dans l'arbre WINDOW */
  48. #define W_SLRT   31  /* BOXTEXT dans l'arbre WINDOW */
  49. #define W_OPTION 32  /* BOXTEXT dans l'arbre WINDOW */
  50.  
  51. #define S_ULSIZE 1   /* BOX dans l'arbre WINDSM */
  52. #define S_CLOSER 3   /* BOXTEXT dans l'arbre WINDSM */
  53. #define S_TSIZE  4   /* BOX dans l'arbre WINDSM */
  54. #define S_URSIZE 5   /* BOX dans l'arbre WINDSM */
  55. #define S_FULLER 7   /* BOXTEXT dans l'arbre WINDSM */
  56. #define S_CASCADE 8   /* BOXTEXT dans l'arbre WINDSM */
  57. #define S_RSIZE  9   /* BOX dans l'arbre WINDSM */
  58. #define S_LRSIZE 10  /* BOX dans l'arbre WINDSM */
  59. #define S_SLDN   12  /* BOXTEXT dans l'arbre WINDSM */
  60. #define S_SLRT   13  /* BOXTEXT dans l'arbre WINDSM */
  61. #define S_BSIZE  14  /* BOX dans l'arbre WINDSM */
  62. #define S_LLSIZE 15  /* BOX dans l'arbre WINDSM */
  63. #define S_SLLT   17  /* BOXTEXT dans l'arbre WINDSM */
  64. #define S_LSIZE  18  /* BOX dans l'arbre WINDSM */
  65. #define S_MOVER  19  /* BOXTEXT dans l'arbre WINDSM */
  66. #define S_MENU   20  /* BOX dans l'arbre WINDSM */
  67. #define S_MENU_L 21  /* BOXTEXT dans l'arbre WINDSM */
  68. #define S_MENU_R 22  /* BOXTEXT dans l'arbre WINDSM */
  69. #define S_INFO   23  /* BOXTEXT dans l'arbre WINDSM */
  70. #define S_INFO_R 24  /* BOXTEXT dans l'arbre WINDSM */
  71. #define S_INFO_L 25  /* BOXTEXT dans l'arbre WINDSM */
  72. #define S_OPTIONS 26  /* BOXTEXT dans l'arbre WINDSM */
  73. #define S_UP     27  /* BOXTEXT dans l'arbre WINDSM */
  74. #define S_VERTRK 28  /* BOX dans l'arbre WINDSM */
  75. #define S_VERSL  29  /* BOX dans l'arbre WINDSM */
  76. #define S_HORTRK 30  /* BOX dans l'arbre WINDSM */
  77. #define S_HORSL  31  /* BOX dans l'arbre WINDSM */
  78. #define S_WORK   32  /* BOXTEXT dans l'arbre WINDSM */
  79.  
  80. #define WINPOP   0   /* Formulaire/Dialogue */
  81. #define WPCLOSE  2   /* TEXT dans l'arbre WINPOP */
  82. #define WPICON   3   /* TEXT dans l'arbre WINPOP */
  83.  
  84. #define CASCPOP  1   /* Formulaire/Dialogue */
  85. #define WPCASC   2   /* TEXT dans l'arbre CASCPOP */
  86. #define WPPTB    3   /* TEXT dans l'arbre CASCPOP */
  87. #define WPPRIO   5   /* TEXT dans l'arbre CASCPOP */
  88. #define WPBEVENT 6   /* TEXT dans l'arbre CASCPOP */
  89. #define WPAOT    7   /* TEXT dans l'arbre CASCPOP */
  90.  
  91. #define FULLPOP  2   /* Formulaire/Dialogue */
  92. #define WPMAX    2   /* TEXT dans l'arbre FULLPOP */
  93. #define WPMIN    3   /* TEXT dans l'arbre FULLPOP */
  94.  
  95. #define RTPOP    3   /* Formulaire/Dialogue */
  96. #define WHATIS   2   /* TEXT dans l'arbre RTPOP */
  97. #define CLOSEWIN 4   /* TEXT dans l'arbre RTPOP */
  98. #define CYCLEWIN 5   /* TEXT dans l'arbre RTPOP */
  99. #define FORCEXIT 7   /* TEXT dans l'arbre RTPOP */
  100. #define CLOSEALL 8   /* TEXT dans l'arbre RTPOP */
  101. #define REDRWIN  9   /* TEXT dans l'arbre RTPOP */
  102. #define REDRALL  10  /* TEXT dans l'arbre RTPOP */
  103.  
  104. #define HELPWIN  4   /* Formulaire/Dialogue */
  105. #define HELPTITL 2   /* TEXT dans l'arbre HELPWIN */
  106. #define HELPWORK 3   /* BOX dans l'arbre HELPWIN */
  107. #define HELPOK   5   /* BOXTEXT dans l'arbre HELPWIN */
  108.  
  109. #define LBUP     1   /* BOXCHAR dans l'arbre LISTBOX */
  110. #define LBVERTRK 2   /* BOX dans l'arbre LISTBOX */
  111. #define LBVERSL  3   /* BOX dans l'arbre LISTBOX */
  112. #define LBHORTRK 4   /* BOX dans l'arbre LISTBOX */
  113. #define LBHORSL  5   /* BOX dans l'arbre LISTBOX */
  114. #define LBDOWN   6   /* BOXCHAR dans l'arbre LISTBOX */
  115. #define LBLEFT   7   /* BOXCHAR dans l'arbre LISTBOX */
  116. #define LBRIGHT  8   /* BOXCHAR dans l'arbre LISTBOX */
  117. #define LBTEXT1  9   /* STRING dans l'arbre LISTBOX */
  118. #define LBTEXT2  10  /* STRING dans l'arbre LISTBOX */
  119. #define LBTEXT3  11  /* STRING dans l'arbre LISTBOX */
  120. #define LBTEXT4  12  /* STRING dans l'arbre LISTBOX */
  121. #define LBTEXT5  13  /* STRING dans l'arbre LISTBOX */
  122. #define LBTEXT6  14  /* STRING dans l'arbre LISTBOX */
  123. #define LBTEXT7  15  /* STRING dans l'arbre LISTBOX */
  124.  
  125. #define PUUP     1   /* BOXCHAR dans l'arbre POPUP */
  126. #define PUVERTRK 2   /* BOX dans l'arbre POPUP */
  127. #define PUVERSL  3   /* BOX dans l'arbre POPUP */
  128. #define PUDOWN   4   /* BOXCHAR dans l'arbre POPUP */
  129. #define PUTEXT1  5   /* STRING dans l'arbre POPUP */
  130. #define PUTEXT2  6   /* STRING dans l'arbre POPUP */
  131. #define PUTEXT3  7   /* STRING dans l'arbre POPUP */
  132. #define PUTEXT4  8   /* STRING dans l'arbre POPUP */
  133. #define PUTEXT5  9   /* STRING dans l'arbre POPUP */
  134. #define PUTEXT6  10  /* STRING dans l'arbre POPUP */
  135. #define PUTEXT7  11  /* STRING dans l'arbre POPUP */
  136. #define PUTEXT8  12  /* STRING dans l'arbre POPUP */
  137. #define PUTEXT9  13  /* STRING dans l'arbre POPUP */
  138. #define PUTEXT10 14  /* STRING dans l'arbre POPUP */
  139.  
  140. #define ICONPOP  4   /* Formulaire/Dialogue */
  141. #define UNICON   2   /* TEXT dans l'arbre ICONPOP */
  142. #define PODICON  3   /* TEXT dans l'arbre ICONPOP */
  143. #define CLOICON  5   /* TEXT dans l'arbre ICONPOP */
  144.  
  145. #include "internal.rsh"
  146.  
  147. BOOL helpmode;
  148.  
  149. OBJECT *WINPOPUP = winp;
  150. OBJECT *CASCPOPUP = cascp;
  151. OBJECT *FULLPOPUP = fullp;
  152. OBJECT *RTPOPUP = rtp;
  153. OBJECT *ICONPOPUP = icp;
  154. OBJECT *HELPWINDOW = helpw;
  155. OBJECT *LBOX = listb;
  156. OBJECT *P_UP = pop;
  157. OBJECT *ALERTWIN = alertb;
  158. OBJECT *ERRORWIN = errorb;
  159.  
  160. GLOBAL void WSetupWinPopups(void)
  161. {
  162.     WObjFixPosition(WINPOPUP);
  163.     WObjFixPosition(FULLPOPUP);
  164.     WObjFixPosition(CASCPOPUP);
  165.     WObjFixPosition(RTPOPUP);
  166.     WObjFixPosition(ICONPOPUP);
  167.     WObjFixPosition(HELPWINDOW);
  168.     WObjFixPosition(LBOX);
  169.     WObjFixPosition(P_UP);
  170.     WObjFixPosition(ALERTWIN);
  171.     WObjFixPosition(ERRORWIN);
  172.  
  173.     fix_object(WINPOPUP, FALSE, FALSE);
  174.     fix_object(FULLPOPUP, FALSE, FALSE);
  175.     fix_object(CASCPOPUP, FALSE, FALSE);
  176.     fix_object(RTPOPUP, FALSE, FALSE);
  177.     fix_object(HELPWINDOW, FALSE, TRUE);
  178.     fix_object(ICONPOPUP, FALSE, FALSE);
  179.     fix_object(LBOX, TRUE, FALSE);
  180.     fix_object(P_UP, TRUE, FALSE);
  181.  
  182.     P_UP[PUVERSL].ob_x++;    P_UP[PUVERSL].ob_y++;
  183.     LBOX[LBHORSL].ob_x++;    LBOX[LBHORSL].ob_y++;
  184.     LBOX[LBVERSL].ob_x++;    LBOX[LBVERSL].ob_y++;
  185. }
  186.  
  187. GLOBAL void WDoRightHandle(void)
  188. {
  189.     int x, y, d, p;
  190.  
  191.     graf_mkstate(&x, &y, &d, &d);
  192.  
  193.     helpmode = FALSE;
  194.  
  195.     PMovePopupCoord(RTPOPUP, x, y);
  196.     p = PDoPopupAddr(RTPOPUP);
  197.  
  198.     switch(p) {
  199.         case WHATIS:
  200.             helpmode = TRUE;
  201.             WGrafMouse(HELP_MOUSE);
  202.             break;
  203.  
  204.         case CLOSEWIN:
  205.             WCloseWindow(NULL, WC_OBJECTABLE, K_ASK);
  206.             break;
  207.  
  208.         case CYCLEWIN:
  209.             WTopWindow(NULL);
  210.             break;
  211.  
  212.         case REDRWIN:
  213.             {
  214.                 WINDOW *win = WindowChain;
  215.                 int x, y, w, h;
  216.  
  217.                 if (win->handle != 0) {
  218.                     WWindGet(win, WF_WORKXYWH, &x, &y, &w, &h);
  219.                     WRedrawWindow(win, x, y, w, h);
  220.                 }
  221.             }
  222.             break;
  223.  
  224.         case CLOSEALL:
  225.             WKillAllWindows(K_ASK);
  226.             vswr_mode(VDIhandle, MD_REPLACE);
  227.             break;
  228.  
  229.         case REDRALL:
  230.             WRedrawAllWindows();
  231.             break;
  232.  
  233.         case FORCEXIT:
  234.             WDie(FORCE_EXIT);
  235.             break;
  236.     }
  237. }
  238.  
  239. GLOBAL void WDoIconHandle(WINDOW *win)
  240. {
  241.     int x, y, d, p;
  242.  
  243.     graf_mkstate(&x, &y, &d, &d);
  244.  
  245.     PMovePopupCoord(ICONPOPUP, x, y);
  246.     p = PDoPopupAddr(ICONPOPUP);
  247.  
  248.     switch(p) {
  249.         case UNICON:
  250.             WWindSet(win, WF_UNICONIFIED, 1);
  251.             break;
  252.  
  253.         case PODICON:
  254.             form_alert(1, "[3][Sorry, cannot push icons|to the virtual desktop|as of yet.][ OK ]");
  255.             /* WWindSet(win, WF_DROPICONDESK, 1); */
  256.             break;
  257.  
  258.         case CLOICON:
  259.             WCloseWindow(NULL, WC_OBJECTABLE, K_ASK);
  260.             break;
  261.     }
  262. }
  263.  
  264. LOCAL void WHandleWindow(WINDOW *win, int object, int clicks)
  265. {
  266.     int msg_buf[8], but, d;
  267.  
  268.     UNUSED(clicks);
  269.     graf_mkstate(&d, &d, &but, &d);
  270.  
  271.     if (win)
  272.         if (win->style & W_CUSTOMWINDOW)
  273.             if (!(win->wind[object].ob_state & DISABLED)) {
  274.                 if ((xaes.config1 & X_ELEMENTSEL) &&
  275.                     (object != W_CLOSER) &&
  276.                     (object != W_ULSIZE) &&
  277.                     (object != W_URSIZE) &&
  278.                     (object != W_LLSIZE) &&
  279.                     (object != W_LRSIZE))
  280.                     WObjc_Change(win, object, 0, win->wind[object].ob_state | SELECTED, 1);
  281.  
  282.                 switch(object) {
  283.                     case W_CLOSER:
  284.                         if (but) {
  285.                             int p, x, y;
  286.  
  287.                             objc_offset(win->wind, W_CLOSER, &x, &y);
  288.  
  289.                             if (!(win->iconify))
  290.                                 WINPOPUP[3].ob_state |= DISABLED;
  291.                             else
  292.                                 WINPOPUP[3].ob_state &= ~DISABLED;
  293.  
  294.                             PMovePopupCoord(WINPOPUP, x, y);
  295.                             p = PDoPopupAddr(WINPOPUP);
  296.  
  297.                             switch(p) {
  298.                                 case WPCLOSE:
  299.                                     WObjc_Change(win, object, 0, win->wind[object].ob_state & ~SELECTED, 1);
  300.                                     WCloseWindow(win, WC_OBJECTABLE, K_ASK);
  301.                                     break;
  302.  
  303.                                 case WPICON:
  304.                                     WObjc_Change(win, object, 0, win->wind[object].ob_state & ~SELECTED, 1);
  305.                                     WWindSet(win, WF_ICONIFIED, 1);
  306.                                     break;
  307.                             }
  308.                         } else
  309.                             WCloseWindow(win, WC_OBJECTABLE, K_ASK);
  310.  
  311.                         break;
  312.  
  313.                     case W_ULSIZE:
  314.                         WSizeBox(win, S_UPPERLEFT);
  315.                         WMoveWindow(win, win->size.g_x, win->size.g_y,
  316.                                     win->size.g_w, win->size.g_h);
  317.                         break;
  318.  
  319.                     case W_TSIZE:
  320.                         WSizeBox(win, S_TOP);
  321.                         WMoveWindow(win, win->size.g_x, win->size.g_y,
  322.                                     win->size.g_w, win->size.g_h);
  323.                         break;
  324.  
  325.                     case W_URSIZE:
  326.                         WSizeBox(win, S_UPPERRIGHT);
  327.                         WMoveWindow(win, win->size.g_x, win->size.g_y,
  328.                                     win->size.g_w, win->size.g_h);
  329.                         break;
  330.  
  331.                     case W_LSIZE:
  332.                         WSizeBox(win, S_LEFT);
  333.                         WMoveWindow(win, win->size.g_x, win->size.g_y,
  334.                                     win->size.g_w, win->size.g_h);
  335.                         break;
  336.  
  337.                     case W_RSIZE:
  338.                         WSizeBox(win, S_RIGHT);
  339.                         WMoveWindow(win, win->size.g_x, win->size.g_y,
  340.                                     win->size.g_w, win->size.g_h);
  341.                         break;
  342.  
  343.                     case W_LRSIZE:
  344.                         WSizeBox(win, S_LOWERRIGHT);
  345.                         WMoveWindow(win, win->size.g_x, win->size.g_y,
  346.                                     win->size.g_w, win->size.g_h);
  347.                         break;
  348.  
  349.                     case W_BSIZE:
  350.                         WSizeBox(win, S_BOTTOM);
  351.                         WMoveWindow(win, win->size.g_x, win->size.g_y,
  352.                                     win->size.g_w, win->size.g_h);
  353.                         break;
  354.  
  355.                     case W_LLSIZE:
  356.                         WSizeBox(win, S_LOWERLEFT);
  357.                         WMoveWindow(win, win->size.g_x, win->size.g_y,
  358.                                     win->size.g_w, win->size.g_h);
  359.                         break;
  360.  
  361.                     case W_INFO_R:
  362.                         if (strlen((char *) win->info) > 1) {
  363.                             win->infpos++;
  364.                             if (win->infpos > (strlen((char *) win->info))) {
  365.                                 win->infpos = (int)(strlen((char *) win->info));
  366.                                 if (!(win->wind[W_INFO_R].ob_state & DISABLED))
  367.                                     WObjc_Change(win, W_INFO_R, 0, win->wind[W_INFO_R].ob_state | DISABLED, 1);
  368.                             } else {
  369.                                 if (win->wind[W_INFO_L].ob_state & DISABLED)
  370.                                     WObjc_Change(win, W_INFO_L, 0, win->wind[W_INFO_L].ob_state & ~DISABLED, 1);
  371.                                 goto doredraw;
  372.                             }
  373.                         }
  374.                         break;
  375.  
  376.                     case W_INFO_L:
  377.                         if (strlen((char *) win->info) > 1) {
  378.                             win->infpos--;
  379.                             if (win->infpos < 1) {
  380.                                 win->infpos = 0;
  381.                                 if (!(win->wind[W_INFO_L].ob_state & DISABLED))
  382.                                     WObjc_Change(win, W_INFO_L, 0, win->wind[W_INFO_L].ob_state | DISABLED, 1);
  383.                                 objc_draw(win->wind, W_INFO, 7, desk.g_x, desk.g_y, desk.g_w, desk.g_h);
  384.                                 break;
  385.                             } else {
  386.                                 if (win->wind[W_INFO_R].ob_state & DISABLED)
  387.                                     WObjc_Change(win, W_INFO_R, 0, win->wind[W_INFO_R].ob_state & ~DISABLED, 1);
  388.                             } /* This is cheating... */
  389.                         }
  390. doredraw:                {
  391.                             char *tempstr;
  392.  
  393.                             tempstr = (char *) win->info;
  394.                             tempstr = tempstr + win->infpos;
  395.                             ChangeObjectText(win->wind, W_INFO, tempstr, 3, TE_LEFT);
  396.                             objc_draw(win->wind, W_INFO, 7, desk.g_x, desk.g_y, desk.g_w, desk.g_h);
  397.                         }
  398.                         break;
  399.  
  400.                     case W_MOVER:
  401.                         if (xaes.config1 & X_MOUSEGADGETS)
  402.                             WGrafMouse(MOVER_MOUSE);
  403.  
  404.                         if (xaes.config2 & X_ACTIVEDRAG)
  405.                             WHandleActiveDrag(win);
  406.                         else
  407.                             WDragBox(win->size.g_w + 1, win->size.g_h + 1,
  408.                                      win->size.g_x, win->size.g_y, (xaes.config1 & X_LEFTBORDER) ? -1 : desk.g_x,
  409.                                      desk.g_y, -1, -1, &win->size.g_x,
  410.                                      &win->size.g_y);
  411.  
  412.                         WGrafMouse(ARROW);
  413.  
  414.                         if (!(xaes.config2 & X_ACTIVEDRAG))
  415.                             WMoveWindow(win, win->size.g_x, win->size.g_y,
  416.                                         win->size.g_w, win->size.g_h);
  417.                         break;
  418.  
  419.                     case W_FULLER:
  420.                         if (but) {
  421.                             int p, x, y;
  422.  
  423.                             objc_offset(win->wind, W_FULLER, &x, &y);
  424.  
  425.                             PMovePopupCoord(FULLPOPUP, x, y);
  426.                             p = PDoPopupAddr(FULLPOPUP);
  427.  
  428.                             switch(p) {
  429.                                 case WPMAX:
  430.                                     msg_buf[0] = WM_FULLED;
  431.                                     msg_buf[3] = win->handle;
  432.                                     WMsgWindow(win, msg_buf);
  433.                                     break;
  434.  
  435.                                 case WPMIN:
  436.                                     msg_buf[0] = WM_SIZED;
  437.                                     msg_buf[3] = win->handle;
  438.                                     msg_buf[4] = win->minimum.g_x;
  439.                                     msg_buf[5] = win->minimum.g_y;
  440.                                     msg_buf[6] = win->minimum.g_w;
  441.                                     msg_buf[7] = win->minimum.g_h;
  442.                                     WMsgWindow(win, msg_buf);
  443.                                     break;
  444.                             }
  445.                         } else {
  446.                             msg_buf[0] = WM_FULLED;
  447.                             msg_buf[3] = win->handle;
  448.  
  449.                             WMsgWindow(win, msg_buf);
  450.                         }
  451.                         break;
  452.  
  453.                     case W_CASCADE:
  454.                         if (but) {
  455.                             int p, x, y;
  456.  
  457.                             objc_offset(win->wind, W_CASCADE, &x, &y);
  458.  
  459.                             PMovePopupCoord(CASCPOPUP, x, y);
  460.                             p = PDoPopupAddr(CASCPOPUP);
  461.  
  462.                             switch(p) {
  463.                                 case WPCASC:
  464.                                     WTopWindow(NULL);
  465.                                     break;
  466.  
  467.                                 case WPPTB:
  468.                                     WTopWindow(win);
  469.                                     break;
  470.  
  471.                                 case WPPRIO:
  472.                                     if (!(win->state & W_TIMER))
  473.                                         form_alert(1, "[3][Sorry, you cannot change|timer priority on a|non-timer window!][ OK ]");
  474.                                     break;
  475.  
  476.                                 case WPBEVENT:
  477.                                 case WPAOT:
  478.                                     form_alert(1, "[3][Sorry, functions not yet|implemented.][ OK ]");
  479.                                     break;
  480.                             }
  481.                         } else
  482.                             WTopWindow(NULL);
  483.                         break;
  484.                 }
  485.  
  486.                 if ((xaes.config1 & X_ELEMENTSEL) &&
  487.                     (object != W_CLOSER) &&
  488.                     (object != W_ULSIZE) &&
  489.                     (object != W_URSIZE) &&
  490.                     (object != W_LLSIZE) &&
  491.                     (object != W_LRSIZE))
  492.                     WObjc_Change(win, object, 0, win->wind[object].ob_state & ~SELECTED, 1);
  493.             }
  494. }
  495.  
  496. GLOBAL int WForm_window(WINDOW *win, int obj, int clicks)
  497. {
  498.     OBJECT *tree, *obptr;
  499.     int flags, state;
  500.     EVENT event;
  501.  
  502.     UNUSED(clicks);
  503.  
  504.     if (win) {
  505.         if (helpmode) {
  506.             WHandleWindowHelp(obj);
  507.             return 1;
  508.         }
  509.  
  510.         wind_update(BEG_MCTRL);
  511.  
  512.         tree = win->wind;
  513.         obptr = tree + obj;
  514.         flags = obptr->ob_flags;
  515.         state = obptr->ob_state;
  516.  
  517.         if ((flags & SELECTABLE) && !(state & DISABLED)) {
  518.             if ((flags & RBUTTON) && (state & SELECTED))
  519.                 no_click();
  520.             else {
  521.                 state ^= SELECTED;
  522.                 if (flags & (RBUTTON | TOUCHEXIT)) {
  523.                     if (flags & SELECTABLE)
  524.                         WObjc_Change(win, obj, 0, state, 1);
  525.  
  526.                     if (flags & RBUTTON) {
  527.                         register int act = obj, lst, new;
  528.  
  529.                         for (;;) {
  530.                             lst = act;
  531.                             new = obptr->ob_next;
  532.  
  533.                             for (;;) {
  534.                                 act = new;
  535.                                 obptr = tree + act;
  536.  
  537.                                 if (obptr->ob_tail == lst) {
  538.                                     new = obptr->ob_head;
  539.                                     lst = act;
  540.                                 } else {
  541.                                     if (act == obj)
  542.                                         goto rb_exit;
  543.  
  544.                                     if ((obptr->ob_state & SELECTED) && (obptr->ob_flags & RBUTTON)) {
  545.                                         WObjc_Change(win, act, 0, obptr->ob_state ^ SELECTED, 1);
  546.                                         goto rb_exit;
  547.                                     } else
  548.                                         break;
  549.                                 }
  550.                             }
  551.                         }
  552. rb_exit:                no_click();
  553.                     }
  554.                 } else {
  555.                     register OBJECT *ob = tree + obj;
  556.                     int x, y, dummy, events;
  557.  
  558.                     event.ev_mflags = MU_BUTTON | MU_M1;
  559.  
  560.                     event.ev_mbclicks = 1;
  561.                     event.ev_bmask = 0x0011;
  562.                     event.ev_mbstate = 0;
  563.  
  564.                     objc_offset(tree, obj, &event.ev_mm1x, &event.ev_mm1y);
  565.                     event.ev_mm1width = ob->ob_width;
  566.                     event.ev_mm1height = ob->ob_height;
  567.  
  568.                     graf_mkstate(&x, &y, &dummy, &dummy);
  569.                     if (rc_inside(x, y, (GRECT *) &event.ev_mm1x)) {
  570.                         event.ev_mm1flags = 1;
  571.                         WObjc_Change(win, obj, 0, ob->ob_state ^ SELECTED, 1);
  572.                     } else
  573.                         event.ev_mm1flags = 0;
  574.  
  575.                     do {
  576.                         events = EvntMulti(&event);
  577.                         if (events & MU_M1)    {
  578.                             event.ev_mm1flags = 1 - event.ev_mm1flags;
  579.                             WObjc_Change(win, obj, 0, ob->ob_state ^ SELECTED, 1);
  580.                         }
  581.                     } while (!(events & MU_BUTTON));
  582.                 }
  583.             }
  584.         }
  585.  
  586.         wind_update(END_MCTRL);
  587.  
  588.         if (event.ev_mbreturn != 2)
  589.             if (win->wind[obj].ob_flags & TOUCHEXIT) {
  590.                 WHandleWindow(win, obj, 1);
  591.                 if ((win->wind[obj].ob_flags & SELECTABLE) &&
  592.                     (win->wind[obj].ob_state & SELECTED))
  593.                     WObjc_Change(win, obj, 0, win->wind[obj].ob_state ^ SELECTED, 1);
  594.             }
  595.  
  596.             if ((win->wind[obj].ob_state & SELECTED) &&
  597.                 !(win->wind[obj].ob_flags & TOUCHEXIT)) {
  598.                 WHandleWindow(win, obj, event.ev_mbreturn);
  599.  
  600.                 if (win->state & W_OPEN)
  601.                     WObjc_Change(win, obj, 0, win->wind[obj].ob_state ^ SELECTED, 1);
  602.             }
  603.  
  604.         return 1;
  605.     } else
  606.         return 0;
  607. }
  608.