diff options
| author | Přemysl Janouch <p.janouch@gmail.com> | 2016-10-22 23:38:00 +0200 | 
|---|---|---|
| committer | Přemysl Janouch <p.janouch@gmail.com> | 2016-10-22 23:38:00 +0200 | 
| commit | 77918d8a8c26b261a9933793766dcffca0b15de6 (patch) | |
| tree | 6cf9b98122b3d1b998681c6fd7f40e6af4fc71a4 | |
| parent | fc395d40681bdd76b7262d536668ffc093c5246d (diff) | |
| download | tdv-77918d8a8c26b261a9933793766dcffca0b15de6.tar.gz tdv-77918d8a8c26b261a9933793766dcffca0b15de6.tar.xz tdv-77918d8a8c26b261a9933793766dcffca0b15de6.zip | |
Fix some character width counting
| -rw-r--r-- | src/sdtui.c | 59 | 
1 files changed, 33 insertions, 26 deletions
| diff --git a/src/sdtui.c b/src/sdtui.c index a11646a..d2cccc1 100644 --- a/src/sdtui.c +++ b/src/sdtui.c @@ -238,6 +238,30 @@ struct application  /// Shortcut to retrieve named terminal attributes  #define APP_ATTR(name) self->attrs[ATTRIBUTE_ ## name].attrs +/// Returns if the Unicode character is representable in the current locale. +static gboolean +app_is_character_in_locale (Application *self, gunichar ch) +{ +	// Avoid the overhead joined with calling iconv() for all characters +	if (self->locale_is_utf8) +		return TRUE; + +	gchar *tmp = g_convert_with_iconv ((const gchar *) &ch, sizeof ch, +		self->ucs4_to_locale, NULL, NULL, NULL); +	if (!tmp) +		return FALSE; +	g_free (tmp); +	return TRUE; +} + +static gsize +app_char_width (Application *app, gunichar c) +{ +	if (!app_is_character_in_locale (app, c)) +		return 1; +	return unichar_width (c); +} +  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  /// Splits the entry and adds it to a pointer array. @@ -321,7 +345,7 @@ view_entry_free (ViewEntry *ve)  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  static gboolean -dictionary_load (Dictionary *self, GError **e) +dictionary_load (Dictionary *self, Application *app, GError **e)  {  	if (!(self->dict = stardict_dict_new (self->filename, e)))  		return FALSE; @@ -339,7 +363,7 @@ dictionary_load (Dictionary *self, GError **e)  	gunichar *ucs4 = g_utf8_to_ucs4_fast (self->name, -1, NULL);  	for (gunichar *it = ucs4; *it; it++) -		self->name_width += unichar_width (*it); +		self->name_width += app_char_width (app, *it);  	g_free (ucs4);  	return TRUE;  } @@ -530,7 +554,7 @@ app_load_dictionaries (Application *self, GError **e)  {  	for (guint i = 0; i < self->dictionaries->len; i++)  		if (!dictionary_load (&g_array_index (self->dictionaries, -			Dictionary, i), e)) +			Dictionary, i), self, e))  			return FALSE;  	return TRUE;  } @@ -548,8 +572,8 @@ app_load_worker (gpointer data, gpointer user_data)  {  	struct load_ctx *ctx = user_data;  	GError *e = NULL; -	dictionary_load (&g_array_index -		(ctx->self->dictionaries, Dictionary, GPOINTER_TO_UINT (data) - 1), &e); +	dictionary_load (&g_array_index (ctx->self->dictionaries, Dictionary, +		GPOINTER_TO_UINT (data) - 1), ctx->self, &e);  	if (e)  		g_async_queue_push (ctx->error_queue, e);  } @@ -758,22 +782,6 @@ app_quit (Application *self)  #endif  // WITH_GTK  } -/// Returns if the Unicode character is representable in the current locale. -static gboolean -app_is_character_in_locale (Application *self, gunichar ch) -{ -	// Avoid the overhead joined with calling iconv() for all characters -	if (self->locale_is_utf8) -		return TRUE; - -	gchar *tmp = g_convert_with_iconv ((const gchar *) &ch, sizeof ch, -		self->ucs4_to_locale, NULL, NULL, NULL); -	if (!tmp) -		return FALSE; -	g_free (tmp); -	return TRUE; -} -  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  // Necessary abstraction to simplify aligned, formatted character output @@ -954,8 +962,8 @@ app_redraw_top (Application *self)  	guint offset, i;  	for (offset = i = 0; i < self->input_pos; i++) -		// FIXME: this may be inconsistent with RowBuffer (locale) -		offset += unichar_width (g_array_index (self->input, gunichar, i)); +		offset += app_char_width (self, +			g_array_index (self->input, gunichar, i));  	move (1, MIN ((gint) (indent + offset), COLS - 1));  	refresh (); @@ -1744,9 +1752,8 @@ app_process_left_mouse_click (Application *self, int line, int column)  			guint offset, i;  			for (offset = i = 0; i < self->input->len; i++)  			{ -				// FIXME: this may be inconsistent with RowBuffer (locale) -				size_t width = unichar_width -					(g_array_index (self->input, gunichar, i)); +				size_t width = app_char_width +					(self, g_array_index (self->input, gunichar, i));  				if ((offset += width) > (guint) pos)  					break;  			} | 
