;/* blockinput.c - Execute me to compile me with SAS C 5.10 LC -b1 -cfistq -v -y -j73 blockinput.c Blink FROM LIB:c.o,blockinput.o TO blockinput LIBRARY LIB:LC.lib,LIB:Amiga.lib quit ** ** To use a window as a requester, first bring up a zero-sized requester ** attached to the main window (this provides the blocking feature). ** Then, bring up your second window, or bring up a busy pointer. The ** following example illustrates bringing up a busy pointer. ** blockinput.c -- program to demonstrate how to block the input from a ** window using a minimal requester, and how to put up a busy pointer. */ #define INTUI_V36_NAMES_ONLY #include <exec/types.h> #include <intuition/intuition.h> #include <clib/exec_protos.h> #include <clib/intuition_protos.h> #include <stdio.h> #ifdef LATTICE int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */ int chkabort(void) { return(0); } /* really */ #endif /* our function prototypes */ BOOL beginWait(struct Window *win, struct Requester *waitRequest); VOID endWait(struct Window *win, struct Requester *waitRequest); VOID processIDCMP(struct Window *win); struct Library *IntuitionBase; /* data for a busy pointer. ** this data must be in chip memory!!! */ UWORD __chip waitPointer[] = { 0x0000, 0x0000, /* reserved, must be NULL */ 0x0400, 0x07C0, 0x0000, 0x07C0, 0x0100, 0x0380, 0x0000, 0x07E0, 0x07C0, 0x1FF8, 0x1FF0, 0x3FEC, 0x3FF8, 0x7FDE, 0x3FF8, 0x7FBE, 0x7FFC, 0xFF7F, 0x7EFC, 0xFFFF, 0x7FFC, 0xFFFF, 0x3FF8, 0x7FFE, 0x3FF8, 0x7FFE, 0x1FF0, 0x3FFC, 0x07C0, 0x1FF8, 0x0000, 0x07E0, 0x0000, 0x0000, /* reserved, must be NULL */ }; /* ** main() ** ** Open a window and display a busy-pointer for a short time then wait for ** the user to hit the close gadget (in processIDCMP()). Normally, the ** application would bracket sections of code where it wishes to block window ** input with the beginWait() and endWait() functions. */ VOID main (int argc, char **argv) { struct Window *win; if (IntuitionBase = OpenLibrary("intuition.library",37)) { if (win = OpenWindowTags(NULL, WA_IDCMP, IDCMP_CLOSEWINDOW|IDCMP_INTUITICKS, WA_Activate, TRUE, WA_Width, 320, WA_Height, 100, WA_CloseGadget, TRUE, WA_DragBar, TRUE, WA_DepthGadget, TRUE, WA_SizeGadget, TRUE, WA_MaxWidth, ~0, WA_MaxHeight, ~0, TAG_END)) { processIDCMP(win); CloseWindow(win); } CloseLibrary(IntuitionBase); } } /* ** beginWait() ** ** Clear the requester with InitRequester. This makes a requester of ** width = 0, height = 0, left = 0, top = 0; in fact, everything is zero. ** This requester will simply block input to the window until ** EndRequest is called. ** ** The pointer is set to a reasonable 4-color busy pointer, with proper offsets. */ BOOL beginWait(struct Window *win, struct Requester *waitRequest) { extern UWORD __chip waitPointer[]; InitRequester(waitRequest); if (Request(waitRequest, win)) { SetPointer(win, waitPointer, 16, 16, -6, 0); SetWindowTitles(win,"Busy - Input Blocked",(UBYTE *)~0); return(TRUE); } else return(FALSE); } /* ** endWait() ** ** Routine to reset the pointer to the system default, and remove the ** requester installed with beginWait(). */ VOID endWait(struct Window *win, struct Requester *waitRequest) { ClearPointer(win); EndRequest(waitRequest, win); SetWindowTitles(win,"Not Busy",(UBYTE *)~0); } /* ** processIDCMP() ** ** Wait for the user to close the window. */ VOID processIDCMP(struct Window *win) { WORD done; struct IntuiMessage *msg; ULONG class; struct Requester myreq; UWORD tick_count; done = FALSE; /* Put up a requester with no imagery (size zero). */ if (beginWait(win,&myreq)) { /* ** Insert code here for a window to act as the requester. */ /* We'll count down INTUITICKS, which come about ten times ** a second. We'll keep the busy state for about three seconds. */ tick_count = 30; } while (!done) { Wait(1L << win->UserPort->mp_SigBit); while (NULL != (msg = (struct IntuiMessage *)GetMsg(win->UserPort))) { class = msg->Class; ReplyMsg((struct Message *)msg); switch (class) { case IDCMP_CLOSEWINDOW: done = TRUE; break; case IDCMP_INTUITICKS: if (tick_count > 0) { if (--tick_count == 0) endWait(win,&myreq); } break; } } } }