OSDN Git Service

LinGui: first cut at anamorphic picture settings enhancements
[handbrake-jp/handbrake-jp-git.git] / gtk / src / callbacks.c
index acb434e..61b6bf8 100644 (file)
@@ -29,6 +29,7 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 #include <gio/gio.h>
+#include <libnotify/notify.h>
 
 #include "hb.h"
 #include "callbacks.h"
@@ -48,6 +49,7 @@
 static void update_chapter_list(signal_user_data_t *ud);
 static GList* dvd_device_list();
 static void prune_logs(signal_user_data_t *ud);
+void ghb_notify_done(signal_user_data_t *ud);
 
 // This is a dependency map used for greying widgets
 // that are dependent on the state of another widget.
@@ -79,6 +81,7 @@ dep_check(signal_user_data_t *ud, const gchar *name, gboolean *out_hide)
        
        g_debug("dep_check () %s", name);
 
+       if (rev_map == NULL) return TRUE;
        array = ghb_dict_lookup(rev_map, name);
        count = ghb_array_len(array);
        *out_hide = FALSE;
@@ -172,6 +175,7 @@ ghb_check_dependency(signal_user_data_t *ud, GtkWidget *widget)
        name = gtk_widget_get_name(widget);
        g_debug("ghb_check_dependency () %s", name);
 
+       if (dep_map == NULL) return;
        array = ghb_dict_lookup(dep_map, name);
        count = ghb_array_len(array);
        for (ii = 0; ii < count; ii++)
@@ -219,6 +223,7 @@ ghb_check_all_depencencies(signal_user_data_t *ud)
        GObject *dep_object;
 
        g_debug("ghb_check_all_depencencies ()");
+       if (rev_map == NULL) return;
        ghb_dict_iter_init(&iter, rev_map);
        // middle (void*) cast prevents gcc warning "defreferencing type-punned
        // pointer will break strict-aliasing rules"
@@ -619,7 +624,6 @@ ghb_do_scan(
                        path = ghb_settings_get_string( ud->settings, "source");
                        gtk_progress_bar_set_fraction (progress, 0);
                        gtk_progress_bar_set_text (progress, "Scanning ...");
-                       ghb_hb_cleanup(TRUE);
                        prune_logs(ud);
                        gint preview_count;
                        preview_count = ghb_settings_get_int(ud->settings, "preview_count");
@@ -1027,10 +1031,11 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
        ghb_ui_update(ud, "scale_width", 
                ghb_int64_value(tinfo->width - tinfo->crop[2] - tinfo->crop[3]));
        // If anamorphic or keep_aspect, the hight will be automatically calculated
-       gboolean keep_aspect, anamorphic;
+       gboolean keep_aspect;
+       gint pic_par;
        keep_aspect = ghb_settings_get_boolean(ud->settings, "PictureKeepRatio");
-       anamorphic = ghb_settings_get_boolean(ud->settings, "anamorphic");
-       if (!(keep_aspect || anamorphic))
+       pic_par = ghb_settings_combo_int(ud->settings, "PicturePAR");
+       if (!(keep_aspect || pic_par) || pic_par == 3)
        {
                ghb_ui_update(ud, "scale_height", 
                        ghb_int64_value(tinfo->height - tinfo->crop[0] - tinfo->crop[1]));
@@ -1116,7 +1121,7 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        gint preview_count;
        preview_count = ghb_settings_get_int(ud->settings, "preview_count");
        widget = GHB_WIDGET(ud->builder, "preview_frame");
-       gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, preview_count);
+       gtk_range_set_range (GTK_RANGE(widget), 1, preview_count);
        ghb_ui_update(ud, "preview_frame", ghb_int64_value(2));
 
        ghb_set_preview_image (ud);
@@ -1337,7 +1342,24 @@ scale_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        text = ghb_settings_get_boolean(ud->settings, "autoscale") ? "On" : "Off";
        widget = GHB_WIDGET (ud->builder, "scale_auto");
        gtk_label_set_text (GTK_LABEL(widget), text);
-       text = ghb_settings_get_boolean(ud->settings, "anamorphic") ? "On" : "Off";
+       switch (ghb_settings_combo_int(ud->settings, "PicturePAR"))
+       {
+               case 0:
+                       text = "Off";
+                       break;
+               case 1:
+                       text = "Strict";
+                       break;
+               case 2:
+                       text = "Loose";
+                       break;
+               case 3:
+                       text = "Custom";
+                       break;
+               default:
+                       text = "Unknown";
+                       break;
+       }
        widget = GHB_WIDGET (ud->builder, "scale_anamorphic");
        gtk_label_set_text (GTK_LABEL(widget), text);
 }
@@ -1517,7 +1539,7 @@ queue_scan(signal_user_data_t *ud, GValue *js)
                gchar *ver_str;
 
                ver_str = g_strdup_printf("Handbrake Version: %s (%d)\n", 
-                                                                       HB_VERSION, HB_BUILD);
+                                                                       hb_get_version(NULL), hb_get_build(NULL));
                g_io_channel_write_chars (ud->job_activity_log, ver_str, 
                                                                        -1, NULL, NULL);
                g_free(ver_str);
@@ -1558,6 +1580,7 @@ ghb_start_next_job(signal_user_data_t *ud, gboolean find_first)
                }
                // Nothing pending
                ghb_uninhibit_gpm();
+               ghb_notify_done(ud);
                return NULL;
        }
        // Find the next pending item after the current running item
@@ -1597,6 +1620,7 @@ ghb_start_next_job(signal_user_data_t *ud, gboolean find_first)
        }
        // Nothing found
        ghb_uninhibit_gpm();
+       ghb_notify_done(ud);
        return NULL;
 }
 
@@ -2091,14 +2115,6 @@ ghb_log(gchar *log, ...)
        va_end(args);
 }
 
-void
-about_activate_cb(GtkWidget *xwidget, signal_user_data_t *ud)
-{
-       GtkWidget *widget = GHB_WIDGET (ud->builder, "hb_about");
-       gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(widget), ghb_version());
-       gtk_widget_show (widget);
-}
-
 static void
 browse_url(const gchar *url)
 {
@@ -2130,6 +2146,29 @@ browse_url(const gchar *url)
 }
 
 void
+about_web_hook(GtkAboutDialog *about, const gchar *link, gpointer data)
+{
+       browse_url(link);
+}
+
+void
+about_activate_cb(GtkWidget *xwidget, 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);
+       gtk_about_dialog_set_url_hook(about_web_hook, NULL, NULL);
+       gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(widget), ver);
+       g_free(ver);
+       gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(widget), 
+                                                               HB_PROJECT_URL_WEBSITE);
+       gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(widget), 
+                                                                               HB_PROJECT_URL_WEBSITE);
+       gtk_widget_show (widget);
+}
+
+void
 guide_activate_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 {
        browse_url("http://trac.handbrake.fr/wiki/HandBrakeGuide");
@@ -2217,17 +2256,22 @@ update_chapter_list(signal_user_data_t *ud)
 
                        if (ii < count)
                        {
-                               gchar *chapter;
+                               gchar *chapter, *duration;
+                               gint hh, mm, ss;
 
                                // Update row with settings data
                                g_debug("Updating row");
                                chapter = ghb_value_string(ghb_array_get_nth(chapters, ii));
+                               ghb_get_chapter_duration(titleindex, ii, &hh, &mm, &ss);
+                               duration = g_strdup_printf("%02d:%02d:%02d", hh, mm, ss);
                                gtk_list_store_set(store, &iter, 
                                        0, ii+1,
-                                       1, chapter,
-                                       2, TRUE,
+                                       1, duration,
+                                       2, chapter,
+                                       3, TRUE,
                                        -1);
                                g_free(chapter);
+                               g_free(duration);
                                ii++;
                                done = !gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
                        }
@@ -2241,18 +2285,23 @@ update_chapter_list(signal_user_data_t *ud)
        }
        while (ii < count)
        {
-               gchar *chapter;
+               gchar *chapter, *duration;
+               gint hh, mm, ss;
 
                // Additional settings, add row
                g_debug("Adding row");
                chapter = ghb_value_string(ghb_array_get_nth(chapters, ii));
+               ghb_get_chapter_duration(titleindex, ii, &hh, &mm, &ss);
+               duration = g_strdup_printf("%02d:%02d:%02d", hh, mm, ss);
                gtk_list_store_append(store, &iter);
                gtk_list_store_set(store, &iter, 
                        0, ii+1,
-                       1, chapter,
-                       2, TRUE,
+                       1, duration,
+                       2, chapter,
+                       3, TRUE,
                        -1);
                g_free(chapter);
+               g_free(duration);
                ii++;
        }
 }
@@ -2294,8 +2343,8 @@ chapter_edited_cb(
        row = pi[0];
        gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, treepath);
        gtk_list_store_set(store, &iter, 
-               1, text,
-               2, TRUE,
+               2, text,
+               3, TRUE,
                -1);
        gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &index, -1);
 
@@ -2335,14 +2384,14 @@ chapter_edited_cb(
                // I got industrious and made my own CellTextRendererText that
                // passes on the key-press-event. So now I have much better
                // control of this.
-               column = gtk_tree_view_get_column(treeview, 1);
+               column = gtk_tree_view_get_column(treeview, 2);
                gtk_tree_view_set_cursor(treeview, treepath, column, TRUE);
        }
        else if (chapter_edit_key == GDK_Up && row > 0)
        {
                GtkTreeViewColumn *column;
                gtk_tree_path_prev(treepath);
-               column = gtk_tree_view_get_column(treeview, 1);
+               column = gtk_tree_view_get_column(treeview, 2);
                gtk_tree_view_set_cursor(treeview, treepath, column, TRUE);
        }
        gtk_tree_path_free (treepath);
@@ -2583,7 +2632,6 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud)
                        gtk_progress_bar_set_text (progress, "Scanning ...");
                        gtk_progress_bar_set_fraction (progress, 0);
                        update_source_label(ud, device);
-                       ghb_hb_cleanup(TRUE);
                        prune_logs(ud);
                        gint preview_count;
                        preview_count = ghb_settings_get_int(ud->settings, "preview_count");
@@ -2591,7 +2639,6 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud)
                }
                else
                {
-                       ghb_hb_cleanup(TRUE);
                        prune_logs(ud);
                        ghb_backend_scan("/dev/null", 0, 1);
                }
@@ -2940,7 +2987,7 @@ process_appcast(signal_user_data_t *ud)
        if (ud->appcast == NULL || ud->appcast_len < 15 || 
                strncmp(&(ud->appcast[9]), "200 OK", 6))
        {
-               if (!stable_update_lock && HB_BUILD % 100)
+               if (!stable_update_lock && hb_get_build(NULL) % 100)
                        g_idle_add((GSourceFunc)check_stable_update, ud);
                goto done;
        }
@@ -2949,14 +2996,14 @@ process_appcast(signal_user_data_t *ud)
                ibuild = g_strtod(build, NULL);
        skip = ghb_settings_get_int(ud->settings, "update_skip_version");
        if (description == NULL || build == NULL || version == NULL 
-               || ibuild <= HB_BUILD || skip == ibuild)
+               || ibuild <= hb_get_build(NULL) || skip == ibuild)
        {
-               if (!stable_update_lock && HB_BUILD % 100)
+               if (!stable_update_lock && hb_get_build(NULL) % 100)
                        g_thread_create((GThreadFunc)check_stable_update, ud, FALSE, NULL);
                goto done;
        }
        msg = g_strdup_printf("HandBrake %s/%s is now available (you have %s/%d).",
-                       version, build, HB_VERSION, HB_BUILD);
+                       version, build, hb_get_version(NULL), hb_get_build(NULL));
        label = GHB_WIDGET(ud->builder, "update_message");
        gtk_label_set_text(GTK_LABEL(label), msg);
        html = gtk_html_new_from_string(description, -1);
@@ -3079,7 +3126,7 @@ ghb_check_update(signal_user_data_t *ud)
        GError *gerror = NULL;
 
        g_debug("ghb_check_update");
-       if (HB_BUILD % 100)
+       if (hb_get_build(NULL) % 100)
        {
        query = 
                "GET /appcast_unstable.xml HTTP/1.0\r\nHost: handbrake.fr\r\n\r\n";
@@ -3122,3 +3169,35 @@ check_stable_update(signal_user_data_t *ud)
        return NULL;
 }
 
+void
+status_activate_cb(GtkStatusIcon *si, signal_user_data_t *ud)
+{
+       GtkWindow *window;
+
+       window = GTK_WINDOW(GHB_WIDGET(ud->builder, "hb_window"));
+       gtk_window_present(window);
+}
+
+static void
+notify_closed_cb(NotifyNotification *notification, signal_user_data_t *ud)
+{
+       g_object_unref(G_OBJECT(notification));
+}
+
+void
+ghb_notify_done(signal_user_data_t *ud)
+{
+       NotifyNotification *notification;
+       GtkStatusIcon *si;
+
+       si = GTK_STATUS_ICON(GHB_OBJECT(ud->builder, "hb_status"));
+       gtk_status_icon_set_from_icon_name(si, "hb-status-empty");
+       notification = notify_notification_new(
+               "Encode Complete",
+               "Put down that cocktail, Your HandBrake queue is done!",
+               "hb-icon",
+               NULL);
+       notify_notification_attach_to_status_icon(notification, si);
+       g_signal_connect(notification, "closed", (GCallback)notify_closed_cb, ud);
+       notify_notification_show(notification, NULL);
+}