diff --git a/capplets/background/Bonobo_Control_Capplet_background_properties.oaf b/capplets/background/Bonobo_Control_Capplet_background_properties.oaf new file mode 100644 index 000000000..099f43f7c --- /dev/null +++ b/capplets/background/Bonobo_Control_Capplet_background_properties.oaf @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + diff --git a/capplets/background/ChangeLog b/capplets/background/ChangeLog index d0a5ad8da..d2043e815 100644 --- a/capplets/background/ChangeLog +++ b/capplets/background/ChangeLog @@ -1,3 +1,7 @@ +2001-07-19 Richard Hestilow + + * bonobo-conf rewrite. + 2001-07-19 Bradford Hovinen * Makefile.am: Remove SUBDIRS diff --git a/capplets/background/Makefile.am b/capplets/background/Makefile.am index 78364f92f..0819d4286 100644 --- a/capplets/background/Makefile.am +++ b/capplets/background/Makefile.am @@ -1,16 +1,20 @@ cappletname = background cappletgroup = -bin_PROGRAMS = background-properties +bin_PROGRAMS = background-properties-capplet -background_properties_LDADD = $(GNOMECC_CAPPLETS_LIBS) -background_properties_SOURCES = \ +background_properties_capplet_LDADD = $(GNOMECC_CAPPLETS_LIBS) +background_properties_capplet_SOURCES = \ main.c\ - prefs-widget.c prefs-widget.h \ - preferences.c preferences.h \ - applier.c applier.h + applier.c applier.h pixmap_DATA = +defaultsdir= $(datadir)/control-center/defaults +defaults_DATA = background-properties.xml + +oafdir = $(datadir)/oaf +oaf_DATA = Bonobo_Control_Capplet_background_properties.oaf + ## ## You should not need to modify anything below this line ## diff --git a/capplets/background/applier.c b/capplets/background/applier.c index 661af289c..ddfdcd454 100644 --- a/capplets/background/applier.c +++ b/capplets/background/applier.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "applier.h" @@ -44,10 +45,13 @@ #define MONITOR_CONTENTS_WIDTH 157 #define MONITOR_CONTENTS_HEIGHT 111 -static GtkWidget *preview_widget; +#define PDEBUG(pix) (g_print ("file %s: line %d (%s): Setting pixbuf to %i %i\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, gdk_pixbuf_get_width (pix), gdk_pixbuf_get_height (pix))) + +static GtkWidget *preview_widget = NULL; static gboolean gdk_pixbuf_xlib_inited = FALSE; typedef struct _Renderer Renderer; +typedef struct _ApplierPreferences ApplierPreferences; enum { ARG_0, @@ -55,49 +59,77 @@ enum { struct _ApplierPrivate { - Preferences *root_prefs; - Preferences *preview_prefs; + ApplierPreferences *root_prefs; + ApplierPreferences *preview_prefs; - GdkPixbuf *wallpaper_pixbuf; - gchar *wallpaper_filename; + GdkPixbuf *wallpaper_pixbuf; + gchar *wallpaper_filename; - Renderer *root_renderer; - Renderer *preview_renderer; + Renderer *root_renderer; + Renderer *preview_renderer; - gboolean nautilus_running; + gboolean nautilus_running; }; struct _Renderer { - gboolean is_root; - gboolean is_set; + gboolean is_root; + gboolean is_set; - Preferences *prefs; + ApplierPreferences *prefs; - gint x; /* Geometry relative to pixmap */ - gint y; - gint width; - gint height; + gint x; /* Geometry relative to pixmap */ + gint y; + gint width; + gint height; - gint srcx; /* Geometry relative to pixbuf */ - gint srcy; /* (used when the wallpaper is too big) */ + gint srcx; /* Geometry relative to pixbuf */ + gint srcy; /* (used when the wallpaper is too big) */ - gint wx; /* Geometry of wallpaper as rendered */ - gint wy; - gint wwidth; - gint wheight; + gint wx; /* Geometry of wallpaper as rendered */ + gint wy; + gint wwidth; + gint wheight; - gint pwidth; /* Geometry of unscaled wallpaper */ - gint pheight; + gint pwidth; /* Geometry of unscaled wallpaper */ + gint pheight; - gint gwidth; /* Geometry of gradient-only pixmap */ - gint gheight; + gint gwidth; /* Geometry of gradient-only pixmap */ + gint gheight; - guchar *gradient_data; - GdkPixbuf *wallpaper_pixbuf; /* Alias only */ - GdkPixbuf *prescaled_pixbuf; /* For tiled on preview */ - GdkPixbuf *pixbuf; - Pixmap pixmap; + guchar *gradient_data; + GdkPixbuf *wallpaper_pixbuf; /* Alias only */ + GdkPixbuf *prescaled_pixbuf; /* For tiled on preview */ + GdkPixbuf *pixbuf; + Pixmap pixmap; +}; + +typedef enum _orientation_t { + ORIENTATION_SOLID, ORIENTATION_HORIZ, ORIENTATION_VERT +} orientation_t; + +typedef enum _wallpaper_type_t { + WPTYPE_TILED, WPTYPE_CENTERED, WPTYPE_SCALED_ASPECT, + WPTYPE_SCALED, WPTYPE_EMBOSSED +} wallpaper_type_t; + + +struct _ApplierPreferences +{ + int ref_count; + + gboolean gradient_enabled; + gboolean wallpaper_enabled; + orientation_t orientation; + wallpaper_type_t wallpaper_type; + + GdkColor *color1; + GdkColor *color2; + + gchar *wallpaper_filename; + + gboolean adjust_opacity; + gint opacity; }; static GtkObjectClass *parent_class; @@ -113,8 +145,8 @@ static void applier_get_arg (GtkObject *object, guint arg_id); static void run_render_pipeline (Renderer *renderer, - Preferences *old_prefs, - Preferences *new_prefs, + ApplierPreferences *old_prefs, + ApplierPreferences *new_prefs, GdkPixbuf *wallpaper_pixbuf); static void draw_disabled_message (GtkWidget *widget); @@ -122,7 +154,7 @@ static Renderer *renderer_new (gboolean is_root); static void renderer_destroy (Renderer *renderer); static void renderer_set_prefs (Renderer *renderer, - Preferences *prefs); + ApplierPreferences *prefs); static void renderer_set_wallpaper (Renderer *renderer, GdkPixbuf *wallpaper_pixbuf); @@ -153,14 +185,23 @@ static void tile_composite (GdkPixbuf *dest, GdkPixbuf *src, gint alpha_value); static gboolean render_gradient_p (Renderer *renderer, - Preferences *prefs); -static gboolean render_small_pixmap_p (Preferences *prefs); + ApplierPreferences *prefs); +static gboolean render_small_pixmap_p (ApplierPreferences *prefs); static Pixmap make_root_pixmap (gint width, gint height); static void set_root_pixmap (Pixmap pixmap); static gboolean is_nautilus_running (void); +/* preferences stuff -- easier than making an object */ +static ApplierPreferences* applier_preferences_pb_new (Bonobo_PropertyBag pb, CORBA_Environment *ev); +static ApplierPreferences* applier_preferences_db_new (Bonobo_ConfigDatabase db, CORBA_Environment *ev); +static void applier_preferences_ref (ApplierPreferences *prefs); +static void applier_preferences_unref (ApplierPreferences *prefs); +static void applier_preferences_free (ApplierPreferences *prefs); + +static GdkColor* bonobo_color_to_gdk (Bonobo_Config_Color *color); + guint applier_get_type (void) { @@ -210,6 +251,7 @@ applier_class_init (ApplierClass *class) parent_class = GTK_OBJECT_CLASS (gtk_type_class (gtk_object_get_type ())); + g_print ("Entering class_init\n"); if (!gdk_pixbuf_xlib_inited) { gdk_pixbuf_xlib_inited = TRUE; @@ -281,11 +323,9 @@ applier_destroy (GtkObject *object) renderer_destroy (applier->private->root_renderer); if (applier->private->root_prefs != NULL) - gtk_object_unref - (GTK_OBJECT (applier->private->root_prefs)); + applier_preferences_unref (applier->private->root_prefs); if (applier->private->preview_prefs != NULL) - gtk_object_unref - (GTK_OBJECT (applier->private->preview_prefs)); + applier_preferences_unref (applier->private->preview_prefs); if (applier->private->wallpaper_pixbuf != NULL) gdk_pixbuf_unref (applier->private->wallpaper_pixbuf); @@ -298,27 +338,23 @@ applier_destroy (GtkObject *object) } void -applier_apply_prefs (Applier *applier, Preferences *prefs, - gboolean do_root, gboolean do_preview) +applier_apply_prefs (Applier *applier, Bonobo_PropertyBag pb, Bonobo_ConfigDatabase db, CORBA_Environment *ev, gboolean do_root, gboolean do_preview) { - Preferences *new_prefs; + ApplierPreferences *prefs; g_return_if_fail (applier != NULL); g_return_if_fail (IS_APPLIER (applier)); - g_return_if_fail (prefs != NULL); - g_return_if_fail (IS_PREFERENCES (prefs)); + g_return_if_fail (pb != NULL); if (do_root && applier->private->nautilus_running) { set_root_pixmap (-1); do_root = FALSE; } - if (!prefs->enabled) { - draw_disabled_message (applier_class_get_preview_widget ()); - return; - } - - new_prefs = PREFERENCES (preferences_clone (prefs)); + if (pb != CORBA_OBJECT_NIL) + prefs = applier_preferences_pb_new (pb, ev); + else + prefs = applier_preferences_db_new (db, ev); if (((prefs->wallpaper_filename || applier->private->wallpaper_filename) && @@ -351,11 +387,11 @@ applier_apply_prefs (Applier *applier, Preferences *prefs, if (!applier->private->wallpaper_pixbuf) { g_warning (_("Could not load pixbuf \"%s\"; disabling wallpaper."), prefs->wallpaper_filename); - new_prefs->wallpaper_enabled = FALSE; + prefs->wallpaper_enabled = FALSE; } } else if (applier->private->wallpaper_pixbuf == NULL) { - new_prefs->wallpaper_enabled = FALSE; + prefs->wallpaper_enabled = FALSE; } if (do_preview) { @@ -365,15 +401,14 @@ applier_apply_prefs (Applier *applier, Preferences *prefs, run_render_pipeline (applier->private->preview_renderer, applier->private->preview_prefs, - new_prefs, + prefs, applier->private->wallpaper_pixbuf); if (applier->private->preview_prefs != NULL) - gtk_object_unref (GTK_OBJECT - (applier->private->preview_prefs)); + applier_preferences_unref (applier->private->preview_prefs); - applier->private->preview_prefs = new_prefs; - gtk_object_ref (GTK_OBJECT (new_prefs)); + applier->private->preview_prefs = prefs; + applier_preferences_ref (prefs); if (preview_widget != NULL) gtk_widget_queue_draw (preview_widget); @@ -387,18 +422,16 @@ applier_apply_prefs (Applier *applier, Preferences *prefs, run_render_pipeline (applier->private->root_renderer, applier->private->root_prefs, - new_prefs, + prefs, applier->private->wallpaper_pixbuf); if (applier->private->root_prefs != NULL) - gtk_object_unref (GTK_OBJECT - (applier->private->root_prefs)); - - applier->private->root_prefs = new_prefs; - gtk_object_ref (GTK_OBJECT (new_prefs)); + applier_preferences_unref (applier->private->root_prefs); + applier->private->root_prefs = prefs; + applier_preferences_ref (prefs); } - gtk_object_unref (GTK_OBJECT (new_prefs)); + applier_preferences_unref (prefs); } GtkWidget * @@ -483,6 +516,16 @@ applier_class_get_preview_widget (void) return preview_widget; } +void +applier_class_destroy_preview_widget (void) +{ + if (!preview_widget) + return; + if (GTK_IS_WIDGET (preview_widget)) + gtk_widget_destroy (preview_widget); + preview_widget = NULL; +} + static void draw_disabled_message (GtkWidget *widget) { @@ -530,8 +573,8 @@ draw_disabled_message (GtkWidget *widget) static void run_render_pipeline (Renderer *renderer, - Preferences *old_prefs, - Preferences *new_prefs, + ApplierPreferences *old_prefs, + ApplierPreferences *new_prefs, GdkPixbuf *wallpaper_pixbuf) { gboolean bg_formed = FALSE; @@ -539,9 +582,7 @@ run_render_pipeline (Renderer *renderer, gboolean opt_old_prefs, opt_new_prefs; g_return_if_fail (renderer != NULL); - g_return_if_fail (old_prefs == NULL || IS_PREFERENCES (old_prefs)); g_return_if_fail (new_prefs != NULL); - g_return_if_fail (IS_PREFERENCES (new_prefs)); renderer_set_prefs (renderer, new_prefs); @@ -646,18 +687,17 @@ renderer_destroy (Renderer *renderer) } static void -renderer_set_prefs (Renderer *renderer, Preferences *prefs) +renderer_set_prefs (Renderer *renderer, ApplierPreferences *prefs) { g_return_if_fail (renderer != NULL); - g_return_if_fail (prefs == NULL || IS_PREFERENCES (prefs)); if (renderer->prefs) - gtk_object_unref (GTK_OBJECT (renderer->prefs)); + applier_preferences_unref (renderer->prefs); renderer->prefs = prefs; if (prefs) - gtk_object_ref (GTK_OBJECT (prefs)); + applier_preferences_ref (prefs); } static void @@ -714,6 +754,7 @@ renderer_render_background (Renderer *renderer) (GdkPixbufDestroyNotify) g_free, NULL); + PDEBUG (renderer->pixbuf); } } @@ -741,6 +782,8 @@ renderer_render_wallpaper (Renderer *renderer) &renderer->wwidth, &renderer->wheight, &renderer->srcx, &renderer->srcy); + renderer->pwidth = MAX (renderer->pwidth, renderer->wwidth); + if (renderer->prefs->wallpaper_type == WPTYPE_TILED && renderer->wwidth != renderer->pwidth && renderer->wheight != renderer->pheight) @@ -768,7 +811,7 @@ renderer_render_wallpaper (Renderer *renderer) (gdouble) renderer->pheight; if (renderer->prefs->wallpaper_type != - WPTYPE_TILED) + WPTYPE_TILED) gdk_pixbuf_composite (renderer->wallpaper_pixbuf, renderer->pixbuf, @@ -822,6 +865,7 @@ renderer_render_wallpaper (Renderer *renderer) GDK_INTERP_BILINEAR, alpha_value, 65536, colorv, colorv); + PDEBUG (renderer->pixbuf); } } else if (renderer->wwidth != renderer->pwidth || @@ -832,7 +876,7 @@ renderer_render_wallpaper (Renderer *renderer) (gdouble) renderer->pwidth; scaley = (gdouble) renderer->wheight / (gdouble) renderer->pheight; - + g_print ("%i %i:\n", gdk_pixbuf_get_width (renderer->pixbuf), gdk_pixbuf_get_height (renderer->pixbuf)); gdk_pixbuf_scale (renderer->wallpaper_pixbuf, renderer->pixbuf, @@ -855,10 +899,12 @@ renderer_render_wallpaper (Renderer *renderer) renderer->wwidth, renderer->wheight, GDK_INTERP_BILINEAR); + PDEBUG (renderer->pixbuf); } else { renderer->pixbuf = renderer->prescaled_pixbuf; gdk_pixbuf_ref (renderer->pixbuf); + PDEBUG (renderer->pixbuf); } } } else { @@ -874,6 +920,7 @@ renderer_render_wallpaper (Renderer *renderer) gdk_pixbuf_unref (renderer->pixbuf); renderer->pixbuf = renderer->wallpaper_pixbuf; + PDEBUG (renderer->pixbuf); gdk_pixbuf_ref (renderer->pixbuf); } @@ -891,7 +938,6 @@ renderer_create_pixmap (Renderer *renderer) g_return_if_fail (renderer != NULL); g_return_if_fail (renderer->prefs != NULL); - g_return_if_fail (IS_PREFERENCES (renderer->prefs)); if (renderer->is_root) { if (renderer->prefs->gradient_enabled && @@ -1088,8 +1134,7 @@ get_geometry (wallpaper_type_t wallpaper_type, GdkPixbuf *pixbuf, if (vwidth < gdk_pixbuf_get_width (pixbuf) && wallpaper_type == WPTYPE_CENTERED) { - *srcx = (gdk_pixbuf_get_width (pixbuf) - vwidth) * - factor / 2; + *srcx = (gdk_pixbuf_get_width (pixbuf) - vwidth) / 2; *rwidth = dwidth; } else @@ -1107,8 +1152,7 @@ get_geometry (wallpaper_type_t wallpaper_type, GdkPixbuf *pixbuf, if (vheight < gdk_pixbuf_get_height (pixbuf) && wallpaper_type == WPTYPE_CENTERED) { - *srcy = (gdk_pixbuf_get_height (pixbuf) - vheight) * - factor / 2; + *srcy = (gdk_pixbuf_get_height (pixbuf) - vheight) / 2; *rheight = dheight; } else @@ -1207,7 +1251,7 @@ render_tiled_image (Pixmap pixmap, GC xgc, GdkPixbuf *pixbuf, /* Return TRUE if the gradient should be rendered, false otherwise */ static gboolean -render_gradient_p (Renderer *renderer, Preferences *prefs) +render_gradient_p (Renderer *renderer, ApplierPreferences *prefs) { return prefs->gradient_enabled && !(prefs->wallpaper_enabled && @@ -1221,7 +1265,7 @@ render_gradient_p (Renderer *renderer, Preferences *prefs) /* Return TRUE if we can optimize the rendering by using a small thin pixmap */ static gboolean -render_small_pixmap_p (Preferences *prefs) +render_small_pixmap_p (ApplierPreferences *prefs) { return prefs->gradient_enabled && !prefs->wallpaper_enabled; } @@ -1373,3 +1417,121 @@ is_nautilus_running (void) return running; } + +static gulong +pb_get_value_ulong (Bonobo_PropertyBag bag, const gchar *prop) +{ + BonoboArg *arg; + gulong val; + + arg = bonobo_property_bag_client_get_value_any (bag, prop, NULL); + val = BONOBO_ARG_GET_GENERAL (arg, TC_ulong, CORBA_unsigned_long, NULL); + bonobo_arg_release (arg); + return val; +} + +#define PB_GET_VALUE(v) (bonobo_property_bag_client_get_value_any (pb, (v), NULL)) + +/* Probably has CORBA memory leaks */ +static ApplierPreferences* +applier_preferences_pb_new (Bonobo_PropertyBag pb, CORBA_Environment *ev) +{ + ApplierPreferences *prefs = g_new0 (ApplierPreferences, 1); + + prefs->orientation = pb_get_value_ulong (pb, "orientation"); + if (prefs->orientation != ORIENTATION_SOLID) + prefs->gradient_enabled = TRUE; + + prefs->wallpaper_type = pb_get_value_ulong (pb, "wallpaper_type"); + prefs->wallpaper_filename = g_strdup (*((CORBA_char **)(PB_GET_VALUE ("wallpaper_filename"))->_value)); + if (prefs->wallpaper_filename && strcmp (prefs->wallpaper_filename, "") != 0) + prefs->wallpaper_enabled = TRUE; + + prefs->color1 = bonobo_color_to_gdk ((Bonobo_Config_Color *)(PB_GET_VALUE ("color1"))->_value); + prefs->color2 = bonobo_color_to_gdk ((Bonobo_Config_Color *)(PB_GET_VALUE ("color2"))->_value); + + prefs->opacity = BONOBO_ARG_GET_LONG (PB_GET_VALUE ("opacity")); + if (prefs->opacity != 100) + prefs->adjust_opacity = FALSE; + + prefs->ref_count = 1; + + return prefs; +} + +#define DB_GET_VALUE(v) (bonobo_config_get_value (db, (v), NULL, NULL)) + +static ApplierPreferences* +applier_preferences_db_new (Bonobo_ConfigDatabase db, CORBA_Environment *ev) +{ + ApplierPreferences *prefs = g_new0 (ApplierPreferences, 1); + + prefs->orientation = bonobo_config_get_ulong (db, "/main/orientation", NULL); + if (prefs->orientation != ORIENTATION_SOLID) + prefs->gradient_enabled = TRUE; + + prefs->wallpaper_type = bonobo_config_get_ulong (db, "/main/wallpaper_type", NULL); + prefs->wallpaper_filename = g_strdup (*((CORBA_char **)(DB_GET_VALUE ("/main/wallpaper_filename"))->_value)); + if (prefs->wallpaper_filename && strcmp (prefs->wallpaper_filename, "") != 0) + prefs->wallpaper_enabled = TRUE; + + prefs->color1 = bonobo_color_to_gdk ((Bonobo_Config_Color *)(DB_GET_VALUE ("/main/color1"))->_value); + prefs->color2 = bonobo_color_to_gdk ((Bonobo_Config_Color *)(DB_GET_VALUE ("/main/color2"))->_value); + + prefs->opacity = BONOBO_ARG_GET_LONG (DB_GET_VALUE ("/main/opacity")); + if (prefs->opacity != 100) + prefs->adjust_opacity = FALSE; + + prefs->ref_count = 1; + + return prefs; +} + +static void +applier_preferences_ref (ApplierPreferences *prefs) +{ + g_return_if_fail (prefs != NULL); + + prefs->ref_count++; +} + +static void +applier_preferences_unref (ApplierPreferences *prefs) +{ + g_return_if_fail (prefs != NULL); + + prefs->ref_count--; + if (prefs->ref_count < 1) + applier_preferences_free (prefs); +} + +static void +applier_preferences_free (ApplierPreferences *prefs) +{ + g_return_if_fail (prefs != NULL); + + if (prefs->wallpaper_filename) + g_free (prefs->wallpaper_filename); + + if (prefs->color1) + g_free (prefs->color1); + if (prefs->color2) + g_free (prefs->color2); + + g_free (prefs); +} + +static GdkColor* +bonobo_color_to_gdk (Bonobo_Config_Color *color) +{ + GdkColor *ret; + + g_return_val_if_fail (color != NULL, NULL); + + ret = g_new0 (GdkColor, 1); + ret->red = color->r * 65535; + ret->green = color->g * 65535; + ret->blue = color->b * 65535; + + return ret; +} diff --git a/capplets/background/applier.h b/capplets/background/applier.h index c10860f10..1ee7128ce 100644 --- a/capplets/background/applier.h +++ b/capplets/background/applier.h @@ -29,7 +29,7 @@ #include #include -#include "preferences.h" +#include #define APPLIER(obj) GTK_CHECK_CAST (obj, applier_get_type (), Applier) #define APPLIER_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, applier_get_type (), ApplierClass) @@ -56,9 +56,14 @@ guint applier_get_type (void); GtkObject *applier_new (void); void applier_destroy (GtkObject *object); -void applier_apply_prefs (Applier *applier, Preferences *prefs, - gboolean do_root, gboolean do_preview); +void applier_apply_prefs (Applier *applier, + Bonobo_PropertyBag pb, + Bonobo_ConfigDatabase db, + CORBA_Environment *ev, + gboolean do_root, + gboolean do_preview); GtkWidget *applier_class_get_preview_widget (void); +void applier_class_destroy_preview_widget (void); #endif /* __APPLIER_H */ diff --git a/capplets/background/background-properties.glade b/capplets/background/background-properties.glade index 6144b4d05..a32f51494 100644 --- a/capplets/background/background-properties.glade +++ b/capplets/background/background-properties.glade @@ -2,8 +2,8 @@ - New-background-properties - new-background-properties + new-background-capplet-mockup + new-background-capplet-mockup src pixmaps @@ -15,7 +15,7 @@ GtkWindow window1 - window2 + window1 GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False @@ -24,204 +24,72 @@ False - GtkTable + GtkVBox prefs_widget - 3 - 2 False - 5 - 5 + 0 - GtkCheckButton - disable_toggle - True - - toggled - disable_toggled_cb - Wed, 06 Sep 2000 00:15:45 GMT - - - True - True + GtkHBox + hbox3 + False + 0 - 0 - 1 - 0 - 1 - 0 - 0 - False - False - False - False - True - False + 0 + False + False + + + GtkVBox + preview_holder + False + 0 + + 0 + True + True + + + + Placeholder + + GtkFrame - color_frame - + frame4 + 0 GTK_SHADOW_ETCHED_IN - 0 - 1 - 1 - 2 - 0 - 0 - False - True - False - False - True - True + 0 + False + False - GtkTable - table4 - 4 - 3 - 2 + GtkHBox + hbox4 + 3 False - 4 - 4 + 3 GtkLabel - label5 - + label19 + GTK_JUSTIFY_CENTER False - 0 + 0.5 0.5 0 0 - 0 - 1 - 0 - 1 - 0 - 0 - False - False - False - False - True - False - - - - - GtkLabel - label6 - - GTK_JUSTIFY_LEFT - False - 0 - 0.5 - 0 - 0 - - 0 - 1 - 1 - 2 - 0 - 0 - False - False - False - False - True - False - - - - - GtkLabel - color2_label - - GTK_JUSTIFY_CENTER - False - 0 - 0.5 - 0 - 0 - - 0 - 1 - 2 - 3 - 0 - 0 - False - False - False - False - True - False - - - - - GnomeColorPicker - color1_select - True - - color_set - color1_select_color_set_cb - Sat, 09 Dec 2000 01:18:26 GMT - - True - False - Pick a color - - 1 - 2 - 1 - 2 - 0 - 0 - False - False - False - False - True - False - - - - - GnomeColorPicker - color2_select - True - - color_set - color2_select_color_set_cb - Sat, 09 Dec 2000 01:18:35 GMT - - True - False - Pick a color - - 1 - 2 - 2 - 3 - 0 - 0 - False - False - False - False - True - False + 0 + False + False @@ -229,24 +97,43 @@ GtkOptionMenu color_option True - Solid Color -Vertical Gradient -Horizontal Gradient + Solid color +Horizontal gradient +Vertical gradient - 1 + 0 - 1 - 2 - 0 - 1 - 0 - 0 - True - False - False - False - True - False + 0 + False + False + + + + + GnomeColorPicker + colorpicker1 + True + True + False + Pick a color + + 0 + False + False + + + + + GnomeColorPicker + colorpicker2 + True + True + False + Pick a color + + 0 + False + False @@ -254,39 +141,30 @@ Horizontal Gradient GtkFrame - wallpaper_frame - + frame3 + 0 GTK_SHADOW_ETCHED_IN - 0 - 2 - 2 - 3 - 0 - 0 - True - True - False - False - True - True + 0 + False + False GtkTable - table3 - 4 - 4 - 3 + table1 + 3 + 2 + 5 False - 4 - 4 + 3 + 3 GtkLabel - label3 - + label14 + GTK_JUSTIFY_CENTER False 0 @@ -311,8 +189,8 @@ Horizontal Gradient GtkLabel - label4 - + label15 + GTK_JUSTIFY_CENTER False 0 @@ -336,69 +214,49 @@ Horizontal Gradient - GtkOptionMenu - wp_effect_option - True - Tiled -Centered -Scaled (keep aspect ratio) -Stretched (change aspect ratio) - - 0 - - 1 - 3 - 1 - 2 - 0 - 0 - True - False - False - False - True - False - - - - - GtkButton - browse_button - True - - clicked - browse_button_cb - Fri, 08 Dec 2000 21:55:52 GMT - - - GTK_RELIEF_NORMAL - - 2 - 3 - 0 - 1 - 0 - 0 - False - False - False - False - False - False - - - - - GtkOptionMenu - wp_file_option - 66 - True - (None) - - 0 + GtkAlignment + alignment1 + 7.45058e-09 + 0.5 + 0 + 1 1 2 + 1 + 2 + 0 + 0 + False + False + False + False + True + False + + + + GtkOptionMenu + image_option + True + Tiled +Centered +Scaled (keep aspect ratio) +Stretched + + 0 + + + + + GnomeFileEntry + image_fileentry + 10 + False + False + + 1 + 5 0 1 0 @@ -410,25 +268,34 @@ Stretched (change aspect ratio) True False + + + GtkEntry + GnomeEntry:entry + entry1 + True + True + True + 0 + + - GtkCheckButton - adjust_opacity_toggle - True - - toggled - adjust_opacity_toggled_cb - Thu, 21 Dec 2000 19:54:21 GMT - - - False - True + GtkLabel + label16 + + GTK_JUSTIFY_CENTER + False + 1 + 0.5 + 0 + 0 - 0 + 2 3 - 2 - 3 + 1 + 2 0 0 False @@ -441,107 +308,71 @@ Stretched (change aspect ratio) - GtkHBox - opacity_box - False - 4 + GtkAlignment + alignment2 + 7.45058e-09 + 0.5 + 0.5 + 1 - 0 - 3 - 3 - 4 + 3 + 4 + 1 + 2 0 0 - False - True + True + False False False True - True + False - GtkLabel - label8 - - GTK_JUSTIFY_CENTER - False - 0.5 - 0.5 - 0 - 0 - - 0 - False - False - - - - - GtkHScale - opacity_adjust + GtkSpinButton + opacity_spin True - False - GTK_POS_TOP - 1 - GTK_UPDATE_CONTINUOUS - 0 - 0 - 256 - 2.56 - 25.6 - 25.6 - - 0 - True - True - - - - - GtkLabel - label9 - - GTK_JUSTIFY_CENTER + 1 + 0 + True + GTK_UPDATE_ALWAYS + False False - 0.5 - 0.5 - 0 - 0 - - 0 - False - False - + 100 + 0 + 10000 + 1 + 10 + 10 - - - - GtkFrame - monitor_frame - 210 - 170 - 0 - GTK_SHADOW_NONE - - 1 - 2 - 0 - 2 - 0 - 0 - False - False - False - False - True - True - - - - Placeholder + + GtkLabel + label18 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + + 4 + 5 + 1 + 2 + 0 + 0 + False + False + False + False + True + False + + diff --git a/capplets/background/background-properties.xml b/capplets/background/background-properties.xml new file mode 100644 index 000000000..61dbe43d8 --- /dev/null +++ b/capplets/background/background-properties.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + +
+
+ diff --git a/capplets/background/main.c b/capplets/background/main.c index 2d94704e8..08f5189bc 100644 --- a/capplets/background/main.c +++ b/capplets/background/main.c @@ -1,10 +1,10 @@ /* -*- mode: c; style: linux -*- */ /* main.c - * Copyright (C) 2000 Helix Code, Inc. - * - * Written by Bradford Hovinen (hovinen@helixcode.com) + * Copyright (C) 2000-2001 Ximian, Inc. * + * Written by: Bradford Hovinen + * Richard Hestilow * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) @@ -25,289 +25,208 @@ # include #endif -#include #include -#include -#include -#include -#include +#include #include +#include +#include "capplet-util.h" +#include "applier.h" -#include - -#ifdef HAVE_XIMIAN_ARCHIVER -# include -# include -#endif /* HAVE_XIMIAN_ARCHIVER */ - -#include "preferences.h" -#include "prefs-widget.h" - -static Preferences *prefs; -static Preferences *old_prefs; -static PrefsWidget *prefs_widget; - -static guint ok_handler_id; -static guint cancel_handler_id; - -#ifdef HAVE_XIMIAN_ARCHIVER - -static Archive *archive; -static gboolean outside_location; +static Applier *applier; static void -store_archive_data (void) +apply_settings (Bonobo_ConfigDatabase db) { - Location *location; - xmlDocPtr xml_doc; - - if (capplet_get_location () == NULL) - location = archive_get_current_location (archive); - else - location = archive_get_location (archive, - capplet_get_location ()); - - xml_doc = preferences_write_xml (prefs); - location_store_xml (location, "background-properties-capplet", - xml_doc, STORE_MASK_PREVIOUS); - xmlFreeDoc (xml_doc); - archive_close (archive); + CORBA_Environment ev; + + CORBA_exception_init (&ev); + applier_apply_prefs (applier, CORBA_OBJECT_NIL, db, &ev, TRUE, FALSE); + CORBA_exception_free (&ev); } -#endif /* HAVE_XIMIAN_ARCHIVER */ +static CORBA_any* +gdk_color_to_bonobo (const gchar *colorstr) +{ + GdkColor tmp; + CORBA_Environment ev; + DynamicAny_DynAny dyn; + CORBA_any *any; + + g_return_val_if_fail (colorstr != NULL, NULL); + + CORBA_exception_init (&ev); + + gdk_color_parse (colorstr, &tmp); + + dyn = CORBA_ORB_create_dyn_struct (bonobo_orb (), + TC_Bonobo_Config_Color, &ev); + + DynamicAny_DynAny_insert_double (dyn, ((double)tmp.red)/65535, &ev); + DynamicAny_DynAny_next (dyn, &ev); + DynamicAny_DynAny_insert_double (dyn, ((double)tmp.green)/65535, &ev); + DynamicAny_DynAny_next (dyn, &ev); + DynamicAny_DynAny_insert_double (dyn, ((double)tmp.blue)/65535, &ev); + DynamicAny_DynAny_next (dyn, &ev); + DynamicAny_DynAny_insert_double (dyn, 0, &ev); + + any = DynamicAny_DynAny_to_any (dyn, &ev); + + CORBA_Object_release ((CORBA_Object) dyn, &ev); + CORBA_exception_free (&ev); + + return any; +} static void -ok_cb (GtkWidget *widget) +copy_color_from_legacy (Bonobo_ConfigDatabase db, + const gchar *key, const gchar *legacy_key) { -#ifdef HAVE_XIMIAN_ARCHIVER - if (!outside_location) { - preferences_save (prefs); - preferences_apply_now (prefs); + gboolean def; + gchar *val_string; + + g_return_if_fail (key != NULL); + g_return_if_fail (legacy_key != NULL); + + val_string = gnome_config_get_string_with_default (legacy_key, &def); + + if (!def) + { + CORBA_any *color = gdk_color_to_bonobo (val_string); + bonobo_config_set_value (db, key, color, NULL); + bonobo_arg_release (color); } -#else /* !HAVE_XIMIAN_ARCHIVER */ - preferences_save (prefs); - preferences_apply_now (prefs); -#endif /* HAVE_XIMIAN_ARCHIVER */ - - gtk_signal_disconnect (GTK_OBJECT (prefs_widget), ok_handler_id); - gtk_signal_disconnect (GTK_OBJECT (prefs_widget), cancel_handler_id); - gtk_object_destroy (GTK_OBJECT (prefs_widget)); -#ifdef HAVE_XIMIAN_ARCHIVER - store_archive_data (); -#endif /* HAVE_XIMIAN_ARCHIVER */ + + g_free (val_string); } static void -cancel_cb (GtkWidget *widget) +get_legacy_settings (Bonobo_ConfigDatabase db) { -#ifdef HAVE_XIMIAN_ARCHIVER - if (!outside_location) { - preferences_save (old_prefs); - preferences_apply_now (old_prefs); - } -#else /* !HAVE_XIMIAN_ARCHIVER */ - preferences_save (prefs); - preferences_apply_now (prefs); -#endif /* HAVE_XIMIAN_ARCHIVER */ + gboolean val_boolean, def; + gchar *val_string; + int val_ulong, val_long; - gtk_signal_disconnect (GTK_OBJECT (prefs_widget), ok_handler_id); - gtk_signal_disconnect (GTK_OBJECT (prefs_widget), cancel_handler_id); - gtk_object_destroy (GTK_OBJECT (prefs_widget)); -} + COPY_FROM_LEGACY (string, "/main/wallpaper_filename", string, "/Background/Default/wallpaper=none"); + COPY_FROM_LEGACY (ulong, "/main/wallpaper_type", int, "/Background/Default/wallpaperAlign=0"); + copy_color_from_legacy (db, "/main/color1", "/Background/Default/color1"); + copy_color_from_legacy (db, "/main/color2", "/Background/Default/color2"); -static void -setup_capplet_widget (void) -{ - preferences_freeze (prefs); - - prefs_widget = PREFS_WIDGET (prefs_widget_new (prefs)); - - ok_handler_id = - gtk_signal_connect (GTK_OBJECT (prefs_widget), "ok", - GTK_SIGNAL_FUNC (ok_cb), NULL); - cancel_handler_id = - gtk_signal_connect (GTK_OBJECT (prefs_widget), "cancel", - GTK_SIGNAL_FUNC (cancel_cb), NULL); - - gtk_widget_show_all (GTK_WIDGET (prefs_widget)); - - preferences_thaw (prefs); -} - -#ifdef HAVE_XIMIAN_ARCHIVER - -static void -do_get_xml (void) -{ - Preferences *prefs; - xmlDocPtr doc; - - prefs = PREFERENCES (preferences_new ()); - preferences_load (prefs); - doc = preferences_write_xml (prefs); - xmlDocDump (stdout, doc); - gtk_object_destroy (GTK_OBJECT (prefs)); -} - -static void -do_set_xml (gboolean apply_settings) -{ - xmlDocPtr doc; - char buffer[16384]; - GString *doc_str; - int t = 0; - - fflush (stdin); - - fcntl (fileno (stdin), F_SETFL, 0); - - doc_str = g_string_new (""); - - while ((t = read (fileno (stdin), buffer, sizeof (buffer) - 1)) != 0) { - buffer[t] = '\0'; - g_string_append (doc_str, buffer); - } - - if (doc_str->len > 0) { - doc = xmlParseDoc (doc_str->str); - g_string_free (doc_str, TRUE); - - if (doc != NULL) { - prefs = preferences_read_xml (doc); - - if (prefs != NULL) { - if (apply_settings) { - preferences_save (prefs); - preferences_apply_now (prefs); - } - - return; - } - else if (prefs != NULL) { - return; - } - - xmlFreeDoc (doc); + /* Code to deal with new enum - messy */ + val_ulong = -1; + val_string = gnome_config_get_string_with_default ("/Background/Default/simple=solid", &def); + if (!def) + { + if (!strcmp (val_string, "solid")) + val_ulong = 0; + else + { + g_free (val_string); + val_string = gnome_config_get_string_with_default ("/Background/Default/gradient=vertical", &def); + if (!def) + val_ulong = !strcmp (val_string, "vertical"); } - } else { - g_critical ("No data to apply"); } - - return; + + g_free (val_string); + + if (val_ulong != -1) + bonobo_config_set_ulong (db, "/main/orientation", val_ulong, NULL); + + val_boolean = gnome_config_get_bool_with_default ("/Background/Default/adjustOpacity=true", &def); + if (!def && val_boolean) + { + COPY_FROM_LEGACY (long, "/main/opacity", int, "/Background/Default/opacity=100"); + } } -#endif /* HAVE_XIMIAN_ARCHIVER */ +static void +property_change_cb (BonoboListener *listener, + char *event_name, + CORBA_any *any, + CORBA_Environment *ev, + Bonobo_PropertyBag pb) +{ + applier_apply_prefs (applier, pb, CORBA_OBJECT_NIL, ev, FALSE, TRUE); +} static void -do_restore_from_defaults (void) +realize_cb (GtkWidget *widget, Bonobo_PropertyBag bag) { - prefs = PREFERENCES (preferences_new ()); - preferences_save (prefs); - preferences_apply_now (prefs); + CORBA_Environment ev; + + CORBA_exception_init (&ev); + applier_apply_prefs (applier, bag, CORBA_OBJECT_NIL, &ev, FALSE, TRUE); + CORBA_exception_free (&ev); +} + +#define CUSTOM_CREATE_PEDITOR(type, corba_type, key, widget) \ + { \ + BonoboPEditor *ed = BONOBO_PEDITOR \ + (bonobo_peditor_##type##_construct (WID (widget))); \ + bonobo_peditor_set_property (ed, bag, key, TC_##corba_type, NULL); \ + } + + +static void +setup_dialog (GtkWidget *widget, Bonobo_PropertyBag bag) +{ + BonoboPEditor *ed; + GladeXML *dialog; + + dialog = gtk_object_get_data (GTK_OBJECT (widget), "glade-data"); + ed = BONOBO_PEDITOR (bonobo_peditor_option_construct (0, WID ("color_option"))); + bonobo_peditor_set_property (ed, bag, "orientation", TC_ulong, NULL); + + CUSTOM_CREATE_PEDITOR (color, Bonobo_Config_Color, "color1", "colorpicker1"); + CUSTOM_CREATE_PEDITOR (color, Bonobo_Config_Color, "color2", "colorpicker2"); + CUSTOM_CREATE_PEDITOR (filename, Bonobo_Config_FileName, "wallpaper_filename", "image_fileentry"); + + ed = BONOBO_PEDITOR (bonobo_peditor_option_construct (0, WID ("image_option"))); + bonobo_peditor_set_property (ed, bag, "wallpaper_type", TC_ulong, NULL); + + CUSTOM_CREATE_PEDITOR (int_range, long, "opacity", "opacity_spin"); + + bonobo_event_source_client_add_listener (bag, property_change_cb, + NULL, NULL, bag); + + gtk_signal_connect_after (GTK_OBJECT (applier_class_get_preview_widget ()), "realize", realize_cb, bag); +} + +static GtkWidget* +create_dialog (void) +{ + GtkWidget *holder; + GtkWidget *widget; + GladeXML *dialog; + + dialog = glade_xml_new (GNOMECC_GLADE_DIR "/background-properties.glade", "prefs_widget"); + widget = glade_xml_get_widget (dialog, "prefs_widget"); + gtk_object_set_data (GTK_OBJECT (widget), "glade-data", dialog); + + applier = APPLIER (applier_new ()); + + /* Minor GUI addition */ + holder = WID ("preview_holder"); + gtk_box_pack_start (GTK_BOX (holder), + applier_class_get_preview_widget (), + TRUE, TRUE, 0); + gtk_widget_show_all (holder); + + gtk_signal_connect_object (GTK_OBJECT (widget), "destroy", + GTK_SIGNAL_FUNC (gtk_object_destroy), + GTK_OBJECT (dialog)); + + return widget; } int -main (int argc, char **argv) +main (int argc, char **argv) { - GnomeClient *client; - GnomeClientFlags flags; - gint token, res; - gchar *restart_args[3]; - - bindtextdomain (PACKAGE, GNOMELOCALEDIR); - textdomain (PACKAGE); - glade_gnome_init (); - res = gnome_capplet_init ("background-properties-capplet", - VERSION, argc, argv, NULL, - 0, NULL); - - if (res < 0) { - g_error ("Could not initialize the capplet."); - } - else if (res == 3) { -#ifdef HAVE_XIMIAN_ARCHIVER - do_get_xml (); -#endif /* HAVE_XIMIAN_ARCHIVER */ - return 0; - } - else if (res == 4) { -#ifdef HAVE_XIMIAN_ARCHIVER - do_set_xml (TRUE); -#endif /* HAVE_XIMIAN_ARCHIVER */ - return 0; - } - else if (res == 5) { - do_restore_from_defaults (); - return 0; - } - - client = gnome_master_client (); - flags = gnome_client_get_flags (client); - - if (flags & GNOME_CLIENT_IS_CONNECTED) { - token = gnome_startup_acquire_token - ("GNOME_BACKGROUND_PROPERTIES", - gnome_client_get_id (client)); - - if (token) { - gnome_client_set_priority (client, 20); - gnome_client_set_restart_style (client, - GNOME_RESTART_ANYWAY); - restart_args[0] = argv[0]; - restart_args[1] = "--init-session-settings"; - restart_args[2] = NULL; - gnome_client_set_restart_command (client, 2, - restart_args); - } else { - gnome_client_set_restart_style (client, - GNOME_RESTART_NEVER); - } - } else { - token = 1; - } + capplet_init (argc, argv, apply_settings, create_dialog, setup_dialog, get_legacy_settings); gnome_window_icon_set_default_from_file (GNOMECC_ICONS_DIR"/gnome-ccbackground.png"); - -#ifdef HAVE_XIMIAN_ARCHIVER - archive = ARCHIVE (archive_load (FALSE)); - - if (capplet_get_location () != NULL && - strcmp (capplet_get_location (), - archive_get_current_location_id (archive))) - { - outside_location = TRUE; - do_set_xml (FALSE); - if (prefs == NULL) return -1; - preferences_freeze (prefs); - } else { - outside_location = FALSE; - prefs = PREFERENCES (preferences_new ()); - preferences_load (prefs); - } - - if (!outside_location && (token || res == 1)) { - preferences_apply_now (prefs); - } - -#else /* !HAVE_XIMIAN_ARCHIVER */ - - prefs = PREFERENCES (preferences_new ()); - preferences_load (prefs); - - if (token || res == 1) - preferences_apply_now (prefs); - -#endif /* HAVE_XIMIAN_ARCHIVER */ - - if (!res) { - old_prefs = PREFERENCES (preferences_clone (prefs)); - setup_capplet_widget (); - - capplet_gtk_main (); - } - return 0; } diff --git a/capplets/background/preferences.h b/capplets/background/preferences.h index 2fe8f92f1..4d069e46b 100644 --- a/capplets/background/preferences.h +++ b/capplets/background/preferences.h @@ -35,15 +35,6 @@ typedef struct _Preferences Preferences; typedef struct _PreferencesClass PreferencesClass; -typedef enum _orientation_t { - ORIENTATION_HORIZ, ORIENTATION_VERT -} orientation_t; - -typedef enum _wallpaper_type_t { - WPTYPE_TILED, WPTYPE_CENTERED, WPTYPE_SCALED_ASPECT, - WPTYPE_SCALED, WPTYPE_EMBOSSED -} wallpaper_type_t; - struct _Preferences { GtkObject object;