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

  1. /********************************************************************
  2.  *                                                                1.00*
  3.  *    XAES: Enhanced Window Functions                                    *
  4.  *    by Ken Hollis                                                    *
  5.  *                                                                    *
  6.  *    Copyright (c) 1994, Bitgate Software.  All Rights Reserved.        *
  7.  *                                                                    *
  8.  *    Copy these window routines, and death is imminent.  Currently,    *
  9.  *    these routines only handle the resizing of large window            *
  10.  *    elements.  Small window elements will be added soon.            *
  11.  *                                                                    *
  12.  ********************************************************************/
  13.  
  14. #include "xaes.h"
  15.  
  16. #define W_ULSIZE 1   /* BOX dans l'arbre WINDOW */
  17. #define W_PCLOSE 2   /* BOX dans l'arbre WINDOW */
  18. #define W_CLOSER 3   /* BOXTEXT dans l'arbre WINDOW */
  19. #define W_TSIZE  4   /* BOX dans l'arbre WINDOW */
  20. #define W_URSIZE 5   /* BOX dans l'arbre WINDOW */
  21. #define W_PCASC  6   /* BOX dans l'arbre WINDOW */
  22. #define W_FULLER 7   /* BOXTEXT dans l'arbre WINDOW */
  23. #define W_LSIZE  8   /* BOX dans l'arbre WINDOW */
  24. #define W_RSIZE  9   /* BOX dans l'arbre WINDOW */
  25. #define W_LLSIZE 10  /* BOX dans l'arbre WINDOW */
  26. #define W_PSLLT  11  /* BOX dans l'arbre WINDOW */
  27. #define W_SLLT   12  /* BOXTEXT dans l'arbre WINDOW */
  28. #define W_BSIZE  13  /* BOX dans l'arbre WINDOW */
  29. #define W_LRSIZE 14  /* BOX dans l'arbre WINDOW */
  30. #define W_PSLDN  15  /* BOX dans l'arbre WINDOW */
  31. #define W_SLDN   16  /* BOXTEXT dans l'arbre WINDOW */
  32. #define W_MOVER  17  /* BOXTEXT dans l'arbre WINDOW */
  33. #define W_CASCADE 18  /* BOXTEXT dans l'arbre WINDOW */
  34. #define W_MENU   19  /* BOX dans l'arbre WINDOW */
  35. #define W_MENU_L 20  /* BOXTEXT dans l'arbre WINDOW */
  36. #define W_MENU_R 21  /* BOXTEXT dans l'arbre WINDOW */
  37. #define W_INFO   22  /* BOXTEXT dans l'arbre WINDOW */
  38. #define W_INFO_R 23  /* BOXTEXT dans l'arbre WINDOW */
  39. #define W_INFO_L 24  /* BOXTEXT dans l'arbre WINDOW */
  40. #define WORKAREA 25  /* BOXTEXT dans l'arbre WINDOW */
  41. #define W_SLUP   26  /* BOXTEXT dans l'arbre WINDOW */
  42. #define W_VERTRK 27  /* BOX dans l'arbre WINDOW */
  43. #define W_VERSL  28  /* BOX dans l'arbre WINDOW */
  44. #define W_HORTRK 29  /* BOX dans l'arbre WINDOW */
  45. #define W_HORSL  30  /* BOX dans l'arbre WINDOW */
  46. #define W_SLRT   31  /* BOXTEXT dans l'arbre WINDOW */
  47. #define W_OPTION 32  /* BOXTEXT dans l'arbre WINDOW */
  48.  
  49. #define S_ULSIZE 1   /* BOX dans l'arbre WINDSM */
  50. #define S_CLOSER 3   /* BOXTEXT dans l'arbre WINDSM */
  51. #define S_TSIZE  4   /* BOX dans l'arbre WINDSM */
  52. #define S_URSIZE 5   /* BOX dans l'arbre WINDSM */
  53. #define S_FULLER 7   /* BOXTEXT dans l'arbre WINDSM */
  54. #define S_CASCADE 8   /* BOXTEXT dans l'arbre WINDSM */
  55. #define S_RSIZE  9   /* BOX dans l'arbre WINDSM */
  56. #define S_LRSIZE 10  /* BOX dans l'arbre WINDSM */
  57. #define S_SLDN   12  /* BOXTEXT dans l'arbre WINDSM */
  58. #define S_SLRT   13  /* BOXTEXT dans l'arbre WINDSM */
  59. #define S_BSIZE  14  /* BOX dans l'arbre WINDSM */
  60. #define S_LLSIZE 15  /* BOX dans l'arbre WINDSM */
  61. #define S_SLLT   17  /* BOXTEXT dans l'arbre WINDSM */
  62. #define S_LSIZE  18  /* BOX dans l'arbre WINDSM */
  63. #define S_MOVER  19  /* BOXTEXT dans l'arbre WINDSM */
  64. #define S_MENU   20  /* BOX dans l'arbre WINDSM */
  65. #define S_MENU_L 21  /* BOXTEXT dans l'arbre WINDSM */
  66. #define S_MENU_R 22  /* BOXTEXT dans l'arbre WINDSM */
  67. #define S_INFO   23  /* BOXTEXT dans l'arbre WINDSM */
  68. #define S_INFO_R 24  /* BOXTEXT dans l'arbre WINDSM */
  69. #define S_INFO_L 25  /* BOXTEXT dans l'arbre WINDSM */
  70. #define S_OPTIONS 26  /* BOXTEXT dans l'arbre WINDSM */
  71. #define S_UP     27  /* BOXTEXT dans l'arbre WINDSM */
  72. #define S_VERTRK 28  /* BOX dans l'arbre WINDSM */
  73. #define S_VERSL  29  /* BOX dans l'arbre WINDSM */
  74. #define S_HORTRK 30  /* BOX dans l'arbre WINDSM */
  75. #define S_HORSL  31  /* BOX dans l'arbre WINDSM */
  76. #define S_WORK   32  /* BOXTEXT dans l'arbre WINDSM */
  77.  
  78. GLOBAL void WFixSize(WINDOW *win)
  79. {
  80.     if (win)
  81.         if (win->style & W_CUSTOMWINDOW) {
  82.             win->wind->ob_x                = win->size.g_x;
  83.             win->wind->ob_y                = win->size.g_y;
  84.             win->wind->ob_width            = win->size.g_w;
  85.             win->wind->ob_height        = win->size.g_h;
  86.  
  87.             win->wind[W_ULSIZE].ob_x    = 0;
  88.             win->wind[W_ULSIZE].ob_y     = 0;
  89.             win->wind[W_CLOSER].ob_x    = 0;
  90.             win->wind[W_CLOSER].ob_y    = 0;
  91.             win->wind[W_PCLOSE].ob_x    = win->wind[W_ULSIZE].ob_width - win->wind[W_PCLOSE].ob_width;
  92.             win->wind[W_PCLOSE].ob_y    = win->wind[W_ULSIZE].ob_height - win->wind[W_PCLOSE].ob_height;
  93.             win->wind[W_URSIZE].ob_x    = win->wind->ob_width - win->wind[W_URSIZE].ob_width;
  94.             win->wind[W_URSIZE].ob_y    = 0;
  95.             win->wind[W_FULLER].ob_x    = 0;
  96.             win->wind[W_FULLER].ob_y    = 0;
  97.             win->wind[W_PCASC].ob_x        = 0;
  98.             win->wind[W_PCASC].ob_y        = win->wind[W_URSIZE].ob_height - win->wind[W_PCASC].ob_height;
  99.             win->wind[W_TSIZE].ob_x        = win->wind[W_ULSIZE].ob_width - 1;
  100.             win->wind[W_TSIZE].ob_y        = 0;
  101.             win->wind[W_TSIZE].ob_width    = win->wind->ob_width - win->wind[W_ULSIZE].ob_width - win->wind[W_URSIZE].ob_width + 2;
  102.             win->wind[W_CASCADE].ob_x    = win->wind->ob_width - win->wind[W_URSIZE].ob_width - win->wind[W_CASCADE].ob_width + 1;
  103.             win->wind[W_CASCADE].ob_y    = win->wind[W_TSIZE].ob_height - 1;
  104.             win->wind[W_MOVER].ob_x        = win->wind[W_ULSIZE].ob_width - 1;
  105.             win->wind[W_MOVER].ob_y        = win->wind[W_TSIZE].ob_height - 1;
  106.             win->wind[W_MOVER].ob_width    = win->wind->ob_width - win->wind[W_ULSIZE].ob_width - win->wind[W_URSIZE].ob_width - win->wind[W_CASCADE].ob_width + 3;
  107.             win->wind[W_LLSIZE].ob_x    = 0;
  108.             win->wind[W_LLSIZE].ob_y    = win->wind->ob_height - win->wind[W_LLSIZE].ob_height;
  109.             win->wind[W_LSIZE].ob_x        = 0;
  110.             win->wind[W_LSIZE].ob_y        = win->wind[W_ULSIZE].ob_height - 1;
  111.             win->wind[W_LSIZE].ob_height= win->wind->ob_height - win->wind[W_LLSIZE].ob_height - win->wind[W_ULSIZE].ob_height + 2;
  112.             win->wind[W_LRSIZE].ob_x    = win->wind->ob_width - win->wind[W_LRSIZE].ob_width;
  113.             win->wind[W_LRSIZE].ob_y    = win->wind->ob_height - win->wind[W_LRSIZE].ob_height;
  114.             win->wind[W_RSIZE].ob_x        = win->wind->ob_width - win->wind[W_RSIZE].ob_width;
  115.             win->wind[W_RSIZE].ob_y        = win->wind[W_URSIZE].ob_height - 1;
  116.             win->wind[W_RSIZE].ob_height= win->wind->ob_height - win->wind[W_LRSIZE].ob_height - win->wind[W_URSIZE].ob_height + 2;
  117.             win->wind[W_BSIZE].ob_x        = win->wind[W_LLSIZE].ob_width - 1;
  118.             win->wind[W_BSIZE].ob_y        = win->wind->ob_height - win->wind[W_BSIZE].ob_height;
  119.             win->wind[W_BSIZE].ob_width    = win->wind->ob_width - win->wind[W_LLSIZE].ob_width - win->wind[W_LRSIZE].ob_width + 2;
  120.             win->wind[W_MENU].ob_x        = win->wind[W_LSIZE].ob_width - 1;
  121.             win->wind[W_MENU].ob_y        = win->wind[W_TSIZE].ob_height + win->wind[W_MOVER].ob_height - 2;
  122.             win->wind[W_MENU].ob_width    = win->wind->ob_width - win->wind[W_LSIZE].ob_width - win->wind[W_RSIZE].ob_width + 2;
  123.             win->wind[W_MENU_L].ob_x    = 0;
  124.             win->wind[W_MENU_L].ob_y    = 0;
  125.             win->wind[W_MENU_R].ob_x    = win->wind[W_MENU_L].ob_width - 1;
  126.             win->wind[W_MENU_R].ob_y    = 0;
  127.             win->wind[W_INFO].ob_x        = win->wind[W_LSIZE].ob_width - 1;
  128.             win->wind[W_INFO].ob_y        = win->wind[W_TSIZE].ob_height + win->wind[W_MOVER].ob_height + win->wind[W_MENU].ob_height - 3;
  129.             win->wind[W_INFO].ob_width    = win->wind->ob_width - win->wind[W_LSIZE].ob_width - win->wind[W_RSIZE].ob_width - win->wind[W_OPTION].ob_width + 3;
  130.             win->wind[W_INFO_L].ob_x    = 0;
  131.             win->wind[W_INFO_L].ob_y    = 0;
  132.             win->wind[W_INFO_R].ob_x    = win->wind[W_INFO_L].ob_width - 1;
  133.             win->wind[W_INFO_R].ob_y    = 0;
  134.             win->wind[W_OPTION].ob_x    = win->wind->ob_width - win->wind[W_RSIZE].ob_width - win->wind[W_OPTION].ob_width + 1;
  135.             win->wind[W_OPTION].ob_y    = win->wind[W_TSIZE].ob_height + win->wind[W_MOVER].ob_height + win->wind[W_MENU].ob_height - 3;
  136.             win->wind[W_PSLLT].ob_x        = win->wind[W_LLSIZE].ob_width - win->wind[W_PSLLT].ob_width;
  137.             win->wind[W_PSLLT].ob_y        = 0;
  138.             win->wind[W_SLLT].ob_x        = 0;
  139.             win->wind[W_SLLT].ob_y        = 0;
  140.             win->wind[W_SLRT].ob_x        = win->wind->ob_width - win->wind[W_LRSIZE].ob_width - win->wind[W_SLRT].ob_width + 1;
  141.             win->wind[W_SLRT].ob_y        = win->wind->ob_height - win->wind[W_BSIZE].ob_height - win->wind[W_SLRT].ob_height + 1;
  142.             win->wind[W_HORTRK].ob_x    = win->wind[W_LLSIZE].ob_width - 1;
  143.             win->wind[W_HORTRK].ob_y    = win->wind->ob_height - win->wind[W_BSIZE].ob_height - win->wind[W_HORTRK].ob_height + 1;
  144.             win->wind[W_HORTRK].ob_width= win->wind->ob_width - win->wind[W_LLSIZE].ob_width - win->wind[W_LRSIZE].ob_width - win->wind[W_SLRT].ob_width + 3;
  145.             win->wind[W_SLUP].ob_x        = win->wind->ob_width - win->wind[W_RSIZE].ob_width - win->wind[W_SLUP].ob_width + 1;
  146.             win->wind[W_SLUP].ob_y        = win->wind[W_URSIZE].ob_height + win->wind[W_MENU].ob_height + win->wind[W_OPTION].ob_height - 4;
  147.             win->wind[W_PSLDN].ob_x        = 0;
  148.             win->wind[W_PSLDN].ob_y        = 0;
  149.             win->wind[W_SLDN].ob_x        = 0;
  150.             win->wind[W_SLDN].ob_y        = 0;
  151.             win->wind[W_VERTRK].ob_x    = win->wind->ob_width - win->wind[W_RSIZE].ob_width - win->wind[W_VERTRK].ob_width + 1;
  152.             win->wind[W_VERTRK].ob_y    = win->wind[W_URSIZE].ob_height + win->wind[W_MENU].ob_height + win->wind[W_OPTION].ob_height + win->wind[W_SLUP].ob_height - 5;
  153.             win->wind[W_VERTRK].ob_height=    win->wind->ob_height - win->wind[W_LRSIZE].ob_height - win->wind[W_URSIZE].ob_height - win->wind[W_INFO].ob_height -
  154.                                             win->wind[W_MENU].ob_height - win->wind[W_SLUP].ob_height + 6;
  155.             win->wind[W_VERSL].ob_x        = 0;
  156.             win->wind[W_VERSL].ob_y        = 0;
  157.             win->wind[W_VERSL].ob_height= win->wind[W_VERTRK].ob_height;
  158.             win->wind[W_HORSL].ob_x        = 0;
  159.             win->wind[W_HORSL].ob_y        = 0;
  160.             win->wind[W_HORSL].ob_width    = win->wind[W_HORTRK].ob_width;
  161.             win->wind[WORKAREA].ob_x    = win->wind[W_LSIZE].ob_width - 1;
  162.             win->wind[WORKAREA].ob_y    = win->wind[W_TSIZE].ob_height + win->wind[W_MOVER].ob_height + win->wind[W_INFO].ob_height + win->wind[W_MENU].ob_height - 4;
  163.  
  164.             win->wind[WORKAREA].ob_width= win->wind->ob_width - win->wind[W_LSIZE].ob_width - win->wind[W_RSIZE].ob_width - win->wind[W_VERTRK].ob_width + 3;
  165.             win->wind[WORKAREA].ob_height=    win->wind->ob_height - win->wind[W_BSIZE].ob_height - win->wind[W_HORTRK].ob_height - win->wind[W_TSIZE].ob_height -
  166.                                             win->wind[W_MOVER].ob_height - win->wind[W_INFO].ob_height - win->wind[W_MENU].ob_height + 6;
  167.  
  168.             if (win->kind & CLOSER)
  169.                 win->wind[W_CLOSER].ob_flags &= ~HIDETREE;
  170.  
  171.             if (!(win->kind & CLOSER)) {
  172.                 win->wind[W_CLOSER].ob_flags |= HIDETREE;
  173.                 win->wind[W_MOVER].ob_x -= win->wind[W_CLOSER].ob_width - 1;
  174.                 win->wind[W_MOVER].ob_width += win->wind[W_CLOSER].ob_width - 1;
  175.             }
  176.  
  177.             if (win->kind & CASCADE)
  178.                 win->wind[W_CASCADE].ob_flags &= ~HIDETREE;
  179.  
  180.             if (!(win->kind & CASCADE)) {
  181.                 win->wind[W_CASCADE].ob_flags |= HIDETREE;
  182.                 win->wind[W_MOVER].ob_width += win->wind[W_CASCADE].ob_width - 1;
  183.             }
  184.  
  185.             if (win->kind & FULLER)
  186.                 win->wind[W_FULLER].ob_flags &= ~HIDETREE;
  187.  
  188.             if (!(win->kind & FULLER)) {
  189.                 win->wind[W_FULLER].ob_flags |= HIDETREE;
  190.                 win->wind[W_CASCADE].ob_x += win->wind[W_CASCADE].ob_width - 1;
  191.                 win->wind[W_MOVER].ob_width += win->wind[W_FULLER].ob_width - 1;
  192.             }
  193.  
  194.             if (win->state & W_UNSIZABLE)
  195.                 win->wind[W_FULLER].ob_state |= DISABLED;
  196.  
  197.             if (!(win->state & W_UNSIZABLE))
  198.                 win->wind[W_FULLER].ob_state &= ~DISABLED;
  199.  
  200.             if (win->kind & MENUWORK)
  201.                 win->wind[W_MENU].ob_flags &= ~HIDETREE;
  202.  
  203.             if (!(win->kind & MENUWORK)) {
  204.                 win->wind[W_MENU].ob_flags |= HIDETREE;
  205.                 win->wind[W_INFO].ob_y = win->wind[W_TSIZE].ob_height + win->wind[W_MOVER].ob_height - 2;
  206.                 win->wind[W_OPTION].ob_y = win->wind[W_TSIZE].ob_height + win->wind[W_MOVER].ob_height - 2;
  207.                 win->wind[WORKAREA].ob_y = win->wind[W_TSIZE].ob_height + win->wind[W_MOVER].ob_height + win->wind[W_INFO].ob_height - 3;
  208.                 win->wind[W_SLUP].ob_y = win->wind[W_URSIZE].ob_height + win->wind[W_OPTION].ob_height - 2;
  209.                 win->wind[W_VERTRK].ob_y = win->wind[W_URSIZE].ob_height + win->wind[W_OPTION].ob_height + win->wind[W_SLUP].ob_height - 3;
  210.                 win->wind[W_VERTRK].ob_height += win->wind[W_MENU].ob_height - 1;
  211.                 win->wind[W_VERSL].ob_height = win->wind[W_VERTRK].ob_height;
  212.                 win->wind[WORKAREA].ob_height += win->wind[W_MENU].ob_height - 1;
  213.             }
  214.  
  215.             if (win->kind & INFO)
  216.                 win->wind[W_INFO].ob_flags &= ~HIDETREE;
  217.  
  218.             if (!(win->kind & INFO)) {
  219.                 win->wind[W_INFO].ob_flags |= HIDETREE;
  220.                 win->wind[W_OPTION].ob_y -= win->wind[W_OPTION].ob_height - 1;
  221.                 win->wind[WORKAREA].ob_y -= win->wind[W_INFO].ob_height - 1;
  222.                 win->wind[W_SLUP].ob_y -= win->wind[W_INFO].ob_height - 1;
  223.                 win->wind[W_VERTRK].ob_y -= win->wind[W_INFO].ob_height - 1;
  224.                 win->wind[W_VERTRK].ob_height += win->wind[W_INFO].ob_height - 1;
  225.                 win->wind[W_VERSL].ob_height = win->wind[W_VERTRK].ob_height;
  226.                 win->wind[WORKAREA].ob_height += win->wind[W_INFO].ob_height - 1;
  227.  
  228.                 ChangeObjectText(win->wind, W_INFO, (char *) win->info, 3, TE_LEFT);
  229.             }
  230.  
  231.             if (win->kind & UPARROW)
  232.                 win->wind[W_SLUP].ob_flags &= ~HIDETREE;
  233.  
  234.             if (win->kind & DNARROW)
  235.                 win->wind[W_SLDN].ob_flags &= ~HIDETREE;
  236.  
  237.             if (win->kind & VSLIDE)
  238.                 win->wind[W_VERTRK].ob_flags &= ~HIDETREE;
  239.  
  240.             if (!(win->kind & UPARROW))
  241.                 win->wind[W_SLUP].ob_flags |= HIDETREE;
  242.  
  243.             if (!(win->kind & DNARROW))
  244.                 win->wind[W_SLDN].ob_flags |= HIDETREE;
  245.  
  246.             if (!(win->kind & VSLIDE))
  247.                 win->wind[W_VERTRK].ob_flags |= HIDETREE;
  248.  
  249.             if (!(win->kind & (UPARROW|DNARROW|VSLIDE))) {
  250.                 win->wind[WORKAREA].ob_width += win->wind[W_VERTRK].ob_width - 1;
  251.                 win->wind[W_SLRT].ob_x += win->wind[W_SLDN].ob_width - 1;
  252.                 win->wind[W_HORTRK].ob_width += win->wind[W_SLDN].ob_width - 1;
  253.                 win->wind[W_HORSL].ob_width = win->wind[W_HORTRK].ob_width;
  254.             }
  255.  
  256.             if (win->kind & OPTIONS)
  257.                 win->wind[W_OPTION].ob_flags &= ~HIDETREE;
  258.  
  259.             if (!(win->kind & OPTIONS)) {
  260.                 win->wind[W_OPTION].ob_flags |= HIDETREE;
  261.                 win->wind[W_INFO].ob_width += win->wind[W_OPTION].ob_width - 1;
  262.             }
  263.  
  264.             if (win->kind & LFARROW)
  265.                 win->wind[W_SLLT].ob_flags &= ~HIDETREE;
  266.  
  267.             if (win->kind & RTARROW)
  268.                 win->wind[W_SLRT].ob_flags &= ~HIDETREE;
  269.  
  270.             if (win->kind & HSLIDE)
  271.                 win->wind[W_HORTRK].ob_flags &= ~HIDETREE;
  272.  
  273.             if (!(win->kind & LFARROW))
  274.                 win->wind[W_SLLT].ob_flags |= HIDETREE;
  275.  
  276.             if (!(win->kind & RTARROW))
  277.                 win->wind[W_SLRT].ob_flags |= HIDETREE;
  278.  
  279.             if (!(win->kind & HSLIDE))
  280.                 win->wind[W_HORTRK].ob_flags |= HIDETREE;
  281.  
  282.             if (!(win->kind & (LFARROW|RTARROW|HSLIDE)))
  283.                 win->wind[WORKAREA].ob_height += win->wind[W_HORTRK].ob_height - 1;
  284.  
  285.             if (win->kind & MOVER)
  286.                 win->wind[W_MOVER].ob_state &= ~DISABLED;
  287.  
  288.             if (!(win->kind & MOVER))
  289.                 win->wind[W_MOVER].ob_state |= DISABLED;
  290.         }
  291. }
  292.  
  293. GLOBAL void WWindAdjust(WINDOW *win)
  294. {
  295.     if (win) {
  296.         if (win->tree) {
  297.             if ((win->wind_type == WC_WINDOW) && (win->style & W_CUSTOMWINDOW)) {
  298.                 win->wind[25].ob_width = win->tree->ob_width - 3;
  299.                 win->wind[25].ob_height= win->tree->ob_height - 4;
  300.  
  301.                 win->size.g_w = win->wind[W_LSIZE].ob_width +
  302.                                 win->wind[WORKAREA].ob_width +
  303.                                 win->wind[W_VERTRK].ob_width +
  304.                                 win->wind[W_RSIZE].ob_width;
  305.                 win->size.g_h = win->wind[W_URSIZE].ob_height +
  306.                                 win->wind[W_INFO].ob_height +
  307.                                 win->wind[W_MENU].ob_height +
  308.                                 win->wind[WORKAREA].ob_height +
  309.                                 win->wind[W_LRSIZE].ob_height;
  310.  
  311.                 if (!(win->kind & MENUWORK))
  312.                     win->size.g_h -= win->wind[W_MENU].ob_height - 1;
  313.  
  314.                 if (!(win->kind & (UPARROW|DNARROW|VSLIDE)))
  315.                     win->size.g_w -= win->wind[W_VERTRK].ob_width - 1;
  316.  
  317.                 if (!(win->kind & (LFARROW|RTARROW|HSLIDE)))
  318.                     win->size.g_h -= win->wind[W_HORTRK].ob_height - 1;
  319.  
  320.                 if (!(win->kind & INFO))
  321.                     win->size.g_h -= win->wind[W_INFO].ob_height - 1;
  322.             }
  323.         }
  324.  
  325.     /* Haha..  I won't even let you open a window larger than the
  326.        physical screen size! */
  327.         if ((win->size.g_w > desk.g_w) ||
  328.             (win->size.g_h > desk.g_h)) {
  329.             win->size.g_w = desk.g_w - win->size.g_x;
  330.             win->size.g_h = desk.g_h - win->size.g_y;
  331.  
  332.             if (win->style & W_CUSTOMWINDOW) {
  333.                 if (win->wind_type == WC_WINDOW) {
  334.                     win->wind[W_SLLT].ob_flags &= ~HIDETREE;
  335.                     win->wind[W_SLRT].ob_flags &= ~HIDETREE;
  336.                     win->wind[W_SLUP].ob_flags &= ~HIDETREE;
  337.                     win->wind[W_SLDN].ob_flags &= ~HIDETREE;
  338.                     win->wind[W_VERTRK].ob_flags &= ~HIDETREE;
  339.                     win->wind[W_HORTRK].ob_flags &= ~HIDETREE;
  340.                     win->wind[W_VERSL].ob_flags &= ~HIDETREE;
  341.                     win->wind[W_HORSL].ob_flags &= ~HIDETREE;
  342.                 }
  343.  
  344.                 if (win->wind_type == WC_SWINDOW) {
  345.                     win->wind[S_SLLT].ob_flags &= ~HIDETREE;
  346.                     win->wind[S_SLRT].ob_flags &= ~HIDETREE;
  347.                     win->wind[S_UP].ob_flags &= ~HIDETREE;
  348.                     win->wind[S_SLDN].ob_flags &= ~HIDETREE;
  349.                     win->wind[S_VERTRK].ob_flags &= ~HIDETREE;
  350.                     win->wind[S_HORTRK].ob_flags &= ~HIDETREE;
  351.                     win->wind[S_VERSL].ob_flags &= ~HIDETREE;
  352.                     win->wind[S_HORSL].ob_flags &= ~HIDETREE;
  353.                 }
  354.             }
  355.         }
  356.  
  357.         win->minimum.g_x = win->size.g_x;
  358.         win->minimum.g_y = win->size.g_y;
  359.         win->minimum.g_w = win->size.g_w;
  360.         win->minimum.g_h = win->size.g_h;
  361.     }
  362. }
  363.  
  364. GLOBAL void WMoveWindow(WINDOW *win, int x, int y, int w, int h)
  365. {
  366.     int wx, wy, ww, wh, ox, oy, ow, oh, x1, y1, w1, h1;
  367.     int tophandle;
  368.  
  369.     if ((win) && (win->handle != 0))
  370.         if (win->state & W_OPEN) {
  371.             wind_get(win->handle, WF_CURRXYWH, &wx, &wy, &ww, &wh);
  372.             WWindGet(win, WF_TOP, &tophandle);
  373.  
  374.             if (tophandle != 0) {
  375.                 x1 = wx;
  376.                 y1 = wy;
  377.                 w1 = ww;
  378.                 h1 = wh;
  379.  
  380.                 x = (x == -1) ? wx : (win->size.g_x = x);
  381.                 y = (y == -1) ? wy : (win->size.g_y = y);
  382.  
  383.                 if ((win->state & W_ICONIFIED) && (win->iconify)) {
  384.                     w = win->iconify->ob_width;
  385.                     h = win->iconify->ob_height;
  386.                 } else {
  387.                     w = (w == -1) ? ww : w;
  388.                     h = (h == -1) ? wh : h;
  389.                 }
  390.  
  391.                 ox = x;
  392.                 oy = y;
  393.                 ow = w;
  394.                 oh = h;
  395.  
  396.                 if (win->state & W_MINIMIZED)
  397.                     if (w != ww || h != wh )
  398.                         win->state &= ~W_MINIMIZED;
  399.                     else {
  400.                         int dummy, height;
  401.  
  402.                         wind_get(win->handle, WF_WORKXYWH, &dummy, &dummy, &dummy, &height);
  403.                         if (h > wh - height)
  404.                             h = wh - height;
  405.                     }
  406.  
  407.                 if (!(win->state & W_MINIMIZED))
  408.                     if ((win->state & W_ICONIFIED) && (win->iconify)) {
  409.                         win->size.g_w = win->iconify->ob_width;
  410.                         win->size.g_h = win->iconify->ob_height;
  411.                     } else {
  412.                         win->size.g_w = w;
  413.                         win->size.g_h = h;
  414.                     }
  415.  
  416.                 if ((win->size.g_w < win->minimum.g_w) ||
  417.                     (win->size.g_w > win->maximum.g_w)) {
  418.                     win->size.g_w = win->minimum.g_w;
  419.                     w = w1 = ow = win->size.g_w;
  420.                 }
  421.  
  422.                 if ((win->size.g_h < win->minimum.g_h) ||
  423.                     (win->size.g_h > win->maximum.g_h)) {
  424.                     win->size.g_h = win->minimum.g_h;
  425.                     h = h1 = oh = win->size.g_h;
  426.                 }
  427.  
  428.                 if (!(xaes.config1 & X_LEFTBORDER))
  429.                     if ((x != 1) && (x < -1))
  430.                         x = 0;
  431.  
  432.                 if ((win->state & W_ICONIFIED) && (win->iconify))
  433.                     if (x != wx || y != wy)
  434.                         wind_set(win->handle, WF_CURRXYWH, x, y, win->iconify->ob_width, win->iconify->ob_height + 13);
  435.  
  436.                 if (!(win->state & W_ICONIFIED))
  437.                     if (x != wx || y != wy || w != ww || h != wh) /* If either parameter has changed... */
  438.                         wind_set(win->handle, WF_CURRXYWH, x, y, w, h);    /* Move window */
  439.  
  440.                 wind_get(win->handle, WF_WORKXYWH, &x, &y, &w, &h);
  441.  
  442.                 if ((win->wind) && (win->style & W_CUSTOMWINDOW)) {
  443.                     win->wind->ob_x = x - (win->wind->ob_type & 0xff00 ? win->wind->ob_spec.obspec.framesize : 0);
  444.                     win->wind->ob_y = y - (win->wind->ob_type & 0xff00 ? win->wind->ob_spec.obspec.framesize : 0);
  445.  
  446.                     win->wind->ob_x--;
  447.                     win->wind->ob_y--;
  448.                 }
  449.  
  450.                 if (((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree)) && (win->style & W_CUSTOMWINDOW))
  451.                     if ((win->state & W_ICONIFIED) && (win->iconify)) {
  452.                         win->iconify->ob_x = (x + win->wind[WORKAREA].ob_x) - (win->iconify->ob_type & 0xFF00 ? win->iconify->ob_spec.obspec.framesize + 1 : 1);
  453.                         win->iconify->ob_y = (y + win->wind[WORKAREA].ob_y) - (win->iconify->ob_type & 0xFF00 ? win->iconify->ob_spec.obspec.framesize + 1 : 1);
  454.                     } else {                        
  455.                         win->tree->ob_x = (x + win->wind[WORKAREA].ob_x) - (win->tree->ob_type & 0xff00 ? win->tree->ob_spec.obspec.framesize + 1 : 1);
  456.                         win->tree->ob_y = (y + win->wind[WORKAREA].ob_y) - (win->tree->ob_type & 0xff00 ? win->tree->ob_spec.obspec.framesize + 1 : 1);
  457.                     }
  458.                 else if ((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree))
  459.                     if ((win->state & W_ICONIFIED) && (win->iconify)) {
  460.                         win->iconify->ob_x = x - (win->iconify->ob_type & 0xFF00 ? win->iconify->ob_spec.obspec.framesize + 1 : 1);
  461.                         win->iconify->ob_y = y - (win->iconify->ob_type & 0xFF00 ? win->iconify->ob_spec.obspec.framesize + 1 : 1);
  462.                     } else {
  463.                         win->tree->ob_x = x - (win->tree->ob_type & 0xff00 ? win->tree->ob_spec.obspec.framesize + 1 : 1);
  464.                         win->tree->ob_y = y - (win->tree->ob_type & 0xff00 ? win->tree->ob_spec.obspec.framesize + 1 : 1);
  465.                     }
  466.  
  467.                 if (((ox == x1) && (oy == y1) && (ow < w1) && (oh < h1)) ||
  468.                     ((ox == x1) && (oy == y1) && (ow == w1) && (oh < h1)) ||
  469.                     ((ox == x1) && (oy == y1) && (ow < w1) && (oh == h1))) {
  470.                     int x2, y2, w2, h2;
  471.  
  472.                     if (win->handle == tophandle) {
  473.                         wind_get(win->handle, WF_WORKXYWH, &x2, &y2, &w2, &h2);
  474.                         WRedrawWindow(win, x2, y2, w2, h2);
  475.                     }
  476.                 }
  477.  
  478.                 if ((win->handle != 0) && (win->style & W_CUSTOMWINDOW) && (win->wind)) {
  479.                     WFixSize(win);
  480.                     WFixWindow(win);
  481.                 }
  482.  
  483.                 win->minimum.g_x = win->size.g_x;
  484.                 win->minimum.g_y = win->size.g_y;
  485.             }
  486.         }
  487. }