On 3/2/07, Sameer Sahasrabuddhe <[EMAIL PROTECTED]> wrote:

Turns out that the delay was useful after all. I had a second look at
my work and it turns out that the patch does not work for arrow
selectors. The dynamic menu is more complicated than I thought it was.
Apologies for jumping the gun, but I need to work on it a bit more!

Posting a revised patch with this mail. The problem I noticed with
arrow selectors simply "disappeared". When running the compiled binary
using run_dia.sh, the arrow selector was behaving rather strangely ...
specifically the part that sets the sensitivity of the size-box. The
sensitivity was being set, based on the type of arrow /previously/
selected instead of the current one. But this seems to have
disappeared when I tried again today morning. The only thing I can
suspect is that I had not properly run make from the top-level
earlier.

The revised patch is actually smaller, containing _only_ the stuff
that is directly affected after replacing the "activate_func" callback
in the dynamic menu, with the new "changed" signal.

Also fixed a couple of memory leaks where the earlier patch did not
free the string returned by dia_dynamic_menu_get_entry().

Sameer.
--
Research Scholar, KReSIT, IIT Bombay
http://www.it.iitb.ac.in/~sameerds/
Index: app/interface.c
===================================================================
--- app/interface.c	(revision 3625)
+++ app/interface.c	(working copy)
@@ -1002,8 +1002,9 @@
 }
 
 static void
-sheet_menu_callback(DiaDynamicMenu *menu, const gchar *string, void *user_data)
+sheet_option_menu_changed(DiaDynamicMenu *menu, gpointer user_data)
 {
+  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);
@@ -1011,6 +1012,7 @@
     persistence_set_string("last-sheet-selected", string);
     fill_sheet_wbox(sheet);
   }
+  g_free(string);
 }
 
 static int
@@ -1044,8 +1046,9 @@
 
   sheet_option_menu =
     dia_dynamic_menu_new_stringlistbased(_("Other sheets"), sheet_names, 
-					 sheet_menu_callback,
 					 NULL, "sheets");
+  g_signal_connect(sheet_option_menu, "changed",
+		   G_CALLBACK(sheet_option_menu_changed), sheet_option_menu);
   dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(sheet_option_menu),
 				     "Assorted");
   dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(sheet_option_menu),
Index: lib/widgets.c
===================================================================
--- lib/widgets.c	(revision 3625)
+++ lib/widgets.c	(working copy)
@@ -291,9 +291,10 @@
  * +----------------+
  */
 
-static void dia_font_selector_fontmenu_callback(DiaDynamicMenu *button,
-						const gchar *fontname,
+static void dia_font_selector_fontmenu_callback(DiaDynamicMenu *ddm,
 						gpointer data);
+static void dia_font_selector_stylemenu_callback(GtkMenu *menu,
+						gpointer data);
 static void dia_font_selector_set_styles(DiaFontSelector *fs,
 					 const gchar *name,
 					 DiaFontStyle dia_style);
@@ -366,15 +367,13 @@
 			      g_strdup(pango_font_family_get_name(families[i])));
   }
   g_free (families);
-
-  fs->font_omenu = 
-    GTK_OPTION_MENU
-    (dia_dynamic_menu_new_listbased(dia_font_selector_create_string_item,
-				    dia_font_selector_fontmenu_callback,
-				    fs,
-				    _("Other fonts"),
-				    fontnames,
-				    "font-menu"));
+  
+  fs->font_omenu =
+      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_CALLBACK(dia_font_selector_fontmenu_callback), fs);
   dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(fs->font_omenu),
 				     "sans");
   dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(fs->font_omenu),
@@ -387,6 +386,7 @@
   omenu = gtk_option_menu_new();
   fs->style_omenu = GTK_OPTION_MENU(omenu);
   menu = gtk_menu_new ();
+  /* No callback needed since fs->style_menu keeps getting replaced. */
   fs->style_menu = GTK_MENU(menu);
   gtk_option_menu_set_menu (GTK_OPTION_MENU (fs->style_omenu), menu);
 
@@ -448,12 +448,19 @@
 }
 
 static void
-dia_font_selector_fontmenu_callback(DiaDynamicMenu *ddm, const gchar *fontname, gpointer data) 
+dia_font_selector_fontmenu_callback(DiaDynamicMenu *ddm, gpointer data) 
 {
   DiaFontSelector *fs = DIAFONTSELECTOR(data);
+  char *fontname = dia_dynamic_menu_get_entry(ddm);
   dia_font_selector_set_styles(fs, fontname, -1);
+  g_free(fontname);
 }
 
+static void
+dia_font_selector_stylemenu_callback(GtkMenu *menu, gpointer data)
+{
+}
+
 static char *style_labels[] = {
   "Normal",
   "Oblique",
@@ -495,6 +502,9 @@
   GSList *group = NULL;
 
   menu = gtk_menu_new ();
+  g_signal_connect(menu, "selection-done",
+		   G_CALLBACK(dia_font_selector_stylemenu_callback), fs);
+  
   pango_font_family_list_faces(pff, &faces, &nfaces);
 
   for (i = 0; i < nfaces; i++) {
@@ -949,11 +959,6 @@
 }
 
 static void
-dia_color_selector_activate(DiaDynamicMenu *ddm, const gchar *entry, gpointer data)
-{
-}
-
-static void
 dia_color_selector_more_callback(GtkWidget *widget, gpointer userdata)
 {
   GtkColorSelectionDialog *dialog = GTK_COLOR_SELECTION_DIALOG (gtk_color_selection_dialog_new(_("Select color")));
@@ -1024,7 +1029,6 @@
 {
   GtkWidget *otheritem = gtk_menu_item_new_with_label(_("More colors..."));
   GtkWidget *ddm = dia_dynamic_menu_new(dia_color_selector_create_string_item,
-					dia_color_selector_activate,
 					NULL,
 					GTK_MENU_ITEM(otheritem),
 					"color-menu");
@@ -1107,7 +1111,6 @@
 {
   int state;
   gchar *entryname = dia_dynamic_menu_get_entry(DIA_DYNAMIC_MENU(as->omenu));
-
   state = (entryname != NULL) && (0 != g_strcasecmp(entryname, "None"));
   g_free(entryname);
 
@@ -1116,7 +1119,7 @@
 }
 
 static void
-arrow_type_change_callback(DiaDynamicMenu *ddm, const gchar *name, gpointer userdata)
+arrow_type_change_callback(DiaDynamicMenu *ddm, gpointer userdata)
 {
   set_size_sensitivity(DIA_ARROW_SELECTOR(userdata));
 }
@@ -1145,7 +1148,7 @@
   
   GList *arrow_names = get_arrow_names();
   omenu = dia_dynamic_menu_new_listbased(create_arrow_menu_item,
-					 arrow_type_change_callback, as,
+					 as,
 					 _("More arrows"),
 					 arrow_names,
 					 "arrow-menu");
@@ -1156,6 +1159,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);
+
   box = gtk_hbox_new(FALSE,0);
   as->sizebox = GTK_HBOX(box);
 
@@ -1643,6 +1649,13 @@
 static void dia_dynamic_menu_create_menu(DiaDynamicMenu *ddm);
 static void dia_dynamic_menu_destroy(GtkObject *object);
 
+enum {
+    DDM_VALUE_CHANGED,
+    DDM_LAST_SIGNAL
+};
+
+static guint ddm_signals[DDM_LAST_SIGNAL] = { 0 };
+
 GtkType
 dia_dynamic_menu_get_type(void)
 {
@@ -1670,6 +1683,14 @@
   GtkObjectClass *object_class = (GtkObjectClass*)class;
 
   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,
+		     0, NULL, NULL,
+		     g_cclosure_marshal_VOID__VOID,
+		     G_TYPE_NONE, 0);
 }
 
 static void
@@ -1702,7 +1723,7 @@
  */
 GtkWidget *
 dia_dynamic_menu_new(DDMCreateItemFunc create, 
-		     DDMCallbackFunc activate, gpointer userdata,
+		     gpointer userdata,
 		     GtkMenuItem *otheritem, gchar *persist)
 {
   DiaDynamicMenu *ddm;
@@ -1712,7 +1733,6 @@
   ddm = DIA_DYNAMIC_MENU ( gtk_type_new (dia_dynamic_menu_get_type ()));
   
   ddm->create_func = create;
-  ddm->activate_func = activate;
   ddm->userdata = userdata;
   ddm->other_item = otheritem;
   ddm->persistent_name = persist;
@@ -1746,9 +1766,8 @@
     else
       gtk_option_menu_set_history(GTK_OPTION_MENU(ddm), 0);
   }
-  if (ddm->activate_func != NULL) {
-    (ddm->activate_func)(ddm, name, ddm->userdata);
-  }
+
+  g_signal_emit(GTK_OBJECT(ddm), ddm_signals[DDM_VALUE_CHANGED], 0);
 }
 
 static void
@@ -1771,12 +1790,11 @@
  */
 GtkWidget *
 dia_dynamic_menu_new_stringbased(GtkMenuItem *otheritem, 
-				 DDMCallbackFunc activate,
 				 gpointer userdata,
 				 gchar *persist)
 {
   GtkWidget *ddm = dia_dynamic_menu_new(dia_dynamic_menu_create_string_item,
-					activate, userdata,
+					userdata,
 					otheritem, persist);
   return ddm;
 }
@@ -1787,13 +1805,12 @@
  */
 GtkWidget *
 dia_dynamic_menu_new_listbased(DDMCreateItemFunc create,
-			       DDMCallbackFunc activate,
 			       gpointer userdata,
 			       gchar *other_label, GList *items, 
 			       gchar *persist)
 {
   GtkWidget *item = gtk_menu_item_new_with_label(other_label);
-  GtkWidget *ddm = dia_dynamic_menu_new(create, activate, userdata,
+  GtkWidget *ddm = dia_dynamic_menu_new(create, userdata,
 					GTK_MENU_ITEM(item), persist);
   dia_dynamic_menu_create_sublist(DIA_DYNAMIC_MENU(ddm), items,  create);
 
@@ -1807,12 +1824,11 @@
 GtkWidget *
 dia_dynamic_menu_new_stringlistbased(gchar *other_label, 
 				     GList *items,
-				     DDMCallbackFunc activate,
 				     gpointer userdata,
 				     gchar *persist)
 {
   return dia_dynamic_menu_new_listbased(dia_dynamic_menu_create_string_item,
-					activate, userdata,
+					userdata,
 					other_label, items, persist);
 }
 
Index: lib/widgets.h
===================================================================
--- lib/widgets.h	(revision 3625)
+++ lib/widgets.h	(working copy)
@@ -240,20 +240,17 @@
 GtkType    dia_dynamic_menu_get_type  (void);
 
 GtkWidget *dia_dynamic_menu_new(DDMCreateItemFunc create,
-				DDMCallbackFunc activate, gpointer userdata,
+				gpointer userdata,
 				GtkMenuItem *otheritem, gchar *persist);
 GtkWidget *dia_dynamic_menu_new_stringbased(GtkMenuItem *otheritem, 
-					    DDMCallbackFunc activate,
 					    gpointer userdata,
 					    gchar *persist);
 GtkWidget *dia_dynamic_menu_new_listbased(DDMCreateItemFunc create,
-					  DDMCallbackFunc activate,
 					  gpointer userdata,
 					  gchar *other_label,
 					  GList *items, gchar *persist);
 GtkWidget *dia_dynamic_menu_new_stringlistbased(gchar *other_label,
 						GList *items, 
-						DDMCallbackFunc activate,
 						gpointer userdata,
 						gchar *persist);
 void dia_dynamic_menu_add_default_entry(DiaDynamicMenu *ddm, const gchar *entry);
_______________________________________________
Dia-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/dia-list
FAQ at http://live.gnome.org/Dia/Faq
Main page at http://live.gnome.org/Dia

Reply via email to