BOOL fire_message(struct Window *w,ULONG Class, UWORD Code, APTR IAddress, struct IntuitionBase *IntuitionBase) { struct ExtIntuiMessage *imsg; BOOL result = FALSE; if ((w->IDCMPFlags & Class) && (w->UserPort)) { if ((imsg = (struct ExtIntuiMessage *)alloc_intuimessage(w, IntuitionBase))) { struct IIHData *iihdata = (struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data; imsg->eim_IntuiMessage.Class = Class; imsg->eim_IntuiMessage.Code = Code; imsg->eim_IntuiMessage.Qualifier = iihdata->ActQualifier; if (Class == IDCMP_RAWKEY) { INT_INTUIMESSAGE(imsg)->prevCodeQuals = IAddress; imsg->eim_IntuiMessage.IAddress = &INT_INTUIMESSAGE(imsg)->prevCodeQuals; } else { imsg->eim_IntuiMessage.IAddress = IAddress; } if (iihdata->ActEventTablet && (w->MoreFlags & WMFLG_TABLETMESSAGES)) { if ((imsg->eim_TabletData = AllocPooled(GetPrivIBase(IntuitionBase)->IDCMPPool,sizeof (struct TabletData)))) { memclr(imsg->eim_TabletData,sizeof (struct TabletData)); imsg->eim_TabletData->td_XFraction = iihdata->ActEventTablet->ient_ScaledXFraction; imsg->eim_TabletData->td_YFraction = iihdata->ActEventTablet->ient_ScaledYFraction; imsg->eim_TabletData->td_TabletX = iihdata->ActEventTablet->ient_TabletX; imsg->eim_TabletData->td_TabletY = iihdata->ActEventTablet->ient_TabletY; imsg->eim_TabletData->td_RangeX = iihdata->ActEventTablet->ient_RangeX; imsg->eim_TabletData->td_RangeY = iihdata->ActEventTablet->ient_RangeY; imsg->eim_TabletData->td_TagList = CloneTagItems(iihdata->ActEventTablet->ient_TagList); } } send_intuimessage(imsg, w, IntuitionBase); result = TRUE; } else { DEBUG_FIREINTUIMSG(dprintf("fire_intuimessage: can't alloc imsg\n")); } } else { DEBUG_FIREINTUIMSG(dprintf("fire_intuimessage: no Userport or masked out idcmpflags\n")); } return result; }
IPTR ModelClass__OM_UPDATE(Class *cl, Object *o, struct opUpdate *msg) { struct ModelData *data = (struct ModelData *)INST_DATA(cl, o); /* send OM_UPDATE to all members without mapping the tags! */ if (!IsListEmpty((struct List *)&data->memberlist)) { STACKULONG method = ICM_CHECKLOOP; if (DoMethodA(o, (Msg)&method) == 0) /* avoid loops */ { struct TagItem *clonetags; if ((clonetags = CloneTagItems(msg->opu_AttrList))) { struct opUpdate opu = *msg; Object *member, *objstate; opu.MethodID = OM_UPDATE; /* not OM_NOTIFY! */ opu.opu_AttrList = clonetags; method = ICM_SETLOOP; DoMethodA(o, (Msg)&method); objstate = (Object *)data->memberlist.mlh_Head; while((member = NextObject(&objstate))) { DoMethodA(member, (Msg)&opu); /* in case the member object poked around in the taglist: */ RefreshTagItemClones(clonetags, msg->opu_AttrList); } method = ICM_CLEARLOOP; DoMethodA(o, (Msg)&method); FreeTagItems(clonetags); } } /* if (DoMethod(o, ICM_CHECKLOOP) == 0) */ } /* if (!IsListEmpty(&data->memberlist)) */ /* modelclass is a superclass of icclass so not only the members are targets, * but possibly also the modelclass object itself could have an ICA_Target. * This is handled by the superclass */ return DoSuperMethodA(cl, o, (Msg)msg); }
static Object *bitmap_new(Class *cl, Object *obj, struct pRoot_New *msg) { struct TagItem tags[] = { {aHidd_BitMap_AllocBuffer, FALSE }, {TAG_MORE , (IPTR) NULL} }; struct HIDDBitMapAmigaIntuiData *data; struct TagItem *tag, *tstate, *newTagList; BOOL ok = FALSE; struct pRoot_New new_msg; struct pHidd_BitMap_PrivateSet private_set_msg; ULONG width, height, depth, format; BOOL displayable; EnterFunc(bug("BitMapAmigaIntui::New()\n")); new_msg.mID = GetMethodID(IID_Root, moRoot_New); private_set_msg.mID = GetMethodID(IID_Hidd_BitMap, moHidd_BitMap_PrivateSet); displayable = (BOOL) GetTagData(aHidd_BitMap_Displayable, 0, msg->attrList); if(!displayable) { /* let the superclass do all work */ obj = (Object *) DoSuperMethod(cl, obj, (Msg) msg); if(obj) ok = TRUE; } else { /* aHidd_BitMap_AllocBuffer and aHidd_BitMap_Displayable must be FALSE. To make this easy first a copy of the taglist is created. In the new list Hidd_BitMap_Displayable is set to FALSE. If the taglist contains a "aHidd_BitMap_AllocBuffer" tag then ti_Data is set to FALSE else tags(see above) is connected with the new list. NOTE: If msg.attrList contains more than one "aHidd_BitMap_AllocBuffer" we have a problem. */ newTagList = CloneTagItems(msg->attrList); if(newTagList) { tag = FindTagItem(aHidd_BitMap_Displayable, newTagList); if(tag) { tag->ti_Data = FALSE; } tag = FindTagItem(aHidd_BitMap_AllocBuffer, newTagList); if(tag) { tag->ti_Data = FALSE; new_msg.attrList = newTagList; } else { tags[1].ti_Data = (IPTR) newTagList; new_msg.attrList = tags; } obj = (Object *) DoSuperMethod(cl, obj, (Msg) &new_msg); FreeTagItems(newTagList); } if(obj) { data = INST_DATA(cl, obj); /* clear all data and set some default values */ memset(data, 0, sizeof(struct HIDDBitMapAmigaIntuiData)); GetAttr(obj, aHidd_BitMap_Width, &width); GetAttr(obj, aHidd_BitMap_Height, &height); GetAttr(obj, aHidd_BitMap_Depth, &depth); GetAttr(obj, aHidd_BitMap_Format, &format); if(format == vHIDD_BitMap_Format_Planar) { /* only displayable support for planar format */ struct TagItem tags[] = { {SA_Left , 0}, {SA_Top , 0}, {SA_Width , width}, {SA_Height , height}, {SA_Depth , depth}, {TAG_SKIP , 1}, /* Use SA_DisplayID only wenn a display mode */ {SA_DisplayID, 0}, /* is specified */ {SA_Title , (ULONG) "AROS graphics hidd"}, {SA_Type , CUSTOMSCREEN}, /* Will be use later */ /* SA_Quiet , TRUE, */ /* SA_BitMap , 0 On V37 double buffering could only implemented with a custom bitmap */ {TAG_DONE, 0} }; data->screen = OpenScreenTagList(NULL, tags); if(data->screen) { struct TagItem set[] = { {aHidd_BitMap_BaseAddress, (IPTR) &data->screen->RastPort.BitMap->Planes[0]}, {aHidd_BitMap_Format , vHIDD_BitMap_Format_Planar}, {aHidd_BitMap_Displayable, TRUE }, {aHidd_BitMap_BytesPerRow, data->screen->RastPort.BitMap->BytesPerRow}, {TAG_END , 0 } }; private_set_msg.attrList = set; DoSuperMethod(cl, obj, (Msg) &private_set_msg); ok = TRUE; } /* if(data->screen) */ } /* if(format == vHIDD_BitMap_Format_Planar) */ } /* if(obj) */ } /* if(!displayable) */ /* free all on error */ if(ok == FALSE) { if(obj) DisposeObject(obj); obj = NULL; } ReturnPtr("BitMapAmigaIntui::New", Object *, obj); }