Implement autostart using "exec" in config

Syntax is "exec <application>", like when creating a binding.
Multiple entries are possible, applications are started in
the specified order.
next
Michael Rudolf 2009-03-29 14:53:48 +02:00 committed by Michael Stapelberg
parent 4a3354da3b
commit 3400f0e6bd
4 changed files with 31 additions and 0 deletions

View File

@ -48,6 +48,7 @@ typedef struct Font i3Font;
typedef struct Container Container;
typedef struct Client Client;
typedef struct Binding Binding;
typedef struct Autostart Autostart;
typedef struct Workspace Workspace;
typedef struct Rect Rect;
typedef struct Screen i3Screen;
@ -191,6 +192,16 @@ struct Binding {
TAILQ_ENTRY(Binding) bindings;
};
/*
* Holds a command specified by an exec-line in the config (see src/config.c)
*
*/
struct Autostart {
/* Command, like in command mode */
char *command;
TAILQ_ENTRY(Autostart) autostarts;
};
/*
* Data structure for cached font information:
* - font id in X11 (load it once)

View File

@ -25,6 +25,7 @@
extern char **start_argv;
extern Display *xkbdpy;
extern TAILQ_HEAD(bindings_head, Binding) bindings;
extern TAILQ_HEAD(autostarts_head, Autostart) autostarts;
extern SLIST_HEAD(stack_wins_head, Stack_Window) stack_wins;
extern xcb_event_handlers_t evenths;
extern int num_screens;

View File

@ -85,6 +85,15 @@ void load_configuration(const char *override_configpath) {
OPTION_STRING(terminal);
OPTION_STRING(font);
/* exec-lines (autostart) */
if (strcasecmp(key, "exec") == 0) {
Autostart *new = smalloc(sizeof(Autostart));
new->command = sstrdup(value);
TAILQ_INSERT_TAIL(&autostarts, new, autostarts);
continue;
}
/* key bindings */
if (strcasecmp(key, "bind") == 0) {
#define CHECK_MODIFIER(name) \
if (strncasecmp(walk, #name, strlen(#name)) == 0) { \

View File

@ -52,6 +52,9 @@ Display *xkbdpy;
/* The list of key bindings */
struct bindings_head bindings = TAILQ_HEAD_INITIALIZER(bindings);
/* The list of exec-lines */
struct autostarts_head autostarts = TAILQ_HEAD_INITIALIZER(autostarts);
/* This is a list of Stack_Windows, global, for easier/faster access on expose events */
struct stack_wins_head stack_wins = SLIST_HEAD_INITIALIZER(stack_wins);
@ -527,6 +530,13 @@ int main(int argc, char *argv[], char *env[]) {
}
}
/* Autostarting exec-lines */
Autostart *exec;
TAILQ_FOREACH(exec, &autostarts, autostarts) {
LOG("auto-starting %s\n", exec->command);
start_application(exec->command);
}
/* check for Xinerama */
LOG("Checking for Xinerama...\n");
initialize_xinerama(conn);