summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Hertzfeld <andy@src.gnome.org>2001-01-24 08:58:03 +0000
committerAndy Hertzfeld <andy@src.gnome.org>2001-01-24 08:58:03 +0000
commit3cf493c6ba2669be495ca1035158d5e4113bb3bc (patch)
treea3b094ba542221130c2f7d4b99804f8bea34a55d
parentab827a9fd681a006672486ac00e11939394e67b3 (diff)
downloadnautilus-3cf493c6ba2669be495ca1035158d5e4113bb3bc.tar.gz
initial check-in of post-1_0_1 branch
initial check-in of post-1_0_1 branch
-rw-r--r--ChangeLog233
-rw-r--r--applets/launcher/nautilus-launcher-applet.c5
-rw-r--r--components/Makefile.am1
-rw-r--r--configure.in1
-rw-r--r--data/top/Makefile.am2
-rw-r--r--icons/Makefile.am1
-rw-r--r--icons/crux_eggplant/Makefile409
-rw-r--r--libnautilus-extensions/nautilus-file-utilities.c1
-rw-r--r--libnautilus-extensions/nautilus-icon-canvas-item.c212
-rw-r--r--libnautilus-extensions/nautilus-icon-canvas-item.h4
-rw-r--r--libnautilus-extensions/nautilus-icon-container.c34
-rw-r--r--libnautilus-extensions/nautilus-icon-container.h4
-rw-r--r--libnautilus-extensions/nautilus-icon-dnd.c1
-rw-r--r--libnautilus-extensions/nautilus-link.c29
-rw-r--r--libnautilus-extensions/nautilus-link.h11
-rw-r--r--libnautilus-extensions/nautilus-metadata.h3
-rw-r--r--libnautilus-private/nautilus-file-utilities.c1
-rw-r--r--libnautilus-private/nautilus-icon-canvas-item.c212
-rw-r--r--libnautilus-private/nautilus-icon-canvas-item.h4
-rw-r--r--libnautilus-private/nautilus-icon-container.c34
-rw-r--r--libnautilus-private/nautilus-icon-container.h4
-rw-r--r--libnautilus-private/nautilus-icon-dnd.c1
-rw-r--r--libnautilus-private/nautilus-link.c29
-rw-r--r--libnautilus-private/nautilus-link.h11
-rw-r--r--libnautilus-private/nautilus-metadata.h3
-rw-r--r--src/file-manager/fm-icon-view.c38
-rw-r--r--src/nautilus-information-panel.c10
-rw-r--r--src/nautilus-sidebar-tabs.c8
-rw-r--r--src/nautilus-sidebar.c10
29 files changed, 798 insertions, 518 deletions
diff --git a/ChangeLog b/ChangeLog
index dc0db2d95..56c08f934 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,72 @@
+2001-01-24 Andy Hertzfeld <andy@eazel.com>
+
+ merged the post-1_0 branch with HEAD 1/23/01 to get this,
+ the post-1_0_1 branch
+
+ * applets/launcher/nautilus-launcher-applet.c:
+ * components/Makefile.am:
+ * components/rss-control/.cvsignore:
+ * components/rss-control/Makefile.am:
+ * components/rss-control/main.c: (rss_control_object_destroyed),
+ (rss_control_make_object), (main):
+ * components/rss-control/nautilus-rss-control.c:
+ (nautilus_rss_control_initialize_class), (get_bonobo_properties),
+ (set_bonobo_properties), (nautilus_rss_control_initialize),
+ (free_rss_data_item), (nautilus_rss_control_clear_items),
+ (nautilus_rss_control_destroy), (nautilus_rss_control_get_control),
+ (nautilus_rss_control_set_title), (rss_logo_callback),
+ (rss_read_done_callback), (load_rss_file),
+ (nautilus_rss_control_set_uri), (rss_control_pixbuf_composite),
+ (draw_rss_logo_image), (draw_rss_title), (draw_blue_line),
+ (draw_rss_items), (nautilus_rss_control_draw),
+ (nautilus_rss_control_expose),
+ (nautilus_rss_control_set_prelight_index),
+ (nautilus_rss_control_motion_event),
+ (nautilus_rss_control_leave_event),
+ (nautilus_rss_control_button_press_event):
+ * components/rss-control/nautilus-rss-control.h:
+ * components/rss-control/nautilus-rss-control.oafinfo:
+ * configure.in:
+ * data/top/Clock:
+ * data/top/Makefile.am:
+ * data/top/Slashdot:
+ * icons/Makefile.am:
+ * libnautilus-extensions/nautilus-file-utilities.c:
+ (nautilus_get_user_main_directory):
+ * libnautilus-extensions/nautilus-icon-canvas-item.c:
+ (nautilus_icon_canvas_item_destroy),
+ (nautilus_icon_canvas_item_get_icon_width),
+ (nautilus_icon_canvas_item_get_icon_height),
+ (nautilus_icon_canvas_item_set_arg), (do_control_destroy),
+ (nautilus_icon_canvas_item_get_arg),
+ (nautilus_icon_canvas_item_get_image), (recompute_bounding_box),
+ (nautilus_icon_canvas_item_update_bounds),
+ (draw_or_measure_label_text), (emblem_layout_next),
+ (nautilus_icon_canvas_item_draw), (draw_or_measure_label_text_aa),
+ (nautilus_icon_canvas_item_render),
+ (nautilus_icon_canvas_item_bounds),
+ (nautilus_icon_canvas_item_get_icon_rectangle),
+ (get_icon_canvas_rectangle),
+ (nautilus_icon_canvas_item_set_smooth_font),
+ (nautilus_icon_canvas_item_get_control),
+ (nautilus_icon_canvas_item_set_control):
+ * libnautilus-extensions/nautilus-icon-canvas-item.h:
+ * libnautilus-extensions/nautilus-icon-container.c:
+ (nautilus_icon_container_initialize_class),
+ (nautilus_icon_container_update_icon):
+ * libnautilus-extensions/nautilus-icon-container.h:
+ * libnautilus-extensions/nautilus-icon-dnd.c:
+ (nautilus_icon_dnd_begin_drag):
+ * libnautilus-extensions/nautilus-link.c:
+ (nautilus_link_local_get_component_info):
+ * libnautilus-extensions/nautilus-link.h:
+ * libnautilus-extensions/nautilus-metadata.h:
+ * src/file-manager/fm-icon-view.c: (get_icon_control_callback),
+ (create_icon_container):
+ * src/nautilus-sidebar-tabs.c: (nautilus_sidebar_tabs_hit_test),
+ (nautilus_sidebar_tabs_select_tab):
+ * src/nautilus-sidebar.c: (nautilus_sidebar_release_event):
+
2001-01-23 Andy Hertzfeld <andy@eazel.com>
* src/nautilus-theme-selector.c: (remove_button_callback),
@@ -5401,6 +5470,170 @@ Wed Jan 03 04:11:01 2001 George Lebl <jirka@5z.com>
improved performance by using nautilus_gnome_canvas_draw_pixbuf
to draw on the aa canvas instead of libart.
+=======
+2001-01-09 Andy Hertzfeld <andy@eazel.com>
+
+ * src/nautilus-throbber.c: (nautilus_throbber_initialize_class),
+ (nautilus_throbber_initialize), (bump_throbber_frame),
+ (nautilus_throbber_start), (nautilus_throbber_stop):
+
+ made the throbber anti-aliased by using a nautilus_image widget
+ to do the drawing.
+
+2001-01-04 Andy Hertzfeld <andy@eazel.com>
+
+ * components/rss-control/nautilus-rss-control.c:
+ (nautilus_rss_control_initialize_class),
+ (nautilus_rss_control_initialize), (nautilus_rss_control_destroy),
+ (rss_control_pixbuf_composite), (draw_rss_logo_image),
+ (draw_rss_items), (nautilus_rss_control_draw),
+ (nautilus_rss_control_expose),
+ (nautilus_rss_control_set_prelight_index),
+ (nautilus_rss_control_motion_event),
+ (nautilus_rss_control_leave_event):
+
+ fixed problem with critical errors in gdk_pixbuf by clipping to
+ the destination pixbuf.
+
+ added prelighting to the rss items by tracking mouse motion events
+ to maintain a prelight index, which is used to draw an item
+ in a different color.
+
+2001-01-03 Andy Hertzfeld <andy@eazel.com>
+
+ * components/rss-control/main.c: (main):
+ tweaked broken stop-on-criticals stuff
+
+ * components/rss-control/nautilus-rss-control.c:
+ (free_rss_data_item), (nautilus_rss_control_clear_items),
+ (nautilus_rss_control_destroy), (rss_logo_callback),
+ (rss_read_done_callback), (load_rss_file), (draw_rss_items),
+ (nautilus_rss_control_button_press_event):
+ made it extract urls for rss items and keep them in a structure,
+ and then activate them when clicked.
+
+ Also, keep around file handles in instance data so we can cancel
+ any pending async I/O when the object is destroyed.
+
+ * data/top/Makefile.am:
+ add sample controls to novice home directory
+ * data/top/Clock:
+ sample control
+ * data/top/Slashdot:
+ sample control
+ * src/file-manager/fm-icon-view.c: (get_icon_control_callback):
+ added check for non-zero moniker length
+
+2001-01-03 Andy Hertzfeld <andy@eazel.com>
+
+ * components/rss-control/nautilus-rss-control.c:
+ (nautilus_rss_control_initialize), (nautilus_rss_control_destroy),
+ (rss_read_done_callback), (nautilus_rss_control_draw),
+ (nautilus_rss_control_button_press_event):
+ captured the channel link from the xml file, added title and logo
+ hit-testing, and made it launch a new window pointed at the
+ channel link when the user clicks on the logo or title.
+
+2001-01-02 Andy Hertzfeld <andy@eazel.com>
+
+ first check-in to post-1_0 branch.
+
+ add ability to embed Bonobo controls in the icon view.
+ created a new bonobo control that fetches and displays rss weblogs
+ plus miscellaneous optimizations and improvements
+
+ * components/Makefile.am:
+ * configure.in:
+ added new rss-control component
+
+ * components/hardware/nautilus-hardware-view.c:
+ (get_RAM_description), (get_IDE_description):
+ incorporated Bud's disk size calculation, plus tweaked the
+ RAM size calculation
+
+ * components/rss-control/.cvsignore:
+ * components/rss-control/Makefile.am:
+ * components/rss-control/nautilus-rss-control.oafinfo:
+ files for the new rss-control component
+
+ * components/rss-control/main.c: (rss_control_object_destroyed),
+ (rss_control_make_object), (main):
+ factory for the rss-control Bonobo component
+
+ * components/rss-control/nautilus-rss-control.c,h:
+ (nautilus_rss_control_initialize_class), (get_bonobo_properties),
+ (set_bonobo_properties), (nautilus_rss_control_initialize),
+ (nautilus_rss_control_clear_items), (nautilus_rss_control_destroy),
+ (nautilus_rss_control_get_control),
+ (nautilus_rss_control_set_title), (rss_logo_callback),
+ (rss_read_done_callback), (load_rss_file),
+ (nautilus_rss_control_set_uri), (draw_rss_logo_image),
+ (draw_rss_title), (draw_blue_line), (draw_rss_items),
+ (nautilus_rss_control_draw), (nautilus_rss_control_expose),
+ (nautilus_rss_control_button_press_event):
+ new bonobo control to fetch an rss file and display it.
+
+ * icons/Makefile.am:
+ * icons/bullet.png:
+ added a "bullet" image used in rss control, but it's generally
+ useful enough that I added it to the main icons
+
+ * libnautilus-extensions/nautilus-file-utilities.c:
+ (nautilus_get_user_main_directory):
+ deleted some code that's no longer relevant
+
+ * libnautilus-extensions/nautilus-icon-canvas-item.c,h:
+ (nautilus_icon_canvas_item_destroy),
+ (nautilus_icon_canvas_item_get_icon_width),
+ (nautilus_icon_canvas_item_get_icon_height),
+ (nautilus_icon_canvas_item_set_arg), (do_control_destroy),
+ (nautilus_icon_canvas_item_get_arg),
+ (nautilus_icon_canvas_item_get_image), (recompute_bounding_box),
+ (nautilus_icon_canvas_item_update_bounds),
+ (draw_or_measure_label_text), (emblem_layout_next),
+ (draw_pixbuf_aa), (nautilus_icon_canvas_item_draw),
+ (draw_or_measure_label_text_aa),
+ (nautilus_icon_canvas_item_render),
+ (nautilus_icon_canvas_item_bounds),
+ (nautilus_icon_canvas_item_get_icon_rectangle),
+ (get_icon_canvas_rectangle),
+ (nautilus_icon_canvas_item_set_smooth_font),
+ (nautilus_icon_canvas_item_get_control),
+ (nautilus_icon_canvas_item_set_control):
+ added support for widgets embedded in icon canvas items
+
+ * libnautilus-extensions/nautilus-icon-container.c,h:
+ (nautilus_icon_container_initialize_class),
+ (nautilus_icon_container_update_icon):
+ taught the icon container to ask for the control associated
+ with a file, and configured the canvas item with it if there
+ is one.
+
+ * libnautilus-extensions/nautilus-icon-dnd.c:
+ (nautilus_icon_dnd_begin_drag):
+ made it unref the image it fetches from the canvas item, so the
+ canvas item can generate custom images for controls.
+
+ * libnautilus-extensions/nautilus-link.c,h:
+ (nautilus_link_local_get_component_info):
+ fetch the activation and configuration strings associated with
+ a link file for string embedding.
+
+ * libnautilus-extensions/nautilus-metadata.h:
+ added metadata types for the activation and configuration data
+
+ * src/file-manager/fm-icon-view.c: (get_icon_control_callback),
+ (create_icon_container):
+ added signal to create a bonobo control associated with a file
+ and configure it, if there is one
+
+ * src/nautilus-sidebar-tabs.c: (nautilus_sidebar_tabs_hit_test),
+ (nautilus_sidebar_tabs_select_tab):
+ hit test invisible tabs to support the change below.
+ * src/nautilus-sidebar.c: (nautilus_sidebar_release_event):
+ implemented Bud's idea of toggling the visibility of the active
+ view by clicking on the tab again.
+
2001-01-02 Darin Adler <darin@eazel.com>
reviewed by: John Sullivan <sullivan@eazel.com>
diff --git a/applets/launcher/nautilus-launcher-applet.c b/applets/launcher/nautilus-launcher-applet.c
index 44e523911..25739d423 100644
--- a/applets/launcher/nautilus-launcher-applet.c
+++ b/applets/launcher/nautilus-launcher-applet.c
@@ -28,7 +28,7 @@
#include <applet-widget.h>
#include <libnautilus-extensions/nautilus-image.h>
#include <libnautilus-extensions/nautilus-global-preferences.h>
-#include <gtk.h>
+#include <gtk/gtk.h>
static void
button_toggled (GtkWidget *button,
@@ -49,12 +49,13 @@ show_desktop_changed_callback (gpointer callback_data)
nautilus_preferences_get_boolean (NAUTILUS_PREFERENCES_SHOW_DESKTOP));
}
+/*
static void
delete_event (GtkWidget *widget, GdkEvent *event, gpointer callback_data)
{
gtk_main_quit ();
}
-
+*/
int
main (int argc, char **argv)
{
diff --git a/components/Makefile.am b/components/Makefile.am
index c1c4251c8..a14067892 100644
--- a/components/Makefile.am
+++ b/components/Makefile.am
@@ -21,6 +21,7 @@ SUBDIRS = \
loser \
music \
notes \
+ rss-control \
sample \
text \
throbber \
diff --git a/configure.in b/configure.in
index 747bced84..c100c169f 100644
--- a/configure.in
+++ b/configure.in
@@ -806,6 +806,7 @@ components/notes/Makefile
components/rpmview/Makefile
components/sample/Makefile
components/mozilla/Makefile
+components/rss-control/Makefile
components/services/Makefile
components/services/trilobite/Makefile
components/services/trilobite/idl/Makefile
diff --git a/data/top/Makefile.am b/data/top/Makefile.am
index 4587b716d..ba482cd22 100644
--- a/data/top/Makefile.am
+++ b/data/top/Makefile.am
@@ -4,8 +4,10 @@ topdir = $(datadir)/nautilus/top
top_DATA = \
.nautilus-metafile.xml \
+ Clock \
Computer \
Services \
+ Slashdot \
$(NULL)
EXTRA_DIST = $(top_DATA)
diff --git a/icons/Makefile.am b/icons/Makefile.am
index 9c34d5f9e..cfdf60b1d 100644
--- a/icons/Makefile.am
+++ b/icons/Makefile.am
@@ -18,6 +18,7 @@ icon_DATA =\
about_background.png \
audio.png \
backgrounds.png \
+ bullet.png \
chit_frame.png \
colors.png \
computer.png \
diff --git a/icons/crux_eggplant/Makefile b/icons/crux_eggplant/Makefile
deleted file mode 100644
index 13a30a3b9..000000000
--- a/icons/crux_eggplant/Makefile
+++ /dev/null
@@ -1,409 +0,0 @@
-# Generated automatically from Makefile.in by configure.
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
-
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-SHELL = /bin/sh
-
-srcdir = .
-top_srcdir = ../..
-prefix = /gnome
-exec_prefix = ${prefix}
-
-bindir = ${exec_prefix}/bin
-sbindir = ${exec_prefix}/sbin
-libexecdir = ${exec_prefix}/libexec
-datadir = ${prefix}/share
-sysconfdir = ${prefix}/etc
-sharedstatedir = ${prefix}/com
-localstatedir = ${prefix}/var
-libdir = ${exec_prefix}/lib
-infodir = ${prefix}/info
-mandir = ${prefix}/man
-includedir = ${prefix}/include
-oldincludedir = /usr/include
-
-DESTDIR =
-
-pkgdatadir = $(datadir)/nautilus
-pkglibdir = $(libdir)/nautilus
-pkgincludedir = $(includedir)/nautilus
-
-top_builddir = ../..
-
-ACLOCAL = aclocal
-AUTOCONF = autoconf
-AUTOMAKE = automake
-AUTOHEADER = autoheader
-
-INSTALL = /usr/bin/eazel-hacks/install -c
-INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_SCRIPT = ${INSTALL_PROGRAM}
-transform = s,x,x,
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = i686-pc-linux
-host_triplet = i686-pc-linux-gnu
-AMMONITE_CFLAGS = -I/gnome/include
-AMMONITE_LIBS = -L/gnome/lib -lammonite-gtk -lammonite
-APPLETS_CFLAGS = -I/gnome/include -DNEED_GNOMESUPPORT_H -I/gnome/lib/gnome-libs/include -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include -I/gnome/include/gtk-1.2 -I/usr/X11R6/include
-APPLETS_LIBS = -rdynamic -L/gnome/lib -L/usr/X11R6/lib -lpanel_applet -lgnorba -lORBitCosNaming -lORBit -lIIOP -lORBitutil -lnsl -lgnomeui -lart_lgpl -lgdk_imlib -lSM -lICE -lgtk -lgdk -lgmodule -lXext -lX11 -lgnome -lgnomesupport -lesd -laudiofile -lm -ldb1 -lglib -ldl
-AS = @AS@
-BONOBOX_CFLAGS = -I/gnome/include -DNEED_GNOMESUPPORT_H -I/gnome/lib/gnome-libs/include -I/gnome/include/gtk-1.2 -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include -I/usr/X11R6/include -I/gnome/include/gnome-xml
-BONOBOX_LIBS = -rdynamic -L/gnome/lib -L/usr/X11R6/lib -lbonobo -lgnomeui -lart_lgpl -lgdk_imlib -lSM -lICE -lgnome -lgnomesupport -lesd -laudiofile -ldb1 -lgdk_pixbuf -lgtk -lgdk -lgmodule -ldl -lXext -lX11 -loaf -lORBitCosNaming -lORBit -lIIOP -lORBitutil -lglib -lnsl -lm -lbonobox -lxml -lz
-BONOBO_CFLAGS = -I/gnome/include -DNEED_GNOMESUPPORT_H -I/gnome/lib/gnome-libs/include -I/gnome/include/gtk-1.2 -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include -I/usr/X11R6/include -I/gnome/include/gnome-xml
-BONOBO_LIBS = -rdynamic -L/gnome/lib -L/usr/X11R6/lib -lbonobo -lgnomeui -lart_lgpl -lgdk_imlib -lSM -lICE -lgnome -lgnomesupport -lesd -laudiofile -ldb1 -lgdk_pixbuf -lgtk -lgdk -lgmodule -ldl -lXext -lX11 -loaf -lORBitCosNaming -lORBit -lIIOP -lORBitutil -lglib -lnsl -lm
-BONOBO_PRINT_CFLAGS =
-BONOBO_PRINT_LIBS =
-CATALOGS = ca.gmo da.gmo de.gmo en_GB.gmo es.gmo fi.gmo fr.gmo ga.gmo gl.gmo hu.gmo it.gmo ja.gmo ko.gmo nl.gmo no.gmo pl.gmo pt_BR.gmo ru.gmo sk.gmo sv.gmo ta.gmo tr.gmo uk.gmo zh_TW.Big5.gmo
-CATOBJEXT = .gmo
-CC = gcc
-CPP = gcc -E
-CXX = g++
-DATADIRNAME = share
-DLLTOOL = @DLLTOOL@
-EAZEL_SERVICES = 1
-ENABLE_PROFILER =
-ESD_CFLAGS = -I/gnome/include
-ESD_CONFIG = /gnome/bin/esd-config
-ESD_LIBS = -L/gnome/lib -lesd -laudiofile -lm
-FREETYPE2_CFLAGS = -I/usr/include/freetype2
-FREETYPE2_LIBS = -L/usr/lib -lfreetype
-GCONF_CFLAGS = -I/gnome/include/gconf/1 -I/gnome/include -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include -I/gnome/include/gtk-1.2 -I/usr/X11R6/include
-GCONF_CONFIG = /gnome/bin/gconf-config
-GCONF_LIBS = -rdynamic -L/gnome/lib -L/usr/X11R6/lib -lgconf-gtk-1 -lgconf-1 -loaf -lORBitCosNaming -lORBit -lIIOP -lORBitutil -lnsl -lgtk -lgdk -lgmodule -lglib -ldl -lXext -lX11 -lm
-GDK_PIXBUF_CFLAGS = -I/gnome/include -I/gnome/include/gtk-1.2 -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include -I/usr/X11R6/include
-GDK_PIXBUF_CONFIG = /gnome/bin/gdk-pixbuf-config
-GDK_PIXBUF_LIBS = -L/gnome/lib -lgdk_pixbuf -L/gnome/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXext -lX11 -lm
-GENCAT =
-GHTTP_CFLAGS = -I/gnome/include
-GHTTP_LIBS = -L/gnome/lib -lghttp
-GLIB_CFLAGS = -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include
-GLIB_CONFIG = /gnome/bin/glib-config
-GLIB_LIBS = -L/gnome/lib -lglib
-GMOFILES = ca.gmo da.gmo de.gmo en_GB.gmo es.gmo fi.gmo fr.gmo ga.gmo gl.gmo hu.gmo it.gmo ja.gmo ko.gmo nl.gmo no.gmo pl.gmo pt_BR.gmo ru.gmo sk.gmo sv.gmo ta.gmo tr.gmo uk.gmo zh_TW.Big5.gmo
-GMSGFMT = /gnome/bin/msgfmt
-GNOMECANVASPIXBUF_INCLUDEDIR =
-GNOMECANVASPIXBUF_LIBS = -rdynamic -L/gnome/lib -L/usr/X11R6/lib -lgdk_pixbuf -lgtk -lgdk -lgmodule -lglib -ldl -lXext -lX11 -lm -lgnomecanvaspixbuf
-GNOMEUI_CFLAGS = -I/gnome/include -DNEED_GNOMESUPPORT_H -I/gnome/lib/gnome-libs/include -I/gnome/include/gtk-1.2 -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include -I/usr/X11R6/include
-GNOMEUI_LIBS = -rdynamic -L/gnome/lib -L/usr/X11R6/lib -lgnomeui -lart_lgpl -lgdk_imlib -lSM -lICE -lgtk -lgdk -lgmodule -lXext -lX11 -lgnome -lgnomesupport -lesd -laudiofile -lm -ldb1 -lglib -ldl
-GNOME_CFLAGS = -I/gnome/include -DNEED_GNOMESUPPORT_H -I/gnome/lib/gnome-libs/include -I/gnome/include/gtk-1.2 -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include -I/usr/X11R6/include
-GNOME_CONFIG = /gnome/bin/gnome-config
-GNOME_LIBS = -L/gnome/lib -lgnome -lgnomesupport -lesd -laudiofile -lm -ldb1 -lglib -ldl
-GNORBA_CFLAGS =
-GNORBA_LIBS =
-GTK_CFLAGS = -I/gnome/include/gtk-1.2 -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include -I/usr/X11R6/include
-GTK_CONFIG = /gnome/bin/gtk-config
-GTK_LIBS = -L/gnome/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXext -lX11 -lm
-GT_NO =
-GT_YES = #YES#
-HAVE_APPLETS = yes
-IDL_CFLAGS = -I/gnome/share/idl -I$(top_srcdir) -I$(top_builddir)
-INCLUDE_LOCALE_H = #include <locale.h>
-INSTOBJEXT = .mo
-INTLDEPS =
-INTLLIBS =
-INTLOBJS =
-LIBPNG = -lpng -lz
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LN_S = ln -s
-MAINT =
-MAKEINFO = makeinfo
-MEDUSA_CFLAGS = -I/gnome/include -I/gnome/lib/vfs/include -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include -D_REENTRANT -Wsign-promo -Wno-sign-compare
-MEDUSA_LIBS = -rdynamic -L/gnome/lib -lmedusa -lgnomevfs -lgmodule -lgthread -lglib -lpthread -ldl
-MKINSTALLDIRS = ./mkinstalldirs
-MOZILLA_COMPONENT_CFLAGS = -I/usr/include/mozilla -fno-rtti -fno-exceptions
-MOZILLA_COMPONENT_DEBUG_FLAGS =
-MOZILLA_COMPONENT_LDFLAGS = -L/usr/lib/mozilla
-MOZILLA_COMPONENT_LIBS = -lgtkembedmoz -lgtksuperwin -lxpcom -lnspr4 -lplc4 -lplds4
-MOZILLA_COMPONENT_RPATH_FLAGS = -Wl,-rpath=/usr/lib/mozilla
-MOZILLA_MILESTONE = 18
-OAF_CFLAGS = -I/gnome/include -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include
-OAF_CONFIG = /gnome/bin/oaf-config
-OAF_LIBS = -L/gnome/lib -loaf -lORBitCosNaming -lORBit -lIIOP -lORBitutil -lglib -lnsl -lm
-OBJDUMP = @OBJDUMP@
-ORBIT_CFLAGS = -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include -I/gnome/include
-ORBIT_CONFIG = /gnome/bin/orbit-config
-ORBIT_IDL = /gnome/bin/orbit-idl
-ORBIT_LIBS = -L/gnome/lib -lORBit -lIIOP -lORBitutil -lglib -lnsl -lm
-PACKAGE = nautilus
-PACKAGESYSTEM = libeazelpackagesystem-rpm3.la
-PAM_LIBS = -ldl -lpam -lpam_misc
-POFILES = ca.po da.po de.po en_GB.po es.po fi.po fr.po ga.po gl.po hu.po it.po ja.po ko.po nl.po no.po pl.po pt_BR.po ru.po sk.po sv.po ta.po tr.po uk.po zh_TW.Big5.po
-POSUB = po
-RANLIB = ranlib
-RPM_LIBS = -lrpm -lz -lbz2 -lpopt -ldb1
-RPM_VERSION = 3.0.5
-USE_INCLUDED_LIBINTL = no
-USE_NLS = yes
-VERSION = 0.8.1
-VFS_CFLAGS = -I/gnome/include -I/gnome/lib/vfs/include -I/gnome/include/glib-1.2 -I/gnome/lib/glib/include -D_REENTRANT -Wsign-promo -Wno-sign-compare
-VFS_LIBS = -rdynamic -L/gnome/lib -lgnomevfs -lgmodule -lgthread -lglib -lpthread -ldl
-XML_CFLAGS = -I/gnome/include/gnome-xml
-XML_CONFIG = /gnome/bin/xml-config
-XML_I18N_EXTRACT = $(top_srcdir)/xml-i18n-extract
-XML_I18N_MERGE = $(top_srcdir)/xml-i18n-merge
-XML_I18N_UPDATE = $(top_srcdir)/xml-i18n-update
-XML_LIBS = -L/gnome/lib -lxml -lz
-ZVT_LIBS =
-Z_LIBS = -lz
-gnomelocaledir = ${prefix}/${DATADIRNAME}/locale
-l =
-
-crux_eggplantdir = $(datadir)/pixmaps/nautilus/crux_eggplant
-
-SUBDIRS = sidebar_tab_pieces backgrounds throbber
-
-crux_eggplant_DATA = crux_eggplant.xml Back.png Forward.png Up.png Refresh.png Home.png Search.png SearchWeb.png Stop.png decrement.png decrement-i.png emblem-nowrite.png emblem-nowrite-72.png emblem-nowrite-96.png i-directory-aa.png i-directory-72-aa.png i-directory-96-aa.png i-directory-192-aa.png i-directory.png i-directory-72.png i-directory.xml i-regular-72-aa.png i-regular-96-aa.png i-regular-192-aa.png i-regular-aa.png i-regular-72.png i-regular-96.png i-regular-192.png i-regular.png i-regular.xml increment.png increment-i.png number_strip.png theme_preview.png zoom_body.png
-
-
-EXTRA_DIST = $(crux_eggplant_DATA)
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = ../../config.h
-CONFIG_CLEAN_FILES =
-DATA = $(crux_eggplant_DATA)
-
-DIST_COMMON = Makefile.am Makefile.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = gtar
-GZIP_ENV = --best
-all: all-redirect
-.SUFFIXES:
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu icons/crux_eggplant/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-
-install-crux_eggplantDATA: $(crux_eggplant_DATA)
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(crux_eggplantdir)
- @list='$(crux_eggplant_DATA)'; for p in $$list; do \
- if test -f $(srcdir)/$$p; then \
- echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(crux_eggplantdir)/$$p"; \
- $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(crux_eggplantdir)/$$p; \
- else if test -f $$p; then \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(crux_eggplantdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(crux_eggplantdir)/$$p; \
- fi; fi; \
- done
-
-uninstall-crux_eggplantDATA:
- @$(NORMAL_UNINSTALL)
- list='$(crux_eggplant_DATA)'; for p in $$list; do \
- rm -f $(DESTDIR)$(crux_eggplantdir)/$$p; \
- done
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-
-
-
-all-recursive install-data-recursive install-exec-recursive \
-installdirs-recursive install-recursive uninstall-recursive \
-check-recursive installcheck-recursive info-recursive dvi-recursive:
- @set fnord $(MAKEFLAGS); amf=$$2; \
- dot_seen=no; \
- target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- dot_seen=yes; \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
- done; \
- if test "$$dot_seen" = "no"; then \
- $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
- fi; test -z "$$fail"
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
- @set fnord $(MAKEFLAGS); amf=$$2; \
- dot_seen=no; \
- rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
- rev="$$subdir $$rev"; \
- test "$$subdir" = "." && dot_seen=yes; \
- done; \
- test "$$dot_seen" = "no" && rev=". $$rev"; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
- fi; \
- done; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
-
-clean-tags:
-
-distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = icons/crux_eggplant
-
-distdir: $(DISTFILES)
- here=`cd $(top_builddir) && pwd`; \
- top_distdir=`cd $(top_distdir) && pwd`; \
- distdir=`cd $(distdir) && pwd`; \
- cd $(top_srcdir) \
- && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu icons/crux_eggplant/Makefile
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
- if test -d $$d/$$file; then \
- cp -pr $$d/$$file $(distdir)/$$file; \
- else \
- test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
- fi; \
- done
- for subdir in $(SUBDIRS); do \
- if test "$$subdir" = .; then :; else \
- test -d $(distdir)/$$subdir \
- || mkdir $(distdir)/$$subdir \
- || exit 1; \
- chmod 777 $(distdir)/$$subdir; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
- || exit 1; \
- fi; \
- done
-info-am:
-info: info-recursive
-dvi-am:
-dvi: dvi-recursive
-check-am: all-am
-check: check-recursive
-installcheck-am:
-installcheck: installcheck-recursive
-install-exec-am:
-install-exec: install-exec-recursive
-
-install-data-am: install-crux_eggplantDATA
-install-data: install-data-recursive
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-recursive
-uninstall-am: uninstall-crux_eggplantDATA
-uninstall: uninstall-recursive
-all-am: Makefile $(DATA)
-all-redirect: all-recursive
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs: installdirs-recursive
-installdirs-am:
- $(mkinstalldirs) $(DESTDIR)$(crux_eggplantdir)
-
-
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
-
-maintainer-clean-generic:
-mostlyclean-am: mostlyclean-tags mostlyclean-generic
-
-mostlyclean: mostlyclean-recursive
-
-clean-am: clean-tags clean-generic mostlyclean-am
-
-clean: clean-recursive
-
-distclean-am: distclean-tags distclean-generic clean-am
- -rm -f libtool
-
-distclean: distclean-recursive
-
-maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
-
-maintainer-clean: maintainer-clean-recursive
-
-.PHONY: uninstall-crux_eggplantDATA install-crux_eggplantDATA \
-install-data-recursive uninstall-data-recursive install-exec-recursive \
-uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
-all-recursive check-recursive installcheck-recursive info-recursive \
-dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
-maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
-install-exec install-data-am install-data install-am install \
-uninstall-am uninstall all-redirect all-am all installdirs-am \
-installdirs mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/libnautilus-extensions/nautilus-file-utilities.c b/libnautilus-extensions/nautilus-file-utilities.c
index 046d652f5..b01345194 100644
--- a/libnautilus-extensions/nautilus-file-utilities.c
+++ b/libnautilus-extensions/nautilus-file-utilities.c
@@ -593,7 +593,6 @@ nautilus_get_user_main_directory (void)
nautilus_file_unref (file);
}
g_free (file_uri);
-
g_free (image_uri);
/* install the default link set */
diff --git a/libnautilus-extensions/nautilus-icon-canvas-item.c b/libnautilus-extensions/nautilus-icon-canvas-item.c
index f6da89a13..081faf2ba 100644
--- a/libnautilus-extensions/nautilus-icon-canvas-item.c
+++ b/libnautilus-extensions/nautilus-icon-canvas-item.c
@@ -3,7 +3,6 @@
/* Nautilus - Icon canvas item class for icon container.
*
* Copyright (C) 2000 Eazel, Inc
- *
* Author: Andy Hertzfeld <andy@eazel.com>
*
* This library is free software; you can redistribute it and/or
@@ -77,6 +76,10 @@ struct NautilusIconCanvasItemDetails {
GdkFont *font;
NautilusEmblemAttachPoints *attach_points;
+ /* stuff for controls; if this gets too big, we've put it in a separate struct */
+ GtkWidget *control; /* optional Bonobo control*/
+ guint control_destroy_id;
+
/* Size of the text at current font. */
int text_width;
int text_height;
@@ -90,7 +93,7 @@ struct NautilusIconCanvasItemDetails {
guint is_highlighted_for_drop : 1;
guint show_stretch_handles : 1;
guint is_prelit : 1;
-
+ guint in_control_destroy : 1;
gboolean is_renaming;
/* Font stuff whilst in smooth mode */
@@ -104,7 +107,7 @@ enum {
ARG_EDITABLE_TEXT,
ARG_ADDITIONAL_TEXT,
ARG_FONT,
- ARG_HIGHLIGHTED_FOR_SELECTION,
+ ARG_HIGHLIGHTED_FOR_SELECTION,
ARG_HIGHLIGHTED_AS_KEYBOARD_FOCUS,
ARG_HIGHLIGHTED_FOR_DROP,
ARG_MODIFIER,
@@ -313,6 +316,11 @@ nautilus_icon_canvas_item_destroy (GtkObject *object)
gdk_font_unref (details->font);
}
+ if (details->control && !details->in_control_destroy) {
+ gtk_signal_disconnect (GTK_OBJECT (details->control), details->control_destroy_id);
+ gtk_widget_destroy (details->control);
+ }
+
gtk_object_unref (GTK_OBJECT (icon_item->details->smooth_font));
icon_item->details->smooth_font = NULL;
@@ -344,6 +352,28 @@ nautilus_icon_canvas_item_invalidate_label_size (NautilusIconCanvasItem *item)
item->details->text_height = -1;
}
+/* abstraction layer for icon width and height, to separate it from pixbuf with and height */
+static int
+nautilus_icon_canvas_item_get_icon_width (NautilusIconCanvasItem *item)
+{
+ if (item->details->pixbuf == NULL) {
+ return NAUTILUS_ICON_SIZE_STANDARD;
+ }
+
+ return gdk_pixbuf_get_width (item->details->pixbuf);
+}
+
+static int
+nautilus_icon_canvas_item_get_icon_height (NautilusIconCanvasItem *item)
+{
+ if (item->details->pixbuf == NULL) {
+ return NAUTILUS_ICON_SIZE_STANDARD;
+ }
+
+ return gdk_pixbuf_get_height (item->details->pixbuf);
+}
+
+
/* Set_arg handler for the icon item. */
static void
nautilus_icon_canvas_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
@@ -426,8 +456,7 @@ nautilus_icon_canvas_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
case ARG_SMOOTH_FONT_SIZE:
nautilus_icon_canvas_item_set_smooth_font_size (NAUTILUS_ICON_CANVAS_ITEM (object),
GTK_VALUE_UINT (*arg));
- break;
-
+ break;
default:
g_warning ("nautilus_icons_view_item_item_set_arg on unknown argument");
return;
@@ -436,12 +465,27 @@ nautilus_icon_canvas_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (object));
}
+/* handler for the control's destroy signal */
+static void
+do_control_destroy (GtkObject *object, gpointer data)
+{
+ NautilusIconCanvasItemDetails *details;
+
+ details = NAUTILUS_ICON_CANVAS_ITEM (data)->details;
+
+ details->in_control_destroy = TRUE;
+
+ gtk_object_destroy (GTK_OBJECT (data));
+}
+
/* Get_arg handler for the icon item */
static void
nautilus_icon_canvas_item_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
{
NautilusIconCanvasItemDetails *details;
+ GnomeCanvasItem *item;
+ item = GNOME_CANVAS_ITEM (object);
details = NAUTILUS_ICON_CANVAS_ITEM (object)->details;
switch (arg_id) {
@@ -489,12 +533,27 @@ GdkPixbuf *
nautilus_icon_canvas_item_get_image (NautilusIconCanvasItem *item)
{
NautilusIconCanvasItemDetails *details;
-
+ int width, height;
+ GdkPixbuf *pixbuf;
+
g_return_val_if_fail (NAUTILUS_IS_ICON_CANVAS_ITEM (item), NULL);
details = item->details;
- return details->pixbuf;
+ if (details->control) {
+ width = details->control->allocation.width;
+ height = details->control->allocation.height;
+ pixbuf = nautilus_gdk_pixbuf_get_from_window_safe (details->control->window,
+ details->control->allocation.x,
+ details->control->allocation.y,
+ details->control->allocation.width,
+ details->control->allocation.height);
+ } else {
+ pixbuf = details->pixbuf;
+ gdk_pixbuf_ref (pixbuf);
+ }
+
+ return pixbuf;
}
void
@@ -596,6 +655,12 @@ recompute_bounding_box (NautilusIconCanvasItem *icon_item)
item->y1 = top_left.y;
item->x2 = bottom_right.x;
item->y2 = bottom_right.y;
+
+ if (icon_item->details->control)
+ gtk_layout_move (GTK_LAYOUT (item->canvas), icon_item->details->control,
+ item->x1 + item->canvas->zoom_xofs,
+ item->y1 + item->canvas->zoom_yofs);
+
}
void
@@ -615,6 +680,16 @@ nautilus_icon_canvas_item_update_bounds (NautilusIconCanvasItem *item)
return;
}
+ /* if there is an embedded control, resize it appropriately */
+ if (item->details->control) {
+ /* for now, size it the same as the underlying image */
+ int image_width = nautilus_icon_canvas_item_get_icon_width (item);
+ int image_height = nautilus_icon_canvas_item_get_icon_height (item);
+
+ gtk_widget_set_usize (item->details->control,
+ image_width, image_height);
+ }
+
/* Send out the bounds_changed signal and queue a redraw. */
nautilus_gnome_canvas_request_redraw_rectangle
(GNOME_CANVAS_ITEM (item)->canvas, &before);
@@ -756,7 +831,7 @@ draw_or_measure_label_text (NautilusIconCanvasItem *item,
canvas_item = GNOME_CANVAS_ITEM (item);
if (drawable != NULL) {
- icon_width = details->pixbuf == NULL ? 0 : gdk_pixbuf_get_width (details->pixbuf);
+ icon_width = details->pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_width (item);
gc = gdk_gc_new (canvas_item->canvas->layout.bin_window);
gdk_gc_get_values (gc, &save_gc);
}
@@ -1158,11 +1233,17 @@ emblem_layout_next (EmblemLayout *layout,
/* Return the rectangle and pixbuf. */
*emblem_pixbuf = pixbuf;
- emblem_rect->x0 = x - width / 2;
- emblem_rect->y0 = y - height / 2;
+ if (layout->icon_item->details->control) {
+ emblem_rect->x0 = x;
+ emblem_rect->y0 = y;
+ } else {
+ emblem_rect->x0 = x - width / 2;
+ emblem_rect->y0 = y - height / 2;
+ }
+
emblem_rect->x1 = emblem_rect->x0 + width;
emblem_rect->y1 = emblem_rect->y0 + height;
-
+
return TRUE;
}
@@ -1277,23 +1358,30 @@ nautilus_icon_canvas_item_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
icon_item = NAUTILUS_ICON_CANVAS_ITEM (item);
details = icon_item->details;
- /* Draw the pixbuf. */
- if (details->pixbuf == NULL) {
- return;
- }
- /* Compute icon rectangle in drawable coordinates. */
- get_icon_canvas_rectangle (icon_item, &icon_rect);
- icon_rect.x0 -= x;
- icon_rect.y0 -= y;
- icon_rect.x1 -= x;
- icon_rect.y1 -= y;
+ /* draw the icon or widget */
+ if (icon_item->details->control) {
+ gtk_widget_queue_draw (icon_item->details->control);
+ } else {
+ if (details->pixbuf != NULL) {
+
+ /* Compute icon rectangle in drawable coordinates. */
+ get_icon_canvas_rectangle (icon_item, &icon_rect);
+ icon_rect.x0 -= x;
+ icon_rect.y0 -= y;
+ icon_rect.x1 -= x;
+ icon_rect.y1 -= y;
+
+ /* if the pre-lit or selection flag is set, make a pre-lit or darkened pixbuf and draw that instead */
+ temp_pixbuf = map_pixbuf (icon_item);
+ draw_pixbuf (temp_pixbuf, drawable, icon_rect.x0, icon_rect.y0);
+
+ if (temp_pixbuf != details->pixbuf) {
+ gdk_pixbuf_unref (temp_pixbuf);
+ }
+
+ }
- /* if the pre-lit or selection flag is set, make a pre-lit or darkened pixbuf and draw that instead */
- temp_pixbuf = map_pixbuf (icon_item);
- draw_pixbuf (temp_pixbuf, drawable, icon_rect.x0, icon_rect.y0);
- if (temp_pixbuf != details->pixbuf) {
- gdk_pixbuf_unref (temp_pixbuf);
}
/* Draw the emblem pixbufs. */
@@ -1378,7 +1466,7 @@ draw_or_measure_label_text_aa (NautilusIconCanvasItem *item,
if (destination_pixbuf == NULL ) {
icon_width = 0;
} else {
- icon_width = details->pixbuf == NULL ? 0 : gdk_pixbuf_get_width (details->pixbuf);
+ icon_width = details->pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_width (item);
}
max_text_width = floor (nautilus_icon_canvas_item_get_max_text_width (item));
@@ -1634,15 +1722,21 @@ nautilus_icon_canvas_item_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
gnome_canvas_buf_ensure_buf (buf);
buf->is_bg = FALSE;
}
-
- /* draw the icon */
- nautilus_gnome_canvas_draw_pixbuf (buf, temp_pixbuf, icon_rect.x0, icon_rect.y0);
-
- if (temp_pixbuf != icon_item->details->pixbuf) {
- gdk_pixbuf_unref (temp_pixbuf);
+
+ /* draw the icon or widget */
+ if (icon_item->details->control) {
+ gtk_widget_queue_draw (icon_item->details->control);
+ } else {
+ nautilus_gnome_canvas_draw_pixbuf (buf, temp_pixbuf, icon_rect.x0, icon_rect.y0);
+
+ if (temp_pixbuf != icon_item->details->pixbuf) {
+ gdk_pixbuf_unref (temp_pixbuf);
+ }
}
-
- /* draw the emblems */
+
+ /* draw the emblems */
+ get_icon_canvas_rectangle (icon_item, &icon_rect);
+
emblem_layout_reset (&emblem_layout, icon_item, &icon_rect);
while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect)) {
nautilus_gnome_canvas_draw_pixbuf (buf, emblem_pixbuf, emblem_rect.x0, emblem_rect.y0);
@@ -1874,8 +1968,8 @@ nautilus_icon_canvas_item_bounds (GnomeCanvasItem *item,
icon_rect.x1 = 0;
icon_rect.y1 = 0;
} else {
- icon_rect.x1 = gdk_pixbuf_get_width (details->pixbuf);
- icon_rect.y1 = gdk_pixbuf_get_height (details->pixbuf);
+ icon_rect.x1 = nautilus_icon_canvas_item_get_icon_width (icon_item);
+ icon_rect.y1 = nautilus_icon_canvas_item_get_icon_height (icon_item);
}
/* Compute text rectangle. */
@@ -1921,8 +2015,8 @@ nautilus_icon_canvas_item_get_icon_rectangle (NautilusIconCanvasItem *item,
pixbuf = item->details->pixbuf;
pixels_per_unit = GNOME_CANVAS_ITEM (item)->canvas->pixels_per_unit;
- rect->x1 = rect->x0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_width (pixbuf)) / pixels_per_unit;
- rect->y1 = rect->y0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_height (pixbuf)) / pixels_per_unit;
+ rect->x1 = rect->x0 + (pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_width (item)) / pixels_per_unit;
+ rect->y1 = rect->y0 + (pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_height (item)) / pixels_per_unit;
}
/* Get the rectangle of the icon only, in canvas coordinates. */
@@ -1948,8 +2042,8 @@ get_icon_canvas_rectangle (NautilusIconCanvasItem *item,
pixbuf = item->details->pixbuf;
- rect->x1 = rect->x0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_width (pixbuf));
- rect->y1 = rect->y0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_height (pixbuf));
+ rect->x1 = rect->x0 + (pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_width (item));
+ rect->y1 = rect->y0 + (pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_height (item));
}
void
@@ -2106,6 +2200,42 @@ nautilus_icon_canvas_item_set_smooth_font (NautilusIconCanvasItem *icon_item,
}
}
+GtkWidget *
+nautilus_icon_canvas_item_get_control (NautilusIconCanvasItem *icon_item)
+{
+ return icon_item->details->control;
+}
+
+void
+nautilus_icon_canvas_item_set_control (NautilusIconCanvasItem *icon_item, GtkWidget *control)
+{
+ GnomeCanvasItem *item;
+
+ if (icon_item->details->control == control) {
+ return;
+ }
+
+ item = GNOME_CANVAS_ITEM (icon_item);
+ if (icon_item->details->control) {
+ gtk_signal_disconnect (GTK_OBJECT (icon_item->details->control), icon_item->details->control_destroy_id);
+ gtk_container_remove (GTK_CONTAINER (item->canvas), icon_item->details->control);
+ icon_item->details->control = NULL;
+ }
+
+ if (control) {
+ g_message ("adding control...");
+ icon_item->details->control = control;
+ icon_item->details->control_destroy_id = gtk_signal_connect (GTK_OBJECT (control),
+ "destroy",
+ (GtkSignalFunc) do_control_destroy,
+ item);
+ gtk_widget_show (control);
+ gtk_layout_put (GTK_LAYOUT (item->canvas), control,
+ item->x1 + item->canvas->zoom_xofs,
+ item->y1 + item->canvas->zoom_yofs);
+ }
+}
+
void
nautilus_icon_canvas_item_set_smooth_font_size (NautilusIconCanvasItem *icon_item,
guint font_size)
diff --git a/libnautilus-extensions/nautilus-icon-canvas-item.h b/libnautilus-extensions/nautilus-icon-canvas-item.h
index 5d196e368..310c79a29 100644
--- a/libnautilus-extensions/nautilus-icon-canvas-item.h
+++ b/libnautilus-extensions/nautilus-icon-canvas-item.h
@@ -80,6 +80,10 @@ const char *nautilus_icon_canvas_item_get_editable_text (NautilusIconCanv
void nautilus_icon_canvas_item_set_renaming (NautilusIconCanvasItem *icon_item,
gboolean state);
+GtkWidget * nautilus_icon_canvas_item_get_control (NautilusIconCanvasItem *icon_item);
+void nautilus_icon_canvas_item_set_control (NautilusIconCanvasItem *icon_item,
+ GtkWidget *control);
+
/* geometry and hit testing */
gboolean nautilus_icon_canvas_item_hit_test_rectangle (NautilusIconCanvasItem *item,
diff --git a/libnautilus-extensions/nautilus-icon-container.c b/libnautilus-extensions/nautilus-icon-container.c
index b8db94408..5983db1b3 100644
--- a/libnautilus-extensions/nautilus-icon-container.c
+++ b/libnautilus-extensions/nautilus-icon-container.c
@@ -158,6 +158,7 @@ enum {
CONTEXT_CLICK_SELECTION,
MIDDLE_CLICK,
GET_CONTAINER_URI,
+ GET_ICON_CONTROL,
GET_ICON_IMAGES,
GET_ICON_TEXT,
GET_ICON_URI,
@@ -3038,6 +3039,16 @@ nautilus_icon_container_initialize_class (NautilusIconContainerClass *class)
gtk_marshal_NONE__POINTER,
GTK_TYPE_NONE, 1,
GTK_TYPE_POINTER);
+ signals[GET_ICON_CONTROL]
+ = gtk_signal_new ("get_icon_control",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (NautilusIconContainerClass,
+ get_icon_control),
+ gtk_marshal_NONE__POINTER_POINTER,
+ GTK_TYPE_NONE, 2,
+ GTK_TYPE_POINTER,
+ GTK_TYPE_POINTER);
signals[GET_ICON_IMAGES]
= gtk_signal_new ("get_icon_images",
GTK_RUN_LAST,
@@ -3591,9 +3602,10 @@ nautilus_icon_container_update_icon (NautilusIconContainer *container,
GdkPixbuf *pixbuf, *emblem_pixbuf, *saved_pixbuf;
GList *emblem_scalable_icons, *emblem_pixbufs, *p;
char *editable_text, *additional_text;
+ GtkWidget *embedded_control;
GdkFont *font;
guint smooth_font_size;
-
+
if (icon == NULL) {
return;
}
@@ -3625,8 +3637,7 @@ nautilus_icon_container_update_icon (NautilusIconContainer *container,
nautilus_scalable_icon_unref (scalable_icon);
- /* in the rare case an image is too small, scale it up */
-
+ /* in the rare case an image is too small, scale it up */
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
if (width < min_image_size || height < min_image_size) {
@@ -3634,9 +3645,11 @@ nautilus_icon_container_update_icon (NautilusIconContainer *container,
/* don't let it exceed the maximum width in the other dimension */
scale_factor = MIN (scale_factor, max_image_size / width);
scale_factor = MIN (scale_factor, max_image_size / height);
-
+
scaled_width = floor (width * scale_factor + .5);
scaled_height = floor (height * scale_factor + .5);
+
+ /* scale the image to the calculated size */
saved_pixbuf = pixbuf;
pixbuf = gdk_pixbuf_scale_simple (pixbuf, scaled_width, scaled_height, GDK_INTERP_BILINEAR);
gdk_pixbuf_unref (saved_pixbuf);
@@ -3665,13 +3678,22 @@ nautilus_icon_container_update_icon (NautilusIconContainer *container,
emblem_pixbufs = g_list_reverse (emblem_pixbufs);
nautilus_scalable_icon_list_free (emblem_scalable_icons);
+ /* get the embedded control, if any */
+ embedded_control = nautilus_icon_canvas_item_get_control (icon->item);
+ if (embedded_control == NULL) {
+ gtk_signal_emit (GTK_OBJECT (container),
+ signals[GET_ICON_CONTROL],
+ icon->data,
+ &embedded_control);
+ }
+
/* Get both editable and non-editable icon text */
gtk_signal_emit (GTK_OBJECT (container),
signals[GET_ICON_TEXT],
icon->data,
&editable_text,
&additional_text);
-
+
/* If name of icon being renamed was changed from elsewhere, end renaming mode.
* Alternatively, we could replace the characters in the editable text widget
* with the new name, but that could cause timing problems if the user just
@@ -3696,6 +3718,8 @@ nautilus_icon_container_update_icon (NautilusIconContainer *container,
"smooth_font", details->smooth_label_font,
NULL);
+ nautilus_icon_canvas_item_set_control (icon->item, embedded_control);
+
nautilus_icon_canvas_item_set_image (icon->item, pixbuf);
nautilus_icon_canvas_item_set_attach_points (icon->item, &attach_points);
nautilus_icon_canvas_item_set_emblems (icon->item, emblem_pixbufs);
diff --git a/libnautilus-extensions/nautilus-icon-container.h b/libnautilus-extensions/nautilus-icon-container.h
index fa05a485c..03d4d7937 100644
--- a/libnautilus-extensions/nautilus-icon-container.h
+++ b/libnautilus-extensions/nautilus-icon-container.h
@@ -107,6 +107,10 @@ typedef struct {
gboolean (* get_stored_icon_position) (NautilusIconContainer *container,
NautilusIconData *data,
NautilusIconPosition *position);
+ void
+ (* get_icon_control) (NautilusIconContainer *container,
+ NautilusIconData *data,
+ GtkWidget **control);
NautilusScalableIcon *
(* get_icon_images) (NautilusIconContainer *container,
NautilusIconData *data,
diff --git a/libnautilus-extensions/nautilus-icon-dnd.c b/libnautilus-extensions/nautilus-icon-dnd.c
index 3e4f3da14..f87803d2d 100644
--- a/libnautilus-extensions/nautilus-icon-dnd.c
+++ b/libnautilus-extensions/nautilus-icon-dnd.c
@@ -1254,6 +1254,7 @@ nautilus_icon_dnd_begin_drag (NautilusIconContainer *container,
&pixmap_for_dragged_file,
&mask_for_dragged_file,
NAUTILUS_STANDARD_ALPHA_THRESHHOLD);
+ gdk_pixbuf_unref (pixbuf);
/* compute the image's offset */
nautilus_icon_canvas_item_get_icon_rectangle
diff --git a/libnautilus-extensions/nautilus-link.c b/libnautilus-extensions/nautilus-link.c
index 1463d2aef..665255720 100644
--- a/libnautilus-extensions/nautilus-link.c
+++ b/libnautilus-extensions/nautilus-link.c
@@ -292,6 +292,35 @@ nautilus_link_local_get_additional_text (const char *path)
(path, NAUTILUS_METADATA_KEY_EXTRA_TEXT);
}
+void nautilus_link_local_get_component_info (const char *path,
+ char **control_moniker, char **control_data)
+{
+ xmlDoc *document;
+ const char *mime_type;
+
+ *control_moniker = NULL;
+ *control_data = NULL;
+
+ /* Check mime type. Exit if it is not a nautilus link */
+ mime_type = gnome_vfs_get_file_mime_type (path, NULL, FALSE);
+ if (strcmp (mime_type, "application/x-nautilus-link") != 0) {
+ return;
+ }
+
+ document = xmlParseFile (path);
+ if (document != NULL) {
+ *control_moniker = xml_get_root_property (document,
+ NAUTILUS_METADATA_KEY_CONTROL_MONIKER);
+
+ *control_data = xml_get_root_property (document,
+ NAUTILUS_METADATA_KEY_CONTROL_DATA);
+
+ xmlFreeDoc (document);
+ }
+}
+
+
+
/* utility to return the local pathname of a cached icon, given the leaf name */
/* if the icons directory hasn't been created yet, create it */
static char *
diff --git a/libnautilus-extensions/nautilus-link.h b/libnautilus-extensions/nautilus-link.h
index 1f707f0c7..6a6df0852 100644
--- a/libnautilus-extensions/nautilus-link.h
+++ b/libnautilus-extensions/nautilus-link.h
@@ -72,14 +72,21 @@ gboolean nautilus_link_local_set_link_uri (const char
* none. Despite the fact that it takes a URI parameter, works only if
* the file is local and does sync. I/O.
*/
-char * nautilus_link_local_get_additional_text (const char *path);
+char * nautilus_link_local_get_additional_text (const char *path);
/* Returns the image associated with a link file. Despite the fact
* that it takes a URI parameter, works only if the file is local and
* does sync. I/O on the link, although it does async. on the image
* and caches if the image is remote.
*/
-char * nautilus_link_local_get_image_uri (const char *path);
+char * nautilus_link_local_get_image_uri (const char *path);
+
+/* returns the moniker of the component associated with a link file, as well as configuration data.
+ * It works only if the file is local and does sync. I/O.
+ */
+void nautilus_link_local_get_component_info (const char *path,
+ char **control_moniker,
+ char **control_data);
/* Returns the link type of a link file.
* Works only if the file is local and does sync. I/O
diff --git a/libnautilus-extensions/nautilus-metadata.h b/libnautilus-extensions/nautilus-metadata.h
index 3de64b564..18f8a75e3 100644
--- a/libnautilus-extensions/nautilus-metadata.h
+++ b/libnautilus-extensions/nautilus-metadata.h
@@ -72,6 +72,9 @@
#define NAUTILUS_METADATA_KEY_ICON_SCALE "ICON_SCALE"
#define NAUTILUS_METADATA_KEY_CUSTOM_ICON "CUSTOM_ICON"
+#define NAUTILUS_METADATA_KEY_CONTROL_MONIKER "CONTROL_MONIKER"
+#define NAUTILUS_METADATA_KEY_CONTROL_DATA "CONTROL_DATA"
+
/* per link file */
#define NAUTILUS_METADATA_KEY_EXTRA_TEXT "EXTRA_TEXT"
diff --git a/libnautilus-private/nautilus-file-utilities.c b/libnautilus-private/nautilus-file-utilities.c
index 046d652f5..b01345194 100644
--- a/libnautilus-private/nautilus-file-utilities.c
+++ b/libnautilus-private/nautilus-file-utilities.c
@@ -593,7 +593,6 @@ nautilus_get_user_main_directory (void)
nautilus_file_unref (file);
}
g_free (file_uri);
-
g_free (image_uri);
/* install the default link set */
diff --git a/libnautilus-private/nautilus-icon-canvas-item.c b/libnautilus-private/nautilus-icon-canvas-item.c
index f6da89a13..081faf2ba 100644
--- a/libnautilus-private/nautilus-icon-canvas-item.c
+++ b/libnautilus-private/nautilus-icon-canvas-item.c
@@ -3,7 +3,6 @@
/* Nautilus - Icon canvas item class for icon container.
*
* Copyright (C) 2000 Eazel, Inc
- *
* Author: Andy Hertzfeld <andy@eazel.com>
*
* This library is free software; you can redistribute it and/or
@@ -77,6 +76,10 @@ struct NautilusIconCanvasItemDetails {
GdkFont *font;
NautilusEmblemAttachPoints *attach_points;
+ /* stuff for controls; if this gets too big, we've put it in a separate struct */
+ GtkWidget *control; /* optional Bonobo control*/
+ guint control_destroy_id;
+
/* Size of the text at current font. */
int text_width;
int text_height;
@@ -90,7 +93,7 @@ struct NautilusIconCanvasItemDetails {
guint is_highlighted_for_drop : 1;
guint show_stretch_handles : 1;
guint is_prelit : 1;
-
+ guint in_control_destroy : 1;
gboolean is_renaming;
/* Font stuff whilst in smooth mode */
@@ -104,7 +107,7 @@ enum {
ARG_EDITABLE_TEXT,
ARG_ADDITIONAL_TEXT,
ARG_FONT,
- ARG_HIGHLIGHTED_FOR_SELECTION,
+ ARG_HIGHLIGHTED_FOR_SELECTION,
ARG_HIGHLIGHTED_AS_KEYBOARD_FOCUS,
ARG_HIGHLIGHTED_FOR_DROP,
ARG_MODIFIER,
@@ -313,6 +316,11 @@ nautilus_icon_canvas_item_destroy (GtkObject *object)
gdk_font_unref (details->font);
}
+ if (details->control && !details->in_control_destroy) {
+ gtk_signal_disconnect (GTK_OBJECT (details->control), details->control_destroy_id);
+ gtk_widget_destroy (details->control);
+ }
+
gtk_object_unref (GTK_OBJECT (icon_item->details->smooth_font));
icon_item->details->smooth_font = NULL;
@@ -344,6 +352,28 @@ nautilus_icon_canvas_item_invalidate_label_size (NautilusIconCanvasItem *item)
item->details->text_height = -1;
}
+/* abstraction layer for icon width and height, to separate it from pixbuf with and height */
+static int
+nautilus_icon_canvas_item_get_icon_width (NautilusIconCanvasItem *item)
+{
+ if (item->details->pixbuf == NULL) {
+ return NAUTILUS_ICON_SIZE_STANDARD;
+ }
+
+ return gdk_pixbuf_get_width (item->details->pixbuf);
+}
+
+static int
+nautilus_icon_canvas_item_get_icon_height (NautilusIconCanvasItem *item)
+{
+ if (item->details->pixbuf == NULL) {
+ return NAUTILUS_ICON_SIZE_STANDARD;
+ }
+
+ return gdk_pixbuf_get_height (item->details->pixbuf);
+}
+
+
/* Set_arg handler for the icon item. */
static void
nautilus_icon_canvas_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
@@ -426,8 +456,7 @@ nautilus_icon_canvas_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
case ARG_SMOOTH_FONT_SIZE:
nautilus_icon_canvas_item_set_smooth_font_size (NAUTILUS_ICON_CANVAS_ITEM (object),
GTK_VALUE_UINT (*arg));
- break;
-
+ break;
default:
g_warning ("nautilus_icons_view_item_item_set_arg on unknown argument");
return;
@@ -436,12 +465,27 @@ nautilus_icon_canvas_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (object));
}
+/* handler for the control's destroy signal */
+static void
+do_control_destroy (GtkObject *object, gpointer data)
+{
+ NautilusIconCanvasItemDetails *details;
+
+ details = NAUTILUS_ICON_CANVAS_ITEM (data)->details;
+
+ details->in_control_destroy = TRUE;
+
+ gtk_object_destroy (GTK_OBJECT (data));
+}
+
/* Get_arg handler for the icon item */
static void
nautilus_icon_canvas_item_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
{
NautilusIconCanvasItemDetails *details;
+ GnomeCanvasItem *item;
+ item = GNOME_CANVAS_ITEM (object);
details = NAUTILUS_ICON_CANVAS_ITEM (object)->details;
switch (arg_id) {
@@ -489,12 +533,27 @@ GdkPixbuf *
nautilus_icon_canvas_item_get_image (NautilusIconCanvasItem *item)
{
NautilusIconCanvasItemDetails *details;
-
+ int width, height;
+ GdkPixbuf *pixbuf;
+
g_return_val_if_fail (NAUTILUS_IS_ICON_CANVAS_ITEM (item), NULL);
details = item->details;
- return details->pixbuf;
+ if (details->control) {
+ width = details->control->allocation.width;
+ height = details->control->allocation.height;
+ pixbuf = nautilus_gdk_pixbuf_get_from_window_safe (details->control->window,
+ details->control->allocation.x,
+ details->control->allocation.y,
+ details->control->allocation.width,
+ details->control->allocation.height);
+ } else {
+ pixbuf = details->pixbuf;
+ gdk_pixbuf_ref (pixbuf);
+ }
+
+ return pixbuf;
}
void
@@ -596,6 +655,12 @@ recompute_bounding_box (NautilusIconCanvasItem *icon_item)
item->y1 = top_left.y;
item->x2 = bottom_right.x;
item->y2 = bottom_right.y;
+
+ if (icon_item->details->control)
+ gtk_layout_move (GTK_LAYOUT (item->canvas), icon_item->details->control,
+ item->x1 + item->canvas->zoom_xofs,
+ item->y1 + item->canvas->zoom_yofs);
+
}
void
@@ -615,6 +680,16 @@ nautilus_icon_canvas_item_update_bounds (NautilusIconCanvasItem *item)
return;
}
+ /* if there is an embedded control, resize it appropriately */
+ if (item->details->control) {
+ /* for now, size it the same as the underlying image */
+ int image_width = nautilus_icon_canvas_item_get_icon_width (item);
+ int image_height = nautilus_icon_canvas_item_get_icon_height (item);
+
+ gtk_widget_set_usize (item->details->control,
+ image_width, image_height);
+ }
+
/* Send out the bounds_changed signal and queue a redraw. */
nautilus_gnome_canvas_request_redraw_rectangle
(GNOME_CANVAS_ITEM (item)->canvas, &before);
@@ -756,7 +831,7 @@ draw_or_measure_label_text (NautilusIconCanvasItem *item,
canvas_item = GNOME_CANVAS_ITEM (item);
if (drawable != NULL) {
- icon_width = details->pixbuf == NULL ? 0 : gdk_pixbuf_get_width (details->pixbuf);
+ icon_width = details->pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_width (item);
gc = gdk_gc_new (canvas_item->canvas->layout.bin_window);
gdk_gc_get_values (gc, &save_gc);
}
@@ -1158,11 +1233,17 @@ emblem_layout_next (EmblemLayout *layout,
/* Return the rectangle and pixbuf. */
*emblem_pixbuf = pixbuf;
- emblem_rect->x0 = x - width / 2;
- emblem_rect->y0 = y - height / 2;
+ if (layout->icon_item->details->control) {
+ emblem_rect->x0 = x;
+ emblem_rect->y0 = y;
+ } else {
+ emblem_rect->x0 = x - width / 2;
+ emblem_rect->y0 = y - height / 2;
+ }
+
emblem_rect->x1 = emblem_rect->x0 + width;
emblem_rect->y1 = emblem_rect->y0 + height;
-
+
return TRUE;
}
@@ -1277,23 +1358,30 @@ nautilus_icon_canvas_item_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
icon_item = NAUTILUS_ICON_CANVAS_ITEM (item);
details = icon_item->details;
- /* Draw the pixbuf. */
- if (details->pixbuf == NULL) {
- return;
- }
- /* Compute icon rectangle in drawable coordinates. */
- get_icon_canvas_rectangle (icon_item, &icon_rect);
- icon_rect.x0 -= x;
- icon_rect.y0 -= y;
- icon_rect.x1 -= x;
- icon_rect.y1 -= y;
+ /* draw the icon or widget */
+ if (icon_item->details->control) {
+ gtk_widget_queue_draw (icon_item->details->control);
+ } else {
+ if (details->pixbuf != NULL) {
+
+ /* Compute icon rectangle in drawable coordinates. */
+ get_icon_canvas_rectangle (icon_item, &icon_rect);
+ icon_rect.x0 -= x;
+ icon_rect.y0 -= y;
+ icon_rect.x1 -= x;
+ icon_rect.y1 -= y;
+
+ /* if the pre-lit or selection flag is set, make a pre-lit or darkened pixbuf and draw that instead */
+ temp_pixbuf = map_pixbuf (icon_item);
+ draw_pixbuf (temp_pixbuf, drawable, icon_rect.x0, icon_rect.y0);
+
+ if (temp_pixbuf != details->pixbuf) {
+ gdk_pixbuf_unref (temp_pixbuf);
+ }
+
+ }
- /* if the pre-lit or selection flag is set, make a pre-lit or darkened pixbuf and draw that instead */
- temp_pixbuf = map_pixbuf (icon_item);
- draw_pixbuf (temp_pixbuf, drawable, icon_rect.x0, icon_rect.y0);
- if (temp_pixbuf != details->pixbuf) {
- gdk_pixbuf_unref (temp_pixbuf);
}
/* Draw the emblem pixbufs. */
@@ -1378,7 +1466,7 @@ draw_or_measure_label_text_aa (NautilusIconCanvasItem *item,
if (destination_pixbuf == NULL ) {
icon_width = 0;
} else {
- icon_width = details->pixbuf == NULL ? 0 : gdk_pixbuf_get_width (details->pixbuf);
+ icon_width = details->pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_width (item);
}
max_text_width = floor (nautilus_icon_canvas_item_get_max_text_width (item));
@@ -1634,15 +1722,21 @@ nautilus_icon_canvas_item_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
gnome_canvas_buf_ensure_buf (buf);
buf->is_bg = FALSE;
}
-
- /* draw the icon */
- nautilus_gnome_canvas_draw_pixbuf (buf, temp_pixbuf, icon_rect.x0, icon_rect.y0);
-
- if (temp_pixbuf != icon_item->details->pixbuf) {
- gdk_pixbuf_unref (temp_pixbuf);
+
+ /* draw the icon or widget */
+ if (icon_item->details->control) {
+ gtk_widget_queue_draw (icon_item->details->control);
+ } else {
+ nautilus_gnome_canvas_draw_pixbuf (buf, temp_pixbuf, icon_rect.x0, icon_rect.y0);
+
+ if (temp_pixbuf != icon_item->details->pixbuf) {
+ gdk_pixbuf_unref (temp_pixbuf);
+ }
}
-
- /* draw the emblems */
+
+ /* draw the emblems */
+ get_icon_canvas_rectangle (icon_item, &icon_rect);
+
emblem_layout_reset (&emblem_layout, icon_item, &icon_rect);
while (emblem_layout_next (&emblem_layout, &emblem_pixbuf, &emblem_rect)) {
nautilus_gnome_canvas_draw_pixbuf (buf, emblem_pixbuf, emblem_rect.x0, emblem_rect.y0);
@@ -1874,8 +1968,8 @@ nautilus_icon_canvas_item_bounds (GnomeCanvasItem *item,
icon_rect.x1 = 0;
icon_rect.y1 = 0;
} else {
- icon_rect.x1 = gdk_pixbuf_get_width (details->pixbuf);
- icon_rect.y1 = gdk_pixbuf_get_height (details->pixbuf);
+ icon_rect.x1 = nautilus_icon_canvas_item_get_icon_width (icon_item);
+ icon_rect.y1 = nautilus_icon_canvas_item_get_icon_height (icon_item);
}
/* Compute text rectangle. */
@@ -1921,8 +2015,8 @@ nautilus_icon_canvas_item_get_icon_rectangle (NautilusIconCanvasItem *item,
pixbuf = item->details->pixbuf;
pixels_per_unit = GNOME_CANVAS_ITEM (item)->canvas->pixels_per_unit;
- rect->x1 = rect->x0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_width (pixbuf)) / pixels_per_unit;
- rect->y1 = rect->y0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_height (pixbuf)) / pixels_per_unit;
+ rect->x1 = rect->x0 + (pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_width (item)) / pixels_per_unit;
+ rect->y1 = rect->y0 + (pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_height (item)) / pixels_per_unit;
}
/* Get the rectangle of the icon only, in canvas coordinates. */
@@ -1948,8 +2042,8 @@ get_icon_canvas_rectangle (NautilusIconCanvasItem *item,
pixbuf = item->details->pixbuf;
- rect->x1 = rect->x0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_width (pixbuf));
- rect->y1 = rect->y0 + (pixbuf == NULL ? 0 : gdk_pixbuf_get_height (pixbuf));
+ rect->x1 = rect->x0 + (pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_width (item));
+ rect->y1 = rect->y0 + (pixbuf == NULL ? 0 : nautilus_icon_canvas_item_get_icon_height (item));
}
void
@@ -2106,6 +2200,42 @@ nautilus_icon_canvas_item_set_smooth_font (NautilusIconCanvasItem *icon_item,
}
}
+GtkWidget *
+nautilus_icon_canvas_item_get_control (NautilusIconCanvasItem *icon_item)
+{
+ return icon_item->details->control;
+}
+
+void
+nautilus_icon_canvas_item_set_control (NautilusIconCanvasItem *icon_item, GtkWidget *control)
+{
+ GnomeCanvasItem *item;
+
+ if (icon_item->details->control == control) {
+ return;
+ }
+
+ item = GNOME_CANVAS_ITEM (icon_item);
+ if (icon_item->details->control) {
+ gtk_signal_disconnect (GTK_OBJECT (icon_item->details->control), icon_item->details->control_destroy_id);
+ gtk_container_remove (GTK_CONTAINER (item->canvas), icon_item->details->control);
+ icon_item->details->control = NULL;
+ }
+
+ if (control) {
+ g_message ("adding control...");
+ icon_item->details->control = control;
+ icon_item->details->control_destroy_id = gtk_signal_connect (GTK_OBJECT (control),
+ "destroy",
+ (GtkSignalFunc) do_control_destroy,
+ item);
+ gtk_widget_show (control);
+ gtk_layout_put (GTK_LAYOUT (item->canvas), control,
+ item->x1 + item->canvas->zoom_xofs,
+ item->y1 + item->canvas->zoom_yofs);
+ }
+}
+
void
nautilus_icon_canvas_item_set_smooth_font_size (NautilusIconCanvasItem *icon_item,
guint font_size)
diff --git a/libnautilus-private/nautilus-icon-canvas-item.h b/libnautilus-private/nautilus-icon-canvas-item.h
index 5d196e368..310c79a29 100644
--- a/libnautilus-private/nautilus-icon-canvas-item.h
+++ b/libnautilus-private/nautilus-icon-canvas-item.h
@@ -80,6 +80,10 @@ const char *nautilus_icon_canvas_item_get_editable_text (NautilusIconCanv
void nautilus_icon_canvas_item_set_renaming (NautilusIconCanvasItem *icon_item,
gboolean state);
+GtkWidget * nautilus_icon_canvas_item_get_control (NautilusIconCanvasItem *icon_item);
+void nautilus_icon_canvas_item_set_control (NautilusIconCanvasItem *icon_item,
+ GtkWidget *control);
+
/* geometry and hit testing */
gboolean nautilus_icon_canvas_item_hit_test_rectangle (NautilusIconCanvasItem *item,
diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c
index b8db94408..5983db1b3 100644
--- a/libnautilus-private/nautilus-icon-container.c
+++ b/libnautilus-private/nautilus-icon-container.c
@@ -158,6 +158,7 @@ enum {
CONTEXT_CLICK_SELECTION,
MIDDLE_CLICK,
GET_CONTAINER_URI,
+ GET_ICON_CONTROL,
GET_ICON_IMAGES,
GET_ICON_TEXT,
GET_ICON_URI,
@@ -3038,6 +3039,16 @@ nautilus_icon_container_initialize_class (NautilusIconContainerClass *class)
gtk_marshal_NONE__POINTER,
GTK_TYPE_NONE, 1,
GTK_TYPE_POINTER);
+ signals[GET_ICON_CONTROL]
+ = gtk_signal_new ("get_icon_control",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (NautilusIconContainerClass,
+ get_icon_control),
+ gtk_marshal_NONE__POINTER_POINTER,
+ GTK_TYPE_NONE, 2,
+ GTK_TYPE_POINTER,
+ GTK_TYPE_POINTER);
signals[GET_ICON_IMAGES]
= gtk_signal_new ("get_icon_images",
GTK_RUN_LAST,
@@ -3591,9 +3602,10 @@ nautilus_icon_container_update_icon (NautilusIconContainer *container,
GdkPixbuf *pixbuf, *emblem_pixbuf, *saved_pixbuf;
GList *emblem_scalable_icons, *emblem_pixbufs, *p;
char *editable_text, *additional_text;
+ GtkWidget *embedded_control;
GdkFont *font;
guint smooth_font_size;
-
+
if (icon == NULL) {
return;
}
@@ -3625,8 +3637,7 @@ nautilus_icon_container_update_icon (NautilusIconContainer *container,
nautilus_scalable_icon_unref (scalable_icon);
- /* in the rare case an image is too small, scale it up */
-
+ /* in the rare case an image is too small, scale it up */
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
if (width < min_image_size || height < min_image_size) {
@@ -3634,9 +3645,11 @@ nautilus_icon_container_update_icon (NautilusIconContainer *container,
/* don't let it exceed the maximum width in the other dimension */
scale_factor = MIN (scale_factor, max_image_size / width);
scale_factor = MIN (scale_factor, max_image_size / height);
-
+
scaled_width = floor (width * scale_factor + .5);
scaled_height = floor (height * scale_factor + .5);
+
+ /* scale the image to the calculated size */
saved_pixbuf = pixbuf;
pixbuf = gdk_pixbuf_scale_simple (pixbuf, scaled_width, scaled_height, GDK_INTERP_BILINEAR);
gdk_pixbuf_unref (saved_pixbuf);
@@ -3665,13 +3678,22 @@ nautilus_icon_container_update_icon (NautilusIconContainer *container,
emblem_pixbufs = g_list_reverse (emblem_pixbufs);
nautilus_scalable_icon_list_free (emblem_scalable_icons);
+ /* get the embedded control, if any */
+ embedded_control = nautilus_icon_canvas_item_get_control (icon->item);
+ if (embedded_control == NULL) {
+ gtk_signal_emit (GTK_OBJECT (container),
+ signals[GET_ICON_CONTROL],
+ icon->data,
+ &embedded_control);
+ }
+
/* Get both editable and non-editable icon text */
gtk_signal_emit (GTK_OBJECT (container),
signals[GET_ICON_TEXT],
icon->data,
&editable_text,
&additional_text);
-
+
/* If name of icon being renamed was changed from elsewhere, end renaming mode.
* Alternatively, we could replace the characters in the editable text widget
* with the new name, but that could cause timing problems if the user just
@@ -3696,6 +3718,8 @@ nautilus_icon_container_update_icon (NautilusIconContainer *container,
"smooth_font", details->smooth_label_font,
NULL);
+ nautilus_icon_canvas_item_set_control (icon->item, embedded_control);
+
nautilus_icon_canvas_item_set_image (icon->item, pixbuf);
nautilus_icon_canvas_item_set_attach_points (icon->item, &attach_points);
nautilus_icon_canvas_item_set_emblems (icon->item, emblem_pixbufs);
diff --git a/libnautilus-private/nautilus-icon-container.h b/libnautilus-private/nautilus-icon-container.h
index fa05a485c..03d4d7937 100644
--- a/libnautilus-private/nautilus-icon-container.h
+++ b/libnautilus-private/nautilus-icon-container.h
@@ -107,6 +107,10 @@ typedef struct {
gboolean (* get_stored_icon_position) (NautilusIconContainer *container,
NautilusIconData *data,
NautilusIconPosition *position);
+ void
+ (* get_icon_control) (NautilusIconContainer *container,
+ NautilusIconData *data,
+ GtkWidget **control);
NautilusScalableIcon *
(* get_icon_images) (NautilusIconContainer *container,
NautilusIconData *data,
diff --git a/libnautilus-private/nautilus-icon-dnd.c b/libnautilus-private/nautilus-icon-dnd.c
index 3e4f3da14..f87803d2d 100644
--- a/libnautilus-private/nautilus-icon-dnd.c
+++ b/libnautilus-private/nautilus-icon-dnd.c
@@ -1254,6 +1254,7 @@ nautilus_icon_dnd_begin_drag (NautilusIconContainer *container,
&pixmap_for_dragged_file,
&mask_for_dragged_file,
NAUTILUS_STANDARD_ALPHA_THRESHHOLD);
+ gdk_pixbuf_unref (pixbuf);
/* compute the image's offset */
nautilus_icon_canvas_item_get_icon_rectangle
diff --git a/libnautilus-private/nautilus-link.c b/libnautilus-private/nautilus-link.c
index 1463d2aef..665255720 100644
--- a/libnautilus-private/nautilus-link.c
+++ b/libnautilus-private/nautilus-link.c
@@ -292,6 +292,35 @@ nautilus_link_local_get_additional_text (const char *path)
(path, NAUTILUS_METADATA_KEY_EXTRA_TEXT);
}
+void nautilus_link_local_get_component_info (const char *path,
+ char **control_moniker, char **control_data)
+{
+ xmlDoc *document;
+ const char *mime_type;
+
+ *control_moniker = NULL;
+ *control_data = NULL;
+
+ /* Check mime type. Exit if it is not a nautilus link */
+ mime_type = gnome_vfs_get_file_mime_type (path, NULL, FALSE);
+ if (strcmp (mime_type, "application/x-nautilus-link") != 0) {
+ return;
+ }
+
+ document = xmlParseFile (path);
+ if (document != NULL) {
+ *control_moniker = xml_get_root_property (document,
+ NAUTILUS_METADATA_KEY_CONTROL_MONIKER);
+
+ *control_data = xml_get_root_property (document,
+ NAUTILUS_METADATA_KEY_CONTROL_DATA);
+
+ xmlFreeDoc (document);
+ }
+}
+
+
+
/* utility to return the local pathname of a cached icon, given the leaf name */
/* if the icons directory hasn't been created yet, create it */
static char *
diff --git a/libnautilus-private/nautilus-link.h b/libnautilus-private/nautilus-link.h
index 1f707f0c7..6a6df0852 100644
--- a/libnautilus-private/nautilus-link.h
+++ b/libnautilus-private/nautilus-link.h
@@ -72,14 +72,21 @@ gboolean nautilus_link_local_set_link_uri (const char
* none. Despite the fact that it takes a URI parameter, works only if
* the file is local and does sync. I/O.
*/
-char * nautilus_link_local_get_additional_text (const char *path);
+char * nautilus_link_local_get_additional_text (const char *path);
/* Returns the image associated with a link file. Despite the fact
* that it takes a URI parameter, works only if the file is local and
* does sync. I/O on the link, although it does async. on the image
* and caches if the image is remote.
*/
-char * nautilus_link_local_get_image_uri (const char *path);
+char * nautilus_link_local_get_image_uri (const char *path);
+
+/* returns the moniker of the component associated with a link file, as well as configuration data.
+ * It works only if the file is local and does sync. I/O.
+ */
+void nautilus_link_local_get_component_info (const char *path,
+ char **control_moniker,
+ char **control_data);
/* Returns the link type of a link file.
* Works only if the file is local and does sync. I/O
diff --git a/libnautilus-private/nautilus-metadata.h b/libnautilus-private/nautilus-metadata.h
index 3de64b564..18f8a75e3 100644
--- a/libnautilus-private/nautilus-metadata.h
+++ b/libnautilus-private/nautilus-metadata.h
@@ -72,6 +72,9 @@
#define NAUTILUS_METADATA_KEY_ICON_SCALE "ICON_SCALE"
#define NAUTILUS_METADATA_KEY_CUSTOM_ICON "CUSTOM_ICON"
+#define NAUTILUS_METADATA_KEY_CONTROL_MONIKER "CONTROL_MONIKER"
+#define NAUTILUS_METADATA_KEY_CONTROL_DATA "CONTROL_DATA"
+
/* per link file */
#define NAUTILUS_METADATA_KEY_EXTRA_TEXT "EXTRA_TEXT"
diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c
index baa2cf7b6..a9b2df3fa 100644
--- a/src/file-manager/fm-icon-view.c
+++ b/src/file-manager/fm-icon-view.c
@@ -28,6 +28,7 @@
#include "fm-desktop-icon-view.h"
#include "fm-error-reporting.h"
#include "fm-icon-text-window.h"
+#include <bonobo/bonobo-widget.h>
#include <bonobo/bonobo-ui-util.h>
#include <ctype.h>
#include <errno.h>
@@ -1673,6 +1674,39 @@ get_icon_images_callback (NautilusIconContainer *container,
return nautilus_icon_factory_get_icon_for_file (file, modifier, smooth_graphics);
}
+/* return the Bonobo control associated with the icon, if any */
+static void
+get_icon_control_callback (NautilusIconContainer *container,
+ NautilusFile *file,
+ GtkWidget **control,
+ FMIconView *icon_view)
+{
+ Bonobo_UIContainer ui_container;
+ char *control_moniker, *control_data;
+ char *uri, *path;
+ *control = NULL;
+
+ if (nautilus_file_is_nautilus_link (file)) {
+ uri = nautilus_file_get_uri (file);
+ path = gnome_vfs_get_local_path_from_uri (uri);
+ if (path != NULL) {
+ nautilus_link_local_get_component_info (path, &control_moniker, &control_data);
+ if (control_moniker && strlen (control_moniker) > 0) {
+ g_message ("got moniker %s", control_moniker);
+ ui_container = fm_directory_view_get_bonobo_ui_container (FM_DIRECTORY_VIEW (icon_view));
+ *control = bonobo_widget_new_control (control_moniker, ui_container);
+ g_free (control_moniker);
+ }
+ if (control_data && strlen (control_data) > 0) {
+ bonobo_widget_set_property (BONOBO_WIDGET (*control), "configuration", control_data, NULL);
+ g_free (control_data);
+ }
+ g_free (path);
+ }
+ g_free (uri);
+ }
+}
+
static char *
get_icon_uri_callback (NautilusIconContainer *container,
NautilusFile *file,
@@ -2044,6 +2078,10 @@ create_icon_container (FMIconView *icon_view)
GTK_SIGNAL_FUNC (get_icon_images_callback),
icon_view);
gtk_signal_connect (GTK_OBJECT (icon_container),
+ "get_icon_control",
+ GTK_SIGNAL_FUNC (get_icon_control_callback),
+ icon_view);
+ gtk_signal_connect (GTK_OBJECT (icon_container),
"get_icon_uri",
GTK_SIGNAL_FUNC (get_icon_uri_callback),
icon_view);
diff --git a/src/nautilus-information-panel.c b/src/nautilus-information-panel.c
index 52805b61e..a8021da68 100644
--- a/src/nautilus-information-panel.c
+++ b/src/nautilus-information-panel.c
@@ -1025,9 +1025,13 @@ nautilus_sidebar_release_event (GtkWidget *widget, GdkEventButton *event)
if (rounded_y >= GTK_WIDGET (sidebar->details->sidebar_tabs)->allocation.y) {
which_tab = nautilus_sidebar_tabs_hit_test (sidebar_tabs, event->x, event->y);
if (which_tab >= 0) {
- nautilus_sidebar_tabs_select_tab (sidebar_tabs, which_tab);
- nautilus_sidebar_activate_panel (sidebar, which_tab);
- gtk_widget_queue_draw (widget);
+ if (which_tab == sidebar->details->selected_index) {
+ nautilus_sidebar_deactivate_panel (sidebar);
+ } else {
+ nautilus_sidebar_tabs_select_tab (sidebar_tabs, which_tab);
+ nautilus_sidebar_activate_panel (sidebar, which_tab);
+ gtk_widget_queue_draw (widget);
+ }
}
}
diff --git a/src/nautilus-sidebar-tabs.c b/src/nautilus-sidebar-tabs.c
index 769eac11e..fe7126558 100644
--- a/src/nautilus-sidebar-tabs.c
+++ b/src/nautilus-sidebar-tabs.c
@@ -414,16 +414,17 @@ int nautilus_sidebar_tabs_hit_test (NautilusSidebarTabs *sidebar_tabs, int x, in
/* loop through the items, seeing it the passed in point is in one of the rectangles */
tab_item = (TabItem*) current_item->data;
+ /*
if (!tab_item->visible && current_item->next) {
tab_item = (TabItem*) current_item->next->data;
}
-
+ */
result = -1;
while (current_item != NULL) {
tab_item = (TabItem*) current_item->data;
rect_ptr = &tab_item->tab_rect;
- if (tab_item->visible) {
+ if (TRUE /*tab_item->visible*/) {
if ((x >= rect_ptr->x) && (x < rect_ptr->x + rect_ptr->width) &&
(y >= rect_ptr->y) && (y< rect_ptr->y + rect_ptr->height))
result = tab_item->notebook_page;
@@ -1317,8 +1318,9 @@ nautilus_sidebar_tabs_select_tab (NautilusSidebarTabs *sidebar_tabs, int which_t
for (next_tab = sidebar_tabs->details->tab_items; next_tab != NULL; next_tab = next_tab->next) {
TabItem *item = next_tab->data;
+
item->visible = (item->notebook_page != which_tab);
- item->prelit = FALSE;
+ item->prelit = FALSE;
}
recalculate_size(sidebar_tabs);
diff --git a/src/nautilus-sidebar.c b/src/nautilus-sidebar.c
index 52805b61e..a8021da68 100644
--- a/src/nautilus-sidebar.c
+++ b/src/nautilus-sidebar.c
@@ -1025,9 +1025,13 @@ nautilus_sidebar_release_event (GtkWidget *widget, GdkEventButton *event)
if (rounded_y >= GTK_WIDGET (sidebar->details->sidebar_tabs)->allocation.y) {
which_tab = nautilus_sidebar_tabs_hit_test (sidebar_tabs, event->x, event->y);
if (which_tab >= 0) {
- nautilus_sidebar_tabs_select_tab (sidebar_tabs, which_tab);
- nautilus_sidebar_activate_panel (sidebar, which_tab);
- gtk_widget_queue_draw (widget);
+ if (which_tab == sidebar->details->selected_index) {
+ nautilus_sidebar_deactivate_panel (sidebar);
+ } else {
+ nautilus_sidebar_tabs_select_tab (sidebar_tabs, which_tab);
+ nautilus_sidebar_activate_panel (sidebar, which_tab);
+ gtk_widget_queue_draw (widget);
+ }
}
}