1 /* GTK - The GIMP Toolkit
2 * gtkprintbackend.h: Abstract printer backend interfaces
3 * Copyright (C) 2003, Red Hat, Inc.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
27 #include "gtkmodules.h"
28 #include "gtkprivate.h"
29 #include "gtkprintbackend.h"
32 static void gtk_print_backend_base_init (gpointer g_class);
35 gtk_print_backend_error_quark (void)
37 static GQuark quark = 0;
39 quark = g_quark_from_static_string ("gtk-print-backend-error-quark");
43 /*****************************************
44 * GtkPrintBackendModule modules *
45 *****************************************/
47 typedef struct _GtkPrintBackendModule GtkPrintBackendModule;
48 typedef struct _GtkPrintBackendModuleClass GtkPrintBackendModuleClass;
50 struct _GtkPrintBackendModule
52 GTypeModule parent_instance;
56 void (*init) (GTypeModule *module);
58 GtkPrintBackend* (*create) (void);
63 struct _GtkPrintBackendModuleClass
65 GTypeModuleClass parent_class;
68 G_DEFINE_TYPE (GtkPrintBackendModule, _gtk_print_backend_module, G_TYPE_TYPE_MODULE);
69 #define GTK_TYPE_PRINT_BACKEND_MODULE (_gtk_print_backend_module_get_type ())
70 #define GTK_PRINT_BACKEND_MODULE(module) (G_TYPE_CHECK_INSTANCE_CAST ((module), GTK_TYPE_PRINT_BACKEND_MODULE, GtkPrintBackendModule))
72 static GSList *loaded_backends;
75 gtk_print_backend_module_load (GTypeModule *module)
77 GtkPrintBackendModule *pb_module = GTK_PRINT_BACKEND_MODULE (module);
78 gpointer initp, exitp, createp;
80 pb_module->library = g_module_open (pb_module->path, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
81 if (!pb_module->library)
83 g_warning (g_module_error());
87 /* extract symbols from the lib */
88 if (!g_module_symbol (pb_module->library, "pb_module_init",
90 !g_module_symbol (pb_module->library, "pb_module_exit",
92 !g_module_symbol (pb_module->library, "pb_module_create",
95 g_warning (g_module_error());
96 g_module_close (pb_module->library);
101 pb_module->init = initp;
102 pb_module->exit = exitp;
103 pb_module->create = createp;
105 /* call the filesystems's init function to let it */
106 /* setup anything it needs to set up. */
107 pb_module->init (module);
113 gtk_print_backend_module_unload (GTypeModule *module)
115 GtkPrintBackendModule *pb_module = GTK_PRINT_BACKEND_MODULE (module);
119 g_module_close (pb_module->library);
120 pb_module->library = NULL;
122 pb_module->init = NULL;
123 pb_module->exit = NULL;
124 pb_module->create = NULL;
127 /* This only will ever be called if an error occurs during
131 gtk_print_backend_module_finalize (GObject *object)
133 GtkPrintBackendModule *module = GTK_PRINT_BACKEND_MODULE (object);
135 g_free (module->path);
137 G_OBJECT_CLASS (_gtk_print_backend_module_parent_class)->finalize (object);
141 _gtk_print_backend_module_class_init (GtkPrintBackendModuleClass *class)
143 GTypeModuleClass *module_class = G_TYPE_MODULE_CLASS (class);
144 GObjectClass *gobject_class = G_OBJECT_CLASS (class);
146 module_class->load = gtk_print_backend_module_load;
147 module_class->unload = gtk_print_backend_module_unload;
149 gobject_class->finalize = gtk_print_backend_module_finalize;
153 _gtk_print_backend_module_init (GtkPrintBackendModule *pb_module)
157 static GtkPrintBackend *
158 _gtk_print_backend_module_create (GtkPrintBackendModule *pb_module)
162 if (g_type_module_use (G_TYPE_MODULE (pb_module)))
164 pb = pb_module->create ();
165 g_type_module_unuse (G_TYPE_MODULE (pb_module));
172 _gtk_print_backend_create (const char *backend_name)
177 GtkPrintBackendModule *pb_module;
180 /* TODO: make module loading code work */
181 for (l = loaded_backends; l != NULL; l = l->next)
185 if (strcmp (G_TYPE_MODULE (pb_module)->name, backend_name) == 0)
186 return _gtk_print_backend_module_create (pb_module);
190 if (g_module_supported ())
192 full_name = g_strconcat ("printbackend-", backend_name, NULL);
193 module_path = _gtk_find_module (full_name, "printbackends");
198 pb_module = g_object_new (GTK_TYPE_PRINT_BACKEND_MODULE, NULL);
200 g_type_module_set_name (G_TYPE_MODULE (pb_module), backend_name);
201 pb_module->path = g_strdup (module_path);
203 loaded_backends = g_slist_prepend (loaded_backends,
206 pb = _gtk_print_backend_module_create (pb_module);
209 g_free (module_path);
218 gtk_print_backend_initialize (void)
220 static gboolean initialized = FALSE;
224 gtk_settings_install_property (g_param_spec_string ("gtk-print-backends",
225 P_("Default print backend"),
226 P_("List of the GtkPrintBackend backends to use by default"),
228 GTK_PARAM_READWRITE));
237 gtk_print_backend_load_modules ()
240 GtkPrintBackend *backend;
244 GtkSettings *settings;
248 gtk_print_backend_initialize ();
250 settings = gtk_settings_get_default ();
252 g_object_get (settings, "gtk-print-backends", &setting, NULL);
254 backends = g_strsplit (setting, ",", -1);
256 for (i = 0; backends[i]; i++)
258 g_strchug (backends[i]);
259 g_strchomp (backends[i]);
260 backend = _gtk_print_backend_create (backends[i]);
263 result = g_list_append (result, backend);
266 g_strfreev (backends);
272 /*****************************************
274 *****************************************/
276 gtk_print_backend_get_type (void)
278 static GType print_backend_type = 0;
280 if (!print_backend_type)
282 static const GTypeInfo print_backend_info =
284 sizeof (GtkPrintBackendIface), /* class_size */
285 gtk_print_backend_base_init, /* base_init */
286 NULL, /* base_finalize */
289 print_backend_type = g_type_register_static (G_TYPE_INTERFACE,
291 &print_backend_info, 0);
293 g_type_interface_add_prerequisite (print_backend_type, G_TYPE_OBJECT);
296 return print_backend_type;
300 gtk_print_backend_base_init (gpointer g_class)
302 static gboolean initialized = FALSE;
306 GType iface_type = G_TYPE_FROM_INTERFACE (g_class);
308 g_signal_new ("printer-list-changed",
311 G_STRUCT_OFFSET (GtkPrintBackendIface, printer_list_changed),
313 g_cclosure_marshal_VOID__VOID,
315 g_signal_new ("printer-added",
318 G_STRUCT_OFFSET (GtkPrintBackendIface, printer_added),
320 g_cclosure_marshal_VOID__OBJECT,
321 G_TYPE_NONE, 1, G_TYPE_OBJECT);
322 g_signal_new ("printer-removed",
325 G_STRUCT_OFFSET (GtkPrintBackendIface, printer_removed),
327 g_cclosure_marshal_VOID__OBJECT,
328 G_TYPE_NONE, 1, G_TYPE_OBJECT);
329 g_signal_new ("printer-status-changed",
332 G_STRUCT_OFFSET (GtkPrintBackendIface, printer_status_changed),
334 g_cclosure_marshal_VOID__OBJECT,
335 G_TYPE_NONE, 1, G_TYPE_OBJECT);
342 gtk_print_backend_get_printer_list (GtkPrintBackend *print_backend)
344 g_return_val_if_fail (GTK_IS_PRINT_BACKEND (print_backend), NULL);
346 return GTK_PRINT_BACKEND_GET_IFACE (print_backend)->get_printer_list (print_backend);
351 gtk_print_backend_find_printer (GtkPrintBackend *print_backend,
352 const gchar *printer_name)
354 g_return_val_if_fail (GTK_IS_PRINT_BACKEND (print_backend), NULL);
356 return GTK_PRINT_BACKEND_GET_IFACE (print_backend)->find_printer (print_backend, printer_name);
361 gtk_print_backend_print_stream (GtkPrintBackend *print_backend,
364 GtkPrintJobCompleteFunc callback,
366 GDestroyNotify dnotify)
368 g_return_if_fail (GTK_IS_PRINT_BACKEND (print_backend));
370 GTK_PRINT_BACKEND_GET_IFACE (print_backend)->print_stream (print_backend,
378 #define __GTK_PRINT_BACKEND_C__
379 #include "gtkaliasdef.c"