212 lines
5.3 KiB
HolyC
212 lines
5.3 KiB
HolyC
#define SYSSTART_MSG_NULL 0
|
|
#define SYSSTART_MSG_SPAWN 1
|
|
#define SYSSTART_MSG_KILL 2
|
|
|
|
class @systemtask
|
|
{
|
|
U8* path;
|
|
U8* name;
|
|
};
|
|
|
|
class @systemstarter
|
|
{
|
|
CTask* task;
|
|
U0 (*CreateTask)(U8* path, U8* name);
|
|
U0 (*Init)();
|
|
U0 (*Spawn)(U8* path, U8* name);
|
|
U0 (*Task)();
|
|
};
|
|
|
|
@systemstarter SystemStarter;
|
|
|
|
U32 @systemstarter_ext(U8* path)
|
|
{
|
|
U32 res = NULL;
|
|
U8* ext = FileSystem.GetFileExtension(path);
|
|
MemCpy(&res, ext, StrLen(ext));
|
|
return res;
|
|
}
|
|
|
|
U0 @systemstarter_init() { }
|
|
|
|
I64 @systemstarter_open(@shell* sh, I64 argc, U8** argv)
|
|
{
|
|
U8 buf[512];
|
|
U8* path = @shell_expand_relative_path(sh, argv[1]);
|
|
if (!FileSystem.PathExists(path)) {
|
|
Stdio.WriteLine(sh, "error: path does not exist: ");
|
|
Stdio.WriteLine(sh, path);
|
|
Stdio.WriteLine(sh, "\n");
|
|
Free(path);
|
|
return 1;
|
|
}
|
|
|
|
switch (@systemstarter_ext(path)) {
|
|
case 'app':
|
|
StrCpy(&buf, "");
|
|
String.Append(&buf, "I64 @exe_doc_buf_size = NULL; ");
|
|
String.Append(&buf,
|
|
"U8 *@exe_doc_buf = FileSystem.ReadFile(\"%s/Run.HC\", "
|
|
"&@exe_doc_buf_size); ",
|
|
path);
|
|
String.Append(&buf, "ExePutS(@exe_doc_buf); ");
|
|
String.Append(&buf, "Free(@exe_doc_buf); ");
|
|
// System.Log(Fs, &buf);
|
|
CTask* task = User;
|
|
TaskExe(task, NULL, "Raw(ON);\n", 0);
|
|
TaskExe(task, NULL, &buf, 0);
|
|
return 0;
|
|
break;
|
|
default:
|
|
Stdio.WriteLine(sh, "error: unknown or unsupported file type.\n");
|
|
// Free(path);
|
|
return 1;
|
|
break;
|
|
};
|
|
}
|
|
|
|
U0 @systemstarter_spawn(U8* path, U8* name)
|
|
{
|
|
CTask* task = Spawn(&UserCmdLine);
|
|
U8 change_path_str[512];
|
|
StrPrint(task->task_name, name);
|
|
StrPrint(change_path_str, "Cd(\"%s\");\n", path);
|
|
TaskExe(task, NULL, "Raw(ON);\n", 0);
|
|
TaskExe(task, NULL, change_path_str, 0);
|
|
TaskExe(task, NULL, "ExeFile(\"Run.HC\");\n", 0);
|
|
}
|
|
|
|
U0 @systemstarter_load_applets()
|
|
{
|
|
U8 applet_name[512];
|
|
CDirEntry* de = FilesFind("M:/Applets/*.applet");
|
|
CDirEntry* tmpde = de;
|
|
while (tmpde) {
|
|
StrCpy(&applet_name, StrLastOcc(tmpde->full_name, "/") + 1);
|
|
*(StrFirstOcc(&applet_name, ".")) = NULL;
|
|
SystemStarter.Spawn(tmpde->full_name, &applet_name);
|
|
tmpde = tmpde->next;
|
|
}
|
|
DirTreeDel(de);
|
|
}
|
|
|
|
U0 @systemstarter_play_user_startup_sound()
|
|
{
|
|
U8 path[512];
|
|
StrPrint(&path, "/home/%s/.sounds/startup.wav",
|
|
&Compositor.session.user.name);
|
|
U8** argv = CAlloc(sizeof(U64) * 2);
|
|
argv[0] = "aplay";
|
|
argv[1] = &path;
|
|
@shell* sh = @shell_new(TRUE);
|
|
sh->session = &Compositor.session;
|
|
@shell_cmd_aplay(sh, 2, argv);
|
|
Free(sh);
|
|
}
|
|
|
|
U0 @systemstarter_set_user_wallpaper()
|
|
{
|
|
U8 path[512];
|
|
StrPrint(&path, "/home/%s/.wallpaper/wallpaper.png",
|
|
&Compositor.session.user.name);
|
|
U8** argv = CAlloc(sizeof(U64) * 2);
|
|
argv[0] = "wpset";
|
|
argv[1] = &path;
|
|
//@shell_cmd_wpset(NULL, 2, argv);
|
|
}
|
|
|
|
U0 @systemstarter_user_startup()
|
|
{
|
|
// Set User wallpaper
|
|
@systemstarter_set_user_wallpaper();
|
|
|
|
// Play User startup sound
|
|
@systemstarter_play_user_startup_sound();
|
|
}
|
|
|
|
U0 @systemstarter_startup()
|
|
{
|
|
|
|
// Set user-specific startup preferences
|
|
Spawn(&@systemstarter_user_startup);
|
|
|
|
// Initialize Clipboard
|
|
Clipboard.Init();
|
|
|
|
// Spawn Clipboard Task
|
|
Spawn(Clipboard.Task, , "Clipboard", T(mp_cnt > 3, 2, 1));
|
|
|
|
// Initialize SystemTray
|
|
SystemTray.Init();
|
|
|
|
// Spawn SystemTray Task
|
|
Spawn(SystemTray.Task, , "SystemTray", T(mp_cnt > 3, 2, 1));
|
|
|
|
SystemStarter.Spawn("M:/Applications/OS/Wallpaper.app", "Wallpaper");
|
|
SystemStarter.Spawn("M:/Applications/OS/AppBar.app", "AppBar");
|
|
SystemStarter.Spawn("M:/Applications/OS/TaskSwitcher.app",
|
|
"TaskSwitcher");
|
|
|
|
// Load SystemTray Applets
|
|
@systemstarter_load_applets;
|
|
}
|
|
|
|
U0 @systemstarter_ipc_queue_process()
|
|
{
|
|
IpcMessage* msg;
|
|
@systemtask* st = NULL;
|
|
msg = Ipc.MsgRecv();
|
|
if (msg) {
|
|
switch (msg->type) {
|
|
case SYSSTART_MSG_SPAWN:
|
|
if (msg->payload) {
|
|
st = msg->payload;
|
|
if (st->path && st->name) {
|
|
SystemStarter.Spawn(st->path, st->name);
|
|
System.Log(Fs, "Received message ← CreateTask (%s)", st->name);
|
|
Free(st->name);
|
|
Free(st->path);
|
|
}
|
|
Free(st);
|
|
}
|
|
break;
|
|
case SYSSTART_MSG_KILL:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
Free(msg);
|
|
}
|
|
}
|
|
|
|
U0 @systemstarter_task()
|
|
{
|
|
Ipc.InitQueue(Fs);
|
|
System.Log(Fs, "Task running at 0x%08x", Fs);
|
|
SystemStarter.task = Fs;
|
|
Spawn(&@systemstarter_startup, , , T(mp_cnt, 1, 0));
|
|
|
|
while (1) {
|
|
@systemstarter_ipc_queue_process;
|
|
Sleep(1);
|
|
}
|
|
}
|
|
|
|
U0 @systemstarter_create_task(U8* path, U8* name)
|
|
{
|
|
@systemtask* st = CAlloc(sizeof(@systemtask));
|
|
IpcMessage* msg = CAlloc(sizeof(IpcMessage));
|
|
st->path = StrNew(path);
|
|
st->name = StrNew(name);
|
|
msg->client = NULL;
|
|
msg->type = SYSSTART_MSG_SPAWN;
|
|
msg->payload = st;
|
|
Ipc.MsgSend(SystemStarter.task, msg);
|
|
}
|
|
|
|
SystemStarter.CreateTask = &@systemstarter_create_task;
|
|
SystemStarter.Init = &@systemstarter_init;
|
|
SystemStarter.Spawn = &@systemstarter_spawn;
|
|
SystemStarter.Task = &@systemstarter_task;
|
|
|
|
"systemstarter ";
|