55 changes: 55 additions & 0 deletions src/vtegtk.cc
Expand Up @@ -499,6 +499,9 @@ vte_terminal_get_property (GObject *object,
case PROP_SCROLL_ON_OUTPUT:
g_value_set_boolean (value, vte_terminal_get_scroll_on_output(terminal));
break;
case PROP_TEXT_BLINK_MODE:
g_value_set_enum (value, vte_terminal_get_text_blink_mode (terminal));
break;
case PROP_WINDOW_TITLE:
g_value_set_string (value, vte_terminal_get_window_title (terminal));
break;
Expand Down Expand Up @@ -597,6 +600,9 @@ vte_terminal_set_property (GObject *object,
case PROP_SCROLL_ON_OUTPUT:
vte_terminal_set_scroll_on_output (terminal, g_value_get_boolean (value));
break;
case PROP_TEXT_BLINK_MODE:
vte_terminal_set_text_blink_mode (terminal, (VteTextBlinkMode)g_value_get_enum (value));
break;
case PROP_WORD_CHAR_EXCEPTIONS:
vte_terminal_set_word_char_exceptions (terminal, g_value_get_string (value));
break;
Expand Down Expand Up @@ -1546,6 +1552,19 @@ vte_terminal_class_init(VteTerminalClass *klass)
TRUE,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY));

/**
* VteTerminal:text-blink-mode:
*
* Controls whether or not the terminal will allow blinking text.
*
* Since: 0.52
*/
pspecs[PROP_TEXT_BLINK_MODE] =
g_param_spec_enum ("text-blink-mode", NULL, NULL,
VTE_TYPE_TEXT_BLINK_MODE,
VTE_TEXT_BLINK_ALWAYS,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY));

/**
* VteTerminal:window-title:
*
Expand Down Expand Up @@ -2902,6 +2921,42 @@ vte_terminal_set_size(VteTerminal *terminal,
IMPL(terminal)->set_size(columns, rows);
}

/**
* vte_terminal_get_text_blink_mode:
* @terminal: a #VteTerminal
*
* Checks whether or not the terminal will allow blinking text.
*
* Returns: the blinking setting
*
* Since: 0.52
*/
VteTextBlinkMode
vte_terminal_get_text_blink_mode(VteTerminal *terminal)
{
g_return_val_if_fail(VTE_IS_TERMINAL(terminal), VTE_TEXT_BLINK_ALWAYS);
return IMPL(terminal)->m_text_blink_mode;
}

/**
* vte_terminal_set_text_blink_mode:
* @terminal: a #VteTerminal
* @text_blink_mode: the #VteTextBlinkMode to use
*
* Controls whether or not the terminal will allow blinking text.
*
* Since: 0.52
*/
void
vte_terminal_set_text_blink_mode(VteTerminal *terminal,
VteTextBlinkMode text_blink_mode)
{
g_return_if_fail(VTE_IS_TERMINAL(terminal));

if (IMPL(terminal)->set_text_blink_mode(text_blink_mode))
g_object_notify_by_pspec(G_OBJECT(terminal), pspecs[PROP_TEXT_BLINK_MODE]);
}

/**
* vte_terminal_get_allow_bold:
* @terminal: a #VteTerminal
Expand Down
1 change: 1 addition & 0 deletions src/vtegtk.hh
Expand Up @@ -88,6 +88,7 @@ enum {
PROP_SCROLLBACK_LINES,
PROP_SCROLL_ON_KEYSTROKE,
PROP_SCROLL_ON_OUTPUT,
PROP_TEXT_BLINK_MODE,
PROP_WINDOW_TITLE,
PROP_WORD_CHAR_EXCEPTIONS,
LAST_PROP,
Expand Down
11 changes: 11 additions & 0 deletions src/vteinternal.hh
Expand Up @@ -519,6 +519,13 @@ public:
gboolean m_cursor_visible;
gboolean m_has_focus; /* is the terminal window focused */

/* Contents blinking */
VteTextBlinkMode m_text_blink_mode;
gint m_text_blink_cycle; /* gtk-cursor-blink-time / 2 */
bool m_text_blink_state; /* whether blinking text should be visible at this very moment */
bool m_text_to_blink; /* drawing signals here if it encounters any cell with blink attribute */
guint m_text_blink_tag; /* timeout ID for redrawing due to blinking */

/* DECSCUSR cursor style (shape and blinking possibly overridden
* via escape sequence) */
VteCursorStyle m_cursor_style;
Expand Down Expand Up @@ -749,6 +756,8 @@ public:
VteCursorBlinkMode decscusr_cursor_blink();
VteCursorShape decscusr_cursor_shape();

void remove_text_blink_timeout();

/* The allocation of the widget */
cairo_rectangle_int_t m_allocated_rect;
/* The usable view area. This is the allocation, minus the padding, but
Expand Down Expand Up @@ -844,6 +853,7 @@ public:
guint underline,
bool strikethrough,
bool overline,
bool blink,
bool hyperlink,
bool hilite,
bool boxed,
Expand Down Expand Up @@ -1222,6 +1232,7 @@ public:
int source);

bool set_audible_bell(bool setting);
bool set_text_blink_mode(VteTextBlinkMode setting);
bool set_allow_bold(bool setting);
bool set_allow_hyperlink(bool setting);
bool set_backspace_binding(VteEraseBinding binding);
Expand Down