Enable running scripts on startup/restart.

SVN revision: 13234
This commit is contained in:
Kim Woelders 2005-02-07 23:44:59 +00:00
parent 1a95e3596e
commit d625bd3372
5 changed files with 83 additions and 53 deletions

View File

@ -21,6 +21,7 @@ New features:
- Built-in composite manager.
- An iconbox can be configured to act as System Tray
(middle mouse->Desktop->Create Systray).
- Possibility to run programs on initial startup and on restart.
Notes:
@ -52,6 +53,14 @@ by editing /usr/share/e16/config/bindings.cfg.
e16menuedit will no longer work. e16menuedit2 will.
It is now possible to execute scripts on startup and/or restart. Use
$ eesh set misc.session.cmd_init <script>
to set the "init" script, and
$ eesh set misc.session.cmd_start <script>
to set the "start" script.
The "init" script is executed only the first time e16 is started on the
display, and the "start" script is run every time e16 (re)starts.
Configuration files
-------------------

View File

@ -891,6 +891,8 @@ typedef struct
{
char enable_logout_dialog;
char enable_reboot_halt;
char *cmd_init;
char *cmd_start;
char *cmd_reboot;
char *cmd_halt;
} session;
@ -1012,6 +1014,7 @@ typedef struct
char window; /* Running in virtual root window */
pid_t master_pid;
int master_screen;
char session_start;
char startup;
char restart;
char xselect;

View File

@ -494,6 +494,11 @@ EHintsGetMainInfo(void)
DesksSetCurrent(*c);
XFree(c);
}
else
{
/* Used to test if we should run cmd_init */
Mode.wm.session_start = 1;
}
}
void

View File

@ -56,6 +56,7 @@ static void ECheckEprog(const char *name);
static void EDirUserSet(const char *dir);
static void EDirUserCacheSet(const char *dir);
static void EDirsSetup(void);
static void RunInitPrograms(void);
int
main(int argc, char **argv)
@ -280,6 +281,7 @@ main(int argc, char **argv)
ModulesSignal(ESIGNAL_START, NULL);
RunInitPrograms();
SpawnSnappedCmds();
Conf.startup.firsttime = 0;
@ -296,6 +298,62 @@ main(int argc, char **argv)
return 1;
}
static void
RunDocBrowser(void)
{
char file[FILEPATH_LEN_MAX];
Esnprintf(file, sizeof(file), "%s/edox", EDirBin());
if (!canexec(file))
return;
Esnprintf(file, sizeof(file), "%s/E-docs", EDirRoot());
if (!canread(file))
return;
if (fork())
return;
Esnprintf(file, sizeof(file), "exec %s/edox %s/E-docs",
EDirBin(), EDirRoot());
execl(usershell(getuid()), usershell(getuid()), "-c", (char *)file, NULL);
exit(0);
}
static void
RunMenuGen(void)
{
char file[FILEPATH_LEN_MAX];
if (fork())
return;
Esnprintf(file, sizeof(file), "exec %s/scripts/e_gen_menu", EDirRoot());
execl(usershell(getuid()), usershell(getuid()), "-c", (char *)file, NULL);
exit(0);
}
static void
RunInitPrograms(void)
{
if (Mode.wm.session_start)
{
if (Conf.session.cmd_init && canexec(Conf.session.cmd_init))
system(Conf.session.cmd_init);
}
if (Conf.session.cmd_start && canexec(Conf.session.cmd_start))
system(Conf.session.cmd_start);
if (Conf.startup.firsttime && Mode.wm.master)
{
RunMenuGen();
RunDocBrowser();
}
}
void
EExit(int exitcode)
{

View File

@ -83,66 +83,19 @@ const EModule *p_modules[] = {
};
int n_modules = sizeof(p_modules) / sizeof(EModule *);
static void
runDocBrowser(void)
{
char file[FILEPATH_LEN_MAX];
Esnprintf(file, sizeof(file), "%s/edox", EDirBin());
if (!canexec(file))
return;
Esnprintf(file, sizeof(file), "%s/E-docs", EDirRoot());
if (!canread(file))
return;
if (fork())
return;
Esnprintf(file, sizeof(file), "exec %s/edox %s/E-docs",
EDirBin(), EDirRoot());
execl(usershell(getuid()), usershell(getuid()), "-c", (char *)file, NULL);
exit(0);
}
static void
SetupUserInitialization(void)
{
char file[FILEPATH_LEN_MAX];
if (!Conf.startup.firsttime)
return;
if (!Mode.wm.master)
return;
if (fork() == 0)
{
Esnprintf(file, sizeof(file), "exec %s/scripts/e_gen_menu", EDirRoot());
execl(usershell(getuid()), usershell(getuid()), "-c", (char *)file,
NULL);
exit(0);
}
/* Run edox */
runDocBrowser();
autosave();
}
#if 0
static void
MiscSighan(int sig, void *prm __UNUSED__)
{
switch (sig)
{
case ESIGNAL_START:
SetupUserInitialization();
break;
}
}
#endif
static const CfgItem cfg_items[] = {
static const CfgItem MiscCfgItems[] = {
CFG_ITEM_INT(Conf, backgrounds.hiquality, 1),
CFG_ITEM_INT(Conf, backgrounds.timeout, 240),
CFG_ITEM_BOOL(Conf, backgrounds.user, 1),
@ -179,6 +132,8 @@ static const CfgItem cfg_items[] = {
CFG_ITEM_BOOL(Conf, session.enable_logout_dialog, 1),
CFG_ITEM_BOOL(Conf, session.enable_reboot_halt, 0),
CFG_ITEM_STR(Conf, session.cmd_init),
CFG_ITEM_STR(Conf, session.cmd_start),
CFG_ITEM_STR(Conf, session.cmd_reboot),
CFG_ITEM_STR(Conf, session.cmd_halt),
@ -203,7 +158,7 @@ static const CfgItem cfg_items[] = {
CFG_ITEM_BOOL(Conf, save_under, 0),
CFG_ITEM_INT(Conf, edge_flip_resistance, 25),
};
#define N_CFG_ITEMS ((int)(sizeof(cfg_items)/sizeof(CfgItem)))
#define N_CFG_ITEMS ((int)(sizeof(MiscCfgItems)/sizeof(CfgItem)))
static void
MiscIpcExec(const char *params, Client * c __UNUSED__)
@ -270,8 +225,8 @@ IpcItem MiscIpcArray[] = {
/* Stuff not elsewhere */
EModule ModMisc = {
"misc", NULL,
MiscSighan,
NULL,
{N_IPC_FUNCS, MiscIpcArray}
,
{N_CFG_ITEMS, cfg_items}
{N_CFG_ITEMS, MiscCfgItems}
};