Merge pull request #86 from ZoiteChat/master

sync with master.
This commit is contained in:
deepend-tildeclub
2026-02-24 15:53:18 -07:00
committed by GitHub
5 changed files with 121 additions and 11 deletions

View File

@@ -36,6 +36,9 @@ See [IRCHelp.org](http://irchelp.org) for information about IRC in general.
For more information on ZoiteChat please read our [documentation](https://docs.zoitechat.zoite.net/): For more information on ZoiteChat please read our [documentation](https://docs.zoitechat.zoite.net/):
- [Downloads](https://zoitechat.zoite.net/download) - [Downloads](https://zoitechat.zoite.net/download)
- [Troubleshooting](troubleshooting.md)
--- ---
<sub> <sub>

View File

@@ -222,15 +222,51 @@ inbound_privmsg (server *serv, char *from, char *ip, char *text, int id,
/* used for Alerts section. Masks can be separated by commas and spaces. */ /* used for Alerts section. Masks can be separated by commas and spaces. */
static char *
alert_normalize_word (const char *text)
{
GString *normalized;
char *composed;
const char *p;
composed = g_utf8_normalize (text, -1, G_NORMALIZE_ALL_COMPOSE);
if (!composed)
composed = g_strdup (text);
normalized = g_string_sized_new (strlen (composed));
p = composed;
while (*p)
{
gunichar ch = g_utf8_get_char ((const guchar *)p);
/* Ignore selector/joiner codepoints that vary by input method. */
if (ch != 0x200D && ch != 0xFE0E && ch != 0xFE0F)
g_string_append_unichar (normalized, ch);
p = g_utf8_next_char (p);
}
g_free (composed);
return g_string_free (normalized, FALSE);
}
gboolean gboolean
alert_match_word (char *word, char *masks) alert_match_word (char *word, char *masks)
{ {
char *p = masks; char *p = masks;
char endchar; char endchar;
char *word_normalized;
char *mask_normalized;
int res; int res;
word_normalized = alert_normalize_word (word);
if (masks[0] == 0) if (masks[0] == 0)
{
g_free (word_normalized);
return FALSE; return FALSE;
}
while (1) while (1)
{ {
@@ -239,15 +275,23 @@ alert_match_word (char *word, char *masks)
{ {
endchar = *p; endchar = *p;
*p = 0; *p = 0;
res = match (g_strchug (masks), word); mask_normalized = alert_normalize_word (g_strchug (masks));
res = match (mask_normalized, word_normalized);
g_free (mask_normalized);
*p = endchar; *p = endchar;
if (res) if (res)
{
g_free (word_normalized);
return TRUE; /* yes, matched! */ return TRUE; /* yes, matched! */
}
masks = p + 1; masks = p + 1;
if (*p == 0) if (*p == 0)
{
g_free (word_normalized);
return FALSE; return FALSE;
}
} }
p++; p++;
} }
@@ -258,6 +302,8 @@ alert_match_text (char *text, char *masks)
{ {
unsigned char *p = text; unsigned char *p = text;
unsigned char endchar; unsigned char endchar;
gunichar ch;
GUnicodeType ch_type;
int res; int res;
if (masks[0] == 0) if (masks[0] == 0)
@@ -265,26 +311,38 @@ alert_match_text (char *text, char *masks)
while (1) while (1)
{ {
if (*p >= '0' && *p <= '9') ch = g_utf8_get_char (p);
ch_type = g_unichar_type (ch);
if (g_unichar_isdigit (ch) || g_unichar_isalpha (ch))
{ {
p++; p += g_utf8_skip [p[0]];
continue; continue;
} }
/* if it's RFC1459 <special>, it can be inside a word */ /* if it's RFC1459 <special>, it can be inside a word */
switch (*p) switch (ch)
{ {
case '-': case '[': case ']': case '\\': case '-': case '[': case ']': case '\\':
case '`': case '^': case '{': case '}': case '`': case '^': case '{': case '}':
case '_': case '|': case '_': case '|':
p++; p += g_utf8_skip [p[0]];
continue; continue;
} }
/* if it's a 0, space or comma, the word has ended. */ /* Symbols (including emoji) can be part of highlighted words. */
if (*p == 0 || *p == ' ' || *p == ',' || if (ch_type == G_UNICODE_MATH_SYMBOL ||
/* if it's anything BUT a letter, the word has ended. */ ch_type == G_UNICODE_CURRENCY_SYMBOL ||
(!g_unichar_isalpha (g_utf8_get_char (p)))) ch_type == G_UNICODE_MODIFIER_SYMBOL ||
ch_type == G_UNICODE_OTHER_SYMBOL)
{
p += g_utf8_skip [p[0]];
continue;
}
/* Delimiters end the word. */
if (*p == 0 || g_unichar_isspace (ch) || g_unichar_ispunct (ch) ||
g_unichar_iscntrl (ch))
{ {
endchar = *p; endchar = *p;
*p = 0; *p = 0;

View File

@@ -252,7 +252,7 @@ joind_show_dialog (server *serv)
G_CALLBACK (joind_ok_cb), serv); G_CALLBACK (joind_ok_cb), serv);
if (serv->network) if (serv->network)
if (g_ascii_strcasecmp(((ircnet*)serv->network)->name, "Libera.Chat") == 0) if (g_ascii_strcasecmp(((ircnet*)serv->network)->name, "Zoite") == 0)
{ {
gtk_entry_set_text (GTK_ENTRY (entry1), "#zoitechat"); gtk_entry_set_text (GTK_ENTRY (entry1), "#zoitechat");
} }

View File

@@ -778,6 +778,7 @@ fe_userlist_update (session *sess, struct User *user)
{ {
GList *items, *next; GList *items, *next;
GList *iter; GList *iter;
gboolean needs_refresh;
if (!nick_submenu || !str_copy) if (!nick_submenu || !str_copy)
return; return;
@@ -801,7 +802,14 @@ fe_userlist_update (session *sess, struct User *user)
g_list_free (items); g_list_free (items);
/* and re-create them with new info */ /* and re-create them with new info */
menu_create_nickinfo_menu (user, nick_submenu); needs_refresh = menu_create_nickinfo_menu (user, nick_submenu) ||
!user->hostname || !user->realname || !user->servername;
if (needs_refresh)
{
g_signal_connect (G_OBJECT (nick_submenu), "show",
G_CALLBACK (menu_nickinfo_cb), sess);
}
} }
void void

41
troubleshooting.md Normal file
View File

@@ -0,0 +1,41 @@
# Troubleshooting
## Flatpak
If `flatpak run net.zoite.Zoitechat` only prints `Gtk-WARNING **: cannot open display`,
collect extra diagnostics with:
```bash
flatpak run --devel --command=sh net.zoite.Zoitechat
```
Then inside that shell:
```bash
echo "DISPLAY=$DISPLAY WAYLAND_DISPLAY=$WAYLAND_DISPLAY XDG_SESSION_TYPE=$XDG_SESSION_TYPE"
xdpyinfo >/tmp/xdpyinfo.log 2>&1 || true
env G_MESSAGES_DEBUG=all zoitechat 2>&1 | tee /tmp/zoitechat-debug.log
```
To inspect sandbox permissions from the host:
```bash
flatpak info --show-permissions net.zoite.Zoitechat
flatpak override --user --show net.zoite.Zoitechat
```
If needed, try running with direct access to your active display stack:
```bash
# X11 sessions
flatpak override --user --socket=x11 net.zoite.Zoitechat
# Wayland sessions
flatpak override --user --socket=wayland net.zoite.Zoitechat
```
You can reset overrides after testing:
```bash
flatpak override --user --reset net.zoite.Zoitechat
```