Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: E.h main.c session.c setup.c x.c Log Message: Clean up command line option handling. Fix various issues with options and restarting/session management. =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v retrieving revision 1.402 retrieving revision 1.403 diff -u -3 -r1.402 -r1.403 --- E.h 31 Mar 2005 19:04:29 -0000 1.402 +++ E.h 7 Apr 2005 16:38:55 -0000 1.403 @@ -984,6 +984,12 @@ struct { char *name; + char *dir; + char *cache_dir; + } conf; + struct + { + char *name; int screens; #ifdef HAS_XINERAMA char xinerama_active; @@ -1026,7 +1032,6 @@ char single; /* No slaves */ char window; /* Running in virtual root window */ pid_t pid; - pid_t master_pid; int master_screen; char session_start; char startup; @@ -2222,7 +2227,7 @@ void WindowMatchEwinOps(EWin * ewin); /* x.c */ -Display *EDisplayOpen(const char *dstr); +Display *EDisplayOpen(const char *dstr, int scr); void EDisplayClose(void); void EDisplayDisconnect(void); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/main.c,v retrieving revision 1.122 retrieving revision 1.123 diff -u -3 -r1.122 -r1.123 --- main.c 3 Apr 2005 17:12:53 -0000 1.122 +++ main.c 7 Apr 2005 16:38:56 -0000 1.123 @@ -49,21 +49,50 @@ Window init_win_ext = None; #endif +static int EoptGet(int argc, char **argv); +static void EoptHelp(void); static void ECheckEprog(const char *name); static void EDirUserSet(const char *dir); static void EConfNameSet(const char *dir); static void EDirUserCacheSet(const char *dir); static void EDirsSetup(void); -static void ESetSavePrefix(const char *path); static void RunInitPrograms(void); -static const char *EConfName(void); + +static int eoptind = 0; +const char *eoptarg = NULL; + +typedef struct +{ + char sopt; + char arg; + const char *lopt; + const char *oarg; + const char *desc; +} EOpt; + +static const EOpt Eopts[] = { + {'d', 1, "display", "display", "Set display"}, + {'f', 0, "fast", NULL, "Fast startup"}, + {'h', 0, "help", NULL, "Show help"}, + {'m', 1, NULL, NULL, NULL}, + {'p', 1, "config-prefix", "prefix", "Configuration file name prefix"}, + {'P', 1, "econfdir", "path", "Set user configuration directory"}, + {'Q', 1, "ecachedir", "path", "Set user cache directory"}, + {'s', 1, "single", "screen", "Run only on given screen"}, + {'S', 1, "sm-client-id", "session id", "Set session manager ID"}, + {'t', 1, "theme", "name", "Select theme"}, + {'v', 0, "verbose", NULL, "Show additional info"}, + {'V', 0, "version", NULL, "Show version"}, + {'w', 1, "window", "WxH", "Run in window"}, + {'X', 1, NULL, NULL, NULL}, +}; int main(int argc, char **argv) { - int i; + int ch, i, loop; struct utsname ubuf; - char *str, *dstr; + const char *str, *dstr; /* This function runs all the setup for startup, and then * proceeds into the primary event loop at the end. @@ -71,9 +100,16 @@ /* Init state variable struct */ memset(&Mode, 0, sizeof(EMode)); - Mode.mode = MODE_NONE; + + Mode.wm.master = 1; + Mode.wm.pid = getpid(); Mode.wm.exec_name = argv[0]; Mode.wm.startup = 1; + + memset(&VRoot, 0, sizeof(VRoot)); + VRoot.scr = -1; + + Mode.mode = MODE_NONE; Mode.move.check = 1; str = getenv("EDEBUG"); @@ -83,12 +119,12 @@ if (str) Mode.wm.coredump = 1; - str = getenv("ECONFDIR"); - if (str) - EDirUserSet(str); str = getenv("ECONFNAME"); if (str) EConfNameSet(str); + str = getenv("ECONFDIR"); + if (str) + EDirUserSet(str); str = getenv("ECACHEDIR"); if (str) EDirUserCacheSet(str); @@ -111,93 +147,83 @@ Mode.theme.path = NULL; dstr = NULL; - for (i = 1; i < argc; i++) + for (loop = 1; loop;) { - if ((!strcmp("-t", argv[i]) || - !strcmp("-theme", argv[i])) && (argc - i > 1)) - { - i++; - Mode.theme.path = Estrdup(argv[i]); - } - else if ((!strcmp("-econfdir", argv[i])) && (argc - i > 1)) - { - EDirUserSet(argv[++i]); - } - else if ((!strcmp("-ecachedir", argv[i])) && (argc - i > 1)) - { - EDirUserCacheSet(argv[++i]); - } - else if ((!strcmp("-display", argv[i])) && (argc - i > 1)) - { - dstr = argv[++i]; - } - else if (!strcmp("-f", argv[i])) - { - Mode.wm.restart = 1; - } - else if (!strcmp("-s", argv[i]) || !strcmp("-single", argv[i])) - { - Mode.wm.single = 1; - } - else if ((!strcmp("-smid", argv[i]) || - !strcmp("-clientId", argv[i]) || - !strcmp("--sm-client-id", argv[i])) && (argc - i > 1)) - { - SetSMID(argv[++i]); - } - else if ((!strcmp("-p", argv[i]) || !strcmp("--config-prefix", argv[i])) - && (argc - i > 1)) - { - EConfNameSet(argv[++i]); - } -#ifdef USE_EXT_INIT_WIN - else if ((!strcmp("-ext_init_win", argv[i])) && (argc - i > 1)) - { - init_win_ext = atoi(argv[++i]); - Mode.wm.restart = 1; - } + ch = EoptGet(argc, argv); + if (ch <= 0) + break; +#if 0 + Eprintf("Opt: %c: %d - %s\n", ch, eoptind, eoptarg); #endif - else if ((!strcmp("-w", argv[i]) || !strcmp("-window", argv[i])) && - (argc - i > 1)) + switch (ch) { - sscanf(argv[++i], "%dx%d", &VRoot.w, &VRoot.h); - Mode.wm.window = 1; - Mode.wm.single = 1; - } - else if ((!strcmp("-h", argv[i])) || (!strcmp("-help", argv[i])) || - (!strcmp("-?", argv[i])) || (!strcmp("--help", argv[i]))) - { - printf("enlightenment options:\n" - "\t-display display_name\n" - "\t-ecachedir /path/to/cached/dir\n" - "\t-econfdir /path/to/config/dir\n" - "\t-ext_init_win window_id\n" - "\t[-p | --config-prefix] config_file_prefix\n" - "\t[-s | -single]\n" - "\t[-smid | -clientId | --sm-client-id] id\n" - "\t[-t | -theme] theme\n" - "\t[-v | -verbose]\n" - "\t[-V | -version | --version]\n" "\t-w WxH\n"); + default: + case '?': + printf("e16: Ignoring: "); + for (i = eoptind; i < argc; i++) + printf("%s ", argv[i]); + printf("\n"); + loop = 0; + break; + case 'h': + EoptHelp(); exit(0); - } - else if ((!strcmp("-V", argv[i])) || - (!strcmp("-version", argv[i])) || - (!strcmp("--version", argv[i]))) - { + break; + case 'd': + dstr = eoptarg; + break; + case 'f': + Mode.wm.restart = 1; + break; + case 'p': + EConfNameSet(eoptarg); + break; + case 'P': + EDirUserSet(eoptarg); + break; + case 'Q': + EDirUserCacheSet(eoptarg); + break; + case 's': + Mode.wm.single = 1; + VRoot.scr = strtoul(eoptarg, NULL, 10); + break; + case 'S': + SetSMID(eoptarg); + break; + case 't': + Mode.theme.path = Estrdup(eoptarg); + break; + case 'V': printf("Enlightenment %s - %s\n", ENLIGHTENMENT_VERSION, E_CHECKOUT_DATE); exit(0); - } - else if ((!strcmp("-v", argv[i])) || (!strcmp("-verbose", argv[i]))) - { + break; + case 'v': EventDebugSet(EDBUG_TYPE_VERBOSE, 1); - } + break; + case 'w': + sscanf(eoptarg, "%dx%d", &VRoot.w, &VRoot.h); + Mode.wm.window = 1; + Mode.wm.single = 1; + Mode.wm.master = 0; + break; +#ifdef USE_EXT_INIT_WIN + case 'X': + init_win_ext = strtoul(eoptarg, NULL, 0); + Mode.wm.restart = 1; + break; +#endif + case 'm': + Mode.wm.master = 0; + Mode.wm.master_screen = strtoul(eoptarg, NULL, 10); + break; #if USE_COMPOSITE - else if ((!strcmp("-C", argv[i]))) - { - ECompMgrParseArgs(argv[++i]); - } + case 'C': + ECompMgrParseArgs(eoptarg); + break; #endif + } } /* Initialise internationalisation */ @@ -213,9 +239,6 @@ ECheckEprog("eesh"); EDirsSetup(); - /* Set default save file prefix if not already set */ - ESetSavePrefix(NULL); - /* So far nothing should rely on a selected settings or theme. */ ConfigurationLoad(); /* Load settings */ @@ -252,7 +275,7 @@ #ifdef USE_EXT_INIT_WIN /* Kill the E process owning the "init window" */ - if (Mode.wm.master && init_win_ext) + if (init_win_ext) { if (EventDebug(EDBUG_TYPE_SESSION)) Eprintf("Kill init window %#lx\n", init_win_ext); @@ -299,6 +322,146 @@ return 1; } +void +EExit(int exitcode) +{ + int i; + + if (EventDebug(EDBUG_TYPE_SESSION)) + Eprintf("EExit(%d)\n", exitcode); + + if (disp) + { + ecore_x_ungrab(); + GrabPointerRelease(); + XAllowEvents(disp, AsyncBoth, CurrentTime); + + /* XSetInputFocus(disp, None, RevertToParent, CurrentTime); */ + /* I think this is a better way to release the grabs: (felix) */ + XSetInputFocus(disp, PointerRoot, RevertToPointerRoot, CurrentTime); + XSelectInput(disp, VRoot.win, 0); + EDisplayClose(); + } + + SignalsRestore(); + + if (Mode.wm.master) + { + for (i = 0; i < Mode.wm.child_count; i++) + kill(Mode.wm.children[i], SIGINT); + } + else + { + exitcode = 0; + } + + exit(exitcode); +} + +/* + * Command line parsing. + * Not entirely standard compliant, but close enough. + */ +static int +EoptGet(int argc, char **argv) +{ + const char *s; + unsigned int i, len; + int lopt; + const EOpt *eopt; + + eoptind++; + if (eoptind >= argc) + return 0; + + s = argv[eoptind]; + if (*s++ != '-') + return 0; + + lopt = 0; + if (*s == '-') + { + lopt = 1; + s++; + } + + eoptarg = NULL; + eopt = NULL; + for (i = 0; i < sizeof(Eopts) / sizeof(EOpt); i++) + { + eopt = &Eopts[i]; + + /* Short option */ + if (!lopt) + { + if (!eopt->sopt || eopt->sopt != s[0]) + continue; + if (eopt->arg) + { + if (s[1]) + { + eoptarg = s + 1; + goto found; + } + goto found; + } + if (s[1]) + break; + goto found; + } + + if (!eopt->lopt) + continue; + + /* Long option */ + len = strlen(eopt->lopt); + if (strncmp(eopt->lopt, s, len)) + continue; + if (eopt->arg) + { + if (s[len] == '\0') + goto found; + if (s[len] != '=') + break; + eoptarg = s + len + 1; + } + goto found; + } + return '?'; + + found: + if (!eopt->arg || eoptarg) + return eopt->sopt; + + if (eoptind >= argc - 1) + return '?'; /* Missing param */ + + eoptind++; + eoptarg = argv[eoptind]; + return eopt->sopt; +} + +static void +EoptHelp(void) +{ + unsigned int i; + const EOpt *eopt; + char buf[256]; + + printf("e16 options:\n"); + for (i = 0; i < sizeof(Eopts) / sizeof(EOpt); i++) + { + eopt = &Eopts[i]; + if (!eopt->desc) + continue; + if (eopt->oarg) + Esnprintf(buf, sizeof(buf), "--%s <%s>", eopt->lopt, eopt->oarg); + else + Esnprintf(buf, sizeof(buf), "--%s", eopt->lopt); + printf(" -%c %-30s\t%s\n", eopt->sopt, buf, eopt->desc); + } +} + static void RunDocBrowser(void) { @@ -355,46 +518,6 @@ } } -void -EExit(int exitcode) -{ - int i; - - if (EventDebug(EDBUG_TYPE_SESSION)) - Eprintf("EExit(%d)\n", exitcode); - - if (disp) - { - ecore_x_ungrab(); - GrabPointerRelease(); - XAllowEvents(disp, AsyncBoth, CurrentTime); - - /* XSetInputFocus(disp, None, RevertToParent, CurrentTime); */ - /* I think this is a better way to release the grabs: (felix) */ - XSetInputFocus(disp, PointerRoot, RevertToPointerRoot, CurrentTime); - XSelectInput(disp, VRoot.win, 0); - EDisplayClose(); - } - - SignalsRestore(); - - if (Mode.wm.master) - { - for (i = 0; i < Mode.wm.child_count; i++) - kill(Mode.wm.children[i], SIGINT); - } - else - { - exitcode = 0; - } - - exit(exitcode); -} - -static char *userDir = NULL; -static char *userConf = NULL; -static char *cacheDir = NULL; - const char * EDirBin(void) { @@ -410,63 +533,70 @@ static void EConfNameSet(const char *name) { - if (userConf) - Efree(userConf); - userConf = Estrdup(name); - - Esetenv("ECONFNAME", userConf, 1); + if (Mode.conf.name) + Efree(Mode.conf.name); + Mode.conf.name = Estrdup(name); + Esetenv("ECONFNAME", Mode.conf.name, 1); } -static const char * -EConfNameDefault(void) +static void +EDirUserSet(const char *dir) { - return "e_config"; + if (!strcmp(dir, EDirUser())) + return; + if (Mode.conf.dir) + Efree(Mode.conf.dir); + Mode.conf.dir = Estrdup(dir); } -static const char * -EConfName(void) +static void +EDirUserCacheSet(const char *dir) { - return (userConf) ? userConf : EConfNameDefault(); + if (!strcmp(dir, EDirUser())) + return; + if (Mode.conf.cache_dir) + Efree(Mode.conf.cache_dir); + Mode.conf.cache_dir = Estrdup(dir); } -static void -EDirUserSet(const char *dir) +static const char * +EConfNameDefault(void) { - if (userDir) - Efree(userDir); - userDir = Estrdup(dir); + return "e_config"; } -static void -EDirUserCacheSet(const char *dir) +static const char * +EConfName(void) { - if (cacheDir) - Efree(cacheDir); - cacheDir = Estrdup(dir); + return (Mode.conf.name) ? Mode.conf.name : EConfNameDefault(); } const char * EDirUser(void) { + static char *user_dir; char *home, buf[4096]; - if (userDir) - return userDir; + if (Mode.conf.dir) + return Mode.conf.dir; + + if (user_dir) + return user_dir; home = homedir(getuid()); Esnprintf(buf, sizeof(buf), "%s/.e16", home); Efree(home); - userDir = Estrdup(buf); + user_dir = Estrdup(buf); - return userDir; + return user_dir; } const char * EDirUserCache(void) { - if (!cacheDir) - cacheDir = Estrdup(EDirUser()); - return cacheDir; + if (Mode.conf.cache_dir) + return Mode.conf.cache_dir; + return EDirUser(); } static void @@ -556,8 +686,8 @@ * The client data appends ".clients" onto this filename and the snapshot data * appends ".snapshots". */ -static char * -default_save_prefix(void) +const char * +EGetSavePrefix(void) { static char *def_prefix = NULL; char *s, buf[1024]; @@ -565,7 +695,7 @@ if (def_prefix) return def_prefix; - if (userConf) + if (Mode.conf.name) Esnprintf(buf, sizeof(buf), "%s/%s-%d", EDirUser(), EConfName(), VRoot.scr); else if (Mode.wm.window) @@ -581,29 +711,6 @@ return def_prefix; } -static char *save_prefix = NULL; - -static void -ESetSavePrefix(const char *path) -{ - if (save_prefix && path == NULL) - return; - - if (save_prefix) - Efree(save_prefix); - - if (!path) - save_prefix = Estrdup(default_save_prefix()); - else - save_prefix = Estrdup(path); -} - -const char * -EGetSavePrefix(void) -{ - return save_prefix; -} - const char * EGetSavePrefixCommon(void) { =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/session.c,v retrieving revision 1.95 retrieving revision 1.96 diff -u -3 -r1.95 -r1.96 --- session.c 19 Mar 2005 16:40:07 -0000 1.95 +++ session.c 7 Apr 2005 16:38:56 -0000 1.96 @@ -328,54 +328,25 @@ static void set_save_props(SmcConn smc_conn, int master_flag) { - char *user = NULL; - const char *program = NULL; - const char *pristr = "_GSM_Priority"; - const char *sm_file; - const char *smid = "-smid"; - const char *single = "-single"; - -#if 0 - const char *smfile = "-smfile"; -#endif - const char *econfdir = "-econfdir"; - const char *e_conf_dir; - const char *ecachedir = "-ecachedir"; - const char *e_cache_dir; - -#ifdef USE_EXT_INIT_WIN - const char *extinitwin = "-ext_init_win"; - char buf[512]; -#endif + const char *s; + char *user; + const char *program; char priority = 10; char style; - int n; - SmPropValue programVal = { 0, NULL }; - SmPropValue userIDVal = { 0, NULL }; + int i, n; + SmPropValue programVal; + SmPropValue userIDVal; + #if USE_DISCARD_PROPERTY - char *sh = "sh"; - char *c = "-c"; - SmPropValue discardVal[] = { - {0, NULL}, - {0, NULL}, - {0, NULL} - }; + const char *sh = "sh"; + const char *c = "-c"; + const char *sm_file; + SmPropValue discardVal[3]; SmProp discardProp; #endif - SmPropValue restartVal[] = { - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, NULL} - }; - SmPropValue styleVal = { 0, NULL }; - SmPropValue priorityVal = { 0, NULL }; + SmPropValue restartVal[32]; + SmPropValue styleVal; + SmPropValue priorityVal; SmProp programProp; SmProp userIDProp; SmProp restartProp; @@ -383,6 +354,7 @@ SmProp styleProp; SmProp priorityProp; SmProp *props[7]; + char bufs[32], bufm[32], bufx[32]; if (EventDebug(EDBUG_TYPE_SESSION)) Eprintf("set_save_props\n"); @@ -417,7 +389,7 @@ styleProp.num_vals = 1; styleProp.vals = (SmPropValue *) & styleVal; - priorityProp.name = (char *)pristr; + priorityProp.name = (char *)"_GSM_Priority"; priorityProp.type = (char *)SmCARD8; priorityProp.num_vals = 1; priorityProp.vals = (SmPropValue *) & priorityVal; @@ -430,12 +402,9 @@ style = SmRestartNever; user = username(getuid()); - e_conf_dir = EDirUser(); - e_cache_dir = EDirUserCache(); /* The SM specs state that the SmProgram should be the argument passed * to execve. Passing argv[0] is close enough. */ program = Mode.wm.exec_name; - sm_file = EGetSavePrefix(); userIDVal.length = strlen(user); userIDVal.value = user; @@ -448,6 +417,7 @@ #if USE_DISCARD_PROPERTY /* Tell session manager how to clean up our old data */ + sm_file = EGetSavePrefix(); Esnprintf(buf, sizeof(buf), "rm %s*.clients.*", sm_file); discardVal[0].length = strlen(sh); @@ -459,52 +429,65 @@ #endif n = 0; - restartVal[n].length = strlen(program); restartVal[n++].value = (char *)program; if (Mode.wm.single) { - restartVal[n].length = strlen(single); - restartVal[n++].value = (char *)single; + Esnprintf(bufs, sizeof(bufs), "%i", Mode.wm.master_screen); + restartVal[n++].value = (char *)"-s"; + restartVal[n++].value = (char *)bufs; + } + else if (restarting && !Mode.wm.master) + { + Esnprintf(bufm, sizeof(bufm), "%i", Mode.wm.master_screen); + restartVal[n++].value = (char *)"-m"; + restartVal[n++].value = bufm; } #ifdef USE_EXT_INIT_WIN if (restarting) { - Esnprintf(buf, sizeof(buf), "%li", new_init_win_ext); - - restartVal[n].length = strlen(extinitwin); - restartVal[n++].value = (char *)extinitwin; - restartVal[n].length = strlen(buf); - restartVal[n++].value = buf; + Esnprintf(bufx, sizeof(bufx), "%#lx", new_init_win_ext); + restartVal[n++].value = (char *)"-X"; + restartVal[n++].value = bufx; } #endif #if 0 - restartVal[n].length = strlen(smfile); restartVal[n++].value = (char *)smfile; - restartVal[n].length = strlen(sm_file); restartVal[n++].value = (char *)sm_file; #endif - restartVal[n].length = strlen(econfdir); - restartVal[n++].value = (char *)econfdir; - restartVal[n].length = strlen(e_conf_dir); - restartVal[n++].value = (char *)e_conf_dir; - restartVal[n].length = strlen(ecachedir); - restartVal[n++].value = (char *)ecachedir; - restartVal[n].length = strlen(e_cache_dir); - restartVal[n++].value = (char *)e_cache_dir; - restartVal[n].length = strlen(smid); - restartVal[n++].value = (char *)smid; - restartVal[n].length = strlen(sm_client_id); - restartVal[n++].value = sm_client_id; + s = Mode.conf.name; + if (s) + { + restartVal[n++].value = (char *)"-p"; + restartVal[n++].value = (char *)s; + } + s = Mode.conf.dir; + if (s) + { + restartVal[n++].value = (char *)"-P"; + restartVal[n++].value = (char *)s; + } + s = Mode.conf.cache_dir; + if (s) + { + restartVal[n++].value = (char *)"-Q"; + restartVal[n++].value = (char *)s; + } + s = sm_client_id; + restartVal[n++].value = (char *)"-S"; + restartVal[n++].value = (char *)s; + + for (i = 0; i < n; i++) + restartVal[i].length = strlen(restartVal[i].value); restartProp.num_vals = n; - /* SM specs require SmCloneCommand excludes "-smid" option */ + /* SM specs require SmCloneCommand excludes "--sm-client-id" option */ cloneProp.num_vals = restartProp.num_vals - 2; if (EventDebug(EDBUG_TYPE_SESSION)) - for (n = 0; n < restartProp.num_vals; n++) - Eprintf("restartVal[i]: %2d: %s\n", restartVal[n].length, - (char *)restartVal[n].value); + for (i = 0; i < restartProp.num_vals; i++) + Eprintf("restartVal[i]: %2d: %s\n", restartVal[i].length, + (char *)restartVal[i].value); n = 0; props[n++] = &programProp; @@ -568,32 +551,36 @@ if (EventDebug(EDBUG_TYPE_SESSION)) Eprintf("callback_save_yourself\n"); +#if 0 /* FIXME - Unused - Remove? */ if (Mode.wm.master) { +#if 0 char s[4096]; - -/* int fd; */ + int fd; Esnprintf(s, sizeof(s), "sm_file %s", EGetSavePrefix()); -/* fd = Emkstemp(s + 8); - * if (fd < 0) - * { - * SmcSaveYourselfDone(smc_conn, False); - * return; - * } - * SetSMFile(s + 8); */ + fd = Emkstemp(s + 8); + if (fd < 0) + { + SmcSaveYourselfDone(smc_conn, False); + return; + } + SetSMFile(s + 8); +#endif + CommsBroadcastToSlaveWMs(EGetSavePrefix()); /* dont need */ /* autosave(); */ -/* - * if (strcmp(GetSMFile(), GetGenericSMFile())) - * { - * if (exists(GetGenericSMFile())) - * E_rm(GetGenericSMFile()); - * symlink(GetSMFile(), GetGenericSMFile()); - * } - */ +#if 0 + if (strcmp(GetSMFile(), GetGenericSMFile())) + { + if (exists(GetGenericSMFile())) + E_rm(GetGenericSMFile()); + symlink(GetSMFile(), GetGenericSMFile()); + } +#endif } +#endif #if 0 /* Unused */ SaveWindowStates(); @@ -883,16 +870,19 @@ EDisplayClose(); l = 0; - l += - Esnprintf(s + l, sizeof(s) - l, "exec %s -s -f", Mode.wm.exec_name); + l += Esnprintf(s + l, sizeof(s) - l, "exec %s -f", Mode.wm.exec_name); + if (Mode.wm.single) + l += Esnprintf(s + l, sizeof(s) - l, " -s %d", VRoot.scr); + else if (!Mode.wm.master) + l += + Esnprintf(s + l, sizeof(s) - l, " -m %d", Mode.wm.master_screen); #ifdef HAVE_X11_SM_SMLIB_H if (sm_client_id) - l += Esnprintf(s + l, sizeof(s) - l, " -smid %s", sm_client_id); + l += Esnprintf(s + l, sizeof(s) - l, " -S %s", sm_client_id); #endif #ifdef USE_EXT_INIT_WIN if (new_init_win_ext != None) - l += Esnprintf(s + l, sizeof(s) - l, " -ext_init_win %li", - new_init_win_ext); + l += Esnprintf(s + l, sizeof(s) - l, " -X %li", new_init_win_ext); #endif if (ss) l += Esnprintf(s + l, sizeof(s) - l, " -t %s", ss); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/setup.c,v retrieving revision 1.156 retrieving revision 1.157 diff -u -3 -r1.156 -r1.157 --- setup.c 25 Mar 2005 18:11:53 -0000 1.156 +++ setup.c 7 Apr 2005 16:38:57 -0000 1.157 @@ -119,12 +119,13 @@ char buf[128]; long mask; - /* In case we are going to fork, set up the master pid */ - Mode.wm.master = 1; - Mode.wm.master_pid = Mode.wm.pid = getpid(); + if (!dstr) + dstr = getenv("DISPLAY"); + if (!dstr) + dstr = ":0"; /* Open a connection to the diplay nominated by the DISPLAY variable */ - disp = EDisplayOpen(dstr); + disp = EDisplayOpen(dstr, VRoot.scr); if (!disp) { Alert(_("Enlightenment cannot connect to the display nominated by\n" @@ -143,19 +144,19 @@ VRoot.scr = DefaultScreen(disp); Mode.display.screens = ScreenCount(disp); - Mode.wm.master_screen = VRoot.scr; + if (Mode.wm.master || + Mode.wm.master_screen < 0 || + Mode.wm.master_screen >= Mode.display.screens) + Mode.wm.master_screen = VRoot.scr; /* Start up on multiple heads, if appropriate */ - if ((Mode.display.screens > 1) && (!Mode.wm.single)) + if (Mode.display.screens > 1 && !Mode.wm.single && !Mode.wm.restart) { int i; - char subdisplay[255]; char *dispstr; dispstr = DisplayString(disp); - strcpy(subdisplay, DisplayString(disp)); - for (i = 0; i < Mode.display.screens; i++) { pid_t pid; @@ -180,20 +181,11 @@ Mode.wm.master = 0; Mode.wm.pid = getpid(); VRoot.scr = i; + init_win_ext = None; #ifdef SIGSTOP kill(getpid(), SIGSTOP); #endif - /* Find the point to concatenate the screen onto */ - dispstr = strchr(subdisplay, ':'); - if (NULL != dispstr) - { - dispstr = strchr(dispstr, '.'); - if (NULL != dispstr) - *dispstr = '\0'; - } - Esnprintf(subdisplay + strlen(subdisplay), 10, ".%d", i); - dstr = Estrdup(subdisplay); - disp = EDisplayOpen(dstr); + disp = EDisplayOpen(dstr, i); /* Terminate the loop as I am the child process... */ break; } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/x.c,v retrieving revision 1.82 retrieving revision 1.83 diff -u -3 -r1.82 -r1.83 --- x.c 19 Mar 2005 16:40:18 -0000 1.82 +++ x.c 7 Apr 2005 16:38:57 -0000 1.83 @@ -1140,14 +1140,25 @@ } Display * -EDisplayOpen(const char *dstr) +EDisplayOpen(const char *dstr, int scr) { + char dbuf[256], *s; Display *dpy; - if (!dstr) - dstr = getenv("DISPLAY"); - if (!dstr) - dstr = ":0"; + if (scr >= 0) + { + /* Override screen */ + Esnprintf(dbuf, sizeof(dbuf) - 10, dstr); + s = strchr(dbuf, ':'); + if (s) + { + s = strchr(s, '.'); + if (s) + *s = '\0'; + } + Esnprintf(dbuf + strlen(dbuf), 10, ".%d", scr); + dstr = dbuf; + } #ifdef USE_ECORE_X ecore_x_init(dstr); ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs