]> git.sur5r.net Git - i3/i3/commitdiff
Environment filtering is not needed. Instead, open applications through SHELL, double...
authorMichael Stapelberg <michael+git@stapelberg.de>
Sat, 14 Feb 2009 00:36:12 +0000 (01:36 +0100)
committerMichael Stapelberg <michael+git@stapelberg.de>
Sat, 14 Feb 2009 00:36:12 +0000 (01:36 +0100)
TODO
include/i3.h
include/util.h
src/commands.c
src/mainx.c
src/util.c

diff --git a/TODO b/TODO
index 46f1ea23c67fa697a6c85f9568eb6bd868396ea5..43cd8bf994dd7a8c1d9ddc59c500f6d6ca633967 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,7 +1,7 @@
 TODO list, in order of importance:
 
  * freely resizable (e.g. using your mouse, for now) percentage of rows/cols
- * fullscreen (handling of applications)
+ * fullscreen (handling of applications, mplayer, firefox, xpdf, wmctrl)
  * fullscreen (implementing a mode, like default, stacked)
  * xinerama
  * document stuff!
index d2453f47d679685abae82f7435f38b6ccd4dcc74..c9fc80ed90b0306076c408f3d48d706f9fb0a7c8 100644 (file)
@@ -12,7 +12,6 @@ extern Display *xkbdpy;
 extern TAILQ_HEAD(bindings_head, Binding) bindings;
 extern xcb_event_handlers_t evenths;
 extern char *pattern;
-extern char **environment;
 extern int num_screens;
 
 #endif
index 9eb2a447c63026b7ae8c0638d388c3480e81c7aa..05e05f2e3546809b5852d13f8a378a21de4e5ad8 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef _UTIL_H
 #define _UTIL_H
 
-void start_application(const char *path, const char *args);
+void start_application(const char *command);
 void check_error(xcb_connection_t *connection, xcb_void_cookie_t cookie, char *err_message);
 
 #endif
index 8e3161cf0d0b3cfe11257ef52349fc20a6a6e628..23b188ab111d36855ae372dd4153a1cee2afaccf 100644 (file)
@@ -287,7 +287,7 @@ void parse_command(xcb_connection_t *conn, const char *command) {
        /* Is it an <exec>? */
        if (strncmp(command, "exec ", strlen("exec ")) == 0) {
                printf("starting \"%s\"\n", command + strlen("exec "));
-               start_application(command+strlen("exec "), NULL);
+               start_application(command+strlen("exec "));
                return;
        }
 
index 359e3f7430099834846e93ef82b0ab931ac49e71..2d2188e33ebac5da3679230a564856bc58f2e3fa 100644 (file)
@@ -42,10 +42,6 @@ static const int LEFT = 5;
 static const int BOTTOM = 5;
 static const int RIGHT = 5;
 
-/* This is the filtered environment which will be passed to opened applications.
- * It contains DISPLAY (naturally) and locales stuff (LC_*, LANG) */
-char **environment;
-
 /* hm, xcb_wm wants us to implement this. */
 table_t *byChild = 0;
 table_t *byParent = 0;
@@ -273,28 +269,13 @@ static void initialize_xinerama(xcb_connection_t *conn) {
 }
 
 int main(int argc, char *argv[], char *env[]) {
-       int i, e = 0;
-
-       for (i = 0; (env[i] != NULL); i++)
-               if (strncmp(env[i], "LC_", strlen("LC_")) == 0 ||
-                       strncmp(env[i], "LANG=", strlen("LANG=")) == 0 ||
-                       strncmp(env[i], "DISPLAY=", strlen("DISPLAY=")) == 0) {
-                       printf("Passing environment \"%s\"\n", env[i]);
-                       environment = realloc(environment, sizeof(char*) * ++e);
-                       environment[e-1] = env[i];
-               }
-
-       /* environment has to be NULL-terminated */
-       environment = realloc(environment, sizeof(char*) * ++e);
-       environment[e-1] = NULL;
-
-       init_table();
-
+       int i, screens;
        xcb_connection_t *c;
        xcb_property_handlers_t prophs;
        xcb_window_t root;
 
-       int screens;
+       /* Initialize the table data structures for each workspace */
+       init_table();
 
        memset(&evenths, 0, sizeof(xcb_event_handlers_t));
        memset(&prophs, 0, sizeof(xcb_property_handlers_t));
@@ -306,8 +287,6 @@ int main(int argc, char *argv[], char *env[]) {
 
        c = xcb_connect(NULL, &screens);
 
-       printf("x screen is %d\n", screens);
-
        /* TODO: this has to be more beautiful somewhen */
        int major, minor, error;
 
@@ -414,7 +393,7 @@ int main(int argc, char *argv[], char *env[]) {
        printf("Checking for Xinerama...\n");
        initialize_xinerama(c);
 
-       start_application(TERMINAL, NULL);
+       start_application(TERMINAL);
 
        xcb_flush(c);
 
index 1263cdc4939e41bdff989d7b121618a7d0af270e..81ae50df2077e6026f06d2dacbb0b914a69f1c38 100644 (file)
@@ -2,25 +2,38 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
+#include <sys/wait.h>
 
 #include "i3.h"
 
 /*
- * Starts the given application with the given args.
+ * Starts the given application by passing it through a shell. We use double fork
+ * to avoid zombie processes. As the started application’s parent exits (immediately),
+ * the application is reparented to init (process-id 1), which correctly handles
+ * childs, so we don’t have to do it :-).
+ *
+ * The shell is determined by looking for the SHELL environment variable. If it
+ * does not exist, /bin/sh is used.
  *
  */
-void start_application(const char *path, const char *args) {
-       pid_t pid;
-       if ((pid = vfork()) == 0) {
-               /* This is the child */
-               char *argv[2];
-               /* TODO: For now, we ignore args. Later on, they should be parsed
-                  correctly (like in the shell?) */
-               argv[0] = strdup(path);
-               argv[1] = NULL;
-               execve(path, argv, environment);
-               /* not reached */
+void start_application(const char *command) {
+       if (fork() == 0) {
+               /* Child process */
+               if (fork() == 0) {
+                       /* Stores the path of the shell */
+                       static const char *shell = NULL;
+
+                       if (shell == NULL)
+                               if ((shell = getenv("SHELL")) == NULL)
+                                       shell = "/bin/sh";
+
+                       /* This is the child */
+                       execl(shell, shell, "-c", command, NULL);
+                       /* not reached */
+               }
+               exit(0);
        }
+       wait(0);
 }
 
 /*