Blame tests/print-editor.c

Packit 98cdb6
#include <math.h>
Packit 98cdb6
#include <pango/pangocairo.h>
Packit 98cdb6
#include <gtk/gtk.h>
Packit 98cdb6
Packit 98cdb6
static GtkWidget *main_window;
Packit 98cdb6
static char *filename = NULL;
Packit 98cdb6
static GtkPageSetup *page_setup = NULL;
Packit 98cdb6
static GtkPrintSettings *settings = NULL;
Packit 98cdb6
static gboolean file_changed = FALSE;
Packit 98cdb6
static GtkTextBuffer *buffer;
Packit 98cdb6
static GtkWidget *statusbar;
Packit 98cdb6
static GList *active_prints = NULL;
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
update_title (void)
Packit 98cdb6
{
Packit 98cdb6
  char *basename;
Packit 98cdb6
  char *title;
Packit 98cdb6
  
Packit 98cdb6
  if (filename == NULL)
Packit 98cdb6
    basename = g_strdup ("Untitled");
Packit 98cdb6
  else
Packit 98cdb6
    basename = g_path_get_basename (filename);
Packit 98cdb6
Packit 98cdb6
  title = g_strdup_printf ("Simple Editor with printing - %s", basename);
Packit 98cdb6
  g_free (basename);
Packit 98cdb6
  
Packit 98cdb6
  gtk_window_set_title (GTK_WINDOW (main_window), title);
Packit 98cdb6
  g_free (title);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
update_statusbar (void)
Packit 98cdb6
{
Packit 98cdb6
  gchar *msg;
Packit 98cdb6
  gint row, col;
Packit 98cdb6
  GtkTextIter iter;
Packit 98cdb6
  const char *print_str;
Packit 98cdb6
Packit 98cdb6
  gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 0);
Packit 98cdb6
  
Packit 98cdb6
  gtk_text_buffer_get_iter_at_mark (buffer,
Packit 98cdb6
                                    &iter,
Packit 98cdb6
                                    gtk_text_buffer_get_insert (buffer));
Packit 98cdb6
Packit 98cdb6
  row = gtk_text_iter_get_line (&iter);
Packit 98cdb6
  col = gtk_text_iter_get_line_offset (&iter);
Packit 98cdb6
Packit 98cdb6
  print_str = "";
Packit 98cdb6
  if (active_prints)
Packit 98cdb6
    {
Packit 98cdb6
      GtkPrintOperation *op = active_prints->data;
Packit 98cdb6
      print_str = gtk_print_operation_get_status_string (op);
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  msg = g_strdup_printf ("%d, %d%s %s",
Packit 98cdb6
                         row, col,
Packit 98cdb6
			 file_changed?" - Modified":"",
Packit 98cdb6
			 print_str);
Packit 98cdb6
Packit 98cdb6
  gtk_statusbar_push (GTK_STATUSBAR (statusbar), 0, msg);
Packit 98cdb6
Packit 98cdb6
  g_free (msg);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
update_ui (void)
Packit 98cdb6
{
Packit 98cdb6
  update_title ();
Packit 98cdb6
  update_statusbar ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static char *
Packit 98cdb6
get_text (void)
Packit 98cdb6
{
Packit 98cdb6
  GtkTextIter start, end;
Packit 98cdb6
Packit 98cdb6
  gtk_text_buffer_get_start_iter (buffer, &start;;
Packit 98cdb6
  gtk_text_buffer_get_end_iter (buffer, &end;;
Packit 98cdb6
  return gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
set_text (const char *text, gsize len)
Packit 98cdb6
{
Packit 98cdb6
  gtk_text_buffer_set_text (buffer, text, len);
Packit 98cdb6
  file_changed = FALSE;
Packit 98cdb6
  update_ui ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
do_new (GtkAction *action)
Packit 98cdb6
{
Packit 98cdb6
  g_free (filename);
Packit 98cdb6
  filename = NULL;
Packit 98cdb6
  set_text ("", 0);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
load_file (const char *open_filename)
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget *error_dialog;
Packit 98cdb6
  char *contents;
Packit 98cdb6
  GError *error;
Packit 98cdb6
  gsize len;
Packit 98cdb6
  
Packit 98cdb6
  error_dialog = NULL;
Packit 98cdb6
  error = NULL;
Packit 98cdb6
  if (g_file_get_contents (open_filename, &contents, &len, &error))
Packit 98cdb6
    {
Packit 98cdb6
      if (g_utf8_validate (contents, len, NULL))
Packit 98cdb6
	{
Packit 98cdb6
	  filename = g_strdup (open_filename);
Packit 98cdb6
	  set_text (contents, len);
Packit 98cdb6
	  g_free (contents);
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  error_dialog = gtk_message_dialog_new (GTK_WINDOW (main_window),
Packit 98cdb6
						 GTK_DIALOG_DESTROY_WITH_PARENT,
Packit 98cdb6
						 GTK_MESSAGE_ERROR,
Packit 98cdb6
						 GTK_BUTTONS_CLOSE,
Packit 98cdb6
						 "Error loading file %s:\n%s",
Packit 98cdb6
						 open_filename,
Packit 98cdb6
						 "Not valid utf8");
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      error_dialog = gtk_message_dialog_new (GTK_WINDOW (main_window),
Packit 98cdb6
					     GTK_DIALOG_DESTROY_WITH_PARENT,
Packit 98cdb6
					     GTK_MESSAGE_ERROR,
Packit 98cdb6
					     GTK_BUTTONS_CLOSE,
Packit 98cdb6
					     "Error loading file %s:\n%s",
Packit 98cdb6
					     open_filename,
Packit 98cdb6
					     error->message);
Packit 98cdb6
      
Packit 98cdb6
      g_error_free (error);
Packit 98cdb6
    }
Packit 98cdb6
  if (error_dialog)
Packit 98cdb6
    {
Packit 98cdb6
      g_signal_connect (error_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
Packit 98cdb6
      gtk_widget_show (error_dialog);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
do_open (GtkAction *action)
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget *dialog;
Packit 98cdb6
  gint response;
Packit 98cdb6
  char *open_filename;
Packit 98cdb6
  
Packit 98cdb6
  dialog = gtk_file_chooser_dialog_new ("Select file",
Packit 98cdb6
					GTK_WINDOW (main_window),
Packit 98cdb6
					GTK_FILE_CHOOSER_ACTION_OPEN,
Packit 98cdb6
					GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
Packit 98cdb6
					GTK_STOCK_OPEN, GTK_RESPONSE_OK,
Packit 98cdb6
					NULL);
Packit 98cdb6
  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
Packit 98cdb6
  response = gtk_dialog_run (GTK_DIALOG (dialog));
Packit 98cdb6
Packit 98cdb6
  if (response == GTK_RESPONSE_OK)
Packit 98cdb6
    {
Packit 98cdb6
      open_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
Packit 98cdb6
      load_file (open_filename);
Packit 98cdb6
      g_free (open_filename);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  gtk_widget_destroy (dialog);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
save_file (const char *save_filename)
Packit 98cdb6
{
Packit 98cdb6
  char *text = get_text ();
Packit 98cdb6
  GtkWidget *error_dialog;
Packit 98cdb6
  GError *error;
Packit 98cdb6
Packit 98cdb6
  error = NULL;
Packit 98cdb6
  if (g_file_set_contents (save_filename,
Packit 98cdb6
			   text, -1, &error))
Packit 98cdb6
    {
Packit 98cdb6
      if (save_filename != filename)
Packit 98cdb6
	{
Packit 98cdb6
	  g_free (filename);
Packit 98cdb6
	  filename = g_strdup (save_filename);
Packit 98cdb6
	}
Packit 98cdb6
      file_changed = FALSE;
Packit 98cdb6
      update_ui ();
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      error_dialog = gtk_message_dialog_new (GTK_WINDOW (main_window),
Packit 98cdb6
					     GTK_DIALOG_DESTROY_WITH_PARENT,
Packit 98cdb6
					     GTK_MESSAGE_ERROR,
Packit 98cdb6
					     GTK_BUTTONS_CLOSE,
Packit 98cdb6
					     "Error saving to file %s:\n%s",
Packit 98cdb6
					     filename,
Packit 98cdb6
					     error->message);
Packit 98cdb6
      
Packit 98cdb6
      g_signal_connect (error_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
Packit 98cdb6
      gtk_widget_show (error_dialog);
Packit 98cdb6
      
Packit 98cdb6
      g_error_free (error);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
do_save_as (GtkAction *action)
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget *dialog;
Packit 98cdb6
  gint response;
Packit 98cdb6
  char *save_filename;
Packit 98cdb6
  
Packit 98cdb6
  dialog = gtk_file_chooser_dialog_new ("Select file",
Packit 98cdb6
					GTK_WINDOW (main_window),
Packit 98cdb6
					GTK_FILE_CHOOSER_ACTION_SAVE,
Packit 98cdb6
					GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
Packit 98cdb6
					GTK_STOCK_SAVE, GTK_RESPONSE_OK,
Packit 98cdb6
					NULL);
Packit 98cdb6
  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
Packit 98cdb6
  response = gtk_dialog_run (GTK_DIALOG (dialog));
Packit 98cdb6
Packit 98cdb6
  if (response == GTK_RESPONSE_OK)
Packit 98cdb6
    {
Packit 98cdb6
      save_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
Packit 98cdb6
      save_file (save_filename);
Packit 98cdb6
      g_free (save_filename);
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  gtk_widget_destroy (dialog);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
do_save (GtkAction *action)
Packit 98cdb6
{
Packit 98cdb6
  if (filename == NULL)
Packit 98cdb6
    do_save_as (action);
Packit 98cdb6
  else
Packit 98cdb6
    save_file (filename);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
typedef struct {
Packit 98cdb6
  char *text;
Packit 98cdb6
  PangoLayout *layout;
Packit 98cdb6
  GList *page_breaks;
Packit 98cdb6
  GtkWidget *font_button;
Packit 98cdb6
  char *font;
Packit 98cdb6
} PrintData;
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
begin_print (GtkPrintOperation *operation,
Packit 98cdb6
	     GtkPrintContext *context,
Packit 98cdb6
	     PrintData *print_data)
Packit 98cdb6
{
Packit 98cdb6
  PangoFontDescription *desc;
Packit 98cdb6
  PangoLayoutLine *layout_line;
Packit 98cdb6
  double width, height;
Packit 98cdb6
  double page_height;
Packit 98cdb6
  GList *page_breaks;
Packit 98cdb6
  int num_lines;
Packit 98cdb6
  int line;
Packit 98cdb6
Packit 98cdb6
  width = gtk_print_context_get_width (context);
Packit 98cdb6
  height = gtk_print_context_get_height (context);
Packit 98cdb6
Packit 98cdb6
  print_data->layout = gtk_print_context_create_pango_layout (context);
Packit 98cdb6
Packit 98cdb6
  desc = pango_font_description_from_string (print_data->font);
Packit 98cdb6
  pango_layout_set_font_description (print_data->layout, desc);
Packit 98cdb6
  pango_font_description_free (desc);
Packit 98cdb6
Packit 98cdb6
  pango_layout_set_width (print_data->layout, width * PANGO_SCALE);
Packit 98cdb6
  
Packit 98cdb6
  pango_layout_set_text (print_data->layout, print_data->text, -1);
Packit 98cdb6
Packit 98cdb6
  num_lines = pango_layout_get_line_count (print_data->layout);
Packit 98cdb6
Packit 98cdb6
  page_breaks = NULL;
Packit 98cdb6
  page_height = 0;
Packit 98cdb6
Packit 98cdb6
  for (line = 0; line < num_lines; line++)
Packit 98cdb6
    {
Packit 98cdb6
      PangoRectangle ink_rect, logical_rect;
Packit 98cdb6
      double line_height;
Packit 98cdb6
      
Packit 98cdb6
      layout_line = pango_layout_get_line (print_data->layout, line);
Packit 98cdb6
      pango_layout_line_get_extents (layout_line, &ink_rect, &logical_rect);
Packit 98cdb6
Packit 98cdb6
      line_height = logical_rect.height / 1024.0;
Packit 98cdb6
Packit 98cdb6
      if (page_height + line_height > height)
Packit 98cdb6
	{
Packit 98cdb6
	  page_breaks = g_list_prepend (page_breaks, GINT_TO_POINTER (line));
Packit 98cdb6
	  page_height = 0;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      page_height += line_height;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  page_breaks = g_list_reverse (page_breaks);
Packit 98cdb6
  gtk_print_operation_set_n_pages (operation, g_list_length (page_breaks) + 1);
Packit 98cdb6
  
Packit 98cdb6
  print_data->page_breaks = page_breaks;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_page (GtkPrintOperation *operation,
Packit 98cdb6
	   GtkPrintContext *context,
Packit 98cdb6
	   int page_nr,
Packit 98cdb6
	   PrintData *print_data)
Packit 98cdb6
{
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
  GList *pagebreak;
Packit 98cdb6
  int start, end, i;
Packit 98cdb6
  PangoLayoutIter *iter;
Packit 98cdb6
  double start_pos;
Packit 98cdb6
Packit 98cdb6
  if (page_nr == 0)
Packit 98cdb6
    start = 0;
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      pagebreak = g_list_nth (print_data->page_breaks, page_nr - 1);
Packit 98cdb6
      start = GPOINTER_TO_INT (pagebreak->data);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  pagebreak = g_list_nth (print_data->page_breaks, page_nr);
Packit 98cdb6
  if (pagebreak == NULL)
Packit 98cdb6
    end = pango_layout_get_line_count (print_data->layout);
Packit 98cdb6
  else
Packit 98cdb6
    end = GPOINTER_TO_INT (pagebreak->data);
Packit 98cdb6
    
Packit 98cdb6
  cr = gtk_print_context_get_cairo_context (context);
Packit 98cdb6
Packit 98cdb6
  cairo_set_source_rgb (cr, 0, 0, 0);
Packit 98cdb6
  
Packit 98cdb6
  i = 0;
Packit 98cdb6
  start_pos = 0;
Packit 98cdb6
  iter = pango_layout_get_iter (print_data->layout);
Packit 98cdb6
  do
Packit 98cdb6
    {
Packit 98cdb6
      PangoRectangle   logical_rect;
Packit 98cdb6
      PangoLayoutLine *line;
Packit 98cdb6
      int              baseline;
Packit 98cdb6
Packit 98cdb6
      if (i >= start)
Packit 98cdb6
	{
Packit 98cdb6
	  line = pango_layout_iter_get_line (iter);
Packit 98cdb6
Packit 98cdb6
	  pango_layout_iter_get_line_extents (iter, NULL, &logical_rect);
Packit 98cdb6
	  baseline = pango_layout_iter_get_baseline (iter);
Packit 98cdb6
	  
Packit 98cdb6
	  if (i == start)
Packit 98cdb6
	    start_pos = logical_rect.y / 1024.0;
Packit 98cdb6
	  
Packit 98cdb6
	  cairo_move_to (cr, logical_rect.x / 1024.0, baseline / 1024.0 - start_pos);
Packit 98cdb6
	  
Packit 98cdb6
	  pango_cairo_show_layout_line  (cr, line);
Packit 98cdb6
	}
Packit 98cdb6
      i++;
Packit 98cdb6
    }
Packit 98cdb6
  while (i < end &&
Packit 98cdb6
	 pango_layout_iter_next_line (iter));
Packit 98cdb6
Packit 98cdb6
  pango_layout_iter_free (iter);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
do_page_setup (GtkAction *action)
Packit 98cdb6
{
Packit 98cdb6
  GtkPageSetup *new_page_setup;
Packit 98cdb6
Packit 98cdb6
  new_page_setup = gtk_print_run_page_setup_dialog (GTK_WINDOW (main_window),
Packit 98cdb6
						    page_setup, settings);
Packit 98cdb6
Packit 98cdb6
  if (page_setup)
Packit 98cdb6
    g_object_unref (page_setup);
Packit 98cdb6
  
Packit 98cdb6
  page_setup = new_page_setup;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
status_changed_cb (GtkPrintOperation *op,
Packit 98cdb6
		   gpointer user_data)
Packit 98cdb6
{
Packit 98cdb6
  if (gtk_print_operation_is_finished (op))
Packit 98cdb6
    {
Packit 98cdb6
      active_prints = g_list_remove (active_prints, op);
Packit 98cdb6
      g_object_unref (op);
Packit 98cdb6
    }
Packit 98cdb6
  update_statusbar ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GtkWidget *
Packit 98cdb6
create_custom_widget (GtkPrintOperation *operation,
Packit 98cdb6
		      PrintData *data)
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget *vbox, *hbox, *font, *label;
Packit 98cdb6
Packit 98cdb6
  gtk_print_operation_set_custom_tab_label (operation, "Other");
Packit 98cdb6
  vbox = gtk_vbox_new (FALSE, 0);
Packit 98cdb6
  gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
Packit 98cdb6
Packit 98cdb6
  hbox = gtk_hbox_new (FALSE, 8);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
Packit 98cdb6
  gtk_widget_show (hbox);
Packit 98cdb6
Packit 98cdb6
  label = gtk_label_new ("Font:");
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
Packit 98cdb6
  gtk_widget_show (label);
Packit 98cdb6
  
Packit 98cdb6
  font = gtk_font_button_new_with_font  (data->font);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (hbox), font, FALSE, FALSE, 0);
Packit 98cdb6
  gtk_widget_show (font);
Packit 98cdb6
  data->font_button = font;
Packit 98cdb6
Packit 98cdb6
  return vbox;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
custom_widget_apply (GtkPrintOperation *operation,
Packit 98cdb6
		     GtkWidget *widget,
Packit 98cdb6
		     PrintData *data)
Packit 98cdb6
{
Packit 98cdb6
  const char *selected_font;
Packit 98cdb6
  selected_font = gtk_font_button_get_font_name  (GTK_FONT_BUTTON (data->font_button));
Packit 98cdb6
  g_free (data->font);
Packit 98cdb6
  data->font = g_strdup (selected_font);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
typedef struct 
Packit 98cdb6
{
Packit 98cdb6
  GtkPrintOperation *op;
Packit 98cdb6
  GtkPrintOperationPreview *preview;
Packit 98cdb6
  GtkWidget         *spin;
Packit 98cdb6
  GtkWidget         *area;
Packit 98cdb6
  gint               page;
Packit 98cdb6
  GtkPrintContext   *context;
Packit 98cdb6
  PrintData *data;
Packit 98cdb6
  gdouble dpi_x, dpi_y;
Packit 98cdb6
} PreviewOp;
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
preview_expose (GtkWidget      *widget,
Packit 98cdb6
		GdkEventExpose *event,
Packit 98cdb6
		gpointer        data)
Packit 98cdb6
{
Packit 98cdb6
  PreviewOp *pop = data;
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
Packit 98cdb6
  cr = gdk_cairo_create (pop->area->window);
Packit 98cdb6
  gtk_print_context_set_cairo_context (pop->context, cr, pop->dpi_x, pop->dpi_y);
Packit 98cdb6
  cairo_destroy (cr);
Packit 98cdb6
Packit 98cdb6
  gdk_window_clear (pop->area->window);
Packit 98cdb6
  gtk_print_operation_preview_render_page (pop->preview,
Packit 98cdb6
					   pop->page - 1);
Packit 98cdb6
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
preview_ready (GtkPrintOperationPreview *preview,
Packit 98cdb6
	       GtkPrintContext          *context,
Packit 98cdb6
	       gpointer                  data)
Packit 98cdb6
{
Packit 98cdb6
  PreviewOp *pop = data;
Packit 98cdb6
  gint n_pages;
Packit 98cdb6
Packit 98cdb6
  g_object_get (pop->op, "n-pages", &n_pages, NULL);
Packit 98cdb6
Packit 98cdb6
  gtk_spin_button_set_range (GTK_SPIN_BUTTON (pop->spin), 
Packit 98cdb6
			     1.0, n_pages);
Packit 98cdb6
Packit 98cdb6
  g_signal_connect (pop->area, "expose_event",
Packit 98cdb6
		    G_CALLBACK (preview_expose),
Packit 98cdb6
		    pop);
Packit 98cdb6
Packit 98cdb6
  gtk_widget_queue_draw (pop->area);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
preview_got_page_size (GtkPrintOperationPreview *preview, 
Packit 98cdb6
		       GtkPrintContext          *context,
Packit 98cdb6
		       GtkPageSetup             *page_setup,
Packit 98cdb6
		       gpointer                  data)
Packit 98cdb6
{
Packit 98cdb6
  PreviewOp *pop = data;
Packit 98cdb6
  GtkPaperSize *paper_size;
Packit 98cdb6
  double w, h;
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
  gdouble dpi_x, dpi_y;
Packit 98cdb6
Packit 98cdb6
  paper_size = gtk_page_setup_get_paper_size (page_setup);
Packit 98cdb6
Packit 98cdb6
  w = gtk_paper_size_get_width (paper_size, GTK_UNIT_INCH);
Packit 98cdb6
  h = gtk_paper_size_get_height (paper_size, GTK_UNIT_INCH);
Packit 98cdb6
Packit 98cdb6
  cr = gdk_cairo_create (pop->area->window);
Packit 98cdb6
Packit 98cdb6
  dpi_x = pop->area->allocation.width/w;
Packit 98cdb6
  dpi_y = pop->area->allocation.height/h;
Packit 98cdb6
Packit 98cdb6
  if (fabs (dpi_x - pop->dpi_x) > 0.001 ||
Packit 98cdb6
      fabs (dpi_y - pop->dpi_y) > 0.001)
Packit 98cdb6
    {
Packit 98cdb6
      gtk_print_context_set_cairo_context (context, cr, dpi_x, dpi_y);
Packit 98cdb6
      pop->dpi_x = dpi_x;
Packit 98cdb6
      pop->dpi_y = dpi_y;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  pango_cairo_update_layout (cr, pop->data->layout);
Packit 98cdb6
  cairo_destroy (cr);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
update_page (GtkSpinButton *widget,
Packit 98cdb6
	     gpointer       data)
Packit 98cdb6
{
Packit 98cdb6
  PreviewOp *pop = data;
Packit 98cdb6
Packit 98cdb6
  pop->page = gtk_spin_button_get_value_as_int (widget);
Packit 98cdb6
  gtk_widget_queue_draw (pop->area);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
preview_destroy (GtkWindow *window, 
Packit 98cdb6
		 PreviewOp *pop)
Packit 98cdb6
{
Packit 98cdb6
  gtk_print_operation_preview_end_preview (pop->preview);
Packit 98cdb6
  g_object_unref (pop->op);
Packit 98cdb6
Packit 98cdb6
  g_free (pop);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean 
Packit 98cdb6
preview_cb (GtkPrintOperation        *op,
Packit 98cdb6
	    GtkPrintOperationPreview *preview,
Packit 98cdb6
	    GtkPrintContext          *context,
Packit 98cdb6
	    GtkWindow                *parent,
Packit 98cdb6
	    gpointer                  data)
Packit 98cdb6
{
Packit 98cdb6
  GtkPrintSettings *settings;
Packit 98cdb6
  GtkWidget *window, *close, *page, *hbox, *vbox, *da;
Packit 98cdb6
  gdouble width, height;
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
  PreviewOp *pop;
Packit 98cdb6
  PrintData *print_data = data;
Packit 98cdb6
Packit 98cdb6
  pop = g_new0 (PreviewOp, 1);
Packit 98cdb6
Packit 98cdb6
  pop->data = print_data;
Packit 98cdb6
  settings = gtk_print_operation_get_print_settings (op);
Packit 98cdb6
Packit 98cdb6
  width = 200;
Packit 98cdb6
  height = 300;
Packit 98cdb6
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit 98cdb6
  gtk_window_set_transient_for (GTK_WINDOW (window), 
Packit 98cdb6
				GTK_WINDOW (main_window));
Packit 98cdb6
  vbox = gtk_vbox_new (FALSE, 0);
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (window), vbox);
Packit 98cdb6
  hbox = gtk_hbox_new (FALSE, 0);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox), hbox,
Packit 98cdb6
		      FALSE, FALSE, 0);
Packit 98cdb6
  page = gtk_spin_button_new_with_range (1, 100, 1);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (hbox), page, FALSE, FALSE, 0);
Packit 98cdb6
  
Packit 98cdb6
  close = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (hbox), close, FALSE, FALSE, 0);
Packit 98cdb6
Packit 98cdb6
  da = gtk_drawing_area_new ();
Packit 98cdb6
  gtk_widget_set_size_request (GTK_WIDGET (da), width, height);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox), da, TRUE, TRUE, 0);
Packit 98cdb6
Packit 98cdb6
  gtk_widget_realize (da);
Packit 98cdb6
  
Packit 98cdb6
  cr = gdk_cairo_create (da->window);
Packit 98cdb6
Packit 98cdb6
  /* TODO: What dpi to use here? This will be used for pagination.. */
Packit 98cdb6
  gtk_print_context_set_cairo_context (context, cr, 72, 72);
Packit 98cdb6
  cairo_destroy (cr);
Packit 98cdb6
  
Packit 98cdb6
  pop->op = g_object_ref (op);
Packit 98cdb6
  pop->preview = preview;
Packit 98cdb6
  pop->spin = page;
Packit 98cdb6
  pop->area = da;
Packit 98cdb6
  pop->page = 1;
Packit 98cdb6
  pop->context = context;
Packit 98cdb6
Packit 98cdb6
  g_signal_connect (page, "value-changed", 
Packit 98cdb6
		    G_CALLBACK (update_page), pop);
Packit 98cdb6
  g_signal_connect_swapped (close, "clicked", 
Packit 98cdb6
			    G_CALLBACK (gtk_widget_destroy), window);
Packit 98cdb6
Packit 98cdb6
  g_signal_connect (preview, "ready",
Packit 98cdb6
		    G_CALLBACK (preview_ready), pop);
Packit 98cdb6
  g_signal_connect (preview, "got-page-size",
Packit 98cdb6
		    G_CALLBACK (preview_got_page_size), pop);
Packit 98cdb6
Packit 98cdb6
  g_signal_connect (window, "destroy", 
Packit 98cdb6
                    G_CALLBACK (preview_destroy), pop);
Packit 98cdb6
                            
Packit 98cdb6
  gtk_widget_show_all (window);
Packit 98cdb6
  
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
print_done (GtkPrintOperation *op,
Packit 98cdb6
	    GtkPrintOperationResult res,
Packit 98cdb6
	    PrintData *print_data)
Packit 98cdb6
{
Packit 98cdb6
  GError *error = NULL;
Packit 98cdb6
Packit 98cdb6
  if (res == GTK_PRINT_OPERATION_RESULT_ERROR)
Packit 98cdb6
    {
Packit 98cdb6
Packit 98cdb6
      GtkWidget *error_dialog;
Packit 98cdb6
      
Packit 98cdb6
      gtk_print_operation_get_error (op, &error);
Packit 98cdb6
      
Packit 98cdb6
      error_dialog = gtk_message_dialog_new (GTK_WINDOW (main_window),
Packit 98cdb6
					     GTK_DIALOG_DESTROY_WITH_PARENT,
Packit 98cdb6
					     GTK_MESSAGE_ERROR,
Packit 98cdb6
					     GTK_BUTTONS_CLOSE,
Packit 98cdb6
					     "Error printing file:\n%s",
Packit 98cdb6
					     error ? error->message : "no details");
Packit 98cdb6
      g_signal_connect (error_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
Packit 98cdb6
      gtk_widget_show (error_dialog);
Packit 98cdb6
    }
Packit 98cdb6
  else if (res == GTK_PRINT_OPERATION_RESULT_APPLY)
Packit 98cdb6
    {
Packit 98cdb6
      if (settings != NULL)
Packit 98cdb6
	g_object_unref (settings);
Packit 98cdb6
      settings = g_object_ref (gtk_print_operation_get_print_settings (op));
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  g_free (print_data->text);
Packit 98cdb6
  g_free (print_data->font);
Packit 98cdb6
  g_free (print_data);
Packit 98cdb6
  
Packit 98cdb6
  if (!gtk_print_operation_is_finished (op))
Packit 98cdb6
    {
Packit 98cdb6
      g_object_ref (op);
Packit 98cdb6
      active_prints = g_list_append (active_prints, op);
Packit 98cdb6
      update_statusbar ();
Packit 98cdb6
      
Packit 98cdb6
      /* This ref is unref:ed when we get the final state change */
Packit 98cdb6
      g_signal_connect (op, "status_changed",
Packit 98cdb6
			G_CALLBACK (status_changed_cb), NULL);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
end_print (GtkPrintOperation *op, GtkPrintContext *context, PrintData *print_data)
Packit 98cdb6
{
Packit 98cdb6
  g_list_free (print_data->page_breaks);
Packit 98cdb6
  print_data->page_breaks = NULL;
Packit 98cdb6
  g_object_unref (print_data->layout);
Packit 98cdb6
  print_data->layout = NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
do_print_or_preview (GtkAction *action, GtkPrintOperationAction print_action)
Packit 98cdb6
{
Packit 98cdb6
  GtkPrintOperation *print;
Packit 98cdb6
  PrintData *print_data;
Packit 98cdb6
Packit 98cdb6
  print_data = g_new0 (PrintData, 1);
Packit 98cdb6
Packit 98cdb6
  print_data->text = get_text ();
Packit 98cdb6
  print_data->font = g_strdup ("Sans 12");
Packit 98cdb6
Packit 98cdb6
  print = gtk_print_operation_new ();
Packit 98cdb6
Packit 98cdb6
  gtk_print_operation_set_track_print_status (print, TRUE);
Packit 98cdb6
  
Packit 98cdb6
  if (settings != NULL)
Packit 98cdb6
    gtk_print_operation_set_print_settings (print, settings);
Packit 98cdb6
Packit 98cdb6
  if (page_setup != NULL)
Packit 98cdb6
    gtk_print_operation_set_default_page_setup (print, page_setup);
Packit 98cdb6
  
Packit 98cdb6
  g_signal_connect (print, "begin_print", G_CALLBACK (begin_print), print_data);
Packit 98cdb6
  g_signal_connect (print, "end-print", G_CALLBACK (end_print), print_data);
Packit 98cdb6
  g_signal_connect (print, "draw_page", G_CALLBACK (draw_page), print_data);
Packit 98cdb6
  g_signal_connect (print, "create_custom_widget", G_CALLBACK (create_custom_widget), print_data);
Packit 98cdb6
  g_signal_connect (print, "custom_widget_apply", G_CALLBACK (custom_widget_apply), print_data);
Packit 98cdb6
  g_signal_connect (print, "preview", G_CALLBACK (preview_cb), print_data);
Packit 98cdb6
Packit 98cdb6
  g_signal_connect (print, "done", G_CALLBACK (print_done), print_data);
Packit 98cdb6
Packit 98cdb6
  gtk_print_operation_set_export_filename (print, "test.pdf");
Packit 98cdb6
Packit 98cdb6
#if 0
Packit 98cdb6
  gtk_print_operation_set_allow_async (print, TRUE);
Packit 98cdb6
#endif
Packit 98cdb6
  gtk_print_operation_run (print, print_action, GTK_WINDOW (main_window), NULL);
Packit 98cdb6
Packit 98cdb6
  g_object_unref (print);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
do_print (GtkAction *action)
Packit 98cdb6
{
Packit 98cdb6
  do_print_or_preview (action, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
do_preview (GtkAction *action)
Packit 98cdb6
{
Packit 98cdb6
  do_print_or_preview (action, GTK_PRINT_OPERATION_ACTION_PREVIEW);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
do_about (GtkAction *action)
Packit 98cdb6
{
Packit 98cdb6
  const gchar *authors[] = {
Packit 98cdb6
    "Alexander Larsson",
Packit 98cdb6
    NULL
Packit 98cdb6
  };
Packit 98cdb6
  gtk_show_about_dialog (GTK_WINDOW (main_window),
Packit 98cdb6
			 "name", "print test editor",
Packit 98cdb6
			 "version", "0.1",
Packit 98cdb6
			 "copyright", "(C) Red Hat, Inc",
Packit 98cdb6
			 "comments", "Program to demonstrate GTK+ printing.",
Packit 98cdb6
			 "authors", authors,
Packit 98cdb6
			 NULL);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
do_quit (GtkAction *action)
Packit 98cdb6
{
Packit 98cdb6
  gtk_main_quit ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GtkActionEntry entries[] = {
Packit 98cdb6
  { "FileMenu", NULL, "_File" },               /* name, stock id, label */
Packit 98cdb6
  { "HelpMenu", NULL, "_Help" },               /* name, stock id, label */
Packit 98cdb6
  { "New", GTK_STOCK_NEW,                      /* name, stock id */
Packit 98cdb6
    "_New", "<control>N",                      /* label, accelerator */
Packit 98cdb6
    "Create a new file",                       /* tooltip */ 
Packit 98cdb6
    G_CALLBACK (do_new) },      
Packit 98cdb6
  { "Open", GTK_STOCK_OPEN,                    /* name, stock id */
Packit 98cdb6
    "_Open","<control>O",                      /* label, accelerator */     
Packit 98cdb6
    "Open a file",                             /* tooltip */
Packit 98cdb6
    G_CALLBACK (do_open) }, 
Packit 98cdb6
  { "Save", GTK_STOCK_SAVE,                    /* name, stock id */
Packit 98cdb6
    "_Save","<control>S",                      /* label, accelerator */     
Packit 98cdb6
    "Save current file",                       /* tooltip */
Packit 98cdb6
    G_CALLBACK (do_save) },
Packit 98cdb6
  { "SaveAs", GTK_STOCK_SAVE,                  /* name, stock id */
Packit 98cdb6
    "Save _As...", NULL,                       /* label, accelerator */     
Packit 98cdb6
    "Save to a file",                          /* tooltip */
Packit 98cdb6
    G_CALLBACK (do_save_as) },
Packit 98cdb6
  { "Quit", GTK_STOCK_QUIT,                    /* name, stock id */
Packit 98cdb6
    "_Quit", "<control>Q",                     /* label, accelerator */     
Packit 98cdb6
    "Quit",                                    /* tooltip */
Packit 98cdb6
    G_CALLBACK (do_quit) },
Packit 98cdb6
  { "About", NULL,                             /* name, stock id */
Packit 98cdb6
    "_About", "<control>A",                    /* label, accelerator */     
Packit 98cdb6
    "About",                                   /* tooltip */  
Packit 98cdb6
    G_CALLBACK (do_about) },
Packit 98cdb6
  { "PageSetup", NULL,                         /* name, stock id */
Packit 98cdb6
    "Page _Setup", NULL,                       /* label, accelerator */     
Packit 98cdb6
    "Set up the page",                         /* tooltip */
Packit 98cdb6
    G_CALLBACK (do_page_setup) },
Packit 98cdb6
  { "Preview", NULL,                           /* name, stock id */
Packit 98cdb6
    "Print Preview", NULL,                     /* label, accelerator */     
Packit 98cdb6
    "Preview the printed document",            /* tooltip */
Packit 98cdb6
    G_CALLBACK (do_preview) },
Packit 98cdb6
  { "Print", GTK_STOCK_PRINT,                  /* name, stock id */
Packit 98cdb6
     NULL, NULL,                               /* label, accelerator */     
Packit 98cdb6
    "Print the document",                      /* tooltip */
Packit 98cdb6
    G_CALLBACK (do_print) }
Packit 98cdb6
};
Packit 98cdb6
static guint n_entries = G_N_ELEMENTS (entries);
Packit 98cdb6
Packit 98cdb6
static const gchar *ui_info = 
Packit 98cdb6
"<ui>"
Packit 98cdb6
"  <menubar name='MenuBar'>"
Packit 98cdb6
"    <menu action='FileMenu'>"
Packit 98cdb6
"      <menuitem action='New'/>"
Packit 98cdb6
"      <menuitem action='Open'/>"
Packit 98cdb6
"      <menuitem action='Save'/>"
Packit 98cdb6
"      <menuitem action='SaveAs'/>"
Packit 98cdb6
"      <menuitem action='PageSetup'/>"
Packit 98cdb6
"      <menuitem action='Preview'/>"
Packit 98cdb6
"      <menuitem action='Print'/>"
Packit 98cdb6
"      <separator/>"
Packit 98cdb6
"      <menuitem action='Quit'/>"
Packit 98cdb6
"    </menu>"
Packit 98cdb6
"    <menu action='HelpMenu'>"
Packit 98cdb6
"      <menuitem action='About'/>"
Packit 98cdb6
"    </menu>"
Packit 98cdb6
"  </menubar>"
Packit 98cdb6
"</ui>";
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
buffer_changed_callback (GtkTextBuffer *buffer)
Packit 98cdb6
{
Packit 98cdb6
  file_changed = TRUE;
Packit 98cdb6
  update_statusbar ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
mark_set_callback (GtkTextBuffer     *buffer,
Packit 98cdb6
                   const GtkTextIter *new_location,
Packit 98cdb6
                   GtkTextMark       *mark,
Packit 98cdb6
                   gpointer           data)
Packit 98cdb6
{
Packit 98cdb6
  update_statusbar ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
update_resize_grip (GtkWidget           *widget,
Packit 98cdb6
		    GdkEventWindowState *event,
Packit 98cdb6
		    GtkStatusbar        *statusbar)
Packit 98cdb6
{
Packit 98cdb6
  if (event->changed_mask & (GDK_WINDOW_STATE_MAXIMIZED | 
Packit 98cdb6
			     GDK_WINDOW_STATE_FULLSCREEN))
Packit 98cdb6
    {
Packit 98cdb6
      gboolean maximized;
Packit 98cdb6
Packit 98cdb6
      maximized = event->new_window_state & (GDK_WINDOW_STATE_MAXIMIZED | 
Packit 98cdb6
					     GDK_WINDOW_STATE_FULLSCREEN);
Packit 98cdb6
      gtk_statusbar_set_has_resize_grip (statusbar, !maximized);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
create_window (void)
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget *bar;
Packit 98cdb6
  GtkWidget *table;
Packit 98cdb6
  GtkWidget *contents;
Packit 98cdb6
  GtkUIManager *ui;
Packit 98cdb6
  GtkWidget *sw;
Packit 98cdb6
  GtkActionGroup *actions;
Packit 98cdb6
  GError *error;
Packit 98cdb6
  GtkWindowGroup *group;
Packit 98cdb6
  
Packit 98cdb6
  main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit 98cdb6
Packit 98cdb6
  group = gtk_window_group_new ();
Packit 98cdb6
  gtk_window_group_add_window (group, GTK_WINDOW (main_window));
Packit 98cdb6
  g_object_unref (group);
Packit 98cdb6
Packit 98cdb6
  gtk_window_set_default_size (GTK_WINDOW (main_window),
Packit 98cdb6
			       400, 600);
Packit 98cdb6
  
Packit 98cdb6
  g_signal_connect (main_window, "delete-event",
Packit 98cdb6
		    G_CALLBACK (gtk_main_quit), NULL);
Packit 98cdb6
  
Packit 98cdb6
  actions = gtk_action_group_new ("Actions");
Packit 98cdb6
  gtk_action_group_add_actions (actions, entries, n_entries, NULL);
Packit 98cdb6
  
Packit 98cdb6
  ui = gtk_ui_manager_new ();
Packit 98cdb6
  gtk_ui_manager_insert_action_group (ui, actions, 0);
Packit 98cdb6
  gtk_window_add_accel_group (GTK_WINDOW (main_window), 
Packit 98cdb6
			      gtk_ui_manager_get_accel_group (ui));
Packit 98cdb6
  gtk_container_set_border_width (GTK_CONTAINER (main_window), 0);
Packit 98cdb6
Packit 98cdb6
  error = NULL;
Packit 98cdb6
  if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, -1, &error))
Packit 98cdb6
    {
Packit 98cdb6
      g_message ("building menus failed: %s", error->message);
Packit 98cdb6
      g_error_free (error);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  table = gtk_table_new (1, 3, FALSE);
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (main_window), table);
Packit 98cdb6
Packit 98cdb6
  bar = gtk_ui_manager_get_widget (ui, "/MenuBar");
Packit 98cdb6
  gtk_widget_show (bar);
Packit 98cdb6
  gtk_table_attach (GTK_TABLE (table),
Packit 98cdb6
		    bar, 
Packit 98cdb6
		    /* X direction */          /* Y direction */
Packit 98cdb6
		    0, 1,                      0, 1,
Packit 98cdb6
		    GTK_EXPAND | GTK_FILL,     0,
Packit 98cdb6
		    0,                         0);
Packit 98cdb6
Packit 98cdb6
  /* Create document  */
Packit 98cdb6
  sw = gtk_scrolled_window_new (NULL, NULL);
Packit 98cdb6
Packit 98cdb6
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
Packit 98cdb6
				  GTK_POLICY_AUTOMATIC,
Packit 98cdb6
				  GTK_POLICY_AUTOMATIC);
Packit 98cdb6
  
Packit 98cdb6
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
Packit 98cdb6
				       GTK_SHADOW_IN);
Packit 98cdb6
  
Packit 98cdb6
  gtk_table_attach (GTK_TABLE (table),
Packit 98cdb6
		    sw,
Packit 98cdb6
		    /* X direction */       /* Y direction */
Packit 98cdb6
		    0, 1,                   1, 2,
Packit 98cdb6
		    GTK_EXPAND | GTK_FILL,  GTK_EXPAND | GTK_FILL,
Packit 98cdb6
		    0,                      0);
Packit 98cdb6
  
Packit 98cdb6
  contents = gtk_text_view_new ();
Packit 98cdb6
  gtk_widget_grab_focus (contents);
Packit 98cdb6
      
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (sw),
Packit 98cdb6
		     contents);
Packit 98cdb6
  
Packit 98cdb6
  /* Create statusbar */
Packit 98cdb6
  
Packit 98cdb6
  statusbar = gtk_statusbar_new ();
Packit 98cdb6
  gtk_table_attach (GTK_TABLE (table),
Packit 98cdb6
		    statusbar,
Packit 98cdb6
		    /* X direction */       /* Y direction */
Packit 98cdb6
		    0, 1,                   2, 3,
Packit 98cdb6
		    GTK_EXPAND | GTK_FILL,  0,
Packit 98cdb6
		    0,                      0);
Packit 98cdb6
Packit 98cdb6
  /* Show text widget info in the statusbar */
Packit 98cdb6
  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (contents));
Packit 98cdb6
  
Packit 98cdb6
  g_signal_connect_object (buffer,
Packit 98cdb6
			   "changed",
Packit 98cdb6
			   G_CALLBACK (buffer_changed_callback),
Packit 98cdb6
			   NULL,
Packit 98cdb6
			   0);
Packit 98cdb6
  
Packit 98cdb6
  g_signal_connect_object (buffer,
Packit 98cdb6
			   "mark_set", /* cursor moved */
Packit 98cdb6
			   G_CALLBACK (mark_set_callback),
Packit 98cdb6
			   NULL,
Packit 98cdb6
			   0);
Packit 98cdb6
  
Packit 98cdb6
  g_signal_connect_object (main_window, 
Packit 98cdb6
			   "window_state_event", 
Packit 98cdb6
			   G_CALLBACK (update_resize_grip),
Packit 98cdb6
			   statusbar,
Packit 98cdb6
			   0);
Packit 98cdb6
  
Packit 98cdb6
  update_ui ();
Packit 98cdb6
  
Packit 98cdb6
  gtk_widget_show_all (main_window);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
int
Packit 98cdb6
main (int argc, char **argv)
Packit 98cdb6
{
Packit 98cdb6
  GError *error = NULL;
Packit 98cdb6
Packit 98cdb6
  g_set_application_name ("Print editor");
Packit 98cdb6
  gtk_init (&argc, &argv);
Packit 98cdb6
Packit 98cdb6
  settings = gtk_print_settings_new_from_file ("print-settings.ini", &error);
Packit 98cdb6
  if (error) {
Packit 98cdb6
    g_print ("Failed to load print settings: %s\n", error->message);
Packit 98cdb6
    g_clear_error (&error);
Packit 98cdb6
Packit 98cdb6
    settings = gtk_print_settings_new ();
Packit 98cdb6
  }
Packit 98cdb6
  g_assert (settings != NULL);
Packit 98cdb6
Packit 98cdb6
  page_setup = gtk_page_setup_new_from_file ("page-setup.ini", &error);
Packit 98cdb6
  if (error) {
Packit 98cdb6
    g_print ("Failed to load page setup: %s\n", error->message);
Packit 98cdb6
    g_clear_error (&error);
Packit 98cdb6
  }
Packit 98cdb6
Packit 98cdb6
  create_window ();
Packit 98cdb6
Packit 98cdb6
  if (argc == 2)
Packit 98cdb6
    load_file (argv[1]);
Packit 98cdb6
  
Packit 98cdb6
  gtk_main ();
Packit 98cdb6
Packit 98cdb6
  if (!gtk_print_settings_to_file (settings, "print-settings.ini", &error)) {
Packit 98cdb6
    g_print ("Failed to save print settings: %s\n", error->message);
Packit 98cdb6
    g_clear_error (&error);
Packit 98cdb6
  }
Packit 98cdb6
  if (page_setup &&
Packit 98cdb6
      !gtk_page_setup_to_file (page_setup, "page-setup.ini", &error)) {
Packit 98cdb6
    g_print ("Failed to save page setup: %s\n", error->message);
Packit 98cdb6
    g_clear_error (&error);
Packit 98cdb6
  }
Packit 98cdb6
Packit 98cdb6
  return 0;
Packit 98cdb6
}