29 DLOG(
"Initializing criteria, current_match = %p, state = %d\n",
current_match, _state);
43 CFGFUN(criteria_add,
const char *ctype,
const char *cvalue) {
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);
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;
86 if (strstr(str,
"Group1") != NULL)
88 if (strstr(str,
"Group2") != NULL ||
89 strstr(str,
"Mode_switch") != NULL)
91 if (strstr(str,
"Group3") != NULL)
93 if (strstr(str,
"Group4") != NULL)
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) {
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) {
132 if (strcmp(mode->
name, modename) == 0) {
133 ELOG(
"The binding mode with name \"%s\" is defined at least twice.\n", modename);
137 DLOG(
"\t now in mode %s\n", modename);
143 CFGFUN(exec,
const char *exectype,
const char *no_startup_id,
const char *command) {
147 if (strcmp(exectype,
"exec") == 0) {
156 ELOG(
"Match is empty, ignoring this for_window statement\n");
159 DLOG(
"\t should execute command %s for the criteria mentioned above\n",
command);
161 assignment->
type = A_COMMAND;
168 DLOG(
"Setting gaps for workspace %s", workspace);
172 if (strcasecmp(assignment->
name, workspace) == 0) {
173 if (!strcmp(scope,
"inner")) {
175 }
else if (!strcmp(scope,
"outer")) {
180 }
else if (!strcmp(scope,
"vertical")) {
183 }
else if (!strcmp(scope,
"horizontal")) {
186 }
else if (!strcmp(scope,
"top")) {
188 }
else if (!strcmp(scope,
"right")) {
190 }
else if (!strcmp(scope,
"bottom")) {
192 }
else if (!strcmp(scope,
"left")) {
195 ELOG(
"Invalid command, cannot process scope %s", scope);
205 assignment->
output = NULL;
206 if (!strcmp(scope,
"inner")) {
208 }
else if (!strcmp(scope,
"outer")) {
213 }
else if (!strcmp(scope,
"vertical")) {
216 }
else if (!strcmp(scope,
"horizontal")) {
219 }
else if (!strcmp(scope,
"top")) {
221 }
else if (!strcmp(scope,
"right")) {
223 }
else if (!strcmp(scope,
"bottom")) {
225 }
else if (!strcmp(scope,
"left")) {
228 ELOG(
"Invalid command, cannot process scope %s", scope);
233 CFGFUN(
gaps,
const char *workspace,
const char *scope,
const long value) {
236 if (!strcmp(scope,
"inner")) {
237 if (workspace == NULL)
243 }
else if (!strcmp(scope,
"outer")) {
244 if (workspace == NULL) {
256 }
else if (!strcmp(scope,
"vertical")) {
257 if (workspace == NULL) {
265 }
else if (!strcmp(scope,
"horizontal")) {
266 if (workspace == NULL) {
274 }
else if (!strcmp(scope,
"top")) {
275 if (workspace == NULL)
281 }
else if (!strcmp(scope,
"right")) {
282 if (workspace == NULL)
288 }
else if (!strcmp(scope,
"bottom")) {
289 if (workspace == NULL)
295 }
else if (!strcmp(scope,
"left")) {
296 if (workspace == NULL)
303 ELOG(
"Invalid command, cannot process scope %s", scope);
307 CFGFUN(smart_borders,
const char *enable) {
308 if (!strcmp(enable,
"no_gaps"))
315 if (!strcmp(enable,
"inverse_outer"))
331 CFGFUN(floating_modifier,
const char *modifiers) {
335 CFGFUN(default_orientation,
const char *orientation) {
336 if (strcmp(orientation,
"horizontal") == 0)
338 else if (strcmp(orientation,
"vertical") == 0)
344 CFGFUN(workspace_layout,
const char *layout) {
345 if (strcmp(layout,
"default") == 0)
347 else if (strcmp(layout,
"stacking") == 0 ||
348 strcmp(layout,
"stacked") == 0)
354 CFGFUN(default_border,
const char *windowtype,
const char *border,
const long width) {
358 if (strcmp(border,
"1pixel") == 0) {
361 }
else if (strcmp(border,
"none") == 0) {
364 }
else if (strcmp(border,
"pixel") == 0) {
366 border_width =
width;
369 border_width =
width;
372 if ((strcmp(windowtype,
"default_border") == 0) ||
373 (strcmp(windowtype,
"new_window") == 0)) {
374 DLOG(
"default tiled border style = %d and border width = %d (%d physical px)\n",
375 border_style, border_width,
logical_px(border_width));
379 DLOG(
"default floating border style = %d and border width = %d (%d physical px)\n",
380 border_style, border_width,
logical_px(border_width));
386 CFGFUN(hide_edge_borders,
const char *borders) {
387 if (strcmp(borders,
"smart_no_gaps") == 0)
389 else if (strcmp(borders,
"smart") == 0)
391 else if (strcmp(borders,
"vertical") == 0)
393 else if (strcmp(borders,
"horizontal") == 0)
395 else if (strcmp(borders,
"both") == 0)
397 else if (strcmp(borders,
"none") == 0)
405 CFGFUN(focus_follows_mouse,
const char *value) {
409 CFGFUN(mouse_warping,
const char *value) {
410 if (strcmp(value,
"none") == 0)
412 else if (strcmp(value,
"output") == 0)
420 CFGFUN(disable_randr15,
const char *value) {
424 CFGFUN(focus_wrapping,
const char *value) {
425 if (strcmp(value,
"force") == 0) {
434 CFGFUN(force_focus_wrapping,
const char *value) {
456 CFGFUN(force_display_urgency_hint,
const long duration_ms) {
460 CFGFUN(focus_on_window_activation,
const char *mode) {
461 if (strcmp(mode,
"smart") == 0)
463 else if (strcmp(mode,
"urgent") == 0)
465 else if (strcmp(mode,
"focus") == 0)
467 else if (strcmp(mode,
"none") == 0)
470 ELOG(
"Unknown focus_on_window_activation mode \"%s\", ignoring it.\n", mode);
477 CFGFUN(title_align,
const char *alignment) {
478 if (strcmp(alignment,
"left") == 0) {
480 }
else if (strcmp(alignment,
"center") == 0) {
482 }
else if (strcmp(alignment,
"right") == 0) {
506 if (strcasecmp(assignment->
name, workspace) == 0) {
507 if (assignment->
output != NULL) {
508 ELOG(
"You have a duplicate workspace assignment for workspace \"%s\"\n",
518 DLOG(
"Both workspace and current_workspace are NULL, assuming we had an error before\n");
524 DLOG(
"Assigning workspace \"%s\" to output \"%s\"\n", workspace,
output);
537 CFGFUN(restart_state,
const char *path) {
542 CFGFUN(popup_during_fullscreen,
const char *value) {
543 if (strcmp(value,
"ignore") == 0) {
545 }
else if (strcmp(value,
"leave_fullscreen") == 0) {
552 CFGFUN(color_single,
const char *colorclass,
const char *color) {
557 CFGFUN(color,
const char *colorclass,
const char *border,
const char *background,
const char *text,
const char *indicator,
const char *child_border) {
558 #define APPLY_COLORS(classname) \ 560 if (strcmp(colorclass, "client." #classname) == 0) { \ 561 config.client.classname.border = draw_util_hex_to_color(border); \ 562 config.client.classname.background = draw_util_hex_to_color(background); \ 563 config.client.classname.text = draw_util_hex_to_color(text); \ 564 if (indicator != NULL) { \ 565 config.client.classname.indicator = draw_util_hex_to_color(indicator); \ 567 if (child_border != NULL) { \ 568 config.client.classname.child_border = draw_util_hex_to_color(child_border); \ 570 config.client.classname.child_border = config.client.classname.background; \ 586 ELOG(
"Match is empty, ignoring this assignment\n");
591 ELOG(
"Assignments using window mode (floating/tiling) is not supported\n");
595 DLOG(
"New assignment, using above criteria, to output \"%s\".\n",
output);
598 assignment->
type = A_TO_OUTPUT;
603 CFGFUN(assign,
const char *workspace,
bool is_number) {
605 ELOG(
"Match is empty, ignoring this assignment\n");
610 ELOG(
"Assignments using window mode (floating/tiling) is not supported\n");
615 ELOG(
"Could not parse initial part of \"%s\" as a number.\n", workspace);
619 DLOG(
"New assignment, using above criteria, to workspace \"%s\".\n", workspace);
622 assignment->
type = is_number ? A_TO_WORKSPACE_NUMBER : A_TO_WORKSPACE;
629 ELOG(
"Match is empty, ignoring this assignment\n");
633 DLOG(
"New assignment, using above criteria, to ignore focus on manage.\n");
636 assignment->
type = A_NO_FOCUS;
640 CFGFUN(ipc_kill_timeout,
const long timeout_ms) {
655 CFGFUN(bar_separator_symbol,
const char *separator) {
661 current_bar->
mode = (strcmp(mode,
"dock") == 0 ? M_DOCK : (strcmp(mode,
"hide") == 0 ? M_HIDE : M_INVISIBLE));
664 CFGFUN(bar_hidden_state,
const char *hidden_state) {
687 CFGFUN(bar_modifier,
const char *modifiers) {
692 if (strncasecmp(button,
"button", strlen(
"button")) != 0) {
693 ELOG(
"Bindings for a bar can only be mouse bindings, not \"%s\", ignoring.\n", button);
697 int input_code = atoi(button + strlen(
"button"));
698 if (input_code < 1) {
699 ELOG(
"Button \"%s\" does not seem to be in format 'buttonX'.\n", button);
702 const bool release_bool = release != NULL;
707 ELOG(
"command for button %s was already specified, ignoring.\n", button);
713 new_binding->
release = release_bool;
720 ELOG(
"'wheel_up_cmd' is deprecated. Please us 'bindsym button4 %s' instead.\n",
command);
725 ELOG(
"'wheel_down_cmd' is deprecated. Please us 'bindsym button5 %s' instead.\n",
command);
733 CFGFUN(bar_position,
const char *position) {
737 CFGFUN(bar_i3bar_command,
const char *i3bar_command) {
742 CFGFUN(bar_color,
const char *colorclass,
const char *border,
const char *background,
const char *text) {
743 #define APPLY_COLORS(classname) \ 745 if (strcmp(colorclass, #classname) == 0) { \ 746 if (text != NULL) { \ 748 current_bar->colors.classname##_border = sstrdup(border); \ 749 current_bar->colors.classname##_bg = sstrdup(background); \ 750 current_bar->colors.classname##_text = sstrdup(text); \ 753 current_bar->colors.classname##_bg = sstrdup(background); \ 754 current_bar->colors.classname##_text = sstrdup(border); \ 768 CFGFUN(bar_socket_path,
const char *socket_path) {
773 CFGFUN(bar_tray_output,
const char *output) {
779 CFGFUN(bar_tray_padding,
const long padding_px) {
783 CFGFUN(bar_color_single,
const char *colorclass,
const char *color) {
784 if (strcmp(colorclass,
"background") == 0)
786 else if (strcmp(colorclass,
"separator") == 0)
788 else if (strcmp(colorclass,
"statusline") == 0)
790 else if (strcmp(colorclass,
"focused_background") == 0)
792 else if (strcmp(colorclass,
"focused_separator") == 0)
798 CFGFUN(bar_status_command,
const char *command) {
803 CFGFUN(bar_binding_mode_indicator,
const char *value) {
807 CFGFUN(bar_workspace_buttons,
const char *value) {
811 CFGFUN(bar_strip_workspace_numbers,
const char *value) {
815 CFGFUN(bar_strip_workspace_name,
const char *value) {
828 DLOG(
"\t new bar configuration finished, saving.\n");
struct Barconfig::bar_colors colors
static bool eval_boolstr(const char *str)
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
struct outputs_head outputs
Defines a mouse command to be executed instead of the default behavior when clicking on the non-statu...
enum Match::@16 window_mode
#define SLIST_FOREACH(var, head, field)
void * srealloc(void *ptr, size_t size)
Safe-wrapper around realloc which exits if realloc returns NULL (meaning that there is no more memory...
int logical_px(const int logical)
Convert a logical amount of pixels (e.g.
bool strip_workspace_name
Strip workspace name? Configuration option is 'strip_workspace_name yes'.
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
char * id
Automatically generated ID for this bar config.
bool hide_binding_mode_indicator
Hide mode button? Configuration option is 'binding_mode_indicator no' but we invert the bool for the ...
uint32_t bar_height
Defines the height of the bar in pixels.
bool workspace_auto_back_and_forth
Automatic workspace back and forth switching.
bool hide_workspace_buttons
Hide workspace buttons? Configuration option is 'workspace_buttons no' 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.
uint32_t modifier
Bar modifier (to show bar when in hide mode).
bool strip_workspace_numbers
Strip workspace numbers? Configuration option is 'strip_workspace_numbers yes'.
Holds a command specified by either an:
uint32_t floating_modifier
The modifier which needs to be pressed in combination with your mouse buttons to do things with float...
char * command
Command, like in command mode.
const char * DEFAULT_BINDING_MODE
The name of the default mode.
static void bar_configure_binding(const char *button, const char *release, const char *command)
#define APPLY_COLORS(classname)
struct bindings_head * bindings
struct autostarts_always_head autostarts_always
char * status_command
Command that should be run to get a statusline, for example 'i3status'.
int num_outputs
Number of outputs in the outputs array.
struct assignments_head assignments
float workspace_urgency_timer
By default, urgency is cleared immediately when switching to another workspace leads to focusing the ...
An Assignment makes specific windows go to a specific workspace/output or run a command for that wind...
char * fake_outputs
Overwrites output detection (for testing), see src/fake_outputs.c.
enum Assignment::@18 type
type of this assignment:
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.
enum Barconfig::@10 hidden_state
enum Barconfig::@11 position
Bar position (bottom by default).
bool disable_focus_follows_mouse
By default, focus follows mouse.
static int criteria_next_state
bool force_xinerama
By default, use the RandR API for multi-monitor setups.
Stores which workspace (by name or number) goes to which output and its gaps config.
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...
int32_t floating_maximum_width
Maximum and minimum dimensions of a floating window.
int32_t floating_minimum_width
long ws_name_to_number(const char *name)
Parses the workspace name as a number.
bool match_is_empty(Match *match)
Check if a match is empty.
int default_floating_border_width
Match match
the criteria to check if a window matches
bool disable_randr15
Don’t use RandR 1.5 for querying outputs.
static char * font_pattern
void workspace_back_and_forth(void)
Focuses the previously focused workspace.
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.
static char * current_mode
char * font
Font specification for all text rendered on the bar.
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.
void ipc_set_kill_timeout(ev_tstamp new)
Set the maximum duration that we allow for a connection with an unwriteable socket.
char * focused_statusline
static bool current_mode_pango_markup
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
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...
The configuration file can contain multiple sets of bindings.
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.
union Assignment::@19 dest
destination workspace/command/output, depending on the type
int default_orientation
Default orientation for new containers.
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
border_style_t default_border
The default border style for new windows.
struct ws_assignments_head ws_assignments
static void create_gaps_assignment(const char *workspace, const char *scope, gaps_t gaps)
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.
hide_edge_borders_mode_t hide_edge_borders
Remove borders if they are adjacent to the screen edge.
void match_copy(Match *dest, Match *src)
Copies the data of a match from src to dest.
char * focused_background
void match_init(Match *match)
Initializes the Match data structure.
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...
Holds the status bar configuration (i3bar).
enum Config::@7 title_align
Title alignment options.
#define TAILQ_INSERT_TAIL(head, elm, field)
bool no_startup_id
no_startup_id flag for start_application().
static char * current_workspace
#define TAILQ_FOREACH(var, head, field)
static Barconfig * current_bar
char * socket_path
Path to the i3 IPC socket.
smart_borders_t smart_borders