comparison src/layout_image.c @ 1698:bfe04f01de5e

fixed destroying of menu data Make sure that menu destroy functions do not access parent widget structures that are already destroyed There are 2 ways to achieve this: - use g_signal_handlers_disconnect_matched() like in vf_destroy_cb() - use separate data structure passed to *_popup_menu_destroy_cb() like in img-view.
author nadvornik
date Tue, 21 Jul 2009 14:17:01 +0000
parents 71b29f70d08c
children 2309e6150e8c
comparison
equal deleted inserted replaced
1697:219e1ba3ae30 1698:bfe04f01de5e
447 return ret; 447 return ret;
448 } 448 }
449 449
450 static void layout_image_popup_menu_destroy_cb(GtkWidget *widget, gpointer data) 450 static void layout_image_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
451 { 451 {
452 LayoutWindow *lw = data; 452 GList *editmenu_fd_list = data;
453 453
454 filelist_free(lw->editmenu_fd_list); 454 filelist_free(editmenu_fd_list);
455 lw->editmenu_fd_list = NULL; 455 }
456 }
457 456
458 static GList *layout_image_get_fd_list(LayoutWindow *lw) 457 static GList *layout_image_get_fd_list(LayoutWindow *lw)
459 { 458 {
460 GList *list = NULL; 459 GList *list = NULL;
461 FileData *fd = layout_image_get_fd(lw); 460 FileData *fd = layout_image_get_fd(lw);
471 GtkWidget *menu; 470 GtkWidget *menu;
472 GtkWidget *item; 471 GtkWidget *item;
473 GtkWidget *submenu; 472 GtkWidget *submenu;
474 const gchar *path; 473 const gchar *path;
475 gboolean fullscreen; 474 gboolean fullscreen;
475 GList *editmenu_fd_list;
476 476
477 path = layout_image_get_path(lw); 477 path = layout_image_get_path(lw);
478 fullscreen = layout_image_full_screen_active(lw); 478 fullscreen = layout_image_full_screen_active(lw);
479 479
480 menu = popup_menu_short_lived(); 480 menu = popup_menu_short_lived();
481 g_signal_connect(G_OBJECT(menu), "destroy",
482 G_CALLBACK(layout_image_popup_menu_destroy_cb), lw);
483 481
484 menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(li_pop_menu_zoom_in_cb), lw); 482 menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(li_pop_menu_zoom_in_cb), lw);
485 menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(li_pop_menu_zoom_out_cb), lw); 483 menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(li_pop_menu_zoom_out_cb), lw);
486 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(li_pop_menu_zoom_1_1_cb), lw); 484 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(li_pop_menu_zoom_1_1_cb), lw);
487 menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw); 485 menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw);
488 menu_item_add_divider(menu); 486 menu_item_add_divider(menu);
489 487
490 lw->editmenu_fd_list = layout_image_get_fd_list(lw); 488 editmenu_fd_list = layout_image_get_fd_list(lw);
491 submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, lw->editmenu_fd_list); 489 g_signal_connect(G_OBJECT(menu), "destroy",
490 G_CALLBACK(layout_image_popup_menu_destroy_cb), editmenu_fd_list);
491 submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, editmenu_fd_list);
492 if (!path) gtk_widget_set_sensitive(item, FALSE); 492 if (!path) gtk_widget_set_sensitive(item, FALSE);
493 menu_item_add_divider(submenu); 493 menu_item_add_divider(submenu);
494 menu_item_add(submenu, _("Set as _wallpaper"), G_CALLBACK(li_pop_menu_wallpaper_cb), lw); 494 menu_item_add(submenu, _("Set as _wallpaper"), G_CALLBACK(li_pop_menu_wallpaper_cb), lw);
495 495
496 item = submenu_add_alter(menu, G_CALLBACK(li_pop_menu_alter_cb), lw); 496 item = submenu_add_alter(menu, G_CALLBACK(li_pop_menu_alter_cb), lw);