2 Copyright © 2002-2010, 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 *****************************************************************************/
88 static const ULONG len_func
= 0x52934e75; /* addq.l #1,(A3) ; rts */
89 static const ULONG cpy_func
= 0x16c04e75; /* move.b d0,(a3)+ ; rts */
94 Object
*req_but
[32]; /* shouldn't be more than 32 buttons per requester */
99 es
.es_StructSize
= sizeof(struct EasyStruct
);
102 es
.es_TextFormat
= format
;
103 es
.es_GadgetFormat
= gadgets
;
104 return EasyRequestArgs(NULL
,&es
,NULL
,params
);
109 RawDoFmt(format
,params
,(VOID_FUNC
)AROS_ASMSYMNAME(len_func
),&reqtxt_len
);
111 RawDoFmt(format
,params
,(void(*)())&len_func
,&reqtxt_len
);
114 /* Return cancel if something failed */
115 if (!(reqtxt
= AllocVec(reqtxt_len
+1,0)))
120 char *reqtxtptr
= reqtxt
;
122 RawDoFmt(format
, params
, (VOID_FUNC
)AROS_ASMSYMNAME(cpy_func
),
126 RawDoFmt(format
, params
, (void(*)())&cpy_func
, reqtxt
);
129 if (title
== NULL
&& app
!= NULL
)
131 title
= (CONST_STRPTR
) XGET(app
, MUIA_Application_Title
);
134 req_wnd
= WindowObject
,
135 MUIA_Window_Title
, title
,
136 MUIA_Window_RefWindow
, win
,
137 MUIA_Window_LeftEdge
, MUIV_Window_LeftEdge_Centered
,
138 MUIA_Window_TopEdge
, MUIV_Window_TopEdge_Centered
,
139 MUIA_Window_CloseGadget
, FALSE
,
140 MUIA_Window_SizeGadget
, FALSE
,
141 WindowContents
, VGroup
,
142 MUIA_Background
, MUII_RequesterBack
,
145 MUIA_Background
, MUII_TextBack
,
152 MUIA_Text_SetMax
, TRUE
,
153 MUIA_Text_Contents
, reqtxt
,
158 Child
, req_group
= HGroup
, End
,
168 char *gadgs
= StrDup(gadgets
);
171 char *current
= gadgs
;
176 // set(app, MUIA_Application_Sleep, TRUE);
177 DoMethod(app
, OM_ADDMEMBER
, (IPTR
)req_wnd
);
181 char *next
= strchr(current
,'|');
182 if (next
) *next
++ = 0;
184 if (current
[0] == '*')
190 if (!(req_but
[num_gads
] = SimpleButton(current
)))
197 DoMethod(req_group
, MUIM_Group_InitChange
);
199 /* if this is only one button lets add it separatly */
202 DoMethod(req_group
, OM_ADDMEMBER
, (IPTR
)HSpace(0));
203 DoMethod(req_group
, OM_ADDMEMBER
, (IPTR
)req_but
[0]);
204 DoMethod(req_group
, OM_ADDMEMBER
, (IPTR
)HSpace(0));
205 DoMethod(req_but
[0], MUIM_Notify
, MUIA_Pressed
, FALSE
,
206 (IPTR
)app
, 2, MUIM_Application_ReturnID
, 2);
212 for(j
= 0; j
< num_gads
; j
++)
216 DoMethod(req_group
, OM_ADDMEMBER
, (IPTR
)HSpace(0));
218 DoMethod(req_group
, OM_ADDMEMBER
, (IPTR
)req_but
[j
]);
219 DoMethod(req_but
[j
], MUIM_Notify
, MUIA_Pressed
, FALSE
,
220 (IPTR
)app
, 2, MUIM_Application_ReturnID
,
221 (j
+2 <= num_gads
) ? j
+2 : 1);
222 set(req_but
[j
], MUIA_CycleChain
, 1);
225 DoMethod(req_group
, MUIM_Group_ExitChange
);
227 /* now activate that button with a starting "*" */
228 if(active
!= -1) set(req_wnd
, MUIA_Window_ActiveObject
, (IPTR
) req_but
[active
]);
230 /* lets collect the waiting returnIDs now */
231 // COLLECT_RETURNIDS;
233 set(req_wnd
, MUIA_Window_Open
, TRUE
);
234 get(req_wnd
, MUIA_Window_Open
, &isopen
);
243 ULONG ret
= DoMethod(app
, MUIM_Application_NewInput
, (IPTR
)&sigs
);
245 /* if a button was hit, lets get outda here. */
246 if (ret
> 0 && ret
<= num_gads
+1)
252 if (sigs
) sigs
= Wait(sigs
);
256 /* now lets reissue the collected returnIDs again */
257 // REISSUE_RETURNIDS;
259 // set(app, MUIA_Application_Sleep, FALSE);
262 DoMethod(app
, OM_REMMEMBER
, (IPTR
)req_wnd
);
263 MUI_DisposeObject(req_wnd
);
269 } /* MUIA_RequestA */