comparison src/layout_image.c @ 1675:717374fb1bbd

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 7ed0b45c80ae
children c029adbabb70
comparison
equal deleted inserted replaced
1674:d5c921f9bb4c 1675:717374fb1bbd
448 return ret; 448 return ret;
449 } 449 }
450 450
451 static void layout_image_popup_menu_destroy_cb(GtkWidget *widget, gpointer data) 451 static void layout_image_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
452 { 452 {
453 LayoutWindow *lw = data; 453 GList *editmenu_fd_list = data;
454 454
455 filelist_free(lw->editmenu_fd_list); 455 filelist_free(editmenu_fd_list);
456 lw->editmenu_fd_list = NULL; 456 }
457 }
458 457
459 static GList *layout_image_get_fd_list(LayoutWindow *lw) 458 static GList *layout_image_get_fd_list(LayoutWindow *lw)
460 { 459 {
461 GList *list = NULL; 460 GList *list = NULL;
462 FileData *fd = layout_image_get_fd(lw); 461 FileData *fd = layout_image_get_fd(lw);
472 GtkWidget *menu; 471 GtkWidget *menu;
473 GtkWidget *item; 472 GtkWidget *item;
474 GtkWidget *submenu; 473 GtkWidget *submenu;
475 const gchar *path; 474 const gchar *path;
476 gboolean fullscreen; 475 gboolean fullscreen;
476 GList *editmenu_fd_list;
477 477
478 path = layout_image_get_path(lw); 478 path = layout_image_get_path(lw);
479 fullscreen = layout_image_full_screen_active(lw); 479 fullscreen = layout_image_full_screen_active(lw);
480 480
481 menu = popup_menu_short_lived(); 481 menu = popup_menu_short_lived();
482 g_signal_connect(G_OBJECT(menu), "destroy",
483 G_CALLBACK(layout_image_popup_menu_destroy_cb), lw);
484 482
485 menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(li_pop_menu_zoom_in_cb), lw); 483 menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(li_pop_menu_zoom_in_cb), lw);
486 menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(li_pop_menu_zoom_out_cb), lw); 484 menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(li_pop_menu_zoom_out_cb), lw);
487 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(li_pop_menu_zoom_1_1_cb), lw); 485 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(li_pop_menu_zoom_1_1_cb), lw);
488 menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw); 486 menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw);
489 menu_item_add_divider(menu); 487 menu_item_add_divider(menu);
490 488
491 lw->editmenu_fd_list = layout_image_get_fd_list(lw); 489 editmenu_fd_list = layout_image_get_fd_list(lw);
492 submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, lw->editmenu_fd_list); 490 g_signal_connect(G_OBJECT(menu), "destroy",
491 G_CALLBACK(layout_image_popup_menu_destroy_cb), editmenu_fd_list);
492 submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, editmenu_fd_list);
493 if (!path) gtk_widget_set_sensitive(item, FALSE); 493 if (!path) gtk_widget_set_sensitive(item, FALSE);
494 menu_item_add_divider(submenu); 494 menu_item_add_divider(submenu);
495 menu_item_add(submenu, _("Set as _wallpaper"), G_CALLBACK(li_pop_menu_wallpaper_cb), lw); 495 menu_item_add(submenu, _("Set as _wallpaper"), G_CALLBACK(li_pop_menu_wallpaper_cb), lw);
496 496
497 item = submenu_add_alter(menu, G_CALLBACK(li_pop_menu_alter_cb), lw); 497 item = submenu_add_alter(menu, G_CALLBACK(li_pop_menu_alter_cb), lw);