You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.3 KiB
97 lines
3.3 KiB
From fc353003f93883bf62a9865472e6f206a62b09f1 Mon Sep 17 00:00:00 2001 |
|
From: Mamoru TASAKA <mtasaka@fedoraproject.org> |
|
Date: Thu, 8 Jul 2021 23:06:46 +0900 |
|
Subject: [PATCH] window_init: check if asterisk font is available and provide |
|
fallback character |
|
|
|
Downstream bug: https://bugzilla.redhat.com/show_bug.cgi?id=1980173 |
|
On Fedora 34, using US locale (LANG=en_US.UTF-8), when both |
|
"dejavu-sans-fonts" and "bitstream-vera-sans-fonts" rpms are installed, |
|
* xscreensaver-auth requests "sans-serif" to xft |
|
* xft chooses bitstream-vera-sans (according to fontconfig settings) |
|
45-latin.conf seems to be saying so. |
|
* gucharmap shows that while "dejavu-sans-fonts" contains glyph for "U+25CF", |
|
however bitstream-vera-sans-fonts does not. |
|
Then such people sees white rectangles when typing password. |
|
|
|
For now, check if corresponding font is available, and if not, provide |
|
fallback character |
|
--- |
|
driver/dialog.c | 33 ++++++++++++++++++++++++++++++--- |
|
1 file changed, 30 insertions(+), 3 deletions(-) |
|
|
|
diff --git a/driver/dialog.c b/driver/dialog.c |
|
index 7f1ec8b..a17e9af 100644 |
|
--- a/driver/dialog.c |
|
+++ b/driver/dialog.c |
|
@@ -79,6 +79,7 @@ |
|
#include "font-retry.h" |
|
#include "prefs.h" |
|
#include "usleep.h" |
|
+#include "utf8wc.h" |
|
|
|
extern Bool debug_p; |
|
|
|
@@ -193,6 +194,7 @@ struct window_state { |
|
char *date_format; |
|
char *kbd_layout_label; |
|
char *newlogin_cmd; |
|
+ const char *asterisk_utf8; |
|
|
|
/* Resources for fonts and colors */ |
|
XftDraw *xftdraw; |
|
@@ -674,6 +676,31 @@ get_int (window_state *ws, const char *name, const char *rclass) |
|
return get_integer_resource (ws->dpy, (char *) name, (char *) rclass); |
|
} |
|
|
|
+static const char *pickup_asterisk_utf8 (window_state *ws) |
|
+{ |
|
+ static char picked_string[8]; |
|
+ const unsigned long uc_list[] = { |
|
+ 0x25CF, /* Black Circle */ |
|
+ 0x2022, /* Bullet */ |
|
+ '*' /* Fallback */ |
|
+ }; |
|
+ const unsigned long *uc_cand = uc_list; |
|
+ int encoded_length; |
|
+ size_t index; |
|
+ |
|
+ /* -1 is so that result will pick up fallback string as a last resort */ |
|
+ for (index = 0; index < sizeof uc_list / sizeof *uc_list - 1; index++) { |
|
+ /* borrowed from blank_character_p in texfont.c */ |
|
+ if (XftCharExists (ws->dpy, ws->label_font, (FcChar32) *uc_cand)) break; |
|
+ uc_cand++; |
|
+ } |
|
+ |
|
+ encoded_length = utf8_encode(*uc_cand, picked_string, sizeof picked_string - 1); |
|
+ picked_string[encoded_length] = 0; |
|
+ |
|
+ return picked_string; |
|
+} |
|
+ |
|
|
|
/* Decide where on the X11 screen to place the dialog. |
|
This is complicated because, in the face of RANDR and Xinerama, we want |
|
@@ -983,6 +1010,8 @@ window_init (Widget root_widget, Bool splash_p) |
|
ws->label_font = get_font (ws, "labelFont"); |
|
ws->date_font = get_font (ws, "dateFont"); |
|
ws->hostname_font = get_font (ws, "unameFont"); |
|
+ |
|
+ ws->asterisk_utf8 = pickup_asterisk_utf8(ws); |
|
|
|
ws->foreground = get_color (ws, "foreground", "Foreground"); |
|
ws->background = get_color (ws, "background", "Background"); |
|
@@ -2003,9 +2032,7 @@ handle_keypress (window_state *ws, XKeyEvent *event) |
|
*out = 0; |
|
for (i = 0; i < MAX_PASSWD_CHARS && ws->plaintext_passwd_char_size[i]; i++) |
|
{ |
|
- const char *b = /* "\xE2\x80\xA2"; */ /* U+2022 Bullet */ |
|
- "\xe2\x97\x8f"; /* U+25CF Black Circle */ |
|
- strcat (out, b); |
|
+ strcat (out, ws->asterisk_utf8); |
|
out += strlen(out); |
|
} |
|
} |
|
-- |
|
2.31.1 |
|
|
|
|