oops .. forgot to offset from objects bounds
[AROS.git] / rom / intuition / donotify.c
blob51856bdf30f1a59c8000443402a7800088f7f278
1 /*
2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 Copyright © 2001-2003, The MorphOS Development Team. All Rights Reserved.
4 $Id$
6 ICClass notification support routines.
7 */
9 #include <exec/types.h>
10 #include <exec/memory.h>
11 #include <intuition/classes.h>
12 #include <intuition/cghooks.h>
13 #include <intuition/icclass.h>
14 #include <proto/exec.h>
15 #include <proto/utility.h>
16 #include <proto/intuition.h>
18 #include "intuition_intern.h"
20 #define DEBUG_NOTIFY(x) ;
23 Note: This file is essentially the contents of the file
24 rom/intuition/notify.c which contained code used by the icclass
25 and gadgetclass in caldi's first implementation. It was split
26 by iaint for the new boopsi.library.
31 This will hopefully allow us to send an IDCMP message from a boopsi
32 gadget method.
35 static struct IntuiMessage *SendIDCMPUpdate(Class *cl, Object *o, struct opUpdate *msg,
36 ULONG class, UWORD code, APTR IAddress,
37 struct IntuitionBase *IntuitionBase)
39 struct IntuiMessage *imsg;
41 DEBUG_NOTIFY(dprintf("SendIDCMPUpdate:\n"));
43 imsg = AllocIntuiMessage(msg->opu_GInfo->gi_Window);
45 if( imsg )
47 imsg->Class = class;
48 imsg->Code = code;
49 imsg->Qualifier = (msg->opu_Flags & OPUF_INTERIM) ? IEQUALIFIER_REPEAT : 0; //tells SendIntuiMessage if the message is OK to be dropped
50 imsg->IAddress = IAddress;
51 imsg->MouseX = msg->opu_GInfo->gi_Window->MouseX;
52 imsg->MouseY = msg->opu_GInfo->gi_Window->MouseY;
53 imsg->Seconds = IntuitionBase->Seconds;
54 imsg->Micros = IntuitionBase->Micros;
56 /* done by AllocIntuiMessage
57 imsg->IDCMPWindow = msg->opu_GInfo->gi_Window;
60 SendIntuiMessage(msg->opu_GInfo->gi_Window , imsg);
64 return imsg;
67 /*****i***********************************************************************
69 NAME */
71 AROS_LH4(IPTR, DoNotify,
73 /* SYNOPSIS */
74 AROS_LHA(Class *, cl, A0),
75 AROS_LHA(Object *, o, A1),
76 AROS_LHA(struct ICData *, ic, A2),
77 AROS_LHA(struct opUpdate *, msg, A3),
79 /* LOCATION */
80 struct IntuitionBase *, IntuitionBase, 145, Intuition)
82 /* FUNCTION
83 This function provides a way for icclass objects to notify
84 their listeners when they are notifying. It is mainly
85 provided as an external function for intuition.library's
86 gadgetclass implementation, which contains an inbuilt
87 icclass.
89 INPUTS
90 cl - my class
91 o - this object
92 icdata - interconnection information
93 msg - the message given to the OM_NOTIFY method
95 RESULT
96 The objects listening to this object will be notified.
98 Note: Return value not clear.
100 NOTES
101 This function is also present in MorphOS v50, however
102 considered private.
104 EXAMPLE
106 BUGS
108 SEE ALSO
110 INTERNALS
112 ******************************************************************************/
114 AROS_LIBFUNC_INIT
116 struct Library *UtilityBase = GetPrivIBase(IntuitionBase)->UtilityBase;
118 DEBUG_NOTIFY(dprintf("DoNotify: cl 0x%lx o 0x%lx ICData 0x%lx opUpdate 0x%lx\n",cl,o,ic,msg));
120 SANITY_CHECKR(o,1UL)
121 SANITY_CHECKR(cl,1UL)
122 SANITY_CHECKR(msg,1UL)
123 SANITY_CHECKR(ic,1UL)
125 if( ic->ic_Target != NULL )
127 if( msg->opu_AttrList) /* stegerg: ??? checked also "&& msg->opu_GInfo" ) */
129 ic->ic_LoopCounter += 1UL;
131 DEBUG_NOTIFY(dprintf("DoNotify: Loop counter %ld\n",ic->ic_LoopCounter));
132 /* Don't get into a circular notify target loop */
133 if( ic->ic_LoopCounter == 1UL )
135 if(( ic->ic_CloneTags = CloneTagItems(msg->opu_AttrList)))
137 DEBUG_NOTIFY(dprintf("DoNotify: CloneTags 0x%lx\n",ic->ic_CloneTags));
138 if( ic->ic_Mapping != NULL )
140 MapTags(ic->ic_CloneTags, ic->ic_Mapping, MAP_KEEP_NOT_FOUND);
143 if( ic->ic_Target != (Object *)ICTARGET_IDCMP)
145 struct opUpdate opu;
147 opu.MethodID = OM_UPDATE;
148 opu.opu_AttrList = ic->ic_CloneTags;
149 opu.opu_GInfo = msg->opu_GInfo;
150 opu.opu_Flags = msg->opu_Flags;
152 DEBUG_NOTIFY(dprintf("DoNotify: Send OM_UPDATA to 0x%lx\n",ic->ic_Target));
153 DoMethodA( ic->ic_Target, (Msg)&opu );
155 else
157 if (msg->opu_GInfo)
159 struct Window *win;
161 if ((win = msg->opu_GInfo->gi_Window))
163 if (win->UserPort)
165 if (win->IDCMPFlags & IDCMP_IDCMPUPDATE)
167 struct TagItem *ti;
168 UWORD code = 0;
170 if ((ti = FindTagItem(ICSPECIAL_CODE, ic->ic_CloneTags)))
172 code = ti->ti_Data & 0xFFFF;
175 #if !USE_IDCMPUPDATE_MESSAGECACHE
176 if (!(msg->opu_Flags & OPUF_INTERIM) ||
177 (IW(win)->num_repeatevents < IW(win)->repeatqueue))
179 #endif
181 SendIDCMPUpdate( cl, o, msg, IDCMP_IDCMPUPDATE,
182 code, ic->ic_CloneTags, IntuitionBase );
184 /* in this case the cloned tagitems will be freed in the Intuition
185 InputHandler when the app has replied the IntuiMessage */
187 ic->ic_CloneTags = NULL;
189 #if !USE_IDCMPUPDATE_MESSAGECACHE
191 #endif
199 FreeTagItems(ic->ic_CloneTags);
201 ic->ic_CloneTags = NULL;
203 } /* CloneTagItems() */
205 } /* LoopCounter == 1UL */
206 else
208 DEBUG_NOTIFY(dprintf("DoNotify: skip..circular\n"));
211 ic->ic_LoopCounter -= 1UL;
213 } /* valid parameters */
214 else
216 DEBUG_NOTIFY(dprintf("DoNotify: no AttrList\n"));
218 } /* valid target */
219 else
221 DEBUG_NOTIFY(dprintf("DoNotify: No Target\n"));
223 return 1UL;
225 AROS_LIBFUNC_EXIT
226 } /* DoNotify() */