Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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);
}