2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 Copyright © 2001-2003, The MorphOS Development Team. All Rights Reserved.
7 #include <exec/types.h>
9 #include <intuition/classes.h>
10 #include <intuition/classusr.h>
11 #include <intuition/gadgetclass.h>
12 #include <intuition/cghooks.h>
13 #include <intuition/icclass.h>
15 #include <utility/tagitem.h>
16 #include <utility/hooks.h>
18 #include <clib/macros.h>
20 #include <proto/exec.h>
21 #include <proto/utility.h>
22 #include <proto/intuition.h>
25 #include <aros/asmcall.h>
26 #include <proto/alib.h>
27 #endif /* !__MORPHOS__ */
29 #include "intuition_intern.h"
33 /**********************************************************************************************/
35 static void _om_set(struct ICData
*ic
, struct TagItem
*tags
, struct IntuitionBase
*IntuitionBase
)
37 struct Library
*UtilityBase
= GetPrivIBase(IntuitionBase
)->UtilityBase
;
38 struct TagItem
*tag
, *tstate
= tags
;
40 while ((tag
= NextTagItem(&tstate
)))
45 ic
->ic_Mapping
= (struct TagItem
*)tag
->ti_Data
;
49 ic
->ic_Target
= (Object
*)tag
->ti_Data
;
55 IPTR
ICClass__OM_NEW(Class
*cl
, Object
*o
, struct opSet
*msg
)
59 struct IntuitionBase
*IntuitionBase
= (struct IntuitionBase
*)cl
->cl_UserData
;
61 DEBUG_IC(dprintf("dispatch_icclass: OM_NEW\n"));
63 retval
= DoSuperMethodA(cl
, o
, (Msg
)msg
);
65 if (!retval
) return (IPTR
)FALSE
;
67 ic
= INST_DATA(cl
, retval
);
69 /* set some defaults */
71 ic
->ic_Mapping
= NULL
;
72 ic
->ic_CloneTags
= NULL
;
74 _om_set(ic
, msg
->ops_AttrList
, IntuitionBase
);
79 IPTR
ICClass__OM_SET(Class
*cl
, Object
*o
, struct opSet
*msg
)
81 struct ICData
*ic
= INST_DATA(cl
, o
);
82 struct IntuitionBase
*IntuitionBase
= (struct IntuitionBase
*)cl
->cl_UserData
;
84 DEBUG_IC(dprintf("dispatch_icclass: OM_SET\n"));
85 _om_set(ic
, msg
->ops_AttrList
, IntuitionBase
);
86 DEBUG_IC(dprintf("dispatch_icclass: OM_SET Map 0x%lx Target 0x%lx\n",ic
->ic_Mapping
,ic
->ic_Target
));
91 IPTR
ICClass__OM_NOTIFY(Class
*cl
, Object
*o
, struct opUpdate
*msg
)
93 struct ICData
*ic
= INST_DATA(cl
, o
);
95 struct IntuitionBase
*IntuitionBase
= (struct IntuitionBase
*)cl
->cl_UserData
;
97 /* Send update notification to target
99 DEBUG_IC(dprintf("dispatch_icclass: OM_NOTIFY\n"));
100 DEBUG_IC(dprintf("dispatch_icclass: DoNotify\n"));
101 retval
= DoNotify(cl
, o
, ic
, msg
);
102 DEBUG_IC(dprintf("dispatch_icclass: DoNotify done\n"));
107 IPTR
ICClass__OM_DISPOSE(Class
*cl
, Object
*o
, Msg msg
)
109 struct ICData
*ic
= INST_DATA(cl
, o
);
110 struct IntuitionBase
*IntuitionBase
= (struct IntuitionBase
*)cl
->cl_UserData
;
112 DEBUG_IC(dprintf("dispatch_icclass: OM_DISPOSE\n"));
114 DoSuperMethodA(cl
, o
, msg
);
119 IPTR
ICClass__OM_GET(Class
*cl
, Object
*o
, struct opGet
*msg
)
121 struct ICData
*ic
= INST_DATA(cl
, o
);
123 DEBUG_IC(dprintf("dispatch_icclass: OM_GET\n"));
124 switch (msg
->opg_AttrID
)
127 *msg
->opg_Storage
= (IPTR
)ic
->ic_Mapping
;
131 *msg
->opg_Storage
= (IPTR
)ic
->ic_Target
;
140 * NOTE: I current don't see the purpose of the ICM_* methods
141 * this implementation could be WAY off base...
143 * stegerg: well, it is for example needed by modeclass which is
144 * a superclass of icclass.
146 * IMPORTANT: ICM_SETLOOP, ICM_CLEARLOOP, ICM_CHECKLOOP are also
147 * handled by gadgetclass: change here <-> change there!
150 void ICClass__ICM_SETLOOP(Class
*cl
, Object
*o
, Msg msg
)
152 struct ICData
*ic
= INST_DATA(cl
, o
);
154 /* set/increment loop counter */
155 ic
->ic_LoopCounter
+= 1UL;
156 DEBUG_IC(dprintf("dispatch_icclass: ICM_SETLOOP new LoopCounter %ld\n",ic
->ic_LoopCounter
));
159 void ICClass__ICM_CLEARLOOP(Class
*cl
, Object
*o
, Msg msg
)
161 struct ICData
*ic
= INST_DATA(cl
, o
);
163 /* clear/decrement loop counter */
164 ic
->ic_LoopCounter
-= 1UL;
165 DEBUG_IC(dprintf("dispatch_icclass: ICM_CLEAR new LoopCounter %ld\n",ic
->ic_LoopCounter
));
168 IPTR
ICClass__ICM_CHECKLOOP(Class
*cl
, Object
*o
, Msg msg
)
170 struct ICData
*ic
= INST_DATA(cl
, o
);
172 /* get loop counter */
173 DEBUG_IC(dprintf("dispatch_icclass: ICM_CHECKLOOP new LoopCounter %ld\n",ic
->ic_LoopCounter
));
174 return (IPTR
)ic
->ic_LoopCounter
;
177 /**********************************************************************************************/