home *** CD-ROM | disk | FTP | other *** search
- #include <exec/types.h>
- #include <exec/libraries.h>
- #include <dos/dos.h>
- #include <libraries/commodities.h>
- #include <workbench/startup.h>
- #include <proto/exec.h>
- #include <proto/commodities.h>
- #include <clib/alib_protos.h>
- #include <clib/alib_stdio_protos.h>
-
- #include "glmatrix_gui.h"
- #include "glmatrix_prefs.h"
-
- extern void screenblanker_init(void);
- extern void screenblanker_destroy(void);
- extern void screenblanker_blank(void);
- extern void screenblanker_unblank(void);
- extern void screenblanker_display(void);
-
- struct Library *CxBase = NULL;
- struct IntuitionBase *IntuitionBase = NULL;
- struct Library *ResourceBase = NULL;
-
- CxObj *broker = NULL;
- CxObj *screensaver_object = NULL;
- struct MsgPort *broker_mp = NULL;
- ULONG cxsigflag = 0;
-
- LONG csignal = 0L;
- ULONG csigflag = 0L;
- struct Task *maintask = NULL;
-
- static ULONG timeout = 0;
- static BOOL do_blank = FALSE;
- static BOOL blanked = FALSE;
-
- struct NewBroker newbroker = {
- NB_VERSION,
- "GLMatrix",
- "GLMatrix",
- "MiniGL Matrix Screen Saver",
- NBU_UNIQUE | NBU_NOTIFY,
- COF_SHOW_HIDE,
- 0,
- 0,
- 0
- };
-
- void handle_signal(void)
- {
- if (do_blank)
- {
- screenblanker_blank();
- do_blank = FALSE;
- }
- else
- {
- screenblanker_unblank();
- }
- }
-
- void ProcessMessage(void)
- {
- ULONG signal = 0L;
- BOOL running = TRUE;
- CxMsg *msg = NULL;
-
- while (running)
- {
- if (blanked)
- {
- screenblanker_display();
-
- /* Check and clear signals */
- signal = SetSignal(0L, cxsigflag | csigflag | SIGBREAKF_CTRL_C);
- }
- else
- {
- signal = Wait(cxsigflag | csigflag | SIGBREAKF_CTRL_C | gui_window_signals);
- }
-
- if (signal & gui_window_signals)
- {
- gui_handle_window();
- }
-
- if (signal & cxsigflag)
- {
- while (msg = (CxMsg *)GetMsg(broker_mp))
- {
- ULONG msgtype = CxMsgType(msg);
- ULONG msgid = CxMsgID(msg);
-
- switch (msgtype)
- {
- case CXM_IEVENT:
- break;
- case CXM_COMMAND:
- switch (msgid)
- {
- case CXCMD_DISABLE:
- ActivateCxObj(broker, FALSE);
- break;
- case CXCMD_ENABLE:
- ActivateCxObj(broker, TRUE);
- break;
-
- case CXCMD_APPEAR:
- gui_open();
- break;
- case CXCMD_DISAPPEAR:
- gui_close();
- break;
-
- case CXCMD_UNIQUE:
- gui_open();
- break;
-
- case CXCMD_KILL:
- /*printf("CXCMD_KILL\n");*/
- running = FALSE;
- break;
- default:
- /*printf("Unknown msgid\n");*/
- break;
- }
- break;
- default:
- /*printf("Unknown msgtype\n");*/
- break;
- }
-
- ReplyMsg((struct Message *)msg);
- } /* while messages */
- } /*if message signal */
-
- if (signal & SIGBREAKF_CTRL_C)
- {
- /*printf("CTRL-C signal break \n");*/
- running = FALSE;
- }
- else if (signal & csigflag)
- {
- handle_signal();
- }
- }
- }
-
- void screensaver(CxMsg *cxm, CxObj *co)
- {
- struct InputEvent *ie = CxMsgData(cxm);
-
- if (ie->ie_Class == IECLASS_TIMER)
- {
- if (!blanked)
- {
- if (++timeout >= (glmatrix_prefs->glm_Timeout * 10L))
- {
- /* blank */
- blanked = TRUE;
- do_blank = TRUE;
- Signal(maintask, csigflag);
- }
- }
- }
- else if (ie->ie_Class != IECLASS_TIMER)
- {
- /* unblank */
- timeout = 0L;
- if (blanked)
- {
- do_blank = FALSE;
- Signal(maintask, csigflag);
- blanked = FALSE;
- }
- }
- }
-
- BOOL open_libs(void)
- {
- IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 37L);
- if (IntuitionBase == NULL) return FALSE;
-
- CxBase = OpenLibrary("commodities.library", 37L);
- if (CxBase == NULL) return FALSE;
-
- ResourceBase = OpenLibrary("resource.library", 37L);
- if (ResourceBase == NULL) return FALSE;
-
- return TRUE;
- }
-
- void close_libs(void)
- {
- if (ResourceBase != NULL) CloseLibrary(ResourceBase);
- ResourceBase = NULL;
-
- if (CxBase != NULL) CloseLibrary(CxBase);
- CxBase = NULL;
-
- if (IntuitionBase != NULL) CloseLibrary((struct Library *)IntuitionBase);
- IntuitionBase = NULL;
- }
-
-
- int main(void)
- {
- CxMsg *msg = NULL;
-
- if (open_libs())
- {
- if (gui_init())
- {
- maintask = FindTask(NULL);
- csignal = AllocSignal(-1L);
- csigflag = 1L << csignal;
-
- broker_mp = CreateMsgPort();
- if (broker_mp != NULL)
- {
- newbroker.nb_Port = broker_mp;
- broker = CxBroker(&newbroker, NULL);
- if (broker != NULL)
- {
- cxsigflag = 1L << broker_mp->mp_SigBit;
-
- screensaver_object = CxCustom(screensaver, 0L);
- if(screensaver_object != NULL)
- {
- AttachCxObj(broker, screensaver_object);
-
- if (!CxObjError(screensaver_object))
- {
- ActivateCxObj(broker, 1L);
-
- screenblanker_init();
-
- ProcessMessage();
-
- screenblanker_destroy();
- }
- }
-
- DeleteCxObjAll(broker);
- while (msg = (CxMsg *)GetMsg(broker_mp))
- {
- ReplyMsg((struct Message *)msg);
- }
- }
-
- DeletePort(broker_mp);
- }
- FreeSignal(csignal);
- }
- }
-
- gui_destroy();
- close_libs();
- return 0;
- }
-
- void wbmain(struct WBStartup *args)
- {
- main();
- }
-