--- a/pidgin/gtkprefs.c Wed Aug 07 02:37:46 2019 -0400 +++ b/pidgin/gtkprefs.c Wed Aug 07 19:53:14 2019 -0400 @@ -264,6 +264,7 @@ GtkWidget *level; GtkWidget *threshold; GtkWidget *volume; + GtkWidget *test; GstElement *pipeline; } voice; @@ -271,6 +272,7 @@ PidginPrefCombo input; PidginPrefCombo output; GtkWidget *drawing_area; + GtkWidget *test; GstElement *pipeline; } video; } vv; @@ -2911,11 +2913,18 @@ } static void -vv_test_switch_page_cb(G_GNUC_UNUSED GtkStack *stack, - G_GNUC_UNUSED GParamSpec *pspec, gpointer data) +vv_test_switch_page_cb(GtkStack *stack, G_GNUC_UNUSED GParamSpec *pspec, + gpointer data) { - GtkWidget *test = data; - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(test), FALSE); + PidginPrefsWindow *win = data; + + if (!g_str_equal(gtk_stack_get_visible_child_name(stack), "vv")) { + /* Disable any running test pipelines. */ + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(win->vv.voice.test), FALSE); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(win->vv.video.test), FALSE); + } } static GstElement * @@ -3057,8 +3066,6 @@ G_CALLBACK(on_volume_change_cb), win); g_signal_connect(test, "destroy", G_CALLBACK(voice_test_destroy_cb), win); - g_signal_connect(win->stack, "notify::visible-child", - G_CALLBACK(vv_test_switch_page_cb), test); } else { gtk_progress_bar_set_fraction( GTK_PROGRESS_BAR(win->vv.voice.level), 0.0); @@ -3069,9 +3076,6 @@ g_object_disconnect(test, "any-signal::destroy", G_CALLBACK(voice_test_destroy_cb), win, NULL); - g_object_disconnect(win->stack, "any-signal::notify", - G_CALLBACK(vv_test_switch_page_cb), test, - NULL); voice_test_destroy_cb(NULL, win); } } @@ -3128,9 +3132,10 @@ win->vv.voice.level = GTK_WIDGET(gtk_builder_get_object(builder, "vv.voice.level")); - test = gtk_builder_get_object(builder, "vv.voice.test_button"); + test = gtk_builder_get_object(builder, "vv.voice.test"); g_signal_connect(test, "toggled", G_CALLBACK(toggle_voice_test_cb), win); + win->vv.voice.test = GTK_WIDGET(test); } static GstElement * @@ -3251,15 +3256,10 @@ enable_video_test(win); g_signal_connect(test, "destroy", G_CALLBACK(video_test_destroy_cb), win); - g_signal_connect(win->stack, "notify::visible-child", - G_CALLBACK(vv_test_switch_page_cb), test); } else { g_object_disconnect(test, "any-signal::destroy", G_CALLBACK(video_test_destroy_cb), win, NULL); - g_object_disconnect(win->stack, "any-signal::notify", - G_CALLBACK(vv_test_switch_page_cb), test, - NULL); video_test_destroy_cb(NULL, win); } } @@ -3288,9 +3288,10 @@ gtk_widget_set_visual(video, gdk_screen_get_system_visual( gtk_widget_get_screen(video))); - test = gtk_builder_get_object(builder, "vv.video.test_button"); + test = gtk_builder_get_object(builder, "vv.video.test"); g_signal_connect(test, "toggled", G_CALLBACK(toggle_video_test_cb), win); + win->vv.video.test = GTK_WIDGET(test); } static void @@ -3447,6 +3448,9 @@ bind_video_test(win, builder); + g_signal_connect(win->stack, "notify::visible-child", + G_CALLBACK(vv_test_switch_page_cb), win); + g_object_ref(ret); g_object_unref(builder);