4 Commits

Author SHA1 Message Date
deepend-tildeclub
1208449322 Merge pull request #145 from ZoiteChat/tray-core-dump
Harden tray menu lifetime + stale pointer cleanup
2026-03-21 14:56:00 -06:00
a11ec3a05b Harden tray menu lifetime + stale pointer cleanup 2026-03-21 11:54:47 -06:00
deepend-tildeclub
e39dfcf00c Merge pull request #142 from ZoiteChat/fix-color-reset-saving
Fix GTK default text/bg reset staging
2026-03-21 03:15:21 -06:00
5f1e0fe7d8 Fix GTK default text/bg reset staging 2026-03-21 03:01:03 -06:00
5 changed files with 61 additions and 62 deletions

View File

@@ -4375,37 +4375,10 @@ mg_win32_filter (GdkXEvent *xevent, GdkEvent *event, gpointer data)
{
if (strcmp (command, "__WIN32_TASKBAR_TOGGLE__") == 0)
{
GtkWidget *widget = current_sess->gui->window;
GdkWindow *gdk_window = NULL;
gboolean hidden = TRUE;
if (widget)
{
hidden = !gtk_widget_get_visible (widget);
gdk_window = gtk_widget_get_window (widget);
if (!hidden && gdk_window &&
(gdk_window_get_state (gdk_window) & GDK_WINDOW_STATE_ICONIFIED))
hidden = TRUE;
}
if (hidden)
{
if (widget)
{
gtk_widget_show (widget);
gtk_window_deiconify (GTK_WINDOW (widget));
gtk_window_present (GTK_WINDOW (widget));
}
else
fe_ctrl_gui (current_sess, FE_GUI_SHOW, 0);
}
if (gtk_widget_get_visible (current_sess->gui->window))
fe_ctrl_gui (current_sess, FE_GUI_ICONIFY, 0);
else
{
if (widget)
gtk_window_iconify (GTK_WINDOW (widget));
else
fe_ctrl_gui (current_sess, FE_GUI_ICONIFY, 0);
}
fe_ctrl_gui (current_sess, FE_GUI_SHOW, 0);
}
else
{

View File

@@ -125,6 +125,7 @@ static void tray_menu_notify_cb (GObject *tray, GParamSpec *pspec, gpointer user
static void tray_update_toggle_item_label (void);
static gboolean tray_window_state_cb (GtkWidget *widget, GdkEventWindowState *event, gpointer userdata);
static void tray_window_visibility_cb (GtkWidget *widget, gpointer userdata);
static void tray_toggle_item_destroy_cb (GtkWidget *widget, gpointer userdata);
#if HAVE_APPINDICATOR_BACKEND
static void tray_menu_show_cb (GtkWidget *menu, gpointer userdata) G_GNUC_UNUSED;
#endif
@@ -408,7 +409,8 @@ tray_app_indicator_cleanup (void)
if (tray_menu)
{
gtk_widget_destroy (tray_menu);
if (GTK_IS_WIDGET (tray_menu))
gtk_widget_destroy (tray_menu);
tray_menu = NULL;
}
}
@@ -582,33 +584,23 @@ tray_backend_cleanup (void)
tray_backend_active = FALSE;
}
static gboolean
tray_window_is_hidden (GtkWidget *widget)
{
GdkWindow *gdk_win;
if (!widget || !gtk_widget_get_visible (widget))
return TRUE;
gdk_win = gtk_widget_get_window (widget);
if (gdk_win && (gdk_window_get_state (gdk_win) & GDK_WINDOW_STATE_ICONIFIED))
return TRUE;
return FALSE;
}
static WinStatus
tray_get_window_status (void)
{
GtkWindow *win;
GtkWidget *widget;
GdkWindow *gdk_win;
const char *st;
win = GTK_WINDOW (zoitechat_get_info (ph, "gtkwin_ptr"));
if (win)
{
widget = GTK_WIDGET (win);
if (tray_window_is_hidden (widget))
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;
}
@@ -863,8 +855,6 @@ tray_toggle_visibility (gboolean force_hide)
static int maximized;
static int fullscreen;
GtkWindow *win;
GtkWidget *widget;
gboolean hidden;
if (!tray_backend_active)
return FALSE;
@@ -880,10 +870,7 @@ tray_toggle_visibility (gboolean force_hide)
if (!win)
return FALSE;
widget = GTK_WIDGET (win);
hidden = tray_window_is_hidden (widget);
if (force_hide || !hidden)
if (force_hide || gtk_widget_get_visible (GTK_WIDGET (win)))
{
if (prefs.hex_gui_tray_away)
zoitechat_command (ph, "ALLSERV AWAY");
@@ -1041,10 +1028,15 @@ blink_item (unsigned int *setting, GtkWidget *menu, char *label)
static void
tray_menu_destroy (GtkWidget *menu, gpointer userdata)
{
(void)userdata;
GtkWidget **menu_ptr = userdata;
gtk_widget_destroy (menu);
g_object_unref (menu);
if (menu_ptr && *menu_ptr == menu)
*menu_ptr = NULL;
if (GTK_IS_WIDGET (menu))
gtk_widget_destroy (menu);
if (G_IS_OBJECT (menu))
g_object_unref (menu);
#ifdef WIN32
g_source_remove (tray_menu_timer);
#endif
@@ -1104,6 +1096,8 @@ tray_menu_populate (GtkWidget *menu)
zoitechat_set_context (ph, zoitechat_find_context (ph, NULL, NULL));
tray_toggle_item = tray_make_item (menu, _("_Hide Window"), tray_menu_restore_cb, NULL);
g_signal_connect (G_OBJECT (tray_toggle_item), "destroy",
G_CALLBACK (tray_toggle_item_destroy_cb), NULL);
tray_update_toggle_item_label ();
tray_make_item (menu, NULL, tray_menu_quit_cb, NULL);
@@ -1144,12 +1138,22 @@ tray_menu_clear (GtkWidget *menu)
children = gtk_container_get_children (GTK_CONTAINER (menu));
for (iter = children; iter; iter = iter->next)
gtk_widget_destroy (GTK_WIDGET (iter->data));
if (GTK_IS_WIDGET (iter->data))
gtk_widget_destroy (GTK_WIDGET (iter->data));
g_list_free (children);
tray_toggle_item = NULL;
}
#endif
static void
tray_toggle_item_destroy_cb (GtkWidget *widget, gpointer userdata)
{
(void)userdata;
if (tray_toggle_item == widget)
tray_toggle_item = NULL;
}
static void
tray_update_toggle_item_label (void)
{
@@ -1157,6 +1161,11 @@ tray_update_toggle_item_label (void)
if (!tray_toggle_item)
return;
if (!GTK_IS_MENU_ITEM (tray_toggle_item))
{
tray_toggle_item = NULL;
return;
}
if (tray_get_window_status () == WS_HIDDEN)
label = _("_Restore Window");
@@ -1209,10 +1218,9 @@ tray_menu_cb (GtkWidget *widget, guint button, guint time, gpointer userdata)
(void)time;
(void)userdata;
/* close any old menu */
if (G_IS_OBJECT (menu))
if (menu)
{
tray_menu_destroy (menu, NULL);
tray_menu_destroy (menu, &menu);
}
menu = gtk_menu_new ();
@@ -1222,8 +1230,9 @@ tray_menu_cb (GtkWidget *widget, guint button, guint time, gpointer userdata)
g_object_ref (menu);
g_object_ref_sink (menu);
g_object_unref (menu);
g_object_add_weak_pointer (G_OBJECT (menu), (gpointer *)&menu);
g_signal_connect (G_OBJECT (menu), "selection-done",
G_CALLBACK (tray_menu_destroy), NULL);
G_CALLBACK (tray_menu_destroy), &menu);
#ifdef WIN32
g_signal_connect (G_OBJECT (menu), "leave-notify-event",
G_CALLBACK (tray_menu_left_cb), NULL);

View File

@@ -2197,8 +2197,8 @@ setup_ok_cb (GtkWidget *but, GtkWidget *win)
char buffer[192];
memcpy (&old_prefs, &prefs, sizeof (prefs));
theme_preferences_stage_apply ();
setup_apply (&setup_prefs);
theme_preferences_stage_apply ();
save_result = preferences_persistence_save_all ();
if (save_result.success)
{

View File

@@ -68,6 +68,16 @@ theme_get_color (ThemeSemanticToken token, GdkRGBA *color)
return TRUE;
}
void
theme_get_widget_style_values_for_widget (GtkWidget *widget, ThemeWidgetStyleValues *out_values)
{
(void)widget;
if (!out_values)
return;
gdk_rgba_parse (&out_values->foreground, "#111111");
gdk_rgba_parse (&out_values->background, "#f0f0f0");
}
void
theme_manager_set_token_color (unsigned int dark_mode, ThemeSemanticToken token, const GdkRGBA *color, gboolean *changed)
{

View File

@@ -723,6 +723,7 @@ theme_preferences_manager_dialog_response_cb (GtkDialog *dialog, gint response_i
if (theme_preferences_stage.active)
{
ThemeSemanticToken token;
ThemeWidgetStyleValues style_values;
for (token = THEME_TOKEN_MIRC_0; token < THEME_TOKEN_COUNT; token++)
{
@@ -733,6 +734,12 @@ theme_preferences_manager_dialog_response_cb (GtkDialog *dialog, gint response_i
theme_preferences_stage.staged[token] = rgba;
theme_preferences_stage.staged_valid[token] = TRUE;
}
theme_get_widget_style_values_for_widget (GTK_WIDGET (dialog), &style_values);
theme_preferences_stage.staged[THEME_TOKEN_TEXT_FOREGROUND] = style_values.foreground;
theme_preferences_stage.staged_valid[THEME_TOKEN_TEXT_FOREGROUND] = TRUE;
theme_preferences_stage.staged[THEME_TOKEN_TEXT_BACKGROUND] = style_values.background;
theme_preferences_stage.staged_valid[THEME_TOKEN_TEXT_BACKGROUND] = TRUE;
theme_preferences_stage_sync_runtime_to_staged ();
theme_preferences_stage_recompute_changed ();
if (ui->color_change_flag)
*ui->color_change_flag = theme_preferences_stage.changed;