home *** CD-ROM | disk | FTP | other *** search
- /* This patch is a quite ugly way to solve the problem
- ** that occurs when Intuition tries to draw something
- ** in a screen which has it's layers locked.
- ** The problem is solved by disabling dangerous functions.
- ** Some functions remain because they require more work.
- ** An example of this is OpenWindow(), since OpenWindow()
- ** can't be as easily ignored as the functions that ARE
- ** patched here. OpenWindow() would require some sort of
- ** semaphore locking and waiting - and so we're back where
- ** we started.
- */
-
- IMPORT struct IntuitionBase *IntuitionBase;
-
- IMPORT SHORT lvoActivateWindow, lvoWindowToFront, lvoWindowToBack;
- VOID myActivateWindow(), myWindowToFront(), myWindowToBack();
-
- LONG oldActivateWindow, oldWindowToFront, oldWindowToBack;
-
- STATIC WORD patched = 0;
-
- VOID SafePatch()
- {
- if (!patched) {
- Forbid(); /* I don't expect interrupts to do much intuition */
- oldActivateWindow =
- SetFunction(IntuitionBase, (LONG)lvoActivateWindow, myActivateWindow);
- oldWindowToFront =
- SetFunction(IntuitionBase, (LONG)lvoWindowToFront, myWindowToFront);
- oldWindowToBack =
- SetFunction(IntuitionBase, (LONG)lvoWindowToBack, myWindowToBack);
- Permit();
- patched = 1;
- }
- }
-
- VOID SafeRestore()
- {
- if (patched) {
- Forbid();
- (VOID)SetFunction(IntuitionBase, (LONG)lvoActivateWindow, oldActivateWindow);
- (VOID)SetFunction(IntuitionBase, (LONG)lvoWindowToFront, oldWindowToFront);
- (VOID)SetFunction(IntuitionBase, (LONG)lvoWindowToBack, oldWindowToBack);
- Permit();
- patched = 0;
- }
- }
-