7 Commits

Author SHA1 Message Date
150ad62771 Fix GTK populate test stub linkage 2026-04-13 14:54:59 -06:00
deepend-tildeclub
5e3715dc31 Merge pull request #206 from ZoiteChat/close-undo-close-tabs
Add Ctrl+W close + Ctrl+Shift+T tab reopen
2026-04-13 11:44:44 -06:00
05648ba8e3 Add Ctrl+W close + Ctrl+Shift+T tab reopen 2026-04-13 10:55:59 -06:00
deepend-tildeclub
0956471a10 Merge pull request #205 from ZoiteChat/fix-nickname-in-topic-linking
Tighten topic link detect/open rules
2026-04-13 07:57:26 -06:00
1f79e62f53 Tighten topic link detect/open rules 2026-04-13 00:08:00 -06:00
deepend-tildeclub
c123e93704 Merge pull request #203 from ZoiteChat/fix-network-tree-collapse-channel-focus
Ignore collapsed parent selects in chanview tree
2026-04-12 23:50:59 -06:00
7210f16dfc Ignore collapsed parent selects in chanview tree 2026-04-12 23:09:52 -06:00
6 changed files with 139 additions and 12 deletions

View File

@@ -7,13 +7,14 @@
"command": "zoitechat", "command": "zoitechat",
"finish-args": [ "finish-args": [
"--share=ipc", "--share=ipc",
"--socket=wayland", "--socket=x11",
"--socket=fallback-x11",
"--share=network", "--share=network",
"--socket=pulseaudio", "--socket=pulseaudio",
"--filesystem=xdg-download", "--filesystem=xdg-download",
"--filesystem=xdg-data/themes:ro", "--filesystem=xdg-data/themes:ro",
"--filesystem=xdg-data/icons:ro", "--filesystem=xdg-data/icons:ro",
"--filesystem=~/.themes:ro",
"--filesystem=~/.icons:ro",
"--filesystem=xdg-run/tray-icon:create", "--filesystem=xdg-run/tray-icon:create",
"--env=GTK_CSD=1", "--env=GTK_CSD=1",
"--talk-name=org.freedesktop.Notifications", "--talk-name=org.freedesktop.Notifications",
@@ -44,9 +45,9 @@
"buildsystem": "meson", "buildsystem": "meson",
"sources": [ "sources": [
{ {
"type": "archive", "type": "git",
"url": "https://github.com/pavouk/lgi/archive/c9b8e4473c6421f2a215d8c06c0d94b86eb0b26a.tar.gz", "url": "https://github.com/pavouk/lgi.git",
"sha256": "db67b2b7ee89fa566f783486d56be7203552a997bc55f35020b57dd2776b9943" "commit": "c9b8e4473c6421f2a215d8c06c0d94b86eb0b26a"
} }
] ]
}, },

View File

@@ -45,6 +45,8 @@ cv_tree_sel_cb (GtkTreeSelection *sel, chanview *cv)
GtkTreeModel *model; GtkTreeModel *model;
GtkTreeIter prev_iter; GtkTreeIter prev_iter;
GtkTreeIter iter; GtkTreeIter iter;
GtkTreePath *path;
GtkTreeView *view;
chan *ch; chan *ch;
chan *prev_ch; chan *prev_ch;
gboolean has_prev; gboolean has_prev;
@@ -60,6 +62,20 @@ cv_tree_sel_cb (GtkTreeSelection *sel, chanview *cv)
if (has_prev) if (has_prev)
{ {
gtk_tree_model_get (model, &prev_iter, COL_CHAN, &prev_ch, -1); gtk_tree_model_get (model, &prev_iter, COL_CHAN, &prev_ch, -1);
if (prev_ch != ch && gtk_tree_store_is_ancestor (cv->store, &iter, &prev_iter))
{
view = gtk_tree_selection_get_tree_view (sel);
path = gtk_tree_model_get_path (model, &iter);
if (path)
{
if (!gtk_tree_view_row_expanded (view, path))
{
gtk_tree_path_free (path);
return;
}
gtk_tree_path_free (path);
}
}
if (prev_ch != ch) if (prev_ch != ch)
gtk_tree_store_set (cv->store, &prev_iter, COL_UNDERLINE, PANGO_UNDERLINE_NONE, -1); gtk_tree_store_set (cv->store, &prev_iter, COL_UNDERLINE, PANGO_UNDERLINE_NONE, -1);
} }

View File

@@ -443,6 +443,27 @@ key_handle_key_press (GtkWidget *wid, GdkEventKey *evt, session *sess)
if (!list) if (!list)
return FALSE; return FALSE;
current_sess = sess; current_sess = sess;
if ((evt->state & GDK_CONTROL_MASK) &&
!(evt->state & (GDK_MOD1_MASK | GDK_META_MASK)))
{
if (!(evt->state & GDK_SHIFT_MASK) &&
(evt->keyval == GDK_KEY_w || evt->keyval == GDK_KEY_W))
{
if (sess->type == SESS_CHANNEL)
{
fe_close_window (sess);
g_signal_stop_emission_by_name (G_OBJECT (wid), "key-press-event");
return 1;
}
}
if ((evt->state & GDK_SHIFT_MASK) &&
(evt->keyval == GDK_KEY_t || evt->keyval == GDK_KEY_T))
{
mg_reopen_closed_channel_tab ();
g_signal_stop_emission_by_name (G_OBJECT (wid), "key-press-event");
return 1;
}
}
if (plugin_emit_keypress (sess, evt->state, evt->keyval, gdk_keyval_to_unicode (evt->keyval))) if (plugin_emit_keypress (sess, evt->state, evt->keyval, gdk_keyval_to_unicode (evt->keyval)))
return 1; return 1;

View File

@@ -468,6 +468,14 @@ static session_gui static_mg_gui;
static session_gui *mg_gui = NULL; /* the shared irc tab */ static session_gui *mg_gui = NULL; /* the shared irc tab */
static int ignore_chanmode = FALSE; static int ignore_chanmode = FALSE;
static const char chan_flags[] = { 'c', 'n', 't', 'i', 'm', 'l', 'k' }; static const char chan_flags[] = { 'c', 'n', 't', 'i', 'm', 'l', 'k' };
typedef struct
{
int server_id;
char channel[CHANLEN];
char key[64];
}
mg_closed_channel_tab;
static GSList *mg_closed_channel_tabs;
static chan *active_tab = NULL; /* active tab */ static chan *active_tab = NULL; /* active tab */
GtkWidget *parent_window = NULL; /* the master window */ GtkWidget *parent_window = NULL; /* the master window */
@@ -1643,6 +1651,71 @@ mg_tab_close_cb (GtkWidget *dialog, gint arg1, session *sess)
} }
} }
static void
mg_closed_channel_tabs_add (session *sess)
{
mg_closed_channel_tab *item;
GSList *last;
if (!sess || sess->type != SESS_CHANNEL || !sess->channel[0])
return;
item = g_new0 (mg_closed_channel_tab, 1);
item->server_id = sess->server->id;
g_strlcpy (item->channel, sess->channel, sizeof (item->channel));
g_strlcpy (item->key, sess->channelkey, sizeof (item->key));
mg_closed_channel_tabs = g_slist_prepend (mg_closed_channel_tabs, item);
if (g_slist_length (mg_closed_channel_tabs) > 20)
{
last = g_slist_last (mg_closed_channel_tabs);
g_free (last->data);
mg_closed_channel_tabs = g_slist_delete_link (mg_closed_channel_tabs, last);
}
}
void
mg_reopen_closed_channel_tab (void)
{
mg_closed_channel_tab *item;
GSList *head;
GSList *list;
server *serv;
session *sess;
if (!mg_closed_channel_tabs)
return;
head = mg_closed_channel_tabs;
item = head->data;
mg_closed_channel_tabs = g_slist_delete_link (mg_closed_channel_tabs, head);
if (!item)
return;
serv = NULL;
for (list = serv_list; list; list = list->next)
{
server *candidate = list->data;
if (candidate->id == item->server_id)
{
serv = candidate;
break;
}
}
if (serv && serv->connected && item->channel[0])
{
sess = find_channel (serv, item->channel);
if (sess)
fe_ctrl_gui (sess, 2, 0);
else
{
new_ircwindow (serv, item->channel, SESS_CHANNEL, 1);
serv->p_join (serv, item->channel, item->key);
}
}
g_free (item);
}
void void
mg_tab_close (session *sess) mg_tab_close (session *sess)
{ {
@@ -1650,11 +1723,12 @@ mg_tab_close (session *sess)
GSList *list; GSList *list;
int i; int i;
if (chan_remove (sess->res->tab, FALSE)) if (chan_remove (sess->res->tab, FALSE))
{ {
sess->res->tab = NULL; mg_closed_channel_tabs_add (sess);
mg_ircdestroy (sess); sess->res->tab = NULL;
} mg_ircdestroy (sess);
}
else else
{ {
for (i = 0, list = sess_list; list; list = list->next) for (i = 0, list = sess_list; list; list = list->next)
@@ -2497,6 +2571,7 @@ mg_topic_word_is_clickable (const char *word, int word_pos)
{ {
int start; int start;
int end; int end;
int word_type;
if (!word || word[0] == 0) if (!word || word[0] == 0)
return FALSE; return FALSE;
@@ -2504,7 +2579,8 @@ mg_topic_word_is_clickable (const char *word, int word_pos)
if (strcmp (word, "/") == 0) if (strcmp (word, "/") == 0)
return FALSE; return FALSE;
if (url_check_word (word) == 0) word_type = url_check_word (word);
if (word_type != WORD_URL && word_type != WORD_HOST && word_type != WORD_HOST6)
return FALSE; return FALSE;
url_last (&start, &end); url_last (&start, &end);
@@ -2553,7 +2629,8 @@ mg_topic_button_release_cb (GtkWidget *entry, GdkEventButton *event, gpointer us
if (!word) if (!word)
return FALSE; return FALSE;
if (mg_topic_word_is_clickable (word, word_pos)) if ((event->state & 13) == prefs.hex_gui_url_mod &&
mg_topic_word_is_clickable (word, word_pos))
{ {
url_last (&start, &end); url_last (&start, &end);
word[end] = 0; word[end] = 0;

View File

@@ -40,6 +40,7 @@ void mg_apply_setup (void);
void mg_apply_session_font_prefs (session_gui *gui); void mg_apply_session_font_prefs (session_gui *gui);
void mg_close_sess (session *); void mg_close_sess (session *);
void mg_tab_close (session *sess); void mg_tab_close (session *sess);
void mg_reopen_closed_channel_tab (void);
void mg_detach (session *sess, int mode); void mg_detach (session *sess, int mode);
void mg_progressbar_create (session_gui *gui); void mg_progressbar_create (session_gui *gui);
void mg_progressbar_destroy (session_gui *gui); void mg_progressbar_destroy (session_gui *gui);

View File

@@ -59,6 +59,17 @@ fe_open_url (const char *url)
(void)url; (void)url;
} }
char *
get_xdir (void)
{
return (char *)"/tmp";
}
void
load_text_events (void)
{
}
gboolean gboolean
theme_get_color (ThemeSemanticToken token, GdkRGBA *color) theme_get_color (ThemeSemanticToken token, GdkRGBA *color)
{ {