11 Commits

Author SHA1 Message Date
deepend-tildeclub
166542f1e3 Merge pull request #108 from ZoiteChat/fix-flatpak-titlebar
Fix flatpak titlebar
2026-03-12 18:45:48 -06:00
05f4bf382d flatpak: enable GTK_CSD=1 for GTK titlebars on KDE 2026-03-12 18:39:22 -06:00
52af960175 fix: refresh AppIndicator tray label on menu map/open 2026-03-12 18:31:20 -06:00
deepend-tildeclub
a2e2bdf803 Merge pull request #106 from ZoiteChat/remove-icons
ui: drop menubar icons
2026-03-12 18:15:12 -06:00
deepend-tildeclub
3baa5d92f4 Merge pull request #105 from ZoiteChat/plugins-retention
fix: persist manual addons by copying em into user addon dir
2026-03-12 16:54:27 -06:00
99f97b82a6 ui: drop menubar icons; make Away plain item w/ toggle handler 2026-03-12 16:52:06 -06:00
deepend-tildeclub
6d1e7da475 Merge pull request #104 from ZoiteChat/bug-fixes-pre3-prep
Merge color-changer: import colors.conf, fix userlist/GTK3 tabs, embed SVG icon, clean GTK/OpenSSL warnings.
2026-03-12 15:22:04 -06:00
deepend-tildeclub
f676aa56e6 Merge pull request #103 from ZoiteChat/theme-features-fixes
Theme update
2026-03-09 10:50:12 -06:00
deepend-tildeclub
5e86f363ed Merge pull request #100 from ZoiteChat/theme-module
Theme module
2026-03-02 19:59:43 -07:00
deepend-tildeclub
0523b0639b Merge pull request #99 from ZoiteChat/consistent-icons
icon-resolver unifies gtk icons; win32/ci now ships real hicolor theme
2026-03-01 14:55:32 -07:00
deepend-tildeclub
b3f692f00c Update server addresses for Zoite 2026-02-28 23:02:02 -07:00
6 changed files with 59 additions and 55 deletions

View File

@@ -16,6 +16,7 @@
"--filesystem=~/.themes:ro", "--filesystem=~/.themes:ro",
"--filesystem=~/.icons:ro", "--filesystem=~/.icons:ro",
"--filesystem=xdg-run/tray-icon:create", "--filesystem=xdg-run/tray-icon:create",
"--env=GTK_CSD=1",
"--talk-name=org.freedesktop.Notifications", "--talk-name=org.freedesktop.Notifications",
"--talk-name=org.kde.StatusNotifierWatcher", "--talk-name=org.kde.StatusNotifierWatcher",

View File

@@ -338,8 +338,8 @@ static const struct defaultserver def[] =
{"Zoite", 0, 0, 0, LOGIN_SASL, 0, TRUE}, {"Zoite", 0, 0, 0, LOGIN_SASL, 0, TRUE},
{0, "irc.zoite.net"}, {0, "irc.zoite.net"},
{0, "penumbra.newnet.net"}, {0, "penumbra.zoite.net"},
{0, "hedy.newnet.net"}, {0, "hedy.zoite.net"},
{0,0} {0,0}
}; };

View File

@@ -1144,6 +1144,12 @@ fe_gui_info (session *sess, int info_type)
return 2; /* hidden (iconified or systray) */ return 2; /* hidden (iconified or systray) */
} }
{
GdkWindow *gdk_win = gtk_widget_get_window (GTK_WIDGET (sess->gui->window));
if (gdk_win && (gdk_window_get_state (gdk_win) & GDK_WINDOW_STATE_ICONIFIED))
return 2;
}
if (gtk_window_is_active (GTK_WINDOW (sess->gui->window))) if (gtk_window_is_active (GTK_WINDOW (sess->gui->window)))
{ {
return 1; /* active/focused */ return 1; /* active/focused */

View File

@@ -1572,6 +1572,12 @@ menu_away (GtkCheckMenuItem *item, gpointer none)
handle_command (current_sess, gtk_check_menu_item_get_active (item) ? "away" : "back", FALSE); handle_command (current_sess, gtk_check_menu_item_get_active (item) ? "away" : "back", FALSE);
} }
static void
menu_away_toggle (GtkWidget *item, gpointer none)
{
handle_command (current_sess, current_sess->server->is_away ? "back" : "away", FALSE);
}
static void static void
menu_chanlist (GtkWidget * wid, gpointer none) menu_chanlist (GtkWidget * wid, gpointer none)
{ {
@@ -1888,30 +1894,12 @@ menu_about (GtkWidget *wid, gpointer sess)
gtk_widget_show_all (GTK_WIDGET(dialog)); gtk_widget_show_all (GTK_WIDGET(dialog));
} }
#define ICON_NEW "zc-menu-new"
#define ICON_NETWORK_LIST "zc-menu-network-list"
#define ICON_LOAD_PLUGIN "zc-menu-load-plugin"
#define ICON_DETACH "zc-menu-detach"
#define ICON_CLOSE "zc-menu-close"
#define ICON_QUIT "zc-menu-quit"
#define ICON_DISCONNECT "zc-menu-disconnect"
#define ICON_CONNECT "zc-menu-connect"
#define ICON_JOIN "zc-menu-join"
#define ICON_CHANLIST "zc-menu-chanlist"
#define ICON_PREFERENCES "zc-menu-preferences"
#define ICON_CLEAR "zc-menu-clear"
#define ICON_SAVE "zc-menu-save"
#define ICON_SEARCH "zc-menu-search"
#define ICON_FIND "zc-menu-find"
#define ICON_HELP "zc-menu-help"
#define ICON_ABOUT "zc-menu-about"
static struct mymenu mymenu[] = { static struct mymenu mymenu[] = {
{N_("_ZoiteChat"), 0, 0, M_NEWMENU, MENU_ID_ZOITECHAT, 0, 1}, {N_("_ZoiteChat"), 0, 0, M_NEWMENU, MENU_ID_ZOITECHAT, 0, 1},
{N_("Network Li_st"), menu_open_server_list, ICON_NETWORK_LIST, M_MENUSTOCK, 0, 0, 1, GDK_KEY_s}, {N_("Network Li_st"), menu_open_server_list, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_s},
{0, 0, 0, M_SEP, 0, 0, 0}, {0, 0, 0, M_SEP, 0, 0, 0},
{N_("_New"), 0, ICON_NEW, M_MENUSUB, 0, 0, 1}, {N_("_New"), 0, 0, M_MENUSUB, 0, 0, 1},
{N_("Server Tab"), menu_newserver_tab, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_t}, {N_("Server Tab"), menu_newserver_tab, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_t},
{N_("Channel Tab"), menu_newchannel_tab, 0, M_MENUITEM, 0, 0, 1}, {N_("Channel Tab"), menu_newchannel_tab, 0, M_MENUITEM, 0, 0, 1},
{N_("Server Window"), menu_newserver_window, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_n}, {N_("Server Window"), menu_newserver_window, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_n},
@@ -1919,14 +1907,14 @@ static struct mymenu mymenu[] = {
{0, 0, 0, M_END, 0, 0, 0}, {0, 0, 0, M_END, 0, 0, 0},
{0, 0, 0, M_SEP, 0, 0, 0}, {0, 0, 0, M_SEP, 0, 0, 0},
{N_("_Load Plugin or Script" ELLIPSIS), menu_loadplugin, ICON_LOAD_PLUGIN, M_MENUSTOCK, 0, 0, 1}, {N_("_Load Plugin or Script" ELLIPSIS), menu_loadplugin, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_SEP, 0, 0, 0}, /* 11 */ {0, 0, 0, M_SEP, 0, 0, 0}, /* 11 */
#define DETACH_OFFSET (12) #define DETACH_OFFSET (12)
{0, menu_detach, ICON_DETACH, M_MENUSTOCK, 0, 0, 1}, /* 12 */ {0, menu_detach, 0, M_MENUITEM, 0, 0, 1}, /* 12 */
#define CLOSE_OFFSET (13) #define CLOSE_OFFSET (13)
{0, menu_close, ICON_CLOSE, M_MENUSTOCK, 0, 0, 1}, {0, menu_close, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_SEP, 0, 0, 0}, {0, 0, 0, M_SEP, 0, 0, 0},
{N_("_Quit"), menu_quit, ICON_QUIT, M_MENUSTOCK, 0, 0, 1, GDK_KEY_q}, /* 15 */ {N_("_Quit"), menu_quit, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_q}, /* 15 */
{N_("_View"), 0, 0, M_NEWMENU, 0, 0, 1}, {N_("_View"), 0, 0, M_NEWMENU, 0, 0, 1},
#define MENUBAR_OFFSET (17) #define MENUBAR_OFFSET (17)
@@ -1952,18 +1940,18 @@ static struct mymenu mymenu[] = {
{N_ ("_Fullscreen"), menu_fullscreen_toggle, 0, M_MENUTOG, MENU_ID_FULLSCREEN, 0, 1, GDK_KEY_F11}, {N_ ("_Fullscreen"), menu_fullscreen_toggle, 0, M_MENUTOG, MENU_ID_FULLSCREEN, 0, 1, GDK_KEY_F11},
{N_("_Server"), 0, 0, M_NEWMENU, 0, 0, 1}, {N_("_Server"), 0, 0, M_NEWMENU, 0, 0, 1},
{N_("_Disconnect"), menu_disconnect, ICON_DISCONNECT, M_MENUSTOCK, MENU_ID_DISCONNECT, 0, 1}, {N_("_Disconnect"), menu_disconnect, 0, M_MENUITEM, MENU_ID_DISCONNECT, 0, 1},
{N_("_Reconnect"), menu_reconnect, ICON_CONNECT, M_MENUSTOCK, MENU_ID_RECONNECT, 0, 1}, {N_("_Reconnect"), menu_reconnect, 0, M_MENUITEM, MENU_ID_RECONNECT, 0, 1},
{N_("_Join a Channel" ELLIPSIS), menu_join, ICON_JOIN, M_MENUSTOCK, MENU_ID_JOIN, 0, 1}, {N_("_Join a Channel" ELLIPSIS), menu_join, 0, M_MENUITEM, MENU_ID_JOIN, 0, 1},
{N_("Channel _List"), menu_chanlist, ICON_CHANLIST, M_MENUSTOCK, 0, 0, 1}, {N_("Channel _List"), menu_chanlist, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_SEP, 0, 0, 0}, {0, 0, 0, M_SEP, 0, 0, 0},
#define AWAY_OFFSET (41) #define AWAY_OFFSET (41)
{N_("Marked _Away"), menu_away, 0, M_MENUTOG, MENU_ID_AWAY, 0, 1, GDK_KEY_a}, {N_("Marked _Away"), menu_away_toggle, 0, M_MENUITEM, MENU_ID_AWAY, 0, 1, GDK_KEY_a},
{N_("_Usermenu"), 0, 0, M_NEWMENU, MENU_ID_USERMENU, 0, 1}, /* 40 */ {N_("_Usermenu"), 0, 0, M_NEWMENU, MENU_ID_USERMENU, 0, 1}, /* 40 */
{N_("S_ettings"), 0, 0, M_NEWMENU, 0, 0, 1}, {N_("S_ettings"), 0, 0, M_NEWMENU, 0, 0, 1},
{N_("_Preferences"), menu_settings, ICON_PREFERENCES, M_MENUSTOCK, 0, 0, 1}, {N_("_Preferences"), menu_settings, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_SEP, 0, 0, 0}, {0, 0, 0, M_SEP, 0, 0, 0},
{N_("Auto Replace"), menu_rpopup, 0, M_MENUITEM, 0, 0, 1}, {N_("Auto Replace"), menu_rpopup, 0, M_MENUITEM, 0, 0, 1},
{N_("CTCP Replies"), menu_ctcpguiopen, 0, M_MENUITEM, 0, 0, 1}, {N_("CTCP Replies"), menu_ctcpguiopen, 0, M_MENUITEM, 0, 0, 1},
@@ -1989,18 +1977,18 @@ static struct mymenu mymenu[] = {
{N_("Reset Marker Line"), menu_resetmarker, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_m}, {N_("Reset Marker Line"), menu_resetmarker, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_m},
{N_("Move to Marker Line"), menu_movetomarker, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_M}, {N_("Move to Marker Line"), menu_movetomarker, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_M},
{N_("_Copy Selection"), menu_copy_selection, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_C}, {N_("_Copy Selection"), menu_copy_selection, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_C},
{N_("C_lear Text"), menu_flushbuffer, ICON_CLEAR, M_MENUSTOCK, 0, 0, 1}, {N_("C_lear Text"), menu_flushbuffer, 0, M_MENUITEM, 0, 0, 1},
{N_("Save Text" ELLIPSIS), menu_savebuffer, ICON_SAVE, M_MENUSTOCK, 0, 0, 1}, {N_("Save Text" ELLIPSIS), menu_savebuffer, 0, M_MENUITEM, 0, 0, 1},
#define SEARCH_OFFSET (70) #define SEARCH_OFFSET (70)
{N_("Search"), 0, ICON_SEARCH, M_MENUSUB, 0, 0, 1}, {N_("Search"), 0, 0, M_MENUSUB, 0, 0, 1},
{N_("Search Text" ELLIPSIS), menu_search, ICON_FIND, M_MENUSTOCK, 0, 0, 1, GDK_KEY_f}, {N_("Search Text" ELLIPSIS), menu_search, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_f},
{N_("Search Next" ), menu_search_next, ICON_FIND, M_MENUSTOCK, 0, 0, 1, GDK_KEY_g}, {N_("Search Next" ), menu_search_next, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_g},
{N_("Search Previous" ), menu_search_prev, ICON_FIND, M_MENUSTOCK, 0, 0, 1, GDK_KEY_G}, {N_("Search Previous" ), menu_search_prev, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_G},
{0, 0, 0, M_END, 0, 0, 0}, {0, 0, 0, M_END, 0, 0, 0},
{N_("_Help"), 0, 0, M_NEWMENU, 0, 0, 1}, /* 74 */ {N_("_Help"), 0, 0, M_NEWMENU, 0, 0, 1}, /* 74 */
{N_("_Contents"), menu_docs, ICON_HELP, M_MENUSTOCK, 0, 0, 1, GDK_KEY_F1}, {N_("_Contents"), menu_docs, 0, M_MENUITEM, 0, 0, 1, GDK_KEY_F1},
{N_("_About"), menu_about, ICON_ABOUT, M_MENUSTOCK, 0, 0, 1}, {N_("_About"), menu_about, 0, M_MENUITEM, 0, 0, 1},
{0, 0, 0, M_END, 0, 0, 0}, {0, 0, 0, M_END, 0, 0, 0},
}; };
@@ -2008,11 +1996,14 @@ static struct mymenu mymenu[] = {
void void
menu_set_away (session_gui *gui, int away) menu_set_away (session_gui *gui, int away)
{ {
GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM (gui->menu_item[MENU_ID_AWAY]); if (GTK_IS_CHECK_MENU_ITEM (gui->menu_item[MENU_ID_AWAY]))
{
GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM (gui->menu_item[MENU_ID_AWAY]);
g_signal_handlers_block_by_func (G_OBJECT (item), menu_away, NULL); g_signal_handlers_block_by_func (G_OBJECT (item), menu_away, NULL);
gtk_check_menu_item_set_active (item, away); gtk_check_menu_item_set_active (item, away);
g_signal_handlers_unblock_by_func (G_OBJECT (item), menu_away, NULL); g_signal_handlers_unblock_by_func (G_OBJECT (item), menu_away, NULL);
}
} }
void void

View File

@@ -424,6 +424,8 @@ tray_app_indicator_init (void)
tray_menu = gtk_menu_new (); tray_menu = gtk_menu_new ();
g_signal_connect (G_OBJECT (tray_menu), "show", g_signal_connect (G_OBJECT (tray_menu), "show",
G_CALLBACK (tray_menu_show_cb), NULL); G_CALLBACK (tray_menu_show_cb), NULL);
g_signal_connect (G_OBJECT (tray_menu), "map",
G_CALLBACK (tray_menu_show_cb), NULL);
app_indicator_set_menu (tray_indicator, GTK_MENU (tray_menu)); app_indicator_set_menu (tray_indicator, GTK_MENU (tray_menu));
app_indicator_set_status (tray_indicator, APP_INDICATOR_STATUS_ACTIVE); app_indicator_set_status (tray_indicator, APP_INDICATOR_STATUS_ACTIVE);
@@ -581,11 +583,21 @@ static WinStatus
tray_get_window_status (void) tray_get_window_status (void)
{ {
GtkWindow *win; GtkWindow *win;
GtkWidget *widget;
GdkWindow *gdk_win;
const char *st; const char *st;
win = GTK_WINDOW (zoitechat_get_info (ph, "gtkwin_ptr")); win = GTK_WINDOW (zoitechat_get_info (ph, "gtkwin_ptr"));
if (win && !gtk_widget_get_visible (GTK_WIDGET (win))) if (win)
return WS_HIDDEN; {
widget = GTK_WIDGET (win);
if (!gtk_widget_get_visible (widget))
return WS_HIDDEN;
gdk_win = gtk_widget_get_window (widget);
if (gdk_win && (gdk_window_get_state (gdk_win) & GDK_WINDOW_STATE_ICONIFIED))
return WS_HIDDEN;
}
st = zoitechat_get_info (ph, "win_status"); st = zoitechat_get_info (ph, "win_status");

View File

@@ -198,8 +198,6 @@ plugingui_load_cb (session *sess, char *file)
char *addons_dir; char *addons_dir;
char *basename; char *basename;
char *addons_target; char *addons_target;
char *canonical_addons;
char *canonical_file;
gboolean file_in_addons; gboolean file_in_addons;
target_sess = is_session (sess) ? sess : current_sess; target_sess = is_session (sess) ? sess : current_sess;
@@ -211,11 +209,9 @@ plugingui_load_cb (session *sess, char *file)
load_target = g_strdup (file); load_target = g_strdup (file);
addons_dir = g_build_filename (get_xdir (), "addons", NULL); addons_dir = g_build_filename (get_xdir (), "addons", NULL);
canonical_addons = g_canonicalize_filename (addons_dir, NULL); file_in_addons = g_str_has_prefix (file, addons_dir)
canonical_file = g_canonicalize_filename (file, NULL); && (file[strlen (addons_dir)] == G_DIR_SEPARATOR
file_in_addons = g_str_has_prefix (canonical_file, canonical_addons) || file[strlen (addons_dir)] == '\0');
&& (canonical_file[strlen (canonical_addons)] == G_DIR_SEPARATOR
|| canonical_file[strlen (canonical_addons)] == '\0');
if (!file_in_addons) if (!file_in_addons)
{ {
@@ -240,8 +236,6 @@ plugingui_load_cb (session *sess, char *file)
} }
} }
g_free (canonical_addons);
g_free (canonical_file);
g_free (addons_dir); g_free (addons_dir);
#ifdef WIN32 #ifdef WIN32