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 (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);
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(title_align, const char *alignment) {
322  if (strcmp(alignment, "left") == 0) {
323  config.title_align = ALIGN_LEFT;
324  } else if (strcmp(alignment, "center") == 0) {
325  config.title_align = ALIGN_CENTER;
326  } else if (strcmp(alignment, "right") == 0) {
327  config.title_align = ALIGN_RIGHT;
328  } else {
329  assert(false);
330  }
331 }
332 
333 CFGFUN(show_marks, const char *value) {
334  config.show_marks = eval_boolstr(value);
335 }
336 
337 static char *current_workspace = NULL;
338 
339 CFGFUN(workspace, const char *workspace, const char *output) {
340  struct Workspace_Assignment *assignment;
341 
342  /* When a new workspace line is encountered, for the first output word,
343  * $workspace from the config.spec is non-NULL. Afterwards, the parser calls
344  * clear_stack() because of the call line. Thus, we have to preserve the
345  * workspace string. */
346  if (workspace) {
348 
350  if (strcasecmp(assignment->name, workspace) == 0) {
351  ELOG("You have a duplicate workspace assignment for workspace \"%s\"\n",
352  workspace);
353  return;
354  }
355  }
356 
357  current_workspace = sstrdup(workspace);
358  } else {
359  if (!current_workspace) {
360  DLOG("Both workspace and current_workspace are NULL, assuming we had an error before\n");
361  return;
362  }
363  workspace = current_workspace;
364  }
365 
366  DLOG("Assigning workspace \"%s\" to output \"%s\"\n", workspace, output);
367 
368  assignment = scalloc(1, sizeof(struct Workspace_Assignment));
369  assignment->name = sstrdup(workspace);
370  assignment->output = sstrdup(output);
372 }
373 
374 CFGFUN(ipc_socket, const char *path) {
375  free(config.ipc_socket_path);
377 }
378 
379 CFGFUN(restart_state, const char *path) {
382 }
383 
384 CFGFUN(popup_during_fullscreen, const char *value) {
385  if (strcmp(value, "ignore") == 0) {
386  config.popup_during_fullscreen = PDF_IGNORE;
387  } else if (strcmp(value, "leave_fullscreen") == 0) {
388  config.popup_during_fullscreen = PDF_LEAVE_FULLSCREEN;
389  } else {
390  config.popup_during_fullscreen = PDF_SMART;
391  }
392 }
393 
394 CFGFUN(color_single, const char *colorclass, const char *color) {
395  /* used for client.background only currently */
397 }
398 
399 CFGFUN(color, const char *colorclass, const char *border, const char *background, const char *text, const char *indicator, const char *child_border) {
400 #define APPLY_COLORS(classname) \
401  do { \
402  if (strcmp(colorclass, "client." #classname) == 0) { \
403  config.client.classname.border = draw_util_hex_to_color(border); \
404  config.client.classname.background = draw_util_hex_to_color(background); \
405  config.client.classname.text = draw_util_hex_to_color(text); \
406  if (indicator != NULL) { \
407  config.client.classname.indicator = draw_util_hex_to_color(indicator); \
408  } \
409  if (child_border != NULL) { \
410  config.client.classname.child_border = draw_util_hex_to_color(child_border); \
411  } else { \
412  config.client.classname.child_border = config.client.classname.background; \
413  } \
414  } \
415  } while (0)
416 
417  APPLY_COLORS(focused_inactive);
419  APPLY_COLORS(unfocused);
420  APPLY_COLORS(urgent);
421  APPLY_COLORS(placeholder);
422 
423 #undef APPLY_COLORS
424 }
425 
426 CFGFUN(assign_output, const char *output) {
428  ELOG("Match is empty, ignoring this assignment\n");
429  return;
430  }
431 
432  if (current_match->window_mode != WM_ANY) {
433  ELOG("Assignments using window mode (floating/tiling) is not supported\n");
434  return;
435  }
436 
437  DLOG("New assignment, using above criteria, to output \"%s\".\n", output);
438  Assignment *assignment = scalloc(1, sizeof(Assignment));
439  match_copy(&(assignment->match), current_match);
440  assignment->type = A_TO_OUTPUT;
441  assignment->dest.output = sstrdup(output);
443 }
444 
445 CFGFUN(assign, const char *workspace, bool is_number) {
447  ELOG("Match is empty, ignoring this assignment\n");
448  return;
449  }
450 
451  if (current_match->window_mode != WM_ANY) {
452  ELOG("Assignments using window mode (floating/tiling) is not supported\n");
453  return;
454  }
455 
456  if (is_number && ws_name_to_number(workspace) == -1) {
457  ELOG("Could not parse initial part of \"%s\" as a number.\n", workspace);
458  return;
459  }
460 
461  DLOG("New assignment, using above criteria, to workspace \"%s\".\n", workspace);
462  Assignment *assignment = scalloc(1, sizeof(Assignment));
463  match_copy(&(assignment->match), current_match);
464  assignment->type = is_number ? A_TO_WORKSPACE_NUMBER : A_TO_WORKSPACE;
465  assignment->dest.workspace = sstrdup(workspace);
467 }
468 
469 CFGFUN(no_focus) {
471  ELOG("Match is empty, ignoring this assignment\n");
472  return;
473  }
474 
475  DLOG("New assignment, using above criteria, to ignore focus on manage.\n");
476  Assignment *assignment = scalloc(1, sizeof(Assignment));
477  match_copy(&(assignment->match), current_match);
478  assignment->type = A_NO_FOCUS;
480 }
481 
482 CFGFUN(ipc_kill_timeout, const long timeout_ms) {
483  ipc_set_kill_timeout(timeout_ms / 1000.0);
484 }
485 
486 /*******************************************************************************
487  * Bar configuration (i3bar)
488  ******************************************************************************/
489 
491 
492 CFGFUN(bar_font, const char *font) {
494  current_bar->font = sstrdup(font);
495 }
496 
497 CFGFUN(bar_separator_symbol, const char *separator) {
499  current_bar->separator_symbol = sstrdup(separator);
500 }
501 
502 CFGFUN(bar_mode, const char *mode) {
503  current_bar->mode = (strcmp(mode, "dock") == 0 ? M_DOCK : (strcmp(mode, "hide") == 0 ? M_HIDE : M_INVISIBLE));
504 }
505 
506 CFGFUN(bar_hidden_state, const char *hidden_state) {
507  current_bar->hidden_state = (strcmp(hidden_state, "hide") == 0 ? S_HIDE : S_SHOW);
508 }
509 
510 CFGFUN(bar_id, const char *bar_id) {
511  current_bar->id = sstrdup(bar_id);
512 }
513 
514 CFGFUN(bar_output, const char *output) {
515  int new_outputs = current_bar->num_outputs + 1;
516  current_bar->outputs = srealloc(current_bar->outputs, sizeof(char *) * new_outputs);
518  current_bar->num_outputs = new_outputs;
519 }
520 
521 CFGFUN(bar_verbose, const char *verbose) {
523 }
524 
525 CFGFUN(bar_modifier, const char *modifiers) {
526  current_bar->modifier = modifiers ? event_state_from_str(modifiers) : XCB_NONE;
527 }
528 
529 static void bar_configure_binding(const char *button, const char *release, const char *command) {
530  if (strncasecmp(button, "button", strlen("button")) != 0) {
531  ELOG("Bindings for a bar can only be mouse bindings, not \"%s\", ignoring.\n", button);
532  return;
533  }
534 
535  int input_code = atoi(button + strlen("button"));
536  if (input_code < 1) {
537  ELOG("Button \"%s\" does not seem to be in format 'buttonX'.\n", button);
538  return;
539  }
540  const bool release_bool = release != NULL;
541 
542  struct Barbinding *current;
544  if (current->input_code == input_code && current->release == release_bool) {
545  ELOG("command for button %s was already specified, ignoring.\n", button);
546  return;
547  }
548  }
549 
550  struct Barbinding *new_binding = scalloc(1, sizeof(struct Barbinding));
551  new_binding->release = release_bool;
552  new_binding->input_code = input_code;
553  new_binding->command = sstrdup(command);
555 }
556 
557 CFGFUN(bar_wheel_up_cmd, const char *command) {
558  ELOG("'wheel_up_cmd' is deprecated. Please us 'bindsym button4 %s' instead.\n", command);
559  bar_configure_binding("button4", NULL, command);
560 }
561 
562 CFGFUN(bar_wheel_down_cmd, const char *command) {
563  ELOG("'wheel_down_cmd' is deprecated. Please us 'bindsym button5 %s' instead.\n", command);
564  bar_configure_binding("button5", NULL, command);
565 }
566 
567 CFGFUN(bar_bindsym, const char *button, const char *release, const char *command) {
569 }
570 
571 CFGFUN(bar_position, const char *position) {
572  current_bar->position = (strcmp(position, "top") == 0 ? P_TOP : P_BOTTOM);
573 }
574 
575 CFGFUN(bar_i3bar_command, const char *i3bar_command) {
577  current_bar->i3bar_command = sstrdup(i3bar_command);
578 }
579 
580 CFGFUN(bar_color, const char *colorclass, const char *border, const char *background, const char *text) {
581 #define APPLY_COLORS(classname) \
582  do { \
583  if (strcmp(colorclass, #classname) == 0) { \
584  if (text != NULL) { \
585  /* New syntax: border, background, text */ \
586  current_bar->colors.classname##_border = sstrdup(border); \
587  current_bar->colors.classname##_bg = sstrdup(background); \
588  current_bar->colors.classname##_text = sstrdup(text); \
589  } else { \
590  /* Old syntax: text, background */ \
591  current_bar->colors.classname##_bg = sstrdup(background); \
592  current_bar->colors.classname##_text = sstrdup(border); \
593  } \
594  } \
595  } while (0)
596 
597  APPLY_COLORS(focused_workspace);
598  APPLY_COLORS(active_workspace);
599  APPLY_COLORS(inactive_workspace);
600  APPLY_COLORS(urgent_workspace);
601  APPLY_COLORS(binding_mode);
602 
603 #undef APPLY_COLORS
604 }
605 
606 CFGFUN(bar_socket_path, const char *socket_path) {
608  current_bar->socket_path = sstrdup(socket_path);
609 }
610 
611 CFGFUN(bar_tray_output, const char *output) {
612  struct tray_output_t *tray_output = scalloc(1, sizeof(struct tray_output_t));
613  tray_output->output = sstrdup(output);
615 }
616 
617 CFGFUN(bar_tray_padding, const long padding_px) {
618  current_bar->tray_padding = padding_px;
619 }
620 
621 CFGFUN(bar_color_single, const char *colorclass, const char *color) {
622  if (strcmp(colorclass, "background") == 0)
624  else if (strcmp(colorclass, "separator") == 0)
626  else if (strcmp(colorclass, "statusline") == 0)
628  else if (strcmp(colorclass, "focused_background") == 0)
630  else if (strcmp(colorclass, "focused_separator") == 0)
632  else
634 }
635 
636 CFGFUN(bar_status_command, const char *command) {
638  current_bar->status_command = sstrdup(command);
639 }
640 
641 CFGFUN(bar_binding_mode_indicator, const char *value) {
643 }
644 
645 CFGFUN(bar_workspace_buttons, const char *value) {
647 }
648 
649 CFGFUN(bar_strip_workspace_numbers, const char *value) {
651 }
652 
653 CFGFUN(bar_strip_workspace_name, const char *value) {
655 }
656 
657 CFGFUN(bar_start) {
658  current_bar = scalloc(1, sizeof(struct Barconfig));
662  current_bar->modifier = XCB_KEY_BUT_MASK_MOD_4;
663 }
664 
665 CFGFUN(bar_finish) {
666  DLOG("\t new bar configuration finished, saving.\n");
667  /* Generate a unique ID for this bar if not already configured */
668  if (current_bar->id == NULL)
670 
672 
673  /* If no font was explicitly set, we use the i3 font as default */
674  if (current_bar->font == NULL && font_pattern != NULL)
676 
678  /* Simply reset the pointer, but don't free the resources. */
679  current_bar = NULL;
680 }
struct Barconfig::bar_colors colors
static bool eval_boolstr(const char *str)
#define FREE(pointer)
Definition: util.h:47
char * i3bar_command
Command that should be run to execute i3bar, give a full path if i3bar is not in your $PATH...
char * separator_symbol
A custom separator to use instead of a vertical line.
struct Config::config_client client
Match match
the criteria to check if a window matches
Definition: data.h:584
struct outputs_head outputs
Definition: randr.c:21
Defines a mouse command to be executed instead of the default behavior when clicking on the non-statu...
#define SLIST_FOREACH(var, head, field)
Definition: queue.h:114
void * srealloc(void *ptr, size_t size)
Safe-wrapper around realloc which exits if realloc returns NULL (meaning that there is no more memory...
char * workspace
Definition: data.h:589
int logical_px(const int logical)
Convert a logical amount of pixels (e.g.
bool strip_workspace_name
Strip workspace name? Configuration option is &#39;strip_workspace_name yes&#39;.
int input_code
The button to be used (e.g., 1 for "button1").
char ** outputs
Outputs on which this bar should show up on.
struct barconfig_head barconfigs
Definition: config.c:19
char * id
Automatically generated ID for this bar config.
bool hide_binding_mode_indicator
Hide mode button? Configuration option is &#39;binding_mode_indicator no&#39; but we invert the bool for the ...
bool workspace_auto_back_and_forth
Automatic workspace back and forth switching.
static bool verbose
Definition: log.c:38
#define DLOG(fmt,...)
Definition: libi3.h:104
char * ipc_socket_path
bool hide_workspace_buttons
Hide workspace buttons? Configuration option is &#39;workspace_buttons no&#39; but we invert the bool to get ...
void * smalloc(size_t size)
Safe-wrapper around malloc which exits if malloc returns NULL (meaning that there is no more memory a...
bool release
If true, the command will be executed after the button is released.
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...
char * restart_state_path
void match_free(Match *match)
Frees the given match.
Definition: match.c:241
uint32_t modifier
Bar modifier (to show bar when in hide mode).
bool strip_workspace_numbers
Strip workspace numbers? Configuration option is &#39;strip_workspace_numbers yes&#39;.
uint32_t floating_modifier
The modifier which needs to be pressed in combination with your mouse buttons to do things with float...
const char * DEFAULT_BINDING_MODE
The name of the default mode.
Definition: bindings.c:23
Definition: data.h:60
static void bar_configure_binding(const char *button, const char *release, const char *command)
i3Font font
Definition: configuration.h:98
#define APPLY_COLORS(classname)
struct bindings_head * bindings
Definition: main.c:74
struct autostarts_always_head autostarts_always
Definition: main.c:80
char * status_command
Command that should be run to get a statusline, for example &#39;i3status&#39;.
int num_outputs
Number of outputs in the outputs array.
struct assignments_head assignments
Definition: main.c:83
float workspace_urgency_timer
By default, urgency is cleared immediately when switching to another workspace leads to focusing the ...
struct modes_head modes
Definition: config.c:18
Definition: data.h:61
char * fake_outputs
Overwrites output detection (for testing), see src/fake_outputs.c.
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:256
enum Barconfig::@10 hidden_state
bool force_xinerama
Definition: main.c:94
enum Barconfig::@11 position
Bar position (bottom by default).
bool disable_focus_follows_mouse
By default, focus follows mouse.
union Assignment::@19 dest
destination workspace/command/output, depending on the type
static int criteria_next_state
bool force_xinerama
By default, use the RandR API for multi-monitor setups.
uint32_t width
Definition: data.h:129
focus_wrapping_t focus_wrapping
When focus wrapping is enabled (the default), attempting to move focus past the edge of the screen (i...
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...
char * command
Definition: data.h:588
int32_t floating_maximum_width
Maximum and minimum dimensions of a floating window.
int32_t floating_minimum_width
#define TAILQ_INIT(head)
Definition: queue.h:360
long ws_name_to_number(const char *name)
Parses the workspace name as a number.
Definition: util.c:102
bool match_is_empty(Match *match)
Check if a match is empty.
Definition: match.c:39
Definition: data.h:79
int default_floating_border_width
Holds a command specified by either an:
Definition: data.h:347
bool disable_randr15
Don’t use RandR 1.5 for querying outputs.
static char * font_pattern
char * output
Definition: data.h:590
void workspace_back_and_forth(void)
Focuses the previously focused workspace.
Definition: workspace.c:795
Stores which workspace (by name or number) goes to which output.
Definition: data.h:207
char * sstrdup(const char *str)
Safe-wrapper around strdup which exits if malloc returns NULL (meaning that there is no more memory a...
enum Config::@8 popup_during_fullscreen
What should happen when a new popup is opened during fullscreen mode.
Definition: data.h:62
static char * current_mode
enum Assignment::@18 type
type of this assignment:
char * font
Font specification for all text rendered on the bar.
bool pango_markup
Definition: configuration.h:84
char * command
The command which is to be executed for this button.
border_style_t default_floating_border
The default border style for new floating windows.
An Assignment makes specific windows go to a specific workspace/output or run a command for that wind...
Definition: data.h:562
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
layout_t default_layout
char * name
Definition: configuration.h:83
static bool current_mode_pango_markup
Definition: data.h:63
int tray_padding
struct Con * focused
Definition: tree.c:13
bool verbose
Enable verbose mode? Useful for debugging purposes.
int32_t floating_minimum_height
color_t draw_util_hex_to_color(const char *color)
Parses the given color in hex format to an internal color representation.
struct autostarts_head autostarts
Definition: main.c:77
uint32_t height
Definition: data.h:130
int32_t floating_maximum_height
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...
int number_barconfigs
Definition: data.h:82
Definition: data.h:92
The configuration file can contain multiple sets of bindings.
Definition: configuration.h:82
enum Match::@16 window_mode
bool show_marks
Specifies whether or not marks should be displayed in the window decoration.
i3Font load_font(const char *pattern, const bool fallback)
Loads a font for usage, also getting its height.
#define ELOG(fmt,...)
Definition: libi3.h:99
int default_orientation
Default orientation for new containers.
Definition: data.h:64
enum Barconfig::@9 mode
Bar display mode (hide unless modifier is pressed or show in dock mode or always hide in invisible mo...
warping_t mouse_warping
By default, when switching focus to a window on a different output (e.g.
static Match current_match
Definition: data.h:94
border_style_t default_border
The default border style for new windows.
struct ws_assignments_head ws_assignments
Definition: main.c:87
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
hide_edge_borders_mode_t hide_edge_borders
Remove borders if they are adjacent to the screen edge.
int default_border_width
Definition: data.h:93
void match_copy(Match *dest, Match *src)
Copies the data of a match from src to dest.
Definition: match.c:62
bool no_startup_id
no_startup_id flag for start_application().
Definition: data.h:352
Config config
Definition: config.c:17
void match_init(Match *match)
Initializes the Match data structure.
Definition: match.c:26
char * command
Command, like in command mode.
Definition: data.h:349
enum Config::@6 focus_on_window_activation
Behavior when a window sends a NET_ACTIVE_WINDOW message.
void set_font(i3Font *font)
Defines the font to be used for the forthcoming calls.
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
Holds the status bar configuration (i3bar).
enum Config::@7 title_align
Title alignment options.
#define TAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:376
static char * current_workspace
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:347
static Barconfig * current_bar
char * socket_path
Path to the i3 IPC socket.