summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRebecca Schulman <rebecka@eazel.com>2000-11-22 02:08:48 +0000
committerRebecca Schulman <rebecka@src.gnome.org>2000-11-22 02:08:48 +0000
commite31b0b9276f9a09978752e27c0eb47a7c8d22b6c (patch)
treeaffecb41ee3171a7779a18ac2ee49e2b822fa994
parent64b8133cc3a3df1c8256ebd8e0271b2adfa42e4d (diff)
downloadnautilus-e31b0b9276f9a09978752e27c0eb47a7c8d22b6c.tar.gz
reviewed by: Pavel Cisler <pavel@eazel.com>
2000-11-21 Rebecca Schulman <rebecka@eazel.com> reviewed by: Pavel Cisler <pavel@eazel.com> Fixes for bugs 690 and 733, to make the clipboard work for file editing in place, and make sensitivity work. Paste doesn't work correctly still, and a bug is filed for this issue. * libnautilus-extensions/nautilus-entry.h: * libnautilus-extensions/nautilus-entry.c: (nautilus_entry_initialize_class), (nautilus_entry_key_press), (nautilus_entry_motion_notify), (nautilus_entry_set_text), (nautilus_entry_set_selection), (nautilus_entry_insert_text), (nautilus_entry_delete_text): Added a new signal to nautilus entry, called "selection_changed" that is fired whenever the region selected in an editiable widget is changed. This is used to determine how to set clipboard sensitivity correctly. * libnautilus-extensions/nautilus-icon-container.h: * libnautilus-extensions/nautilus-icon-container.c: (nautilus_icon_container_initialize_class), (nautilus_icon_container_start_renaming_selected_item), (hide_rename_widget): Add a new signal "renaming_icon", which tells the icon view to set up clipboard capabilities for the new editable widget * libnautilus-extensions/nautilus-icon-private.h: * libnautilus-extensions/nautilus-icon-text-item.h: * libnautilus-extensions/nautilus-icon-text-item.c: (iti_stop_editing), (iti_entry_text_changed_by_clipboard), (iti_start_editing), (iti_destroy), (iti_start_selecting), (iti_stop_selecting), (iti_event), (nautilus_icon_text_item_get_renaming_editable): Sad hacks that I had to add on top of this already scary file so that the editable, which is in its own offscreen window somewhere, communicates to the clipboard what is actually going on when text is entered and selections are changed. This includes adding a new signal when text is changed, to make sure the entry knows about it, firing an initial grab focus for the widget so that the widget turns on, passing on more of the events of the canvas widget, including motion notifies and focus events, and keeping a persistent copy of the last renaming entry in the icon container so that pastes for that widget will still work. * libnautilus/nautilus-clipboard.h: * libnautilus/nautilus-clipboard.c: (set_menu_item_sensitive), (set_paste_sensitive_if_clipboard_contains_data), (set_clipboard_menu_items_sensitive), (set_clipboard_menu_items_insensitive), (clipboard_items_are_merged_in), (set_clipboard_items_are_merged_in), (merge_in_clipboard_menu_items), (merge_out_clipboard_menu_items), (focus_changed_callback), (grab_focus_callback), (selection_changed_callback), (initialize_clipboard_component_with_callback_data), (nautilus_clipboard_set_up_editable), (widget_was_set_up_with_selection_sensitivity), (first_focus_callback), (nautilus_clipboard_set_up_editable_in_control): Reorganized some of the code, and also added new callbacks to deal with sensitivity changes. * src/file-manager/fm-directory-view.h: * src/file-manager/fm-directory-view.c: (fm_directory_view_get_bonobo_control): Add a new function that the icon view uses to pass the bonobo control for clipboard set up * src/file-manager/fm-icon-view.c: (renaming_icon_callback), (create_icon_container): Set up clipboard capabilities when the renaming widget is created. * src/nautilus-location-bar.c: (nautilus_location_bar_new): * components/notes/nautilus-notes.c: (make_notes_view): * src/nautilus-simple-search-bar.c: (nautilus_simple_search_bar_new): Changed calls to clipboard set up routines to include the new shares_selection_changes parameter. Widgets that use the "selection_changed" signal (NautilusEntries) say "TRUE" here, otherwise selection doesn't work quite right, and FALSE is used instead. * src/nautilus-search-bar-criterion.c: (get_size_location_for): Deal with the case when a user has entered a non-numeric size in a smart way, by using nautilus_str_to_int. This is related to bug 2438, but is not a complete fix.
-rw-r--r--ChangeLog92
-rw-r--r--components/notes/nautilus-notes.c3
-rw-r--r--libnautilus-extensions/nautilus-entry.c70
-rw-r--r--libnautilus-extensions/nautilus-entry.h2
-rw-r--r--libnautilus-extensions/nautilus-icon-container.c43
-rw-r--r--libnautilus-extensions/nautilus-icon-container.h2
-rw-r--r--libnautilus-extensions/nautilus-icon-private.h2
-rw-r--r--libnautilus-extensions/nautilus-icon-text-item.c67
-rw-r--r--libnautilus-extensions/nautilus-icon-text-item.h41
-rw-r--r--libnautilus-private/nautilus-entry.c70
-rw-r--r--libnautilus-private/nautilus-entry.h2
-rw-r--r--libnautilus-private/nautilus-icon-container.c43
-rw-r--r--libnautilus-private/nautilus-icon-container.h2
-rw-r--r--libnautilus-private/nautilus-icon-private.h2
-rw-r--r--libnautilus-private/nautilus-icon-text-item.c67
-rw-r--r--libnautilus-private/nautilus-icon-text-item.h41
-rw-r--r--libnautilus/nautilus-clipboard.c266
-rw-r--r--libnautilus/nautilus-clipboard.h17
-rw-r--r--src/file-manager/fm-directory-view.c22
-rw-r--r--src/file-manager/fm-directory-view.h1
-rw-r--r--src/file-manager/fm-icon-view.c24
-rw-r--r--src/nautilus-location-bar.c3
-rw-r--r--src/nautilus-search-bar-criterion.c20
-rw-r--r--src/nautilus-simple-search-bar.c3
24 files changed, 739 insertions, 166 deletions
diff --git a/ChangeLog b/ChangeLog
index 42b89e4d7..43cc88eff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,94 @@
+2000-11-21 Rebecca Schulman <rebecka@eazel.com>
+
+ reviewed by: Pavel Cisler <pavel@eazel.com>
+
+ Fixes for bugs 690 and 733, to make the clipboard
+ work for file editing in place, and make sensitivity
+ work. Paste doesn't work correctly still, and a bug
+ is filed for this issue.
+
+ * libnautilus-extensions/nautilus-entry.h:
+ * libnautilus-extensions/nautilus-entry.c:
+ (nautilus_entry_initialize_class), (nautilus_entry_key_press),
+ (nautilus_entry_motion_notify), (nautilus_entry_set_text),
+ (nautilus_entry_set_selection), (nautilus_entry_insert_text),
+ (nautilus_entry_delete_text):
+ Added a new signal to nautilus entry, called "selection_changed"
+ that is fired whenever the region selected in an editiable widget
+ is changed. This is used to determine how to set clipboard sensitivity
+ correctly.
+
+ * libnautilus-extensions/nautilus-icon-container.h:
+ * libnautilus-extensions/nautilus-icon-container.c:
+ (nautilus_icon_container_initialize_class),
+ (nautilus_icon_container_start_renaming_selected_item),
+ (hide_rename_widget):
+ Add a new signal "renaming_icon", which tells the icon view
+ to set up clipboard capabilities for the new editable widget
+
+ * libnautilus-extensions/nautilus-icon-private.h:
+ * libnautilus-extensions/nautilus-icon-text-item.h:
+ * libnautilus-extensions/nautilus-icon-text-item.c:
+ (iti_stop_editing), (iti_entry_text_changed_by_clipboard),
+ (iti_start_editing), (iti_destroy), (iti_start_selecting),
+ (iti_stop_selecting), (iti_event),
+ (nautilus_icon_text_item_get_renaming_editable):
+
+ Sad hacks that I had to add on top of this already scary file so
+ that the editable, which is in its own offscreen window somewhere,
+ communicates to the clipboard what is actually going on when text
+ is entered and selections are changed. This includes adding a
+ new signal when text is changed, to make sure the entry knows about
+ it, firing an initial grab focus for the widget so that the widget
+ turns on, passing on more of the events of the canvas
+ widget, including motion notifies and focus events, and
+ keeping a persistent copy of the last renaming entry in the icon
+ container so that pastes for that widget will still work.
+
+ * libnautilus/nautilus-clipboard.h:
+ * libnautilus/nautilus-clipboard.c: (set_menu_item_sensitive),
+ (set_paste_sensitive_if_clipboard_contains_data),
+ (set_clipboard_menu_items_sensitive),
+ (set_clipboard_menu_items_insensitive),
+ (clipboard_items_are_merged_in),
+ (set_clipboard_items_are_merged_in),
+ (merge_in_clipboard_menu_items), (merge_out_clipboard_menu_items),
+ (focus_changed_callback), (grab_focus_callback),
+ (selection_changed_callback),
+ (initialize_clipboard_component_with_callback_data),
+ (nautilus_clipboard_set_up_editable),
+ (widget_was_set_up_with_selection_sensitivity),
+ (first_focus_callback),
+ (nautilus_clipboard_set_up_editable_in_control):
+ Reorganized some of the code, and also added new callbacks
+ to deal with sensitivity changes.
+
+ * src/file-manager/fm-directory-view.h:
+ * src/file-manager/fm-directory-view.c:
+ (fm_directory_view_get_bonobo_control):
+ Add a new function that the icon view uses to
+ pass the bonobo control for clipboard set up
+
+ * src/file-manager/fm-icon-view.c: (renaming_icon_callback),
+ (create_icon_container):
+ Set up clipboard capabilities when the renaming widget is
+ created.
+
+ * src/nautilus-location-bar.c: (nautilus_location_bar_new):
+ * components/notes/nautilus-notes.c: (make_notes_view):
+ * src/nautilus-simple-search-bar.c:
+ (nautilus_simple_search_bar_new):
+ Changed calls to clipboard set up routines to include
+ the new shares_selection_changes parameter. Widgets that
+ use the "selection_changed" signal (NautilusEntries)
+ say "TRUE" here, otherwise selection doesn't work quite
+ right, and FALSE is used instead.
+
+ * src/nautilus-search-bar-criterion.c: (get_size_location_for):
+ Deal with the case when a user has entered a non-numeric size
+ in a smart way, by using nautilus_str_to_int. This is related
+ to bug 2438, but is not a complete fix.
+
2000-11-21 Pavel Cisler <pavel@eazel.com>
reviewed by: Mathieu Lacage <mathieu@eazel.com>
@@ -10,6 +101,7 @@
Made the error text for copying into non-writeable dialogs more
accurate.
+>>>>>>> 1.2927
2000-11-21 Robey Pointer <robey@eazel.com>
* nautilus-installer/src/*.xpm:
diff --git a/components/notes/nautilus-notes.c b/components/notes/nautilus-notes.c
index c2e7c4166..0bd04b6d8 100644
--- a/components/notes/nautilus-notes.c
+++ b/components/notes/nautilus-notes.c
@@ -202,7 +202,8 @@ make_notes_view (BonoboGenericFactory *Factory, const char *goad_id, gpointer cl
/* handle selections */
nautilus_clipboard_set_up_editable_in_control
(GTK_EDITABLE (notes->note_text_field),
- nautilus_view_get_bonobo_control (notes->view));
+ nautilus_view_get_bonobo_control (notes->view),
+ FALSE);
/* FIXME bugzilla.eazel.com 4436:
* Undo not working in notes-view.
diff --git a/libnautilus-extensions/nautilus-entry.c b/libnautilus-extensions/nautilus-entry.c
index d53d66596..3b6ba2c36 100644
--- a/libnautilus-extensions/nautilus-entry.c
+++ b/libnautilus-extensions/nautilus-entry.c
@@ -44,6 +44,7 @@
enum {
USER_CHANGED,
+ SELECTION_CHANGED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL];
@@ -53,6 +54,8 @@ static void nautilus_entry_initialize_class (NautilusEntryClass *class);
static void nautilus_entry_destroy (GtkObject *object);
static gint nautilus_entry_key_press (GtkWidget *widget,
GdkEventKey *event);
+static gint nautilus_entry_motion_notify (GtkWidget *widget,
+ GdkEventMotion *event);
static void nautilus_entry_insert_text (GtkEditable *editable,
const gchar *text,
gint length,
@@ -60,6 +63,9 @@ static void nautilus_entry_insert_text (GtkEditable *editable,
static void nautilus_entry_delete_text (GtkEditable *editable,
gint start_pos,
gint end_pos);
+static void nautilus_entry_set_selection (GtkEditable *editable,
+ gint start_pos,
+ gint end_pos);
NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusEntry, nautilus_entry, GTK_TYPE_ENTRY)
@@ -75,11 +81,14 @@ nautilus_entry_initialize_class (NautilusEntryClass *class)
editable_class = GTK_EDITABLE_CLASS (class);
widget_class->key_press_event = nautilus_entry_key_press;
+ widget_class->motion_notify_event = nautilus_entry_motion_notify;
object_class->destroy = nautilus_entry_destroy;
editable_class->insert_text = nautilus_entry_insert_text;
editable_class->delete_text = nautilus_entry_delete_text;
+ editable_class->set_selection = nautilus_entry_set_selection;
+
/* Set up signals */
signals[USER_CHANGED] = gtk_signal_new
@@ -90,7 +99,14 @@ nautilus_entry_initialize_class (NautilusEntryClass *class)
user_changed),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
-
+ signals[SELECTION_CHANGED] = gtk_signal_new
+ ("selection_changed",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (NautilusEntryClass,
+ selection_changed),
+ gtk_marshal_NONE__NONE,
+ GTK_TYPE_NONE, 0);
gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
}
@@ -125,6 +141,7 @@ nautilus_entry_key_press (GtkWidget *widget, GdkEventKey *event)
NautilusEntry *entry;
GtkEditable *editable;
int position;
+ gint return_code;
entry = NAUTILUS_ENTRY (widget);
editable = GTK_EDITABLE (widget);
@@ -132,7 +149,6 @@ nautilus_entry_key_press (GtkWidget *widget, GdkEventKey *event)
if (!editable->editable) {
return FALSE;
}
-
switch (event->keyval) {
case GDK_Tab:
/* The location bar entry wants TAB to work kind of
@@ -161,9 +177,33 @@ nautilus_entry_key_press (GtkWidget *widget, GdkEventKey *event)
break;
}
- return NAUTILUS_CALL_PARENT_CLASS (GTK_WIDGET_CLASS,
- key_press_event,
- (widget, event));
+ return_code = NAUTILUS_CALL_PARENT_CLASS (GTK_WIDGET_CLASS,
+ key_press_event,
+ (widget, event));
+ gtk_signal_emit (GTK_OBJECT (widget), signals[SELECTION_CHANGED]);
+
+ return return_code;
+
+}
+
+static gint
+nautilus_entry_motion_notify (GtkWidget *widget,
+ GdkEventMotion *event)
+{
+ gint return_code;
+ guint old_start_pos, old_end_pos;
+
+ old_start_pos = GTK_EDITABLE (widget)->selection_start_pos;
+ old_end_pos = GTK_EDITABLE (widget)->selection_end_pos;
+
+ return_code = NAUTILUS_CALL_PARENT_CLASS (GTK_WIDGET_CLASS,
+ motion_notify_event,
+ (widget, event));
+ if (GTK_EDITABLE (widget)->selection_start_pos != old_start_pos ||
+ GTK_EDITABLE (widget)->selection_end_pos != old_end_pos) {
+ gtk_signal_emit (GTK_OBJECT (widget), signals[SELECTION_CHANGED]);
+ }
+ return return_code;
}
/**
@@ -231,6 +271,19 @@ nautilus_entry_set_text (NautilusEntry *entry, const gchar *text)
entry->user_edit = FALSE;
gtk_entry_set_text (GTK_ENTRY (entry), text);
entry->user_edit = TRUE;
+
+ gtk_signal_emit (GTK_OBJECT (entry), signals[SELECTION_CHANGED]);
+}
+
+void
+nautilus_entry_set_selection (GtkEditable *editable,
+ gint start_pos,
+ gint end_pos)
+{
+
+ NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, set_selection,
+ (editable, start_pos, end_pos));
+ gtk_signal_emit (GTK_OBJECT (editable), signals[SELECTION_CHANGED]);
}
static void
@@ -248,6 +301,8 @@ nautilus_entry_insert_text (GtkEditable *editable, const gchar *text,
NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, insert_text,
(editable, text, length, position));
+ gtk_signal_emit (GTK_OBJECT (editable), signals[SELECTION_CHANGED]);
+
}
@@ -255,6 +310,7 @@ static void
nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos)
{
NautilusEntry *entry;
+
entry = NAUTILUS_ENTRY(editable);
@@ -262,7 +318,9 @@ nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos)
if (entry->user_edit) {
gtk_signal_emit (GTK_OBJECT (editable), signals[USER_CHANGED]);
}
-
+
NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, delete_text,
(editable, start_pos, end_pos));
+
+ gtk_signal_emit (GTK_OBJECT (editable), signals[SELECTION_CHANGED]);
}
diff --git a/libnautilus-extensions/nautilus-entry.h b/libnautilus-extensions/nautilus-entry.h
index 24a3b4e13..bd4648a3f 100644
--- a/libnautilus-extensions/nautilus-entry.h
+++ b/libnautilus-extensions/nautilus-entry.h
@@ -58,6 +58,8 @@ struct NautilusEntryClass {
void (*user_changed) (NautilusEntry *entry);
+ void (*selection_changed) (NautilusEntry *entry);
+
};
GtkType nautilus_entry_get_type (void);
diff --git a/libnautilus-extensions/nautilus-icon-container.c b/libnautilus-extensions/nautilus-icon-container.c
index 187b54427..984e20679 100644
--- a/libnautilus-extensions/nautilus-icon-container.c
+++ b/libnautilus-extensions/nautilus-icon-container.c
@@ -46,6 +46,7 @@
#include <gtk/gtksignal.h>
#include <gtk/gtklayout.h>
#include <libgnomeui/gnome-canvas-rect-ellipse.h>
+#include <libnautilus/nautilus-clipboard.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
@@ -136,7 +137,6 @@ static gboolean is_renaming (NautilusIconContainer *contain
static gboolean is_renaming_pending (NautilusIconContainer *container);
static void process_pending_icon_to_rename (NautilusIconContainer *container);
-
NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusIconContainer,
nautilus_icon_container,
GNOME_TYPE_CANVAS)
@@ -160,6 +160,7 @@ enum {
GET_STORED_ICON_POSITION,
ICON_POSITION_CHANGED,
ICON_TEXT_CHANGED,
+ RENAMING_ICON,
LAYOUT_CHANGED,
MOVE_COPY_ITEMS,
CREATE_NAUTILUS_LINKS,
@@ -2897,6 +2898,15 @@ nautilus_icon_container_initialize_class (NautilusIconContainerClass *class)
GTK_TYPE_NONE, 2,
GTK_TYPE_POINTER,
GTK_TYPE_STRING);
+ signals[RENAMING_ICON]
+ = gtk_signal_new ("renaming_icon",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (NautilusIconContainerClass,
+ renaming_icon),
+ gtk_marshal_NONE__POINTER,
+ GTK_TYPE_NONE, 1,
+ GTK_TYPE_POINTER);
signals[GET_ICON_IMAGES]
= gtk_signal_new ("get_icon_images",
GTK_RUN_LAST,
@@ -4499,6 +4509,7 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con
g_assert (!has_multiple_selection (container));
+
if (!icon_is_positioned (icon)) {
set_pending_icon_to_rename (container, icon);
return;
@@ -4516,14 +4527,15 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con
details->original_text = g_strdup (editable_text);
- /* Create text renaming widget */
+ /* Create text renaming widget, if it hasn't been created already.
+ We deal with the broken icon text item widget by keeping it around
+ so its contents can still be cut and pasted as part of the clipboard */
+ g_assert (details->rename_widget == NULL);
details->rename_widget = NAUTILUS_ICON_TEXT_ITEM
(gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (container)),
nautilus_icon_text_item_get_type (),
NULL));
- /* Connect the text item to the clipboard */
-
-
+
/* Determine widget position widget in container */
font = details->label_font[details->zoom_level];
max_text_width = floor (nautilus_icon_canvas_item_get_max_text_width (icon->item));
@@ -4542,7 +4554,9 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con
font, /* font */
editable_text, /* text */
TRUE); /* allocate local copy */
-
+
+ /* FIXME: These callbacks don't have any side effects.
+ They should be removed */
/* Set up the signals */
gtk_signal_connect (GTK_OBJECT (details->rename_widget), "editing_started",
GTK_SIGNAL_FUNC (editing_started), container);
@@ -4551,6 +4565,12 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con
nautilus_icon_text_item_start_editing (details->rename_widget);
nautilus_icon_container_update_icon (container, icon);
+ gtk_signal_emit (GTK_OBJECT (container),
+ signals[RENAMING_ICON],
+ nautilus_icon_text_item_get_renaming_editable (details->rename_widget));
+
+
+
/* We are in renaming mode */
details->renaming = TRUE;
@@ -4585,16 +4605,25 @@ end_renaming_mode (NautilusIconContainer *container, gboolean commit)
hide_rename_widget (container, icon);
}
+/* FIXME: We're not exactly hiding this widget, we're destroying it!
+ Perhaps hide_rename_widget isn't the right name */
static void
hide_rename_widget (NautilusIconContainer *container, NautilusIcon *icon)
{
nautilus_icon_text_item_stop_editing (container->details->rename_widget, TRUE);
+
+ /* Destroy the old persistent rename editable */
+ if (container->details->rename_editable) {
+ gtk_object_destroy (GTK_OBJECT (container->details->rename_editable));
+ }
+ container->details->rename_editable =
+ nautilus_icon_text_item_get_renaming_editable (container->details->rename_widget);
/* Destroy renaming widget */
- /* FIXME bugzilla.eazel.com 2480: Is a destroy really sufficient here? Who does the unref? */
gtk_object_destroy (GTK_OBJECT (container->details->rename_widget));
container->details->rename_widget = NULL;
+
g_free (container->details->original_text);
/* We are not in renaming mode */
diff --git a/libnautilus-extensions/nautilus-icon-container.h b/libnautilus-extensions/nautilus-icon-container.h
index c4e02b05d..cf2d0ea7d 100644
--- a/libnautilus-extensions/nautilus-icon-container.h
+++ b/libnautilus-extensions/nautilus-icon-container.h
@@ -135,6 +135,8 @@ typedef struct {
void (* icon_text_changed) (NautilusIconContainer *container,
NautilusIconData *data,
const char *text);
+ void (* renaming_icon) (NautilusIconContainer *container,
+ GtkWidget *renaming_widget);
int (* preview) (NautilusIconContainer *container,
NautilusIconData *data,
gboolean start_flag);
diff --git a/libnautilus-extensions/nautilus-icon-private.h b/libnautilus-extensions/nautilus-icon-private.h
index 18977fc11..73361df93 100644
--- a/libnautilus-extensions/nautilus-icon-private.h
+++ b/libnautilus-extensions/nautilus-icon-private.h
@@ -25,6 +25,7 @@
#ifndef NAUTILUS_ICON_CONTAINER_PRIVATE_H
#define NAUTILUS_ICON_CONTAINER_PRIVATE_H
+#include "nautilus-entry.h"
#include "nautilus-glib-extensions.h"
#include "nautilus-icon-container.h"
#include "nautilus-icon-dnd.h"
@@ -147,6 +148,7 @@ struct NautilusIconContainerDetails {
/* Renaming Details */
gboolean renaming;
NautilusIconTextItem *rename_widget; /* Editable text item */
+ GtkWidget *rename_editable; /* Copy of the rename editable for clipboard pastes */
gchar *original_text; /* Copy of editable text for later compare */
/* typeahead selection state */
diff --git a/libnautilus-extensions/nautilus-icon-text-item.c b/libnautilus-extensions/nautilus-icon-text-item.c
index 5ff22d9ea..298f7d6cc 100644
--- a/libnautilus-extensions/nautilus-icon-text-item.c
+++ b/libnautilus-extensions/nautilus-icon-text-item.c
@@ -52,7 +52,6 @@ typedef NautilusIconTextItem Iti;
static void register_rename_undo (NautilusIconTextItem *item);
static void restore_from_undo_snapshot_callback (GtkObject *target, gpointer callback_data);
-
/* Private part of the NautilusIconTextItem structure */
typedef struct {
/* Font */
@@ -115,10 +114,6 @@ iti_stop_editing (Iti *iti)
iti->editing = FALSE;
- gtk_widget_destroy (priv->entry_top);
- priv->entry = NULL;
- priv->entry_top = NULL;
-
priv->need_state_update = TRUE;
gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (iti));
@@ -173,7 +168,6 @@ layout_text (Iti *iti)
gtk_signal_emit (GTK_OBJECT (iti), iti_signals [TEXT_EDITED]);
}
-
/* Accepts the text in the off-screen entry of an icon text item */
static void
iti_edition_accept (Iti *iti)
@@ -203,6 +197,27 @@ iti_edition_accept (Iti *iti)
gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (iti));
}
+
+static void
+iti_entry_text_changed_by_clipboard (GtkObject *widget,
+ gpointer data)
+{
+ Iti *iti;
+ GnomeCanvasItem *item;
+ ItiPrivate *priv;
+
+ /* Update text item to reflect changes */
+ iti = NAUTILUS_ICON_TEXT_ITEM (data);
+ layout_text (iti);
+ priv = iti->priv;
+ priv->need_text_update = TRUE;
+
+ item = GNOME_CANVAS_ITEM (iti);
+ gnome_canvas_item_request_update (item);
+
+}
+
+
/* Callback used when the off-screen entry of an icon text item is activated.
* When this happens, we have to accept edition.
*/
@@ -232,6 +247,11 @@ iti_start_editing (Iti *iti)
gtk_entry_set_text (GTK_ENTRY(priv->entry), iti->text);
gtk_signal_connect (GTK_OBJECT (priv->entry), "activate",
GTK_SIGNAL_FUNC (iti_entry_activate), iti);
+ /* Make clipboard functions cause an update the appearance of
+ the icon text item iteself, since the clipboard functions
+ will change the offscreen entry */
+ gtk_signal_connect_after (GTK_OBJECT (priv->entry), "changed",
+ GTK_SIGNAL_FUNC (iti_entry_text_changed_by_clipboard), iti);
priv->entry_top = gtk_window_new (GTK_WINDOW_POPUP);
gtk_container_add (GTK_CONTAINER (priv->entry_top), GTK_WIDGET (priv->entry));
@@ -279,9 +299,6 @@ iti_destroy (GtkObject *object)
if (priv->font)
gdk_font_unref (priv->font);
- if (priv->entry_top)
- gtk_widget_destroy (priv->entry_top);
-
g_free (priv);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
@@ -844,6 +861,8 @@ iti_stop_selecting (Iti *iti, guint32 event_time)
priv->need_state_update = TRUE;
gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (iti));
gtk_signal_emit (GTK_OBJECT (iti), iti_signals[SELECTION_STOPPED]);
+ /* Hack, since the real nautilus entry can't get this information */
+ gtk_signal_emit_by_name (GTK_OBJECT (priv->entry), "selection_changed");
}
/* Handles selection range changes on the icon text item */
@@ -984,13 +1003,13 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event)
case GDK_Down:
iti_handle_arrow_key_event(iti, event);
break;
-
+
default:
/* Check for control key operations */
if (event->key.state & GDK_CONTROL_MASK) {
return FALSE;
}
-
+
/* Register undo transaction if neccessary */
if (!priv->undo_registered) {
priv->undo_registered = TRUE;
@@ -1018,7 +1037,6 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event)
x = cx - (item->x1 + MARGIN_X);
y = cy - (item->y1 + MARGIN_Y);
idx = iti_idx_from_x_y (iti, x, y);
-
iti_start_selecting (iti, idx, event->button.time);
}
return TRUE;
@@ -1027,6 +1045,7 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event)
if (!iti->selecting)
break;
+ gtk_widget_event (GTK_WIDGET (priv->entry), event);
gnome_canvas_w2c(item->canvas, event->button.x, event->button.y, &cx, &cy);
x = cx - (item->x1 + MARGIN_X);
y = cy - (item->y1 + MARGIN_Y);
@@ -1041,13 +1060,17 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event)
break;
return TRUE;
-#if 0
+
case GDK_FOCUS_CHANGE:
if (iti->editing && !event->focus_change.in) {
iti_edition_accept (iti);
+
+ }
+ if (iti->editing) {
+ gtk_widget_event (GTK_WIDGET (priv->entry), event);
}
return TRUE;
-#endif
+
default:
break;
}
@@ -1488,6 +1511,22 @@ nautilus_icon_text_item_get_margins (int *x, int *y)
*y = MARGIN_Y;
}
+/**
+ * nautilus_icon_text_item_get_renaming_editable
+ * @GtkEditable *
+ * Return the editable widget doing the renaming
+ **/
+GtkWidget *
+nautilus_icon_text_item_get_renaming_editable (NautilusIconTextItem *item)
+{
+ ItiPrivate *priv;
+
+ priv = item->priv;
+
+ return GTK_WIDGET (priv->entry);
+}
+
+
/* register_undo
*
diff --git a/libnautilus-extensions/nautilus-icon-text-item.h b/libnautilus-extensions/nautilus-icon-text-item.h
index 8ef6b17d8..020005f22 100644
--- a/libnautilus-extensions/nautilus-icon-text-item.h
+++ b/libnautilus-extensions/nautilus-icon-text-item.h
@@ -69,25 +69,26 @@ typedef struct {
void (* selection_stopped) (NautilusIconTextItem *item);
} NautilusIconTextItemClass;
-GtkType nautilus_icon_text_item_get_type (void);
-void nautilus_icon_text_item_configure (NautilusIconTextItem *item,
- int x,
- int y,
- int width,
- GdkFont *font,
- const char *text,
- gboolean is_static);
-void nautilus_icon_text_item_setxy (NautilusIconTextItem *item,
- int x,
- int y);
-void nautilus_icon_text_item_select (NautilusIconTextItem *item,
- int sel);
-void nautilus_icon_text_item_set_text (NautilusIconTextItem *item,
- const char *text);
-char *nautilus_icon_text_item_get_text (NautilusIconTextItem *item);
-void nautilus_icon_text_item_start_editing (NautilusIconTextItem *item);
-void nautilus_icon_text_item_stop_editing (NautilusIconTextItem *item,
- gboolean accept);
-void nautilus_icon_text_item_get_margins (int *x, int *y);
+GtkType nautilus_icon_text_item_get_type (void);
+void nautilus_icon_text_item_configure (NautilusIconTextItem *item,
+ int x,
+ int y,
+ int width,
+ GdkFont *font,
+ const char *text,
+ gboolean is_static);
+void nautilus_icon_text_item_setxy (NautilusIconTextItem *item,
+ int x,
+ int y);
+void nautilus_icon_text_item_select (NautilusIconTextItem *item,
+ int sel);
+void nautilus_icon_text_item_set_text (NautilusIconTextItem *item,
+ const char *text);
+char * nautilus_icon_text_item_get_text (NautilusIconTextItem *item);
+void nautilus_icon_text_item_start_editing (NautilusIconTextItem *item);
+void nautilus_icon_text_item_stop_editing (NautilusIconTextItem *item,
+ gboolean accept);
+void nautilus_icon_text_item_get_margins (int *x, int *y);
+GtkWidget * nautilus_icon_text_item_get_renaming_editable (NautilusIconTextItem *item);
#endif /* NAUTILUS_ICON_TEXT_ITEM_H */
diff --git a/libnautilus-private/nautilus-entry.c b/libnautilus-private/nautilus-entry.c
index d53d66596..3b6ba2c36 100644
--- a/libnautilus-private/nautilus-entry.c
+++ b/libnautilus-private/nautilus-entry.c
@@ -44,6 +44,7 @@
enum {
USER_CHANGED,
+ SELECTION_CHANGED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL];
@@ -53,6 +54,8 @@ static void nautilus_entry_initialize_class (NautilusEntryClass *class);
static void nautilus_entry_destroy (GtkObject *object);
static gint nautilus_entry_key_press (GtkWidget *widget,
GdkEventKey *event);
+static gint nautilus_entry_motion_notify (GtkWidget *widget,
+ GdkEventMotion *event);
static void nautilus_entry_insert_text (GtkEditable *editable,
const gchar *text,
gint length,
@@ -60,6 +63,9 @@ static void nautilus_entry_insert_text (GtkEditable *editable,
static void nautilus_entry_delete_text (GtkEditable *editable,
gint start_pos,
gint end_pos);
+static void nautilus_entry_set_selection (GtkEditable *editable,
+ gint start_pos,
+ gint end_pos);
NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusEntry, nautilus_entry, GTK_TYPE_ENTRY)
@@ -75,11 +81,14 @@ nautilus_entry_initialize_class (NautilusEntryClass *class)
editable_class = GTK_EDITABLE_CLASS (class);
widget_class->key_press_event = nautilus_entry_key_press;
+ widget_class->motion_notify_event = nautilus_entry_motion_notify;
object_class->destroy = nautilus_entry_destroy;
editable_class->insert_text = nautilus_entry_insert_text;
editable_class->delete_text = nautilus_entry_delete_text;
+ editable_class->set_selection = nautilus_entry_set_selection;
+
/* Set up signals */
signals[USER_CHANGED] = gtk_signal_new
@@ -90,7 +99,14 @@ nautilus_entry_initialize_class (NautilusEntryClass *class)
user_changed),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
-
+ signals[SELECTION_CHANGED] = gtk_signal_new
+ ("selection_changed",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (NautilusEntryClass,
+ selection_changed),
+ gtk_marshal_NONE__NONE,
+ GTK_TYPE_NONE, 0);
gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
}
@@ -125,6 +141,7 @@ nautilus_entry_key_press (GtkWidget *widget, GdkEventKey *event)
NautilusEntry *entry;
GtkEditable *editable;
int position;
+ gint return_code;
entry = NAUTILUS_ENTRY (widget);
editable = GTK_EDITABLE (widget);
@@ -132,7 +149,6 @@ nautilus_entry_key_press (GtkWidget *widget, GdkEventKey *event)
if (!editable->editable) {
return FALSE;
}
-
switch (event->keyval) {
case GDK_Tab:
/* The location bar entry wants TAB to work kind of
@@ -161,9 +177,33 @@ nautilus_entry_key_press (GtkWidget *widget, GdkEventKey *event)
break;
}
- return NAUTILUS_CALL_PARENT_CLASS (GTK_WIDGET_CLASS,
- key_press_event,
- (widget, event));
+ return_code = NAUTILUS_CALL_PARENT_CLASS (GTK_WIDGET_CLASS,
+ key_press_event,
+ (widget, event));
+ gtk_signal_emit (GTK_OBJECT (widget), signals[SELECTION_CHANGED]);
+
+ return return_code;
+
+}
+
+static gint
+nautilus_entry_motion_notify (GtkWidget *widget,
+ GdkEventMotion *event)
+{
+ gint return_code;
+ guint old_start_pos, old_end_pos;
+
+ old_start_pos = GTK_EDITABLE (widget)->selection_start_pos;
+ old_end_pos = GTK_EDITABLE (widget)->selection_end_pos;
+
+ return_code = NAUTILUS_CALL_PARENT_CLASS (GTK_WIDGET_CLASS,
+ motion_notify_event,
+ (widget, event));
+ if (GTK_EDITABLE (widget)->selection_start_pos != old_start_pos ||
+ GTK_EDITABLE (widget)->selection_end_pos != old_end_pos) {
+ gtk_signal_emit (GTK_OBJECT (widget), signals[SELECTION_CHANGED]);
+ }
+ return return_code;
}
/**
@@ -231,6 +271,19 @@ nautilus_entry_set_text (NautilusEntry *entry, const gchar *text)
entry->user_edit = FALSE;
gtk_entry_set_text (GTK_ENTRY (entry), text);
entry->user_edit = TRUE;
+
+ gtk_signal_emit (GTK_OBJECT (entry), signals[SELECTION_CHANGED]);
+}
+
+void
+nautilus_entry_set_selection (GtkEditable *editable,
+ gint start_pos,
+ gint end_pos)
+{
+
+ NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, set_selection,
+ (editable, start_pos, end_pos));
+ gtk_signal_emit (GTK_OBJECT (editable), signals[SELECTION_CHANGED]);
}
static void
@@ -248,6 +301,8 @@ nautilus_entry_insert_text (GtkEditable *editable, const gchar *text,
NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, insert_text,
(editable, text, length, position));
+ gtk_signal_emit (GTK_OBJECT (editable), signals[SELECTION_CHANGED]);
+
}
@@ -255,6 +310,7 @@ static void
nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos)
{
NautilusEntry *entry;
+
entry = NAUTILUS_ENTRY(editable);
@@ -262,7 +318,9 @@ nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos)
if (entry->user_edit) {
gtk_signal_emit (GTK_OBJECT (editable), signals[USER_CHANGED]);
}
-
+
NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, delete_text,
(editable, start_pos, end_pos));
+
+ gtk_signal_emit (GTK_OBJECT (editable), signals[SELECTION_CHANGED]);
}
diff --git a/libnautilus-private/nautilus-entry.h b/libnautilus-private/nautilus-entry.h
index 24a3b4e13..bd4648a3f 100644
--- a/libnautilus-private/nautilus-entry.h
+++ b/libnautilus-private/nautilus-entry.h
@@ -58,6 +58,8 @@ struct NautilusEntryClass {
void (*user_changed) (NautilusEntry *entry);
+ void (*selection_changed) (NautilusEntry *entry);
+
};
GtkType nautilus_entry_get_type (void);
diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c
index 187b54427..984e20679 100644
--- a/libnautilus-private/nautilus-icon-container.c
+++ b/libnautilus-private/nautilus-icon-container.c
@@ -46,6 +46,7 @@
#include <gtk/gtksignal.h>
#include <gtk/gtklayout.h>
#include <libgnomeui/gnome-canvas-rect-ellipse.h>
+#include <libnautilus/nautilus-clipboard.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
@@ -136,7 +137,6 @@ static gboolean is_renaming (NautilusIconContainer *contain
static gboolean is_renaming_pending (NautilusIconContainer *container);
static void process_pending_icon_to_rename (NautilusIconContainer *container);
-
NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusIconContainer,
nautilus_icon_container,
GNOME_TYPE_CANVAS)
@@ -160,6 +160,7 @@ enum {
GET_STORED_ICON_POSITION,
ICON_POSITION_CHANGED,
ICON_TEXT_CHANGED,
+ RENAMING_ICON,
LAYOUT_CHANGED,
MOVE_COPY_ITEMS,
CREATE_NAUTILUS_LINKS,
@@ -2897,6 +2898,15 @@ nautilus_icon_container_initialize_class (NautilusIconContainerClass *class)
GTK_TYPE_NONE, 2,
GTK_TYPE_POINTER,
GTK_TYPE_STRING);
+ signals[RENAMING_ICON]
+ = gtk_signal_new ("renaming_icon",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (NautilusIconContainerClass,
+ renaming_icon),
+ gtk_marshal_NONE__POINTER,
+ GTK_TYPE_NONE, 1,
+ GTK_TYPE_POINTER);
signals[GET_ICON_IMAGES]
= gtk_signal_new ("get_icon_images",
GTK_RUN_LAST,
@@ -4499,6 +4509,7 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con
g_assert (!has_multiple_selection (container));
+
if (!icon_is_positioned (icon)) {
set_pending_icon_to_rename (container, icon);
return;
@@ -4516,14 +4527,15 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con
details->original_text = g_strdup (editable_text);
- /* Create text renaming widget */
+ /* Create text renaming widget, if it hasn't been created already.
+ We deal with the broken icon text item widget by keeping it around
+ so its contents can still be cut and pasted as part of the clipboard */
+ g_assert (details->rename_widget == NULL);
details->rename_widget = NAUTILUS_ICON_TEXT_ITEM
(gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (container)),
nautilus_icon_text_item_get_type (),
NULL));
- /* Connect the text item to the clipboard */
-
-
+
/* Determine widget position widget in container */
font = details->label_font[details->zoom_level];
max_text_width = floor (nautilus_icon_canvas_item_get_max_text_width (icon->item));
@@ -4542,7 +4554,9 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con
font, /* font */
editable_text, /* text */
TRUE); /* allocate local copy */
-
+
+ /* FIXME: These callbacks don't have any side effects.
+ They should be removed */
/* Set up the signals */
gtk_signal_connect (GTK_OBJECT (details->rename_widget), "editing_started",
GTK_SIGNAL_FUNC (editing_started), container);
@@ -4551,6 +4565,12 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con
nautilus_icon_text_item_start_editing (details->rename_widget);
nautilus_icon_container_update_icon (container, icon);
+ gtk_signal_emit (GTK_OBJECT (container),
+ signals[RENAMING_ICON],
+ nautilus_icon_text_item_get_renaming_editable (details->rename_widget));
+
+
+
/* We are in renaming mode */
details->renaming = TRUE;
@@ -4585,16 +4605,25 @@ end_renaming_mode (NautilusIconContainer *container, gboolean commit)
hide_rename_widget (container, icon);
}
+/* FIXME: We're not exactly hiding this widget, we're destroying it!
+ Perhaps hide_rename_widget isn't the right name */
static void
hide_rename_widget (NautilusIconContainer *container, NautilusIcon *icon)
{
nautilus_icon_text_item_stop_editing (container->details->rename_widget, TRUE);
+
+ /* Destroy the old persistent rename editable */
+ if (container->details->rename_editable) {
+ gtk_object_destroy (GTK_OBJECT (container->details->rename_editable));
+ }
+ container->details->rename_editable =
+ nautilus_icon_text_item_get_renaming_editable (container->details->rename_widget);
/* Destroy renaming widget */
- /* FIXME bugzilla.eazel.com 2480: Is a destroy really sufficient here? Who does the unref? */
gtk_object_destroy (GTK_OBJECT (container->details->rename_widget));
container->details->rename_widget = NULL;
+
g_free (container->details->original_text);
/* We are not in renaming mode */
diff --git a/libnautilus-private/nautilus-icon-container.h b/libnautilus-private/nautilus-icon-container.h
index c4e02b05d..cf2d0ea7d 100644
--- a/libnautilus-private/nautilus-icon-container.h
+++ b/libnautilus-private/nautilus-icon-container.h
@@ -135,6 +135,8 @@ typedef struct {
void (* icon_text_changed) (NautilusIconContainer *container,
NautilusIconData *data,
const char *text);
+ void (* renaming_icon) (NautilusIconContainer *container,
+ GtkWidget *renaming_widget);
int (* preview) (NautilusIconContainer *container,
NautilusIconData *data,
gboolean start_flag);
diff --git a/libnautilus-private/nautilus-icon-private.h b/libnautilus-private/nautilus-icon-private.h
index 18977fc11..73361df93 100644
--- a/libnautilus-private/nautilus-icon-private.h
+++ b/libnautilus-private/nautilus-icon-private.h
@@ -25,6 +25,7 @@
#ifndef NAUTILUS_ICON_CONTAINER_PRIVATE_H
#define NAUTILUS_ICON_CONTAINER_PRIVATE_H
+#include "nautilus-entry.h"
#include "nautilus-glib-extensions.h"
#include "nautilus-icon-container.h"
#include "nautilus-icon-dnd.h"
@@ -147,6 +148,7 @@ struct NautilusIconContainerDetails {
/* Renaming Details */
gboolean renaming;
NautilusIconTextItem *rename_widget; /* Editable text item */
+ GtkWidget *rename_editable; /* Copy of the rename editable for clipboard pastes */
gchar *original_text; /* Copy of editable text for later compare */
/* typeahead selection state */
diff --git a/libnautilus-private/nautilus-icon-text-item.c b/libnautilus-private/nautilus-icon-text-item.c
index 5ff22d9ea..298f7d6cc 100644
--- a/libnautilus-private/nautilus-icon-text-item.c
+++ b/libnautilus-private/nautilus-icon-text-item.c
@@ -52,7 +52,6 @@ typedef NautilusIconTextItem Iti;
static void register_rename_undo (NautilusIconTextItem *item);
static void restore_from_undo_snapshot_callback (GtkObject *target, gpointer callback_data);
-
/* Private part of the NautilusIconTextItem structure */
typedef struct {
/* Font */
@@ -115,10 +114,6 @@ iti_stop_editing (Iti *iti)
iti->editing = FALSE;
- gtk_widget_destroy (priv->entry_top);
- priv->entry = NULL;
- priv->entry_top = NULL;
-
priv->need_state_update = TRUE;
gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (iti));
@@ -173,7 +168,6 @@ layout_text (Iti *iti)
gtk_signal_emit (GTK_OBJECT (iti), iti_signals [TEXT_EDITED]);
}
-
/* Accepts the text in the off-screen entry of an icon text item */
static void
iti_edition_accept (Iti *iti)
@@ -203,6 +197,27 @@ iti_edition_accept (Iti *iti)
gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (iti));
}
+
+static void
+iti_entry_text_changed_by_clipboard (GtkObject *widget,
+ gpointer data)
+{
+ Iti *iti;
+ GnomeCanvasItem *item;
+ ItiPrivate *priv;
+
+ /* Update text item to reflect changes */
+ iti = NAUTILUS_ICON_TEXT_ITEM (data);
+ layout_text (iti);
+ priv = iti->priv;
+ priv->need_text_update = TRUE;
+
+ item = GNOME_CANVAS_ITEM (iti);
+ gnome_canvas_item_request_update (item);
+
+}
+
+
/* Callback used when the off-screen entry of an icon text item is activated.
* When this happens, we have to accept edition.
*/
@@ -232,6 +247,11 @@ iti_start_editing (Iti *iti)
gtk_entry_set_text (GTK_ENTRY(priv->entry), iti->text);
gtk_signal_connect (GTK_OBJECT (priv->entry), "activate",
GTK_SIGNAL_FUNC (iti_entry_activate), iti);
+ /* Make clipboard functions cause an update the appearance of
+ the icon text item iteself, since the clipboard functions
+ will change the offscreen entry */
+ gtk_signal_connect_after (GTK_OBJECT (priv->entry), "changed",
+ GTK_SIGNAL_FUNC (iti_entry_text_changed_by_clipboard), iti);
priv->entry_top = gtk_window_new (GTK_WINDOW_POPUP);
gtk_container_add (GTK_CONTAINER (priv->entry_top), GTK_WIDGET (priv->entry));
@@ -279,9 +299,6 @@ iti_destroy (GtkObject *object)
if (priv->font)
gdk_font_unref (priv->font);
- if (priv->entry_top)
- gtk_widget_destroy (priv->entry_top);
-
g_free (priv);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
@@ -844,6 +861,8 @@ iti_stop_selecting (Iti *iti, guint32 event_time)
priv->need_state_update = TRUE;
gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (iti));
gtk_signal_emit (GTK_OBJECT (iti), iti_signals[SELECTION_STOPPED]);
+ /* Hack, since the real nautilus entry can't get this information */
+ gtk_signal_emit_by_name (GTK_OBJECT (priv->entry), "selection_changed");
}
/* Handles selection range changes on the icon text item */
@@ -984,13 +1003,13 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event)
case GDK_Down:
iti_handle_arrow_key_event(iti, event);
break;
-
+
default:
/* Check for control key operations */
if (event->key.state & GDK_CONTROL_MASK) {
return FALSE;
}
-
+
/* Register undo transaction if neccessary */
if (!priv->undo_registered) {
priv->undo_registered = TRUE;
@@ -1018,7 +1037,6 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event)
x = cx - (item->x1 + MARGIN_X);
y = cy - (item->y1 + MARGIN_Y);
idx = iti_idx_from_x_y (iti, x, y);
-
iti_start_selecting (iti, idx, event->button.time);
}
return TRUE;
@@ -1027,6 +1045,7 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event)
if (!iti->selecting)
break;
+ gtk_widget_event (GTK_WIDGET (priv->entry), event);
gnome_canvas_w2c(item->canvas, event->button.x, event->button.y, &cx, &cy);
x = cx - (item->x1 + MARGIN_X);
y = cy - (item->y1 + MARGIN_Y);
@@ -1041,13 +1060,17 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event)
break;
return TRUE;
-#if 0
+
case GDK_FOCUS_CHANGE:
if (iti->editing && !event->focus_change.in) {
iti_edition_accept (iti);
+
+ }
+ if (iti->editing) {
+ gtk_widget_event (GTK_WIDGET (priv->entry), event);
}
return TRUE;
-#endif
+
default:
break;
}
@@ -1488,6 +1511,22 @@ nautilus_icon_text_item_get_margins (int *x, int *y)
*y = MARGIN_Y;
}
+/**
+ * nautilus_icon_text_item_get_renaming_editable
+ * @GtkEditable *
+ * Return the editable widget doing the renaming
+ **/
+GtkWidget *
+nautilus_icon_text_item_get_renaming_editable (NautilusIconTextItem *item)
+{
+ ItiPrivate *priv;
+
+ priv = item->priv;
+
+ return GTK_WIDGET (priv->entry);
+}
+
+
/* register_undo
*
diff --git a/libnautilus-private/nautilus-icon-text-item.h b/libnautilus-private/nautilus-icon-text-item.h
index 8ef6b17d8..020005f22 100644
--- a/libnautilus-private/nautilus-icon-text-item.h
+++ b/libnautilus-private/nautilus-icon-text-item.h
@@ -69,25 +69,26 @@ typedef struct {
void (* selection_stopped) (NautilusIconTextItem *item);
} NautilusIconTextItemClass;
-GtkType nautilus_icon_text_item_get_type (void);
-void nautilus_icon_text_item_configure (NautilusIconTextItem *item,
- int x,
- int y,
- int width,
- GdkFont *font,
- const char *text,
- gboolean is_static);
-void nautilus_icon_text_item_setxy (NautilusIconTextItem *item,
- int x,
- int y);
-void nautilus_icon_text_item_select (NautilusIconTextItem *item,
- int sel);
-void nautilus_icon_text_item_set_text (NautilusIconTextItem *item,
- const char *text);
-char *nautilus_icon_text_item_get_text (NautilusIconTextItem *item);
-void nautilus_icon_text_item_start_editing (NautilusIconTextItem *item);
-void nautilus_icon_text_item_stop_editing (NautilusIconTextItem *item,
- gboolean accept);
-void nautilus_icon_text_item_get_margins (int *x, int *y);
+GtkType nautilus_icon_text_item_get_type (void);
+void nautilus_icon_text_item_configure (NautilusIconTextItem *item,
+ int x,
+ int y,
+ int width,
+ GdkFont *font,
+ const char *text,
+ gboolean is_static);
+void nautilus_icon_text_item_setxy (NautilusIconTextItem *item,
+ int x,
+ int y);
+void nautilus_icon_text_item_select (NautilusIconTextItem *item,
+ int sel);
+void nautilus_icon_text_item_set_text (NautilusIconTextItem *item,
+ const char *text);
+char * nautilus_icon_text_item_get_text (NautilusIconTextItem *item);
+void nautilus_icon_text_item_start_editing (NautilusIconTextItem *item);
+void nautilus_icon_text_item_stop_editing (NautilusIconTextItem *item,
+ gboolean accept);
+void nautilus_icon_text_item_get_margins (int *x, int *y);
+GtkWidget * nautilus_icon_text_item_get_renaming_editable (NautilusIconTextItem *item);
#endif /* NAUTILUS_ICON_TEXT_ITEM_H */
diff --git a/libnautilus/nautilus-clipboard.c b/libnautilus/nautilus-clipboard.c
index 1242e4ebc..55b845e8f 100644
--- a/libnautilus/nautilus-clipboard.c
+++ b/libnautilus/nautilus-clipboard.c
@@ -28,14 +28,17 @@
*/
#include <config.h>
+#include "nautilus-bonobo-ui.h"
#include "nautilus-clipboard.h"
#include <bonobo/bonobo-ui-util.h>
+#include <gtk/gtkeditable.h>
#include <gtk/gtksignal.h>
static void disconnect_set_up_in_control_handlers (GtkObject *object,
gpointer callback_data);
-
+static void selection_changed_callback (GtkWidget *widget,
+ gpointer callback_data);
static void
cut_callback (BonoboUIComponent *ui,
gpointer callback_data,
@@ -80,69 +83,156 @@ clear_callback (BonoboUIComponent *ui,
gtk_editable_delete_selection (GTK_EDITABLE (callback_data));
}
-#ifdef SENSITIVITY_ADJUSTMENT_WORKS
+static void
+set_menu_item_sensitive (BonoboUIComponent *component,
+ const char *path,
+ gboolean sensitive)
+{
+ g_assert (BONOBO_IS_UI_COMPONENT (component));
+ bonobo_ui_component_set_prop (component, path,
+ "sensitive",
+ sensitive ? "1" : "0",
+ NULL);
+
+}
static void
-set_paste_sensitive_if_clipboard_contains_data (BonoboUIHandler *ui_handler)
+set_paste_sensitive_if_clipboard_contains_data (BonoboUIComponent *component)
{
+#if 0
gboolean clipboard_contains_data;
+ /* FIXME: This is wrong. This will only return non-null if
+ the clipboard owner is in process, which may not be the case,
+ and we may still be able to paste data */
+
clipboard_contains_data =
(gdk_selection_owner_get (GDK_SELECTION_PRIMARY) != NULL);
-
- bonobo_ui_handler_menu_set_sensitivity (ui_handler,
- NAUTILUS_MENU_PATH_PASTE_ITEM,
- clipboard_contains_data);
+#endif
+ set_menu_item_sensitive (component,
+ NAUTILUS_COMMAND_PASTE,
+ TRUE);
}
static void
-set_clipboard_menu_items_sensitive (BonoboUIHandler *ui_handler)
+set_clipboard_menu_items_sensitive (BonoboUIComponent *component)
{
-
- bonobo_ui_handler_menu_set_sensitivity (ui_handler,
- NAUTILUS_MENU_PATH_CUT_ITEM,
- TRUE);
- bonobo_ui_handler_menu_set_sensitivity (ui_handler,
- NAUTILUS_MENU_PATH_COPY_ITEM,
- TRUE);
- bonobo_ui_handler_menu_set_sensitivity (ui_handler,
- NAUTILUS_MENU_PATH_CLEAR_ITEM,
- TRUE);
- set_paste_sensitive_if_clipboard_contains_data (ui_handler);
+ set_menu_item_sensitive (component,
+ NAUTILUS_COMMAND_CUT,
+ TRUE);
+ set_menu_item_sensitive (component,
+ NAUTILUS_COMMAND_COPY,
+ TRUE);
+ set_menu_item_sensitive (component,
+ NAUTILUS_COMMAND_CLEAR,
+ TRUE);
+ set_paste_sensitive_if_clipboard_contains_data (component);
}
static void
-set_clipboard_menu_items_insensitive (BonoboUIHandler *ui_handler,
+set_clipboard_menu_items_insensitive (BonoboUIComponent *component,
gboolean enable_paste_for_full_clipboard)
{
-
- bonobo_ui_handler_menu_set_sensitivity (ui_handler,
- NAUTILUS_MENU_PATH_CUT_ITEM,
- FALSE);
- bonobo_ui_handler_menu_set_sensitivity (ui_handler,
- NAUTILUS_MENU_PATH_COPY_ITEM,
- FALSE);
- bonobo_ui_handler_menu_set_sensitivity (ui_handler,
- NAUTILUS_MENU_PATH_CLEAR_ITEM,
- FALSE);
+ set_menu_item_sensitive (component,
+ NAUTILUS_COMMAND_CUT,
+ FALSE);
+ set_menu_item_sensitive (component,
+ NAUTILUS_COMMAND_COPY,
+ FALSE);
+ set_menu_item_sensitive (component,
+ NAUTILUS_COMMAND_CLEAR,
+ FALSE);
if (enable_paste_for_full_clipboard) {
- set_paste_sensitive_if_clipboard_contains_data (ui_handler);
+ set_paste_sensitive_if_clipboard_contains_data (component);
}
else {
- bonobo_ui_handler_menu_set_sensitivity (ui_handler,
- NAUTILUS_MENU_PATH_PASTE_ITEM,
- FALSE);
+ set_menu_item_sensitive (component,
+ NAUTILUS_COMMAND_PASTE,
+ FALSE);
}
}
-#endif
typedef struct {
BonoboUIComponent *component;
Bonobo_UIContainer container;
+ gboolean editable_shares_selection_changes;
} TargetCallbackData;
+static gboolean
+clipboard_items_are_merged_in (GtkWidget *widget)
+{
+ return GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (widget), "clipboard_menu_items_merged"));
+}
+
+static void
+set_clipboard_items_are_merged_in (GtkObject *widget_object,
+ gboolean merged_in)
+{
+ gtk_object_set_data (widget_object, "clipboard_menu_items_merged",
+ GINT_TO_POINTER (merged_in));
+}
+
+static void
+merge_in_clipboard_menu_items (GtkObject *widget_object,
+ TargetCallbackData *target_data)
+{
+ BonoboUIComponent *ui;
+ Bonobo_UIContainer container;
+ gboolean add_selection_callback;
+
+ g_assert (target_data != NULL);
+ ui = target_data->component;
+ container = target_data->container;
+ add_selection_callback = target_data->editable_shares_selection_changes;
+
+ bonobo_ui_component_set_container (ui,
+ container);
+ bonobo_ui_component_freeze (ui, NULL);
+ bonobo_ui_util_set_ui (ui,
+ DATADIR,
+ "nautilus-clipboard-ui.xml",
+ "nautilus");
+ bonobo_ui_component_thaw (ui, NULL);
+
+ if (add_selection_callback) {
+ gtk_signal_connect_after (GTK_OBJECT (widget_object), "selection_changed",
+ selection_changed_callback, target_data);
+ selection_changed_callback (GTK_WIDGET (widget_object),
+ target_data);
+
+ }
+ else {
+ /* If we don't use sensitivity, everything should be on */
+ set_clipboard_menu_items_sensitive (ui);
+ }
+ set_clipboard_items_are_merged_in (widget_object, TRUE);
+}
+
+static void
+merge_out_clipboard_menu_items (GtkObject *widget_object,
+ TargetCallbackData *target_data)
+
+{
+ BonoboUIComponent *ui;
+ gboolean selection_callback_was_added;
+
+ g_assert (target_data != NULL);
+ ui = BONOBO_UI_COMPONENT (target_data->component);
+ selection_callback_was_added = target_data->editable_shares_selection_changes;
+
+ bonobo_ui_component_unset_container (ui);
+ if (selection_callback_was_added) {
+ gtk_signal_disconnect_by_func (GTK_OBJECT (widget_object),
+ selection_changed_callback,
+ target_data);
+ }
+ set_clipboard_items_are_merged_in (widget_object, FALSE);
+}
+
+
+
static void
focus_changed_callback (GtkWidget *widget,
GdkEventAny *event,
@@ -159,25 +249,51 @@ focus_changed_callback (GtkWidget *widget,
/* Connect the component to the container if the widget has focus. */
ui = target_data->component;
if (GTK_WIDGET_HAS_FOCUS (widget)) {
- bonobo_ui_component_set_container (ui,
- target_data->container);
- bonobo_ui_component_freeze (ui, NULL);
- bonobo_ui_util_set_ui (ui,
- DATADIR,
- "nautilus-clipboard-ui.xml",
- "nautilus");
- bonobo_ui_component_thaw (ui, NULL);
-
- /* FIXME bugzilla.eazel.com 733: Update sensitivities of the
- * commands now, also arrange for them to stay updated as the
- * state of the editable changes.
- */
+ if (clipboard_items_are_merged_in (widget) == FALSE) {
+ merge_in_clipboard_menu_items (GTK_OBJECT (widget),
+ target_data);
+ }
} else {
- bonobo_ui_component_unset_container (ui);
+ if (clipboard_items_are_merged_in (widget)) {
+ merge_out_clipboard_menu_items (GTK_OBJECT (widget),
+ target_data);
+ }
+
}
}
static void
+grab_focus_callback (GtkWidget *widget,
+ gpointer data)
+{
+ focus_changed_callback (widget, NULL, data);
+}
+
+static void
+selection_changed_callback (GtkWidget *widget,
+ gpointer callback_data)
+{
+ TargetCallbackData *target_data;
+ BonoboUIComponent *component;
+ GtkEditable *editable;
+
+ target_data = (TargetCallbackData *) callback_data;
+ g_assert (target_data != NULL);
+
+ component = target_data->component;
+ editable = GTK_EDITABLE (widget);
+
+ if (editable->selection_start_pos != editable->selection_end_pos) {
+ set_clipboard_menu_items_sensitive (component);
+ }
+ else {
+ set_clipboard_menu_items_insensitive (component,
+ TRUE);
+ }
+
+}
+
+static void
target_destroy_callback (GtkObject *object,
gpointer callback_data)
{
@@ -196,9 +312,10 @@ target_destroy_callback (GtkObject *object,
g_free (target_data);
}
-void
-nautilus_clipboard_set_up_editable (GtkEditable *target,
- Bonobo_UIContainer ui_container)
+static TargetCallbackData *
+initialize_clipboard_component_with_callback_data (GtkEditable *target,
+ Bonobo_UIContainer ui_container,
+ gboolean shares_selection_changes)
{
BonoboUIVerb verbs [] = {
BONOBO_UI_VERB ("Cut", cut_callback),
@@ -209,9 +326,6 @@ nautilus_clipboard_set_up_editable (GtkEditable *target,
};
BonoboUIComponent *ui;
TargetCallbackData *target_data;
-
- g_return_if_fail (GTK_IS_EDITABLE (target));
- g_return_if_fail (ui_container != CORBA_OBJECT_NIL);
/* Create the UI component and set up the verbs. */
ui = bonobo_ui_component_new_default ();
@@ -225,19 +339,51 @@ nautilus_clipboard_set_up_editable (GtkEditable *target,
bonobo_object_ref (BONOBO_OBJECT (ui));
target_data->component = ui;
target_data->container = bonobo_object_dup_ref (ui_container, NULL);
+ target_data->editable_shares_selection_changes =
+ shares_selection_changes;
+
+ return target_data;
+}
+
+void
+nautilus_clipboard_set_up_editable (GtkEditable *target,
+ Bonobo_UIContainer ui_container,
+ gboolean shares_selection_changes)
+{
+ TargetCallbackData *target_data;
+
+ g_return_if_fail (GTK_IS_EDITABLE (target));
+ g_return_if_fail (ui_container != CORBA_OBJECT_NIL);
+
+
+ target_data = initialize_clipboard_component_with_callback_data (target,
+ ui_container,
+ shares_selection_changes);
gtk_signal_connect_after (GTK_OBJECT (target), "focus_in_event",
focus_changed_callback, target_data);
+ /* Allow widgets that are already focused when they set up tell the clipboard
+ to manually consider them */
+ gtk_signal_connect (GTK_OBJECT (target), "grab_focus",
+ grab_focus_callback, target_data);
gtk_signal_connect_after (GTK_OBJECT (target), "focus_out_event",
focus_changed_callback, target_data);
+
gtk_signal_connect (GTK_OBJECT (target), "destroy",
target_destroy_callback, target_data);
-
+
/* Call the focus changed callback once to merge if the window is
* already in focus.
*/
focus_changed_callback (GTK_WIDGET (target), NULL, target_data);
}
+
+static gboolean
+widget_was_set_up_with_selection_sensitivity (GtkWidget *widget)
+{
+ return GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (widget), "shares_selection_changes"));
+}
+
static void
first_focus_callback (GtkWidget *widget,
GdkEventAny *event,
@@ -253,9 +399,11 @@ first_focus_callback (GtkWidget *widget,
/* Do the rest of the setup. */
nautilus_clipboard_set_up_editable
(GTK_EDITABLE (widget),
- bonobo_control_get_remote_ui_container (BONOBO_CONTROL (callback_data)));
+ bonobo_control_get_remote_ui_container (BONOBO_CONTROL (callback_data)),
+ widget_was_set_up_with_selection_sensitivity (widget));
}
+
static void
control_destroyed_callback (GtkObject *object,
gpointer callback_data)
@@ -266,7 +414,8 @@ control_destroyed_callback (GtkObject *object,
void
nautilus_clipboard_set_up_editable_in_control (GtkEditable *target,
- BonoboControl *control)
+ BonoboControl *control,
+ gboolean shares_selection_changes)
{
g_return_if_fail (GTK_IS_EDITABLE (target));
g_return_if_fail (BONOBO_IS_CONTROL (control));
@@ -278,6 +427,7 @@ nautilus_clipboard_set_up_editable_in_control (GtkEditable *target,
/* We'd like to use gtk_signal_connect_while_alive, but it's
* not compatible with gtk_signal_disconnect calls.
*/
+ gtk_object_set_data (GTK_OBJECT (target), "shares_selection_changes", GINT_TO_POINTER (shares_selection_changes));
gtk_signal_connect (GTK_OBJECT (target),
"focus_in_event",
first_focus_callback,
diff --git a/libnautilus/nautilus-clipboard.h b/libnautilus/nautilus-clipboard.h
index 16c01d73b..7b1b830a5 100644
--- a/libnautilus/nautilus-clipboard.h
+++ b/libnautilus/nautilus-clipboard.h
@@ -32,16 +32,23 @@
/* This makes this editable put clipboard commands into the passed UI
* container when the editable is in focus. Callers in Nautilus
* normally get the UI container from
- * nautilus_window_get_bonobo_ui_container.
- */
+ * nautilus_window_get_bonobo_ui_container. */
+/* The shares selection changes argument should be set to true if the
+ * editable is a widget that uses the signal "selection_changed" to
+ * tell others about text selection changes. The NautilusEntry widget
+ * is currently the only widget in nautilus that shares selection
+ * changes. */
void nautilus_clipboard_set_up_editable (GtkEditable *target,
- Bonobo_UIContainer container);
+ Bonobo_UIContainer container,
+ gboolean shares_selection_changes);
/* Components should use this convenient cover instead of the call
* above. This cover waits until the UI container shows up, so it can be
- * called even before the control has a UI container.
+ * called even before the control has a UI container. Set the
*/
+/* Set the shares_selection changes as for the nautilus_clipboard_set_up_editable */
void nautilus_clipboard_set_up_editable_in_control (GtkEditable *target,
- BonoboControl *control);
+ BonoboControl *control,
+ gboolean shares_selection_changes);
#endif /* NAUTILUS_CLIPBOARD_H */
diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c
index 917982e54..e11806b13 100644
--- a/src/file-manager/fm-directory-view.c
+++ b/src/file-manager/fm-directory-view.c
@@ -2117,6 +2117,28 @@ fm_directory_view_get_bonobo_ui_container (FMDirectoryView *view)
}
/**
+ * fm_directory_view_get_bonobo_control:
+ *
+ * Get the BonoboControl for this FMDirectoryView.
+ * This is normally called only by subclasses in order to
+ * help editables interact with the clipboard ui component
+ * @view: FMDirectoryView of interest.
+ *
+ * Return value: BonoboUIContainer for this view.
+ *
+ **/
+BonoboControl *
+fm_directory_view_get_bonobo_control (FMDirectoryView *view)
+{
+ NautilusView *nautilus_view;
+
+ nautilus_view = fm_directory_view_get_nautilus_view (view);
+
+ return nautilus_view_get_bonobo_control (nautilus_view);
+}
+
+
+/**
* fm_directory_view_get_nautilus_view:
*
* Get the NautilusView for this FMDirectoryView.
diff --git a/src/file-manager/fm-directory-view.h b/src/file-manager/fm-directory-view.h
index f70b2a55b..e8145c70b 100644
--- a/src/file-manager/fm-directory-view.h
+++ b/src/file-manager/fm-directory-view.h
@@ -318,6 +318,7 @@ void fm_directory_view_queue_file_change (FMDirectoryView *view,
NautilusFile *file);
void fm_directory_view_notify_selection_changed (FMDirectoryView *view);
Bonobo_UIContainer fm_directory_view_get_bonobo_ui_container (FMDirectoryView *view);
+BonoboControl * fm_directory_view_get_bonobo_control (FMDirectoryView *view);
NautilusStringList *fm_directory_view_get_emblem_names_to_exclude (FMDirectoryView *view);
NautilusDirectory *fm_directory_view_get_model (FMDirectoryView *view);
NautilusFile *fm_directory_view_get_directory_as_file (FMDirectoryView *view);
diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c
index 277c0dd36..9b94d3b2c 100644
--- a/src/file-manager/fm-icon-view.c
+++ b/src/file-manager/fm-icon-view.c
@@ -60,6 +60,7 @@
#include <libnautilus-extensions/nautilus-sound.h>
#include <libnautilus-extensions/nautilus-string.h>
#include <libnautilus/nautilus-bonobo-ui.h>
+#include <libnautilus/nautilus-clipboard.h>
#include <locale.h>
#include <signal.h>
#include <stdio.h>
@@ -1416,6 +1417,25 @@ icon_container_preview_callback (NautilusIconContainer *container,
return result;
}
+static void
+renaming_icon_callback (NautilusIconContainer *container,
+ gpointer editable_data,
+ gpointer callback_data)
+{
+ FMDirectoryView *directory_view;
+
+ directory_view = FM_DIRECTORY_VIEW (callback_data);
+ nautilus_clipboard_set_up_editable_in_control (GTK_EDITABLE (editable_data),
+ fm_directory_view_get_bonobo_control (directory_view),
+ TRUE);
+ /* Focus the editable in so the clipboard items will get turned on
+ while we're renaming; the hack that the nautilus entry is a
+ virtual widget prevents this from happening normally */
+ gtk_signal_emit_by_name (GTK_OBJECT (editable_data), "grab_focus");
+
+
+}
+
static int
icon_container_compare_icons_callback (NautilusIconContainer *container,
NautilusFile *file_a,
@@ -2005,6 +2025,10 @@ create_icon_container (FMIconView *icon_view)
"preview",
GTK_SIGNAL_FUNC (icon_container_preview_callback),
icon_view);
+ gtk_signal_connect (GTK_OBJECT (icon_container),
+ "renaming_icon",
+ renaming_icon_callback,
+ directory_view);
gtk_container_add (GTK_CONTAINER (icon_view),
GTK_WIDGET (icon_container));
diff --git a/src/nautilus-location-bar.c b/src/nautilus-location-bar.c
index 132866e64..23b2b3d0d 100644
--- a/src/nautilus-location-bar.c
+++ b/src/nautilus-location-bar.c
@@ -512,7 +512,8 @@ nautilus_location_bar_new (NautilusWindow *window)
/* Clipboard */
nautilus_clipboard_set_up_editable
(GTK_EDITABLE (location_bar->entry),
- nautilus_window_get_ui_container (window));
+ nautilus_window_get_ui_container (window),
+ TRUE);
return bar;
}
diff --git a/src/nautilus-search-bar-criterion.c b/src/nautilus-search-bar-criterion.c
index e945d9a30..3c9b5b69c 100644
--- a/src/nautilus-search-bar-criterion.c
+++ b/src/nautilus-search-bar-criterion.c
@@ -736,16 +736,24 @@ get_size_location_for (int relation_number,
{
const char *possible_relations[] = { "larger_than", "smaller_than" };
int entered_size;
+ gboolean int_conversion_success;
g_assert (relation_number == 0 || relation_number == 1);
/* We put a 'K' after the size, so multiply what the user
entered by 1000 */
- entered_size = strtol (size_text, NULL, 10);
- /* FIXME bugzilla.eazel.com 2438: Need error handling here */
- g_return_val_if_fail (entered_size >= 0, NULL);
- return g_strdup_printf ("%s %s %d", NAUTILUS_SEARCH_URI_TEXT_SIZE,
- possible_relations[relation_number],
- entered_size * 1000);
+ int_conversion_success = nautilus_str_to_int (size_text,
+ &entered_size);
+
+ if (int_conversion_success) {
+ return g_strdup_printf ("%s %s %d", NAUTILUS_SEARCH_URI_TEXT_SIZE,
+ possible_relations[relation_number],
+ entered_size * 1024);
+ }
+ else {
+ return g_strdup_printf ("%s %s %s", NAUTILUS_SEARCH_URI_TEXT_SIZE,
+ possible_relations[relation_number],
+ size_text);
+ }
}
diff --git a/src/nautilus-simple-search-bar.c b/src/nautilus-simple-search-bar.c
index 4d0ed7b1e..81423e207 100644
--- a/src/nautilus-simple-search-bar.c
+++ b/src/nautilus-simple-search-bar.c
@@ -133,7 +133,8 @@ nautilus_simple_search_bar_new (NautilusWindow *window)
nautilus_undo_editable_set_undo_key (GTK_EDITABLE (bar->details->entry), TRUE);
nautilus_clipboard_set_up_editable
(GTK_EDITABLE (bar->details->entry),
- nautilus_window_get_ui_container (window));
+ nautilus_window_get_ui_container (window),
+ TRUE);
gtk_signal_connect_object (GTK_OBJECT (bar->details->entry), "activate",
nautilus_gtk_button_auto_click,