2 Copyright © 2002-2003, The AROS Development Team. All rights reserved.
9 #include <proto/alib.h>
11 #include <clib/alib_protos.h>
13 #include <proto/exec.h>
14 #include <proto/intuition.h>
15 #include <proto/muimaster.h>
19 #include "muimaster_intern.h"
21 extern struct Library
*MUIMasterBase
;
24 AROS_UFH2S(void, cpy_func
,
25 AROS_UFHA(UBYTE
, chr
, D0
),
26 AROS_UFHA(STRPTR
*, strPtrPtr
, A3
))
30 *(*strPtrPtr
)++ = chr
;
35 AROS_UFH2S(void, len_func
,
36 AROS_UFHA(UBYTE
, chr
, D0
),
37 AROS_UFHA(LONG
*, lenPtr
, A3
))
47 /*****************************************************************************
50 AROS_LH7(LONG
, MUI_RequestA
,
53 AROS_LHA(APTR
, app
, D0
),
54 AROS_LHA(APTR
, win
, D1
),
55 AROS_LHA(LONGBITS
, flags
, D2
),
56 AROS_LHA(CONST_STRPTR
, title
, A0
),
57 AROS_LHA(CONST_STRPTR
, gadgets
, A1
),
58 AROS_LHA(CONST_STRPTR
, format
, A2
),
59 AROS_LHA(APTR
, params
, A3
),
62 struct Library
*, MUIMasterBase
, 7, MUIMaster
)
80 *****************************************************************************/
83 AROS_LIBBASE_EXT_DECL(struct Library
*,MUIMasterBase
)
89 static const ULONG len_func
= 0x52934e75; /* addq.l #1,(A3) ; rts */
90 static const ULONG cpy_func
= 0x16c04e75; /* move.b d0,(a3)+ ; rts */
95 Object
*req_but
[32]; /* more than 32 buttongadgets within a requester shouldn`t happen */
100 es
.es_StructSize
= sizeof(struct EasyStruct
);
103 es
.es_TextFormat
= format
;
104 es
.es_GadgetFormat
= gadgets
;
105 return EasyRequestArgs(NULL
,&es
,NULL
,params
);
110 RawDoFmt(format
,params
,(VOID_FUNC
)AROS_ASMSYMNAME(len_func
),&reqtxt_len
);
113 RawDoFmt(format
,params
,(void(*)())&len_func
,&reqtxt_len
);
116 if (!(reqtxt
= AllocVec(reqtxt_len
+1,0))) return 0; /* Return cancel if something failed */
120 char *reqtxtptr
= reqtxt
;
122 RawDoFmt(format
,params
,(VOID_FUNC
)AROS_ASMSYMNAME(cpy_func
),&reqtxtptr
);
125 RawDoFmt(format
,params
,(void(*)())&cpy_func
,reqtxt
);
128 if (title
== NULL
&& app
!= NULL
)
130 title
= (CONST_STRPTR
) XGET(app
, MUIA_Application_Title
);
133 req_wnd
= WindowObject
,
134 MUIA_Window_Title
, title
,
135 MUIA_Window_RefWindow
, win
,
136 MUIA_Window_LeftEdge
, MUIV_Window_LeftEdge_Centered
,
137 MUIA_Window_TopEdge
, MUIV_Window_TopEdge_Centered
,
138 MUIA_Window_CloseGadget
, FALSE
,
139 MUIA_Window_SizeGadget
, FALSE
,
140 WindowContents
, VGroup
,
141 MUIA_Background
, MUII_RequesterBack
,
149 MUIA_Background
, MUII_TextBack
,
150 MUIA_Text_SetMax
, TRUE
,
151 MUIA_Text_Contents
, reqtxt
,
155 Child
, req_group
= HGroup
, End
,
165 char *gadgs
= StrDup(gadgets
);
168 char *current
= gadgs
;
173 // set(app, MUIA_Application_Sleep, TRUE);
174 DoMethod(app
, OM_ADDMEMBER
, (IPTR
)req_wnd
);
178 char *next
= strchr(current
,'|');
179 if (next
) *next
++ = 0;
181 if (current
[0] == '*')
187 if (!(req_but
[num_gads
] = SimpleButton(current
)))
194 DoMethod(req_group
, MUIM_Group_InitChange
);
196 /* if this is only one button lets add it separatly */
199 DoMethod(req_group
, OM_ADDMEMBER
, (IPTR
)HSpace(0));
200 DoMethod(req_group
, OM_ADDMEMBER
, (IPTR
)req_but
[0]);
201 DoMethod(req_group
, OM_ADDMEMBER
, (IPTR
)HSpace(0));
202 DoMethod(req_but
[0], MUIM_Notify
, MUIA_Pressed
, FALSE
,
203 (IPTR
)app
, 2, MUIM_Application_ReturnID
, 2);
209 for(j
= 0; j
< num_gads
; j
++)
213 DoMethod(req_group
, OM_ADDMEMBER
, (IPTR
)HSpace(0));
215 DoMethod(req_group
, OM_ADDMEMBER
, (IPTR
)req_but
[j
]);
216 DoMethod(req_but
[j
], MUIM_Notify
, MUIA_Pressed
, FALSE
,
217 (IPTR
)app
, 2, MUIM_Application_ReturnID
,
218 (j
+2 <= num_gads
) ? j
+2 : 1);
219 set(req_but
[j
], MUIA_CycleChain
, 1);
222 DoMethod(req_group
, MUIM_Group_ExitChange
);
224 /* now activate that button with a starting "*" */
225 if(active
!= -1) set(req_wnd
, MUIA_Window_ActiveObject
, (IPTR
) req_but
[active
]);
227 /* lets collect the waiting returnIDs now */
228 // COLLECT_RETURNIDS;
230 set(req_wnd
, MUIA_Window_Open
, TRUE
);
231 get(req_wnd
, MUIA_Window_Open
, &isopen
);
240 ULONG ret
= DoMethod(app
, MUIM_Application_NewInput
, (IPTR
)&sigs
);
242 /* if a button was hit, lets get outda here. */
243 if (ret
> 0 && ret
<= num_gads
+1)
249 if (sigs
) sigs
= Wait(sigs
);
253 /* now lets reissue the collected returnIDs again */
254 // REISSUE_RETURNIDS;
256 // set(app, MUIA_Application_Sleep, FALSE);
259 DoMethod(app
, OM_REMMEMBER
, (IPTR
)req_wnd
);
260 MUI_DisposeObject(req_wnd
);
266 } /* MUIA_RequestA */