print_gnome.c
来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 240 行
C
240 行
/* Classic Ladder Project *//* Copyright (C) 2001-2006 Marc Le Douarain *//* http://www.multimania.com/mavati/classicladder *//* http://www.sourceforge.net/projects/classicladder *//* June 2006 *//* ---------------------------------- *//* Printer output (using Gnome-print) *//* ---------------------------------- *//* This library is free software; you can redistribute it and/or *//* modify it under the terms of the GNU Lesser General Public *//* License as published by the Free Software Foundation; either *//* version 2.1 of the License, or (at your option) any later version. *//* This library is distributed in the hope that it will be useful, *//* but WITHOUT ANY WARRANTY; without even the implied warranty of *//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *//* Lesser General Public License for more details. *//* You should have received a copy of the GNU Lesser General Public *//* License along with this library; if not, write to the Free Software *//* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <gtk/gtk.h>#include <libgnomeprint/gnome-print.h>#include <libgnomeprintui/gnome-print-job-preview.h>#include <libgnomeprintui/gnome-print-dialog.h>#include "classicladder.h"#include "global.h"#include "drawing.h"#ifdef SEQUENTIAL_SUPPORT#include "drawing_sequential.h"#endif#include "print_gnome.h"/* Notes : *//* - Troubles (freeze for gnome_print_dialog_new) if gdk_threads_enter() & gdk_threads_leave() between gtk_main()*/GnomePrintContext *gpc = NULL;GnomePrintJob *job = NULL;void DrawPrint( GnomePrintContext *gpc ){ int bl_width = 32; int bl_height = 32; int seq_size = 32; int the_width = RUNG_WIDTH*bl_width; int the_height = RUNG_HEIGHT*bl_height; int iCurrentLanguage = SectionArray[ InfosGene->CurrentSection ].Language; GdkPixmap *pixmap_for_print;#ifdef SEQUENTIAL_SUPPORT if ( iCurrentLanguage==SECTION_IN_SEQUENTIAL ) { the_width = SEQ_PAGE_WIDTH*seq_size; the_height = SEQ_PAGE_HEIGHT*seq_size; }#endif pixmap_for_print = gdk_pixmap_new( drawing_area->window/*drawable*/, the_width, the_height, -1/*depth*/ ); if ( pixmap_for_print ) { char TheEnd = FALSE; char NewPage = TRUE; int SizePageOffset = 800; int ScanRung = InfosGene->FirstRung; int PageNumber = 1; do { char Buffer[ LGT_LABEL+LGT_COMMENT+20 ]; GdkPixbuf *pixbuf_for_print; if ( NewPage==TRUE ) { gnome_print_beginpage( gpc, (guchar *)"1" ); NewPage = FALSE; SizePageOffset = 800; sprintf(Buffer, "ClassicLadder" RELEASE_VER_STRING ". Section:%s - Page:%d", SectionArray[ InfosGene->CurrentSection ].Name, PageNumber ); gnome_print_moveto( gpc, 50, 20 ); gnome_print_show( gpc, (guchar *)Buffer ); } gdk_draw_rectangle (pixmap_for_print, drawing_area->style->white_gc, TRUE, 0, 0, the_width, the_height); if ( iCurrentLanguage==SECTION_IN_LADDER ) DrawRung( pixmap_for_print, &RungArray[ ScanRung ], 0/*PosiY*/, bl_width, bl_height, DRAW_FOR_PRINT );#ifdef SEQUENTIAL_SUPPORT if ( iCurrentLanguage==SECTION_IN_SEQUENTIAL ) { DrawSequentialPage( pixmap_for_print, SectionArray[ InfosGene->CurrentSection ].SequentialPage, DRAW_FOR_PRINT ); TheEnd = TRUE; }#endif pixbuf_for_print = gdk_pixbuf_get_from_drawable( NULL /*GdkPixbuf *dest*/, pixmap_for_print, NULL /*cmap*/, 0 /*src_x*/, 0 /*src_y*/, 0 /*dest_x*/, 0 /*dest_y*/, the_width, the_height); if ( pixbuf_for_print ) { guchar *raw_image; gint rowstride; if ( iCurrentLanguage==SECTION_IN_LADDER ) { char BuffFormat[10] = "%s (%s)"; if ( RungArray[ ScanRung ].Comment[0]=='\0' ) strcpy( BuffFormat, "%s %s" ); sprintf( Buffer, BuffFormat, RungArray[ ScanRung ].Label, RungArray[ ScanRung ].Comment ); gnome_print_moveto( gpc, 50, SizePageOffset ); SizePageOffset = SizePageOffset-20; gnome_print_show( gpc, (guchar *)Buffer ); } raw_image = gdk_pixbuf_get_pixels( pixbuf_for_print ); rowstride = gdk_pixbuf_get_rowstride( pixbuf_for_print ); gnome_print_gsave( gpc ); gnome_print_translate( gpc, 20, SizePageOffset-the_height+15 ); gnome_print_scale( gpc, the_width, the_height ); gnome_print_rgbimage( gpc, raw_image, the_width, the_height, rowstride); gnome_print_grestore( gpc ); SizePageOffset = SizePageOffset-the_height-20; gdk_pixbuf_unref( pixbuf_for_print ); if ( iCurrentLanguage==SECTION_IN_LADDER ) { if ( ScanRung!=InfosGene->LastRung ) ScanRung = RungArray[ ScanRung ].NextRung; else TheEnd = TRUE; } if ( SizePageOffset<200 || TheEnd ) { NewPage = TRUE; PageNumber++; gnome_print_showpage ( gpc ); } } else { printf( "Failed to create pixbuf_for_print\n" ); } } while( !TheEnd ); gdk_pixmap_unref( pixmap_for_print ); } else { printf( "Failed to create pixmap_for_print\n" ); }}void PrintInit( ){ if ( job==NULL ) job = gnome_print_job_new( NULL ); if ( gpc==NULL ) gpc = gnome_print_job_get_context( job );}void PrintFree( ){ if ( gpc ) { g_object_unref( gpc ); gpc = NULL; } if ( job ) { g_object_unref( job ); job = NULL; }}void PrintPreviewGnome( void ){ GtkWidget *preview; PrintInit( ); DrawPrint(gpc); gnome_print_job_close (job); preview = gnome_print_job_preview_new (job, (guchar*)"classicladder-preview");// g_signal_connect (G_OBJECT (preview), "unrealize",// G_CALLBACK (gtk_main_quit), NULL);// g_signal_connect (G_OBJECT (preview), "unrealize",// GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT(preview)); gtk_window_set_modal( GTK_WINDOW(preview), TRUE ); gtk_widget_show (preview); PrintFree( );}void PrintGnome( void ){ GtkWidget *dialog; gint ret; PrintInit( ); dialog = gnome_print_dialog_new( job, (guchar*)"ClassicLadder", 0 ); ret = gtk_dialog_run( GTK_DIALOG( dialog ) ); gtk_widget_destroy( dialog ); switch( ret ) { case GNOME_PRINT_DIALOG_RESPONSE_PRINT: DrawPrint(gpc);gnome_print_job_close (job); gnome_print_job_print( job ); break; case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW: PrintPreviewGnome(); break; } PrintFree( );}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?