shell: Pass args to existing panels
When re-activating the same panel, we could destroy and recreate the panel, or better reuse the panel, and set the new argv (usually to switch pages). Since we're changing the "argv" property of panels to not be construct- only anymore, we reviewed the panels for potential memory leaks as well. https://bugzilla.gnome.org/show_bug.cgi?id=684490
This commit is contained in:
parent
ab435aa9e1
commit
876d41b141
2 changed files with 24 additions and 7 deletions
|
@ -212,7 +212,7 @@ cc_panel_class_init (CcPanelClass *klass)
|
||||||
"Argument vector",
|
"Argument vector",
|
||||||
"Additional arguments passed on the command line",
|
"Additional arguments passed on the command line",
|
||||||
G_TYPE_STRV,
|
G_TYPE_STRV,
|
||||||
G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
|
G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS);
|
||||||
g_object_class_install_property (object_class, PROP_ARGV, pspec);
|
g_object_class_install_property (object_class, PROP_ARGV, pspec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,8 @@ struct _GnomeControlCenterPrivate
|
||||||
GtkWidget *scrolled_window;
|
GtkWidget *scrolled_window;
|
||||||
GtkWidget *search_scrolled;
|
GtkWidget *search_scrolled;
|
||||||
GtkWidget *current_panel_box;
|
GtkWidget *current_panel_box;
|
||||||
|
GtkWidget *current_panel;
|
||||||
|
char *current_panel_id;
|
||||||
GtkWidget *window;
|
GtkWidget *window;
|
||||||
GtkWidget *search_entry;
|
GtkWidget *search_entry;
|
||||||
GtkWidget *lock_button;
|
GtkWidget *lock_button;
|
||||||
|
@ -183,7 +185,6 @@ activate_panel (GnomeControlCenter *shell,
|
||||||
GnomeControlCenterPrivate *priv = shell->priv;
|
GnomeControlCenterPrivate *priv = shell->priv;
|
||||||
GType panel_type = G_TYPE_INVALID;
|
GType panel_type = G_TYPE_INVALID;
|
||||||
GList *panels, *l;
|
GList *panels, *l;
|
||||||
GtkWidget *panel;
|
|
||||||
GtkWidget *box;
|
GtkWidget *box;
|
||||||
const gchar *icon_name;
|
const gchar *icon_name;
|
||||||
|
|
||||||
|
@ -218,17 +219,17 @@ activate_panel (GnomeControlCenter *shell,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create the panel plugin */
|
/* create the panel plugin */
|
||||||
panel = g_object_new (panel_type, "shell", shell, "argv", argv, NULL);
|
priv->current_panel = g_object_new (panel_type, "shell", shell, "argv", argv, NULL);
|
||||||
cc_shell_set_active_panel (CC_SHELL (shell), CC_PANEL (panel));
|
cc_shell_set_active_panel (CC_SHELL (shell), CC_PANEL (priv->current_panel));
|
||||||
gtk_widget_show (panel);
|
gtk_widget_show (priv->current_panel);
|
||||||
|
|
||||||
gtk_lock_button_set_permission (GTK_LOCK_BUTTON (priv->lock_button),
|
gtk_lock_button_set_permission (GTK_LOCK_BUTTON (priv->lock_button),
|
||||||
cc_panel_get_permission (CC_PANEL (panel)));
|
cc_panel_get_permission (CC_PANEL (priv->current_panel)));
|
||||||
|
|
||||||
box = gtk_alignment_new (0, 0, 1, 1);
|
box = gtk_alignment_new (0, 0, 1, 1);
|
||||||
gtk_alignment_set_padding (GTK_ALIGNMENT (box), 6, 6, 6, 6);
|
gtk_alignment_set_padding (GTK_ALIGNMENT (box), 6, 6, 6, 6);
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (box), panel);
|
gtk_container_add (GTK_CONTAINER (box), priv->current_panel);
|
||||||
|
|
||||||
gtk_widget_set_name (box, id);
|
gtk_widget_set_name (box, id);
|
||||||
notebook_add_page (priv->notebook, box);
|
notebook_add_page (priv->notebook, box);
|
||||||
|
@ -275,6 +276,7 @@ shell_show_overview_page (GnomeControlCenter *center)
|
||||||
|
|
||||||
if (priv->current_panel_box)
|
if (priv->current_panel_box)
|
||||||
notebook_remove_page (priv->notebook, priv->current_panel_box);
|
notebook_remove_page (priv->notebook, priv->current_panel_box);
|
||||||
|
priv->current_panel = NULL;
|
||||||
priv->current_panel_box = NULL;
|
priv->current_panel_box = NULL;
|
||||||
|
|
||||||
/* clear the search text */
|
/* clear the search text */
|
||||||
|
@ -956,6 +958,15 @@ _shell_set_active_panel_from_id (CcShell *shell,
|
||||||
GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (shell)->priv;
|
GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (shell)->priv;
|
||||||
GtkWidget *old_panel;
|
GtkWidget *old_panel;
|
||||||
|
|
||||||
|
/* When loading the same panel again, just set the argv */
|
||||||
|
if (g_strcmp0 (priv->current_panel_id, start_id) == 0)
|
||||||
|
{
|
||||||
|
g_object_set (G_OBJECT (priv->current_panel), "argv", argv, NULL);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (priv->current_panel_id);
|
||||||
|
|
||||||
/* clear any custom widgets */
|
/* clear any custom widgets */
|
||||||
_shell_remove_all_custom_widgets (priv);
|
_shell_remove_all_custom_widgets (priv);
|
||||||
|
|
||||||
|
@ -1011,6 +1022,10 @@ _shell_set_active_panel_from_id (CcShell *shell,
|
||||||
if (old_panel)
|
if (old_panel)
|
||||||
notebook_remove_page (priv->notebook, old_panel);
|
notebook_remove_page (priv->notebook, old_panel);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
priv->current_panel_id = g_strdup (start_id);
|
||||||
|
}
|
||||||
|
|
||||||
g_free (name);
|
g_free (name);
|
||||||
g_free (desktop);
|
g_free (desktop);
|
||||||
|
@ -1058,6 +1073,8 @@ gnome_control_center_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (object)->priv;
|
GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (object)->priv;
|
||||||
|
|
||||||
|
g_free (priv->current_panel_id);
|
||||||
|
|
||||||
if (priv->custom_widgets)
|
if (priv->custom_widgets)
|
||||||
{
|
{
|
||||||
g_ptr_array_unref (priv->custom_widgets);
|
g_ptr_array_unref (priv->custom_widgets);
|
||||||
|
|
Loading…
Add table
Reference in a new issue