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:
parent
85ca0c5857
commit
2b5eb86a9f
37
src/sdtui.c
37
src/sdtui.c
|
@ -162,7 +162,9 @@ resolve_filename (const gchar *filename, gchar *(*relative_cb) (const char *))
|
|||
XX( ACTIVE, "header-active", -1, -1, A_UNDERLINE ) \
|
||||
XX( SEARCH, "search", -1, -1, A_UNDERLINE ) \
|
||||
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
|
||||
{
|
||||
|
@ -210,6 +212,7 @@ struct application
|
|||
guint tk_timer; ///< termo timeout timer
|
||||
GIConv ucs4_to_locale; ///< UTF-32 -> locale conversion
|
||||
gboolean locale_is_utf8; ///< The locale is Unicode
|
||||
gboolean focused; ///< Whether the terminal has focus
|
||||
|
||||
GArray * dictionaries; ///< All loaded dictionaries
|
||||
|
||||
|
@ -628,6 +631,7 @@ app_init (Application *self, char **filenames)
|
|||
#else // G_BYTE_ORDER != G_LITTLE_ENDIAN
|
||||
self->ucs4_to_locale = g_iconv_open (charset, "UTF-32BE");
|
||||
#endif // G_BYTE_ORDER != G_LITTLE_ENDIAN
|
||||
self->focused = TRUE;
|
||||
|
||||
app_init_attrs (self);
|
||||
self->dictionaries = g_array_new (FALSE, TRUE, sizeof (Dictionary));
|
||||
|
@ -688,6 +692,10 @@ app_init_terminal (Application *self)
|
|||
gboolean failed = FALSE;
|
||||
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
|
||||
|| 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));
|
||||
}
|
||||
|
||||
/// 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.
|
||||
static void
|
||||
app_redraw_view (Application *self)
|
||||
|
@ -1014,9 +1032,14 @@ app_redraw_view (Application *self)
|
|||
{
|
||||
int attrs = ((self->top_position + i) & 1)
|
||||
? 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;
|
||||
if (last && self->underline_last) attrs |= A_UNDERLINE;
|
||||
if (last && self->underline_last)
|
||||
attrs |= A_UNDERLINE;
|
||||
|
||||
RowBuffer buf;
|
||||
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);
|
||||
case TERMO_TYPE_KEYSYM:
|
||||
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:
|
||||
return TRUE;
|
||||
}
|
||||
|
|
2
termo
2
termo
|
@ -1 +1 @@
|
|||
Subproject commit f7912a8ce7bbf7f701b5217bbb3879b13b66cfe7
|
||||
Subproject commit 94a77a10d87367ef33156cd68b2caf601c3f72d0
|
Loading…
Reference in New Issue