diff options
author | Andy Hertzfeld <andy@src.gnome.org> | 2001-01-24 08:58:03 +0000 |
---|---|---|
committer | Andy Hertzfeld <andy@src.gnome.org> | 2001-01-24 08:58:03 +0000 |
commit | 3cf493c6ba2669be495ca1035158d5e4113bb3bc (patch) | |
tree | a3b094ba542221130c2f7d4b99804f8bea34a55d | |
parent | ab827a9fd681a006672486ac00e11939394e67b3 (diff) | |
download | nautilus-3cf493c6ba2669be495ca1035158d5e4113bb3bc.tar.gz |
initial check-in of post-1_0_1 branch
initial check-in of post-1_0_1 branch
29 files changed, 798 insertions, 518 deletions
@@ -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); + } } } |