IPTR SetAttrs ( /* SYNOPSIS */ APTR object, Tag tag1, ...) /* FUNCTION Changes several attributes of an object at the same time. How the object interprets the new attributes depends on the class. INPUTS object - Change the attributes of this object tag1 - The first of a list of attribute/value-pairs. The last attribute in this list must be TAG_END or TAG_DONE. The value for this last attribute is not examined (ie. you need not specify it). RESULT Depends in the class. For gadgets, this value is non-zero if they need redrawing after the values have changed. Other classes will define other return values. NOTES This function sends OM_SET to the object. EXAMPLE BUGS SEE ALSO boopsi.library/NewObjectA(), boopsi.library/DisposeObject(), boopsi.library/GetAttr(), boopsi.library/MakeClass(), "Basic Object-Oriented Programming System for Intuition" and "boopsi Class Reference" Dokument. INTERNALS HISTORY 29-10-95 digulla automatically created from intuition_lib.fd and clib/intuition_protos.h *****************************************************************************/ { AROS_SLOWSTACKTAGS_PRE(tag1) retval = SetAttrsA (object, AROS_SLOWSTACKTAGS_ARG(tag1)); AROS_SLOWSTACKTAGS_POST } /* SetAttrs */
void connectscrollerandlistview(struct ScrollerGadget *scrollergad, Object *listview, struct AslBase_intern *AslBase) { #if USE_SAFE_NOTIFYING struct TagItem ic_tags[] = { {ICA_TARGET , (IPTR)listview }, {TAG_DONE } }; /* ICA_TARGET of prop ic is listview gadget */ SetAttrsA(scrollergad->prop_ic, ic_tags); /* ICA_TARGET of listview ic is prop gadget */ ic_tags[0].ti_Data = (IPTR)scrollergad->prop; SetAttrsA(scrollergad->listview_ic, ic_tags); /* ICA_TARGET of listview gadget is listview ic */ ic_tags[0].ti_Data = (IPTR)scrollergad->listview_ic; SetAttrsA(listview, ic_tags); /* ICA_TARGET of prop gadget is prop ic */ ic_tags[0].ti_Data = (IPTR)scrollergad->prop_ic; SetAttrsA(scrollergad->prop, ic_tags); #else struct TagItem ic_tags[] = { {ICA_TARGET , (IPTR)listview }, {ICA_MAP , (IPTR)prop_to_lv }, {TAG_DONE } }; #warning This would not work in AmigaOS, because there gadgetclass is really lame and does not check for notifying loops SetAttrsA(scrollergad->prop, ic_tags); ic_tags[0].ti_Data = (IPTR)scrollergad->prop; ic_tags[1].ti_Data = (IPTR)lv_to_prop; SetAttrsA(listview, ic_tags); #endif }
BOOL makescrollergadget(struct ScrollerGadget *scrollergad, struct LayoutData *ld, struct TagItem *tags, struct AslBase_intern *AslBase) { struct TagItem extraproptags[] = { {PGA_NotifyBehaviour, PG_BEHAVIOUR_NICE}, {PGA_RenderBehaviour, PG_BEHAVIOUR_NICE}, {TAG_MORE , 0 } }; struct TagItem *ti, *h_ti, *w_ti; WORD x, y, w, h, aw, ah; UWORD flags = 0; BOOL freehoriz = (GetTagData(PGA_Freedom, FREEVERT, tags) == FREEHORIZ); BOOL result = FALSE; if ((ti = FindTagItem(GA_Left, tags))) { x = ti->ti_Data; } else if ((ti = FindTagItem(GA_RelRight, tags))) { x = ti->ti_Data; flags |= GFLG_RELRIGHT; } if ((ti = FindTagItem(GA_Top, tags))) { y = ti->ti_Data; } else if ((ti = FindTagItem(GA_RelBottom, tags))) { y = ti->ti_Data; flags |= GFLG_RELBOTTOM; } if ((w_ti = FindTagItem(GA_Width, tags))) { w = w_ti->ti_Data; } else if ((w_ti = FindTagItem(GA_RelWidth, tags))) { w = w_ti->ti_Data; flags |= GFLG_RELWIDTH; } if ((h_ti = FindTagItem(GA_Height, tags))) { h = h_ti->ti_Data; } else if ((h_ti = FindTagItem(GA_RelHeight, tags))) { h = h_ti->ti_Data; flags |= GFLG_RELHEIGHT; } if (freehoriz) { aw = h; ah = h; w -= aw * 2; if (w_ti) w_ti->ti_Data = w; } else { aw = w; ah = w; h -= ah * 2; if (h_ti) h_ti->ti_Data = h; } extraproptags[2].ti_Data = (IPTR)tags; if ((scrollergad->prop = NewObjectA(AslBase->aslpropclass, NULL, extraproptags))) { struct TagItem arrow_tags[] = { {GA_Left , freehoriz ? x + w - 1 : x }, {GA_Top , freehoriz ? y : y + h - 1 }, {GA_Width , aw }, {GA_Height , ah }, {GA_RelVerify , TRUE }, {GA_Immediate , TRUE }, {GA_Previous , (IPTR)scrollergad->prop }, {GA_ID , ID_ARROWDEC }, {TAG_DONE } }; if (flags & GFLG_RELRIGHT) arrow_tags[0].ti_Tag = GA_RelRight; if (flags & GFLG_RELWIDTH) { arrow_tags[0].ti_Tag = GA_RelRight; if (freehoriz) arrow_tags[0].ti_Data += 2; } if (flags & GFLG_RELBOTTOM) arrow_tags[1].ti_Tag = GA_RelBottom; if (flags & GFLG_RELHEIGHT) { arrow_tags[1].ti_Tag = GA_RelBottom; if (!freehoriz) arrow_tags[1].ti_Data += 2; } if ((scrollergad->arrow1 = NewObjectA(AslBase->aslarrowclass, NULL, arrow_tags))) { if (freehoriz) { arrow_tags[0].ti_Data += aw; } else { arrow_tags[1].ti_Data += ah; } arrow_tags[6].ti_Data = (IPTR)scrollergad->arrow1; arrow_tags[7].ti_Data = ID_ARROWINC; if ((scrollergad->arrow2 = NewObjectA(AslBase->aslarrowclass, NULL, arrow_tags))) { struct TagItem image_tags[] = { {SYSIA_Which , freehoriz ? LEFTIMAGE : UPIMAGE }, {SYSIA_DrawInfo , (IPTR)ld->ld_Dri }, {SYSIA_Style , SYSISTYLE_GADTOOLS }, {IA_Width , aw }, {IA_Height , ah }, {TAG_DONE } }; struct Image *im; if ((im = NewObjectA(NULL, SYSICLASS, image_tags))) { SetAttrs(scrollergad->arrow1, GA_Image, (IPTR)im, TAG_DONE); image_tags[0].ti_Data = (freehoriz ? RIGHTIMAGE : DOWNIMAGE); if ((im = NewObjectA(NULL, SYSICLASS, image_tags))) { #if USE_SAFE_NOTIFYING struct TagItem ic_tags [] = { {ICA_MAP , (IPTR) prop_to_lv }, {TAG_DONE } }; if ((scrollergad->prop_ic = NewObjectA(NULL, ICCLASS, ic_tags))) { ic_tags[0].ti_Data = (IPTR)lv_to_prop; if ((scrollergad->listview_ic = NewObjectA(NULL, ICCLASS, ic_tags))) { #endif struct TagItem set_tags [] = { {ICA_TARGET , (IPTR) scrollergad->prop }, {ICA_MAP , (IPTR) arrowdec_to_prop }, {TAG_DONE } }; SetAttrs(scrollergad->arrow2, GA_Image, (IPTR)im, TAG_DONE); SetAttrsA(scrollergad->arrow1, set_tags); set_tags[1].ti_Data = (IPTR)arrowinc_to_prop; SetAttrsA(scrollergad->arrow2, set_tags); result = TRUE; #if USE_SAFE_NOTIFYING } /* if ((scrollergad->listview_ic = NewObjectA(NULL, ICCLASS, ic_tags))) */ } /* if ((scrollergad->prop_ic = NewObjectA(NULL, ICCLASS, ic_tags))) */ #endif } /* if ((im = NewObjectA(NULL, SYSICLASS, image_tags))) */ } /* if ((im = NewObject(NULL, SYSICLASS, image_tags))) */ } /* if ((scrollergad->arrow2 = NewObjectA(NULL, BUTTONGCLASS, arrow_tags))) */ } /* if (scrollergad->arrow1 = NewObjectA(NULL, BUTTONGCLASS, arrow_tags)) */ } /* if ((scrollergad->prop = NewObjectA(AslBase->aslpropclass, NULL, tags))) */ if (!result) killscrollergadget(scrollergad, AslBase); return result; }
IPTR ScreenModeProperties__OM_SET(Class *CLASS, Object *self, struct opSet *message) { struct ScreenModeProperties_DATA *data = INST_DATA(CLASS, self); const struct TagItem *tags; struct TagItem *tag; struct TagItem noforward_tags[] = { {MUIA_Group_Forward , FALSE }, {TAG_MORE , (IPTR)message->ops_AttrList } }; struct opSet noforward_message = *message; noforward_message.ops_AttrList = noforward_tags; ULONG id = INVALID_ID; IPTR no_notify = TAG_IGNORE; for (tags = message->ops_AttrList; (tag = NextTagItem(&tags)); ) { switch (tag->ti_Tag) { case MUIA_NoNotify: no_notify = MUIA_NoNotify; break; case MUIA_ScreenModeProperties_DisplayID: { struct TagItem width_tags[] = { { no_notify, TRUE }, { MUIA_Numeric_Min, 0 }, { MUIA_Numeric_Max, 0 }, { MUIA_Numeric_Default, 0 }, { TAG_DONE, 0 } }; struct TagItem height_tags[] = { { no_notify, TRUE }, { MUIA_Numeric_Min, 0 }, { MUIA_Numeric_Max, 0 }, { MUIA_Numeric_Default, 0 }, { TAG_DONE, 0 } }; struct TagItem depth_tags[] = { { no_notify, TRUE }, { MUIA_Numeric_Min, 0 }, { MUIA_Numeric_Max, 0 }, { MUIA_Numeric_Default, 0 }, { TAG_DONE, 0 } }; struct DimensionInfo dim; BOOL autoscroll; if (GetDisplayInfoData(NULL, (UBYTE *)&dim, sizeof(dim), DTAG_DIMS, tag->ti_Data)) { width_tags[1].ti_Data = dim.MinRasterWidth; height_tags[1].ti_Data = dim.MinRasterHeight; depth_tags[1].ti_Data = 1; width_tags[2].ti_Data = dim.MaxRasterWidth; height_tags[2].ti_Data = dim.MaxRasterHeight; depth_tags[2].ti_Data = dim.MaxDepth; width_tags[3].ti_Data = dim.Nominal.MaxX - dim.Nominal.MinX + 1; height_tags[3].ti_Data = dim.Nominal.MaxY - dim.Nominal.MinY + 1; depth_tags[3].ti_Data = dim.MaxDepth; id = tag->ti_Data; } /* Enable autoscroll only if the maximum sizes are bigger than the resolution. */ autoscroll = width_tags[2].ti_Data > width_tags[3].ti_Data && height_tags[2].ti_Data > height_tags[3].ti_Data; data->DisplayID = id; nfset(self, MUIA_Disabled, id == INVALID_ID); SetAttrsA(data->width, width_tags); SetAttrsA(data->height, height_tags); SetAttrsA(data->depth, depth_tags); SetAttrs(data->autoscroll, no_notify, TRUE, MUIA_Disabled, !autoscroll, MUIA_Selected, autoscroll, TAG_DONE); break; } case MUIA_ScreenModeProperties_Width: if (id != INVALID_ID) { WORD width = tag->ti_Data; if (width != -1) SetAttrs(data->width, no_notify, TRUE, MUIA_Numeric_Value, width, TAG_DONE); else DoMethod(data->width, MUIM_Numeric_SetDefault); nnset(data->def_width, MUIA_Selected, width == -1); } break; case MUIA_ScreenModeProperties_Height: if (id != INVALID_ID) { WORD height = tag->ti_Data; if (height != -1) SetAttrs(data->height, no_notify, TRUE, MUIA_Numeric_Value, height, TAG_DONE); else DoMethod(data->height, MUIM_Numeric_SetDefault); nnset(data->def_height, MUIA_Selected, height == -1); } break; case MUIA_ScreenModeProperties_Depth: if (id != INVALID_ID) { WORD depth = tag->ti_Data; if (depth != -1) SetAttrs(data->depth, no_notify, TRUE, MUIA_Numeric_Value, depth, TAG_DONE); else DoMethod(data->depth, MUIM_Numeric_SetDefault); } break; case MUIA_ScreenModeProperties_Autoscroll: if (id != INVALID_ID && !XGET(data->autoscroll, MUIA_Disabled)) SetAttrs(data->autoscroll, no_notify, TRUE, MUIA_Selected, tag->ti_Data != 0); break; } } return DoSuperMethodA(CLASS, self, (Msg)&noforward_message); }
static ULONG EqualizeItems(struct MenuItem *firstitem, struct MenuItem *lastitem, struct Image *amikeyimage, struct VisualInfo *vi, struct GadToolsBase_intern * GadToolsBase) { struct MenuItem *item; struct TextExtent te; WORD minx = 0, maxwidth = 0, maxrightstuffwidth = 0; if (!firstitem) return 0; /* Calc. the max. width of item text/image (+ checkmark image) Calc. the min. item->LeftEdge */ for(item = firstitem; item && (item != lastitem); item = item->NextItem) { if (item->LeftEdge < minx) minx = item->LeftEdge; if (item->Width > maxwidth) maxwidth = item->Width; } /* Calc. the max. width of AmigaKey/CommandString/">>" */ FontExtent(vi->vi_dri->dri_Font, &te); for(item = firstitem; item && (item != lastitem); item = item->NextItem) { WORD width = 0; if (item->Flags & COMMSEQ) { width = te.te_Width; if (item->Flags & ITEMTEXT) { struct TextFont *font; struct IntuiText *it = (struct IntuiText *)item->ItemFill; if (it->ITextFont) { if ((font = OpenFont(it->ITextFont))) { struct TextExtent e; FontExtent(font, &e); width = e.te_Width; CloseFont(font); } } } width += amikeyimage->Width + AMIGAKEY_KEY_SPACING; } else if (item->Flags & ITEMTEXT) { struct IntuiText *it = (struct IntuiText *)item->ItemFill; struct IntuiText *it2; if ((it2 = it->NextText)) { it2->FrontPen = it->FrontPen; it2->BackPen = it->BackPen; it2->DrawMode = it->DrawMode; it2->TopEdge = it->TopEdge; /* save width also in it->LeftEdge. Will be used below to calc. x position */ width = it2->LeftEdge = MyIntuiTextLength(vi, it2, GadToolsBase); } } if (width > maxrightstuffwidth) maxrightstuffwidth = width; } /* for(item = firstitem; item; item = item->NextItem) */ /* Calc. x coordinate of command strings and ">>"'s and submenu pos. */ if (maxrightstuffwidth) { maxwidth += maxrightstuffwidth + TEXT_AMIGAKEY_SPACING; for(item = firstitem; item && (item != lastitem); item = item->NextItem) { struct MenuItem *subitem; if (item->Flags & ITEMTEXT) { struct IntuiText *it = (struct IntuiText *)item->ItemFill; if ((it = it->NextText)) { /* it->LeftEdge contains the pixel width. see above */ it->LeftEdge = minx + maxwidth - it->LeftEdge - ITEXT_EXTRA_RIGHT; } } for(subitem = item->SubItem; subitem; subitem = subitem->NextItem) { subitem->LeftEdge += (maxwidth - maxrightstuffwidth); } } } /* if (maxrightstuffwidth) */ /* Make all items have the same width and set also the width and the drawinfo of barlabel images */ for(item = firstitem; item && (item != lastitem); item = item->NextItem) { item->Width = maxwidth; if(!(item->Flags & ITEMTEXT)) { struct Image *im = (struct Image *)item->ItemFill; if (is_menubarlabelclass_image(im, GadToolsBase)) { struct TagItem image_tags [] = { {IA_Width , maxwidth - ITEXT_EXTRA_LEFT - ITEXT_EXTRA_RIGHT }, {SYSIA_DrawInfo , (IPTR)vi->vi_dri }, {TAG_DONE } }; SetAttrsA(im, image_tags); } } } return (ULONG)maxwidth; }
int GetConvArgs( FRAME *frame, struct TagItem *tags, struct PPTBase *xd, struct convargs *cargs ) { Object *Win, *wtgroup, *weights[7][7], *Bias, *Frq, *Name, *Div; ULONG sigmask, sig, rc; int quit = FALSE, res = PERR_OK,i,j; struct Window *win; struct IntuitionBase *IntuitionBase = xd->lb_Intuition; struct ExecBase *SysBase = xd->lb_Sys; struct Library *BGUIBase = xd->lb_BGUI; char *name = "Unknown"; #ifdef DEBUG_MODE PDebug("\tCreating window object\n"); #endif Win = WindowObject, WINDOW_Screen, xd->g->maindisp->scr, WINDOW_Title, frame->nd.ln_Name, WINDOW_Font, xd->g->userprefs->mainfont, WINDOW_ScreenTitle, "Convolute Tool", WINDOW_ScaleWidth, 20, WINDOW_MenuStrip, Menus, TAG_SKIP, (cargs->winpos.Height == 0) ? 1 : 0, WINDOW_Bounds, &(cargs->winpos), WINDOW_NoBufferRP, TRUE, WINDOW_MasterGroup, VGroupObject, Spacing(4), HOffset(6), VOffset(4), StartMember, Name = InfoFixed("Name:","",NULL,1), EndMember, StartMember, HGroupObject, Spacing(4), HOffset(4), StartMember, /* Grid */ wtgroup = VGroupObject, StartMember, HGroupObject, StartMember, weights[0][0] = Integer(NULL,0,3,GID_W00), EndMember, StartMember, weights[0][1] = Integer(NULL,0,3,GID_W01), EndMember, StartMember, weights[0][2] = Integer(NULL,0,3,GID_W02), EndMember, StartMember, weights[0][3] = Integer(NULL,0,3,GID_W03), EndMember, StartMember, weights[0][4] = Integer(NULL,0,3,GID_W04), EndMember, StartMember, weights[0][5] = Integer(NULL,0,3,GID_W05), EndMember, StartMember, weights[0][6] = Integer(NULL,0,3,GID_W06), EndMember, EndObject, EndMember, StartMember, HGroupObject, StartMember, weights[1][0] = Integer(NULL,0,3,GID_W10), EndMember, StartMember, weights[1][1] = Integer(NULL,0,3,GID_W11), EndMember, StartMember, weights[1][2] = Integer(NULL,0,3,GID_W12), EndMember, StartMember, weights[1][3] = Integer(NULL,0,3,GID_W13), EndMember, StartMember, weights[1][4] = Integer(NULL,0,3,GID_W14), EndMember, StartMember, weights[1][5] = Integer(NULL,0,3,GID_W15), EndMember, StartMember, weights[1][6] = Integer(NULL,0,3,GID_W16), EndMember, EndObject, EndMember, StartMember, HGroupObject, StartMember, weights[2][0] = Integer(NULL,0,3,GID_W20), EndMember, StartMember, weights[2][1] = Integer(NULL,0,3,GID_W21), EndMember, StartMember, weights[2][2] = Integer(NULL,0,3,GID_W22), EndMember, StartMember, weights[2][3] = Integer(NULL,0,3,GID_W23), EndMember, StartMember, weights[2][4] = Integer(NULL,0,3,GID_W24), EndMember, StartMember, weights[2][5] = Integer(NULL,0,3,GID_W25), EndMember, StartMember, weights[2][6] = Integer(NULL,0,3,GID_W26), EndMember, EndObject, EndMember, StartMember, HGroupObject, StartMember, weights[3][0] = Integer(NULL,0,3,GID_W30), EndMember, StartMember, weights[3][1] = Integer(NULL,0,3,GID_W31), EndMember, StartMember, weights[3][2] = Integer(NULL,0,3,GID_W32), EndMember, StartMember, weights[3][3] = Integer(NULL,1,3,GID_W33), EndMember, StartMember, weights[3][4] = Integer(NULL,0,3,GID_W34), EndMember, StartMember, weights[3][5] = Integer(NULL,0,3,GID_W35), EndMember, StartMember, weights[3][6] = Integer(NULL,0,3,GID_W36), EndMember, EndObject, EndMember, StartMember, HGroupObject, StartMember, weights[4][0] = Integer(NULL,0,3,GID_W40), EndMember, StartMember, weights[4][1] = Integer(NULL,0,3,GID_W41), EndMember, StartMember, weights[4][2] = Integer(NULL,0,3,GID_W42), EndMember, StartMember, weights[4][3] = Integer(NULL,0,3,GID_W43), EndMember, StartMember, weights[4][4] = Integer(NULL,0,3,GID_W44), EndMember, StartMember, weights[4][5] = Integer(NULL,0,3,GID_W45), EndMember, StartMember, weights[4][6] = Integer(NULL,0,3,GID_W46), EndMember, EndObject, EndMember, StartMember, HGroupObject, StartMember, weights[5][0] = Integer(NULL,0,3,GID_W50), EndMember, StartMember, weights[5][1] = Integer(NULL,0,3,GID_W51), EndMember, StartMember, weights[5][2] = Integer(NULL,0,3,GID_W52), EndMember, StartMember, weights[5][3] = Integer(NULL,0,3,GID_W53), EndMember, StartMember, weights[5][4] = Integer(NULL,0,3,GID_W54), EndMember, StartMember, weights[5][5] = Integer(NULL,0,3,GID_W55), EndMember, StartMember, weights[5][6] = Integer(NULL,0,3,GID_W56), EndMember, EndObject, EndMember, StartMember, HGroupObject, StartMember, weights[6][0] = Integer(NULL,0,3,GID_W60), EndMember, StartMember, weights[6][1] = Integer(NULL,0,3,GID_W61), EndMember, StartMember, weights[6][2] = Integer(NULL,0,3,GID_W62), EndMember, StartMember, weights[6][3] = Integer(NULL,0,3,GID_W63), EndMember, StartMember, weights[6][4] = Integer(NULL,0,3,GID_W64), EndMember, StartMember, weights[6][5] = Integer(NULL,0,3,GID_W65), EndMember, StartMember, weights[6][6] = Integer(NULL,0,3,GID_W66), EndMember, EndObject, EndMember, StartMember, HGroupObject, Spacing(4), StartMember, Bias = Integer("Bias:",0,4,GID_BIAS), EndMember, StartMember, Div = Integer("Div:",1,4,GID_DIV), EndMember, EndObject, EndMember, EndObject, Weight(75), EndMember, StartMember, VGroupObject, Spacing(4), StartMember, XenButton("Load",GID_LOAD), EndMember, StartMember, XenButton("Save",GID_SAVE), EndMember, StartMember, XenButton("Clear",GID_CLEAR), EndMember, StartMember, XenButton("Convolute!",GID_OK), EndMember, StartMember, XenButton("Cancel",GID_CANCEL), EndMember, EndObject, Weight(10), EndMember, EndObject, EndMember, EndObject, /* MasterVGroup */ EndObject; /* Window */ if(Win) { #ifdef DEBUG_MODE PDebug("\tSucceeded in creating window\n"); #endif for(i = 0; i < 7; i++) { for(j = 0; j < 7; j++) { SetGadgetAttrs( (struct Gadget *)weights[i][j], NULL, NULL, STRINGA_LongVal, cargs->weights[i][j], TAG_DONE ); } } SetGadgetAttrs( (struct Gadget *)Bias, NULL, NULL, STRINGA_LongVal, cargs->bias, TAG_DONE); SetGadgetAttrs( (struct Gadget *)Div, NULL, NULL, STRINGA_LongVal, cargs->div, TAG_DONE); SetGadgetAttrs( (struct Gadget *)Name, NULL, NULL, INFO_TextFormat, cargs->name, TAG_DONE); if( win = WindowOpen( Win ) ) { #ifdef DEBUG_MODE PDebug("\tOpened window OK\n"); #endif Frq = FileReqObject, ASLFR_Window, win, ASLFR_SleepWindow, TRUE, ASLFR_InitialDrawer, "PROGDIR:modules/convolutions", ASLFR_InitialPattern,"~(#?.info)", EndObject; GetAttr( WINDOW_SigMask, Win, &sigmask ); while(!quit) { sig = Wait(sigmask | SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_F); /* * Break signal */ if( sig & SIGBREAKF_CTRL_C ) { quit = TRUE; res = PERR_BREAK; } if( sig & SIGBREAKF_CTRL_F ) { WindowToFront( win ); ActivateWindow( win ); } /* * Gadget message */ if( sig & sigmask ) { while(( rc = HandleEvent( Win )) != WMHI_NOMORE ) { struct TagItem clrtable[] = { STRINGA_LongVal, 0, TAG_END }; struct TagItem nonametable[] = { INFO_TextFormat, (ULONG)"unnamed", TAG_END }; struct TagItem settable[] = {STRINGA_LongVal, 0, TAG_END }; struct TagItem frqloadtable[] = {ASLFR_DoSaveMode, FALSE, TAG_END }; struct TagItem newnametable[] = {INFO_TextFormat, NULL, TAG_END }; struct TagItem frqsavetable[] = {ASLFR_DoSaveMode, TRUE, TAG_END }; struct TagItem nametable[] = {INFO_TextFormat, NULL, TAG_END }; int id; switch(rc) { case WMHI_CLOSEWINDOW: case GID_CANCEL: res = PERR_CANCELED; quit = TRUE; WindowClose(Win); break; case GID_CLEAR: WindowBusy(Win); clrtable[0].ti_Data = 0; SetGadgetAttrsA( (struct Gadget *)Bias, win, NULL, clrtable); for(i = 0; i < 7; i++) { for(j = 0; j < 7; j++) { SetGadgetAttrsA( (struct Gadget *)weights[i][j], win, NULL, clrtable ); cargs->weights[i][j] = 0; } } clrtable[0].ti_Data = 1; /* For Divisor & Middle value. */ SetGadgetAttrsA( (struct Gadget *)weights[3][3], win, NULL, clrtable ); cargs->weights[3][3] = 1; clrtable[0].ti_Data = 1; /* For Divisor */ SetGadgetAttrsA( (struct Gadget *)Div, win, NULL, clrtable); SetGadgetAttrsA( (struct Gadget *) Name, win, NULL, nonametable); WindowReady(Win); break; case GID_LOAD: SetAttrsA( Frq, frqloadtable ); if(DoRequest( Frq ) == FRQ_OK) { GetAttr( FRQ_Path, Frq, (ULONG *)&name ); WindowBusy(Win); if(LoadConvFilter( xd, name, cargs ) == PERR_OK ) { for(i = 0; i < 7; i++) { for(j = 0; j < 7; j++) { settable[0].ti_Data = cargs->weights[i][j]; SetGadgetAttrsA( (struct Gadget *)weights[i][j], win, NULL, settable ); } } settable[0].ti_Data = cargs->bias; SetGadgetAttrsA( (struct Gadget *)Bias, win, NULL, settable); settable[0].ti_Data = cargs->div; SetGadgetAttrsA( (struct Gadget *)Div, win, NULL, settable); GetAttr( FRQ_File, Frq, (ULONG *) &newnametable[0].ti_Data ); SetGadgetAttrsA( (struct Gadget *) Name, win, NULL, newnametable); } WindowReady(Win); } break; case GID_SAVE: SetAttrsA( Frq, frqsavetable ); if(DoRequest(Frq) == FRQ_OK) { WindowBusy(Win); GetAttr( FRQ_Path, Frq, (ULONG *)&name ); for(i = 0; i < 7; i++) { for(j = 0; j < 7; j++) { GetAttr( STRINGA_LongVal, weights[i][j], (ULONG *) &(cargs->weights[i][j]) ); } } GetAttr( STRINGA_LongVal, Bias, (ULONG *) &(cargs->bias)); GetAttr( STRINGA_LongVal, Div, (ULONG *) &(cargs->div)); SaveConvFilter( xd, name, cargs ); GetAttr( FRQ_File, Frq, &nametable[0].ti_Data ); SetGadgetAttrsA( (struct Gadget *) Name, win, NULL, nametable); WindowReady(Win); } break; case GID_OK: GetAttr( STRINGA_LongVal, Bias, (ULONG *) &(cargs->bias)); GetAttr( STRINGA_LongVal, Div, (ULONG *) &(cargs->div)); GetAttr( WINDOW_Bounds, Win, (ULONG *) &(cargs->winpos) ); if( cargs->div != 0 ) { WindowClose(Win); for(i = 0; i < 7; i++) { for(j = 0; j < 7; j++) { GetAttr( STRINGA_LongVal, weights[i][j], (ULONG *) &(cargs->weights[i][j]) ); } } GetAttr( STRINGA_LongVal, Bias, (ULONG *) &(cargs->bias)); GetAttr( STRINGA_LongVal, Div, (ULONG *) &(cargs->div)); strncpy( cargs->name, name, 40 ); res = PERR_OK; quit = TRUE; } break; default: if(rc >= OPR(0) && rc <= OPR(1000)) { /* It's a default opr */ WindowBusy(Win); for(id = 0; presets[id].id != rc && presets[id].id != 0L; id++); /* Fetch correct area. */ if(presets[id].id) { for(i = 0; i < 7; i++) { for(j = 0; j < 7; j++) { settable[0].ti_Data = cargs->weights[i][j] = presets[id].weights[i][j]; SetGadgetAttrsA( (struct Gadget *)weights[i][j], win, NULL, settable ); } } settable[0].ti_Data = cargs->bias = presets[id].bias; SetGadgetAttrsA( (struct Gadget *)Bias, win, NULL, settable); settable[0].ti_Data = cargs->div = presets[id].div; SetGadgetAttrsA( (struct Gadget *)Div, win, NULL, settable); newnametable[0].ti_Data = name = (ULONG)presets[id].name; SetGadgetAttrsA( (struct Gadget *)Name, win, NULL, newnametable); } #ifdef DEBUG_MODE else { PDebug("Serious software error!!!\n"); } #endif WindowReady(Win); } break; } /* switch */ } /* while */ } /* sig & sigmask */ } /* while(!quit) */ DisposeObject(Win); DisposeObject(Frq); } else { #ifdef DEBUG_MODE PDebug("\tFailed to get window\n"); #endif DisposeObject(Win); return PERR_WONTOPEN; } } else { #ifdef DEBUG_MODE PDebug("\tFailed to get window object\n"); #endif return PERR_WONTOPEN; } return res; }
IPTR AslProp__GM_RENDER(Class *cl, struct Gadget *g, struct gpRender *msg) { struct AslPropData *data; IPTR retval; data = INST_DATA(cl, g); if (msg->gpr_Redraw == GREDRAW_REDRAW) { struct TagItem im_tags[] = { {IA_Width , 0 }, {IA_Height , 0 }, {TAG_DONE } }; WORD x, y, w, h; getgadgetcoords(g, msg->gpr_GInfo, &x, &y, &w, &h); x -= BORDERPROPSPACINGX; y -= BORDERPROPSPACINGY; w += BORDERPROPSPACINGX * 2; h += BORDERPROPSPACINGY * 2; im_tags[0].ti_Data = w; im_tags[1].ti_Data = h; SetAttrsA(data->frame, im_tags); DrawImageState(msg->gpr_RPort, (struct Image *)data->frame, x, y, IDS_NORMAL, msg->gpr_GInfo->gi_DrInfo); #if AVOID_FLICKER { struct IBox ibox, fbox; fbox.Left = x; fbox.Top = y; fbox.Width = w; fbox.Height = h; ibox.Left = x + BORDERPROPSPACINGX; ibox.Top = y + BORDERPROPSPACINGY; ibox.Width = w - BORDERPROPSPACINGX * 2; ibox.Height = h - BORDERPROPSPACINGY * 2; PaintInnerFrame(msg->gpr_RPort, msg->gpr_GInfo->gi_DrInfo, data->frame, &fbox, &ibox, msg->gpr_GInfo->gi_DrInfo->dri_Pens[BACKGROUNDPEN], AslBase); } #endif } /* if (msg->gpr_Redraw == GREDRAW_REDRAW) */ retval = DoSuperMethodA(cl, (Object *)g, (Msg)msg); return retval; }
ULONG SetAttrs( APTR object, ULONG tag1, ... ) { return SetAttrsA(object, (struct TagItem *)&tag1); }
STATIC IPTR scroller_set(Class * cl, Object * o, struct opSet * msg) { IPTR retval = 0UL; struct TagItem *tag, tags[] = { {PGA_Total , 0 }, {PGA_Top , 0 }, {PGA_Visible , 0 }, {TAG_MORE } }; const struct TagItem *tstate = msg->ops_AttrList; struct ScrollerData *data = INST_DATA(cl, o); D(bug("scroller_set(cl 0x%lx o 0x%lx msg 0x%lx)\n",cl,o,msg)); tags[3].ti_Data = (IPTR)msg->ops_AttrList; /* Get old values */ DoSuperMethod(cl, o, OM_GET, PGA_Total, (IPTR) &(tags[0].ti_Data)); DoSuperMethod(cl, o, OM_GET, PGA_Top, (IPTR) &(tags[1].ti_Data)); DoSuperMethod(cl, o, OM_GET, PGA_Visible, (IPTR) &(tags[2].ti_Data)); D(bug("scroller_set: Old Total %ld Top %ld Visible %ld\n", tags[0].ti_Data, tags[1].ti_Data, tags[2].ti_Data)); while ((tag = NextTagItem(&tstate))) { switch (tag->ti_Tag) { case GTA_GadgetKind: data->gadgetkind = tag->ti_Data; break; case GTSC_Total: D(bug("scroller_set: GTSC_Total %ld\n",tag->ti_Data)); tags[0].ti_Data = tag->ti_Data; break; case GTSC_Top: D(bug("scroller_set: GTSC_Top %ld\n",tag->ti_Data)); tags[1].ti_Data = tag->ti_Data; break; case GTSC_Visible: D(bug("scroller_set: GTSC_Visible %ld\n",tag->ti_Data)); tags[2].ti_Data = tag->ti_Data; break; case GTA_Scroller_Dec: if (tags[1].ti_Data > 0) { tags[1].ti_Data --; retval = 1UL; } break; case GTA_Scroller_Inc: /* Top < (Total - Visible) ? */ if (tags[1].ti_Data < (tags[0].ti_Data - tags[2].ti_Data)) { tags[1].ti_Data ++; retval = 1UL; } break; case GTA_Scroller_Arrow1: data->arrow1 = (struct Gadget *)tag->ti_Data; break; case GTA_Scroller_Arrow2: data->arrow2 = (struct Gadget *)tag->ti_Data; break; case GA_Disabled: { struct TagItem set_tags[] = { {GA_Disabled , tag->ti_Data }, {TAG_DONE } }; if (data->arrow1) { if (msg->ops_GInfo) { SetGadgetAttrsA(data->arrow1, msg->ops_GInfo->gi_Window, 0, set_tags); } else { SetAttrsA((Object *)data->arrow1, set_tags); } } if (data->arrow2) { if (msg->ops_GInfo) { SetGadgetAttrsA(data->arrow2, msg->ops_GInfo->gi_Window, 0, set_tags); } else { SetAttrsA((Object *)data->arrow2, set_tags); } } } break; } /* switch (tag->ti_Tag) */ } /* while ((tag = NextTagItem(&tstate))) */ DoSuperMethod(cl, o, OM_SET, (IPTR) tags, (IPTR) msg->ops_GInfo); return (retval); }