]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkpapersize.c
entry: Add bug reference to workaround
[~andy/gtk] / gtk / gtkpapersize.c
index c5613275ab36cd25f74817d2041e444ea020c146..3d81fd9f35496c4dbe565495cc9b8e74806ef698 100644 (file)
@@ -1,6 +1,7 @@
 /* GTK - The GIMP Toolkit
  * gtkpapersize.c: Paper Size
  * Copyright (C) 2006, Red Hat, Inc.
+ * Copyright © 2006, 2007 Christian Persch
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -30,7 +31,6 @@
 #include "gtkprintutils.h"
 #include "gtkprintoperation.h"  /* for GtkPrintError */
 #include "gtkintl.h"
-#include "gtkalias.h"
 
 #include "paper_names_offsets.c"
 
@@ -47,17 +47,9 @@ struct _GtkPaperSize
   gboolean is_custom;
 };
 
-GType
-gtk_paper_size_get_type (void)
-{
-  static GType our_type = 0;
-  
-  if (our_type == 0)
-    our_type = g_boxed_type_register_static (I_("GtkPaperSize"),
-                                            (GBoxedCopyFunc)gtk_paper_size_copy,
-                                            (GBoxedFreeFunc)gtk_paper_size_free);
-  return our_type;
-}
+G_DEFINE_BOXED_TYPE (GtkPaperSize, gtk_paper_size,
+                     gtk_paper_size_copy,
+                     gtk_paper_size_free)
 
 static const PaperInfo *
 lookup_paper_info (const gchar *name)
@@ -180,7 +172,7 @@ gtk_paper_size_new_from_info (const PaperInfo *info)
 {
   GtkPaperSize *size;
   
-  size = g_new0 (GtkPaperSize, 1);
+  size = g_slice_new0 (GtkPaperSize);
   size->info = info;
   size->width = info->width;
   size->height = info->height;
@@ -190,11 +182,11 @@ gtk_paper_size_new_from_info (const PaperInfo *info)
 
 /**
  * gtk_paper_size_new:
- * @name: a paper size name, or %NULL
- * 
- * Creates a new #GtkPaperSize object by parsing a 
- * PWG 5101.1-2002 PWG <!-- FIXME link here -->
- * paper name. 
+ * @name: (allow-none): a paper size name, or %NULL
+ *
+ * Creates a new #GtkPaperSize object by parsing a
+ * <ulink url="ftp://ftp.pwg.org/pub/pwg/candidates/cs-pwgmsn10-20020226-5101.1.pdf">PWG 5101.1-2002</ulink>
+ * paper name.
  *
  * If @name is %NULL, the default paper size is returned,
  * see gtk_paper_size_get_default().
@@ -217,12 +209,14 @@ gtk_paper_size_new (const gchar *name)
   
   if (parse_full_media_size_name (name, &short_name, &width, &height))
     {
-      size = g_new0 (GtkPaperSize, 1);
+      size = g_slice_new0 (GtkPaperSize);
 
       size->width = width;
       size->height = height;
       size->name = short_name;
       size->display_name = g_strdup (short_name);
+      if (strncmp (short_name, "custom", 6) == 0)
+        size->is_custom = TRUE;
     }
   else
     {
@@ -232,7 +226,7 @@ gtk_paper_size_new (const gchar *name)
       else
        {
          g_warning ("Unknown paper size %s\n", name);
-         size = g_new0 (GtkPaperSize, 1);
+         size = g_slice_new0 (GtkPaperSize);
          size->name = g_strdup (name);
          size->display_name = g_strdup (name);
          /* Default to A4 size */
@@ -347,7 +341,7 @@ gtk_paper_size_new_custom (const gchar *name,
   g_return_val_if_fail (name != NULL, NULL);
   g_return_val_if_fail (unit != GTK_UNIT_PIXEL, NULL);
 
-  size = g_new0 (GtkPaperSize, 1);
+  size = g_slice_new0 (GtkPaperSize);
   
   size->name = g_strdup (name);
   size->display_name = g_strdup (display_name);
@@ -374,7 +368,7 @@ gtk_paper_size_copy (GtkPaperSize *other)
 {
   GtkPaperSize *size;
 
-  size = g_new0 (GtkPaperSize, 1);
+  size = g_slice_new0 (GtkPaperSize);
 
   size->info = other->info;
   if (other->name)
@@ -405,7 +399,8 @@ gtk_paper_size_free (GtkPaperSize *size)
   g_free (size->name);
   g_free (size->display_name);
   g_free (size->ppd_name);
-  g_free (size);
+
+  g_slice_free (GtkPaperSize, size);
 }
 
 /**
@@ -431,22 +426,44 @@ gtk_paper_size_is_equal (GtkPaperSize *size1,
                 gtk_paper_size_get_name (size2)) == 0;
 }
 
+GList * _gtk_load_custom_papers (void);
+
 /**
- * gtk_paper_size_get_builtins:
+ * gtk_paper_size_get_paper_sizes:
+ * @include_custom: whether to include custom paper sizes
+ *     as defined in the page setup dialog
  *
- * Creates a list of builtin paper sizes.
- * 
- * Return value: a newly allocated list of newly 
+ * Creates a list of known paper sizes.
+ *
+ * Return value:  (element-type GtkPaperSize) (transfer full): a newly allocated list of newly
  *    allocated #GtkPaperSize objects
  *
  * Since: 2.12
  */
 GList *
-gtk_paper_size_get_builtins (void)
+gtk_paper_size_get_paper_sizes (gboolean include_custom)
 {
   GList *list = NULL;
   guint i;
+#ifdef G_OS_UNIX               /* _gtk_load_custom_papers() only on Unix so far  */
+  if (include_custom)
+    {
+      GList *page_setups, *l;
+
+      page_setups = _gtk_load_custom_papers ();
+      for (l = page_setups; l != NULL; l = l->next)
+        {
+          GtkPageSetup *setup = (GtkPageSetup *) l->data;
+          GtkPaperSize *size;
 
+          size = gtk_page_setup_get_paper_size (setup);
+          list = g_list_prepend (list, gtk_paper_size_copy (size));
+        }
+
+      g_list_foreach (page_setups, (GFunc) g_object_unref, NULL);
+      g_list_free (page_setups);
+    }
+#endif
   for (i = 0; i < G_N_ELEMENTS (standard_names_offsets); ++i)
     {
        GtkPaperSize *size;
@@ -455,9 +472,10 @@ gtk_paper_size_get_builtins (void)
        list = g_list_prepend (list, size);
     }
 
-  return list;
+  return g_list_reverse (list);
 }
 
+
 /**
  * gtk_paper_size_get_name:
  * @size: a #GtkPaperSize object
@@ -498,7 +516,7 @@ gtk_paper_size_get_display_name (GtkPaperSize *size)
   g_assert (size->info != NULL);
 
   display_name = paper_names + size->info->display_name;
-  return g_strip_context (display_name, gettext (display_name));
+  return g_dpgettext2 (GETTEXT_PACKAGE, "paper size", display_name);
 }
 
 /**
@@ -642,10 +660,11 @@ gtk_paper_size_get_default (void)
   if (!locale)
     return GTK_PAPER_NAME_A4;
 
-  if (g_str_has_prefix (locale, "en_CA") ||
-      g_str_has_prefix (locale, "en_US") ||
-      g_str_has_prefix (locale, "es_PR") ||
-      g_str_has_prefix (locale, "es_US"))
+  /* CLDR 1.8.1
+   * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/territory_language_information.html
+   */
+  if (g_regex_match_simple("[^_.@]{2,3}_(BZ|CA|CL|CO|CR|GT|MX|NI|PA|PH|PR|SV|US|VE)",
+                           locale, G_REGEX_ANCHORED, G_REGEX_MATCH_ANCHORED))
     paper_size = GTK_PAPER_NAME_LETTER;
   else
     paper_size = GTK_PAPER_NAME_A4;
@@ -765,11 +784,13 @@ gtk_paper_size_get_default_right_margin (GtkPaperSize *size,
  * @key_file: the #GKeyFile to retrieve the papersize from
  * @group_name: the name ofthe group in the key file to read,
  *     or %NULL to read the first group
- * @error: return location for an error, or %NULL
+ * @error: (allow-none): return location for an error, or %NULL
  *
  * Reads a paper size from the group @group_name in the key file
- * @key_file. Returns a new #GtkPaperSize object with the restored
- * paper size, or %NULL if an error occurred.
+ * @key_file. 
+ *
+ * Returns: a new #GtkPaperSize object with the restored
+ *          paper size, or %NULL if an error occurred.
  *
  * Since: 2.12
  */
@@ -790,10 +811,10 @@ gtk_paper_size_new_from_key_file (GKeyFile    *key_file,
     group_name = freeme = g_key_file_get_start_group (key_file);
   if (!group_name || !g_key_file_has_group (key_file, group_name))
     {
-      g_set_error (error,
-                  GTK_PRINT_ERROR,
-                  GTK_PRINT_ERROR_INVALID_FILE,
-                  _("Not a valid page setup file"));
+      g_set_error_literal (error,
+                           GTK_PRINT_ERROR,
+                           GTK_PRINT_ERROR_INVALID_FILE,
+                           _("Not a valid page setup file"));
       retval = FALSE;
       goto out;
     }
@@ -823,17 +844,19 @@ gtk_paper_size_new_from_key_file (GKeyFile    *key_file,
     display_name = g_strdup (name);
 
   if (ppd_name != NULL)
-    paper_size = gtk_paper_size_new_from_ppd (ppd_name, display_name,
-                                             width, height);
+    paper_size = gtk_paper_size_new_from_ppd (ppd_name,
+                                              display_name,
+                                              _gtk_print_convert_from_mm (width, GTK_UNIT_POINTS),
+                                              _gtk_print_convert_from_mm (height, GTK_UNIT_POINTS));
   else if (name != NULL)
     paper_size = gtk_paper_size_new_custom (name, display_name,
                                            width, height, GTK_UNIT_MM);
   else
     {
-      g_set_error (error,
-                  GTK_PRINT_ERROR,
-                  GTK_PRINT_ERROR_INVALID_FILE,
-                  _("Not a valid page setup file"));
+      g_set_error_literal (error,
+                           GTK_PRINT_ERROR,
+                           GTK_PRINT_ERROR_INVALID_FILE,
+                           _("Not a valid page setup file"));
       retval = FALSE;
       goto out;
     }
@@ -850,27 +873,27 @@ out:
 
 /**
  * gtk_paper_size_to_key_file:
- * @paper_size: a #GtkPaperSize
+ * @size: a #GtkPaperSize
  * @key_file: the #GKeyFile to save the paper size to
  * @group_name: the group to add the settings to in @key_file
  *
- * This function adds the paper size from @paper_size to @key_file.
+ * This function adds the paper size from @size to @key_file.
  *
  * Since: 2.12
  */
 void
-gtk_paper_size_to_key_file (GtkPaperSize *paper_size,
+gtk_paper_size_to_key_file (GtkPaperSize *size,
                            GKeyFile     *key_file,
                            const gchar  *group_name)
 {
   const char *name, *ppd_name, *display_name;
 
-  g_return_if_fail (paper_size != NULL);
+  g_return_if_fail (size != NULL);
   g_return_if_fail (key_file != NULL);
 
-  name = gtk_paper_size_get_name (paper_size);
-  display_name = gtk_paper_size_get_display_name (paper_size);
-  ppd_name = gtk_paper_size_get_ppd_name (paper_size);
+  name = gtk_paper_size_get_name (size);
+  display_name = gtk_paper_size_get_display_name (size);
+  ppd_name = gtk_paper_size_get_ppd_name (size);
 
   if (ppd_name != NULL) 
     g_key_file_set_string (key_file, group_name,
@@ -884,11 +907,7 @@ gtk_paper_size_to_key_file (GtkPaperSize *paper_size,
                           "DisplayName", display_name);
 
   g_key_file_set_double (key_file, group_name,
-                        "Width", gtk_paper_size_get_width (paper_size, GTK_UNIT_MM));
+                        "Width", gtk_paper_size_get_width (size, GTK_UNIT_MM));
   g_key_file_set_double (key_file, group_name,
-                        "Height", gtk_paper_size_get_height (paper_size, GTK_UNIT_MM));
+                        "Height", gtk_paper_size_get_height (size, GTK_UNIT_MM));
 }
-
-
-#define __GTK_PAPER_SIZE_C__
-#include "gtkaliasdef.c"