2 Copyright © 2002-2011, The AROS Development Team. All rights reserved.
6 #define MUIMASTER_YES_INLINE_STDARG
11 #include <graphics/gfx.h>
12 #include <graphics/view.h>
13 #include <dos/dostags.h>
14 #include <libraries/asl.h>
15 #include <clib/alib_protos.h>
16 #include <proto/exec.h>
17 #include <proto/graphics.h>
18 #include <proto/utility.h>
19 #include <proto/intuition.h>
20 #include <proto/asl.h>
21 #include <proto/dos.h>
22 #include <proto/muimaster.h>
25 #include "muimaster_intern.h"
27 #include "support_classes.h"
28 #include "popasl_private.h"
30 extern struct Library
*MUIMasterBase
;
37 Object
*app
; /* the application */
39 STRPTR buf
; /* asl_entry must FreeVec() this before exiting!!! */
42 SAVEDS
static LONG
Asl_Entry(void)
45 struct Asl_Startup
*msg
;
53 proc
= (struct Process
*)FindTask(NULL
);
54 WaitPort(&proc
->pr_MsgPort
); /* Wait for the startup message */
55 msg
= (struct Asl_Startup
*)GetMsg(&proc
->pr_MsgPort
);
57 asl_req
= msg
->asl_req
;
65 if (AslRequest(asl_req
, tags
))
66 DoMethod(app
, MUIM_Application_PushMethod
, (IPTR
) pop
, 2,
67 MUIM_Popstring_Close
, TRUE
);
69 DoMethod(app
, MUIM_Application_PushMethod
, (IPTR
) pop
, 2,
70 MUIM_Popstring_Close
, FALSE
);
78 static ULONG
Popasl_Open_Function(struct Hook
*hook
, Object
*obj
,
82 struct Popasl_DATA
*data
= (struct Popasl_DATA
*)hook
->h_Data
;
83 struct Asl_Startup
*startup
;
84 Object
*string
= (Object
*) msg
[0];
85 struct MsgPort
*msg_port
;
90 data
->tag_list
[0].ti_Tag
= ASLFR_Screen
;
91 data
->tag_list
[0].ti_Data
= (IPTR
) _screen(obj
);
92 data
->tag_list
[1].ti_Tag
= ASLFR_PrivateIDCMP
;
93 data
->tag_list
[1].ti_Data
= 1;
94 data
->tag_list
[2].ti_Tag
= ASLFR_InitialLeftEdge
;
95 data
->tag_list
[2].ti_Data
= _left(obj
);
96 data
->tag_list
[3].ti_Tag
= ASLFR_InitialTopEdge
;
97 data
->tag_list
[3].ti_Data
= _top(obj
);
98 data
->tag_list
[4].ti_Tag
= ASLFR_InitialWidth
;
99 data
->tag_list
[4].ti_Data
= _width(obj
);
100 data
->tag_list
[5].ti_Tag
= TAG_DONE
;
101 data
->tag_list
[5].ti_Data
= 0;
103 if (data
->start_hook
)
105 if (!(CallHookPkt(data
->start_hook
, obj
, data
->tag_list
)))
110 if (data
->type
== ASL_FileRequest
)
115 get(string
, MUIA_String_Contents
, &str
);
117 path_end
= PathPart(str
);
118 buf
= (char *)AllocVec(path_end
- str
+ 10, MEMF_PUBLIC
);
122 strncpy(buf
, str
, path_end
- str
);
123 buf
[path_end
- str
] = 0;
125 data
->tag_list
[5].ti_Tag
= ASLFR_InitialFile
;
126 data
->tag_list
[5].ti_Data
= (IPTR
) FilePart(str
);
127 data
->tag_list
[6].ti_Tag
= ASLFR_InitialDrawer
;
128 data
->tag_list
[6].ti_Data
= (IPTR
) buf
;
129 data
->tag_list
[7].ti_Tag
= TAG_DONE
;
130 data
->tag_list
[7].ti_Data
= 0;
133 if (data
->type
== ASL_FontRequest
)
139 get(string
, MUIA_String_Contents
, &str
);
143 name_end
= PathPart(str
);
144 buf
= (char *)AllocVec(name_end
- str
+ 10, MEMF_PUBLIC
);
148 strncpy(buf
, str
, name_end
- str
);
149 strcpy(buf
+ (name_end
- str
), ".font");
150 StrToLong(FilePart(str
), &size
);
152 data
->tag_list
[5].ti_Tag
= ASLFO_InitialName
;
153 data
->tag_list
[5].ti_Data
= (IPTR
) buf
;
154 data
->tag_list
[6].ti_Tag
= ASLFO_InitialSize
;
155 data
->tag_list
[6].ti_Data
= size
;
156 data
->tag_list
[7].ti_Tag
= TAG_DONE
;
157 data
->tag_list
[7].ti_Data
= 0;
162 if (!(msg_port
= CreateMsgPort()))
165 (struct Asl_Startup
*)AllocVec(sizeof(struct Asl_Startup
),
168 DeleteMsgPort(msg_port
);
173 const struct TagItem processTags
[2] = {
174 {NP_Entry
, (IPTR
) Asl_Entry
},
178 if (!(data
->asl_proc
= CreateNewProc(processTags
)))
181 DeleteMsgPort(msg_port
);
186 startup
->msg
.mn_ReplyPort
= msg_port
;
187 startup
->msg
.mn_Length
= sizeof(struct Asl_Startup
);
188 startup
->tags
= data
->tag_list
;
189 startup
->app
= _app(obj
);
190 startup
->asl_req
= data
->asl_req
;
193 PutMsg(&data
->asl_proc
->pr_MsgPort
, &startup
->msg
);
197 DeleteMsgPort(msg_port
);
203 static ULONG
Popasl_Close_Function(struct Hook
*hook
, Object
*obj
,
206 struct Popasl_DATA
*data
= (struct Popasl_DATA
*)hook
->h_Data
;
207 Object
*string
= (Object
*) msg
[0];
208 IPTR suc
= (IPTR
) msg
[1];
214 CallHookPkt(data
->stop_hook
, obj
, data
->asl_req
);
220 if (data
->type
== ASL_FileRequest
)
222 struct FileRequester
*file_req
=
223 (struct FileRequester
*)data
->asl_req
;
225 (char *)file_req
->fr_File
? (char *)file_req
->
226 fr_File
: (char *)"";
228 (char *)file_req
->fr_Drawer
? (char *)file_req
->
229 fr_Drawer
: (char *)"";
230 int len
= strlen(file
) + strlen(drawer
) + 10;
232 buf
= (char *)AllocVec(len
, MEMF_CLEAR
);
236 AddPart(buf
, file
, len
);
239 else if (data
->type
== ASL_FontRequest
)
241 struct FontRequester
*font_req
=
242 (struct FontRequester
*)data
->asl_req
;
243 char *name
= font_req
->fo_Attr
.ta_Name
;
247 LONG size
= font_req
->fo_Attr
.ta_YSize
;
248 int len
= strlen(name
) + 20;
250 buf
= AllocVec(len
, MEMF_CLEAR
);
258 /* Remove the .font extension */
259 if ((font_ext
= strstr(buf
, ".font")))
262 snprintf(num_buf
, 20, "%ld", (long)size
);
263 AddPart(buf
, num_buf
, len
);
272 set(string
, MUIA_String_Contents
, (IPTR
) buf
);
273 get(string
, MUIA_String_Contents
, &contents
);
275 /* trigger string notification */
276 set(string
, MUIA_String_Acknowledge
, contents
);
283 data
->asl_proc
= NULL
;
284 nfset(obj
, MUIA_Popasl_Active
, FALSE
);
289 IPTR
Popasl__OM_NEW(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
291 struct Popasl_DATA
*data
;
292 struct TagItem
*tags
;
295 GetTagData(MUIA_Popasl_Type
, ASL_FileRequest
, msg
->ops_AttrList
);
298 if (!(asl_req
= AllocAslRequest(asl_type
, msg
->ops_AttrList
)))
301 obj
= (Object
*) DoSuperNewTags(cl
, obj
, NULL
,
302 MUIA_Popstring_Toggle
, FALSE
, TAG_MORE
, (IPTR
) msg
->ops_AttrList
);
306 data
= INST_DATA(cl
, obj
);
308 /* parse initial taglist */
310 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
314 case MUIA_Popasl_StartHook
:
315 data
->start_hook
= (struct Hook
*)tag
->ti_Data
;
318 case MUIA_Popasl_StopHook
:
319 data
->stop_hook
= (struct Hook
*)tag
->ti_Data
;
324 data
->open_hook
.h_Entry
= HookEntry
;
325 data
->open_hook
.h_SubEntry
= (HOOKFUNC
) Popasl_Open_Function
;
326 data
->open_hook
.h_Data
= data
;
327 data
->close_hook
.h_Entry
= HookEntry
;
328 data
->close_hook
.h_SubEntry
= (HOOKFUNC
) Popasl_Close_Function
;
329 data
->close_hook
.h_Data
= data
;
330 data
->asl_req
= asl_req
;
331 data
->type
= asl_type
;
334 MUIA_Popstring_OpenHook
, (IPTR
) & data
->open_hook
,
335 MUIA_Popstring_CloseHook
, (IPTR
) & data
->close_hook
,
336 MUIA_Popstring_Toggle
, FALSE
, TAG_DONE
);
341 IPTR
Popasl__OM_DISPOSE(struct IClass
*cl
, Object
*obj
, Msg msg
)
343 struct Popasl_DATA
*data
= INST_DATA(cl
, obj
);
345 FreeAslRequest(data
->asl_req
);
346 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
349 #define STORE *(msg->opg_Storage)
350 IPTR
Popasl__OM_GET(struct IClass
*cl
, Object
*obj
, struct opGet
*msg
)
352 struct Popasl_DATA
*data
= INST_DATA(cl
, obj
);
354 switch (msg
->opg_AttrID
)
356 case MUIA_Popasl_Active
:
357 STORE
= ! !data
->asl_proc
;
360 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
364 IPTR
Popasl__OM_SET(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
366 struct Popasl_DATA
*data
= INST_DATA(cl
, obj
);
367 struct TagItem
*tags
= msg
->ops_AttrList
;
370 while ((tag
= NextTagItem(&tags
)) != NULL
)
374 case MUIA_Popasl_StartHook
:
375 data
->start_hook
= (struct Hook
*)tag
->ti_Data
;
377 case MUIA_Popasl_StopHook
:
378 data
->stop_hook
= (struct Hook
*)tag
->ti_Data
;
383 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
386 IPTR
Popasl__MUIM_Cleanup(struct IClass
*cl
, Object
*obj
,
387 struct MUIP_Cleanup
*msg
)
389 struct Popasl_DATA
*data
= INST_DATA(cl
, obj
);
391 AbortAslRequest(data
->asl_req
);
392 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
395 #if ZUNE_BUILTIN_POPASL
396 BOOPSI_DISPATCHER(IPTR
, Popasl_Dispatcher
, cl
, obj
, msg
)
398 switch (msg
->MethodID
)
401 return Popasl__OM_NEW(cl
, obj
, (struct opSet
*)msg
);
403 return Popasl__OM_DISPOSE(cl
, obj
, msg
);
405 return Popasl__OM_GET(cl
, obj
, (struct opGet
*)msg
);
407 return Popasl__OM_SET(cl
, obj
, (struct opSet
*)msg
);
409 return Popasl__MUIM_Cleanup(cl
, obj
, (struct MUIP_Cleanup
*)msg
);
411 return DoSuperMethodA(cl
, obj
, msg
);
414 BOOPSI_DISPATCHER_END
416 const struct __MUIBuiltinClass _MUI_Popasl_desc
=
420 sizeof(struct Popasl_DATA
),
421 (void *) Popasl_Dispatcher
423 #endif /* ZUNE_BUILTIN_POPASL */