diff --git a/gnoemoe/widgets/gm-app-view.c b/gnoemoe/widgets/gm-app-view.c index 296d9ec..780dd76 100644 --- a/gnoemoe/widgets/gm-app-view.c +++ b/gnoemoe/widgets/gm-app-view.c @@ -93,7 +93,9 @@ void on_gm_app_view_world_state_changing(GmWorld *world, GmNetState state, GmAppView *view); void on_gm_app_view_world_active_changed(GmWorld *world, gboolean active, GmAppView *view); - +void on_gm_app_view_world_view_destroy(GmWorldView *world_view, + GmAppView *view); + #define GM_APP_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), \ GM_TYPE_APP_VIEW, GmAppViewPrivate)) @@ -453,11 +455,7 @@ gm_app_view_set_sensitivity(GmAppView *view, gboolean sens) { view->priv->action_group, "WorldInfo"), FALSE); } - if (sens) { - /* TODO: set world info menu item not sensitive if no world info avail - First fix MCP - gtk_widget_set_sensitive(if_main_get_widget("mnuWorldInfo"), sens); */ - } else { + if (!sens) { gtk_widget_hide(GTK_WIDGET(view->priv->vbox_find)); } } @@ -804,8 +802,11 @@ on_gm_app_view_world_load(GmWorld *world, GmAppView *view) { g_signal_connect(gm_world_get_mcp_session(world), "package_created", G_CALLBACK(on_gm_app_view_world_mcp_package_created), view); + g_signal_connect(world_view, "switch_page", G_CALLBACK(on_gm_app_view_world_view_notebook_switch_page), view); + g_signal_connect(world_view, "destroy", + G_CALLBACK(on_gm_app_view_world_view_destroy), view); gtk_notebook_append_page(view->priv->notebook, world_view, GTK_WIDGET(tab)); @@ -822,12 +823,18 @@ on_gm_app_view_world_load(GmWorld *world, GmAppView *view) { void on_gm_app_view_world_unload(GmWorld *world, GmAppView *view) { GmWorldView *world_view = gm_app_view_world_view_from_world(view, world); - - gtk_notebook_remove_page(view->priv->notebook, - gtk_notebook_page_num(view->priv->notebook, GTK_WIDGET(world_view))); - - if (gtk_notebook_get_n_pages(view->priv->notebook) == 0) { - gm_app_view_worlds_unloaded(view); + + g_signal_handlers_disconnect_by_func(gm_world_get_mcp_session(world), + on_gm_app_view_world_mcp_package_created, view); + + if (world_view != NULL) { + gtk_notebook_remove_page(view->priv->notebook, + gtk_notebook_page_num(view->priv->notebook, + GTK_WIDGET(world_view))); + + if (gtk_notebook_get_n_pages(view->priv->notebook) == 0) { + gm_app_view_worlds_unloaded(view); + } } } @@ -1214,6 +1221,10 @@ on_gm_app_view_world_view_notebook_switch_page(GtkNotebook *notebook, GmWorldView *world_view = GM_WORLD_VIEW(notebook); gboolean direction; + if (!GTK_IS_WIDGET(view) || !GTK_IS_WIDGET(page) || + !GTK_IS_WIDGET(view->priv->hbox_control_find)) + return; + gtk_widget_set_sensitive(GTK_WIDGET(view->priv->hbox_control_find), gm_world_view_page_can_find(world_view, page_num)); @@ -1247,10 +1258,11 @@ on_gm_app_view_notebook_switch_page(GtkNotebook * notebook, if (world) { view->priv->active_world = world; gm_world_set_active(view->priv->active_world, TRUE); - } - on_gm_app_view_world_view_notebook_switch_page(GTK_NOTEBOOK( - gm_app_view_active_world_view(view)), NULL, 0, view); + on_gm_app_view_world_view_notebook_switch_page(GTK_NOTEBOOK( + gm_app_view_active_world_view(view)), NULL, 0, view); + + } } static const gchar *authors[] = { @@ -1388,7 +1400,10 @@ on_gm_app_view_world_logs(GtkMenuItem *menuitem, GmAppView *view) { gtk_tree_view_get_selection(tview), &smodel, &iter)) { gtk_tree_model_get(smodel, &iter, 0, &tmp, -1); - tmp2 = g_strconcat(gm_world_path(world), tmp, NULL); + tmp2 = g_strconcat(gm_world_path(world), + G_DIR_SEPARATOR_S, "logs", G_DIR_SEPARATOR_S, + tmp, + NULL); gtk_widget_set_sensitive(GTK_WIDGET(dlg), FALSE); wait_cursor = gdk_cursor_new(GDK_WATCH); @@ -1453,3 +1468,19 @@ on_gm_app_view_world_mcp_package_created(GmMcpSession *session, GmMcpPackage *package, GmAppView *view) { gm_mcp_package_create_view(package, G_OBJECT(view)); } + +void +on_gm_app_view_world_view_destroy(GmWorldView *world_view, + GmAppView *view) { + GmWorld *world = gm_world_view_world(world_view); + + if (gm_world_loaded(world)) { + // This only happens when the main view is destroyed when there are + // still worlds active. The thing is we need to unload the world here + // so that anything GUI related (like mcp things) can proper finalize + // Disconnect the unload handler to avoid strange things to happen + g_signal_handlers_disconnect_by_func(world, + on_gm_app_view_world_unload, view); + gm_world_unload(world); + } +}