Hello, ...as my "undo/redo thing" has to wait for a little bit more support from gio... I'm sitting down here playing with the source code, hoping to produce something useful... Sooo... this patch extends the libnautilus-extension plugin mechanism by allowing new widgets to be added to the information sidebar. It could be interesting for Tracker / Beagle to integrate a widget to set/retrieve/show tags attached to files, or to integrate a mini player for audio/video files, or to integrate a sudoku widget, or... Ideally, everything that is shown now in the sidebar (icon, info, and "open with..." buttons) could be implemented as plugins. For now, communication is only from nautilus to the plugin (i.e. a plugin cannot ask something to nautilus): the plugin gets notified when the current selection changes and when the location changes. If you see a use case where communication between the plugin and nautilus would be useful raise your hand. A simple example plugin can be found at http://diuf.unifr.ch/pai/people/broccoa/dev/simple-sidebar-plugin.tar.gz and a screencast: http://www.youtube.com/watch?v=xmqGc2Il34M) Reviews, comments, etc. are welcome cheers A. -- Amos Brocco | Ph.D Student | Computer Science Department - DIUF | University of Fribourg | A406 Pérolles 21 | Bd. Pérolles 90 | CH-1700 Fribourg | http://diuf.unifr.ch/pai/people/broccoa
--- nautilus-2.22.0/libnautilus-extension/nautilus-sidebar-widget-provider.h 1970-01-01 01:00:00.000000000 +0100 +++ nautilus-2.22.0-workspace/libnautilus-extension/nautilus-sidebar-widget-provider.h 2008-03-23 16:56:51.000000000 +0100 @@ -0,0 +1,62 @@ +/* + * nautilus-sidebar-widget-provider.c - Interface for Nautilus extensions that + * provide sidebar widgets. + * + * Copyright (C) 2008 Amos Brocco + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +/* This interface is implemented by Nautilus extensions that want to + * provide information sidebar widgets. Those widges are created along + * with the Information sidebar. + */ + +#ifndef NAUTILUS_SIDEBAR_WIDGET_PROVIDER_H +#define NAUTILUS_SIDEBAR_WIDGET_PROVIDER_H + +#include <glib-object.h> +#include <gtk/gtkwidget.h> +#include "nautilus-extension-types.h" +#include "nautilus-sidebar-widget.h" + +G_BEGIN_DECLS + +#define NAUTILUS_TYPE_SIDEBAR_WIDGET_PROVIDER (nautilus_sidebar_widget_provider_get_type ()) +#define NAUTILUS_SIDEBAR_WIDGET_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET_PROVIDER, NautilusSidebarWidgetProvider)) +#define NAUTILUS_IS_SIDEBAR_WIDGET_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET_PROVIDER)) +#define NAUTILUS_SIDEBAR_WIDGET_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET_PROVIDER, NautilusSidebarWidgetProviderIface)) + +typedef struct _NautilusSidebarWidgetProvider NautilusSidebarWidgetProvider; +typedef struct _NautilusSidebarWidgetProviderIface NautilusSidebarWidgetProviderIface; + +struct _NautilusSidebarWidgetProviderIface { + GTypeInterface g_iface; + + NautilusSidebarWidget* (*get_widget) (NautilusSidebarWidgetProvider *provider); + char* (*get_name) (NautilusSidebarWidgetProvider *provider); + int (*get_order) (NautilusSidebarWidgetProvider *provider); +}; + +/* Interface Functions */ +GType nautilus_sidebar_widget_provider_get_type (void); +NautilusSidebarWidget* nautilus_sidebar_widget_provider_get_widget (NautilusSidebarWidgetProvider* provider); +gchar* nautilus_sidebar_widget_provider_get_name (NautilusSidebarWidgetProvider* provider); +int nautilus_sidebar_widget_provider_get_order (NautilusSidebarWidgetProvider* provider); + +G_END_DECLS + +#endif --- nautilus-2.22.0/libnautilus-extension/Makefile.in 2008-03-11 00:28:38.000000000 +0100 +++ nautilus-2.22.0-workspace/libnautilus-extension/Makefile.in 2008-03-23 17:06:40.000000000 +0100 @@ -64,6 +64,7 @@ am__objects_1 = am_libnautilus_extension_la_OBJECTS = nautilus-column-provider.lo \ nautilus-column.lo nautilus-extension-types.lo \ nautilus-file-info.lo nautilus-info-provider.lo \ + nautilus-sidebar-widget.lo nautilus-sidebar-widget-provider.lo \ nautilus-location-widget-provider.lo nautilus-menu-item.lo \ nautilus-menu-provider.lo nautilus-property-page-provider.lo \ nautilus-property-page.lo nautilus-menu.lo $(am__objects_1) @@ -326,6 +327,8 @@ libnautilus_extension_include_HEADERS = nautilus-menu-provider.h \ nautilus-property-page-provider.h \ nautilus-property-page.h \ + nautilus-sidebar-widget.h \ + nautilus-sidebar-widget-provider.h \ nautilus-menu.h \ $(NULL) @@ -341,6 +344,8 @@ libnautilus_extension_la_SOURCES = \ nautilus-menu-provider.c \ nautilus-property-page-provider.c \ nautilus-property-page.c \ + nautilus-sidebar-widget.c \ + nautilus-sidebar-widget-provider.c \ nautilus-menu.c \ $(NULL) @@ -434,6 +439,9 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/nautilus-menu Plo am__quote@ @AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/nautilus-property-page-provider Plo am__quote@ @AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/nautilus-property-page Plo am__quote@ + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/nautilus-sidebar-widget-provider Plo am__quote@ + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/nautilus-sidebar-widget Plo am__quote@ + .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< --- nautilus-2.22.0/libnautilus-extension/nautilus-sidebar-widget-provider.c 1970-01-01 01:00:00.000000000 +0100 +++ nautilus-2.22.0-workspace/libnautilus-extension/nautilus-sidebar-widget-provider.c 2008-03-23 17:09:18.000000000 +0100 @@ -0,0 +1,85 @@ +/* + * nautilus-sidebar-widget-provider.c - Interface for Nautilus + extensions that provide extra widgets for the Information sidebar. + * + * Copyright (C) 2008 Amos Brocco + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include <config.h> +#include "nautilus-sidebar-widget-provider.h" + +#include <glib-object.h> + +static void +nautilus_sidebar_widget_provider_base_init (gpointer g_class) +{ +} + +GType +nautilus_sidebar_widget_provider_get_type (void) +{ + static GType type = 0; + + if (!type) { + const GTypeInfo info = { + sizeof (NautilusSidebarWidgetProviderIface), + nautilus_sidebar_widget_provider_base_init, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + NULL + }; + + type = g_type_register_static (G_TYPE_INTERFACE, + "NautilusSidebarWidgetProvider", + &info, 0); + g_type_interface_add_prerequisite (type, G_TYPE_OBJECT); + } + + return type; +} + +NautilusSidebarWidget* +nautilus_sidebar_widget_provider_get_widget (NautilusSidebarWidgetProvider* provider) +{ + g_return_val_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET_PROVIDER (provider), NULL); + + return NAUTILUS_SIDEBAR_WIDGET_PROVIDER_GET_IFACE (provider)->get_widget (provider); + +} + +gchar* +nautilus_sidebar_widget_provider_get_name (NautilusSidebarWidgetProvider* provider) +{ + g_return_val_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET_PROVIDER (provider), NULL); + + return NAUTILUS_SIDEBAR_WIDGET_PROVIDER_GET_IFACE (provider)->get_name (provider); + +} + +int +nautilus_sidebar_widget_provider_get_order (NautilusSidebarWidgetProvider* provider) +{ + g_return_val_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET_PROVIDER (provider), -1); + + return NAUTILUS_SIDEBAR_WIDGET_PROVIDER_GET_IFACE (provider)->get_order (provider); + +} --- nautilus-2.22.0/libnautilus-extension/nautilus-sidebar-widget.c 1970-01-01 01:00:00.000000000 +0100 +++ nautilus-2.22.0-workspace/libnautilus-extension/nautilus-sidebar-widget.c 2008-03-24 00:03:28.000000000 +0100 @@ -0,0 +1,83 @@ +/* + * nautilus-sidebar-widget-.c - Interface for Nautilus + extensions that provide extra widgets for the Information sidebar. + * + * Copyright (C) 2008 Amos Brocco + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include <config.h> +#include "nautilus-sidebar-widget.h" + +#include <glib-object.h> + +static void +nautilus_sidebar_widget_base_init (gpointer g_class) +{ +} + +GType +nautilus_sidebar_widget_get_type (void) +{ + static GType type = 0; + + if (!type) { + const GTypeInfo info = { + sizeof (NautilusSidebarWidgetIface), + nautilus_sidebar_widget_base_init, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + NULL + }; + + type = g_type_register_static (G_TYPE_INTERFACE, + "NautilusSidebarWidget", + &info, 0); + g_type_interface_add_prerequisite (type, GTK_TYPE_WIDGET); + } + + return type; +} + +GtkWidget* +nautilus_sidebar_widget_get_widget (NautilusSidebarWidget* widget) +{ + g_return_val_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET (widget), NULL); + + return NAUTILUS_SIDEBAR_WIDGET_GET_IFACE (widget)->get_widget (widget); + +} + +void +nautilus_sidebar_widget_selection_changed (NautilusSidebarWidget* widget, const GList* uris) +{ + g_return_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET (widget)); + + NAUTILUS_SIDEBAR_WIDGET_GET_IFACE (widget)->selection_changed (widget, uris); +} + +void +nautilus_sidebar_widget_location_changed (NautilusSidebarWidget* widget, const char* uri) +{ + g_return_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET (widget)); + + NAUTILUS_SIDEBAR_WIDGET_GET_IFACE (widget)->location_changed (widget, uri); +} --- nautilus-2.22.0/libnautilus-extension/nautilus-sidebar-widget.h 1970-01-01 01:00:00.000000000 +0100 +++ nautilus-2.22.0-workspace/libnautilus-extension/nautilus-sidebar-widget.h 2008-03-24 00:57:15.000000000 +0100 @@ -0,0 +1,60 @@ +/* + * nautilus-sidebar-widget.c - Interface for Nautilus sidebar widgets. + * + * Copyright (C) 2008 Amos Brocco + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +/* This interface is implemented by Nautilus extensions that want to + * provide information sidebar widgets. Those widges are created along + * with the Information sidebar. + */ + +#ifndef NAUTILUS_SIDEBAR_WIDGET_H +#define NAUTILUS_SIDEBAR_WIDGET_H + +#include <glib-object.h> +#include <gtk/gtkwidget.h> +#include "nautilus-extension-types.h" + +G_BEGIN_DECLS + +#define NAUTILUS_TYPE_SIDEBAR_WIDGET (nautilus_sidebar_widget_get_type ()) +#define NAUTILUS_SIDEBAR_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET, NautilusSidebarWidget)) +#define NAUTILUS_IS_SIDEBAR_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET)) +#define NAUTILUS_SIDEBAR_WIDGET_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET, NautilusSidebarWidgetIface)) + +typedef struct _NautilusSidebarWidget NautilusSidebarWidget; +typedef struct _NautilusSidebarWidgetIface NautilusSidebarWidgetIface; + +struct _NautilusSidebarWidgetIface { + GTypeInterface g_iface; + + GtkWidget* (*get_widget) (NautilusSidebarWidget* widget); + void (*location_changed) (NautilusSidebarWidget* widget, const char* uri); + void (*selection_changed) (NautilusSidebarWidget* widget, const GList* uris); +}; + +/* Interface Functions */ +GType nautilus_sidebar_widget_get_type (void); +GtkWidget* nautilus_sidebar_widget_get_widget (NautilusSidebarWidget* widget); +void nautilus_sidebar_widget_selection_changed (NautilusSidebarWidget* widget, const GList* uris); +void nautilus_sidebar_widget_location_changed (NautilusSidebarWidget* widget, const char* uri); + +G_END_DECLS + +#endif --- nautilus-2.22.0/libnautilus-extension/Makefile.am 2008-03-07 16:28:46.000000000 +0100 +++ nautilus-2.22.0-workspace/libnautilus-extension/Makefile.am 2008-03-23 15:56:17.000000000 +0100 @@ -30,6 +30,8 @@ libnautilus_extension_include_HEADERS= nautilus-menu-provider.h \ nautilus-property-page-provider.h \ nautilus-property-page.h \ + nautilus-sidebar-widget-provider.h \ + nautilus-sidebar-widget.h \ nautilus-menu.h \ $(NULL) @@ -45,6 +47,8 @@ libnautilus_extension_la_SOURCES= \ nautilus-menu-provider.c \ nautilus-property-page-provider.c \ nautilus-property-page.c \ + nautilus-sidebar-widget-provider.c \ + nautilus-sidebar-widget.c \ nautilus-menu.c \ $(NULL) --- nautilus-2.22.0/src/nautilus-information-panel.c 2008-03-07 16:28:03.000000000 +0100 +++ nautilus-2.22.0-workspace/src/nautilus-information-panel.c 2008-03-24 01:50:55.000000000 +0100 @@ -51,6 +51,9 @@ #include <libnautilus-private/nautilus-program-choosing.h> #include <libnautilus-private/nautilus-sidebar-provider.h> #include <libnautilus-private/nautilus-module.h> +#include <libnautilus-extension/nautilus-sidebar-widget-provider.h> +#include <libnautilus-extension/nautilus-sidebar-widget.h> +#include <gio/gio.h> struct NautilusInformationPanelDetails { GtkVBox *container; @@ -67,6 +70,8 @@ struct NautilusInformationPanelDetails { char *default_background_image; char *current_background_color; char *current_background_image; + + GList* widgets; }; /* button assignments */ @@ -96,6 +101,16 @@ static void nautilus_information_pan static void sidebar_provider_iface_init (NautilusSidebarProviderIface *iface); static GType nautilus_information_panel_provider_get_type (void); +/* Extension widgets */ + +static gint sort_widget_providers_by_position (gconstpointer a, gconstpointer b); +static void load_sidebar_extension_widgets (NautilusInformationPanel *panel); +static void add_sidebar_widget (NautilusInformationPanel *panel, NautilusSidebarWidget* widget); +static void sidebar_extension_widget_location_changed (NautilusInformationPanel *panel, const gchar* uri); +static void sidebar_extension_widget_selection_changed (NautilusInformationPanel *panel, const GList* uris); +static void init_sidebar_extension_widgets (NautilusInformationPanel *panel); +static void dispose_sidebar_extension_widgets (NautilusInformationPanel *panel); + enum { LOCATION_CHANGED, LAST_SIGNAL @@ -258,13 +273,18 @@ nautilus_information_panel_init (Nautilu gtk_widget_show (GTK_WIDGET (information_panel->details->container)); gtk_container_add (GTK_CONTAINER (information_panel), GTK_WIDGET (information_panel->details->container)); - + /* allocate and install the index title widget */ information_panel->details->title = NAUTILUS_SIDEBAR_TITLE (nautilus_sidebar_title_new ()); gtk_widget_show (GTK_WIDGET (information_panel->details->title)); gtk_box_pack_start (GTK_BOX (information_panel->details->container), GTK_WIDGET (information_panel->details->title), FALSE, FALSE, GNOME_PAD); + + /* Install extra widgets */ + information_panel->details->widgets = NULL; + load_sidebar_extension_widgets (information_panel); + init_sidebar_extension_widgets (information_panel); /* allocate and install the command button container */ make_button_box (information_panel); @@ -278,7 +298,7 @@ nautilus_information_panel_init (Nautilu gtk_drag_dest_set (GTK_WIDGET (information_panel), GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, target_table, G_N_ELEMENTS (target_table), - GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK); + GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK); } static void @@ -287,6 +307,8 @@ nautilus_information_panel_finalize (GOb NautilusInformationPanel *information_panel; information_panel = NAUTILUS_INFORMATION_PANEL (object); + + dispose_sidebar_extension_widgets (information_panel); if (information_panel->details->file != NULL) { nautilus_file_monitor_remove (information_panel->details->file, information_panel); @@ -1071,6 +1093,8 @@ nautilus_information_panel_set_uri (Naut nautilus_sidebar_title_set_file (information_panel->details->title, information_panel->details->file, initial_title); + + sidebar_extension_widget_location_changed (information_panel, new_uri); } static void @@ -1094,6 +1118,15 @@ nautilus_information_panel_style_set (Gt } static void +selection_changed_callback (NautilusWindowInfo *window, + NautilusInformationPanel *panel) +{ + GList* selection = nautilus_window_info_get_selection (window); + sidebar_extension_widget_selection_changed (panel, selection); + g_list_free (selection); +} + +static void loading_uri_callback (NautilusWindowInfo *window, char *uri, NautilusInformationPanel *panel) @@ -1104,6 +1137,8 @@ loading_uri_callback (NautilusWindowInfo nautilus_information_panel_set_uri (panel, uri, title); + + sidebar_extension_widget_location_changed (panel, uri); g_free (title); } @@ -1119,6 +1154,8 @@ nautilus_information_panel_set_parent_wi G_CALLBACK (loading_uri_callback), panel, 0); g_signal_connect_object (window, "title_changed", G_CALLBACK (title_changed_callback), panel, 0); + g_signal_connect_object (window, "selection_changed", + G_CALLBACK (selection_changed_callback), panel, 0); title = nautilus_window_info_get_title (window); location = nautilus_window_info_get_current_location (window); @@ -1165,3 +1202,96 @@ nautilus_information_panel_register (voi nautilus_module_add_type (nautilus_information_panel_provider_get_type ()); } +/* Begin extension widget management */ + +static gint +sort_widget_providers_by_position (gconstpointer a, gconstpointer b) +{ + NautilusSidebarWidgetProvider* provider_a = (NautilusSidebarWidgetProvider*) a; + NautilusSidebarWidgetProvider* provider_b = (NautilusSidebarWidgetProvider*) b; + + int p_a = nautilus_sidebar_widget_provider_get_order (provider_a); + int p_b = nautilus_sidebar_widget_provider_get_order (provider_b); + + return p_a < p_b ? -1 : p_a == p_b ? 0 : 1; +} + +static void +load_sidebar_extension_widgets (NautilusInformationPanel *panel) +{ + GList *providers, *l; + NautilusSidebarWidget *widget; + + providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_SIDEBAR_WIDGET_PROVIDER); + providers = g_list_sort (providers, sort_widget_providers_by_position); + + for (l = providers; l != NULL; l = l->next) { + NautilusSidebarWidgetProvider *provider; + + provider = NAUTILUS_SIDEBAR_WIDGET_PROVIDER (l->data); + widget = nautilus_sidebar_widget_provider_get_widget (provider); + + if (widget != NULL) { + add_sidebar_widget (panel, widget); + } + } + + nautilus_module_extension_list_free (providers); +} + +static void +add_sidebar_widget (NautilusInformationPanel *panel, NautilusSidebarWidget* widget) +{ + GList* widgets = panel->details->widgets; + + panel->details->widgets = g_list_prepend (widgets, widget); +} + +static void +sidebar_extension_widget_location_changed (NautilusInformationPanel *panel, const gchar* uri) +{ + GList* widgets = panel->details->widgets; + GList* w; + + for (w = widgets; w != NULL; w = w->next) { + NautilusSidebarWidget* widget = NAUTILUS_SIDEBAR_WIDGET (w->data); + nautilus_sidebar_widget_location_changed (widget, uri); + } +} + +static void +sidebar_extension_widget_selection_changed (NautilusInformationPanel *panel, const GList* uris) +{ + GList* widgets = panel->details->widgets; + GList* w; + + for (w = widgets; w != NULL; w = w->next) { + NautilusSidebarWidget* widget = NAUTILUS_SIDEBAR_WIDGET (w->data); + nautilus_sidebar_widget_selection_changed (widget, uris); + } +} + +static void +init_sidebar_extension_widgets (NautilusInformationPanel *panel) +{ + GList* widgets = panel->details->widgets; + GList* w; + + for (w = widgets; w != NULL; w = w->next) { + NautilusSidebarWidget* widget = NAUTILUS_SIDEBAR_WIDGET (w->data); + GtkWidget* actual_widget = nautilus_sidebar_widget_get_widget (widget); + gtk_box_pack_start (GTK_BOX (panel->details->container), + GTK_WIDGET (actual_widget), FALSE, FALSE, GNOME_PAD); + } +} + +static void +dispose_sidebar_extension_widgets (NautilusInformationPanel *panel) +{ + GList* widgets = panel->details->widgets; + + g_list_foreach (widgets, (GFunc) g_object_unref, NULL); + + g_list_free (widgets); +} +
Attachment:
signature.asc
Description: Questa =?ISO-8859-1?Q?=E8?= una parte del messaggio firmata digitalmente