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) {
145 new->command =
sstrdup(command);
146 new->no_startup_id = (no_startup_id != NULL);
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;
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) {
278 CFGFUN(force_focus_wrapping,
const char *value) {
300 CFGFUN(force_display_urgency_hint,
const long duration_ms) {
304 CFGFUN(focus_on_window_activation,
const char *mode) {
305 if (strcmp(mode,
"smart") == 0)
307 else if (strcmp(mode,
"urgent") == 0)
309 else if (strcmp(mode,
"focus") == 0)
311 else if (strcmp(mode,
"none") == 0)
314 ELOG(
"Unknown focus_on_window_activation mode \"%s\", ignoring it.\n", mode);
325 CFGFUN(workspace,
const char *workspace,
const char *output) {
326 DLOG(
"Assigning workspace \"%s\" to output \"%s\"\n", workspace, output);
331 bool duplicate =
false;
333 if (strcasecmp(assignment->
name, workspace) == 0) {
334 ELOG(
"You have a duplicate workspace assignment for workspace \"%s\"\n",
353 CFGFUN(restart_state,
const char *path) {
358 CFGFUN(popup_during_fullscreen,
const char *value) {
359 if (strcmp(value,
"ignore") == 0) {
361 }
else if (strcmp(value,
"leave_fullscreen") == 0) {
368 CFGFUN(color_single,
const char *colorclass,
const char *color) {
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) \ 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); \ 387 if (child_border != NULL) { \ 388 config.client[label].classname.child_border = \ 389 draw_util_hex_to_color(child_border); \ 391 config.client[label].classname.child_border = \ 392 config.client[label].classname.background;\ 399 if (strcmp(qubelabel,
"dom0") == 0) {
401 }
else if (strcmp(qubelabel,
"red") == 0) {
403 }
else if (strcmp(qubelabel,
"orange") == 0) {
405 }
else if (strcmp(qubelabel,
"yellow") == 0) {
407 }
else if (strcmp(qubelabel,
"green") == 0) {
409 }
else if (strcmp(qubelabel,
"gray") == 0) {
411 }
else if (strcmp(qubelabel,
"blue") == 0) {
413 }
else if (strcmp(qubelabel,
"purple") == 0) {
415 }
else if (strcmp(qubelabel,
"black") == 0) {
433 ELOG(
"Match is empty, ignoring this assignment\n");
437 DLOG(
"New assignment, using above criteria, to output \"%s\".\n", output);
440 assignment->
type = A_TO_OUTPUT;
445 CFGFUN(assign,
const char *workspace,
bool is_number) {
447 ELOG(
"Match is empty, ignoring this assignment\n");
452 ELOG(
"Could not parse initial part of \"%s\" as a number.\n", workspace);
456 DLOG(
"New assignment, using above criteria, to workspace \"%s\".\n", workspace);
459 assignment->
type = is_number ? A_TO_WORKSPACE_NUMBER : A_TO_WORKSPACE;
466 ELOG(
"Match is empty, ignoring this assignment\n");
470 DLOG(
"New assignment, using above criteria, to ignore focus on manage.\n");
473 assignment->
type = A_NO_FOCUS;
488 CFGFUN(bar_separator_symbol,
const char *separator) {
494 current_bar->
mode = (strcmp(mode,
"dock") == 0 ? M_DOCK : (strcmp(mode,
"hide") == 0 ? M_HIDE : M_INVISIBLE));
497 CFGFUN(bar_hidden_state,
const char *hidden_state) {
498 current_bar->
hidden_state = (strcmp(hidden_state,
"hide") == 0 ? S_HIDE : S_SHOW);
516 CFGFUN(bar_modifier,
const char *modifier) {
517 if (strcmp(modifier,
"Mod1") == 0)
519 else if (strcmp(modifier,
"Mod2") == 0)
521 else if (strcmp(modifier,
"Mod3") == 0)
523 else if (strcmp(modifier,
"Mod4") == 0)
525 else if (strcmp(modifier,
"Mod5") == 0)
527 else if (strcmp(modifier,
"Control") == 0 ||
528 strcmp(modifier,
"Ctrl") == 0)
530 else if (strcmp(modifier,
"Shift") == 0)
532 else if (strcmp(modifier,
"none") == 0 ||
533 strcmp(modifier,
"off") == 0)
538 if (strncasecmp(button,
"button", strlen(
"button")) != 0) {
539 ELOG(
"Bindings for a bar can only be mouse bindings, not \"%s\", ignoring.\n", button);
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);
548 const bool release_bool = release != NULL;
553 ELOG(
"command for button %s was already specified, ignoring.\n", button);
559 new_binding->
release = release_bool;
566 ELOG(
"'wheel_up_cmd' is deprecated. Please us 'bindsym button4 %s' instead.\n", command);
571 ELOG(
"'wheel_down_cmd' is deprecated. Please us 'bindsym button5 %s' instead.\n", command);
579 CFGFUN(bar_position,
const char *position) {
580 current_bar->
position = (strcmp(position,
"top") == 0 ? P_TOP : P_BOTTOM);
583 CFGFUN(bar_i3bar_command,
const char *i3bar_command) {
588 CFGFUN(bar_color,
const char *colorclass,
const char *border,
const char *background,
const char *text) {
589 #define APPLY_COLORS(classname) \ 591 if (strcmp(colorclass, #classname) == 0) { \ 592 if (text != NULL) { \ 594 current_bar->colors.classname##_border = sstrdup(border); \ 595 current_bar->colors.classname##_bg = sstrdup(background); \ 596 current_bar->colors.classname##_text = sstrdup(text); \ 599 current_bar->colors.classname##_bg = sstrdup(background); \ 600 current_bar->colors.classname##_text = sstrdup(border); \ 614 CFGFUN(bar_socket_path,
const char *socket_path) {
619 CFGFUN(bar_tray_output,
const char *output) {
625 CFGFUN(bar_tray_padding,
const long padding_px) {
629 CFGFUN(bar_color_single,
const char *colorclass,
const char *color) {
630 if (strcmp(colorclass,
"background") == 0)
632 else if (strcmp(colorclass,
"separator") == 0)
634 else if (strcmp(colorclass,
"statusline") == 0)
636 else if (strcmp(colorclass,
"focused_background") == 0)
638 else if (strcmp(colorclass,
"focused_separator") == 0)
644 CFGFUN(bar_status_command,
const char *command) {
649 CFGFUN(bar_binding_mode_indicator,
const char *value) {
653 CFGFUN(bar_workspace_buttons,
const char *value) {
657 CFGFUN(bar_strip_workspace_numbers,
const char *value) {
670 DLOG(
"\t new bar configuration finished, saving.\n");
672 if (current_bar->
id == NULL)
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...
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
void workspace_back_and_forth(void)
Focuses the previously focused workspace.
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 'workspace_buttons no' but we invert the bool to get ...
Holds a command specified by either an:
int32_t floating_minimum_width
bool verbose
Enable verbose mode? Useful for debugging purposes.
struct barconfig_head barconfigs
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.
char * focused_statusline
Holds the status bar configuration (i3bar).
char * separator_symbol
A custom separator to use instead of a vertical line.
An Assignment makes specific windows go to a specific workspace/output or run a command for that wind...
void match_free(Match *match)
Frees the given match.
#define TAILQ_INSERT_TAIL(head, elm, field)
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)
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
struct autostarts_always_head autostarts_always
union Assignment::@19 dest
destination workspace/command, depending on the type
bool strip_workspace_numbers
Strip workspace numbers? Configuration option is 'strip_workspace_numbers yes'.
struct assignments_head assignments
char * command
The command which is to be executed for this button.
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.
int num_outputs
Number of outputs in the outputs array.
enum Barconfig::@9 hidden_state
char * i3bar_command
Command that should be run to execute i3bar, give a full path if i3bar is not in your $PATH...
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)
bool match_is_empty(Match *match)
Check if a match is empty.
void set_font(i3Font *font)
Defines the font to be used for the forthcoming calls.
int default_floating_border_width
bool workspace_auto_back_and_forth
Automatic workspace back and forth switching.
static char * font_pattern
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.
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...
qube_label_t
Qubes colors.
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.
static bool current_mode_pango_markup
char * focused_background
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
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.
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...
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.
char * fake_outputs
Overwrites output detection (for testing), see src/fake_outputs.c.
char * restart_state_path
#define SLIST_FOREACH(var, head, field)
The configuration file can contain multiple sets of bindings.
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.
struct ws_assignments_head ws_assignments
enum Barconfig::@10 modifier
Bar modifier (to show bar when in hide mode).
char * socket_path
Path to the i3 IPC socket.
bool hide_binding_mode_indicator
Hide mode button? Configuration option is 'binding_mode_indicator no' but we invert the bool for the ...
void match_copy(Match *dest, Match *src)
Copies the data of a match from src to dest.
char * status_command
Command that should be run to get a statusline, for example 'i3status'.
void match_init(Match *match)
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...
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.
Match match
the criteria to check if a window matches
warping_t mouse_warping
By default, when switching focus to a window on a different output (e.g.
#define APPLY_COLORS(classname, label)
bool disable_randr15
Don’t use RandR 1.5 for querying outputs.
char * command
Command, like in command mode.
focus_wrapping_t focus_wrapping
When focus wrapping is enabled (the default), attempting to move focus past the edge of the screen (i...