6 #include <exec/types.h>
7 #include <exec/alerts.h>
8 #include <exec/execbase.h>
10 #include <dos/dostags.h>
11 #include <intuition/intuition.h>
12 #include <intuition/gadgetclass.h>
13 #include <intuition/classusr.h>
14 #include <libraries/mui.h>
15 #include <mui/BetterString_mcc.h>
16 #include <libraries/asl.h>
17 #include <libraries/openurl.h> // +jmc+
18 #include <workbench/startup.h>
19 #include <scalos/scalos.h> // +jmc+
21 #include <clib/alib_protos.h>
22 #include <clib/scalos_protos.h> //+jmc+
24 #include <proto/exec.h>
25 #include <proto/dos.h>
26 #include <proto/icon.h>
27 #include <proto/intuition.h>
28 #include <proto/scalos.h> // +jmc+
29 #include <proto/graphics.h> // +jmc+
30 #include <proto/openurl.h> // +jmc+
32 #include <proto/locale.h>
33 #include <proto/utility.h>
34 #include <proto/muimaster.h>
35 #include <proto/asl.h>
42 #include <Year.h> // +jmc+
44 #include "Execute_Command.h"
46 #define Execute_Command_NUMBERS
47 #define Execute_Command_ARRAY
48 #define Execute_Command_CODE
49 #include STR(SCALOSLOCALE)
51 //----------------------------------------------------------------------------
53 #define VERSION_MAJOR 40
54 #define VERSION_MINOR 4
56 //----------------------------------------------------------------------------
58 #define Application_Return_Ok 1001
59 #define Application_Return_OpenAsl 1002
60 #define Application_Return_GetDefStack 1003
62 //----------------------------------------------------------------------------
64 #define KeyButtonHelp(name,key,HelpText)\
67 MUIA_Font, MUIV_Font_Button,\
68 MUIA_Text_Contents, name,\
69 MUIA_Text_PreParse, "\33c",\
70 MUIA_Text_HiChar , key,\
71 MUIA_ControlChar , key,\
72 MUIA_InputMode , MUIV_InputMode_RelVerify,\
73 MUIA_Background , MUII_ButtonBack,\
74 MUIA_ShortHelp , HelpText,\
75 MUIA_CycleChain , TRUE,\
78 #define CheckMarkHelp(InputMode, Selected, Image,HelpTextID, NumID)\
81 MUIA_InputMode , InputMode,\
82 MUIA_Image_Spec , Image,\
83 MUIA_Image_FreeVert , TRUE,\
84 MUIA_Background , MUII_ButtonBack,\
85 MUIA_ShowSelState , Selected,\
86 MUIA_CycleChain , TRUE,\
87 MUIA_ShortHelp , GetLocString(HelpTextID), \
88 MUIA_ExportID , NumID, \
91 //----------------------------------------------------------------------------
93 static BOOL
OpenLibraries(void);
94 static void CloseLibraries(void);
95 static void ReportError(LONG Result
, CONST_STRPTR CmdString
);
97 static LONG
ExecuteCommand(struct WBArg
*arg
);
99 static void InitCurrent(struct WBArg
*arg
); //+jmc+
100 static void WBLRequestFile(struct WBArg
*arg
); //+jmc+
102 static SAVEDS(APTR
) INTERRUPT
OpenAboutMUIHookFunc(struct Hook
*hook
, Object
*o
, Msg msg
);
103 static SAVEDS(void) INTERRUPT
OpenAboutHookFunc(struct Hook
*hook
, Object
*o
, Msg msg
);
104 static SAVEDS(void) INTERRUPT
StringMUIHookFunc(struct Hook
*hook
, Object
*o
, Msg msg
);
105 static SAVEDS(void) INTERRUPT
IntegerMUIHookFunc(struct Hook
*hook
, Object
*o
, Msg msg
);
107 static STRPTR
GetLocString(ULONG MsgId
);
108 static BOOL
CheckMCCVersion(CONST_STRPTR name
, ULONG minver
, ULONG minrev
);
109 static STRPTR
BuildConsole(STRPTR wtitle
, struct Screen
*scr
); //+jmc+
110 static void MakeAPPSleep(BOOL etat
); //+jmc+
111 static BOOL
TrackSpace(STRPTR Buffer
); //+jmc+
112 static BOOL
FindURL(STRPTR StringExec
); //+jmc+
113 static void GetDefStack(void); //+jmc+
114 BPTR
DupWBPathList(void); //+jmc+
115 static void SaveToEnv(void); //+jmc+
117 //----------------------------------------------------------------------------
119 #if !defined(__AROS__) && !defined(__amigaos4__)
122 long _stack
= 16384; // minimum stack size, used by SAS/C startup code
125 //----------------------------------------------------------------------------
127 extern struct ExecBase
*SysBase
;
128 struct IntuitionBase
*IntuitionBase
= NULL
;
129 T_LOCALEBASE LocaleBase
= NULL
;
131 T_UTILITYBASE UtilityBase
= NULL
;
133 struct Library
*MUIMasterBase
= NULL
;
134 struct ScalosBase
*ScalosBase
= NULL
; //+jmc+
137 struct IntuitionIFace
*IIntuition
= NULL
;
138 struct LocaleIFace
*ILocale
= NULL
;
139 struct MUIMasterIFace
*IMUIMaster
= NULL
;
140 struct ScalosIFace
*IScalos
= NULL
;
143 static struct Catalog
*gb_Catalog
;
145 static struct Hook AboutHook
= { { NULL
, NULL
}, HOOKFUNC_DEF(OpenAboutHookFunc
), NULL
};
146 static struct Hook AboutMUIHook
= { { NULL
, NULL
}, HOOKFUNC_DEF(OpenAboutMUIHookFunc
), NULL
};
147 static struct Hook StringMUIHook
= { { NULL
, NULL
}, HOOKFUNC_DEF(StringMUIHookFunc
), NULL
}; //+jmc+
148 static struct Hook IntegerMUIHook
= { { NULL
, NULL
}, HOOKFUNC_DEF(IntegerMUIHookFunc
), NULL
}; //+jmc+
150 static struct Screen
*scr
; //+jmc+
152 //----------------------------------------------------------------------------
154 static Object
*Group_Buttons2
;
155 static Object
*APP_Main
;
156 static Object
*WIN_Main
;
157 static Object
*WIN_AboutMUI
;
158 static Object
*OkButton
, *CancelButton
;
159 static Object
*MenuAbout
, *MenuAboutMUI
, *MenuQuit
;
160 static Object
*TextEnterCommand
;
161 static Object
*PopAslCommand
;
162 static Object
*StringName
; // +jmc+ String gadget replacing PopaslObject.
163 static Object
*TextEnterName
; // +jmc+ TextObject for Current dir.
164 static Object
*CheckQuit
; // +jmc+ CheckMark to quit or notafter execute command finished.
165 static Object
*Group_Virtual
; //+jmc+ To switch 0/1 "MUIA_ShowMe" the ScroolGroupObject group.
166 static Object
*StringStack
; //+jmc+ Stack integer
167 static Object
*GetStack
; //+jmc+ Get default stack button
168 static BOOL Run
= TRUE
;
169 static BOOL Success
= FALSE
;
170 static ULONG stackNum
; //+jmc+
171 static ULONG oldstackNum
=0; //+jmc+
172 static ULONG PrevInteger
; //+jmc+
174 //----------------------------------------------------------------------------
176 int main(int argc
, char *argv
[])
179 struct WBStartup
*WBenchMsg
=
180 (argc
== 0) ? (struct WBStartup
*)argv
: NULL
;
187 // kprintf("NumArgs=%ld\n", WBenchMsg->sm_NumArgs);
189 for (n
=0; n
<WBenchMsg
->sm_NumArgs
; n
++)
193 NameFromLock(WBenchMsg
->sm_ArgList
[n
].wa_Lock
, xName
, sizeof(xName
));
195 // kprintf("%ld. Lock=<%s> Name=<%s>\n", n, xName, WBenchMsg->sm_ArgList[n].wa_Name);
200 if (NULL
== WBenchMsg
)
205 if (WBenchMsg
->sm_NumArgs
< 2)
212 ULONG QuitSelected
= 0;
213 ULONG StackSelected
= 0;
215 struct WBArg
*arg
= &WBenchMsg
->sm_ArgList
[1];
217 d1(KPrintF(__FILE__
"/%s/%ld: \n", __FUNC__
, __LINE__
));
219 if (!OpenLibraries())
222 d1(KPrintF(__FILE__
"/%s/%ld: \n", __FUNC__
, __LINE__
));
224 if (!CheckMCCVersion(MUIC_BetterString
, 11, 0))
227 d1(KPrintF(__FILE__
"/%s/%ld: \n", __FUNC__
, __LINE__
));
231 d1(KPrintF(__FILE__
"/%s/%ld: \n", __FUNC__
, __LINE__
));
233 gb_Catalog
= OpenCatalogA(NULL
, "Scalos/Execute_Command.catalog",NULL
);
235 d1(KPrintF(__FILE__
"/%s/%ld: \n", __FUNC__
, __LINE__
));
237 APP_Main
= ApplicationObject
,
238 MUIA_Application_Title
, GetLocString(MSGID_TITLENAME
),
239 MUIA_Application_Version
, "$VER: Scalos Execute_Command.module V40.5 (" __DATE__
") " COMPILER_STRING
,
240 MUIA_Application_Copyright
, "© The Scalos Team, 2004" CURRENTYEAR
,
241 MUIA_Application_Author
, "The Scalos Team",
242 MUIA_Application_Description
, "Scalos Execute_Command module",
243 MUIA_Application_Base
, "SCALOS_EXECUTE_COMMAND",
245 SubWindow
, WIN_Main
= WindowObject
,
246 MUIA_Window_Title
, GetLocString(MSGID_TITLENAME
),
247 // MUIA_Window_ID, MAKE_ID('M','A','I','N'),
248 MUIA_Window_AppWindow
, TRUE
,
249 MUIA_Window_UseBottomBorderScroller
, TRUE
, // +jmc+
251 MUIA_Window_TopEdge
, MUIV_Window_TopEdge_Moused
,
252 MUIA_Window_LeftEdge
, MUIV_Window_LeftEdge_Moused
,
254 MUIA_Window_Width
, MUIV_Window_Width_Screen(30), //+jmc+
256 WindowContents
, VGroup
,
257 Child
, GroupObject
, // +jmc+
258 Child
, Group_Virtual
= ScrollgroupObject
,
259 MUIA_Scrollgroup_VertBar
, NULL
,
260 MUIA_Scrollgroup_HorizBar
, NULL
,
261 MUIA_Scrollgroup_FreeHoriz
, TRUE
,
262 MUIA_Scrollgroup_FreeVert
, FALSE
,
263 MUIA_Scrollgroup_UseWinBorder
, TRUE
,
264 MUIA_Scrollgroup_Contents
,
266 Child
, TextEnterName
= TextObject
,
267 MUIA_Text_PreParse
, MUIX_C
,
268 MUIA_ShortHelp
, GetLocString(MSGID_CURRENTDIR_SHORTHELP
),
270 End
, //VirtgroupObject
271 End
, //ScrollgroupObject
275 Child
, TextEnterCommand
= TextObject
,
276 MUIA_Text_PreParse
, MUIX_C
,
277 MUIA_Text_Contents
, GetLocString(MSGID_TEXT_ENTER_COMMAND
),
282 Child
, HGroup
, MUIA_Group_Spacing
, 0,
283 Child
, Label1(GetLocString(MSGID_LABEL_COMMAND
)),
284 Child
, StringName
= BetterStringObject
,
286 MUIA_String_Contents
, "",
287 MUIA_CycleChain
, TRUE
,
289 End
, //BetterStringObject
290 Child
, PopAslCommand
= CheckMarkHelp(MUIV_InputMode_RelVerify
, TRUE
,\
292 MSGID_ASL_REQUESTER_SHORTHELP
, NULL
),
297 Child
, RectangleObject
,
299 Child
, Label1(GetLocString(MSGID_LABEL_STACK
)),
300 Child
, HGroup
, MUIA_Group_Spacing
, 0,
301 Child
, StringStack
= BetterStringObject
, StringFrame
,
302 MUIA_String_Integer
, stackNum
,
303 MUIA_String_Accept
, "0123456789",
304 MUIA_String_Format
, MUIV_String_Format_Center
,
305 MUIA_CycleChain
, TRUE
,
306 End
, // BetterStringObject
307 Child
, GetStack
= CheckMarkHelp(MUIV_InputMode_Toggle
, FALSE
,\
309 MSGID_GET_DEFSTACK_SHORTHELP
, NULL
),
313 Child
, Label1(GetLocString(MSGID_LABEL_CHECKQUIT
)),
314 Child
, CheckQuit
= CheckMarkHelp(MUIV_InputMode_Toggle
, FALSE
,\
316 MSGID_CHECKQUIT_SHORTHELP
,2),
319 Child
, RectangleObject
,
323 Child
, Group_Buttons2
= HGroup
,
324 MUIA_Group_SameWidth
, TRUE
,
325 Child
, OkButton
= KeyButtonHelp(GetLocString(MSGID_OKBUTTON
),
326 *GetLocString(MSGID_OKBUTTON_SHORT
), GetLocString(MSGID_SHORTHELP_OKBUTTON
)),
327 Child
, CancelButton
= KeyButtonHelp(GetLocString(MSGID_CANCELBUTTON
),
328 *GetLocString(MSGID_CANCELBUTTON_SHORT
), GetLocString(MSGID_SHORTHELP_CANCELBUTTON
)),
334 MUIA_Application_Menustrip
, MenustripObject
,
335 Child
, MenuObjectT(GetLocString(MSGID_MENU_PROJECT
)),
337 Child
, MenuAbout
= MenuitemObject
,
338 MUIA_Menuitem_Title
, GetLocString(MSGID_MENU_PROJECT_ABOUT
),
340 Child
, MenuAboutMUI
= MenuitemObject
,
341 MUIA_Menuitem_Title
, GetLocString(MSGID_MENU_PROJECT_ABOUTMUI
),
343 Child
, MenuitemObject
,
344 MUIA_Menuitem_Title
, -1,
346 Child
, MenuQuit
= MenuitemObject
,
347 MUIA_Menuitem_Title
, GetLocString(MSGID_MENU_PROJECT_QUIT
),
348 MUIA_Menuitem_Shortcut
, GetLocString(MSGID_MENU_PROJECT_QUIT_SHORT
),
352 End
, //MenuStripObject
354 End
; //ApplicationObject
356 d1(KPrintF(__FILE__
"/%s/%ld: \n", __FUNC__
, __LINE__
));
358 if (NULL
== APP_Main
)
360 printf(GetLocString(MSGID_CREATE_APPLICATION_FAILED
));
364 DoMethod(WIN_Main
, MUIM_Notify
, MUIA_Window_CloseRequest
, TRUE
,
365 WIN_Main
, 3, MUIM_Set
, MUIA_Window_Open
, FALSE
);
367 DoMethod(WIN_Main
, MUIM_Notify
, MUIA_Window_CloseRequest
, TRUE
,
368 APP_Main
, 2, MUIM_Application_ReturnID
, MUIV_Application_ReturnID_Quit
);
371 DoMethod(CancelButton
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
372 APP_Main
, 2, MUIM_Application_ReturnID
, MUIV_Application_ReturnID_Quit
);
374 DoMethod(OkButton
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
375 APP_Main
, 2, MUIM_Application_ReturnID
, Application_Return_Ok
);
377 DoMethod(PopAslCommand
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
378 APP_Main
, 2, MUIM_Application_ReturnID
, Application_Return_OpenAsl
);
381 DoMethod(StringName
, MUIM_Notify
, MUIA_String_Acknowledge
, MUIV_EveryTime
,
382 APP_Main
, 2, MUIM_Application_ReturnID
, Application_Return_Ok
);
384 DoMethod(StringStack
, MUIM_Notify
, MUIA_String_Acknowledge
, MUIV_EveryTime
,
385 APP_Main
, 2, MUIM_Application_ReturnID
, Application_Return_GetDefStack
);
388 DoMethod(CheckQuit
, MUIM_Notify
, MUIA_Selected
, MUIV_EveryTime
,
389 WIN_Main
, 3, MUIM_Set
, MUIA_Window_ActiveObject
, StringName
);
391 DoMethod(GetStack
, MUIM_Notify
, MUIA_Selected
, MUIV_EveryTime
,
392 APP_Main
, 3, MUIM_Application_ReturnID
, Application_Return_GetDefStack
);
395 DoMethod(StringName
, MUIM_Notify
, MUIA_String_Contents
, MUIV_EveryTime
,
396 StringName
, 3, MUIM_CallHook
, &StringMUIHook
);
398 DoMethod(StringStack
, MUIM_Notify
, MUIA_String_Acknowledge
, MUIV_EveryTime
,
399 StringStack
, 2, MUIM_CallHook
, &IntegerMUIHook
);
401 DoMethod(MenuAbout
, MUIM_Notify
, MUIA_Menuitem_Trigger
, MUIV_EveryTime
,
402 APP_Main
, 2, MUIM_CallHook
, &AboutHook
);
404 DoMethod(MenuAboutMUI
, MUIM_Notify
, MUIA_Menuitem_Trigger
, MUIV_EveryTime
,
405 APP_Main
, 2, MUIM_CallHook
, &AboutMUIHook
);
407 DoMethod(MenuQuit
, MUIM_Notify
,MUIA_Menuitem_Trigger
,MUIV_EveryTime
,
408 APP_Main
, 2, MUIM_Application_ReturnID
, MUIV_Application_ReturnID_Quit
);
411 set(WIN_Main
, MUIA_Window_ActiveObject
, StringName
);
413 set(GetStack
, MUIA_Selected
, TRUE
);
415 // Loading of MUI objects ID settings.
416 DoMethod(APP_Main
, MUIM_Application_Load
,MUIV_Application_Load_ENV
);
420 set(WIN_Main
, MUIA_Window_Open
, TRUE
);
421 get(WIN_Main
, MUIA_Window_Open
, &win_opened
);
425 printf(GetLocString(MSGID_CREATE_MAINWINDOW_FAILED
));
429 d1(KPrintF(__FILE__
"/" __FUNC__
"/%ld: \n", __LINE__
));
433 ULONG Action
= DoMethod(APP_Main
, MUIM_Application_NewInput
, &sigs
);
437 case Application_Return_Ok
:
438 ExecuteCommand(&WBenchMsg
->sm_ArgList
[1]);
440 get(CheckQuit
, MUIA_Selected
, &QuitSelected
);
444 case Application_Return_OpenAsl
:
445 set(Group_Virtual
, MUIA_ShowMe
, 0);
447 set(Group_Virtual
, MUIA_ShowMe
, 1);
451 get(CheckQuit
, MUIA_Selected
, &QuitSelected
);
452 // kprintf("QuitSelected= [%ld] Success=[%ld]\n", QuitSelected, Success);
457 case Application_Return_GetDefStack
:
459 // kprintf("Selected: oldstackNum =[ %ld ] stackNum=[ %ld ]\n", oldstackNum, stackNum);
460 get(GetStack
, MUIA_Selected
, &StackSelected
);
461 if(oldstackNum
>=stackNum
)
465 set(StringStack
, MUIA_String_Integer
, stackNum
);
466 set(StringStack
, MUIA_Disabled
, TRUE
);
470 set(StringStack
, MUIA_Disabled
, FALSE
);
471 set(StringStack
, MUIA_String_Integer
, oldstackNum
);
472 set(WIN_Main
, MUIA_Window_ActiveObject
, StringStack
);
477 set(StringStack
, MUIA_String_Integer
, stackNum
);
478 set(StringStack
, MUIA_Disabled
, TRUE
);
479 oldstackNum
=stackNum
;
481 // kprintf("oldstackNum =[ %ld ] stackNum=[ %ld ]\n", oldstackNum, stackNum);
483 case MUIV_Application_ReturnID_Quit
:
490 sigs
= Wait(sigs
| SIGBREAKF_CTRL_C
);
492 if (sigs
& SIGBREAKF_CTRL_C
)
500 set(WIN_Main
, MUIA_Window_Open
, FALSE
);
503 MUI_DisposeObject(APP_Main
);
505 CloseCatalog(gb_Catalog
);
512 //----------------------------------------------------------------------------
514 // Export all IDs of MUI objects to ENV:MUI.
515 // Availlable for "Application_Return_Ok" and "Application_Return_OpenAsl",
517 static void SaveToEnv(void)
519 DoMethod(APP_Main
, MUIM_Application_Save
,MUIV_Application_Save_ENV
);
522 //----------------------------------------------------------------------------
524 static BOOL
OpenLibraries(void)
526 ScalosBase
= (struct ScalosBase
*) OpenLibrary("scalos.library", 40);
527 if (NULL
== ScalosBase
)
530 IScalos
= (struct ScalosIFace
*)GetInterface((struct Library
*)ScalosBase
, "main", 1, NULL
);
535 MUIMasterBase
= OpenLibrary(MUIMASTER_NAME
, MUIMASTER_VMIN
-1);
536 if (NULL
== MUIMasterBase
)
539 IMUIMaster
= (struct MUIMasterIFace
*)GetInterface((struct Library
*)MUIMasterBase
, "main", 1, NULL
);
540 kprintf("MUIMasterBase = %lx, IMUIMaster = %lx\n", MUIMasterBase
, IMUIMaster
);
541 if (NULL
== IMUIMaster
)
546 IntuitionBase
= (struct IntuitionBase
*) OpenLibrary("intuition.library", 39);
547 if (NULL
== IntuitionBase
)
550 IIntuition
= (struct IntuitionIFace
*)GetInterface((struct Library
*)IntuitionBase
, "main", 1, NULL
);
551 if (NULL
== IIntuition
)
555 LocaleBase
= (T_LOCALEBASE
) OpenLibrary("locale.library", 38);
556 if (NULL
== LocaleBase
)
559 ILocale
= (struct LocaleIFace
*)GetInterface((struct Library
*)LocaleBase
, "main", 1, NULL
);
565 UtilityBase
= (T_UTILITYBASE
) OpenLibrary("utility.library", 39);
566 if (NULL
== UtilityBase
)
573 //----------------------------------------------------------------------------
575 static void CloseLibraries(void)
580 CloseLibrary((struct Library
*) UtilityBase
);
587 DropInterface((struct Interface
*)ILocale
);
593 CloseLibrary((struct Library
*) LocaleBase
);
599 DropInterface((struct Interface
*)IIntuition
);
605 CloseLibrary((struct Library
*)IntuitionBase
);
606 IntuitionBase
= NULL
;
611 DropInterface((struct Interface
*)IMUIMaster
);
617 CloseLibrary(MUIMasterBase
);
618 MUIMasterBase
= NULL
;
623 DropInterface((struct Interface
*)IScalos
);
629 CloseLibrary(&ScalosBase
->scb_LibNode
);
634 //----------------------------------------------------------------------------
636 static void ReportError(LONG Result
, CONST_STRPTR CmdString
)
640 Fault(Result
, "", FaultText
, sizeof(FaultText
));
642 MUI_Request(APP_Main
, WIN_Main
, 0, NULL
,
643 GetLocString(MSGID_REQ_OK
),
644 GetLocString(MSGID_ERRORREQ_BODYTEXT
),
645 CmdString
, FaultText
);
648 //----------------------------------------------------------------------------
650 static void MakeAPPSleep(BOOL etat
)
652 set(APP_Main
, MUIA_Application_Sleep
, etat
);
656 //----------------------------------------------------------------------------
658 static void GetDefStack(void)
660 SCA_ScalosControl(NULL
,
661 SCALOSCTRLA_GetDefaultStackSize
, (ULONG
) &stackNum
,
665 //----------------------------------------------------------------------------
667 static void InitCurrent(struct WBArg
*arg
)
672 STRPTR LastContent
= NULL
;
674 NameFromLock(arg
->wa_Lock
, xName
, sizeof(xName
));
675 sprintf(LabelText
, GetLocString(MSGID_CURRENTDIR
), xName
);
677 set(TextEnterName
, MUIA_Text_Contents
, LabelText
);
679 if (arg
->wa_Name
&& strlen(arg
->wa_Name
) > 0)
683 if ( Space
= TrackSpace(arg
->wa_Name
) )
684 sprintf(SpaceName
, "\"%s\"", arg
->wa_Name
);
686 stccpy(SpaceName
, arg
->wa_Name
, sizeof(SpaceName
));
688 set(StringName
, MUIA_String_Contents
, SpaceName
);
689 set(StringName
, MUIA_String_BufferPos
, 0);
693 get(StringName
, MUIA_String_Contents
, &LastContent
);
694 // stccpy(SpaceName, LastContent, sizeof(SpaceName));
695 // if(strlen(SpaceName) == 0)
696 if(strlen(LastContent
) == 0)
697 set(OkButton
, MUIA_Disabled
, TRUE
);
702 //----------------------------------------------------------------------------
704 static LONG
ExecuteCommand(struct WBArg
*arg
)
706 STRPTR CommandString
= NULL
;
707 STRPTR StackDisabled
= NULL
;
709 LONG Result
= RETURN_OK
;
710 STRPTR conDef
= "CON:////Execute_Command/AUTO/CLOSE/WAIT";
715 get(StringStack
, MUIA_Disabled
, &StackDisabled
);
717 set(StringStack
, MUIA_String_Acknowledge
, TRUE
);
720 PrevInteger
= oldstackNum
;
721 oldstackNum
= stackNum
;
724 if(oldstackNum
>stackNum
)
725 stackNum
= oldstackNum
;
727 get(StringName
, MUIA_String_Contents
, &CommandString
);
729 if ( GetUrl
= FindURL(CommandString
) )
731 struct Library
*OpenURLBase
;
733 struct OpenURLIFace
*IOpenURL
;
736 OpenURLBase
= OpenLibrary(OPENURLNAME
, 3);
738 IOpenURL
= (struct OpenURLIFace
*)GetInterface(OpenURLBase
, "main", 1, NULL
);
739 if (NULL
== IOpenURL
)
741 CloseLibrary(OpenURLBase
);
745 if (NULL
!= OpenURLBase
)
747 URL_Open(CommandString
,
753 DropInterface((struct Interface
*)IOpenURL
);
755 CloseLibrary(OpenURLBase
);
758 printf(GetLocString(MSGID_OPEN_LIBRARY_FAILED
), OPENURLNAME
);
762 oldDir
= CurrentDir(arg
->wa_Lock
);
764 if(scr
= LockPubScreen(NULL
))
767 BOOL ConBuilt
= TRUE
;
769 conName
= BuildConsole(GetLocString(MSGID_CONSOLE_NAME
),scr
);
777 Result
= SystemTags(CommandString
,
780 SYS_Input
, Open(conName
,MODE_OLDFILE
),
782 NP_StackSize
, stackNum
,
783 NP_Path
, DupWBPathList(),
789 // kprintf("ConBuilt=[ %ld ] - stackNum=[ %ld ] oldstackNum=[ %ld ]\n", ConBuilt, stackNum, oldstackNum);
791 if (RETURN_OK
!= Result
)
792 ReportError(Result
, CommandString
);
796 UnlockPubScreen(NULL
,scr
);
798 oldstackNum
= PrevInteger
;
804 //----------------------------------------------------------------------------
806 static BOOL
FindURL(STRPTR StringExec
)
808 BOOL URLFound
= FALSE
;
810 if ( (strnicmp("HTTP://",StringExec
,7) == 0) || (strnicmp("FILE://",StringExec
,7) == 0)
811 || (strnicmp("FTP://",StringExec
,6) == 0) || (strnicmp("MAILTO:",StringExec
,7) == 0) )
817 //----------------------------------------------------------------------------
819 static STRPTR
BuildConsole(STRPTR wtitle
, struct Screen
*scr
)
821 const STATIC STRPTR fmt
= "CON:%ld/%ld/%ld/%ld/%s/AUTO/CLOSE/WAIT";
823 STRPTR buf
= (STRPTR
)AllocVec( strlen(fmt
)+strlen(wtitle
)+40,0 );
833 struct Rectangle rect
;
834 if(QueryOverscan(GetVPModeID( &scr
->ViewPort
), &rect
, OSCAN_TEXT
))
836 height
= rect
.MaxY
- rect
.MinY
+ 1;
837 width
= rect
.MaxX
- rect
.MinX
+ 1;
841 height
= scr
->Height
;
844 height
= height
*25/100;
846 width
= (width
*75/100)-((scr
->BarHeight
*2)*75/100);
848 left
= (scr
->Width
/2)-(width
/2)-scr
->BarHeight
;
852 if( top
<= scr
->BarHeight
)
853 top
= scr
->BarHeight
+ 1;
856 sprintf(buf
, fmt
, left
, top
, width
, height
, wtitle
);
857 // kprintf("buf=<%s>\nLeft=<%ld>\nTop=<%ld>\nWidth=<%ld>\nHeight=<%ld>\nWtitle=<%s>\n\n", buf, left, top, width, height, wtitle);
862 //----------------------------------------------------------------------------
864 static STRPTR
GetLocString(ULONG MsgId
)
866 struct Execute_Command_LocaleInfo li
;
868 li
.li_Catalog
= gb_Catalog
;
870 li
.li_LocaleBase
= LocaleBase
;
872 li
.li_ILocale
= ILocale
;
875 return (STRPTR
)GetExecute_CommandString(&li
, MsgId
);
879 static void TranslateStringArray(STRPTR *stringArray)
883 *stringArray = GetLocString((ULONG) *stringArray);
888 //----------------------------------------------------------------------------
890 static void WBLRequestFile(struct WBArg
*arg
)
893 char SpacePath
[1024];
894 struct FileRequester
*fileReq
= NULL
;
900 if (!NameFromLock(arg
->wa_Lock
, Path
, sizeof(Path
)))
903 if (arg
->wa_Name
&& strlen(arg
->wa_Name
) > 0)
904 FileName
= arg
->wa_Name
;
909 fileReq
= AllocAslRequestTags(ASL_FileRequest
,
910 ASLFR_TitleText
, (ULONG
) GetLocString(MSGID_COMMAND_ASLTITLE
),
911 ASLFR_DoSaveMode
, FALSE
,
912 ASLFR_RejectIcons
, FALSE
,
918 MakeAPPSleep(TRUE
); // APP_Main Sleep
921 if (AslRequestTags(fileReq
,
922 ASLFR_InitialFile
, (ULONG
) FileName
,
923 ASLFR_InitialDrawer
, (ULONG
) Path
,
929 MakeAPPSleep(FALSE
); // APP_Main Sleep
938 dirLock
= Lock(fileReq
->fr_Drawer
, ACCESS_READ
);
939 if ((BPTR
)NULL
== dirLock
)
944 NameFromLock(dirLock
, Path
, sizeof(Path
));
945 sprintf(LabelText
, GetLocString(MSGID_CURRENTDIR
), Path
);
946 stccpy(xName
, fileReq
->fr_File
, sizeof(xName
));
948 if (strlen(xName
) > 0)
950 AddPart(Path
, xName
, sizeof(xName
));
953 set(TextEnterName
, MUIA_Text_Contents
, LabelText
);
955 if ( Space
= TrackSpace(Path
) )
957 sprintf(SpacePath
, "\"%s\"", Path
);
958 set(StringName
, MUIA_String_Contents
, SpacePath
);
959 // kprintf("Space [%ld] - SpacePath=<%s>\n", Space, SpacePath);
963 set(StringName
, MUIA_String_Contents
, Path
);
966 UnLock(arg
->wa_Lock
);
967 arg
->wa_Lock
= dirLock
;
975 FreeAslRequest(fileReq
);
979 //----------------------------------------------------------------------
981 static BOOL
TrackSpace(STRPTR Buffer
)
983 BOOL FindSpace
= FALSE
;
988 if (Buffer
[i
] == ' ')
995 // kprintf("Lenght = [%ld] - Find Space = [%ld]\n", i, FindSpace);
999 //-------- DupWBPathList() - From in CliStart.c --------------------------
1001 BPTR
DupWBPathList(void)
1003 struct Process
*wbProc
;
1004 struct CommandLineInterface
*cli
;
1005 struct AssignList
*aList
, *StartList
= NULL
, **nList
= NULL
;
1008 wbProc
= (struct Process
*) FindTask("Workbench");
1013 if (NT_PROCESS
!= wbProc
->pr_Task
.tc_Node
.ln_Type
)
1016 cli
= BADDR(wbProc
->pr_CLI
);
1020 aList
= BADDR(cli
->cli_CommandDir
);
1026 struct AssignList
*nNode
= AllocVec(sizeof(struct AssignList
), MEMF_PUBLIC
);
1033 *nList
= (struct AssignList
*) MKBADDR(nNode
);
1035 nNode
->al_Next
= NULL
;
1036 nNode
->al_Lock
= DupLock(aList
->al_Lock
);
1037 nList
= &nNode
->al_Next
;
1039 d1(kprintf(__FILE__
"/" __FUNC__
"/%ld: aList=%08lx Next=%08lx Lock=%08lx\n", __LINE__
, \
1040 aList
, aList
->al_Next
, aList
->al_Lock
));
1042 aList
= BADDR(aList
->al_Next
);
1045 return MKBADDR(StartList
);
1048 //----------------------------------------------------------------------------
1050 static SAVEDS(APTR
) INTERRUPT
OpenAboutMUIHookFunc(struct Hook
*hook
, Object
*o
, Msg msg
)
1052 if (NULL
== WIN_AboutMUI
)
1054 WIN_AboutMUI
= MUI_NewObject(MUIC_Aboutmui
,
1055 MUIA_Window_RefWindow
, WIN_Main
,
1056 MUIA_Aboutmui_Application
, APP_Main
,
1061 set(WIN_AboutMUI
, MUIA_Window_Open
, TRUE
);
1066 //----------------------------------------------------------------------------
1068 static SAVEDS(void) INTERRUPT
OpenAboutHookFunc(struct Hook
*hook
, Object
*o
, Msg msg
)
1070 MUI_Request(APP_Main
, WIN_Main
, 0, NULL
,
1071 GetLocString(MSGID_ABOUTREQOK
),
1072 GetLocString(MSGID_ABOUTREQFORMAT
),
1073 VERSION_MAJOR
, VERSION_MINOR
, COMPILER_STRING
, CURRENTYEAR
);
1076 //----------------------------------------------------------------------------
1078 static SAVEDS(void) INTERRUPT
StringMUIHookFunc(struct Hook
*hook
, Object
*o
, Msg msg
)
1080 STRPTR defstring
= NULL
;
1082 get(StringName
, MUIA_String_Contents
, &defstring
);
1083 if(defstring
&& strlen(defstring
) > 0)
1084 set(OkButton
, MUIA_Disabled
, FALSE
);
1086 set(OkButton
, MUIA_Disabled
, TRUE
);
1089 //----------------------------------------------------------------------------
1091 static SAVEDS(void) INTERRUPT
IntegerMUIHookFunc(struct Hook
*hook
, Object
*o
, Msg msg
)
1093 get(StringStack
, MUIA_String_Integer
, &PrevInteger
);
1094 if(PrevInteger
<stackNum
)
1095 set(GetStack
, MUIA_Selected
, TRUE
);
1097 oldstackNum
= PrevInteger
;
1099 // kprintf("Acknowledge: oldstackNum =[ %ld ] stackNum=[ %ld ] PrevInteger= [ %ld ]\n", oldstackNum, stackNum, PrevInteger);
1102 //-----------------------------------------------------------------------------
1104 // Checks if a certain version of a MCC is available
1105 static BOOL
CheckMCCVersion(CONST_STRPTR name
, ULONG minver
, ULONG minrev
)
1109 d1(kprintf(__FILE__
"/%s/%ld: %s\n", __FUNC__
, __LINE__
, name
);)
1115 struct Library
*base
;
1119 d1(kprintf(__FILE__
"/%s/%ld: MUIMasterBase=%lx IMUIMaster=%lx\n",
1120 __FUNC__
, __LINE__
, MUIMasterBase
, IMUIMaster
));
1121 // First we attempt to acquire the version and revision through MUI
1122 obj
= MUI_NewObjectA((STRPTR
) name
, NULL
);
1123 d1(kprintf(__FILE__
"/%s/%ld: \n", __FUNC__
, __LINE__
);)
1126 get(obj
, MUIA_Version
, &ver
);
1127 get(obj
, MUIA_Revision
, &rev
);
1129 d1(kprintf(__FILE__
"/%s/%ld: \n", __FUNC__
, __LINE__
);)
1131 MUI_DisposeObject(obj
);
1133 if(ver
> minver
|| (ver
== minver
&& rev
>= minrev
))
1135 d1(kprintf(__FILE__
"/%s/%ld: v%ld.%ld found through MUIA_Version/Revision\n", __FUNC__
, __LINE__
, ver
, rev
);)
1140 // If we did't get the version we wanted, let's try to open the
1141 // libraries ourselves and see what happens...
1142 stccpy(libname
, "PROGDIR:mui", sizeof(libname
));
1143 AddPart(libname
, name
, sizeof(libname
));
1145 d1(kprintf(__FILE__
"/%s/%ld: \n", __FUNC__
, __LINE__
);)
1147 if ((base
= OpenLibrary(&libname
[8], 0)) || (base
= OpenLibrary(&libname
[0], 0)))
1149 UWORD OpenCnt
= base
->lib_OpenCnt
;
1151 d1(kprintf(__FILE__
"/%s/%ld: \n", __FUNC__
, __LINE__
);)
1153 ver
= base
->lib_Version
;
1154 rev
= base
->lib_Revision
;
1158 // we add some additional check here so that eventual broken .mcc also have
1159 // a chance to pass this test (i.e. Toolbar.mcc is broken)
1160 if (ver
> minver
|| (ver
== minver
&& rev
>= minrev
))
1162 d1(kprintf(__FILE__
"/%s/%ld: v%ld.%ld found through OpenLibrary()\n", __FUNC__
, __LINE__
, ver
, rev
);)
1168 if (MUI_Request(NULL
, NULL
, 0L, GetLocString(MSGID_STARTUP_FAILURE
),
1169 GetLocString(MSGID_STARTUP_RETRY_QUIT_GAD
), GetLocString(MSGID_STARTUP_MCC_IN_USE
),
1170 name
, minver
, minrev
, ver
, rev
))
1178 // Attempt to flush the library if open count is 0 or because the
1179 // user wants to retry (meaning there's a chance that it's 0 now)
1183 struct Library
*result
;
1186 if ((result
= (struct Library
*) FindName(&((struct ExecBase
*)SysBase
)->LibList
, name
)))
1193 d1(kprintf(__FILE__
"/" __FUNC__
"/%ld: couldn`t find minimum required version.\n", __LINE__
);)
1195 // We're out of luck - open count is 0, we've tried to flush
1196 // and still haven't got the version we want
1197 if (MUI_Request(NULL
, NULL
, 0L, GetLocString(MSGID_STARTUP_FAILURE
),
1198 GetLocString(MSGID_STARTUP_RETRY_QUIT_GAD
), GetLocString(MSGID_STARTUP_OLD_MCC
),
1199 name
, minver
, minrev
, ver
, rev
))
1209 d1(kprintf(__FILE__
"/%s/%ld: \n", __FUNC__
, __LINE__
);)
1211 // No MCC at all - no need to attempt flush
1213 if (!MUI_Request(NULL
, NULL
, 0L, GetLocString(MSGID_STARTUP_FAILURE
),
1214 GetLocString(MSGID_STARTUP_RETRY_QUIT_GAD
), GetLocString(MSGID_STARTUP_MCC_NOT_FOUND
),
1215 name
, minver
, minrev
))
1225 //----------------------------------------------------------------------------