home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / dev / e / amigae / rkrmsrc / intuition / requesters_alerts / blockinput.e next >
Text File  |  1995-03-26  |  4KB  |  112 lines

  1. -> blockinput.e -- Program to demonstrate how to block the input from a window
  2. -> using a minimal requester, and how to put up a busy pointer.
  3.  
  4. OPT OSVERSION=37  -> E-Note: silently require V37
  5.  
  6. MODULE 'exec/memory',
  7.        'intuition/intuition'
  8.  
  9. ENUM ERR_NONE, ERR_WIN
  10.  
  11. RAISE ERR_WIN IF OpenWindowTagList()=NIL
  12.  
  13. -> Open a window and display a busy-pointer for a short time then wait for the
  14. -> user to hit the close gadget (in processIDCMP()).  Normally, the application
  15. -> would bracket sections of code where it wishes to block window input with
  16. -> the beginWait() and endWait() functions.
  17. PROC main() HANDLE
  18.   DEF win=NIL
  19.  
  20.   win:=OpenWindowTagList(NIL,
  21.                         [WA_IDCMP,       IDCMP_CLOSEWINDOW OR IDCMP_INTUITICKS,
  22.                          WA_ACTIVATE,    TRUE,
  23.                          WA_WIDTH,       320,
  24.                          WA_HEIGHT,      100,
  25.                          WA_CLOSEGADGET, TRUE,
  26.                          WA_DRAGBAR,     TRUE,
  27.                          WA_DEPTHGADGET, TRUE,
  28.                          WA_SIZEGADGET,  TRUE,
  29.                          WA_MAXWIDTH,    -1,
  30.                          WA_MAXHEIGHT,   -1,
  31.                          NIL])
  32.   processIDCMP(win)
  33.  
  34. EXCEPT DO
  35.   IF win THEN CloseWindow(win)
  36.   -> E-Note: we can print a minimal error message
  37.   SELECT exception
  38.   CASE ERR_WIN; WriteF('Error: Failed to open window\n')
  39.   CASE "MEM";   WriteF('Error: Ran out of (chip) memory\n')
  40.   ENDSELECT
  41. ENDPROC
  42.  
  43. -> E-Note: get some Chip memory and copy list (quick, since LONG aligned)
  44. PROC copyListToChip(data)
  45.   DEF size, mem
  46.   size:=ListLen(data)*SIZEOF LONG
  47.   mem:=NewM(size, MEMF_CHIP)
  48.   CopyMemQuick(data, mem, size)
  49. ENDPROC mem
  50.  
  51. -> Clear the requester with InitRequester.  This makes a requester of
  52. -> width = 0, height = 0, left = 0, top = 0; in fact, everything is zero.  This
  53. -> requester will simply block input to the window until EndRequest is called.
  54. ->
  55. -> The pointer is set to a reasonable 4-color busy pointer, with proper offsets.
  56. PROC beginWait(win, waitRequest)
  57.   DEF waitPointer
  58.  
  59.   -> Data for a busy pointer.
  60.   -> This data must be in chip memory!!!
  61.   -> E-Note: the data is really a lot of LONGs
  62.   waitPointer:=copyListToChip([$00000000,   -> Reserved, must be NIL
  63.                                $040007C0,  $000007C0,  $01000380,  $000007E0,
  64.                                $07C01FF8,  $1FF03FEC,  $3FF87FDE,  $3FF87FBE,
  65.                                $7FFCFF7F,  $7EFCFFFF,  $7FFCFFFF,  $3FF87FFE,
  66.                                $3FF87FFE,  $1FF03FFC,  $07C01FF8,  $000007E0,
  67.                                $00000000    -> Reserved, must be NIL
  68.                               ])
  69.  
  70.   InitRequester(waitRequest)
  71.   IF Request(waitRequest, win)
  72.     SetPointer(win, waitPointer, 16, 16, -6, 0)
  73.     SetWindowTitles(win, 'Busy - Input Blocked', -1)
  74.     RETURN TRUE
  75.   ELSE
  76.     RETURN FALSE
  77.   ENDIF
  78. ENDPROC
  79.  
  80. -> Routine to reset the pointer to the system default, and remove the requester
  81. -> installed with beginWait().
  82. PROC endWait(win, waitRequest)
  83.   ClearPointer(win)
  84.   EndRequest(waitRequest, win)
  85.   SetWindowTitles(win, 'Not Busy', -1)
  86. ENDPROC
  87.  
  88. -> Wait for the user to close the window.
  89. PROC processIDCMP(win)
  90.   DEF class, myreq:requester, tick_count
  91.  
  92.   -> Put up a requester with no imagery (size zero).
  93.   IF beginWait(win, myreq)
  94.     -> Insert code here for a window to act as the requester.
  95.  
  96.     -> We'll count down INTUITICKS, which come about ten times a second.  We'll
  97.     -> keep the busy state for about three seconds.
  98.     tick_count:=30
  99.   ENDIF
  100.  
  101.   REPEAT
  102.     class:=WaitIMessage(win)
  103.     SELECT class
  104.     CASE IDCMP_INTUITICKS
  105.       IF tick_count>0
  106.         DEC tick_count
  107.         IF tick_count=0 THEN endWait(win, myreq)
  108.       ENDIF
  109.     ENDSELECT
  110.   UNTIL class=IDCMP_CLOSEWINDOW
  111. ENDPROC
  112.