home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
532.lha
/
NLDaemon
/
Source
/
NL-Handler.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-07-09
|
9KB
|
323 lines
/*
* NL-Daemon A program to force old programs to use NL gadget imagery.
*
* Copyright 1989 by Davide P. Cervone.
* You may use this code, provided this copyright notice is kept intact.
*/
#include "NL-Handler.h"
static char *program = PROGRAM;
static char *copyright = COPYRIGHT;
/*
* The following are the data for the Image structures used to
* replace the standard Intuition gadget images
*/
extern USHORT UpFrontData[UPDEPTH][UPHEIGHT*UPWORDS];
extern USHORT DownBackData[DOWNDEPTH][DOWNHEIGHT*DOWNWORDS];
extern USHORT SizeData[SIZEDEPTH][SIZEHEIGHT*SIZEWORDS];
extern USHORT CloseData[CLOSEDEPTH][CLOSEHEIGHT*CLOSEWORDS];
extern USHORT ZoomData[ZOOMDEPTH][ZOOMHEIGHT*ZOOMWORDS];
extern USHORT LR_UpFrontData[LR_UPDEPTH][LR_UPHEIGHT*LR_UPWORDS];
extern USHORT LR_DownBackData[LR_DOWNDEPTH][LR_DOWNHEIGHT*LR_DOWNWORDS];
extern USHORT LR_SizeData[LR_SIZEDEPTH][LR_SIZEHEIGHT*LR_SIZEWORDS];
extern USHORT LR_CloseData[LR_CLOSEDEPTH][LR_CLOSEHEIGHT*LR_CLOSEWORDS];
extern USHORT LR_ZoomData[LRZOOMDEPTH][LRZOOMHEIGHT*LRZOOMWORDS];
struct Image UpFrontImage =
{0,0, UPWIDTH,UPHEIGHT,UPDEPTH, &UpFrontData[0][0], 0x03,0x00, NULL};
struct Image DownBackImage =
{0,0, DOWNWIDTH,DOWNHEIGHT,DOWNDEPTH, &DownBackData[0][0], 0x03,0x00, NULL};
struct Image SizeImage =
{0,0, SIZEWIDTH,SIZEHEIGHT,SIZEDEPTH, &SizeData[0][0], 0x03,0x00, NULL};
struct Image CloseImage =
{0,0, CLOSEWIDTH,CLOSEHEIGHT,CLOSEDEPTH, &CloseData[0][0], 0x03,0x00, NULL};
struct Image ZoomImage =
{-3,0, ZOOMWIDTH,ZOOMHEIGHT,ZOOMDEPTH, &ZoomData[0][0], 0x03,0x00, NULL};
struct Image LR_UpFrontImage =
{0,0, LR_UPWIDTH,LR_UPHEIGHT,LR_UPDEPTH, &LR_UpFrontData[0][0],
0x03,0x00, NULL};
struct Image LR_DownBackImage =
{0,0, LR_DOWNWIDTH,LR_DOWNHEIGHT,LR_DOWNDEPTH, &LR_DownBackData[0][0],
0x03,0x00, NULL};
struct Image LR_SizeImage =
{0,0, LR_SIZEWIDTH,LR_SIZEHEIGHT,LR_SIZEDEPTH, &LR_SizeData[0][0],
0x03,0x00, NULL};
struct Image LR_CloseImage =
{0,0, LR_CLOSEWIDTH,LR_CLOSEHEIGHT,LR_CLOSEDEPTH, &LR_CloseData[0][0],
0x03,0x00, NULL};
struct Image LR_ZoomImage =
{-2,0, LRZOOMWIDTH,LRZOOMHEIGHT,LRZOOMDEPTH, &LR_ZoomData[0][0],
0x03,0x00,NULL};
/*
* SetImage()
*
* Saves the gadget's current image pointer in the SelectRender field
* and the width and left edge in the UserData field so that we can
* replace them if NL-Daemon is removed. Then we set the Render
* pointer to the Image we want, and fix the size and positioning
* appropriately.
*/
static void SetImage(theGadget,theImage,x,w)
struct Gadget *theGadget;
struct Image *theImage;
int x,w;
{
theGadget->SelectRender = theGadget->GadgetRender;
theGadget->UserData =
(APTR)((((LONG)(theGadget->LeftEdge)) << 16) | theGadget->Width);
theGadget->GadgetRender = (APTR)theImage;
if (x != SAME) theGadget->LeftEdge = x;
theGadget->Width = theImage->Width - w;
}
/*
* SetupGadget()
*
* Changes the gadget imagery from the standard Intuition images to the
* New Look images. Uses the SYSGADGET flag and the Intuition identification
* numbers to tell which gadget is which. Also modifies the gadget's
* width and left edge position to fit the new imagery.
*
* Since the gadgets are only copies of the standard ones, changing these
* is safe, and does not effect any other window. Since Intuition cleans
* up after the gadgets (and uses static images of its own) replacing
* the imagery does not require any special clean up on our part.
*/
void SetupGadgets(theGadget,Depth,Resolution,theWindow)
struct Gadget *theGadget;
int Depth;
ULONG Resolution;
struct Window *theWindow;
{
int dx = 0;
while (theGadget)
{
switch(theGadget->GadgetType & ~GADGETTYPE)
{
case SIZING:
if (Resolution == HIRES)
SetImage(theGadget,&SizeImage,SAME,0);
else
SetImage(theGadget,&LR_SizeImage,SAME,0);
break;
case WUPFRONT:
case SUPFRONT:
if (Depth > 1)
{
if (Resolution == HIRES)
SetImage(theGadget,&UpFrontImage,-UpFrontImage.Width+1,0);
else
SetImage(theGadget,&LR_UpFrontImage,SAME,0);
}
break;
case WDOWNBACK:
case SDOWNBACK:
if (Depth > 1)
{
if (Resolution == HIRES)
SetImage(theGadget,&DownBackImage,
-(UpFrontImage.Width+DownBackImage.Width) + 1,0);
else
SetImage(theGadget,&LR_DownBackImage,SAME,0);
}
break;
case CLOSE:
if (Resolution == HIRES)
SetImage(theGadget,&CloseImage,0,0);
else
SetImage(theGadget,&LR_CloseImage,0,0);
break;
case BOOLGADGET:
if (theGadget->GadgetID == ZOOMGADG && Depth > 1 && theWindow)
{
if (Resolution == HIRES)
{
dx = (theWindow->Flags & WINDOWDEPTH)? 2: 0;
SetImage(theGadget,&ZoomImage,theGadget->LeftEdge+dx,3);
} else {
dx = (theWindow->Flags & WINDOWDEPTH)? -2: 0;
SetImage(theGadget,&LR_ZoomImage,theGadget->LeftEdge+dx,2);
}
}
break;
}
theGadget = theGadget->NextGadget;
}
}
/*
* cOpenWindow()
*
* This is called after a window has been opened: theWindow is the
* pointer to the opened window.
*
* If the window has standard IntuitionGadgets or if it receives NEWSIZE
* IDCMP messages (which means ZOOM-DAEMON may have added a gadget) then
* go through the gadget list to replace the imagery.
*
* If the Detail and Block pens are the standard ones, change them to the
* ones needed by NL-Daemon.
*
* Once everything is set up, refresh the window imagery.
*/
struct Window *cOpenWindow(theWindow)
struct Window *theWindow;
{
int Depth;
ULONG Resolution;
if (theWindow)
{
Depth = theWindow->WScreen->BitMap.Depth;
Resolution = theWindow->WScreen->ViewPort.Modes & HIRES;
if ((theWindow->Flags & (WINDOWGADGETS)) ||
(theWindow->IDCMPFlags & NEWSIZE))
SetupGadgets(theWindow->FirstGadget,Depth,Resolution,theWindow);
if (Depth > 1)
{
if (theWindow->BlockPen == STDBLOCKPEN)
{
theWindow->BlockPen = BLOCKPEN | PENCHANGED;
if (theWindow->DetailPen == STDDETAILPEN ||
theWindow->DetailPen == BLOCKPEN)
theWindow->DetailPen = DETAILPEN | PENCHANGED;
}
}
RefreshWindowFrame(theWindow);
}
return(theWindow);
}
/*
* CheckText()
*
* Check the text DrawMode for needed changes. If the draw mode is
* COMPLEMENT, then change it to JAM1 and set the color. If it is JAM2,
* make sure the background color is OK. If wither JAM1 or JAM2, check
* that the forground color is OK.
*/
static void CheckText(theText)
struct IntuiText *theText;
{
if (theText)
{
switch(theText->DrawMode)
{
/*
case COMPLEMENT:
theText->DrawMode = JAM1;
theText->FrontPen = DETAILPEN | PENCHANGED;
break;
*/
case JAM2:
if (theText->BackPen == STDBLOCKPEN)
theText->BackPen = BLOCKPEN | PENCHANGED;
case JAM1:
if (theText->FrontPen == BLOCKPEN ||
theText->FrontPen == STDDETAILPEN)
theText->FrontPen = DETAILPEN | PENCHANGED;
break;
}
}
}
/*
* CheckItemList()
*
* Look through a MenuItem list and check each item for IntuiTexts
* that may need to be changed. Also check any sub-menus.
*/
static void CheckItemList(theItem)
struct MenuItem *theItem;
{
while (theItem)
{
if (theItem->Flags & ITEMTEXT)
{
CheckText(theItem->ItemFill);
if (theItem->Flags & HIGHIMAGE) CheckText(theItem->SelectFill);
}
CheckItemList(theItem->SubItem);
theItem = theItem->NextItem;
}
}
/*
* cSetMenuStrip()
*
* Our replacement for SetMenuStrip. It is called before the real
* set menu strip.
*
* If the window has had it's BlockPen altered, then look through
* each menu for IntuiTexts for IntuiTexts that may need to be changed.
*/
void cSetMenuStrip(theWindow,theMenu)
struct Window *theWindow;
struct Menu *theMenu;
{
if (theWindow->BlockPen & PENCHANGED)
{
while (theMenu)
{
CheckItemList(theMenu->FirstItem);
theMenu = theMenu->NextMenu;
}
}
}
struct Screen *cOpenScreen(theScreen)
struct Screen *theScreen;
{
if (theScreen)
{
if (theScreen->BitMap.Depth > 1)
{
SetupGadgets(theScreen->FirstGadget,theScreen->BitMap.Depth,
(theScreen->ViewPort.Modes & HIRES),NULL);
if (theScreen->BlockPen == STDBLOCKPEN)
{
theScreen->BlockPen = BLOCKPEN | PENCHANGED;
if (theScreen->DetailPen == STDDETAILPEN ||
theScreen->DetailPen == BLOCKPEN)
theScreen->DetailPen = DETAILPEN | PENCHANGED;
}
ShowTitle(theScreen,(theScreen->Flags & SHOWTITLE)? TRUE: FALSE);
}
}
return(theScreen);
}