X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=gtk%2Fsrc%2Fcallbacks.c;h=ec29ff6c054d8e56bfcd54e04bd999cb2b2a825f;hb=0884cb45aeeb60a46effe1d1056a61fe68300ea7;hp=ca9ac86a49fa7b1b9fa6e5553e392576ba062776;hpb=0720dc1197dc4060c4909cb9b7575c96351264f2;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/gtk/src/callbacks.c b/gtk/src/callbacks.c index ca9ac86a..ec29ff6c 100644 --- a/gtk/src/callbacks.c +++ b/gtk/src/callbacks.c @@ -22,17 +22,22 @@ #if !defined(_WIN32) #include -#include +#define G_UDEV_API_IS_SUBJECT_TO_CHANGE 1 +#include #include #include #include #include + +#if !defined(_NO_UPDATE_CHECK) #if defined(_OLD_WEBKIT) #include #else #include #endif +#endif + #include #include #else @@ -114,8 +119,7 @@ dep_check(signal_user_data_t *ud, const gchar *name, gboolean *out_hide) widget_name = ghb_value_string(ghb_array_get_nth(data, 0)); widget = GHB_WIDGET(ud->builder, widget_name); dep_object = gtk_builder_get_object(ud->builder, name); - g_free(widget_name); - if (!GTK_WIDGET_SENSITIVE(widget)) + if (widget != NULL && !GTK_WIDGET_SENSITIVE(widget)) continue; if (dep_object == NULL) { @@ -138,7 +142,7 @@ dep_check(signal_user_data_t *ud, const gchar *name, gboolean *out_hide) if (widget) value = ghb_widget_string(widget); else - value = ghb_settings_get_string(ud->settings, name); + value = ghb_settings_get_string(ud->settings, widget_name); while (values && values[jj]) { if (values[jj][0] == '>') @@ -177,12 +181,16 @@ dep_check(signal_user_data_t *ud, const gchar *name, gboolean *out_hide) g_strfreev (values); g_free(value); } + g_free(widget_name); } return result; } void -ghb_check_dependency(signal_user_data_t *ud, GtkWidget *widget) +ghb_check_dependency( + signal_user_data_t *ud, + GtkWidget *widget, + const char *alt_name) { GObject *dep_object; const gchar *name; @@ -191,11 +199,16 @@ ghb_check_dependency(signal_user_data_t *ud, GtkWidget *widget) gchar *dep_name; GType type; - type = GTK_WIDGET_TYPE(widget); - if (type == GTK_TYPE_COMBO_BOX || type == GTK_TYPE_COMBO_BOX_ENTRY) - if (gtk_combo_box_get_active(GTK_COMBO_BOX(widget)) < 0) return; + if (widget != NULL) + { + type = GTK_WIDGET_TYPE(widget); + if (type == GTK_TYPE_COMBO_BOX || type == GTK_TYPE_COMBO_BOX_ENTRY) + if (gtk_combo_box_get_active(GTK_COMBO_BOX(widget)) < 0) return; + name = ghb_get_setting_key(widget); + } + else + name = alt_name; - name = gtk_widget_get_name(widget); g_debug("ghb_check_dependency () %s", name); if (dep_map == NULL) return; @@ -288,7 +301,7 @@ on_quit1_activate(GtkMenuItem *quit, signal_user_data_t *ud) { gint state = ghb_get_queue_state(); g_debug("on_quit1_activate ()"); - if (state & GHB_STATE_WORKING) + if (state & (GHB_STATE_WORKING|GHB_STATE_SEARCHING)) { if (ghb_cancel_encode2(ud, "Closing HandBrake will terminate encoding.\n")) { @@ -572,7 +585,8 @@ set_destination(signal_user_data_t *ud) title = ghb_settings_combo_int(ud->settings, "title"); g_string_append_printf(str, " - %d", title+1); } - if (ghb_settings_get_boolean( + if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0 && + ghb_settings_get_boolean( ud->settings, "chapters_in_destination")) { gint start, end; @@ -582,8 +596,8 @@ set_destination(signal_user_data_t *ud) { g_string_append_printf(str, " -"); } - start = ghb_settings_get_int(ud->settings, "start_chapter"); - end = ghb_settings_get_int(ud->settings, "end_chapter"); + start = ghb_settings_get_int(ud->settings, "start_point"); + end = ghb_settings_get_int(ud->settings, "end_point"); if (start == end) g_string_append_printf(str, " Ch %d", start); else @@ -892,7 +906,11 @@ start_scan( return; widget = GHB_WIDGET(ud->builder, "sourcetoolbutton"); - gtk_widget_set_sensitive(widget, FALSE); + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(widget), "hb-stop"); + gtk_tool_button_set_label(GTK_TOOL_BUTTON(widget), "Stop Scan"); + gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), "Stop Scan"); + //gtk_widget_set_sensitive(widget, FALSE); + action = GHB_ACTION(ud->builder, "source_action"); gtk_action_set_sensitive(action, FALSE); action = GHB_ACTION(ud->builder, "source_single_action"); @@ -928,14 +946,14 @@ ghb_do_scan( if (filename != NULL) { last_scan_file = g_strdup(filename); - ghb_settings_set_string(ud->settings, "source", filename); + ghb_settings_set_string(ud->settings, "scan_source", filename); if (update_source_label(ud, filename, TRUE)) { gchar *path; gint preview_count; show_scan_progress(ud); - path = ghb_settings_get_string( ud->settings, "source"); + path = ghb_settings_get_string( ud->settings, "scan_source"); prune_logs(ud); preview_count = ghb_settings_get_int(ud->settings, "preview_count"); @@ -956,7 +974,7 @@ update_source_name(gpointer data) GtkWidget *dialog; gchar *sourcename; - sourcename = ghb_settings_get_string(ud->settings, "source"); + sourcename = ghb_settings_get_string(ud->settings, "scan_source"); dialog = GHB_WIDGET(ud->builder, "source_dialog"); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), sourcename); g_free(sourcename); @@ -973,7 +991,7 @@ do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud) gboolean checkbutton_active; g_debug("source_browse_clicked_cb ()"); - sourcename = ghb_settings_get_string(ud->settings, "source"); + sourcename = ghb_settings_get_string(ud->settings, "scan_source"); checkbutton_active = FALSE; if (g_file_test(sourcename, G_FILE_TEST_IS_DIR)) { @@ -1030,7 +1048,16 @@ do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud) G_MODULE_EXPORT void source_button_clicked_cb(GtkButton *button, signal_user_data_t *ud) { - do_source_dialog(button, FALSE, ud); + ghb_status_t status; + ghb_get_status(&status); + if (status.scan.state & GHB_STATE_SCANNING) + { + ghb_backend_scan_stop(); + } + else + { + do_source_dialog(button, FALSE, ud); + } } G_MODULE_EXPORT void @@ -1045,8 +1072,8 @@ dvd_source_activate_cb(GtkAction *action, signal_user_data_t *ud) const gchar *filename; gchar *sourcename; - sourcename = ghb_settings_get_string(ud->settings, "source"); - filename = gtk_action_get_name(action); + sourcename = ghb_settings_get_string(ud->settings, "scan_source"); + filename = gtk_buildable_get_name(GTK_BUILDABLE(action)); ghb_do_scan(ud, filename, 0, TRUE); if (strcmp(sourcename, filename) != 0) { @@ -1238,7 +1265,7 @@ window_delete_event_cb(GtkWidget *widget, GdkEvent *event, signal_user_data_t *u { gint state = ghb_get_queue_state(); g_debug("window_delete_event_cb ()"); - if (state & GHB_STATE_WORKING) + if (state & (GHB_STATE_WORKING|GHB_STATE_SEARCHING)) { if (ghb_cancel_encode2(ud, "Closing HandBrake will terminate encoding.\n")) { @@ -1266,7 +1293,7 @@ container_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("container_changed_cb ()"); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); update_acodec_combo(ud); ghb_update_destination_extension(ud); ghb_clear_presets_selection(ud); @@ -1301,25 +1328,87 @@ get_rate_string(gint rate_base, gint rate) rate_s = g_strdup_printf("%.6g", rate_f); return rate_s; } + static void -show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo) +update_title_duration(signal_user_data_t *ud) { - GtkWidget *widget; + gint ti; + gint hh, mm, ss, start, end; gchar *text; + GtkWidget *widget; - ud->dont_clear_presets = TRUE; + ti = ghb_settings_combo_int(ud->settings, "title"); widget = GHB_WIDGET (ud->builder, "title_duration"); - if (tinfo->duration != 0) + + if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0) { - text = g_strdup_printf ("%02d:%02d:%02d", tinfo->hours, - tinfo->minutes, tinfo->seconds); + start = ghb_settings_get_int(ud->settings, "start_point"); + end = ghb_settings_get_int(ud->settings, "end_point"); + ghb_part_duration(ti, start, end, &hh, &mm, &ss); } - else + else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1) { - text = g_strdup_printf ("Unknown"); + gint duration; + + start = ghb_settings_get_int(ud->settings, "start_point"); + end = ghb_settings_get_int(ud->settings, "end_point"); + duration = end - start; + hh = duration / (60*60); + mm = (duration / 60) % 60; + ss = duration % 60; + } + else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2) + { + ghb_title_info_t tinfo; + + if (ghb_get_title_info (&tinfo, ti)) + { + gint64 frames; + gint duration; + + start = ghb_settings_get_int(ud->settings, "start_point"); + end = ghb_settings_get_int(ud->settings, "end_point"); + frames = end - start + 1; + duration = frames * tinfo.rate_base / tinfo.rate; + hh = duration / (60*60); + mm = (duration / 60) % 60; + ss = duration % 60; + } + else + { + hh = mm = ss = 0; + } } + text = g_strdup_printf("%02d:%02d:%02d", hh, mm, ss); gtk_label_set_text (GTK_LABEL(widget), text); g_free(text); +} + +static void +show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo) +{ + GtkWidget *widget; + gchar *text; + + ghb_settings_set_string(ud->settings, "source", tinfo->path); + if (tinfo->type == HB_STREAM_TYPE) + { + GtkWidget *widget = GHB_WIDGET (ud->builder, "source_title"); + if (tinfo->name != NULL && tinfo->name[0] != 0) + { + gtk_label_set_text (GTK_LABEL(widget), tinfo->name); + ghb_settings_set_string(ud->settings, "volume_label", tinfo->name); + set_destination(ud); + } + else + { + gchar *label = "No Title Found"; + gtk_label_set_text (GTK_LABEL(widget), label); + ghb_settings_set_string(ud->settings, "volume_label", label); + } + } + ud->dont_clear_presets = TRUE; + update_title_duration(ud); widget = GHB_WIDGET (ud->builder, "source_dimensions"); text = g_strdup_printf ("%d x %d", tinfo->width, tinfo->height); gtk_label_set_text (GTK_LABEL(widget), text); @@ -1352,12 +1441,12 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo) // Set the limits of cropping. hb_set_anamorphic_size crashes if // you pass it a cropped width or height == 0. gint bound; - bound = tinfo->height / 2 - 2; + bound = tinfo->height / 2 - 8; widget = GHB_WIDGET (ud->builder, "PictureTopCrop"); gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, bound); widget = GHB_WIDGET (ud->builder, "PictureBottomCrop"); gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, bound); - bound = tinfo->width / 2 - 2; + bound = tinfo->width / 2 - 8; widget = GHB_WIDGET (ud->builder, "PictureLeftCrop"); gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, bound); widget = GHB_WIDGET (ud->builder, "PictureRightCrop"); @@ -1382,17 +1471,46 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo) gtk_label_set_text (GTK_LABEL(widget), text); g_free(text); - g_debug("setting max end chapter %d", tinfo->num_chapters); - widget = GHB_WIDGET (ud->builder, "end_chapter"); - gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), tinfo->num_chapters); - widget = GHB_WIDGET (ud->builder, "start_chapter"); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1); - gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters); + + gint duration = tinfo->duration / 90000; + + if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0) + { + widget = GHB_WIDGET (ud->builder, "start_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1); + + widget = GHB_WIDGET (ud->builder, "end_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), tinfo->num_chapters); + } + else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1) + { + + widget = GHB_WIDGET (ud->builder, "start_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, duration-1); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 0); + + widget = GHB_WIDGET (ud->builder, "end_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, duration); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), duration); + } + else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2) + { + gdouble max_frames = (gdouble)duration * tinfo->rate / tinfo->rate_base; + widget = GHB_WIDGET (ud->builder, "start_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1); + + widget = GHB_WIDGET (ud->builder, "end_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), max_frames); + } widget = GHB_WIDGET (ud->builder, "angle"); gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1); gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->angle_count); + ghb_settings_set_int(ud->settings, "angle_count", tinfo->angle_count); ud->dont_clear_presets = FALSE; } @@ -1406,7 +1524,6 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud) g_debug("title_changed_cb ()"); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); titleindex = ghb_settings_combo_int(ud->settings, "title"); ghb_update_ui_combo_box (ud, "AudioTrack", titleindex, FALSE); @@ -1416,6 +1533,7 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { show_title_info(ud, &tinfo); } + ghb_check_dependency(ud, widget, NULL); update_chapter_list (ud); ghb_adjust_audio_rate_combos(ud); ghb_set_pref_audio(titleindex, ud); @@ -1442,13 +1560,74 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { set_destination(ud); } + ghb_preview_set_visible(ud); + + gint end; + widget = GHB_WIDGET (ud->builder, "ChapterMarkers"); + gtk_widget_set_sensitive(widget, TRUE); + end = ghb_settings_get_int(ud->settings, "end_point"); + if (1 == end) + { + ud->dont_clear_presets = TRUE; + ghb_ui_update(ud, "ChapterMarkers", ghb_boolean_value(FALSE)); + ud->dont_clear_presets = FALSE; + gtk_widget_set_sensitive(widget, FALSE); + } +} + +G_MODULE_EXPORT void +ptop_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) +{ + gint ti; + ghb_title_info_t tinfo; + + ghb_widget_to_setting(ud->settings, widget); + ghb_check_dependency(ud, widget, NULL); + ghb_live_reset(ud); + + ti = ghb_settings_combo_int(ud->settings, "title"); + if (!ghb_get_title_info (&tinfo, ti)) + return; + + gint duration = tinfo.duration / 90000; + if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0) + { + widget = GHB_WIDGET (ud->builder, "start_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo.num_chapters); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1); + + widget = GHB_WIDGET (ud->builder, "end_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo.num_chapters); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), tinfo.num_chapters); + } + else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1) + { + widget = GHB_WIDGET (ud->builder, "start_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, duration-1); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 0); + + widget = GHB_WIDGET (ud->builder, "end_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, duration); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), duration); + } + else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2) + { + gdouble max_frames = (gdouble)duration * tinfo.rate / tinfo.rate_base; + widget = GHB_WIDGET (ud->builder, "start_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1); + + widget = GHB_WIDGET (ud->builder, "end_point"); + gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), max_frames); + } } G_MODULE_EXPORT void setting_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); ghb_live_reset(ud); } @@ -1457,7 +1636,7 @@ G_MODULE_EXPORT void chapter_markers_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); ghb_live_reset(ud); ghb_update_destination_extension(ud); @@ -1467,7 +1646,7 @@ G_MODULE_EXPORT void vquality_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); ghb_live_reset(ud); @@ -1491,7 +1670,7 @@ G_MODULE_EXPORT void http_opt_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); ghb_live_reset(ud); // AC3 is not allowed when Web optimized @@ -1506,7 +1685,7 @@ vcodec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) gint digits; ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); ghb_live_reset(ud); ghb_vquality_range(ud, &vqmin, &vqmax, &step, &page, &digits, &inverted); @@ -1520,10 +1699,10 @@ vcodec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) G_MODULE_EXPORT void target_size_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { - const gchar *name = gtk_widget_get_name(widget); + const gchar *name = ghb_get_setting_key(widget); g_debug("target_size_changed_cb () %s", name); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); ghb_live_reset(ud); if (ghb_settings_get_boolean(ud->settings, "vquality_type_target")) @@ -1536,62 +1715,106 @@ target_size_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } G_MODULE_EXPORT void -start_chapter_changed_cb(GtkWidget *widget, signal_user_data_t *ud) +start_point_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { gint start, end; - const gchar *name = gtk_widget_get_name(widget); + const gchar *name = ghb_get_setting_key(widget); - g_debug("start_chapter_changed_cb () %s", name); + g_debug("start_point_changed_cb () %s", name); ghb_widget_to_setting(ud->settings, widget); - start = ghb_settings_get_int(ud->settings, "start_chapter"); - end = ghb_settings_get_int(ud->settings, "end_chapter"); - if (start > end) - ghb_ui_update(ud, "end_chapter", ghb_int_value(start)); - ghb_check_dependency(ud, widget); - if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination")) - { - set_destination(ud); + if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0) + { + start = ghb_settings_get_int(ud->settings, "start_point"); + end = ghb_settings_get_int(ud->settings, "end_point"); + if (start > end) + ghb_ui_update(ud, "end_point", ghb_int_value(start)); + ghb_check_dependency(ud, widget, NULL); + if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination")) + { + set_destination(ud); + } + widget = GHB_WIDGET (ud->builder, "ChapterMarkers"); + gtk_widget_set_sensitive(widget, TRUE); + // End may have been changed above, get it again + end = ghb_settings_get_int(ud->settings, "end_point"); + if (start == end) + { + ud->dont_clear_presets = TRUE; + ghb_ui_update(ud, "ChapterMarkers", ghb_boolean_value(FALSE)); + ud->dont_clear_presets = FALSE; + gtk_widget_set_sensitive(widget, FALSE); + } + update_title_duration(ud); } - widget = GHB_WIDGET (ud->builder, "chapters_tab"); - // End may have been changed above, get it again - end = ghb_settings_get_int(ud->settings, "end_chapter"); - if (start == end) + else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1) { - gtk_widget_hide(widget); + start = ghb_settings_get_int(ud->settings, "start_point"); + end = ghb_settings_get_int(ud->settings, "end_point"); + if (start >= end) + ghb_ui_update(ud, "end_point", ghb_int_value(start+1)); + ghb_check_dependency(ud, widget, NULL); + update_title_duration(ud); } - else + else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2) { - gtk_widget_show(widget); + start = ghb_settings_get_int(ud->settings, "start_point"); + end = ghb_settings_get_int(ud->settings, "end_point"); + if (start > end) + ghb_ui_update(ud, "end_point", ghb_int_value(start)); + ghb_check_dependency(ud, widget, NULL); + update_title_duration(ud); } } G_MODULE_EXPORT void -end_chapter_changed_cb(GtkWidget *widget, signal_user_data_t *ud) +end_point_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { gint start, end; - const gchar *name = gtk_widget_get_name(widget); + const gchar *name = ghb_get_setting_key(widget); - g_debug("end_chapter_changed_cb () %s", name); + g_debug("end_point_changed_cb () %s", name); ghb_widget_to_setting(ud->settings, widget); - start = ghb_settings_get_int(ud->settings, "start_chapter"); - end = ghb_settings_get_int(ud->settings, "end_chapter"); - if (start > end) - ghb_ui_update(ud, "start_chapter", ghb_int_value(end)); - ghb_check_dependency(ud, widget); - if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination")) - { - set_destination(ud); + if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0) + { + start = ghb_settings_get_int(ud->settings, "start_point"); + end = ghb_settings_get_int(ud->settings, "end_point"); + if (start > end) + ghb_ui_update(ud, "start_point", ghb_int_value(end)); + ghb_check_dependency(ud, widget, NULL); + if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination")) + { + set_destination(ud); + } + widget = GHB_WIDGET (ud->builder, "ChapterMarkers"); + gtk_widget_set_sensitive(widget, TRUE); + // Start may have been changed above, get it again + start = ghb_settings_get_int(ud->settings, "start_point"); + if (start == end) + { + ud->dont_clear_presets = TRUE; + ghb_ui_update(ud, "ChapterMarkers", ghb_boolean_value(FALSE)); + ud->dont_clear_presets = FALSE; + gtk_widget_set_sensitive(widget, FALSE); + } + update_title_duration(ud); } - widget = GHB_WIDGET (ud->builder, "chapters_tab"); - // Start may have been changed above, get it again - start = ghb_settings_get_int(ud->settings, "start_chapter"); - if (start == end) + else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1) { - gtk_widget_hide(widget); + start = ghb_settings_get_int(ud->settings, "start_point"); + end = ghb_settings_get_int(ud->settings, "end_point"); + if (start >= end) + ghb_ui_update(ud, "start_point", ghb_int_value(end-1)); + ghb_check_dependency(ud, widget, NULL); + update_title_duration(ud); } - else + else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2) { - gtk_widget_show(widget); + start = ghb_settings_get_int(ud->settings, "start_point"); + end = ghb_settings_get_int(ud->settings, "end_point"); + if (start > end) + ghb_ui_update(ud, "start_point", ghb_int_value(end)); + ghb_check_dependency(ud, widget, NULL); + update_title_duration(ud); } } @@ -1600,7 +1823,7 @@ scale_width_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("scale_width_changed_cb ()"); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); if (GTK_WIDGET_SENSITIVE(widget)) ghb_set_scale (ud, GHB_PIC_KEEP_WIDTH); @@ -1620,7 +1843,7 @@ scale_height_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("scale_height_changed_cb ()"); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); if (GTK_WIDGET_SENSITIVE(widget)) ghb_set_scale (ud, GHB_PIC_KEEP_HEIGHT); @@ -1643,7 +1866,7 @@ crop_changed_cb(GtkWidget *widget, signal_user_data_t *ud) g_debug("crop_changed_cb ()"); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); if (GTK_WIDGET_SENSITIVE(widget)) ghb_set_scale (ud, 0); @@ -1681,7 +1904,7 @@ display_width_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("display_width_changed_cb ()"); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); ghb_live_reset(ud); if (GTK_WIDGET_SENSITIVE(widget)) @@ -1695,7 +1918,7 @@ display_height_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("display_height_changed_cb ()"); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); ghb_live_reset(ud); if (GTK_WIDGET_SENSITIVE(widget)) @@ -1709,7 +1932,7 @@ par_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("par_changed_cb ()"); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); ghb_live_reset(ud); if (GTK_WIDGET_SENSITIVE(widget)) @@ -1723,7 +1946,7 @@ scale_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("scale_changed_cb ()"); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_clear_presets_selection(ud); ghb_live_reset(ud); if (GTK_WIDGET_SENSITIVE(widget)) @@ -1765,7 +1988,7 @@ show_crop_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("show_crop_changed_cb ()"); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_live_reset(ud); if (GTK_WIDGET_SENSITIVE(widget)) ghb_set_scale (ud, 0); @@ -2326,6 +2549,46 @@ working_status_string(signal_user_data_t *ud, ghb_instance_status_t *status) return status_str; } +gchar* +searching_status_string(signal_user_data_t *ud, ghb_instance_status_t *status) +{ + gchar *task_str, *job_str, *status_str; + gint qcount; + gint index; + GValue *js; + + qcount = ghb_array_len(ud->queue); + index = find_queue_job(ud->queue, status->unique_id, &js); + if (qcount > 1) + { + job_str = g_strdup_printf("job %d of %d, ", index+1, qcount); + } + else + { + job_str = g_strdup(""); + } + task_str = g_strdup_printf("Searching for start time, "); + if(status->seconds > -1) + { + status_str= g_strdup_printf( + "Encoding: %s%s%.2f %%" + " (ETA %02dh%02dm%02ds)", + job_str, task_str, + 100.0 * status->progress, + status->hours, status->minutes, status->seconds ); + } + else + { + status_str= g_strdup_printf( + "Encoding: %s%s%.2f %%", + job_str, task_str, + 100.0 * status->progress ); + } + g_free(task_str); + g_free(job_str); + return status_str; +} + static void ghb_backend_events(signal_user_data_t *ud) { @@ -2401,19 +2664,27 @@ ghb_backend_events(signal_user_data_t *ud) GtkAction *action; widget = GHB_WIDGET(ud->builder, "sourcetoolbutton"); - gtk_widget_set_sensitive(widget, TRUE); + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(widget), "hb-source"); + gtk_tool_button_set_label(GTK_TOOL_BUTTON(widget), "Source"); + gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), "Choose Video Source"); + action = GHB_ACTION(ud->builder, "source_action"); gtk_action_set_sensitive(action, TRUE); action = GHB_ACTION(ud->builder, "source_single_action"); gtk_action_set_sensitive(action, TRUE); - source = ghb_settings_get_string(ud->settings, "source"); + source = ghb_settings_get_string(ud->settings, "scan_source"); update_source_label(ud, source, FALSE); scan_prog = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "scan_prog")); gtk_progress_bar_set_fraction (scan_prog, 1.0); gtk_widget_hide(GTK_WIDGET(scan_prog)); + if (!ghb_settings_get_boolean(ud->settings, "preset_modified")) + { + ghb_refresh_preset(ud); + } + ghb_title_info_t tinfo; ghb_update_ui_combo_box(ud, "title", 0, FALSE); @@ -2456,6 +2727,44 @@ ghb_backend_events(signal_user_data_t *ud) { gtk_label_set_text (work_status, "Paused"); } + else if (status.queue.state & GHB_STATE_SEARCHING) + { + static gint working = 0; + + // This needs to be in scanning and working since scanning + // happens fast enough that it can be missed + index = find_queue_job(ud->queue, status.queue.unique_id, &js); + if (status.queue.unique_id != 0 && index >= 0) + { + gchar working_icon[] = "hb-working0"; + working_icon[10] = '0' + working; + working = (working+1) % 6; + treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "queue_list")); + store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview)); + gchar *path = g_strdup_printf ("%d", index); + if (gtk_tree_model_get_iter_from_string( + GTK_TREE_MODEL(store), &iter, path)) + { + gtk_tree_store_set(store, &iter, 0, working_icon, -1); + } + g_free(path); + } + GtkLabel *label; + gchar *status_str; + + status_str = searching_status_string(ud, &status.queue); + label = GTK_LABEL(GHB_WIDGET(ud->builder, "queue_status")); + gtk_label_set_text (label, status_str); +#if !GTK_CHECK_VERSION(2, 16, 0) + GtkStatusIcon *si; + + si = GTK_STATUS_ICON(GHB_OBJECT(ud->builder, "hb_status")); + gtk_status_icon_set_tooltip(si, status_str); +#endif + gtk_label_set_text (work_status, status_str); + gtk_progress_bar_set_fraction (progress, status.queue.progress); + g_free(status_str); + } else if (status.queue.state & GHB_STATE_WORKING) { static gint working = 0; @@ -2623,6 +2932,8 @@ status_icon_query_tooltip_cb( ghb_get_status(&status); if (status.queue.state & GHB_STATE_WORKING) status_str = working_status_string(ud, &status.queue); + else if (status.queue.state & GHB_STATE_SEARCHING) + status_str = searching_status_string(ud, &status.queue); else if (status.queue.state & GHB_STATE_WORKDONE) status_str = g_strdup("Encode Complete"); else @@ -2665,6 +2976,7 @@ ghb_timer_cb(gpointer data) update_preview = FALSE; } +#if !defined(_NO_UPDATE_CHECK) if (!appcast_busy) { gchar *updates; @@ -2695,6 +3007,7 @@ ghb_timer_cb(gpointer data) } } } +#endif return TRUE; } @@ -3281,8 +3594,8 @@ pref_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("pref_changed_cb"); ghb_widget_to_setting (ud->settings, widget); - ghb_check_dependency(ud, widget); - const gchar *name = gtk_widget_get_name(widget); + ghb_check_dependency(ud, widget, NULL); + const gchar *name = ghb_get_setting_key(widget); ghb_pref_save(ud->settings, name); } @@ -3291,8 +3604,8 @@ use_m4v_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("use_m4v_changed_cb"); ghb_widget_to_setting (ud->settings, widget); - ghb_check_dependency(ud, widget); - const gchar *name = gtk_widget_get_name(widget); + ghb_check_dependency(ud, widget, NULL); + const gchar *name = ghb_get_setting_key(widget); ghb_pref_save(ud->settings, name); ghb_update_destination_extension(ud); } @@ -3302,8 +3615,8 @@ show_status_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("show_status_cb"); ghb_widget_to_setting (ud->settings, widget); - ghb_check_dependency(ud, widget); - const gchar *name = gtk_widget_get_name(widget); + ghb_check_dependency(ud, widget, NULL); + const gchar *name = ghb_get_setting_key(widget); ghb_pref_save(ud->settings, name); GtkStatusIcon *si; @@ -3318,9 +3631,9 @@ vqual_granularity_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("vqual_granularity_changed_cb"); ghb_widget_to_setting (ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); - const gchar *name = gtk_widget_get_name(widget); + const gchar *name = ghb_get_setting_key(widget); ghb_pref_save(ud->settings, name); gdouble vqmin, vqmax, step, page; @@ -3337,7 +3650,7 @@ tweaks_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("tweaks_changed_cb"); ghb_widget_to_setting (ud->settings, widget); - const gchar *name = gtk_widget_get_name(widget); + const gchar *name = ghb_get_setting_key(widget); ghb_pref_save(ud->settings, name); } @@ -3346,7 +3659,7 @@ hbfd_feature_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("hbfd_feature_changed_cb"); ghb_widget_to_setting (ud->settings, widget); - const gchar *name = gtk_widget_get_name(widget); + const gchar *name = ghb_get_setting_key(widget); ghb_pref_save(ud->settings, name); gboolean hbfd = ghb_settings_get_boolean(ud->settings, "hbfd_feature"); @@ -3479,7 +3792,7 @@ dvd_device_list() } #if !defined(_WIN32) -static LibHalContext *hal_ctx; +static GUdevClient *udev_ctx = NULL; #endif gboolean @@ -3487,24 +3800,43 @@ ghb_is_cd(GDrive *gd) { #if !defined(_WIN32) gchar *device; - LibHalDrive *halDrive; - LibHalDriveType dtype; + GUdevDevice *udd; + + if (udev_ctx == NULL) + return FALSE; device = g_drive_get_identifier(gd, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE); if (device == NULL) return FALSE; - halDrive = libhal_drive_from_device_file (hal_ctx, device); + + udd = g_udev_client_query_by_device_file(udev_ctx, device); g_free(device); - if (halDrive == NULL) + + if (udd == NULL) + { + g_message("udev: Failed to lookup device %s", device); return FALSE; - dtype = libhal_drive_get_type(halDrive); - libhal_drive_free(halDrive); - return (dtype == LIBHAL_DRIVE_TYPE_CDROM); + } + + gint val; + val = g_udev_device_get_property_as_int(udd, "ID_CDROM_DVD"); + if (val == 1) + return TRUE; + + return FALSE; #else return FALSE; #endif } +void +ghb_udev_init() +{ +#if !defined(_WIN32) + udev_ctx = g_udev_client_new(NULL); +#endif +} + #if defined(_WIN32) static void handle_media_change(const gchar *device, gboolean insert, signal_user_data_t *ud) @@ -3534,7 +3866,7 @@ handle_media_change(const gchar *device, gboolean insert, signal_user_data_t *ud update_source_label(ud, device, TRUE); gint preview_count; preview_count = ghb_settings_get_int(ud->settings, "preview_count"); - ghb_settings_set_string(ud->settings, "source", device); + ghb_settings_set_string(ud->settings, "scan_source", device); start_scan(ud, device, 0, preview_count); } } @@ -3551,7 +3883,7 @@ handle_media_change(const gchar *device, gboolean insert, signal_user_data_t *ud { ghb_hb_cleanup(TRUE); prune_logs(ud); - ghb_settings_set_string(ud->settings, "source", "/dev/null"); + ghb_settings_set_string(ud->settings, "scan_source", "/dev/null"); start_scan(ud, "/dev/null", 0, 1); } } @@ -3638,7 +3970,7 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud) update_source_label(ud, device, TRUE); gint preview_count; preview_count = ghb_settings_get_int(ud->settings, "preview_count"); - ghb_settings_set_string(ud->settings, "source", device); + ghb_settings_set_string(ud->settings, "scan_source", device); start_scan(ud, device, 0, preview_count); } } @@ -3646,19 +3978,13 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud) { ghb_hb_cleanup(TRUE); prune_logs(ud); - ghb_settings_set_string(ud->settings, "source", "/dev/null"); + ghb_settings_set_string(ud->settings, "scan_source", "/dev/null"); start_scan(ud, "/dev/null", 0, 1); } } #endif #if !defined(_WIN32) -static void -dbus_init (void) -{ - dbus_g_thread_init(); -} - #define GPM_DBUS_PM_SERVICE "org.freedesktop.PowerManagement" #define GPM_DBUS_PM_PATH "/org/freedesktop/PowerManagement" #define GPM_DBUS_PM_INTERFACE "org.freedesktop.PowerManagement" @@ -3761,11 +4087,11 @@ ghb_suspend_gpm() #endif } +#if !defined(_WIN32) static gboolean ghb_can_shutdown_gpm() { gboolean can_shutdown = FALSE; -#if !defined(_WIN32) DBusGConnection *conn; DBusGProxy *proxy; GError *error = NULL; @@ -3806,14 +4132,14 @@ ghb_can_shutdown_gpm() } g_object_unref(G_OBJECT(proxy)); dbus_g_connection_unref(conn); -#endif return can_shutdown; } +#endif +#if !defined(_WIN32) static void ghb_shutdown_gpm() { -#if !defined(_WIN32) DBusGConnection *conn; DBusGProxy *proxy; GError *error = NULL; @@ -3851,8 +4177,8 @@ ghb_shutdown_gpm() } g_object_unref(G_OBJECT(proxy)); dbus_g_connection_unref(conn); -#endif } +#endif void ghb_inhibit_gpm() @@ -4171,63 +4497,6 @@ ghb_uninhibit_gsm() #endif } -void -ghb_hal_init() -{ -#if !defined(_WIN32) - DBusGConnection *gconn; - DBusConnection *conn; - GError *gerror = NULL; - DBusError error; - char **devices; - int nr; - - dbus_init (); - - if (!(hal_ctx = libhal_ctx_new ())) { - g_warning ("failed to create a HAL context!"); - return; - } - - gconn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &gerror); - if (gerror != NULL) - { - g_warning("DBUS cannot connect: %s", gerror->message); - g_error_free(gerror); - return; - } - conn = dbus_g_connection_get_connection(gconn); - libhal_ctx_set_dbus_connection (hal_ctx, conn); - dbus_error_init (&error); - if (!libhal_ctx_init (hal_ctx, &error)) { - g_warning ("libhal_ctx_init failed: %s", error.message ? error.message : "unknown"); - dbus_error_free (&error); - libhal_ctx_free (hal_ctx); - dbus_g_connection_unref(gconn); - return; - } - - /* - * Do something to ping the HAL daemon - the above functions will - * succeed even if hald is not running, so long as DBUS is. But we - * want to exit silently if hald is not running, to behave on - * pre-2.6 systems. - */ - if (!(devices = libhal_get_all_devices (hal_ctx, &nr, &error))) { - g_warning ("seems that HAL is not running: %s", error.message ? error.message : "unknown"); - dbus_error_free (&error); - - libhal_ctx_shutdown (hal_ctx, NULL); - libhal_ctx_free (hal_ctx); - dbus_g_connection_unref(gconn); - return; - } - - libhal_free_string_array (devices); - dbus_g_connection_unref(gconn); -#endif -} - G_MODULE_EXPORT gboolean tweak_setting_cb( GtkWidget *widget, @@ -4248,7 +4517,7 @@ tweak_setting_cb( GtkResponseType response; gchar *tweak = NULL; - name = gtk_widget_get_name(widget); + name = ghb_get_setting_key(widget); if (g_str_has_prefix(name, "tweak_")) { tweak_name = g_strdup(name); @@ -4345,40 +4614,29 @@ format_drc_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud) G_MODULE_EXPORT gchar* format_vquality_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud) { - gdouble percent; - gint vcodec = ghb_settings_combo_int(ud->settings, "VideoEncoder"); switch (vcodec) { case HB_VCODEC_X264: { - gboolean crf; - crf = ghb_settings_get_boolean(ud->settings, "constant_rate_factor"); - percent = 100. * (51 - val) / 51.; - if (crf) - return g_strdup_printf("RF: %.4g (%.0f%%)", val, percent); - else - return g_strdup_printf("QP: %.4g (%.0f%%)", val, percent); + return g_strdup_printf("RF: %.4g", val); } break; case HB_VCODEC_FFMPEG: { - percent = 100. * (30 - (val - 1)) / 30.; - return g_strdup_printf("QP: %d (%.0f%%)", (int)val, percent); + return g_strdup_printf("QP: %d", (int)val); } break; case HB_VCODEC_THEORA: { - percent = 100. * val / 63.; - return g_strdup_printf("QP: %d (%.0f%%)", (int)val, percent); + return g_strdup_printf("QP: %d", (int)val); } break; default: { - percent = 0; } break; } - return g_strdup_printf("QP: %.1f / %.1f%%", val, percent); + return g_strdup_printf("QP: %.4g", val); } static void @@ -4412,6 +4670,7 @@ process_appcast(signal_user_data_t *ud) gtk_label_set_text(GTK_LABEL(label), msg); #if !defined(_WIN32) +#if !defined(_NO_UPDATE_CHECK) if (html == NULL) { html = webkit_web_view_new(); @@ -4423,6 +4682,7 @@ process_appcast(signal_user_data_t *ud) } webkit_web_view_open(WEBKIT_WEB_VIEW(html), description); #endif +#endif dialog = GHB_WIDGET(ud->builder, "update_dialog"); response = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_hide(dialog); @@ -4478,7 +4738,10 @@ ghb_net_recv_cb(GIOChannel *ioc, GIOCondition cond, gpointer data) } if (status == G_IO_STATUS_EOF) { - ud->appcast[ud->appcast_len] = 0; + if ( ud->appcast != NULL ) + { + ud->appcast[ud->appcast_len] = 0; + } ghb_net_close(ioc); process_appcast(ud); return FALSE;