#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"
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.
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;
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++)
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"
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");
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]));
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);
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);
}
}
// Nothing pending
ghb_uninhibit_gpm();
+ ghb_notify_done(ud);
return NULL;
}
// Find the next pending item after the current running item
}
// Nothing found
ghb_uninhibit_gpm();
+ ghb_notify_done(ud);
return NULL;
}
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)
{
}
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");
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);
}
}
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++;
}
}
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);
// 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);
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");
}
else
{
- ghb_hb_cleanup(TRUE);
prune_logs(ud);
ghb_backend_scan("/dev/null", 0, 1);
}
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);
+}