From 36ed07788e47894d927ff1c51ed303724432688d Mon Sep 17 00:00:00 2001 From: Raimund Sacherer Date: Sat, 7 Oct 2023 19:37:04 +0200 Subject: [PATCH] Enable the use of flash as visual bell With this patch we can configure flash in the bell section. The colors section allow now to configure the color of the flash and the alpha to apply to. Default values are the values which where currently used for flash, altough I personally like a nice red (eb1313) better. --- config.c | 21 +++++++++++++++++++++ config.h | 3 +++ doc/foot.ini.5.scd | 18 ++++++++++++++++++ foot.ini | 3 +++ render.c | 4 ++-- terminal.c | 8 ++++++++ terminal.h | 2 ++ 7 files changed, 57 insertions(+), 2 deletions(-) diff --git a/config.c b/config.c index 6ba371e8..0f5cb009 100644 --- a/config.c +++ b/config.c @@ -1031,6 +1031,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, "flash") == 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) @@ -1214,6 +1216,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; @@ -1297,6 +1300,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; @@ -2948,6 +2966,7 @@ config_load(struct config *conf, const char *conf_path, .bell = { .urgent = false, .notify = false, + .flash = false, .command = { .argv = {.args = NULL}, }, @@ -2971,6 +2990,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 24c42a5e..4c5fc7fb 100644 --- a/doc/foot.ini.5.scd +++ b/doc/foot.ini.5.scd @@ -394,6 +394,12 @@ Note: do not set *TERM* here; use the *term* option in the main Default: _no_ +*flash* + When set to _yes_, foot will emit the bell signal flashing the + terminal window whenever *BEL* is received. + + Default: _no_ + *command* When set, foot will execute this command when *BEL* is received. Default: none @@ -609,6 +615,18 @@ can configure the background transparency with the _alpha_ option. https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit for an explanation of the remainder. +*flash* + Color to use for the terminal window flash. + + Default: _7f7fff_. + + +*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.7_. + *alpha* Background translucency. A value in the range 0.0-1.0, where 0.0 means completely transparent, and 1.0 is opaque. Default: _1.0_. diff --git a/foot.ini b/foot.ini index 00505165..7fd1c607 100644 --- a/foot.ini +++ b/foot.ini @@ -43,6 +43,7 @@ [bell] # urgent=no # notify=no +# flash=no # command= # command-focused=no @@ -77,6 +78,8 @@ # alpha=1.0 # background=242424 # foreground=ffffff +# flash=7f7fff +# flash_alpha=0.7 ## Normal/regular colors (color palette 0-7) # regular0=242424 # black diff --git a/render.c b/render.c index 3101d36d..12ddbf13 100644 --- a/render.c +++ b/render.c @@ -1582,7 +1582,7 @@ 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->colors.flash, term->colors.flash_alpha); break; } @@ -2186,7 +2186,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..99093342 100644 --- a/terminal.c +++ b/terminal.c @@ -1170,6 +1170,8 @@ term_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper, .colors = { .fg = conf->colors.fg, .bg = conf->colors.bg, + .flash = conf->colors.flash, + .flash_alpha = conf->colors.flash_alpha, .alpha = conf->colors.alpha, .selection_fg = conf->colors.selection_fg, .selection_bg = conf->colors.selection_bg, @@ -1922,7 +1924,9 @@ term_reset(struct terminal *term, bool hard) fdm_del(term->fdm, term->blink.fd); term->blink.fd = -1; term->colors.fg = term->conf->colors.fg; term->colors.bg = term->conf->colors.bg; + term->colors.flash = term->conf->colors.flash; term->colors.alpha = term->conf->colors.alpha; + term->colors.flash_alpha = term->conf->colors.flash_alpha; term->colors.selection_fg = term->conf->colors.selection_fg; term->colors.selection_bg = term->conf->colors.selection_bg; term->colors.use_custom_selection = term->conf->colors.use_custom.selection; @@ -3270,6 +3274,7 @@ term_flash(struct terminal *term, unsigned duration_ms) void term_bell(struct terminal *term) { + if (!term->bell_action_enabled) return; @@ -3288,6 +3293,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)) { diff --git a/terminal.h b/terminal.h index da873ae6..4939b91e 100644 --- a/terminal.h +++ b/terminal.h @@ -508,6 +508,8 @@ struct terminal { 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;