;/* to compile: execute listbrowser.c gcc -Wall TestRAIntuiTick.c -o TestRAIntuiTick -gstabs quit */ #include #include #include #include #include #include #include #include #include #include #define PROGNAME "TestRAIntuiTick" #define DBUG(x,...) IExec->DebugPrintF("[%s:%-4ld] "x ,__FILE__,__LINE__, ##__VA_ARGS__) #define ACQUIRE_IFACE(n) I##n = (struct n##IFace *)IExec->GetInterface(n##Base, "main", 1L, NULL); #define DISPOSE_IFACE(n) { IExec->DropInterface( (struct Interface *)I##n ); I##n = NULL; } #define ACQUIRE_CLASSES(n,s,v) { n##Base=open_ResourceClass(s, v, &(n##Class)); if(!n##Base) { return FALSE; } } #define ACQUIRE_CLASSES_LIB(n,s,v) { n##Base=(struct Library *)open_ResourceClass(s, v, &(n##Class)); if(!n##Base) { return FALSE; } } #define OBJ(x) Objects[x] #define GAD(x) (struct Gadget *)Objects[x] enum { WID_MAIN = 0, LAST_WIN }; enum { OID_MAIN = 0, OID_BUTTON, OID_STRING, OID_QUIT, LAST_OID }; //struct Library *NewlibBase; //struct ExecBase *ExecBase; //struct Library *DOSBase; struct Library *IntuitionBase; struct Library *UtilityBase; //struct Interface *INewlib; //struct ExecIFace *IExec; //struct DOSIFace *IDOS; struct IntuitionIFace *IIntuition; struct UtilityIFace *IUtility; struct Library *LayoutBase; // the class library base struct ClassLibrary *ButtonBase, *LabelBase, *WindowBase, *SpaceBase, *StringBase; // the class pointer Class *LayoutClass, *ButtonClass, *LabelClass, *WindowClass, *SpaceClass, *StringClass; // some interfaces needed Object *Objects[LAST_OID]; //struct Screen *screen; struct Window *win[LAST_WIN]; static struct ClassLibrary *open_ResourceClass(CONST_STRPTR name, uint32 ver, Class **className) { struct ClassLibrary *base = IIntuition->OpenClass(name, ver, className); DBUG("%s() base=0x%08lx class=0x%08lx\n",__FUNCTION__,base,className); if(base == NULL) { IDOS->TimedDosRequesterTags(TDR_Timeout, 20, TDR_FormatString, "Requires '%s' V%ld.%ld or higher!", TDR_GadgetString, "OK", TDR_ImageType, TDRIMAGE_ERROR, TDR_Arg1, name, TDR_Arg2, ver, TDR_Arg3, 0, TAG_END); } return base; } static BOOL open_Classes(void) { ACQUIRE_CLASSES(Space, "gadgets/space.gadget", 52) ACQUIRE_CLASSES(Button, "gadgets/button.gadget", 52) ACQUIRE_CLASSES(Label, "images/label.image", 52) ACQUIRE_CLASSES(String, "gadgets/string.gadget", 52) ACQUIRE_CLASSES(Window, "window.class", 52) ACQUIRE_CLASSES_LIB(Layout, "gadgets/layout.gadget", 52) //ACQUIRE_IFACE(Layout) return TRUE; } BOOL Open_Libs(void) { DBUG("%s() - START\n",__FUNCTION__); //NewlibBase = IExec->OpenLibrary("newlib.library", 52); //INewlib = (struct Interface *)IExec->GetInterface(NewlibBase, "main", 1, NULL); DOSBase = IExec->OpenLibrary("dos.library", 52); ACQUIRE_IFACE(DOS) UtilityBase = IExec->OpenLibrary("utility.library", 52); ACQUIRE_IFACE(Utility) IntuitionBase = IExec->OpenLibrary("intuition.library", 52); ACQUIRE_IFACE(Intuition) if(DOSBase==NULL || UtilityBase==NULL || IntuitionBase==NULL || open_Classes()==FALSE) { IExec->Alert(AT_Recovery|AG_OpenLib); return FALSE; } DBUG("%s() - END\n",__FUNCTION__); return TRUE; } void Close_Libs(void) { DBUG("%s()\n",__FUNCTION__); if(IIntuition) { IIntuition->CloseClass(SpaceBase); IIntuition->CloseClass(LabelBase); IIntuition->CloseClass(StringBase); IIntuition->CloseClass(ButtonBase); IIntuition->CloseClass(WindowBase); //DISPOSE_IFACE(Layout) IIntuition->CloseClass( (struct ClassLibrary *)LayoutBase ); } DISPOSE_IFACE(Intuition) IExec->CloseLibrary(IntuitionBase); DISPOSE_IFACE(Utility) IExec->CloseLibrary(UtilityBase); DISPOSE_IFACE(DOS) IExec->CloseLibrary(DOSBase); //DISPOSE_IFACE(Newlib) //IExec->CloseLibrary(NewlibBase); } /* * Process GUI (and menu) events */ BOOL Process_GUI(void) { BOOL done = TRUE; uint16 code = 0; uint32 result = WMHI_LASTMSG, siggot = 0, wsigmask = 0, res_value = 0; IIntuition->GetAttr(WINDOW_SigMask, OBJ(OID_MAIN), &wsigmask); siggot = IExec->Wait(wsigmask | SIGBREAKF_CTRL_C); if(siggot & SIGBREAKF_CTRL_C) { return FALSE; } if(siggot & wsigmask) { while( (result=IIntuition->IDoMethod(OBJ(OID_MAIN), WM_HANDLEINPUT, &code)) != WMHI_LASTMSG ) { //DBUG("result=0x%lx\n",result); switch(result & WMHI_CLASSMASK) { case WMHI_CLOSEWINDOW: DBUG("[WMHI_CLOSEWINDOW] (0x%08lx)\n",WMHI_CLOSEWINDOW); done = FALSE; break; case WMHI_INTUITICK: DBUG("Bang\n",NULL); break; case WMHI_GADGETUP: DBUG("[WMHI_GADGETUP] code = %ld (0x%08lx)\n",code,WMHI_GADGETUP); switch(result & WMHI_GADGETMASK) { case OID_BUTTON: break; case OID_QUIT: done = FALSE; break; } break; } } } // END of if(siggot & wsigmask) return done; } uint32 idcmphook_Func(struct Hook *hook, APTR window, struct IntuiMessage *msg) { DBUG("%s()\n",__FUNCTION__); if(msg) { DBUG(" 0x%08lx (0x%08lx)\n",msg->Class,msg->Code); } return WHOOKRSLT_IGNORE; } int main(void) { if(Open_Libs() == TRUE) { struct MsgPort *AppPort = IExec->AllocSysObjectTags(ASOT_PORT, TAG_DONE); struct Hook *idcmphook = (struct Hook*)IExec->AllocSysObjectTags(ASOT_HOOK, ASOHOOK_Entry,idcmphook_Func, TAG_DONE); OBJ(OID_MAIN) = IIntuition->NewObject(WindowClass, NULL, //"window.class", //WA_ScreenTitle, VERS" ("DATE")", WA_Title, PROGNAME, //WA_PubScreen, screen, WA_PubScreenFallBack, TRUE, WA_DragBar, TRUE, WA_CloseGadget, TRUE, WA_SizeGadget, TRUE, WA_DepthGadget, TRUE, WA_Activate, TRUE, WA_Width, 200, //WINDOW_IconifyGadget, TRUE, WINDOW_AppPort, AppPort, WINDOW_IDCMPHook, idcmphook, WINDOW_IDCMPHookBits, IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_GADGETUP|IDCMP_EXTENDEDMOUSE|IDCMP_MENUPICK, WINDOW_InterpretIDCMPHook, TRUE, //WINDOW_Icon, iconify, WINDOW_Position, WPOS_CENTERSCREEN, WINDOW_PopupGadget, TRUE, WINDOW_UniqueID, PROGNAME"_main", //WINDOW_MenuStrip, OBJ(OID_MENU), // menuclass //WINDOW_JumpScreensMenu, TRUE, WINDOW_GadgetHelp, TRUE, WINDOW_Layout, IIntuition->NewObject(LayoutClass, NULL, //"layout.gadget", LAYOUT_Orientation, LAYOUT_ORIENT_VERT, LAYOUT_SpaceOuter, TRUE, LAYOUT_AddChild, IIntuition->NewObject(ButtonClass, NULL, GA_ID, OID_BUTTON, GA_RelVerify, TRUE, GA_Text, "Clic_k me", GA_HintInfo, "click me hintinfo", //BUTTON_Justification, BCJ_LEFT, //BUTTON_BevelStyle, BVS_NONE, //BUTTON_Transparent, TRUE, TAG_DONE), CHILD_WeightedHeight, 0, LAYOUT_AddChild, OBJ(OID_STRING) = IIntuition->NewObject(StringClass, NULL, //GA_ReadOnly, TRUE, STRINGA_TextVal, "", TAG_DONE), /*CHILD_Label, IIntuition->NewObject(LabelClass, NULL, LABEL_Text, "Text:", TAG_DONE),*/ LAYOUT_AddChild, IIntuition->NewObject(SpaceClass, NULL, TAG_DONE), LAYOUT_AddChild, IIntuition->NewObject(ButtonClass, NULL, GA_ID, OID_QUIT, GA_RelVerify, TRUE, GA_Text, "_Quit", GA_HintInfo, "quit program", //BUTTON_Justification, BCJ_LEFT, //BUTTON_BevelStyle, BVS_NONE, //BUTTON_Transparent, TRUE, TAG_DONE), CHILD_WeightedHeight, 0, TAG_DONE), TAG_DONE); DBUG("OBJ(OID_MAIN) = %p\n",OBJ(OID_MAIN)); if( (win[WID_MAIN]=(struct Window *)IIntuition->IDoMethod(OBJ(OID_MAIN), WM_OPEN, NULL)) ) { DBUG("win opened\n",NULL); // IIntuition->ModifyIDCMP(win[WID_MAIN], IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_GADGETUP|IDCMP_EXTENDEDMOUSE|IDCMP_MENUPICK); while(Process_GUI() != FALSE); // IIntuition->ModifyIDCMP(win[WID_MAIN], 0); } // END if( (win[WID_MAIN]=.. IIntuition->DisposeObject( OBJ(OID_MAIN) ); //OBJ(OID_MAIN) = NULL; IExec->FreeSysObject(ASOT_HOOK, idcmphook); IExec->FreeSysObject(ASOT_PORT, AppPort); } Close_Libs(); return RETURN_OK; }