picture.datatype: gi_RastPort should not be directly accessed
[AROS.git] / rom / intuition / donotify.c
blobd255d787a2bc7e4e799c65538867c0a605202372
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
102 EXAMPLE
104 BUGS
106 SEE ALSO
108 INTERNALS
110 ******************************************************************************/
112 AROS_LIBFUNC_INIT
114 struct Library *UtilityBase = GetPrivIBase(IntuitionBase)->UtilityBase;
116 DEBUG_NOTIFY(dprintf("DoNotify: cl 0x%lx o 0x%lx ICData 0x%lx opUpdate 0x%lx\n",cl,o,ic,msg));
118 SANITY_CHECKR(o,1UL)
119 SANITY_CHECKR(cl,1UL)
120 SANITY_CHECKR(msg,1UL)
121 SANITY_CHECKR(ic,1UL)
123 if( ic->ic_Target != NULL )
125 if( msg->opu_AttrList) /* stegerg: ??? checked also "&& msg->opu_GInfo" ) */
127 ic->ic_LoopCounter += 1UL;
129 DEBUG_NOTIFY(dprintf("DoNotify: Loop counter %ld\n",ic->ic_LoopCounter));
130 /* Don't get into a circular notify target loop */
131 if( ic->ic_LoopCounter == 1UL )
133 if(( ic->ic_CloneTags = CloneTagItems(msg->opu_AttrList)))
135 DEBUG_NOTIFY(dprintf("DoNotify: CloneTags 0x%lx\n",ic->ic_CloneTags));
136 if( ic->ic_Mapping != NULL )
138 MapTags(ic->ic_CloneTags, ic->ic_Mapping, MAP_KEEP_NOT_FOUND);
141 if( ic->ic_Target != (Object *)ICTARGET_IDCMP)
143 struct opUpdate opu;
145 opu.MethodID = OM_UPDATE;
146 opu.opu_AttrList = ic->ic_CloneTags;
147 opu.opu_GInfo = msg->opu_GInfo;
148 opu.opu_Flags = msg->opu_Flags;
150 DEBUG_NOTIFY(dprintf("DoNotify: Send OM_UPDATA to 0x%lx\n",ic->ic_Target));
151 DoMethodA( ic->ic_Target, (Msg)&opu );
153 else
155 if (msg->opu_GInfo)
157 struct Window *win;
159 if ((win = msg->opu_GInfo->gi_Window))
161 if (win->UserPort)
163 if (win->IDCMPFlags & IDCMP_IDCMPUPDATE)
165 struct TagItem *ti;
166 UWORD code = 0;
168 if ((ti = FindTagItem(ICSPECIAL_CODE, ic->ic_CloneTags)))
170 code = ti->ti_Data & 0xFFFF;
173 #if !USE_IDCMPUPDATE_MESSAGECACHE
174 if (!(msg->opu_Flags & OPUF_INTERIM) ||
175 (IW(win)->num_repeatevents < IW(win)->repeatqueue))
177 #endif
179 SendIDCMPUpdate( cl, o, msg, IDCMP_IDCMPUPDATE,
180 code, ic->ic_CloneTags, IntuitionBase );
182 /* in this case the cloned tagitems will be freed in the Intuition
183 InputHandler when the app has replied the IntuiMessage */
185 ic->ic_CloneTags = NULL;
187 #if !USE_IDCMPUPDATE_MESSAGECACHE
189 #endif
197 FreeTagItems(ic->ic_CloneTags);
199 ic->ic_CloneTags = NULL;
201 } /* CloneTagItems() */
203 } /* LoopCounter == 1UL */
204 else
206 DEBUG_NOTIFY(dprintf("DoNotify: skip..circular\n"));
209 ic->ic_LoopCounter -= 1UL;
211 } /* valid parameters */
212 else
214 DEBUG_NOTIFY(dprintf("DoNotify: no AttrList\n"));
216 } /* valid target */
217 else
219 DEBUG_NOTIFY(dprintf("DoNotify: No Target\n"));
221 return 1UL;
223 AROS_LIBFUNC_EXIT
224 } /* DoNotify() */