📄 print.c
字号:
if (!success) { print_job_close(pw, TRUE); return; } if (pw->proof_point) pw->proof_point = pw->proof_point->next; pw->proof_position++; if (pw->proof_position >= pw->proof_columns * pw->proof_rows) { if (pw->job_format == RENDER_FORMAT_PREVIEW) { print_job_done(pw); return; } if (!print_job_page_done(pw)) { print_job_close(pw, TRUE); return; } pw->proof_position = 0; pw->job_page++; if (print_job_render_proof(pw)) { if (!print_job_page_new(pw)) { print_job_close(pw, TRUE); return; } print_job_status(pw); } else { print_job_done(pw); } } else { if (print_job_render_proof(pw)) { print_job_status(pw); } else { if (print_job_page_done(pw)) { print_job_done(pw); } else { print_job_close(pw, TRUE); } } }}static gint print_job_render_proof(PrintWindow *pw){ gchar *path = NULL; if (pw->proof_columns < 1 || pw->proof_rows < 1) return FALSE; if (!pw->proof_point && pw->proof_position == 0 && pw->source == PRINT_SOURCE_IMAGE) { path = pw->source_path; } else if (pw->proof_point && pw->proof_position < pw->proof_columns * pw->proof_rows) { path = pw->proof_point->data; } if (!path) return FALSE; image_loader_free(pw->job_loader); pw->job_loader = image_loader_new(path); if (!image_loader_start(pw->job_loader, print_job_render_proof_loader_done, pw)) { image_loader_free(pw->job_loader); pw->job_loader = NULL; } return TRUE;}static void print_job_render(PrintWindow *pw){ gdouble proof_w, proof_h; gint finished; pw->proof_position = 0; switch (pw->source) { case PRINT_SOURCE_SELECTION: pw->proof_point = pw->source_selection; break; case PRINT_SOURCE_ALL: pw->proof_point = pw->source_list; break; case PRINT_SOURCE_IMAGE: default: pw->proof_point = NULL; break; } print_proof_size(pw, &proof_w, &proof_h); pw->proof_columns = (pw->layout_width - pw->margin_left - pw->margin_right) / proof_w; pw->proof_rows = (pw->layout_height - pw->margin_top - pw->margin_bottom) / proof_h; if (pw->job_format == RENDER_FORMAT_PREVIEW) { gint total; total = print_layout_page_count(pw); if (pw->job_page < 0 || pw->job_page >= total) { print_job_done(pw); return; } if (pw->proof_point && pw->job_page > 0) { pw->proof_point = g_list_nth(pw->proof_point, pw->job_page * pw->proof_columns * pw->proof_rows); } } if (!print_job_page_new(pw)) { print_job_close(pw, TRUE); return; } if (pw->layout == PRINT_LAYOUT_IMAGE) { finished = !print_job_render_image(pw); } else { finished = !print_job_render_proof(pw); } if (finished) print_job_done(pw);}static gint print_job_init(PrintWindow *pw){ gint success = FALSE; pw->job_page = 0; switch (pw->job_format) { case RENDER_FORMAT_RGB: success = print_job_rgb_init(pw); break; case RENDER_FORMAT_PS: success = print_job_ps_init(pw); break; case RENDER_FORMAT_PREVIEW: pw->job_page = pw->proof_page; success = print_job_preview_init(pw); break; } return success;}static gint print_job_finish(PrintWindow *pw){ gint success = FALSE; switch (pw->job_format) { case RENDER_FORMAT_RGB: success = TRUE; break; case RENDER_FORMAT_PS: print_job_ps_end(pw); break; case RENDER_FORMAT_PREVIEW: success = TRUE; break; } return success;}static void print_job_close_file(PrintWindow *pw){ if (pw->job_file) { fclose(pw->job_file); pw->job_file = NULL; } if (pw->job_pipe) { PipeError *pe; pe = pipe_handler_new(); pclose(pw->job_pipe); pipe_handler_free(pe); pw->job_pipe = NULL; }}static gboolean print_job_close_finish_cb(gpointer data){ PrintWindow *pw = data; print_window_close(pw); return FALSE;}static void print_job_close(PrintWindow *pw, gint error){ if (!error) print_job_finish(pw); print_job_close_file(pw); g_free(pw->job_path); pw->job_path = NULL; if (pw->job_dialog) { generic_dialog_close(pw->job_dialog); pw->job_dialog = NULL; pw->job_progress = NULL; } image_loader_free(pw->job_loader); pw->job_loader = NULL; if (pw->job_pixbuf) { g_object_unref(pw->job_pixbuf); pw->job_pixbuf = NULL; } if (pw->dialog && !GTK_WIDGET_VISIBLE(pw->dialog->dialog)) { g_idle_add_full(G_PRIORITY_HIGH_IDLE, print_job_close_finish_cb, pw, NULL); }}static void print_job_cancel_cb(GenericDialog *gd, gpointer data){ PrintWindow *pw = data; print_job_close(pw, FALSE);}static void print_pref_store(PrintWindow *pw){ pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_SAVE, pw->save_settings); if (!pw->save_settings) return; /* only store values that are actually used in this print job, hence the if()s */ pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_OUTPUT, pw->output); if (pw->output == PRINT_OUTPUT_RGB_FILE) { pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_FORMAT, pw->output_format); } if (pw->job_format == RENDER_FORMAT_PS) { pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_DPI, pw->max_dpi); } pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_UNITS, pw->paper_units); pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_SIZE, pw->paper_size); pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_ORIENTATION, pw->paper_orientation); if (pw->paper_size == 0) { pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_CUSTOM_WIDTH, pw->paper_width); pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_CUSTOM_HEIGHT, pw->paper_height); } pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_MARGIN_LEFT, pw->margin_left); pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_MARGIN_RIGHT, pw->margin_right); pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_MARGIN_TOP, pw->margin_top); pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_MARGIN_BOTTOM, pw->margin_bottom); if (pw->layout == PRINT_LAYOUT_PROOF) { pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_PROOF_WIDTH, pw->proof_width); pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_PROOF_HEIGHT, pw->proof_height); } if (pw->output == PRINT_OUTPUT_PS_CUSTOM) { pref_list_string_set(PRINT_PREF_GROUP, PRINT_PREF_PRINTERC, pw->output_custom); } if (pw->output == PRINT_OUTPUT_RGB_FILE || pw->output == PRINT_OUTPUT_PS_FILE) { tab_completion_append_to_history(pw->path_entry, pw->output_path); }}static gint print_job_start(PrintWindow *pw, RenderFormat format, PrintOutput output){ GtkWidget *hbox; GtkWidget *spinner; gchar *msg; if (pw->job_dialog) return FALSE; pw->job_format = format; pw->job_output = output; if (!print_job_init(pw)) { print_job_close(pw, TRUE); return FALSE; } if (format == RENDER_FORMAT_PREVIEW) { print_job_render(pw); return TRUE; } print_pref_store(pw); gtk_widget_hide(pw->dialog->dialog); pw->job_dialog = file_util_gen_dlg(_("Print - GQview"), "gqview", "print_job_dialog", (GtkWidget *)gtk_window_get_transient_for(GTK_WINDOW(pw->dialog->dialog)), FALSE, print_job_cancel_cb, pw); msg = g_strdup_printf(_("Printing %d pages to %s."), print_layout_page_count(pw), print_output_name(pw->output)); generic_dialog_add_message(pw->job_dialog, NULL, msg, NULL); g_free(msg); if (pw->job_output == PRINT_OUTPUT_PS_FILE || pw->job_output == PRINT_OUTPUT_RGB_FILE) { hbox = pref_box_new(pw->job_dialog->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE); pref_label_new(hbox, _("Filename:")); pw->job_progress_label = pref_label_new(hbox, ""); } else { pw->job_progress_label = NULL; } pref_spacer(pw->job_dialog->vbox, PREF_PAD_SPACE); hbox = pref_box_new(pw->job_dialog->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE); pw->job_progress = gtk_progress_bar_new(); gtk_box_pack_start(GTK_BOX(hbox), pw->job_progress, TRUE, TRUE, 0); gtk_widget_show(pw->job_progress); spinner = spinner_new(NULL, SPINNER_SPEED); gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0); gtk_widget_show(spinner); gtk_widget_show(pw->job_dialog->dialog); print_job_render(pw); print_job_status(pw); return TRUE;}static void print_window_print_start(PrintWindow *pw){ RenderFormat format; switch(pw->output) { case PRINT_OUTPUT_RGB_FILE: format = RENDER_FORMAT_RGB; break; case PRINT_OUTPUT_PS_FILE: case PRINT_OUTPUT_PS_CUSTOM: case PRINT_OUTPUT_PS_LPR: default: format = RENDER_FORMAT_PS; break; } print_job_start(pw, format, pw->output);}/* *----------------------------------------------------------------------------- * combo box util *----------------------------------------------------------------------------- */static GtkWidget *print_combo_menu(const gchar *text[], gint count, gint preferred, GCallback func, gpointer data){ GtkWidget *combo; gint i; combo = gtk_combo_box_new_text(); for (i = 0 ; i < count; i++) { gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _(text[i])); } if (preferred >= 0 && preferred < count) { gtk_combo_box_set_active(GTK_COMBO_BOX(combo), preferred); } if (func) g_signal_connect(G_OBJECT(combo), "changed", func, data); return combo;}/* *----------------------------------------------------------------------------- * paper selection *----------------------------------------------------------------------------- */static GtkWidget *print_paper_menu(GtkWidget *table, gint column, gint row, gint preferred, GCallback func, gpointer data){ GtkWidget *combo; gint i; pref_table_label(table, column, row, (_("Format:")), 1.0); combo = gtk_combo_box_new_text(); i = 0; while (print_paper_sizes[i].description) { gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _(print_paper_sizes[i].description)); i++; } gtk_combo_box_set_active(GTK_COMBO_BOX(combo), preferred); if (func) g_signal_connect(G_OBJECT(combo), "changed", func, data); gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); gtk_widget_show(combo); return combo;}static void print_paper_select_cb(GtkWidget *combo, gpointer data){ PrintWindow *pw = data; PaperSize *ps; gint n; n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); ps = print_paper_size_nth(n); if (!ps) return; pw->paper_size = n; if (pw->paper_size == 0) { print_window_layout_sync_paper(pw); return; } if (ps->orientation == PAPER_ORIENTATION_PORTRAIT) { print_window_layout_set_size(pw, ps->width, ps->height); } else { print_window_layout_set_size(pw, ps->height, ps->width); }}static void print_paper_size_cb(GtkWidget *spin, gpointer data){ PrintWindow *pw = data; gdouble value; value = print_paper_size_convert_units(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)), pw->paper_units, PAPER_UNIT_POINTS); if (spin == pw->paper_width_spin) { pw->paper_width = value; } else { pw->paper_height = value; } print_window_layout_set_size(pw, pw->paper_width, pw->paper_height);}static GtkWidget *print_paper_units_menu(GtkWidget *table, gint column, gint row, PaperUnits units, GCallback func, gpointer data){ GtkWidget *combo; pref_table_label(table, column, row, (_("Units:")), 1.0); combo = print_combo_menu(print_paper_units, PAPER_UNIT_COUNT, units, func, data); gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); gtk_widget_show(combo); return combo;}static void print_paper_units_set(PrintWindow *pw, PaperUnits units){ PaperUnits old_units; if (units < 0 || units >= PAPER_UNIT_COUNT) return; old_units = pw->paper_units; pw->paper_units = units; print_window_layout_sync_paper(pw); if ((units == PAPER_UNIT_MM || units == PAPER_UNIT_CM) != (old_units == PAPER_UNIT_MM || old_units == PAPER_UNIT_CM)) { print_window_layout_render(pw); }}static void print_paper_units_cb(GtkWidget *combo, gpointer data){ PrintWindow *pw = data; PaperUnits units; units = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); print_paper_units_set(pw, units);}static GtkWidget *print_paper_orientation_menu(GtkWidget *table, gint column, gint row, PaperOrientation preferred,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -