Use gtk_widget_destroy() instead of gtk_container_remove() if possible.
authorAndriy Grytsenko <andrej@rep.kiev.ua>
Wed, 13 Aug 2014 19:22:04 +0000 (22:22 +0300)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Sat, 16 Aug 2014 16:23:39 +0000 (19:23 +0300)
In most of cases the widget is not referenced and is lost anyway
therefore there is no reason to use gtk_container_remove() for it.

src/icon-grid.c
src/plugin.h
src/plugins/indicator/indicator.c
src/plugins/launchtaskbar.c
src/plugins/monitors/monitors.c
src/plugins/tray.c
src/plugins/volume/volume.c

index 24c510d..2187070 100644 (file)
@@ -258,6 +258,9 @@ static void panel_icon_grid_remove(GtkContainer *container, GtkWidget *widget)
             gboolean was_visible = gtk_widget_get_visible(widget);
 
             /* The child is found.  Remove from child list and layout container. */
+            g_signal_handlers_disconnect_by_func(widget,
+                                                 icon_grid_element_size_request,
+                                                 container);
             gtk_widget_unparent (widget);
             ig->children = g_list_remove_link(ig->children, children);
             g_list_free(children);
index 7254e58..aa7b107 100644 (file)
@@ -111,7 +111,7 @@ extern GQuark lxpanel_plugin_qdata; /* access to plugin private data */
  * Attaches data to the widget instance. The @_destructor callback will
  * be called on @_data when @_i is destroyed and therefore it should free
  * any allocated data. The instance widget at that moment is already not
- * available to use in any way so not rely on it.
+ * available to use in any way so not rely on it or its children.
  */
 #define lxpanel_plugin_set_data(_i,_data,_destructor) g_object_set_qdata_full(G_OBJECT(_i),lxpanel_plugin_qdata,_data,_destructor)
 
index d4a60c3..bbc42d4 100644 (file)
@@ -627,11 +627,8 @@ static void indicator_load_modules(Panel *panel, GtkWidget *p)
 
     gtk_widget_hide_all(p);
 
-    GList *l = NULL;
-    for (l = gtk_container_get_children(GTK_CONTAINER(indicator->menubar)); l; l = l->next)
-    {
-        gtk_widget_destroy(GTK_WIDGET(l->data));
-    }
+    gtk_container_forall(GTK_CONTAINER(indicator->menubar),
+                         (GtkCallback)gtk_widget_destroy, NULL);
 
     if (g_file_test(INDICATOR_DIR, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)))
     {
@@ -690,16 +687,13 @@ static void indicator_load_modules(Panel *panel, GtkWidget *p)
     if (indicators_loaded == 0)
     {
         /* A label to allow for click through */
-        GtkWidget * item = gtk_label_new(_("No Indicators"));
-        gtk_container_add(GTK_CONTAINER(p), item);
-        gtk_widget_show(item);
+        gtk_container_add(GTK_CONTAINER(p), gtk_label_new(_("No Indicators")));
     }
     else
     {
         gtk_container_add(GTK_CONTAINER(p), indicator->menubar);
         /* Set background to default. */
         gtk_widget_set_style(indicator->menubar, panel_get_defstyle(panel));
-        gtk_widget_show(indicator->menubar);
     }
 
     /* Update the display, show the widget, and return. */
index f95b06e..e42841c 100644 (file)
@@ -504,7 +504,6 @@ static LaunchButton *launchbutton_for_file_info(LaunchTaskBarPlugin * lb, FmFile
 
     /* Add the button to the icon grid. */
     gtk_container_add(GTK_CONTAINER(lb->lb_icon_grid), button);
-    gtk_widget_show(button);
 
     /* Drag and drop support. */
     btn->dd = fm_dnd_dest_new_with_handlers(button);
@@ -515,7 +514,7 @@ static LaunchButton *launchbutton_for_file_info(LaunchTaskBarPlugin * lb, FmFile
 
     /* If the list goes from null to non-null, remove the bootstrap button. */
     if ((lb->buttons == NULL) && (lb->bootstrap_button != NULL))
-        gtk_widget_show(lb->bootstrap_button->widget);
+        gtk_widget_hide(lb->bootstrap_button->widget);
 
     /* Append at end of list to preserve configured order. */
     lb->buttons = g_slist_append(lb->buttons, btn);
@@ -880,7 +879,7 @@ static void launchtaskbar_destructor_task(LaunchTaskBarPlugin *ltbp)
     /* Remove "window-manager-changed" handler. */
     g_signal_handlers_disconnect_by_func(ltbp->screen, taskbar_window_manager_changed, ltbp);
 
-    /* Deallocate task list. */
+    /* Deallocate task list - widgets are already destroyed there. */
     while(ltbp->p_task_list != NULL)
         task_delete(ltbp, ltbp->p_task_list, TRUE, FALSE);
 
@@ -895,6 +894,7 @@ static void launchtaskbar_destructor_task(LaunchTaskBarPlugin *ltbp)
 
     /* Deallocate other memory. */
     gtk_widget_destroy(ltbp->menu);
+    task_group_menu_destroy(ltbp);
 }
 
 /* Plugin destructor. */
@@ -955,8 +955,8 @@ static void launchbar_configure_add_button(GtkButton * widget, LaunchTaskBarPlug
 
 static void  launchbar_remove_button(LaunchTaskBarPlugin *ltbp, LaunchButton *btn)
 {
-    gtk_container_remove(GTK_CONTAINER(ltbp->lb_icon_grid), btn->widget);
     ltbp->buttons = g_slist_remove(ltbp->buttons, btn);
+    gtk_widget_destroy(btn->widget);
     config_setting_destroy(btn->settings);
     launchbutton_free(btn);
     /* Put the bootstrap button back if the list becomes empty. */
@@ -1870,7 +1870,7 @@ static void task_delete(LaunchTaskBarPlugin * tb, Task * tk, gboolean unlink, gb
     /* Deallocate structures. */
     if (remove)
     {
-        gtk_container_remove(GTK_CONTAINER(tb->tb_icon_grid), tk->button);
+        gtk_widget_destroy(tk->button);
         task_unlink_class(tk);
     }
     task_free_names(tk);
@@ -2458,6 +2458,7 @@ static gboolean taskbar_task_control_event(GtkWidget * widget, GdkEventButton *
          * positioned with respect to the button. */
         if (menu) {
             gtk_widget_show_all(menu);
+            task_group_menu_destroy(tb);
             tb->group_menu = menu;
             gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
                     (GtkMenuPositionFunc) taskbar_popup_set_position, (gpointer) tk,
index c58c740..7835975 100644 (file)
@@ -751,7 +751,7 @@ start:
         else if (!mp->displayed_monitors[i] && mp->monitors[i])
         {
             /* We've just removed monitor<i> */
-            gtk_container_remove(GTK_CONTAINER(p), mp->monitors[i]->da);
+            gtk_widget_destroy(mp->monitors[i]->da);
             monitor_free(mp->monitors[i]);
             mp->monitors[i] = NULL;
         }
index 7694941..f6534a7 100644 (file)
@@ -150,7 +150,7 @@ static void client_delete(TrayPlugin * tr, TrayClient * tc, gboolean unlink, gbo
 
     /* Remove the socket from the icon grid. */
     if (remove)
-        gtk_container_remove(GTK_CONTAINER(tr->plugin), tc->socket);
+        gtk_widget_destroy(tc->socket);
 
     /* Deallocate the client structure. */
     g_free(tc);
@@ -431,18 +431,6 @@ static void trayclient_request_dock(TrayPlugin * tr, XClientMessageEvent * xeven
     /* Allocate a socket.  This is the tray side of the Xembed connection. */
     tc->socket = gtk_socket_new();
 
-    /* Link the client structure into the client list. */
-    if (tc_pred == NULL)
-    {
-        tc->client_flink = tr->client_list;
-        tr->client_list = tc;
-    }
-    else
-    {
-        tc->client_flink = tc_pred->client_flink;
-        tc_pred->client_flink = tc;
-    }
-
     /* Add the socket to the icon grid. */
     gtk_container_add(GTK_CONTAINER(tr->plugin), tc->socket);
     gtk_widget_show(tc->socket);
@@ -454,9 +442,22 @@ static void trayclient_request_dock(TrayPlugin * tr, XClientMessageEvent * xeven
     /* Checks if the plug has been created inside of the socket. */
     if (gtk_socket_get_plug_window ( GTK_SOCKET(tc->socket) ) == NULL) {
         //fprintf(stderr, "Notice: removing plug %ud\n", tc->window );
-        gtk_container_remove(GTK_CONTAINER(tr->plugin), tc->socket);
+        gtk_widget_destroy(tc->socket);
+        g_free(tc);
         return;
     }
+
+    /* Link the client structure into the client list. */
+    if (tc_pred == NULL)
+    {
+        tc->client_flink = tr->client_list;
+        tr->client_list = tc;
+    }
+    else
+    {
+        tc->client_flink = tc_pred->client_flink;
+        tc_pred->client_flink = tc;
+    }
 }
 
 /* GDK event filter. */
@@ -662,7 +663,7 @@ static void tray_destructor(gpointer user_data)
     while (tr->messages != NULL)
         balloon_message_advance(tr, TRUE, FALSE);
 
-    /* Deallocate client list. */
+    /* Deallocate client list - widgets are already destroyed. */
     while (tr->client_list != NULL)
         client_delete(tr, tr->client_list, TRUE, FALSE);
 
index 9558f5d..c344b19 100644 (file)
@@ -96,7 +96,7 @@ static void update_icon (GtkWidget *p, volume_t *vol)
 
        if (icon) {
                if (curr_image) {
-                       gtk_container_remove(GTK_CONTAINER(p), curr_image);
+                       gtk_widget_destroy(curr_image);
                        curr_image = NULL;
                }
                image = gtk_image_new_from_pixbuf(icon);