Go to the documentation of this file.
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;
167 CFGFUN(floating_minimum_size,
const long width,
const long height) {
172 CFGFUN(floating_maximum_size,
const long width,
const long height) {
177 CFGFUN(floating_modifier,
const char *modifiers) {
181 CFGFUN(default_orientation,
const char *orientation) {
182 if (strcmp(orientation,
"horizontal") == 0)
184 else if (strcmp(orientation,
"vertical") == 0)
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)
200 CFGFUN(default_border,
const char *windowtype,
const char *border,
const long width) {
204 if (strcmp(border,
"1pixel") == 0) {
207 }
else if (strcmp(border,
"none") == 0) {
210 }
else if (strcmp(border,
"pixel") == 0) {
212 border_width = width;
215 border_width = width;
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));
225 DLOG(
"default floating border style = %d and border width = %d (%d physical px)\n",
226 border_style, border_width,
logical_px(border_width));
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)
249 CFGFUN(focus_follows_mouse,
const char *value) {
253 CFGFUN(mouse_warping,
const char *value) {
254 if (strcmp(value,
"none") == 0)
256 else if (strcmp(value,
"output") == 0)
264 CFGFUN(disable_randr15,
const char *value) {
268 CFGFUN(focus_wrapping,
const char *value) {
269 if (strcmp(value,
"force") == 0) {
271 }
else if (strcmp(value,
"workspace") == 0) {
280 CFGFUN(force_focus_wrapping,
const char *value) {
302 CFGFUN(force_display_urgency_hint,
const long duration_ms) {
306 CFGFUN(focus_on_window_activation,
const char *mode) {
307 if (strcmp(mode,
"smart") == 0)
309 else if (strcmp(mode,
"urgent") == 0)
311 else if (strcmp(mode,
"focus") == 0)
313 else if (strcmp(mode,
"none") == 0)
316 ELOG(
"Unknown focus_on_window_activation mode \"%s\", ignoring it.\n", mode);
323 CFGFUN(title_align,
const char *alignment) {
324 if (strcmp(alignment,
"left") == 0) {
326 }
else if (strcmp(alignment,
"center") == 0) {
328 }
else if (strcmp(alignment,
"right") == 0) {
341 CFGFUN(workspace,
const char *workspace,
const char *output) {
352 if (strcasecmp(assignment->
name, workspace) == 0) {
353 ELOG(
"You have a duplicate workspace assignment for workspace \"%s\"\n",
362 DLOG(
"Both workspace and current_workspace are NULL, assuming we had an error before\n");
368 DLOG(
"Assigning workspace \"%s\" to output \"%s\"\n", workspace,
output);
381 CFGFUN(restart_state,
const char *path) {
386 CFGFUN(popup_during_fullscreen,
const char *value) {
387 if (strcmp(value,
"ignore") == 0) {
389 }
else if (strcmp(value,
"leave_fullscreen") == 0) {
396 CFGFUN(color_single,
const char *colorclass,
const char *color) {
401 CFGFUN(color,
const char *colorclass,
const char *qubelabel,
const char *border,
const char *background,
const char *text,
const char *indicator,
const char *child_border) {
402 #define APPLY_COLORS(classname, label) \
404 if (strcmp(colorclass, "client." #classname) == 0) { \
405 config.client[label].classname.border = \
406 draw_util_hex_to_color(border); \
407 config.client[label].classname.background = \
408 draw_util_hex_to_color(background); \
409 config.client[label].classname.text = \
410 draw_util_hex_to_color(text); \
411 if (indicator != NULL) { \
412 config.client[label].classname.indicator = \
413 draw_util_hex_to_color(indicator); \
415 if (child_border != NULL) { \
416 config.client[label].classname.child_border = \
417 draw_util_hex_to_color(child_border); \
419 config.client[label].classname.child_border = \
420 config.client[label].classname.background;\
427 if (strcmp(qubelabel,
"dom0") == 0) {
429 }
else if (strcmp(qubelabel,
"red") == 0) {
431 }
else if (strcmp(qubelabel,
"orange") == 0) {
433 }
else if (strcmp(qubelabel,
"yellow") == 0) {
435 }
else if (strcmp(qubelabel,
"green") == 0) {
437 }
else if (strcmp(qubelabel,
"gray") == 0) {
439 }
else if (strcmp(qubelabel,
"blue") == 0) {
441 }
else if (strcmp(qubelabel,
"purple") == 0) {
443 }
else if (strcmp(qubelabel,
"black") == 0) {
461 ELOG(
"Match is empty, ignoring this assignment\n");
466 ELOG(
"Assignments using window mode (floating/tiling) is not supported\n");
470 DLOG(
"New assignment, using above criteria, to output \"%s\".\n",
output);
473 assignment->
type = A_TO_OUTPUT;
478 CFGFUN(assign,
const char *workspace,
bool is_number) {
480 ELOG(
"Match is empty, ignoring this assignment\n");
485 ELOG(
"Assignments using window mode (floating/tiling) is not supported\n");
490 ELOG(
"Could not parse initial part of \"%s\" as a number.\n", workspace);
494 DLOG(
"New assignment, using above criteria, to workspace \"%s\".\n", workspace);
497 assignment->
type = is_number ? A_TO_WORKSPACE_NUMBER : A_TO_WORKSPACE;
504 ELOG(
"Match is empty, ignoring this assignment\n");
508 DLOG(
"New assignment, using above criteria, to ignore focus on manage.\n");
511 assignment->
type = A_NO_FOCUS;
515 CFGFUN(ipc_kill_timeout,
const long timeout_ms) {
530 CFGFUN(bar_separator_symbol,
const char *separator) {
536 current_bar->
mode = (strcmp(mode,
"dock") == 0 ? M_DOCK : (strcmp(mode,
"hide") == 0 ? M_HIDE : M_INVISIBLE));
539 CFGFUN(bar_hidden_state,
const char *hidden_state) {
558 CFGFUN(bar_modifier,
const char *modifiers) {
563 if (strncasecmp(button,
"button", strlen(
"button")) != 0) {
564 ELOG(
"Bindings for a bar can only be mouse bindings, not \"%s\", ignoring.\n", button);
568 int input_code = atoi(button + strlen(
"button"));
569 if (input_code < 1) {
570 ELOG(
"Button \"%s\" does not seem to be in format 'buttonX'.\n", button);
573 const bool release_bool = release != NULL;
578 ELOG(
"command for button %s was already specified, ignoring.\n", button);
584 new_binding->
release = release_bool;
591 ELOG(
"'wheel_up_cmd' is deprecated. Please us 'bindsym button4 %s' instead.\n",
command);
596 ELOG(
"'wheel_down_cmd' is deprecated. Please us 'bindsym button5 %s' instead.\n",
command);
604 CFGFUN(bar_position,
const char *position) {
608 CFGFUN(bar_i3bar_command,
const char *i3bar_command) {
613 CFGFUN(bar_color,
const char *colorclass,
const char *border,
const char *background,
const char *text) {
614 #define APPLY_COLORS(classname) \
616 if (strcmp(colorclass, #classname) == 0) { \
617 if (text != NULL) { \
619 current_bar->colors.classname##_border = sstrdup(border); \
620 current_bar->colors.classname##_bg = sstrdup(background); \
621 current_bar->colors.classname##_text = sstrdup(text); \
624 current_bar->colors.classname##_bg = sstrdup(background); \
625 current_bar->colors.classname##_text = sstrdup(border); \
639 CFGFUN(bar_socket_path,
const char *socket_path) {
644 CFGFUN(bar_tray_output,
const char *output) {
650 CFGFUN(bar_tray_padding,
const long padding_px) {
654 CFGFUN(bar_color_single,
const char *colorclass,
const char *color) {
655 if (strcmp(colorclass,
"background") == 0)
657 else if (strcmp(colorclass,
"separator") == 0)
659 else if (strcmp(colorclass,
"statusline") == 0)
661 else if (strcmp(colorclass,
"focused_background") == 0)
663 else if (strcmp(colorclass,
"focused_separator") == 0)
669 CFGFUN(bar_status_command,
const char *command) {
674 CFGFUN(bar_binding_mode_indicator,
const char *value) {
678 CFGFUN(bar_workspace_buttons,
const char *value) {
682 CFGFUN(bar_workspace_min_width,
const long width) {
686 CFGFUN(bar_strip_workspace_numbers,
const char *value) {
690 CFGFUN(bar_strip_workspace_name,
const char *value) {
703 DLOG(
"\t new bar configuration finished, saving.\n");
Defines a mouse command to be executed instead of the default behavior when clicking on the non-statu...
#define SLIST_FOREACH(var, head, field)
struct Barconfig::bar_colors colors
uint32_t modifier
Bar modifier (to show bar when in hide mode).
union Assignment::@19 dest
destination workspace/command/output, depending on the type
int input_code
The button to be used (e.g., 1 for "button1").
enum Barconfig::@11 position
Bar position (bottom by default).
Holds the status bar configuration (i3bar).
void match_init(Match *match)
Initializes the Match data structure.
static void bar_configure_binding(const char *button, const char *release, const char *command)
void * srealloc(void *ptr, size_t size)
Safe-wrapper around realloc which exits if realloc returns NULL (meaning that there is no more memory...
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...
bool show_marks
Specifies whether or not marks should be displayed in the window decoration.
bool hide_workspace_buttons
Hide workspace buttons? Configuration option is 'workspace_buttons no' but we invert the bool to get ...
char * id
Automatically generated ID for this bar config.
int default_orientation
Default orientation for new containers.
char * restart_state_path
struct autostarts_head autostarts
void match_copy(Match *dest, Match *src)
Copies the data of a match from src to dest.
border_style_t default_border
The default border style for new windows.
void set_font(i3Font *font)
Defines the font to be used for the forthcoming calls.
int32_t floating_maximum_width
Maximum and minimum dimensions of a floating window.
int32_t floating_minimum_height
struct ws_assignments_head ws_assignments
int num_outputs
Number of outputs in the outputs array.
uint32_t floating_modifier
The modifier which needs to be pressed in combination with your mouse buttons to do things with float...
int default_floating_border_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.
static char * font_pattern
const char * DEFAULT_BINDING_MODE
The name of the default mode.
bool strip_workspace_name
Strip workspace name? Configuration option is 'strip_workspace_name yes'.
static char * current_workspace
color_t draw_util_hex_to_color(const char *color)
Parses the given color in hex format to an internal color representation.
CFGFUN(criteria_init, int _state)
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.
char * focused_background
focus_wrapping_t focus_wrapping
When focus wrapping is enabled (the default), attempting to move focus past the edge of the screen (i...
char * sstrdup(const char *str)
Safe-wrapper around strdup which exits if malloc returns NULL (meaning that there is no more memory a...
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.
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_height
void workspace_back_and_forth(void)
Focuses the previously focused workspace.
static Match current_match
enum Config::@6 focus_on_window_activation
Behavior when a window sends a NET_ACTIVE_WINDOW message.
float workspace_urgency_timer
By default, urgency is cleared immediately when switching to another workspace leads to focusing the ...
enum Match::@16 window_mode
char * status_command
Command that should be run to get a statusline, for example 'i3status'.
char * fake_outputs
Overwrites output detection (for testing), see src/fake_outputs.c.
void match_free(Match *match)
Frees the given match.
char * command
The command which is to be executed for this button.
bool disable_randr15
Don’t use RandR 1.5 for querying outputs.
border_style_t default_floating_border
The default border style for new floating windows.
struct autostarts_always_head autostarts_always
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.
static int criteria_next_state
An Assignment makes specific windows go to a specific workspace/output or run a command for that wind...
bool strip_workspace_numbers
Strip workspace numbers? Configuration option is 'strip_workspace_numbers yes'.
enum Config::@7 title_align
Title alignment options.
void * smalloc(size_t size)
Safe-wrapper around malloc which exits if malloc returns NULL (meaning that there is no more memory a...
Stores which workspace (by name or number) goes to which output.
bool force_xinerama
By default, use the RandR API for multi-monitor setups.
static Barconfig * current_bar
char * command
Command, like in command mode.
struct outputs_head outputs
i3Font load_font(const char *pattern, const bool fallback)
Loads a font for usage, also getting its height.
int32_t floating_minimum_width
struct bindings_head * bindings
bool verbose
Enable verbose mode? Useful for debugging purposes.
Holds a command specified by either an:
Match match
the criteria to check if a window matches
#define TAILQ_FOREACH(var, head, field)
warping_t mouse_warping
By default, when switching focus to a window on a different output (e.g.
bool no_startup_id
no_startup_id flag for start_application().
char * font
Font specification for all text rendered on the bar.
bool hide_binding_mode_indicator
Hide mode button? Configuration option is 'binding_mode_indicator no' but we invert the bool for the ...
char * focused_statusline
qube_label_t
Qubes colors.
bool disable_focus_follows_mouse
By default, focus follows mouse.
enum Barconfig::@10 hidden_state
struct assignments_head assignments
static char * current_mode
char * socket_path
Path to the i3 IPC socket.
struct barconfig_head barconfigs
#define APPLY_COLORS(classname, label)
struct Config::config_client client[QUBE_NUM_LABELS]
hide_edge_borders_mode_t hide_edge_borders
Remove borders if they are adjacent to the screen edge.
int logical_px(const int logical)
Convert a logical amount of pixels (e.g.
void ipc_set_kill_timeout(ev_tstamp new)
Set the maximum duration that we allow for a connection with an unwriteable socket.
static bool eval_boolstr(const char *str)
#define TAILQ_INSERT_TAIL(head, elm, field)
char ** outputs
Outputs on which this bar should show up on.
bool workspace_auto_back_and_forth
Automatic workspace back and forth switching.
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...
static bool current_mode_pango_markup
bool release
If true, the command will be executed after the button is released.
int workspace_min_width
The minimal width for workspace buttons.
@ FOCUS_WRAPPING_WORKSPACE
enum Assignment::@18 type
type of this assignment:
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...
enum Barconfig::@9 mode
Bar display mode (hide unless modifier is pressed or show in dock mode or always hide in invisible mo...
The configuration file can contain multiple sets of bindings.
enum Config::@8 popup_during_fullscreen
What should happen when a new popup is opened during fullscreen mode.