printers: Call cupsGetDevices() asynchronously
This patch makes PpNewPrinterDialog to call DevicesGet method asynchronously now. It also adds spinner to the lower left corner with label showing status of this operation (#644212).
This commit is contained in:
parent
6465053804
commit
080dabe3e4
3 changed files with 155 additions and 43 deletions
|
@ -204,6 +204,35 @@
|
|||
<object class="GtkHButtonBox" id="dialog-action_area1">
|
||||
<property name="visible">True</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkHBox" id="hbox4">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<object class="GtkSpinner" id="spinner">
|
||||
<property name="visible">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="get-devices-status-label">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes"> </property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
<property name="secondary">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="new-printer-cancel-button">
|
||||
<property name="label" translatable="yes">Cancel</property>
|
||||
|
@ -212,9 +241,7 @@
|
|||
<property name="receives_default">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -225,9 +252,7 @@
|
|||
<property name="receives_default">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">1</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
#define ALLOWED_CHARACTERS "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_/"
|
||||
|
||||
static void pp_new_printer_dialog_hide (PpNewPrinterDialog *pp);
|
||||
static void actualize_devices_list (PpNewPrinterDialog *pp, gboolean get_devices);
|
||||
static void actualize_devices_list (PpNewPrinterDialog *pp);
|
||||
|
||||
enum
|
||||
{
|
||||
|
@ -198,32 +198,57 @@ store_device_parameter (gpointer key,
|
|||
}
|
||||
|
||||
static void
|
||||
devices_get (PpNewPrinterDialog *pp)
|
||||
devices_get_cb (GObject *source_object,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBusGProxy *proxy;
|
||||
GError *error = NULL;
|
||||
char *ret_error = NULL;
|
||||
gint i, j;
|
||||
PpNewPrinterDialog *pp = (PpNewPrinterDialog *) user_data;
|
||||
GHashTable *devices = NULL;
|
||||
GtkWidget *widget = NULL;
|
||||
GVariant *dg_output = NULL;
|
||||
GError *error = NULL;
|
||||
char *ret_error = NULL;
|
||||
gint i, j;
|
||||
|
||||
proxy = get_dbus_proxy (MECHANISM_BUS,
|
||||
"/",
|
||||
MECHANISM_BUS,
|
||||
TRUE);
|
||||
dg_output = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object),
|
||||
res,
|
||||
&error);
|
||||
|
||||
if (!proxy)
|
||||
return;
|
||||
if (dg_output && g_variant_n_children (dg_output) == 2)
|
||||
{
|
||||
GVariant *devices_variant = NULL;
|
||||
|
||||
GHashTable *devices = NULL;
|
||||
dbus_g_proxy_call (proxy, "DevicesGet", &error,
|
||||
G_TYPE_INT, 60,
|
||||
G_TYPE_STRING, CUPS_INCLUDE_ALL,
|
||||
G_TYPE_STRING, CUPS_EXCLUDE_NONE,
|
||||
G_TYPE_INVALID,
|
||||
G_TYPE_STRING, &ret_error,
|
||||
DBUS_TYPE_G_STRING_STRING_HASHTABLE, &devices,
|
||||
G_TYPE_INVALID);
|
||||
g_variant_get (dg_output, "(&s@a{ss})",
|
||||
&ret_error,
|
||||
&devices_variant);
|
||||
|
||||
g_object_unref (proxy);
|
||||
if (devices_variant)
|
||||
{
|
||||
if (g_variant_is_of_type (devices_variant, G_VARIANT_TYPE ("a{ss}")))
|
||||
{
|
||||
GVariantIter *iter;
|
||||
GVariant *item;
|
||||
g_variant_get (devices_variant,
|
||||
"a{ss}",
|
||||
&iter);
|
||||
devices = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
while ((item = g_variant_iter_next_value (iter)))
|
||||
{
|
||||
gchar *key;
|
||||
gchar *value;
|
||||
g_variant_get (item,
|
||||
"{ss}",
|
||||
&key,
|
||||
&value);
|
||||
|
||||
g_hash_table_insert (devices, key, value);
|
||||
}
|
||||
}
|
||||
g_variant_unref (devices_variant);
|
||||
}
|
||||
g_variant_unref (dg_output);
|
||||
}
|
||||
g_object_unref (source_object);
|
||||
|
||||
if (error || (ret_error && ret_error[0] != '\0'))
|
||||
{
|
||||
|
@ -306,11 +331,75 @@ devices_get (PpNewPrinterDialog *pp)
|
|||
}
|
||||
|
||||
g_hash_table_destroy (devices);
|
||||
actualize_devices_list (pp);
|
||||
}
|
||||
|
||||
widget = (GtkWidget*)
|
||||
gtk_builder_get_object (pp->builder, "get-devices-status-label");
|
||||
gtk_label_set_text (GTK_LABEL (widget), " ");
|
||||
|
||||
widget = (GtkWidget*)
|
||||
gtk_builder_get_object (pp->builder, "spinner");
|
||||
gtk_spinner_stop (GTK_SPINNER (widget));
|
||||
gtk_widget_set_sensitive (widget, FALSE);
|
||||
|
||||
g_clear_error (&error);
|
||||
}
|
||||
|
||||
static void
|
||||
devices_get (PpNewPrinterDialog *pp)
|
||||
{
|
||||
GDBusProxy *proxy;
|
||||
GError *error = NULL;
|
||||
GVariant *dg_input = NULL;
|
||||
GVariantBuilder *in_include = NULL;
|
||||
GVariantBuilder *in_exclude = NULL;
|
||||
GtkWidget *widget = NULL;
|
||||
|
||||
proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
|
||||
G_DBUS_PROXY_FLAGS_NONE,
|
||||
NULL,
|
||||
MECHANISM_BUS,
|
||||
"/",
|
||||
MECHANISM_BUS,
|
||||
NULL,
|
||||
&error);
|
||||
|
||||
if (proxy)
|
||||
{
|
||||
in_include = g_variant_builder_new (G_VARIANT_TYPE ("as"));
|
||||
in_exclude = g_variant_builder_new (G_VARIANT_TYPE ("as"));
|
||||
|
||||
dg_input = g_variant_new ("(iiasas)",
|
||||
0,
|
||||
60,
|
||||
in_include,
|
||||
in_exclude);
|
||||
|
||||
widget = (GtkWidget*)
|
||||
gtk_builder_get_object (pp->builder, "get-devices-status-label");
|
||||
gtk_label_set_text (GTK_LABEL (widget), _("Getting devices..."));
|
||||
|
||||
widget = (GtkWidget*)
|
||||
gtk_builder_get_object (pp->builder, "spinner");
|
||||
gtk_spinner_start (GTK_SPINNER (widget));
|
||||
gtk_widget_set_sensitive (widget, TRUE);
|
||||
|
||||
g_dbus_proxy_call (proxy,
|
||||
"DevicesGet",
|
||||
dg_input,
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
60000,
|
||||
NULL,
|
||||
devices_get_cb,
|
||||
pp);
|
||||
|
||||
g_variant_builder_unref (in_exclude);
|
||||
g_variant_builder_unref (in_include);
|
||||
g_variant_unref (dg_input);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
search_address_cb (GtkToggleButton *togglebutton,
|
||||
gpointer user_data)
|
||||
|
@ -460,11 +549,11 @@ search_address_cb (GtkToggleButton *togglebutton,
|
|||
pp->num_devices = length;
|
||||
}
|
||||
|
||||
actualize_devices_list (pp, FALSE);
|
||||
actualize_devices_list (pp);
|
||||
}
|
||||
|
||||
static void
|
||||
actualize_devices_list (PpNewPrinterDialog *pp, gboolean get_devices)
|
||||
actualize_devices_list (PpNewPrinterDialog *pp)
|
||||
{
|
||||
GtkListStore *network_store;
|
||||
GtkListStore *local_store;
|
||||
|
@ -473,9 +562,6 @@ actualize_devices_list (PpNewPrinterDialog *pp, gboolean get_devices)
|
|||
GtkTreeIter iter;
|
||||
gint i;
|
||||
|
||||
if (get_devices)
|
||||
devices_get (pp);
|
||||
|
||||
network_treeview = (GtkTreeView*)
|
||||
gtk_builder_get_object (pp->builder, "network-devices-treeview");
|
||||
|
||||
|
@ -516,15 +602,15 @@ actualize_devices_list (PpNewPrinterDialog *pp, gboolean get_devices)
|
|||
gtk_tree_view_set_model (network_treeview, GTK_TREE_MODEL (network_store));
|
||||
gtk_tree_view_set_model (local_treeview, GTK_TREE_MODEL (local_store));
|
||||
|
||||
gtk_tree_model_get_iter_first ((GtkTreeModel *) network_store, &iter);
|
||||
gtk_tree_selection_select_iter (
|
||||
gtk_tree_view_get_selection (GTK_TREE_VIEW (network_treeview)),
|
||||
&iter);
|
||||
if (gtk_tree_model_get_iter_first ((GtkTreeModel *) network_store, &iter))
|
||||
gtk_tree_selection_select_iter (
|
||||
gtk_tree_view_get_selection (GTK_TREE_VIEW (network_treeview)),
|
||||
&iter);
|
||||
|
||||
gtk_tree_model_get_iter_first ((GtkTreeModel *) local_store, &iter);
|
||||
gtk_tree_selection_select_iter (
|
||||
gtk_tree_view_get_selection (GTK_TREE_VIEW (local_treeview)),
|
||||
&iter);
|
||||
if (gtk_tree_model_get_iter_first ((GtkTreeModel *) local_store, &iter))
|
||||
gtk_tree_selection_select_iter (
|
||||
gtk_tree_view_get_selection (GTK_TREE_VIEW (local_treeview)),
|
||||
&iter);
|
||||
|
||||
g_object_unref (network_store);
|
||||
g_object_unref (local_store);
|
||||
|
@ -544,7 +630,8 @@ populate_devices_list (PpNewPrinterDialog *pp)
|
|||
local_treeview = (GtkWidget*)
|
||||
gtk_builder_get_object (pp->builder, "local-devices-treeview");
|
||||
|
||||
actualize_devices_list (pp, TRUE);
|
||||
actualize_devices_list (pp);
|
||||
devices_get (pp);
|
||||
|
||||
renderer = gtk_cell_renderer_text_new ();
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
<child>
|
||||
<object class="GtkToolButton" id="printer-add-button">
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="sensitive">True</property>
|
||||
<property name="label">AddPrinter</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="icon_name">list-add-symbolic</property>
|
||||
|
|
Loading…
Add table
Reference in a new issue