diff options
author | Egmont Koblinger <egmont@gmail.com> | 2014-08-25 22:49:41 +0200 |
---|---|---|
committer | Egmont Koblinger <egmont@gmail.com> | 2014-08-25 22:49:41 +0200 |
commit | 4add1f726a8acef0525f5903b9cbe7ae0b905658 (patch) | |
tree | b0ee8a84ed7fc17aa17b3c6b33da8d706dc04c51 | |
parent | 2e64b768924ab7cdbd263e2141086652c6128740 (diff) | |
download | vte-4add1f726a8acef0525f5903b9cbe7ae0b905658.tar.gz |
widget: Implement visual bell
https://bugzilla.gnome.org/show_bug.cgi?id=602726
-rw-r--r-- | src/vte-private.h | 6 | ||||
-rw-r--r-- | src/vte.c | 48 |
2 files changed, 48 insertions, 6 deletions
diff --git a/src/vte-private.h b/src/vte-private.h index a53cbee5..ba023990 100644 --- a/src/vte-private.h +++ b/src/vte-private.h @@ -106,6 +106,7 @@ G_BEGIN_DECLS #define VTE_DISPLAY_TIMEOUT 10 #define VTE_UPDATE_TIMEOUT 15 #define VTE_UPDATE_REPEAT_TIMEOUT 30 +#define VTE_VISIBLE_BELL_DURATION 80 #define VTE_MAX_PROCESS_TIME 100 #define VTE_CELL_BBOX_SLACK 1 @@ -302,6 +303,9 @@ struct _VteTerminalPrivate { gboolean cursor_visible; gboolean has_focus; /* is the terminal window focused */ + /* Visible bell's state. */ + guint visible_bell_tag; /* timeout ID for stopping the bell */ + /* Input device options. */ gboolean input_enabled; time_t last_keypress_time; @@ -437,8 +441,6 @@ gboolean _vte_terminal_get_tabstop(VteTerminal *terminal, int column); void _vte_terminal_set_tabstop(VteTerminal *terminal, int column); void _vte_terminal_update_insert_delta(VteTerminal *terminal); void _vte_terminal_cleanup_fragments(VteTerminal *terminal, long start, long end); -void _vte_terminal_audible_beep(VteTerminal *terminal); -void _vte_terminal_visible_beep(VteTerminal *terminal); void _vte_terminal_beep(VteTerminal *terminal); PangoColor *_vte_terminal_get_color(const VteTerminal *terminal, int idx); void _vte_terminal_set_color_internal(VteTerminal *terminal, @@ -134,6 +134,10 @@ static void remove_update_timeout (VteTerminal *terminal); static void reset_update_regions (VteTerminal *terminal); static void vte_terminal_set_cursor_blinks_internal(VteTerminal *terminal, gboolean blink); static void _vte_check_cursor_blink(VteTerminal *terminal); +static void _vte_terminal_audible_beep(VteTerminal *terminal); +static void remove_visible_bell_timeout (VteTerminal *terminal); +static gboolean stop_visible_beep (VteTerminal *terminal); +static void _vte_terminal_visible_beep(VteTerminal *terminal); static gboolean process_timeout (gpointer data); static gboolean update_timeout (gpointer data); @@ -4611,7 +4615,7 @@ _vte_check_cursor_blink(VteTerminal *terminal) remove_cursor_timeout(terminal); } -void +static void _vte_terminal_audible_beep(VteTerminal *terminal) { GdkDisplay *display; @@ -4621,15 +4625,46 @@ _vte_terminal_audible_beep(VteTerminal *terminal) gdk_display_beep(display); } -void +static void +remove_visible_bell_timeout (VteTerminal *terminal) +{ + if (terminal->pvt->visible_bell_tag == 0) + return; /* already removed */ + + g_source_remove (terminal->pvt->visible_bell); + terminal->pvt->visible_bell_tag = 0; +} + +static gboolean +stop_visible_beep (VteTerminal *terminal) +{ + if (G_LIKELY (gtk_widget_get_realized (&terminal->widget) && gtk_widget_get_mapped (&terminal->widget))) { + /* Force the repaint, max delay of UPDATE_REPEAT_TIMEOUT */ + _vte_invalidate_all (terminal); + } + terminal->pvt->visible_bell_tag = 0; + return FALSE; +} + +static void _vte_terminal_visible_beep(VteTerminal *terminal) { GtkWidget *widget = &terminal->widget; - if (gtk_widget_get_realized (widget)) { + if (G_UNLIKELY (!gtk_widget_get_realized (widget) || !gtk_widget_get_mapped (widget))) + return; + + if (terminal->pvt->visible_bell_tag != 0) { + g_source_remove (terminal->pvt->visible_bell_tag); + } else { /* Force the repaint, max delay of UPDATE_REPEAT_TIMEOUT */ _vte_invalidate_all (terminal); } + terminal->pvt->visible_bell_tag = g_timeout_add_full (G_PRIORITY_LOW, + VTE_VISIBLE_BELL_DURATION, + (GSourceFunc)stop_visible_beep, + terminal, + NULL); } void @@ -8025,6 +8060,7 @@ vte_terminal_init(VteTerminal *terminal) pvt->pending = g_array_new(FALSE, TRUE, sizeof(gunichar)); pvt->max_input_bytes = VTE_MAX_INPUT_READ; pvt->cursor_blink_tag = 0; + pvt->visible_bell_tag = 0; pvt->outgoing = _vte_byte_array_new(); pvt->outgoing_conv = VTE_INVALID_CONV; pvt->conv_buffer = _vte_byte_array_new(); @@ -8297,6 +8333,7 @@ vte_terminal_unrealize(GtkWidget *widget) /* Remove the blink timeout function. */ remove_cursor_timeout(terminal); + remove_visible_bell_timeout(terminal); /* Cancel any pending redraws. */ remove_update_timeout (terminal); @@ -8511,6 +8548,8 @@ vte_terminal_finalize(GObject *object) _vte_matcher_free(terminal->pvt->matcher); } + remove_cursor_timeout (terminal); + remove_visible_bell_timeout (terminal); remove_update_timeout (terminal); /* discard title updates */ @@ -8658,6 +8697,7 @@ vte_terminal_determine_colors_internal(VteTerminal *terminal, guint *pfore, guint *pback) { guint fore, back; + gboolean reverse = terminal->pvt->visible_bell_tag != 0; if (!cell) cell = &basic_cell.cell; @@ -8691,7 +8731,7 @@ vte_terminal_determine_colors_internal(VteTerminal *terminal, } /* Reverse cell? */ - if (cell->attr.reverse) { + if (cell->attr.reverse ^ reverse) { swap (&fore, &back); } |