diff --git a/CHANGELOG.md b/CHANGELOG.md index 667b1662..4ae5f985 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,10 +74,13 @@ - `scrollback-down-page` (shift+page-down) - `scrollback-down-half-page` (none) - `scrollback-down-line` (none) +* Support for visual bell which flashes the terminal window. + ([#1337][1337]). [1077]: https://codeberg.org/dnkl/foot/issues/1077 [1364]: https://codeberg.org/dnkl/foot/issues/1364 [419]: https://codeberg.org/dnkl/foot/issues/419 +[1337]: https://codeberg.org/dnkl/foot/issues/1337 ### Changed diff --git a/config.c b/config.c index 4722cfdd..35c847e9 100644 --- a/config.c +++ b/config.c @@ -1054,6 +1054,8 @@ parse_section_bell(struct context *ctx) return value_to_bool(ctx, &conf->bell.urgent); else if (strcmp(key, "notify") == 0) return value_to_bool(ctx, &conf->bell.notify); + else if (strcmp(key, "visual") == 0) + return value_to_bool(ctx, &conf->bell.flash); else if (strcmp(key, "command") == 0) return value_to_spawn_template(ctx, &conf->bell.command); else if (strcmp(key, "command-focused") == 0) @@ -1237,6 +1239,7 @@ parse_section_colors(struct context *ctx) return true; } + else if (strcmp(key, "flash") == 0) color = &conf->colors.flash; else if (strcmp(key, "foreground") == 0) color = &conf->colors.fg; else if (strcmp(key, "background") == 0) color = &conf->colors.bg; else if (strcmp(key, "selection-foreground") == 0) color = &conf->colors.selection_fg; @@ -1320,6 +1323,21 @@ parse_section_colors(struct context *ctx) return true; } + else if (strcmp(key, "flash-alpha") == 0) { + float alpha; + if (!value_to_float(ctx, &alpha)) + return false; + + if (alpha < 0. || alpha > 1.) { + LOG_CONTEXTUAL_ERR("not in range 0.0-1.0"); + return false; + } + + conf->colors.flash_alpha = alpha * 65535.; + return true; + } + + else { LOG_CONTEXTUAL_ERR("not valid option"); return false; @@ -2980,6 +2998,7 @@ config_load(struct config *conf, const char *conf_path, .bell = { .urgent = false, .notify = false, + .flash = false, .command = { .argv = {.args = NULL}, }, @@ -3003,6 +3022,8 @@ config_load(struct config *conf, const char *conf_path, .colors = { .fg = default_foreground, .bg = default_background, + .flash = 0x7f7f00, + .flash_alpha = 0x7fff, .alpha = 0xffff, .selection_fg = 0x80000000, /* Use default bg */ .selection_bg = 0x80000000, /* Use default fg */ diff --git a/config.h b/config.h index 4d2838c4..3c5b3df7 100644 --- a/config.h +++ b/config.h @@ -160,6 +160,7 @@ struct config { struct { bool urgent; bool notify; + bool flash; struct config_spawn_template command; bool command_focused; } bell; @@ -202,6 +203,8 @@ struct config { struct { uint32_t fg; uint32_t bg; + uint32_t flash; + uint32_t flash_alpha; uint32_t table[256]; uint16_t alpha; uint32_t selection_fg; diff --git a/doc/foot.ini.5.scd b/doc/foot.ini.5.scd index 5ef4dcb4..b7b79e75 100644 --- a/doc/foot.ini.5.scd +++ b/doc/foot.ini.5.scd @@ -394,6 +394,10 @@ Note: do not set *TERM* here; use the *term* option in the main Default: _no_ +*visual* + When set to _yes_, foot will flash the terminal window. Default: + _no_ + *command* When set, foot will execute this command when *BEL* is received. Default: none @@ -642,6 +646,13 @@ can configure the background transparency with the _alpha_ option. Color to use for the underline used to highlight URLs in URL mode. Default: _regular3_. +*flash* + Color to use for the terminal window flash. Default: _7f7f00_. + +*flash-alpha* + Flash translucency. A value in the range 0.0-1.0, where 0.0 means + completely transparent, and 1.0 is opaque. Default: _0.5_. + # SECTION: csd This section controls the look of the _CSDs_ (Client Side diff --git a/foot.ini b/foot.ini index cdbd8259..55eb42de 100644 --- a/foot.ini +++ b/foot.ini @@ -43,6 +43,7 @@ [bell] # urgent=no # notify=no +# visual=no # command= # command-focused=no @@ -77,6 +78,8 @@ # alpha=1.0 # background=242424 # foreground=ffffff +# flash=7f7f00 +# flash-alpha=0.5 ## Normal/regular colors (color palette 0-7) # regular0=242424 # black diff --git a/render.c b/render.c index 9296223a..9f858bf1 100644 --- a/render.c +++ b/render.c @@ -1588,7 +1588,9 @@ render_overlay(struct terminal *term) break; case OVERLAY_FLASH: - color = (pixman_color_t){.red=0x7fff, .green=0x7fff, .blue=0, .alpha=0x7fff}; + color = color_hex_to_pixman_with_alpha( + term->conf->colors.flash, + term->conf->colors.flash_alpha); break; } @@ -2193,7 +2195,7 @@ render_csd_button_maximize_maximized( { x_margin + shrink, y_margin + thick, thick, width - 2 * thick - shrink }, { x_margin + width - thick - shrink, y_margin + thick, thick, width - 2 * thick - shrink }, { x_margin + shrink, y_margin + width - thick - shrink, width - 2 * shrink, thick }}); - + pixman_image_unref(src); } diff --git a/terminal.c b/terminal.c index 91c46a11..9a76488e 100644 --- a/terminal.c +++ b/terminal.c @@ -3270,6 +3270,7 @@ term_flash(struct terminal *term, unsigned duration_ms) void term_bell(struct terminal *term) { + if (!term->bell_action_enabled) return; @@ -3288,6 +3289,9 @@ term_bell(struct terminal *term) if (term->conf->bell.notify) notify_notify(term, "Bell", "Bell in terminal"); + if (term->conf->bell.flash) + term_flash(term, 100); + if ((term->conf->bell.command.argv.args != NULL) && (!term->kbd_focus || term->conf->bell.command_focused)) {