+/* Internal print queue */
+static GHashTable *print_queue = NULL;
+
+static void
+queue_free (GQueue *queue)
+{
+ g_queue_foreach (queue, (GFunc)g_object_unref, NULL);
+ g_queue_free (queue);
+}
+
+static void
+ev_print_queue_init (void)
+{
+ if (G_UNLIKELY (print_queue == NULL)) {
+ print_queue = g_hash_table_new_full (g_direct_hash,
+ g_direct_equal,
+ NULL,
+ (GDestroyNotify)queue_free);
+ }
+}
+
+static void
+remove_document_queue (gpointer data,
+ GObject *document)
+{
+ if (print_queue)
+ g_hash_table_remove (print_queue, document);
+}
+
+static gboolean
+ev_print_queue_is_empty (EvDocument *document)
+{
+ GQueue *queue;
+
+ queue = g_hash_table_lookup (print_queue, document);
+ return (!queue || g_queue_is_empty (queue));
+}
+
+static void
+ev_print_queue_push (EvPrintOperation *op)
+{
+ GQueue *queue;
+
+ queue = g_hash_table_lookup (print_queue, op->document);
+ if (!queue) {
+ queue = g_queue_new ();
+ g_hash_table_insert (print_queue,
+ op->document,
+ queue);
+ g_object_weak_ref (G_OBJECT (op->document),
+ (GWeakNotify)remove_document_queue,
+ NULL);
+ }
+
+ g_queue_push_head (queue, g_object_ref (op));
+}
+
+static EvPrintOperation *
+ev_print_queue_pop (EvDocument *document)
+{
+ EvPrintOperation *op;
+ GQueue *queue;
+
+ queue = g_hash_table_lookup (print_queue, document);
+ if (!queue || g_queue_is_empty (queue))
+ return NULL;
+
+ op = g_queue_pop_tail (queue);
+ g_object_unref (op);
+
+ return op;
+}
+
+static EvPrintOperation *
+ev_print_queue_peek (EvDocument *document)
+{
+ GQueue *queue;
+
+ queue = g_hash_table_lookup (print_queue, document);
+ if (!queue || g_queue_is_empty (queue))
+ return NULL;
+
+ return g_queue_peek_tail (queue);
+}
+