2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3 Copyright © 2001-2003, The MorphOS Development Team. All Rights Reserved.
6 ICClass notification support routines.
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
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
);
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
);
67 /*****i***********************************************************************
71 AROS_LH4(IPTR
, DoNotify
,
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
),
80 struct IntuitionBase
*, IntuitionBase
, 145, Intuition
)
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
92 icdata - interconnection information
93 msg - the message given to the OM_NOTIFY method
96 The objects listening to this object will be notified.
98 Note: Return value not clear.
110 ******************************************************************************/
114 DEBUG_NOTIFY(dprintf("DoNotify: cl 0x%lx o 0x%lx ICData 0x%lx opUpdate 0x%lx\n",cl
,o
,ic
,msg
));
117 SANITY_CHECKR(cl
,1UL)
118 SANITY_CHECKR(msg
,1UL)
119 SANITY_CHECKR(ic
,1UL)
121 if( ic
->ic_Target
!= NULL
)
123 if( msg
->opu_AttrList
) /* stegerg: ??? checked also "&& msg->opu_GInfo" ) */
125 ic
->ic_LoopCounter
+= 1UL;
127 DEBUG_NOTIFY(dprintf("DoNotify: Loop counter %ld\n",ic
->ic_LoopCounter
));
128 /* Don't get into a circular notify target loop */
129 if( ic
->ic_LoopCounter
== 1UL )
131 if(( ic
->ic_CloneTags
= CloneTagItems(msg
->opu_AttrList
)))
133 DEBUG_NOTIFY(dprintf("DoNotify: CloneTags 0x%lx\n",ic
->ic_CloneTags
));
134 if( ic
->ic_Mapping
!= NULL
)
136 MapTags(ic
->ic_CloneTags
, ic
->ic_Mapping
, MAP_KEEP_NOT_FOUND
);
139 if( ic
->ic_Target
!= (Object
*)ICTARGET_IDCMP
)
143 opu
.MethodID
= OM_UPDATE
;
144 opu
.opu_AttrList
= ic
->ic_CloneTags
;
145 opu
.opu_GInfo
= msg
->opu_GInfo
;
146 opu
.opu_Flags
= msg
->opu_Flags
;
148 DEBUG_NOTIFY(dprintf("DoNotify: Send OM_UPDATA to 0x%lx\n",ic
->ic_Target
));
149 DoMethodA( ic
->ic_Target
, (Msg
)&opu
);
157 if ((win
= msg
->opu_GInfo
->gi_Window
))
161 if (win
->IDCMPFlags
& IDCMP_IDCMPUPDATE
)
166 if ((ti
= FindTagItem(ICSPECIAL_CODE
, ic
->ic_CloneTags
)))
168 code
= ti
->ti_Data
& 0xFFFF;
171 #if !USE_IDCMPUPDATE_MESSAGECACHE
172 if (!(msg
->opu_Flags
& OPUF_INTERIM
) ||
173 (IW(win
)->num_repeatevents
< IW(win
)->repeatqueue
))
177 SendIDCMPUpdate( cl
, o
, msg
, IDCMP_IDCMPUPDATE
,
178 code
, ic
->ic_CloneTags
, IntuitionBase
);
180 /* in this case the cloned tagitems will be freed in the Intuition
181 InputHandler when the app has replied the IntuiMessage */
183 ic
->ic_CloneTags
= NULL
;
185 #if !USE_IDCMPUPDATE_MESSAGECACHE
195 FreeTagItems(ic
->ic_CloneTags
);
197 ic
->ic_CloneTags
= NULL
;
199 } /* CloneTagItems() */
201 } /* LoopCounter == 1UL */
204 DEBUG_NOTIFY(dprintf("DoNotify: skip..circular\n"));
207 ic
->ic_LoopCounter
-= 1UL;
209 } /* valid parameters */
212 DEBUG_NOTIFY(dprintf("DoNotify: no AttrList\n"));
217 DEBUG_NOTIFY(dprintf("DoNotify: No Target\n"));