From d6cfc8d3ac413fbd1798ba8ed29f7dc1dbc58357 Mon Sep 17 00:00:00 2001
From: robxnano <89391914+robxnano@users.noreply.github.com>
Date: Fri, 25 Jul 2025 13:45:22 +0100
Subject: [PATCH 1/5] libhb: Fallback to first audio track

If no track was found in any of the selected languages, fall back to
the first audio track.
Fixes https://github.com/HandBrake/HandBrake/issues/6666.
---
 libhb/preset.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/libhb/preset.c b/libhb/preset.c
index c7ea0dd9d1d3..7cf7152246f0 100644
--- a/libhb/preset.c
+++ b/libhb/preset.c
@@ -1050,12 +1050,19 @@ int hb_preset_job_add_audio(hb_handle_t *h, int title_index,
         add_audio_for_lang(list, preset, title, mux, copy_mask, fallback,
                            lang, behavior, mode, track_dict);
     }
-    // If AudioLanguageList is empty, try "any" language option
+    // If AudioLanguageList is empty, or AudioTrackSelectionBehavior
+    // is "first" and no track was found, try "any" language option
     if (count <= 0)
     {
         add_audio_for_lang(list, preset, title, mux, copy_mask, fallback,
                            "any", behavior, mode, track_dict);
     }
+    else if (behavior != 0 && hb_value_array_len(list) == 0)
+    {
+        // Only add the first track
+        add_audio_for_lang(list, preset, title, mux, copy_mask, fallback,
+                           "any", 1, mode, track_dict);
+    }
     hb_dict_free(&track_dict);
     return 0;
 }

From b01b067c369881ddfed0294c2012885ad3a6d52c Mon Sep 17 00:00:00 2001
From: robxnano <89391914+robxnano@users.noreply.github.com>
Date: Tue, 29 Jul 2025 08:42:36 +0100
Subject: [PATCH 2/5] LinGUI: Fix maximum bitrate calculation

Use the current audio mixdown to determine the maximum bitrate in the
audio defaults dialog, instead of only using the mono rate.
Fixes https://github.com/HandBrake/HandBrake/issues/6997
---
 gtk/src/audiohandler.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/gtk/src/audiohandler.c b/gtk/src/audiohandler.c
index ac2aafc08f41..71f4471c3f49 100644
--- a/gtk/src/audiohandler.c
+++ b/gtk/src/audiohandler.c
@@ -2243,8 +2243,9 @@ audio_def_set_limits (signal_user_data_t *ud, GtkWidget *widget, gboolean set_de
         enc = ghb_select_fallback(ud->settings, enc);
     }
     int sr = ghb_settings_audio_samplerate_rate(adict, "AudioSamplerate");
+    int mix = ghb_settings_mixdown_mix(adict, "AudioMixdown");
     int low, high;
-    hb_audio_bitrate_get_limits(enc, sr, HB_AMIXDOWN_MONO, &low, &high);
+    hb_audio_bitrate_get_limits(enc, sr, mix, &low, &high);
     GtkWidget *w = find_widget(GTK_WIDGET(row), "AudioBitrate");
     ghb_audio_bitrate_opts_filter(GTK_COMBO_BOX(w), low, high);
     w = find_widget(GTK_WIDGET(row), "AudioMixdown");

From 6e6eabed1cb9eda4a5bd807306b6f1b8cc72a386 Mon Sep 17 00:00:00 2001
From: robxnano <89391914+robxnano@users.noreply.github.com>
Date: Tue, 29 Jul 2025 08:44:30 +0100
Subject: [PATCH 3/5] LinGUI: Don't allow unsupported bitrates

When the maximum bitrate is reduced due to a codec or mixdown change,
and the previously selected bitrate is out of range, change to the
highest allowed bitrate, and vice versa for the minimum bitrate.
---
 gtk/src/hb-backend.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c
index ddeef7580ec6..4a193052016d 100644
--- a/gtk/src/hb-backend.c
+++ b/gtk/src/hb-backend.c
@@ -3358,6 +3358,8 @@ ghb_audio_bitrate_opts_filter(
     store = GTK_LIST_STORE(gtk_combo_box_get_model (combo));
     if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL(store), &iter))
     {
+        int highest_rate = -1;
+        int lowest_rate = -1;
         do
         {
             gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 3, &ivalue, -1);
@@ -3368,9 +3370,29 @@ ghb_audio_bitrate_opts_filter(
             else
             {
                 gtk_list_store_set(store, &iter, 1, TRUE, -1);
+                // Store the highest and lowest supported rates
+                // Assume that the list of rates is sorted in ascending order
+                highest_rate = ivalue;
+                if (lowest_rate == -1)
+                    lowest_rate = ivalue;
             }
             done = !gtk_tree_model_iter_next (GTK_TREE_MODEL(store), &iter);
         } while (!done);
+
+        const char *current_id = gtk_combo_box_get_active_id(combo);
+        int current_rate = ghb_lookup_audio_bitrate_rate(current_id);
+        // If the previously set value is not in the allowed range,
+        // set the new value to the lowest/highest allowed
+        if (current_rate < first_rate)
+        {
+            g_autofree char *lowest_id = g_strdup_printf("%d", lowest_rate);
+            gtk_combo_box_set_active_id(combo, lowest_id);
+        }
+        else if (current_rate > last_rate)
+        {
+            g_autofree char *highest_id = g_strdup_printf("%d", highest_rate);
+            gtk_combo_box_set_active_id(combo, highest_id);
+        }
     }
 }
 

From deeae3462a852fc151e944c7c9512eca9509e092 Mon Sep 17 00:00:00 2001
From: robxnano <89391914+robxnano@users.noreply.github.com>
Date: Tue, 29 Jul 2025 09:11:05 +0100
Subject: [PATCH 4/5] LinGUI: Bump GTK minimum version to 4.6

The previous minimum version, 4.4, is no longer available in any
supported distribution, so 4.6 is the lowest version which can be
tested.
---
 gtk/meson.build       |  6 +++---
 gtk/src/application.c | 10 +---------
 2 files changed, 4 insertions(+), 12 deletions(-)

diff --git a/gtk/meson.build b/gtk/meson.build
index 83233cea2063..0217154a88b4 100644
--- a/gtk/meson.build
+++ b/gtk/meson.build
@@ -9,7 +9,7 @@ project('handbrake-gtk', 'c', 'cpp',
 
 # Minimum versions for dependencies
 glib_min = '>= 2.68'
-gtk_min  = '>= 4.4'
+gtk_min  = '>= 4.6'
 
 cc = meson.get_compiler('c')
 i18n = import('i18n')
@@ -105,8 +105,8 @@ if (cc.has_function('strerror_r'))
   add_project_arguments('-DHAS_STRERROR_R', language: 'c')
 endif
 
-add_project_arguments('-DGDK_VERSION_MIN_REQUIRED=GDK_VERSION_4_4',
-'-DGDK_VERSION_MAX_ALLOWED=GDK_VERSION_4_4', language: 'c')
+add_project_arguments('-DGDK_VERSION_MIN_REQUIRED=GDK_VERSION_4_6',
+'-DGDK_VERSION_MAX_ALLOWED=GDK_VERSION_4_6', language: 'c')
 
 compile_args = cc.get_supported_arguments(
   '-Wno-missing-field-initializers',
diff --git a/gtk/src/application.c b/gtk/src/application.c
index 525e8945e46f..e52a5a2b8ae1 100644
--- a/gtk/src/application.c
+++ b/gtk/src/application.c
@@ -587,10 +587,8 @@ static gboolean
 video_file_drop_received (GtkDropTarget* self, const GValue* value,
                           double x, double y, signal_user_data_t *ud)
 {
-/* The GdkFileList method is preferred where supported as it handles multiple
+/* The GdkFileList method is preferred as it handles multiple
  * files and also allows access to sandboxed files via the portal */
-#if GTK_CHECK_VERSION(4, 6, 0)
-G_GNUC_BEGIN_IGNORE_DEPRECATIONS
     if (G_VALUE_HOLDS(value, GDK_TYPE_FILE_LIST))
     {
         GdkFileList *gdk_file_list = g_value_get_boxed(value);
@@ -628,8 +626,6 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
         }
         return TRUE;
     }
-G_GNUC_END_IGNORE_DEPRECATIONS
-#endif
 
     g_autoptr(GFile) file = NULL;
     g_autofree gchar *filename = NULL;
@@ -666,9 +662,7 @@ video_file_drop_init (signal_user_data_t *ud)
 {
     GtkWidget *window = ghb_builder_widget("hb_window");
     GType types[] = {
-#if GTK_CHECK_VERSION(4, 6, 0)
         GDK_TYPE_FILE_LIST,
-#endif
         G_TYPE_FILE,
         G_TYPE_URI,
     };
@@ -973,10 +967,8 @@ ghb_application_handle_local_options (GApplication *app, GVariantDict *options)
     if (g_variant_dict_lookup(options, "config", "s", &config_dir))
         ghb_override_user_config_dir(config_dir);
 
-#if GLIB_CHECK_VERSION(2, 72, 0)
     if (g_variant_dict_lookup(options, "debug", "b", NULL))
         g_log_set_debug_enabled(TRUE);
-#endif
 
     if (g_variant_dict_lookup(options, "console", "b", NULL))
 #if defined(_WIN32)

From 4f69ace02b00942ad8d6f084c2def29959a151bb Mon Sep 17 00:00:00 2001
From: robxnano <89391914+robxnano@users.noreply.github.com>
Date: Tue, 29 Jul 2025 09:42:30 +0100
Subject: [PATCH 5/5] LinGUI: Replace deprecated GTK functions

The gtk_widget_show() and gtk_widget_hide() functions are deprecated in
GTK 4.10 in favor of gtk_widget_set_visible().
---
 gtk/src/audiohandler.c    | 56 +++++++++++++++++----------------------
 gtk/src/callbacks.c       | 34 ++++++++++++------------
 gtk/src/chapters.c        |  2 +-
 gtk/src/presets.c         |  4 +--
 gtk/src/preview.c         |  4 +--
 gtk/src/queuehandler.c    |  2 +-
 gtk/src/subtitlehandler.c | 12 ++++-----
 gtk/src/title-add.c       | 12 ++++-----
 gtk/src/util.c            |  2 +-
 9 files changed, 60 insertions(+), 68 deletions(-)

diff --git a/gtk/src/audiohandler.c b/gtk/src/audiohandler.c
index 71f4471c3f49..9580db4b4878 100644
--- a/gtk/src/audiohandler.c
+++ b/gtk/src/audiohandler.c
@@ -1415,7 +1415,7 @@ audio_add_cb (GSimpleAction *action, GVariant *param, gpointer data)
         GtkWidget *dialog = ghb_builder_widget("audio_dialog");
         gtk_window_set_title(GTK_WINDOW(dialog), _("Add Audio Track"));
         g_signal_connect(dialog, "response", G_CALLBACK(audio_add_response), backup);
-        gtk_widget_show(dialog);
+        gtk_widget_set_visible(dialog, TRUE);
     }
 }
 
@@ -1424,7 +1424,7 @@ audio_add_response (GtkWidget *dialog, int response, GhbValue *backup)
 {
     signal_user_data_t *ud = ghb_ud();
     g_signal_handlers_disconnect_by_data(dialog, backup);
-    gtk_widget_hide(dialog);
+    gtk_widget_set_visible(dialog, FALSE);
     if (response == GTK_RESPONSE_OK)
     {
         ghb_value_free(&backup);
@@ -1507,7 +1507,7 @@ audio_row_activated_cb (GtkTreeView *tv, GtkTreePath *tp,
         GtkWidget *dialog = ghb_builder_widget("audio_dialog");
         gtk_window_set_title(GTK_WINDOW(dialog), _("Edit Audio Track"));
         g_signal_connect(dialog, "response", G_CALLBACK(audio_edit_response), backup);
-        gtk_widget_show(dialog);
+        gtk_widget_set_visible(dialog, TRUE);
     }
 }
 
@@ -1516,7 +1516,7 @@ audio_edit_response (GtkWidget *dialog, int response, GhbValue *backup)
 {
     signal_user_data_t *ud = ghb_ud();
     g_signal_handlers_disconnect_by_data(dialog, backup);
-    gtk_widget_hide(dialog);
+    gtk_widget_set_visible(dialog, FALSE);
     if (response != GTK_RESPONSE_OK)
     {
         GhbValue *audio_dict = ghb_get_job_audio_settings(ud->settings);
@@ -1686,16 +1686,8 @@ static void audio_def_settings_bitrate_show(GtkWidget *widget, gboolean show)
     bitrate_widget = find_widget(widget, "AudioBitrate");
     quality_widget = find_widget(widget, "AudioTrackQualityBox");
 
-    if (show)
-    {
-        gtk_widget_hide(quality_widget);
-        gtk_widget_show(bitrate_widget);
-    }
-    else
-    {
-        gtk_widget_hide(bitrate_widget);
-        gtk_widget_show(quality_widget);
-    }
+    gtk_widget_set_visible(bitrate_widget, show);
+    gtk_widget_set_visible(quality_widget, !show);
 }
 
 static void audio_def_settings_quality_set_sensitive(GtkWidget *w, gboolean s)
@@ -1781,13 +1773,13 @@ create_audio_settings_row (signal_user_data_t *ud)
       _("Set the audio codec to encode this track with."));
     gtk_widget_set_valign(GTK_WIDGET(combo), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(combo), "AudioEncoder");
-    gtk_widget_show(GTK_WIDGET(combo));
+    gtk_widget_set_visible(GTK_WIDGET(combo), TRUE);
     g_signal_connect(combo, "changed", (GCallback)audio_def_encoder_changed_cb, ud);
     gtk_box_append(box2, GTK_WIDGET(combo));
 
     box3 = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
     gtk_widget_set_name(GTK_WIDGET(box3), "br_q_box");
-    gtk_widget_show(GTK_WIDGET(box3));
+    gtk_widget_set_visible(GTK_WIDGET(box3), TRUE);
 
     // Bitrate vs Quality RadioButton
     GtkBox *vbox;
@@ -1801,7 +1793,7 @@ create_audio_settings_row (signal_user_data_t *ud)
     gtk_widget_set_name(radio2, "AudioTrackQualityEnable");
     g_signal_connect(radio2, "toggled", G_CALLBACK(audio_def_quality_enable_changed_cb), ud);
     gtk_box_append(vbox, GTK_WIDGET(radio2));
-    gtk_widget_show(GTK_WIDGET(vbox));
+    gtk_widget_set_visible(GTK_WIDGET(vbox), TRUE);
     gtk_box_append(box3, GTK_WIDGET(vbox));
 
     // Audio Bitrate ComboBox
@@ -1813,7 +1805,7 @@ create_audio_settings_row (signal_user_data_t *ud)
       _("Set the bitrate to encode this track with."));
     gtk_widget_set_valign(GTK_WIDGET(combo), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(combo), "AudioBitrate");
-    gtk_widget_show(GTK_WIDGET(combo));
+    gtk_widget_set_visible(GTK_WIDGET(combo), TRUE);
     g_signal_connect(combo, "changed", (GCallback)audio_def_encode_setting_changed_cb, ud);
     gtk_box_append(box3, GTK_WIDGET(combo));
 
@@ -1840,7 +1832,7 @@ create_audio_settings_row (signal_user_data_t *ud)
 
     gtk_widget_set_valign(GTK_WIDGET(scale), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(scale), "AudioTrackQualityX");
-    gtk_widget_show(GTK_WIDGET(scale));
+    gtk_widget_set_visible(GTK_WIDGET(scale), TRUE);
     g_signal_connect(scale, "value-changed", (GCallback)audio_def_quality_changed_cb, ud);
     gtk_box_append(qbox, GTK_WIDGET(scale));
 
@@ -1850,9 +1842,9 @@ create_audio_settings_row (signal_user_data_t *ud)
     gtk_widget_set_halign(GTK_WIDGET(label), GTK_ALIGN_START);
     gtk_widget_set_valign(GTK_WIDGET(label), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(label), "AudioTrackQualityValue");
-    gtk_widget_show(GTK_WIDGET(label));
+    gtk_widget_set_visible(GTK_WIDGET(label), TRUE);
     gtk_box_append(qbox, GTK_WIDGET(label));
-    gtk_widget_hide(GTK_WIDGET(qbox));
+    gtk_widget_set_visible(GTK_WIDGET(qbox), FALSE);
     gtk_box_append(box3, GTK_WIDGET(qbox));
     gtk_box_append(box2, GTK_WIDGET(box3));
 
@@ -1865,7 +1857,7 @@ create_audio_settings_row (signal_user_data_t *ud)
       _("Set the mixdown of the output audio track."));
     gtk_widget_set_valign(GTK_WIDGET(combo), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(combo), "AudioMixdown");
-    gtk_widget_show(GTK_WIDGET(combo));
+    gtk_widget_set_visible(GTK_WIDGET(combo), TRUE);
     g_signal_connect(combo, "changed", (GCallback)audio_def_encode_setting_changed_cb, ud);
     gtk_box_append(box2, GTK_WIDGET(combo));
 
@@ -1878,13 +1870,13 @@ create_audio_settings_row (signal_user_data_t *ud)
       _("Set the sample rate of the output audio track."));
     gtk_widget_set_valign(GTK_WIDGET(combo), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(combo), "AudioSamplerate");
-    gtk_widget_show(GTK_WIDGET(combo));
+    gtk_widget_set_visible(GTK_WIDGET(combo), TRUE);
     g_signal_connect(combo, "changed", (GCallback)audio_def_encode_setting_changed_cb, ud);
     gtk_box_append(box2, GTK_WIDGET(combo));
 
     box3 = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
     gtk_widget_set_name(GTK_WIDGET(box3), "gain_box");
-    gtk_widget_show(GTK_WIDGET(box3));
+    gtk_widget_set_visible(GTK_WIDGET(box3), TRUE);
 
     // Audio Gain ScaleButton
     const gchar *gain_icons[] = {
@@ -1902,7 +1894,7 @@ create_audio_settings_row (signal_user_data_t *ud)
 
     gtk_widget_set_valign(GTK_WIDGET(scale), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(scale), "AudioTrackGainSlider");
-    gtk_widget_show(GTK_WIDGET(scale));
+    gtk_widget_set_visible(GTK_WIDGET(scale), TRUE);
     g_signal_connect(scale, "value-changed", (GCallback)audio_def_gain_changed_cb, ud);
     gtk_box_append(box3, GTK_WIDGET(scale));
 
@@ -1912,13 +1904,13 @@ create_audio_settings_row (signal_user_data_t *ud)
     gtk_widget_set_halign(GTK_WIDGET(label), GTK_ALIGN_START);
     gtk_widget_set_valign(GTK_WIDGET(label), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(label), "AudioTrackGainValue");
-    gtk_widget_show(GTK_WIDGET(label));
+    gtk_widget_set_visible(GTK_WIDGET(label), TRUE);
     gtk_box_append(box3, GTK_WIDGET(label));
     gtk_box_append(box2, GTK_WIDGET(box3));
 
     box3 = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
     gtk_widget_set_name(GTK_WIDGET(box3), "drc_box");
-    gtk_widget_show(GTK_WIDGET(box3));
+    gtk_widget_set_visible(GTK_WIDGET(box3), TRUE);
 
     // Audio DRC ComboBox
     const gchar *drc_icons[] = {
@@ -1936,7 +1928,7 @@ create_audio_settings_row (signal_user_data_t *ud)
 
     gtk_widget_set_valign(GTK_WIDGET(scale), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(scale), "AudioTrackDRCSlider");
-    gtk_widget_show(GTK_WIDGET(scale));
+    gtk_widget_set_visible(GTK_WIDGET(scale), TRUE);
     g_signal_connect(scale, "value-changed", (GCallback)audio_def_drc_changed_cb, ud);
     gtk_box_append(box3, GTK_WIDGET(scale));
 
@@ -1946,7 +1938,7 @@ create_audio_settings_row (signal_user_data_t *ud)
     gtk_widget_set_halign(GTK_WIDGET(label), GTK_ALIGN_START);
     gtk_widget_set_valign(GTK_WIDGET(label), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(label), "AudioTrackDRCValue");
-    gtk_widget_show(GTK_WIDGET(label));
+    gtk_widget_set_visible(GTK_WIDGET(label), TRUE);
     gtk_box_append(box3, GTK_WIDGET(label));
     gtk_box_append(box2, GTK_WIDGET(box3));
 
@@ -1962,14 +1954,14 @@ create_audio_settings_row (signal_user_data_t *ud)
     gtk_widget_set_valign(GTK_WIDGET(button), GTK_ALIGN_CENTER);
     gtk_widget_set_halign(GTK_WIDGET(button), GTK_ALIGN_END);
     gtk_widget_set_name(GTK_WIDGET(button), "remove_button");
-    gtk_widget_show(GTK_WIDGET(button));
+    gtk_widget_set_visible(GTK_WIDGET(button), TRUE);
     g_signal_connect(button, "clicked", (GCallback)audio_def_setting_remove_cb, ud);
     gtk_box_append(box2, GTK_WIDGET(button));
 
-    gtk_widget_show(GTK_WIDGET(box2));
+    gtk_widget_set_visible(GTK_WIDGET(box2), TRUE);
     gtk_box_append(box, GTK_WIDGET(box2));
 
-    gtk_widget_show(GTK_WIDGET(box));
+    gtk_widget_set_visible(GTK_WIDGET(box), TRUE);
 
     GtkWidget *widget;
     GtkRequisition nat_req;
diff --git a/gtk/src/callbacks.c b/gtk/src/callbacks.c
index 4cf4f52bdb92..95544c85b34b 100644
--- a/gtk/src/callbacks.c
+++ b/gtk/src/callbacks.c
@@ -1431,10 +1431,10 @@ show_scan_progress(signal_user_data_t *ud)
     GtkLabel       * label;
 
     widget = ghb_builder_widget("SourceInfoBox");
-    gtk_widget_hide(widget);
+    gtk_widget_set_visible(widget, FALSE);
 
     widget = ghb_builder_widget("SourceScanBox");
-    gtk_widget_show(widget);
+    gtk_widget_set_visible(widget, TRUE);
 
     progress = GTK_PROGRESS_BAR(ghb_builder_widget("scan_prog"));
     gtk_progress_bar_set_fraction(progress, 0);
@@ -1454,10 +1454,10 @@ hide_scan_progress(signal_user_data_t *ud)
     gtk_progress_bar_set_fraction(progress, 1.0);
 
     widget = ghb_builder_widget("SourceScanBox");
-    gtk_widget_hide(widget);
+    gtk_widget_set_visible(widget, FALSE);
 
     widget = ghb_builder_widget("SourceInfoBox");
-    gtk_widget_show(widget);
+    gtk_widget_set_visible(widget, TRUE);
 }
 
 static void
@@ -1650,11 +1650,11 @@ single_title_dialog (GtkFileChooser *chooser)
 
     adj = gtk_adjustment_new(1, 0, 1000, 1, 10, 10);
     spin = gtk_spin_button_new(adj, 1, 0);
-    gtk_widget_show(spin);
+    gtk_widget_set_visible(spin, TRUE);
     msg = gtk_message_dialog_get_message_area(GTK_MESSAGE_DIALOG(dialog));
     gtk_box_append(GTK_BOX(msg), spin);
     g_signal_connect(dialog, "response", G_CALLBACK(single_title_dialog_response), chooser);
-    gtk_widget_show(dialog);
+    gtk_widget_set_visible(dialog, TRUE);
 }
 
 static void
@@ -2319,16 +2319,16 @@ mini_preview_update (gboolean has_preview, signal_user_data_t *ud)
     if (ghb_dict_get_bool(ud->prefs, "ShowMiniPreview") && has_preview)
     {
         widget = ghb_builder_widget("summary_image");
-        gtk_widget_hide(widget);
+        gtk_widget_set_visible(widget, FALSE);
         widget = ghb_builder_widget("summary_preview_image");
-        gtk_widget_show(widget);
+        gtk_widget_set_visible(widget, TRUE);
     }
     else
     {
         widget = ghb_builder_widget("summary_image");
-        gtk_widget_show(widget);
+        gtk_widget_set_visible(widget, TRUE);
         widget = ghb_builder_widget("summary_preview_image");
-        gtk_widget_hide(widget);
+        gtk_widget_set_visible(widget, FALSE);
     }
 }
 
@@ -3916,7 +3916,7 @@ ghb_countdown_dialog_show (const gchar *message, const gchar *action,
 
     g_signal_connect(dialog, "response",
                      G_CALLBACK(countdown_dialog_response), timeout_id);
-    gtk_widget_show(dialog);
+    gtk_widget_set_visible(dialog, TRUE);
 }
 
 G_GNUC_PRINTF(6, 0) static GtkMessageDialog *
@@ -4046,7 +4046,7 @@ ghb_alert_dialog_show (GtkMessageType type, const char *title,
         g_free(message);
     }
     g_signal_connect(dialog, "response", G_CALLBACK(message_dialog_destroy), NULL);
-    gtk_widget_show(dialog);
+    gtk_widget_set_visible(dialog, TRUE);
 }
 
 GtkWidget *
@@ -4117,7 +4117,7 @@ ghb_stop_encode_dialog_show (signal_user_data_t *ud)
         _("Finish Current and Stop"), _("Continue Encoding"));
     g_signal_connect(dialog, "response",
                      G_CALLBACK(stop_encode_dialog_response), ud);
-    gtk_widget_show(dialog);
+    gtk_widget_set_visible(dialog, TRUE);
 }
 
 static void
@@ -4140,7 +4140,7 @@ quit_dialog_show (void)
         _("Your movie will be lost if you don't continue encoding."),
         _("Cancel All and Quit"), NULL, NULL, _("Continue Encoding"));
     g_signal_connect(dialog, "response", G_CALLBACK(quit_dialog_response), NULL);
-    gtk_widget_show(dialog);
+    gtk_widget_set_visible(dialog, TRUE);
 }
 
 static void
@@ -4326,7 +4326,7 @@ ghb_start_next_job(signal_user_data_t *ud)
 
     ghb_log_func();
     progress = ghb_builder_widget("progressbar");
-    gtk_widget_show(progress);
+    gtk_widget_set_visible(progress, TRUE);
 
     count = ghb_array_len(ud->queue);
     for (ii = 0; ii < count; ii++)
@@ -4348,7 +4348,7 @@ ghb_start_next_job(signal_user_data_t *ud)
     ghb_send_notification(GHB_NOTIFY_QUEUE_DONE, 0, ud);
     queue_done_action(ud);
     ghb_update_pending(ud);
-    gtk_widget_hide(progress);
+    gtk_widget_set_visible(progress, FALSE);
     ghb_reset_disk_space_check();
 }
 
@@ -4726,7 +4726,7 @@ ghb_backend_events(signal_user_data_t *ud)
         else
         {
             uninhibit_suspend();
-            gtk_widget_hide(GTK_WIDGET(progress));
+            gtk_widget_set_visible(GTK_WIDGET(progress), FALSE);
             ghb_reset_disk_space_check();
         }
         ghb_save_queue(ud->queue);
diff --git a/gtk/src/chapters.c b/gtk/src/chapters.c
index eaab30b9ce96..b6ec8a7881af 100644
--- a/gtk/src/chapters.c
+++ b/gtk/src/chapters.c
@@ -48,7 +48,7 @@ create_chapter_row (int index, gint64 start, gint64 duration,
     gtk_widget_add_controller(row, econ);
     g_signal_connect(econ, "key-pressed", G_CALLBACK(chapter_keypress_cb), ud);
 
-    gtk_widget_show(row);
+    gtk_widget_set_visible(row, TRUE);
     return row;
 }
 
diff --git a/gtk/src/presets.c b/gtk/src/presets.c
index 1a6f93c6b964..ee8287316ffa 100644
--- a/gtk/src/presets.c
+++ b/gtk/src/presets.c
@@ -2162,7 +2162,7 @@ preset_import_response_cb (GtkFileChooser *chooser, GtkResponseType response,
                     _("Overwrite Preset?"),
                     _("The preset “%s” already exists. Do you want to overwrite it?"),
                     preset_name);
-            gtk_widget_show(GTK_WIDGET(overwrite_dialog));
+            gtk_widget_set_visible(GTK_WIDGET(overwrite_dialog), TRUE);
             g_signal_connect(overwrite_dialog, "response", G_CALLBACK(preset_write_response), data);
         }
         else
@@ -2545,7 +2545,7 @@ preset_save_as_response_cb (GtkDialog *dialog, int response,
                     _("The preset “%s” already exists. Do you want to overwrite it?"),
                     name);
             g_signal_connect(overwrite, "response", G_CALLBACK(preset_save_as_write_cb), dialog);
-            gtk_widget_show(GTK_WIDGET(overwrite));
+            gtk_widget_set_visible(GTK_WIDGET(overwrite), TRUE);
         }
         else
         {
diff --git a/gtk/src/preview.c b/gtk/src/preview.c
index 697f4f364a65..77eb3bc323dc 100644
--- a/gtk/src/preview.c
+++ b/gtk/src/preview.c
@@ -223,7 +223,7 @@ preview_set_render_size(signal_user_data_t *ud, int width, int height)
     if (gtk_window_is_fullscreen(window))
     {
         reset = ghb_builder_widget("preview_reset");
-        gtk_widget_hide(reset);
+        gtk_widget_set_visible(reset, FALSE);
     }
     else
     {
@@ -662,7 +662,7 @@ preview_reset_clicked_cb (GtkWidget *toggle, gpointer data)
         // is reset above.  So assume it got reset and disable the
         // "Source Resolution" button.
         GtkWidget * widget = ghb_builder_widget("preview_reset");
-        gtk_widget_hide(widget);
+        gtk_widget_set_visible(widget, FALSE);
     }
 }
 
diff --git a/gtk/src/queuehandler.c b/gtk/src/queuehandler.c
index abe7b181b908..b5cc1793bc2f 100644
--- a/gtk/src/queuehandler.c
+++ b/gtk/src/queuehandler.c
@@ -1702,7 +1702,7 @@ queue_remove_dialog_show (GhbQueueRow *row)
                 _("Cancel and Remove"), NULL, NULL, _("Continue Encoding"));
 
     g_signal_connect(dialog, "response", G_CALLBACK(queue_remove_response), row);
-    gtk_widget_show(dialog);
+    gtk_widget_set_visible(dialog, TRUE);
 }
 
 static void
diff --git a/gtk/src/subtitlehandler.c b/gtk/src/subtitlehandler.c
index fb23515488d6..dda042fd2863 100644
--- a/gtk/src/subtitlehandler.c
+++ b/gtk/src/subtitlehandler.c
@@ -1234,7 +1234,7 @@ subtitle_add_cb (GSimpleAction *action, GVariant *param, gpointer data)
         GtkWidget *dialog = ghb_builder_widget("subtitle_dialog");
         gtk_window_set_title(GTK_WINDOW(dialog), _("Add Subtitles"));
         g_signal_connect(dialog, "response", G_CALLBACK(subtitle_add_response), backup);
-        gtk_widget_show(dialog);
+        gtk_widget_set_visible(dialog, TRUE);
     }
 }
 
@@ -1243,7 +1243,7 @@ subtitle_add_response (GtkWidget *dialog, int response, GhbValue *backup)
 {
     signal_user_data_t *ud = ghb_ud();
     g_signal_handlers_disconnect_by_data(dialog, backup);
-    gtk_widget_hide(dialog);
+    gtk_widget_set_visible(dialog, FALSE);
     if (response == GTK_RESPONSE_OK)
     {
         ghb_value_free(&backup);
@@ -1296,7 +1296,7 @@ subtitle_add_fas_cb (GSimpleAction *action, GVariant *param, gpointer data)
     GtkWidget *dialog = ghb_builder_widget("subtitle_dialog");
     gtk_window_set_title(GTK_WINDOW(dialog), _("Foreign Audio Scan"));
     g_signal_connect(dialog, "response", G_CALLBACK(subtitle_add_fas_response), backup);
-    gtk_widget_show(dialog);
+    gtk_widget_set_visible(dialog, TRUE);
 }
 
 static void
@@ -1304,7 +1304,7 @@ subtitle_add_fas_response (GtkWidget *dialog, int response, GhbValue *backup)
 {
     signal_user_data_t *ud = ghb_ud();
     g_signal_handlers_disconnect_by_data(dialog, backup);
-    gtk_widget_hide(dialog);
+    gtk_widget_set_visible(dialog, FALSE);
     if (response == GTK_RESPONSE_OK)
     {
         // Disable FAS button
@@ -1810,7 +1810,7 @@ subtitle_edit(GtkTreeView *tv, GtkTreePath *tp, signal_user_data_t *ud)
         GtkWidget *dialog = ghb_builder_widget("subtitle_dialog");
         gtk_window_set_title(GTK_WINDOW(dialog), _("Edit Subtitles"));
         g_signal_connect(dialog, "response", G_CALLBACK(subtitle_edit_response), backup);
-        gtk_widget_show(dialog);
+        gtk_widget_set_visible(dialog, TRUE);
     }
 }
 
@@ -1819,7 +1819,7 @@ subtitle_edit_response (GtkWidget *dialog, int response, GhbValue *backup)
 {
     signal_user_data_t *ud = ghb_ud();
     g_signal_handlers_disconnect_by_data(dialog, backup);
-    gtk_widget_hide(dialog);
+    gtk_widget_set_visible(dialog, FALSE);
     if (response == GTK_RESPONSE_OK)
     {
         ghb_value_free(&backup);
diff --git a/gtk/src/title-add.c b/gtk/src/title-add.c
index c859f2c8e06c..77406a4d0516 100644
--- a/gtk/src/title-add.c
+++ b/gtk/src/title-add.c
@@ -436,7 +436,7 @@ static GtkWidget *title_create_row (signal_user_data_t *ud)
     gtk_box_set_spacing(hbox, 6);
     gtk_widget_set_margin_start(GTK_WIDGET(hbox), 6);
     gtk_widget_set_margin_end(GTK_WIDGET(hbox), 6);
-    gtk_widget_show(GTK_WIDGET(hbox));
+    gtk_widget_set_visible(GTK_WIDGET(hbox), TRUE);
 
     // Select checkbox
     selected = GTK_CHECK_BUTTON(gtk_check_button_new());
@@ -445,7 +445,7 @@ static GtkWidget *title_create_row (signal_user_data_t *ud)
       _("Select this title for adding to the queue.\n"));
     gtk_widget_set_valign(GTK_WIDGET(selected), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(selected), "title_selected");
-    gtk_widget_show(GTK_WIDGET(selected));
+    gtk_widget_set_visible(GTK_WIDGET(selected), TRUE);
     g_signal_connect(selected, "toggled", (GCallback)title_selected_cb, ud);
     gtk_box_append(hbox, GTK_WIDGET(selected));
 
@@ -455,7 +455,7 @@ static GtkWidget *title_create_row (signal_user_data_t *ud)
     gtk_widget_set_halign(GTK_WIDGET(title), GTK_ALIGN_START);
     gtk_widget_set_valign(GTK_WIDGET(title), GTK_ALIGN_CENTER);
     gtk_widget_set_name(GTK_WIDGET(title), "title_label");
-    gtk_widget_show(GTK_WIDGET(title));
+    gtk_widget_set_visible(GTK_WIDGET(title), TRUE);
     gtk_box_append(hbox, GTK_WIDGET(title));
 
     default_title_attrs = gtk_label_get_attributes(title);
@@ -474,7 +474,7 @@ static GtkWidget *title_create_row (signal_user_data_t *ud)
     gtk_editable_set_width_chars(GTK_EDITABLE(dest_file), 40);
     gtk_widget_set_name(dest_file, "title_file");
     //gtk_widget_set_hexpand(dest_file, TRUE);
-    gtk_widget_show(dest_file);
+    gtk_widget_set_visible(dest_file, TRUE);
     g_signal_connect(dest_file, "changed", (GCallback)title_dest_file_cb, ud);
     gtk_box_append(vbox_dest, dest_file);
     dest_dir = ghb_file_button_new(_("Destination Directory"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
@@ -482,9 +482,9 @@ static GtkWidget *title_create_row (signal_user_data_t *ud)
                      G_CALLBACK(title_dest_dir_cb), ud);
     gtk_widget_set_name(GTK_WIDGET(dest_dir), "title_dir");
     gtk_widget_set_hexpand(GTK_WIDGET(dest_dir), TRUE);
-    gtk_widget_show(GTK_WIDGET(dest_dir));
+    gtk_widget_set_visible(GTK_WIDGET(dest_dir), TRUE);
     gtk_box_append(vbox_dest, GTK_WIDGET(dest_dir));
-    gtk_widget_show(GTK_WIDGET(vbox_dest));
+    gtk_widget_set_visible(GTK_WIDGET(vbox_dest), TRUE);
     gtk_box_append(hbox, GTK_WIDGET(vbox_dest));
 
     return GTK_WIDGET(hbox);
diff --git a/gtk/src/util.c b/gtk/src/util.c
index 65c9456be880..b56cfc2ab789 100644
--- a/gtk/src/util.c
+++ b/gtk/src/util.c
@@ -88,7 +88,7 @@ int ghb_dialog_run (GtkDialog *dialog)
         gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
 
     if (!gtk_widget_get_visible(GTK_WIDGET(dialog)))
-        gtk_widget_show(GTK_WIDGET(dialog));
+        gtk_widget_set_visible(GTK_WIDGET(dialog), TRUE);
 
     response_handler = g_signal_connect(dialog,
                                         "response",
