Hi, Here is a patch by Matthias and I which allows one to receive notifications when printers go away, without holding a reference to every printer object (and thus polling their state).
Index: libgnomecups/gnome-cups-printer.h
===================================================================
RCS file: /cvs/gnome/libgnomecups/libgnomecups/gnome-cups-printer.h,v
retrieving revision 1.8
diff -u -r1.8 gnome-cups-printer.h
--- libgnomecups/gnome-cups-printer.h 17 Jun 2004 17:21:03 -0000 1.8
+++ libgnomecups/gnome-cups-printer.h 11 Aug 2004 15:27:26 -0000
@@ -27,6 +27,8 @@
typedef void (*GnomeCupsPrinterAddedCallback) (const char *name,
gpointer user_data);
+typedef void (*GnomeCupsPrinterRemovedCallback) (const char *name,
+ gpointer user_data);
struct _GnomeCupsPrinter {
GObject parent;
@@ -87,6 +89,10 @@
guint gnome_cups_printer_new_printer_notify_add (GnomeCupsPrinterAddedCallback,
gpointer user_data);
void gnome_cups_printer_new_printer_notify_remove (guint id);
+
+guint gnome_cups_printer_printer_removed_notify_add (GnomeCupsPrinterAddedCallback,
+ gpointer user_data);
+void gnome_cups_printer_printer_removed_notify_remove (guint id);
/* GnomeCupsPrinter */
Index: gnome-cups-printer.c
===================================================================
RCS file: /cvs/gnome/libgnomecups/libgnomecups/gnome-cups-printer.c,v
retrieving revision 1.21
diff -u -r1.21 gnome-cups-printer.c
--- gnome-cups-printer.c 3 Aug 2004 15:19:15 -0000 1.21
+++ gnome-cups-printer.c 11 Aug 2004 15:26:37 -0000
@@ -75,6 +75,12 @@
gpointer user_data;
} AddNotify;
+typedef struct {
+ guint id;
+ GnomeCupsPrinterRemovedCallback func;
+ gpointer user_data;
+} RemovedNotify;
+
static const char *printer_state_strings[] = {
N_("Ready"),
N_("Printing"),
@@ -95,6 +101,7 @@
static char *default_printer = NULL;
static GHashTable *printers = NULL;
static GList *add_notifies = NULL;
+static GList *removed_notifies = NULL;
static guint signals[LAST_SIGNAL];
GList *
@@ -421,6 +428,7 @@
printer_removed (const char *name)
{
GnomeCupsPrinter *printer;
+ GList *l;
printer = gnome_cups_printer_get_existing (name);
@@ -429,6 +437,11 @@
g_signal_emit (printer, signals[GONE], 0);
g_object_unref (printer);
}
+
+ for (l = removed_notifies; l != NULL; l = l->next) {
+ RemovedNotify *notify = l->data;
+ notify->func (name, notify->user_data);
+ }
}
static gboolean
@@ -590,6 +603,43 @@
set_timeout ();
}
+guint
+gnome_cups_printer_printer_removed_notify_add (GnomeCupsPrinterRemovedCallback,
+ gpointer user_data)
+{
+ guint id = 0;
+ RemovedNotify *notify;
+
+ g_return_val_if_fail (cb != NULL, 0);
+
+ notify = g_new0 (RemovedNotify, 1);
+
+ notify->id = ++id;
+ notify->func = cb;
+ notify->user_data = user_data;
+
+ removed_notifies = g_list_append (removed_notifies, notify);
+
+ set_timeout ();
+
+ return notify->id;
+}
+
+void
+gnome_cups_printer_printer_removed_notify_remove (guint id)
+{
+ GList *l;
+ for (l = removed_notifies; l != NULL; l = l->next) {
+ RemovedNotify *notify = l->data;
+ if (notify->id == id) {
+ g_free (notify);
+ removed_notifies = g_list_remove_link (removed_notifies, l);
+ }
+ }
+
+ set_timeout ();
+}
+
GnomeCupsPrinter *
gnome_cups_printer_get_existing (const char *printer_name)
{
Attachment:
signature.asc
Description: This is a digitally signed message part