home *** CD-ROM | disk | FTP | other *** search
- #include "ScreenMenu.h"
-
- #define ID_HOTKEY 3L
- #define RETURN 196
- #define ESC 197
-
- #define NORMAL 1
- #define PUBLIC 2
- #define EGS 3
-
- struct ScreenNode {
- struct Node sn_Node;
- struct Screen *sn_Screen;
- };
-
- extern struct IntuitionBase *IntuitionBase;
- CxObj *myBroker;
- CxMsg *msg;
- struct MsgPort *myPort;
- ULONG cxsigflag;
-
- const char version[] =
- {
- "$VER: ScreenMenu 1.2 (5.8.94)"
- };
-
- //+ main()
- void main(int argc, char **argv)
- {
- UBYTE **ttypes, *hotkey;
- struct Library *CxBase;
- struct Library *IconBase;
- CxObj *sender, *filter,*translate;
- struct NewBroker myBrokerDef = {
- NB_VERSION,
- "ScreenMenu",
- "ScreenMenu",
- "Popup a list of screen",
- NBU_UNIQUE|NBU_NOTIFY,
- 0, 0, 0, 0
- };
-
- CxBase = OpenLibrary ("commodities.library",37L);
- if (CxBase)
- {
- IconBase = OpenLibrary("icon.library", 37L);
- if (IconBase)
- {
- myPort = CreateMsgPort();
- if (myPort)
- {
- cxsigflag = 1L<<myPort->mp_SigBit;
- ttypes = ArgArrayInit(argc, argv);
- myBrokerDef.nb_Pri = (BYTE)ArgInt(ttypes, "CX_PRIORITY" ,128);
- hotkey = ArgString(ttypes, "HOTKEY", "f10");
-
- myBrokerDef.nb_Port = myPort;
- myBroker = CxBroker(&myBrokerDef, NULL);
- if (myBroker)
- {
- filter = CxFilter(hotkey);
- if (filter)
- {
- AttachCxObj(myBroker, filter);
- sender = CxSender(myPort, ID_HOTKEY);
- if (sender)
- {
- AttachCxObj(filter, sender);
- translate = CxTranslate(NULL);
- if (translate)
- {
- AttachCxObj(filter,translate);
- if (!CxObjError(filter))
- {
- ActivateCxObj(myBroker, 1L);
-
- ProcessBrokerMsg();
- }
- }
- }
- }
- DeleteCxObjAll(myBroker);
- while (msg = (CxMsg *)GetMsg(myPort))
- ReplyMsg((struct Message *)msg);
- }
- DeletePort(myPort);
- }
- ArgArrayDone();
- CloseLibrary(IconBase);
- }
- CloseLibrary(CxBase);
- }
- }
- //-
- //+ ProcessBrokerMsg()
- void ProcessBrokerMsg(void)
- {
- CxMsg *cmsg;
- ULONG sigrcvd, msgid, msgtype;
- LONG returnvalue = 1L;
-
- while (returnvalue)
- {
- sigrcvd = Wait(SIGBREAKF_CTRL_C | cxsigflag);
- while (msg = (CxMsg *)GetMsg (myPort))
- {
- msgid = CxMsgID(msg);
- msgtype = CxMsgType(msg);
- ReplyMsg((struct Message *)msg);
- switch(msgtype)
- {
- case CXM_IEVENT:
- switch(msgid)
- {
- case ID_HOTKEY:
- windowtime();
-
- while (cmsg = (CxMsg *)GetMsg(myPort))
- ReplyMsg((struct Message *)msg);
- break;
- }
- break;
- case CXM_COMMAND:
- switch(msgid)
- {
- case CXCMD_DISABLE:
- ActivateCxObj(myBroker, 0L);
- break;
- case CXCMD_ENABLE:
- ActivateCxObj(myBroker, 1L);
- break;
- case CXCMD_KILL:
- returnvalue = 0L;
- break;
- case CXCMD_UNIQUE:
- printf("ScreenMenu is now removed from memory!\n");
- returnvalue = 0L;
- break;
- }
- break;
- }
- }
- if (sigrcvd & SIGBREAKF_CTRL_C)
- {
- returnvalue = 0L;
- }
- }
- }
- //-
- //+ windowtimer()
- void windowtime()
- {
- UWORD number;
- struct List ls;
-
- NewList(&ls);
-
- number = MakeScreenList(&ls);
- if (SetupScreen() == 0)
- {
-
- if (OpenSMWindow() == 0)
- {
- GT_SetGadgetAttrs(SMGadgets[0], SMWnd, NULL, GTLV_Labels, &ls,
- GTLV_Selected, 0,
- TAG_DONE);
-
- ProcessEvent(SMWnd, &ls, SMGadgets[0], number);
-
- CloseSMWindow();
- }
- CloseDownScreen();
- }
-
- FreeScreenList(&ls);
- }
- //-
- //+ MakeScreenList()
- UWORD MakeScreenList(struct List *ls)
- {
- UWORD number=0, first=0;
- ULONG num;
- struct Screen *misc;
- struct ScreenNode *blk;
-
- num = LockIBase(0);
-
- do
- {
- if (first == 0) { misc = IntuitionBase->FirstScreen; first += 1; }
- else misc = misc->NextScreen;
- blk = (struct ScreenNode *)AllocMem(sizeof(struct ScreenNode), MEMF_CLEAR);
- if (blk)
- {
- blk->sn_Node.ln_Name = misc->DefaultTitle;
- blk->sn_Screen = misc;
- AddHead(ls, (struct Node *)blk);
- number += 1;
- }
- } while(misc->NextScreen != NULL);
-
- UnlockIBase(num);
-
- return ((UWORD)(number));
- }
- //-
- //+ FreeScreenList()
- void FreeScreenList(struct List *ls )
- {
- struct ScreenNode *blk;
-
- while (!IsListEmpty(ls))
- {
- blk = (struct ScreenNode *)RemHead(ls);
- FreeMem(blk, sizeof(struct ScreenNode));
- }
- }
- //-
- //+ ProcessEvent()
- void ProcessEvent(struct Window *win, struct List *ls,struct Gadget *lv, UWORD number)
- {
- struct Gadget *gad;
- SHORT Done;
- struct Screen *misc;
- struct ScreenNode *blk;
- struct PubScreenNode *blk2;
- ULONG i;
- UWORD list = NORMAL, number2=0;
- UWORD selected = 0;
- struct IntuiMessage *msg;
- struct List *ls2 = NULL;
-
- number -= 1;
- Done = FALSE;
- while (FALSE == Done)
- {
- Wait (1L<< win->UserPort->mp_SigBit);
-
- while ( (FALSE == Done) &&
- (NULL != (msg = GT_GetIMsg(win->UserPort))))
- {
- switch(msg->Class)
- {
- case IDCMP_MOUSEBUTTONS:
- if (msg->Code == IECODE_RBUTTON)
- Done=TRUE;
- break;
- case IDCMP_INACTIVEWINDOW:
- Done=TRUE;
- break;
- case IDCMP_RAWKEY:
- switch(msg->Code)
- {
- case ESC:
- Done = TRUE;
- break;
- case CURSORUP:
- if (selected > 0)
- selected--;
- else
- selected = (list == NORMAL) ? number : number2;
- GT_SetGadgetAttrs(lv, win, NULL, GTLV_Selected, (ULONG)selected, TAG_DONE);
- break;
- case CURSORDOWN:
- if (selected < ((list == NORMAL) ? number : number2))
- selected++;
- else
- selected = 0;
- GT_SetGadgetAttrs(lv, win, NULL, GTLV_Selected, (ULONG)selected, TAG_DONE);
- break;
- case RETURN:
- if (list == NORMAL)
- {
- blk = (struct ScreenNode *)ls->lh_Head;
- i = (ULONG)selected;
- while (i != 0)
- {
- blk = (struct ScreenNode *)blk->sn_Node.ln_Succ;
- --i;
- }
- misc = blk->sn_Screen;
- ScreenToFront(misc);
- ActivateWindow(misc->FirstWindow);
- Done = TRUE;
- }
- if (list == PUBLIC)
- {
- blk2 = (struct PubScreenNode *)ls2->lh_Head;
- i = (ULONG)selected;
- while (i != 0)
- {
- blk2 = (struct PubScreenNode *)blk2->psn_Node.ln_Succ;
- --i;
- }
- misc = blk2->psn_Screen;
- ScreenToFront(misc);
- ActivateWindow(misc->FirstWindow);
- Done = TRUE;
- }
- break;
- }
- break;
- case IDCMP_GADGETUP:
- gad = (struct Gadget *)msg->IAddress;
- switch((ULONG)gad->UserData)
- {
- case 1:
- if (list == NORMAL) {
- blk = (struct ScreenNode *)ls->lh_Head;
- i = (ULONG)msg->Code;
- while (i != 0)
- {
- blk = (struct ScreenNode *)blk->sn_Node.ln_Succ;
- --i;
- }
- misc = blk->sn_Screen;
- ScreenToFront(misc);
- ActivateWindow(misc->FirstWindow);
- Done = TRUE;
- }
- if (list == PUBLIC) {
- blk2 = (struct PubScreenNode *)ls2->lh_Head;
- i = (ULONG)msg->Code;
- while (i != 0)
- {
- blk2 = (struct PubScreenNode *)blk2->psn_Node.ln_Succ;
- --i;
- }
- misc = blk2->psn_Screen;
- ScreenToFront(misc);
- ActivateWindow(misc->FirstWindow);
- Done = TRUE;
- }
- break;
- case 2:
- {
- ULONG temp;
-
- GT_GetGadgetAttrs(gad, win, NULL, GTCY_Active, &temp, TAG_DONE);
- switch(temp)
- {
- case 0:
- list = NORMAL;
- GT_SetGadgetAttrs(lv, win, NULL, GTLV_Labels, ls,
- GTLV_Selected, 0,
- TAG_DONE);
- break;
- case 1:
- {
- struct Node *tmp;
-
- list = PUBLIC;
- ls2 = LockPubScreenList();
- UnlockPubScreenList();
- for (tmp = ls2->lh_Head, number2 = 0; tmp->ln_Succ; tmp = tmp->ln_Succ) number2++;
- GT_SetGadgetAttrs(lv, win, NULL, GTLV_Labels, ls2,
- GTLV_Selected, 0,
- TAG_DONE);
- }
- break;
- /*case 2:
- list = EGS;
- GT_SetGadgetAttrs(lv, win, NULL, GTLV_Labels, ~0,
- TAG_DONE);
- break;*/
- }
- }
- break;
- }
- break;
- }
- GT_ReplyIMsg(msg);
- }
- }
- }
- //-
-