59 color.red = (guint16) ( plsc->curcolor.r / 255. * 65535 );
60 color.green = (guint16) ( plsc->curcolor.g / 255. * 65535 );
61 color.blue = (guint16) ( plsc->curcolor.b / 255. * 65535 );
64 plwarn(
"GCW driver <set_gdk_color>: Could not allocate color." );
66 gdk_gc_set_foreground( dev->
gc, &color );
93 width = *(
PLINT *) g_object_get_data( G_OBJECT( dev->
canvas ),
"canvas-width" );
94 height = *(
PLINT *) g_object_get_data( G_OBJECT( dev->
canvas ),
"canvas-height" );
102 gdk_gc_set_foreground( dev->
gc, &( dev->
bgcolor ) );
133 if ( !GNOME_IS_CANVAS( canvas ) )
134 plexit(
"GCW driver: Canvas not found" );
140 dev->
colormap = gtk_widget_get_colormap( GTK_WIDGET( dev->
canvas ) );
146 if ( !GNOME_IS_CANVAS_ITEM(
148 gnome_canvas_root( canvas ),
149 gnome_canvas_clipgroup_get_type(),
155 plexit(
"GCW driver <gcw_init_canvas>: Canvas group cannot be created" );
187 void destroy( GtkWidget *widget, gpointer data )
199 void zoom( gpointer data, gint flag )
204 GtkWidget *scrolled_window;
212 n = gtk_notebook_get_current_page( GTK_NOTEBOOK( dev->
notebook ) );
213 scrolled_window = gtk_notebook_get_nth_page( GTK_NOTEBOOK( dev->
notebook ), n );
214 canvas = GNOME_CANVAS( gtk_container_get_children(
215 GTK_CONTAINER( gtk_container_get_children(
216 GTK_CONTAINER( scrolled_window ) )->data ) )->data );
221 else if ( flag == 0 )
226 gnome_canvas_c2w( canvas, 1, 0, &curmag, &dum );
227 curmag = 1. / curmag;
240 gnome_canvas_c2w( canvas, 1, 0, &curmag, &dum );
241 curmag = 1. / curmag;
251 void zoom_in( GtkWidget *widget, gpointer data )
279 GtkWidget *scrolled_window;
284 char devname[10], str[100];
289 PLINT cur_strm, new_strm;
296 gboolean errflag =
FALSE;
301 GtkWidget *hbox, *message, *icon;
310 strdup( gtk_file_selection_get_filename( GTK_FILE_SELECTION( dev->
filew ) ) ) )
312 plabort(
"GCW driver <file_ok_sel>: Cannot obtain filename" );
315 if ( stat( fname, &buf ) == 0 )
319 dialog = GTK_DIALOG( gtk_dialog_new_with_buttons(
"",
320 GTK_WINDOW( dev->
filew ),
321 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
322 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
323 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ) );
325 message = gtk_label_new(
"" );
326 gtk_label_set_markup( GTK_LABEL( message ),
327 "<span size=\"large\"><b>File exists. "
328 "Overwrite?</b></span>" );
330 icon = gtk_image_new_from_stock( GTK_STOCK_DIALOG_QUESTION,
331 GTK_ICON_SIZE_DIALOG );
333 hbox = gtk_hbox_new(
FALSE, 0 );
334 gtk_box_pack_start( GTK_BOX( hbox ), icon,
TRUE,
TRUE, 10 );
335 gtk_box_pack_start( GTK_BOX( hbox ), message,
TRUE,
TRUE, 10 );
336 gtk_container_add( GTK_CONTAINER( dialog->vbox ), hbox );
338 gtk_widget_show_all( GTK_WIDGET( dialog ) );
340 result = gtk_dialog_run( dialog );
341 gtk_widget_destroy( GTK_WIDGET( dialog ) );
342 if ( result == GTK_RESPONSE_REJECT )
347 gtk_widget_hide( dev->
filew );
353 if ( ( f = fopen( fname,
"w" ) ) == NULL )
354 plabort(
"GCW driver <file_ok_sel>: Cannot open output file" );
366 if ( strcasecmp( &fname[n - 3],
"png" ) == 0 )
367 sprintf( devname,
"png" );
368 else if ( strcasecmp( &fname[n - 3],
"gif" ) == 0 )
369 sprintf( devname,
"gif" );
370 else if ( strcasecmp( &fname[n - 3],
"jpg" ) == 0 )
371 sprintf( devname,
"jpg" );
372 else if ( strcasecmp( &fname[n - 4],
"jpeg" ) == 0 )
373 sprintf( devname,
"jpeg" );
374 else if ( strcasecmp( &fname[n - 2],
"ps" ) == 0 )
375 sprintf( devname,
"ps" );
376 else if ( strcasecmp( &fname[n - 3],
"psc" ) == 0 )
377 sprintf( devname,
"psc" );
378 else if ( strcasecmp( &fname[n - 4],
"xwin" ) == 0 )
379 sprintf( devname,
"xwin" );
380 else if ( strcasecmp( &fname[n - 3],
"gcw" ) == 0 )
381 sprintf( devname,
"gcw" );
382 else if ( strcasecmp( &fname[n - 2],
"tk" ) == 0 )
383 sprintf( devname,
"tk" );
388 context = gtk_statusbar_get_context_id( GTK_STATUSBAR( dev->
statusbar ),
390 gtk_statusbar_push( GTK_STATUSBAR( dev->
statusbar ), context,
391 " WARNING: File type not recognized (unknown "
392 "extension). Use one of ps, psc, png, jpg, or "
398 plabort(
"GCW driver <file_ok_sel>: File type not recognized" );
402 if ( strcmp( devname,
"ps" ) == 0 || strcmp( devname,
"psc" ) == 0 )
404 if ( plsc->dev_hrshsym != 1 )
407 context = gtk_statusbar_get_context_id( GTK_STATUSBAR( dev->
statusbar ),
410 gtk_statusbar_push( GTK_STATUSBAR( dev->
statusbar ), context,
411 " NOTE: Use '-drvopt hrshsym' on command-line "
412 "for complete symbol set in PostScript files."
416 plwarn(
"GCW driver: Use '-drvopt hrshsym' if symbols are missing in "
417 "saved PostScript files." );
419 if ( strcmp( devname,
"xwin" ) == 0 || strcmp( devname,
"tk" ) == 0 )
421 if ( plsc->dev_text != 0 )
422 plwarn(
"GCW driver: Use '-drvopt text=0'" );
426 n = gtk_notebook_get_current_page( GTK_NOTEBOOK( dev->
notebook ) );
427 scrolled_window = gtk_notebook_get_nth_page( GTK_NOTEBOOK( dev->
notebook ), n );
428 canvas = GNOME_CANVAS( gtk_container_get_children(
429 GTK_CONTAINER( gtk_container_get_children(
430 GTK_CONTAINER( scrolled_window ) )->data ) )->data );
433 new_state = g_object_get_data( G_OBJECT( canvas ),
"plotbuf" );
435 if ( new_state != NULL )
463 plwarn(
"GCW driver <file_ok_sel>: Cannot set up output stream." );
473 gtk_widget_hide( dev->
filew );
480 void filesel( GtkWidget *widget, gpointer data )
482 GtkWidget *scrolled_window;
490 n = gtk_notebook_get_current_page( GTK_NOTEBOOK( dev->
notebook ) );
491 scrolled_window = gtk_notebook_get_nth_page( GTK_NOTEBOOK( dev->
notebook ), n );
492 canvas = GNOME_CANVAS( gtk_container_get_children(
493 GTK_CONTAINER( gtk_container_get_children(
494 GTK_CONTAINER( scrolled_window ) )->data ) )->data );
497 if ( dev->
filew == NULL )
500 dev->
filew = gtk_file_selection_new(
"File selection" );
503 g_signal_connect( G_OBJECT( GTK_FILE_SELECTION( dev->
filew )->ok_button ),
504 "clicked", G_CALLBACK(
file_ok_sel ), (gpointer) dev );
507 g_signal_connect( G_OBJECT( GTK_FILE_SELECTION( dev->filew )->cancel_button ),
512 gtk_file_selection_set_filename( GTK_FILE_SELECTION( dev->filew ),
516 gtk_widget_show( dev->
filew );
523 void key_release( GtkWidget *widget, GdkEventKey *event, gpointer data )
525 if ( event->keyval ==
'+' )
527 if ( event->keyval ==
'=' )
529 if ( event->keyval ==
'-' )
531 if ( event->keyval ==
'q' )
542 GtkWidget *vbox, *hbox, *button, *image, *scrolled_window;
544 gboolean flag =
FALSE;
553 if ( !GNOME_IS_CANVAS( canvas ) )
555 if ( !GNOME_IS_CANVAS( canvas = GNOME_CANVAS( gnome_canvas_new_aa() ) ) )
556 plexit(
"GCW driver <gcw_install_canvas>: Could not create Canvas" );
562 if ( dev->
window == NULL )
568 dev->
window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
569 gtk_window_set_title( GTK_WINDOW( dev->
window ),
"PLplot" );
572 g_signal_connect( G_OBJECT( dev->
window ),
"delete_event",
574 g_signal_connect( G_OBJECT( dev->
window ),
"destroy", G_CALLBACK(
destroy ), NULL );
578 vbox = gtk_vbox_new(
FALSE, 2 );
579 gtk_container_add( GTK_CONTAINER( dev->
window ), vbox );
582 hbox = gtk_hbox_new(
FALSE, 0 );
583 gtk_box_pack_start( GTK_BOX( vbox ), hbox,
TRUE,
TRUE, 0 );
590 vbox = gtk_vbox_new(
FALSE, 5 );
591 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
592 gtk_box_pack_start( GTK_BOX( hbox ), vbox,
FALSE,
FALSE, 0 );
596 gtk_notebook_set_scrollable( GTK_NOTEBOOK( dev->
notebook ),
TRUE );
598 g_signal_connect( G_OBJECT( dev->
notebook ),
"key_release_event",
602 gtk_box_pack_start( GTK_BOX( vbox ), gtk_label_new(
" " ),
FALSE,
FALSE, 0 );
603 gtk_box_pack_start( GTK_BOX( vbox ), gtk_label_new(
" " ),
FALSE,
FALSE, 0 );
608 image = gtk_image_new_from_stock( GTK_STOCK_ZOOM_IN,
609 GTK_ICON_SIZE_SMALL_TOOLBAR );
610 button = gtk_button_new();
611 gtk_container_add( GTK_CONTAINER( button ), image );
612 gtk_box_pack_start( GTK_BOX( vbox ), button,
FALSE,
FALSE, 0 );
613 g_signal_connect( G_OBJECT( button ),
"clicked",
614 G_CALLBACK(
zoom_in ), (gpointer) dev );
615 g_signal_connect( G_OBJECT( button ),
"key_release_event",
619 image = gtk_image_new_from_stock( GTK_STOCK_ZOOM_100,
620 GTK_ICON_SIZE_SMALL_TOOLBAR );
621 button = gtk_button_new();
622 gtk_container_add( GTK_CONTAINER( button ), image );
623 gtk_box_pack_start( GTK_BOX( vbox ), button,
FALSE,
FALSE, 0 );
624 g_signal_connect( G_OBJECT( button ),
"clicked",
625 G_CALLBACK(
zoom_100 ), (gpointer) dev );
628 image = gtk_image_new_from_stock( GTK_STOCK_ZOOM_OUT,
629 GTK_ICON_SIZE_SMALL_TOOLBAR );
630 button = gtk_button_new();
631 gtk_container_add( GTK_CONTAINER( button ), image );
632 gtk_box_pack_start( GTK_BOX( vbox ), button,
FALSE,
FALSE, 0 );
633 g_signal_connect( G_OBJECT( button ),
"clicked",
634 G_CALLBACK(
zoom_out ), (gpointer) dev );
635 g_signal_connect( G_OBJECT( button ),
"key_release_event",
639 if ( plsc->plbuf_write )
641 image = gtk_image_new_from_stock( GTK_STOCK_SAVE,
642 GTK_ICON_SIZE_SMALL_TOOLBAR );
643 button = gtk_button_new();
644 gtk_container_add( GTK_CONTAINER( button ), image );
645 gtk_box_pack_start( GTK_BOX( vbox ), button,
FALSE,
FALSE, 0 );
646 g_signal_connect( G_OBJECT( button ),
"clicked",
647 G_CALLBACK(
filesel ), (gpointer) dev );
652 scrolled_window = gtk_scrolled_window_new( NULL, NULL );
653 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scrolled_window ),
654 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
655 gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW( scrolled_window ),
656 GTK_WIDGET( canvas ) );
659 gtk_notebook_append_page( GTK_NOTEBOOK( dev->
notebook ), scrolled_window, NULL );
667 width = *(
PLINT *) g_object_get_data( G_OBJECT( canvas ),
"canvas-width" );
668 height = *(
PLINT *) g_object_get_data( G_OBJECT( canvas ),
"canvas-height" );
671 gtk_window_resize( GTK_WINDOW( dev->
window ), width *
ZOOM100 + 65,
676 gtk_widget_show_all( dev->
window );
710 h = (
PLINT) ( height * VSCALE );
740 GdkPixmap *background;
752 if ( plsc->portrait )
764 if ( ( w = (
PLINT *) malloc(
sizeof ( gint ) ) ) == NULL )
765 plwarn(
"GCW driver <gcw_set_canvas_size>: Insufficient memory." );
766 if ( ( h = (
PLINT *) malloc(
sizeof ( gint ) ) ) == NULL )
767 plwarn(
"GCW driver <gcw_set_canvas_size>: Insufficient memory." );
770 g_object_set_data( G_OBJECT( canvas ),
"canvas-width", (gpointer) w );
771 g_object_set_data( G_OBJECT( canvas ),
"canvas-height", (gpointer) h );
774 gtk_widget_set_size_request( GTK_WIDGET( canvas ), (gint) ( width ),
778 gnome_canvas_set_scroll_region( canvas, 0., (gdouble) ( -height ),
779 (gdouble) ( width ), 1. );
796 dev->
background = gdk_pixmap_new( NULL, width, height,
797 gtk_widget_get_visual( GTK_WIDGET( canvas ) )->depth );
804 if ( GDK_IS_GC( dev->
gc ) )
806 gdk_gc_get_values( dev->
gc, &values );
807 gdk_gc_unref( dev->
gc );
808 dev->
gc = gdk_gc_new_with_values( dev->
background, &values,
809 GDK_GC_FOREGROUND | GDK_GC_LINE_WIDTH |
810 GDK_GC_LINE_STYLE | GDK_GC_CAP_STYLE |
841 gdouble curmag = 1., dum;
850 width = *(
PLINT *) g_object_get_data( G_OBJECT( canvas ),
"canvas-width" );
851 height = *(
PLINT *) g_object_get_data( G_OBJECT( canvas ),
"canvas-height" );
854 gnome_canvas_c2w( canvas, 1, 0, &curmag, &dum );
855 curmag = 1. / curmag;
858 gnome_canvas_set_pixels_per_unit( canvas, magnification * curmag );
861 gtk_widget_set_size_request( GTK_WIDGET( canvas ),
862 (gint) ( ( width ) * magnification * curmag ),
863 (gint) ( ( height ) * magnification * curmag ) );
866 gnome_canvas_set_scroll_region( canvas, 0., (gdouble) ( -height ),
867 (gdouble) ( width ), 1. );
889 #ifdef PL_HAVE_FREETYPE
941 plsc->dev_hrshsym = use_hrshsym;
void gcw_init_canvas(GnomeCanvas *canvas)
void gcw_install_canvas(GnomeCanvas *canvas)
void gcw_set_canvas_zoom(GnomeCanvas *canvas, PLFLT magnification)
void zoom_out(GtkWidget *widget, gpointer data)
void filesel(GtkWidget *widget, gpointer data)
void plbuf_restore(PLStream *pls, void *state)
void destroy(GtkWidget *widget, gpointer data)
void gcw_use_pixmap(PLINT use_pixmap)
void gcw_set_canvas_size(GnomeCanvas *canvas, PLINT width, PLINT height)
void gcw_use_persistence(PLINT use_persistence)
GnomeCanvasGroup * group_persistent
void * plbuf_switch(PLStream *pls, void *state)
void gcw_use_text(PLINT use_text)
void file_cancel_sel(GtkWidget *w, gpointer data)
void gcw_clear_background()
void gcw_debug(char *msg)
void file_ok_sel(GtkWidget *w, gpointer data)
gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
void plP_setpxl(PLFLT xpmm, PLFLT ypmm)
subroutine plsetopt(opt, optarg)
void plP_setphy(PLINT xmin, PLINT xmax, PLINT ymin, PLINT ymax)
void gcw_use_hrshsym(PLINT use_hrshsym)
void plabort(const char *errormsg)
void zoom(gpointer data, gint flag)
void zoom_in(GtkWidget *widget, gpointer data)
void plwarn(const char *errormsg)
void zoom_100(GtkWidget *widget, gpointer data)
void key_release(GtkWidget *widget, GdkEventKey *event, gpointer data)
void gcw_set_device_size(PLINT width, PLINT height)
void plexit(const char *errormsg)