Copied prefs-aros to prefs
[cake.git] / workbench / libs / openurl / prefs-aros / utils.c
blob484bbef3b425c6a625ab8f743be7802e8e57ab38
1 /*
2 ** OpenURL - MUI preferences for openurl.library
3 **
4 ** Written by Troels Walsted Hansen <troels@thule.no>
5 ** Placed in the public domain.
6 **
7 ** Developed by:
8 ** - Alfonso Ranieri <alforan@tin.it>
9 ** - Stefan Kost <ensonic@sonicpulse.de>
11 ** Ported to OS4 by Alexandre Balaban <alexandre@balaban.name>
16 #include "OpenURL.h"
18 #if defined(__amigaos4__)
19 #include <stdarg.h>
20 #endif
22 /**************************************************************************/
24 #define _KEY(k) ((ULONG)(k)) ? MUIA_ControlChar : TAG_IGNORE, ((ULONG)(k)) ? (ULONG)getKeyChar(NULL,(ULONG)(k)) : 0
25 #define _HELP(h) ((ULONG)(h)) ? MUIA_ShortHelp : TAG_IGNORE, ((ULONG)(h)) ? (ULONG)getString((ULONG)(h)) : 0
27 /***********************************************************************/
29 #if !defined(__MORPHOS__) && !defined(__amigaos4__)
30 ULONG STDARGS
31 DoSuperNew(struct IClass *cl,Object *obj,ULONG tag1,...)
33 return DoSuperMethod(cl,obj,OM_NEW,&tag1,NULL);
35 #endif
37 /**************************************************************************/
39 #ifdef __amigaos4__
40 int stccpy(char *dst, const char *src, int m)
42 char c;
43 int j = m;
45 while((c = *src++) != '\0')
47 if (--j > 0)
48 *dst++ = c;
49 else
50 break;
52 *dst = '\0';
53 return m - j;
55 #endif /* __amigaos4__ */
57 /**************************************************************************/
59 #ifdef __amigaos4__
60 /**********************************************************
62 ** The following function saves the variable name passed in
63 ** 'varname' to the ENV(ARC) system so that the application
64 ** can become AmiUpdate aware.
66 **********************************************************/
67 void SetAmiUpdateENVVariable( CONST_STRPTR varname )
69 /* AmiUpdate support code */
70 BPTR lock;
71 APTR oldwin;
73 /* obtain the lock to the home directory */
74 if(( lock = GetProgramDir() ))
76 TEXT progpath[2048];
77 TEXT varpath[1024] = "AppPaths";
80 get a unique name for the lock,
81 this call uses device names,
82 as there can be multiple volumes
83 with the same name on the system
86 if( DevNameFromLock( lock, progpath, sizeof(progpath), DN_FULLPATH ))
88 /* stop any "Insert volume..." type requesters */
89 oldwin = SetProcWindow((APTR)-1);
92 finally set the variable to the
93 path the executable was run from
94 don't forget to supply the variable
95 name to suit your application
98 AddPart( varpath, varname, 1024);
99 SetVar( varpath, progpath, -1, GVF_GLOBAL_ONLY|GVF_SAVE_VAR );
101 /* turn requesters back on */
102 SetProcWindow( oldwin );
107 #endif /* __amigaos4__ */
109 /**************************************************************************/
110 ULONG
111 xget(Object *obj,ULONG attribute)
113 ULONG x;
115 get(obj,attribute,&x);
117 return x;
120 /**************************************************************************/
122 Object *
123 olabel(ULONG id)
125 return Label((ULONG)getString(id));
128 /****************************************************************************/
130 Object *
131 ollabel(ULONG id)
133 return LLabel((ULONG)getString(id));
136 /****************************************************************************/
138 Object *
139 ollabel1(ULONG id)
141 return LLabel1((ULONG)getString(id));
144 /****************************************************************************/
146 Object *
147 olabel1(ULONG id)
149 return Label1((ULONG)getString(id));
152 /***********************************************************************/
154 Object *
155 olabel2(ULONG id)
157 return Label2((ULONG)getString(id));
160 /****************************************************************************/
162 Object *
163 oflabel(ULONG text)
165 return FreeLabel((ULONG)getString(text));
168 /****************************************************************************/
170 Object *
171 obutton(ULONG text,ULONG help)
173 Object *obj;
175 if (obj = MUI_MakeObject(MUIO_Button,(ULONG)getString(text)))
176 SetAttrs(obj,MUIA_CycleChain,TRUE,_HELP(help),TAG_DONE);
178 return obj;
181 /***********************************************************************/
183 Object *
184 oibutton(ULONG spec,ULONG help)
186 if (spec==IBT_Up) spec = (ULONG)"\33I[6:38]";
187 else if (spec==IBT_Down) spec = (ULONG)"\33I[6:39]";
188 else return NULL;
190 return TextObject,
191 _HELP(help),
192 MUIA_CycleChain, TRUE,
193 MUIA_Font, MUIV_Font_Button,
194 MUIA_InputMode, MUIV_InputMode_RelVerify,
195 ButtonFrame,
196 MUIA_Background, MUII_ButtonBack,
197 MUIA_Text_Contents, spec,
198 MUIA_Text_PreParse, MUIX_C,
199 MUIA_Text_SetMax, TRUE,
200 End;
203 /****************************************************************************/
205 Object *
206 otbutton(ULONG label,ULONG help)
208 return TextObject,
209 _KEY(label),
210 _HELP(help),
211 MUIA_CycleChain, TRUE,
212 MUIA_Font, MUIV_Font_Button,
213 MUIA_InputMode, MUIV_InputMode_Toggle,
214 ButtonFrame,
215 MUIA_Background, MUII_ButtonBack,
216 MUIA_Text_Contents, getString(label),
217 MUIA_Text_PreParse, MUIX_C,
218 MUIA_Text_HiCharIdx, '_',
219 End;
222 /****************************************************************************/
224 Object *
225 ocheckmark(ULONG key,ULONG help)
227 Object *obj;
229 if (obj = MUI_MakeObject(MUIO_Checkmark,(ULONG)getString(key)))
230 SetAttrs(obj,MUIA_CycleChain,TRUE,_HELP(help),TAG_DONE);
232 return obj;
235 /****************************************************************************/
237 Object *
238 opopbutton(ULONG img,ULONG help)
240 Object *obj;
242 if (obj = MUI_MakeObject(MUIO_PopButton,img))
243 SetAttrs(obj,MUIA_CycleChain,TRUE,_HELP(help),TAG_DONE);
245 return obj;
248 /****************************************************************************/
250 Object *
251 ostring(ULONG maxlen,ULONG key,ULONG help)
253 return StringObject,
254 _KEY(key),
255 _HELP(help),
256 MUIA_CycleChain, TRUE,
257 StringFrame,
258 MUIA_String_AdvanceOnCR, TRUE,
259 MUIA_String_MaxLen, maxlen,
260 End;
263 /***********************************************************************/
265 Object *
266 opopport(ULONG maxLen,ULONG key,ULONG help)
268 return popportObject,
269 _HELP(help),
270 MUIA_Popport_Key, key,
271 MUIA_Popport_Len, maxLen,
272 End;
275 /***********************************************************************/
277 Object *
278 opopph(STRPTR *syms,STRPTR *names,ULONG maxLen,ULONG key,ULONG asl,ULONG help)
280 return popphObject,
281 _HELP(help),
282 MUIA_Popph_Syms, syms,
283 MUIA_Popph_Names, names,
284 MUIA_Popph_MaxLen, maxLen,
285 MUIA_Popph_Key, key,
286 MUIA_Popph_Asl, asl,
287 End;
290 /***********************************************************************/
292 ULONG
293 openWindow(Object *app,Object *win)
295 ULONG v;
297 if (win)
299 set(win,MUIA_Window_Open,TRUE);
300 get(win,MUIA_Window_Open,&v);
301 if (!v) get(app,MUIA_Application_Iconified,&v);
303 else v = FALSE;
305 if (!v) DisplayBeep(0);
307 return v;
310 /***********************************************************************/
312 #if !defined(__MORPHOS__) && !defined(__AROS__)
313 static ULONG fmtfunc = 0x16C04E75;
315 void STDARGS
316 msprintf(STRPTR to, STRPTR fmt,...)
318 #if defined(__amigaos4__)
319 va_list va;
320 va_startlinear(va,fmt);
321 RawDoFmt(fmt,va_getlinearva(va,CONST APTR),(APTR)&fmtfunc,to);
322 va_end(va);
323 #else
324 RawDoFmt(fmt,&fmt+1,(APTR)&fmtfunc,to);
325 #endif
327 #endif
329 /**************************************************************************/
331 struct stream
333 STRPTR buf;
334 int size;
335 int counter;
336 int stop;
339 #ifdef __MORPHOS__
340 static void
341 msnprintfStuff(void)
343 register struct stream *s = (struct stream *)REG_A3;
344 register UBYTE c = (TEXT)REG_D0;
345 #elif defined(__AROS__)
346 AROS_UFH2S(void, msnprintfStuff,
347 AROS_UFHA(TEXT , c, D0),
348 AROS_UFHA(struct stream *, s, A3))
350 AROS_USERFUNC_INIT
351 #else
352 static void SAVEDS ASM
353 msnprintfStuff(REG(d0,TEXT c),REG(a3,struct stream *s))
355 #endif
356 if (!s->stop)
358 if (++s->counter>=s->size)
360 *(s->buf) = 0;
361 s->stop = 1;
363 else *(s->buf++) = c;
365 #ifdef __AROS__
366 AROS_USERFUNC_EXIT
367 #endif
370 #ifdef __MORPHOS__
371 static struct EmulLibEntry msnprintfStuffTrap = {TRAP_LIB,0,(void *)&msnprintfStuff};
372 #endif
376 #if !defined( __MORPHOS__ )
377 STDARGS
378 #endif
379 msnprintf(STRPTR buf,int size, STRPTR fmt,...)
381 struct stream s;
382 #ifdef __MORPHOS__
383 va_list va;
384 va_start(va,fmt);
385 #elif defined(__amigaos4__)
386 va_list va;
387 va_startlinear(va,fmt);
388 #endif
390 s.buf = buf;
391 s.size = size;
392 s.counter = 0;
393 s.stop = 0;
395 #ifdef __MORPHOS__
396 RawDoFmt(fmt,va->overflow_arg_area,(APTR)&msnprintfStuffTrap,&s);
397 va_end(va);
398 #elif defined(__amigaos4__)
399 RawDoFmt(fmt,va_getlinearva(va,CONST APTR),(APTR)msnprintfStuff,&s);
400 va_end(va);
401 #else
402 RawDoFmt(fmt,&fmt+1,(APTR)msnprintfStuff,&s);
403 #endif
405 return s.counter-1;
408 /**************************************************************************/
410 ULONG
411 delEntry(Object *obj,APTR entry)
413 APTR e;
414 int i;
416 for (i = 0; ;i++)
418 DoMethod(obj,MUIM_List_GetEntry,i,(ULONG)&e);
419 if (!e || e==entry) break;
422 if (e) DoMethod(obj,MUIM_List_Remove,i);
424 return (ULONG)e;
427 /**************************************************************************/