]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkprintbackend.c
2.12.1
[~andy/gtk] / gtk / gtkprintbackend.c
index 272d2f395785f38c89a8429797552694a6f720ee..8be27d2f407f6889ba9b9f6f77ce577814a9f141 100644 (file)
@@ -27,6 +27,7 @@
 #include "gtkmodules.h"
 #include "gtkprivate.h"
 #include "gtkprintbackend.h"
+#include "gtkprinter-private.h"
 #include "gtkalias.h"
 
 #define GTK_PRINT_BACKEND_GET_PRIVATE(o)  \
@@ -88,7 +89,7 @@ struct _GtkPrintBackendModuleClass
   GTypeModuleClass parent_class;
 };
 
-G_DEFINE_TYPE (GtkPrintBackendModule, _gtk_print_backend_module, G_TYPE_TYPE_MODULE);
+G_DEFINE_TYPE (GtkPrintBackendModule, _gtk_print_backend_module, G_TYPE_TYPE_MODULE)
 #define GTK_TYPE_PRINT_BACKEND_MODULE      (_gtk_print_backend_module_get_type ())
 #define GTK_PRINT_BACKEND_MODULE(module)   (G_TYPE_CHECK_INSTANCE_CAST ((module), GTK_TYPE_PRINT_BACKEND_MODULE, GtkPrintBackendModule))
 
@@ -191,16 +192,15 @@ _gtk_print_backend_module_create (GtkPrintBackendModule *pb_module)
   return NULL;
 }
 
-GtkPrintBackend *
-_gtk_print_backend_create (const char *backend_name)
+static GtkPrintBackend *
+_gtk_print_backend_create (const gchar *backend_name)
 {
   GSList *l;
-  char *module_path;
-  char *full_name;
+  gchar *module_path;
+  gchar *full_name;
   GtkPrintBackendModule *pb_module;
   GtkPrintBackend *pb;
 
-  /* TODO: make module loading code work */
   for (l = loaded_backends; l != NULL; l = l->next)
     {
       pb_module = l->data;
@@ -227,37 +227,22 @@ _gtk_print_backend_create (const char *backend_name)
                                             pb_module);
 
          pb = _gtk_print_backend_module_create (pb_module);
+
+         /* Increase use-count so that we don't unload print backends.
+          * There is a problem with module unloading in the cups module,
+          * see cups_dispatch_watch_finalize for details. 
+          */
+         g_type_module_use (G_TYPE_MODULE (pb_module));
        }
       
       g_free (module_path);
     }
 
   return pb;
-
-  return NULL;
 }
 
-static void
-gtk_print_backend_initialize (void)
-{
-  static gboolean initialized = FALSE;
-
-  if (!initialized)
-    {
-      gtk_settings_install_property (g_param_spec_string ("gtk-print-backends",
-                                                         P_("Default print backend"),
-                                                         P_("List of the GtkPrintBackend backends to use by default"),
-                                                         GTK_PRINT_BACKENDS,
-                                                         GTK_PARAM_READWRITE));
-
-      initialized = TRUE;
-    }
-}
-
-
-
 GList *
-gtk_print_backend_load_modules ()
+gtk_print_backend_load_modules (void)
 {
   GList *result;
   GtkPrintBackend *backend;
@@ -268,11 +253,11 @@ gtk_print_backend_load_modules ()
 
   result = NULL;
 
-  gtk_print_backend_initialize ();
-  
   settings = gtk_settings_get_default ();
-
-  g_object_get (settings, "gtk-print-backends", &setting, NULL);
+  if (settings)
+    g_object_get (settings, "gtk-print-backends", &setting, NULL);
+  else
+    setting = g_strdup (GTK_PRINT_BACKENDS);
 
   backends = g_strsplit (setting, ",", -1);
 
@@ -296,8 +281,19 @@ gtk_print_backend_load_modules ()
  *             GtkPrintBackend           *
  *****************************************/
 
-G_DEFINE_TYPE (GtkPrintBackend, gtk_print_backend, G_TYPE_OBJECT);
-
+G_DEFINE_TYPE (GtkPrintBackend, gtk_print_backend, G_TYPE_OBJECT)
+
+static void                 fallback_printer_request_details  (GtkPrinter          *printer);
+static gboolean             fallback_printer_mark_conflicts   (GtkPrinter          *printer,
+                                                              GtkPrinterOptionSet *options);
+static void                 fallback_printer_get_hard_margins (GtkPrinter          *printer,
+                                                              gdouble             *top,
+                                                              gdouble             *bottom,
+                                                              gdouble             *left,
+                                                              gdouble             *right);
+static GList *              fallback_printer_list_papers      (GtkPrinter          *printer);
+static GtkPrintCapabilities fallback_printer_get_capabilities (GtkPrinter          *printer);
+  
 static void
 gtk_print_backend_class_init (GtkPrintBackendClass *class)
 {
@@ -308,11 +304,16 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class)
   
   object_class->dispose = gtk_print_backend_dispose;
 
+  class->printer_request_details = fallback_printer_request_details;
+  class->printer_mark_conflicts = fallback_printer_mark_conflicts;
+  class->printer_get_hard_margins = fallback_printer_get_hard_margins;
+  class->printer_list_papers = fallback_printer_list_papers;
+  class->printer_get_capabilities = fallback_printer_get_capabilities;
+  
   g_type_class_add_private (class, sizeof (GtkPrintBackendPrivate));
-
   
   signals[PRINTER_LIST_CHANGED] =
-    g_signal_new ("printer-list-changed",
+    g_signal_new (I_("printer-list-changed"),
                  G_TYPE_FROM_CLASS (class),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkPrintBackendClass, printer_list_changed),
@@ -320,7 +321,7 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class)
                  g_cclosure_marshal_VOID__VOID,
                  G_TYPE_NONE, 0);
   signals[PRINTER_LIST_DONE] =
-      g_signal_new ("printer-list-done",
+    g_signal_new (I_("printer-list-done"),
                    G_TYPE_FROM_CLASS (class),
                    G_SIGNAL_RUN_LAST,
                    G_STRUCT_OFFSET (GtkPrintBackendClass, printer_list_done),
@@ -328,7 +329,7 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class)
                    g_cclosure_marshal_VOID__VOID,
                    G_TYPE_NONE, 0);
   signals[PRINTER_ADDED] =
-    g_signal_new ("printer-added",
+    g_signal_new (I_("printer-added"),
                  G_TYPE_FROM_CLASS (class),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkPrintBackendClass, printer_added),
@@ -336,7 +337,7 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class)
                  g_cclosure_marshal_VOID__OBJECT,
                  G_TYPE_NONE, 1, GTK_TYPE_PRINTER);
   signals[PRINTER_REMOVED] =
-    g_signal_new ("printer-removed",
+    g_signal_new (I_("printer-removed"),
                  G_TYPE_FROM_CLASS (class),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkPrintBackendClass, printer_removed),
@@ -344,7 +345,7 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class)
                  g_cclosure_marshal_VOID__OBJECT,
                  G_TYPE_NONE, 1, GTK_TYPE_PRINTER);
   signals[PRINTER_STATUS_CHANGED] =
-    g_signal_new ("printer-status-changed",
+    g_signal_new (I_("printer-status-changed"),
                  G_TYPE_FROM_CLASS (class),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkPrintBackendClass, printer_status_changed),
@@ -375,7 +376,8 @@ gtk_print_backend_dispose (GObject *object)
   priv = backend->priv;
 
   /* We unref the printers in dispose, not in finalize so that
-     we can break refcount cycles with gtk_print_backend_destroy */
+   * we can break refcount cycles with gtk_print_backend_destroy 
+   */
   if (priv->printers)
     {
       g_hash_table_destroy (priv->printers);
@@ -387,9 +389,47 @@ gtk_print_backend_dispose (GObject *object)
 
 
 static void
-printer_hash_to_sorted_active_list (const gchar *key,
-                                    gpointer value,
-                                    GList **out_list)
+fallback_printer_request_details (GtkPrinter *printer)
+{
+}
+
+static gboolean
+fallback_printer_mark_conflicts (GtkPrinter          *printer,
+                                GtkPrinterOptionSet *options)
+{
+  return FALSE;
+}
+
+static void
+fallback_printer_get_hard_margins (GtkPrinter *printer,
+                                  gdouble    *top,
+                                  gdouble    *bottom,
+                                  gdouble    *left,
+                                  gdouble    *right)
+{
+  *top = 0;
+  *bottom = 0;
+  *left = 0;
+  *right = 0;
+}
+
+static GList *
+fallback_printer_list_papers (GtkPrinter *printer)
+{
+  return NULL;
+}
+
+static GtkPrintCapabilities
+fallback_printer_get_capabilities (GtkPrinter *printer)
+{
+  return 0;
+}
+
+
+static void
+printer_hash_to_sorted_active_list (const gchar  *key,
+                                    gpointer      value,
+                                    GList       **out_list)
 {
   GtkPrinter *printer;
 
@@ -407,7 +447,7 @@ printer_hash_to_sorted_active_list (const gchar *key,
 
 void
 gtk_print_backend_add_printer (GtkPrintBackend *backend,
-                              GtkPrinter *printer)
+                              GtkPrinter      *printer)
 {
   GtkPrintBackendPrivate *priv;
   
@@ -425,7 +465,7 @@ gtk_print_backend_add_printer (GtkPrintBackend *backend,
 
 void
 gtk_print_backend_remove_printer (GtkPrintBackend *backend,
-                                 GtkPrinter *printer)
+                                 GtkPrinter      *printer)
 {
   GtkPrintBackendPrivate *priv;
   
@@ -473,7 +513,7 @@ gtk_print_backend_get_printer_list (GtkPrintBackend *backend)
       priv->printer_list_requested = TRUE;
     }
   
-  return result;;
+  return result;
 }
 
 gboolean
@@ -486,7 +526,7 @@ gtk_print_backend_printer_list_is_done (GtkPrintBackend *print_backend)
 
 GtkPrinter *
 gtk_print_backend_find_printer (GtkPrintBackend *backend,
-                                const gchar *printer_name)
+                                const gchar     *printer_name)
 {
   GtkPrintBackendPrivate *priv;
   GtkPrinter *printer;
@@ -504,45 +544,32 @@ gtk_print_backend_find_printer (GtkPrintBackend *backend,
 }
 
 void
-gtk_print_backend_print_stream (GtkPrintBackend *backend,
-                                GtkPrintJob *job,
-                                gint data_fd,
+gtk_print_backend_print_stream (GtkPrintBackend        *backend,
+                                GtkPrintJob            *job,
+                                GIOChannel             *data_io,
                                 GtkPrintJobCompleteFunc callback,
-                                gpointer user_data,
-                               GDestroyNotify dnotify)
+                                gpointer                user_data,
+                               GDestroyNotify          dnotify)
 {
   g_return_if_fail (GTK_IS_PRINT_BACKEND (backend));
 
   GTK_PRINT_BACKEND_GET_CLASS (backend)->print_stream (backend,
                                                       job,
-                                                      data_fd,
+                                                      data_io,
                                                       callback,
                                                       user_data,
                                                       dnotify);
 }
 
-static gboolean
-unref_at_idle_cb (gpointer data)
-{
-  g_object_unref (data);
-  return FALSE;
-}
-
-void
-gtk_print_backend_unref_at_idle (GtkPrintBackend *print_backend)
-{
-  g_idle_add (unref_at_idle_cb, print_backend);
-}
-
 void
 gtk_print_backend_destroy (GtkPrintBackend *print_backend)
 {
   /* The lifecycle of print backends and printers are tied, such that
-     the backend owns the printers, but the printers also ref the backend.
-     This is so that if the app has a reference to a printer its backend
-     will be around. However, this results in a cycle, which we break
-     with this call, which causes the print backend to release its printers.
-  */
+   * the backend owns the printers, but the printers also ref the backend.
+   * This is so that if the app has a reference to a printer its backend
+   * will be around. However, this results in a cycle, which we break
+   * with this call, which causes the print backend to release its printers.
+   */
   g_object_run_dispose (G_OBJECT (print_backend));
 }