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 *border, const char *background, const char *text, const char *indicator, const char *child_border) {
402 #define APPLY_COLORS(classname) \
403  do { \
404  if (strcmp(colorclass, "client." #classname) == 0) { \
405  config.client.classname.border = draw_util_hex_to_color(border); \
406  config.client.classname.background = draw_util_hex_to_color(background); \
407  config.client.classname.text = draw_util_hex_to_color(text); \
408  if (indicator != NULL) { \
409  config.client.classname.indicator = draw_util_hex_to_color(indicator); \
410  } \
411  if (child_border != NULL) { \
412  config.client.classname.child_border = draw_util_hex_to_color(child_border); \
413  } else { \
414  config.client.classname.child_border = config.client.classname.background; \
415  } \
416  } \
417  } while (0)
418 
419  APPLY_COLORS(focused_inactive);
421  APPLY_COLORS(unfocused);
422  APPLY_COLORS(urgent);
423  APPLY_COLORS(placeholder);
424 
425 #undef APPLY_COLORS
426 }
427 
428 CFGFUN(assign_output, const char *output) {
430  ELOG("Match is empty, ignoring this assignment\n");
431  return;
432  }
433 
434  if (current_match->window_mode != WM_ANY) {
435  ELOG("Assignments using window mode (floating/tiling) is not supported\n");
436  return;
437  }
438 
439  DLOG("New assignment, using above criteria, to output \"%s\".\n", output);
440  Assignment *assignment = scalloc(1, sizeof(Assignment));
441  match_copy(&(assignment->match), current_match);
442  assignment->type = A_TO_OUTPUT;
443  assignment->dest.output = sstrdup(output);
445 }
446 
447 CFGFUN(assign, const char *workspace, bool is_number) {
449  ELOG("Match is empty, ignoring this assignment\n");
450  return;
451  }
452 
453  if (current_match->window_mode != WM_ANY) {
454  ELOG("Assignments using window mode (floating/tiling) is not supported\n");
455  return;
456  }
457 
458  if (is_number && ws_name_to_number(workspace) == -1) {
459  ELOG("Could not parse initial part of \"%s\" as a number.\n", workspace);
460  return;
461  }
462 
463  DLOG("New assignment, using above criteria, to workspace \"%s\".\n", workspace);
464  Assignment *assignment = scalloc(1, sizeof(Assignment));
465  match_copy(&(assignment->match), current_match);
466  assignment->type = is_number ? A_TO_WORKSPACE_NUMBER : A_TO_WORKSPACE;
467  assignment->dest.workspace = sstrdup(workspace);
469 }
470 
471 CFGFUN(no_focus) {
473  ELOG("Match is empty, ignoring this assignment\n");
474  return;
475  }
476 
477  DLOG("New assignment, using above criteria, to ignore focus on manage.\n");
478  Assignment *assignment = scalloc(1, sizeof(Assignment));
479  match_copy(&(assignment->match), current_match);
480  assignment->type = A_NO_FOCUS;
482 }
483 
484 CFGFUN(ipc_kill_timeout, const long timeout_ms) {
485  ipc_set_kill_timeout(timeout_ms / 1000.0);
486 }
487 
488 /*******************************************************************************
489  * Bar configuration (i3bar)
490  ******************************************************************************/
491 
493 
494 CFGFUN(bar_font, const char *font) {
496  current_bar->font = sstrdup(font);
497 }
498 
499 CFGFUN(bar_separator_symbol, const char *separator) {
501  current_bar->separator_symbol = sstrdup(separator);
502 }
503 
504 CFGFUN(bar_mode, const char *mode) {
505  current_bar->mode = (strcmp(mode, "dock") == 0 ? M_DOCK : (strcmp(mode, "hide") == 0 ? M_HIDE : M_INVISIBLE));
506 }
507 
508 CFGFUN(bar_hidden_state, const char *hidden_state) {
509  current_bar->hidden_state = (strcmp(hidden_state, "hide") == 0 ? S_HIDE : S_SHOW);
510 }
511 
512 CFGFUN(bar_id, const char *bar_id) {
513  current_bar->id = sstrdup(bar_id);
514 }
515 
516 CFGFUN(bar_output, const char *output) {
517  int new_outputs = current_bar->num_outputs + 1;
518  current_bar->outputs = srealloc(current_bar->outputs, sizeof(char *) * new_outputs);
520  current_bar->num_outputs = new_outputs;
521 }
522 
523 CFGFUN(bar_verbose, const char *verbose) {
525 }
526 
527 CFGFUN(bar_modifier, const char *modifiers) {
528  current_bar->modifier = modifiers ? event_state_from_str(modifiers) : XCB_NONE;
529 }
530 
531 static void bar_configure_binding(const char *button, const char *release, const char *command) {
532  if (strncasecmp(button, "button", strlen("button")) != 0) {
533  ELOG("Bindings for a bar can only be mouse bindings, not \"%s\", ignoring.\n", button);
534  return;
535  }
536 
537  int input_code = atoi(button + strlen("button"));
538  if (input_code < 1) {
539  ELOG("Button \"%s\" does not seem to be in format 'buttonX'.\n", button);
540  return;
541  }
542  const bool release_bool = release != NULL;
543 
544  struct Barbinding *current;
546  if (current->input_code == input_code && current->release == release_bool) {
547  ELOG("command for button %s was already specified, ignoring.\n", button);
548  return;
549  }
550  }
551 
552  struct Barbinding *new_binding = scalloc(1, sizeof(struct Barbinding));
553  new_binding->release = release_bool;
554  new_binding->input_code = input_code;
555  new_binding->command = sstrdup(command);
557 }
558 
559 CFGFUN(bar_wheel_up_cmd, const char *command) {
560  ELOG("'wheel_up_cmd' is deprecated. Please us 'bindsym button4 %s' instead.\n", command);
561  bar_configure_binding("button4", NULL, command);
562 }
563 
564 CFGFUN(bar_wheel_down_cmd, const char *command) {
565  ELOG("'wheel_down_cmd' is deprecated. Please us 'bindsym button5 %s' instead.\n", command);
566  bar_configure_binding("button5", NULL, command);
567 }
568 
569 CFGFUN(bar_bindsym, const char *button, const char *release, const char *command) {
571 }
572 
573 CFGFUN(bar_position, const char *position) {
574  current_bar->position = (strcmp(position, "top") == 0 ? P_TOP : P_BOTTOM);
575 }
576 
577 CFGFUN(bar_i3bar_command, const char *i3bar_command) {
579  current_bar->i3bar_command = sstrdup(i3bar_command);
580 }
581 
582 CFGFUN(bar_color, const char *colorclass, const char *border, const char *background, const char *text) {
583 #define APPLY_COLORS(classname) \
584  do { \
585  if (strcmp(colorclass, #classname) == 0) { \
586  if (text != NULL) { \
587  /* New syntax: border, background, text */ \
588  current_bar->colors.classname##_border = sstrdup(border); \
589  current_bar->colors.classname##_bg = sstrdup(background); \
590  current_bar->colors.classname##_text = sstrdup(text); \
591  } else { \
592  /* Old syntax: text, background */ \
593  current_bar->colors.classname##_bg = sstrdup(background); \
594  current_bar->colors.classname##_text = sstrdup(border); \
595  } \
596  } \
597  } while (0)
598 
599  APPLY_COLORS(focused_workspace);
600  APPLY_COLORS(active_workspace);
601  APPLY_COLORS(inactive_workspace);
602  APPLY_COLORS(urgent_workspace);
603  APPLY_COLORS(binding_mode);
604 
605 #undef APPLY_COLORS
606 }
607 
608 CFGFUN(bar_socket_path, const char *socket_path) {
610  current_bar->socket_path = sstrdup(socket_path);
611 }
612 
613 CFGFUN(bar_tray_output, const char *output) {
614  struct tray_output_t *tray_output = scalloc(1, sizeof(struct tray_output_t));
615  tray_output->output = sstrdup(output);
617 }
618 
619 CFGFUN(bar_tray_padding, const long padding_px) {
620  current_bar->tray_padding = padding_px;
621 }
622 
623 CFGFUN(bar_color_single, const char *colorclass, const char *color) {
624  if (strcmp(colorclass, "background") == 0)
626  else if (strcmp(colorclass, "separator") == 0)
628  else if (strcmp(colorclass, "statusline") == 0)
630  else if (strcmp(colorclass, "focused_background") == 0)
632  else if (strcmp(colorclass, "focused_separator") == 0)
634  else
636 }
637 
638 CFGFUN(bar_status_command, const char *command) {
640  current_bar->status_command = sstrdup(command);
641 }
642 
643 CFGFUN(bar_binding_mode_indicator, const char *value) {
645 }
646 
647 CFGFUN(bar_workspace_buttons, const char *value) {
649 }
650 
651 CFGFUN(bar_workspace_min_width, const long width) {
653 }
654 
655 CFGFUN(bar_strip_workspace_numbers, const char *value) {
657 }
658 
659 CFGFUN(bar_strip_workspace_name, const char *value) {
661 }
662 
663 CFGFUN(bar_start) {
664  current_bar = scalloc(1, sizeof(struct Barconfig));
668  current_bar->modifier = XCB_KEY_BUT_MASK_MOD_4;
669 }
670 
671 CFGFUN(bar_finish) {
672  DLOG("\t new bar configuration finished, saving.\n");
673  /* Generate a unique ID for this bar if not already configured */
674  if (current_bar->id == NULL)
676 
678 
679  /* If no font was explicitly set, we use the i3 font as default */
680  if (current_bar->font == NULL && font_pattern != NULL)
682 
684  /* Simply reset the pointer, but don't free the resources. */
685  current_bar = NULL;
686 }
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:209
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
APPLY_COLORS
#define APPLY_COLORS(classname)
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
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:210
bar_configure_binding
static void bar_configure_binding(const char *button, const char *release, const char *command)
Definition: config_directives.c:531
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
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:595
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:593
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:594
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
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
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:567
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:208
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:492
Autostart::command
char * command
Command, like in command mode.
Definition: data.h:350
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:348
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:589
TAILQ_FOREACH
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:347
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:353
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
Config::client
struct Config::config_client client
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
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
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
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
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.