Index: app/interface.c
===================================================================
--- app/interface.c	(revision 3668)
+++ app/interface.c	(working copy)
@@ -1007,7 +1007,7 @@
 static void
 sheet_option_menu_changed(DiaDynamicMenu *menu, gpointer user_data)
 {
-    char *string = dia_dynamic_menu_get_entry(menu);
+  char *string = dia_dynamic_menu_get_entry(menu);
   Sheet *sheet = get_sheet_by_name(string);
   if (sheet == NULL) {
     message_warning(_("No sheet named %s"), string);
@@ -1015,6 +1015,7 @@
     persistence_set_string("last-sheet-selected", string);
     fill_sheet_wbox(sheet);
   }
+  g_free(string);
 }
 
 static int
@@ -1049,7 +1050,7 @@
   sheet_option_menu =
     dia_dynamic_menu_new_stringlistbased(_("Other sheets"), sheet_names, 
 					 NULL, "sheets");
-  g_signal_connect(sheet_option_menu, "changed",
+  g_signal_connect(DIA_DYNAMIC_MENU(sheet_option_menu), "value-changed",
 		   G_CALLBACK(sheet_option_menu_changed), sheet_option_menu);
   dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(sheet_option_menu),
 				     "Assorted");
Index: lib/widgets.c
===================================================================
--- lib/widgets.c	(revision 3668)
+++ lib/widgets.c	(working copy)
@@ -60,6 +60,13 @@
   GtkHBoxClass parent_class;
 };
 
+enum {
+    DSS_VALUE_CHANGED,
+    DSS_LAST_SIGNAL
+};
+
+static guint dss_signals[DSS_LAST_SIGNAL] = { 0 };
+
 static void
 dia_size_selector_unrealize(GtkWidget *widget)
 {
@@ -75,6 +82,14 @@
   object_class = (GtkObjectClass*) class;
   widget_class = (GtkWidgetClass*) class;
   widget_class->unrealize = dia_size_selector_unrealize;
+
+  dss_signals[DSS_VALUE_CHANGED]
+      = g_signal_new("value-changed",
+		     G_TYPE_FROM_CLASS(class),
+		     G_SIGNAL_RUN_FIRST,
+		     0, NULL, NULL,
+		     g_cclosure_marshal_VOID__VOID,
+		     G_TYPE_NONE, 0);
 }
 
 static void
@@ -115,6 +130,9 @@
   }
 
   in_progress = FALSE;
+
+  g_signal_emit(ss, dss_signals[DSS_VALUE_CHANGED], 0);
+
 }
 
 /** Update the ratio of this DSS to be the ratio of width to height.
@@ -259,6 +277,8 @@
 
 /************* DiaFontSelector: ***************/
 
+/* FIXME: Should these structs be in widgets.h instead? */
+
 struct _DiaFontSelector
 {
   GtkHBox hbox;
@@ -271,7 +291,6 @@
 struct _DiaFontSelectorClass
 {
   GtkHBoxClass parent_class;
-  void (*default_handler) (DiaFontSelector *dfs);
 };
 
 enum {
@@ -318,14 +337,12 @@
   object_class = (GtkObjectClass*) class;
 
   dfontsel_signals[DFONTSEL_VALUE_CHANGED]
-      = g_signal_new("value_changed"
-		     , G_TYPE_FROM_CLASS(class)
-		     , G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION
-		     , G_STRUCT_OFFSET(DiaFontSelectorClass, default_handler)
-		     , NULL, NULL
-		     , g_cclosure_marshal_VOID__VOID
-		     , G_TYPE_NONE
-		     , 0);
+      = g_signal_new("value_changed",
+		     G_TYPE_FROM_CLASS(class),
+		     G_SIGNAL_RUN_FIRST,
+		     0, NULL, NULL,
+		     g_cclosure_marshal_VOID__VOID,
+		     G_TYPE_NONE, 0);
 }
 
 static int
@@ -390,7 +407,7 @@
       GTK_OPTION_MENU(dia_dynamic_menu_new_listbased(dia_font_selector_create_string_item,
 				     fs, _("Other fonts"),
 				     fontnames, "font-menu"));
-  g_signal_connect(fs->font_omenu, "changed",
+  g_signal_connect(DIA_DYNAMIC_MENU(fs->font_omenu), "value-changed",
 		   G_CALLBACK(dia_font_selector_fontmenu_callback), fs);
   dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(fs->font_omenu),
 				     "sans");
@@ -473,6 +490,7 @@
   dia_font_selector_set_styles(fs, fontname, -1);
   g_signal_emit(GTK_OBJECT(fs),
 		dfontsel_signals[DFONTSEL_VALUE_CHANGED], 0);
+  g_free(fontname);
 }
 
 static void
@@ -1109,6 +1127,8 @@
 
 
 /************* DiaArrowSelector: ***************/
+
+/* FIXME: Should these structs be in widgets.h instead? */
 struct _DiaArrowSelector
 {
   GtkVBox vbox;
@@ -1123,7 +1143,6 @@
 struct _DiaArrowSelectorClass
 {
   GtkVBoxClass parent_class;
-  void (*default_handler) (DiaArrowSelector *dss);
 };
 
 enum {
@@ -1137,14 +1156,12 @@
 dia_arrow_selector_class_init (DiaArrowSelectorClass *class)
 {
   das_signals[DAS_VALUE_CHANGED]
-      = g_signal_new("value_changed"
-		     , G_TYPE_FROM_CLASS(class)
-		     , G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION
-		     , G_STRUCT_OFFSET(DiaArrowSelectorClass, default_handler)
-		     , NULL, NULL
-		     , g_cclosure_marshal_VOID__VOID
-		     , G_TYPE_NONE
-		     , 0);
+      = g_signal_new("value_changed",
+		     G_TYPE_FROM_CLASS(class),
+		     G_SIGNAL_RUN_FIRST,
+		     0, NULL, NULL,
+		     g_cclosure_marshal_VOID__VOID,
+		     G_TYPE_NONE, 0);
 }
   
 static void
@@ -1164,9 +1181,17 @@
 arrow_type_change_callback(DiaDynamicMenu *ddm, gpointer userdata)
 {
   set_size_sensitivity(DIA_ARROW_SELECTOR(userdata));
-  g_signal_emit(userdata, das_signals[DAS_VALUE_CHANGED], 0);
+  g_signal_emit(DIA_ARROW_SELECTOR(userdata),
+		das_signals[DAS_VALUE_CHANGED], 0);
 }
 
+static void
+arrow_size_change_callback(DiaSizeSelector *size, gpointer userdata)
+{
+  g_signal_emit(DIA_ARROW_SELECTOR(userdata),
+		das_signals[DAS_VALUE_CHANGED], 0);
+}
+
 static GtkWidget *
 create_arrow_menu_item(DiaDynamicMenu *ddm, gchar *name)
 {
@@ -1202,7 +1227,9 @@
   gtk_box_pack_start(GTK_BOX(as), omenu, FALSE, TRUE, 0);
   gtk_widget_show(omenu);
 
-  g_signal_connect(omenu, "changed", G_CALLBACK(arrow_type_change_callback), as);
+  g_signal_connect(DIA_DYNAMIC_MENU(omenu),
+		   "value-changed", G_CALLBACK(arrow_type_change_callback),
+		   as);
 
   box = gtk_hbox_new(FALSE,0);
   as->sizebox = GTK_HBOX(box);
@@ -1215,7 +1242,9 @@
   size = dia_size_selector_new(0.0, 0.0);
   as->size = DIA_SIZE_SELECTOR(size);
   gtk_box_pack_start_defaults(GTK_BOX(box), size);
-  gtk_widget_show(size);  
+  gtk_widget_show(size);
+  g_signal_connect(size, "value-changed",
+		   G_CALLBACK(arrow_size_change_callback), as);
 
   set_size_sensitivity(as);
   gtk_box_pack_start_defaults(GTK_BOX(as), box);
@@ -1283,8 +1312,6 @@
 				arrow_types[arrow_index_from_type(arrow.type)].name);
   set_size_sensitivity(as);
   dia_size_selector_set_size(DIA_SIZE_SELECTOR(as->size), arrow.width, arrow.length);
-
-  g_signal_emit(GTK_OBJECT(as), das_signals[DAS_VALUE_CHANGED], 0);
 }
 
 /************* DiaFileSelector: ***************/
@@ -1743,14 +1770,12 @@
   object_class->destroy = dia_dynamic_menu_destroy;
   
   ddm_signals[DDM_VALUE_CHANGED]
-      = g_signal_new("changed"
-		     , G_TYPE_FROM_CLASS(class)
-		     , G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION
-		     , G_STRUCT_OFFSET(DiaDynamicMenuClass, default_handler)
-		     , NULL, NULL
-		     , g_cclosure_marshal_VOID__VOID
-		     , G_TYPE_NONE
-		     , 0);
+      = g_signal_new("value-changed",
+		     G_TYPE_FROM_CLASS(class),
+		     G_SIGNAL_RUN_FIRST,
+		     0, NULL, NULL,
+		     g_cclosure_marshal_VOID__VOID,
+		     G_TYPE_NONE, 0);
 }
 
 static void
@@ -1826,7 +1851,7 @@
     else
       gtk_option_menu_set_history(GTK_OPTION_MENU(ddm), 0);
   }
-
+  
   g_free(ddm->active);
   ddm->active = g_strdup(name);
   g_signal_emit(GTK_OBJECT(ddm), ddm_signals[DDM_VALUE_CHANGED], 0);
@@ -1928,7 +1953,8 @@
 void
 dia_dynamic_menu_add_default_entry(DiaDynamicMenu *ddm, const gchar *entry)
 {
-  ddm->default_entries = g_list_append(ddm->default_entries, g_strdup(entry));
+  ddm->default_entries = g_list_append(ddm->default_entries,
+				       g_strdup(entry));
 
   dia_dynamic_menu_create_menu(ddm);
 }
@@ -2060,14 +2086,14 @@
 {
   DiaDynamicMenu *ddm = DIA_DYNAMIC_MENU(userdata);
   PersistentList *plist = persistent_list_get(ddm->persistent_name);
-  gchar *active = g_strdup (ddm->active); 
+  gchar *active = dia_dynamic_menu_get_entry(ddm);
   g_list_foreach(plist->glist, (GFunc)g_free, NULL);
   g_list_free(plist->glist);
   plist->glist = NULL;
   dia_dynamic_menu_create_menu(ddm);
   if (active)
     dia_dynamic_menu_select_entry(ddm, active);
-  g_free (active);
+  g_free(active);
 }
 
 /** Set the maximum number of non-default entries.
Index: lib/prop_attr.c
===================================================================
--- lib/prop_attr.c	(revision 3668)
+++ lib/prop_attr.c	(working copy)
@@ -178,7 +178,7 @@
 arrowprop_get_widget(ArrowProperty *prop, PropDialog *dialog)
 { 
   GtkWidget *ret = dia_arrow_selector_new();
-  prophandler_connect(&prop->common,GTK_OBJECT(ret),"FIXME");
+  prophandler_connect(&prop->common,GTK_OBJECT(ret),"value-changed");
   return ret;
 }
 
@@ -295,7 +295,7 @@
 colorprop_get_widget(ColorProperty *prop, PropDialog *dialog)
 { 
   GtkWidget *ret = dia_color_selector_new();
-  prophandler_connect(&prop->common,GTK_OBJECT(ret),"FIXME");
+  prophandler_connect(&prop->common,GTK_OBJECT(ret),"value-changed");
   return ret;
 }
 
@@ -395,7 +395,7 @@
 fontprop_get_widget(FontProperty *prop, PropDialog *dialog)
 { 
   GtkWidget *ret = dia_font_selector_new();
-  prophandler_connect(&prop->common,GTK_OBJECT(ret),"FIXME");
+  prophandler_connect(&prop->common,GTK_OBJECT(ret),"value-changed");
   return ret;
 }
 
Index: lib/widgets.h
===================================================================
--- lib/widgets.h	(revision 3668)
+++ lib/widgets.h	(working copy)
@@ -90,6 +90,10 @@
 #define DEFAULT_COLOR color_white
 
 
+/*
+  FIXME: DiaColorSelector is actually a DiaDynamicMenu,
+  as returned by dia_color_selector_new
+*/
 struct _DiaColorSelector
 {
   GtkButton button;
@@ -106,6 +110,7 @@
   GtkButtonClass parent_class;
 };
 
+/* FIXME: _get_type is not implemented */
 GtkType    dia_color_selector_get_type  (void);
 GtkWidget* dia_color_selector_new       (void);
 void       dia_color_selector_get_color (GtkWidget *cs, Color *color);
@@ -236,7 +241,6 @@
 
 struct _DiaDynamicMenuClass {
   GtkOptionMenuClass parent_class;
-  void (*default_handler) (DiaDynamicMenu *dss);
 };
 
 GtkType    dia_dynamic_menu_get_type  (void);
