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 (strcmp(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);
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 (strcmp(value, "workspace") == 0) {
273  } else if (eval_boolstr(value)) {
275  } else {
277  }
278 }
279 
280 CFGFUN(force_focus_wrapping, const char *value) {
281  /* Legacy syntax. */
282  if (eval_boolstr(value)) {
284  } else {
285  /* For "force_focus_wrapping off", don't enable or disable
286  * focus wrapping, just ensure it's not forced. */
289  }
290  }
291 }
292 
293 CFGFUN(workspace_back_and_forth, const char *value) {
295 }
296 
297 CFGFUN(fake_outputs, const char *outputs) {
298  free(config.fake_outputs);
300 }
301 
302 CFGFUN(force_display_urgency_hint, const long duration_ms) {
303  config.workspace_urgency_timer = duration_ms / 1000.0;
304 }
305 
306 CFGFUN(focus_on_window_activation, const char *mode) {
307  if (strcmp(mode, "smart") == 0)
308  config.focus_on_window_activation = FOWA_SMART;
309  else if (strcmp(mode, "urgent") == 0)
310  config.focus_on_window_activation = FOWA_URGENT;
311  else if (strcmp(mode, "focus") == 0)
312  config.focus_on_window_activation = FOWA_FOCUS;
313  else if (strcmp(mode, "none") == 0)
315  else {
316  ELOG("Unknown focus_on_window_activation mode \"%s\", ignoring it.\n", mode);
317  return;
318  }
319 
320  DLOG("Set new focus_on_window_activation mode = %i.\n", config.focus_on_window_activation);
321 }
322 
323 CFGFUN(title_align, const char *alignment) {
324  if (strcmp(alignment, "left") == 0) {
325  config.title_align = ALIGN_LEFT;
326  } else if (strcmp(alignment, "center") == 0) {
327  config.title_align = ALIGN_CENTER;
328  } else if (strcmp(alignment, "right") == 0) {
329  config.title_align = ALIGN_RIGHT;
330  } else {
331  assert(false);
332  }
333 }
334 
335 CFGFUN(show_marks, const char *value) {
336  config.show_marks = eval_boolstr(value);
337 }
338 
339 static char *current_workspace = NULL;
340 
341 CFGFUN(workspace, const char *workspace, const char *output) {
342  struct Workspace_Assignment *assignment;
343 
344  /* When a new workspace line is encountered, for the first output word,
345  * $workspace from the config.spec is non-NULL. Afterwards, the parser calls
346  * clear_stack() because of the call line. Thus, we have to preserve the
347  * workspace string. */
348  if (workspace) {
350 
352  if (strcasecmp(assignment->name, workspace) == 0) {
353  ELOG("You have a duplicate workspace assignment for workspace \"%s\"\n",
354  workspace);
355  return;
356  }
357  }
358 
359  current_workspace = sstrdup(workspace);
360  } else {
361  if (!current_workspace) {
362  DLOG("Both workspace and current_workspace are NULL, assuming we had an error before\n");
363  return;
364  }
365  workspace = current_workspace;
366  }
367 
368  DLOG("Assigning workspace \"%s\" to output \"%s\"\n", workspace, output);
369 
370  assignment = scalloc(1, sizeof(struct Workspace_Assignment));
371  assignment->name = sstrdup(workspace);
372  assignment->output = sstrdup(output);
374 }
375 
376 CFGFUN(ipc_socket, const char *path) {
377  free(config.ipc_socket_path);
379 }
380 
381 CFGFUN(restart_state, const char *path) {
384 }
385 
386 CFGFUN(popup_during_fullscreen, const char *value) {
387  if (strcmp(value, "ignore") == 0) {
388  config.popup_during_fullscreen = PDF_IGNORE;
389  } else if (strcmp(value, "leave_fullscreen") == 0) {
390  config.popup_during_fullscreen = PDF_LEAVE_FULLSCREEN;
391  } else {
392  config.popup_during_fullscreen = PDF_SMART;
393  }
394 }
395 
396 CFGFUN(color_single, const char *colorclass, const char *color) {
397  /* used for client.background only currently */
399 }
400 
401 CFGFUN(color, const char *colorclass, const char *qubelabel, const char *border, const char *background, const char *text, const char *indicator, const char *child_border) {
402 #define APPLY_COLORS(classname, label) \
403  do { \
404  if (strcmp(colorclass, "client." #classname) == 0) { \
405  config.client[label].classname.border = \
406  draw_util_hex_to_color(border); \
407  config.client[label].classname.background = \
408  draw_util_hex_to_color(background); \
409  config.client[label].classname.text = \
410  draw_util_hex_to_color(text); \
411  if (indicator != NULL) { \
412  config.client[label].classname.indicator = \
413  draw_util_hex_to_color(indicator); \
414  } \
415  if (child_border != NULL) { \
416  config.client[label].classname.child_border = \
417  draw_util_hex_to_color(child_border); \
418  } else { \
419  config.client[label].classname.child_border = \
420  config.client[label].classname.background;\
421  } \
422  } \
423  } while (0)
424 
425  int valid_color = 1;
426  qube_label_t label = QUBE_DOM0;
427  if (strcmp(qubelabel, "dom0") == 0) {
428  label = QUBE_DOM0;
429  } else if (strcmp(qubelabel, "red") == 0) {
430  label = QUBE_RED;
431  } else if (strcmp(qubelabel, "orange") == 0) {
432  label = QUBE_ORANGE;
433  } else if (strcmp(qubelabel, "yellow") == 0) {
434  label = QUBE_YELLOW;
435  } else if (strcmp(qubelabel, "green") == 0) {
436  label = QUBE_GREEN;
437  } else if (strcmp(qubelabel, "gray") == 0) {
438  label = QUBE_GRAY;
439  } else if (strcmp(qubelabel, "blue") == 0) {
440  label = QUBE_BLUE;
441  } else if (strcmp(qubelabel, "purple") == 0) {
442  label = QUBE_PURPLE;
443  } else if (strcmp(qubelabel, "black") == 0) {
444  label = QUBE_BLACK;
445  } else {
446  valid_color = 0;
447  }
448 
449  if (valid_color) {
450  APPLY_COLORS(focused_inactive, label);
451  APPLY_COLORS(focused, label);
452  APPLY_COLORS(unfocused, label);
453  APPLY_COLORS(urgent, label);
454  }
455 
456 #undef APPLY_COLORS
457 }
458 
459 CFGFUN(assign_output, const char *output) {
461  ELOG("Match is empty, ignoring this assignment\n");
462  return;
463  }
464 
465  if (current_match->window_mode != WM_ANY) {
466  ELOG("Assignments using window mode (floating/tiling) is not supported\n");
467  return;
468  }
469 
470  DLOG("New assignment, using above criteria, to output \"%s\".\n", output);
471  Assignment *assignment = scalloc(1, sizeof(Assignment));
472  match_copy(&(assignment->match), current_match);
473  assignment->type = A_TO_OUTPUT;
474  assignment->dest.output = sstrdup(output);
476 }
477 
478 CFGFUN(assign, const char *workspace, bool is_number) {
480  ELOG("Match is empty, ignoring this assignment\n");
481  return;
482  }
483 
484  if (current_match->window_mode != WM_ANY) {
485  ELOG("Assignments using window mode (floating/tiling) is not supported\n");
486  return;
487  }
488 
489  if (is_number && ws_name_to_number(workspace) == -1) {
490  ELOG("Could not parse initial part of \"%s\" as a number.\n", workspace);
491  return;
492  }
493 
494  DLOG("New assignment, using above criteria, to workspace \"%s\".\n", workspace);
495  Assignment *assignment = scalloc(1, sizeof(Assignment));
496  match_copy(&(assignment->match), current_match);
497  assignment->type = is_number ? A_TO_WORKSPACE_NUMBER : A_TO_WORKSPACE;
498  assignment->dest.workspace = sstrdup(workspace);
500 }
501 
502 CFGFUN(no_focus) {
504  ELOG("Match is empty, ignoring this assignment\n");
505  return;
506  }
507 
508  DLOG("New assignment, using above criteria, to ignore focus on manage.\n");
509  Assignment *assignment = scalloc(1, sizeof(Assignment));
510  match_copy(&(assignment->match), current_match);
511  assignment->type = A_NO_FOCUS;
513 }
514 
515 CFGFUN(ipc_kill_timeout, const long timeout_ms) {
516  ipc_set_kill_timeout(timeout_ms / 1000.0);
517 }
518 
519 /*******************************************************************************
520  * Bar configuration (i3bar)
521  ******************************************************************************/
522 
524 
525 CFGFUN(bar_font, const char *font) {
527  current_bar->font = sstrdup(font);
528 }
529 
530 CFGFUN(bar_separator_symbol, const char *separator) {
532  current_bar->separator_symbol = sstrdup(separator);
533 }
534 
535 CFGFUN(bar_mode, const char *mode) {
536  current_bar->mode = (strcmp(mode, "dock") == 0 ? M_DOCK : (strcmp(mode, "hide") == 0 ? M_HIDE : M_INVISIBLE));
537 }
538 
539 CFGFUN(bar_hidden_state, const char *hidden_state) {
540  current_bar->hidden_state = (strcmp(hidden_state, "hide") == 0 ? S_HIDE : S_SHOW);
541 }
542 
543 CFGFUN(bar_id, const char *bar_id) {
544  current_bar->id = sstrdup(bar_id);
545 }
546 
547 CFGFUN(bar_output, const char *output) {
548  int new_outputs = current_bar->num_outputs + 1;
549  current_bar->outputs = srealloc(current_bar->outputs, sizeof(char *) * new_outputs);
551  current_bar->num_outputs = new_outputs;
552 }
553 
554 CFGFUN(bar_verbose, const char *verbose) {
556 }
557 
558 CFGFUN(bar_modifier, const char *modifiers) {
559  current_bar->modifier = modifiers ? event_state_from_str(modifiers) : XCB_NONE;
560 }
561 
562 static void bar_configure_binding(const char *button, const char *release, const char *command) {
563  if (strncasecmp(button, "button", strlen("button")) != 0) {
564  ELOG("Bindings for a bar can only be mouse bindings, not \"%s\", ignoring.\n", button);
565  return;
566  }
567 
568  int input_code = atoi(button + strlen("button"));
569  if (input_code < 1) {
570  ELOG("Button \"%s\" does not seem to be in format 'buttonX'.\n", button);
571  return;
572  }
573  const bool release_bool = release != NULL;
574 
575  struct Barbinding *current;
577  if (current->input_code == input_code && current->release == release_bool) {
578  ELOG("command for button %s was already specified, ignoring.\n", button);
579  return;
580  }
581  }
582 
583  struct Barbinding *new_binding = scalloc(1, sizeof(struct Barbinding));
584  new_binding->release = release_bool;
585  new_binding->input_code = input_code;
586  new_binding->command = sstrdup(command);
588 }
589 
590 CFGFUN(bar_wheel_up_cmd, const char *command) {
591  ELOG("'wheel_up_cmd' is deprecated. Please us 'bindsym button4 %s' instead.\n", command);
592  bar_configure_binding("button4", NULL, command);
593 }
594 
595 CFGFUN(bar_wheel_down_cmd, const char *command) {
596  ELOG("'wheel_down_cmd' is deprecated. Please us 'bindsym button5 %s' instead.\n", command);
597  bar_configure_binding("button5", NULL, command);
598 }
599 
600 CFGFUN(bar_bindsym, const char *button, const char *release, const char *command) {
602 }
603 
604 CFGFUN(bar_position, const char *position) {
605  current_bar->position = (strcmp(position, "top") == 0 ? P_TOP : P_BOTTOM);
606 }
607 
608 CFGFUN(bar_i3bar_command, const char *i3bar_command) {
610  current_bar->i3bar_command = sstrdup(i3bar_command);
611 }
612 
613 CFGFUN(bar_color, const char *colorclass, const char *border, const char *background, const char *text) {
614 #define APPLY_COLORS(classname) \
615  do { \
616  if (strcmp(colorclass, #classname) == 0) { \
617  if (text != NULL) { \
618  /* New syntax: border, background, text */ \
619  current_bar->colors.classname##_border = sstrdup(border); \
620  current_bar->colors.classname##_bg = sstrdup(background); \
621  current_bar->colors.classname##_text = sstrdup(text); \
622  } else { \
623  /* Old syntax: text, background */ \
624  current_bar->colors.classname##_bg = sstrdup(background); \
625  current_bar->colors.classname##_text = sstrdup(border); \
626  } \
627  } \
628  } while (0)
629 
630  APPLY_COLORS(focused_workspace);
631  APPLY_COLORS(active_workspace);
632  APPLY_COLORS(inactive_workspace);
633  APPLY_COLORS(urgent_workspace);
634  APPLY_COLORS(binding_mode);
635 
636 #undef APPLY_COLORS
637 }
638 
639 CFGFUN(bar_socket_path, const char *socket_path) {
641  current_bar->socket_path = sstrdup(socket_path);
642 }
643 
644 CFGFUN(bar_tray_output, const char *output) {
645  struct tray_output_t *tray_output = scalloc(1, sizeof(struct tray_output_t));
646  tray_output->output = sstrdup(output);
648 }
649 
650 CFGFUN(bar_tray_padding, const long padding_px) {
651  current_bar->tray_padding = padding_px;
652 }
653 
654 CFGFUN(bar_color_single, const char *colorclass, const char *color) {
655  if (strcmp(colorclass, "background") == 0)
657  else if (strcmp(colorclass, "separator") == 0)
659  else if (strcmp(colorclass, "statusline") == 0)
661  else if (strcmp(colorclass, "focused_background") == 0)
663  else if (strcmp(colorclass, "focused_separator") == 0)
665  else
667 }
668 
669 CFGFUN(bar_status_command, const char *command) {
671  current_bar->status_command = sstrdup(command);
672 }
673 
674 CFGFUN(bar_binding_mode_indicator, const char *value) {
676 }
677 
678 CFGFUN(bar_workspace_buttons, const char *value) {
680 }
681 
682 CFGFUN(bar_workspace_min_width, const long width) {
684 }
685 
686 CFGFUN(bar_strip_workspace_numbers, const char *value) {
688 }
689 
690 CFGFUN(bar_strip_workspace_name, const char *value) {
692 }
693 
694 CFGFUN(bar_start) {
695  current_bar = scalloc(1, sizeof(struct Barconfig));
699  current_bar->modifier = XCB_KEY_BUT_MASK_MOD_4;
700 }
701 
702 CFGFUN(bar_finish) {
703  DLOG("\t new bar configuration finished, saving.\n");
704  /* Generate a unique ID for this bar if not already configured */
705  if (current_bar->id == NULL)
707 
709 
710  /* If no font was explicitly set, we use the i3 font as default */
711  if (current_bar->font == NULL && font_pattern != NULL)
713 
715  /* Simply reset the pointer, but don't free the resources. */
716  current_bar = NULL;
717 }
Barbinding
Defines a mouse command to be executed instead of the default behavior when clicking on the non-statu...
Definition: configuration.h:385
Workspace_Assignment::name
char * name
Definition: data.h:226
VERT
@ VERT
Definition: data.h:61
SLIST_FOREACH
#define SLIST_FOREACH(var, head, field)
Definition: queue.h:114
POINTER_WARPING_NONE
@ POINTER_WARPING_NONE
Definition: data.h:135
Barconfig::colors
struct Barconfig::bar_colors colors
TAILQ_INIT
#define TAILQ_INIT(head)
Definition: queue.h:360
Barconfig::modifier
uint32_t modifier
Bar modifier (to show bar when in hide mode).
Definition: configuration.h:299
L_DEFAULT
@ L_DEFAULT
Definition: data.h:94
Assignment::dest
union Assignment::@19 dest
destination workspace/command/output, depending on the type
force_xinerama
bool force_xinerama
Definition: main.c:94
QUBE_DOM0
@ QUBE_DOM0
Definition: data.h:152
Barbinding::input_code
int input_code
The button to be used (e.g., 1 for "button1").
Definition: configuration.h:387
Barconfig::position
enum Barconfig::@11 position
Bar position (bottom by default).
Barconfig
Holds the status bar configuration (i3bar).
Definition: configuration.h:264
match_init
void match_init(Match *match)
Initializes the Match data structure.
Definition: match.c:26
Workspace_Assignment::output
char * output
Definition: data.h:227
bar_configure_binding
static void bar_configure_binding(const char *button, const char *release, const char *command)
Definition: config_directives.c:562
srealloc
void * srealloc(void *ptr, size_t size)
Safe-wrapper around realloc which exits if realloc returns NULL (meaning that there is no more memory...
scalloc
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...
Config::show_marks
bool show_marks
Specifies whether or not marks should be displayed in the window decoration.
Definition: configuration.h:202
Barconfig::hide_workspace_buttons
bool hide_workspace_buttons
Hide workspace buttons? Configuration option is 'workspace_buttons no' but we invert the bool to get ...
Definition: configuration.h:326
HEBM_SMART
@ HEBM_SMART
Definition: data.h:85
Barconfig::id
char * id
Automatically generated ID for this bar config.
Definition: configuration.h:267
NO_ORIENTATION
@ NO_ORIENTATION
Definition: data.h:59
Config::default_orientation
int default_orientation
Default orientation for new containers.
Definition: configuration.h:110
Config::restart_state_path
char * restart_state_path
Definition: configuration.h:101
autostarts
struct autostarts_head autostarts
Definition: main.c:77
match_copy
void match_copy(Match *dest, Match *src)
Copies the data of a match from src to dest.
Definition: match.c:62
Config::default_border
border_style_t default_border
The default border style for new windows.
Definition: configuration.h:212
Barconfig::tray_outputs
tray_outputs
Definition: configuration.h:279
set_font
void set_font(i3Font *font)
Defines the font to be used for the forthcoming calls.
Barconfig::bar_colors::background
char * background
Definition: configuration.h:347
BS_PIXEL
@ BS_PIXEL
Definition: data.h:66
QUBE_ORANGE
@ QUBE_ORANGE
Definition: data.h:154
Config::floating_maximum_width
int32_t floating_maximum_width
Maximum and minimum dimensions of a floating window.
Definition: configuration.h:222
Config::floating_minimum_height
int32_t floating_minimum_height
Definition: configuration.h:225
ws_assignments
struct ws_assignments_head ws_assignments
Definition: main.c:87
Barconfig::num_outputs
int num_outputs
Number of outputs in the outputs array.
Definition: configuration.h:270
Config::floating_modifier
uint32_t floating_modifier
The modifier which needs to be pressed in combination with your mouse buttons to do things with float...
Definition: configuration.h:219
verbose
static bool verbose
Definition: log.c:38
Mode::pango_markup
bool pango_markup
Definition: configuration.h:84
Config::default_floating_border_width
int default_floating_border_width
Definition: configuration.h:107
POINTER_WARPING_OUTPUT
@ POINTER_WARPING_OUTPUT
Definition: data.h:134
ws_name_to_number
long ws_name_to_number(const char *name)
Parses the workspace name as a number.
Definition: util.c:106
match_is_empty
bool match_is_empty(Match *match)
Check if a match is empty.
Definition: match.c:39
font_pattern
static char * font_pattern
Definition: config_directives.c:98
all.h
Config::number_barconfigs
int number_barconfigs
Definition: configuration.h:256
I3_XKB_GROUP_MASK_3
@ I3_XKB_GROUP_MASK_3
Definition: data.h:118
DEFAULT_BINDING_MODE
const char * DEFAULT_BINDING_MODE
The name of the default mode.
Definition: bindings.c:23
L_TABBED
@ L_TABBED
Definition: data.h:96
Assignment::output
char * output
Definition: data.h:618
HEBM_HORIZONTAL
@ HEBM_HORIZONTAL
Definition: data.h:83
DLOG
#define DLOG(fmt,...)
Definition: libi3.h:104
ELOG
#define ELOG(fmt,...)
Definition: libi3.h:99
Barconfig::strip_workspace_name
bool strip_workspace_name
Strip workspace name? Configuration option is 'strip_workspace_name yes'.
Definition: configuration.h:337
current_workspace
static char * current_workspace
Definition: config_directives.c:339
draw_util_hex_to_color
color_t draw_util_hex_to_color(const char *color)
Parses the given color in hex format to an internal color representation.
FOCUS_WRAPPING_OFF
@ FOCUS_WRAPPING_OFF
Definition: data.h:142
I3_XKB_GROUP_MASK_4
@ I3_XKB_GROUP_MASK_4
Definition: data.h:119
I3_XKB_GROUP_MASK_2
@ I3_XKB_GROUP_MASK_2
Definition: data.h:117
CFGFUN
CFGFUN(criteria_init, int _state)
Definition: config_directives.c:26
i3_event_state_mask_t
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:128
Barconfig::bar_colors::focused_background
char * focused_background
Definition: configuration.h:351
Config::focus_wrapping
focus_wrapping_t focus_wrapping
When focus wrapping is enabled (the default), attempting to move focus past the edge of the screen (i...
Definition: configuration.h:157
HEBM_NONE
@ HEBM_NONE
Definition: data.h:81
Assignment::command
char * command
Definition: data.h:616
Config::ipc_socket_path
char * ipc_socket_path
Definition: configuration.h:100
FOCUS_WRAPPING_ON
@ FOCUS_WRAPPING_ON
Definition: data.h:143
Barconfig::bar_colors::focused_separator
char * focused_separator
Definition: configuration.h:353
Assignment::workspace
char * workspace
Definition: data.h:617
Config::default_border_width
int default_border_width
Definition: configuration.h:106
sstrdup
char * sstrdup(const char *str)
Safe-wrapper around strdup which exits if malloc returns NULL (meaning that there is no more memory a...
FREE
#define FREE(pointer)
Definition: util.h:47
Barconfig::tray_padding
int tray_padding
Definition: configuration.h:282
Barconfig::i3bar_command
char * i3bar_command
Command that should be run to execute i3bar, give a full path if i3bar is not in your $PATH.
Definition: configuration.h:311
Barconfig::separator_symbol
char * separator_symbol
A custom separator to use instead of a vertical line.
Definition: configuration.h:321
sasprintf
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...
Config::floating_maximum_height
int32_t floating_maximum_height
Definition: configuration.h:223
QUBE_YELLOW
@ QUBE_YELLOW
Definition: data.h:155
workspace_back_and_forth
void workspace_back_and_forth(void)
Focuses the previously focused workspace.
Definition: workspace.c:804
current_match
static Match current_match
Definition: commands_parser.c:174
Config::focus_on_window_activation
enum Config::@6 focus_on_window_activation
Behavior when a window sends a NET_ACTIVE_WINDOW message.
Config::font
i3Font font
Definition: configuration.h:98
Config::workspace_urgency_timer
float workspace_urgency_timer
By default, urgency is cleared immediately when switching to another workspace leads to focusing the ...
Definition: configuration.h:186
Match::window_mode
enum Match::@16 window_mode
Barconfig::status_command
char * status_command
Command that should be run to get a statusline, for example 'i3status'.
Definition: configuration.h:315
QUBE_GREEN
@ QUBE_GREEN
Definition: data.h:156
Config::fake_outputs
char * fake_outputs
Overwrites output detection (for testing), see src/fake_outputs.c.
Definition: configuration.h:173
tray_output_t::tray_outputs
tray_outputs
Definition: configuration.h:403
L_STACKED
@ L_STACKED
Definition: data.h:95
match_free
void match_free(Match *match)
Frees the given match.
Definition: match.c:241
Barconfig::bar_colors::statusline
char * statusline
Definition: configuration.h:348
Barbinding::command
char * command
The command which is to be executed for this button.
Definition: configuration.h:390
Config::disable_randr15
bool disable_randr15
Don’t use RandR 1.5 for querying outputs.
Definition: configuration.h:170
Config::default_floating_border
border_style_t default_floating_border
The default border style for new floating windows.
Definition: configuration.h:215
Config::default_layout
layout_t default_layout
Definition: configuration.h:103
autostarts_always
struct autostarts_always_head autostarts_always
Definition: main.c:80
match_parse_property
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:256
criteria_next_state
static int criteria_next_state
Definition: config_directives.c:19
Assignment
An Assignment makes specific windows go to a specific workspace/output or run a command for that wind...
Definition: data.h:590
Barconfig::strip_workspace_numbers
bool strip_workspace_numbers
Strip workspace numbers? Configuration option is 'strip_workspace_numbers yes'.
Definition: configuration.h:333
Config::title_align
enum Config::@7 title_align
Title alignment options.
smalloc
void * smalloc(size_t size)
Safe-wrapper around malloc which exits if malloc returns NULL (meaning that there is no more memory a...
Workspace_Assignment
Stores which workspace (by name or number) goes to which output.
Definition: data.h:225
HEBM_BOTH
@ HEBM_BOTH
Definition: data.h:84
Config::force_xinerama
bool force_xinerama
By default, use the RandR API for multi-monitor setups.
Definition: configuration.h:167
focused
struct Con * focused
Definition: tree.c:13
current_bar
static Barconfig * current_bar
Definition: config_directives.c:523
Autostart::command
char * command
Command, like in command mode.
Definition: data.h:367
HEBM_VERTICAL
@ HEBM_VERTICAL
Definition: data.h:82
Barconfig::bar_bindings
bar_bindings
Definition: configuration.h:302
outputs
struct outputs_head outputs
Definition: randr.c:21
I3_XKB_GROUP_MASK_1
@ I3_XKB_GROUP_MASK_1
Definition: data.h:116
load_font
i3Font load_font(const char *pattern, const bool fallback)
Loads a font for usage, also getting its height.
Config::floating_minimum_width
int32_t floating_minimum_width
Definition: configuration.h:224
bindings
struct bindings_head * bindings
Definition: main.c:74
Barconfig::verbose
bool verbose
Enable verbose mode? Useful for debugging purposes.
Definition: configuration.h:344
Autostart
Holds a command specified by either an:
Definition: data.h:365
Mode::name
char * name
Definition: configuration.h:83
config
Config config
Definition: config.c:17
tray_output_t
Definition: configuration.h:399
tray_output_t::output
char * output
Definition: configuration.h:400
Assignment::match
Match match
the criteria to check if a window matches
Definition: data.h:612
TAILQ_FOREACH
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:347
QUBE_RED
@ QUBE_RED
Definition: data.h:153
Config::mouse_warping
warping_t mouse_warping
By default, when switching focus to a window on a different output (e.g.
Definition: configuration.h:126
Autostart::no_startup_id
bool no_startup_id
no_startup_id flag for start_application().
Definition: data.h:370
BS_NONE
@ BS_NONE
Definition: data.h:65
Barconfig::font
char * font
Font specification for all text rendered on the bar.
Definition: configuration.h:318
Barconfig::hide_binding_mode_indicator
bool hide_binding_mode_indicator
Hide mode button? Configuration option is 'binding_mode_indicator no' but we invert the bool for the ...
Definition: configuration.h:341
Barconfig::bar_colors::focused_statusline
char * focused_statusline
Definition: configuration.h:352
qube_label_t
qube_label_t
Qubes colors.
Definition: data.h:151
Config::disable_focus_follows_mouse
bool disable_focus_follows_mouse
By default, focus follows mouse.
Definition: configuration.h:116
Barconfig::hidden_state
enum Barconfig::@10 hidden_state
assignments
struct assignments_head assignments
Definition: main.c:83
QUBE_PURPLE
@ QUBE_PURPLE
Definition: data.h:159
QUBE_BLUE
@ QUBE_BLUE
Definition: data.h:158
current_mode
static char * current_mode
Definition: config_directives.c:117
Barconfig::socket_path
char * socket_path
Path to the i3 IPC socket.
Definition: configuration.h:287
modes
struct modes_head modes
Definition: config.c:18
Config::config_client::background
color_t background
Definition: configuration.h:229
barconfigs
struct barconfig_head barconfigs
Definition: config.c:19
APPLY_COLORS
#define APPLY_COLORS(classname, label)
Config::client
struct Config::config_client client[QUBE_NUM_LABELS]
Config::hide_edge_borders
hide_edge_borders_mode_t hide_edge_borders
Remove borders if they are adjacent to the screen edge.
Definition: configuration.h:132
logical_px
int logical_px(const int logical)
Convert a logical amount of pixels (e.g.
BS_NORMAL
@ BS_NORMAL
Definition: data.h:64
ipc_set_kill_timeout
void ipc_set_kill_timeout(ev_tstamp new)
Set the maximum duration that we allow for a connection with an unwriteable socket.
Definition: ipc.c:49
eval_boolstr
static bool eval_boolstr(const char *str)
Definition: config_directives.c:51
TAILQ_INSERT_TAIL
#define TAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:376
FOCUS_WRAPPING_FORCE
@ FOCUS_WRAPPING_FORCE
Definition: data.h:144
Barconfig::outputs
char ** outputs
Outputs on which this bar should show up on.
Definition: configuration.h:273
QUBE_GRAY
@ QUBE_GRAY
Definition: data.h:157
HORIZ
@ HORIZ
Definition: data.h:60
Config::workspace_auto_back_and_forth
bool workspace_auto_back_and_forth
Automatic workspace back and forth switching.
Definition: configuration.h:179
event_state_from_str
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: config_directives.c:64
current_mode_pango_markup
static bool current_mode_pango_markup
Definition: config_directives.c:118
Barbinding::release
bool release
If true, the command will be executed after the button is released.
Definition: configuration.h:393
Barconfig::workspace_min_width
int workspace_min_width
The minimal width for workspace buttons.
Definition: configuration.h:329
FOCUS_WRAPPING_WORKSPACE
@ FOCUS_WRAPPING_WORKSPACE
Definition: data.h:145
QUBE_BLACK
@ QUBE_BLACK
Definition: data.h:160
Assignment::type
enum Assignment::@18 type
type of this assignment:
configure_binding
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
Barconfig::mode
enum Barconfig::@9 mode
Bar display mode (hide unless modifier is pressed or show in dock mode or always hide in invisible mo...
Mode
The configuration file can contain multiple sets of bindings.
Definition: configuration.h:82
Barconfig::bar_colors::separator
char * separator
Definition: configuration.h:349
Config::popup_during_fullscreen
enum Config::@8 popup_during_fullscreen
What should happen when a new popup is opened during fullscreen mode.