;/* visiblewindow.c - Execute me to compile me with SAS C 5.10
LC -b1 -cfistq -v -y -j73 visiblewindow.c
Blink FROM LIB:c.o,visiblewindow.o TO visiblewindow LIBRARY LIB:LC.lib,LIB:Amiga.lib
quit
**
** open a window on the visible part of a screen, with the window as large
** as the visible part of the screen. It is assumed that the visible part
** of the screen is OSCAN_TEXT, which how the user has set their preferences.
*/
#define INTUI_V36_NAMES_ONLY
#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <graphics/displayinfo.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#ifdef LATTICE
int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */
int chkabort(void) { return(0); } /* really */
#endif
/* Minimum window width and height:
** These values should really be calculated dynamically given the size
** of the font and the window borders. Here, to keep the example simple
** they are hard-coded values.
*/
#define MIN_WINDOW_WIDTH (100)
#define MIN_WINDOW_HEIGHT (50)
/* minimum and maximum calculations...Note that each argument is
** evaluated twice (don't use max(a++,foo(c))).
*/
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<=(b)?(a):(b))
struct Library *IntuitionBase;
struct Library *GfxBase;
/* our function prototypes */
VOID handle_window_events(struct Window *win);
VOID fullScreen(VOID);
/*
** open all the libraries and run the code. Cleanup when done.
*/
VOID main(int argc, char **argv)
{
/* these calls are only valid if we have Intuition version 37 or greater */
if (GfxBase = OpenLibrary("graphics.library",37))
{
if (IntuitionBase = OpenLibrary("intuition.library",37))
{
fullScreen();
CloseLibrary(IntuitionBase);
}
CloseLibrary(GfxBase);
}
}
/*
** Open a window on the default public screen, then leave it open until the
** user selects the close gadget. The window is full-sized, positioned in the
** currently visible OSCAN_TEXT area.
*/
VOID fullScreen(VOID)
{
struct Window *test_window;
struct Screen *pub_screen;
struct Rectangle rect;
ULONG screen_modeID;
LONG width, height, left, top;
left = 0; /* set some reasonable defaults for left, top, width and height. */
top = 0; /* we'll pick up the real values with the call to QueryOverscan(). */
width = 640;
height= 200;
/* get a lock on the default public screen */
if (NULL != (pub_screen = LockPubScreen(NULL)))
{
/* this technique returns the text overscan rectangle of the screen that we
** are opening on. If you really need the actual value set into the display
** clip of the screen, use the VideoControl() command of the graphics library
** to return a copy of the ViewPortExtra structure. See the Graphics
** library chapter and Autodocs for more details.
**
** GetVPModeID() is a graphics call...
*/
screen_modeID = GetVPModeID(&pub_screen->ViewPort);
if(screen_modeID != INVALID_ID)
{
if (QueryOverscan(screen_modeID, &rect, OSCAN_TEXT))
{
/* make sure window coordinates are positive or zero */
left = max(0, -pub_screen->LeftEdge);
top = max(0, -pub_screen->TopEdge);
/* get width and height from size of display clip */
width = rect.MaxX - rect.MinX + 1;
height = rect.MaxY - rect.MinY + 1;
/* adjust height for pulled-down screen (only show visible part) */
if (pub_screen->TopEdge > 0)
height -= pub_screen->TopEdge;
/* insure that window fits on screen */
height = min(height, pub_screen->Height);
width = min(width, pub_screen->Width);
/* make sure window is at least minimum size */
width = max(width, MIN_WINDOW_WIDTH);
height = max(height, MIN_WINDOW_HEIGHT);
}
}
/* open the window on the public screen */
test_window = OpenWindowTags(NULL,
WA_Left, left, WA_Width, width,
WA_Top, top, WA_Height, height,
WA_CloseGadget, TRUE,
WA_IDCMP, IDCMP_CLOSEWINDOW,
WA_PubScreen, pub_screen,
TAG_END);
/* unlock the screen. The window now acts as a lock on the screen,
** and we do not need the screen after the window has been closed.
*/
UnlockPubScreen(NULL, pub_screen);
/* if we have a valid window open, run the rest of the
** program, then clean up when done.
*/
if (test_window)
{
handle_window_events(test_window);
CloseWindow(test_window);
}
}
}
/*
** Wait for the user to select the close gadget.
*/
VOID handle_window_events(struct Window *win)
{
struct IntuiMessage *msg;
BOOL done = FALSE;
while (! done)
{
/* we only have one signal bit, so we do not have to check which
** bit(s) broke the Wait() (i.e. the return value of Wait)
*/
Wait(1L << win->UserPort->mp_SigBit);
while ( (! done) &&
(msg = (struct IntuiMessage *)GetMsg(win->UserPort)))
{
/* use a switch statement if looking for multiple event types */
if (msg->Class == IDCMP_CLOSEWINDOW)
done = TRUE;
ReplyMsg((struct Message *)msg);
}
}
}