Tabs to spaces, more consistent formatting.
[AROS.git] / workbench / libs / muimaster / mui_request.c
blobae316d53828b1da844624236995371f2a50c0748
1 /*
2 Copyright © 2002-2010, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include <string.h>
8 #ifdef __AROS__
9 #include <proto/alib.h>
10 #else
11 #include <clib/alib_protos.h>
12 #endif
13 #include <proto/exec.h>
14 #include <proto/intuition.h>
15 #include <proto/muimaster.h>
17 #include "mui.h"
18 #include "support.h"
19 #include "muimaster_intern.h"
21 extern struct Library *MUIMasterBase;
23 #ifdef __AROS__
24 AROS_UFH2S(void, cpy_func,
25 AROS_UFHA(UBYTE, chr, D0),
26 AROS_UFHA(STRPTR *, strPtrPtr, A3))
28 AROS_USERFUNC_INIT
30 *(*strPtrPtr)++ = chr;
32 AROS_USERFUNC_EXIT
35 AROS_UFH2S(void, len_func,
36 AROS_UFHA(UBYTE, chr, D0),
37 AROS_UFHA(LONG *, lenPtr, A3))
39 AROS_USERFUNC_INIT
41 (*lenPtr)++;
43 AROS_USERFUNC_EXIT
45 #endif
47 /*****************************************************************************
49 NAME */
50 AROS_LH7(LONG, MUI_RequestA,
52 /* SYNOPSIS */
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),
61 /* LOCATION */
62 struct Library *, MUIMasterBase, 7, MUIMaster)
64 /* FUNCTION
66 INPUTS
68 RESULT
70 NOTES
72 EXAMPLE
74 BUGS
76 SEE ALSO
78 INTERNALS
80 *****************************************************************************/
82 AROS_LIBFUNC_INIT
84 LONG result;
85 char *reqtxt;
86 LONG reqtxt_len;
87 #ifndef __AROS__
88 static const ULONG len_func = 0x52934e75; /* addq.l #1,(A3) ; rts */
89 static const ULONG cpy_func = 0x16c04e75; /* move.b d0,(a3)+ ; rts */
90 #endif
92 Object *req_wnd;
93 Object *req_group;
94 Object *req_but[32]; /* shouldn't be more than 32 buttons per requester */
96 if (!app)
98 struct EasyStruct es;
99 es.es_StructSize = sizeof(struct EasyStruct);
100 es.es_Flags = 0;
101 es.es_Title = title;
102 es.es_TextFormat = format;
103 es.es_GadgetFormat = gadgets;
104 return EasyRequestArgs(NULL,&es,NULL,params);
107 reqtxt_len = 0;
108 #ifdef __AROS__
109 RawDoFmt(format,params,(VOID_FUNC)AROS_ASMSYMNAME(len_func),&reqtxt_len);
110 #else
111 RawDoFmt(format,params,(void(*)())&len_func,&reqtxt_len);
112 #endif
114 /* Return cancel if something failed */
115 if (!(reqtxt = AllocVec(reqtxt_len+1,0)))
116 return 0;
118 #ifdef __AROS__
120 char *reqtxtptr = reqtxt;
122 RawDoFmt(format, params, (VOID_FUNC)AROS_ASMSYMNAME(cpy_func),
123 &reqtxtptr);
125 #else
126 RawDoFmt(format, params, (void(*)())&cpy_func, reqtxt);
127 #endif
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,
143 Child, HGroup,
144 TextFrame,
145 MUIA_Background, MUII_TextBack,
146 Child, HSpace(0),
147 Child, TextObject,
148 MUIA_InnerBottom, 8,
149 MUIA_InnerLeft, 8,
150 MUIA_InnerRight, 8,
151 MUIA_InnerTop, 8,
152 MUIA_Text_SetMax, TRUE,
153 MUIA_Text_Contents, reqtxt,
154 End,
155 Child, HSpace(0),
156 End,
157 Child, VSpace(2),
158 Child, req_group = HGroup, End,
159 End,
160 End;
162 FreeVec(reqtxt);
164 result = 0;
166 if (req_wnd)
168 char *gadgs = StrDup(gadgets);
169 if (gadgs)
171 char *current = gadgs;
172 int active = -1;
173 int num_gads = 0;
174 IPTR isopen = FALSE;
176 // set(app, MUIA_Application_Sleep, TRUE);
177 DoMethod(app, OM_ADDMEMBER, (IPTR)req_wnd);
179 while(current)
181 char *next = strchr(current,'|');
182 if (next) *next++ = 0;
184 if (current[0] == '*')
186 current++;
187 active = num_gads;
190 if (!(req_but[num_gads] = SimpleButton(current)))
191 break;
192 num_gads++;
193 current = next;
196 FreeVec(gadgs);
197 DoMethod(req_group, MUIM_Group_InitChange);
199 /* if this is only one button lets add it separatly */
200 if (num_gads == 1)
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);
208 else
210 int j;
212 for(j = 0; j < num_gads; j++)
214 if (j > 0)
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);
236 if (isopen)
238 ULONG sigs = 0;
239 result = -1;
241 while (result == -1)
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)
248 result = ret-1;
249 break;
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);
265 return result;
267 AROS_LIBFUNC_EXIT
269 } /* MUIA_RequestA */