1
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
3
* Copyright (C) 2010 Red Hat, Inc
4
* Copyright (C) 2011 Richard Hughes <richard@hughsie.com>
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
#include <glib/gi18n.h>
30
#include "cc-color-panel.h"
32
#define WID(b, w) (GtkWidget *) gtk_builder_get_object (b, w)
34
CC_PANEL_REGISTER (CcColorPanel, cc_color_panel)
36
#define COLOR_PANEL_PRIVATE(o) \
37
(G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_COLOR_PANEL, CcColorPanelPrivate))
39
struct _CcColorPanelPrivate
42
CdDevice *current_device;
44
GCancellable *cancellable;
48
GtkTreeStore *list_store_devices;
49
GtkWidget *main_window;
53
GCM_PREFS_COLUMN_DEVICE_PATH,
54
GCM_PREFS_COLUMN_SORT,
55
GCM_PREFS_COLUMN_ICON,
56
GCM_PREFS_COLUMN_TITLE,
57
GCM_PREFS_COLUMN_DEVICE,
58
GCM_PREFS_COLUMN_PROFILE,
59
GCM_PREFS_COLUMN_STATUS,
60
GCM_PREFS_COLUMN_STATUS_IMAGE,
61
GCM_PREFS_COLUMN_TOOLTIP,
62
GCM_PREFS_COLUMN_RADIO_ACTIVE,
63
GCM_PREFS_COLUMN_RADIO_VISIBLE,
64
GCM_PREFS_COLUMN_NUM_COLUMNS
68
GCM_PREFS_COMBO_COLUMN_TEXT,
69
GCM_PREFS_COMBO_COLUMN_PROFILE,
70
GCM_PREFS_COMBO_COLUMN_TYPE,
71
GCM_PREFS_COMBO_COLUMN_NUM_COLUMNS
75
GCM_PREFS_ENTRY_TYPE_PROFILE,
76
GCM_PREFS_ENTRY_TYPE_IMPORT
79
#define GCM_SETTINGS_SCHEMA "org.gnome.settings-daemon.plugins.color"
80
#define GCM_SETTINGS_RECALIBRATE_PRINTER_THRESHOLD "recalibrate-printer-threshold"
81
#define GCM_SETTINGS_RECALIBRATE_DISPLAY_THRESHOLD "recalibrate-display-threshold"
83
/* max number of devices and profiles to cause auto-expand at startup */
84
#define GCM_PREFS_MAX_DEVICES_PROFILES_EXPANDED 5
86
static void gcm_prefs_device_add_cb (GtkWidget *widget, CcColorPanel *prefs);
89
gcm_prefs_combobox_add_profile (GtkWidget *widget,
91
GcmPrefsEntryType entry_type,
99
/* iter is optional */
103
/* use description */
104
if (entry_type == GCM_PREFS_ENTRY_TYPE_IMPORT)
106
/* TRANSLATORS: this is where the user can click and import a profile */
107
string = g_string_new (_("Other profileā¦"));
111
string = g_string_new (cd_profile_get_title (profile));
113
/* any source prefix? */
114
id = cd_profile_get_metadata_item (profile,
115
CD_PROFILE_METADATA_DATA_SOURCE);
116
if (g_strcmp0 (id, CD_PROFILE_METADATA_DATA_SOURCE_EDID) == 0)
118
/* TRANSLATORS: this is a profile prefix to signify the
119
* profile has been auto-generated for this hardware */
120
g_string_prepend (string, _("Default: "));
122
#if CD_CHECK_VERSION(0,1,14)
123
if (g_strcmp0 (id, CD_PROFILE_METADATA_DATA_SOURCE_STANDARD) == 0)
125
/* TRANSLATORS: this is a profile prefix to signify the
126
* profile his a standard space like AdobeRGB */
127
g_string_prepend (string, _("Colorspace: "));
129
if (g_strcmp0 (id, CD_PROFILE_METADATA_DATA_SOURCE_TEST) == 0)
131
/* TRANSLATORS: this is a profile prefix to signify the
132
* profile is a test profile */
133
g_string_prepend (string, _("Test profile: "));
138
/* also add profile */
139
model = gtk_combo_box_get_model (GTK_COMBO_BOX(widget));
140
gtk_list_store_append (GTK_LIST_STORE(model), iter);
141
gtk_list_store_set (GTK_LIST_STORE(model), iter,
142
GCM_PREFS_COMBO_COLUMN_TEXT, string->str,
143
GCM_PREFS_COMBO_COLUMN_PROFILE, profile,
144
GCM_PREFS_COMBO_COLUMN_TYPE, entry_type,
146
g_string_free (string, TRUE);
150
gcm_prefs_default_cb (GtkWidget *widget, CcColorPanel *prefs)
154
GError *error = NULL;
155
CcColorPanelPrivate *priv = prefs->priv;
157
/* TODO: check if the profile is already systemwide */
158
profile = cd_device_get_default_profile (priv->current_device);
162
/* install somewhere out of $HOME */
163
ret = cd_profile_install_system_wide_sync (profile,
168
g_warning ("failed to set profile system-wide: %s",
170
g_error_free (error);
175
g_object_unref (profile);
179
gcm_prefs_treeview_popup_menu (CcColorPanel *prefs, GtkWidget *treeview)
181
GtkWidget *menu, *menuitem;
183
menu = gtk_menu_new ();
185
/* TRANSLATORS: this is when the profile should be set for all users */
186
menuitem = gtk_menu_item_new_with_label (_("Set for all users"));
187
g_signal_connect (menuitem, "activate",
188
G_CALLBACK (gcm_prefs_default_cb),
190
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
192
/* TRANSLATORS: this is when the profile should be set for all users */
193
menuitem = gtk_menu_item_new_with_label (_("Create virtual device"));
194
g_signal_connect (menuitem, "activate",
195
G_CALLBACK (gcm_prefs_device_add_cb),
197
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
199
gtk_widget_show_all (menu);
201
/* Note: gdk_event_get_time() accepts a NULL argument */
202
gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 0,
203
gdk_event_get_time (NULL));
207
gcm_prefs_treeview_popup_menu_cb (GtkWidget *treeview, CcColorPanel *prefs)
209
if (prefs->priv->current_device == NULL)
211
gcm_prefs_treeview_popup_menu (prefs, treeview);
212
return TRUE; /* we handled this */
216
gcm_prefs_file_chooser_get_icc_profile (CcColorPanel *prefs)
221
GtkFileFilter *filter;
222
CcColorPanelPrivate *priv = prefs->priv;
224
/* create new dialog */
225
window = GTK_WINDOW(gtk_builder_get_object (priv->builder,
227
/* TRANSLATORS: an ICC profile is a file containing colorspace data */
228
dialog = gtk_file_chooser_dialog_new (_("Select ICC Profile File"), window,
229
GTK_FILE_CHOOSER_ACTION_OPEN,
230
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
231
_("_Import"), GTK_RESPONSE_ACCEPT,
233
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog), g_get_home_dir ());
234
gtk_file_chooser_set_create_folders (GTK_FILE_CHOOSER(dialog), FALSE);
235
gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER(dialog), FALSE);
237
/* setup the filter */
238
filter = gtk_file_filter_new ();
239
gtk_file_filter_add_mime_type (filter, "application/vnd.iccprofile");
241
/* TRANSLATORS: filter name on the file->open dialog */
242
gtk_file_filter_set_name (filter, _("Supported ICC profiles"));
243
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
245
/* setup the all files filter */
246
filter = gtk_file_filter_new ();
247
gtk_file_filter_add_pattern (filter, "*");
248
/* TRANSLATORS: filter name on the file->open dialog */
249
gtk_file_filter_set_name (filter, _("All files"));
250
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
252
/* did user choose file */
253
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
254
file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER(dialog));
257
gtk_widget_destroy (dialog);
259
/* or NULL for missing */
264
gcm_packagekit_finished_cb (GObject *source, GAsyncResult *res, gpointer user_data)
266
GPtrArray *argv = (GPtrArray *)user_data;
268
GError *error = NULL;
271
reply = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), res, &error);
272
g_variant_unref (reply);
276
g_warning ("failed to install required component: %s", error->message);
277
g_ptr_array_unref (argv);
278
g_error_free (error);
282
ret = g_spawn_async (NULL, (gchar**) argv->pdata, NULL, 0,
283
NULL, NULL, NULL, &error);
284
g_ptr_array_unref (argv);
287
g_warning ("failed to run command: %s", error->message);
288
g_error_free (error);
292
struct gcm_packagekit_closure_data
299
gcm_packagekit_proxy_ready_cb (GObject *source, GAsyncResult *res, gpointer user_data)
301
struct gcm_packagekit_closure_data *data =
302
(struct gcm_packagekit_closure_data *)user_data;
303
GDBusProxy *session_installer;
304
GVariantBuilder *builder;
305
GError *error = NULL;
307
session_installer = g_dbus_proxy_new_for_bus_finish (res, &error);
310
g_warning ("failed to connect to PackageKit interface: %s",
312
g_ptr_array_unref (data->argv);
314
g_error_free (error);
318
builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
319
g_variant_builder_add (builder, "s",
320
g_ptr_array_index (data->argv, 0));
321
g_dbus_proxy_call (session_installer,
322
"InstallProvideFiles",
323
g_variant_new ("(uass)",
328
G_DBUS_CALL_FLAGS_NONE,
331
&gcm_packagekit_finished_cb,
335
g_variant_builder_unref (builder);
339
gcm_prefs_install_component (guint xid, GPtrArray *argv)
341
struct gcm_packagekit_closure_data *data;
342
data = g_malloc (sizeof (*data));
345
g_ptr_array_ref (data->argv);
347
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
348
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
349
G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
351
"org.freedesktop.PackageKit",
352
"/org/freedesktop/PackageKit",
353
"org.freedesktop.PackageKit.Modify",
355
&gcm_packagekit_proxy_ready_cb,
360
gcm_prefs_run_maybe_install (guint xid, gchar *filename, GPtrArray *argv)
363
GError *error = NULL;
365
ret = g_spawn_async (NULL, (gchar**) argv->pdata, NULL, 0,
366
NULL, NULL, NULL, &error);
369
if ((error->domain == g_spawn_error_quark ()) &&
370
(error->code == G_SPAWN_ERROR_NOENT))
372
gcm_prefs_install_component (xid, argv);
376
g_warning ("failed to run command: %s", error->message);
378
g_error_free (error);
383
gcm_prefs_calibrate_cb (GtkWidget *widget, CcColorPanel *prefs)
387
gchar *calibrater_filename;
388
CcColorPanelPrivate *priv = prefs->priv;
391
xid = gdk_x11_window_get_xid (gtk_widget_get_window (GTK_WIDGET (priv->main_window)));
393
calibrater_filename = g_build_filename (BINDIR, "gcm-calibrate", NULL);
395
/* run with modal set */
396
argv = g_ptr_array_new_with_free_func (g_free);
397
g_ptr_array_add (argv, calibrater_filename);
398
g_ptr_array_add (argv, g_strdup ("--device"));
399
g_ptr_array_add (argv, g_strdup (cd_device_get_id (priv->current_device)));
400
g_ptr_array_add (argv, g_strdup ("--parent-window"));
401
g_ptr_array_add (argv, g_strdup_printf ("%i", xid));
402
g_ptr_array_add (argv, NULL);
404
gcm_prefs_run_maybe_install (xid, calibrater_filename, argv);
406
g_ptr_array_unref (argv);
410
gcm_prefs_device_add_cb (GtkWidget *widget, CcColorPanel *prefs)
412
CcColorPanelPrivate *priv = prefs->priv;
415
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
417
gtk_widget_show (widget);
418
gtk_window_set_transient_for (GTK_WINDOW (widget),
419
GTK_WINDOW (priv->main_window));
422
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
423
"combobox_virtual_type"));
424
gtk_combo_box_set_active (GTK_COMBO_BOX(widget), 0);
425
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
426
"entry_virtual_model"));
427
gtk_entry_set_text (GTK_ENTRY (widget), "");
428
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
429
"entry_virtual_manufacturer"));
430
gtk_entry_set_text (GTK_ENTRY (widget), "");
434
gcm_prefs_is_profile_suitable_for_device (CdProfile *profile,
437
#if CD_CHECK_VERSION(0,1,14)
438
const gchar *data_source;
440
CdProfileKind profile_kind_tmp;
441
CdProfileKind profile_kind;
442
CdColorspace profile_colorspace;
443
CdColorspace device_colorspace = 0;
444
gboolean ret = FALSE;
445
CdDeviceKind device_kind;
447
/* not the right colorspace */
448
device_colorspace = cd_device_get_colorspace (device);
449
profile_colorspace = cd_profile_get_colorspace (profile);
450
if (device_colorspace != profile_colorspace)
453
/* not the correct kind */
454
device_kind = cd_device_get_kind (device);
455
profile_kind_tmp = cd_profile_get_kind (profile);
456
profile_kind = cd_device_kind_to_profile_kind (device_kind);
457
if (profile_kind_tmp != profile_kind)
460
#if CD_CHECK_VERSION(0,1,14)
461
/* ignore the colorspace profiles */
462
data_source = cd_profile_get_metadata_item (profile,
463
CD_PROFILE_METADATA_DATA_SOURCE);
464
if (g_strcmp0 (data_source, CD_PROFILE_METADATA_DATA_SOURCE_STANDARD) == 0)
475
gcm_prefs_combo_sort_func_cb (GtkTreeModel *model,
485
/* get data from model */
486
gtk_tree_model_get (model, a,
487
GCM_PREFS_COMBO_COLUMN_TYPE, &type_a,
488
GCM_PREFS_COMBO_COLUMN_TEXT, &text_a,
490
gtk_tree_model_get (model, b,
491
GCM_PREFS_COMBO_COLUMN_TYPE, &type_b,
492
GCM_PREFS_COMBO_COLUMN_TEXT, &text_b,
495
/* prefer normal type profiles over the 'Other Profile...' entry */
498
else if (type_a > type_b)
501
retval = g_strcmp0 (text_a, text_b);
509
gcm_prefs_combo_set_default_cb (gpointer user_data)
511
GtkWidget *widget = GTK_WIDGET (user_data);
512
gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
517
gcm_prefs_profile_exists_in_array (GPtrArray *array, CdProfile *profile)
519
CdProfile *profile_tmp;
522
for (i = 0; i < array->len; i++)
524
profile_tmp = g_ptr_array_index (array, i);
525
if (cd_profile_equal (profile, profile_tmp))
532
gcm_prefs_add_profiles_suitable_for_devices (CcColorPanel *prefs,
536
CdProfile *profile_tmp;
538
GError *error = NULL;
539
GPtrArray *profile_array = NULL;
543
CcColorPanelPrivate *priv = prefs->priv;
545
/* clear existing entries */
546
model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
547
gtk_list_store_clear (GTK_LIST_STORE (model));
548
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
549
GCM_PREFS_COMBO_COLUMN_TEXT,
551
gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model),
552
GCM_PREFS_COMBO_COLUMN_TEXT,
553
gcm_prefs_combo_sort_func_cb,
557
profile_array = cd_client_get_profiles_sync (priv->client,
560
if (profile_array == NULL)
562
g_warning ("failed to get profiles: %s",
564
g_error_free (error);
568
/* add profiles of the right kind */
569
for (i = 0; i < profile_array->len; i++)
571
profile_tmp = g_ptr_array_index (profile_array, i);
574
ret = cd_profile_connect_sync (profile_tmp,
579
g_warning ("failed to get profile: %s", error->message);
580
g_error_free (error);
584
/* don't add any of the already added profiles */
585
if (profiles != NULL)
587
if (gcm_prefs_profile_exists_in_array (profiles, profile_tmp))
591
/* only add correct types */
592
ret = gcm_prefs_is_profile_suitable_for_device (profile_tmp,
593
priv->current_device);
597
#if CD_CHECK_VERSION(0,1,13)
598
/* ignore profiles from other user accounts */
599
if (!cd_profile_has_access (profile_tmp))
604
gcm_prefs_combobox_add_profile (widget,
606
GCM_PREFS_ENTRY_TYPE_PROFILE,
610
/* add a import entry */
611
#if CD_CHECK_VERSION(0,1,12)
612
gcm_prefs_combobox_add_profile (widget, NULL, GCM_PREFS_ENTRY_TYPE_IMPORT, NULL);
614
g_idle_add (gcm_prefs_combo_set_default_cb, widget);
616
if (profile_array != NULL)
617
g_ptr_array_unref (profile_array);
621
gcm_prefs_profile_add_cb (GtkWidget *widget, CcColorPanel *prefs)
625
CcColorPanelPrivate *priv = prefs->priv;
627
/* add profiles of the right kind */
628
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
629
"combobox_profile"));
630
profiles = cd_device_get_profiles (priv->current_device);
631
gcm_prefs_add_profiles_suitable_for_devices (prefs, widget, profiles);
634
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
635
"label_assign_title"));
636
switch (cd_device_get_kind (priv->current_device)) {
637
case CD_DEVICE_KIND_DISPLAY:
638
/* TRANSLATORS: this is the dialog title in the 'Add profile' UI */
639
title = _("Available Profiles for Displays");
641
case CD_DEVICE_KIND_SCANNER:
642
/* TRANSLATORS: this is the dialog title in the 'Add profile' UI */
643
title = _("Available Profiles for Scanners");
645
case CD_DEVICE_KIND_PRINTER:
646
/* TRANSLATORS: this is the dialog title in the 'Add profile' UI */
647
title = _("Available Profiles for Printers");
649
case CD_DEVICE_KIND_CAMERA:
650
/* TRANSLATORS: this is the dialog title in the 'Add profile' UI */
651
title = _("Available Profiles for Cameras");
653
case CD_DEVICE_KIND_WEBCAM:
654
/* TRANSLATORS: this is the dialog title in the 'Add profile' UI */
655
title = _("Available Profiles for Webcams");
658
/* TRANSLATORS: this is the dialog title in the 'Add profile' UI
659
* where the device type is not recognised */
660
title = _("Available Profiles");
663
gtk_label_set_label (GTK_LABEL (widget), title);
665
/* show the dialog */
666
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
668
gtk_widget_show (widget);
669
gtk_window_set_transient_for (GTK_WINDOW (widget), GTK_WINDOW (priv->main_window));
670
if (profiles != NULL)
671
g_ptr_array_unref (profiles);
675
gcm_prefs_profile_remove_cb (GtkWidget *widget, CcColorPanel *prefs)
678
GtkTreeSelection *selection;
680
gboolean ret = FALSE;
681
CdProfile *profile = NULL;
682
GError *error = NULL;
683
CcColorPanelPrivate *priv = prefs->priv;
685
/* get the selected row */
686
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
687
"treeview_devices"));
688
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
689
if (!gtk_tree_selection_get_selected (selection, &model, &iter))
692
/* if the profile is default, then we'll have to make the first profile default */
693
gtk_tree_model_get (model, &iter,
694
GCM_PREFS_COLUMN_PROFILE, &profile,
697
/* just remove it, the list store will get ::changed */
698
ret = cd_device_remove_profile_sync (priv->current_device,
704
g_warning ("failed to remove profile: %s", error->message);
705
g_error_free (error);
710
g_object_unref (profile);
715
gcm_prefs_make_profile_default_cb (GObject *object,
719
CdDevice *device = CD_DEVICE (object);
720
gboolean ret = FALSE;
721
GError *error = NULL;
723
ret = cd_device_make_profile_default_finish (device,
728
g_warning ("failed to set default profile on %s: %s",
729
cd_device_get_id (device),
731
g_error_free (error);
736
gcm_prefs_profile_make_default_internal (CcColorPanel *prefs,
738
GtkTreeIter *iter_selected)
742
CcColorPanelPrivate *priv = prefs->priv;
744
/* get currentlt selected item */
745
gtk_tree_model_get (model, iter_selected,
746
GCM_PREFS_COLUMN_DEVICE, &device,
747
GCM_PREFS_COLUMN_PROFILE, &profile,
749
if (profile == NULL || device == NULL)
752
/* just set it default */
753
g_debug ("setting %s default on %s",
754
cd_profile_get_id (profile),
755
cd_device_get_id (device));
756
cd_device_make_profile_default (device,
759
gcm_prefs_make_profile_default_cb,
763
g_object_unref (profile);
765
g_object_unref (device);
769
gcm_prefs_profile_view_cb (GtkWidget *widget, CcColorPanel *prefs)
771
CdProfile *profile = NULL;
774
GtkTreeSelection *selection;
775
gchar *options = NULL;
776
gchar *viewer_filename;
777
GPtrArray *argv = NULL;
779
CcColorPanelPrivate *priv = prefs->priv;
781
/* get the selected row */
782
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
783
"treeview_devices"));
784
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
785
if (!gtk_tree_selection_get_selected (selection, &model, &iter))
786
g_assert_not_reached ();
788
/* get currentlt selected item */
789
gtk_tree_model_get (model, &iter,
790
GCM_PREFS_COLUMN_PROFILE, &profile,
794
xid = gdk_x11_window_get_xid (gtk_widget_get_window (GTK_WIDGET (priv->main_window)));
796
viewer_filename = g_build_filename (BINDIR, "gcm-viewer", NULL);
797
/* open up gcm-viewer as a info pane */
798
argv = g_ptr_array_new_with_free_func (g_free);
799
g_ptr_array_add (argv, viewer_filename);
800
g_ptr_array_add (argv, g_strdup ("--profile"));
801
g_ptr_array_add (argv, g_strdup (cd_profile_get_id (profile)));
802
g_ptr_array_add (argv, g_strdup ("--parent-window"));
803
g_ptr_array_add (argv, g_strdup_printf ("%i", xid));
804
g_ptr_array_add (argv, NULL);
806
gcm_prefs_run_maybe_install (xid, viewer_filename, argv);
808
g_ptr_array_unref (argv);
811
g_object_unref (profile);
815
gcm_prefs_button_assign_cancel_cb (GtkWidget *widget, CcColorPanel *prefs)
817
CcColorPanelPrivate *priv = prefs->priv;
818
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
820
gtk_widget_hide (widget);
824
gcm_prefs_button_assign_ok_cb (GtkWidget *widget, CcColorPanel *prefs)
828
CdProfile *profile = NULL;
829
gboolean ret = FALSE;
830
GError *error = NULL;
831
CcColorPanelPrivate *priv = prefs->priv;
834
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
836
gtk_widget_hide (widget);
839
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
840
"combobox_profile"));
841
ret = gtk_combo_box_get_active_iter (GTK_COMBO_BOX(widget), &iter);
844
model = gtk_combo_box_get_model (GTK_COMBO_BOX(widget));
845
gtk_tree_model_get (model, &iter,
846
GCM_PREFS_COMBO_COLUMN_PROFILE, &profile,
850
g_warning ("failed to get the active profile");
854
/* just add it, the list store will get ::changed */
855
ret = cd_device_add_profile_sync (priv->current_device,
856
CD_DEVICE_RELATION_HARD,
862
g_warning ("failed to add: %s", error->message);
863
g_error_free (error);
867
/* make it default */
868
cd_device_make_profile_default (priv->current_device,
871
gcm_prefs_make_profile_default_cb,
875
g_object_unref (profile);
879
gcm_prefs_profile_delete_event_cb (GtkWidget *widget,
883
gcm_prefs_button_assign_cancel_cb (widget, prefs);
888
gcm_prefs_delete_cb (GtkWidget *widget, CcColorPanel *prefs)
890
gboolean ret = FALSE;
891
GError *error = NULL;
892
CcColorPanelPrivate *priv = prefs->priv;
894
/* try to delete device */
895
ret = cd_client_delete_device_sync (priv->client,
896
priv->current_device,
901
g_warning ("failed to delete device: %s", error->message);
902
g_error_free (error);
907
gcm_prefs_treeview_renderer_toggled (GtkCellRendererToggle *cell,
908
const gchar *path, CcColorPanel *prefs)
913
CcColorPanelPrivate *priv = prefs->priv;
915
model = GTK_TREE_MODEL (priv->list_store_devices);
916
ret = gtk_tree_model_get_iter_from_string (model, &iter, path);
919
gcm_prefs_profile_make_default_internal (prefs, model, &iter);
923
gcm_prefs_add_devices_columns (CcColorPanel *prefs,
924
GtkTreeView *treeview)
926
GtkCellRenderer *renderer;
927
GtkTreeViewColumn *column;
928
CcColorPanelPrivate *priv = prefs->priv;
930
gtk_tree_view_set_headers_visible (treeview, TRUE);
932
/* --- column for device image and device title --- */
933
column = gtk_tree_view_column_new ();
934
gtk_tree_view_column_set_expand (column, TRUE);
935
/* TRANSLATORS: column for device list */
936
gtk_tree_view_column_set_title (column, _("Device"));
939
renderer = gtk_cell_renderer_pixbuf_new ();
940
g_object_set (renderer, "stock-size", GTK_ICON_SIZE_MENU, NULL);
941
gtk_tree_view_column_pack_start (column, renderer, FALSE);
942
gtk_tree_view_column_add_attribute (column, renderer,
943
"icon-name", GCM_PREFS_COLUMN_ICON);
946
renderer = gtk_cell_renderer_toggle_new ();
947
g_signal_connect (renderer, "toggled",
948
G_CALLBACK (gcm_prefs_treeview_renderer_toggled), prefs);
949
g_object_set (renderer, "radio", TRUE, NULL);
950
gtk_tree_view_column_pack_start (column, renderer, FALSE);
951
gtk_tree_view_column_add_attribute (column, renderer,
952
"active", GCM_PREFS_COLUMN_RADIO_ACTIVE);
953
gtk_tree_view_column_add_attribute (column, renderer,
954
"visible", GCM_PREFS_COLUMN_RADIO_VISIBLE);
957
renderer = gtk_cell_renderer_text_new ();
958
gtk_tree_view_column_pack_start (column, renderer, TRUE);
959
gtk_tree_view_column_add_attribute (column, renderer,
960
"markup", GCM_PREFS_COLUMN_TITLE);
961
gtk_tree_view_column_set_expand (column, TRUE);
962
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->list_store_devices),
963
GCM_PREFS_COLUMN_SORT,
964
GTK_SORT_DESCENDING);
965
gtk_tree_view_append_column (treeview, GTK_TREE_VIEW_COLUMN(column));
967
/* --- column for device status --- */
968
column = gtk_tree_view_column_new ();
969
gtk_tree_view_column_set_expand (column, TRUE);
970
/* TRANSLATORS: column for device list */
971
gtk_tree_view_column_set_title (column, _("Calibration"));
974
renderer = gtk_cell_renderer_pixbuf_new ();
975
g_object_set (renderer, "stock-size", GTK_ICON_SIZE_MENU, NULL);
976
gtk_tree_view_column_pack_start (column, renderer, FALSE);
977
gtk_tree_view_column_add_attribute (column, renderer,
978
"icon-name", GCM_PREFS_COLUMN_STATUS_IMAGE);
981
renderer = gtk_cell_renderer_text_new ();
982
gtk_tree_view_column_pack_start (column, renderer, TRUE);
983
gtk_tree_view_column_add_attribute (column, renderer,
984
"markup", GCM_PREFS_COLUMN_STATUS);
985
gtk_tree_view_column_set_expand (column, FALSE);
986
gtk_tree_view_append_column (treeview, GTK_TREE_VIEW_COLUMN(column));
989
gtk_tree_view_set_tooltip_column (treeview,
990
GCM_PREFS_COLUMN_TOOLTIP);
994
gcm_prefs_set_calibrate_button_sensitivity (CcColorPanel *prefs)
996
gboolean ret = FALSE;
998
const gchar *tooltip;
1000
CcColorPanelPrivate *priv = prefs->priv;
1002
/* TRANSLATORS: this is when the button is sensitive */
1003
tooltip = _("Create a color profile for the selected device");
1005
/* no device selected */
1006
if (priv->current_device == NULL)
1009
/* are we a display */
1010
kind = cd_device_get_kind (priv->current_device);
1011
if (kind == CD_DEVICE_KIND_DISPLAY)
1014
/* find whether we have hardware installed */
1015
if (priv->sensor == NULL) {
1016
/* TRANSLATORS: this is when the button is insensitive */
1017
tooltip = _("The measuring instrument is not detected. Please check it is turned on and correctly connected.");
1025
else if (kind == CD_DEVICE_KIND_SCANNER ||
1026
kind == CD_DEVICE_KIND_CAMERA ||
1027
kind == CD_DEVICE_KIND_WEBCAM)
1030
/* TODO: find out if we can scan using gnome-scan */
1034
else if (kind == CD_DEVICE_KIND_PRINTER)
1037
/* find whether we have hardware installed */
1038
if (priv->sensor == NULL)
1040
/* TRANSLATORS: this is when the button is insensitive */
1041
tooltip = _("The measuring instrument is not detected. Please check it is turned on and correctly connected.");
1045
/* find whether we have hardware installed */
1046
ret = cd_sensor_has_cap (priv->sensor, CD_SENSOR_CAP_PRINTER);
1049
/* TRANSLATORS: this is when the button is insensitive */
1050
tooltip = _("The measuring instrument does not support printer profiling.");
1060
/* TRANSLATORS: this is when the button is insensitive */
1061
tooltip = _("The device type is not currently supported.");
1064
/* control the tooltip and sensitivity of the button */
1065
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1066
"toolbutton_device_calibrate"));
1067
gtk_widget_set_tooltip_text (widget, tooltip);
1068
gtk_widget_set_sensitive (widget, ret);
1072
gcm_prefs_device_clicked (CcColorPanel *prefs, CdDevice *device)
1075
CdDeviceMode device_mode;
1076
CcColorPanelPrivate *priv = prefs->priv;
1079
g_assert_not_reached ();
1081
/* get current device */
1082
if (priv->current_device != NULL)
1083
g_object_unref (priv->current_device);
1084
priv->current_device = g_object_ref (device);
1086
/* we have a new device */
1087
g_debug ("selected device is: %s",
1088
cd_device_get_id (device));
1090
/* make sure selectable */
1091
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1092
"combobox_profile"));
1093
gtk_widget_set_sensitive (widget, TRUE);
1095
/* can we delete this device? */
1096
device_mode = cd_device_get_mode (priv->current_device);
1097
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1098
"toolbutton_device_remove"));
1099
gtk_widget_set_visible (widget, device_mode == CD_DEVICE_MODE_VIRTUAL);
1101
/* can this device calibrate */
1102
gcm_prefs_set_calibrate_button_sensitivity (prefs);
1106
gcm_prefs_profile_clicked (CcColorPanel *prefs, CdProfile *profile, CdDevice *device)
1109
CdDeviceRelation relation;
1110
CcColorPanelPrivate *priv = prefs->priv;
1113
g_debug ("selected profile = %s",
1114
cd_profile_get_filename (profile));
1117
/* find the profile relationship */
1118
relation = cd_device_get_profile_relation_sync (device,
1122
/* we can only remove hard relationships */
1123
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1124
"toolbutton_profile_remove"));
1125
if (relation == CD_DEVICE_RELATION_HARD)
1127
gtk_widget_set_tooltip_text (widget, "");
1128
gtk_widget_set_sensitive (widget, TRUE);
1132
/* TRANSLATORS: this is when an auto-added profile cannot be removed */
1133
gtk_widget_set_tooltip_text (widget, _("Cannot remove automatically added profile"));
1134
gtk_widget_set_sensitive (widget, FALSE);
1137
/* allow getting profile info */
1138
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1139
"toolbutton_profile_view"));
1140
gtk_widget_set_sensitive (widget, TRUE);
1142
/* hide device specific stuff */
1143
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1144
"toolbutton_device_remove"));
1145
gtk_widget_set_visible (widget, FALSE);
1149
gcm_prefs_devices_treeview_clicked_cb (GtkTreeSelection *selection,
1150
CcColorPanel *prefs)
1152
GtkTreeModel *model;
1154
CdDevice *device = NULL;
1155
CdProfile *profile = NULL;
1157
CcColorPanelPrivate *priv = prefs->priv;
1160
if (!gtk_tree_selection_get_selected (selection, &model, &iter))
1163
gtk_tree_model_get (model, &iter,
1164
GCM_PREFS_COLUMN_DEVICE, &device,
1165
GCM_PREFS_COLUMN_PROFILE, &profile,
1168
/* device actions */
1170
gcm_prefs_device_clicked (prefs, device);
1171
if (profile != NULL)
1172
gcm_prefs_profile_clicked (prefs, profile, device);
1174
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1175
"toolbutton_device_default"));
1176
gtk_widget_set_visible (widget, profile != NULL);
1178
gtk_widget_set_sensitive (widget, !cd_profile_get_is_system_wide (profile));
1179
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1180
"toolbutton_device_add"));
1181
gtk_widget_set_visible (widget, FALSE);
1182
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1183
"toolbutton_device_calibrate"));
1184
gtk_widget_set_visible (widget, device != NULL);
1185
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1186
"toolbutton_profile_add"));
1187
gtk_widget_set_visible (widget, device != NULL);
1188
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1189
"toolbutton_profile_view"));
1190
gtk_widget_set_visible (widget, profile != NULL);
1191
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1192
"toolbutton_profile_remove"));
1193
gtk_widget_set_visible (widget, profile != NULL);
1195
/* if no buttons then hide toolbar */
1196
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1197
"toolbar_devices"));
1198
gtk_widget_set_visible (widget, profile != NULL || device != NULL);
1201
g_object_unref (device);
1202
if (profile != NULL)
1203
g_object_unref (profile);
1207
gcm_prefs_treeview_row_activated_cb (GtkTreeView *tree_view,
1209
GtkTreeViewColumn *column,
1210
CcColorPanel *prefs)
1212
GtkTreeModel *model;
1215
CcColorPanelPrivate *priv = prefs->priv;
1218
model = GTK_TREE_MODEL (priv->list_store_devices);
1219
ret = gtk_tree_model_get_iter (model, &iter, path);
1223
/* make this profile the default */
1224
gcm_prefs_profile_make_default_internal (prefs, model, &iter);
1227
static const gchar *
1228
gcm_prefs_device_kind_to_sort (CdDeviceKind kind)
1230
if (kind == CD_DEVICE_KIND_DISPLAY)
1232
if (kind == CD_DEVICE_KIND_SCANNER)
1234
if (kind == CD_DEVICE_KIND_CAMERA)
1236
if (kind == CD_DEVICE_KIND_PRINTER)
1242
gcm_device_get_title (CdDevice *device)
1245
const gchar *vendor;
1248
/* try to get a nice string suitable for display */
1249
vendor = cd_device_get_vendor (device);
1250
model = cd_device_get_model (device);
1251
string = g_string_new ("");
1253
if (vendor != NULL && model != NULL)
1255
g_string_append_printf (string, "%s - %s",
1263
g_string_append (string, model);
1270
g_string_append (string, vendor);
1274
/* fallback to id */
1275
g_string_append (string, cd_device_get_id (device));
1277
return g_string_free (string, FALSE);
1281
gcm_prefs_set_combo_simple_text (GtkWidget *combo_box)
1283
GtkCellRenderer *renderer;
1284
GtkListStore *store;
1286
store = gtk_list_store_new (GCM_PREFS_COMBO_COLUMN_NUM_COLUMNS,
1290
gtk_combo_box_set_model (GTK_COMBO_BOX (combo_box),
1291
GTK_TREE_MODEL (store));
1292
g_object_unref (store);
1294
renderer = gtk_cell_renderer_text_new ();
1295
g_object_set (renderer,
1296
"ellipsize", PANGO_ELLIPSIZE_END,
1297
"wrap-mode", PANGO_WRAP_WORD_CHAR,
1299
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), renderer, TRUE);
1300
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), renderer,
1301
"text", GCM_PREFS_COMBO_COLUMN_TEXT,
1306
gcm_prefs_profile_combo_changed_cb (GtkWidget *widget,
1307
CcColorPanel *prefs)
1310
GError *error = NULL;
1312
CdProfile *profile = NULL;
1314
GtkTreeModel *model;
1315
GcmPrefsEntryType entry_type;
1316
CcColorPanelPrivate *priv = prefs->priv;
1319
if (priv->current_device == NULL)
1323
ret = gtk_combo_box_get_active_iter (GTK_COMBO_BOX(widget), &iter);
1328
model = gtk_combo_box_get_model (GTK_COMBO_BOX(widget));
1329
gtk_tree_model_get (model, &iter,
1330
GCM_PREFS_COMBO_COLUMN_TYPE, &entry_type,
1334
if (entry_type == GCM_PREFS_ENTRY_TYPE_IMPORT)
1336
file = gcm_prefs_file_chooser_get_icc_profile (prefs);
1339
g_warning ("failed to get ICC file");
1340
gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
1342
/* if we've got no other existing profiles to choose, then
1343
* just close the assign dialog */
1344
gtk_combo_box_get_active_iter (GTK_COMBO_BOX(widget), &iter);
1345
gtk_tree_model_get (model, &iter,
1346
GCM_PREFS_COMBO_COLUMN_TYPE, &entry_type,
1348
if (entry_type == GCM_PREFS_ENTRY_TYPE_IMPORT)
1350
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
1352
gtk_widget_hide (widget);
1357
#if CD_CHECK_VERSION(0,1,12)
1358
profile = cd_client_import_profile_sync (priv->client,
1362
if (profile == NULL)
1364
g_warning ("failed to get imported profile: %s", error->message);
1365
g_error_free (error);
1370
/* add to combobox */
1371
gtk_list_store_append (GTK_LIST_STORE(model), &iter);
1372
gtk_list_store_set (GTK_LIST_STORE(model), &iter,
1373
GCM_PREFS_COMBO_COLUMN_PROFILE, profile,
1375
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &iter);
1379
g_object_unref (file);
1380
if (profile != NULL)
1381
g_object_unref (profile);
1385
gcm_prefs_sensor_coldplug (CcColorPanel *prefs)
1388
GError *error = NULL;
1390
CcColorPanelPrivate *priv = prefs->priv;
1393
if (priv->sensor != NULL)
1395
g_object_unref (priv->sensor);
1396
priv->sensor = NULL;
1400
sensors = cd_client_get_sensors_sync (priv->client, NULL, &error);
1401
if (sensors == NULL)
1403
g_warning ("%s", error->message);
1404
g_error_free (error);
1407
if (sensors->len == 0)
1410
/* save a copy of the sensor */
1411
priv->sensor = g_object_ref (g_ptr_array_index (sensors, 0));
1413
/* connect to the sensor */
1414
ret = cd_sensor_connect_sync (priv->sensor, NULL, &error);
1417
g_warning ("%s", error->message);
1418
g_error_free (error);
1422
if (sensors != NULL)
1423
g_ptr_array_unref (sensors);
1427
gcm_prefs_client_sensor_changed_cb (CdClient *client,
1429
CcColorPanel *prefs)
1431
gcm_prefs_sensor_coldplug (prefs);
1432
gcm_prefs_set_calibrate_button_sensitivity (prefs);
1435
static const gchar *
1436
gcm_prefs_device_kind_to_icon_name (CdDeviceKind kind)
1439
case CD_DEVICE_KIND_DISPLAY:
1440
return "video-display";
1441
case CD_DEVICE_KIND_SCANNER:
1443
case CD_DEVICE_KIND_PRINTER:
1445
case CD_DEVICE_KIND_CAMERA:
1446
return "camera-photo";
1447
case CD_DEVICE_KIND_WEBCAM:
1448
return "camera-web";
1450
return "image-missing";
1455
gcm_prefs_get_profile_age_as_string (CdProfile *profile)
1459
GString *string = NULL;
1461
if (profile == NULL)
1463
/* TRANSLATORS: this is when there is no profile for the device */
1464
string = g_string_new (_("No profile"));
1468
/* don't show details for EDID, colorspace or test profiles */
1469
id = cd_profile_get_metadata_item (profile,
1470
CD_PROFILE_METADATA_DATA_SOURCE);
1471
if (g_strcmp0 (id, CD_PROFILE_METADATA_DATA_SOURCE_EDID) == 0)
1473
#if CD_CHECK_VERSION(0,1,14)
1474
if (g_strcmp0 (id, CD_PROFILE_METADATA_DATA_SOURCE_STANDARD) == 0)
1476
if (g_strcmp0 (id, CD_PROFILE_METADATA_DATA_SOURCE_TEST) == 0)
1481
age = cd_profile_get_age (profile);
1484
string = g_string_new (NULL);
1487
age /= 60 * 60 * 24;
1488
string = g_string_new ("");
1490
/* approximate years */
1494
g_string_append_printf (string, ngettext (
1501
/* approximate months */
1505
g_string_append_printf (string, ngettext (
1512
/* approximate weeks */
1516
g_string_append_printf (string, ngettext (
1524
g_string_append_printf (string, _("Less than 1 week"));
1530
gcm_prefs_get_profile_created_for_sort (CdProfile *profile)
1533
gchar *string = NULL;
1534
GDateTime *dt = NULL;
1536
/* get profile age */
1537
created = cd_profile_get_created (profile);
1540
dt = g_date_time_new_from_unix_utc (created);
1541
/* note: this is not shown in the UI, just used for sorting */
1542
string = g_date_time_format (dt, "%Y%m%d");
1545
g_date_time_unref (dt);
1550
gcm_prefs_get_profile_title (CcColorPanel *prefs, CdProfile *profile)
1552
CdColorspace colorspace;
1556
GError *error = NULL;
1557
CcColorPanelPrivate *priv = prefs->priv;
1559
g_return_val_if_fail (profile != NULL, NULL);
1563
/* get properties */
1564
ret = cd_profile_connect_sync (profile,
1569
g_warning ("failed to get profile: %s", error->message);
1570
g_error_free (error);
1574
/* add profile description */
1575
title = cd_profile_get_title (profile);
1578
string = g_markup_escape_text (title, -1);
1582
/* some meta profiles do not have ICC profiles */
1583
colorspace = cd_profile_get_colorspace (profile);
1584
if (colorspace == CD_COLORSPACE_RGB)
1586
string = g_strdup (C_("Colorspace fallback", "Default RGB"));
1589
if (colorspace == CD_COLORSPACE_CMYK)
1591
string = g_strdup (C_("Colorspace fallback", "Default CMYK"));
1594
if (colorspace == CD_COLORSPACE_GRAY)
1596
string = g_strdup (C_("Colorspace fallback", "Default Gray"));
1600
/* fall back to ID, ick */
1601
string = g_strdup (cd_profile_get_id (profile));
1607
gcm_prefs_device_remove_profiles_phase1 (CcColorPanel *prefs, GtkTreeIter *parent)
1610
GtkTreeModel *model;
1612
CcColorPanelPrivate *priv = prefs->priv;
1614
/* get first element */
1615
model = GTK_TREE_MODEL (priv->list_store_devices);
1616
ret = gtk_tree_model_iter_children (model, &iter, parent);
1620
/* mark to be removed */
1622
gtk_tree_store_set (priv->list_store_devices, &iter,
1623
GCM_PREFS_COLUMN_DEVICE_PATH, NULL,
1625
} while (gtk_tree_model_iter_next (model, &iter));
1629
gcm_prefs_device_remove_profiles_phase2 (CcColorPanel *prefs, GtkTreeIter *parent)
1632
GtkTreeModel *model;
1635
CcColorPanelPrivate *priv = prefs->priv;
1637
/* get first element */
1638
model = GTK_TREE_MODEL (priv->list_store_devices);
1639
ret = gtk_tree_model_iter_children (model, &iter, parent);
1643
/* remove the other elements */
1646
gtk_tree_model_get (model, &iter,
1647
GCM_PREFS_COLUMN_DEVICE_PATH, &id_tmp,
1650
ret = gtk_tree_store_remove (priv->list_store_devices, &iter);
1652
ret = gtk_tree_model_iter_next (model, &iter);
1657
static GtkTreeIter *
1658
get_iter_for_profile (GtkTreeModel *model, CdProfile *profile, GtkTreeIter *parent)
1663
CdProfile *profile_tmp;
1665
/* get first element */
1666
ret = gtk_tree_model_iter_children (model, &iter, parent);
1670
/* remove the other elements */
1671
id = cd_profile_get_id (profile);
1674
gtk_tree_model_get (model, &iter,
1675
GCM_PREFS_COLUMN_PROFILE, &profile_tmp,
1677
if (g_strcmp0 (id, cd_profile_get_id (profile_tmp)) == 0)
1679
g_object_unref (profile_tmp);
1680
return gtk_tree_iter_copy (&iter);
1682
g_object_unref (profile_tmp);
1683
ret = gtk_tree_model_iter_next (model, &iter);
1690
gcm_prefs_device_set_model_by_iter (CcColorPanel *prefs, CdDevice *device, GtkTreeIter *iter)
1692
GString *status = NULL;
1693
const gchar *status_image = NULL;
1694
const gchar *tooltip = NULL;
1695
CdProfile *profile = NULL;
1697
GPtrArray *profiles = NULL;
1698
CdProfile *profile_tmp;
1703
GtkTreeIter iter_tmp;
1704
GtkTreeIter *iter_tmp_p;
1705
guint threshold = 0;
1707
GError *error = NULL;
1708
CcColorPanelPrivate *priv = prefs->priv;
1711
profile = cd_device_get_default_profile (device);
1712
if (profile == NULL)
1714
status = g_string_new (_("Uncalibrated"));
1715
g_string_prepend (status, "<span foreground='gray'><i>");
1716
g_string_append (status, "</i></span>");
1717
tooltip = _("This device is not color managed.");
1721
/* get properties */
1722
ret = cd_profile_connect_sync (profile,
1727
g_warning ("failed to get profile: %s", error->message);
1728
g_error_free (error);
1732
#if CD_CHECK_VERSION(0,1,13)
1733
/* ignore profiles from other user accounts */
1734
if (!cd_profile_has_access (profile))
1736
/* only print the filename if it exists */
1737
if (cd_profile_get_filename (profile) != NULL)
1739
g_warning ("%s is not usable by this user",
1740
cd_profile_get_filename (profile));
1744
g_warning ("%s is not usable by this user",
1745
cd_profile_get_id (profile));
1751
/* autogenerated printer defaults */
1752
if (cd_device_get_kind (device) == CD_DEVICE_KIND_PRINTER &&
1753
cd_profile_get_filename (profile) == NULL)
1755
status = g_string_new (_("Uncalibrated"));
1756
g_string_prepend (status, "<span foreground='gray'><i>");
1757
g_string_append (status, "</i></span>");
1758
tooltip = _("This device is using manufacturing calibrated data.");
1762
/* autogenerated profiles are crap */
1763
if (cd_profile_get_kind (profile) == CD_PROFILE_KIND_DISPLAY_DEVICE &&
1764
!cd_profile_get_has_vcgt (profile))
1766
status = g_string_new (_("Uncalibrated"));
1767
g_string_prepend (status, "<span foreground='gray'><i>");
1768
g_string_append (status, "</i></span>");
1769
tooltip = _("This device does not have a profile suitable for whole-screen color correction.");
1774
status = gcm_prefs_get_profile_age_as_string (profile);
1777
status = g_string_new (_("Uncalibrated"));
1778
g_string_prepend (status, "<span foreground='gray'><i>");
1779
g_string_append (status, "</i></span>");
1782
/* greater than the calibration threshold for the device type */
1783
age = cd_profile_get_age (profile);
1784
age /= 60 * 60 * 24;
1785
if (cd_device_get_kind (device) == CD_DEVICE_KIND_DISPLAY)
1787
g_settings_get (priv->settings,
1788
GCM_SETTINGS_RECALIBRATE_DISPLAY_THRESHOLD,
1792
else if (cd_device_get_kind (device) == CD_DEVICE_KIND_DISPLAY)
1794
g_settings_get (priv->settings,
1795
GCM_SETTINGS_RECALIBRATE_PRINTER_THRESHOLD,
1799
if (threshold > 0 && age > threshold)
1801
status_image = "dialog-warning-symbolic";
1802
tooltip = _("This device has an old profile that may no longer be accurate.");
1806
gtk_tree_store_set (priv->list_store_devices, iter,
1807
GCM_PREFS_COLUMN_STATUS, status->str,
1808
GCM_PREFS_COLUMN_STATUS_IMAGE, status_image,
1809
GCM_PREFS_COLUMN_TOOLTIP, tooltip,
1812
/* remove old profiles */
1813
gcm_prefs_device_remove_profiles_phase1 (prefs, iter);
1816
profiles = cd_device_get_profiles (device);
1817
if (profiles == NULL)
1819
for (i = 0; i < profiles->len; i++)
1821
profile_tmp = g_ptr_array_index (profiles, i);
1822
title_tmp = gcm_prefs_get_profile_title (prefs, profile_tmp);
1824
/* get profile age */
1825
date_tmp = gcm_prefs_get_profile_age_as_string (profile_tmp);
1826
if (date_tmp == NULL)
1828
/* TRANSLATORS: this is when the calibration profile age is not
1829
* specified as it has been autogenerated from the hardware */
1830
date_tmp = g_string_new (_("Not specified"));
1831
g_string_prepend (date_tmp, "<span foreground='gray'><i>");
1832
g_string_append (date_tmp, "</i></span>");
1834
sort_tmp = gcm_prefs_get_profile_created_for_sort (profile_tmp);
1836
/* get an existing profile, or create a new one */
1837
iter_tmp_p = get_iter_for_profile (GTK_TREE_MODEL (priv->list_store_devices),
1839
if (iter_tmp_p == NULL)
1840
gtk_tree_store_append (priv->list_store_devices, &iter_tmp, iter);
1842
gtk_tree_store_set (priv->list_store_devices, iter_tmp_p ? iter_tmp_p : &iter_tmp,
1843
GCM_PREFS_COLUMN_DEVICE, device,
1844
GCM_PREFS_COLUMN_PROFILE, profile_tmp,
1845
GCM_PREFS_COLUMN_DEVICE_PATH, cd_device_get_object_path (device),
1846
GCM_PREFS_COLUMN_SORT, sort_tmp,
1847
GCM_PREFS_COLUMN_STATUS, date_tmp->str,
1848
GCM_PREFS_COLUMN_TITLE, title_tmp,
1849
GCM_PREFS_COLUMN_RADIO_VISIBLE, TRUE,
1850
GCM_PREFS_COLUMN_RADIO_ACTIVE, i==0,
1852
if (iter_tmp_p != NULL)
1853
gtk_tree_iter_free (iter_tmp_p);
1856
g_string_free (date_tmp, TRUE);
1859
/* remove old profiles that no longer exist */
1860
gcm_prefs_device_remove_profiles_phase2 (prefs, iter);
1863
g_string_free (status, TRUE);
1864
if (profiles != NULL)
1865
g_ptr_array_unref (profiles);
1866
if (profile != NULL)
1867
g_object_unref (profile);
1871
gcm_prefs_device_changed_cb (CdDevice *device, CcColorPanel *prefs)
1877
GtkTreeModel *model;
1878
CcColorPanelPrivate *priv = prefs->priv;
1880
/* get first element */
1881
model = GTK_TREE_MODEL (priv->list_store_devices);
1882
ret = gtk_tree_model_get_iter_first (model, &iter);
1886
/* get the other elements */
1887
id = cd_device_get_object_path (device);
1890
gtk_tree_model_get (model, &iter,
1891
GCM_PREFS_COLUMN_DEVICE_PATH, &id_tmp,
1893
if (g_strcmp0 (id_tmp, id) == 0)
1895
/* populate device */
1896
gcm_prefs_device_set_model_by_iter (prefs, device, &iter);
1899
} while (gtk_tree_model_iter_next (model, &iter));
1903
gcm_prefs_add_device (CcColorPanel *prefs, CdDevice *device)
1906
GError *error = NULL;
1908
const gchar *icon_name;
1911
gchar *title = NULL;
1913
CcColorPanelPrivate *priv = prefs->priv;
1916
/* get device properties */
1917
ret = cd_device_connect_sync (device, priv->cancellable, &error);
1920
g_warning ("failed to connect to the device: %s", error->message);
1921
g_error_free (error);
1926
kind = cd_device_get_kind (device);
1927
icon_name = gcm_prefs_device_kind_to_icon_name (kind);
1929
/* italic for non-connected devices */
1930
title = gcm_device_get_title (device);
1932
/* create sort order */
1933
sort = g_strdup_printf ("%s%s",
1934
gcm_prefs_device_kind_to_sort (kind),
1937
/* watch for changes to update the status icons */
1938
g_signal_connect (device, "changed",
1939
G_CALLBACK (gcm_prefs_device_changed_cb), prefs);
1942
id = cd_device_get_object_path (device);
1943
g_debug ("add %s to device list", id);
1944
gtk_tree_store_append (priv->list_store_devices, &parent, NULL);
1945
gtk_tree_store_set (priv->list_store_devices, &parent,
1946
GCM_PREFS_COLUMN_DEVICE, device,
1947
GCM_PREFS_COLUMN_DEVICE_PATH, id,
1948
GCM_PREFS_COLUMN_SORT, sort,
1949
GCM_PREFS_COLUMN_TITLE, title,
1950
GCM_PREFS_COLUMN_ICON, icon_name,
1952
gcm_prefs_device_set_model_by_iter (prefs, device, &parent);
1959
gcm_prefs_remove_device (CcColorPanel *prefs, CdDevice *cd_device)
1962
GtkTreeModel *model;
1966
CdDevice *device_tmp;
1967
CcColorPanelPrivate *priv = prefs->priv;
1970
id = cd_device_get_object_path (cd_device);
1972
/* get first element */
1973
model = GTK_TREE_MODEL (priv->list_store_devices);
1974
ret = gtk_tree_model_get_iter_first (model, &iter);
1978
/* get the other elements */
1981
gtk_tree_model_get (model, &iter,
1982
GCM_PREFS_COLUMN_DEVICE_PATH, &id_tmp,
1984
if (g_strcmp0 (id_tmp, id) == 0)
1986
gtk_tree_model_get (model, &iter,
1987
GCM_PREFS_COLUMN_DEVICE, &device_tmp,
1989
g_signal_handlers_disconnect_by_func (device_tmp,
1990
G_CALLBACK (gcm_prefs_device_changed_cb),
1992
gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
1994
g_object_unref (device_tmp);
1998
} while (gtk_tree_model_iter_next (model, &iter));
2002
gcm_prefs_update_device_list_extra_entry (CcColorPanel *prefs)
2004
CcColorPanelPrivate *priv = prefs->priv;
2007
gchar *title = NULL;
2010
/* select the first device */
2011
ret = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->list_store_devices), &iter);
2014
/* add the 'No devices detected' entry */
2015
title = g_strdup_printf ("<i>%s</i>", _("No devices supporting color management detected"));
2016
gtk_tree_store_append (priv->list_store_devices, &iter, NULL);
2017
gtk_tree_store_set (priv->list_store_devices, &iter,
2018
GCM_PREFS_COLUMN_RADIO_VISIBLE, FALSE,
2019
GCM_PREFS_COLUMN_TITLE, title,
2025
/* remove the 'No devices detected' entry */
2028
gtk_tree_model_get (GTK_TREE_MODEL (priv->list_store_devices), &iter,
2029
GCM_PREFS_COLUMN_DEVICE_PATH, &id_tmp,
2033
gtk_tree_store_remove (priv->list_store_devices, &iter);
2037
} while (gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->list_store_devices), &iter));
2041
gcm_prefs_device_added_cb (CdClient *client,
2043
CcColorPanel *prefs)
2045
/* add the device */
2046
gcm_prefs_add_device (prefs, device);
2048
/* ensure we're not showing the 'No devices detected' entry */
2049
gcm_prefs_update_device_list_extra_entry (prefs);
2053
gcm_prefs_changed_cb (CdClient *client,
2055
CcColorPanel *prefs)
2057
g_debug ("changed: %s (doing nothing)", cd_device_get_id (device));
2061
gcm_prefs_device_removed_cb (CdClient *client,
2063
CcColorPanel *prefs)
2066
GtkTreeSelection *selection;
2069
CcColorPanelPrivate *priv = prefs->priv;
2071
/* remove from the UI */
2072
gcm_prefs_remove_device (prefs, device);
2074
/* ensure we showing the 'No devices detected' entry if required */
2075
gcm_prefs_update_device_list_extra_entry (prefs);
2077
/* select the first device */
2078
ret = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->list_store_devices), &iter);
2083
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2084
"treeview_devices"));
2085
gtk_tree_view_set_model (GTK_TREE_VIEW (widget),
2086
GTK_TREE_MODEL (priv->list_store_devices));
2087
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
2088
gtk_tree_selection_select_iter (selection, &iter);
2092
gcm_prefs_tree_model_count_cb (GtkTreeModel *model,
2097
guint *i = (guint *) user_data;
2103
gcm_prefs_get_devices_cb (GObject *object,
2107
CcColorPanel *prefs = (CcColorPanel *) user_data;
2108
CdClient *client = CD_CLIENT (object);
2110
GError *error = NULL;
2115
guint devices_and_profiles = 0;
2116
CcColorPanelPrivate *priv = prefs->priv;
2118
/* get devices and add them */
2119
devices = cd_client_get_devices_finish (client, res, &error);
2120
if (devices == NULL)
2122
g_warning ("failed to add connected devices: %s",
2124
g_error_free (error);
2127
for (i = 0; i < devices->len; i++)
2129
device = g_ptr_array_index (devices, i);
2130
gcm_prefs_add_device (prefs, device);
2133
/* ensure we show the 'No devices detected' entry if empty */
2134
gcm_prefs_update_device_list_extra_entry (prefs);
2136
/* set the cursor on the first device */
2137
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2138
"treeview_devices"));
2139
path = gtk_tree_path_new_from_string ("0");
2140
gtk_tree_view_set_cursor (GTK_TREE_VIEW (widget), path, NULL, FALSE);
2141
gtk_tree_path_free (path);
2143
/* if we have only a few devices and profiles expand the treeview
2144
* devices so they can all be seen */
2145
gtk_tree_model_foreach (GTK_TREE_MODEL (priv->list_store_devices),
2146
gcm_prefs_tree_model_count_cb,
2147
&devices_and_profiles);
2148
if (devices_and_profiles <= GCM_PREFS_MAX_DEVICES_PROFILES_EXPANDED)
2149
gtk_tree_view_expand_all (GTK_TREE_VIEW (widget));
2152
if (devices != NULL)
2153
g_ptr_array_unref (devices);
2157
gcm_prefs_button_virtual_add_cb (GtkWidget *widget, CcColorPanel *prefs)
2159
CdDeviceKind device_kind;
2162
const gchar *manufacturer;
2164
GError *error = NULL;
2165
GHashTable *device_props;
2166
CcColorPanelPrivate *priv = prefs->priv;
2168
/* get device details */
2169
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2170
"combobox_virtual_type"));
2171
device_kind = gtk_combo_box_get_active (GTK_COMBO_BOX(widget)) + 2;
2172
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2173
"entry_virtual_model"));
2174
model = gtk_entry_get_text (GTK_ENTRY (widget));
2175
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2176
"entry_virtual_manufacturer"));
2177
manufacturer = gtk_entry_get_text (GTK_ENTRY (widget));
2180
device_id = g_strdup_printf ("%s-%s-%s",
2181
cd_device_kind_to_string (device_kind),
2184
device_props = g_hash_table_new_full (g_str_hash, g_str_equal,
2186
g_hash_table_insert (device_props,
2188
g_strdup (cd_device_kind_to_string (device_kind)));
2189
g_hash_table_insert (device_props,
2191
g_strdup (cd_device_mode_to_string (CD_DEVICE_MODE_VIRTUAL)));
2192
g_hash_table_insert (device_props,
2193
g_strdup ("Colorspace"),
2194
g_strdup (cd_colorspace_to_string (CD_COLORSPACE_RGB)));
2195
g_hash_table_insert (device_props,
2198
g_hash_table_insert (device_props,
2199
g_strdup ("Vendor"),
2200
g_strdup (manufacturer));
2201
device = cd_client_create_device_sync (priv->client,
2203
CD_OBJECT_SCOPE_DISK,
2209
g_warning ("Failed to add create virtual device: %s",
2211
g_error_free (error);
2215
g_hash_table_unref (device_props);
2216
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2218
gtk_widget_hide (widget);
2223
gcm_prefs_button_virtual_cancel_cb (GtkWidget *widget, CcColorPanel *prefs)
2225
CcColorPanelPrivate *priv = prefs->priv;
2226
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2228
gtk_widget_hide (widget);
2232
gcm_prefs_virtual_delete_event_cb (GtkWidget *widget,
2234
CcColorPanel *prefs)
2236
gcm_prefs_button_virtual_cancel_cb (widget, prefs);
2240
static const gchar *
2241
cd_device_kind_to_localised_string (CdDeviceKind device_kind)
2243
if (device_kind == CD_DEVICE_KIND_DISPLAY)
2244
return C_("Device kind", "Display");
2245
if (device_kind == CD_DEVICE_KIND_SCANNER)
2246
return C_("Device kind", "Scanner");
2247
if (device_kind == CD_DEVICE_KIND_PRINTER)
2248
return C_("Device kind", "Printer");
2249
if (device_kind == CD_DEVICE_KIND_CAMERA)
2250
return C_("Device kind", "Camera");
2251
if (device_kind == CD_DEVICE_KIND_WEBCAM)
2252
return C_("Device kind", "Webcam");
2257
gcm_prefs_setup_virtual_combobox (GtkWidget *widget)
2262
for (i=CD_DEVICE_KIND_SCANNER; i<CD_DEVICE_KIND_LAST; i++)
2264
text = cd_device_kind_to_localised_string (i);
2267
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(widget), text);
2269
gtk_combo_box_set_active (GTK_COMBO_BOX (widget), CD_DEVICE_KIND_PRINTER - 2);
2273
gcm_prefs_virtual_set_from_file (CcColorPanel *prefs, GFile *file)
2275
/* TODO: use GCM to get the EXIF data */
2280
gcm_prefs_virtual_drag_data_received_cb (GtkWidget *widget,
2281
GdkDragContext *context,
2283
GtkSelectionData *data,
2286
CcColorPanel *prefs)
2288
const guchar *filename;
2289
gchar **filenames = NULL;
2295
filename = gtk_selection_data_get_data (data);
2296
if (filename == NULL)
2298
gtk_drag_finish (context, FALSE, FALSE, _time);
2303
g_debug ("dropped: %p (%s)", data, filename);
2305
/* split, as multiple drag targets are accepted */
2306
filenames = g_strsplit_set ((const gchar *)filename, "\r\n", -1);
2307
for (i = 0; filenames[i] != NULL; i++)
2310
if (filenames[i][0] == '\0')
2313
/* check this is a parsable file */
2314
g_debug ("trying to set %s", filenames[i]);
2315
file = g_file_new_for_uri (filenames[i]);
2316
ret = gcm_prefs_virtual_set_from_file (prefs, file);
2319
g_debug ("%s did not set from file correctly",
2321
gtk_drag_finish (context, FALSE, FALSE, _time);
2324
g_object_unref (file);
2328
gtk_drag_finish (context, TRUE, FALSE, _time);
2331
g_object_unref (file);
2332
g_strfreev (filenames);
2336
gcm_prefs_setup_drag_and_drop (GtkWidget *widget)
2338
GtkTargetEntry entry;
2340
/* setup a dummy entry */
2341
entry.target = g_strdup ("text/plain");
2342
entry.flags = GTK_TARGET_OTHER_APP;
2345
gtk_drag_dest_set (widget,
2346
GTK_DEST_DEFAULT_ALL,
2349
GDK_ACTION_MOVE | GDK_ACTION_COPY);
2350
g_free (entry.target);
2354
gcm_prefs_connect_cb (GObject *object,
2359
GError *error = NULL;
2360
CcColorPanel *prefs = CC_COLOR_PANEL (user_data);
2361
CcColorPanelPrivate *priv = prefs->priv;
2363
ret = cd_client_connect_finish (priv->client,
2368
g_warning ("failed to connect to colord: %s", error->message);
2369
g_error_free (error);
2373
/* set calibrate button sensitivity */
2374
gcm_prefs_sensor_coldplug (prefs);
2378
cd_client_get_devices (priv->client,
2380
gcm_prefs_get_devices_cb,
2385
gcm_prefs_window_realize_cb (GtkWidget *widget, CcColorPanel *prefs)
2387
prefs->priv->main_window = gtk_widget_get_toplevel (widget);
2391
cc_color_panel_get_help_uri (CcPanel *panel)
2393
if (!g_strcmp0(g_getenv("XDG_CURRENT_DESKTOP"), "Unity"))
2394
return "help:ubuntu-help/color";
2396
return "help:gnome-help/color";
2400
cc_color_panel_get_property (GObject *object,
2405
switch (property_id)
2408
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
2413
cc_color_panel_set_property (GObject *object,
2415
const GValue *value,
2418
switch (property_id)
2421
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
2426
cc_color_panel_dispose (GObject *object)
2428
CcColorPanelPrivate *priv = CC_COLOR_PANEL (object)->priv;
2432
g_object_unref (priv->settings);
2433
priv->settings = NULL;
2435
if (priv->cancellable != NULL)
2437
g_cancellable_cancel (priv->cancellable);
2438
g_object_unref (priv->cancellable);
2439
priv->cancellable = NULL;
2441
if (priv->builder != NULL)
2443
g_object_unref (priv->builder);
2444
priv->builder = NULL;
2446
if (priv->client != NULL)
2448
g_object_unref (priv->client);
2449
priv->client = NULL;
2451
if (priv->current_device != NULL)
2453
g_object_unref (priv->current_device);
2454
priv->current_device = NULL;
2456
if (priv->sensor != NULL)
2458
g_object_unref (priv->sensor);
2459
priv->sensor = NULL;
2462
G_OBJECT_CLASS (cc_color_panel_parent_class)->dispose (object);
2466
cc_color_panel_finalize (GObject *object)
2468
G_OBJECT_CLASS (cc_color_panel_parent_class)->finalize (object);
2472
cc_color_panel_class_init (CcColorPanelClass *klass)
2474
GObjectClass *object_class = G_OBJECT_CLASS (klass);
2475
CcPanelClass *panel_class = CC_PANEL_CLASS (klass);
2477
g_type_class_add_private (klass, sizeof (CcColorPanelPrivate));
2479
panel_class->get_help_uri = cc_color_panel_get_help_uri;
2481
object_class->get_property = cc_color_panel_get_property;
2482
object_class->set_property = cc_color_panel_set_property;
2483
object_class->dispose = cc_color_panel_dispose;
2484
object_class->finalize = cc_color_panel_finalize;
2488
cc_color_panel_init (CcColorPanel *prefs)
2490
CcColorPanelPrivate *priv;
2491
GError *error = NULL;
2492
GtkStyleContext *context;
2493
GtkTreeSelection *selection;
2496
priv = prefs->priv = COLOR_PANEL_PRIVATE (prefs);
2498
priv->builder = gtk_builder_new ();
2499
gtk_builder_add_from_file (priv->builder,
2500
GNOMECC_UI_DIR "/color.ui",
2505
g_warning ("Could not load interface file: %s", error->message);
2506
g_error_free (error);
2510
priv->cancellable = g_cancellable_new ();
2512
/* setup defaults */
2513
priv->settings = g_settings_new (GCM_SETTINGS_SCHEMA);
2515
/* create list stores */
2516
priv->list_store_devices = gtk_tree_store_new (GCM_PREFS_COLUMN_NUM_COLUMNS,
2529
/* assign buttons */
2530
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2531
"toolbutton_profile_add"));
2532
g_signal_connect (widget, "clicked",
2533
G_CALLBACK (gcm_prefs_profile_add_cb), prefs);
2534
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2535
"toolbutton_profile_remove"));
2536
g_signal_connect (widget, "clicked",
2537
G_CALLBACK (gcm_prefs_profile_remove_cb), prefs);
2538
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2539
"toolbutton_profile_view"));
2540
g_signal_connect (widget, "clicked",
2541
G_CALLBACK (gcm_prefs_profile_view_cb), prefs);
2543
/* create device tree view */
2544
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2545
"treeview_devices"));
2546
gtk_tree_view_set_model (GTK_TREE_VIEW (widget),
2547
GTK_TREE_MODEL (priv->list_store_devices));
2548
gtk_tree_view_set_enable_tree_lines (GTK_TREE_VIEW (widget), TRUE);
2549
gtk_tree_view_set_level_indentation (GTK_TREE_VIEW (widget), 0);
2550
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
2551
g_signal_connect (selection, "changed",
2552
G_CALLBACK (gcm_prefs_devices_treeview_clicked_cb),
2554
g_signal_connect (GTK_TREE_VIEW (widget), "row-activated",
2555
G_CALLBACK (gcm_prefs_treeview_row_activated_cb),
2557
g_signal_connect (GTK_TREE_VIEW (widget), "popup-menu",
2558
G_CALLBACK (gcm_prefs_treeview_popup_menu_cb),
2561
/* add columns to the tree view */
2562
gcm_prefs_add_devices_columns (prefs, GTK_TREE_VIEW (widget));
2564
/* force to be at least ~6 rows high */
2565
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2566
"scrolledwindow_devices"));
2567
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (widget),
2570
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2571
"toolbutton_device_default"));
2572
g_signal_connect (widget, "clicked",
2573
G_CALLBACK (gcm_prefs_default_cb), prefs);
2574
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2575
"toolbutton_device_remove"));
2576
g_signal_connect (widget, "clicked",
2577
G_CALLBACK (gcm_prefs_delete_cb), prefs);
2578
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2579
"toolbutton_device_add"));
2580
g_signal_connect (widget, "clicked",
2581
G_CALLBACK (gcm_prefs_device_add_cb), prefs);
2582
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2583
"toolbutton_device_calibrate"));
2584
g_signal_connect (widget, "clicked",
2585
G_CALLBACK (gcm_prefs_calibrate_cb), prefs);
2587
/* make devices toolbar sexy */
2588
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2589
"scrolledwindow_devices"));
2590
context = gtk_widget_get_style_context (widget);
2591
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
2593
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2594
"toolbar_devices"));
2595
context = gtk_widget_get_style_context (widget);
2596
gtk_style_context_add_class (context, GTK_STYLE_CLASS_INLINE_TOOLBAR);
2597
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
2599
/* set up virtual dialog */
2600
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2602
g_signal_connect (widget, "delete-event",
2603
G_CALLBACK (gcm_prefs_virtual_delete_event_cb),
2605
g_signal_connect (widget, "drag-data-received",
2606
G_CALLBACK (gcm_prefs_virtual_drag_data_received_cb),
2608
gcm_prefs_setup_drag_and_drop (widget);
2610
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2611
"button_virtual_add"));
2612
g_signal_connect (widget, "clicked",
2613
G_CALLBACK (gcm_prefs_button_virtual_add_cb),
2616
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2617
"button_virtual_cancel"));
2618
g_signal_connect (widget, "clicked",
2619
G_CALLBACK (gcm_prefs_button_virtual_cancel_cb),
2621
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2622
"combobox_virtual_type"));
2623
gcm_prefs_setup_virtual_combobox (widget);
2625
/* set up assign dialog */
2626
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2628
g_signal_connect (widget, "delete-event",
2629
G_CALLBACK (gcm_prefs_profile_delete_event_cb), prefs);
2630
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2631
"button_assign_cancel"));
2632
g_signal_connect (widget, "clicked",
2633
G_CALLBACK (gcm_prefs_button_assign_cancel_cb), prefs);
2634
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2635
"button_assign_ok"));
2636
g_signal_connect (widget, "clicked",
2637
G_CALLBACK (gcm_prefs_button_assign_ok_cb), prefs);
2639
/* setup icc profiles list */
2640
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
2641
"combobox_profile"));
2642
gcm_prefs_set_combo_simple_text (widget);
2643
gtk_widget_set_sensitive (widget, FALSE);
2644
g_signal_connect (G_OBJECT (widget), "changed",
2645
G_CALLBACK (gcm_prefs_profile_combo_changed_cb), prefs);
2647
/* use a device client array */
2648
priv->client = cd_client_new ();
2649
g_signal_connect_object (priv->client, "device-added",
2650
G_CALLBACK (gcm_prefs_device_added_cb), prefs, 0);
2651
g_signal_connect_object (priv->client, "device-removed",
2652
G_CALLBACK (gcm_prefs_device_removed_cb), prefs, 0);
2653
g_signal_connect_object (priv->client, "changed",
2654
G_CALLBACK (gcm_prefs_changed_cb), prefs, 0);
2656
/* connect to colord */
2657
cd_client_connect (priv->client,
2659
gcm_prefs_connect_cb,
2662
/* use the color sensor */
2663
g_signal_connect_object (priv->client, "sensor-added",
2664
G_CALLBACK (gcm_prefs_client_sensor_changed_cb),
2666
g_signal_connect_object (priv->client, "sensor-removed",
2667
G_CALLBACK (gcm_prefs_client_sensor_changed_cb),
2670
/* set calibrate button sensitivity */
2671
gcm_prefs_set_calibrate_button_sensitivity (prefs);
2673
widget = WID (priv->builder, "dialog-vbox1");
2674
gtk_widget_reparent (widget, (GtkWidget *) prefs);
2675
g_signal_connect (widget, "realize",
2676
G_CALLBACK (gcm_prefs_window_realize_cb),
2679
widget = WID (priv->builder, "linkbutton_help");
2680
if (!g_strcmp0(g_getenv("XDG_CURRENT_DESKTOP"), "Unity"))
2681
g_object_set (G_OBJECT (widget),
2682
"uri", "help:ubuntu-help/color-whyimportant",
2687
cc_color_panel_register (GIOModule *module)
2689
cc_color_panel_register_type (G_TYPE_MODULE (module));
2690
g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT,
2691
CC_TYPE_COLOR_PANEL,