/* * mainloop.c V1.5 * * main event loop * * (c) 1991 by Stefan Becker * */ #include "ToolManager.h" /* structures for quit requester */ static struct EasyStruct QuitES={sizeof(struct EasyStruct),0,MyName, "Really quit?","Ok|Cancel"}; /* Set global quit flag, if no WB tool is currently active */ /* Display a safety requester if the user wants it */ void SetQuitFlag(void) { if (running=(wbactive>0)) /* Is a WB tool currently active? */ DisplayBeep(NULL); /* Yes, we can't quit! */ else { struct Screen *pubsc=LockPubScreen(WBScreenName); struct Window *w=pubsc?pubsc->FirstWindow:NULL; /* Shall we show a quit requester? */ if (ShowQuitReq) running=!EasyRequest(w,&QuitES,NULL,""); /* Check if config has changed */ if (!running) running=ShowSaveConfigRequester(w); if (pubsc) UnlockPubScreen(NULL,pubsc); } } /* The main processing loop */ void mainloop(void) { ULONG bsigs,psigs,csigs; /* Buffers for signals */ /* Init icon position */ MyIcon->do_CurrentX=IconXPos; MyIcon->do_CurrentY=IconYPos; if (ShowIcon) /* Display our icon? */ { /* If we have an icon, we don't need the "Open TM Window" menu entry */ RemoveAppMenuItem(OTWAppMenuItem); OTWAppMenuItem=NULL; /* Notify Workbench about icon */ if (!(MyAppIcon=AddAppIconA(NULL,NULL,IconName,MyMP,NULL,MyIcon,NULL))) cleanup(9); } /* Add TM pop up window hot key */ AttachCxObj(MyBroker,HotKey(PopUpHotKey,MyBrokerPort,NULL)); /* Commodities error? */ if (CxObjError(MyBroker)) cleanup(10); /* All things set up --> activate our broker */ SetBrokerState(TRUE); bsigs=SIGBREAKF_CTRL_C| /* break signals */ SIGBREAKF_CTRL_D|SIGBREAKF_CTRL_E|SIGBREAKF_CTRL_F; psigs=1L<mp_SigBit; /* port signal */ csigs=1L<mp_SigBit; /* Commodities Broker port signal */ globalsigs=bsigs|psigs|csigs; /* merge signals */ /* Open dock window */ OpenDockWindow(); ShowDock=TRUE; /* Show status window on startup? */ if (ShowStatusWindow) OpenStatusWindow(FALSE); while (running) /* main event loop */ { ULONG gotsigs; /* received signals */ /* Wait for specified signals */ gotsigs=Wait(globalsigs); if ((gotsigs&bsigs)) /* Got break signals and is no WB tool */ SetQuitFlag(); /* running? Yes, quit program */ if (gotsigs&psigs) /* Message arrived at message port? */ { struct AppMessage *msg; /* pointer to received message */ while (msg=GetMsg(MyMP)) /* Yes, empty message queue */ if (msg->am_Message.mn_Node.ln_Type==NT_REPLYMSG) /* Replied message? */ { /* This is the death message from a tool we started some time ago */ struct WBStartup *wbs=(struct WBStartup *) msg; struct WBArg *wa=wbs->sm_ArgList; int i=wbs->sm_NumArgs; while (i--) { UnLock(wa->wa_Lock); /* Free WB argument */ if (wa->wa_Name) free(wa->wa_Name); wa++; } if (wbs->sm_ToolWindow) /* Free tool window specification */ free(wbs->sm_ToolWindow); UnLoadSeg(wbs->sm_Segment); /* Unload code */ free(wbs); /* Free WBStartup */ wbactive--; /* One tool closed down */ } else { switch(msg->am_Type) /* Switch between message types */ { case MTYPE_APPWINDOW: /* Window action */ switch(msg->am_ID) /* Which AppWindow? */ { case STATWINAPPID: /* Status window */ /* Add Workbench parameters to tool list */ if (!WBAddToolNode(msg->am_ArgList,msg->am_NumArgs)) DisplayBeep(NULL); RefreshStatusWindow(); /* Refresh status window if open */ break; case DOCKWINAPPID: /* Dock window */ struct ToolNode *tn; WORD x=msg->am_MouseX,y=msg->am_MouseY; /* Find tool and start it with parameters */ if (tn=FindDock(x,y)) { SelectDock(tn,x,y,TRUE); StartTool(tn,msg); SelectDock(tn,x,y,FALSE); } break; } break; case MTYPE_APPICON: /* Icon action */ if (msg->am_ID) /* Tool icon selected? */ /* Start Tool, ID == Address of ToolNode */ StartTool((struct ToolNode *) msg->am_ID,msg); else /* User selected program icon */ if (msg->am_NumArgs==0) /* Did the user double click my icon? */ OpenStatusWindow(FALSE); /* Yes! Open status window */ else /* User dropped an icon on my icon */ { /* Add Workbench parameters to tool list */ if (!WBAddToolNode(msg->am_ArgList,msg->am_NumArgs)) DisplayBeep(NULL); RefreshStatusWindow(); /* Refresh status window if open */ } break; case MTYPE_APPMENUITEM: /* Menu action */ switch(msg->am_ID) { case 0: /* "Quit ToolManager" menu item */ SetQuitFlag(); break; case 1: /* "Open TM Window" menu item */ OpenStatusWindow(FALSE); break; default: /* Default: Tool selected */ /* Start Tool, ID == Address of ToolNode */ StartTool((struct ToolNode *) msg->am_ID,msg); break; } break; } /* end of switch(msg->am_Type) */ ReplyMsg((struct Message *) msg); /* Reply message to sender */ } /* end of if (msg->......) */ } /* end of if (gotsigs&psigs) */ if (gotsigs&csigs) /* Got broker port signal? */ { /* Handle commodities event */ struct CxMsg *msg; while (msg=GetMsg(MyBrokerPort)) /* Retrieve Messages from port */ { switch(CxMsgType(msg)) { case CXM_IEVENT: /* Received a hot key event */ struct ToolNode *tn; /* ID contains pointer to corresponding ToolNode */ if (tn=(struct ToolNode *) CxMsgID(msg)) { if (tn->tn_Flags&TNFLAGS_WBTF) /* Workbench Screen to front ? */ { struct Screen *pubsc=LockPubScreen(WBScreenName); if (pubsc) { ScreenToFront(pubsc); UnlockPubScreen(NULL,pubsc); } } StartTool(tn,NULL); } else OpenStatusWindow(TRUE); /* Pop up window hot key */ break; case CXM_COMMAND: /* Received a commodities command */ switch(CxMsgID(msg)) { case CXCMD_DISABLE: /* Disable broker */ SetBrokerState(FALSE); break; case CXCMD_ENABLE: /* Enable broker */ SetBrokerState(TRUE); break; case CXCMD_APPEAR: /* Open status window */ OpenStatusWindow(TRUE); break; case CXCMD_DISAPPEAR: /* Close status window */ CloseStatusWindow(); break; case CXCMD_KILL: /* Quit application */ SetQuitFlag(); break; } break; } ReplyMsg(msg); /* Reply message to sender */ } /* end of while (msg=....) */ } /* if (gotsigs&csigs) */ if (gotsigs&statwinsig) /* Got status window signal? */ HandleStatWinEvent(); /* Handle status window event */ if (gotsigs&editwinsig) /* Got edit window signal? */ HandleEditWinEvent(); /* Handle edit window event */ if (gotsigs&hkeywinsig) /* Got HotKeys window signal? */ HandleHotKeysWinEvent(); /* Handle HotKeys window event */ if (gotsigs&dockwinsig) /* Got dock window signal? */ HandleDockWinEvent(); /* Handle dock window event */ } /* end of main loop */ /* If window open, close it */ CloseStatusWindow(); CloseEditWindow(); CloseHotKeysWindow(); CloseDockWindow(); /* Exit program */ cleanup(99); }