⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 print.c

📁 Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -