summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gtk/src/callbacks.c132
-rw-r--r--gtk/src/ghb.ui249
-rw-r--r--gtk/src/hb-backend.c101
-rw-r--r--gtk/src/internal_defaults2
-rw-r--r--gtk/src/internal_defaults.h2
-rw-r--r--gtk/src/main.c12
-rw-r--r--gtk/src/settings.c142
7 files changed, 496 insertions, 144 deletions
diff --git a/gtk/src/callbacks.c b/gtk/src/callbacks.c
index 803737241..fe64e2763 100644
--- a/gtk/src/callbacks.c
+++ b/gtk/src/callbacks.c
@@ -78,6 +78,7 @@ static dependency_t dep_map[] =
{"variable_frame_rate", "framerate", "enable", TRUE},
{"variable_frame_rate", "detelecine", "enable", TRUE},
{"decomb", "deinterlace", "enable", TRUE},
+ {"decomb", "tweak_deinterlace", "enable", TRUE},
{"autocrop", "crop_top", "disable", FALSE},
{"autocrop", "crop_bottom", "disable", FALSE},
{"autocrop", "crop_left", "disable", FALSE},
@@ -1204,6 +1205,58 @@ setting_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
clear_presets_selection(ud);
}
+static void
+validate_filter_widget(signal_user_data_t *ud, const gchar *name)
+{
+ GtkTreeModel *store;
+ GtkTreeIter iter;
+ const gchar *str;
+ gboolean foundit = FALSE;
+ GtkComboBox *combo = GTK_COMBO_BOX(GHB_WIDGET(ud->builder, name));
+ if (ghb_widget_index(GTK_WIDGET(combo)) < 0)
+ { // Validate user input
+ const gchar *val = ghb_settings_get_string(ud->settings, name);
+ store = gtk_combo_box_get_model(combo);
+ // Check to see if user manually entered one of the combo options
+ if (gtk_tree_model_get_iter_first(store, &iter))
+ {
+ do
+ {
+ gtk_tree_model_get(store, &iter, 0, &str, -1);
+ if (strcasecmp(val, str) == 0)
+ {
+ gtk_combo_box_set_active_iter(combo, &iter);
+ foundit = TRUE;
+ break;
+ }
+ } while (gtk_tree_model_iter_next(store, &iter));
+ }
+ if (!foundit)
+ { // validate format of filter string
+ if (!ghb_validate_filter_string(val, -1))
+ gtk_combo_box_set_active(combo, 0);
+ }
+ }
+}
+
+gboolean
+deint_tweak_focus_out_cb(GtkWidget *widget, GdkEventFocus *event,
+ signal_user_data_t *ud)
+{
+ g_debug("deint_tweak_focus_out_cb ()\n");
+ validate_filter_widget(ud, "tweak_deinterlace");
+ return FALSE;
+}
+
+gboolean
+denoise_tweak_focus_out_cb(GtkWidget *widget, GdkEventFocus *event,
+ signal_user_data_t *ud)
+{
+ g_debug("denoise_tweak_focus_out_cb ()\n");
+ validate_filter_widget(ud, "tweak_noise");
+ return FALSE;
+}
+
void
http_opt_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
{
@@ -3323,6 +3376,59 @@ pref_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
}
void
+tweaks_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+ g_debug("tweaks_changed_cb\n");
+ ghb_widget_to_setting (ud->settings, widget);
+ const gchar *name = gtk_widget_get_name(widget);
+ ghb_pref_save(ud->settings, name);
+
+ gboolean tweaks = ghb_settings_get_bool(ud->settings, "allow_tweaks");
+ widget = GHB_WIDGET(ud->builder, "deinterlace");
+ tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
+ widget = GHB_WIDGET(ud->builder, "tweak_deinterlace");
+ !tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
+
+ widget = GHB_WIDGET(ud->builder, "denoise");
+ tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
+ widget = GHB_WIDGET(ud->builder, "tweak_denoise");
+ !tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
+ if (tweaks)
+ {
+ const gchar *str;
+ str = ghb_settings_get_short_opt(ud->settings, "deinterlace");
+ ghb_ui_update(ud, "tweak_deinterlace", str);
+ str = ghb_settings_get_short_opt(ud->settings, "denoise");
+ ghb_ui_update(ud, "tweak_denoise", str);
+ }
+ else
+ {
+ const gchar *str;
+ str = ghb_settings_get_short_opt(ud->settings, "tweak_deinterlace");
+ ghb_ui_update(ud, "deinterlace", str);
+ str = ghb_settings_get_short_opt(ud->settings, "tweak_denoise");
+ ghb_ui_update(ud, "denoise", str);
+ }
+}
+
+void
+hbfd_feature_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+ g_debug("hbfd_feature_changed_cb\n");
+ ghb_widget_to_setting (ud->settings, widget);
+ const gchar *name = gtk_widget_get_name(widget);
+ ghb_pref_save(ud->settings, name);
+
+ gboolean hbfd = ghb_settings_get_bool(ud->settings, "hbfd_feature");
+ GtkAction *action;
+ gint val;
+ val = ghb_settings_get_int(ud->settings, "hbfd");
+ ghb_ui_update_int(ud, "hbfd", hbfd && val);
+ action = GHB_ACTION (ud->builder, "hbfd");
+ gtk_action_set_visible(action, hbfd);
+}
+
+void
ghb_file_menu_add_dvd(signal_user_data_t *ud)
{
GList *link, *drives;
@@ -3574,3 +3680,29 @@ tweak_setting_cb(
return ret;
}
+gboolean
+easter_egg_cb(
+ GtkWidget *widget,
+ GdkEventButton *event,
+ signal_user_data_t *ud)
+{
+ g_debug("press %d %d", event->type, event->button);
+ if (event->type == GDK_3BUTTON_PRESS && event->button == 1)
+ { // Its a tripple left mouse button click
+ GtkWidget *widget;
+ widget = GHB_WIDGET(ud->builder, "allow_tweaks");
+ gtk_widget_show(widget);
+ widget = GHB_WIDGET(ud->builder, "hbfd_feature");
+ gtk_widget_show(widget);
+ }
+ else if (event->type == GDK_BUTTON_PRESS && event->button == 1)
+ {
+ GtkWidget *widget;
+ widget = GHB_WIDGET(ud->builder, "allow_tweaks");
+ gtk_widget_hide(widget);
+ widget = GHB_WIDGET(ud->builder, "hbfd_feature");
+ gtk_widget_hide(widget);
+ }
+ return FALSE;
+}
+
diff --git a/gtk/src/ghb.ui b/gtk/src/ghb.ui
index 594388be3..9128e7ef8 100644
--- a/gtk/src/ghb.ui
+++ b/gtk/src/ghb.ui
@@ -1337,6 +1337,7 @@
<object class="GtkCheckButton" id="deblock">
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <property name="tooltip-text" translatable="yes">This is a filter that gets applied before encoding. If the source looks blocky before encoding, you may want to use this.</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Deblock</property>
<property name="draw_indicator">True</property>
@@ -1353,22 +1354,14 @@
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <object class="GtkEventBox" id="tweak_deinterlace">
+ <object class="GtkLabel" id="label20">
<property name="visible">True</property>
- <property name="visible_window">False</property>
- <property name="above_child">True</property>
- <signal name="button_press_event" handler="tweak_setting_cb"/>
- <child>
- <object class="GtkLabel" id="label20">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="selectable">False</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Deinterlace:</property>
- <property name="width_chars">10</property>
- </object>
- </child>
+ <property name="can_focus">True</property>
+ <property name="selectable">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Deinterlace:</property>
+ <property name="width_chars">10</property>
</object>
<packing>
<property name="expand">False</property>
@@ -1386,6 +1379,23 @@
<property name="position">1</property>
</packing>
</child>
+ <child>
+ <object class="GtkComboBoxEntry" id="tweak_deinterlace">
+ <property name="visible">False</property>
+ <signal handler="setting_widget_changed_cb" name="changed"/>
+ <child internal-child="entry">
+ <object class="GtkEntry" id="comboboxentry-entry1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <signal handler="deint_tweak_focus_out_cb" name="focus_out_event"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="expand">False</property>
@@ -1398,21 +1408,13 @@
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <object class="GtkEventBox" id="tweak_denoise">
+ <object class="GtkLabel" id="label21">
<property name="visible">True</property>
- <property name="visible_window">False</property>
- <property name="above_child">True</property>
- <signal name="button_press_event" handler="tweak_setting_cb"/>
- <child>
- <object class="GtkLabel" id="label21">
- <property name="visible">True</property>
- <property name="selectable">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Denoise:</property>
- <property name="width_chars">10</property>
- </object>
- </child>
+ <property name="selectable">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Denoise:</property>
+ <property name="width_chars">10</property>
</object>
<packing>
<property name="expand">False</property>
@@ -1430,6 +1432,23 @@
<property name="position">1</property>
</packing>
</child>
+ <child>
+ <object class="GtkComboBoxEntry" id="tweak_denoise">
+ <property name="visible">False</property>
+ <signal handler="setting_widget_changed_cb" name="changed"/>
+ <child internal-child="entry">
+ <object class="GtkEntry" id="comboboxentry-entry2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <signal handler="denoise_tweak_focus_out_cb" name="focus_out_event"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="expand">False</property>
@@ -3314,97 +3333,155 @@ no-fast-pskip=0:no-dct-decimate=0:cabac=1</property>
<property name="skip_taskbar_hint">True</property>
<property name="skip_pager_hint">True</property>
<property name="has_separator">False</property>
- <signal handler="gtk_widget_hide_on_delete" name="delete_event"/>
+ <signal name="delete_event" handler="gtk_widget_hide_on_delete"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox6">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
- <object class="GtkFrame" id="frame16">
+ <object class="GtkHBox" id="hbox24">
<property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_OUT</property>
<child>
- <object class="GtkAlignment" id="alignment2">
+ <object class="GtkVBox" id="vbox19">
<property name="visible">True</property>
- <property name="left_padding">12</property>
<child>
- <object class="GtkVBox" id="vbox29">
+ <object class="GtkEventBox" id="eventbox1">
<property name="visible">True</property>
+ <property name="events">GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="visible_window">False</property>
+ <property name="above_child">True</property>
+ <signal name="button_press_event" handler="easter_egg_cb"/>
<child>
- <object class="GtkCheckButton" id="use_source_name">
+ <object class="GtkImage" id="image3">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip-text" translatable="yes">The destination filename will be automatically
-generated from the source filename or volume
-label.</property>
- <property name="label" translatable="yes">Derive destination name from source</property>
- <property name="draw_indicator">True</property>
- <signal handler="pref_changed_cb" name="toggled"/>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="icon_size">6</property>
+ <property name="icon_name">hb-icon</property>
</object>
</child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame16">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_OUT</property>
+ <child>
+ <object class="GtkAlignment" id="alignment6">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
<child>
- <object class="GtkCheckButton" id="linear_vquality">
+ <object class="GtkVBox" id="vbox29">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip-text" translatable="yes">x264 uses a different scale for video quality than
+ <child>
+ <object class="GtkCheckButton" id="use_source_name">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text">The destination filename will be automatically
+generated from the source filename or volume
+label.</property>
+ <property name="label" translatable="yes">Derive destination name from source</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="linear_vquality">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text">x264 uses a different scale for video quality than
other codecs. This adjusts the scale so that
similar values give similar quality across all the
video codecs.</property>
- <property name="label" translatable="yes">Adjust x264 video quality scale</property>
- <property name="draw_indicator">True</property>
- <signal handler="pref_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="noscale">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip-text" translatable="yes">When picture settings require that the image
+ <property name="label" translatable="yes">Adjust x264 video quality scale</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="noscale">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text">When picture settings require that the image
dimensions be rounded to some multiple number
of pixels. This setting will crop a few extra pixels
instead of doing exact cropping and scaling to
the required multiple.</property>
- <property name="label" translatable="yes">Loose cropping</property>
- <property name="draw_indicator">True</property>
- <signal handler="pref_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="directqp">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip-text" translatable="yes">HandBrake allows entry of QP/CRF values for x264
+ <property name="label" translatable="yes">Loose cropping</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="directqp">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text">HandBrake allows entry of QP/CRF values for x264
and FFMPEG instead of the percentage metric.
This preference is associated with the current
preset only.
You *MUST* save the current preset to preserve
this setting.</property>
- <property name="label" translatable="yes">Allow direct QP/CRF</property>
- <property name="draw_indicator">True</property>
- <signal handler="vcodec_changed_cb" name="toggled"/>
+ <property name="label" translatable="yes">Allow direct QP/CRF</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="vcodec_changed_cb"/>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="allow_tweaks">
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Allow Tweaks</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="tweaks_changed_cb"/>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="hbfd_feature">
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Allow HandBrake For Dummies</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="hbfd_feature_changed_cb"/>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
</object>
- <packing>
- <property name="position">3</property>
- </packing>
</child>
</object>
</child>
+ <child type="label">
+ <object class="GtkLabel" id="label18">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Preferences&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
</object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label7">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Preferences&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
<packing>
diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c
index 376166426..bba5cac61 100644
--- a/gtk/src/hb-backend.c
+++ b/gtk/src/hb-backend.c
@@ -837,6 +837,28 @@ init_combo_box(GtkBuilder *builder, const gchar *name)
"text", 0, "sensitive", 1, NULL);
}
+// Set up the model for the combo box
+static void
+init_combo_box_entry(GtkBuilder *builder, const gchar *name)
+{
+ GtkComboBox *combo;
+ GtkListStore *store;
+
+ g_debug("init_combo_box_entry() %s\n", name);
+ // First modify the combobox model to allow greying out of options
+ combo = GTK_COMBO_BOX(GHB_WIDGET(builder, name));
+ // Store contains:
+ // 1 - String to display
+ // 2 - bool indicating whether the entry is selectable (grey or not)
+ // 3 - String that is used for presets
+ // 4 - Int value determined by backend
+ // 5 - String value determined by backend
+ store = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_BOOLEAN,
+ G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING);
+ gtk_combo_box_set_model(combo, GTK_TREE_MODEL(store));
+ gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(combo), 0);
+}
+
static void
audio_bitrate_opts_set(GtkBuilder *builder, const gchar *name, hb_rate_t *rates, gint count)
{
@@ -1383,8 +1405,12 @@ ghb_update_ui_combo_box(GtkBuilder *builder, const gchar *name, gint user_data,
generic_opts_set(builder, "container", &container_opts);
if (all || strcmp(name, "deinterlace") == 0)
generic_opts_set(builder, "deinterlace", &deint_opts);
+ if (all || strcmp(name, "tweak_deinterlace") == 0)
+ generic_opts_set(builder, "tweak_deinterlace", &deint_opts);
if (all || strcmp(name, "denoise") == 0)
generic_opts_set(builder, "denoise", &denoise_opts);
+ if (all || strcmp(name, "tweak_denoise") == 0)
+ generic_opts_set(builder, "tweak_denoise", &denoise_opts);
if (all || strcmp(name, "video_codec") == 0)
generic_opts_set(builder, "video_codec", &vcodec_opts);
if (all || strcmp(name, "audio_codec") == 0)
@@ -1418,7 +1444,9 @@ init_ui_combo_boxes(GtkBuilder *builder)
init_combo_box(builder, "audio_track");
init_combo_box(builder, "container");
init_combo_box(builder, "deinterlace");
+ init_combo_box_entry(builder, "tweak_deinterlace");
init_combo_box(builder, "denoise");
+ init_combo_box_entry(builder, "tweak_denoise");
init_combo_box(builder, "video_codec");
init_combo_box(builder, "audio_codec");
init_combo_box(builder, "x264_direct");
@@ -2054,6 +2082,7 @@ ghb_validate_filters(signal_user_data_t *ud)
{
gboolean tweaks;
const gchar *str;
+ gint index;
gchar *message;
gboolean enabled;
@@ -2085,16 +2114,19 @@ ghb_validate_filters(signal_user_data_t *ud)
return FALSE;
}
// deinte 4
- str = ghb_settings_get_string(ud->settings, "tweak_deinterlace");
- enabled = ghb_settings_get_bool(ud->settings, "deinterlace");
- if (enabled && !ghb_validate_filter_string(str, 4))
+ index = ghb_settings_get_index(ud->settings, "tweak_deinterlace");
+ if (index < 0)
{
- message = g_strdup_printf(
- "Invalid Deinterlace Settings:\n\n%s\n",
- str);
- ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
- g_free(message);
- return FALSE;
+ str = ghb_settings_get_string(ud->settings, "tweak_deinterlace");
+ if (!ghb_validate_filter_string(str, 4))
+ {
+ message = g_strdup_printf(
+ "Invalid Deinterlace Settings:\n\n%s\n",
+ str);
+ ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+ g_free(message);
+ return FALSE;
+ }
}
// debloc 2
str = ghb_settings_get_string(ud->settings, "tweak_deblock");
@@ -2109,16 +2141,19 @@ ghb_validate_filters(signal_user_data_t *ud)
return FALSE;
}
// denois 4
- str = ghb_settings_get_string(ud->settings, "tweak_denoise");
- enabled = ghb_settings_get_bool(ud->settings, "denoise");
- if (enabled && !ghb_validate_filter_string(str, 4))
+ index = ghb_settings_get_index(ud->settings, "tweak_denoise");
+ if (index < 0)
{
- message = g_strdup_printf(
- "Invalid Denoise Settings:\n\n%s\n",
- str);
- ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
- g_free(message);
- return FALSE;
+ str = ghb_settings_get_string(ud->settings, "tweak_denoise");
+ if (!ghb_validate_filter_string(str, 4))
+ {
+ message = g_strdup_printf(
+ "Invalid Denoise Settings:\n\n%s\n",
+ str);
+ ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+ g_free(message);
+ return FALSE;
+ }
}
}
return TRUE;
@@ -2534,7 +2569,8 @@ ghb_add_job(job_settings_t *js, gint unique_id)
gboolean decomb = ghb_settings_get_bool(settings, "decomb");
- gint deint = ghb_settings_get_int(settings, "deinterlace");
+ gint deint = ghb_settings_get_int(
+ settings, tweaks ? "tweak_deinterlace":"deinterlace");
if (!decomb)
job->deinterlace = (deint == 0) ? 0 : 1;
else
@@ -2596,16 +2632,8 @@ ghb_add_job(job_settings_t *js, gint unique_id)
}
if( job->deinterlace )
{
- hb_filter_deinterlace.settings = (gchar*)ghb_settings_get_string(settings, "deinterlace");
- if (tweaks)
- {
- const gchar *str;
- str = ghb_settings_get_string(settings, "tweak_deinterlace");
- if (str && str[0])
- {
- hb_filter_deinterlace.settings = (gchar*)str;
- }
- }
+ hb_filter_deinterlace.settings = (gchar*)ghb_settings_get_string(
+ settings, tweaks ? "tweak_deinterlace" : "deinterlace");
hb_list_add( job->filters, &hb_filter_deinterlace );
}
if( ghb_settings_get_bool(settings, "deblock") )
@@ -2622,19 +2650,12 @@ ghb_add_job(job_settings_t *js, gint unique_id)
}
hb_list_add( job->filters, &hb_filter_deblock );
}
- gint denoise = ghb_settings_get_int(settings, "denoise");
+ gint denoise = ghb_settings_get_int(
+ settings, tweaks ? "tweak_denoise" : "denoise");
if( denoise != 0 )
{
- hb_filter_denoise.settings = (gchar*)ghb_settings_get_string(settings, "denoise");
- if (tweaks)
- {
- const gchar *str;
- str = ghb_settings_get_string(settings, "tweak_denoise");
- if (str && str[0])
- {
- hb_filter_denoise.settings = (gchar*)str;
- }
- }
+ hb_filter_denoise.settings = (gchar*)ghb_settings_get_string(
+ settings, tweaks ? "tweak_denoise" : "denoise");
hb_list_add( job->filters, &hb_filter_denoise );
}
job->width = ghb_settings_get_int(settings, "scale_width");
diff --git a/gtk/src/internal_defaults b/gtk/src/internal_defaults
index 4fb15f229..258653dc4 100644
--- a/gtk/src/internal_defaults
+++ b/gtk/src/internal_defaults
@@ -27,8 +27,6 @@ deblock=disable
tweak_decomb=
tweak_detelecine=
tweak_deblock=
-tweak_deinterlace=
-tweak_denoise=
grayscale=disable
video_codec=x264
two_pass=disable
diff --git a/gtk/src/internal_defaults.h b/gtk/src/internal_defaults.h
index fbd2d3506..f1b6b7e51 100644
--- a/gtk/src/internal_defaults.h
+++ b/gtk/src/internal_defaults.h
@@ -27,8 +27,6 @@
"tweak_decomb=\n"
"tweak_detelecine=\n"
"tweak_deblock=\n"
-"tweak_deinterlace=\n"
-"tweak_denoise=\n"
"grayscale=disable\n"
"video_codec=x264\n"
"two_pass=disable\n"
diff --git a/gtk/src/main.c b/gtk/src/main.c
index 18d64da13..3c4039cff 100644
--- a/gtk/src/main.c
+++ b/gtk/src/main.c
@@ -548,6 +548,18 @@ main (int argc, char *argv[])
ghb_hbfd(ud, TRUE);
}
const gchar *source = ghb_settings_get_string(ud->settings, "default_source");
+ gboolean tweaks = ghb_settings_get_bool(ud->settings, "allow_tweaks");
+ GtkWidget *widget;
+ widget = GHB_WIDGET(ud->builder, "deinterlace");
+ tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
+ widget = GHB_WIDGET(ud->builder, "tweak_deinterlace");
+ !tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
+
+ widget = GHB_WIDGET(ud->builder, "denoise");
+ tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
+ widget = GHB_WIDGET(ud->builder, "tweak_denoise");
+ !tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
+
ghb_dvd_set_current(source, ud);
// Start the show.
window = GHB_WIDGET (ud->builder, "hb_window");
diff --git a/gtk/src/settings.c b/gtk/src/settings.c
index 662561038..da43a9877 100644
--- a/gtk/src/settings.c
+++ b/gtk/src/settings.c
@@ -92,7 +92,7 @@ static void
settings_set(GHashTable *settings, const gchar *key,
const gchar *str, gint val, gdouble dbl)
{
- g_debug("ghb_setting_set () key (%s), svalue (%s), ivalue %d, dvalue %.2g\n", key, str, val, dbl);
+ g_debug("setting_set () key (%s), svalue (%s), ivalue %d, dvalue %.2g\n", key, str, val, dbl);
setting_value_t *value = g_malloc(sizeof(setting_value_t));
if (str != NULL)
value->svalue = g_strdup(str);
@@ -128,7 +128,9 @@ ghb_settings_set(GHashTable *settings, const gchar *key, setting_value_t *value)
g_debug("Bad key or value\n");
return;
}
- g_debug("\tkey (%s) -- value (%s)\n", key, value->svalue);
+ g_debug("ghb_settings_set key (%s) -- value (%d,%d,%s,%s,%s)\n", key,
+ value->index, value->ivalue, value->option, value->shortOpt,
+ value->svalue);
g_hash_table_insert(settings, g_strdup(key), value);
}
@@ -435,7 +437,6 @@ ghb_widget_value(GtkWidget *widget)
gtk_tree_model_get(store, &iter, 0, &option, 2, &shortOpt,
3, &ivalue, 4, &svalue, -1);
- g_debug("\tcombo: index %d opt (%s) Short Opt (%s) value %d\n", index, option, shortOpt, ivalue);
value->option = option;
value->shortOpt = shortOpt;
value->svalue = svalue;
@@ -453,6 +454,39 @@ ghb_widget_value(GtkWidget *widget)
value->dvalue = 0;
}
}
+ else if (type == GTK_TYPE_COMBO_BOX_ENTRY)
+ {
+ GtkTreeModel *store;
+ GtkTreeIter iter;
+ gchar *shortOpt, *option, *svalue;
+ gint ivalue;
+ gint index = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
+
+ store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
+ if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
+ {
+ gtk_tree_model_get(store, &iter, 0, &option, 2, &shortOpt,
+ 3, &ivalue, 4, &svalue, -1);
+
+ value->option = option;
+ value->shortOpt = shortOpt;
+ value->svalue = svalue;
+ value->index = index;
+ value->ivalue = ivalue;
+ value->dvalue = ivalue;
+ }
+ else
+ {
+ const gchar *str = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget));
+ if (str == NULL) str = "";
+ value->option = g_strdup(str);
+ value->shortOpt = g_strdup(str);
+ value->svalue = g_strdup(str);
+ value->index = -1;
+ value->ivalue = -1;
+ value->dvalue = 0;
+ }
+ }
else if (type == GTK_TYPE_SPIN_BUTTON)
{
value->index = 0;
@@ -674,7 +708,7 @@ update_widget(GtkWidget *widget, const gchar *parm_svalue, gint parm_ivalue)
gint ivalue;
gboolean foundit = FALSE;
- g_debug("combo");
+ g_debug("combo (%s)", value);
store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
if (gtk_tree_model_get_iter_first (store, &iter))
{
@@ -703,6 +737,47 @@ update_widget(GtkWidget *widget, const gchar *parm_svalue, gint parm_ivalue)
gtk_combo_box_set_active (GTK_COMBO_BOX(widget), 0);
}
}
+ else if (type == GTK_TYPE_COMBO_BOX_ENTRY)
+ {
+ GtkTreeModel *store;
+ GtkTreeIter iter;
+ gchar *shortOpt;
+ gint ivalue;
+ gboolean foundit = FALSE;
+
+ g_debug("GTK_COMBO_BOX_ENTRY");
+ store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
+ if (gtk_tree_model_get_iter_first (store, &iter))
+ {
+ do
+ {
+ gtk_tree_model_get(store, &iter, 2, &shortOpt, 3, &ivalue, -1);
+ if (parm_svalue == NULL && ivalue == parm_ivalue)
+ {
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX(widget), &iter);
+ g_free(shortOpt);
+ foundit = TRUE;
+ break;
+ }
+ else if (strcmp(shortOpt, value) == 0)
+ {
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX(widget), &iter);
+ g_free(shortOpt);
+ foundit = TRUE;
+ break;
+ }
+ g_free(shortOpt);
+ } while (gtk_tree_model_iter_next (store, &iter));
+ }
+ if (!foundit)
+ {
+ GtkEntry *entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(widget)));
+ if (entry)
+ {
+ gtk_entry_set_text (entry, value);
+ }
+ }
+ }
else if (type == GTK_TYPE_SPIN_BUTTON)
{
gdouble val;
@@ -967,6 +1042,28 @@ ghb_presets_get_name(gint index)
return result;
}
+static gchar*
+preset_get_string(
+ GKeyFile *keyFile,
+ const gchar *name,
+ const gchar *key)
+{
+ gchar *str;
+
+ g_debug("preset (%s) key (%s)\n", name, key);
+ str = NULL;
+ if (name != NULL && keyFile != NULL)
+ {
+ str = g_key_file_get_string(keyFile, name, key, NULL);
+ g_debug("(%s, %s)\n", key, str);
+ }
+ if (str == NULL)
+ {
+ str = g_key_file_get_string(internalKeyFile, "Presets", key, NULL);
+ }
+ return str;
+}
+
static gboolean
init_presets_hash_from_key_file(signal_user_data_t *ud, const gchar *name, GKeyFile *keyFile)
{
@@ -983,16 +1080,7 @@ init_presets_hash_from_key_file(signal_user_data_t *ud, const gchar *name, GKeyF
for (ii = 0; keys[ii] != NULL; ii++)
{
g_debug("key (%s)\n", keys[ii]);
- str = NULL;
- if (name != NULL && keyFile != NULL)
- {
- str = g_key_file_get_string(keyFile, name, keys[ii], NULL);
- g_debug("(%s, %s)\n", keys[ii], str);
- }
- if (str == NULL)
- {
- str = g_key_file_get_string(internalKeyFile, "Presets", keys[ii], NULL);
- }
+ str = preset_get_string(keyFile, name, keys[ii]);
if (str != NULL)
{
g_debug("name (%s): key (%s) -- str (%s)\n", name, keys[ii], str);
@@ -1024,6 +1112,22 @@ preset_to_ui(signal_user_data_t *ud, presets_data_t *data)
// Initialize from preset
init_presets_hash_from_key_file(ud, data->name, data->keyFile);
}
+ if (ghb_settings_get_bool(ud->settings, "allow_tweaks"))
+ {
+ gchar *str;
+ str = preset_get_string(data->keyFile, data->name, "deinterlace");
+ if (str)
+ {
+ ghb_ui_update(ud, "tweak_deinterlace", str);
+ g_free(str);
+ }
+ str = preset_get_string(data->keyFile, data->name, "denoise");
+ if (str)
+ {
+ ghb_ui_update(ud, "tweak_denoise", str);
+ g_free(str);
+ }
+ }
}
static void
@@ -1506,6 +1610,16 @@ ghb_settings_save(signal_user_data_t *ud, const gchar *name)
g_debug("ghb_settings_save ()\n");
ski.name = name;
ski.keyFile = customKeyFile;
+ if (ghb_settings_get_bool(ud->settings, "allow_tweaks"))
+ {
+ const gchar *str;
+ str = ghb_settings_get_short_opt(ud->settings, "tweak_deinterlace");
+ if (str)
+ ghb_settings_set_string(ud->settings, "deinterlace", str);
+ str = ghb_settings_get_short_opt(ud->settings, "tweak_denoise");
+ if (str)
+ ghb_settings_set_string(ud->settings, "denoise", str);
+ }
ski.autoscale = ghb_settings_get_bool (ud->settings, "autoscale");
g_hash_table_foreach(ud->settings, store_to_key_file, &ski);
presets_store();