i3
config_directives.c
Go to the documentation of this file.
1 /*
2  * vim:ts=4:sw=4:expandtab
3  *
4  * i3 - an improved dynamic tiling window manager
5  * © 2009 Michael Stapelberg and contributors (see also: LICENSE)
6  *
7  * config_directives.c: all config storing functions (see config_parser.c)
8  *
9  */
10 #include "all.h"
11 
12 #include <float.h>
13 #include <stdarg.h>
14 
15 /*******************************************************************************
16  * Criteria functions.
17  ******************************************************************************/
18 
20 
21 /*
22  * Initializes the specified 'Match' data structure and the initial state of
23  * commands.c for matching target windows of a command.
24  *
25  */
26 CFGFUN(criteria_init, int _state) {
27  criteria_next_state = _state;
28 
29  DLOG("Initializing criteria, current_match = %p, state = %d\n", current_match, _state);
32 }
33 
34 CFGFUN(criteria_pop_state) {
35  result->next_state = criteria_next_state;
36 }
37 
38 /*
39  * Interprets a ctype=cvalue pair and adds it to the current match
40  * specification.
41  *
42  */
43 CFGFUN(criteria_add, const char *ctype, const char *cvalue) {
44  match_parse_property(current_match, ctype, cvalue);
45 }
46 
47 /*******************************************************************************
48  * Utility functions
49  ******************************************************************************/
50 
51 static bool eval_boolstr(const char *str) {
52  return (strcasecmp(str, "1") == 0 ||
53  strcasecmp(str, "yes") == 0 ||
54  strcasecmp(str, "true") == 0 ||
55  strcasecmp(str, "on") == 0 ||
56  strcasecmp(str, "enable") == 0 ||
57  strcasecmp(str, "active") == 0);
58 }
59 
60 /*
61  * A utility function to convert a string containing the group and modifiers to
62  * the corresponding bit mask.
63  */
65  /* It might be better to use strtok() here, but the simpler strstr() should
66  * do for now. */
67  i3_event_state_mask_t result = 0;
68  if (str == NULL)
69  return result;
70  if (strstr(str, "Mod1") != NULL)
71  result |= XCB_KEY_BUT_MASK_MOD_1;
72  if (strstr(str, "Mod2") != NULL)
73  result |= XCB_KEY_BUT_MASK_MOD_2;
74  if (strstr(str, "Mod3") != NULL)
75  result |= XCB_KEY_BUT_MASK_MOD_3;
76  if (strstr(str, "Mod4") != NULL)
77  result |= XCB_KEY_BUT_MASK_MOD_4;
78  if (strstr(str, "Mod5") != NULL)
79  result |= XCB_KEY_BUT_MASK_MOD_5;
80  if (strstr(str, "Control") != NULL ||
81  strstr(str, "Ctrl") != NULL)
82  result |= XCB_KEY_BUT_MASK_CONTROL;
83  if (strstr(str, "Shift") != NULL)
84  result |= XCB_KEY_BUT_MASK_SHIFT;
85 
86  if (strstr(str, "Group1") != NULL)
87  result |= (I3_XKB_GROUP_MASK_1 << 16);
88  if (strstr(str, "Group2") != NULL ||
89  strstr(str, "Mode_switch") != NULL)
90  result |= (I3_XKB_GROUP_MASK_2 << 16);
91  if (strstr(str, "Group3") != NULL)
92  result |= (I3_XKB_GROUP_MASK_3 << 16);
93  if (strstr(str, "Group4") != NULL)
94  result |= (I3_XKB_GROUP_MASK_4 << 16);
95  return result;
96 }
97 
98 static char *font_pattern;
99 
100 CFGFUN(font, const char *font) {
101  config.font = load_font(font, true);
102  set_font(&config.font);
103 
104  /* Save the font pattern for using it as bar font later on */
106  font_pattern = sstrdup(font);
107 }
108 
109 CFGFUN(binding, const char *bindtype, const char *modifiers, const char *key, const char *release, const char *border, const char *whole_window, const char *exclude_titlebar, const char *command) {
110  configure_binding(bindtype, modifiers, key, release, border, whole_window, exclude_titlebar, command, DEFAULT_BINDING_MODE, false);
111 }
112 
113 /*******************************************************************************
114  * Mode handling
115  ******************************************************************************/
116 
117 static char *current_mode;
119 
120 CFGFUN(mode_binding, const char *bindtype, const char *modifiers, const char *key, const char *release, const char *border, const char *whole_window, const char *exclude_titlebar, const char *command) {
121  configure_binding(bindtype, modifiers, key, release, border, whole_window, exclude_titlebar, command, current_mode, current_mode_pango_markup);
122 }
123 
124 CFGFUN(enter_mode, const char *pango_markup, const char *modename) {
125  if (strcasecmp(modename, DEFAULT_BINDING_MODE) == 0) {
126  ELOG("You cannot use the name %s for your mode\n", DEFAULT_BINDING_MODE);
127  return;
128  }
129 
130  struct Mode *mode;
131  SLIST_FOREACH(mode, &modes, modes) {
132  if (strcmp(mode->name, modename) == 0) {
133  ELOG("The binding mode with name \"%s\" is defined at least twice.\n", modename);
134  }
135  }
136 
137  DLOG("\t now in mode %s\n", modename);
139  current_mode = sstrdup(modename);
140  current_mode_pango_markup = (pango_markup != NULL);
141 }
142 
143 CFGFUN(exec, const char *exectype, const char *no_startup_id, const char *command) {
144  struct Autostart *new = smalloc(sizeof(struct Autostart));
145  new->command = sstrdup(command);
146  new->no_startup_id = (no_startup_id != NULL);
147  if (strcmp(exectype, "exec") == 0) {
149  } else {
151  }
152 }
153 
154 CFGFUN(for_window, const char *command) {
156  ELOG("Match is empty, ignoring this for_window statement\n");
157  return;
158  }
159  DLOG("\t should execute command %s for the criteria mentioned above\n", command);
160  Assignment *assignment = scalloc(1, sizeof(Assignment));
161  assignment->type = A_COMMAND;
162  match_copy(&(assignment->match), current_match);
163  assignment->dest.command = sstrdup(command);
165 }
166 
167 CFGFUN(floating_minimum_size, const long width, const long height) {
170 }
171 
172 CFGFUN(floating_maximum_size, const long width, const long height) {
175 }
176 
177 CFGFUN(floating_modifier, const char *modifiers) {
179 }
180 
181 CFGFUN(default_orientation, const char *orientation) {
182  if (strcmp(orientation, "horizontal") == 0)
184  else if (strcmp(orientation, "vertical") == 0)
186  else
188 }
189 
190 CFGFUN(workspace_layout, const char *layout) {
191  if (strcmp(layout, "default") == 0)
193  else if (strcmp(layout, "stacking") == 0 ||
194  strcmp(layout, "stacked") == 0)
196  else
198 }
199 
200 CFGFUN(default_border, const char *windowtype, const char *border, const long width) {
201  int border_style;
202  int border_width;
203 
204  if (strcmp(border, "1pixel") == 0) {
205  border_style = BS_PIXEL;
206  border_width = 1;
207  } else if (strcmp(border, "none") == 0) {
208  border_style = BS_NONE;
209  border_width = 0;
210  } else if (strcmp(border, "pixel") == 0) {
211  border_style = BS_PIXEL;
212  border_width = width;
213  } else {
214  border_style = BS_NORMAL;
215  border_width = width;
216  }
217 
218  if ((strcmp(windowtype, "default_border") == 0) ||
219  (strcmp(windowtype, "new_window") == 0)) {
220  DLOG("default tiled border style = %d and border width = %d (%d physical px)\n",
221  border_style, border_width, logical_px(border_width));
222  config.default_border = border_style;
223  config.default_border_width = logical_px(border_width);
224  } else {
225  DLOG("default floating border style = %d and border width = %d (%d physical px)\n",
226  border_style, border_width, logical_px(border_width));
227  config.default_floating_border = border_style;
229  }
230 }
231 
232 CFGFUN(hide_edge_borders, const char *borders) {
233  if (strcmp(borders, "smart") == 0)
235  else if (strcmp(borders, "vertical") == 0)
237  else if (strcmp(borders, "horizontal") == 0)
239  else if (strcmp(borders, "both") == 0)
241  else if (strcmp(borders, "none") == 0)
243  else if (eval_boolstr(borders))
245  else
247 }
248 
249 CFGFUN(focus_follows_mouse, const char *value) {
251 }
252 
253 CFGFUN(mouse_warping, const char *value) {
254  if (strcmp(value, "none") == 0)
256  else if (strcmp(value, "output") == 0)
258 }
259 
260 CFGFUN(force_xinerama, const char *value) {
262 }
263 
264 CFGFUN(disable_randr15, const char *value) {
266 }
267 
268 CFGFUN(focus_wrapping, const char *value) {
269  if (strcmp(value, "force") == 0) {
271  } else if (eval_boolstr(value)) {
273  } else {
275  }
276 }
277 
278 CFGFUN(force_focus_wrapping, const char *value) {
279  /* Legacy syntax. */
280  if (eval_boolstr(value)) {
282  } else {
283  /* For "force_focus_wrapping off", don't enable or disable
284  * focus wrapping, just ensure it's not forced. */
287  }
288  }
289 }
290 
291 CFGFUN(workspace_back_and_forth, const char *value) {
293 }
294 
295 CFGFUN(fake_outputs, const char *outputs) {
296  free(config.fake_outputs);
297  config.fake_outputs = sstrdup(outputs);
298 }
299 
300 CFGFUN(force_display_urgency_hint, const long duration_ms) {
301  config.workspace_urgency_timer = duration_ms / 1000.0;
302 }
303 
304 CFGFUN(focus_on_window_activation, const char *mode) {
305  if (strcmp(mode, "smart") == 0)
306  config.focus_on_window_activation = FOWA_SMART;
307  else if (strcmp(mode, "urgent") == 0)
308  config.focus_on_window_activation = FOWA_URGENT;
309  else if (strcmp(mode, "focus") == 0)
310  config.focus_on_window_activation = FOWA_FOCUS;
311  else if (strcmp(mode, "none") == 0)
313  else {
314  ELOG("Unknown focus_on_window_activation mode \"%s\", ignoring it.\n", mode);
315  return;
316  }
317 
318  DLOG("Set new focus_on_window_activation mode = %i.\n", config.focus_on_window_activation);
319 }
320 
321 CFGFUN(show_marks, const char *value) {
322  config.show_marks = eval_boolstr(value);
323 }
324 
325 CFGFUN(workspace, const char *workspace, const char *output) {
326  DLOG("Assigning workspace \"%s\" to output \"%s\"\n", workspace, output);
327  /* Check for earlier assignments of the same workspace so that we
328  * don’t have assignments of a single workspace to different
329  * outputs */
330  struct Workspace_Assignment *assignment;
331  bool duplicate = false;
333  if (strcasecmp(assignment->name, workspace) == 0) {
334  ELOG("You have a duplicate workspace assignment for workspace \"%s\"\n",
335  workspace);
336  assignment->output = sstrdup(output);
337  duplicate = true;
338  }
339  }
340  if (!duplicate) {
341  assignment = scalloc(1, sizeof(struct Workspace_Assignment));
342  assignment->name = sstrdup(workspace);
343  assignment->output = sstrdup(output);
345  }
346 }
347 
348 CFGFUN(ipc_socket, const char *path) {
349  free(config.ipc_socket_path);
351 }
352 
353 CFGFUN(restart_state, const char *path) {
356 }
357 
358 CFGFUN(popup_during_fullscreen, const char *value) {
359  if (strcmp(value, "ignore") == 0) {
360  config.popup_during_fullscreen = PDF_IGNORE;
361  } else if (strcmp(value, "leave_fullscreen") == 0) {
362  config.popup_during_fullscreen = PDF_LEAVE_FULLSCREEN;
363  } else {
364  config.popup_during_fullscreen = PDF_SMART;
365  }
366 }
367 
368 CFGFUN(color_single, const char *colorclass, const char *color) {
369  /* used for client.background only currently */
371 }
372 
373 CFGFUN(color, const char *colorclass, const char *border, const char *background, const char *text, const char *indicator, const char *child_border) {
374 #define APPLY_COLORS(classname) \
375  do { \
376  if (strcmp(colorclass, "client." #classname) == 0) { \
377  config.client.classname.border = draw_util_hex_to_color(border); \
378  config.client.classname.background = draw_util_hex_to_color(background); \
379  config.client.classname.text = draw_util_hex_to_color(text); \
380  if (indicator != NULL) { \
381  config.client.classname.indicator = draw_util_hex_to_color(indicator); \
382  } \
383  if (child_border != NULL) { \
384  config.client.classname.child_border = draw_util_hex_to_color(child_border); \
385  } else { \
386  config.client.classname.child_border = config.client.classname.background; \
387  } \
388  } \
389  } while (0)
390 
391  APPLY_COLORS(focused_inactive);
393  APPLY_COLORS(unfocused);
394  APPLY_COLORS(urgent);
395  APPLY_COLORS(placeholder);
396 
397 #undef APPLY_COLORS
398 }
399 
400 CFGFUN(assign_output, const char *output) {
402  ELOG("Match is empty, ignoring this assignment\n");
403  return;
404  }
405 
406  DLOG("New assignment, using above criteria, to output \"%s\".\n", output);
407  Assignment *assignment = scalloc(1, sizeof(Assignment));
408  match_copy(&(assignment->match), current_match);
409  assignment->type = A_TO_OUTPUT;
410  assignment->dest.output = sstrdup(output);
412 }
413 
414 CFGFUN(assign, const char *workspace, bool is_number) {
416  ELOG("Match is empty, ignoring this assignment\n");
417  return;
418  }
419 
420  if (is_number && ws_name_to_number(workspace) == -1) {
421  ELOG("Could not parse initial part of \"%s\" as a number.\n", workspace);
422  return;
423  }
424 
425  DLOG("New assignment, using above criteria, to workspace \"%s\".\n", workspace);
426  Assignment *assignment = scalloc(1, sizeof(Assignment));
427  match_copy(&(assignment->match), current_match);
428  assignment->type = is_number ? A_TO_WORKSPACE_NUMBER : A_TO_WORKSPACE;
429  assignment->dest.workspace = sstrdup(workspace);
431 }
432 
433 CFGFUN(no_focus) {
435  ELOG("Match is empty, ignoring this assignment\n");
436  return;
437  }
438 
439  DLOG("New assignment, using above criteria, to ignore focus on manage.\n");
440  Assignment *assignment = scalloc(1, sizeof(Assignment));
441  match_copy(&(assignment->match), current_match);
442  assignment->type = A_NO_FOCUS;
444 }
445 
446 /*******************************************************************************
447  * Bar configuration (i3bar)
448  ******************************************************************************/
449 
451 
452 CFGFUN(bar_font, const char *font) {
453  FREE(current_bar->font);
454  current_bar->font = sstrdup(font);
455 }
456 
457 CFGFUN(bar_separator_symbol, const char *separator) {
458  FREE(current_bar->separator_symbol);
459  current_bar->separator_symbol = sstrdup(separator);
460 }
461 
462 CFGFUN(bar_mode, const char *mode) {
463  current_bar->mode = (strcmp(mode, "dock") == 0 ? M_DOCK : (strcmp(mode, "hide") == 0 ? M_HIDE : M_INVISIBLE));
464 }
465 
466 CFGFUN(bar_hidden_state, const char *hidden_state) {
467  current_bar->hidden_state = (strcmp(hidden_state, "hide") == 0 ? S_HIDE : S_SHOW);
468 }
469 
470 CFGFUN(bar_id, const char *bar_id) {
471  current_bar->id = sstrdup(bar_id);
472 }
473 
474 CFGFUN(bar_output, const char *output) {
475  int new_outputs = current_bar->num_outputs + 1;
476  current_bar->outputs = srealloc(current_bar->outputs, sizeof(char *) * new_outputs);
477  current_bar->outputs[current_bar->num_outputs] = sstrdup(output);
478  current_bar->num_outputs = new_outputs;
479 }
480 
481 CFGFUN(bar_verbose, const char *verbose) {
482  current_bar->verbose = eval_boolstr(verbose);
483 }
484 
485 CFGFUN(bar_modifier, const char *modifier) {
486  if (strcmp(modifier, "Mod1") == 0)
487  current_bar->modifier = M_MOD1;
488  else if (strcmp(modifier, "Mod2") == 0)
489  current_bar->modifier = M_MOD2;
490  else if (strcmp(modifier, "Mod3") == 0)
491  current_bar->modifier = M_MOD3;
492  else if (strcmp(modifier, "Mod4") == 0)
493  current_bar->modifier = M_MOD4;
494  else if (strcmp(modifier, "Mod5") == 0)
495  current_bar->modifier = M_MOD5;
496  else if (strcmp(modifier, "Control") == 0 ||
497  strcmp(modifier, "Ctrl") == 0)
498  current_bar->modifier = M_CONTROL;
499  else if (strcmp(modifier, "Shift") == 0)
500  current_bar->modifier = M_SHIFT;
501  else if (strcmp(modifier, "none") == 0 ||
502  strcmp(modifier, "off") == 0)
503  current_bar->modifier = M_NONE;
504 }
505 
506 static void bar_configure_binding(const char *button, const char *release, const char *command) {
507  if (strncasecmp(button, "button", strlen("button")) != 0) {
508  ELOG("Bindings for a bar can only be mouse bindings, not \"%s\", ignoring.\n", button);
509  return;
510  }
511 
512  int input_code = atoi(button + strlen("button"));
513  if (input_code < 1) {
514  ELOG("Button \"%s\" does not seem to be in format 'buttonX'.\n", button);
515  return;
516  }
517  const bool release_bool = release != NULL;
518 
519  struct Barbinding *current;
520  TAILQ_FOREACH(current, &(current_bar->bar_bindings), bindings) {
521  if (current->input_code == input_code && current->release == release_bool) {
522  ELOG("command for button %s was already specified, ignoring.\n", button);
523  return;
524  }
525  }
526 
527  struct Barbinding *new_binding = scalloc(1, sizeof(struct Barbinding));
528  new_binding->release = release_bool;
529  new_binding->input_code = input_code;
530  new_binding->command = sstrdup(command);
531  TAILQ_INSERT_TAIL(&(current_bar->bar_bindings), new_binding, bindings);
532 }
533 
534 CFGFUN(bar_wheel_up_cmd, const char *command) {
535  ELOG("'wheel_up_cmd' is deprecated. Please us 'bindsym button4 %s' instead.\n", command);
536  bar_configure_binding("button4", NULL, command);
537 }
538 
539 CFGFUN(bar_wheel_down_cmd, const char *command) {
540  ELOG("'wheel_down_cmd' is deprecated. Please us 'bindsym button5 %s' instead.\n", command);
541  bar_configure_binding("button5", NULL, command);
542 }
543 
544 CFGFUN(bar_bindsym, const char *button, const char *release, const char *command) {
545  bar_configure_binding(button, release, command);
546 }
547 
548 CFGFUN(bar_position, const char *position) {
549  current_bar->position = (strcmp(position, "top") == 0 ? P_TOP : P_BOTTOM);
550 }
551 
552 CFGFUN(bar_i3bar_command, const char *i3bar_command) {
553  FREE(current_bar->i3bar_command);
554  current_bar->i3bar_command = sstrdup(i3bar_command);
555 }
556 
557 CFGFUN(bar_color, const char *colorclass, const char *border, const char *background, const char *text) {
558 #define APPLY_COLORS(classname) \
559  do { \
560  if (strcmp(colorclass, #classname) == 0) { \
561  if (text != NULL) { \
562  /* New syntax: border, background, text */ \
563  current_bar->colors.classname##_border = sstrdup(border); \
564  current_bar->colors.classname##_bg = sstrdup(background); \
565  current_bar->colors.classname##_text = sstrdup(text); \
566  } else { \
567  /* Old syntax: text, background */ \
568  current_bar->colors.classname##_bg = sstrdup(background); \
569  current_bar->colors.classname##_text = sstrdup(border); \
570  } \
571  } \
572  } while (0)
573 
574  APPLY_COLORS(focused_workspace);
575  APPLY_COLORS(active_workspace);
576  APPLY_COLORS(inactive_workspace);
577  APPLY_COLORS(urgent_workspace);
578  APPLY_COLORS(binding_mode);
579 
580 #undef APPLY_COLORS
581 }
582 
583 CFGFUN(bar_socket_path, const char *socket_path) {
584  FREE(current_bar->socket_path);
585  current_bar->socket_path = sstrdup(socket_path);
586 }
587 
588 CFGFUN(bar_tray_output, const char *output) {
589  struct tray_output_t *tray_output = scalloc(1, sizeof(struct tray_output_t));
590  tray_output->output = sstrdup(output);
591  TAILQ_INSERT_TAIL(&(current_bar->tray_outputs), tray_output, tray_outputs);
592 }
593 
594 CFGFUN(bar_tray_padding, const long padding_px) {
595  current_bar->tray_padding = padding_px;
596 }
597 
598 CFGFUN(bar_color_single, const char *colorclass, const char *color) {
599  if (strcmp(colorclass, "background") == 0)
600  current_bar->colors.background = sstrdup(color);
601  else if (strcmp(colorclass, "separator") == 0)
602  current_bar->colors.separator = sstrdup(color);
603  else if (strcmp(colorclass, "statusline") == 0)
604  current_bar->colors.statusline = sstrdup(color);
605  else if (strcmp(colorclass, "focused_background") == 0)
606  current_bar->colors.focused_background = sstrdup(color);
607  else if (strcmp(colorclass, "focused_separator") == 0)
608  current_bar->colors.focused_separator = sstrdup(color);
609  else
610  current_bar->colors.focused_statusline = sstrdup(color);
611 }
612 
613 CFGFUN(bar_status_command, const char *command) {
614  FREE(current_bar->status_command);
615  current_bar->status_command = sstrdup(command);
616 }
617 
618 CFGFUN(bar_binding_mode_indicator, const char *value) {
619  current_bar->hide_binding_mode_indicator = !eval_boolstr(value);
620 }
621 
622 CFGFUN(bar_workspace_buttons, const char *value) {
623  current_bar->hide_workspace_buttons = !eval_boolstr(value);
624 }
625 
626 CFGFUN(bar_strip_workspace_numbers, const char *value) {
627  current_bar->strip_workspace_numbers = eval_boolstr(value);
628 }
629 
630 CFGFUN(bar_start) {
631  current_bar = scalloc(1, sizeof(struct Barconfig));
632  TAILQ_INIT(&(current_bar->bar_bindings));
633  TAILQ_INIT(&(current_bar->tray_outputs));
634  current_bar->tray_padding = 2;
635  current_bar->modifier = M_MOD4;
636 }
637 
638 CFGFUN(bar_finish) {
639  DLOG("\t new bar configuration finished, saving.\n");
640  /* Generate a unique ID for this bar if not already configured */
641  if (current_bar->id == NULL)
642  sasprintf(&current_bar->id, "bar-%d", config.number_barconfigs);
643 
645 
646  /* If no font was explicitly set, we use the i3 font as default */
647  if (current_bar->font == NULL && font_pattern != NULL)
648  current_bar->font = sstrdup(font_pattern);
649 
650  TAILQ_INSERT_TAIL(&barconfigs, current_bar, configs);
651  /* Simply reset the pointer, but don't free the resources. */
652  current_bar = NULL;
653 }
bool disable_focus_follows_mouse
By default, focus follows mouse.
static bool eval_boolstr(const char *str)
int32_t floating_minimum_height
int sasprintf(char **strp, const char *fmt,...)
Safe-wrapper around asprintf which exits if it returns -1 (meaning that there is no more memory avail...
Con * focused
Definition: tree.c:13
uint32_t floating_modifier
The modifier which needs to be pressed in combination with your mouse buttons to do things with float...
struct outputs_head outputs
Definition: randr.c:21
void workspace_back_and_forth(void)
Focuses the previously focused workspace.
Definition: workspace.c:753
color_t draw_util_hex_to_color(const char *color)
Parses the given color in hex format to an internal color representation.
bool hide_workspace_buttons
Hide workspace buttons? Configuration option is &#39;workspace_buttons no&#39; but we invert the bool to get ...
Holds a command specified by either an:
Definition: data.h:347
int32_t floating_minimum_width
bool verbose
Enable verbose mode? Useful for debugging purposes.
char * name
Definition: configuration.h:83
struct barconfig_head barconfigs
Definition: config.c:19
char * sstrdup(const char *str)
Safe-wrapper around strdup which exits if malloc returns NULL (meaning that there is no more memory a...
i3Font load_font(const char *pattern, const bool fallback)
Loads a font for usage, also getting its height.
Holds the status bar configuration (i3bar).
#define ELOG(fmt,...)
Definition: libi3.h:99
static bool verbose
Definition: log.c:38
char * separator_symbol
A custom separator to use instead of a vertical line.
char * workspace
Definition: data.h:579
layout_t default_layout
uint32_t width
Definition: data.h:129
An Assignment makes specific windows go to a specific workspace/output or run a command for that wind...
Definition: data.h:552
Definition: data.h:93
void match_free(Match *match)
Frees the given match.
Definition: match.c:267
#define TAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:376
const char * DEFAULT_BINDING_MODE
The name of the default mode.
Definition: bindings.c:23
static void bar_configure_binding(const char *button, const char *release, const char *command)
#define APPLY_COLORS(classname)
enum Config::@6 focus_on_window_activation
Behavior when a window sends a NET_ACTIVE_WINDOW message.
Defines a mouse command to be executed instead of the default behavior when clicking on the non-statu...
struct bindings_head * bindings
Definition: main.c:76
struct autostarts_always_head autostarts_always
Definition: main.c:82
union Assignment::@19 dest
destination workspace/command, depending on the type
bool strip_workspace_numbers
Strip workspace numbers? Configuration option is &#39;strip_workspace_numbers yes&#39;.
struct assignments_head assignments
Definition: main.c:85
struct modes_head modes
Definition: config.c:18
char * command
The command which is to be executed for this button.
Definition: data.h:62
CFGFUN(criteria_init, int _state)
void match_parse_property(Match *match, const char *ctype, const char *cvalue)
Interprets a ctype=cvalue pair and adds it to the given match specification.
Definition: match.c:282
bool force_xinerama
Definition: main.c:95
int num_outputs
Number of outputs in the outputs array.
enum Barconfig::@9 hidden_state
#define FREE(pointer)
Definition: util.h:50
Definition: data.h:60
char * i3bar_command
Command that should be run to execute i3bar, give a full path if i3bar is not in your $PATH...
Definition: data.h:63
static int criteria_next_state
struct Config::config_client client
int default_orientation
Default orientation for new containers.
bool force_xinerama
By default, use the RandR API for multi-monitor setups.
border_style_t default_border
The default border style for new windows.
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:347
bool match_is_empty(Match *match)
Check if a match is empty.
Definition: match.c:39
void set_font(i3Font *font)
Defines the font to be used for the forthcoming calls.
bool pango_markup
Definition: configuration.h:84
int default_floating_border_width
bool workspace_auto_back_and_forth
Automatic workspace back and forth switching.
char * command
Definition: data.h:578
static char * font_pattern
Definition: data.h:61
static char * current_mode
void * smalloc(size_t size)
Safe-wrapper around malloc which exits if malloc returns NULL (meaning that there is no more memory a...
enum Barconfig::@11 position
Bar position (bottom by default).
Stores which workspace (by name or number) goes to which output.
Definition: data.h:207
Definition: data.h:92
void * scalloc(size_t num, size_t size)
Safe-wrapper around calloc which exits if malloc returns NULL (meaning that there is no more memory a...
#define TAILQ_INIT(head)
Definition: queue.h:360
char * ipc_socket_path
hide_edge_borders_mode_t hide_edge_borders
Remove borders if they are adjacent to the screen edge.
char * id
Automatically generated ID for this bar config.
char * output
Definition: data.h:580
static bool current_mode_pango_markup
int32_t floating_maximum_width
Maximum and minimum dimensions of a floating window.
enum Config::@7 popup_during_fullscreen
What should happen when a new popup is opened during fullscreen mode.
enum Assignment::@18 type
type of this assignment:
void * srealloc(void *ptr, size_t size)
Safe-wrapper around realloc which exits if realloc returns NULL (meaning that there is no more memory...
bool release
If true, the command will be executed after the button is released.
struct autostarts_head autostarts
Definition: main.c:79
int logical_px(const int logical)
Convert a logical amount of pixels (e.g.
int32_t floating_maximum_height
char * font
Font specification for all text rendered on the bar.
int number_barconfigs
i3_event_state_mask_t event_state_from_str(const char *str)
A utility function to convert a string containing the group and modifiers to the corresponding bit ma...
Definition: data.h:79
uint32_t height
Definition: data.h:130
bool show_marks
Specifies whether or not marks should be displayed in the window decoration.
int input_code
The button to be used (e.g., 1 for "button1").
float workspace_urgency_timer
By default, urgency is cleared immediately when switching to another workspace leads to focusing the ...
enum Barconfig::@8 mode
Bar display mode (hide unless modifier is pressed or show in dock mode or always hide in invisible mo...
char ** outputs
Outputs on which this bar should show up on.
#define DLOG(fmt,...)
Definition: libi3.h:104
char * fake_outputs
Overwrites output detection (for testing), see src/fake_outputs.c.
char * restart_state_path
#define SLIST_FOREACH(var, head, field)
Definition: queue.h:114
The configuration file can contain multiple sets of bindings.
Definition: configuration.h:82
Definition: data.h:94
static Match current_match
border_style_t default_floating_border
The default border style for new floating windows.
long ws_name_to_number(const char *name)
Parses the workspace name as a number.
Definition: util.c:102
struct ws_assignments_head ws_assignments
Definition: main.c:89
int default_border_width
enum Barconfig::@10 modifier
Bar modifier (to show bar when in hide mode).
char * socket_path
Path to the i3 IPC socket.
int tray_padding
bool hide_binding_mode_indicator
Hide mode button? Configuration option is &#39;binding_mode_indicator no&#39; but we invert the bool for the ...
void match_copy(Match *dest, Match *src)
Copies the data of a match from src to dest.
Definition: match.c:62
Config config
Definition: config.c:17
char * status_command
Command that should be run to get a statusline, for example &#39;i3status&#39;.
void match_init(Match *match)
Definition: match.c:26
Definition: data.h:64
i3Font font
Definition: configuration.h:98
Binding * configure_binding(const char *bindtype, const char *modifiers, const char *input_code, const char *release, const char *border, const char *whole_window, const char *exclude_titlebar, const char *command, const char *modename, bool pango_markup)
Adds a binding from config parameters given as strings and returns a pointer to the binding structure...
Definition: bindings.c:57
struct Barconfig::bar_colors colors
static Barconfig * current_bar
uint32_t i3_event_state_mask_t
The lower 16 bits contain a xcb_key_but_mask_t, the higher 16 bits contain an i3_xkb_group_mask_t.
Definition: data.h:126
Match match
the criteria to check if a window matches
Definition: data.h:574
warping_t mouse_warping
By default, when switching focus to a window on a different output (e.g.
Definition: data.h:82
bool disable_randr15
Don’t use RandR 1.5 for querying outputs.
char * command
Command, like in command mode.
Definition: data.h:349
focus_wrapping_t focus_wrapping
When focus wrapping is enabled (the default), attempting to move focus past the edge of the screen (i...