]> granicus.if.org Git - handbrake/commitdiff
LinGui: Add preset selection menu
authorJohn Stebbins <jstebbins.hb@gmail.com>
Fri, 15 Sep 2017 23:27:22 +0000 (16:27 -0700)
committerJohn Stebbins <jstebbins.hb@gmail.com>
Mon, 6 Nov 2017 16:19:49 +0000 (08:19 -0800)
And convert appliction to a GtkApplication.  This allows the use of
GActions for menu and other control actions.  It's a cleaner simpler
interface that automatically tracks when multiple widgets perform the
same action and keeps their state in sync.

16 files changed:
gtk/src/callbacks.c
gtk/src/data_res.gresource.xml
gtk/src/ghb.m4
gtk/src/hb-backend.c
gtk/src/icon_res.gresource.xml
gtk/src/icons.c
gtk/src/main.c
gtk/src/makedeps.py
gtk/src/presets.c
gtk/src/presets.h
gtk/src/preview.c
gtk/src/preview.h
gtk/src/queuehandler.c
gtk/src/resources.c
gtk/src/settings.h
gtk/src/ui_res.gresource.xml

index 5ac796680f4c72ebfc386de948c450a7fb6a6a3a..91dfc63474912cac8b3f13119126b5b68333442f 100644 (file)
@@ -305,24 +305,23 @@ ghb_check_all_depencencies(signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-on_quit1_activate(GtkMenuItem *quit, signal_user_data_t *ud)
+quit_action_cb(GSimpleAction *action, GVariant *param, signal_user_data_t *ud)
 {
     gint state = ghb_get_queue_state();
-    g_debug("on_quit1_activate ()");
     if (state & (GHB_STATE_WORKING|GHB_STATE_SEARCHING))
     {
         if (ghb_cancel_encode2(ud, _("Closing HandBrake will terminate encoding.\n")))
         {
             ghb_hb_cleanup(FALSE);
             prune_logs(ud);
-            gtk_main_quit();
+            g_application_quit(G_APPLICATION(ud->app));
             return;
         }
         return;
     }
     ghb_hb_cleanup(FALSE);
     prune_logs(ud);
-    gtk_main_quit();
+    g_application_quit(G_APPLICATION(ud->app));
 }
 
 gboolean
@@ -1193,7 +1192,7 @@ ghb_load_settings(signal_user_data_t * ud)
     else
     {
         ghb_dict_set_bool(ud->settings, "preset_reload", TRUE);
-        ghb_select_preset(ud->builder, fullname);
+        ghb_select_preset(ud, fullname);
         ghb_dict_set_bool(ud->settings, "preset_reload", FALSE);
     }
 
@@ -1370,7 +1369,7 @@ ghb_do_scan(
 }
 
 static void
-do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud)
+do_source_dialog(gboolean single, signal_user_data_t *ud)
 {
     GtkWidget *dialog;
     const gchar *sourcename;
@@ -1420,6 +1419,7 @@ do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud)
     }
 }
 
+#if 0
 G_MODULE_EXPORT void
 source_button_clicked_cb(GtkButton *button, signal_user_data_t *ud)
 {
@@ -1431,14 +1431,32 @@ source_button_clicked_cb(GtkButton *button, signal_user_data_t *ud)
     }
     else
     {
-        do_source_dialog(button, FALSE, ud);
+        do_source_dialog(FALSE, ud);
+    }
+}
+#else
+G_MODULE_EXPORT void
+source_action_cb(GSimpleAction *action, GVariant *param,
+                 signal_user_data_t *ud)
+{
+    ghb_status_t status;
+    ghb_get_status(&status);
+    if (status.scan.state & GHB_STATE_SCANNING)
+    {
+        ghb_backend_scan_stop();
+    }
+    else
+    {
+        do_source_dialog(FALSE, ud);
     }
 }
+#endif
 
 G_MODULE_EXPORT void
-single_title_source_cb(GtkButton *button, signal_user_data_t *ud)
+single_title_action_cb(GSimpleAction *action, GVariant * param,
+                       signal_user_data_t *ud)
 {
-    do_source_dialog(button, TRUE, ud);
+    do_source_dialog(TRUE, ud);
 }
 
 G_MODULE_EXPORT void
@@ -1590,7 +1608,8 @@ dest_file_changed_cb(GtkEntry *entry, signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-destination_browse_clicked_cb(GtkButton *button, signal_user_data_t *ud)
+destination_action_cb(GSimpleAction *action, GVariant *param,
+                      signal_user_data_t *ud)
 {
     GtkWidget *dialog;
     GtkEntry *entry;
@@ -1598,7 +1617,6 @@ destination_browse_clicked_cb(GtkButton *button, signal_user_data_t *ud)
     gchar *basename;
     GtkWindow *hb_window;
 
-    g_debug("destination_browse_clicked_cb ()");
     hb_window = GTK_WINDOW(GHB_WIDGET(ud->builder, "hb_window"));
     destname = ghb_dict_get_string(ud->settings, "destination");
     dialog = gtk_file_chooser_dialog_new("Choose Destination",
@@ -1636,7 +1654,7 @@ window_destroy_event_cb(GtkWidget *widget, GdkEvent *event, signal_user_data_t *
     g_debug("window_destroy_event_cb ()");
     ghb_hb_cleanup(FALSE);
     prune_logs(ud);
-    gtk_main_quit();
+    g_application_quit(G_APPLICATION(ud->app));
     return FALSE;
 }
 
@@ -1651,14 +1669,14 @@ window_delete_event_cb(GtkWidget *widget, GdkEvent *event, signal_user_data_t *u
         {
             ghb_hb_cleanup(FALSE);
             prune_logs(ud);
-            gtk_main_quit();
+            g_application_quit(G_APPLICATION(ud->app));
             return FALSE;
         }
         return TRUE;
     }
     ghb_hb_cleanup(FALSE);
     prune_logs(ud);
-    gtk_main_quit();
+    g_application_quit(G_APPLICATION(ud->app));
     return FALSE;
 }
 
@@ -2344,7 +2362,7 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
         gtk_range_set_range(GTK_RANGE(widget), 1, preview_count);
 
         ghb_reset_preview_image(ud);
-        ghb_preview_set_visible(ud);
+        //ghb_preview_set_visible(ud);
     }
 }
 
@@ -2989,11 +3007,11 @@ generic_entry_changed_cb(GtkEntry *entry, signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-prefs_dialog_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+preferences_action_cb(GSimpleAction *action, GVariant *param,
+                      signal_user_data_t *ud)
 {
     GtkWidget *dialog;
 
-    g_debug("prefs_dialog_cb ()");
     dialog = GHB_WIDGET(ud->builder, "prefs_dialog");
     gtk_dialog_run(GTK_DIALOG(dialog));
     gtk_widget_hide(dialog);
@@ -3021,7 +3039,7 @@ quit_cb(countdown_t *cd)
         prune_logs(cd->ud);
 
         gtk_widget_destroy (GTK_WIDGET(cd->dlg));
-        gtk_main_quit();
+        g_application_quit(G_APPLICATION(cd->ud->app));
         return FALSE;
     }
     str = g_strdup_printf(_("%s\n\n%s in %d seconds ..."),
@@ -3043,7 +3061,7 @@ shutdown_cb(countdown_t *cd)
         prune_logs(cd->ud);
 
         ghb_shutdown_gsm();
-        gtk_main_quit();
+        g_application_quit(G_APPLICATION(cd->ud->app));
         return FALSE;
     }
     str = g_strdup_printf(_("%s\n\n%s in %d seconds ..."),
@@ -4055,31 +4073,16 @@ update_activity_labels(signal_user_data_t *ud, gboolean active)
 }
 
 G_MODULE_EXPORT void
-show_activity_toggled_cb(GtkWidget *widget, signal_user_data_t *ud)
+show_activity_action_cb(GSimpleAction *action, GVariant *value,
+                        signal_user_data_t *ud)
 {
-    GtkWidget        *activity_window;
-    GtkCheckMenuItem *menuitem;
-    gboolean          active;
+    GtkWidget * activity_window;
+    gboolean    state = g_variant_get_boolean(value);
 
-    active = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget));
+    g_simple_action_set_state(action, value);
     activity_window = GHB_WIDGET(ud->builder, "activity_window");
-    gtk_widget_set_visible(activity_window, active);
-    update_activity_labels(ud, active);
-
-    menuitem = GTK_CHECK_MENU_ITEM(GHB_WIDGET(ud->builder,
-                                              "show_activity_menu"));
-    gtk_check_menu_item_set_active(menuitem, active);
-}
-
-G_MODULE_EXPORT void
-show_activity_menu_toggled_cb(GtkWidget *widget, signal_user_data_t *ud)
-{
-    GtkToggleToolButton *button;
-    gboolean             active;
-
-    active = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
-    button = GTK_TOGGLE_TOOL_BUTTON(GHB_WIDGET(ud->builder, "show_activity"));
-    gtk_toggle_tool_button_set_active(button, active);
+    gtk_widget_set_visible(activity_window, state);
+    update_activity_labels(ud, state);
 }
 
 G_MODULE_EXPORT gboolean
@@ -4151,26 +4154,13 @@ browse_url(const gchar *url)
 #endif
 }
 
-#if 0
-    JJJ
-void
-about_web_hook(GtkAboutDialog *about, const gchar *link, gpointer data)
-{
-    browse_url(link);
-}
-#endif
-
 G_MODULE_EXPORT void
-about_activate_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+about_action_cb(GSimpleAction *action, GVariant *param, signal_user_data_t *ud)
 {
     GtkWidget *widget = GHB_WIDGET (ud->builder, "hb_about");
     gchar *ver;
 
     ver = g_strdup_printf("%s (%s)", HB_PROJECT_VERSION, HB_PROJECT_BUILD_ARCH);
-#if 0
-    JJJ
-    gtk_about_dialog_set_url_hook(about_web_hook, NULL, NULL);
-#endif
     gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(widget), ver);
     g_free(ver);
     gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(widget),
@@ -4183,7 +4173,7 @@ about_activate_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 #define HB_DOCS "https://handbrake.fr/docs/"
 
 G_MODULE_EXPORT void
-guide_activate_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+guide_action_cb(GSimpleAction *action, GVariant *param, signal_user_data_t *ud)
 {
     browse_url(HB_DOCS);
 }
@@ -4227,36 +4217,29 @@ update_queue_labels(signal_user_data_t *ud)
     g_free(str);
 }
 
-G_MODULE_EXPORT void
-show_queue_toggled_cb(GtkWidget *widget, signal_user_data_t *ud)
+static void
+show_queue(signal_user_data_t *ud, gboolean show)
 {
     GtkWidget        *tab;
-    GtkCheckMenuItem *menuitem;
     GtkStack         *stack;
-    gboolean          active;
 
-    active = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget));
     stack = GTK_STACK(GHB_WIDGET(ud->builder, "QueueStack"));
-    if (active)
+    if (show)
         tab = GHB_WIDGET(ud->builder, "queue_tab");
     else
         tab = GHB_WIDGET(ud->builder, "settings_tab");
     gtk_stack_set_visible_child(stack, tab);
     update_queue_labels(ud);
-
-    menuitem = GTK_CHECK_MENU_ITEM(GHB_WIDGET(ud->builder, "show_queue_menu"));
-    gtk_check_menu_item_set_active(menuitem, active);
 }
 
 G_MODULE_EXPORT void
-show_queue_menu_toggled_cb(GtkWidget *widget, signal_user_data_t *ud)
+show_queue_action_cb(GSimpleAction *action, GVariant *value,
+                     signal_user_data_t *ud)
 {
-    GtkToggleToolButton *button;
-    gboolean active;
+    gboolean state = g_variant_get_boolean(value);
 
-    active = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
-    button = GTK_TOGGLE_TOOL_BUTTON(GHB_WIDGET(ud->builder, "show_queue"));
-    gtk_toggle_tool_button_set_active(button, active);
+    g_simple_action_set_state(action, value);
+    show_queue(ud, state);
 }
 
 static void
@@ -4272,17 +4255,18 @@ presets_window_set_visible(signal_user_data_t *ud, gboolean visible)
         return;
     }
 
+    int w, h;
+    w = ghb_dict_get_int(ud->prefs, "presets_window_width");
+    h = ghb_dict_get_int(ud->prefs, "presets_window_height");
+
     presets_window = GHB_WIDGET(ud->builder, "presets_window");
+    if (w > 200 && h > 200)
+    {
+        gtk_window_resize(GTK_WINDOW(presets_window), w, h);
+    }
     gtk_widget_set_visible(presets_window, visible);
     if (visible)
     {
-        int w, h;
-        w = ghb_dict_get_int(ud->prefs, "presets_window_width");
-        h = ghb_dict_get_int(ud->prefs, "presets_window_height");
-        if (w > 200 && h > 200)
-        {
-            gtk_window_resize(GTK_WINDOW(presets_window), w, h);
-        }
         gtk_window_get_position(GTK_WINDOW(hb_window), &x, &y);
         x -= w + 10;
         if (x < 0)
@@ -4295,9 +4279,13 @@ presets_window_set_visible(signal_user_data_t *ud, gboolean visible)
 }
 
 G_MODULE_EXPORT void
-show_presets_toggled_cb(GtkWidget *widget, signal_user_data_t *ud)
+show_presets_action_cb(GSimpleAction *action, GVariant *value,
+                       signal_user_data_t *ud)
 {
-    ghb_widget_to_setting(ud->prefs, widget);
+    gboolean state = g_variant_get_boolean(value);
+
+    g_simple_action_set_state(action, value);
+    ghb_dict_set(ud->prefs, "show_presets", ghb_boolean_value(state));
     presets_window_set_visible(ud, ghb_dict_get_bool(ud->prefs,
                                                      "show_presets"));
     ghb_pref_save(ud->prefs, "show_presets");
@@ -4501,7 +4489,7 @@ ghb_hbfd(signal_user_data_t *ud, gboolean hbfd)
 {
     GtkWidget *widget;
     g_debug("ghb_hbfd");
-    widget = GHB_WIDGET(ud->builder, "queue_pause1");
+    widget = GHB_WIDGET(ud->builder, "queue_pause");
     gtk_widget_set_visible(widget, !hbfd);
     widget = GHB_WIDGET(ud->builder, "queue_add");
     gtk_widget_set_visible(widget, !hbfd);
@@ -4528,12 +4516,13 @@ ghb_hbfd(signal_user_data_t *ud, gboolean hbfd)
 }
 
 G_MODULE_EXPORT void
-hbfd_toggled_cb(GtkWidget *widget, signal_user_data_t *ud)
+hbfd_action_cb(GSimpleAction *action, GVariant *value, signal_user_data_t *ud)
 {
-    g_debug("hbfd_toggled_cb");
-    ghb_widget_to_setting(ud->prefs, widget);
-    gboolean hbfd = ghb_dict_get_bool(ud->prefs, "hbfd");
-    ghb_hbfd(ud, hbfd);
+    gboolean state = g_variant_get_boolean(value);
+
+    g_simple_action_set_state(action, value);
+    ghb_dict_set(ud->prefs, "hbfd", ghb_boolean_value(state));
+    ghb_hbfd(ud, state);
     ghb_pref_save(ud->prefs, "hbfd");
 }
 
@@ -4607,7 +4596,6 @@ tweaks_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 G_MODULE_EXPORT void
 hbfd_feature_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
-    g_debug("hbfd_feature_changed_cb");
     ghb_widget_to_setting (ud->prefs, widget);
     const gchar *name = ghb_get_setting_key(widget);
     ghb_pref_set(ud->prefs, name);
index d0f75543b7647131d189525e4791f06f7bd9d281..5b0741ceb9d3fb69e06d8f89aa03fe0fd1739b37 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <gresources>
-  <gresource prefix="/org/handbrake/data">
+  <gresource prefix="/org/handbrake/ghb/data">
     <file>internal_defaults.json</file>
     <file>widget.deps</file>
     <file>widget_reverse.deps</file>
index 67a76a3b6a98694365012f911d5236068e306537..b7ab56373c66d340a0b534b01590edc6cfd8042e 100644 (file)
@@ -6,7 +6,6 @@ define([filter_output],
             [$1])])dnl
 filter_output([
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.16.0 on Tue Jan 14 14:36:08 2014 -->
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <object class="GtkFileFilter" id="SourceFilterAVI"/>
@@ -126,7 +125,7 @@ conjunction with the "Forced" option.</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="presets_save_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-save</property>
                       </object>
                     </child>
                     <child>
@@ -135,7 +134,7 @@ conjunction with the "Forced" option.</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="presets_remove_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-remove</property>
                       </object>
                     </child>
                     <child>
@@ -144,7 +143,7 @@ conjunction with the "Forced" option.</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="presets_default_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-default</property>
                       </object>
                     </child>
                     <child>
@@ -153,7 +152,7 @@ conjunction with the "Forced" option.</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="presets_new_folder_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-folder</property>
                       </object>
                     </child>
                     <child>
@@ -162,7 +161,7 @@ conjunction with the "Forced" option.</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="preset_export_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-export</property>
                       </object>
                     </child>
                     <child>
@@ -171,7 +170,7 @@ conjunction with the "Forced" option.</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="preset_import_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-import</property>
                       </object>
                     </child>
                     <child>
@@ -180,7 +179,7 @@ conjunction with the "Forced" option.</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="presets_restore_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.presets-reload</property>
                       </object>
                     </child>
                   </object>
@@ -711,42 +710,7 @@ libx264 authors:
     </child>
   </object>
 
-  <object class="GtkMenu" id="tray_menu">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <child>
-      <object class="GtkMenuItem" id="show_hide">
-        <property name="label" translatable="yes">_Minimize/Maximize</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="show_hide_toggle_cb" swapped="no"/>
-      </object>
-      <object class="GtkMenuItem" id="tray_queue_pause">
-        <property name="label" translatable="yes">_Pause Encoding</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="queue_pause_clicked_cb" swapped="no"/>
-      </object>
-      <object class="GtkMenuItem" id="tray_quit">
-        <property name="label" translatable="yes">_Quit</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="on_quit1_activate" swapped="no"/>
-      </object>
-      <object class="GtkMenuItem" id="tray_about">
-        <property name="label" translatable="yes">_About</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="about_activate_cb" swapped="no"/>
-      </object>
-    </child>
-  </object>
-
-  <object class="GtkWindow" id="hb_window">
+  <object class="GtkApplicationWindow" id="hb_window">
     <property name="can_focus">False</property>
     <property name="events">GDK_VISIBILITY_NOTIFY_MASK</property>
     <property name="title" translatable="yes">HandBrake</property>
@@ -784,7 +748,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="source_button_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.source</property>
                       </object>
                     </child>
                     <child>
@@ -793,7 +757,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="single_title_source_cb" swapped="no"/>
+                        <property name="action-name">app.single</property>
                       </object>
                     </child>
                     <child>
@@ -802,7 +766,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="destination_browse_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.destination</property>
                       </object>
                     </child>
                     <child>
@@ -817,7 +781,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="prefs_dialog_cb" swapped="no"/>
+                        <property name="action-name">app.preferences</property>
                       </object>
                     </child>
                     <child>
@@ -832,7 +796,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="on_quit1_activate" swapped="no"/>
+                        <property name="action-name">app.quit</property>
                       </object>
                     </child>
                   </object>
@@ -855,7 +819,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="queue_add_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.queue-add</property>
                       </object>
                     </child>
                     <child>
@@ -864,7 +828,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="queue_add_multiple_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.queue-add-all</property>
                       </object>
                     </child>
                     <child>
@@ -873,7 +837,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="queue_start_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.queue-start</property>
                       </object>
                     </child>
                     <child>
@@ -882,7 +846,16 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="queue_pause_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.queue-pause</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="queue_save_menu">
+                        <property name="label" translatable="yes">S_ave Queue</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="action-name">app.queue-save</property>
                       </object>
                     </child>
                   </object>
@@ -905,7 +878,7 @@ libx264 authors:
                         <property name="visible">False</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="toggled" handler="hbfd_toggled_cb" swapped="no"/>
+                        <property name="action-name">app.hbfd</property>
                       </object>
                     </child>
                     <child>
@@ -914,7 +887,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="toggled" handler="show_presets_toggled_cb" swapped="no"/>
+                        <property name="action-name">app.show-presets</property>
                       </object>
                     </child>
                     <child>
@@ -923,7 +896,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="toggled" handler="show_queue_menu_toggled_cb" swapped="no"/>
+                        <property name="action-name">app.show-queue</property>
                       </object>
                     </child>
                     <child>
@@ -932,7 +905,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="toggled" handler="preview_menu_toggled_cb" swapped="no"/>
+                        <property name="action-name">app.show-preview</property>
                       </object>
                     </child>
                     <child>
@@ -941,7 +914,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="toggled" handler="show_activity_menu_toggled_cb" swapped="no"/>
+                        <property name="action-name">app.show-activity</property>
                       </object>
                     </child>
                   </object>
@@ -964,7 +937,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="presets_save_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-save</property>
                       </object>
                     </child>
                     <child>
@@ -973,7 +946,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="presets_remove_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-remove</property>
                       </object>
                     </child>
                     <child>
@@ -982,7 +955,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="presets_default_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-default</property>
                       </object>
                     </child>
                     <child>
@@ -991,7 +964,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="presets_new_folder_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-folder</property>
                       </object>
                     </child>
                     <child>
@@ -1000,7 +973,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="preset_export_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-export</property>
                       </object>
                     </child>
                     <child>
@@ -1009,7 +982,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="preset_import_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.preset-import</property>
                       </object>
                     </child>
                     <child>
@@ -1018,7 +991,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="presets_restore_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.presets-reload</property>
                       </object>
                     </child>
                   </object>
@@ -1041,7 +1014,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="about_activate_cb" swapped="no"/>
+                        <property name="action-name">app.about</property>
                       </object>
                     </child>
                     <child>
@@ -1050,7 +1023,7 @@ libx264 authors:
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="guide_activate_cb" swapped="no"/>
+                        <property name="action-name">app.guide</property>
                       </object>
                     </child>
                   </object>
@@ -1065,245 +1038,455 @@ libx264 authors:
           </packing>
         </child>
         <child>
-          <object class="GtkBox" id="hbox10">
-            <property name="orientation">horizontal</property>
+          <object class="GtkBox" id="vbox11">
+            <property name="orientation">vertical</property>
             <property name="visible">True</property>
             <property name="can_focus">False</property>
+            <property name="hexpand">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="GtkBox" id="vbox11">
-                <property name="orientation">vertical</property>
+              <object class="GtkToolbar" id="toolbar1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="show-arrow">False</property>
+                <property name="icon_size">5</property>
+                <child>
+                  <object class="GtkToolButton" id="sourcetoolbutton">
+                    <property name="visible">True</property>
+                    <property name="can_focus">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="tooltip_text" translatable="yes">Choose Video Source</property>
+                    <property name="is_important">True</property>
+                    <property name="label" translatable="yes">Open
+Source</property>
+                    <property name="icon_name">hb-source</property>
+                    <property name="action-name">app.source</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="homogeneous">True</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkToolButton" id="queue_add">
+                    <property name="visible">True</property>
+                    <property name="can_focus">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="tooltip_text" translatable="yes">Add to Queue</property>
+                    <property name="is_important">True</property>
+                    <property name="label" translatable="yes">Add To
+Queue</property>
+                    <property name="icon_name">hb-add-queue</property>
+                    <property name="action-name">app.queue-add</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="homogeneous">True</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkToolButton" id="queue_start">
+                    <property name="visible">True</property>
+                    <property name="can_focus">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="tooltip_text" translatable="yes">Start Encoding</property>
+                    <property name="is_important">True</property>
+                    <property name="label" translatable="yes">Start
+Encoding</property>
+                    <property name="icon_name">hb-start</property>
+                    <property name="action-name">app.queue-start</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="homogeneous">True</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkToolButton" id="queue_pause">
+                    <property name="visible">True</property>
+                    <property name="can_focus">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="tooltip_text" translatable="yes">Pause Encoding</property>
+                    <property name="is_important">True</property>
+                    <property name="label" translatable="yes">Pause
+Encoding</property>
+                    <property name="icon_name">hb-pause</property>
+                    <property name="action-name">app.queue-pause</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="homogeneous">True</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkSeparatorToolItem" id="main_tool_sep1">
+                    <property name="visible">True</property>
+                    <property name="draw">False</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="homogeneous">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkToggleToolButton" id="show_queue">
+                    <property name="visible">True</property>
+                    <property name="can_focus">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="tooltip_text" translatable="yes">Show Queue</property>
+                    <property name="is_important">True</property>
+                    <property name="label" translatable="yes">Show
+Queue</property>
+                    <property name="icon_name">hb-showqueue</property>
+                    <property name="action-name">app.show-queue</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="homogeneous">True</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkToggleToolButton" id="show_preview">
+                    <property name="visible">True</property>
+                    <property name="can_focus">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="tooltip_text" translatable="yes">Show Preview Window</property>
+                    <property name="is_important">True</property>
+                    <property name="label" translatable="yes">Show
+Preview</property>
+                    <property name="icon_name">hb-picture</property>
+                    <property name="action-name">app.show-preview</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="homogeneous">True</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkToggleToolButton" id="show_activity">
+                    <property name="visible">True</property>
+                    <property name="can_focus">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="tooltip_text" translatable="yes">Show Activity Window</property>
+                    <property name="is_important">True</property>
+                    <property name="label" translatable="yes">Show
+Activity</property>
+                    <property name="icon_name">hb-activity</property>
+                    <property name="action-name">app.show-activity</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="homogeneous">True</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkBox" id="hbox54">
+                <property name="orientation">horizontal</property>
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="hexpand">True</property>
-                <property name="margin-end">12</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="margin-start">12</property>
+                <property name="margin-end">12</property>
                 <child>
-                  <object class="GtkToolbar" id="toolbar1">
+                  <object class="GtkBox" id="SourceInfoBox">
+                    <property name="orientation">horizontal</property>
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="show-arrow">False</property>
-                    <property name="icon_size">5</property>
-                    <child>
-                      <object class="GtkToolButton" id="sourcetoolbutton">
-                        <property name="visible">True</property>
-                        <property name="can_focus">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="tooltip_text" translatable="yes">Choose Video Source</property>
-                        <property name="is_important">True</property>
-                        <property name="label" translatable="yes">Open
-Source</property>
-                        <property name="icon_name">hb-source</property>
-                        <signal name="clicked" handler="source_button_clicked_cb" swapped="no"/>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="homogeneous">True</property>
-                      </packing>
-                    </child>
+                    <property name="spacing">6</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="GtkToolButton" id="queue_add">
+                      <object class="GtkLabel" id="label7">
                         <property name="visible">True</property>
-                        <property name="sensitive">False</property>
-                        <property name="can_focus">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="tooltip_text" translatable="yes">Add to Queue</property>
-                        <property name="is_important">True</property>
-                        <property name="label" translatable="yes">Add To
-Queue</property>
-                        <property name="icon_name">hb-add-queue</property>
-                        <signal name="clicked" handler="queue_add_clicked_cb" swapped="no"/>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">&lt;b&gt;Source:&lt;/b&gt;</property>
+                        <property name="use_markup">True</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="homogeneous">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkToolButton" id="queue_start1">
+                      <object class="GtkLabel" id="volume_label">
                         <property name="visible">True</property>
-                        <property name="sensitive">False</property>
-                        <property name="can_focus">True</property>
+                        <property name="can_focus">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="tooltip_text" translatable="yes">Start Encoding</property>
-                        <property name="is_important">True</property>
-                        <property name="label" translatable="yes">Start
-Encoding</property>
-                        <property name="icon_name">hb-start</property>
-                        <signal name="clicked" handler="queue_start_clicked_cb" swapped="no"/>
+                        <property name="halign">start</property>
+                        <property name="ellipsize">middle</property>
+                        <property name="margin-end">12</property>
+                        <property name="label" translatable="yes">None</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="homogeneous">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkToolButton" id="queue_pause1">
+                      <object class="GtkLabel" id="source_info_label">
                         <property name="visible">True</property>
-                        <property name="sensitive">False</property>
-                        <property name="can_focus">True</property>
+                        <property name="can_focus">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="tooltip_text" translatable="yes">Pause Encoding</property>
-                        <property name="is_important">True</property>
-                        <property name="label" translatable="yes">Pause
-Encoding</property>
-                        <property name="icon_name">hb-pause</property>
-                        <signal name="clicked" handler="queue_pause_clicked_cb" swapped="no"/>
+                        <property name="halign">end</property>
+                        <property name="label" translatable="yes"></property>
                       </object>
                       <packing>
-                        <property name="expand">False</property>
-                        <property name="homogeneous">True</property>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">2</property>
                       </packing>
                     </child>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkProgressBar" id="scan_prog">
+                    <property name="height_request">10</property>
+                    <property name="can_focus">False</property>
+                    <property name="valign">center</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkGrid" id="table7">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="hexpand">True</property>
+                <property name="column_spacing">5</property>
+                <property name="hexpand">True</property>
+                <property name="halign">GTK_ALIGN_FILL</property>
+                <property name="margin-start">12</property>
+                <property name="margin-end">12</property>
+                <property name="row-spacing">2</property>
+                <child>
+                  <object class="GtkLabel" id="label20">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="halign">end</property>
+                    <property name="label" translatable="yes">Title:</property>
+                  </object>
+                  <packing>
+                    <property name="top_attach">0</property>
+                    <property name="left_attach">0</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkBox" id="hbox42">
+                    <property name="orientation">horizontal</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">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="hexpand">True</property>
+                    <property name="halign">GTK_ALIGN_FILL</property>
+                    <property name="spacing">5</property>
                     <child>
-                      <object class="GtkSeparatorToolItem" id="main_tool_sep1">
+                      <object class="GtkComboBox" id="title">
                         <property name="visible">True</property>
-                        <property name="draw">False</property>
+                        <property name="valign">GTK_ALIGN_CENTER</property>
+                        <property name="can_focus">False</property>
+                        <property name="halign">start</property>
+                        <property name="tooltip_text" translatable="yes">Set the title to encode.
+By default the longest title is chosen.
+This is often the feature title of a DVD.</property>
+                        <property name="has_frame">False</property>
+                        <signal name="changed" handler="title_changed_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">True</property>
-                        <property name="homogeneous">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkToggleToolButton" id="show_queue">
+                      <object class="GtkLabel" id="angle_label">
                         <property name="visible">True</property>
-                        <property name="can_focus">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="tooltip_text" translatable="yes">Show Queue</property>
-                        <property name="is_important">True</property>
-                        <property name="label" translatable="yes">Show
-Queue</property>
-                        <property name="icon_name">hb-showqueue</property>
-                        <signal name="toggled" handler="show_queue_toggled_cb" swapped="no"/>
+                        <property name="can_focus">False</property>
+                        <property name="halign">end</property>
+                        <property name="label" translatable="yes">Angle:</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="homogeneous">True</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkToggleToolButton" id="show_preview">
+                      <object class="GtkSpinButton" id="angle">
+                        <property name="width-chars">3</property>
                         <property name="visible">True</property>
                         <property name="can_focus">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="tooltip_text" translatable="yes">Show Preview Window</property>
-                        <property name="is_important">True</property>
-                        <property name="label" translatable="yes">Show
-Preview</property>
-                        <property name="icon_name">hb-picture</property>
-                        <signal name="toggled" handler="preview_toggled_cb" swapped="no"/>
+                        <property name="tooltip_text" translatable="yes">For multi-angle DVD's, select the desired angle to encode.</property>
+                        <property name="primary_icon_activatable">False</property>
+                        <property name="secondary_icon_activatable">False</property>
+                        <property name="adjustment">adjustment27</property>
+                        <property name="halign">end</property>
+                        <signal name="value-changed" handler="title_angle_changed_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="homogeneous">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">2</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkToggleToolButton" id="show_activity">
+                      <object class="GtkButton" id="title_reset">
+                        <property name="label" translatable="yes">Reset All Titles</property>
                         <property name="visible">True</property>
                         <property name="can_focus">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="tooltip_text" translatable="yes">Show Activity Window</property>
-                        <property name="is_important">True</property>
-                        <property name="label" translatable="yes">Show
-Activity</property>
-                        <property name="icon_name">hb-activity</property>
-                        <signal name="toggled" handler="show_activity_toggled_cb" swapped="no"/>
+                        <property name="tooltip_text" translatable="yes">Apply current settings to all titles</property>
+                        <property name="receives_default">True</property>
+                        <property name="halign">end</property>
+                        <signal name="clicked" handler="title_reset_clicked_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="homogeneous">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">3</property>
                       </packing>
                     </child>
                   </object>
                   <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
+                    <property name="top_attach">0</property>
+                    <property name="left_attach">1</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkBox" id="vbox15">
-                    <property name="orientation">vertical</property>
-                    <property name="hexpand">True</property>
-                    <property name="halign">GTK_ALIGN_FILL</property>
+                  <object class="GtkBox" id="chapter_box">
+                    <property name="halign">start</property>
+                    <property name="valign">center</property>
+                    <property name="orientation">horizontal</property>
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="spacing">6</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="spacing">5</property>
+                    <child>
+                      <object class="GtkComboBox" id="PtoPType">
+                        <property name="visible">True</property>
+                        <property name="valign">GTK_ALIGN_CENTER</property>
+                        <property name="can_focus">False</property>
+                        <property name="tooltip_text" translatable="yes">Range of title to encode. Can be chapters, seconds, or frames.</property>
+                        <signal name="changed" handler="ptop_widget_changed_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkSpinButton" id="start_point">
+                        <property name="width-chars">10</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">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="tooltip_text" translatable="yes">Set the first chapter to encode.</property>
+                        <property name="primary_icon_activatable">False</property>
+                        <property name="secondary_icon_activatable">False</property>
+                        <property name="adjustment">adjustment1</property>
+                        <property name="numeric">True</property>
+                        <signal name="value-changed" handler="start_point_changed_cb" swapped="no"/>
+                        <signal name="output" handler="ptop_output_cb" swapped="no"/>
+                        <signal name="input" handler="ptop_input_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label56">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">through</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkSpinButton" id="end_point">
+                        <property name="width-chars">10</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">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="tooltip_text" translatable="yes">Set the last chapter to encode.</property>
+                        <property name="primary_icon_activatable">False</property>
+                        <property name="secondary_icon_activatable">False</property>
+                        <property name="adjustment">adjustment2</property>
+                        <property name="numeric">True</property>
+                        <signal name="value-changed" handler="end_point_changed_cb" swapped="no"/>
+                        <signal name="output" handler="ptop_output_cb" swapped="no"/>
+                        <signal name="input" handler="ptop_input_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">3</property>
+                      </packing>
+                    </child>
                     <child>
-                      <object class="GtkBox" id="hbox54">
+                      <object class="GtkBox" id="hbox47">
                         <property name="orientation">horizontal</property>
                         <property name="visible">True</property>
                         <property name="can_focus">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="margin-start">6</property>
+                        <property name="spacing">7</property>
                         <child>
-                          <object class="GtkBox" id="SourceInfoBox">
-                            <property name="orientation">horizontal</property>
+                          <object class="GtkLabel" id="label6">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="spacing">6</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="GtkLabel" id="label7">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">&lt;b&gt;Source:&lt;/b&gt;</property>
-                                <property name="use_markup">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="volume_label">
-                                <property name="visible">True</property>
-                                <property name="can_focus">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="halign">start</property>
-                                <property name="ellipsize">middle</property>
-                                <property name="margin-end">12</property>
-                                <property name="label" translatable="yes">None</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="source_info_label">
-                                <property name="visible">True</property>
-                                <property name="can_focus">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="halign">end</property>
-                                <property name="label" translatable="yes"></property>
-                              </object>
-                              <packing>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
-                                <property name="position">2</property>
-                              </packing>
-                            </child>
+                            <property name="halign">start</property>
+                            <property name="label" translatable="yes">Duration:</property>
                           </object>
                           <packing>
-                            <property name="expand">True</property>
+                            <property name="expand">False</property>
                             <property name="fill">True</property>
                             <property name="position">0</property>
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkProgressBar" id="scan_prog">
-                            <property name="height_request">10</property>
+                          <object class="GtkLabel" id="title_duration">
+                            <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="valign">center</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="halign">start</property>
+                            <property name="label" translatable="yes">hh:mm:ss</property>
+                            <property name="width_chars">8</property>
                           </object>
                           <packing>
-                            <property name="expand">True</property>
+                            <property name="expand">False</property>
                             <property name="fill">True</property>
                             <property name="position">1</property>
                           </packing>
@@ -1312,249 +1495,87 @@ Activity</property>
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">True</property>
-                        <property name="position">0</property>
+                        <property name="position">4</property>
                       </packing>
                     </child>
+                  </object>
+                  <packing>
+                    <property name="top_attach">1</property>
+                    <property name="left_attach">1</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkBox" id="preset_selection_box">
+                <property name="halign">start</property>
+                <property name="valign">center</property>
+                <property name="orientation">horizontal</property>
+                <property name="visible">True</property>
+                <property name="can_focus">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="margin-start">12</property>
+                <property name="margin-end">12</property>
+                <property name="margin-top">12</property>
+                <property name="spacing">5</property>
+                <child>
+                  <object class="GtkLabel" id="preset_selection_label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Preset:&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkMenuButton" id="presets_menu_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="direction">down</property>
                     <child>
-                      <object class="GtkGrid" id="table7">
+                      <object class="GtkBox" id="presets_menu_button_box">
+                        <property name="orientation">horizontal</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="hexpand">True</property>
-                        <property name="column_spacing">5</property>
-                        <property name="hexpand">True</property>
-                        <property name="halign">GTK_ALIGN_FILL</property>
-                        <property name="margin-start">6</property>
-                        <property name="row-spacing">2</property>
                         <child>
-                          <object class="GtkLabel" id="label20">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="halign">end</property>
-                            <property name="label" translatable="yes">Title:</property>
-                          </object>
-                          <packing>
-                            <property name="top_attach">0</property>
-                            <property name="left_attach">0</property>
-                            <property name="width">1</property>
-                            <property name="height">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkBox" id="hbox42">
-                            <property name="orientation">horizontal</property>
+                          <object class="GtkLabel" id="presets_menu_button_label">
                             <property name="visible">True</property>
                             <property name="can_focus">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="hexpand">True</property>
-                            <property name="halign">GTK_ALIGN_FILL</property>
-                            <property name="spacing">5</property>
-                            <child>
-                              <object class="GtkComboBox" id="title">
-                                <property name="visible">True</property>
-                                <property name="valign">GTK_ALIGN_CENTER</property>
-                                <property name="can_focus">False</property>
-                                <property name="halign">start</property>
-                                <property name="tooltip_text" translatable="yes">Set the title to encode.
-By default the longest title is chosen.
-This is often the feature title of a DVD.</property>
-                                <property name="has_frame">False</property>
-                                <signal name="changed" handler="title_changed_cb" swapped="no"/>
-                              </object>
-                              <packing>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="angle_label">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="halign">end</property>
-                                <property name="label" translatable="yes">Angle:</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkSpinButton" id="angle">
-                                <property name="width-chars">3</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">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="tooltip_text" translatable="yes">For multi-angle DVD's, select the desired angle to encode.</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="adjustment">adjustment27</property>
-                                <property name="halign">end</property>
-                                <signal name="value-changed" handler="title_angle_changed_cb" swapped="no"/>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="position">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkButton" id="title_reset">
-                                <property name="label" translatable="yes">Reset All Titles</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="tooltip_text" translatable="yes">Apply current settings to all titles</property>
-                                <property name="receives_default">True</property>
-                                <property name="halign">end</property>
-                                <signal name="clicked" handler="title_reset_clicked_cb" swapped="no"/>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="position">3</property>
-                              </packing>
-                            </child>
+                            <property name="width-chars">50</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Choose Preset</property>
+                            <property name="use_markup">True</property>
                           </object>
                           <packing>
-                            <property name="top_attach">0</property>
-                            <property name="left_attach">1</property>
-                            <property name="width">1</property>
-                            <property name="height">1</property>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkBox" id="chapter_box">
-                            <property name="halign">start</property>
-                            <property name="valign">center</property>
-                            <property name="orientation">horizontal</property>
+                          <object class="GtkImage" id="presets_menu_button_arrow">
                             <property name="visible">True</property>
                             <property name="can_focus">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="spacing">5</property>
-                            <child>
-                              <object class="GtkComboBox" id="PtoPType">
-                                <property name="visible">True</property>
-                                <property name="valign">GTK_ALIGN_CENTER</property>
-                                <property name="can_focus">False</property>
-                                <property name="tooltip_text" translatable="yes">Range of title to encode. Can be chapters, seconds, or frames.</property>
-                                <signal name="changed" handler="ptop_widget_changed_cb" swapped="no"/>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkSpinButton" id="start_point">
-                                <property name="width-chars">10</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">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="tooltip_text" translatable="yes">Set the first chapter to encode.</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="adjustment">adjustment1</property>
-                                <property name="numeric">True</property>
-                                <signal name="value-changed" handler="start_point_changed_cb" swapped="no"/>
-                                <signal name="output" handler="ptop_output_cb" swapped="no"/>
-                                <signal name="input" handler="ptop_input_cb" swapped="no"/>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label56">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">through</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="position">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkSpinButton" id="end_point">
-                                <property name="width-chars">10</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">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="tooltip_text" translatable="yes">Set the last chapter to encode.</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="adjustment">adjustment2</property>
-                                <property name="numeric">True</property>
-                                <signal name="value-changed" handler="end_point_changed_cb" swapped="no"/>
-                                <signal name="output" handler="ptop_output_cb" swapped="no"/>
-                                <signal name="input" handler="ptop_input_cb" swapped="no"/>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="position">3</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkBox" id="hbox47">
-                                <property name="orientation">horizontal</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">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="spacing">7</property>
-                                <child>
-                                  <object class="GtkLabel" id="label6">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="halign">start</property>
-                                    <property name="label" translatable="yes">Duration:</property>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="title_duration">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">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="halign">start</property>
-                                    <property name="label" translatable="yes">hh:mm:ss</property>
-                                    <property name="width_chars">8</property>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">1</property>
-                                  </packing>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="position">4</property>
-                              </packing>
-                            </child>
+                            <property name="icon_name">pan-down-symbolic</property>
                           </object>
                           <packing>
-                            <property name="top_attach">1</property>
-                            <property name="left_attach">1</property>
-                            <property name="width">1</property>
-                            <property name="height">1</property>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
                           </packing>
                         </child>
                       </object>
-                      <packing>
-                        <property name="expand">True</property>
-                        <property name="fill">True</property>
-                        <property name="position">1</property>
-                      </packing>
                     </child>
                   </object>
                   <packing>
@@ -1567,7 +1588,7 @@ This is often the feature title of a DVD.</property>
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">True</property>
-                <property name="position">0</property>
+                <property name="position">3</property>
               </packing>
             </child>
           </object>
@@ -6871,7 +6892,7 @@ Resets all queue jobs to pending and ready to run again.</property>
                         <property name="icon_name">document-save-as</property>
                         <property name="tooltip_text" translatable="yes">Save the current queue of encode jobs to a file.
 This file may be reloaded at a later time to edit your jobs and re-encode.</property>
-                        <signal name="clicked" handler="queue_save_clicked_cb" swapped="no"/>
+                        <property name="action-name">app.queue-save</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -8569,6 +8590,8 @@ Setting this to 0 means there is no maximum height.</property>
     <signal name="delete-event" handler="preview_window_delete_cb" swapped="no"/>
     <child>
       <object class="GtkEventBox" id="preview_image">
+        <property name="width_request">854</property>
+        <property name="height_request">480</property>
         <property name="visible">True</property>
         <property name="app_paintable">True</property>
         <property name="can_focus">False</property>
index fb8f0320566997fad27d98e59d8621b0636b0dde..c3883595903346eed1697eb617a1c776230797d3 100644 (file)
@@ -3118,6 +3118,7 @@ void
 ghb_backend_init(gint debug)
 {
     /* Init libhb */
+    hb_global_init();
     h_scan = hb_init( debug );
     h_queue = hb_init( debug );
     h_live = hb_init( debug );
index e81378f365f324c28220c4995ad3cf35fe1b946f..abfd4c2e633b3754a992eab680ad05a494c29225 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <gresources>
-  <gresource prefix="/org/handbrake/icons/scalable/apps">
+  <gresource prefix="/org/handbrake/ghb/icons/scalable/apps">
     <file>hb-activity.svg</file>
     <file>hb-add-queue.svg</file>
     <file>hb-complete.svg</file>
index a0f19e372c51158d0d29d295ac492685e5475f1e..0e889e0c65dce6b8e63c8728e016ca83d6195414 100644 (file)
@@ -30,13 +30,13 @@ ghb_load_icons()
 #if GTK_CHECK_VERSION(3, 14, 0)
     ghb_icons_register_resource();
     gtk_icon_theme_add_resource_path(gtk_icon_theme_get_default(),
-                                     "/org/handbrake/icons");
+                                     "/org/handbrake/ghb/icons");
 #else
     ghb_icons_register_resource();
     GResource *icon_res = ghb_icons_get_resource();
 
     char ** children = g_resource_enumerate_children(icon_res,
-                                "/org/handbrake/icons/scalable/apps", 0, NULL);
+                            "/org/handbrake/ghb/icons/scalable/apps", 0, NULL);
 
     if (children == NULL)
     {
@@ -46,8 +46,10 @@ ghb_load_icons()
     int ii;
     for (ii = 0; children[ii] != NULL; ii++)
     {
-        char *path = g_strdup_printf("/org/handbrake/icons/scalable/apps/%s",
-                                     children[ii]);
+        char * path;
+
+        path = g_strdup_printf("/org/handbrake/ghb/icons/scalable/apps/%s",
+                               children[ii]);
         GBytes *gbytes = g_resource_lookup_data(icon_res, path, 0, NULL);
         gsize data_size;
         gconstpointer data = g_bytes_get_data(gbytes, &data_size);
index de5eb0f28477c7fb36225cdd6f8f1482eca7aefd..a452830bb019a3e6e0c66ebb1f05f5ab0f79a39b 100644 (file)
@@ -93,9 +93,9 @@ create_builder_or_die(const gchar * name)
     const gchar *ghb_ui;
     gsize data_size;
 
-    ghb_ui_register_resource();
     GResource *ui_res = ghb_ui_get_resource();
-    GBytes *gbytes = g_resource_lookup_data(ui_res, "/org/handbrake/ui/ghb.ui",
+    GBytes *gbytes = g_resource_lookup_data(ui_res,
+                                            "/org/handbrake/ghb/ui/ghb.ui",
                                             0, NULL);
     ghb_ui = g_bytes_get_data(gbytes, &data_size);
 
@@ -649,7 +649,8 @@ IoRedirect(signal_user_data_t *ud)
     // "Invalid byte sequence in conversion input"
     // Set disable encoding on the channel.
     g_io_channel_set_encoding(channel, NULL, NULL);
-    g_io_add_watch(channel, G_IO_IN, ghb_log_cb, (gpointer)ud );
+    ud->stderr_src_id =
+        g_io_add_watch(channel, G_IO_IN, ghb_log_cb, (gpointer)ud );
 }
 
 typedef struct
@@ -818,69 +819,143 @@ stackswitcher button.text-button    \n\
 
 extern G_MODULE_EXPORT void status_icon_query_tooltip_cb(void);
 
-int
-main(int argc, char *argv[])
+extern G_MODULE_EXPORT void
+ghb_shutdown_cb(GApplication * app, signal_user_data_t *ud)
 {
-    signal_user_data_t *ud;
-    GError *error = NULL;
-    GOptionContext *context;
-
-#if defined(_WIN32)
-    // Tell gdk pixbuf where it's loader config file is.
-    _putenv_s("GDK_PIXBUF_MODULE_FILE", "ghb.exe.local/loaders.cache");
-    _putenv_s("GST_PLUGIN_PATH", "lib/gstreamer-1.0");
-#endif
+}
 
-    hb_global_init();
+G_MODULE_EXPORT void
+source_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+single_title_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+destination_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+preferences_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+quit_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+queue_add_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+queue_add_all_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+queue_start_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+queue_pause_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+queue_save_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+show_presets_action_cb(GSimpleAction *action, GVariant *value, gpointer ud);
+G_MODULE_EXPORT void
+hbfd_action_cb(GSimpleAction *action, GVariant *value, gpointer ud);
+G_MODULE_EXPORT void
+show_queue_action_cb(GSimpleAction *action, GVariant *value, gpointer ud);
+G_MODULE_EXPORT void
+show_preview_action_cb(GSimpleAction *action, GVariant *value, gpointer ud);
+G_MODULE_EXPORT void
+show_activity_action_cb(GSimpleAction *action, GVariant *value, gpointer ud);
+G_MODULE_EXPORT void
+preset_save_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+preset_remove_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+preset_default_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+preset_folder_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+preset_export_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+preset_import_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+presets_reload_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+about_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+guide_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
+preset_select_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+
+static void map_actions(GApplication * app, signal_user_data_t * ud)
+{
+    const GActionEntry entries[] =
+    {
+        { "source",         source_action_cb            },
+        { "single",         single_title_action_cb      },
+        { "destination",    destination_action_cb       },
+        { "preferences",    preferences_action_cb       },
+        { "quit",           quit_action_cb              },
+        { "queue-add",      queue_add_action_cb         },
+        { "queue-add-all",  queue_add_all_action_cb     },
+        { "queue-start",    queue_start_action_cb       },
+        { "queue-pause",    queue_pause_action_cb       },
+        { "queue-save",     queue_save_action_cb        },
+        { "hbfd",           NULL,
+          NULL, "false",    hbfd_action_cb              },
+        { "show-presets",   NULL,
+          NULL, "false",    show_presets_action_cb      },
+        { "show-queue",     NULL,
+          NULL, "false",    show_queue_action_cb        },
+        { "show-preview",   NULL,
+          NULL, "false",    show_preview_action_cb      },
+        { "show-activity",  NULL,
+          NULL, "false",    show_activity_action_cb     },
+        { "preset-save",    preset_save_action_cb       },
+        { "preset-remove",  preset_remove_action_cb     },
+        { "preset-default", preset_default_action_cb    },
+        { "preset-folder",  preset_folder_action_cb     },
+        { "preset-export",  preset_export_action_cb     },
+        { "preset-import",  preset_import_action_cb     },
+        { "presets-reload", presets_reload_action_cb    },
+        { "about",          about_action_cb             },
+        { "guide",          guide_action_cb             },
+        { "preset-select",  preset_select_action_cb, "s"    },
+    };
+    g_action_map_add_action_entries(G_ACTION_MAP(app), entries,
+                                    G_N_ELEMENTS(entries), ud);
+}
 
-#ifdef ENABLE_NLS
-    bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
-    bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
-    textdomain(GETTEXT_PACKAGE);
-#endif
+gboolean
+ghb_idle_ui_init(signal_user_data_t *ud)
+{
+    ghb_settings_to_ui(ud, ud->globals);
+    ghb_settings_to_ui(ud, ud->prefs);
+    // Note that ghb_settings_to_ui(ud->settings) happens when initial
+    // empty title is initialized.
 
-    context = g_option_context_new(_("- Transcode media formats"));
-    g_option_context_add_main_entries(context, entries, GETTEXT_PACKAGE);
-    g_option_context_add_group(context, gtk_get_option_group(TRUE));
-#if defined(_ENABLE_GST)
-    g_option_context_add_group(context, gst_init_get_option_group());
-#endif
-    g_option_context_parse(context, &argc, &argv, &error);
-    if (error != NULL)
+    // Init settings that are dependent on command line args
+    if (dvd_device != NULL)
     {
-        g_warning("%s: %s", G_STRFUNC, error->message);
-        g_clear_error(&error);
+        // Source overridden from command line option
+        ghb_dict_set_string(ud->globals, "scan_source", dvd_device);
+        g_idle_add((GSourceFunc)ghb_idle_scan, ud);
+    }
+    else
+    {
+        GhbValue *gval = ghb_dict_get_value(ud->prefs, "default_source");
+        ghb_dict_set(ud->globals, "scan_source", ghb_value_dup(gval));
     }
-    g_option_context_free(context);
 
-#if defined(_WIN32)
-    if (win32_console)
+    if (arg_preset != NULL)
     {
-        // Enable console logging
-        if(AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()){
-            close(STDOUT_FILENO);
-            freopen("CONOUT$", "w", stdout);
-            close(STDERR_FILENO);
-            freopen("CONOUT$", "w", stderr);
-        }
+        ghb_select_preset(ud, arg_preset);
     }
     else
     {
-        // Non-console windows apps do not have a stderr->_file
-        // assigned properly
-        stderr->_file = STDERR_FILENO;
-        stdout->_file = STDOUT_FILENO;
+        ghb_select_default_preset(ud);
     }
-#endif
 
-    if (argc > 1 && dvd_device == NULL && argv[1][0] != '-')
-    {
-        dvd_device = argv[1];
-    }
+    // Grey out widgets that are dependent on a disabled feature
+    ghb_check_all_depencencies(ud);
+
+    return FALSE;
+}
 
-    gtk_init(&argc, &argv);
+extern G_MODULE_EXPORT void
+ghb_activate_cb(GApplication * app, signal_user_data_t * ud)
+{
+    GError             * error = NULL;
+    GtkCssProvider     * css = gtk_css_provider_new();
 
-    GtkCssProvider *css = gtk_css_provider_new();
     error = NULL;
     gtk_css_provider_load_from_data(css, MyCSS, -1, &error);
     if (error == NULL)
@@ -913,11 +988,16 @@ main(int argc, char *argv[])
     }
 
     ghb_write_pid_file();
-    ud = g_malloc0(sizeof(signal_user_data_t));
+
+    // map application actions (menu callbacks)
+    map_actions(app, ud);
+
+    // connect shutdown signal for cleanup
+    g_signal_connect(app, "shutdown", (GCallback)ghb_shutdown_cb, ud);
+
     ud->debug = ghb_debug;
     g_log_set_handler(NULL, G_LOG_LEVEL_DEBUG, debug_log_handler, ud);
     g_log_set_handler("Gtk", G_LOG_LEVEL_WARNING, warn_log_handler, ud);
-    //g_log_set_handler("Gtk", G_LOG_LEVEL_CRITICAL, warn_log_handler, ud);
 
     ud->globals = ghb_dict_new();
     ud->prefs = ghb_dict_new();
@@ -926,14 +1006,10 @@ main(int argc, char *argv[])
     ghb_array_append(ud->settings_array, ud->settings);
 
     ud->builder = create_builder_or_die(BUILDER_NAME);
+
     // Enable events that alert us to media change events
     watch_volumes(ud);
 
-    //GtkWidget *widget = GHB_WIDGET(ud->builder, "PictureDetelecineCustom");
-    //gtk_entry_set_inner_border(widget, 2);
-
-    // Since GtkBuilder no longer assigns object ids to widget names
-    // Assign a few that are necessary for style overrides to work
 #if defined(_NO_UPDATE_CHECK)
     GtkWidget *widget;
     widget = GHB_WIDGET(ud->builder, "check_updates_box");
@@ -975,6 +1051,9 @@ main(int argc, char *argv[])
     buffer = gtk_text_view_get_buffer(textview);
     g_signal_connect(buffer, "changed", (GCallback)plot_changed_cb, ud);
 
+    // Initialize HB global settings and tables.
+    ghb_backend_init(0);
+    // Set up UI combo boxes.  Some of these rely on HB global settings.
     ghb_combo_init(ud);
 
     g_debug("ud %p\n", ud);
@@ -1009,52 +1088,23 @@ main(int argc, char *argv[])
     ghb_prefs_to_settings(ud->prefs);
 
     int logLevel = ghb_dict_get_int(ud->prefs, "LoggingLevel");
-    ghb_backend_init(logLevel);
+    ghb_log_level_set(logLevel);
 
     // Load the presets files
     ghb_presets_load(ud);
-    // Note that ghb_preset_to_settings(ud->settings) is called when
-    // the default preset is selected.
-
-    ghb_settings_to_ui(ud, ud->globals);
-    ghb_settings_to_ui(ud, ud->prefs);
-    // Note that ghb_settings_to_ui(ud->settings) happens when initial
-    // empty title is initialized.
 
+    // GActions associated with widgets do not fire when the widget
+    // is changed from this GtkApplication "activate" signal.
+    // So initialize UI when idle.
+    g_idle_add((GSourceFunc)ghb_idle_ui_init, ud);
 
-    if (ghb_dict_get_bool(ud->prefs, "hbfd"))
-    {
-        ghb_hbfd(ud, TRUE);
-    }
     const gchar *source = ghb_dict_get_string(ud->prefs, "default_source");
     ghb_dvd_set_current(source, ud);
 
     // Populate the presets tree view
     ghb_presets_list_init(ud, NULL);
-    // Get the first preset name
-    if (arg_preset != NULL)
-    {
-        ghb_select_preset(ud->builder, arg_preset);
-    }
-    else
-    {
-        ghb_select_default_preset(ud->builder);
-    }
+    ghb_presets_menu_init(ud);
 
-    // Grey out widgets that are dependent on a disabled feature
-    ghb_check_all_depencencies(ud);
-
-    if (dvd_device != NULL)
-    {
-        // Source overridden from command line option
-        ghb_dict_set_string(ud->globals, "scan_source", dvd_device);
-        g_idle_add((GSourceFunc)ghb_idle_scan, ud);
-    }
-    else
-    {
-        GhbValue *gval = ghb_dict_get_value(ud->prefs, "default_source");
-        ghb_dict_set(ud->globals, "scan_source", ghb_value_dup(gval));
-    }
     // Reload and check status of the last saved queue
     g_idle_add((GSourceFunc)ghb_reload_queue, ud);
 
@@ -1215,13 +1265,85 @@ main(int argc, char *argv[])
     ghb_set_custom_filter_tooltip(ud, "PictureCombDetectCustom",
                                   "interlace detection", HB_FILTER_COMB_DETECT);
 
+    gtk_application_add_window(GTK_APPLICATION(app), GTK_WINDOW(ghb_window));
+    GtkWidget * window = GHB_WIDGET(ud->builder, "presets_window");
+    gtk_application_add_window(GTK_APPLICATION(app), GTK_WINDOW(window));
+
     gtk_widget_show(ghb_window);
+}
+
+int
+main(int argc, char *argv[])
+{
+    //signal_user_data_t *ud;
+    GError *error = NULL;
+    GOptionContext *context;
+
+#if defined(_WIN32)
+    // Tell gdk pixbuf where it's loader config file is.
+    _putenv_s("GDK_PIXBUF_MODULE_FILE", "ghb.exe.local/loaders.cache");
+    _putenv_s("GST_PLUGIN_PATH", "lib/gstreamer-1.0");
+#endif
+
+
+#ifdef ENABLE_NLS
+    bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
+    bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
+    textdomain(GETTEXT_PACKAGE);
+#endif
 
-    // Everything should be go-to-go.  Lets rock!
+    context = g_option_context_new(_("- Transcode media formats"));
+    g_option_context_add_main_entries(context, entries, GETTEXT_PACKAGE);
+    g_option_context_add_group(context, gtk_get_option_group(TRUE));
+#if defined(_ENABLE_GST)
+    g_option_context_add_group(context, gst_init_get_option_group());
+#endif
+    g_option_context_parse(context, &argc, &argv, &error);
+    if (error != NULL)
+    {
+        g_warning("%s: %s", G_STRFUNC, error->message);
+        g_clear_error(&error);
+    }
+    g_option_context_free(context);
+    if (argc > 1 && dvd_device == NULL && argv[1][0] != '-')
+    {
+        dvd_device = argv[1];
+    }
+
+#if defined(_WIN32)
+    if (win32_console)
+    {
+        // Enable console logging
+        if(AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()){
+            close(STDOUT_FILENO);
+            freopen("CONOUT$", "w", stdout);
+            close(STDERR_FILENO);
+            freopen("CONOUT$", "w", stderr);
+        }
+    }
+    else
+    {
+        // Non-console windows apps do not have a stderr->_file
+        // assigned properly
+        stderr->_file = STDERR_FILENO;
+        stdout->_file = STDOUT_FILENO;
+    }
+#endif
+
+    int                  status;
+    signal_user_data_t * ud;
+
+    ghb_ui_register_resource();
+    ud = g_malloc0(sizeof(signal_user_data_t));
+    ud->app = gtk_application_new("org.handbrake.ghb",
+                                  G_APPLICATION_FLAGS_NONE);
+    g_signal_connect(ud->app, "activate", (GCallback)ghb_activate_cb, ud);
+    status = g_application_run(G_APPLICATION(ud->app), argc, argv);
 
-    gtk_main();
     ghb_backend_close();
 
+    // Remove stderr redirection
+    g_source_remove(ud->stderr_src_id);
     ghb_value_free(&ud->queue);
     ghb_value_free(&ud->settings_array);
     ghb_value_free(&ud->prefs);
@@ -1240,5 +1362,5 @@ main(int argc, char *argv[])
     g_free(ud->current_dvd_device);
     g_free(ud);
 
-    return 0;
+    return status;
 }
index e2ed0c226f6759e92a92562cfbff3188df356b6a..717611b3ce7e72abfe95af31517ba9e1f9a046ec 100644 (file)
@@ -6,9 +6,6 @@ import json
 
 DepEntry = collections.namedtuple('DepEntry', 'widget dep enable die hide')
 dep_map = (
-    DepEntry("title", "queue_add", "none", True, False),
-    DepEntry("title", "queue_add_menu", "none", True, False),
-    DepEntry("title", "queue_add_multiple_menu", "none", True, False),
     DepEntry("title", "preview_frame", "none", True, False),
     DepEntry("title", "chapters_tab", "none", True, False),
     DepEntry("title", "start_point", "none", True, False),
index cc80434bd3cf093ccf17840dfe05e362657c320c..a8d50b660f3f224137eeecb88584147861c21e7b 100644 (file)
@@ -531,8 +531,57 @@ ghb_settings_to_ui(signal_user_data_t *ud, GhbValue *dict)
     ghb_value_free(&tmp);
 }
 
+char*
+preset_get_fullname(hb_preset_index_t *path, const char * sep)
+{
+    int                ii;
+    GString           *gstr;
+    hb_preset_index_t *tmp;
+    GhbValue          *dict;
+
+    gstr = g_string_new("");
+    tmp  = hb_preset_index_dup(path);
+    for (ii = 1; ii <= path->depth; ii++)
+    {
+        const char *name;
+        tmp->depth = ii;
+        dict = hb_preset_get(tmp);
+        if (dict == NULL)
+        {
+            break;
+        }
+        name = ghb_dict_get_string(dict, "PresetName");
+        if (name != NULL)
+        {
+            g_string_append(gstr, sep);
+            g_string_append(gstr, name);
+        }
+    }
+    free(tmp);
+    char *str = g_string_free(gstr, FALSE);
+    return str;
+}
+
 static void
-select_preset2(GtkBuilder *builder, hb_preset_index_t *path)
+set_preset_menu_button_label(signal_user_data_t *ud, hb_preset_index_t *path)
+{
+    char              * fullname, * text;
+    GtkLabel          * label;
+    GhbValue          * dict;
+    int                 type;
+
+    dict = hb_preset_get(path);
+    type = ghb_dict_get_int(dict, "Type");
+    fullname = preset_get_fullname(path, " > ");
+    label = GTK_LABEL(GHB_WIDGET(ud->builder, "presets_menu_button_label"));
+    text = g_strdup_printf("%s%s", type ? "Custom" : "Official", fullname);
+    gtk_label_set_text(label, text);
+    free(fullname);
+    free(text);
+}
+
+static void
+select_preset2(signal_user_data_t *ud, hb_preset_index_t *path)
 {
     GtkTreeView      *treeview;
     GtkTreeSelection *selection;
@@ -543,7 +592,7 @@ select_preset2(GtkBuilder *builder, hb_preset_index_t *path)
     if (path == NULL || path->depth == 0)
         return;
 
-    treeview  = GTK_TREE_VIEW(GHB_WIDGET(builder, "presets_list"));
+    treeview  = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "presets_list"));
     selection = gtk_tree_view_get_selection (treeview);
     store     = gtk_tree_view_get_model (treeview);
     treepath  = ghb_tree_path_new_from_index(path);
@@ -563,30 +612,31 @@ select_preset2(GtkBuilder *builder, hb_preset_index_t *path)
         gtk_tree_view_scroll_to_cell(treeview, treepath, NULL, FALSE, 0, 0);
         gtk_tree_path_free(treepath);
     }
+    set_preset_menu_button_label(ud, path);
 }
 
 void
-ghb_select_preset(GtkBuilder *builder, const char *name)
+ghb_select_preset(signal_user_data_t *ud, const char *name)
 {
     hb_preset_index_t *path;
 
     path = hb_preset_search_index(name, 1);
     if (path != NULL)
     {
-        select_preset2(builder, path);
+        select_preset2(ud, path);
         free(path);
     }
 }
 
 void
-ghb_select_default_preset(GtkBuilder *builder)
+ghb_select_default_preset(signal_user_data_t *ud)
 {
     hb_preset_index_t *path;
 
     path = hb_presets_get_default_index();
     if (path != NULL)
     {
-        select_preset2(builder, path);
+        select_preset2(ud, path);
         g_free(path);
     }
 }
@@ -1073,6 +1123,134 @@ get_preset_color(gint type, gboolean is_folder)
     return color;
 }
 
+hb_preset_index_t *
+get_selected_path(signal_user_data_t *ud)
+{
+    GtkTreeView      *treeview;
+    GtkTreeSelection *selection;
+    GtkTreeModel     *store;
+    GtkTreeIter       iter;
+
+    treeview  = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "presets_list"));
+    selection = gtk_tree_view_get_selection(treeview);
+    if (gtk_tree_selection_get_selected(selection, &store, &iter))
+    {
+        return ghb_tree_get_index(store, &iter);
+    }
+    return NULL;
+}
+
+G_MODULE_EXPORT void
+preset_select_action_cb(GSimpleAction *action, GVariant *value,
+                        signal_user_data_t *ud)
+{
+    const char        * preset_path = g_variant_get_string(value, NULL);
+
+    printf("value %s\n", preset_path);
+    ghb_select_preset(ud, preset_path);
+}
+
+#if 1
+void
+ghb_presets_menu_init(signal_user_data_t *ud)
+{
+    GMenu             * menu = g_menu_new();
+    hb_preset_index_t * path;
+    GhbValue          * presets;
+    int                 menu_count, submenu_count, type, ii, jj;
+
+    // Add official presets
+    path   = hb_preset_index_init(NULL, 0);
+    presets = hb_presets_get_folder_children(path);
+    if (presets == NULL)
+    {
+        g_warning(_("ghb_presets_menu_init: Failed to find presets folder."));
+        g_free(path);
+        return;
+    }
+
+    menu_count = ghb_array_len(presets);
+    path->depth++;
+    // Process Official Presets in first pass, then Custom Presets
+    for (type = 0; type < 2; type++)
+    {
+        GMenu * section = g_menu_new();
+        for (ii = 0; ii < menu_count; ii++)
+        {
+            GhbValue    * dict;
+            const gchar * folder_name;
+            gint          folder_type;
+            gboolean      is_folder;
+            GhbValue    * folder;
+            GString     * folder_str;
+
+            path->index[path->depth-1] = ii;
+
+            dict        = ghb_array_get(presets, ii);
+            folder_name = ghb_dict_get_string(dict, "PresetName");
+            folder_type = ghb_dict_get_int(dict, "Type");
+            is_folder   = ghb_dict_get_bool(dict, "Folder");
+
+            if (folder_type != type)
+            {
+                continue;
+            }
+
+            folder_str = g_string_new("");
+            g_string_append_printf(folder_str, "/%s", folder_name);
+            if (is_folder)
+            {
+                GMenu * submenu = g_menu_new();
+
+                folder = hb_presets_get_folder_children(path);
+                submenu_count = ghb_array_len(folder);
+                for (jj = 0; jj < submenu_count; jj++)
+                {
+                    const gchar * name;
+                    GString     * preset_str = g_string_new(folder_str->str);
+
+                    dict        = ghb_array_get(folder, jj);
+                    name        = ghb_dict_get_string(dict, "PresetName");
+                    type        = ghb_dict_get_int(dict, "Type");
+                    is_folder   = ghb_dict_get_bool(dict, "Folder");
+
+                    // Sanity check, Preset types must match their folder
+                    if (type != folder_type)
+                    {
+                        continue;
+                    }
+                    // Enforce 2 level limit
+                    if (is_folder)
+                    {
+                        continue;
+                    }
+                    g_string_append_printf(preset_str, "/%s", name);
+
+                    char * preset_path;
+                    char * detail_action;
+
+                    preset_path = g_string_free(preset_str, FALSE);
+                    detail_action = g_strdup_printf("app.preset-select(\"%s\")",
+                                                    preset_path);
+                    g_menu_append(submenu, name, detail_action);
+                    free(preset_path);
+                }
+                g_menu_append_submenu(section, folder_name,
+                                      G_MENU_MODEL(submenu));
+            }
+            g_string_free(folder_str, TRUE);
+        }
+        g_menu_append_section(menu, type ? "Custom" : "Official",
+                              G_MENU_MODEL(section));
+    }
+
+    GtkMenuButton * mb;
+
+    mb = GTK_MENU_BUTTON(GHB_WIDGET(ud->builder, "presets_menu_button"));
+    gtk_menu_button_set_menu_model(mb, G_MENU_MODEL(menu));
+}
+#endif
+
 void
 ghb_presets_list_init(signal_user_data_t *ud, const hb_preset_index_t *path)
 {
@@ -1696,7 +1874,7 @@ settings_save(signal_user_data_t *ud, hb_preset_index_t *path, const char *name)
 
     ud->dont_clear_presets = TRUE;
     // Make the new preset the selected item
-    select_preset2(ud->builder, path);
+    select_preset2(ud, path);
     ud->dont_clear_presets = FALSE;
     return;
 }
@@ -1760,7 +1938,8 @@ folder_save(signal_user_data_t *ud, hb_preset_index_t *path, const char *name)
 }
 
 G_MODULE_EXPORT void
-preset_import_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+preset_import_action_cb(GSimpleAction *action, GVariant *param,
+                        signal_user_data_t *ud)
 {
     GtkWindow       *hb_window;
     GtkWidget       *dialog;
@@ -1831,38 +2010,22 @@ preset_import_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
         ghb_presets_list_reinit(ud);
         if (index < 0)
         {
-            ghb_select_default_preset(ud->builder);
+            ghb_select_default_preset(ud);
         }
         else
         {
             hb_preset_index_t path;
             path.index[0] = index;
             path.depth = 1;
-            select_preset2(ud->builder, &path);
+            select_preset2(ud, &path);
         }
     }
     gtk_widget_destroy(dialog);
 }
 
-hb_preset_index_t *
-get_selected_path(signal_user_data_t *ud)
-{
-    GtkTreeView      *treeview;
-    GtkTreeSelection *selection;
-    GtkTreeModel     *store;
-    GtkTreeIter       iter;
-
-    treeview  = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "presets_list"));
-    selection = gtk_tree_view_get_selection(treeview);
-    if (gtk_tree_selection_get_selected(selection, &store, &iter))
-    {
-        return ghb_tree_get_index(store, &iter);
-    }
-    return NULL;
-}
-
 G_MODULE_EXPORT void
-preset_export_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+preset_export_action_cb(GSimpleAction *action, GVariant *param,
+                        signal_user_data_t *ud)
 {
     hb_preset_index_t *path;
     const gchar       *name;
@@ -1939,7 +2102,8 @@ preset_export_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-presets_new_folder_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+preset_folder_action_cb(GSimpleAction *action, GVariant *param,
+                        signal_user_data_t *ud)
 {
     GtkWidget         *dialog;
     GtkEntry          *entry;
@@ -1972,7 +2136,8 @@ presets_new_folder_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-presets_save_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+preset_save_action_cb(GSimpleAction *action, GVariant *param,
+                      signal_user_data_t *ud)
 {
     const gchar       *name;
     const gchar       *fullname;
@@ -2028,18 +2193,20 @@ preset_type_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-presets_restore_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+presets_reload_action_cb(GSimpleAction *action, GVariant *param,
+                         signal_user_data_t *ud)
 {
     // Reload the builtin presets
     hb_presets_builtin_update();
     store_presets();
 
     ghb_presets_list_reinit(ud);
-    ghb_select_default_preset(ud->builder);
+    ghb_select_default_preset(ud);
 }
 
 G_MODULE_EXPORT void
-presets_remove_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+preset_remove_action_cb(GSimpleAction *action, GVariant *param,
+                        signal_user_data_t *ud)
 {
     GtkTreeView      *treeview;
     GtkTreeSelection *selection;
@@ -2102,7 +2269,7 @@ presets_remove_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
                 hb_preset_index_t *path;
 
                 path = ghb_tree_get_index(store, &nextIter);
-                select_preset2(ud->builder, path);
+                select_preset2(ud, path);
                 free(path);
             }
         }
@@ -2364,7 +2531,7 @@ presets_drag_cb(
             // UI elements were shuffled again.  recompute dst_path
             dst_path = ghb_tree_get_index(dst_model, &iter);
             presets_list_update_item(ud, dst_path, TRUE);
-            select_preset2(ud->builder, dst_path);
+            select_preset2(ud, dst_path);
             free(dst_path);
 
             store_presets();
@@ -2411,37 +2578,6 @@ presets_row_expanded_cb(
     store_presets();
 }
 
-char*
-preset_get_fullname(hb_preset_index_t *path)
-{
-    int                ii;
-    GString           *gstr;
-    hb_preset_index_t *tmp;
-    GhbValue          *dict;
-
-    gstr = g_string_new("");
-    tmp  = hb_preset_index_dup(path);
-    for (ii = 1; ii <= path->depth; ii++)
-    {
-        const char *name;
-        tmp->depth = ii;
-        dict = hb_preset_get(tmp);
-        if (dict == NULL)
-        {
-            break;
-        }
-        name = ghb_dict_get_string(dict, "PresetName");
-        if (name != NULL)
-        {
-            g_string_append(gstr, "/");
-            g_string_append(gstr, name);
-        }
-    }
-    free(tmp);
-    char *str = g_string_free(gstr, FALSE);
-    return str;
-}
-
 // Makes a copy of the preset and assigns "PresetFullName" which
 // is use to look up the preset in the preset list should the need
 // arrise, e.g. saving changes to the preset.
@@ -2467,7 +2603,7 @@ ghb_get_current_preset(signal_user_data_t *ud)
             char *fullname;
 
             preset   = hb_value_dup(preset);
-            fullname = preset_get_fullname(path);
+            fullname = preset_get_fullname(path, "/");
             ghb_dict_set_string(preset, "PresetFullName", fullname);
             free(fullname);
         }
@@ -2479,10 +2615,10 @@ ghb_get_current_preset(signal_user_data_t *ud)
 G_MODULE_EXPORT void
 presets_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
 {
-    GtkWidget         *widget;
-    hb_preset_index_t *path;
+    GtkWidget         * widget;
+    hb_preset_index_t * path;
+    gboolean            sensitive = FALSE;
 
-    widget = GHB_WIDGET (ud->builder, "presets_remove");
     path   = get_selected_path(ud);
     if (path != NULL)
     {
@@ -2491,20 +2627,19 @@ presets_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_
             !ghb_dict_get_bool(ud->settings, "preset_reload"))
         {
             ghb_preset_to_settings(ud->settings, dict);
-            char *fullname = preset_get_fullname(path);
+            char *fullname = preset_get_fullname(path, "/");
             ghb_dict_set_string(ud->settings, "PresetFullName", fullname);
             free(fullname);
             ghb_set_current_title_settings(ud);
             ghb_load_post_settings(ud);
+            set_preset_menu_button_label(ud, path);
         }
-        gtk_widget_set_sensitive(widget, TRUE);
         free(path);
     }
-    else
-    {
-        g_debug(_("No selection???  Perhaps unselected."));
-        gtk_widget_set_sensitive(widget, FALSE);
-    }
+    widget = GHB_WIDGET (ud->builder, "presets_remove");
+    gtk_widget_set_sensitive(widget, sensitive);
+    widget = GHB_WIDGET (ud->builder, "presets_window_remove");
+    gtk_widget_set_sensitive(widget, sensitive);
 }
 
 void
@@ -2521,7 +2656,8 @@ ghb_clear_presets_selection(signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-presets_default_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+preset_default_action_cb(GSimpleAction *action, GVariant *param,
+                         signal_user_data_t *ud)
 {
     hb_preset_index_t *path = get_selected_path(ud);
     if (path != NULL)
index d2d385372822acc33a4323c9a29f4b99a61b959f..b711373752046c12e72d64f1bb954f258b2bf9ee 100644 (file)
@@ -42,10 +42,11 @@ gchar* ghb_get_user_config_dir(gchar *subdir);
 void ghb_override_user_config_dir(char *dir);
 void ghb_settings_to_ui(signal_user_data_t *ud, GhbValue *dict);
 void ghb_clear_presets_selection(signal_user_data_t *ud);
-void ghb_select_preset(GtkBuilder *builder, const char *name);
-void ghb_select_default_preset(GtkBuilder *builder);
+void ghb_select_preset(signal_user_data_t *ud, const char *name);
+void ghb_select_default_preset(signal_user_data_t *ud);
 void ghb_presets_list_init(signal_user_data_t *ud,
                            const hb_preset_index_t *path);
+void ghb_presets_menu_init(signal_user_data_t *ud);
 int ghb_find_pid_file();
 void ghb_write_pid_file();
 GhbValue* ghb_get_current_preset(signal_user_data_t *ud);
index 9dcf81c4f09cb84228b1fc33328ed892ee8ac238..508e284b9de5ddd4839fdec822d5dc8cb5013466 100644 (file)
@@ -936,7 +936,7 @@ init_preview_image(signal_user_data_t *ud)
 
     title_id = ghb_dict_get_int(ud->settings, "title");
     title = ghb_lookup_title(title_id, &titleindex);
-    if (title == NULL)
+    if (title == NULL && ud->preview->pix != NULL)
     {
         g_object_unref(ud->preview->pix);
         ud->preview->pix = NULL;
@@ -1068,22 +1068,19 @@ preview_button_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, si
 }
 
 void
-ghb_preview_set_visible(signal_user_data_t *ud)
+ghb_preview_set_visible(signal_user_data_t *ud, gboolean visible)
 {
+    GtkWidget *widget;
+#if 0
     gint title_id, titleindex;
     const hb_title_t *title;
-    GtkToggleToolButton *button;
-    GtkWidget *widget;
-    gboolean active;
-
-    button = GTK_TOGGLE_TOOL_BUTTON(GHB_WIDGET(ud->builder, "show_preview"));
-    active = gtk_toggle_tool_button_get_active(button);
 
     title_id = ghb_dict_get_int(ud->settings, "title");
     title = ghb_lookup_title(title_id, &titleindex);
-    active &= title != NULL;
+    visible &= title != NULL;
+#endif
     widget = GHB_WIDGET(ud->builder, "preview_window");
-    if (active)
+    if (visible)
     {
         gint x, y;
         x = ghb_dict_get_int(ud->prefs, "preview_x");
@@ -1092,7 +1089,7 @@ ghb_preview_set_visible(signal_user_data_t *ud)
             gtk_window_move(GTK_WINDOW(widget), x, y);
         gtk_window_deiconify(GTK_WINDOW(widget));
     }
-    gtk_widget_set_visible(widget, active);
+    gtk_widget_set_visible(widget, visible);
 }
 
 static void
@@ -1113,29 +1110,14 @@ update_preview_labels(signal_user_data_t *ud, gboolean active)
 }
 
 G_MODULE_EXPORT void
-preview_toggled_cb(GtkWidget *xwidget, signal_user_data_t *ud)
-{
-    GtkCheckMenuItem *menuitem;
-    gboolean          active;
-
-    active = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(xwidget));
-    ghb_preview_set_visible(ud);
-    update_preview_labels(ud, active);
-
-    menuitem = GTK_CHECK_MENU_ITEM(GHB_WIDGET(ud->builder,
-                                              "show_preview_menu"));
-    gtk_check_menu_item_set_active(menuitem, active);
-}
-
-G_MODULE_EXPORT void
-preview_menu_toggled_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+show_preview_action_cb(GSimpleAction *action, GVariant *value,
+                       signal_user_data_t *ud)
 {
-    GtkToggleToolButton *button;
-    gboolean active;
+    gboolean state = g_variant_get_boolean(value);
 
-    active = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(xwidget));
-    button = GTK_TOGGLE_TOOL_BUTTON(GHB_WIDGET(ud->builder, "show_preview"));
-    gtk_toggle_tool_button_set_active(button, active);
+    g_simple_action_set_state(action, value);
+    ghb_preview_set_visible(ud, state);
+    update_preview_labels(ud, state);
 }
 
 G_MODULE_EXPORT void
index 0caefcecfa1a900403cc47c78ca3e84e466db59b..216e9e8df0d199a1015e68a9d8fc2406224ee095 100644 (file)
@@ -35,6 +35,6 @@ void ghb_live_encode_done(signal_user_data_t *ud, gboolean success);
 void ghb_preview_cleanup(signal_user_data_t *ud);
 void ghb_live_reset(signal_user_data_t *ud);
 void ghb_par_scale(signal_user_data_t *ud, gint *width, gint *height, gint par_n, gint par_d);
-void ghb_preview_set_visible(signal_user_data_t *ud);
+void ghb_preview_set_visible(signal_user_data_t *ud, gboolean visible);
 
 #endif // _GHB_PREVIEW_H_
index c8fdd00fc12d36f001afee371f07655dd9b57216..09c6e74e40c32062448fa2b06d31add97e361ef2 100644 (file)
@@ -973,7 +973,8 @@ open_queue_file(signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-queue_save_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
+queue_save_action_cb(GSimpleAction *action, GVariant *param,
+                     signal_user_data_t *ud)
 {
     save_queue_file(ud);
 }
@@ -1328,7 +1329,6 @@ static gboolean
 queue_add(signal_user_data_t *ud, GhbValue *settings, gint batch)
 {
     // Add settings to the queue
-    g_debug("queue_add ()");
     if (!validate_settings(ud, settings, batch))
     {
         return FALSE;
@@ -1369,9 +1369,9 @@ queue_add(signal_user_data_t *ud, GhbValue *settings, gint batch)
 }
 
 G_MODULE_EXPORT void
-queue_add_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
+queue_add_action_cb(GSimpleAction *action, GVariant *param,
+                    signal_user_data_t *ud)
 {
-    g_debug("queue_add_clicked_cb ()");
     queue_add(ud, ud->settings, 0);
     // Validation of settings may have changed audio list
     ghb_audio_list_refresh_all(ud);
@@ -1830,10 +1830,9 @@ GtkWidget * title_create_row(signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-queue_add_multiple_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
+queue_add_all_action_cb(GSimpleAction *action, GVariant *param,
+                        signal_user_data_t *ud)
 {
-    g_debug("queue_add_multiple_clicked_cb ()");
-
     GtkListBox *list;
     GtkWidget *row;
     gint count, ii;
@@ -1974,6 +1973,7 @@ ghb_queue_remove_row(signal_user_data_t *ud, int row)
 {
     ghb_queue_remove_row_internal(ud, row);
     ghb_save_queue(ud->queue);
+    ghb_queue_buttons_grey(ud);
 }
 
 G_MODULE_EXPORT void
@@ -1988,6 +1988,7 @@ queue_delete_all_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
     }
     ghb_save_queue(ud->queue);
     ghb_update_pending(ud);
+    ghb_queue_buttons_grey(ud);
 }
 
 G_MODULE_EXPORT void
@@ -2003,7 +2004,6 @@ queue_remove_clicked_cb(GtkWidget *widget, gchar *path, signal_user_data_t *ud)
     GhbValue *queueDict, *uiDict;
     gint status;
 
-    g_debug("queue_remove_clicked_cb ()");
     treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "queue_list"));
     store = gtk_tree_view_get_model(treeview);
     treepath = gtk_tree_path_new_from_string (path);
@@ -2043,6 +2043,7 @@ queue_remove_clicked_cb(GtkWidget *widget, gchar *path, signal_user_data_t *ud)
         gtk_tree_path_free (treepath);
     }
     ghb_update_pending(ud);
+    ghb_queue_buttons_grey(ud);
 }
 
 static gint
@@ -2267,12 +2268,13 @@ queue_drag_cb(
 void
 ghb_queue_buttons_grey(signal_user_data_t *ud)
 {
-    GtkWidget *widget;
+    GtkWidget       * widget;
+    GSimpleAction   * action;
     gint queue_count;
     gint title_id, titleindex;
     const hb_title_t *title;
     gint queue_state, scan_state;
-    gboolean show_start, show_stop, paused;
+    gboolean allow_start, show_stop, allow_add, paused;
 
     queue_count = ghb_array_len(ud->queue);
     title_id = ghb_dict_get_int(ud->settings, "title");
@@ -2281,50 +2283,54 @@ ghb_queue_buttons_grey(signal_user_data_t *ud)
     queue_state = ghb_get_queue_state();
     scan_state = ghb_get_scan_state();
 
-    show_stop = queue_state &
-                (GHB_STATE_WORKING | GHB_STATE_SEARCHING |
-                 GHB_STATE_SCANNING | GHB_STATE_MUXING | GHB_STATE_PAUSED);
-    show_start = !(scan_state & GHB_STATE_SCANNING) &&
-                    (title !=NULL || queue_count > 0);
+    show_stop   = queue_state &
+                  (GHB_STATE_WORKING | GHB_STATE_SEARCHING |
+                   GHB_STATE_SCANNING | GHB_STATE_MUXING | GHB_STATE_PAUSED);
+    allow_start = !(scan_state & GHB_STATE_SCANNING) &&
+                    (title != NULL || queue_count > 0);
+    allow_add   = !(scan_state & GHB_STATE_SCANNING) && title != NULL;
 
 
     paused = queue_state & GHB_STATE_PAUSED;
 
-    widget = GHB_WIDGET(ud->builder, "queue_save");
-    gtk_widget_set_sensitive(widget, !!queue_count);
-    widget = GHB_WIDGET(ud->builder, "queue_add");
-    gtk_widget_set_sensitive(widget, show_start);
-    widget = GHB_WIDGET(ud->builder, "queue_add_menu");
-    gtk_widget_set_sensitive(widget, show_start);
-    widget = GHB_WIDGET(ud->builder, "queue_add_multiple_menu");
-    gtk_widget_set_sensitive(widget, show_start);
-
-    widget = GHB_WIDGET (ud->builder, "queue_start1");
+    action = G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(ud->app),
+                                                        "queue-save"));
+    g_simple_action_set_enabled(action, !!queue_count);
+    action = G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(ud->app),
+                                                        "queue-add"));
+    g_simple_action_set_enabled(action, allow_add);
+    action = G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(ud->app),
+                                                        "queue-add-all"));
+    g_simple_action_set_enabled(action, allow_add);
+    action = G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(ud->app),
+                                                        "queue-start"));
+    g_simple_action_set_enabled(action, allow_start || show_stop);
+    action = G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(ud->app),
+                                                        "queue-pause"));
+    g_simple_action_set_enabled(action, show_stop);
+
+    widget = GHB_WIDGET (ud->builder, "queue_start");
     if (show_stop)
     {
-        gtk_widget_set_sensitive (widget, TRUE);
         gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(widget), "hb-stop");
         gtk_tool_button_set_label(GTK_TOOL_BUTTON(widget), _("Stop\nEncoding"));
         gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), _("Stop Encoding"));
     }
     else
     {
-        gtk_widget_set_sensitive (widget, show_start);
         gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(widget), "hb-start");
         gtk_tool_button_set_label(GTK_TOOL_BUTTON(widget), _("Start\nEncoding"));
         gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), _("Start Encoding"));
     }
-    widget = GHB_WIDGET (ud->builder, "queue_pause1");
+    widget = GHB_WIDGET (ud->builder, "queue_pause");
     if (paused)
     {
-        gtk_widget_set_sensitive (widget, show_stop);
         gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(widget), "hb-start");
         gtk_tool_button_set_label(GTK_TOOL_BUTTON(widget), _("Resume\nEncoding"));
         gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), _("Resume Encoding"));
     }
     else
     {
-        gtk_widget_set_sensitive (widget, show_stop);
         gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(widget), "hb-pause");
         gtk_tool_button_set_label(GTK_TOOL_BUTTON(widget), _("Pause\nEncoding"));
         gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), _("Pause Encoding"));
@@ -2333,26 +2339,22 @@ ghb_queue_buttons_grey(signal_user_data_t *ud)
     widget = GHB_WIDGET (ud->builder, "queue_start_menu");
     if (show_stop)
     {
-        gtk_widget_set_sensitive (widget, TRUE);
         gtk_menu_item_set_label(GTK_MENU_ITEM(widget), _("S_top Encoding"));
         gtk_widget_set_tooltip_text(widget, _("Stop Encoding"));
     }
     else
     {
-        gtk_widget_set_sensitive (widget, show_start);
         gtk_menu_item_set_label(GTK_MENU_ITEM(widget), _("_Start Encoding"));
         gtk_widget_set_tooltip_text(widget, _("Start Encoding"));
     }
     widget = GHB_WIDGET (ud->builder, "queue_pause_menu");
     if (paused)
     {
-        gtk_widget_set_sensitive (widget, show_start);
         gtk_menu_item_set_label(GTK_MENU_ITEM(widget), _("_Resume Encoding"));
         gtk_widget_set_tooltip_text(widget, _("Resume Encoding"));
     }
     else
     {
-        gtk_widget_set_sensitive (widget, show_stop);
         gtk_menu_item_set_label(GTK_MENU_ITEM(widget), _("_Pause Encoding"));
         gtk_widget_set_tooltip_text(widget, _("Pause Encoding"));
     }
@@ -2374,7 +2376,8 @@ queue_list_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, GtkCel
 }
 
 G_MODULE_EXPORT void
-queue_start_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+queue_start_action_cb(GSimpleAction *action, GVariant *param,
+                      signal_user_data_t *ud)
 {
     GhbValue *queueDict, *uiDict;
     gboolean running = FALSE;
@@ -2423,7 +2426,8 @@ queue_start_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-queue_pause_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+queue_pause_action_cb(GSimpleAction *action, GVariant *param,
+                      signal_user_data_t *ud)
 {
     ghb_pause_resume_queue();
 }
index 515dc43aebf3f0d3f1024a7af6816f3c7679ef86..3fb95344f3972d4f5c7c0213ca43a7331295ae55 100644 (file)
@@ -48,21 +48,21 @@ ghb_resource_init()
     GResource *data_res = ghb_data_get_resource();
 
     gbytes = g_resource_lookup_data(data_res,
-                        "/org/handbrake/data/internal_defaults.json", 0, NULL);
+                    "/org/handbrake/ghb/data/internal_defaults.json", 0, NULL);
     data = g_bytes_get_data(gbytes, &data_size);
     val = ghb_json_parse(data);
     g_bytes_unref(gbytes);
     ghb_dict_set(resources, "internal-defaults", val);
 
     gbytes = g_resource_lookup_data(data_res,
-                        "/org/handbrake/data/widget.deps", 0, NULL);
+                    "/org/handbrake/ghb/data/widget.deps", 0, NULL);
     data = g_bytes_get_data(gbytes, &data_size);
     val = ghb_json_parse(data);
     g_bytes_unref(gbytes);
     ghb_dict_set(resources, "widget-deps", val);
 
     gbytes = g_resource_lookup_data(data_res,
-                        "/org/handbrake/data/widget_reverse.deps", 0, NULL);
+                    "/org/handbrake/ghb/data/widget_reverse.deps", 0, NULL);
     data = g_bytes_get_data(gbytes, &data_size);
     val = ghb_json_parse(data);
     g_bytes_unref(gbytes);
index 22ad7a6b83d5c9cc09439d770082f609a573bf31..13470e45ffe2d8903582f31214eb3ad4119de691 100644 (file)
@@ -29,7 +29,6 @@
 
 #define GHB_WIDGET(b,n) GTK_WIDGET(gtk_builder_get_object ((b), (n)))
 //#define GHB_WIDGET(b,n)   GTK_WIDGET(debug_get_object((b), (n)))
-#define GHB_ACTION(b,n) GTK_ACTION(gtk_builder_get_object ((b), (n)))
 #define GHB_OBJECT(b,n) gtk_builder_get_object ((b), (n))
 
 GObject* debug_get_object(GtkBuilder *b, const gchar *n);
@@ -59,23 +58,25 @@ typedef struct preview_s preview_t;
 typedef struct
 {
     gchar *current_dvd_device;
-    gboolean debug;
-    gboolean dont_clear_presets;
-    gboolean scale_busy;
-    gint cancel_encode;
-    GtkBuilder *builder;
-    GhbValue *x264_priv;
-    GhbValue *globals;
-    GhbValue *prefs;
-    GhbValue *settings;
-    GhbValue *settings_array;
-    GhbValue *queue;
-    GIOChannel *activity_log;
-    GIOChannel *job_activity_log;
-    preview_t *preview;
-    gchar *appcast;
-    gint appcast_len;
-    GdkVisibilityState hb_visibility;
+    gboolean              debug;
+    gboolean              dont_clear_presets;
+    gboolean              scale_busy;
+    gint                  cancel_encode;
+    GtkBuilder          * builder;
+    GhbValue            * x264_priv;
+    GhbValue            * globals;
+    GhbValue            * prefs;
+    GhbValue            * settings;
+    GhbValue            * settings_array;
+    GhbValue            * queue;
+    GIOChannel          * activity_log;
+    GIOChannel          * job_activity_log;
+    preview_t           * preview;
+    gchar               * appcast;
+    gint                  appcast_len;
+    GdkVisibilityState    hb_visibility;
+    int                   stderr_src_id;
+    GtkApplication      * app;
 } signal_user_data_t;
 
 enum
index 214aa8ce7bb80b6d3b5ff290fbbc432a2257233e..0a06993d623da1c31a9901d67260685ecdd017c3 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <gresources>
-  <gresource prefix="/org/handbrake/ui">
+  <gresource prefix="/org/handbrake/ghb/ui">
     <file>ghb.ui</file>
   </gresource>
 </gresources>