sdtui: enable styling of defocused selected rows

The defaults are unaffected, the row is always reverse, like it used to.

Having the deselected row just be underlined seems sensible.

It isn't currently possible to change /just/ the foreground or
the background colour of the selection, due to how ncurses works
with colours.

Bumped termo to enable requesting the appropriate events.
This commit is contained in:
Přemysl Eric Janouch 2021-07-03 11:38:15 +02:00
parent 85ca0c5857
commit 2b5eb86a9f
Signed by: p
GPG Key ID: A0420B94F92B9493
2 changed files with 40 additions and 9 deletions

View File

@ -162,7 +162,9 @@ resolve_filename (const gchar *filename, gchar *(*relative_cb) (const char *))
XX( ACTIVE, "header-active", -1, -1, A_UNDERLINE ) \ XX( ACTIVE, "header-active", -1, -1, A_UNDERLINE ) \
XX( SEARCH, "search", -1, -1, A_UNDERLINE ) \ XX( SEARCH, "search", -1, -1, A_UNDERLINE ) \
XX( EVEN, "even", -1, -1, 0 ) \ XX( EVEN, "even", -1, -1, 0 ) \
XX( ODD, "odd", -1, -1, 0 ) XX( ODD, "odd", -1, -1, 0 ) \
XX( SELECTION, "selection", -1, -1, A_REVERSE ) \
XX( DEFOCUSED, "defocused", -1, -1, A_REVERSE )
enum enum
{ {
@ -210,6 +212,7 @@ struct application
guint tk_timer; ///< termo timeout timer guint tk_timer; ///< termo timeout timer
GIConv ucs4_to_locale; ///< UTF-32 -> locale conversion GIConv ucs4_to_locale; ///< UTF-32 -> locale conversion
gboolean locale_is_utf8; ///< The locale is Unicode gboolean locale_is_utf8; ///< The locale is Unicode
gboolean focused; ///< Whether the terminal has focus
GArray * dictionaries; ///< All loaded dictionaries GArray * dictionaries; ///< All loaded dictionaries
@ -628,6 +631,7 @@ app_init (Application *self, char **filenames)
#else // G_BYTE_ORDER != G_LITTLE_ENDIAN #else // G_BYTE_ORDER != G_LITTLE_ENDIAN
self->ucs4_to_locale = g_iconv_open (charset, "UTF-32BE"); self->ucs4_to_locale = g_iconv_open (charset, "UTF-32BE");
#endif // G_BYTE_ORDER != G_LITTLE_ENDIAN #endif // G_BYTE_ORDER != G_LITTLE_ENDIAN
self->focused = TRUE;
app_init_attrs (self); app_init_attrs (self);
self->dictionaries = g_array_new (FALSE, TRUE, sizeof (Dictionary)); self->dictionaries = g_array_new (FALSE, TRUE, sizeof (Dictionary));
@ -688,6 +692,10 @@ app_init_terminal (Application *self)
gboolean failed = FALSE; gboolean failed = FALSE;
for (int a = 0; a < ATTRIBUTE_COUNT; a++) for (int a = 0; a < ATTRIBUTE_COUNT; a++)
{ {
if (self->attrs[a].fg == -1 &&
self->attrs[a].bg == -1)
continue;
if (self->attrs[a].fg >= COLORS || self->attrs[a].fg < -1 if (self->attrs[a].fg >= COLORS || self->attrs[a].fg < -1
|| self->attrs[a].bg >= COLORS || self->attrs[a].bg < -1) || self->attrs[a].bg >= COLORS || self->attrs[a].bg < -1)
{ {
@ -988,6 +996,16 @@ app_show_help (Application *self)
app_show_message (self, lines, G_N_ELEMENTS (lines)); app_show_message (self, lines, G_N_ELEMENTS (lines));
} }
/// Combine attributes, taking care to replace colour bits entirely
static void
app_merge_attributes (int *target, int merged)
{
if (merged & A_COLOR)
*target = (*target & ~A_COLOR) | merged;
else
*target |= merged;
}
/// Redraw the dictionary view. /// Redraw the dictionary view.
static void static void
app_redraw_view (Application *self) app_redraw_view (Application *self)
@ -1014,9 +1032,14 @@ app_redraw_view (Application *self)
{ {
int attrs = ((self->top_position + i) & 1) int attrs = ((self->top_position + i) & 1)
? APP_ATTR (ODD) : APP_ATTR (EVEN); ? APP_ATTR (ODD) : APP_ATTR (EVEN);
if (shown == self->selected) attrs |= A_REVERSE;
if (shown == self->selected)
app_merge_attributes (&attrs, self->focused
? APP_ATTR (SELECTION) : APP_ATTR (DEFOCUSED));
gboolean last = k + 1 == ve->definitions_length; gboolean last = k + 1 == ve->definitions_length;
if (last && self->underline_last) attrs |= A_UNDERLINE; if (last && self->underline_last)
attrs |= A_UNDERLINE;
RowBuffer buf; RowBuffer buf;
row_buffer_init (&buf, self); row_buffer_init (&buf, self);
@ -1793,6 +1816,14 @@ app_process_termo_event (Application *self, termo_key_t *event)
return app_process_key (self, event); return app_process_key (self, event);
case TERMO_TYPE_KEYSYM: case TERMO_TYPE_KEYSYM:
return app_process_keysym (self, event); return app_process_keysym (self, event);
case TERMO_TYPE_FOCUS:
{
SAVE_CURSOR
self->focused = !!event->code.focused;
app_redraw_view (self);
RESTORE_CURSOR
return TRUE;
}
default: default:
return TRUE; return TRUE;
} }

2
termo

@ -1 +1 @@
Subproject commit f7912a8ce7bbf7f701b5217bbb3879b13b66cfe7 Subproject commit 94a77a10d87367ef33156cd68b2caf601c3f72d0