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