Updated Sourceforge username and host.
[tangerine.git] / rom / intuition / sendintuimessage.c
blob3c45da676592749c9c6ec376df5468977c199693
1 /*
2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3 Copyright © 2001-2003, The MorphOS Development Team. All Rights Reserved.
4 $Id$
5 */
7 #include <proto/timer.h>
8 #include "intuition_intern.h"
10 #define DEBUG_SENDINTUIMESSAGE(x) ;
11 /*****************************************************************************
13 NAME */
14 #include <proto/intuition.h>
16 AROS_LH2(void, SendIntuiMessage,
18 /* SYNOPSIS */
19 AROS_LHA(struct Window *, window, A0),
20 AROS_LHA(struct IntuiMessage *, imsg, A1),
22 /* LOCATION */
23 struct IntuitionBase *, IntuitionBase, 151, Intuition)
25 /* FUNCTION
26 Private: send an IntuiMessage to an Intuition window
28 INPUTS
29 window - The window to which the IntuiMessage shall be sent
30 imsg - The IntuiMessage to send, which must have been allocated with
31 AllocIntuiMessage.
33 RESULT
34 none
36 NOTES
37 The caller of this function should first check himself
38 whether window->UserPort is NULL. And in this case do not
39 call this function at all.
41 If inside this function the window->UserPort turns out to
42 be NULL, then what happens is, that the IntuiMessage is
43 immediately ReplyMessage()ed in here, just like if this was
44 done by the app whose window was supposed to get the
45 IntuiMessage.
47 The protection with Forbid() is necessary, because of the
48 way shared window userports are handled, when one of this
49 windows is closed, where there is also just a protection with
50 Forbid() when stripping those IntuiMessages from the port
51 which belong to the window which is going to be closed.
53 This function does not check whether the window to which
54 the IntuiMessage is supposed to be sent, really wants to
55 get the IDCMP in question, that is, whether the corresponding
56 flag in window->IDCMPFLags is set.
59 EXAMPLE
61 BUGS
63 SEE ALSO
65 INTERNALS
67 *****************************************************************************/
69 AROS_LIBFUNC_INIT
71 ASSERT_VALID_PTR(window);
72 ASSERT_VALID_PTR(imsg);
74 DEBUG_SENDINTUIMESSAGE(dprintf("SendIntuiMessage: Window 0x%lx Port 0x%lx Msg 0x%lx\n",
75 window, window->UserPort, imsg));
77 SANITY_CHECK(window)
78 SANITY_CHECK(imsg)
80 Forbid();
82 #ifdef __MORPHOS__
83 if (window->UserPort)
85 struct Task *apptask = window->UserPort->mp_SigTask;
87 if (apptask && (!apptask->tc_SigWait) && (apptask->tc_State == TS_WAIT))
89 //task is DEAD!
90 imsg->IDCMPWindow = 0;
91 imsg->Code = 0;
92 imsg->Qualifier = 0;
93 ReplyMsg(&imsg->ExecMessage);
95 if (IW(window)->messagecache)
97 IW(window)->messagecache->IDCMPWindow = 0;
98 IW(window)->messagecache->Code = 0;
99 IW(window)->messagecache->Qualifier = 0;
100 ReplyMsg(&IW(window)->messagecache->ExecMessage);
101 IW(window)->messagecache = 0;
103 Permit();
105 //give some visual feedback to the user
106 IW(window)->specialflags |= SPFLAG_IAMDEAD;
108 int_refreshwindowframe(window,REFRESHGAD_TOPBORDER,0,IntuitionBase);
110 return;
112 else
114 IW(window)->specialflags &= ~SPFLAG_IAMDEAD;
117 #endif
119 if (imsg->Qualifier & IEQUALIFIER_REPEAT)
121 IW(window)->num_repeatevents++;
124 #if USE_IDCMPUPDATE_MESSAGECACHE
125 if (imsg->Class == IDCMP_IDCMPUPDATE)
127 if (IW(window)->num_idcmpupdate && !IW(window)->messagecache)
129 kprintf("======= setting messagecache\n");
130 IW(window)->messagecache = imsg;
131 Permit();
132 return;
135 //reduce number of messages if possible (prop updates only!)
136 if (IW(window)->num_idcmpupdate && IW(window)->messagecache)
138 if (imsg->Code == IW(window)->messagecache->Code && imsg->Qualifier == IEQUALIFIER_REPEAT)
140 IW(window)->messagecache->MouseX = imsg->MouseX;
141 IW(window)->messagecache->MouseY = imsg->MouseY;
142 IW(window)->messagecache->Seconds = imsg->Seconds;
143 IW(window)->messagecache->Micros = imsg->Micros;
144 imsg->IDCMPWindow = 0;
145 imsg->Code = 0;
146 imsg->Qualifier = 0;
147 ReplyMsg(&imsg->ExecMessage);
148 Permit();
149 return;
153 IW(window)->num_idcmpupdate++;
155 #endif
157 Forbid();
158 GetSysTime(&((struct IntWindow *)(window))->lastmsgsent);
159 Permit();
161 if (window->UserPort)
163 if (imsg->Class == IDCMP_INTUITICKS)
165 window->Flags |= WFLG_WINDOWTICKED;
167 DEBUG_SENDINTUIMESSAGE(dprintf("SendIntuiMessage: Class 0x%lx Code 0x%lx Qual 0x%lx Mouse %d,%d IAddress 0x%lx\n", imsg->Class, imsg->Code, imsg->Qualifier, imsg->MouseX, imsg->MouseY, imsg->IAddress));
169 PutMsg(window->UserPort, &imsg->ExecMessage);
171 /* Help sucky programs... (die DigiBooster, die!) */
172 window->MessageKey = imsg;
174 else
176 ReplyMsg(&imsg->ExecMessage);
179 Permit();
181 AROS_LIBFUNC_EXIT