]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkprintbackend.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / gtkprintbackend.c
index e9c00d8f256e709e9af0c8915e17b35f3325d3e1..93dcb7aa31dada35397e975265259727b4daddce 100644 (file)
@@ -13,9 +13,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
 
 #include "gtkintl.h"
 #include "gtkmodules.h"
+#include "gtkmodulesprivate.h"
+#include "gtkmarshalers.h"
 #include "gtkprivate.h"
 #include "gtkprintbackend.h"
-#include "gtkprinter-private.h"
-#include "gtkalias.h"
 
-#define GTK_PRINT_BACKEND_GET_PRIVATE(o)  \
-   (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_PRINT_BACKEND, GtkPrintBackendPrivate))
 
-static void gtk_print_backend_dispose (GObject *object);
+static void gtk_print_backend_dispose      (GObject      *object);
+static void gtk_print_backend_set_property (GObject      *object,
+                                            guint         prop_id,
+                                            const GValue *value,
+                                            GParamSpec   *pspec);
+static void gtk_print_backend_get_property (GObject      *object,
+                                            guint         prop_id,
+                                            GValue       *value,
+                                            GParamSpec   *pspec);
 
 struct _GtkPrintBackendPrivate
 {
   GHashTable *printers;
   guint printer_list_requested : 1;
   guint printer_list_done : 1;
+  GtkPrintBackendStatus status;
+  char **auth_info_required;
+  char **auth_info;
 };
 
 enum {
@@ -48,11 +55,18 @@ enum {
   PRINTER_ADDED,
   PRINTER_REMOVED,
   PRINTER_STATUS_CHANGED,
+  REQUEST_PASSWORD,
   LAST_SIGNAL
 };
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
+enum 
+{ 
+  PROP_ZERO,
+  PROP_STATUS
+};
+
 static GObjectClass *backend_parent_class;
 
 GQuark
@@ -89,6 +103,8 @@ 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))
@@ -104,7 +120,7 @@ gtk_print_backend_module_load (GTypeModule *module)
   pb_module->library = g_module_open (pb_module->path, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
   if (!pb_module->library)
     {
-      g_warning (g_module_error());
+      g_warning ("%s", g_module_error());
       return FALSE;
     }
   
@@ -116,7 +132,7 @@ gtk_print_backend_module_load (GTypeModule *module)
       !g_module_symbol (pb_module->library, "pb_module_create", 
                        &createp))
     {
-      g_warning (g_module_error());
+      g_warning ("%s", g_module_error());
       g_module_close (pb_module->library);
       
       return FALSE;
@@ -173,6 +189,46 @@ _gtk_print_backend_module_class_init (GtkPrintBackendModuleClass *class)
   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)
 {
@@ -241,6 +297,11 @@ _gtk_print_backend_create (const gchar *backend_name)
   return pb;
 }
 
+/**
+ * gtk_print_backend_load_modules:
+ *
+ * Return value: (element-type GtkPrintBackend) (transfer container):
+ */
 GList *
 gtk_print_backend_load_modules (void)
 {
@@ -286,14 +347,20 @@ 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 gboolean             fallback_printer_get_hard_margins      (GtkPrinter          *printer,
+                                                                    gdouble             *top,
+                                                                    gdouble             *bottom,
+                                                                    gdouble             *left,
+                                                                    gdouble             *right);
 static GList *              fallback_printer_list_papers           (GtkPrinter          *printer);
 static GtkPageSetup *       fallback_printer_get_default_page_size (GtkPrinter          *printer);
 static GtkPrintCapabilities fallback_printer_get_capabilities      (GtkPrinter          *printer);
+static void                 request_password                       (GtkPrintBackend     *backend,
+                                                                    gpointer             auth_info_required,
+                                                                    gpointer             auth_info_default,
+                                                                    gpointer             auth_info_display,
+                                                                    gpointer             auth_info_visible,
+                                                                    const gchar         *prompt);
   
 static void
 gtk_print_backend_class_init (GtkPrintBackendClass *class)
@@ -304,6 +371,8 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class)
   backend_parent_class = g_type_class_peek_parent (class);
   
   object_class->dispose = gtk_print_backend_dispose;
+  object_class->set_property = gtk_print_backend_set_property;
+  object_class->get_property = gtk_print_backend_get_property;
 
   class->printer_request_details = fallback_printer_request_details;
   class->printer_mark_conflicts = fallback_printer_mark_conflicts;
@@ -311,7 +380,18 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class)
   class->printer_list_papers = fallback_printer_list_papers;
   class->printer_get_default_page_size = fallback_printer_get_default_page_size;
   class->printer_get_capabilities = fallback_printer_get_capabilities;
+  class->request_password = request_password;
   
+  g_object_class_install_property (object_class, 
+                                   PROP_STATUS,
+                                   g_param_spec_int ("status",
+                                                     "Status",
+                                                     "The status of the print backend",
+                                                     GTK_PRINT_BACKEND_STATUS_UNKNOWN,
+                                                     GTK_PRINT_BACKEND_STATUS_UNAVAILABLE,
+                                                     GTK_PRINT_BACKEND_STATUS_UNKNOWN,
+                                                     GTK_PARAM_READWRITE)); 
+
   g_type_class_add_private (class, sizeof (GtkPrintBackendPrivate));
   
   signals[PRINTER_LIST_CHANGED] =
@@ -354,6 +434,14 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class)
                  NULL, NULL,
                  g_cclosure_marshal_VOID__OBJECT,
                  G_TYPE_NONE, 1, GTK_TYPE_PRINTER);
+  signals[REQUEST_PASSWORD] =
+    g_signal_new (I_("request-password"),
+                 G_TYPE_FROM_CLASS (class),
+                 G_SIGNAL_RUN_LAST,
+                 G_STRUCT_OFFSET (GtkPrintBackendClass, request_password),
+                 NULL, NULL,
+                 _gtk_marshal_VOID__POINTER_POINTER_POINTER_POINTER_STRING,
+                 G_TYPE_NONE, 5, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_STRING);
 }
 
 static void
@@ -361,11 +449,15 @@ gtk_print_backend_init (GtkPrintBackend *backend)
 {
   GtkPrintBackendPrivate *priv;
 
-  priv = backend->priv = GTK_PRINT_BACKEND_GET_PRIVATE (backend); 
+  priv = backend->priv = G_TYPE_INSTANCE_GET_PRIVATE (backend,
+                                                      GTK_TYPE_PRINT_BACKEND,
+                                                      GtkPrintBackendPrivate);
 
   priv->printers = g_hash_table_new_full (g_str_hash, g_str_equal, 
                                          (GDestroyNotify) g_free,
                                          (GDestroyNotify) g_object_unref);
+  priv->auth_info_required = NULL;
+  priv->auth_info = NULL;
 }
 
 static void
@@ -402,17 +494,14 @@ fallback_printer_mark_conflicts (GtkPrinter          *printer,
   return FALSE;
 }
 
-static void
+static gboolean
 fallback_printer_get_hard_margins (GtkPrinter *printer,
                                   gdouble    *top,
                                   gdouble    *bottom,
                                   gdouble    *left,
                                   gdouble    *right)
 {
-  *top = 0;
-  *bottom = 0;
-  *left = 0;
-  *right = 0;
+  return FALSE;
 }
 
 static GList *
@@ -498,6 +587,15 @@ gtk_print_backend_set_list_done (GtkPrintBackend *backend)
 }
 
 
+/**
+ * gtk_print_backend_get_printer_list:
+ *
+ * Returns the current list of printers.
+ *
+ * Return value: (element-type GtkPrinter) (transfer container):
+ *   A list of #GtkPrinter objects. The list should be freed
+ *   with g_list_free().
+ */
 GList *
 gtk_print_backend_get_printer_list (GtkPrintBackend *backend)
 {
@@ -520,7 +618,7 @@ gtk_print_backend_get_printer_list (GtkPrintBackend *backend)
        GTK_PRINT_BACKEND_GET_CLASS (backend)->request_printer_list (backend);
       priv->printer_list_requested = TRUE;
     }
-  
+
   return result;
 }
 
@@ -569,6 +667,168 @@ gtk_print_backend_print_stream (GtkPrintBackend        *backend,
                                                       dnotify);
 }
 
+void 
+gtk_print_backend_set_password (GtkPrintBackend  *backend,
+                                gchar           **auth_info_required,
+                                gchar           **auth_info)
+{
+  g_return_if_fail (GTK_IS_PRINT_BACKEND (backend));
+
+  if (GTK_PRINT_BACKEND_GET_CLASS (backend)->set_password)
+    GTK_PRINT_BACKEND_GET_CLASS (backend)->set_password (backend, auth_info_required, auth_info);
+}
+
+static void
+store_entry (GtkEntry  *entry,
+             gpointer   user_data)
+{
+  gchar **data = (gchar **) user_data;
+
+  if (*data != NULL)
+    {
+      memset (*data, 0, strlen (*data));
+      g_free (*data);
+    }
+
+  *data = g_strdup (gtk_entry_get_text (entry));
+}
+
+static void
+password_dialog_response (GtkWidget       *dialog,
+                          gint             response_id,
+                          GtkPrintBackend *backend)
+{
+  GtkPrintBackendPrivate *priv = backend->priv;
+  gint i;
+
+  if (response_id == GTK_RESPONSE_OK)
+    gtk_print_backend_set_password (backend, priv->auth_info_required, priv->auth_info);
+  else
+    gtk_print_backend_set_password (backend, priv->auth_info_required, NULL);
+
+  for (i = 0; i < g_strv_length (priv->auth_info_required); i++)
+    if (priv->auth_info[i] != NULL)
+      {
+        memset (priv->auth_info[i], 0, strlen (priv->auth_info[i]));
+        g_free (priv->auth_info[i]);
+        priv->auth_info[i] = NULL;
+      }
+  g_free (priv->auth_info);
+  priv->auth_info = NULL;
+
+  g_strfreev (priv->auth_info_required);
+
+  gtk_widget_destroy (dialog);
+
+  g_object_unref (backend);
+}
+
+static void
+request_password (GtkPrintBackend  *backend,
+                  gpointer          auth_info_required,
+                  gpointer          auth_info_default,
+                  gpointer          auth_info_display,
+                  gpointer          auth_info_visible,
+                  const gchar      *prompt)
+{
+  GtkPrintBackendPrivate *priv = backend->priv;
+  GtkWidget *dialog, *box, *main_box, *label, *icon, *vbox, *entry;
+  GtkWidget *focus = NULL;
+  GtkWidget *content_area;
+  gchar     *markup;
+  gint       length;
+  gint       i;
+  gchar    **ai_required = (gchar **) auth_info_required;
+  gchar    **ai_default = (gchar **) auth_info_default;
+  gchar    **ai_display = (gchar **) auth_info_display;
+  gboolean  *ai_visible = (gboolean *) auth_info_visible;
+
+  priv->auth_info_required = g_strdupv (ai_required);
+  length = g_strv_length (ai_required);
+  priv->auth_info = g_new0 (gchar *, length);
+
+  dialog = gtk_dialog_new_with_buttons ( _("Authentication"), NULL, GTK_DIALOG_MODAL, 
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OK, GTK_RESPONSE_OK,
+                                         NULL);
+
+  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+
+  main_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+
+  /* Left */
+  icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION, GTK_ICON_SIZE_DIALOG);
+  gtk_widget_set_halign (icon, GTK_ALIGN_CENTER);
+  gtk_widget_set_valign (icon, GTK_ALIGN_START);
+  g_object_set (icon, "margin", 6, NULL);
+
+  /* Right */
+  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+  gtk_widget_set_size_request (GTK_WIDGET (vbox), 320, -1);
+
+  /* Right - 1. */
+  label = gtk_label_new (NULL);
+  markup = g_markup_printf_escaped ("<span weight=\"bold\" size=\"large\">%s</span>", prompt);
+  gtk_label_set_markup (GTK_LABEL (label), markup);
+  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+  gtk_widget_set_size_request (GTK_WIDGET (label), 320, -1);
+  g_free (markup);
+
+
+  /* Packing */
+  content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+  gtk_box_pack_start (GTK_BOX (content_area), main_box, TRUE, FALSE, 0);
+
+  gtk_box_pack_start (GTK_BOX (main_box), icon, FALSE, FALSE, 6);
+  gtk_box_pack_start (GTK_BOX (main_box), vbox, FALSE, FALSE, 6);
+
+  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 6);
+  
+  /* Right - 2. */
+  for (i = 0; i < length; i++)
+    {
+      priv->auth_info[i] = g_strdup (ai_default[i]);
+      if (ai_display[i] != NULL)
+        {
+          box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+          gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
+
+          label = gtk_label_new (ai_display[i]);
+          gtk_widget_set_halign (label, GTK_ALIGN_START);
+          gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
+
+          entry = gtk_entry_new ();
+          focus = entry;
+
+          if (ai_default[i] != NULL)
+            gtk_entry_set_text (GTK_ENTRY (entry), ai_default[i]);
+
+          gtk_entry_set_visibility (GTK_ENTRY (entry), ai_visible[i]);
+          gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
+
+          gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 6);
+
+          gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
+          gtk_box_pack_start (GTK_BOX (box), entry, TRUE, TRUE, 0);
+
+          g_signal_connect (entry, "changed",
+                            G_CALLBACK (store_entry), &(priv->auth_info[i]));
+        }
+    }
+
+  if (focus != NULL)
+    {
+      gtk_widget_grab_focus (focus);
+      focus = NULL;
+    }
+
+  g_object_ref (backend);
+  g_signal_connect (G_OBJECT (dialog), "response",
+                    G_CALLBACK (password_dialog_response), backend);
+
+  gtk_widget_show_all (dialog);
+}
+
 void
 gtk_print_backend_destroy (GtkPrintBackend *print_backend)
 {
@@ -580,6 +840,3 @@ gtk_print_backend_destroy (GtkPrintBackend *print_backend)
    */
   g_object_run_dispose (G_OBJECT (print_backend));
 }
-
-#define __GTK_PRINT_BACKEND_C__
-#include "gtkaliasdef.c"