-#undef I3__FILE__
-#define I3__FILE__ "config.c"
/*
* vim:ts=4:sw=4:expandtab
*
* i3 - an improved dynamic tiling window manager
- * © 2009-2012 Michael Stapelberg and contributors (see also: LICENSE)
+ * © 2009 Michael Stapelberg and contributors (see also: LICENSE)
*
* config.c: Configuration file (calling the parser (src/config_parser.c) with
* the correct path, switching key bindings mode).
*
*/
#include "all.h"
+
#include <xkbcommon/xkbcommon.h>
char *current_configpath = NULL;
+char *current_config = NULL;
Config config;
struct modes_head modes;
struct barconfig_head barconfigs = TAILQ_HEAD_INITIALIZER(barconfigs);
/* initialize default bindings if we're just validating the config file */
if (!use_nagbar && bindings == NULL) {
- bindings = scalloc(sizeof(struct bindings_head));
+ bindings = scalloc(1, sizeof(struct bindings_head));
TAILQ_INIT(bindings);
}
*/
void load_configuration(xcb_connection_t *conn, const char *override_configpath, bool reload) {
if (reload) {
+ /* If we are currently in a binding mode, we first revert to the
+ * default since we have no guarantee that the current mode will even
+ * still exist after parsing the config again. See #2228. */
+ switch_mode("default");
+
/* First ungrab the keys */
ungrab_all_keys(conn);
struct Mode *mode;
- Binding *bind;
while (!SLIST_EMPTY(&modes)) {
mode = SLIST_FIRST(&modes);
FREE(mode->name);
/* Clear the old binding list */
- bindings = mode->bindings;
- while (!TAILQ_EMPTY(bindings)) {
- bind = TAILQ_FIRST(bindings);
- TAILQ_REMOVE(bindings, bind, bindings);
+ while (!TAILQ_EMPTY(mode->bindings)) {
+ Binding *bind = TAILQ_FIRST(mode->bindings);
+ TAILQ_REMOVE(mode->bindings, bind, bindings);
binding_free(bind);
}
- FREE(bindings);
+ FREE(mode->bindings);
+
SLIST_REMOVE(&modes, mode, Mode, modes);
+ FREE(mode);
}
struct Assignment *assign;
FREE(barconfig->id);
for (int c = 0; c < barconfig->num_outputs; c++)
free(barconfig->outputs[c]);
+
+ while (!TAILQ_EMPTY(&(barconfig->bar_bindings))) {
+ struct Barbinding *binding = TAILQ_FIRST(&(barconfig->bar_bindings));
+ FREE(binding->command);
+ TAILQ_REMOVE(&(barconfig->bar_bindings), binding, bindings);
+ FREE(binding);
+ }
+
+ while (!TAILQ_EMPTY(&(barconfig->tray_outputs))) {
+ struct tray_output_t *tray_output = TAILQ_FIRST(&(barconfig->tray_outputs));
+ FREE(tray_output->output);
+ TAILQ_REMOVE(&(barconfig->tray_outputs), tray_output, tray_outputs);
+ FREE(tray_output);
+ }
+
FREE(barconfig->outputs);
- FREE(barconfig->tray_output);
FREE(barconfig->socket_path);
FREE(barconfig->status_command);
FREE(barconfig->i3bar_command);
FREE(barconfig->font);
FREE(barconfig->colors.background);
FREE(barconfig->colors.statusline);
+ FREE(barconfig->colors.separator);
+ FREE(barconfig->colors.focused_background);
+ FREE(barconfig->colors.focused_statusline);
+ FREE(barconfig->colors.focused_separator);
FREE(barconfig->colors.focused_workspace_border);
FREE(barconfig->colors.focused_workspace_bg);
FREE(barconfig->colors.focused_workspace_text);
FREE(barconfig->colors.urgent_workspace_border);
FREE(barconfig->colors.urgent_workspace_bg);
FREE(barconfig->colors.urgent_workspace_text);
+ FREE(barconfig->colors.binding_mode_border);
+ FREE(barconfig->colors.binding_mode_bg);
+ FREE(barconfig->colors.binding_mode_text);
TAILQ_REMOVE(&barconfigs, barconfig, configs);
FREE(barconfig);
}
-/* Clear workspace names */
-#if 0
- Workspace *ws;
- TAILQ_FOREACH(ws, workspaces, workspaces)
- workspace_set_name(ws, NULL);
-#endif
-
/* Invalidate pixmap caches in case font or colors changed */
Con *con;
TAILQ_FOREACH(con, &all_cons, all_cons)
/* Get rid of the current font */
free_font();
+
+ free(config.ipc_socket_path);
+ free(config.restart_state_path);
+ free(config.fake_outputs);
}
SLIST_INIT(&modes);
- struct Mode *default_mode = scalloc(sizeof(struct Mode));
+ struct Mode *default_mode = scalloc(1, sizeof(struct Mode));
default_mode->name = sstrdup("default");
- default_mode->bindings = scalloc(sizeof(struct bindings_head));
+ default_mode->bindings = scalloc(1, sizeof(struct bindings_head));
TAILQ_INIT(default_mode->bindings);
SLIST_INSERT_HEAD(&modes, default_mode, modes);
/* Initialize default colors */
#define INIT_COLOR(x, cborder, cbackground, ctext, cindicator) \
do { \
- x.border = get_colorpixel(cborder); \
- x.background = get_colorpixel(cbackground); \
- x.text = get_colorpixel(ctext); \
- x.indicator = get_colorpixel(cindicator); \
+ x.border = draw_util_hex_to_color(cborder); \
+ x.background = draw_util_hex_to_color(cbackground); \
+ x.text = draw_util_hex_to_color(ctext); \
+ x.indicator = draw_util_hex_to_color(cindicator); \
+ x.child_border = draw_util_hex_to_color(cbackground); \
} while (0)
- config.client.background = get_colorpixel("#000000");
+ config.client.background = draw_util_hex_to_color("#000000");
INIT_COLOR(config.client.focused, "#4c7899", "#285577", "#ffffff", "#2e9ef4");
INIT_COLOR(config.client.focused_inactive, "#333333", "#5f676a", "#ffffff", "#484e50");
INIT_COLOR(config.client.unfocused, "#333333", "#222222", "#888888", "#292d2e");
if (config.workspace_urgency_timer == 0)
config.workspace_urgency_timer = 0.5;
+ config.focus_wrapping = FOCUS_WRAPPING_ON;
+
parse_configuration(override_configpath, true);
if (reload) {
translate_keysyms();
- grab_all_keys(conn, false);
+ grab_all_keys(conn);
+ regrab_all_buttons(conn);
}
if (config.font.type == FONT_TYPE_NONE) {
x_deco_recurse(croot);
xcb_flush(conn);
}
-
-#if 0
- /* Set an empty name for every workspace which got no name */
- Workspace *ws;
- TAILQ_FOREACH(ws, workspaces, workspaces) {
- if (ws->name != NULL) {
- /* If the font was not specified when the workspace name
- * was loaded, we need to predict the text width now */
- if (ws->text_width == 0)
- ws->text_width = predict_text_width(global_conn,
- config.font, ws->name, ws->name_len);
- continue;
- }
-
- workspace_set_name(ws, NULL);
- }
-#endif
}