home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / util / snoopdos-3.0.lha / SnoopDos / Source / miscwin.c < prev    next >
C/C++ Source or Header  |  1994-09-17  |  33KB  |  1,186 lines

  1. /*
  2.  *        MISCWIN.C                                            vi:ts=4
  3.  *
  4.  *      Copyright (c) Eddy Carroll, September 1994.
  5.  *
  6.  *        This module contains miscellaneous functions associated with
  7.  *        the SnoopDos GUI, but nevertheless not directly tied to any
  8.  *        particular window.
  9.  *        
  10.  */        
  11.  
  12. #include "system.h"
  13. #include "snoopdos.h"
  14. #include "gui.h"
  15.  
  16. #if 0
  17. #define DB(s)    KPrintF(s)
  18. #else
  19. #define DB(s)
  20. #endif
  21.  
  22. /*
  23.  *        Four dummy requesters for use when disabling window input
  24.  */
  25. struct FileRequester    *SnoopDosFR;
  26.  
  27. APTR                    AG_Context;
  28. struct NewAmigaGuide    AG_NewGuide;
  29. char                    *PendingAGuideMsg;
  30.  
  31. extern struct TextAttr    TopazFontAttr;
  32. extern struct TextAttr    SystemFontAttr;
  33. extern struct TextAttr    WindowFontAttr;
  34. extern struct TextAttr    BufferFontAttr;
  35.  
  36. /*
  37.  *        Now our busy pointer for V37 users (borrowed from ToolMaker)
  38.  */
  39. UWORD __chip WaitPointer[36] = {
  40.     0x0000, 0x0000, 0x0400, 0x07C0, 0x0000, 0x07C0, 0x0100, 0x0380,
  41.     0x0000, 0x07E0, 0x07C0, 0x1FF8, 0x1FF0, 0x3FEC, 0x3FF8, 0x7FDE,
  42.     0x3FF8, 0x7FBE, 0x7FFC, 0xFF7F, 0x7EFC, 0xFFFF, 0x7FFC, 0xFFFF,
  43.     0x3FF8, 0x7FFE, 0x3FF8, 0x7FFE, 0x1FF0, 0x3FFC, 0x07C0, 0x1FF8,
  44.     0x0000, 0x07E0, 0x0000, 0x0000
  45. };
  46.  
  47. ULONG __chip FileButtonData[] = {
  48.     0x0FF00000, 0x0C180000, 0x0C140000, 0x0C120000, 0x0C1F0000,
  49.     0x0C030000, 0x0C030000, 0x0C030000, 0x0C030000, 0x0FFF0000,
  50. };
  51.  
  52. ULONG __chip FontButtonData[] = {
  53.     0x0FE00000, 0x09200000, 0x01000000, 0x017F0000, 0x01490000,
  54.     0x01080000, 0x01080000, 0x00080000, 0x00080000, 0x00080000,
  55. };
  56.  
  57. /*
  58.  *        This structure holds all the information we need to know about
  59.  *        one of our custom images
  60.  */
  61. struct CustomBitMap {
  62.     struct Image    image;
  63.     struct Image    altimage;
  64.     struct BitMap    bitmap;
  65.     struct RastPort    rport;
  66. };
  67.  
  68. struct CustomImage {
  69.     struct CustomBitMap    image[2];
  70.     int                    size;
  71. };
  72.     
  73. /*****************************************************************************
  74.  *
  75.  *        Start of functions!
  76.  *
  77.  *****************************************************************************/
  78.  
  79. /*
  80.  *        DisableWindow(window, requester)
  81.  *
  82.  *        Disables the specified window by displaying a dummy requester in it
  83.  *        and turning on the wait pointer. It is assumed that the window
  84.  *        exists and has not been disabled already.
  85.  */
  86. void DisableWindow(struct Window *win, struct Requester *req)
  87. {
  88.     InitRequester(req);
  89.     if (Request(req, win)) {
  90.         /*
  91.          *        Use the new V39 system busy pointer if possible, else
  92.          *        drop back to our own busy pointer
  93.          */
  94.         if (IntuitionBase->LibNode.lib_Version >= 39)
  95.             SetWindowPointer(win,
  96.                              WA_BusyPointer,    TRUE,
  97.                              WA_PointerDelay,    TRUE,
  98.                              TAG_DONE);
  99.         else
  100.             SetPointer(win, WaitPointer, 16, 16, -6, 0);
  101.     }
  102. }
  103.  
  104. /*
  105.  *        EnableWindow()
  106.  *
  107.  *        Enables the specified window by removing the dummy requester
  108.  *        placed inside it earlier. You must have called DisableWindow()
  109.  *        with the same parameters first.
  110.  */
  111. void EnableWindow(struct Window *win, struct Requester *req)
  112. {
  113.     EndRequest(req, win);
  114.     ClearPointer(win);
  115. }
  116.  
  117. /*
  118.  *        DisableAllWindows()
  119.  *
  120.  *        Disables all windows by opening a dummy requester in them and
  121.  *        setting the window pointer to busy. Calls to this function
  122.  *        nest, so be sure to call EnableAllWindows the correct number
  123.  *        of times. This is intended for use when displaying modal
  124.  *        requesters (e.g. ASL, error messages, etc.)
  125.  */
  126. void DisableAllWindows(void)
  127. {
  128.     DisableNestCount++;
  129.     if (DisableNestCount == 1) {
  130.         if (MainWindow) {
  131.             /*
  132.              *        If we are disabling the main window, we won't be able
  133.              *        to respond to IDCMP_SIZEVERIFY messages, so instead, we
  134.              *        just stop requesting them. This lets the user resize the
  135.              *        window when we have a file/font requester up, even though
  136.              *        it won't redraw until the requester is finished.
  137.              */
  138.             ModifyIDCMP(MainWindow,MainWindow->IDCMPFlags & ~IDCMP_SIZEVERIFY);
  139.             DisableWindow(MainWindow, &MainRequester);
  140.         }
  141.         if (SetWindow)        DisableWindow(SetWindow,    &SetRequester);
  142.         if (FuncWindow)        DisableWindow(FuncWindow,    &FuncRequester);
  143.         if (FormWindow)        DisableWindow(FormWindow,    &FormRequester);
  144.     }
  145. }
  146.  
  147. /*
  148.  *        EnableAllWindows()
  149.  *
  150.  *        Re-enables all windows disabled by calling DisableAllWindows()
  151.  */
  152. void EnableAllWindows(void)
  153. {
  154.     DisableNestCount--;
  155.     if (DisableNestCount == 0) {
  156.         if (SetWindow)        EnableWindow(SetWindow,        &SetRequester);
  157.         if (FuncWindow)        EnableWindow(FuncWindow,    &FuncRequester);
  158.         if (FormWindow)        EnableWindow(FormWindow,    &FormRequester);
  159.         if (MainWindow) {
  160.             /*
  161.              *        Because the user might have resized the main window
  162.              *        while we were disabled, causing us to miss the resize
  163.              *        message (which happens when IDCMP_SIZEVERIFY is active)
  164.              *        we check to see if the size has changed and if it has,
  165.              *        cause a fake RESIZE message to be sent to ourself.
  166.              */
  167.             EnableWindow(MainWindow, &MainRequester);
  168.             ModifyIDCMP(MainWindow, MainWindow->IDCMPFlags | IDCMP_SIZEVERIFY);
  169.             if (MainWindow->Width  != CurWindowWidth ||
  170.                             MainWindow->Height != CurWindowHeight) {
  171.                 SizeWindow(MainWindow, 0, 0);
  172.             }
  173.         }
  174.     }
  175. }
  176.  
  177. /*
  178.  *        RecordWindowSizes()
  179.  *
  180.  *        Records the current size and position of all open windows on the
  181.  *        display so that they can be re-opened in the same position next time.
  182.  *        Usually called before a window is closed, but may also be called
  183.  *        when (for example) settings are being saved.
  184.  */
  185. void RecordWindowSizes(void)
  186. {
  187.     if (MainWindow) {
  188.         CurSettings.MainWinLeft   = MainWindow->LeftEdge;
  189.         CurSettings.MainWinTop    = MainWindow->TopEdge;
  190.         CurSettings.MainWinWidth  = MainWindow->Width;
  191.         CurSettings.MainWinHeight = MainWindow->Height;
  192.     }
  193.     if (FormWindow) {
  194.         CurSettings.FormWinLeft   = FormWindow->LeftEdge;
  195.         CurSettings.FormWinTop    = FormWindow->TopEdge;
  196.     }
  197.     if (FuncWindow) {
  198.         CurSettings.FuncWinLeft   = FuncWindow->LeftEdge;
  199.         CurSettings.FuncWinTop    = FuncWindow->TopEdge;
  200.     }
  201.     if (SetWindow) {
  202.         CurSettings.SetupWinLeft  = SetWindow->LeftEdge;
  203.         CurSettings.SetupWinTop   = SetWindow->TopEdge;
  204.     }
  205. }
  206.  
  207. /*
  208.  *        ShowError(errormsg)
  209.  *
  210.  *        Displays the specified error message in a requester (on the same
  211.  *        screen as the main SnoopDos window if possible, else on the
  212.  *        default window), waits for an OKAY click, and returns.
  213.  */
  214. void ShowError(char *errormsg, ...)
  215. {
  216.     static struct EasyStruct es = {
  217.         sizeof(struct EasyStruct),
  218.         0,
  219.         "SnoopDos",
  220.         NULL,
  221.         NULL
  222.     };
  223.     int pausestate = Paused;
  224.  
  225.     Paused = 0;
  226.  
  227.     es.es_TextFormat    = errormsg;
  228.     es.es_GadgetFormat    = MSG(MSG_ERROR_OKAY);
  229.     DisableAllWindows();
  230.     /*
  231.      *        If MainWindow is NULL, then the requester will appear on
  232.      *        the default public screen
  233.      */
  234.     EasyRequestArgs(MainWindow, &es, 0, (&errormsg)+1);
  235.     EnableAllWindows();
  236.     Paused = pausestate;
  237. }
  238.  
  239. /*
  240.  *        GetResponse(prompt, message, params, ...)
  241.  *
  242.  *        Displays an easy requester with the specified prompts, waits for the
  243.  *        user to click on an option, then returns the selected option.
  244.  *
  245.  *        Note that options are numbered 1,2,3....,0 with the leftmost gadget
  246.  *        returning 1 and the rightmost gadget returning 0.
  247.  */
  248. int GetResponse(char *prompts, char *reqmsg, ...)
  249. {
  250.     static struct EasyStruct es = {
  251.         sizeof(struct EasyStruct),
  252.         0,
  253.         "SnoopDos",
  254.         NULL,
  255.         NULL
  256.     };
  257.     int pausestate = Paused;
  258.     int choice;
  259.  
  260.     Paused = 0;
  261.  
  262.     es.es_TextFormat    = reqmsg;
  263.     es.es_GadgetFormat    = prompts;
  264.     DisableAllWindows();
  265.     choice = EasyRequestArgs(MainWindow, &es, 0, (&reqmsg)+1);
  266.     EnableAllWindows();
  267.     Paused = pausestate;
  268.     return (choice);
  269. }
  270.  
  271. /*
  272.  *        MaxTextLen(font, textarray)
  273.  *
  274.  *        Returns the length (in pixels) of the longest string in the given
  275.  *        zero-terminated array of message IDs, using the given font.
  276.  */
  277. int MaxTextLen(struct TextFont *font, int *ids)
  278. {
  279.     struct RastPort rp;
  280.     int maxlen = 0;
  281.  
  282.     InitRastPort(&rp);
  283.     SetFont(&rp, font);
  284.  
  285.     while (*ids) {
  286.         char *msg = MSG(*ids++);
  287.         int  len  = TextLength(&rp, msg, strlen(msg));
  288.  
  289.         if (len > maxlen)
  290.             maxlen = len;
  291.     }
  292.     return (maxlen);
  293. }
  294.  
  295. /*
  296.  *        GetTextLen(font, msg)
  297.  *
  298.  *        Returns the length (in pixels) of the given message indicated by the
  299.  *        message ID, when rendered in the given font.
  300.  */
  301. int GetTextLen(struct TextFont *font, char *msg)
  302. {
  303.     struct RastPort rp;
  304.  
  305.     InitRastPort(&rp);
  306.     SetFont(&rp, font);
  307.     return (TextLength(&rp, msg, strlen(msg)));
  308. }
  309.  
  310. /*
  311.  *        AddKeyShortcut(shortcut, gadid, msgid)
  312.  *
  313.  *        Checks the string corresponding to msgid for an underlined
  314.  *        chara