[gtk] Convert print backends to use a GIOExtensionPoint



commit de0039546ba6258cd1c3af1624ecc02553b5ac7e
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Feb 18 18:00:42 2018 -0500

    Convert print backends to use a GIOExtensionPoint
    
    Use GIOModule and GIOExtensionPoint. This is the preferred
    way to define extensions these days, instead of manually
    implementing type modules.

 gtk/gtkmain.c                                      |   3 +
 gtk/gtkprintbackend.c                              | 289 ++++++---------------
 gtk/gtkprintbackend.h                              |   4 +
 .../cloudprint/gtkprintbackendcloudprint.c         |  58 ++---
 modules/printbackends/cups/gtkprintbackendcups.c   |  66 ++---
 modules/printbackends/file/gtkprintbackendfile.c   |  63 ++---
 modules/printbackends/lpr/gtkprintbackendlpr.c     |  64 ++---
 7 files changed, 188 insertions(+), 359 deletions(-)
---
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index 7a7d2e6ce7..2f1ee97b9f 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -129,6 +129,7 @@
 #include "gtkwidgetprivate.h"
 #include "gtkwindowprivate.h"
 #include "gtkwindowgroup.h"
+#include "gtkprintbackend.h"
 
 #include "a11y/gtkaccessibility.h"
 
@@ -655,6 +656,8 @@ do_post_parse_initialization (void)
 
   _gtk_accel_map_init ();
 
+  gtk_print_backends_init ();
+
   gtk_initialized = TRUE;
 
   display_manager = gdk_display_manager_get ();
diff --git a/gtk/gtkprintbackend.c b/gtk/gtkprintbackend.c
index bd294fca0f..85341e81ba 100644
--- a/gtk/gtkprintbackend.c
+++ b/gtk/gtkprintbackend.c
@@ -22,6 +22,7 @@
 #include <gmodule.h>
 
 #include "gtkintl.h"
+#include "gtkdebug.h"
 #include "gtkmodulesprivate.h"
 #include "gtkmarshalers.h"
 #include "gtkprivate.h"
@@ -78,223 +79,32 @@ gtk_print_backend_error_quark (void)
   return quark;
 }
 
-/*****************************************
- *     GtkPrintBackendModule modules     *
- *****************************************/
-
-typedef struct _GtkPrintBackendModule GtkPrintBackendModule;
-typedef struct _GtkPrintBackendModuleClass GtkPrintBackendModuleClass;
-
-struct _GtkPrintBackendModule
-{
-  GTypeModule parent_instance;
-  
-  GModule *library;
-
-  void             (*init)     (GTypeModule    *module);
-  void             (*exit)     (void);
-  GtkPrintBackend* (*create)   (void);
-
-  gchar *path;
-};
-
-struct _GtkPrintBackendModuleClass
-{
-  GTypeModuleClass parent_class;
-};
-
-GType _gtk_print_backend_module_get_type (void);
-
-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))
-
-static GSList *loaded_backends;
-
-static gboolean
-gtk_print_backend_module_load (GTypeModule *module)
-{
-  GtkPrintBackendModule *pb_module = GTK_PRINT_BACKEND_MODULE (module); 
-  gpointer initp, exitp, createp;
- 
-  pb_module->library = g_module_open (pb_module->path, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
-  if (!pb_module->library)
-    {
-      g_warning ("%s", g_module_error ());
-      return FALSE;
-    }
-  
-  /* extract symbols from the lib */
-  if (!g_module_symbol (pb_module->library, "pb_module_init",
-                       &initp) ||
-      !g_module_symbol (pb_module->library, "pb_module_exit", 
-                       &exitp) ||
-      !g_module_symbol (pb_module->library, "pb_module_create", 
-                       &createp))
-    {
-      g_warning ("%s", g_module_error ());
-      g_module_close (pb_module->library);
-      
-      return FALSE;
-    }
-
-  pb_module->init = initp;
-  pb_module->exit = exitp;
-  pb_module->create = createp;
-
-  /* call the printbackend's init function to let it */
-  /* setup anything it needs to set up. */
-  pb_module->init (module);
-
-  return TRUE;
-}
-
-static void
-gtk_print_backend_module_unload (GTypeModule *module)
-{
-  GtkPrintBackendModule *pb_module = GTK_PRINT_BACKEND_MODULE (module);
-  
-  pb_module->exit();
-
-  g_module_close (pb_module->library);
-  pb_module->library = NULL;
-
-  pb_module->init = NULL;
-  pb_module->exit = NULL;
-  pb_module->create = NULL;
-}
-
-/* This only will ever be called if an error occurs during
- * initialization
- */
-static void
-gtk_print_backend_module_finalize (GObject *object)
-{
-  GtkPrintBackendModule *module = GTK_PRINT_BACKEND_MODULE (object);
-
-  g_free (module->path);
-
-  G_OBJECT_CLASS (_gtk_print_backend_module_parent_class)->finalize (object);
-}
-
-static void
-_gtk_print_backend_module_class_init (GtkPrintBackendModuleClass *class)
-{
-  GTypeModuleClass *module_class = G_TYPE_MODULE_CLASS (class);
-  GObjectClass *gobject_class = G_OBJECT_CLASS (class);
-
-  module_class->load = gtk_print_backend_module_load;
-  module_class->unload = gtk_print_backend_module_unload;
-
-  gobject_class->finalize = gtk_print_backend_module_finalize;
-}
-
-static void 
-gtk_print_backend_set_property (GObject      *object,
-                                guint         prop_id,
-                                const GValue *value,
-                                GParamSpec   *pspec)
-{
-  GtkPrintBackend *backend = GTK_PRINT_BACKEND (object);
-  GtkPrintBackendPrivate *priv = backend->priv;
-
-  switch (prop_id)
-    {
-    case PROP_STATUS:
-      priv->status = g_value_get_int (value);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-    }
-}
-
-static void 
-gtk_print_backend_get_property (GObject    *object,
-                                guint       prop_id,
-                                GValue     *value,
-                                GParamSpec *pspec)
-{
-  GtkPrintBackend *backend = GTK_PRINT_BACKEND (object);
-  GtkPrintBackendPrivate *priv = backend->priv;
-
-  switch (prop_id)
-    {
-    case PROP_STATUS:
-      g_value_set_int (value, priv->status);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-    }
-}
-
-static void
-_gtk_print_backend_module_init (GtkPrintBackendModule *pb_module)
+void
+gtk_print_backends_init (void)
 {
-}
+  GIOExtensionPoint *ep;
+  GIOModuleScope *scope;
+  char **paths;
+  int i;
 
-static GtkPrintBackend *
-_gtk_print_backend_module_create (GtkPrintBackendModule *pb_module)
-{
-  GtkPrintBackend *pb;
-  
-  if (g_type_module_use (G_TYPE_MODULE (pb_module)))
-    {
-      pb = pb_module->create ();
-      g_type_module_unuse (G_TYPE_MODULE (pb_module));
-      return pb;
-    }
-  return NULL;
-}
+  GTK_NOTE (MODULES,
+            g_print ("Registering extension point %s\n", GTK_PRINT_BACKEND_EXTENSION_POINT_NAME));
 
-static GtkPrintBackend *
-_gtk_print_backend_create (const gchar *backend_name)
-{
-  GSList *l;
-  gchar *module_path;
-  gchar *full_name;
-  GtkPrintBackendModule *pb_module;
-  GtkPrintBackend *pb;
+  ep = g_io_extension_point_register (GTK_PRINT_BACKEND_EXTENSION_POINT_NAME);
+  g_io_extension_point_set_required_type (ep, GTK_TYPE_PRINT_BACKEND);
 
-  for (l = loaded_backends; l != NULL; l = l->next)
-    {
-      pb_module = l->data;
-      
-      if (strcmp (G_TYPE_MODULE (pb_module)->name, backend_name) == 0)
-       return _gtk_print_backend_module_create (pb_module);
-    }
+  scope = g_io_module_scope_new (G_IO_MODULE_SCOPE_BLOCK_DUPLICATES);
 
-  pb = NULL;
-  if (g_module_supported ())
+  paths = _gtk_get_module_path ("printbackends");
+  for (i = 0; paths[i]; i++)
     {
-      full_name = g_strconcat ("printbackend-", backend_name, NULL);
-      module_path = _gtk_find_module (full_name, "printbackends");
-      g_free (full_name);
-
-      if (module_path)
-       {
-         pb_module = g_object_new (GTK_TYPE_PRINT_BACKEND_MODULE, NULL);
-
-         g_type_module_set_name (G_TYPE_MODULE (pb_module), backend_name);
-         pb_module->path = g_strdup (module_path);
-
-         loaded_backends = g_slist_prepend (loaded_backends,
-                                            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);
+      GTK_NOTE (MODULES,
+                g_print ("Scanning io modules in %s\n", paths[i]));
+      g_io_modules_scan_all_in_directory_with_scope (paths[i], scope);
     }
+  g_strfreev (paths);
 
-  return pb;
+  g_io_module_scope_free (scope);
 }
 
 /**
@@ -311,9 +121,12 @@ gtk_print_backend_load_modules (void)
   gchar **backends;
   gint i;
   GtkSettings *settings;
+  GIOExtensionPoint *ep;
 
   result = NULL;
 
+  ep = g_io_extension_point_lookup (GTK_PRINT_BACKEND_EXTENSION_POINT_NAME);
+
   settings = gtk_settings_get_default ();
   if (settings)
     g_object_get (settings, "gtk-print-backends", &setting, NULL);
@@ -324,9 +137,19 @@ gtk_print_backend_load_modules (void)
 
   for (i = 0; backends[i]; i++)
     {
-      backend = _gtk_print_backend_create (g_strstrip (backends[i]));
-      if (backend)
-        result = g_list_append (result, backend);
+      GIOExtension *ext;
+      GType type;
+
+      ext = g_io_extension_point_get_extension_by_name (ep, backends[i]);
+      if (!ext)
+        continue;
+
+      GTK_NOTE (PRINTING,
+                g_print ("Found %s print backend\n", backends[i]));
+
+      type = g_io_extension_get_type (ext);
+      backend = g_object_new (type, NULL);
+      result = g_list_append (result, backend);
     }
 
   g_strfreev (backends);
@@ -359,7 +182,47 @@ static void                 request_password                       (GtkPrintBack
                                                                     gpointer             auth_info_visible,
                                                                     const gchar         *prompt,
                                                                     gboolean             
can_store_auth_info);
-  
+
+static void
+gtk_print_backend_set_property (GObject      *object,
+                                guint         prop_id,
+                                const GValue *value,
+                                GParamSpec   *pspec)
+{
+  GtkPrintBackend *backend = GTK_PRINT_BACKEND (object);
+  GtkPrintBackendPrivate *priv = backend->priv;
+
+  switch (prop_id)
+    {
+    case PROP_STATUS:
+      priv->status = g_value_get_int (value);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+gtk_print_backend_get_property (GObject    *object,
+                                guint       prop_id,
+                                GValue     *value,
+                                GParamSpec *pspec)
+{
+  GtkPrintBackend *backend = GTK_PRINT_BACKEND (object);
+  GtkPrintBackendPrivate *priv = backend->priv;
+
+  switch (prop_id)
+    {
+    case PROP_STATUS:
+      g_value_set_int (value, priv->status);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
 static void
 gtk_print_backend_class_init (GtkPrintBackendClass *class)
 {
diff --git a/gtk/gtkprintbackend.h b/gtk/gtkprintbackend.h
index f4524e8965..a5be9fa9f5 100644
--- a/gtk/gtkprintbackend.h
+++ b/gtk/gtkprintbackend.h
@@ -140,6 +140,8 @@ struct _GtkPrintBackendClass
   void (*_gtk_reserved4) (void);
 };
 
+#define GTK_PRINT_BACKEND_EXTENSION_POINT_NAME "gtk-print-backend"
+
 GDK_AVAILABLE_IN_ALL
 GType   gtk_print_backend_get_type       (void) G_GNUC_CONST;
 
@@ -222,6 +224,8 @@ GDK_AVAILABLE_IN_ALL
 gboolean    gtk_printer_set_state_message     (GtkPrinter      *printer,
                                               const gchar     *message);
 
+void        gtk_print_backends_init (void);
+
 
 G_END_DECLS
 
diff --git a/modules/printbackends/cloudprint/gtkprintbackendcloudprint.c 
b/modules/printbackends/cloudprint/gtkprintbackendcloudprint.c
index c3d28cb347..8fc3352b3c 100644
--- a/modules/printbackends/cloudprint/gtkprintbackendcloudprint.c
+++ b/modules/printbackends/cloudprint/gtkprintbackendcloudprint.c
@@ -103,48 +103,37 @@ static void                 cloudprint_printer_request_details           (GtkPri
 TGOAAccount *        t_goa_account_copy                 (TGOAAccount *account);
 void                 t_goa_account_free                 (gpointer data);
 
+GG_DEFINE_DYNAMIC_TYPE(GtkPrintBackendCloudprint, gtk_print_backend_cloudprint, GTK_TYPE_PRINT_BACKEND)
 
-
-static void
-gtk_print_backend_cloudprint_register_type (GTypeModule *module)
+void
+g_io_module_load (GIOModule *module)
 {
-  const GTypeInfo print_backend_cloudprint_info =
-  {
-    sizeof (GtkPrintBackendCloudprintClass),
-    NULL,              /* base_init */
-    NULL,              /* base_finalize */
-    (GClassInitFunc) gtk_print_backend_cloudprint_class_init,
-    NULL,              /* class_finalize */
-    NULL,              /* class_data */
-    sizeof (GtkPrintBackendCloudprint),
-    0,         /* n_preallocs */
-    (GInstanceInitFunc) gtk_print_backend_cloudprint_init,
-  };
+  g_type_module_use (G_TYPE_MODULE (module));
 
-  print_backend_cloudprint_type = g_type_module_register_type (module,
-                                                        GTK_TYPE_PRINT_BACKEND,
-                                                        "GtkPrintBackendCloudprint",
-                                                        &print_backend_cloudprint_info, 0);
-}
+  gtk_print_backend_cloudprint_register_type (G_TYPE_MODULE (module));
+  gtk_cloudprint_account_register_type (G_TYPE_MODULE (module));
+  gtk_printer_cloudprint_register_type (G_TYPE_MODULE (module));
 
-G_MODULE_EXPORT void
-pb_module_init (GTypeModule *module)
-{
-  gtk_print_backend_cloudprint_register_type (module);
-  gtk_cloudprint_account_register_type (module);
-  gtk_printer_cloudprint_register_type (module);
+  g_io_extension_point_implement (GTK_PRINT_BACKEND_EXTENSION_POINT_NAME,
+                                  GTK_TYPE_PRINT_BACKEND_CLOUDPRINT,
+                                  "cloudprint",
+                                  10);
 }
 
-G_MODULE_EXPORT void
-pb_module_exit (void)
+void
+g_io_module_unload (GIOModule *module)
 {
-
 }
 
-G_MODULE_EXPORT GtkPrintBackend *
-pb_module_create (void)
+char **
+g_io_module_query (void)
 {
-  return gtk_print_backend_cloudprint_new ();
+  char *eps[] = {
+    GTK_PRINT_BACKEND_EXTENSION_POINT_NAME,
+    NULL
+  };
+
+  return g_strdupv (eps);
 }
 
 /*
@@ -190,6 +179,11 @@ gtk_print_backend_cloudprint_class_init (GtkPrintBackendCloudprintClass *klass)
   backend_class->printer_request_details = cloudprint_printer_request_details;
 }
 
+static void
+gtk_print_backend_cloudprint_class_finalize (GtkPrintBackendCloudprintClass *class)
+{
+}
+
 static void
 gtk_print_backend_cloudprint_init (GtkPrintBackendCloudprint *backend)
 {
diff --git a/modules/printbackends/cups/gtkprintbackendcups.c 
b/modules/printbackends/cups/gtkprintbackendcups.c
index da6ce27a48..454bc86a7e 100644
--- a/modules/printbackends/cups/gtkprintbackendcups.c
+++ b/modules/printbackends/cups/gtkprintbackendcups.c
@@ -236,49 +236,38 @@ static void                 secrets_service_vanished_cb             (GDBusConnec
                                                                      const gchar *name,
                                                                      gpointer user_data);
 
-static void
-gtk_print_backend_cups_register_type (GTypeModule *module)
+G_DEFINE_DYNAMIC_TYPE(GtkPrintBackendCups, gtk_print_backend_cups, GTK_TYPE_PRINT_BACKEND)
+
+void
+g_io_module_load (GIOModule *module)
 {
-  const GTypeInfo print_backend_cups_info =
-  {
-    sizeof (GtkPrintBackendCupsClass),
-    NULL,              /* base_init */
-    NULL,              /* base_finalize */
-    (GClassInitFunc) gtk_print_backend_cups_class_init,
-    NULL,              /* class_finalize */
-    NULL,              /* class_data */
-    sizeof (GtkPrintBackendCups),
-    0,                 /* n_preallocs */
-    (GInstanceInitFunc) gtk_print_backend_cups_init
-  };
+  g_type_module_use (G_TYPE_MODULE (module));
+
+  gtk_print_backend_cups_register_type (G_TYPE_MODULE (module));
+  gtk_printer_cups_register_type (G_TYPE_MODULE (module));
 
-  print_backend_cups_type = g_type_module_register_type (module,
-                                                         GTK_TYPE_PRINT_BACKEND,
-                                                         "GtkPrintBackendCups",
-                                                         &print_backend_cups_info, 0);
+  g_io_extension_point_implement (GTK_PRINT_BACKEND_EXTENSION_POINT_NAME,
+                                  GTK_TYPE_PRINT_BACKEND_CUPS,
+                                  "cups",
+                                  10);
 }
 
-G_MODULE_EXPORT void
-pb_module_init (GTypeModule *module)
+void
+g_io_module_unload (GIOModule *module)
 {
-  GTK_NOTE (PRINTING,
-            g_print ("CUPS Backend: Initializing the CUPS print backend module\n"));
-
-  gtk_print_backend_cups_register_type (module);
-  gtk_printer_cups_register_type (module);
 }
 
-G_MODULE_EXPORT void
-pb_module_exit (void)
+char **
+g_io_module_query (void)
 {
+  char *eps[] = {
+    GTK_PRINT_BACKEND_EXTENSION_POINT_NAME,
+    NULL
+  };
 
+  return g_strdupv (eps);
 }
 
-G_MODULE_EXPORT GtkPrintBackend *
-pb_module_create (void)
-{
-  return gtk_print_backend_cups_new ();
-}
 /* CUPS 1.6 Getter/Setter Functions CUPS 1.6 makes private most of the
  * IPP structures and enforces access via new getter functions, which
  * are unfortunately not available in earlier versions. We define
@@ -287,7 +276,7 @@ pb_module_create (void)
  */
 #ifndef HAVE_CUPS_API_1_6
 #define ippGetOperation(ipp_request) ipp_request->request.op.operation_id
-#define ippGetInteger(attr, index) attr->values[index].integer
+#define ippGet:Integer(attr, index) attr->values[index].integer
 #define ippGetBoolean(attr, index) attr->values[index].boolean
 #define ippGetString(attr, index, foo) attr->values[index].string.text
 #define ippGetValueTag(attr) attr->value_tag
@@ -323,14 +312,10 @@ ippNextAttribute (ipp_t *ipp)
   return (ipp->current = ipp->current->next);
 }
 #endif
+
 /*
  * GtkPrintBackendCups
  */
-GType
-gtk_print_backend_cups_get_type (void)
-{
-  return print_backend_cups_type;
-}
 
 /**
  * gtk_print_backend_cups_new:
@@ -376,6 +361,11 @@ gtk_print_backend_cups_class_init (GtkPrintBackendCupsClass *class)
   backend_class->set_password = gtk_print_backend_cups_set_password;
 }
 
+static void
+gtk_print_backend_cups_class_finalize (GtkPrintBackendCupsClass *class)
+{
+}
+
 static gboolean
 option_is_ipp_option (GtkPrinterOption *option)
 {
diff --git a/modules/printbackends/file/gtkprintbackendfile.c 
b/modules/printbackends/file/gtkprintbackendfile.c
index 775af6647c..385154a352 100644
--- a/modules/printbackends/file/gtkprintbackendfile.c
+++ b/modules/printbackends/file/gtkprintbackendfile.c
@@ -104,53 +104,35 @@ static cairo_surface_t *    file_printer_create_cairo_surface      (GtkPrinter
 static GList *              file_printer_list_papers               (GtkPrinter              *printer);
 static GtkPageSetup *       file_printer_get_default_page_size     (GtkPrinter              *printer);
 
-static void
-gtk_print_backend_file_register_type (GTypeModule *module)
-{
-  const GTypeInfo print_backend_file_info =
-  {
-    sizeof (GtkPrintBackendFileClass),
-    NULL,              /* base_init */
-    NULL,              /* base_finalize */
-    (GClassInitFunc) gtk_print_backend_file_class_init,
-    NULL,              /* class_finalize */
-    NULL,              /* class_data */
-    sizeof (GtkPrintBackendFile),
-    0,         /* n_preallocs */
-    (GInstanceInitFunc) gtk_print_backend_file_init,
-  };
-
-  print_backend_file_type = g_type_module_register_type (module,
-                                                         GTK_TYPE_PRINT_BACKEND,
-                                                         "GtkPrintBackendFile",
-                                                         &print_backend_file_info, 0);
-}
+G_DEFINE_DYNAMIC_TYPE(GtkPrintBackendFile, gtk_print_backend_file, GTK_TYPE_PRINT_BACKEND)
 
-G_MODULE_EXPORT void 
-pb_module_init (GTypeModule *module)
+void
+g_io_module_load (GIOModule *module)
 {
-  gtk_print_backend_file_register_type (module);
-}
+  g_type_module_use (G_TYPE_MODULE (module));
 
-G_MODULE_EXPORT void 
-pb_module_exit (void)
-{
+  gtk_print_backend_file_register_type (G_TYPE_MODULE (module));
 
+  g_io_extension_point_implement (GTK_PRINT_BACKEND_EXTENSION_POINT_NAME,
+                                  GTK_TYPE_PRINT_BACKEND_FILE,
+                                  "file",
+                                  10);
 }
-  
-G_MODULE_EXPORT GtkPrintBackend * 
-pb_module_create (void)
+
+void
+g_io_module_unload (GIOModule *module)
 {
-  return gtk_print_backend_file_new ();
 }
 
-/*
- * GtkPrintBackendFile
- */
-GType
-gtk_print_backend_file_get_type (void)
+char **
+g_io_module_query (void)
 {
-  return print_backend_file_type;
+  char *eps[] = {
+    GTK_PRINT_BACKEND_EXTENSION_POINT_NAME,
+    NULL
+  };
+
+  return g_strdupv (eps);
 }
 
 /**
@@ -184,6 +166,11 @@ gtk_print_backend_file_class_init (GtkPrintBackendFileClass *class)
   backend_class->printer_get_default_page_size = file_printer_get_default_page_size;
 }
 
+static void
+gtk_print_backend_file_class_finalize (GtkPrintBackendFileClass *class)
+{
+}
+
 /* return N_FORMATS if no explicit format in the settings */
 static OutputFormat
 format_from_settings (GtkPrintSettings *settings)
diff --git a/modules/printbackends/lpr/gtkprintbackendlpr.c b/modules/printbackends/lpr/gtkprintbackendlpr.c
index 4257771dbf..d79592c7bc 100644
--- a/modules/printbackends/lpr/gtkprintbackendlpr.c
+++ b/modules/printbackends/lpr/gtkprintbackendlpr.c
@@ -83,53 +83,36 @@ static void                 gtk_print_backend_lpr_print_stream    (GtkPrintBacke
                                                                   gpointer                 user_data,
                                                                   GDestroyNotify           dnotify);
 
-static void
-gtk_print_backend_lpr_register_type (GTypeModule *module)
-{
-  const GTypeInfo print_backend_lpr_info =
-  {
-    sizeof (GtkPrintBackendLprClass),
-    NULL,              /* base_init */
-    NULL,              /* base_finalize */
-    (GClassInitFunc) gtk_print_backend_lpr_class_init,
-    NULL,              /* class_finalize */
-    NULL,              /* class_data */
-    sizeof (GtkPrintBackendLpr),
-    0,         /* n_preallocs */
-    (GInstanceInitFunc) gtk_print_backend_lpr_init,
-  };
-
-  print_backend_lpr_type = g_type_module_register_type (module,
-                                                        GTK_TYPE_PRINT_BACKEND,
-                                                        "GtkPrintBackendLpr",
-                                                        &print_backend_lpr_info, 0);
-}
+G_DEFINE_DYNAMIC_TYPE(GtkPrintBackendLpr, gtk_print_backend_lpr, GTK_TYPE_PRINT_BACKEND
 
-G_MODULE_EXPORT void 
-pb_module_init (GTypeModule *module)
+void
+g_io_module_load (GIOModule *module)
 {
-  gtk_print_backend_lpr_register_type (module);
-}
+  g_type_module_use (G_TYPE_MODULE (module));
 
-G_MODULE_EXPORT void 
-pb_module_exit (void)
-{
+  gtk_print_backend_lpr_register_type (G_TYPE_MODULE (module));
+  gtk_printer_lpr_register_type (G_TYPE_MODULE (module));
 
+  g_io_extension_point_implement (GTK_PRINT_BACKEND_EXTENSION_POINT_NAME,
+                                  GTK_TYPE_PRINT_BACKEND_CUPS,
+                                  "lpr",
+                                  10);
 }
-  
-G_MODULE_EXPORT GtkPrintBackend * 
-pb_module_create (void)
+
+void
+g_io_module_unload (GIOModule *module)
 {
-  return gtk_print_backend_lpr_new ();
 }
 
-/*
- * GtkPrintBackendLpr
- */
-GType
-gtk_print_backend_lpr_get_type (void)
+char **
+g_io_module_query (void)
 {
-  return print_backend_lpr_type;
+  char *eps[] = {
+    GTK_PRINT_BACKEND_EXTENSION_POINT_NAME,
+    NULL
+  };
+
+  return g_strdupv (eps);
 }
 
 /**
@@ -161,6 +144,11 @@ gtk_print_backend_lpr_class_init (GtkPrintBackendLprClass *class)
   backend_class->printer_prepare_for_print = lpr_printer_prepare_for_print;
 }
 
+static void
+gtk_print_backend_lpr_class_finalize (GtkPrintBackendLprClass *class)
+{
+}
+
 static cairo_status_t
 _cairo_write (void                *closure,
               const unsigned char *data,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]