[gnome-color-manager] Properly support projectors in the UI, and in the argyllcms wrapper
- From: Richard Hughes <rhughes src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-color-manager] Properly support projectors in the UI, and in the argyllcms wrapper
- Date: Sat, 13 Feb 2010 19:06:51 +0000 (UTC)
commit e5b803b089f7888264e689bcc302c17f72999bd3
Author: Richard Hughes <richard hughsie com>
Date: Sat Feb 13 19:06:07 2010 +0000
Properly support projectors in the UI, and in the argyllcms wrapper
src/gcm-calibrate-argyll.c | 12 +-
src/gcm-calibrate.c | 223 +++++++++++++++++++++++++++++++-------------
src/gcm-calibrate.h | 7 ++
src/gcm-prefs.c | 4 +
4 files changed, 173 insertions(+), 73 deletions(-)
---
diff --git a/src/gcm-calibrate-argyll.c b/src/gcm-calibrate-argyll.c
index 07e18c8..27a278a 100644
--- a/src/gcm-calibrate-argyll.c
+++ b/src/gcm-calibrate-argyll.c
@@ -214,18 +214,18 @@ out:
static gchar
gcm_calibrate_argyll_get_display_type (GcmCalibrateArgyll *calibrate_argyll)
{
- gboolean is_lcd;
- gboolean is_crt;
+ GcmCalibrateDeviceKind device_kind;
g_object_get (calibrate_argyll,
- "is-lcd", &is_lcd,
- "is-crt", &is_crt,
+ "device-kind", &device_kind,
NULL);
- if (is_lcd)
+ if (device_kind == GCM_CALIBRATE_DEVICE_KIND_LCD)
return 'l';
- if (is_crt)
+ if (device_kind == GCM_CALIBRATE_DEVICE_KIND_CRT)
return 'c';
+ if (device_kind == GCM_CALIBRATE_DEVICE_KIND_PROJECTOR)
+ return 'p';
return '\0';
}
diff --git a/src/gcm-calibrate.c b/src/gcm-calibrate.c
index 189704f..39f0947 100644
--- a/src/gcm-calibrate.c
+++ b/src/gcm-calibrate.c
@@ -53,8 +53,7 @@ struct _GcmCalibratePrivate
{
GcmColorDevice *color_device;
GcmCalibrateReferenceKind reference_kind;
- gboolean is_lcd;
- gboolean is_crt;
+ GcmCalibrateDeviceKind device_kind;
gchar *output_name;
gchar *filename_source;
gchar *filename_reference;
@@ -65,6 +64,7 @@ struct _GcmCalibratePrivate
gchar *description;
gchar *serial;
gchar *device;
+ GtkDialog *dialog_tmp;
};
enum {
@@ -75,9 +75,8 @@ enum {
PROP_SERIAL,
PROP_DEVICE,
PROP_MANUFACTURER,
- PROP_IS_LCD,
- PROP_IS_CRT,
PROP_REFERENCE_KIND,
+ PROP_DEVICE_KIND,
PROP_OUTPUT_NAME,
PROP_FILENAME_SOURCE,
PROP_FILENAME_REFERENCE,
@@ -299,6 +298,139 @@ out:
}
/**
+ * gcm_calibrate_create_large_button:
+ **/
+static GtkWidget *
+gcm_calibrate_create_large_button (const gchar *filename, const gchar *title)
+{
+ GtkWidget *vbox;
+ GtkWidget *image;
+ GtkWidget *label;
+ GError *error = NULL;
+ GtkIconTheme *icon_theme;
+ GdkPixbuf *pixbuf;
+
+ /* pack label into a vbox */
+ vbox = gtk_vbox_new (FALSE, 3);
+ label = gtk_label_new (title);
+ gtk_box_pack_end (GTK_BOX(vbox), label, TRUE, TRUE, 3);
+ gtk_widget_show (label);
+
+ /* image widget */
+ icon_theme = gtk_icon_theme_get_default ();
+ pixbuf = gtk_icon_theme_load_icon (icon_theme, filename, 150, 0, &error);
+ if (pixbuf == NULL) {
+ egg_warning ("failed to load: %s", error->message);
+ goto out;
+ }
+ image = gtk_image_new_from_pixbuf (pixbuf);
+ gtk_box_pack_end (GTK_BOX(vbox), image, TRUE, TRUE, 3);
+ gtk_widget_show (image);
+out:
+ gtk_widget_show (vbox);
+ return vbox;
+}
+
+/**
+ * gcm_calibrate_button_clicked_lcd_cb:
+ **/
+static void
+gcm_calibrate_button_clicked_lcd_cb (GtkWidget *widget, GcmCalibrate *calibrate)
+{
+ calibrate->priv->device_kind = GCM_CALIBRATE_DEVICE_KIND_LCD;
+ gtk_dialog_response (calibrate->priv->dialog_tmp, GTK_RESPONSE_OK);
+}
+
+/**
+ * gcm_calibrate_button_clicked_crt_cb:
+ **/
+static void
+gcm_calibrate_button_clicked_crt_cb (GtkWidget *widget, GcmCalibrate *calibrate)
+{
+ calibrate->priv->device_kind = GCM_CALIBRATE_DEVICE_KIND_CRT;
+ gtk_dialog_response (calibrate->priv->dialog_tmp, GTK_RESPONSE_OK);
+}
+
+/**
+ * gcm_calibrate_button_clicked_projector_cb:
+ **/
+static void
+gcm_calibrate_button_clicked_projector_cb (GtkWidget *widget, GcmCalibrate *calibrate)
+{
+ calibrate->priv->device_kind = GCM_CALIBRATE_DEVICE_KIND_PROJECTOR;
+ gtk_dialog_response (calibrate->priv->dialog_tmp, GTK_RESPONSE_OK);
+}
+
+/**
+ * gcm_calibrate_get_display_type:
+ **/
+static gboolean
+gcm_calibrate_get_display_type (GcmCalibrate *calibrate, GtkWindow *window, GError **error)
+{
+ gboolean ret = TRUE;
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *dialog;
+ GtkWidget *image;
+ GtkWidget *widget;
+ GtkResponseType response;
+
+ dialog = gtk_message_dialog_new (window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_CANCEL,
+ /* TRANSLATORS: title, usually we can tell based on the EDID data or output name */
+ _("Could not detect screen type"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ /* TRANSLATORS: dialog message */
+ _("Please indicate if the screen you are trying to profile is a LCD, CRT or a projector."));
+ gtk_window_set_icon_name (GTK_WINDOW (dialog), GCM_STOCK_ICON);
+
+ /* pack it */
+ vbox = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+ hbox = gtk_hbox_new (FALSE, 3);
+
+ /* TRANSLATORS: device type */
+ image = gcm_calibrate_create_large_button ("lcd", _("LCD"));
+ widget = gtk_button_new ();
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (gcm_calibrate_button_clicked_lcd_cb), calibrate);
+ gtk_container_add (GTK_CONTAINER (widget), image);
+ gtk_box_pack_start (GTK_BOX(hbox), widget, TRUE, TRUE, 3);
+ gtk_widget_show (widget);
+
+ /* TRANSLATORS: device type */
+ image = gcm_calibrate_create_large_button ("crt", _("CRT"));
+ widget = gtk_button_new ();
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (gcm_calibrate_button_clicked_crt_cb), calibrate);
+ gtk_container_add (GTK_CONTAINER (widget), image);
+ gtk_box_pack_start (GTK_BOX(hbox), widget, TRUE, TRUE, 3);
+ gtk_widget_show (widget);
+
+ /* TRANSLATORS: device type */
+ image = gcm_calibrate_create_large_button ("projector", _("Projector"));
+ widget = gtk_button_new ();
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (gcm_calibrate_button_clicked_projector_cb), calibrate);
+ gtk_container_add (GTK_CONTAINER (widget), image);
+ gtk_box_pack_start (GTK_BOX(hbox), widget, TRUE, TRUE, 3);
+ gtk_widget_show (widget);
+
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 3);
+
+ /* save this so we can call async */
+ calibrate->priv->dialog_tmp = GTK_DIALOG (dialog);
+ response = gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ if (response != GTK_RESPONSE_OK) {
+ g_set_error_literal (error, 1, 0, "user did not choose crt or lcd");
+ ret = FALSE;
+ goto out;
+ }
+out:
+ return ret;
+}
+
+/**
* gcm_calibrate_display:
**/
gboolean
@@ -309,10 +441,10 @@ gcm_calibrate_display (GcmCalibrate *calibrate, GtkWindow *window, GError **erro
gchar *hardware_device = NULL;
gboolean ret_tmp;
GtkWidget *dialog;
- GtkResponseType response;
GString *string = NULL;
GcmBrightness *brightness = NULL;
guint percentage = G_MAXUINT;
+ GtkResponseType response;
GError *error_tmp = NULL;
GcmCalibratePrivate *priv = calibrate->priv;
@@ -348,33 +480,10 @@ gcm_calibrate_display (GcmCalibrate *calibrate, GtkWindow *window, GError **erro
/* this wasn't previously set */
- if (!priv->is_lcd && !priv->is_crt) {
- dialog = gtk_message_dialog_new (window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_CANCEL,
- /* TRANSLATORS: title, usually we can tell based on the EDID data or output name */
- _("Could not auto-detect CRT or LCD"));
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
- /* TRANSLATORS: dialog message */
- _("Please indicate if the screen you are trying to profile is a CRT (old type) or a LCD (digital flat panel)."));
- gtk_window_set_icon_name (GTK_WINDOW (dialog), GCM_STOCK_ICON);
- /* TRANSLATORS: button, Liquid Crystal Display */
- gtk_dialog_add_button (GTK_DIALOG (dialog), _("LCD"), GTK_RESPONSE_YES);
- /* TRANSLATORS: button, Cathode Ray Tube */
- gtk_dialog_add_button (GTK_DIALOG (dialog), _("CRT"), GTK_RESPONSE_NO);
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- if (response == GTK_RESPONSE_YES) {
- g_object_set (calibrate,
- "is-lcd", TRUE,
- NULL);
- } else if (response == GTK_RESPONSE_NO) {
- g_object_set (calibrate,
- "is-crt", TRUE,
- NULL);
- } else {
- g_set_error_literal (error, 1, 0, "user did not choose crt or lcd");
- ret = FALSE;
+ if (priv->device_kind == GCM_CALIBRATE_DEVICE_KIND_UNKNOWN) {
+ ret = gcm_calibrate_get_display_type (calibrate, window, error);
+ if (!ret)
goto out;
- }
}
/* show a warning for external monitors */
@@ -923,15 +1032,12 @@ gcm_calibrate_get_property (GObject *object, guint prop_id, GValue *value, GPara
GcmCalibratePrivate *priv = calibrate->priv;
switch (prop_id) {
- case PROP_IS_LCD:
- g_value_set_boolean (value, priv->is_lcd);
- break;
- case PROP_IS_CRT:
- g_value_set_boolean (value, priv->is_crt);
- break;
case PROP_REFERENCE_KIND:
g_value_set_boolean (value, priv->reference_kind);
break;
+ case PROP_DEVICE_KIND:
+ g_value_set_boolean (value, priv->device_kind);
+ break;
case PROP_OUTPUT_NAME:
g_value_set_string (value, priv->output_name);
break;
@@ -978,14 +1084,9 @@ gcm_calibrate_guess_type (GcmCalibrate *calibrate)
GcmCalibratePrivate *priv = calibrate->priv;
/* guess based on the output name */
- ret = gcm_utils_output_is_lcd (priv->output_name);
- if (ret) {
- priv->is_lcd = TRUE;
- priv->is_crt = FALSE;
- } else {
- priv->is_lcd = FALSE;
- priv->is_crt = FALSE;
- }
+ ret = gcm_utils_output_is_lcd_internal (priv->output_name);
+ if (ret)
+ priv->device_kind = GCM_CALIBRATE_DEVICE_KIND_LCD;
}
/**
@@ -998,12 +1099,6 @@ gcm_calibrate_set_property (GObject *object, guint prop_id, const GValue *value,
GcmCalibratePrivate *priv = calibrate->priv;
switch (prop_id) {
- case PROP_IS_LCD:
- priv->is_lcd = g_value_get_boolean (value);
- break;
- case PROP_IS_CRT:
- priv->is_crt = g_value_get_boolean (value);
- break;
case PROP_OUTPUT_NAME:
g_free (priv->output_name);
priv->output_name = g_strdup (g_value_get_string (value));
@@ -1065,22 +1160,6 @@ gcm_calibrate_class_init (GcmCalibrateClass *klass)
object_class->set_property = gcm_calibrate_set_property;
/**
- * GcmCalibrate:is-lcd:
- */
- pspec = g_param_spec_boolean ("is-lcd", NULL, NULL,
- FALSE,
- G_PARAM_READWRITE);
- g_object_class_install_property (object_class, PROP_IS_LCD, pspec);
-
- /**
- * GcmCalibrate:is-crt:
- */
- pspec = g_param_spec_boolean ("is-crt", NULL, NULL,
- FALSE,
- G_PARAM_READWRITE);
- g_object_class_install_property (object_class, PROP_IS_CRT, pspec);
-
- /**
* GcmCalibrate:reference-kind:
*/
pspec = g_param_spec_uint ("reference-kind", NULL, NULL,
@@ -1089,6 +1168,14 @@ gcm_calibrate_class_init (GcmCalibrateClass *klass)
g_object_class_install_property (object_class, PROP_REFERENCE_KIND, pspec);
/**
+ * GcmCalibrate:device-kind:
+ */
+ pspec = g_param_spec_uint ("device-kind", NULL, NULL,
+ 0, G_MAXUINT, 0,
+ G_PARAM_READABLE);
+ g_object_class_install_property (object_class, PROP_DEVICE_KIND, pspec);
+
+ /**
* GcmCalibrate:output-name:
*/
pspec = g_param_spec_string ("output-name", NULL, NULL,
@@ -1188,6 +1275,8 @@ gcm_calibrate_init (GcmCalibrate *calibrate)
calibrate->priv->description = NULL;
calibrate->priv->device = NULL;
calibrate->priv->serial = NULL;
+ calibrate->priv->device_kind = GCM_CALIBRATE_DEVICE_KIND_UNKNOWN;
+ calibrate->priv->reference_kind = GCM_CALIBRATE_REFERENCE_KIND_UNKNOWN;
calibrate->priv->color_device = gcm_color_device_new ();
}
diff --git a/src/gcm-calibrate.h b/src/gcm-calibrate.h
index 04fca80..8e22ee2 100644
--- a/src/gcm-calibrate.h
+++ b/src/gcm-calibrate.h
@@ -77,6 +77,13 @@ typedef enum {
GCM_CALIBRATE_REFERENCE_KIND_UNKNOWN
} GcmCalibrateReferenceKind;
+typedef enum {
+ GCM_CALIBRATE_DEVICE_KIND_CRT,
+ GCM_CALIBRATE_DEVICE_KIND_LCD,
+ GCM_CALIBRATE_DEVICE_KIND_PROJECTOR,
+ GCM_CALIBRATE_DEVICE_KIND_UNKNOWN
+} GcmCalibrateDeviceKind;
+
GType gcm_calibrate_get_type (void);
GcmCalibrate *gcm_calibrate_new (void);
gboolean gcm_calibrate_display (GcmCalibrate *calibrate,
diff --git a/src/gcm-prefs.c b/src/gcm-prefs.c
index 93fab89..5d6d2a5 100644
--- a/src/gcm-prefs.c
+++ b/src/gcm-prefs.c
@@ -2402,6 +2402,10 @@ main (int argc, char **argv)
goto out;
}
+ /* add application specific icons to search path */
+ gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
+ GCM_DATA G_DIR_SEPARATOR_S "icons");
+
/* maintain a list of profiles */
profile_store = gcm_profile_store_new ();
g_signal_connect (profile_store, "changed", G_CALLBACK(gcm_prefs_profile_store_changed_cb), NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]