summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Davenport <qball@gmpclient.org>2023-02-16 19:34:56 +0100
committerDave Davenport <qball@gmpclient.org>2023-02-16 19:34:56 +0100
commit68aecdc5dda0b118302eb4f1bf3c068168e536ea (patch)
tree6641cf7afb0a6658ef9db225e11f3b4ff3c86476
parent49f5e037a0c9caa8d10da830d22f851954eafd98 (diff)
parentf6248c6ea9f3243986798f8fb1b48fb582d64517 (diff)
Merge remote-tracking branch 'github/next' into calc-broken-fixcalc-broken-fix
-rw-r--r--source/helper.c23
-rw-r--r--source/modes/dmenu.c10
2 files changed, 15 insertions, 18 deletions
diff --git a/source/helper.c b/source/helper.c
index 4b14f361..a84a7d9e 100644
--- a/source/helper.c
+++ b/source/helper.c
@@ -175,30 +175,25 @@ static gchar *prefix_regex(const char *input) {
return retv;
}
-static char *utf8_helper_simplify_string(const char *s) {
- gunichar buf2[G_UNICHAR_MAX_DECOMPOSITION_LENGTH] = {
- 0,
- };
+static char *utf8_helper_simplify_string(const char *os) {
char buf[6] = {
0,
};
- // Compose the string in maximally composed form.
+
+ // Normalize the string to a fully decomposed form, then filter out mark/accent characters.
+ char *s = g_utf8_normalize(os, -1, G_NORMALIZE_ALL);
ssize_t str_size = (g_utf8_strlen(s, -1) * 6 + 2 + 1) * sizeof(char);
char *str = g_malloc0(str_size);
char *striter = str;
for (const char *iter = s; iter && *iter; iter = g_utf8_next_char(iter)) {
gunichar uc = g_utf8_get_char(iter);
- int l = 0;
- gsize dl = g_unichar_fully_decompose(uc, FALSE, buf2,
- G_UNICHAR_MAX_DECOMPOSITION_LENGTH);
- if (dl) {
- l = g_unichar_to_utf8(buf2[0], buf);
- } else {
- l = g_unichar_to_utf8(uc, buf);
+ if (!g_unichar_ismark(uc)) {
+ int l = g_unichar_to_utf8(uc, buf);
+ memcpy(striter, buf, l);
+ striter += l;
}
- memcpy(striter, buf, l);
- striter += l;
}
+ g_free(s);
return str;
}
diff --git a/source/modes/dmenu.c b/source/modes/dmenu.c
index 0b604e78..c9b55d10 100644
--- a/source/modes/dmenu.c
+++ b/source/modes/dmenu.c
@@ -514,6 +514,7 @@ static int dmenu_mode_init(Mode *sw) {
DmenuModePrivateData *pd = (DmenuModePrivateData *)mode_get_private_data(sw);
pd->async = TRUE;
+ pd->multi_select = FALSE;
// For now these only work in sync mode.
if (find_arg("-sync") >= 0 || find_arg("-dump") >= 0 ||
@@ -522,6 +523,10 @@ static int dmenu_mode_init(Mode *sw) {
find_arg("-selected-row") >= 0) {
pd->async = FALSE;
}
+ if ( find_arg("-multi-select") >= 0 ) {
+ pd->multi_select = TRUE;
+ pd->async = FALSE;
+ }
pd->separator = '\n';
pd->selected_line = UINT32_MAX;
@@ -907,14 +912,11 @@ int dmenu_mode_dialog(void) {
DmenuScriptEntry *cmd_list = pd->cmd_list;
pd->only_selected = FALSE;
- pd->multi_select = FALSE;
pd->ballot_selected = "☑ ";
pd->ballot_unselected = "☐ ";
find_arg_str("-ballot-selected-str", &(pd->ballot_selected));
find_arg_str("-ballot-unselected-str", &(pd->ballot_unselected));
- if (find_arg("-multi-select") >= 0) {
- pd->multi_select = TRUE;
- }
+
if (find_arg("-markup-rows") >= 0) {
pd->do_markup = TRUE;
}