2
* Copyright (C) 2010 Red Hat, Inc
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
#include "cc-printers-panel.h"
25
#include <glib/gi18n-lib.h>
26
#include <glib/gstdio.h>
27
#include <polkit/polkit.h>
28
#include <dbus/dbus-glib.h>
29
#include <gdesktop-enums.h>
31
#include <cups/cups.h>
35
#include "libgnome-control-center/cc-lockbutton.h"
36
#include "pp-new-printer-dialog.h"
39
G_DEFINE_DYNAMIC_TYPE (CcPrintersPanel, cc_printers_panel, CC_TYPE_PANEL)
41
#define PRINTERS_PANEL_PRIVATE(o) \
42
(G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_PRINTERS_PANEL, CcPrintersPanelPrivate))
44
#define MECHANISM_BUS "org.opensuse.CupsPkHelper.Mechanism"
46
#define SUPPLY_BAR_HEIGHT 20
48
#define EMPTY_TEXT "\xe2\x80\x94"
50
#define CLOCK_SCHEMA "org.gnome.desktop.interface"
51
#define CLOCK_FORMAT_KEY "clock-format"
53
#define RENEW_INTERVAL 500
54
#define SUBSCRIPTION_DURATION 600
56
#define CUPS_DBUS_NAME "org.cups.cupsd.Notifier"
57
#define CUPS_DBUS_PATH "/org/cups/cupsd/Notifier"
58
#define CUPS_DBUS_INTERFACE "org.cups.cupsd.Notifier"
60
struct _CcPrintersPanelPrivate
64
GtkWidget *lock_button;
67
gchar **dest_model_names;
68
gchar **ppd_file_names;
76
gchar **allowed_users;
77
int num_allowed_users;
78
int current_allowed_user;
80
GdkRGBA background_color;
82
GPermission *permission;
84
GSettings *lockdown_settings;
86
PpNewPrinterDialog *pp_new_printer_dialog;
88
GDBusProxy *cups_proxy;
89
GDBusConnection *cups_bus_connection;
95
static void actualize_jobs_list (CcPrintersPanel *self);
96
static void actualize_printers_list (CcPrintersPanel *self);
97
static void actualize_allowed_users_list (CcPrintersPanel *self);
98
static void actualize_sensitivity (gpointer user_data);
99
static void printer_disable_cb (GObject *gobject, GParamSpec *pspec, gpointer user_data);
100
static void printer_set_default_cb (GtkToggleButton *button, gpointer user_data);
101
static void detach_from_cups_notifier (gpointer data);
102
static void free_dests (CcPrintersPanel *self);
105
cc_printers_panel_get_property (GObject *object,
113
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
118
cc_printers_panel_set_property (GObject *object,
126
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
131
cc_printers_panel_dispose (GObject *object)
133
CcPrintersPanelPrivate *priv = CC_PRINTERS_PANEL (object)->priv;
136
free_dests (CC_PRINTERS_PANEL (object));
138
if (priv->num_jobs > 0)
139
cupsFreeJobs (priv->num_jobs, priv->jobs);
142
priv->current_job = -1;
144
if (priv->num_allowed_users > 0)
146
for (i = 0; i < priv->num_allowed_users; i++)
147
g_free (priv->allowed_users[i]);
148
g_free (priv->allowed_users);
150
priv->allowed_users = NULL;
151
priv->num_allowed_users = 0;
152
priv->current_allowed_user = -1;
156
g_object_unref (priv->builder);
157
priv->builder = NULL;
160
if (priv->lockdown_settings)
162
g_object_unref (priv->lockdown_settings);
163
priv->lockdown_settings = NULL;
166
detach_from_cups_notifier (CC_PRINTERS_PANEL (object));
168
G_OBJECT_CLASS (cc_printers_panel_parent_class)->dispose (object);
172
cc_printers_panel_finalize (GObject *object)
174
G_OBJECT_CLASS (cc_printers_panel_parent_class)->finalize (object);
178
cc_printers_panel_class_init (CcPrintersPanelClass *klass)
180
GObjectClass *object_class = G_OBJECT_CLASS (klass);
182
g_type_class_add_private (klass, sizeof (CcPrintersPanelPrivate));
184
object_class->get_property = cc_printers_panel_get_property;
185
object_class->set_property = cc_printers_panel_set_property;
186
object_class->dispose = cc_printers_panel_dispose;
187
object_class->finalize = cc_printers_panel_finalize;
191
cc_printers_panel_class_finalize (CcPrintersPanelClass *klass)
196
on_cups_notification (GDBusConnection *connection,
197
const char *sender_name,
198
const char *object_path,
199
const char *interface_name,
200
const char *signal_name,
201
GVariant *parameters,
204
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
205
CcPrintersPanelPrivate *priv;
206
gboolean printer_is_accepting_jobs;
207
gchar *printer_name = NULL;
209
gchar *printer_uri = NULL;
210
gchar *printer_state_reasons = NULL;
211
gchar *job_state_reasons = NULL;
212
gchar *job_name = NULL;
216
gint job_impressions_completed;
217
static const char * const requested_attrs[] = {
219
"job-originating-user-name"};
221
priv = PRINTERS_PANEL_PRIVATE (self);
223
if (g_strcmp0 (signal_name, "PrinterAdded") != 0 &&
224
g_strcmp0 (signal_name, "PrinterDeleted") != 0 &&
225
g_strcmp0 (signal_name, "PrinterStateChanged") != 0 &&
226
g_strcmp0 (signal_name, "JobCreated") != 0 &&
227
g_strcmp0 (signal_name, "JobCompleted") != 0)
230
if (g_variant_n_children (parameters) == 1)
231
g_variant_get (parameters, "(&s)", &text);
232
else if (g_variant_n_children (parameters) == 6)
234
g_variant_get (parameters, "(&s&s&su&sb)",
239
&printer_state_reasons,
240
&printer_is_accepting_jobs);
242
else if (g_variant_n_children (parameters) == 11)
244
g_variant_get (parameters, "(&s&s&su&sbuu&s&su)",
249
&printer_state_reasons,
250
&printer_is_accepting_jobs,
255
&job_impressions_completed);
258
if (g_strcmp0 (signal_name, "PrinterAdded") == 0 ||
259
g_strcmp0 (signal_name, "PrinterDeleted") == 0 ||
260
g_strcmp0 (signal_name, "PrinterStateChanged") == 0)
261
actualize_printers_list (self);
262
else if (g_strcmp0 (signal_name, "JobCreated") == 0 ||
263
g_strcmp0 (signal_name, "JobCompleted") == 0)
267
ipp_t *request, *response;
269
job_uri = g_strdup_printf ("ipp://localhost/jobs/%d", job_id);
270
if ((http = httpConnectEncrypt (cupsServer (), ippPort (),
271
cupsEncryption ())) != NULL)
273
request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES);
274
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
275
"job-uri", NULL, job_uri);
276
ippAddStrings (request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
277
"requested-attributes", G_N_ELEMENTS (requested_attrs), NULL, requested_attrs);
278
response = cupsDoRequest(http, request, "/");
282
if (response->request.status.status_code <= IPP_OK_CONFLICT)
284
ipp_attribute_t *attr_username = NULL;
285
ipp_attribute_t *attr_printer_uri = NULL;
287
attr_username = ippFindAttribute(response, "job-originating-user-name", IPP_TAG_NAME);
288
attr_printer_uri = ippFindAttribute(response, "job-printer-uri", IPP_TAG_URI);
289
if (attr_username && attr_printer_uri &&
290
g_strcmp0 (attr_username->values[0].string.text, cupsUser ()) == 0 &&
291
g_strrstr (attr_printer_uri->values[0].string.text, "/") != 0 &&
292
priv->current_dest >= 0 &&
293
priv->current_dest < priv->num_dests &&
294
priv->dests != NULL &&
295
g_strcmp0 (g_strrstr (attr_printer_uri->values[0].string.text, "/") + 1,
296
priv->dests[priv->current_dest].name) == 0)
297
actualize_jobs_list (self);
308
renew_subscription (gpointer data)
310
CcPrintersPanelPrivate *priv;
311
CcPrintersPanel *self = (CcPrintersPanel*) data;
312
static const char * const events[] = {
315
"printer-state-changed",
319
priv = PRINTERS_PANEL_PRIVATE (self);
321
priv->subscription_id = renew_cups_subscription (priv->subscription_id,
323
G_N_ELEMENTS (events),
324
SUBSCRIPTION_DURATION);
330
attach_to_cups_notifier (gpointer data)
332
CcPrintersPanelPrivate *priv;
333
CcPrintersPanel *self = (CcPrintersPanel*) data;
334
GError *error = NULL;
336
priv = PRINTERS_PANEL_PRIVATE (self);
338
renew_subscription (self);
339
g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription, self);
342
priv->cups_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
353
g_warning ("%s", error->message);
357
priv->cups_bus_connection = g_dbus_proxy_get_connection (priv->cups_proxy);
359
g_dbus_connection_signal_subscribe (priv->cups_bus_connection,
366
on_cups_notification,
372
detach_from_cups_notifier (gpointer data)
374
CcPrintersPanelPrivate *priv;
375
CcPrintersPanel *self = (CcPrintersPanel*) data;
377
priv = PRINTERS_PANEL_PRIVATE (self);
379
cancel_cups_subscription (priv->subscription_id);
380
priv->subscription_id = -1;
382
if (priv->cups_proxy != NULL) {
383
g_object_unref (priv->cups_proxy);
384
priv->cups_proxy = NULL;
389
free_dests (CcPrintersPanel *self)
391
CcPrintersPanelPrivate *priv;
394
priv = PRINTERS_PANEL_PRIVATE (self);
396
if (priv->num_dests > 0)
398
for (i = 0; i < priv->num_dests; i++)
400
g_free (priv->dest_model_names[i]);
401
if (priv->ppd_file_names[i]) {
402
g_unlink (priv->ppd_file_names[i]);
403
g_free (priv->ppd_file_names[i]);
406
g_free (priv->dest_model_names);
407
g_free (priv->ppd_file_names);
408
cupsFreeDests (priv->num_dests, priv->dests);
412
priv->current_dest = -1;
413
priv->dest_model_names = NULL;
414
priv->ppd_file_names = NULL;
419
NOTEBOOK_INFO_PAGE = 0,
421
NOTEBOOK_OPTIONS_PAGE,
422
NOTEBOOK_NO_PRINTERS_PAGE,
423
NOTEBOOK_NO_CUPS_PAGE,
431
PRINTER_PAUSED_COLUMN,
432
PRINTER_DEFAULT_ICON_COLUMN,
438
printer_selection_changed_cb (GtkTreeSelection *selection,
441
CcPrintersPanelPrivate *priv;
442
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
444
cups_ptype_t type = 0;
448
gboolean is_local = TRUE;
449
gchar *printer_make_and_model = NULL;
450
gchar *printer_model = NULL;
451
gchar *reason = NULL;
452
gchar **printer_reasons = NULL;
453
gchar *marker_types = NULL;
454
gchar *printer_name = NULL;
455
gchar *printer_type = NULL;
456
gchar *active_jobs = NULL;
457
gchar *supply_type = NULL;
458
gchar *printer_uri = NULL;
459
gchar *location = NULL;
460
gchar *status = NULL;
462
int printer_state = 3;
465
static const char * const reasons[] =
472
"marker-supply-empty",
479
"marker-waste-almost-full",
484
static const char * statuses[] =
486
/* Translators: The printer is low on toner */
488
/* Translators: The printer has no toner left */
490
/* Translators: "Developer" is a chemical for photo development,
491
* http://en.wikipedia.org/wiki/Photographic_developer */
492
N_("Low on developer"),
493
/* Translators: "Developer" is a chemical for photo development,
494
* http://en.wikipedia.org/wiki/Photographic_developer */
495
N_("Out of developer"),
496
/* Translators: "marker" is one color bin of the printer */
497
N_("Low on a marker supply"),
498
/* Translators: "marker" is one color bin of the printer */
499
N_("Out of a marker supply"),
500
/* Translators: One or more covers on the printer are open */
502
/* Translators: One or more doors on the printer are open */
504
/* Translators: At least one input tray is low on media */
506
/* Translators: At least one input tray is empty */
508
/* Translators: The printer is offline */
509
NC_("printer state", "Offline"),
510
/* Translators: Someone has paused the Printer */
511
NC_("printer state", "Paused"),
512
/* Translators: The printer marker supply waste receptacle is almost full */
513
N_("Waste receptacle almost full"),
514
/* Translators: The printer marker supply waste receptacle is full */
515
N_("Waste receptacle full"),
516
/* Translators: Optical photo conductors are used in laser printers */
517
N_("The optical photo conductor is near end of life"),
518
/* Translators: Optical photo conductors are used in laser printers */
519
N_("The optical photo conductor is no longer functioning")
522
priv = PRINTERS_PANEL_PRIVATE (self);
524
if (gtk_tree_selection_get_selected (selection, &model, &iter))
526
gtk_tree_model_get (model, &iter,
527
PRINTER_ID_COLUMN, &id,
528
PRINTER_NAME_COLUMN, &printer_name,
534
priv->current_dest = id;
536
if (!(priv->current_dest >= 0 &&
537
priv->current_dest < priv->num_dests &&
538
priv->dests != NULL &&
539
priv->current_job >= 0 &&
540
priv->current_job < priv->num_jobs &&
541
priv->jobs != NULL &&
542
g_strcmp0 (priv->dests[priv->current_dest].name,
543
priv->jobs[priv->current_job].dest) == 0))
545
actualize_jobs_list (self);
547
widget = (GtkWidget*)
548
gtk_builder_get_object (priv->builder, "job-release-button");
549
gtk_widget_set_sensitive (widget, FALSE);
551
widget = (GtkWidget*)
552
gtk_builder_get_object (priv->builder, "job-hold-button");
553
gtk_widget_set_sensitive (widget, FALSE);
555
widget = (GtkWidget*)
556
gtk_builder_get_object (priv->builder, "job-cancel-button");
557
gtk_widget_set_sensitive (widget, FALSE);
560
actualize_allowed_users_list (self);
562
if (priv->current_dest >= 0 &&
563
priv->current_dest < priv->num_dests &&
566
widget = (GtkWidget*)
567
gtk_builder_get_object (priv->builder, "notebook");
568
if (gtk_notebook_get_current_page (GTK_NOTEBOOK (widget)) >= NOTEBOOK_NO_PRINTERS_PAGE)
569
gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), NOTEBOOK_INFO_PAGE);
571
for (i = 0; i < priv->dests[id].num_options; i++)
573
if (g_strcmp0 (priv->dests[id].options[i].name, "printer-location") == 0)
574
location = g_strdup (priv->dests[id].options[i].value);
575
else if (g_strcmp0 (priv->dests[id].options[i].name, "printer-state") == 0)
576
printer_state = atoi (priv->dests[id].options[i].value);
577
else if (g_strcmp0 (priv->dests[id].options[i].name, "printer-state-reasons") == 0)
578
reason = priv->dests[id].options[i].value;
579
else if (g_strcmp0 (priv->dests[priv->current_dest].options[i].name, "marker-types") == 0)
580
marker_types = priv->dests[priv->current_dest].options[i].value;
581
else if (g_strcmp0 (priv->dests[priv->current_dest].options[i].name, "printer-make-and-model") == 0)
582
printer_make_and_model = priv->dests[priv->current_dest].options[i].value;
583
else if (g_strcmp0 (priv->dests[priv->current_dest].options[i].name, "printer-uri-supported") == 0)
584
printer_uri = priv->dests[priv->current_dest].options[i].value;
585
else if (g_strcmp0 (priv->dests[priv->current_dest].options[i].name, "printer-type") == 0)
586
printer_type = priv->dests[priv->current_dest].options[i].value;
589
if (priv->ppd_file_names[priv->current_dest] == NULL)
590
priv->ppd_file_names[priv->current_dest] =
591
g_strdup (cupsGetPPD (priv->dests[priv->current_dest].name));
593
if (priv->dest_model_names[priv->current_dest] == NULL)
594
priv->dest_model_names[priv->current_dest] =
595
get_ppd_attribute (priv->ppd_file_names[priv->current_dest],
598
printer_model = g_strdup (priv->dest_model_names[priv->current_dest]);
600
if (printer_model == NULL && printer_make_and_model)
602
gchar *breakpoint = NULL, *tmp = NULL, *tmp2 = NULL;
605
gchar *forbiden[] = {
611
"postscript (recommended)",
614
tmp = g_ascii_strdown (printer_make_and_model, -1);
616
for (i = 0; i < g_strv_length (forbiden); i++)
618
tmp2 = g_strrstr (tmp, forbiden[i]);
619
if (breakpoint == NULL ||
620
(tmp2 != NULL && tmp2 < breakpoint))
626
backup = *breakpoint;
628
length = strlen (tmp);
629
*breakpoint = backup;
633
printer_model = g_strndup (printer_make_and_model, length);
636
printer_model = g_strdup (printer_make_and_model);
639
/* Find the first of the most severe reasons
640
* and show it in the status field
642
if (reason && g_strcmp0 (reason, "none") != 0)
644
int errors = 0, warnings = 0, reports = 0;
645
int error_index = -1, warning_index = -1, report_index = -1;
647
printer_reasons = g_strsplit (reason, ",", -1);
648
for (i = 0; i < g_strv_length (printer_reasons); i++)
650
for (j = 0; j < G_N_ELEMENTS (reasons); j++)
651
if (strncmp (printer_reasons[i],
653
strlen (reasons[j])) == 0)
655
if (g_str_has_suffix (printer_reasons[i], "-report"))
661
else if (g_str_has_suffix (printer_reasons[i], "-warning"))
675
g_strfreev (printer_reasons);
677
if (error_index >= 0)
678
status = g_strdup (_(statuses[error_index]));
679
else if (warning_index >= 0)
680
status = g_strdup (_(statuses[warning_index]));
681
else if (report_index >= 0)
682
status = g_strdup (_(statuses[report_index]));
687
switch (printer_state)
690
/* Translators: Printer's state (can start new job without waiting) */
691
status = g_strdup ( C_("printer state", "Ready"));
694
/* Translators: Printer's state (jobs are processing) */
695
status = g_strdup ( C_("printer state", "Processing"));
698
/* Translators: Printer's state (no jobs can be processed) */
699
status = g_strdup ( C_("printer state", "Stopped"));
704
widget = (GtkWidget*)
705
gtk_builder_get_object (priv->builder, "printer-name-label");
709
gtk_label_set_text (GTK_LABEL (widget), printer_name);
710
g_free (printer_name);
713
gtk_label_set_text (GTK_LABEL (widget), EMPTY_TEXT);
716
widget = (GtkWidget*)
717
gtk_builder_get_object (priv->builder, "printer-status-label");
721
gtk_label_set_text (GTK_LABEL (widget), status);
725
gtk_label_set_text (GTK_LABEL (widget), EMPTY_TEXT);
728
widget = (GtkWidget*)
729
gtk_builder_get_object (priv->builder, "printer-location-label");
733
gtk_label_set_text (GTK_LABEL (widget), location);
737
gtk_label_set_text (GTK_LABEL (widget), EMPTY_TEXT);
740
widget = (GtkWidget*)
741
gtk_builder_get_object (priv->builder, "printer-model-label");
745
gtk_label_set_text (GTK_LABEL (widget), printer_model);
746
g_free (printer_model);
749
gtk_label_set_text (GTK_LABEL (widget), EMPTY_TEXT);
752
widget = (GtkWidget*)
753
gtk_builder_get_object (priv->builder, "printer-ip-address-label");
757
type = atoi (printer_type);
758
is_local = !(type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT));
763
gtk_label_set_text (GTK_LABEL (widget), "localhost");
769
char scheme[HTTP_MAX_URI],
770
userpass[HTTP_MAX_URI],
771
server[HTTP_MAX_URI],
772
resource[HTTP_MAX_URI];
775
httpSeparateURI(HTTP_URI_CODING_ALL, printer_uri, scheme, sizeof(scheme), userpass,
776
sizeof(userpass), server, sizeof(server), &port, resource,
779
if (server[0] != '\0')
780
gtk_label_set_text (GTK_LABEL (widget), server);
782
gtk_label_set_text (GTK_LABEL (widget), EMPTY_TEXT);
785
gtk_label_set_text (GTK_LABEL (widget), EMPTY_TEXT);
789
widget = (GtkWidget*)
790
gtk_builder_get_object (priv->builder, "printer-disable-switch");
792
g_signal_handlers_block_by_func (G_OBJECT (widget), printer_disable_cb, self);
793
gtk_switch_set_active (GTK_SWITCH (widget), printer_state != 5);
794
g_signal_handlers_unblock_by_func (G_OBJECT (widget), printer_disable_cb, self);
797
widget = (GtkWidget*)
798
gtk_builder_get_object (priv->builder, "printer-default-check-button");
800
sensitive = gtk_widget_get_sensitive (widget);
801
g_signal_handlers_block_by_func (G_OBJECT (widget), printer_set_default_cb, self);
802
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), priv->dests[id].is_default);
803
g_signal_handlers_unblock_by_func (G_OBJECT (widget), printer_set_default_cb, self);
804
gtk_widget_set_sensitive (widget, sensitive);
807
widget = (GtkWidget*)
808
gtk_builder_get_object (priv->builder, "supply-drawing-area");
809
gtk_widget_set_size_request (widget, -1, SUPPLY_BAR_HEIGHT);
810
gtk_widget_queue_draw (widget);
813
widget = (GtkWidget*)
814
gtk_builder_get_object (priv->builder, "supply-label");
816
if (marker_types && g_strrstr (marker_types, "toner") != NULL)
817
/* Translators: Toner supply */
818
supply_type = g_strdup ( _("Toner Level"));
819
else if (marker_types && g_strrstr (marker_types, "ink") != NULL)
820
/* Translators: Ink supply */
821
supply_type = g_strdup ( _("Ink Level"));
823
/* Translators: By supply we mean ink, toner, staples, water, ... */
824
supply_type = g_strdup ( _("Supply Level"));
828
gtk_label_set_text (GTK_LABEL (widget), supply_type);
829
g_free (supply_type);
832
gtk_label_set_text (GTK_LABEL (widget), EMPTY_TEXT);
835
widget = (GtkWidget*)
836
gtk_builder_get_object (priv->builder, "printer-jobs-label");
837
num_jobs = priv->num_jobs < 0 ? 0 : (guint) priv->num_jobs;
838
/* Translators: there is n active print jobs on this printer */
839
active_jobs = g_strdup_printf (ngettext ("%u active", "%u active", num_jobs), num_jobs);
843
gtk_label_set_text (GTK_LABEL (widget), active_jobs);
844
g_free (active_jobs);
847
gtk_label_set_text (GTK_LABEL (widget), EMPTY_TEXT);
853
widget = (GtkWidget*)
854
gtk_builder_get_object (priv->builder, "notebook");
856
http = httpConnectEncrypt (cupsServer (), ippPort (), cupsEncryption ());
860
gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), NOTEBOOK_NO_PRINTERS_PAGE);
863
gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), NOTEBOOK_NO_CUPS_PAGE);
865
widget = (GtkWidget*)
866
gtk_builder_get_object (priv->builder, "printer-name-label");
867
gtk_label_set_text (GTK_LABEL (widget), "");
869
widget = (GtkWidget*)
870
gtk_builder_get_object (priv->builder, "printer-status-label");
871
gtk_label_set_text (GTK_LABEL (widget), "");
873
widget = (GtkWidget*)
874
gtk_builder_get_object (priv->builder, "printer-location-label");
875
gtk_label_set_text (GTK_LABEL (widget), "");
877
widget = (GtkWidget*)
878
gtk_builder_get_object (priv->builder, "printer-model-label");
879
gtk_label_set_text (GTK_LABEL (widget), "");
881
widget = (GtkWidget*)
882
gtk_builder_get_object (priv->builder, "printer-ip-address-label");
883
gtk_label_set_text (GTK_LABEL (widget), "");
885
widget = (GtkWidget*)
886
gtk_builder_get_object (priv->builder, "printer-jobs-label");
887
gtk_label_set_text (GTK_LABEL (widget), "");
890
actualize_sensitivity (self);
894
actualize_printers_list (CcPrintersPanel *self)
896
CcPrintersPanelPrivate *priv;
898
GtkTreeIter selected_iter;
899
GtkTreeView *treeview;
901
cups_job_t *jobs = NULL;
902
gboolean paused = FALSE;
903
gboolean valid = FALSE;
904
gchar *current_printer_instance = NULL;
905
gchar *current_printer_name = NULL;
906
gchar *printer_icon_name = NULL;
907
gchar *default_icon_name = NULL;
908
int current_dest = -1;
912
priv = PRINTERS_PANEL_PRIVATE (self);
914
if (priv->current_dest >= 0 &&
915
priv->current_dest < priv->num_dests &&
918
current_printer_name = g_strdup (priv->dests[priv->current_dest].name);
919
if (priv->dests[priv->current_dest].instance)
920
current_printer_instance = g_strdup (priv->dests[priv->current_dest].instance);
924
priv->num_dests = cupsGetDests (&priv->dests);
925
priv->dest_model_names = g_new0 (gchar *, priv->num_dests);
926
priv->ppd_file_names = g_new0 (gchar *, priv->num_dests);
928
treeview = (GtkTreeView*)
929
gtk_builder_get_object (priv->builder, "printers-treeview");
931
store = gtk_list_store_new (PRINTER_N_COLUMNS,
938
if (priv->num_dests == 0)
940
gtk_list_store_append (store, &iter);
941
gtk_list_store_set (store, &iter,
942
PRINTER_ID_COLUMN, 0,
943
/* Translators: There are no printers available (none is configured or CUPS is not running) */
944
PRINTER_NAME_COLUMN, _("No printers available"),
945
PRINTER_PAUSED_COLUMN, TRUE,
946
PRINTER_DEFAULT_ICON_COLUMN, NULL,
947
PRINTER_ICON_COLUMN, NULL,
949
gtk_widget_set_sensitive (GTK_WIDGET (treeview), FALSE);
952
gtk_widget_set_sensitive (GTK_WIDGET (treeview), TRUE);
954
for (i = 0; i < priv->num_dests; i++)
958
gtk_list_store_append (store, &iter);
960
if (priv->dests[i].instance)
962
instance = g_strdup_printf ("%s / %s", priv->dests[i].name, priv->dests[i].instance);
964
if (current_printer_instance &&
965
g_strcmp0 (current_printer_name, priv->dests[i].name) == 0 &&
966
g_strcmp0 (current_printer_instance, priv->dests[i].instance) == 0)
969
selected_iter = iter;
974
instance = g_strdup (priv->dests[i].name);
976
if (current_printer_instance == NULL &&
977
g_strcmp0 (current_printer_name, priv->dests[i].name) == 0)
980
selected_iter = iter;
984
for (j = 0; j < priv->dests[i].num_options; j++)
986
if (g_strcmp0 (priv->dests[i].options[j].name, "printer-state") == 0)
987
paused = (g_strcmp0 (priv->dests[i].options[j].value, "5") == 0);
990
if (priv->dests[i].is_default)
991
default_icon_name = g_strdup ("emblem-default-symbolic");
993
default_icon_name = NULL;
995
printer_icon_name = g_strdup ("printer");
997
gtk_list_store_set (store, &iter,
998
PRINTER_ID_COLUMN, i,
999
PRINTER_NAME_COLUMN, instance,
1000
PRINTER_PAUSED_COLUMN, paused,
1001
PRINTER_DEFAULT_ICON_COLUMN, default_icon_name,
1002
PRINTER_ICON_COLUMN, printer_icon_name,
1006
g_free (printer_icon_name);
1007
g_free (default_icon_name);
1010
g_signal_handlers_block_by_func (
1011
G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview))),
1012
printer_selection_changed_cb,
1015
gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (store));
1017
g_signal_handlers_unblock_by_func (
1018
G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview))),
1019
printer_selection_changed_cb,
1022
if (current_dest >= 0)
1024
priv->current_dest = current_dest;
1025
gtk_tree_selection_select_iter (
1026
gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
1031
num_jobs = cupsGetJobs (&jobs, NULL, 1, CUPS_WHICHJOBS_ALL);
1033
/* Select last used printer */
1036
for (i = 0; i < priv->num_dests; i++)
1037
if (g_strcmp0 (priv->dests[i].name, jobs[num_jobs - 1].dest) == 0)
1039
priv->current_dest = i;
1042
cupsFreeJobs (num_jobs, jobs);
1045
/* Select default printer */
1046
if (priv->current_dest < 0)
1048
for (i = 0; i < priv->num_dests; i++)
1049
if (priv->dests[i].is_default)
1051
priv->current_dest = i;
1056
if (priv->current_dest >= 0)
1059
valid = gtk_tree_model_get_iter_first ((GtkTreeModel *) store,
1064
gtk_tree_model_get ((GtkTreeModel *) store, &selected_iter,
1065
PRINTER_ID_COLUMN, &id,
1067
if (id == priv->current_dest)
1070
valid = gtk_tree_model_iter_next ((GtkTreeModel *) store,
1074
gtk_tree_selection_select_iter (
1075
gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
1078
else if (priv->num_dests > 0)
1080
/* Select first printer */
1081
gtk_tree_model_get_iter_first ((GtkTreeModel *) store,
1084
gtk_tree_selection_select_iter (
1085
gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
1090
g_free (current_printer_name);
1091
g_free (current_printer_instance);
1092
g_object_unref (store);
1096
set_cell_sensitivity_func (GtkTreeViewColumn *tree_column,
1097
GtkCellRenderer *cell,
1098
GtkTreeModel *tree_model,
1102
CcPrintersPanelPrivate *priv;
1103
CcPrintersPanel *self = (CcPrintersPanel*) func_data;
1104
gboolean paused = FALSE;
1106
priv = PRINTERS_PANEL_PRIVATE (self);
1108
gtk_tree_model_get (tree_model, iter, PRINTER_PAUSED_COLUMN, &paused, -1);
1110
if (priv->num_dests == 0)
1111
g_object_set (G_OBJECT (cell),
1112
"ellipsize", PANGO_ELLIPSIZE_NONE,
1116
g_object_set (G_OBJECT (cell),
1117
"ellipsize", PANGO_ELLIPSIZE_END,
1132
populate_printers_list (CcPrintersPanel *self)
1134
CcPrintersPanelPrivate *priv;
1135
GtkTreeViewColumn *column;
1136
GtkCellRenderer *icon_renderer;
1137
GtkCellRenderer *icon_renderer2;
1138
GtkCellRenderer *renderer;
1139
GtkWidget *treeview;
1141
priv = PRINTERS_PANEL_PRIVATE (self);
1143
treeview = (GtkWidget*)
1144
gtk_builder_get_object (priv->builder, "printers-treeview");
1146
g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
1147
"changed", G_CALLBACK (printer_selection_changed_cb), self);
1149
actualize_printers_list (self);
1152
icon_renderer = gtk_cell_renderer_pixbuf_new ();
1153
g_object_set (icon_renderer, "stock-size", GTK_ICON_SIZE_DND, NULL);
1154
column = gtk_tree_view_column_new_with_attributes ("Icon", icon_renderer,
1155
"icon-name", PRINTER_ICON_COLUMN, NULL);
1156
gtk_tree_view_column_set_expand (column, FALSE);
1157
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
1160
renderer = gtk_cell_renderer_text_new ();
1161
g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, "width-chars", 18, NULL);
1162
column = gtk_tree_view_column_new_with_attributes ("Printer", renderer,
1163
"text", PRINTER_NAME_COLUMN, NULL);
1164
gtk_tree_view_column_set_cell_data_func (column, renderer, set_cell_sensitivity_func,
1166
gtk_tree_view_column_set_expand (column, FALSE);
1167
gtk_tree_view_column_set_min_width (column, 120);
1168
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
1171
icon_renderer2 = gtk_cell_renderer_pixbuf_new ();
1172
column = gtk_tree_view_column_new_with_attributes ("Default", icon_renderer2,
1173
"icon-name", PRINTER_DEFAULT_ICON_COLUMN, NULL);
1174
gtk_tree_view_column_set_expand (column, FALSE);
1175
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
1183
JOB_CREATION_TIME_COLUMN,
1188
actualize_jobs_list (CcPrintersPanel *self)
1190
CcPrintersPanelPrivate *priv;
1191
GtkListStore *store;
1192
GtkTreeView *treeview;
1194
GSettings *settings;
1200
priv = PRINTERS_PANEL_PRIVATE (self);
1202
treeview = (GtkTreeView*)
1203
gtk_builder_get_object (priv->builder, "job-treeview");
1205
if (priv->num_jobs > 0)
1206
cupsFreeJobs (priv->num_jobs, priv->jobs);
1207
priv->num_jobs = -1;
1210
priv->current_job = -1;
1211
if (priv->current_dest >= 0 &&
1212
priv->current_dest < priv->num_dests &&
1213
priv->dests != NULL)
1215
priv->num_jobs = cupsGetJobs (&priv->jobs, priv->dests[priv->current_dest].name, 1, CUPS_WHICHJOBS_ACTIVE);
1217
widget = (GtkWidget*)
1218
gtk_builder_get_object (priv->builder, "printer-jobs-label");
1220
num_jobs = priv->num_jobs < 0 ? 0 : (guint) priv->num_jobs;
1221
/* Translators: there is n active print jobs on this printer */
1222
active_jobs = g_strdup_printf (ngettext ("%u active", "%u active", num_jobs), num_jobs);
1226
gtk_label_set_text (GTK_LABEL (widget), active_jobs);
1227
g_free (active_jobs);
1230
gtk_label_set_text (GTK_LABEL (widget), EMPTY_TEXT);
1233
store = gtk_list_store_new (JOB_N_COLUMNS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
1235
for (i = 0; i < priv->num_jobs; i++)
1237
GDesktopClockFormat value;
1241
gchar *state = NULL;
1243
ts = localtime (&(priv->jobs[i].creation_time));
1244
time = g_date_time_new_local (ts->tm_year,
1251
settings = g_settings_new (CLOCK_SCHEMA);
1252
value = g_settings_get_enum (settings, CLOCK_FORMAT_KEY);
1254
if (value == G_DESKTOP_CLOCK_FORMAT_24H)
1255
time_string = g_date_time_format (time, "%k:%M");
1257
time_string = g_date_time_format (time, "%l:%M %p");
1259
g_date_time_unref (time);
1261
switch (priv->jobs[i].state)
1263
case IPP_JOB_PENDING:
1264
/* Translators: Job's state (job is waiting to be printed) */
1265
state = g_strdup (C_("print job", "Pending"));
1268
/* Translators: Job's state (job is held for printing) */
1269
state = g_strdup (C_("print job", "Held"));
1271
case IPP_JOB_PROCESSING:
1272
/* Translators: Job's state (job is currently printing) */
1273
state = g_strdup (C_("print job", "Processing"));
1275
case IPP_JOB_STOPPED:
1276
/* Translators: Job's state (job has been stopped) */
1277
state = g_strdup (C_("print job", "Stopped"));
1279
case IPP_JOB_CANCELED:
1280
/* Translators: Job's state (job has been canceled) */
1281
state = g_strdup (C_("print job", "Canceled"));
1283
case IPP_JOB_ABORTED:
1284
/* Translators: Job's state (job has aborted due to error) */
1285
state = g_strdup (C_("print job", "Aborted"));
1287
case IPP_JOB_COMPLETED:
1288
/* Translators: Job's state (job has completed successfully) */
1289
state = g_strdup (C_("print job", "Completed"));
1293
gtk_list_store_append (store, &iter);
1294
gtk_list_store_set (store, &iter,
1296
JOB_TITLE_COLUMN, priv->jobs[i].title,
1297
JOB_STATE_COLUMN, state,
1298
JOB_CREATION_TIME_COLUMN, time_string,
1301
g_free (time_string);
1305
gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (store));
1306
g_object_unref (store);
1310
job_selection_changed_cb (GtkTreeSelection *selection,
1313
CcPrintersPanelPrivate *priv;
1314
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
1315
GtkTreeModel *model;
1320
priv = PRINTERS_PANEL_PRIVATE (self);
1322
if (gtk_tree_selection_get_selected (selection, &model, &iter))
1323
gtk_tree_model_get (model, &iter,
1329
priv->current_job = id;
1331
if (priv->current_job >= 0 &&
1332
priv->current_job < priv->num_jobs &&
1335
ipp_jstate_t job_state = priv->jobs[priv->current_job].state;
1337
widget = (GtkWidget*)
1338
gtk_builder_get_object (priv->builder, "job-release-button");
1339
gtk_widget_set_sensitive (widget, job_state == IPP_JOB_HELD);
1341
widget = (GtkWidget*)
1342
gtk_builder_get_object (priv->builder, "job-hold-button");
1343
gtk_widget_set_sensitive (widget, job_state == IPP_JOB_PENDING);
1345
widget = (GtkWidget*)
1346
gtk_builder_get_object (priv->builder, "job-cancel-button");
1347
gtk_widget_set_sensitive (widget, job_state < IPP_JOB_CANCELED);
1352
populate_jobs_list (CcPrintersPanel *self)
1355
CcPrintersPanelPrivate *priv;
1356
GtkTreeViewColumn *column;
1357
GtkCellRenderer *renderer;
1358
GtkCellRenderer *title_renderer;
1359
GtkTreeView *treeview;
1361
priv = PRINTERS_PANEL_PRIVATE (self);
1363
actualize_jobs_list (self);
1365
treeview = (GtkTreeView*)
1366
gtk_builder_get_object (priv->builder, "job-treeview");
1368
renderer = gtk_cell_renderer_text_new ();
1369
title_renderer = gtk_cell_renderer_text_new ();
1371
/* Translators: Name of column showing titles of print jobs */
1372
column = gtk_tree_view_column_new_with_attributes (_("Job Title"), title_renderer,
1373
"text", JOB_TITLE_COLUMN, NULL);
1374
g_object_set (G_OBJECT (title_renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
1375
gtk_tree_view_column_set_fixed_width (column, 180);
1376
gtk_tree_view_column_set_min_width (column, 180);
1377
gtk_tree_view_column_set_max_width (column, 180);
1378
gtk_tree_view_append_column (treeview, column);
1380
/* Translators: Name of column showing statuses of print jobs */
1381
column = gtk_tree_view_column_new_with_attributes (_("Job State"), renderer,
1382
"text", JOB_STATE_COLUMN, NULL);
1383
gtk_tree_view_column_set_expand (column, TRUE);
1384
gtk_tree_view_append_column (treeview, column);
1386
/* Translators: Name of column showing times of creation of print jobs */
1387
column = gtk_tree_view_column_new_with_attributes (_("Time"), renderer,
1388
"text", JOB_CREATION_TIME_COLUMN, NULL);
1389
gtk_tree_view_column_set_expand (column, TRUE);
1390
gtk_tree_view_append_column (treeview, column);
1392
g_signal_connect (gtk_tree_view_get_selection (treeview),
1393
"changed", G_CALLBACK (job_selection_changed_cb), self);
1398
ALLOWED_USERS_ID_COLUMN,
1399
ALLOWED_USERS_NAME_COLUMN,
1400
ALLOWED_USERS_N_COLUMNS
1404
actualize_allowed_users_list (CcPrintersPanel *self)
1406
CcPrintersPanelPrivate *priv;
1407
GtkListStore *store;
1408
GtkTreeView *treeview;
1412
priv = PRINTERS_PANEL_PRIVATE (self);
1414
treeview = (GtkTreeView*)
1415
gtk_builder_get_object (priv->builder, "allowed-users-treeview");
1417
if (priv->allowed_users)
1419
for (i = 0; i < priv->num_allowed_users; i++)
1420
g_free (priv->allowed_users[i]);
1421
g_free (priv->allowed_users);
1422
priv->allowed_users = NULL;
1423
priv->num_allowed_users = 0;
1426
priv->current_allowed_user = -1;
1428
if (priv->current_dest >= 0 &&
1429
priv->current_dest < priv->num_dests &&
1430
priv->dests != NULL)
1431
priv->num_allowed_users = ccGetAllowedUsers (&priv->allowed_users, priv->dests[priv->current_dest].name);
1433
store = gtk_list_store_new (ALLOWED_USERS_N_COLUMNS, G_TYPE_INT, G_TYPE_STRING);
1435
for (i = 0; i < priv->num_allowed_users; i++)
1437
gtk_list_store_append (store, &iter);
1438
gtk_list_store_set (store, &iter,
1439
ALLOWED_USERS_ID_COLUMN, i,
1440
ALLOWED_USERS_NAME_COLUMN, priv->allowed_users[i],
1444
gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (store));
1445
g_object_unref (store);
1449
allowed_users_selection_changed_cb (GtkTreeSelection *selection,
1452
CcPrintersPanelPrivate *priv;
1453
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
1454
GtkTreeModel *model;
1458
priv = PRINTERS_PANEL_PRIVATE (self);
1460
if (gtk_tree_selection_get_selected (selection, &model, &iter))
1461
gtk_tree_model_get (model, &iter,
1462
ALLOWED_USERS_ID_COLUMN, &id,
1467
priv->current_allowed_user = id;
1471
populate_allowed_users_list (CcPrintersPanel *self)
1474
CcPrintersPanelPrivate *priv;
1475
GtkTreeViewColumn *column;
1476
GtkCellRenderer *renderer;
1477
GtkTreeView *treeview;
1479
priv = PRINTERS_PANEL_PRIVATE (self);
1481
actualize_allowed_users_list (self);
1483
treeview = (GtkTreeView*)
1484
gtk_builder_get_object (priv->builder, "allowed-users-treeview");
1486
gtk_tree_view_set_headers_visible (treeview, FALSE);
1488
renderer = gtk_cell_renderer_text_new ();
1490
column = gtk_tree_view_column_new_with_attributes (NULL, renderer,
1491
"text", ALLOWED_USERS_NAME_COLUMN, NULL);
1492
gtk_tree_view_append_column (treeview, column);
1494
g_signal_connect (gtk_tree_view_get_selection (treeview),
1495
"changed", G_CALLBACK (allowed_users_selection_changed_cb), self);
1499
job_process_cb (GtkButton *button,
1502
CcPrintersPanelPrivate *priv;
1503
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
1506
GError *error = NULL;
1507
char *ret_error = NULL;
1510
priv = PRINTERS_PANEL_PRIVATE (self);
1512
if (priv->current_job >= 0 &&
1513
priv->current_job < priv->num_jobs &&
1515
id = priv->jobs[priv->current_job].id;
1519
proxy = get_dbus_proxy (MECHANISM_BUS,
1527
if ((GtkButton*) gtk_builder_get_object (priv->builder,
1528
"job-cancel-button") ==
1530
dbus_g_proxy_call (proxy, "JobCancelPurge", &error,
1532
G_TYPE_BOOLEAN, FALSE,
1534
G_TYPE_STRING, &ret_error,
1536
else if ((GtkButton*) gtk_builder_get_object (priv->builder,
1537
"job-hold-button") ==
1539
dbus_g_proxy_call (proxy, "JobSetHoldUntil", &error,
1541
G_TYPE_STRING, "indefinite",
1543
G_TYPE_STRING, &ret_error,
1545
else if ((GtkButton*) gtk_builder_get_object (priv->builder,
1546
"job-release-button") ==
1548
dbus_g_proxy_call (proxy, "JobSetHoldUntil", &error,
1550
G_TYPE_STRING, "no-hold",
1552
G_TYPE_STRING, &ret_error,
1555
g_object_unref (proxy);
1557
if (error || (ret_error && ret_error[0] != '\0'))
1560
g_warning ("%s", error->message);
1562
if (ret_error && ret_error[0] != '\0')
1563
g_warning ("%s", ret_error);
1566
actualize_jobs_list (self);
1568
g_clear_error (&error);
1571
widget = (GtkWidget*)
1572
gtk_builder_get_object (priv->builder, "job-release-button");
1573
gtk_widget_set_sensitive (widget, FALSE);
1575
widget = (GtkWidget*)
1576
gtk_builder_get_object (priv->builder, "job-hold-button");
1577
gtk_widget_set_sensitive (widget, FALSE);
1579
widget = (GtkWidget*)
1580
gtk_builder_get_object (priv->builder, "job-cancel-button");
1581
gtk_widget_set_sensitive (widget, FALSE);
1585
printer_disable_cb (GObject *gobject,
1589
CcPrintersPanelPrivate *priv;
1590
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
1592
gboolean paused = FALSE;
1593
GError *error = NULL;
1594
char *ret_error = NULL;
1598
priv = PRINTERS_PANEL_PRIVATE (self);
1600
if (priv->current_dest >= 0 &&
1601
priv->current_dest < priv->num_dests &&
1602
priv->dests != NULL)
1604
name = priv->dests[priv->current_dest].name;
1606
for (i = 0; i < priv->dests[priv->current_dest].num_options; i++)
1608
if (g_strcmp0 (priv->dests[priv->current_dest].options[i].name, "printer-state") == 0)
1609
paused = (g_strcmp0 (priv->dests[priv->current_dest].options[i].value, "5") == 0);
1615
proxy = get_dbus_proxy (MECHANISM_BUS,
1623
dbus_g_proxy_call (proxy, "PrinterSetEnabled", &error,
1624
G_TYPE_STRING, name,
1625
G_TYPE_BOOLEAN, paused,
1627
G_TYPE_STRING, &ret_error,
1630
g_object_unref (proxy);
1632
if (error || (ret_error && ret_error[0] != '\0'))
1635
g_warning ("%s", error->message);
1637
if (ret_error && ret_error[0] != '\0')
1638
g_warning ("%s", ret_error);
1641
actualize_printers_list (self);
1643
g_clear_error (&error);
1655
markers_cmp (gconstpointer a,
1658
MarkerItem *x = (MarkerItem*) a;
1659
MarkerItem *y = (MarkerItem*) b;
1661
if (x->level < y->level)
1663
else if (x->level == y->level)
1670
rounded_rectangle (cairo_t *cr, double x, double y, double w, double h, double r)
1672
cairo_new_sub_path (cr);
1673
cairo_arc (cr, x + r, y + r, r, M_PI, 3 * M_PI / 2);
1674
cairo_arc (cr, x + w - r, y + r, r, 3 *M_PI / 2, 2 * M_PI);
1675
cairo_arc (cr, x + w - r, y + h - r, r, 0, M_PI / 2);
1676
cairo_arc (cr, x + r, y + h - r, r, M_PI / 2, M_PI);
1677
cairo_close_path (cr);
1681
supply_levels_draw_cb (GtkWidget *widget,
1685
CcPrintersPanelPrivate *priv;
1686
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
1687
GtkStyleContext *context;
1688
gchar *marker_levels = NULL;
1689
gchar *marker_colors = NULL;
1690
gchar *marker_names = NULL;
1691
gchar *marker_types = NULL;
1692
gchar *tooltip_text = NULL;
1697
priv = PRINTERS_PANEL_PRIVATE (self);
1699
width = gtk_widget_get_allocated_width (widget);
1700
height = gtk_widget_get_allocated_height (widget);
1702
cairo_rectangle (cr, 0.0, 0.0, width, height);
1703
gdk_cairo_set_source_rgba (cr, &priv->background_color);
1706
if (priv->current_dest >= 0 &&
1707
priv->current_dest < priv->num_dests &&
1708
priv->dests != NULL)
1710
for (i = 0; i < priv->dests[priv->current_dest].num_options; i++)
1712
if (g_strcmp0 (priv->dests[priv->current_dest].options[i].name, "marker-names") == 0)
1713
marker_names = g_strcompress (priv->dests[priv->current_dest].options[i].value);
1714
else if (g_strcmp0 (priv->dests[priv->current_dest].options[i].name, "marker-levels") == 0)
1715
marker_levels = priv->dests[priv->current_dest].options[i].value;
1716
else if (g_strcmp0 (priv->dests[priv->current_dest].options[i].name, "marker-colors") == 0)
1717
marker_colors = priv->dests[priv->current_dest].options[i].value;
1718
else if (g_strcmp0 (priv->dests[priv->current_dest].options[i].name, "marker-types") == 0)
1719
marker_types = priv->dests[priv->current_dest].options[i].value;
1722
if (marker_levels && marker_colors && marker_names && marker_types)
1724
GdkRGBA border_color = {0.0, 0.0, 0.0, 1.0};
1725
GSList *markers = NULL;
1726
GSList *tmp_list = NULL;
1727
GValue int_val = {0};
1728
gchar **marker_levelsv = NULL;
1729
gchar **marker_colorsv = NULL;
1730
gchar **marker_namesv = NULL;
1731
gchar **marker_typesv = NULL;
1733
gint border_radius = 3;
1735
context = gtk_widget_get_style_context ((GtkWidget *)
1736
gtk_builder_get_object (priv->builder, "printer-options-button"));
1737
gtk_style_context_get_border_color (context, 0, &border_color);
1738
gtk_style_context_get_property (
1739
context, GTK_STYLE_PROPERTY_BORDER_RADIUS, 0, &int_val);
1740
border_radius = g_value_get_int (&int_val);
1742
widget = (GtkWidget*)
1743
gtk_builder_get_object (priv->builder, "supply-drawing-area");
1745
marker_levelsv = g_strsplit (marker_levels, ",", -1);
1746
marker_colorsv = g_strsplit (marker_colors, ",", -1);
1747
marker_namesv = g_strsplit (marker_names, ",", -1);
1748
marker_typesv = g_strsplit (marker_types, ",", -1);
1750
for (i = 0; i < g_strv_length (marker_levelsv); i++)
1754
if (g_strcmp0 (marker_typesv[i], "ink") == 0 ||
1755
g_strcmp0 (marker_typesv[i], "toner") == 0)
1757
marker = g_new0 (MarkerItem, 1);
1758
marker->type = g_strdup (marker_typesv[i]);
1759
marker->name = g_strdup (marker_namesv[i]);
1760
marker->color = g_strdup (marker_colorsv[i]);
1761
marker->level = atoi (marker_levelsv[i]);
1763
markers = g_slist_prepend (markers, marker);
1767
markers = g_slist_sort (markers, markers_cmp);
1769
for (tmp_list = markers; tmp_list; tmp_list = tmp_list->next)
1771
GdkRGBA color = {0.0, 0.0, 0.0, 1.0};
1772
double display_value;
1775
value = ((MarkerItem*) tmp_list->data)->level;
1777
gdk_rgba_parse (&color, ((MarkerItem*) tmp_list->data)->color);
1781
display_value = value / 100.0 * (width - 3.0);
1782
gdk_cairo_set_source_rgba (cr, &color);
1783
rounded_rectangle (cr, 1.5, 1.5, display_value, SUPPLY_BAR_HEIGHT - 3.0, border_radius);
1789
tmp = g_strdup_printf ("%s\n%s",
1791
((MarkerItem*) tmp_list->data)->name);
1792
g_free (tooltip_text);
1797
tooltip_text = g_strdup_printf ("%s",
1798
((MarkerItem*) tmp_list->data)->name);
1801
cairo_set_line_width (cr, 1.0);
1802
gdk_cairo_set_source_rgba (cr, &border_color);
1803
rounded_rectangle (cr, 1.5, 1.5, width - 3.0, SUPPLY_BAR_HEIGHT - 3.0, border_radius);
1806
for (tmp_list = markers; tmp_list; tmp_list = tmp_list->next)
1808
g_free (((MarkerItem*) tmp_list->data)->name);
1809
g_free (((MarkerItem*) tmp_list->data)->type);
1810
g_free (((MarkerItem*) tmp_list->data)->color);
1812
g_slist_free_full (markers, g_free);
1814
g_strfreev (marker_levelsv);
1815
g_strfreev (marker_colorsv);
1816
g_strfreev (marker_namesv);
1817
g_strfreev (marker_typesv);
1820
g_free (marker_names);
1824
gtk_widget_set_tooltip_text (widget, tooltip_text);
1825
g_free (tooltip_text);
1829
gtk_widget_set_tooltip_text (widget, NULL);
1830
gtk_widget_set_has_tooltip (widget, FALSE);
1838
allowed_user_remove_cb (GtkToolButton *button,
1841
CcPrintersPanelPrivate *priv;
1842
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
1844
GError *error = NULL;
1845
char *ret_error = NULL;
1846
char *printer_name = NULL;
1847
char **names = NULL;
1851
priv = PRINTERS_PANEL_PRIVATE (self);
1853
if (priv->current_allowed_user >= 0 &&
1854
priv->current_allowed_user < priv->num_allowed_users &&
1855
priv->allowed_users != NULL)
1856
name = priv->allowed_users[priv->current_allowed_user];
1858
if (priv->current_dest >= 0 &&
1859
priv->current_dest < priv->num_dests &&
1860
priv->dests != NULL)
1861
printer_name = priv->dests[priv->current_dest].name;
1863
if (name && printer_name)
1865
proxy = get_dbus_proxy (MECHANISM_BUS,
1873
names = g_new0 (gchar*, priv->num_allowed_users);
1875
for (i = 0; i < (priv->num_allowed_users); i++)
1877
if (i != priv->current_allowed_user)
1879
names[j] = priv->allowed_users[i];
1884
dbus_g_proxy_call (proxy, "PrinterSetUsersAllowed", &error,
1885
G_TYPE_STRING, printer_name,
1888
G_TYPE_STRING, &ret_error,
1891
g_object_unref (proxy);
1893
if (error || (ret_error && ret_error[0] != '\0'))
1896
g_warning ("%s", error->message);
1898
if (ret_error && ret_error[0] != '\0')
1899
g_warning ("%s", ret_error);
1902
actualize_allowed_users_list (self);
1904
g_clear_error (&error);
1910
allowed_user_add_cb (GtkCellRendererText *renderer,
1915
CcPrintersPanelPrivate *priv;
1916
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
1918
GError *error = NULL;
1919
char *ret_error = NULL;
1920
char *printer_name = NULL;
1921
char **names = NULL;
1924
priv = PRINTERS_PANEL_PRIVATE (self);
1926
g_signal_handlers_disconnect_by_func (G_OBJECT (renderer),
1927
allowed_user_add_cb,
1929
g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL);
1931
if (priv->current_dest >= 0 &&
1932
priv->current_dest < priv->num_dests &&
1933
priv->dests != NULL)
1934
printer_name = priv->dests[priv->current_dest].name;
1936
if (new_text && new_text[0] != '\0' && printer_name)
1938
proxy = get_dbus_proxy (MECHANISM_BUS,
1946
names = g_new0 (char *, priv->num_allowed_users + 2);
1947
for (i = 0; i < (priv->num_allowed_users); i++)
1948
names[i] = priv->allowed_users[i];
1949
names[priv->num_allowed_users] = new_text;
1951
dbus_g_proxy_call (proxy, "PrinterSetUsersAllowed", &error,
1952
G_TYPE_STRING, printer_name,
1955
G_TYPE_STRING, &ret_error,
1958
g_object_unref (proxy);
1960
if (error || (ret_error && ret_error[0] != '\0'))
1963
g_warning ("%s", error->message);
1965
if (ret_error && ret_error[0] != '\0')
1966
g_warning ("%s", ret_error);
1969
g_clear_error (&error);
1973
actualize_allowed_users_list (self);
1977
allowed_user_add_button_cb (GtkToolButton *button,
1980
CcPrintersPanelPrivate *priv;
1981
GtkTreeViewColumn *column;
1982
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
1983
GtkListStore *liststore;
1984
GtkTreeView *treeview;
1989
priv = PRINTERS_PANEL_PRIVATE (self);
1991
treeview = (GtkTreeView*)
1992
gtk_builder_get_object (priv->builder, "allowed-users-treeview");
1994
liststore = (GtkListStore*)
1995
gtk_tree_view_get_model (treeview);
1997
gtk_list_store_prepend (liststore, &iter);
1998
column = gtk_tree_view_get_column (treeview, 0);
1999
path = gtk_tree_model_get_path (GTK_TREE_MODEL (liststore), &iter);
2000
renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
2002
if (column && renderers)
2004
g_signal_connect (G_OBJECT (renderers->data),
2006
G_CALLBACK (allowed_user_add_cb),
2009
g_object_set (renderers->data, "editable", TRUE, NULL);
2010
gtk_widget_grab_focus (GTK_WIDGET (treeview));
2011
gtk_tree_view_set_cursor_on_cell (treeview,
2014
GTK_CELL_RENDERER (renderers->data),
2018
g_list_free (renderers);
2019
gtk_tree_path_free (path);
2023
printer_set_default_cb (GtkToggleButton *button,
2026
CcPrintersPanelPrivate *priv;
2027
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
2029
GError *error = NULL;
2030
char *ret_error = NULL;
2032
const char *cups_server;
2034
priv = PRINTERS_PANEL_PRIVATE (self);
2036
if (priv->current_dest >= 0 &&
2037
priv->current_dest < priv->num_dests &&
2038
priv->dests != NULL)
2039
name = priv->dests[priv->current_dest].name;
2043
cups_server = cupsServer ();
2044
if (g_ascii_strncasecmp (cups_server, "localhost", 9) == 0 ||
2045
g_ascii_strncasecmp (cups_server, "127.0.0.1", 9) == 0 ||
2046
g_ascii_strncasecmp (cups_server, "::1", 3) == 0 ||
2047
cups_server[0] == '/')
2049
/* Clean .cups/lpoptions before setting
2050
* default printer on local CUPS server.
2052
set_local_default_printer (NULL);
2054
proxy = get_dbus_proxy (MECHANISM_BUS,
2062
dbus_g_proxy_call (proxy, "PrinterSetDefault", &error,
2063
G_TYPE_STRING, name,
2065
G_TYPE_STRING, &ret_error,
2068
g_object_unref (proxy);
2070
if (error || (ret_error && ret_error[0] != '\0'))
2073
g_warning ("%s", error->message);
2075
if (ret_error && ret_error[0] != '\0')
2076
g_warning ("%s", ret_error);
2079
actualize_printers_list (self);
2081
g_clear_error (&error);
2084
/* Store default printer to .cups/lpoptions
2085
* if we are connected to a remote CUPS server.
2088
set_local_default_printer (name);
2089
actualize_printers_list (self);
2092
g_signal_handlers_block_by_func (G_OBJECT (button), printer_set_default_cb, self);
2093
gtk_toggle_button_set_active (button, priv->dests[priv->current_dest].is_default);
2094
g_signal_handlers_unblock_by_func (G_OBJECT (button), printer_set_default_cb, self);
2099
new_printer_dialog_response_cb (GtkDialog *dialog,
2103
CcPrintersPanelPrivate *priv;
2104
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
2106
priv = PRINTERS_PANEL_PRIVATE (self);
2108
pp_new_printer_dialog_free (priv->pp_new_printer_dialog);
2109
priv->pp_new_printer_dialog = NULL;
2111
if (response_id == GTK_RESPONSE_OK)
2112
actualize_printers_list (self);
2113
else if (response_id == GTK_RESPONSE_REJECT)
2115
GtkWidget *message_dialog;
2117
message_dialog = gtk_message_dialog_new (NULL,
2121
/* Translators: Addition of the new printer failed. */
2122
_("Failed to add new printer."));
2123
g_signal_connect (message_dialog,
2125
G_CALLBACK (gtk_widget_destroy),
2127
gtk_widget_show (message_dialog);
2132
printer_add_cb (GtkToolButton *toolbutton,
2135
CcPrintersPanelPrivate *priv;
2136
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
2139
priv = PRINTERS_PANEL_PRIVATE (self);
2141
widget = (GtkWidget*)
2142
gtk_builder_get_object (priv->builder, "main-vbox");
2144
priv->pp_new_printer_dialog = pp_new_printer_dialog_new (
2145
GTK_WINDOW (gtk_widget_get_toplevel (widget)),
2146
new_printer_dialog_response_cb,
2151
printer_remove_cb (GtkToolButton *toolbutton,
2154
CcPrintersPanelPrivate *priv;
2155
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
2157
GError *error = NULL;
2158
char *ret_error = NULL;
2161
priv = PRINTERS_PANEL_PRIVATE (self);
2163
if (priv->current_dest >= 0 &&
2164
priv->current_dest < priv->num_dests &&
2165
priv->dests != NULL)
2166
name = priv->dests[priv->current_dest].name;
2170
proxy = get_dbus_proxy (MECHANISM_BUS,
2178
dbus_g_proxy_call (proxy, "PrinterDelete", &error,
2179
G_TYPE_STRING, name,
2181
G_TYPE_STRING, &ret_error,
2184
if (error || (ret_error && ret_error[0] != '\0'))
2187
g_warning ("%s", error->message);
2189
if (ret_error && ret_error[0] != '\0')
2190
g_warning ("%s", ret_error);
2193
actualize_printers_list (self);
2198
test_page_cb (GtkButton *button,
2201
CcPrintersPanelPrivate *priv;
2202
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
2203
cups_ptype_t type = 0;
2204
const gchar *printer_type = NULL;
2205
gchar *printer_name = NULL;
2208
priv = PRINTERS_PANEL_PRIVATE (self);
2210
if (priv->current_dest >= 0 &&
2211
priv->current_dest < priv->num_dests &&
2212
priv->dests != NULL)
2214
printer_name = priv->dests[priv->current_dest].name;
2215
printer_type = cupsGetOption ("printer-type",
2216
priv->dests[priv->current_dest].num_options,
2217
priv->dests[priv->current_dest].options);
2219
type = atoi (printer_type);
2224
const gchar *const dirs[] = { "/usr/share/cups",
2225
"/usr/local/share/cups",
2227
const gchar *testprint[] = { "%s/data/testprint",
2228
"%s/data/testprint.ps",
2230
const gchar **pattern;
2231
const gchar *datadir = NULL;
2232
http_t *http = NULL;
2233
gchar *printer_uri = NULL;
2234
gchar *filename = NULL;
2235
gchar *resource = NULL;
2239
if ((datadir = getenv ("CUPS_DATADIR")) != NULL)
2241
for (pattern = testprint; *pattern != NULL; pattern++)
2243
filename = g_strdup_printf (*pattern, datadir);
2244
if (g_access (filename, R_OK) == 0)
2255
for (i = 0; (datadir = dirs[i]) != NULL && filename == NULL; i++)
2257
for (pattern = testprint; *pattern != NULL; pattern++)
2259
filename = g_strdup_printf (*pattern, datadir);
2260
if (g_access (filename, R_OK) == 0)
2273
if (type & CUPS_PRINTER_CLASS)
2275
printer_uri = g_strdup_printf ("ipp://localhost/classes/%s", printer_name);
2276
resource = g_strdup_printf ("/classes/%s", printer_name);
2280
printer_uri = g_strdup_printf ("ipp://localhost/printers/%s", printer_name);
2281
resource = g_strdup_printf ("/printers/%s", printer_name);
2284
http = httpConnectEncrypt (cupsServer (), ippPort (), cupsEncryption ());
2287
request = ippNewRequest (IPP_PRINT_JOB);
2288
ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_URI,
2289
"printer-uri", NULL, printer_uri);
2290
ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_NAME,
2291
"requesting-user-name", NULL, cupsUser ());
2292
ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_NAME,
2293
/* Translators: Name of job which makes printer to print test page */
2294
"job-name", NULL, _("Test page"));
2295
response = cupsDoFileRequest (http, request, resource, filename);
2300
g_free (printer_uri);
2305
response = execute_maintenance_command (printer_name,
2306
"PrintSelfTestPage",
2307
/* Translators: Name of job which makes printer to print test page */
2313
if (response->state == IPP_ERROR)
2314
g_warning ("An error has occured during printing of test page.");
2315
ippDelete (response);
2321
actualize_sensitivity (gpointer user_data)
2323
CcPrintersPanelPrivate *priv;
2324
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
2325
cups_ptype_t type = 0;
2327
gboolean is_authorized;
2328
gboolean is_discovered = FALSE;
2329
gboolean printer_selected;
2332
priv = PRINTERS_PANEL_PRIVATE (self);
2336
g_permission_get_allowed (G_PERMISSION (priv->permission)) &&
2337
priv->lockdown_settings &&
2338
!g_settings_get_boolean (priv->lockdown_settings, "disable-print-setup");
2340
printer_selected = priv->current_dest >= 0 &&
2341
priv->current_dest < priv->num_dests &&
2342
priv->dests != NULL;
2344
if (printer_selected)
2345
for (i = 0; i < priv->dests[priv->current_dest].num_options; i++)
2347
if (g_strcmp0 (priv->dests[priv->current_dest].options[i].name, "printer-type") == 0)
2349
type = atoi (priv->dests[priv->current_dest].options[i].value);
2350
is_discovered = type & CUPS_PRINTER_DISCOVERED;
2355
widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "printer-add-button");
2356
gtk_widget_set_sensitive (widget, is_authorized);
2358
widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "printer-add-button2");
2359
gtk_widget_set_sensitive (widget, is_authorized);
2361
widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "printer-remove-button");
2362
gtk_widget_set_sensitive (widget, !is_discovered && is_authorized);
2364
widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "printer-disable-switch");
2365
gtk_widget_set_sensitive (widget, is_authorized);
2367
widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "printer-default-check-button");
2368
gtk_widget_set_sensitive (widget, is_authorized);
2370
widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "allowed-user-add-button");
2371
gtk_widget_set_sensitive (widget, is_authorized);
2373
widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "allowed-user-remove-button");
2374
gtk_widget_set_sensitive (widget, is_authorized);
2376
widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "print-test-page-button");
2377
gtk_widget_set_sensitive (widget, printer_selected);
2379
widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "printer-options-button");
2380
gtk_widget_set_sensitive (widget, printer_selected);
2382
widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "printer-jobs-button");
2383
gtk_widget_set_sensitive (widget, printer_selected);
2385
widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "printer-icon");
2386
gtk_widget_set_sensitive (widget, printer_selected);
2390
on_permission_changed (GPermission *permission,
2394
actualize_sensitivity (data);
2398
on_lockdown_settings_changed (GSettings *settings,
2402
CcPrintersPanelPrivate *priv;
2403
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
2405
if (g_str_equal (key, "disable-print-setup") == FALSE)
2408
priv = PRINTERS_PANEL_PRIVATE (self);
2410
gtk_widget_set_sensitive (priv->lock_button,
2411
!g_settings_get_boolean (priv->lockdown_settings, "disable-print-setup"));
2413
on_permission_changed (priv->permission, NULL, user_data);
2417
go_back_cb (GtkButton *button,
2420
CcPrintersPanelPrivate *priv;
2421
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
2424
priv = PRINTERS_PANEL_PRIVATE (self);
2426
widget = (GtkWidget*)
2427
gtk_builder_get_object (priv->builder, "notebook");
2428
gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), NOTEBOOK_INFO_PAGE);
2432
switch_to_jobs_cb (GtkButton *button,
2435
CcPrintersPanelPrivate *priv;
2436
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
2439
priv = PRINTERS_PANEL_PRIVATE (self);
2441
widget = (GtkWidget*)
2442
gtk_builder_get_object (priv->builder, "notebook");
2443
gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), NOTEBOOK_JOBS_PAGE);
2447
switch_to_options_cb (GtkButton *button,
2450
CcPrintersPanelPrivate *priv;
2451
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
2454
priv = PRINTERS_PANEL_PRIVATE (self);
2456
widget = (GtkWidget*)
2457
gtk_builder_get_object (priv->builder, "notebook");
2458
gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), NOTEBOOK_OPTIONS_PAGE);
2462
cc_printers_panel_init (CcPrintersPanel *self)
2464
CcPrintersPanelPrivate *priv;
2465
GtkWidget *top_widget;
2468
GError *error = NULL;
2469
gchar *objects[] = { "main-vbox", NULL };
2470
GtkStyleContext *context;
2472
priv = self->priv = PRINTERS_PANEL_PRIVATE (self);
2474
/* initialize main data structure */
2475
priv->builder = gtk_builder_new ();
2477
priv->dest_model_names = NULL;
2478
priv->ppd_file_names = NULL;
2479
priv->num_dests = 0;
2480
priv->current_dest = -1;
2484
priv->current_job = -1;
2486
priv->allowed_users = NULL;
2487
priv->num_allowed_users = 0;
2488
priv->current_allowed_user = -1;
2490
priv->pp_new_printer_dialog = NULL;
2492
priv->subscription_id = -1;
2493
priv->cups_proxy = NULL;
2494
priv->cups_bus_connection = NULL;
2496
priv->lock_button = NULL;
2497
priv->permission = NULL;
2498
priv->lockdown_settings = NULL;
2500
gtk_builder_add_objects_from_file (priv->builder,
2501
DATADIR"/printers.ui",
2506
/* Translators: The XML file containing user interface can not be loaded */
2507
g_warning (_("Could not load ui: %s"), error->message);
2508
g_error_free (error);
2512
/* add the top level widget */
2513
top_widget = (GtkWidget*)
2514
gtk_builder_get_object (priv->builder, "main-vbox");
2516
/* connect signals */
2517
widget = (GtkWidget*)
2518
gtk_builder_get_object (priv->builder, "job-cancel-button");
2519
g_signal_connect (widget, "clicked", G_CALLBACK (job_process_cb), self);
2521
widget = (GtkWidget*)
2522
gtk_builder_get_object (priv->builder, "job-hold-button");
2523
g_signal_connect (widget, "clicked", G_CALLBACK (job_process_cb), self);
2525
widget = (GtkWidget*)
2526
gtk_builder_get_object (priv->builder, "job-release-button");
2527
g_signal_connect (widget, "clicked", G_CALLBACK (job_process_cb), self);
2529
widget = (GtkWidget*)
2530
gtk_builder_get_object (priv->builder, "printer-add-button");
2531
g_signal_connect (widget, "clicked", G_CALLBACK (printer_add_cb), self);
2533
widget = (GtkWidget*)
2534
gtk_builder_get_object (priv->builder, "printer-add-button2");
2535
g_signal_connect (widget, "clicked", G_CALLBACK (printer_add_cb), self);
2537
widget = (GtkWidget*)
2538
gtk_builder_get_object (priv->builder, "printer-remove-button");
2539
g_signal_connect (widget, "clicked", G_CALLBACK (printer_remove_cb), self);
2541
widget = (GtkWidget*)
2542
gtk_builder_get_object (priv->builder, "printer-disable-switch");
2543
g_signal_connect (widget, "notify::active", G_CALLBACK (printer_disable_cb), self);
2545
widget = (GtkWidget*)
2546
gtk_builder_get_object (priv->builder, "allowed-user-remove-button");
2547
g_signal_connect (widget, "clicked", G_CALLBACK (allowed_user_remove_cb), self);
2549
widget = (GtkWidget*)
2550
gtk_builder_get_object (priv->builder, "allowed-user-add-button");
2551
g_signal_connect (widget, "clicked", G_CALLBACK (allowed_user_add_button_cb), self);
2553
widget = (GtkWidget*)
2554
gtk_builder_get_object (priv->builder, "supply-drawing-area");
2555
g_signal_connect (widget, "draw", G_CALLBACK (supply_levels_draw_cb), self);
2557
widget = (GtkWidget*)
2558
gtk_builder_get_object (priv->builder, "printer-default-check-button");
2559
g_signal_connect (widget, "toggled", G_CALLBACK (printer_set_default_cb), self);
2561
widget = (GtkWidget*)
2562
gtk_builder_get_object (priv->builder, "print-test-page-button");
2563
g_signal_connect (widget, "clicked", G_CALLBACK (test_page_cb), self);
2565
widget = (GtkWidget*)
2566
gtk_builder_get_object (priv->builder, "back-button-1");
2567
g_signal_connect (widget, "clicked", G_CALLBACK (go_back_cb), self);
2569
widget = (GtkWidget*)
2570
gtk_builder_get_object (priv->builder, "back-button-2");
2571
g_signal_connect (widget, "clicked", G_CALLBACK (go_back_cb), self);
2573
widget = (GtkWidget*)
2574
gtk_builder_get_object (priv->builder, "printer-jobs-button");
2575
g_signal_connect (widget, "clicked", G_CALLBACK (switch_to_jobs_cb), self);
2577
widget = (GtkWidget*)
2578
gtk_builder_get_object (priv->builder, "printer-options-button");
2579
g_signal_connect (widget, "clicked", G_CALLBACK (switch_to_options_cb), self);
2581
priv->lockdown_settings = g_settings_new ("org.gnome.desktop.lockdown");
2582
if (priv->lockdown_settings)
2583
g_signal_connect (priv->lockdown_settings,
2585
G_CALLBACK (on_lockdown_settings_changed),
2590
widget = (GtkWidget*)
2591
gtk_builder_get_object (priv->builder, "printers-scrolledwindow");
2592
context = gtk_widget_get_style_context (widget);
2593
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
2595
widget = (GtkWidget*)
2596
gtk_builder_get_object (priv->builder, "printers-toolbar");
2597
context = gtk_widget_get_style_context (widget);
2598
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
2600
widget = (GtkWidget*)
2601
gtk_builder_get_object (priv->builder, "allowed-users-scrolledwindow");
2602
context = gtk_widget_get_style_context (widget);
2603
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
2605
widget = (GtkWidget*)
2606
gtk_builder_get_object (priv->builder, "allowed-users-toolbar");
2607
context = gtk_widget_get_style_context (widget);
2608
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
2610
widget = (GtkWidget*)
2611
gtk_builder_get_object (priv->builder, "queue-scrolledwindow");
2612
context = gtk_widget_get_style_context (widget);
2613
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
2615
widget = (GtkWidget*)
2616
gtk_builder_get_object (priv->builder, "queue-toolbar");
2617
context = gtk_widget_get_style_context (widget);
2618
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
2621
/* Add unlock button */
2622
priv->permission = (GPermission *)polkit_permission_new_sync (
2623
"org.opensuse.cupspkhelper.mechanism.all-edit", NULL, NULL, NULL);
2624
if (priv->permission != NULL)
2626
widget = cc_lock_button_new (priv->permission);
2627
gtk_widget_set_margin_top (widget, 12);
2628
gtk_widget_show (widget);
2629
box = (GtkWidget*) gtk_builder_get_object (priv->builder, "main-vbox");
2630
gtk_box_pack_end (GTK_BOX (box), widget, FALSE, FALSE, 0);
2631
g_signal_connect (priv->permission, "notify",
2632
G_CALLBACK (on_permission_changed), self);
2633
on_permission_changed (priv->permission, NULL, self);
2634
priv->lock_button = widget;
2637
g_warning ("Your system does not have the cups-pk-helper's policy \
2638
\"org.opensuse.cupspkhelper.mechanism.all-edit\" installed. \
2639
Please check your installation");
2642
gtk_style_context_get_background_color (gtk_widget_get_style_context (top_widget),
2643
GTK_STATE_FLAG_NORMAL,
2644
&priv->background_color);
2646
populate_printers_list (self);
2647
populate_jobs_list (self);
2648
populate_allowed_users_list (self);
2649
attach_to_cups_notifier (self);
2651
gtk_container_add (GTK_CONTAINER (self), top_widget);
2652
gtk_widget_show_all (GTK_WIDGET (self));
2656
cc_printers_panel_register (GIOModule *module)
2658
cc_printers_panel_register_type (G_TYPE_MODULE (module));
2659
g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT,
2660
CC_TYPE_PRINTERS_PANEL,