X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=gtk%2Fsrc%2Fcallbacks.c;h=54a5d0ca223f11ce3ff2a4d07f3bd2ba26475e7c;hb=fed44d08dd83d311d2d36aa518633966280b45dd;hp=0b3e0cc125742f134c816c834aa502493b0503dc;hpb=349738f27e920fddf73697f2533de427ac7b6c90;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/gtk/src/callbacks.c b/gtk/src/callbacks.c index 0b3e0cc1..54a5d0ca 100644 --- a/gtk/src/callbacks.c +++ b/gtk/src/callbacks.c @@ -742,7 +742,7 @@ update_source_label(signal_user_data_t *ud, const gchar *source) G_MODULE_EXPORT void chooser_file_selected_cb(GtkFileChooser *dialog, signal_user_data_t *ud) { - const gchar *name = gtk_file_chooser_get_filename (dialog); + gchar *name = gtk_file_chooser_get_filename (dialog); GtkTreeModel *store; GtkTreeIter iter; const gchar *device; @@ -768,6 +768,8 @@ chooser_file_selected_cb(GtkFileChooser *dialog, signal_user_data_t *ud) gtk_combo_box_set_active_iter (combo, &iter); else gtk_combo_box_set_active (combo, 0); + + g_free(name); } G_MODULE_EXPORT void @@ -779,13 +781,16 @@ dvd_device_changed_cb(GtkComboBox *combo, signal_user_data_t *ud) ii = gtk_combo_box_get_active (combo); if (ii > 0) { - const gchar *device, *name; + const gchar *device; + gchar *name; dialog = GHB_WIDGET(ud->builder, "source_dialog"); device = gtk_combo_box_get_active_text (combo); name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog)); if (name == NULL || strcmp(name, device) != 0) gtk_file_chooser_select_filename (GTK_FILE_CHOOSER(dialog), device); + if (name != NULL) + g_free(name); } } @@ -852,6 +857,20 @@ source_dialog_extra_widgets( extern GValue *ghb_queue_edit_settings; static gchar *last_scan_file = NULL; +static void +show_scan_progress(signal_user_data_t *ud) +{ + GtkProgressBar *progress; + GtkLabel *label; + + progress = GTK_PROGRESS_BAR(GHB_WIDGET(ud->builder, "scan_prog")); + gtk_progress_bar_set_fraction (progress, 0); + gtk_widget_show(GTK_WIDGET(progress)); + + label = GTK_LABEL(GHB_WIDGET(ud->builder, "source_title")); + gtk_label_set_text( label, "Scanning ..." ); +} + void ghb_do_scan( signal_user_data_t *ud, @@ -887,14 +906,13 @@ ghb_do_scan( ghb_settings_set_string(ud->settings, "source", filename); if (update_source_label(ud, filename)) { - GtkProgressBar *progress; - progress = GTK_PROGRESS_BAR(GHB_WIDGET(ud->builder, "progressbar")); gchar *path; + gint preview_count; + + show_scan_progress(ud); path = ghb_settings_get_string( ud->settings, "source"); - gtk_progress_bar_set_fraction (progress, 0); - gtk_progress_bar_set_text (progress, "Scanning ..."); prune_logs(ud); - gint preview_count; + preview_count = ghb_settings_get_int(ud->settings, "preview_count"); ghb_backend_scan(path, titlenum, preview_count); g_free(path); @@ -959,7 +977,7 @@ do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud) gtk_widget_hide(dialog); if (response == GTK_RESPONSE_ACCEPT) { - char *filename; + gchar *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); if (filename != NULL) @@ -1868,6 +1886,22 @@ ghb_message_dialog(GtkMessageType type, const gchar *message, const gchar *no, c return TRUE; } +void +ghb_error_dialog(GtkMessageType type, const gchar *message, const gchar *cancel) +{ + GtkWidget *dialog; + GtkResponseType response; + + // Toss up a warning dialog + dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, + type, GTK_BUTTONS_NONE, + "%s", message); + gtk_dialog_add_buttons( GTK_DIALOG(dialog), + cancel, GTK_RESPONSE_CANCEL, NULL); + response = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy (dialog); +} + gboolean ghb_cancel_encode(const gchar *extra_msg) { @@ -2012,6 +2046,42 @@ queue_scan(signal_user_data_t *ud, GValue *js) g_free(path); } +static gint +queue_pending_count(GValue *queue) +{ + gint nn, ii, count; + GValue *js; + gint status; + + nn = 0; + count = ghb_array_len(queue); + for (ii = 0; ii < count; ii++) + { + + js = ghb_array_get_nth(queue, ii); + status = ghb_settings_get_int(js, "job_status"); + if (status == GHB_QUEUE_PENDING) + { + nn++; + } + } + return nn; +} + +void +ghb_update_pending(signal_user_data_t *ud) +{ + GtkLabel *label; + gint pending; + gchar *str; + + label = GTK_LABEL(GHB_WIDGET(ud->builder, "pending_status")); + pending = queue_pending_count(ud->queue); + str = g_strdup_printf("%d encode(s) pending in the queue", pending); + gtk_label_set_text(label, str); + g_free(str); +} + GValue* ghb_start_next_job(signal_user_data_t *ud, gboolean find_first) { @@ -2019,8 +2089,12 @@ ghb_start_next_job(signal_user_data_t *ud, gboolean find_first) gint count, ii, jj; GValue *js; gint status; + GtkWidget *prog; g_debug("start_next_job"); + prog = GHB_WIDGET(ud->builder, "progressbar"); + gtk_widget_show(prog); + count = ghb_array_len(ud->queue); if (find_first) { // Start the first pending item in the queue @@ -2035,6 +2109,7 @@ ghb_start_next_job(signal_user_data_t *ud, gboolean find_first) current = ii; ghb_inhibit_gpm(); queue_scan(ud, js); + ghb_update_pending(ud); return js; } } @@ -2059,6 +2134,7 @@ ghb_start_next_job(signal_user_data_t *ud, gboolean find_first) current = jj; ghb_inhibit_gpm(); queue_scan(ud, js); + ghb_update_pending(ud); return js; } } @@ -2075,12 +2151,15 @@ ghb_start_next_job(signal_user_data_t *ud, gboolean find_first) current = ii; ghb_inhibit_gpm(); queue_scan(ud, js); + ghb_update_pending(ud); return js; } } // Nothing found ghb_uninhibit_gpm(); ghb_notify_done(ud); + ghb_update_pending(ud); + gtk_widget_hide(prog); return NULL; } @@ -2114,26 +2193,39 @@ working_status_string(signal_user_data_t *ud, ghb_instance_status_t *status) gint qcount; gint index; GValue *js; + gboolean subtitle_scan = FALSE; - if (status->job_count > 1) - { - task_str = g_strdup_printf("pass %d of %d, ", - status->job_cur, status->job_count); - } - else + qcount = ghb_array_len(ud->queue); + index = find_queue_job(ud->queue, status->unique_id, &js); + if (js != NULL) { - task_str = g_strdup(""); + subtitle_scan = ghb_settings_get_boolean(js, "subtitle_scan"); } - qcount = ghb_array_len(ud->queue); if (qcount > 1) { - index = find_queue_job(ud->queue, status->unique_id, &js); job_str = g_strdup_printf("job %d of %d, ", index+1, qcount); } else { job_str = g_strdup(""); } + if (status->job_count > 1) + { + if (status->job_cur == 1 && subtitle_scan) + { + task_str = g_strdup_printf("pass %d (subtitle scan) of %d, ", + status->job_cur, status->job_count); + } + else + { + task_str = g_strdup_printf("pass %d of %d, ", + status->job_cur, status->job_count); + } + } + else + { + task_str = g_strdup(""); + } if(status->seconds > -1) { status_str= g_strdup_printf( @@ -2162,18 +2254,27 @@ ghb_backend_events(signal_user_data_t *ud) ghb_status_t status; gchar *status_str; GtkProgressBar *progress; + GtkLabel *work_status; gint titleindex; GValue *js; gint index; GtkTreeView *treeview; GtkTreeStore *store; GtkTreeIter iter; - static gint working = 0; - static gboolean work_started = FALSE; + static gint prev_scan_state = 0; + static gint prev_queue_state = 0; ghb_track_status(); ghb_get_status(&status); + if (prev_scan_state != status.scan.state || + prev_queue_state != status.queue.state) + { + ghb_queue_buttons_grey(ud); + prev_scan_state = status.scan.state; + prev_queue_state = status.queue.state; + } progress = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "progressbar")); + work_status = GTK_LABEL(GHB_WIDGET (ud->builder, "work_status")); if (status.scan.state == GHB_STATE_IDLE && status.queue.state == GHB_STATE_IDLE) { @@ -2189,6 +2290,12 @@ ghb_backend_events(signal_user_data_t *ud) // Then handle the status of the queue if (status.scan.state & GHB_STATE_SCANNING) { + GtkProgressBar *scan_prog; + GtkLabel *label; + + scan_prog = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "scan_prog")); + label = GTK_LABEL(GHB_WIDGET (ud->builder, "source_title")); + if (status.scan.title_cur == 0) { status_str = g_strdup ("Scanning..."); @@ -2198,20 +2305,26 @@ ghb_backend_events(signal_user_data_t *ud) status_str = g_strdup_printf ("Scanning title %d of %d...", status.scan.title_cur, status.scan.title_count ); } - gtk_progress_bar_set_text (progress, status_str); + gtk_label_set_text (label, status_str); g_free(status_str); if (status.scan.title_count > 0) { - gtk_progress_bar_set_fraction (progress, + gtk_progress_bar_set_fraction (scan_prog, (gdouble)status.scan.title_cur / status.scan.title_count); } } else if (status.scan.state & GHB_STATE_SCANDONE) { - status_str = g_strdup_printf ("Scan done"); - gtk_progress_bar_set_text (progress, status_str); - g_free(status_str); - gtk_progress_bar_set_fraction (progress, 1.0); + gchar *source; + GtkProgressBar *scan_prog; + GtkLabel *label; + + source = ghb_settings_get_string(ud->settings, "source"); + update_source_label(ud, source); + + 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)); ghb_title_info_t tinfo; @@ -2219,16 +2332,13 @@ ghb_backend_events(signal_user_data_t *ud) titleindex = ghb_longest_title(); ghb_ui_update(ud, "title", ghb_int64_value(titleindex)); + label = GTK_LABEL(GHB_WIDGET (ud->builder, "source_title")); // Are there really any titles. if (!ghb_get_title_info(&tinfo, titleindex)) { - GtkProgressBar *progress; - progress = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "progressbar")); - gtk_progress_bar_set_fraction (progress, 0); - gtk_progress_bar_set_text (progress, "No Source"); + gtk_label_set_text(label, "None"); } ghb_clear_scan_state(GHB_STATE_SCANDONE); - ghb_queue_buttons_grey(ud, work_started); if (ghb_queue_edit_settings) { gint jstatus; @@ -2244,11 +2354,12 @@ ghb_backend_events(signal_user_data_t *ud) ghb_queue_edit_settings = NULL; } } - else if (status.queue.state & GHB_STATE_SCANNING) + + if (status.queue.state & GHB_STATE_SCANNING) { - status_str = g_strdup_printf ("Scanning ..."); - gtk_progress_bar_set_text (progress, status_str); - g_free(status_str); + // This needs to be in scanning and working since scanning + // happens fast enough that it can be missed + gtk_label_set_text (work_status, "Scanning ..."); gtk_progress_bar_set_fraction (progress, 0); } else if (status.queue.state & GHB_STATE_SCANDONE) @@ -2256,17 +2367,47 @@ ghb_backend_events(signal_user_data_t *ud) ghb_clear_queue_state(GHB_STATE_SCANDONE); usleep(2000000); submit_job(ud->current_job); + ghb_update_pending(ud); } else if (status.queue.state & GHB_STATE_PAUSED) { - status_str = g_strdup_printf ("Paused"); - gtk_progress_bar_set_text (progress, status_str); - g_free(status_str); + gtk_label_set_text (work_status, "Paused"); } else if (status.queue.state & GHB_STATE_WORKING) { + 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 = working_status_string(ud, &status.queue); - gtk_progress_bar_set_text (progress, status_str); + 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); } @@ -2274,8 +2415,6 @@ ghb_backend_events(signal_user_data_t *ud) { gint qstatus; - work_started = FALSE; - ghb_queue_buttons_grey(ud, FALSE); index = find_queue_job(ud->queue, status.queue.unique_id, &js); treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "queue_list")); store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview)); @@ -2284,7 +2423,7 @@ ghb_backend_events(signal_user_data_t *ud) switch( status.queue.error ) { case GHB_ERROR_NONE: - gtk_progress_bar_set_text( progress, "Rip done!" ); + gtk_label_set_text (work_status, "Rip Done!"); qstatus = GHB_QUEUE_DONE; if (js != NULL) { @@ -2298,7 +2437,7 @@ ghb_backend_events(signal_user_data_t *ud) } break; case GHB_ERROR_CANCELED: - gtk_progress_bar_set_text( progress, "Rip canceled." ); + gtk_label_set_text (work_status, "Rip Canceled."); qstatus = GHB_QUEUE_CANCELED; if (js != NULL) { @@ -2312,7 +2451,7 @@ ghb_backend_events(signal_user_data_t *ud) } break; default: - gtk_progress_bar_set_text( progress, "Rip failed."); + gtk_label_set_text (work_status, "Rip Failed."); qstatus = GHB_QUEUE_CANCELED; if (js != NULL) { @@ -2338,6 +2477,7 @@ ghb_backend_events(signal_user_data_t *ud) { ghb_uninhibit_gpm(); ud->current_job = NULL; + gtk_widget_hide(GTK_WIDGET(progress)); } if (js) ghb_settings_set_int(js, "job_status", qstatus); @@ -2352,57 +2492,9 @@ ghb_backend_events(signal_user_data_t *ud) } else if (status.queue.state & GHB_STATE_MUXING) { - gtk_progress_bar_set_text(progress, "Muxing: this may take awhile..."); - } - if (status.queue.state & GHB_STATE_SCANNING) - { - // This needs to be in scanning and working since scanning - // happens fast enough that it can be missed - if (!work_started) - { - work_started = TRUE; - ghb_queue_buttons_grey(ud, TRUE); - } + gtk_label_set_text (work_status, "Muxing: This may take a while..."); } - if (status.queue.state & GHB_STATE_WORKING) - { - // This needs to be in scanning and working since scanning - // happens fast enough that it can be missed - if (!work_started) - { - work_started = TRUE; - ghb_queue_buttons_grey(ud, TRUE); - } - 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 = working_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 - g_free(status_str); - } if (status.scan.state & GHB_STATE_WORKING) { GtkProgressBar *live_progress; @@ -3224,10 +3316,14 @@ ghb_is_cd(GDrive *gd) LibHalDriveType dtype; 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); + g_free(device); + if (halDrive == NULL) + return FALSE; dtype = libhal_drive_get_type(halDrive); libhal_drive_free(halDrive); - g_free(device); return (dtype == LIBHAL_DRIVE_TYPE_CDROM); #else return FALSE; @@ -3258,10 +3354,7 @@ handle_media_change(const gchar *device, gboolean insert, signal_user_data_t *ud if (ud->current_dvd_device != NULL && strcmp(device, ud->current_dvd_device) == 0) { - GtkProgressBar *progress; - progress = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "progressbar")); - gtk_progress_bar_set_text (progress, "Scanning ..."); - gtk_progress_bar_set_fraction (progress, 0); + show_scan_progress(ud); update_source_label(ud, device); gint preview_count; preview_count = ghb_settings_get_int(ud->settings, "preview_count"); @@ -3361,10 +3454,7 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud) } if (g_drive_has_media(gd)) { - GtkProgressBar *progress; - progress = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "progressbar")); - gtk_progress_bar_set_text (progress, "Scanning ..."); - gtk_progress_bar_set_fraction (progress, 0); + show_scan_progress(ud); update_source_label(ud, device); gint preview_count; preview_count = ghb_settings_get_int(ud->settings, "preview_count");