Re: [gtk-list] Bug in ItemFactory...



On Wed, 12 May 1999, Brian Masney wrote:

> Hello,
> 
>    While I was working on buidling dynamic menus with itemfactory, I found
> a bug in the delete code. It will delete menu items fine, but it will not
> delete a branch. I wrote a quick program to demonstrate this. If I am
> doing something wrong, please let me know
> 
> Brian
> 
> #include <gtk/gtk.h>
> 
> void del (GtkWidget *widget, gpointer data);
> void exitCB (GtkWidget *widget, gpointer data);
> 
> int main (int argc, char *argv[]) {
>    GtkItemFactoryEntry menu_items[] = {
>    	{"/File",		NULL,	0,	0,	"<Branch>"},
>    	{"/File/Entry",		NULL,	0,	0},
>    	{"/File/Submenu",	NULL,	0,	0,	"<Branch>"},
>    	{"/File/Submenu/Entry1",NULL,	0,	0},
>    	{"/File/Submenu/Entry2",NULL,	0,	0}};
>    GtkItemFactory *ifactory;
>    GtkWidget *box, *button, *window;
> 
>    gtk_init (&argc, &argv);
>    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
>    gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (exitCB), NULL);
> 
>    box = gtk_vbox_new (FALSE, 0);
>    gtk_container_add (GTK_CONTAINER (window), box);
>    gtk_widget_show (box);   
>    
>    ifactory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", NULL);
>    gtk_item_factory_create_items (ifactory, 5, menu_items, NULL);
>    gtk_box_pack_start (GTK_BOX (box), ifactory->widget, FALSE, FALSE, FALSE);
>    gtk_widget_show (ifactory->widget);
>    
>    button = gtk_button_new_with_label ("  Delete Items  ");
>    gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, FALSE);
>    gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (del), (gpointer) ifactory);
>    gtk_container_set_border_width (GTK_CONTAINER (button), 10);
>    gtk_widget_show (button);
> 
>    gtk_widget_show (window);
>    gtk_main ();
>    return (0);
> }
> 
> void del (GtkWidget *widget, gpointer data) {
>    GtkItemFactory *ifactory;
>    
>    ifactory = (GtkItemFactory *) data;
>    gtk_item_factory_delete_item (ifactory, "/File/Submenu/Entry2");
>    gtk_item_factory_delete_item (ifactory, "/File/Submenu/Entry1");
>    gtk_item_factory_delete_item (ifactory, "/File/Submenu");
>    gtk_widget_set_sensitive (widget, 0);
> }

yeah, you're right. think of gtk_item_factory_delete_item as:

gtk_item_factory_delete_item (f, p)
{
  gtk_widget_destroy (gtk_item_factory_get_widget (f, p));
}

what we actually need is:

gtk_item_factory_delete_item (f, p)
{
  gtk_widget_destroy (gtk_item_factory_get_item (f, p));
}

you can use that as a work around (needs proper return value checking
of course), until 1.2.4 fixes matters ;)


> 
> void exitCB (GtkWidget *widget, gpointer data) {
>    gtk_main_quit ();
> }
>    
> 

---
ciaoTJ



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]