home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
disks
/
disk420.lzh
/
WinMan
/
WinMan.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-20
|
6KB
|
231 lines
/*======================================*/
/* */
/* Simple window manager V1.0 */
/* */
/* © J.Tyberghein. */
/* Sun Sep 23 21:05:52 1990 */
/* */
/*======================================*/
#include <exec/types.h>
#include <exec/memory.h>
#include <graphics/gfx.h>
#include <graphics/gfxmacros.h>
#include <intuition/intuitionbase.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/wb.h>
#include <proto/dos.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/wb_protos.h>
#include <workbench/workbench.h>
#include <string.h>
/*** Menu ID's ***/
#define MENU_QUIT 1000
#define MENU_MAX 1001
#define MENU_MIN 1002
#define MENU_CASC 1003
#define MENU_HTILE 1004
#define MENU_VTILE 1005
#define MENU_ABOUT 1100
/*** Error codes ***/
#define ERR_OPENLIB -1
#define ERR_PORT -2
#define ERR_APMENU -3
struct MsgPort *port = NULL;
extern APTR DOSBase;
struct IntuitionBase *IntuitionBase = NULL;
APTR WorkbenchBase = NULL;
APTR am1 = NULL,am2 = NULL,am3 = NULL,am4 = NULL,am5 = NULL,am6 = NULL,am7 = NULL;
void __regargs CloseStuff (int rc)
{
switch (rc)
{
case -1 : PutStr ("Error opening library !\n"); break;
case -2 : PutStr ("Error creating message port !\n"); break;
case -3 : PutStr ("Error adding menu to workbench !\n"); break;
}
if (am7) RemoveAppMenuItem (am7);
if (am6) RemoveAppMenuItem (am6);
if (am5) RemoveAppMenuItem (am5);
if (am4) RemoveAppMenuItem (am4);
if (am3) RemoveAppMenuItem (am3);
if (am2) RemoveAppMenuItem (am2);
if (am1) RemoveAppMenuItem (am1);
if (port) DeleteMsgPort (port);
if (IntuitionBase) CloseLibrary ((struct Library *)IntuitionBase);
if (WorkbenchBase) CloseLibrary ((struct Library *)WorkbenchBase);
XCEXIT (rc);
}
void OpenStuff ()
{
if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary ("intuition.library",36L)))
{
Write (Output (),"You need AmigaDOS 2.0\n",22);
CloseStuff (0);
}
if (!(WorkbenchBase = (APTR )OpenLibrary ("workbench.library",0L)))
CloseStuff (ERR_OPENLIB);
if (!(port = (struct MsgPort *)CreateMsgPort ()))
CloseStuff (ERR_PORT);
if (!(am1 = (APTR)AddAppMenuItemA (MENU_QUIT,0,"WM: Quit",port,NULL)))
CloseStuff (ERR_APMENU);
if (!(am7 = (APTR)AddAppMenuItemA (MENU_ABOUT,0,"WM: About",port,NULL)))
CloseStuff (ERR_APMENU);
if (!(am2 = (APTR)AddAppMenuItemA (MENU_MAX,0,"WM: Maximize",port,NULL)))
CloseStuff (ERR_APMENU);
if (!(am3 = (APTR)AddAppMenuItemA (MENU_MIN,0,"WM: Minimize",port,NULL)))
CloseStuff (ERR_APMENU);
if (!(am4 = (APTR)AddAppMenuItemA (MENU_CASC,0,"WM: Cascade",port,NULL)))
CloseStuff (ERR_APMENU);
if (!(am5 = (APTR)AddAppMenuItemA (MENU_HTILE,0,"WM: Horiz Tile",port,NULL)))
CloseStuff (ERR_APMENU);
if (!(am6 = (APTR)AddAppMenuItemA (MENU_VTILE,0,"WM: Vert Tile",port,NULL)))
CloseStuff (ERR_APMENU);
}
void __regargs Minimize (struct Screen *scr)
{
struct Window *win;
for (win=scr->FirstWindow ; win ; win=win->NextWindow)
if (win->Flags & WINDOWSIZING) ChangeWindowBox (win,win->LeftEdge,win->TopEdge,win->MinWidth,win->MinHeight);
}
void __regargs Maximize (struct Screen *scr)
{
struct Window *win;
for (win=scr->FirstWindow ; win ; win=win->NextWindow)
if (win->Flags & WINDOWSIZING) ChangeWindowBox (win,0,0,scr->Width,scr->Height);
}
void __regargs Cascade (struct Screen *scr)
{
struct Window *win;
int wd,x,y,w,h,cx,cy;
for (win=scr->FirstWindow,wd=0 ; win ; win=win->NextWindow)
if ((win->Flags & WINDOWDRAG) || (win->Flags & WINDOWSIZING)) wd++;
cx = cy = (wd-1)*20;
for (win=scr->FirstWindow ; win ; win=win->NextWindow)
{
x = win->LeftEdge;
y = win->TopEdge;
w = win->Width;
h = win->Height;
if (win->Flags & WINDOWDRAG) { x = cx; y = cy; }
if (win->Flags & WINDOWSIZING) { w = scr->Width-x; h = scr->Height-y; }
if ((win->Flags & WINDOWDRAG) || (win->Flags & WINDOWSIZING))
{
ChangeWindowBox (win,x,y,w,h);
WindowToBack (win);
cx -= 20;
cy -= 20;
if (cx>scr->Width-20 || cy>scr->Height-20) return;
}
}
}
void __regargs HorizTile (struct Screen *scr)
{
struct Window *win;
int wd,cx,cw;
for (win=scr->FirstWindow,wd=0 ; win ; win=win->NextWindow)
if ((win->Flags & WINDOWDRAG) && (win->Flags & WINDOWSIZING)) wd++;
cx = 0;
if (wd) cw = scr->Width/wd;
for (win=scr->FirstWindow ; win ; win=win->NextWindow)
if ((win->Flags & WINDOWDRAG) && (win->Flags & WINDOWSIZING))
{
ChangeWindowBox (win,cx,0,cw,scr->Height);
cx += cw;;
}
}
void __regargs VertTile (struct Screen *scr)
{
struct Window *win;
int wd,cy,ch;
for (win=scr->FirstWindow,wd=0 ; win ; win=win->NextWindow)
if ((win->Flags & WINDOWDRAG) && (win->Flags & WINDOWSIZING)) wd++;
cy = 0;
if (wd) ch = scr->Height/wd;
for (win=scr->FirstWindow ; win ; win=win->NextWindow)
if ((win->Flags & WINDOWDRAG) && (win->Flags & WINDOWSIZING))
{
ChangeWindowBox (win,0,cy,scr->Width,ch);
cy += ch;;
}
}
void argmain ()
{
unsigned int x,y;
struct Screen *scr;
struct AppMessage *apm;
ULONG ID;
OpenStuff ();
Requester ("Window manager","","Installed",0);
x = y = 50;
do
{
WaitPort (port);
apm = (struct AppMessage *)GetMsg (port);
ID = apm->am_ID;
ReplyMsg ((struct Message *)apm);
Forbid ();
scr = IntuitionBase->FirstScreen;
switch (ID)
{
case MENU_MAX : Maximize (scr); break;
case MENU_MIN : Minimize (scr); break;
case MENU_CASC : Cascade (scr); break;
case MENU_HTILE : HorizTile (scr); break;
case MENU_VTILE : VertTile (scr); break;
case MENU_ABOUT : Requester ("Window manager V1.0","Written by J.Tyberghein","23 Sep 1990",0); break;
}
Permit ();
}
while (ID != MENU_QUIT);
CloseStuff (0);
}