2 Copyright © 1995-2013, The AROS Development Team. All rights reserved.
3 Copyright © 2001-2003, The MorphOS Development Team. All Rights Reserved.
7 #include <proto/layers.h>
8 #include "intuition_intern.h"
10 /*****************************************************************************
13 #include <intuition/intuition.h>
14 #include <proto/intuition.h>
15 #include "boopsigadgets.h"
19 # include <aros/debug.h>
21 AROS_LH5(UWORD
, AddGList
,
24 AROS_LHA(struct Window
*, window
, A0
),
25 AROS_LHA(struct Gadget
*, gadget
, A1
),
26 AROS_LHA(ULONG
, position
, D0
),
27 AROS_LHA(LONG
, numGad
, D1
),
28 AROS_LHA(struct Requester
*, requester
, A2
),
31 struct IntuitionBase
*, IntuitionBase
, 73, Intuition
)
34 Add some gadgets to a window.
37 window - Add gadgets to this window
38 gadget - This is the list of gadgets to add
39 position - Where to insert the gadgets in the list of gadgets
40 already in the window. Use 0 to insert the gadgets
41 before all others in the window or ~0 to append them.
42 numGad - How many gadgets of the list should be added.
43 Use -1 to add all gadgets in the list.
44 requester - Pointer to the requester structure if the window is
48 The actual position where the gadgets were inserted.
51 The gadgets will just be added. To make them visible, you must
52 refresh the window or the gadgets.
59 RefreshGadgets(), RefreshGList()
63 *****************************************************************************/
71 EXTENDUWORD(position
);
74 DEBUG_ADDGLIST(dprintf("AddGList: Window 0x%lx Gadget 0x%lx Pos %ld Num %ld Req 0x%lx\n",
75 window
, gadget
, position
, numGad
, requester
));
77 if (!gadget
|| !numGad
|| !window
)
80 D(bug("AddGList()\n"));
82 if (requester
&& gadget
->GadgetType
& GTYP_REQGADGET
)
84 for (last
=gadget
, count2
= numGad
; last
&& count2
--; last
=last
->NextGadget
)
86 DEBUG_ADDGLIST(dprintf("AddGList: Gadget 0x%lx Flags 0x%lx Type 0x%lx Activation 0x%lx %d,%d %d×%d ID 0x%x\n",
87 last
, last
->Flags
, last
->GadgetType
, last
->Activation
,
88 last
->LeftEdge
, last
->TopEdge
, last
->Width
, last
->Height
,
90 last
->GadgetType
|= GTYP_REQGADGET
;
92 pred
= (struct Gadget
*)&requester
->ReqGadget
;
96 for (last
=gadget
, count2
= numGad
; last
&& count2
--; last
=last
->NextGadget
)
98 DEBUG_ADDGLIST(dprintf("AddGList: Gadget 0x%lx Flags 0x%lx Type 0x%lx Activation 0x%lx %d,%d %d×%d ID 0x%lx\n",
99 last
, last
->Flags
, last
->GadgetType
, last
->Activation
,
100 last
->LeftEdge
, last
->TopEdge
, last
->Width
, last
->Height
,
102 last
->GadgetType
&= ~GTYP_REQGADGET
;
105 pred
= (struct Gadget
*)&window
->FirstGadget
;
109 /* Send all GA_RelSpecial BOOPSI gadgets in the list the GM_LAYOUT msg */
110 if (!requester
|| requester
->ReqLayer
)
112 DEBUG_ADDGLIST(dprintf("AddGList: send layout message\n"));
113 DoGMLayout(gadget
, window
, requester
, numGad
, TRUE
, IntuitionBase
);
114 DEBUG_ADDGLIST(dprintf("AddGList: send layout message done ...\n"));
117 /* gadget list must NOT be modified while gadget accesses are possible */
119 LOCKGADGET(IntuitionBase
)
121 LOCKWINDOWLAYERS(window
);
125 while (position
&& pred
->NextGadget
)
128 pred
= pred
->NextGadget
;
130 D(bug("count=%d\n", count
));
132 D(bug("Finished iterating window list\n"));
135 for (last
=gadget
; last
->NextGadget
&& --count2
; last
=last
->NextGadget
);
137 D(bug("Finished finding end of supplied glist\n"));
138 last
->NextGadget
= pred
->NextGadget
;
139 pred
->NextGadget
= gadget
;
141 DEBUG_ADDGLIST(dprintf("AddGList: Pos %ld\n", count
));
143 if (!requester
|| requester
->ReqLayer
)
146 /* Refresh REL gadgets first. Wizard.library (die, die, die!) seems to rely on that. */
147 int_refreshglist(gadget
, window
, requester
, numGad
, REFRESHGAD_REL
, 0, IntuitionBase
);
148 int_refreshglist(gadget
, window
, requester
, numGad
, 0, REFRESHGAD_REL
, IntuitionBase
);
150 RefreshGList(gadget
, window
, requester
, numGad
);
155 UNLOCKGADGET(IntuitionBase
)
157 UNLOCKWINDOWLAYERS(window
);
160 ReturnInt ("AddGList", UWORD
, count
);