diff --git a/ChangeLog b/ChangeLog index b27163a4..b87d60ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,47 @@ +2002-10-10 Jens Finke + + New preference dialog. + + * configure.in: Check for libglade. + + * Makefile.am: Added glade related stuff. + + * eog.schemas: Changed keys for image view, so that they better + reflect the preference dialog settings. + + * eog.glade, + * eog.gladep, + * eog-glade.h: New glade related files. + + * libeog/image-view.[ch] (paint_rectangle): Consider use_check_pattern variable. + (image_view_set_check_type), + (image_view_set_check_size): Set use_check_pattern variable. + (image_view_set_transparent_color): New function. + + * shell/Makefile.am: Added eog-preferences.[ch] files. + + * shell/eog-preferences.[ch]: New files. + + * shell/eog-shell-ui.xml: Added Edit/Preferences menu item. + + * shell/eog-window.c (verb_EditPreferences_cb): New function. + + * viewer/eog-image-view-ui.xml: Removed preference settings from + the menu. + + * viewer/eog-image-view.c: Removed all stuff related to the + setting/changing of preferences through the menu. + (dither_changed_cb), + (check_size_changed_cb), + (check_type_changed_cb): Removed. + (interp_type_changed_cb): Reworked. + (trans_color_changed_cb), + (transparency_changed_cb): New function. + (eog_iamge_view_construct): Adapted to new gconf schema. + Removed ui related properties from property bag. + + * viewer/eog-image-view.h: Adapted gconf keys. + 2002-10-10 Kjartan Maraas * shell/eog-window.c (eog_window_init): Plug a leak. diff --git a/Makefile.am b/Makefile.am index 080104c3..81c7f1d9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -13,6 +13,9 @@ EXTRA_DIST = \ $(schema_DATA) \ eog.desktop.in \ eog.spec \ + eog.gladep \ + eog.glade \ + eog-glade.h \ eog.spec.in \ gnome-eog.png \ intltool-extract.in \ @@ -24,6 +27,9 @@ Graphicsdir = $(datadir)/applications Graphics_in_files = eog.desktop.in Graphics_DATA = $(Graphics_in_files:.desktop.in=.desktop) +Gladedir = $(datadir)/eog/glade +Glade_DATA = eog.glade + @INTLTOOL_DESKTOP_RULE@ schemadir = $(sysconfdir)/gconf/schemas diff --git a/configure.in b/configure.in index 9642170f..35974a1b 100644 --- a/configure.in +++ b/configure.in @@ -18,6 +18,7 @@ LIBGNOMEUI_REQUIRED=1.115.0 LIBBONOBOUI_REQUIRED=1.115.0 BONOBO_ACTIVATION_REQUIRED=0.9.7 LIBRSVG_REQUIRED=1.1.6 +LIBGLADE_REQUIRED=2.0.1 dnl =============================================================================== @@ -143,7 +144,7 @@ dnl AM_CONDITIONAL(ENABLE_GNOCAM, test x"$gnocam" = "xyes") gnocam=no AM_CONDITIONAL(ENABLE_GNOCAM, false) -EOG_MODULES="gnome-vfs-2.0 >= $GNOME_VFS_REQUIRED libgnomeprint-2.0 >= $LIBGNOMEPRINT_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED libbonoboui-2.0 >= $LIBBONOBOUI_REQUIRED bonobo-activation-2.0 >= $BONOBO_ACTIVATION_REQUIRED librsvg-2.0 >= $LIBRSVG_REQUIRED" +EOG_MODULES="gnome-vfs-2.0 >= $GNOME_VFS_REQUIRED libgnomeprint-2.0 >= $LIBGNOMEPRINT_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED libbonoboui-2.0 >= $LIBBONOBOUI_REQUIRED bonobo-activation-2.0 >= $BONOBO_ACTIVATION_REQUIRED librsvg-2.0 >= $LIBRSVG_REQUIRED libglade-2.0 >= $LIBGLADE_REQUIRED" PKG_CHECK_MODULES(EOG, $EOG_MODULES) AC_SUBST(EOG_CFLAGS) AC_SUBST(EOG_LIBS) diff --git a/eog-glade.h b/eog-glade.h new file mode 100644 index 00000000..35a55cf3 --- /dev/null +++ b/eog-glade.h @@ -0,0 +1,13 @@ +/* + * Datei für übersetzbare Zeichenketten, erzeugt durch Glade. + * Fügen Sie diese Datei zur POTFILES.in Ihres Projektes hinzu. + * Compilieren Sie sie NICHT als Teil Ihrer Anwendung. + */ + +gchar *s = N_("Eye of Gnome Preferences"); +gchar *s = N_("Interpolate image on zoom (better quality but slower)"); +gchar *s = N_("By checkpattern "); +gchar *s = N_("By color"); +gchar *s = N_("Pick a color"); +gchar *s = N_("Indicate Transparency"); +gchar *s = N_("Image Viewer"); diff --git a/eog.glade b/eog.glade new file mode 100644 index 00000000..b5287235 --- /dev/null +++ b/eog.glade @@ -0,0 +1,239 @@ + + + + + + + + 6 + True + Eye of Gnome Preferences + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + True + + + + True + False + 6 + + + + True + True + True + True + GTK_POS_TOP + False + 2 + 2 + False + + + + 6 + True + False + 6 + + + + True + True + Interpolate image on zoom (better quality but slower) + True + GTK_RELIEF_NORMAL + False + False + True + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + + + + True + False + 0 + + + + 6 + True + False + 6 + + + + True + True + By checkpattern + True + GTK_RELIEF_NORMAL + False + False + True + + + 0 + False + False + + + + + + True + False + 6 + + + + True + True + By color + True + GTK_RELIEF_NORMAL + False + False + True + checkpattern_radio + + + 0 + False + False + + + + + + True + True + True + False + Pick a color + + + 0 + False + False + + + + + 0 + False + False + + + + + 0 + True + True + + + + + + + + True + Indicate Transparency + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + label_item + + + + + 0 + False + True + + + + + False + True + + + + + + True + Image Viewer + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_END + 0 + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + + + + + 0 + False + True + + + + + + + diff --git a/eog.gladep b/eog.gladep new file mode 100644 index 00000000..fc0708d1 --- /dev/null +++ b/eog.gladep @@ -0,0 +1,9 @@ + + + + + eog + eog + TRUE + eog-glade.h + diff --git a/eog.schemas b/eog.schemas index d985e5d1..be2a5737 100644 --- a/eog.schemas +++ b/eog.schemas @@ -1,88 +1,45 @@ - /schemas/apps/eog/view/interp_type - /apps/eog/view/interp_type + /schemas/apps/eog/view/interpolate + /apps/eog/view/interpolate eog - int - 2 - - Interpolation type - Type of interpolation to use for views. Possible values - are: 0 (nearest neighbor), 2 (bilienar), 3 (hyperbolic). - Value 1 (tiles) is in effect the same as nearest neighbor and - thus is not used. - - - - - /schemas/apps/eog/view/check_type - /apps/eog/view/check_type - eog - int + bool 1 - Type of checks - Type of the checkered background that will be drawn - behind images with transparency. Possible values are: 0 (dark - checks), 1 (midtone checks), 2 (light checks), 3 (black - background), 4 (gray background), 5 (white background). + Interpolate Image + Wether the image should be interpolated on zoom or not. + This leads to better quality but is somewhat slower than non + interpolated images. - /schemas/apps/eog/view/check_size - /apps/eog/view/check_size + /schemas/apps/eog/view/transparency + /apps/eog/view/transparency eog - int - 1 + string + CHECK_PATTERN - Size of checks - Size of the checks in the background that will be drawn - behind images with transparency. Possible values are: 0 - (small checks), 1 (medium checks), 2 (large checks). + Transparency indicator + Determines how transparency should be indicated. Valid values + are CHECK_PATTERN and COLOR. If COLOR is choosen, than the trans_color + key determines the used color value. + - /schemas/apps/eog/view/dither - /apps/eog/view/dither + /schemas/apps/eog/view/trans_color + /apps/eog/view/trans_color eog - int - 0 + string + #000000 - Dither type - Dither type to use. Possible values are: 0 (none), 1 - (normal, for pseudo-color displays), 2 (maximum, for extra - quality on high color displays). - - - - - /schemas/apps/eog/view/scroll - /apps/eog/view/scroll - eog - int - 1 - - Scrolling method - Scrolling method to use. Possible values are: 0 - (normal), 1 (two-pass scrolling). - - - - - /schemas/apps/eog/window/sb_policy - /apps/eog/window/sb_policy - eog - int - 1 - - Scrollbar policy for image windows - Whether to display scrollbars on image windows. - Possible values are: 1 (automatic; only display scrollbars if - the image is larger than the window), 2 (never display - scrollbars). + Transparency color + If the transparency key has the value COLOR, than this + key determines the color which is used for indicating transparency. + diff --git a/libeog/image-view.c b/libeog/image-view.c index e7e3cd04..af980252 100644 --- a/libeog/image-view.c +++ b/libeog/image-view.c @@ -97,6 +97,10 @@ struct _ImageViewPrivate { /* Check type and size */ CheckType check_type; CheckSize check_size; + + /* Transparency indicator */ + gboolean use_check_pattern; + guint32 transparency_color; /* Dither type */ GdkRgbDither dither; @@ -245,6 +249,8 @@ image_view_instance_init (ImageView *view) priv->check_type = CHECK_TYPE_MIDTONE; priv->check_size = CHECK_SIZE_LARGE; priv->dither = GDK_RGB_DITHER_MAX; + priv->use_check_pattern = TRUE; + priv->transparency_color = CHECK_BLACK; /* We don't want to be double-buffered as we are SuperSmart(tm) */ gtk_widget_set_double_buffered (GTK_WIDGET (view), FALSE); @@ -545,38 +551,42 @@ paint_rectangle (ImageView *view, ArtIRect *rect, GdkInterpType interp_type) } /* Compute check parameters */ + if (priv->use_check_pattern) { + switch (priv->check_type) { + case CHECK_TYPE_DARK: + check_1 = CHECK_BLACK; + check_2 = CHECK_DARK; + break; + + case CHECK_TYPE_MIDTONE: + check_1 = CHECK_DARK; + check_2 = CHECK_LIGHT; + break; - switch (priv->check_type) { - case CHECK_TYPE_DARK: - check_1 = CHECK_BLACK; - check_2 = CHECK_DARK; - break; + case CHECK_TYPE_LIGHT: + check_1 = CHECK_LIGHT; + check_2 = CHECK_WHITE; + break; + + case CHECK_TYPE_BLACK: + check_1 = check_2 = CHECK_BLACK; + break; - case CHECK_TYPE_MIDTONE: - check_1 = CHECK_DARK; - check_2 = CHECK_LIGHT; - break; + case CHECK_TYPE_GRAY: + check_1 = check_2 = CHECK_GRAY; + break; - case CHECK_TYPE_LIGHT: - check_1 = CHECK_LIGHT; - check_2 = CHECK_WHITE; - break; + case CHECK_TYPE_WHITE: + check_1 = check_2 = CHECK_WHITE; + break; - case CHECK_TYPE_BLACK: - check_1 = check_2 = CHECK_BLACK; - break; - - case CHECK_TYPE_GRAY: - check_1 = check_2 = CHECK_GRAY; - break; - - case CHECK_TYPE_WHITE: - check_1 = check_2 = CHECK_WHITE; - break; - - default: - g_assert_not_reached (); - return; + default: + g_assert_not_reached (); + return; + } + } + else { + check_1 = check_2 = priv->transparency_color; } switch (priv->check_size) { @@ -1689,10 +1699,12 @@ image_view_set_check_type (ImageView *view, CheckType check_type) priv = view->priv; - if (priv->check_type == check_type) + if (priv->check_type == check_type && + priv->use_check_pattern) return; priv->check_type = check_type; + priv->use_check_pattern = TRUE; gtk_widget_queue_draw (GTK_WIDGET (view)); } @@ -1734,10 +1746,12 @@ image_view_set_check_size (ImageView *view, CheckSize check_size) priv = view->priv; - if (priv->check_size == check_size) + if (priv->check_size == check_size && + priv->use_check_pattern) return; priv->check_size = check_size; + priv->use_check_pattern = TRUE; gtk_widget_queue_draw (GTK_WIDGET (view)); } @@ -1787,6 +1801,32 @@ image_view_set_dither (ImageView *view, GdkRgbDither dither) gtk_widget_queue_draw (GTK_WIDGET (view)); } +void +image_view_set_transparent_color (ImageView *view, const GdkColor *color) +{ + ImageViewPrivate *priv; + guint32 col = 0; + guint32 red_part; + guint32 green_part; + guint32 blue_part; + + g_return_if_fail (view != NULL); + g_return_if_fail (IS_IMAGE_VIEW (view)); + + priv = view->priv; + + red_part = (color->red / 256) << 16; + green_part = (color->green / 256) << 8; + blue_part = (color->blue / 256); + + col = red_part + green_part + blue_part; + + priv->use_check_pattern = FALSE; + priv->transparency_color = col; + + gtk_widget_queue_draw (GTK_WIDGET (view)); +} + /** * image_view_get_dither: * @view: An image view. @@ -1929,3 +1969,4 @@ image_view_class_init (ImageViewClass *class) widget_class->focus_in_event = image_view_focus_in_event; widget_class->focus_out_event = image_view_focus_out_event; } + diff --git a/libeog/image-view.h b/libeog/image-view.h index 18447320..d5f5c458 100644 --- a/libeog/image-view.h +++ b/libeog/image-view.h @@ -112,6 +112,8 @@ GdkRgbDither image_view_get_dither (ImageView *view); void image_view_get_scaled_size (ImageView *view, gint *width, gint *height); +void image_view_set_transparent_color (ImageView *view, const GdkColor *color); + G_END_DECLS #endif diff --git a/shell/Makefile.am b/shell/Makefile.am index 11e0dc35..9ff259ca 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -18,6 +18,8 @@ bin_PROGRAMS = eog eog_SOURCES = \ eog-window.h \ eog-window.c \ + eog-preferences.h \ + eog-preferences.c \ main.c \ session.c \ session.h \ diff --git a/shell/eog-preferences.c b/shell/eog-preferences.c new file mode 100644 index 00000000..e81560ce --- /dev/null +++ b/shell/eog-preferences.c @@ -0,0 +1,144 @@ +#include +#include +#include +#include "eog-preferences.h" + +#define EOG_VIEW_INTERPOLATE_IMAGE "/apps/eog/view/interpolate" +#define EOG_VIEW_TRANSPARENCY "/apps/eog/view/transparency" +#define EOG_VIEW_TRANS_COLOR "/apps/eog/view/trans_color" +#define GCONF_OBJECT_KEY "GCONF_KEY" +#define GCONF_OBJECT_VALUE "GCONF_VALUE" + +static void +check_toggle_cb (GtkWidget *widget, gpointer data) +{ + char *key = NULL; + + key = g_object_get_data (G_OBJECT (widget), GCONF_OBJECT_KEY); + if (key == NULL) return; + + gconf_client_set_bool (GCONF_CLIENT (data), + key, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)), + NULL); +} + + +static void +color_change_cb (GtkWidget *widget, guint red, guint green, guint blue, guint a, gpointer data) +{ + char *key = NULL; + char *value = NULL; + char *ptr; + + value = g_strdup_printf ("#%2X%2X%2X", + red / 256, + green / 256, + blue / 256); + + for (ptr = value; *ptr; ptr++) + if (*ptr == ' ') + *ptr = '0'; + + key = g_object_get_data (G_OBJECT (widget), GCONF_OBJECT_KEY); + if (key == NULL || value == NULL) + return; + + gconf_client_set_string (GCONF_CLIENT (data), + key, + value, + NULL); +} + +static void +radio_toggle_cb (GtkWidget *widget, gpointer data) +{ + char *key = NULL; + char *value = NULL; + + + if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) + return; + + key = g_object_get_data (G_OBJECT (widget), GCONF_OBJECT_KEY); + value = g_object_get_data (G_OBJECT (widget), GCONF_OBJECT_VALUE); + if (key == NULL || value == NULL) + return; + + gconf_client_set_string (GCONF_CLIENT (data), + key, + value, + NULL); +} + +void +eog_preferences_show (GConfClient *client) +{ + GtkWidget *dlg; + GladeXML *xml; + GtkWidget *widget; + char *value; + GdkColor color; + + xml = glade_xml_new (DATADIR "/eog/glade/eog.glade", "Preferences Dialog", "eog"); + g_assert (xml != NULL); + + dlg = glade_xml_get_widget (xml, "Preferences Dialog"); + + widget = glade_xml_get_widget (xml, "close_button"); + g_signal_connect_swapped (G_OBJECT (widget), "clicked", + G_CALLBACK (gtk_widget_destroy), dlg); + + /* interpolate flag */ + widget = glade_xml_get_widget (xml, "interpolate_check"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), + gconf_client_get_bool (client, EOG_VIEW_INTERPOLATE_IMAGE, NULL)); + g_object_set_data (G_OBJECT (widget), GCONF_OBJECT_KEY, EOG_VIEW_INTERPOLATE_IMAGE); + g_signal_connect (G_OBJECT (widget), + "toggled", + G_CALLBACK (check_toggle_cb), + client); + + /* Transparency radio group */ + widget = glade_xml_get_widget (xml, "color_radio"); + g_object_set_data (G_OBJECT (widget), GCONF_OBJECT_KEY, EOG_VIEW_TRANSPARENCY); + g_object_set_data (G_OBJECT (widget), GCONF_OBJECT_VALUE, "COLOR"); + g_signal_connect (G_OBJECT (widget), + "toggled", + G_CALLBACK (radio_toggle_cb), + client); + + widget = glade_xml_get_widget (xml, "checkpattern_radio"); + g_object_set_data (G_OBJECT (widget), GCONF_OBJECT_KEY, EOG_VIEW_TRANSPARENCY); + g_object_set_data (G_OBJECT (widget), GCONF_OBJECT_VALUE, "CHECK_PATTERN"); + g_signal_connect (G_OBJECT (widget), + "toggled", + G_CALLBACK (radio_toggle_cb), + client); + + value = gconf_client_get_string (client, EOG_VIEW_TRANSPARENCY, NULL); + if (g_strncasecmp (value, "COLOR") == 0) { + widget = glade_xml_get_widget (xml, "color_radio"); + } + else { + widget = glade_xml_get_widget (xml, "checkpattern_radio"); + } + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE); + + /* color picker */ + value = gconf_client_get_string (client, EOG_VIEW_TRANS_COLOR, NULL); + widget = glade_xml_get_widget (xml, "colorpicker"); + if (gdk_color_parse (value, &color)) { + gnome_color_picker_set_i16 (GNOME_COLOR_PICKER (widget), + color.red, + color.green, + color.blue, + 255); + } + g_object_set_data (G_OBJECT (widget), GCONF_OBJECT_KEY, EOG_VIEW_TRANS_COLOR); + g_signal_connect (G_OBJECT (widget), + "color-set", + G_CALLBACK (color_change_cb), + client); +} + diff --git a/shell/eog-preferences.h b/shell/eog-preferences.h new file mode 100644 index 00000000..1084e7b8 --- /dev/null +++ b/shell/eog-preferences.h @@ -0,0 +1,3 @@ +#include + +void eog_preferences_show (GConfClient *client); diff --git a/shell/eog-shell-ui.xml b/shell/eog-shell-ui.xml index 34cee9fd..e7d8a563 100644 --- a/shell/eog-shell-ui.xml +++ b/shell/eog-shell-ui.xml @@ -12,7 +12,10 @@ - + + + - + - + + + - - + diff --git a/shell/eog-window.c b/shell/eog-window.c index 1b2e305d..ecb954ac 100644 --- a/shell/eog-window.c +++ b/shell/eog-window.c @@ -172,6 +172,16 @@ verb_FileExit_cb (BonoboUIComponent *uic, gpointer user_data, const char *cname) eog_window_close_all (); } +static void +verb_EditPreferences_cb (BonoboUIComponent *uic, gpointer user_data, const char *cname) +{ + GConfClient *client; + + client = EOG_WINDOW (user_data)->priv->client; + + eog_preferences_show (client); +} + static void verb_HelpAbout_cb (BonoboUIComponent *uic, gpointer user_data, const char *cname) { @@ -613,6 +623,7 @@ static BonoboUIVerb eog_app_verbs[] = { BONOBO_UI_VERB ("FileOpen", verb_FileOpen_cb), BONOBO_UI_VERB ("FileCloseWindow", verb_FileCloseWindow_cb), BONOBO_UI_VERB ("FileExit", verb_FileExit_cb), + BONOBO_UI_VERB ("EditPreferences", verb_EditPreferences_cb), BONOBO_UI_VERB ("HelpAbout", verb_HelpAbout_cb), BONOBO_UI_VERB ("Help", verb_HelpContent_cb), BONOBO_UI_VERB ("DnDNewWindow", verb_DnDNewWindow_cb), diff --git a/viewer/eog-image-view-ui.xml b/viewer/eog-image-view-ui.xml index b7920b7b..42562d93 100644 --- a/viewer/eog-image-view-ui.xml +++ b/viewer/eog-image-view-ui.xml @@ -14,39 +14,6 @@ - - - - - - - - - - - - - - - - - - - @@ -85,36 +52,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/viewer/eog-image-view.c b/viewer/eog-image-view.c index 3bdb35f2..01078f8e 100644 --- a/viewer/eog-image-view.c +++ b/viewer/eog-image-view.c @@ -63,9 +63,8 @@ struct _EogImageViewPrivate { GConfClient *client; guint interp_type_notify_id; - guint dither_notify_id; - guint check_type_notify_id; - guint check_size_notify_id; + guint transparency_notify_id; + guint trans_color_notify_id; GtkWidget *ui_image; ImageView *image_view; @@ -211,126 +210,6 @@ image_view_popup_menu_cb (GtkWidget *widget, gpointer data) return TRUE; } -static void -listener_Interpolation_cb (BonoboUIComponent *uic, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) -{ - EogImageView *image_view; - GdkInterpType interpolation; - - g_return_if_fail (user_data != NULL); - g_return_if_fail (EOG_IS_IMAGE_VIEW (user_data)); - - if (type != Bonobo_UIComponent_STATE_CHANGED) - return; - - if (!state || !atoi (state)) - return; - - image_view = EOG_IMAGE_VIEW (user_data); - - if (!strcmp (path, "InterpolationNearest")) { - interpolation = GDK_INTERP_NEAREST; - } - else if (!strcmp (path, "InterpolationBilinear")) { - interpolation = GDK_INTERP_BILINEAR; - } - else if (!strcmp (path, "InterpolationHyperbolic")) { - interpolation = GDK_INTERP_HYPER; - } - else { - g_warning ("Unknown interpolation type `%s'", path); - return; - } - - gconf_client_set_int (image_view->priv->client, - GCONF_EOG_VIEW_INTERP_TYPE, - (int) interpolation, NULL); -} - -static void -listener_Dither_cb (BonoboUIComponent *uic, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) -{ - EogImageView *image_view; - GNOME_EOG_Dither dither; - - g_return_if_fail (user_data != NULL); - g_return_if_fail (EOG_IS_IMAGE_VIEW (user_data)); - - if (type != Bonobo_UIComponent_STATE_CHANGED) - return; - - if (!state || !atoi (state)) - return; - - image_view = EOG_IMAGE_VIEW (user_data); - - if (!strcmp (path, "DitherNone")) - dither = GNOME_EOG_DITHER_NONE; - else if (!strcmp (path, "DitherNormal")) - dither = GNOME_EOG_DITHER_NORMAL; - else if (!strcmp (path, "DitherMaximum")) - dither = GNOME_EOG_DITHER_MAXIMUM; - else { - g_warning ("Unknown dither type `%s'", path); - return; - } - - gconf_client_set_int (image_view->priv->client, - GCONF_EOG_VIEW_DITHER, - (int) dither, NULL); -} - -static void -listener_CheckType_cb (BonoboUIComponent *uic, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) -{ - EogImageView *image_view; - GNOME_EOG_CheckType check_type; - - g_return_if_fail (user_data != NULL); - g_return_if_fail (EOG_IS_IMAGE_VIEW (user_data)); - - if (type != Bonobo_UIComponent_STATE_CHANGED) - return; - - if (!state || !atoi (state)) - return; - - image_view = EOG_IMAGE_VIEW (user_data); - - if (!strcmp (path, "CheckTypeDark")) - check_type = GNOME_EOG_CHECK_TYPE_DARK; - else if (!strcmp (path, "CheckTypeMidtone")) - check_type = GNOME_EOG_CHECK_TYPE_MIDTONE; - else if (!strcmp (path, "CheckTypeLight")) - check_type = GNOME_EOG_CHECK_TYPE_LIGHT; - else if (!strcmp (path, "CheckTypeBlack")) - check_type = GNOME_EOG_CHECK_TYPE_BLACK; - else if (!strcmp (path, "CheckTypeGray")) - check_type = GNOME_EOG_CHECK_TYPE_GRAY; - else if (!strcmp (path, "CheckTypeWhite")) - check_type = GNOME_EOG_CHECK_TYPE_WHITE; - else { - g_warning ("Unknown check type `%s'", path); - return; - } - - gconf_client_set_int (image_view->priv->client, - GCONF_EOG_VIEW_CHECK_TYPE, - (int) check_type, NULL); -} - static void save_image_as_file (EogImageView *image_view, gchar *filename) { @@ -1251,113 +1130,6 @@ verb_PrintSetup_cb (BonoboUIComponent *uic, gpointer user_data, gtk_widget_show (print_setup); } -static void -listener_CheckSize_cb (BonoboUIComponent *uic, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) -{ - EogImageView *image_view; - GNOME_EOG_CheckSize check_size; - - g_return_if_fail (user_data != NULL); - g_return_if_fail (EOG_IS_IMAGE_VIEW (user_data)); - - if (type != Bonobo_UIComponent_STATE_CHANGED) - return; - - if (!state || !atoi (state)) - return; - - image_view = EOG_IMAGE_VIEW (user_data); - - if (!strcmp (path, "CheckSizeSmall")) - check_size = GNOME_EOG_CHECK_SIZE_SMALL; - else if (!strcmp (path, "CheckSizeMedium")) - check_size = GNOME_EOG_CHECK_SIZE_MEDIUM; - else if (!strcmp (path, "CheckSizeLarge")) - check_size = GNOME_EOG_CHECK_SIZE_LARGE; - else { - g_warning ("Unknown check size `%s'", path); - return; - } - - gconf_client_set_int (image_view->priv->client, - GCONF_EOG_VIEW_CHECK_SIZE, - (int) check_size, NULL); -} - - -/* Keep this in sync with interp_menu_index_from_value() below */ -static const gchar* ui_id_strings_interp_type [] = { - "InterpolationNearest", - "InterpolationBilinear", - "InterpolationHyperbolic" -}; - -static const int n_ui_id_strings_interp_type = (sizeof (ui_id_strings_interp_type) / - sizeof (ui_id_strings_interp_type[0])); - -/* Converts an enum value to the corresponding menu index for interpolation */ -static int -interp_menu_index_from_value (int value) -{ - switch (value) { - case GDK_INTERP_NEAREST: - return 0; - - case GDK_INTERP_BILINEAR: - return 1; - - case GDK_INTERP_HYPER: - return 2; - - default: - return 0; - } -} - -static const gchar* ui_id_strings_dither [] = { - "DitherNone", - "DitherNormal", - "DitherMaximum" -}; - -static const gchar* ui_id_strings_check_type [] = { - "CheckTypeDark", - "CheckTypeMidtone", - "CheckTypeLight", - "CheckTypeBlack", - "CheckTypeGray", - "CheckTypeWhite" -}; - -static const gchar* ui_id_strings_check_size [] = { - "CheckSizeSmall", - "CheckSizeMedium", - "CheckSizeLarge" -}; - -static void -set_ui_group_item (EogImageView *image_view, const gchar *group_cmd) -{ - gchar *path; - gchar *value; - - path = g_strconcat ("/commands/", group_cmd, NULL); - - value = bonobo_ui_component_get_prop (image_view->priv->uic, - path, "state", NULL); - if (value == NULL || !g_ascii_strcasecmp (value, "0")) { - bonobo_ui_component_set_prop (image_view->priv->uic, - path, "state", "1", NULL); - } - - g_free (value); - g_free (path); -} - #define EVOLUTION_MENU "" #define GNOCAM_MENU "" @@ -1386,50 +1158,6 @@ eog_image_view_create_ui (EogImageView *image_view) GNOCAM_MENU, NULL); #endif - value = gconf_client_get_int (image_view->priv->client, - GCONF_EOG_VIEW_INTERP_TYPE, - NULL); - value = interp_menu_index_from_value (value); - set_ui_group_item (image_view, ui_id_strings_interp_type [value]); - for (i = 0; i < n_ui_id_strings_interp_type; i++) { - bonobo_ui_component_add_listener (image_view->priv->uic, ui_id_strings_interp_type [i], - listener_Interpolation_cb, image_view); - } - - value = gconf_client_get_int (image_view->priv->client, - GCONF_EOG_VIEW_DITHER, - NULL); - set_ui_group_item (image_view, ui_id_strings_dither [value]); - for (i = 0; i < 3; i++) { - bonobo_ui_component_add_listener (image_view->priv->uic, ui_id_strings_dither [i], - listener_Dither_cb, image_view); - } - - value = gconf_client_get_int (image_view->priv->client, - GCONF_EOG_VIEW_CHECK_TYPE, - NULL); - set_ui_group_item (image_view, ui_id_strings_check_type [value]); - for (i = 0; i < 6; i++) { - bonobo_ui_component_add_listener (image_view->priv->uic, ui_id_strings_check_type [i], - listener_CheckType_cb, image_view); - } - - value = gconf_client_get_int (image_view->priv->client, - GCONF_EOG_VIEW_CHECK_SIZE, - NULL); - set_ui_group_item (image_view, ui_id_strings_check_size [value]); - for (i = 0; i < 3; i++) { - bonobo_ui_component_add_listener (image_view->priv->uic, ui_id_strings_check_size [i], - listener_CheckSize_cb, image_view); - } - - bonobo_ui_component_add_listener (image_view->priv->uic, "CheckSizeSmall", - listener_CheckSize_cb, image_view); - bonobo_ui_component_add_listener (image_view->priv->uic, "CheckSizeMedium", - listener_CheckSize_cb, image_view); - bonobo_ui_component_add_listener (image_view->priv->uic, "CheckSizeLarge", - listener_CheckSize_cb, image_view); - bonobo_ui_component_add_verb (image_view->priv->uic, "SaveAs", verb_SaveAs_cb, image_view); bonobo_ui_component_add_verb (image_view->priv->uic, "FullScreen", @@ -1487,8 +1215,8 @@ eog_image_view_get_prop (BonoboPropertyBag *bag, g_assert (arg->_type == TC_GNOME_EOG_Interpolation); - interp_type = (GdkInterpType) gconf_client_get_int (priv->client, - GCONF_EOG_VIEW_INTERP_TYPE, + interp_type = (GdkInterpType) gconf_client_get_bool (priv->client, + GCONF_EOG_VIEW_INTERP_TYPE, NULL); switch (interp_type) { case GDK_INTERP_NEAREST: @@ -1930,9 +1658,8 @@ eog_image_view_destroy (BonoboObject *object) priv = image_view->priv; gconf_client_notify_remove (priv->client, priv->interp_type_notify_id); - gconf_client_notify_remove (priv->client, priv->dither_notify_id); - gconf_client_notify_remove (priv->client, priv->check_type_notify_id); - gconf_client_notify_remove (priv->client, priv->check_size_notify_id); + gconf_client_notify_remove (priv->client, priv->transparency_notify_id); + gconf_client_notify_remove (priv->client, priv->trans_color_notify_id); g_object_unref (G_OBJECT (priv->client)); bonobo_object_unref (BONOBO_OBJECT (priv->property_bag)); @@ -2016,96 +1743,79 @@ interp_type_changed_cb (GConfClient *client, gpointer user_data) { EogImageView *view; - GdkInterpType interpolation; - int i; + gboolean interpolate = TRUE; view = EOG_IMAGE_VIEW (user_data); - if (entry->value != NULL && entry->value->type == GCONF_VALUE_INT) { - interpolation = (GdkInterpType) gconf_value_get_int (entry->value); + if (entry->value != NULL && entry->value->type == GCONF_VALUE_BOOL) { + interpolate = gconf_value_get_bool (entry->value); + } + + if (interpolate) { + image_view_set_interp_type (view->priv->image_view, + GDK_INTERP_BILINEAR); } else { - interpolation = GDK_INTERP_BILINEAR; + image_view_set_interp_type (view->priv->image_view, + GDK_INTERP_NEAREST); } - - image_view_set_interp_type (view->priv->image_view, interpolation); - bonobo_event_source_notify_listeners (view->priv->property_bag->es, - "interpolation", NULL, NULL); - - i = interp_menu_index_from_value (interpolation); - set_ui_group_item (view, ui_id_strings_interp_type [i]); } static void -dither_changed_cb (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - gpointer user_data) +transparency_changed_cb (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) { EogImageView *view; - GdkRgbDither dither; + const char *value = NULL; view = EOG_IMAGE_VIEW (user_data); - if (entry->value != NULL && entry->value->type == GCONF_VALUE_INT) { - dither = (GdkRgbDither) gconf_value_get_int (entry->value); - } - else { - dither = GDK_RGB_DITHER_NONE; + if (entry->value != NULL && entry->value->type == GCONF_VALUE_STRING) { + value = gconf_value_get_string (entry->value); } + + if (g_strcasecmp (value, "COLOR") == 0) { + GdkColor color; + char *color_str; - image_view_set_dither (view->priv->image_view, dither); - bonobo_event_source_notify_listeners (view->priv->property_bag->es, - "dither", NULL, NULL); - set_ui_group_item (view, ui_id_strings_dither [dither]); + color_str = gconf_client_get_string (view->priv->client, + GCONF_EOG_VIEW_TRANS_COLOR, NULL); + if (gdk_color_parse (color_str, &color)) { + image_view_set_transparent_color (view->priv->image_view, &color); + } + } + else { + image_view_set_check_type (view->priv->image_view, CHECK_TYPE_MIDTONE); + image_view_set_check_size (view->priv->image_view, CHECK_SIZE_LARGE); + } } static void -check_type_changed_cb (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - gpointer user_data) +trans_color_changed_cb (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) { EogImageView *view; - CheckType check_type; + GdkColor color; + char *value; + const char *color_str; view = EOG_IMAGE_VIEW (user_data); - if (entry->value != NULL && entry->value->type == GCONF_VALUE_INT) { - check_type = (CheckType) gconf_value_get_int (entry->value); - } - else { - check_type = CHECK_TYPE_MIDTONE; - } + value = gconf_client_get_string (view->priv->client, GCONF_EOG_VIEW_TRANSPARENCY, NULL); - image_view_set_check_type (view->priv->image_view, check_type); - bonobo_event_source_notify_listeners (view->priv->property_bag->es, - "check_type", NULL, NULL); - set_ui_group_item (view, ui_id_strings_check_type [check_type]); -} + if (g_strcasecmp (value, "COLOR") != 0) return; -static void -check_size_changed_cb (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - gpointer user_data) -{ - EogImageView *view; - CheckSize check_size; + if (entry->value != NULL && entry->value->type == GCONF_VALUE_STRING) { + color_str = gconf_value_get_string (entry->value); - view = EOG_IMAGE_VIEW (user_data); - - if (entry->value != NULL && entry->value->type == GCONF_VALUE_INT) { - check_size = (CheckSize) gconf_value_get_int (entry->value); + if (gdk_color_parse (color_str, &color)) { + image_view_set_transparent_color (view->priv->image_view, &color); + } } - else { - check_size = CHECK_SIZE_MEDIUM; - } - - image_view_set_check_size (view->priv->image_view, check_size); - bonobo_event_source_notify_listeners (view->priv->property_bag->es, - "check_size", NULL, NULL); - set_ui_group_item (view, ui_id_strings_check_size [check_size]); } /* Callback for the item factory's popup menu */ @@ -2198,6 +1908,8 @@ EogImageView * eog_image_view_construct (EogImageView *image_view, EogImage *image, gboolean zoom_fit, gboolean need_close_item) { + char *transp_str; + g_return_val_if_fail (image_view != NULL, NULL); g_return_val_if_fail (EOG_IS_IMAGE_VIEW (image_view), NULL); g_return_val_if_fail (image != NULL, NULL); @@ -2240,61 +1952,53 @@ eog_image_view_construct (EogImageView *image_view, EogImage *image, G_CALLBACK (image_view_popup_menu_cb), image_view); /* get preference values from gconf and add listeners */ + if (gconf_client_get_bool (image_view->priv->client, GCONF_EOG_VIEW_INTERP_TYPE, NULL)) { + image_view_set_interp_type (image_view->priv->image_view, GDK_INTERP_BILINEAR); + } + else { + image_view_set_interp_type (image_view->priv->image_view, GDK_INTERP_NEAREST); + } - image_view_set_interp_type (image_view->priv->image_view, - (GdkInterpType) gconf_client_get_int (image_view->priv->client, - GCONF_EOG_VIEW_INTERP_TYPE, - NULL)); - image_view_set_dither (image_view->priv->image_view, - (GdkRgbDither) gconf_client_get_int (image_view->priv->client, - GCONF_EOG_VIEW_DITHER, - NULL)); - image_view_set_check_type (image_view->priv->image_view, - (CheckType) gconf_client_get_int (image_view->priv->client, - GCONF_EOG_VIEW_CHECK_TYPE, - NULL)); - image_view_set_check_size (image_view->priv->image_view, - (CheckSize) gconf_client_get_int (image_view->priv->client, - GCONF_EOG_VIEW_CHECK_SIZE, - NULL)); + image_view_set_dither (image_view->priv->image_view, GDK_RGB_DITHER_NONE); + + transp_str = gconf_client_get_string (image_view->priv->client, + GCONF_EOG_VIEW_TRANSPARENCY, NULL); + if (g_strcasecmp (transp_str, "COLOR") == 0) { + GdkColor color; + char *color_str; + + color_str = gconf_client_get_string (image_view->priv->client, + GCONF_EOG_VIEW_TRANS_COLOR, NULL); + if (gdk_color_parse (color_str, &color)) { + image_view_set_transparent_color (image_view->priv->image_view, &color); + } + } + else { + image_view_set_check_type (image_view->priv->image_view, CHECK_TYPE_MIDTONE); + image_view_set_check_size (image_view->priv->image_view, CHECK_SIZE_LARGE); + } + + /* add gconf listeners */ image_view->priv->interp_type_notify_id = gconf_client_notify_add (image_view->priv->client, GCONF_EOG_VIEW_INTERP_TYPE, interp_type_changed_cb, image_view, NULL, NULL); - image_view->priv->dither_notify_id = + image_view->priv->transparency_notify_id = gconf_client_notify_add (image_view->priv->client, - GCONF_EOG_VIEW_DITHER, - dither_changed_cb, + GCONF_EOG_VIEW_TRANSPARENCY, + transparency_changed_cb, image_view, NULL, NULL); - image_view->priv->check_type_notify_id = + image_view->priv->trans_color_notify_id = gconf_client_notify_add (image_view->priv->client, - GCONF_EOG_VIEW_CHECK_TYPE, - check_type_changed_cb, - image_view, NULL, NULL); - image_view->priv->check_size_notify_id = - gconf_client_notify_add (image_view->priv->client, - GCONF_EOG_VIEW_CHECK_SIZE, - check_size_changed_cb, + GCONF_EOG_VIEW_TRANS_COLOR, + trans_color_changed_cb, image_view, NULL, NULL); /* Property Bag */ image_view->priv->property_bag = bonobo_property_bag_new (eog_image_view_get_prop, eog_image_view_set_prop, image_view); - - bonobo_property_bag_add (image_view->priv->property_bag, "interpolation", PROP_INTERPOLATION, - TC_GNOME_EOG_Interpolation, NULL, _("Interpolation"), - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - bonobo_property_bag_add (image_view->priv->property_bag, "dither", PROP_DITHER, - TC_GNOME_EOG_Dither, NULL, _("Dither"), - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - bonobo_property_bag_add (image_view->priv->property_bag, "check_type", PROP_CHECK_TYPE, - TC_GNOME_EOG_CheckType, NULL, _("Check Type"), - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - bonobo_property_bag_add (image_view->priv->property_bag, "check_size", PROP_CHECK_SIZE, - TC_GNOME_EOG_CheckSize, NULL, _("Check Size"), - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); bonobo_property_bag_add (image_view->priv->property_bag, "image/width", PROP_IMAGE_WIDTH, BONOBO_ARG_INT, NULL, _("Image Width"), BONOBO_PROPERTY_READABLE); diff --git a/viewer/eog-image-view.h b/viewer/eog-image-view.h index 880a37a9..44d821ba 100644 --- a/viewer/eog-image-view.h +++ b/viewer/eog-image-view.h @@ -25,7 +25,10 @@ G_BEGIN_DECLS #define EOG_IMAGE_VIEW_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EOG_IMAGE_VIEW_TYPE, EogImageViewClass)) #define GCONF_EOG_VIEW_DIR "/apps/eog/view" -#define GCONF_EOG_VIEW_INTERP_TYPE "/apps/eog/view/interp_type" +#define GCONF_EOG_VIEW_INTERP_TYPE "/apps/eog/view/interpolate" +#define GCONF_EOG_VIEW_TRANSPARENCY "/apps/eog/view/transparency" +#define GCONF_EOG_VIEW_TRANS_COLOR "/apps/eog/view/trans_color" + #define GCONF_EOG_VIEW_CHECK_TYPE "/apps/eog/view/check_type" #define GCONF_EOG_VIEW_CHECK_SIZE "/apps/eog/view/check_size" #define GCONF_EOG_VIEW_DITHER "/apps/eog/view/dither"