fixed creation/destroy of main window symmetry
[lttv.git] / ltt / branches / poly / lttv / modules / gui / lttvwindow / lttvwindow / callbacks.c
index b55ca4c4564237143803d7ef089aafd3d0936dc0..f42e5ea2ae7594cec40929fa8a92405cf8a7b17f 100644 (file)
@@ -1233,8 +1233,6 @@ on_load_module_activate                (GtkMenuItem     *menuitem,
        str1++;
       }
       lttv_module_require(str1, NULL);
-      g_slist_foreach(g_main_window_list, (gpointer)update_menu_toolbar_constructors,
-          NULL);
       g_strfreev(dir);
     case GTK_RESPONSE_REJECT:
     case GTK_RESPONSE_CANCEL:
@@ -1279,9 +1277,6 @@ on_unload_module_activate              (GtkMenuItem     *menuitem,
       lttv_library_info(library, &library_info);
       if(strcmp(unload_module_name, library_info.name) == 0){
              lttv_library_unload(library);
-        g_slist_foreach(g_main_window_list,
-            (gpointer)update_menu_toolbar_constructors,
-            NULL);
        break;
       }
     }    
@@ -1484,13 +1479,34 @@ void
 on_MWindow_destroy                     (GtkObject       *object,
                                         gpointer         user_data)
 {
-  MainWindow *Main_Window = get_window_data_struct((GtkWidget*)object);
+  MainWindow *main_window = get_window_data_struct((GtkWidget*)object);
   GtkWidget  *widget;
-  Tab *tab = Main_Window->tab;
+  Tab *tab = main_window->tab;
+  LttvIAttribute *attributes = main_window->attributes;
+  LttvAttributeValue value;
  
-  g_printf("There are : %d windows\n",g_slist_length(g_main_window_list));
+  //This is unnecessary, since widgets will be destroyed
+  //by the main window widget anyway.
+  //remove_all_menu_toolbar_constructors(main_window, NULL);
+
+  g_assert(lttv_iattribute_find_by_path(attributes,
+           "viewers/menu", LTTV_POINTER, &value));
+  lttv_menus_destroy((LttvMenus*)*(value.v_pointer));
+
+  g_assert(lttv_iattribute_find_by_path(attributes_global,
+           "viewers/toolbar", LTTV_POINTER, &value));
+  lttv_toolbars_destroy((LttvToolbars*)*(value.v_pointer));
+  
+  while(main_window->tab){
+    lttv_state_remove_event_hooks(
+         (LttvTracesetState*)main_window->tab->traceset_info->traceset_context);
+    main_window->tab = main_window->tab->next;
+  }
+  g_object_unref(main_window->attributes);
+  g_main_window_list = g_slist_remove(g_main_window_list, main_window);
 
   g_win_count--;
+  g_printf("There are now : %d windows\n",g_slist_length(g_main_window_list));
   if(g_win_count == 0)
     gtk_main_quit ();
 }
@@ -1876,23 +1892,20 @@ char * get_selection(char ** loaded_module_name, int nb_module,
 }
 
 
-/* Insert or remove all menu entry and tool buttons into all main windows
+/* Insert all menu entry and tool buttons into this main window
  * for modules.
  *
- * It adds them in a hash table as well, so it can keep track of which
- * menu entries and buttons are currently in each main window, for later
- * removal.
  */
 
-void update_menu_toolbar_constructors(MainWindow * mw, gpointer user_data)
+void add_all_menu_toolbar_constructors(MainWindow * mw, gpointer user_data)
 {
   int i;
   GdkPixbuf *pixbuf;
   lttvwindow_viewer_constructor constructor;
   LttvMenus * global_menu, * instance_menu;
   LttvToolbars * global_toolbar, * instance_toolbar;
-  LttvMenuClosure *menu_item_i, *menu_item_j;
-  LttvToolbarClosure *toolbar_item_i, *toolbar_item_j;
+  LttvMenuClosure *menu_item;
+  LttvToolbarClosure *toolbar_item;
   LttvAttributeValue value;
   LttvIAttribute *global_attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
   LttvIAttribute *attributes = LTTV_IATTRIBUTES(mw->attributes);
@@ -1926,118 +1939,61 @@ void update_menu_toolbar_constructors(MainWindow * mw, gpointer user_data)
 
   /* Add missing menu entries to window instance */
   for(i=0;i<global_menu->len;i++) {
-    menu_item_i = &g_array_index(global_menu, LttvMenuClosure, i);
-
-    for(j=0;j<instance_menu->len;j++) {
-      menu_item_j = &g_array_index(instance_menu, LttvMenuClosure, j);
-
-      if(menu_item_i->con == menu_item_j->con)
-        break;
-    }
-    if(j == instance_menu->len) /* not found */
-    {
-      //add menu_item_i to window instance;
-      constructor = menu_item->con;
-      tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
-      new_widget =
-              gtk_menu_item_new_with_mnemonic (menu_item_i->menuText);
-      gtk_container_add (GTK_CONTAINER (tool_menu_title_menu),
-              new_widget);
-      g_signal_connect ((gpointer) new_widget, "activate",
-                          G_CALLBACK (insert_viewer_wrap),
-                          constructor);  
-      gtk_widget_show (new_widget);
-      lttv_menus_add(instance_menu, menu_item_i->con, 
-                        menu_item_i->menu_path,
-                        menu_item_i->menu_text,
-                        new_widget);
-    }
-
-  }
+    menu_item = &g_array_index(global_menu, LttvMenuClosure, i);
+
+    //add menu_item to window instance;
+    constructor = menu_item->con;
+    tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
+    new_widget =
+      gtk_menu_item_new_with_mnemonic (menu_item->menuText);
+    gtk_container_add (GTK_CONTAINER (tool_menu_title_menu),
+        new_widget);
+    g_signal_connect ((gpointer) new_widget, "activate",
+        G_CALLBACK (insert_viewer_wrap),
+        constructor);  
+    gtk_widget_show (new_widget);
+    lttv_menus_add(instance_menu, menu_item->con, 
+        menu_item->menu_path,
+        menu_item->menu_text,
+        new_widget);
 
-  /* Remove missing menu entries from window instance */
-  for(i=0;i<instance_menu->len;i++) {
-    menu_item_i = &g_array_index(instance_menu, LttvMenuClosure, i);
-
-    for(j=0;j<global_menu->len;j++) {
-      menu_item_j = &g_array_index(global_menu, LttvMenuClosure, j);
-
-      if(menu_item_i->con == menu_item_j->con)
-        break;
-    }
-    if(j == global_menu->len) /* not found */
-    {
-      //remove menu_item_i from window instance;
-      tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
-      gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), 
-                            menu_item_i->widget);
-      lttv_menus_remove(instance_menu, menu_item_i->con);
-    }
   }
 
   /* Add missing toolbar entries to window instance */
   for(i=0;i<global_toolbar->len;i++) {
-    toolbar_item_i = &g_array_index(global_toolbar, LttvToolbarClosure, i);
-
-    for(j=0;j<instance_toolbar->len;j++) {
-      toolbar_item_j = &g_array_index(instance_toolbar, LttvToolbarClosure, j);
-
-      if(toolbar_item_i->con == toolbar_item_j->con)
-        break;
-    }
-    if(j == instance_toolbar->len) /* not found */
-    {
-      //add toolbar_item_i to window instance;
-      constructor = toolbar_item->con;
-      tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar1");
-      pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)toolbar_item->pixmap);
-      pixmap = gtk_image_new_from_pixbuf(pixbuf);
-      new_widget =
-         gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
-            GTK_TOOLBAR_CHILD_BUTTON,
-            NULL,
-            "",
-            toolbar_item->tooltip, NULL,
-            pixmap, NULL, NULL);
-      gtk_label_set_use_underline(
-          GTK_LABEL (((GtkToolbarChild*) (
-                           g_list_last (GTK_TOOLBAR 
-                              (tool_menu_title_menu)->children)->data))->label),
-          TRUE);
-      gtk_container_set_border_width (GTK_CONTAINER (new_widget), 1);
-      g_signal_connect ((gpointer) new_widget,
-          "clicked",
-          G_CALLBACK (insert_viewer_wrap),
-          constructor);       
-      gtk_widget_show (new_widget);
-   
-      lttv_toolbars_add(instance_toolbar, toolbar_item_i->con, 
-                        toolbar_item_i->tooltip,
-                        toolbar_item_i->pixmap,
-                        new_widget);
+    toolbar_item = &g_array_index(global_toolbar, LttvToolbarClosure, i);
+
+    //add toolbar_item to window instance;
+    constructor = toolbar_item->con;
+    tool_menu_title_menu = lookup_widget(mw->mwindow,"MToolbar1");
+    pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)toolbar_item->pixmap);
+    pixmap = gtk_image_new_from_pixbuf(pixbuf);
+    new_widget =
+       gtk_toolbar_append_element (GTK_TOOLBAR (tool_menu_title_menu),
+          GTK_TOOLBAR_CHILD_BUTTON,
+          NULL,
+          "",
+          toolbar_item->tooltip, NULL,
+          pixmap, NULL, NULL);
+    gtk_label_set_use_underline(
+        GTK_LABEL (((GtkToolbarChild*) (
+                         g_list_last (GTK_TOOLBAR 
+                            (tool_menu_title_menu)->children)->data))->label),
+        TRUE);
+    gtk_container_set_border_width (GTK_CONTAINER (new_widget), 1);
+    g_signal_connect ((gpointer) new_widget,
+        "clicked",
+        G_CALLBACK (insert_viewer_wrap),
+        constructor);       
+    gtk_widget_show (new_widget);
  
-    }
-  }
-
-  /* Remove missing toolbar entries from window instance */
-  for(i=0;i<instance_toolbar->len;i++) {
-    toolbar_item_i = &g_array_index(instance_toolbar, LttvToolbarClosure, i);
-
-    for(j=0;j<global_toolbar->len;j++) {
-      toolbar_item_j = &g_array_index(global_toolbar, LttvToolbarClosure, j);
+    lttv_toolbars_add(instance_toolbar, toolbar_item->con, 
+                      toolbar_item->tooltip,
+                      toolbar_item->pixmap,
+                      new_widget);
 
-      if(toolbar_item_i->con == toolbar_item_j->con)
-        break;
-    }
-    if(j == global_toolbar->len) /* not found */
-    {
-      //remove toolbar_item_i from window instance;
-      tool_menu_title_menu = lookup_widget(mw->mwindow,"ToolMenuTitle_menu");
-      gtk_container_remove (GTK_CONTAINER (tool_menu_title_menu), 
-                            toolbar_item_i->widget);
-      lttv_toolbars_remove(instance_toolbar, toolbar_item_i->con);
-    }
   }
+
 }
 
 
@@ -2076,7 +2032,7 @@ void construct_main_window(MainWindow * parent)
            "viewers/toolbar", LTTV_POINTER, &value));
   (LttvToolbars*)*(value.v_pointer) = lttv_toolbars_new();
 
-  update_menu_toolbar_constructors(new_m_window, NULL);
+  add_all_menu_toolbar_constructors(new_m_window, NULL);
   
   g_object_set_data(G_OBJECT(new_window), "mainWindow", (gpointer)new_m_window);    
   //create a default tab
@@ -2093,9 +2049,10 @@ void construct_main_window(MainWindow * parent)
                        G_OBJECT(new_m_window->mwindow),
                        "Main_Window_Data",
                        new_m_window,
-                       (GDestroyNotify)main_window_free);
+                       NULL);
 
   g_win_count++;
+  g_printf("There are now : %d windows\n",g_slist_length(g_main_window_list));
 }
 
 
This page took 0.025522 seconds and 4 git commands to generate.