]> git.sur5r.net Git - i3/i3/blobdiff - include/config.h
Merge branch 'master' into next
[i3/i3] / include / config.h
index 337db8fbac850ac7def371534e66042e0c2b5474..3144263dccb0bf37ee918727f62e4c5363b95e04 100644 (file)
@@ -1,11 +1,8 @@
 /*
- * vim:ts=8:expandtab
+ * vim:ts=4:sw=4:expandtab
  *
  * i3 - an improved dynamic tiling window manager
- *
- * © 2009-2010 Michael Stapelberg and contributors
- *
- * See file LICENSE for license information.
+ * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
  *
  * include/config.h: Contains all structs/variables for the configurable
  * part of i3 as well as functions handling the configuration file (calling
  * mode).
  *
  */
-
 #ifndef _CONFIG_H
 #define _CONFIG_H
 
 #include <stdbool.h>
 #include "queue.h"
 #include "i3.h"
+#include "libi3.h"
 
 typedef struct Config Config;
+typedef struct Barconfig Barconfig;
 extern char *current_configpath;
 extern Config config;
 extern SLIST_HEAD(modes_head, Mode) modes;
+extern TAILQ_HEAD(barconfig_head, Barconfig) barconfigs;
 
 /**
  * Used during the config file lexing/parsing to keep the state of the lexer
@@ -32,17 +31,18 @@ extern SLIST_HEAD(modes_head, Mode) modes;
  *
  */
 struct context {
-        bool has_errors;
+    bool has_errors;
+    bool has_warnings;
 
-        int line_number;
-        char *line_copy;
-        const char *filename;
+    int line_number;
+    char *line_copy;
+    const char *filename;
 
-        char *compact_error;
+    char *compact_error;
 
-        /* These are the same as in YYLTYPE */
-        int first_column;
-        int last_column;
+    /* These are the same as in YYLTYPE */
+    int first_column;
+    int last_column;
 };
 
 /**
@@ -51,9 +51,9 @@ struct context {
  *
  */
 struct Colortriple {
-        uint32_t border;
-        uint32_t background;
-        uint32_t text;
+    uint32_t border;
+    uint32_t background;
+    uint32_t text;
 };
 
 /**
@@ -62,11 +62,11 @@ struct Colortriple {
  *
  */
 struct Variable {
-        char *key;
-        char *value;
-        char *next_match;
+    char *key;
+    char *value;
+    char *next_match;
 
-        SLIST_ENTRY(Variable) variables;
+    SLIST_ENTRY(Variable) variables;
 };
 
 /**
@@ -76,10 +76,10 @@ struct Variable {
  *
  */
 struct Mode {
-        char *name;
-        struct bindings_head *bindings;
+    char *name;
+    struct bindings_head *bindings;
 
-        SLIST_ENTRY(Mode) modes;
+    SLIST_ENTRY(Mode) modes;
 };
 
 /**
@@ -88,86 +88,169 @@ struct Mode {
  *
  */
 struct Config {
-        const char *terminal;
-        i3Font font;
-
-        char *ipc_socket_path;
-        const char *restart_state_path;
-
-        int default_layout;
-        int container_stack_limit;
-        int container_stack_limit_value;
-
-        /** Default orientation for new containers */
-        int default_orientation;
-
-        /** By default, focus follows mouse. If the user explicitly wants to
-         * turn this off (and instead rely only on the keyboard for changing
-         * focus), we allow him to do this with this relatively special option.
-         * It is not planned to add any different focus models. */
-        bool disable_focus_follows_mouse;
-
-        /** By default, a workspace bar is drawn at the bottom of the screen.
-         * If you want to have a more fancy bar, it is recommended to replace
-         * the whole bar by dzen2, for example using the i3-wsbar script which
-         * comes with i3. Thus, you can turn it off entirely. */
-        bool disable_workspace_bar;
-
-        /** Think of the following layout: Horizontal workspace with a tabbed
-         * con on the left of the screen and a terminal on the right of the
-         * screen. You are in the second container in the tabbed container and
-         * focus to the right. By default, i3 will set focus to the terminal on
-         * the right. If you are in the first container in the tabbed container
-         * however, focusing to the left will wrap. This option forces i3 to
-         * always wrap, which will result in you having to use "focus parent"
-         * more often. */
-        bool force_focus_wrapping;
-
-        /** By default, use the RandR API for multi-monitor setups.
-         * Unfortunately, the nVidia binary graphics driver doesn't support
-         * this API. Instead, it only support the less powerful Xinerama API,
-         * which can be enabled by this option.
-         *
-         * Note: this option takes only effect on the initial startup (eg.
-         * reconfiguration is not possible). On startup, the list of screens
-         * is fetched once and never updated. */
-        bool force_xinerama;
-
-        /** Automatic workspace back and forth switching. If this is set, a
-         * switch to the currently active workspace will switch to the
-         * previously focused one instead, making it possible to fast toggle
-         * between two workspaces. */
-        bool workspace_auto_back_and_forth;
-
-        /** The default border style for new windows. */
-        border_style_t default_border;
-
-        /** The default border style for new floating windows. */
-        border_style_t default_floating_border;
-
-        /** The modifier which needs to be pressed in combination with your mouse
-         * buttons to do things with floating windows (move, resize) */
-        uint32_t floating_modifier;
-
-        /* Color codes are stored here */
-        struct config_client {
-                uint32_t background;
-                struct Colortriple focused;
-                struct Colortriple focused_inactive;
-                struct Colortriple unfocused;
-                struct Colortriple urgent;
-        } client;
-        struct config_bar {
-                struct Colortriple focused;
-                struct Colortriple unfocused;
-                struct Colortriple urgent;
-        } bar;
-
-        /** What should happen when a new popup is opened during fullscreen mode */
-        enum {
-                PDF_LEAVE_FULLSCREEN = 0,
-                PDF_IGNORE = 1
-        } popup_during_fullscreen;
+    const char *terminal;
+    i3Font font;
+
+    char *ipc_socket_path;
+    const char *restart_state_path;
+
+    int default_layout;
+    int container_stack_limit;
+    int container_stack_limit_value;
+
+    /** Default orientation for new containers */
+    int default_orientation;
+
+    /** By default, focus follows mouse. If the user explicitly wants to
+     * turn this off (and instead rely only on the keyboard for changing
+     * focus), we allow him to do this with this relatively special option.
+     * It is not planned to add any different focus models. */
+    bool disable_focus_follows_mouse;
+
+    /** By default, a workspace bar is drawn at the bottom of the screen.
+     * If you want to have a more fancy bar, it is recommended to replace
+     * the whole bar by dzen2, for example using the i3-wsbar script which
+     * comes with i3. Thus, you can turn it off entirely. */
+    bool disable_workspace_bar;
+
+    /** Think of the following layout: Horizontal workspace with a tabbed
+     * con on the left of the screen and a terminal on the right of the
+     * screen. You are in the second container in the tabbed container and
+     * focus to the right. By default, i3 will set focus to the terminal on
+     * the right. If you are in the first container in the tabbed container
+     * however, focusing to the left will wrap. This option forces i3 to
+     * always wrap, which will result in you having to use "focus parent"
+     * more often. */
+    bool force_focus_wrapping;
+
+    /** By default, use the RandR API for multi-monitor setups.
+     * Unfortunately, the nVidia binary graphics driver doesn't support
+     * this API. Instead, it only support the less powerful Xinerama API,
+     * which can be enabled by this option.
+     *
+     * Note: this option takes only effect on the initial startup (eg.
+     * reconfiguration is not possible). On startup, the list of screens
+     * is fetched once and never updated. */
+    bool force_xinerama;
+
+    /** Automatic workspace back and forth switching. If this is set, a
+     * switch to the currently active workspace will switch to the
+     * previously focused one instead, making it possible to fast toggle
+     * between two workspaces. */
+    bool workspace_auto_back_and_forth;
+
+    /** The default border style for new windows. */
+    border_style_t default_border;
+
+    /** The default border style for new floating windows. */
+    border_style_t default_floating_border;
+
+    /** The modifier which needs to be pressed in combination with your mouse
+     * buttons to do things with floating windows (move, resize) */
+    uint32_t floating_modifier;
+
+    /* Color codes are stored here */
+    struct config_client {
+        uint32_t background;
+        struct Colortriple focused;
+        struct Colortriple focused_inactive;
+        struct Colortriple unfocused;
+        struct Colortriple urgent;
+    } client;
+    struct config_bar {
+        struct Colortriple focused;
+        struct Colortriple unfocused;
+        struct Colortriple urgent;
+    } bar;
+
+    /** What should happen when a new popup is opened during fullscreen mode */
+    enum {
+        PDF_LEAVE_FULLSCREEN = 0,
+        PDF_IGNORE = 1
+    } popup_during_fullscreen;
+};
+
+/**
+ * Holds the status bar configuration (i3bar). One of these structures is
+ * created for each 'bar' block in the config.
+ *
+ */
+struct Barconfig {
+    /** Automatically generated ID for this bar config. Used by the bar process
+     * to request a specific configuration. */
+    char *id;
+
+    /** Number of outputs in the outputs array */
+    int num_outputs;
+    /** Outputs on which this bar should show up on. We use an array for
+     * simplicity (since we store just strings). */
+    char **outputs;
+
+    /** Output on which the tray should be shown. The special value of 'no'
+     * disables the tray (it’s enabled by default). */
+    char *tray_output;
+
+    /** Path to the i3 IPC socket. This option is discouraged since programs
+     * can find out the path by looking for the I3_SOCKET_PATH property on the
+     * root window! */
+    char *socket_path;
+
+    /** Bar display mode (hide unless modifier is pressed or show in dock mode) */
+    enum { M_DOCK = 0, M_HIDE = 1 } mode;
+
+    /** Bar modifier (to show bar when in hide mode). */
+    enum {
+        M_NONE = 0,
+        M_CONTROL = 1,
+        M_SHIFT = 2,
+        M_MOD1 = 3,
+        M_MOD2 = 4,
+        M_MOD3 = 5,
+        M_MOD4 = 6,
+        M_MOD5 = 7
+    } modifier;
+
+    /** Bar position (bottom by default). */
+    enum { P_BOTTOM = 0, P_TOP = 1 } position;
+
+    /** Command that should be run to execute i3bar, give a full path if i3bar is not
+     * in your $PATH.
+     * By default just 'i3bar' is executed. */
+    char *i3bar_command;
+
+    /** Command that should be run to get a statusline, for example 'i3status'.
+     * Will be passed to the shell. */
+    char *status_command;
+
+    /** Font specification for all text rendered on the bar. */
+    char *font;
+
+    /** Hide workspace buttons? Configuration option is 'workspace_buttons no'
+     * but we invert the bool to get the correct default when initializing with
+     * zero. */
+    bool hide_workspace_buttons;
+
+    /** Enable verbose mode? Useful for debugging purposes. */
+    bool verbose;
+
+    struct bar_colors {
+        char *background;
+        char *statusline;
+
+        char *focused_workspace_text;
+        char *focused_workspace_bg;
+
+        char *active_workspace_text;
+        char *active_workspace_bg;
+
+        char *inactive_workspace_text;
+        char *inactive_workspace_bg;
+
+        char *urgent_workspace_text;
+        char *urgent_workspace_bg;
+    } colors;
+
+    TAILQ_ENTRY(Barconfig) configs;
 };
 
 /**