config: add ‘notify’ to possible values for ‘bell’ in foot.ini

When `bell=notify`, foot will trigger a desktop notification when it
receives a BEL in an unfocused window.
This commit is contained in:
Daniel Eklöf 2020-12-10 18:22:48 +01:00
parent 1d8410b7ae
commit 15d20af2a2
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
7 changed files with 45 additions and 17 deletions

View file

@ -89,6 +89,9 @@ means foot can be PGO:d in e.g. sandboxed build scripts. See
* OSC 777;notify: desktop notifications. Use in combination with the * OSC 777;notify: desktop notifications. Use in combination with the
new **notify** option in `foot.ini` new **notify** option in `foot.ini`
(https://codeberg.org/dnkl/foot/issues/224). (https://codeberg.org/dnkl/foot/issues/224).
* **bell** option can now be set to `notify`, in which case a desktop
notification is emitted when foot receives `BEL` in an unfocused
window.
### Changed ### Changed

View file

@ -483,14 +483,17 @@ parse_section_main(const char *key, const char *value, struct config *conf,
else if (strcmp(key, "bell") == 0) { else if (strcmp(key, "bell") == 0) {
if (strcmp(value, "set-urgency") == 0) if (strcmp(value, "set-urgency") == 0)
conf->bell_is_urgent = true; conf->bell_action = BELL_ACTION_URGENT;
else if (strcmp(value, "notify") == 0)
conf->bell_action = BELL_ACTION_NOTIFY;
else if (strcmp(value, "none") == 0) else if (strcmp(value, "none") == 0)
conf->bell_is_urgent = false; conf->bell_action = BELL_ACTION_NONE;
else { else {
LOG_AND_NOTIFY_ERR( LOG_AND_NOTIFY_ERR(
"%s:%d: [default]: bell: " "%s:%d: [default]: bell: "
"expected either 'set-urgency' or 'none'", path, lineno); "expected either 'set-urgency', 'notify' or 'none'",
conf->bell_is_urgent = false; path, lineno);
conf->bell_action = BELL_ACTION_NONE;
return false; return false;
} }
} }
@ -1945,7 +1948,7 @@ config_load(struct config *conf, const char *conf_path,
.pad_x = 2, .pad_x = 2,
.pad_y = 2, .pad_y = 2,
.bold_in_bright = false, .bold_in_bright = false,
.bell_is_urgent = false, .bell_action = BELL_ACTION_NONE,
.startup_mode = STARTUP_WINDOWED, .startup_mode = STARTUP_WINDOWED,
.fonts = {tll_init(), tll_init(), tll_init(), tll_init()}, .fonts = {tll_init(), tll_init(), tll_init(), tll_init()},
.dpi_aware = true, /* Use DPI by default, not scale factor */ .dpi_aware = true, /* Use DPI by default, not scale factor */

View file

@ -72,7 +72,11 @@ struct config {
unsigned pad_y; unsigned pad_y;
bool bold_in_bright; bool bold_in_bright;
bool bell_is_urgent; enum {
BELL_ACTION_NONE,
BELL_ACTION_URGENT,
BELL_ACTION_NOTIFY,
} bell_action;
enum { STARTUP_WINDOWED, STARTUP_MAXIMIZED, STARTUP_FULLSCREEN } startup_mode; enum { STARTUP_WINDOWED, STARTUP_MAXIMIZED, STARTUP_FULLSCREEN } startup_mode;

6
csi.c
View file

@ -482,7 +482,7 @@ decset_decrst(struct terminal *term, unsigned param, bool enable)
break; break;
case 1042: case 1042:
term->bell_is_urgent = enable; term->bell_action_enabled = enable;
break; break;
#if 0 #if 0
@ -591,7 +591,7 @@ xtsave(struct terminal *term, unsigned param)
case 1034: term->xtsave.meta_eight_bit = term->meta.eight_bit; break; case 1034: term->xtsave.meta_eight_bit = term->meta.eight_bit; break;
case 1035: term->xtsave.num_lock_modifier = term->num_lock_modifier; break; case 1035: term->xtsave.num_lock_modifier = term->num_lock_modifier; break;
case 1036: term->xtsave.meta_esc_prefix = term->meta.esc_prefix; break; case 1036: term->xtsave.meta_esc_prefix = term->meta.esc_prefix; break;
case 1042: term->xtsave.bell_is_urgent = term->bell_is_urgent; break; case 1042: term->xtsave.bell_action_enabled = term->bell_action_enabled; break;
case 1049: term->xtsave.alt_screen = term->grid == &term->alt; break; case 1049: term->xtsave.alt_screen = term->grid == &term->alt; break;
case 2004: term->xtsave.bracketed_paste = term->bracketed_paste; break; case 2004: term->xtsave.bracketed_paste = term->bracketed_paste; break;
case 27127: term->xtsave.modify_escape_key = term->modify_escape_key; break; case 27127: term->xtsave.modify_escape_key = term->modify_escape_key; break;
@ -626,7 +626,7 @@ xtrestore(struct terminal *term, unsigned param)
case 1034: enable = term->xtsave.meta_eight_bit; break; case 1034: enable = term->xtsave.meta_eight_bit; break;
case 1035: enable = term->xtsave.num_lock_modifier; break; case 1035: enable = term->xtsave.num_lock_modifier; break;
case 1036: enable = term->xtsave.meta_esc_prefix; break; case 1036: enable = term->xtsave.meta_esc_prefix; break;
case 1042: enable = term->xtsave.bell_is_urgent; break; case 1042: enable = term->xtsave.bell_action_enabled; break;
case 1049: enable = term->xtsave.alt_screen; break; case 1049: enable = term->xtsave.alt_screen; break;
case 2004: enable = term->xtsave.bracketed_paste; break; case 2004: enable = term->xtsave.bracketed_paste; break;
case 27127: enable = term->xtsave.modify_escape_key; break; case 27127: enable = term->xtsave.modify_escape_key; break;

View file

@ -120,7 +120,7 @@ in this order:
*bell* *bell*
Action to perform when receiving a *BEL* character. Can be set to Action to perform when receiving a *BEL* character. Can be set to
either *set-urgency* or *none*. either *set-urgency*, *notify* or *none*.
When set to *set-urgency*, the margins will be painted in red When set to *set-urgency*, the margins will be painted in red
whenever *BEL* is received while the window does *not* have whenever *BEL* is received while the window does *not* have
@ -136,6 +136,9 @@ in this order:
_Note_: expect this feature to be *replaced* with proper _Note_: expect this feature to be *replaced* with proper
compositor urgency support once/if that gets implemented. compositor urgency support once/if that gets implemented.
When set to *notify*, foot will emit a desktop notification (see
the *notify* option).
When set to *none*, no special action is taken when receiving *BEL*. When set to *none*, no special action is taken when receiving *BEL*.
Default: _none_. Default: _none_.

View file

@ -25,6 +25,7 @@
#include "extract.h" #include "extract.h"
#include "grid.h" #include "grid.h"
#include "ime.h" #include "ime.h"
#include "notify.h"
#include "quirks.h" #include "quirks.h"
#include "reaper.h" #include "reaper.h"
#include "render.h" #include "render.h"
@ -1091,7 +1092,7 @@ term_init(const struct config *conf, struct fdm *fdm, struct reaper *reaper,
.eight_bit = true, .eight_bit = true,
}, },
.num_lock_modifier = true, .num_lock_modifier = true,
.bell_is_urgent = conf->bell_is_urgent, .bell_action_enabled = true,
.tab_stops = tll_init(), .tab_stops = tll_init(),
.wl = wayl, .wl = wayl,
.render = { .render = {
@ -1532,6 +1533,8 @@ term_reset(struct terminal *term, bool hard)
term->bracketed_paste = false; term->bracketed_paste = false;
term->focus_events = false; term->focus_events = false;
term->modify_escape_key = false; term->modify_escape_key = false;
term->num_lock_modifier = true;
term->bell_action_enabled = true;
term->mouse_tracking = MOUSE_NONE; term->mouse_tracking = MOUSE_NONE;
term->mouse_reporting = MOUSE_NORMAL; term->mouse_reporting = MOUSE_NORMAL;
term->charsets.selected = 0; term->charsets.selected = 0;
@ -2512,12 +2515,24 @@ term_flash(struct terminal *term, unsigned duration_ms)
void void
term_bell(struct terminal *term) term_bell(struct terminal *term)
{ {
if (term->kbd_focus || !term->bell_is_urgent) if (term->kbd_focus || !term->bell_action_enabled)
return; return;
/* There's no 'urgency' hint in Wayland - we just paint the margins red */ switch (term->conf->bell_action) {
term->render.urgency = true; case BELL_ACTION_NONE:
term_damage_margins(term); break;
case BELL_ACTION_URGENT:
/* There's no 'urgency' hint in Wayland - we just paint the
* margins red */
term->render.urgency = true;
term_damage_margins(term);
break;
case BELL_ACTION_NOTIFY:
notify_notify(term, "Bell", "Bell in terminal");
break;
}
} }
bool bool

View file

@ -271,7 +271,7 @@ struct terminal {
} meta; } meta;
bool num_lock_modifier; bool num_lock_modifier;
bool bell_is_urgent; bool bell_action_enabled;
/* Saved DECSET modes - we save the SET state */ /* Saved DECSET modes - we save the SET state */
struct { struct {
@ -295,7 +295,7 @@ struct terminal {
uint32_t meta_eight_bit:1; uint32_t meta_eight_bit:1;
uint32_t meta_esc_prefix:1; uint32_t meta_esc_prefix:1;
uint32_t num_lock_modifier:1; uint32_t num_lock_modifier:1;
uint32_t bell_is_urgent:1; uint32_t bell_action_enabled:1;
uint32_t alt_screen:1; uint32_t alt_screen:1;
uint32_t modify_escape_key:1; uint32_t modify_escape_key:1;
uint32_t ime:1; uint32_t ime:1;