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