Compare commits

...

2 Commits

Author SHA1 Message Date
2b5eb86a9f
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.
2021-07-03 11:44:01 +02:00
85ca0c5857
sdtui: normalize whitespace in clipboard input 2021-07-03 11:36:46 +02:00
3 changed files with 59 additions and 15 deletions

View File

@ -1,4 +1,4 @@
Copyright (c) 2013 - 2020, Přemysl Eric Janouch <p@janouch.name>
Copyright (c) 2013 - 2021, Přemysl Eric Janouch <p@janouch.name>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

View File

@ -1,7 +1,7 @@
/*
* StarDict terminal UI
*
* Copyright (c) 2013 - 2020, Přemysl Eric Janouch <p@janouch.name>
* Copyright (c) 2013 - 2021, Přemysl Eric Janouch <p@janouch.name>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted.
@ -157,12 +157,14 @@ resolve_filename (const gchar *filename, gchar *(*relative_cb) (const char *))
// --- Application -------------------------------------------------------------
#define ATTRIBUTE_TABLE(XX) \
XX( HEADER, "header", -1, -1, A_REVERSE ) \
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 )
#define ATTRIBUTE_TABLE(XX) \
XX( HEADER, "header", -1, -1, A_REVERSE ) \
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( 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)
{
@ -980,7 +988,7 @@ app_show_help (Application *self)
{
PROJECT_NAME " " PROJECT_VERSION,
_("Terminal UI for StarDict dictionaries"),
"Copyright (c) 2013 - 2020, Přemysl Eric Janouch",
"Copyright (c) 2013 - 2021, Přemysl Eric Janouch",
"",
_("Type to search")
};
@ -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;
}
@ -1842,13 +1873,26 @@ app_set_input (Application *self, const gchar *text, gsize text_len)
self->input_pos = 0;
gunichar *p = output;
gboolean last_was_space = false;
while (size--)
{
// XXX: skip?
if (!g_unichar_isprint (*p))
// Normalize whitespace, to cover OCR anomalies
gunichar c = *p++;
if (!g_unichar_isspace (c))
last_was_space = FALSE;
else if (last_was_space)
continue;
else
{
c = ' ';
last_was_space = TRUE;
}
// XXX: skip? Might be some binary nonsense.
if (!g_unichar_isprint (c))
break;
g_array_insert_val (self->input, self->input_pos++, *p++);
g_array_insert_val (self->input, self->input_pos++, c);
}
g_free (output);

2
termo

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