diff options
-rw-r--r-- | .SRCINFO | 27 | ||||
-rw-r--r-- | PKGBUILD | 60 | ||||
-rw-r--r-- | nautilus-restore-typeahead.patch | 1576 | ||||
-rw-r--r-- | nautilus.install | 1 |
4 files changed, 859 insertions, 805 deletions
@@ -1,10 +1,10 @@ # Generated by mksrcinfo v8 -# Sat Jun 11 05:51:38 UTC 2016 +# Fri Oct 14 07:07:05 UTC 2016 pkgbase = nautilus-typeahead - pkgdesc = GNOME file manager - Patched to bring back the 'typeahead find' feature - pkgver = 3.20.1 + pkgdesc = Default file manager for GNOME - Patched to bring back the 'typeahead find' feature + pkgver = 3.22.0.1+22+gd72934b pkgrel = 1 - url = http://www.gnome.org + url = https://wiki.gnome.org/Apps/Nautilus arch = i686 arch = x86_64 license = GPL @@ -13,21 +13,24 @@ pkgbase = nautilus-typeahead makedepends = python makedepends = packagekit makedepends = python2 + makedepends = gnome-common + makedepends = git + makedepends = gtk-doc depends = libexif depends = gnome-desktop depends = exempi depends = gvfs - depends = desktop-file-utils depends = dconf depends = libtracker-sparql depends = nautilus-sendto + depends = gnome-autoar options = !emptydirs - source = http://download.gnome.org/sources/nautilus/3.20/nautilus-3.20.1.tar.xz - source = translation-de.patch + source = git://git.gnome.org/nautilus#commit=d72934b3f94dfd7eb109a60bd0b262c4f9cd7ed4 + source = git://git.gnome.org/libgd#commit=752f65e91ea0d9a2ee8a2d21343bbd97bd0d038a source = nautilus-restore-typeahead.patch - sha256sums = f2a907b994026412a7ed7c8145d4ab4f886ac87e780353b967473305a35e81e8 - sha256sums = 564799623f8910208cef1e0ed583cfd049e98f9c71e15c56924f6c8452ab192b - sha256sums = 034d2b5e97ec920120d88fa4d28efca047d326e069c39e2e1757f363c765eb87 + sha256sums = SKIP + sha256sums = SKIP + sha256sums = 78a2df9012f2c448a07365e7adb3c1f6058427e8453b4b003e0f68f69a563379 pkgname = nautilus-typeahead install = nautilus.install @@ -36,16 +39,16 @@ pkgname = nautilus-typeahead depends = gnome-desktop depends = exempi depends = gvfs - depends = desktop-file-utils depends = dconf depends = libtracker-sparql depends = nautilus-sendto + depends = gnome-autoar depends = libnautilus-extension provides = nautilus conflicts = nautilus pkgname = libnautilus-extension-typeahead - pkgdesc = Library for extending the GNOME file manager - Patched to bring back the 'typeahead find' feature + pkgdesc = Library for extending the Default file manager for GNOME - Patched to bring back the 'typeahead find' feature depends = gtk3 provides = libnautilus-extension conflicts = libnautilus-extension @@ -3,40 +3,50 @@ # Maintainer: Ian Hernández <ihernandezs@openmailbox.org> _pkgbase=nautilus +pkgbase=nautilus-typeahead pkgname=(nautilus-typeahead libnautilus-extension-typeahead) -pkgbase=$pkgname -pkgver=3.20.1 +pkgver=3.22.0.1+22+gd72934b pkgrel=1 -pkgdesc="GNOME file manager - Patched to bring back the 'typeahead find' feature" +pkgdesc="Default file manager for GNOME - Patched to bring back the 'typeahead find' feature" +url="https://wiki.gnome.org/Apps/Nautilus" arch=(i686 x86_64) license=(GPL) -depends=(libexif gnome-desktop exempi gvfs desktop-file-utils dconf - libtracker-sparql nautilus-sendto) -makedepends=(intltool gobject-introspection python packagekit python2) -url="http://www.gnome.org" -options=('!emptydirs') -source=(http://download.gnome.org/sources/$_pkgbase/${pkgver:0:4}/$_pkgbase-$pkgver.tar.xz - translation-de.patch +depends=(libexif gnome-desktop exempi gvfs dconf libtracker-sparql nautilus-sendto gnome-autoar) +makedepends=(intltool gobject-introspection python packagekit python2 gnome-common git gtk-doc) +options=(!emptydirs) +_commit=d72934b3f94dfd7eb109a60bd0b262c4f9cd7ed4 +_libgd=752f65e91ea0d9a2ee8a2d21343bbd97bd0d038a +source=("git://git.gnome.org/nautilus#commit=$_commit" + "git://git.gnome.org/libgd#commit=$_libgd" nautilus-restore-typeahead.patch) -sha256sums=('f2a907b994026412a7ed7c8145d4ab4f886ac87e780353b967473305a35e81e8' - '564799623f8910208cef1e0ed583cfd049e98f9c71e15c56924f6c8452ab192b' - '034d2b5e97ec920120d88fa4d28efca047d326e069c39e2e1757f363c765eb87') +sha256sums=('SKIP' + 'SKIP' + '78a2df9012f2c448a07365e7adb3c1f6058427e8453b4b003e0f68f69a563379') prepare() { - cd $_pkgbase-$pkgver + cd $_pkgbase + + git submodule init + git config --local submodule.libgd.url "$srcdir/libgd" + git submodule update + patch -p1 -i ../nautilus-restore-typeahead.patch - patch -Np0 -i ../translation-de.patch - autoreconf -f -i + NOCONFIGURE=1 ./autogen.sh +} + +pkgver() { + cd $_pkgbase + git describe --tags | sed 's/-/+/g' } build() { - cd $_pkgbase-$pkgver + cd $_pkgbase ./configure --prefix=/usr --sysconfdir=/etc \ --localstatedir=/var --disable-static \ --libexecdir=/usr/lib/nautilus \ --disable-update-mimedb \ --disable-schemas-compile \ - --disable-selinux + --disable-selinux --enable-gtk-doc sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool make } @@ -48,16 +58,12 @@ package_nautilus-typeahead() { provides=(nautilus) groups=(gnome) - cd $_pkgbase-$pkgver + cd $_pkgbase make DESTDIR="$pkgdir" install ### Split libnautilus-extension - cd .. - mkdir -p n-e/usr/{lib,share} - mv "$pkgdir"/usr/include n-e/usr - mv "$pkgdir"/usr/lib/{girepository-1.0,pkgconfig} n-e/usr/lib - mv "$pkgdir"/usr/lib/libnautilus-extension.so* n-e/usr/lib - mv "$pkgdir"/usr/share/{gir-1.0,gtk-doc} n-e/usr/share + make DESTDIR="$pkgdir" -C libnautilus-extension uninstall + make DESTDIR="$pkgdir" -C docs/reference/libnautilus-extension uninstall } package_libnautilus-extension-typeahead() { @@ -66,5 +72,7 @@ package_libnautilus-extension-typeahead() { provides=(libnautilus-extension) depends=(gtk3) - mv n-e/* "$pkgdir" + cd $_pkgbase + make DESTDIR="$pkgdir" -C libnautilus-extension install + make DESTDIR="$pkgdir" -C docs/reference/libnautilus-extension install } diff --git a/nautilus-restore-typeahead.patch b/nautilus-restore-typeahead.patch index 36f7eddf7d56..314bb0544f4c 100644 --- a/nautilus-restore-typeahead.patch +++ b/nautilus-restore-typeahead.patch @@ -1,7 +1,7 @@ -diff -aur nautilus-3.20.1.old/data/org.gnome.nautilus.gschema.xml nautilus-3.20.1.new/data/org.gnome.nautilus.gschema.xml ---- nautilus-3.20.1.old/data/org.gnome.nautilus.gschema.xml 2016-06-10 23:45:47.086629574 -0500 -+++ nautilus-3.20.1.new/data/org.gnome.nautilus.gschema.xml 2016-06-10 23:54:05.023013656 -0500 -@@ -199,6 +199,11 @@ +diff -aur nautilus.old/data/org.gnome.nautilus.gschema.xml nautilus.new/data/org.gnome.nautilus.gschema.xml +--- nautilus.old/data/org.gnome.nautilus.gschema.xml 2016-09-20 11:33:36.000000000 -0500 ++++ nautilus.new/data/org.gnome.nautilus.gschema.xml 2016-10-14 00:04:28.228345761 -0500 +@@ -211,6 +211,11 @@ <summary>Bulk rename utility</summary> <description>If set, Nautilus will append URIs of selected files and treat the result as a command line for bulk renaming. Bulk rename applications can register themselves in this key by setting the key to a space-separated string of their executable name and any command line options. If the executable name is not set to a full path, it will be searched for in the search path.</description> </key> @@ -13,116 +13,120 @@ diff -aur nautilus-3.20.1.old/data/org.gnome.nautilus.gschema.xml nautilus-3.20. <key type="b" name="open-folder-on-dnd-hover"> <default>true</default> <summary>Whether to open the hovered folder after a timeout when drag and drop operation</summary> -diff -aur nautilus-3.20.1.old/libnautilus-private/nautilus-global-preferences.h nautilus-3.20.1.new/libnautilus-private/nautilus-global-preferences.h ---- nautilus-3.20.1.old/libnautilus-private/nautilus-global-preferences.h 2016-06-10 23:45:47.059962499 -0500 -+++ nautilus-3.20.1.new/libnautilus-private/nautilus-global-preferences.h 2016-06-10 23:55:16.343228380 -0500 -@@ -148,6 +148,7 @@ - +diff -aur nautilus.old/src/nautilus-global-preferences.h nautilus.new/src/nautilus-global-preferences.h +--- nautilus.old/src/nautilus-global-preferences.h 2016-09-20 11:33:36.000000000 -0500 ++++ nautilus.new/src/nautilus-global-preferences.h 2016-10-14 00:05:11.363390522 -0500 +@@ -161,6 +161,8 @@ /* Recent files */ #define NAUTILUS_PREFERENCES_RECENT_FILES_ENABLED "remember-recent-files" -+#define NAUTILUS_PREFERENCES_ENABLE_INTERACTIVE_SEARCH "enable-interactive-search" ++#define NAUTILUS_PREFERENCES_ENABLE_INTERACTIVE_SEARCH "enable-interactive-search" ++ /* Move to trash shorcut changed dialog */ #define NAUTILUS_PREFERENCES_SHOW_MOVE_TO_TRASH_SHORTCUT_CHANGED_DIALOG "show-move-to-trash-shortcut-changed-dialog" -diff -aur nautilus-3.20.1.old/src/nautilus-list-view.c nautilus-3.20.1.new/src/nautilus-list-view.c ---- nautilus-3.20.1.old/src/nautilus-list-view.c 2016-06-10 23:45:47.053295731 -0500 -+++ nautilus-3.20.1.new/src/nautilus-list-view.c 2016-06-11 00:04:30.524028845 -0500 -@@ -2392,6 +2392,7 @@ - GList *node; - GList *iters, *l; - NautilusFile *file; -+ GtkTreePath *path = NULL; - - list_view = NAUTILUS_LIST_VIEW (view); - tree_selection = gtk_tree_view_get_selection (list_view->details->tree_view); -@@ -2406,10 +2407,21 @@ - for (l = iters; l != NULL; l = l->next) { - gtk_tree_selection_select_iter (tree_selection, - (GtkTreeIter *)l->data); -+ if (!path) -+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (list_view->details->model), (GtkTreeIter *)l->data); - } - g_list_free_full (iters, g_free); - } -+ if (path) { -+ gtk_tree_view_set_cursor_on_cell (list_view->details->tree_view, -+ path, -+ list_view->details->file_name_column, -+ GTK_CELL_RENDERER (list_view->details->file_name_cell), -+ TRUE); -+ gtk_tree_path_free (path); -+ } -+ - g_signal_handlers_unblock_by_func (tree_selection, list_selection_changed_callback, view); - nautilus_files_view_notify_selection_changed (view); +diff -aur nautilus.old/src/nautilus-list-view.c nautilus.new/src/nautilus-list-view.c +--- nautilus.old/src/nautilus-list-view.c 2016-09-20 11:33:36.000000000 -0500 ++++ nautilus.new/src/nautilus-list-view.c 2016-10-14 00:11:55.781588681 -0500 +@@ -2671,6 +2671,7 @@ + GList *node; + GList *iters, *l; + NautilusFile *file; ++ GtkTreePath *path = NULL; + + list_view = NAUTILUS_LIST_VIEW (view); + tree_selection = gtk_tree_view_get_selection (list_view->details->tree_view); +@@ -2687,10 +2688,21 @@ + { + gtk_tree_selection_select_iter (tree_selection, + (GtkTreeIter *) l->data); ++ if (!path) ++ path = gtk_tree_model_get_path (GTK_TREE_MODEL (list_view->details->model), (GtkTreeIter *)l->data); + } + g_list_free_full (iters, g_free); + } + ++ if (path) { ++ gtk_tree_view_set_cursor_on_cell (list_view->details->tree_view, ++ path, ++ list_view->details->file_name_column, ++ GTK_CELL_RENDERER (list_view->details->file_name_cell), ++ TRUE); ++ gtk_tree_path_free (path); ++ } ++ + g_signal_handlers_unblock_by_func (tree_selection, list_selection_changed_callback, view); + nautilus_files_view_notify_selection_changed (view); } -@@ -3220,3 +3232,9 @@ - "window-slot", slot, - NULL); +@@ -3555,3 +3567,9 @@ + "window-slot", slot, + NULL); } + +GtkTreeView * +nautilus_list_view_get_tree_view (NautilusListView *list_view) +{ -+ return list_view->details->tree_view; ++ return list_view->details->tree_view; +} -diff -aur nautilus-3.20.1.old/src/nautilus-list-view.h nautilus-3.20.1.new/src/nautilus-list-view.h ---- nautilus-3.20.1.old/src/nautilus-list-view.h 2016-06-10 23:45:47.053295731 -0500 -+++ nautilus-3.20.1.new/src/nautilus-list-view.h 2016-06-11 00:05:09.874430207 -0500 -@@ -53,5 +53,6 @@ +diff -aur nautilus.old/src/nautilus-list-view.h nautilus.new/src/nautilus-list-view.h +--- nautilus.old/src/nautilus-list-view.h 2016-09-20 11:33:36.000000000 -0500 ++++ nautilus.new/src/nautilus-list-view.h 2016-10-14 00:12:23.509607668 -0500 +@@ -52,5 +52,6 @@ GType nautilus_list_view_get_type (void); NautilusFilesView * nautilus_list_view_new (NautilusWindowSlot *slot); +GtkTreeView * nautilus_list_view_get_tree_view (NautilusListView *list_view); #endif /* NAUTILUS_LIST_VIEW_H */ -diff -aur nautilus-3.20.1.old/src/nautilus-window-slot.c nautilus-3.20.1.new/src/nautilus-window-slot.c ---- nautilus-3.20.1.old/src/nautilus-window-slot.c 2016-06-10 23:45:47.056629115 -0500 -+++ nautilus-3.20.1.new/src/nautilus-window-slot.c 2016-06-11 00:46:39.476370591 -0500 -@@ -124,6 +124,17 @@ - gboolean tried_mount; - gint view_mode_before_search; - gint view_mode_before_places; -+ -+ /* Interactive search */ -+ gboolean isearch_enable; -+ gboolean isearch_imcontext_changed; -+ gboolean isearch_disable_hide; -+ NautilusFile *isearch_selected_file; -+ GtkWidget *isearch_window; -+ GtkWidget *isearch_entry; -+ gulong isearch_entry_changed_id; -+ guint isearch_timeout_id; -+ gulong isearch_configure_event_id; - }; +diff -aur nautilus.old/src/nautilus-window-slot.c nautilus.new/src/nautilus-window-slot.c +--- nautilus.old/src/nautilus-window-slot.c 2016-09-20 11:33:36.000000000 -0500 ++++ nautilus.new/src/nautilus-window-slot.c 2016-10-14 01:55:20.686875482 -0500 +@@ -120,6 +120,17 @@ + GError *mount_error; + gboolean tried_mount; + gint view_mode_before_search; ++ ++ /* Interactive search */ ++ gboolean isearch_enable; ++ gboolean isearch_imcontext_changed; ++ gboolean isearch_disable_hide; ++ NautilusFile *isearch_selected_file; ++ GtkWidget *isearch_window; ++ GtkWidget *isearch_entry; ++ gulong isearch_entry_changed_id; ++ guint isearch_timeout_id; ++ gulong isearch_configure_event_id; + } NautilusWindowSlotPrivate; - static guint signals[LAST_SIGNAL] = { 0 }; -@@ -145,6 +156,15 @@ - static gboolean nautilus_window_slot_get_search_visible (NautilusWindowSlot *slot); - static void nautilus_window_slot_set_location (NautilusWindowSlot *slot, + G_DEFINE_TYPE_WITH_PRIVATE (NautilusWindowSlot, nautilus_window_slot, GTK_TYPE_BOX); +@@ -147,6 +158,16 @@ + static gboolean nautilus_window_slot_get_search_visible (NautilusWindowSlot *self); + static void nautilus_window_slot_set_location (NautilusWindowSlot *self, GFile *location); ++ +/* Interactive search */ +static void isearch_ensure (NautilusWindowSlot *slot); +static gboolean isearch_start (NautilusWindowSlot *slot, GdkDevice *device); +static void isearch_enable_changed (gpointer callback_data); +static void isearch_dispose (NautilusWindowSlot *slot); -+static void isearch_hide (NautilusWindowSlot *slot, -+ GdkDevice *device); ++static void isearch_hide (NautilusWindowSlot *slot, GdkDevice *device); + +#define ISEARCH_TIMEOUT 5000 ++ + gboolean + nautilus_window_slot_handles_location (NautilusWindowSlot *self, + GFile *location) +@@ -563,21 +584,90 @@ + action = g_action_map_lookup_action (G_ACTION_MAP (priv->slot_action_group), + "search-visible"); - static NautilusView* - nautilus_window_slot_get_view_for_location (NautilusWindowSlot *slot, -@@ -492,18 +512,87 @@ - - retval = FALSE; - window = nautilus_window_slot_get_window (slot); -- if (!NAUTILUS_IS_DESKTOP_WINDOW (window)) { -- retval = gtk_search_bar_handle_event (GTK_SEARCH_BAR (slot->details->query_editor), -- (GdkEvent*) event); -- } -+ if (slot->details->isearch_enable) { +- /* If the action is not enabled, don't try to handle search */ +- if (g_action_get_enabled (action)) +- { +- retval = gtk_search_bar_handle_event (GTK_SEARCH_BAR (priv->query_editor), +- (GdkEvent *) event); +- } ++ if (priv->isearch_enable) { + GdkEvent *new_event; + char *old_text; + const char *new_text; @@ -131,70 +135,73 @@ diff -aur nautilus-3.20.1.old/src/nautilus-window-slot.c nautilus-3.20.1.new/src + gboolean text_modified; + gulong popup_menu_id; + -+ isearch_ensure (slot); ++ isearch_ensure (self); + + /* Make a copy of the current text */ -+ old_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (slot->details->isearch_entry))); ++ old_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->isearch_entry))); + new_event = gdk_event_copy ((GdkEvent *) event); + g_object_unref (((GdkEventKey *) new_event)->window); -+ ((GdkEventKey *) new_event)->window = g_object_ref (gtk_widget_get_window (slot->details->isearch_window)); -+ gtk_widget_realize (slot->details->isearch_window); ++ ((GdkEventKey *) new_event)->window = g_object_ref (gtk_widget_get_window (priv->isearch_window)); ++ gtk_widget_realize (priv->isearch_window); + -+ popup_menu_id = g_signal_connect (slot->details->isearch_entry, ++ popup_menu_id = g_signal_connect (priv->isearch_entry, + "popup-menu", G_CALLBACK (gtk_true), + NULL); + + /* Move the entry off screen */ -+ screen = gtk_widget_get_screen (GTK_WIDGET (slot)); -+ gtk_window_move (GTK_WINDOW (slot->details->isearch_window), ++ screen = gtk_widget_get_screen (GTK_WIDGET (self)); ++ gtk_window_move (GTK_WINDOW (priv->isearch_window), + gdk_screen_get_width (screen) + 1, + gdk_screen_get_height (screen) + 1); -+ gtk_widget_show (slot->details->isearch_window); ++ gtk_widget_show (priv->isearch_window); + + /* Send the event to the window. If the preedit_changed signal is emitted + * during this event, we will set priv->imcontext_changed */ -+ slot->details->isearch_imcontext_changed = FALSE; -+ retval = gtk_widget_event (slot->details->isearch_window, new_event); ++ priv->isearch_imcontext_changed = FALSE; ++ retval = gtk_widget_event (priv->isearch_window, new_event); + gdk_event_free (new_event); -+ gtk_widget_hide (slot->details->isearch_window); ++ gtk_widget_hide (priv->isearch_window); + -+ g_signal_handler_disconnect (slot->details->isearch_entry, ++ g_signal_handler_disconnect (priv->isearch_entry, + popup_menu_id); + + /* We check to make sure that the entry tried to handle the text, and that + * the text has changed. + */ -+ new_text = gtk_entry_get_text (GTK_ENTRY (slot->details->isearch_entry)); ++ new_text = gtk_entry_get_text (GTK_ENTRY (priv->isearch_entry)); + text_modified = strcmp (old_text, new_text) != 0; + g_free (old_text); -+ if (slot->details->isearch_imcontext_changed || ++ ++ if (priv->isearch_imcontext_changed || + (retval && text_modified)) + { -+ if (isearch_start (slot, -+ gdk_event_get_device ((GdkEvent *) event))) { -+ gtk_widget_grab_focus (GTK_WIDGET (slot)); ++ if (isearch_start (self, gdk_event_get_device ((GdkEvent *) event))) { ++ gtk_widget_grab_focus (GTK_WIDGET (self)); + return TRUE; + } + else { -+ gtk_entry_set_text (GTK_ENTRY (slot->details->isearch_entry), ""); ++ gtk_entry_set_text (GTK_ENTRY (priv->isearch_entry), ""); + return FALSE; + } + } + } else { -+ if (!NAUTILUS_IS_DESKTOP_WINDOW (window)) { -+ retval = gtk_search_bar_handle_event (GTK_SEARCH_BAR (slot->details->query_editor), -+ (GdkEvent*) event); ++ /* If the action is not enabled, don't try to handle search */ ++ if (g_action_get_enabled (action)) ++ { ++ retval = gtk_search_bar_handle_event (GTK_SEARCH_BAR (priv->query_editor), ++ (GdkEvent *) event); + } -- if (retval) { -- nautilus_window_slot_set_search_visible (slot, TRUE); -- } -+ if (retval) { -+ nautilus_window_slot_set_search_visible (slot, TRUE); +- if (retval) +- { +- nautilus_window_slot_set_search_visible (self, TRUE); ++ if (retval) ++ { ++ nautilus_window_slot_set_search_visible (self, TRUE); + } -+ } + } - return retval; + return retval; } +static gboolean @@ -202,857 +209,892 @@ diff -aur nautilus-3.20.1.old/src/nautilus-window-slot.c nautilus-3.20.1.new/src + GdkEventConfigure *event, + NautilusWindowSlot *slot) +{ -+ isearch_hide (slot, NULL); -+ return FALSE; ++ isearch_hide (slot, NULL); ++ return FALSE; +} + static void - real_active (NautilusWindowSlot *slot) + real_active (NautilusWindowSlot *self) + { +@@ -606,10 +696,20 @@ + real_inactive (NautilusWindowSlot *self) { -@@ -533,8 +622,14 @@ + NautilusWindow *window; ++ NautilusWindowSlotPrivate *priv; - window = nautilus_window_slot_get_window (slot); - g_assert (slot == nautilus_window_get_active_slot (window)); -+ isearch_hide (slot, NULL); -+ if (slot->details->isearch_configure_event_id != 0) { -+ g_signal_handler_disconnect (GTK_WIDGET (slot->details->window), -+ slot->details->isearch_configure_event_id); -+ slot->details->isearch_configure_event_id = 0; -+ } ++ priv = nautilus_window_slot_get_instance_private (self); + window = nautilus_window_slot_get_window (self); + g_assert (self == nautilus_window_get_active_slot (window)); -- gtk_widget_insert_action_group (GTK_WIDGET (window), "slot", NULL); -+ gtk_widget_insert_action_group (GTK_WIDGET (window), "slot", NULL); ++ isearch_hide (self, NULL); ++ if (priv->isearch_configure_event_id != 0) ++ { ++ g_signal_handler_disconnect (GTK_WIDGET (priv->window), ++ priv->isearch_configure_event_id); ++ priv->isearch_configure_event_id = 0; ++ } ++ + gtk_widget_insert_action_group (GTK_WIDGET (window), "slot", NULL); } - static void -@@ -721,19 +816,38 @@ - slot->details = G_TYPE_INSTANCE_GET_PRIVATE - (slot, NAUTILUS_TYPE_WINDOW_SLOT, NautilusWindowSlotDetails); +@@ -898,9 +998,29 @@ + nautilus_application_set_accelerator (app, "slot.files-view-mode(uint32 0)", "<control>2"); + nautilus_application_set_accelerator (app, "slot.search-visible", "<control>f"); -- slot->details->slot_action_group = G_ACTION_GROUP (g_simple_action_group_new ()); -- g_action_map_add_action_entries (G_ACTION_MAP (slot->details->slot_action_group), -- slot_entries, -- G_N_ELEMENTS (slot_entries), -- slot); -- gtk_widget_insert_action_group (GTK_WIDGET (slot), -- "slot", -- G_ACTION_GROUP (slot->details->slot_action_group)); -- nautilus_application_add_accelerator (app, "slot.files-view-mode(uint32 1)", "<control>1"); -- nautilus_application_add_accelerator (app, "slot.files-view-mode(uint32 0)", "<control>2"); -- nautilus_application_add_accelerator (app, "slot.search-visible", "<control>f"); -+ slot->details->slot_action_group = G_ACTION_GROUP (g_simple_action_group_new ()); -+ g_action_map_add_action_entries (G_ACTION_MAP (slot->details->slot_action_group), -+ slot_entries, -+ G_N_ELEMENTS (slot_entries), -+ slot); -+ gtk_widget_insert_action_group (GTK_WIDGET (slot), -+ "slot", -+ G_ACTION_GROUP (slot->details->slot_action_group)); -+ nautilus_application_add_accelerator (app, "slot.files-view-mode(1)", "<control>1"); -+ nautilus_application_add_accelerator (app, "slot.files-view-mode(0)", "<control>2"); -+ nautilus_application_add_accelerator (app, "slot.search-visible", "<control>f"); -+ -+ slot->details->isearch_enable = -+ g_settings_get_boolean (nautilus_preferences, NAUTILUS_PREFERENCES_ENABLE_INTERACTIVE_SEARCH); -+ -+ g_signal_connect_swapped (nautilus_preferences, -+ "changed::" NAUTILUS_PREFERENCES_ENABLE_INTERACTIVE_SEARCH, -+ G_CALLBACK(isearch_enable_changed), slot); -+ slot->details->view_mode_before_search = NAUTILUS_VIEW_INVALID_ID; -+} ++ priv->isearch_enable = g_settings_get_boolean (nautilus_preferences, ++ NAUTILUS_PREFERENCES_ENABLE_INTERACTIVE_SEARCH); ++ ++ g_signal_connect_swapped (nautilus_preferences, ++ "changed::" NAUTILUS_PREFERENCES_ENABLE_INTERACTIVE_SEARCH, ++ G_CALLBACK(isearch_enable_changed), self); + + priv->view_mode_before_search = NAUTILUS_VIEW_INVALID_ID; + } + +static void +nautilus_window_slot_finalize (GObject *object) +{ -+ NautilusWindowSlot *slot; - -- slot->details->view_mode_before_search = NAUTILUS_VIEW_INVALID_ID; -+ slot = NAUTILUS_WINDOW_SLOT (object); ++ NautilusWindowSlot *slot; ++ slot = NAUTILUS_WINDOW_SLOT (object); + -+ g_signal_handlers_disconnect_by_func (nautilus_preferences, -+ isearch_enable_changed, slot); ++ g_signal_handlers_disconnect_by_func (nautilus_preferences, ++ isearch_enable_changed, ++ slot); ++ ++ G_OBJECT_CLASS (nautilus_window_slot_parent_class)->finalize (object); ++} + -+ G_OBJECT_CLASS (nautilus_window_slot_parent_class)->finalize (object); - } - #define DEBUG_FLAG NAUTILUS_DEBUG_WINDOW -@@ -2230,6 +2344,7 @@ - GtkWidget *widget; + #include "nautilus-debug.h" + +@@ -2642,6 +2762,7 @@ + NautilusWindowSlotPrivate *priv; - slot = NAUTILUS_WINDOW_SLOT (object); -+ isearch_dispose (slot); + self = NAUTILUS_WINDOW_SLOT (object); ++ isearch_dispose (self); + priv = nautilus_window_slot_get_instance_private (self); - nautilus_window_slot_clear_forward_list (slot); - nautilus_window_slot_clear_back_list (slot); -@@ -2306,6 +2421,7 @@ - oclass->constructed = nautilus_window_slot_constructed; - oclass->set_property = nautilus_window_slot_set_property; - oclass->get_property = nautilus_window_slot_get_property; -+ oclass->finalize = nautilus_window_slot_finalize; + nautilus_window_slot_clear_forward_list (self); +@@ -2731,6 +2852,7 @@ + oclass->constructed = nautilus_window_slot_constructed; + oclass->set_property = nautilus_window_slot_set_property; + oclass->get_property = nautilus_window_slot_get_property; ++ oclass->finalize = nautilus_window_slot_finalize; - widget_class->grab_focus = nautilus_window_slot_grab_focus; + widget_class->grab_focus = nautilus_window_slot_grab_focus; -@@ -2625,3 +2741,763 @@ +@@ -3122,3 +3244,814 @@ - return slot->details->loading; + return priv->loading; } + +/* Interactive search */ + -+static void -+isearch_ensure (NautilusWindowSlot *slot); -+static gboolean -+isearch_timeout (gpointer user_data); -+static void -+isearch_timeout_destroy (gpointer user_data); -+static void -+isearch_timeout_restart (NautilusWindowSlot *slot); -+static gboolean -+isearch_window_delete_event (GtkWidget *widget, -+ GdkEventAny *event, -+ NautilusWindowSlot *slot); -+static gboolean -+isearch_window_button_press_event (GtkWidget *widget, -+ GdkEventButton *event, -+ NautilusWindowSlot *slot); -+static gboolean -+isearch_window_scroll_event (GtkWidget *widget, -+ GdkEventScroll *event, -+ NautilusWindowSlot *slot); -+static void -+isearch_activate_items_alternate (NautilusWindowSlot *slot); -+static gboolean -+isearch_window_key_press_event (GtkWidget *widget, -+ GdkEventKey *event, -+ NautilusWindowSlot *slot); -+static void -+isearch_disable_hide (GtkEntry *entry, -+ GtkMenu *menu, -+ gpointer data); -+static void -+isearch_preedit_changed (GtkEntry *entry, -+ gchar *preedit, -+ NautilusWindowSlot *slot); -+static void -+isearch_activate_event (GtkEntry *entry, -+ NautilusWindowSlot *slot); -+static gboolean -+isearch_enable_hide_real (gpointer data); -+static void -+isearch_enable_hide (GtkWidget *widget, -+ gpointer data); -+static void -+send_focus_change (GtkWidget *widget, -+ GdkDevice *device, -+ gboolean in); -+static void -+isearch_hide (NautilusWindowSlot *slot, -+ GdkDevice *device); -+static void -+isearch_entry_changed (GtkWidget *entry, -+ NautilusWindowSlot *slot); -+static gboolean -+isearch_start (NautilusWindowSlot *slot, GdkDevice *device); -+static void -+isearch_position (NautilusWindowSlot *slot); -+static gboolean -+isearch_compare_filename (const gchar *f1, const gchar *f2, guint length); -+static int -+compare_files (gconstpointer a, gconstpointer b, gpointer callback_data); -+static GList * -+isearch_get_sorted_files (NautilusWindowSlot *slot); -+static NautilusFile * -+isearch_find (NautilusWindowSlot *slot, const gchar *text); -+static NautilusFile * -+isearch_find_next (NautilusWindowSlot *slot, const gchar *text); -+static NautilusFile * -+isearch_find_prev (NautilusWindowSlot *slot, const gchar *text); -+static gboolean -+isearch_move_next (NautilusWindowSlot *slot); -+static gboolean -+isearch_move_prev (NautilusWindowSlot *slot); -+static void -+isearch_set_selection (NautilusWindowSlot *slot, NautilusFile *file); -+static void -+isearch_enable_changed (gpointer callback_data); -+static void -+isearch_dispose (NautilusWindowSlot *slot); ++static void isearch_ensure (NautilusWindowSlot *slot); ++static gboolean isearch_timeout (gpointer user_data); ++static void isearch_timeout_destroy (gpointer user_data); ++static void isearch_timeout_restart (NautilusWindowSlot *slot); ++static gboolean isearch_window_delete_event (GtkWidget * widget, ++ GdkEventAny * event, ++ NautilusWindowSlot *slot); ++static gboolean isearch_window_button_press_event (GtkWidget * widget, ++ GdkEventButton * event, ++ NautilusWindowSlot *slot); ++static gboolean isearch_window_scroll_event (GtkWidget * widget, ++ GdkEventScroll * event, ++ NautilusWindowSlot *slot); ++static void isearch_activate_items_alternate (NautilusWindowSlot *slot); ++static gboolean isearch_window_key_press_event (GtkWidget * widget, ++ GdkEventKey * event, ++ NautilusWindowSlot *slot); ++static void isearch_disable_hide (GtkEntry *entry, ++ GtkMenu * menu, ++ gpointer data); ++static void isearch_preedit_changed (GtkEntry * entry, ++ gchar * preedit, ++ NautilusWindowSlot *slot); ++static void isearch_activate_event (GtkEntry *entry, NautilusWindowSlot *slot); ++static gboolean isearch_enable_hide_real (gpointer data); ++static void isearch_enable_hide (GtkWidget *widget, gpointer data); ++static void send_focus_change (GtkWidget *widget, ++ GdkDevice *device, ++ gboolean in); ++static void isearch_hide (NautilusWindowSlot *slot, GdkDevice *device); ++static void isearch_entry_changed (GtkWidget *entry, NautilusWindowSlot *slot); ++static gboolean isearch_start (NautilusWindowSlot *slot, GdkDevice *device); ++static void isearch_position (NautilusWindowSlot *slot); ++static gboolean isearch_compare_filename (const gchar *f1, ++ const gchar *f2, ++ guint length); ++static int compare_files (gconstpointer a, ++ gconstpointer b, ++ gpointer callback_data); ++static GList *isearch_get_sorted_files (NautilusWindowSlot *slot); ++static NautilusFile *isearch_find (NautilusWindowSlot *slot, const gchar *text); ++static NautilusFile *isearch_find_next (NautilusWindowSlot *slot, ++ const gchar * text); ++static NautilusFile *isearch_find_prev (NautilusWindowSlot *slot, ++ const gchar * text); ++static gboolean isearch_move_next (NautilusWindowSlot *slot); ++static gboolean isearch_move_prev (NautilusWindowSlot *slot); ++static void isearch_set_selection (NautilusWindowSlot *slot, ++ NautilusFile * file); ++static void isearch_enable_changed (gpointer callback_data); ++static void isearch_dispose (NautilusWindowSlot *slot); + +static void +isearch_ensure (NautilusWindowSlot *slot) +{ -+ GtkWidget *frame, *vbox, *toplevel; -+ GdkScreen *screen; -+ -+ toplevel = gtk_widget_get_toplevel (GTK_WIDGET (slot)); -+ screen = gtk_widget_get_screen (GTK_WIDGET (slot)); -+ -+ if (slot->details->isearch_window != NULL) -+ { -+ if (gtk_window_has_group (GTK_WINDOW (toplevel))) -+ gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)), -+ GTK_WINDOW (slot->details->isearch_window)); -+ else if (gtk_window_has_group (GTK_WINDOW (slot->details->isearch_window))) -+ gtk_window_group_remove_window (gtk_window_get_group (GTK_WINDOW (slot->details->isearch_window)), -+ GTK_WINDOW (slot->details->isearch_window)); -+ -+ gtk_window_set_screen (GTK_WINDOW (slot->details->isearch_window), screen); -+ return; -+ } -+ slot->details->isearch_window = gtk_window_new (GTK_WINDOW_POPUP); -+ gtk_window_set_screen (GTK_WINDOW (slot->details->isearch_window), screen); -+ -+ if (gtk_window_has_group (GTK_WINDOW (toplevel))) -+ gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)), -+ GTK_WINDOW (slot->details->isearch_window)); -+ -+ gtk_window_set_type_hint (GTK_WINDOW (slot->details->isearch_window), -+ GDK_WINDOW_TYPE_HINT_UTILITY); -+ gtk_window_set_modal (GTK_WINDOW (slot->details->isearch_window), TRUE); -+ g_signal_connect (slot->details->isearch_window, "delete-event", -+ G_CALLBACK (isearch_window_delete_event), -+ slot); -+ g_signal_connect (slot->details->isearch_window, "key-press-event", -+ G_CALLBACK (isearch_window_key_press_event), -+ slot); -+ g_signal_connect (slot->details->isearch_window, "button-press-event", -+ G_CALLBACK (isearch_window_button_press_event), -+ slot); -+ g_signal_connect (slot->details->isearch_window, "scroll-event", -+ G_CALLBACK (isearch_window_scroll_event), -+ slot); -+ -+ frame = gtk_frame_new (NULL); -+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); -+ gtk_widget_show (frame); -+ gtk_container_add (GTK_CONTAINER (slot->details->isearch_window), frame); -+ -+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); -+ gtk_widget_show (vbox); -+ gtk_container_add (GTK_CONTAINER (frame), vbox); -+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); -+ -+ /* add entry */ -+ slot->details->isearch_entry = gtk_entry_new (); -+ gtk_widget_show (slot->details->isearch_entry); -+ g_signal_connect (slot->details->isearch_entry, "populate-popup", -+ G_CALLBACK (isearch_disable_hide), -+ slot); -+ g_signal_connect (slot->details->isearch_entry, -+ "activate", G_CALLBACK (isearch_activate_event), -+ slot); -+ -+ g_signal_connect (G_OBJECT (slot->details->isearch_entry), -+ "preedit-changed", -+ G_CALLBACK (isearch_preedit_changed), -+ slot); -+ gtk_container_add (GTK_CONTAINER (vbox), -+ slot->details->isearch_entry); -+ -+ gtk_widget_realize (slot->details->isearch_entry); ++ GtkWidget * frame, *vbox, *toplevel; ++ GdkScreen * screen; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ ++ toplevel = gtk_widget_get_toplevel (GTK_WIDGET (slot)); ++ screen = gtk_widget_get_screen (GTK_WIDGET (slot)); ++ ++ if (priv->isearch_window != NULL) ++ { ++ if (gtk_window_has_group (GTK_WINDOW (toplevel))) ++ gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)), ++ GTK_WINDOW (priv->isearch_window)); ++ else if (gtk_window_has_group (GTK_WINDOW (priv->isearch_window))) ++ gtk_window_group_remove_window (gtk_window_get_group ( ++ GTK_WINDOW (priv->isearch_window)), ++ GTK_WINDOW (priv->isearch_window)); ++ ++ gtk_window_set_screen (GTK_WINDOW (priv->isearch_window), screen); ++ return; ++ } ++ priv->isearch_window = gtk_window_new (GTK_WINDOW_POPUP); ++ gtk_window_set_screen (GTK_WINDOW (priv->isearch_window), screen); ++ ++ if (gtk_window_has_group (GTK_WINDOW (toplevel))) ++ gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)), ++ GTK_WINDOW (priv->isearch_window)); ++ ++ gtk_window_set_type_hint (GTK_WINDOW (priv->isearch_window), ++ GDK_WINDOW_TYPE_HINT_UTILITY); ++ gtk_window_set_modal (GTK_WINDOW (priv->isearch_window), TRUE); ++ g_signal_connect (priv->isearch_window, "delete-event", ++ G_CALLBACK (isearch_window_delete_event), slot); ++ g_signal_connect (priv->isearch_window, "key-press-event", ++ G_CALLBACK (isearch_window_key_press_event), slot); ++ g_signal_connect (priv->isearch_window, "button-press-event", ++ G_CALLBACK (isearch_window_button_press_event), slot); ++ g_signal_connect (priv->isearch_window, "scroll-event", ++ G_CALLBACK (isearch_window_scroll_event), slot); ++ ++ frame = gtk_frame_new (NULL); ++ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); ++ gtk_widget_show (frame); ++ gtk_container_add (GTK_CONTAINER (priv->isearch_window), frame); ++ ++ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); ++ gtk_widget_show (vbox); ++ gtk_container_add (GTK_CONTAINER (frame), vbox); ++ gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); ++ ++ /* add entry */ ++ priv->isearch_entry = gtk_entry_new (); ++ gtk_widget_show (priv->isearch_entry); ++ g_signal_connect (priv->isearch_entry, "populate-popup", ++ G_CALLBACK (isearch_disable_hide), slot); ++ g_signal_connect (priv->isearch_entry, "activate", ++ G_CALLBACK (isearch_activate_event), slot); ++ ++ g_signal_connect (G_OBJECT (priv->isearch_entry), "preedit-changed", ++ G_CALLBACK (isearch_preedit_changed), slot); ++ gtk_container_add (GTK_CONTAINER (vbox), priv->isearch_entry); ++ ++ gtk_widget_realize (priv->isearch_entry); +} + +static gboolean +isearch_timeout (gpointer user_data) +{ -+ NautilusWindowSlot *slot = NAUTILUS_WINDOW_SLOT (user_data); ++ NautilusWindowSlot *slot = NAUTILUS_WINDOW_SLOT (user_data); + -+ if (!g_source_is_destroyed (g_main_current_source ())) -+ isearch_hide (slot, NULL); ++ if (!g_source_is_destroyed (g_main_current_source ())) ++ isearch_hide (slot, NULL); + -+ return FALSE; ++ return FALSE; +} + +static void +isearch_timeout_destroy (gpointer user_data) +{ -+ NautilusWindowSlot *slot = NAUTILUS_WINDOW_SLOT (user_data); -+ slot->details->isearch_timeout_id = 0; ++ NautilusWindowSlot * slot = NAUTILUS_WINDOW_SLOT (user_data); ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ priv->isearch_timeout_id = 0; +} + +static void +isearch_timeout_restart (NautilusWindowSlot *slot) +{ -+ if (slot->details->isearch_timeout_id != 0) { -+ g_source_remove (slot->details->isearch_timeout_id); -+ -+ slot->details->isearch_timeout_id = gdk_threads_add_timeout_full ( -+ G_PRIORITY_LOW, ISEARCH_TIMEOUT, -+ isearch_timeout, -+ slot, -+ isearch_timeout_destroy); -+ } ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ if (priv->isearch_timeout_id != 0) ++ { ++ g_source_remove (priv->isearch_timeout_id); ++ ++ priv->isearch_timeout_id = ++ gdk_threads_add_timeout_full (G_PRIORITY_LOW, ISEARCH_TIMEOUT, ++ isearch_timeout, slot, ++ isearch_timeout_destroy); ++ } +} + +static gboolean -+isearch_window_delete_event (GtkWidget *widget, -+ GdkEventAny *event, -+ NautilusWindowSlot *slot) ++isearch_window_delete_event (GtkWidget * widget, ++ GdkEventAny * event, ++ NautilusWindowSlot *slot) +{ -+ g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); ++ g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); + -+ isearch_hide (slot, NULL); -+ return TRUE; ++ isearch_hide (slot, NULL); ++ return TRUE; +} + +static gboolean -+isearch_window_button_press_event (GtkWidget *widget, -+ GdkEventButton *event, -+ NautilusWindowSlot *slot) ++isearch_window_button_press_event (GtkWidget * widget, ++ GdkEventButton * event, ++ NautilusWindowSlot *slot) +{ -+ GdkDevice *keyb_device; ++ GdkDevice * keyb_device; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); + -+ g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); ++ g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); + -+ keyb_device = gdk_device_get_associated_device (event->device); -+ isearch_hide (slot, keyb_device); ++ keyb_device = gdk_device_get_associated_device (event->device); ++ isearch_hide (slot, keyb_device); + -+ /* A bit of hackery here */ -+ if (NAUTILUS_IS_CANVAS_VIEW (slot->details->content_view)) { -+ NautilusCanvasContainer *cc = nautilus_canvas_view_get_canvas_container (NAUTILUS_CANVAS_VIEW (slot->details->content_view)); -+ gboolean retval; ++ /* A bit of hackery here */ ++ if (NAUTILUS_IS_CANVAS_VIEW (priv->content_view)) ++ { ++ NautilusCanvasContainer *cc = nautilus_canvas_view_get_canvas_container ( ++ NAUTILUS_CANVAS_VIEW (priv->content_view)); ++ gboolean retval; + -+ if (event->window == gtk_layout_get_bin_window (GTK_LAYOUT (cc))) -+ g_signal_emit_by_name (GTK_WIDGET (cc), "button-press-event", event, &retval); ++ if (event->window == gtk_layout_get_bin_window (GTK_LAYOUT (cc))) ++ g_signal_emit_by_name (GTK_WIDGET (cc), "button-press-event", event, ++ &retval); + -+ return retval; -+ } else if (NAUTILUS_IS_LIST_VIEW (slot->details->content_view)) { -+ NautilusListView *lv = NAUTILUS_LIST_VIEW (slot->details->content_view); -+ GtkTreeView *tv = nautilus_list_view_get_tree_view (NAUTILUS_LIST_VIEW (slot->details->content_view)); -+ gboolean retval; ++ return retval; ++ } ++ else if (NAUTILUS_IS_LIST_VIEW (priv->content_view)) ++ { ++ NautilusListView *lv = NAUTILUS_LIST_VIEW (priv->content_view); ++ GtkTreeView * tv = nautilus_list_view_get_tree_view ( ++ NAUTILUS_LIST_VIEW (priv->content_view)); ++ gboolean retval; + -+ if (event->window == gtk_tree_view_get_bin_window (tv)) -+ g_signal_emit_by_name (GTK_WIDGET (tv), "button-press-event", event, &retval); ++ if (event->window == gtk_tree_view_get_bin_window (tv)) ++ g_signal_emit_by_name (GTK_WIDGET (tv), "button-press-event", event, ++ &retval); + -+ return retval; -+ } ++ return retval; ++ } + -+ return TRUE; ++ return TRUE; +} + +static gboolean -+isearch_window_scroll_event (GtkWidget *widget, -+ GdkEventScroll *event, -+ NautilusWindowSlot *slot) ++isearch_window_scroll_event (GtkWidget * widget, ++ GdkEventScroll * event, ++ NautilusWindowSlot *slot) +{ -+ gboolean retval = FALSE; -+ -+ if (event->direction == GDK_SCROLL_UP) { -+ isearch_move_prev (slot); -+ retval = TRUE; -+ } -+ else if (event->direction == GDK_SCROLL_DOWN) { -+ isearch_move_next (slot); -+ retval = TRUE; -+ } -+ if (retval) -+ isearch_timeout_restart (slot); -+ -+ return retval; ++ gboolean retval = FALSE; ++ ++ if (event->direction == GDK_SCROLL_UP) ++ { ++ isearch_move_prev (slot); ++ retval = TRUE; ++ } ++ else if (event->direction == GDK_SCROLL_DOWN) ++ { ++ isearch_move_next (slot); ++ retval = TRUE; ++ } ++ if (retval) ++ isearch_timeout_restart (slot); ++ ++ return retval; +} + +static void +isearch_activate_items_alternate (NautilusWindowSlot *slot) +{ -+ GList *file_list; -+ -+ file_list = nautilus_view_get_selection (slot->details->content_view); -+ nautilus_files_view_activate_files (NAUTILUS_VIEW (slot->details->content_view), -+ file_list, -+ NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB, -+ TRUE); -+ nautilus_file_list_free (file_list); ++ GList * file_list; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ ++ file_list = nautilus_view_get_selection (priv->content_view); ++ nautilus_files_view_activate_files (NAUTILUS_VIEW (priv->content_view), ++ file_list, ++ NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB, TRUE); ++ nautilus_file_list_free (file_list); +} + +static gboolean -+isearch_window_key_press_event (GtkWidget *widget, -+ GdkEventKey *event, -+ NautilusWindowSlot *slot) ++isearch_window_key_press_event (GtkWidget * widget, ++ GdkEventKey * event, ++ NautilusWindowSlot *slot) +{ -+ GdkModifierType default_accel; -+ gboolean retval = FALSE; -+ -+ g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); -+ g_return_val_if_fail (NAUTILUS_IS_WINDOW_SLOT (slot), FALSE); -+ -+ /* close window and cancel the search */ -+ if (event->keyval == GDK_KEY_Escape || -+ event->keyval == GDK_KEY_Tab || -+ event->keyval == GDK_KEY_KP_Tab || -+ event->keyval == GDK_KEY_ISO_Left_Tab) { -+ -+ isearch_hide (slot, gdk_event_get_device ((GdkEvent *) event)); -+ return TRUE; -+ } -+ -+ default_accel = gtk_widget_get_modifier_mask (widget, -+ GDK_MODIFIER_INTENT_PRIMARY_ACCELERATOR); -+ -+ /* select previous matching iter */ -+ if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_KP_Up) { -+ if (!isearch_move_prev (slot)) -+ gtk_widget_error_bell (widget); -+ -+ retval = TRUE; -+ } -+ if (((event->state & (default_accel | GDK_SHIFT_MASK)) == (default_accel | GDK_SHIFT_MASK)) -+ && (event->keyval == GDK_KEY_g || event->keyval == GDK_KEY_G)) { -+ if (!isearch_move_prev (slot)) -+ gtk_widget_error_bell (widget); -+ -+ retval = TRUE; -+ } -+ /* select next matching iter */ -+ if (event->keyval == GDK_KEY_Down || event->keyval == GDK_KEY_KP_Down) { -+ if (!isearch_move_next (slot)) -+ gtk_widget_error_bell (widget); -+ -+ retval = TRUE; -+ } -+ if (((event->state & (default_accel | GDK_SHIFT_MASK)) == default_accel) -+ && (event->keyval == GDK_KEY_g || event->keyval == GDK_KEY_G)) { -+ if (!isearch_move_next (slot)) -+ gtk_widget_error_bell (widget); -+ -+ retval = TRUE; -+ } -+ -+ /* Alternate activation (ShiftEnter). -+ * Regular activation (Enter) is handled by the entry activate signal. -+ */ -+ if ((event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter) && -+ (event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) { -+ isearch_activate_items_alternate (slot); -+ isearch_hide (slot, gdk_event_get_device ((GdkEvent*)event)); -+ retval = TRUE; -+ } -+ isearch_timeout_restart (slot); -+ return retval; ++ GdkModifierType default_accel; ++ gboolean retval = FALSE; ++ ++ g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); ++ g_return_val_if_fail (NAUTILUS_IS_WINDOW_SLOT (slot), FALSE); ++ ++ /* close window and cancel the search */ ++ if (event->keyval == GDK_KEY_Escape || event->keyval == GDK_KEY_Tab || ++ event->keyval == GDK_KEY_KP_Tab || event->keyval == GDK_KEY_ISO_Left_Tab) ++ { ++ ++ isearch_hide (slot, gdk_event_get_device ((GdkEvent *) event)); ++ return TRUE; ++ } ++ ++ default_accel = ++ gtk_widget_get_modifier_mask (widget, ++ GDK_MODIFIER_INTENT_PRIMARY_ACCELERATOR); ++ ++ /* select previous matching iter */ ++ if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_KP_Up) ++ { ++ if (!isearch_move_prev (slot)) ++ gtk_widget_error_bell (widget); ++ ++ retval = TRUE; ++ } ++ if (((event->state & (default_accel | GDK_SHIFT_MASK)) == ++ (default_accel | GDK_SHIFT_MASK)) && ++ (event->keyval == GDK_KEY_g || event->keyval == GDK_KEY_G)) ++ { ++ if (!isearch_move_prev (slot)) ++ gtk_widget_error_bell (widget); ++ ++ retval = TRUE; ++ } ++ /* select next matching iter */ ++ if (event->keyval == GDK_KEY_Down || event->keyval == GDK_KEY_KP_Down) ++ { ++ if (!isearch_move_next (slot)) ++ gtk_widget_error_bell (widget); ++ ++ retval = TRUE; ++ } ++ if (((event->state & (default_accel | GDK_SHIFT_MASK)) == default_accel) && ++ (event->keyval == GDK_KEY_g || event->keyval == GDK_KEY_G)) ++ { ++ if (!isearch_move_next (slot)) ++ gtk_widget_error_bell (widget); ++ ++ retval = TRUE; ++ } ++ ++ /* Alternate activation (ShiftEnter). ++ * Regular activation (Enter) is handled by the entry activate signal. ++ */ ++ if ((event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter) && ++ (event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) ++ { ++ isearch_activate_items_alternate (slot); ++ isearch_hide (slot, gdk_event_get_device ((GdkEvent *) event)); ++ retval = TRUE; ++ } ++ isearch_timeout_restart (slot); ++ return retval; +} + +static void -+isearch_disable_hide (GtkEntry *entry, -+ GtkMenu *menu, -+ gpointer data) ++isearch_disable_hide (GtkEntry *entry, GtkMenu *menu, gpointer data) +{ -+ NautilusWindowSlot *slot = (NautilusWindowSlot *)data; ++ NautilusWindowSlot * slot = (NautilusWindowSlot *) data; ++ NautilusWindowSlotPrivate *priv; + -+ slot->details->isearch_disable_hide = 1; -+ g_signal_connect (menu, "hide", -+ G_CALLBACK (isearch_enable_hide), data); ++ priv = nautilus_window_slot_get_instance_private (slot); ++ ++ priv->isearch_disable_hide = 1; ++ g_signal_connect (menu, "hide", G_CALLBACK (isearch_enable_hide), data); +} + +static void -+isearch_preedit_changed (GtkEntry *entry, -+ gchar *preedit, -+ NautilusWindowSlot *slot) ++isearch_preedit_changed (GtkEntry * entry, ++ gchar * preedit, ++ NautilusWindowSlot *slot) +{ -+ slot->details->isearch_imcontext_changed = 1; -+ isearch_timeout_restart (slot); ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ priv->isearch_imcontext_changed = 1; ++ isearch_timeout_restart (slot); +} + +static void -+isearch_activate_event (GtkEntry *entry, -+ NautilusWindowSlot *slot) ++isearch_activate_event (GtkEntry *entry, NautilusWindowSlot *slot) +{ -+ GtkTreePath *path; ++ GtkTreePath * path; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); + + isearch_hide (slot, gtk_get_current_event_device ()); -+ nautilus_files_view_activate_selection (slot->details->content_view); ++ nautilus_files_view_activate_selection (priv->content_view); +} + +static gboolean +isearch_enable_hide_real (gpointer data) +{ -+ NautilusWindowSlot *slot = (NautilusWindowSlot *)data; -+ slot->details->isearch_disable_hide = 0; -+ return FALSE; ++ NautilusWindowSlot * slot = (NautilusWindowSlot *) data; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ priv->isearch_disable_hide = 0; ++ return FALSE; +} + +static void -+isearch_enable_hide (GtkWidget *widget, -+ gpointer data) ++isearch_enable_hide (GtkWidget *widget, gpointer data) +{ -+ gdk_threads_add_timeout_full (G_PRIORITY_HIGH, 200, -+ isearch_enable_hide_real, g_object_ref (data), -+ g_object_unref); ++ gdk_threads_add_timeout_full (G_PRIORITY_HIGH, 200, isearch_enable_hide_real, ++ g_object_ref (data), g_object_unref); +} + +static void -+send_focus_change (GtkWidget *widget, -+ GdkDevice *device, -+ gboolean in) ++send_focus_change (GtkWidget *widget, GdkDevice *device, gboolean in) +{ -+ GdkDeviceManager *device_manager; -+ GList *devices, *d; -+ -+ device_manager = gdk_display_get_device_manager (gtk_widget_get_display (widget)); -+ devices = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER); -+ devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_SLAVE)); -+ devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_FLOATING)); -+ -+ for (d = devices; d; d = d->next) -+ { -+ GdkDevice *dev = d->data; -+ GdkEvent *fevent; -+ GdkWindow *window; -+ -+ if (gdk_device_get_source (dev) != GDK_SOURCE_KEYBOARD) -+ continue; -+ -+ window = gtk_widget_get_window (widget); -+ -+ /* Skip non-master keyboards that haven't -+ * selected for events from this window -+ */ -+ if (gdk_device_get_device_type (dev) != GDK_DEVICE_TYPE_MASTER && -+ !gdk_window_get_device_events (window, dev)) -+ continue; ++ GdkDeviceManager *device_manager; ++ GList * devices, *d; ++ ++ device_manager = ++ gdk_display_get_device_manager (gtk_widget_get_display (widget)); ++ devices = ++ gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER); ++ devices = ++ g_list_concat (devices, ++ gdk_device_manager_list_devices (device_manager, ++ GDK_DEVICE_TYPE_SLAVE)); ++ devices = ++ g_list_concat (devices, gdk_device_manager_list_devices ( ++ device_manager, GDK_DEVICE_TYPE_FLOATING)); ++ ++ for (d = devices; d; d = d->next) ++ { ++ GdkDevice *dev = d->data; ++ GdkEvent * fevent; ++ GdkWindow *window; ++ ++ if (gdk_device_get_source (dev) != GDK_SOURCE_KEYBOARD) ++ continue; ++ ++ window = gtk_widget_get_window (widget); ++ ++ /* Skip non-master keyboards that haven't ++ * selected for events from this window ++ */ ++ if (gdk_device_get_device_type (dev) != GDK_DEVICE_TYPE_MASTER && ++ !gdk_window_get_device_events (window, dev)) ++ continue; + -+ fevent = gdk_event_new (GDK_FOCUS_CHANGE); ++ fevent = gdk_event_new (GDK_FOCUS_CHANGE); + -+ fevent->focus_change.type = GDK_FOCUS_CHANGE; -+ fevent->focus_change.window = g_object_ref (window); -+ fevent->focus_change.in = in; -+ gdk_event_set_device (fevent, device); ++ fevent->focus_change.type = GDK_FOCUS_CHANGE; ++ fevent->focus_change.window = g_object_ref (window); ++ fevent->focus_change.in = in; ++ gdk_event_set_device (fevent, device); + -+ gtk_widget_send_focus_change (widget, fevent); ++ gtk_widget_send_focus_change (widget, fevent); + -+ gdk_event_free (fevent); -+ } ++ gdk_event_free (fevent); ++ } + -+ g_list_free (devices); ++ g_list_free (devices); +} + +static void -+isearch_hide (NautilusWindowSlot *slot, -+ GdkDevice *device) ++isearch_hide (NautilusWindowSlot *slot, GdkDevice *device) +{ -+ if (slot->details->isearch_disable_hide) -+ return; -+ -+ if (!slot->details->isearch_enable) -+ return; -+ -+ if (slot->details->isearch_entry_changed_id) -+ { -+ g_signal_handler_disconnect (slot->details->isearch_entry, -+ slot->details->isearch_entry_changed_id); -+ slot->details->isearch_entry_changed_id = 0; -+ } -+ if (slot->details->isearch_timeout_id) -+ { -+ g_source_remove (slot->details->isearch_timeout_id); -+ slot->details->isearch_timeout_id = 0; -+ } -+ if (slot->details->isearch_window != NULL -+ && gtk_widget_get_visible (slot->details->isearch_window)) -+ { -+ /* send focus-in event */ -+ send_focus_change (GTK_WIDGET (slot->details->isearch_entry), device, FALSE); -+ gtk_widget_hide (slot->details->isearch_window); -+ gtk_entry_set_text (GTK_ENTRY (slot->details->isearch_entry), ""); -+ send_focus_change (GTK_WIDGET (slot), device, TRUE); -+ } ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ ++ if (priv->isearch_disable_hide) ++ return; ++ ++ if (!priv->isearch_enable) ++ return; ++ ++ if (priv->isearch_entry_changed_id) ++ { ++ g_signal_handler_disconnect (priv->isearch_entry, ++ priv->isearch_entry_changed_id); ++ priv->isearch_entry_changed_id = 0; ++ } ++ if (priv->isearch_timeout_id) ++ { ++ g_source_remove (priv->isearch_timeout_id); ++ priv->isearch_timeout_id = 0; ++ } ++ if (priv->isearch_window != NULL && ++ gtk_widget_get_visible (priv->isearch_window)) ++ { ++ /* send focus-in event */ ++ send_focus_change (GTK_WIDGET (priv->isearch_entry), device, FALSE); ++ gtk_widget_hide (priv->isearch_window); ++ gtk_entry_set_text (GTK_ENTRY (priv->isearch_entry), ""); ++ send_focus_change (GTK_WIDGET (slot), device, TRUE); ++ } +} + +static void -+isearch_entry_changed (GtkWidget *entry, -+ NautilusWindowSlot *slot) ++isearch_entry_changed (GtkWidget *entry, NautilusWindowSlot *slot) +{ -+ gint ret; -+ const gchar *text; ++ gint ret; ++ const gchar * text; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); + -+ g_return_if_fail (GTK_IS_ENTRY (entry)); -+ g_return_if_fail (NAUTILUS_IS_WINDOW_SLOT (slot)); ++ g_return_if_fail (GTK_IS_ENTRY (entry)); ++ g_return_if_fail (NAUTILUS_IS_WINDOW_SLOT (slot)); + -+ text = gtk_entry_get_text (GTK_ENTRY (entry)); ++ text = gtk_entry_get_text (GTK_ENTRY (entry)); + -+ /* unselect all */ -+ nautilus_view_set_selection (slot->details->content_view, NULL); ++ /* unselect all */ ++ nautilus_view_set_selection (priv->content_view, NULL); + -+ isearch_timeout_restart (slot); ++ isearch_timeout_restart (slot); + -+ if (*text == '\0') -+ return; ++ if (*text == '\0') ++ return; + -+ isearch_set_selection (slot, isearch_find (slot, text)); ++ isearch_set_selection (slot, isearch_find (slot, text)); +} + +static gboolean +isearch_start (NautilusWindowSlot *slot, GdkDevice *device) +{ -+ GTypeClass *klass; -+ GList *list; -+ gboolean found_focus = FALSE; -+ -+ if (!slot->details->isearch_enable) -+ return FALSE; -+ -+ if (slot->details->isearch_window != NULL && -+ gtk_widget_get_visible (slot->details->isearch_window)) -+ return TRUE; -+ -+ if (nautilus_files_view_get_loading (slot->details->content_view)) -+ return FALSE; -+ -+ isearch_ensure (slot); -+ -+ /* done, show it */ -+ isearch_position (slot); -+ gtk_widget_show (slot->details->isearch_window); -+ if (slot->details->isearch_entry_changed_id == 0) -+ { -+ slot->details->isearch_entry_changed_id = -+ g_signal_connect (slot->details->isearch_entry, "changed", -+ G_CALLBACK (isearch_entry_changed), -+ slot); -+ } -+ slot->details->isearch_timeout_id = gdk_threads_add_timeout_full ( -+ G_PRIORITY_LOW, -+ ISEARCH_TIMEOUT, -+ isearch_timeout, -+ slot, -+ isearch_timeout_destroy); -+ -+ /* Grab focus without selecting all the text. */ -+ klass = g_type_class_peek_parent (GTK_ENTRY_GET_CLASS (slot->details->isearch_entry)); -+ (*GTK_WIDGET_CLASS (klass)->grab_focus) (slot->details->isearch_entry); -+ -+ /* send focus-in event */ -+ send_focus_change (slot->details->isearch_entry, device, TRUE); -+ -+ /* search first matching iter */ -+ isearch_entry_changed (slot->details->isearch_entry, slot); -+ return TRUE; ++ GTypeClass * klass; ++ GList * list; ++ gboolean found_focus = FALSE; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ ++ if (!priv->isearch_enable) ++ return FALSE; ++ ++ if (priv->isearch_window != NULL && ++ gtk_widget_get_visible (priv->isearch_window)) ++ return TRUE; ++ ++ if (nautilus_files_view_get_loading (priv->content_view)) ++ return FALSE; ++ ++ isearch_ensure (slot); ++ ++ /* done, show it */ ++ isearch_position (slot); ++ gtk_widget_show (priv->isearch_window); ++ if (priv->isearch_entry_changed_id == 0) ++ { ++ priv->isearch_entry_changed_id = ++ g_signal_connect (priv->isearch_entry, "changed", ++ G_CALLBACK (isearch_entry_changed), slot); ++ } ++ priv->isearch_timeout_id = ++ gdk_threads_add_timeout_full (G_PRIORITY_LOW, ISEARCH_TIMEOUT, ++ isearch_timeout, slot, ++ isearch_timeout_destroy); ++ ++ /* Grab focus without selecting all the text. */ ++ klass = g_type_class_peek_parent (GTK_ENTRY_GET_CLASS (priv->isearch_entry)); ++ (*GTK_WIDGET_CLASS (klass)->grab_focus) (priv->isearch_entry); ++ ++ /* send focus-in event */ ++ send_focus_change (priv->isearch_entry, device, TRUE); ++ ++ /* search first matching iter */ ++ isearch_entry_changed (priv->isearch_entry, slot); ++ return TRUE; +} + +static void +isearch_position (NautilusWindowSlot *slot) +{ -+ gint x, y; -+ gint window_x, window_y; -+ gint window_width, window_height; -+ GdkWindow *window = gtk_widget_get_window (GTK_WIDGET (slot)); -+ GdkScreen *screen = gdk_window_get_screen (window); -+ GtkRequisition requisition; -+ gint monitor_num; -+ GdkRectangle monitor; -+ -+ monitor_num = gdk_screen_get_monitor_at_window (screen, window); -+ gdk_screen_get_monitor_workarea (screen, monitor_num, &monitor); -+ -+ gtk_widget_realize (slot->details->isearch_window); -+ -+ gdk_window_get_origin (window, &window_x, &window_y); -+ window_width = gdk_window_get_width (window); -+ window_height = gdk_window_get_height (window); -+ gtk_widget_get_preferred_size (slot->details->isearch_window, &requisition, NULL); -+ -+ if (window_x + window_width > gdk_screen_get_width (screen)) -+ x = gdk_screen_get_width (screen) - requisition.width; -+ else if (window_x + window_width - requisition.width < 0) -+ x = 0; -+ else -+ x = window_x + window_width - requisition.width; -+ -+ if (window_y + window_height + requisition.height > gdk_screen_get_height (screen)) -+ y = gdk_screen_get_height (screen) - requisition.height; -+ else if (window_y + window_height < 0) /* isn't really possible ... */ -+ y = 0; -+ else -+ y = window_y + window_height; -+ -+ gtk_window_move (GTK_WINDOW (slot->details->isearch_window), x, y); ++ gint x, y; ++ gint window_x, window_y; ++ gint window_width, window_height; ++ GdkWindow * window = gtk_widget_get_window (GTK_WIDGET (slot)); ++ GdkScreen * screen = gdk_window_get_screen (window); ++ GtkRequisition requisition; ++ gint monitor_num; ++ GdkRectangle monitor; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ ++ monitor_num = gdk_screen_get_monitor_at_window (screen, window); ++ gdk_screen_get_monitor_workarea (screen, monitor_num, &monitor); ++ ++ gtk_widget_realize (priv->isearch_window); ++ ++ gdk_window_get_origin (window, &window_x, &window_y); ++ window_width = gdk_window_get_width (window); ++ window_height = gdk_window_get_height (window); ++ gtk_widget_get_preferred_size (priv->isearch_window, &requisition, NULL); ++ ++ if (window_x + window_width > gdk_screen_get_width (screen)) ++ x = gdk_screen_get_width (screen) - requisition.width; ++ else if (window_x + window_width - requisition.width < 0) ++ x = 0; ++ else ++ x = window_x + window_width - requisition.width; ++ ++ if (window_y + window_height + requisition.height > ++ gdk_screen_get_height (screen)) ++ y = gdk_screen_get_height (screen) - requisition.height; ++ else if (window_y + window_height < 0) /* isn't really possible ... */ ++ y = 0; ++ else ++ y = window_y + window_height; ++ ++ gtk_window_move (GTK_WINDOW (priv->isearch_window), x, y); +} + +static gboolean +isearch_compare_filename (const gchar *f1, const gchar *f2, guint length) +{ -+ gchar *normalized_f1; -+ gchar *normalized_f2; -+ gchar *case_normalized_f1; -+ gchar *case_normalized_f2; -+ gboolean retval = FALSE; -+ -+ normalized_f1 = g_utf8_normalize (f1, -1, G_NORMALIZE_ALL); -+ normalized_f2 = g_utf8_normalize (f2, -1, G_NORMALIZE_ALL); -+ -+ if (G_LIKELY (normalized_f1 != NULL && normalized_f2 != NULL)) { -+ case_normalized_f1 = g_utf8_casefold (normalized_f1, -1); -+ case_normalized_f2 = g_utf8_casefold (normalized_f2, -1); -+ -+ retval = (strncmp (case_normalized_f1, case_normalized_f2, length) == 0); -+ } -+ g_free (normalized_f1); -+ g_free (normalized_f2); -+ g_free (case_normalized_f1); -+ g_free (case_normalized_f2); -+ return retval; ++ gchar * normalized_f1; ++ gchar * normalized_f2; ++ gchar * case_normalized_f1; ++ gchar * case_normalized_f2; ++ gboolean retval = FALSE; ++ ++ normalized_f1 = g_utf8_normalize (f1, -1, G_NORMALIZE_ALL); ++ normalized_f2 = g_utf8_normalize (f2, -1, G_NORMALIZE_ALL); ++ ++ if (G_LIKELY (normalized_f1 != NULL && normalized_f2 != NULL)) ++ { ++ case_normalized_f1 = g_utf8_casefold (normalized_f1, -1); ++ case_normalized_f2 = g_utf8_casefold (normalized_f2, -1); ++ ++ retval = (strncmp (case_normalized_f1, case_normalized_f2, length) == 0); ++ } ++ g_free (normalized_f1); ++ g_free (normalized_f2); ++ g_free (case_normalized_f1); ++ g_free (case_normalized_f2); ++ return retval; +} + +static int +compare_files (gconstpointer a, gconstpointer b, gpointer callback_data) +{ -+ NautilusView *view = NAUTILUS_VIEW (callback_data); -+ NautilusFile *f1 = NAUTILUS_FILE (a); -+ NautilusFile *f2 = NAUTILUS_FILE (b); ++ NautilusView *view = NAUTILUS_VIEW (callback_data); ++ NautilusFile *f1 = NAUTILUS_FILE (a); ++ NautilusFile *f2 = NAUTILUS_FILE (b); + -+ return NAUTILUS_FILES_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->compare_files (view, f1, f2); ++ return NAUTILUS_FILES_VIEW_CLASS (G_OBJECT_GET_CLASS (view)) ++ ->compare_files (view, f1, f2); +} + +static GList * +isearch_get_sorted_files (NautilusWindowSlot *slot) +{ -+ NautilusView *view = slot->details->content_view; -+ NautilusDirectory *dir = nautilus_files_view_get_model (view); -+ GList *list = nautilus_directory_get_file_list (dir); -+ GList *sorted_list; ++ NautilusWindowSlotPrivate *priv; ++ NautilusView * view = priv->content_view; + -+ sorted_list = g_list_sort_with_data (list, compare_files, view); -+ return sorted_list; ++ priv = nautilus_window_slot_get_instance_private (slot); ++ NautilusDirectory *dir = nautilus_files_view_get_model (view); ++ GList * list = nautilus_directory_get_file_list (dir); ++ GList * sorted_list; ++ ++ sorted_list = g_list_sort_with_data (list, compare_files, view); ++ return sorted_list; +} + +static NautilusFile * +isearch_find (NautilusWindowSlot *slot, const gchar *text) +{ -+ GList *files = isearch_get_sorted_files (slot); -+ GList *l; -+ NautilusFile *found = NULL; -+ -+ for (l = files; l; l = g_list_next (l)) { -+ NautilusFile *file = NAUTILUS_FILE (l->data); -+ gchar *filename = nautilus_file_get_display_name (file); -+ -+ if (isearch_compare_filename (filename, text, strlen (text))) -+ found = file; -+ -+ g_free (filename); -+ if (found) -+ break; -+ } -+ return found; ++ GList * files = isearch_get_sorted_files (slot); ++ GList * l; ++ NautilusFile *found = NULL; ++ ++ for (l = files; l; l = g_list_next (l)) ++ { ++ NautilusFile *file = NAUTILUS_FILE (l->data); ++ gchar * filename = nautilus_file_get_display_name (file); ++ ++ if (isearch_compare_filename (filename, text, strlen (text))) ++ found = file; ++ ++ g_free (filename); ++ if (found) ++ break; ++ } ++ return found; +} + +static NautilusFile * +isearch_find_next (NautilusWindowSlot *slot, const gchar *text) +{ -+ GList *files = isearch_get_sorted_files (slot); -+ NautilusFile *found = NULL; -+ GList *current; -+ GList *l; -+ -+ current = g_list_find (files, slot->details->isearch_selected_file); -+ for (l = g_list_next (current); l; l = g_list_next (l)) { -+ NautilusFile *file = NAUTILUS_FILE (l->data); -+ gchar *display_name = nautilus_file_get_display_name (file); -+ -+ if (isearch_compare_filename (display_name, text, strlen (text))) -+ found = file; -+ -+ g_free (display_name); -+ if (found) -+ break; -+ } -+ return found; ++ GList * files = isearch_get_sorted_files (slot); ++ NautilusFile * found = NULL; ++ GList * current; ++ GList * l; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ ++ current = g_list_find (files, priv->isearch_selected_file); ++ for (l = g_list_next (current); l; l = g_list_next (l)) ++ { ++ NautilusFile *file = NAUTILUS_FILE (l->data); ++ gchar * display_name = nautilus_file_get_display_name (file); ++ ++ if (isearch_compare_filename (display_name, text, strlen (text))) ++ found = file; ++ ++ g_free (display_name); ++ if (found) ++ break; ++ } ++ return found; +} + +static NautilusFile * +isearch_find_prev (NautilusWindowSlot *slot, const gchar *text) +{ -+ GList *files = isearch_get_sorted_files (slot); -+ NautilusFile *found = NULL; -+ GList *current; -+ GList *l; -+ -+ current = g_list_find (files, slot->details->isearch_selected_file); -+ for (l = g_list_previous (current); l; l = g_list_previous (l)) { -+ NautilusFile *file = NAUTILUS_FILE (l->data); -+ gchar *display_name = nautilus_file_get_display_name (file); -+ -+ if (isearch_compare_filename (display_name, text, strlen (text))) -+ found = file; -+ -+ g_free (display_name); -+ if (found) -+ break; -+ } -+ return found; ++ GList * files = isearch_get_sorted_files (slot); ++ NautilusFile * found = NULL; ++ GList * current; ++ GList * l; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ ++ current = g_list_find (files, priv->isearch_selected_file); ++ for (l = g_list_previous (current); l; l = g_list_previous (l)) ++ { ++ NautilusFile *file = NAUTILUS_FILE (l->data); ++ gchar * display_name = nautilus_file_get_display_name (file); ++ ++ if (isearch_compare_filename (display_name, text, strlen (text))) ++ found = file; ++ ++ g_free (display_name); ++ if (found) ++ break; ++ } ++ return found; +} + +static gboolean +isearch_move_next (NautilusWindowSlot *slot) +{ -+ const gchar *text; -+ NautilusFile *iter; ++ const gchar * text; ++ NautilusFile * iter; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); + -+ text = gtk_entry_get_text (GTK_ENTRY (slot->details->isearch_entry)); -+ iter = isearch_find_next (slot, text); -+ if (iter) -+ isearch_set_selection (slot, iter); ++ text = gtk_entry_get_text (GTK_ENTRY (priv->isearch_entry)); ++ iter = isearch_find_next (slot, text); ++ if (iter) ++ isearch_set_selection (slot, iter); + -+ return iter != NULL; ++ return iter != NULL; +} + +static gboolean +isearch_move_prev (NautilusWindowSlot *slot) +{ -+ const gchar *text; -+ NautilusFile *iter; ++ const gchar * text; ++ NautilusFile * iter; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); + -+ text = gtk_entry_get_text (GTK_ENTRY (slot->details->isearch_entry)); -+ iter = isearch_find_prev (slot, text); -+ if (iter) -+ isearch_set_selection (slot, iter); ++ text = gtk_entry_get_text (GTK_ENTRY (priv->isearch_entry)); ++ iter = isearch_find_prev (slot, text); ++ if (iter) ++ isearch_set_selection (slot, iter); + -+ return iter != NULL; ++ return iter != NULL; +} + +static void +isearch_set_selection (NautilusWindowSlot *slot, NautilusFile *file) +{ -+ GList *list = g_list_append (list, file); ++ GList * list = g_list_append (list, file); ++ NautilusWindowSlotPrivate *priv; + -+ slot->details->isearch_selected_file = file; -+ nautilus_view_set_selection (slot->details->content_view, list); -+ g_list_free (list); ++ priv = nautilus_window_slot_get_instance_private (slot); ++ ++ priv->isearch_selected_file = file; ++ nautilus_view_set_selection (priv->content_view, list); ++ g_list_free (list); +} + +static void +isearch_enable_changed (gpointer callback_data) +{ -+ NautilusWindowSlot *slot; -+ gboolean enable; ++ NautilusWindowSlot * slot; ++ gboolean enable; ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); + -+ slot = NAUTILUS_WINDOW_SLOT (callback_data); ++ slot = NAUTILUS_WINDOW_SLOT (callback_data); + -+ enable = g_settings_get_boolean (nautilus_preferences, NAUTILUS_PREFERENCES_ENABLE_INTERACTIVE_SEARCH); ++ enable = ++ g_settings_get_boolean (nautilus_preferences, ++ NAUTILUS_PREFERENCES_ENABLE_INTERACTIVE_SEARCH); + -+ if (enable != slot->details->isearch_enable) { -+ if (!enable) -+ isearch_dispose (slot); ++ if (enable != priv->isearch_enable) ++ { ++ if (!enable) ++ isearch_dispose (slot); + -+ slot->details->isearch_enable = enable; -+ } ++ priv->isearch_enable = enable; ++ } +} + +static void +isearch_dispose (NautilusWindowSlot *slot) +{ -+ if (!slot->details->isearch_enable) -+ return; -+ -+ if (slot->details->isearch_entry_changed_id != 0) { -+ g_signal_handler_disconnect (G_OBJECT (slot->details->isearch_entry), slot->details->isearch_entry_changed_id); -+ slot->details->isearch_entry_changed_id = 0; -+ } -+ if (slot->details->isearch_timeout_id != 0) { -+ g_source_remove (slot->details->isearch_timeout_id); -+ slot->details->isearch_timeout_id = 0; -+ } -+ if (slot->details->isearch_window != NULL) { -+ gtk_widget_destroy (slot->details->isearch_window); -+ slot->details->isearch_window = NULL; -+ slot->details->isearch_entry = NULL; -+ } ++ NautilusWindowSlotPrivate *priv; ++ ++ priv = nautilus_window_slot_get_instance_private (slot); ++ ++ if (!priv->isearch_enable) ++ return; ++ ++ if (priv->isearch_entry_changed_id != 0) ++ { ++ g_signal_handler_disconnect (G_OBJECT (priv->isearch_entry), ++ priv->isearch_entry_changed_id); ++ priv->isearch_entry_changed_id = 0; ++ } ++ if (priv->isearch_timeout_id != 0) ++ { ++ g_source_remove (priv->isearch_timeout_id); ++ priv->isearch_timeout_id = 0; ++ } ++ if (priv->isearch_window != NULL) ++ { ++ gtk_widget_destroy (priv->isearch_window); ++ priv->isearch_window = NULL; ++ priv->isearch_entry = NULL; ++ } +} diff --git a/nautilus.install b/nautilus.install index 082126d24bce..38d05ba8b4d3 100644 --- a/nautilus.install +++ b/nautilus.install @@ -3,6 +3,7 @@ post_install() { update-desktop-database -q gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor update-mime-database /usr/share/mime > /dev/null + gsettings set org.gnome.nautilus.preferences enable-interactive-search true } post_upgrade() { |