mirror of
https://github.com/ZoiteChat/zoitechat.git
synced 2026-03-20 20:50:19 +00:00
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
41
troubleshooting.md
Normal 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
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user