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

Reply via email to