summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nautilus-application-actions.c13
-rw-r--r--src/nautilus-application.c152
-rw-r--r--src/nautilus-application.h7
-rw-r--r--src/nautilus-bookmarks-window.c3
-rw-r--r--src/nautilus-desktop-window.c4
-rw-r--r--src/nautilus-files-view-dnd.c5
-rw-r--r--src/nautilus-files-view.c25
-rw-r--r--src/nautilus-location-entry.c10
-rw-r--r--src/nautilus-mime-actions.c4
-rw-r--r--src/nautilus-places-view.c11
-rw-r--r--src/nautilus-window-slot-dnd.c20
-rw-r--r--src/nautilus-window-slot.c516
-rw-r--r--src/nautilus-window-slot.h36
-rw-r--r--src/nautilus-window.c182
-rw-r--r--src/nautilus-window.h18
15 files changed, 469 insertions, 537 deletions
diff --git a/src/nautilus-application-actions.c b/src/nautilus-application-actions.c
index 0c6aedcf8..72e31e5b2 100644
--- a/src/nautilus-application-actions.c
+++ b/src/nautilus-application-actions.c
@@ -37,16 +37,13 @@ action_new_window (GSimpleAction *action,
gpointer user_data)
{
GtkApplication *application = user_data;
- NautilusWindow *window;
- GtkWindow *cur_window;
+ GFile *home;
- cur_window = gtk_application_get_active_window (application);
- window = nautilus_application_create_window (NAUTILUS_APPLICATION (application),
- cur_window ?
- gtk_window_get_screen (cur_window) :
- gdk_screen_get_default ());
+ home = g_file_new_for_path (g_get_home_dir ());
+ nautilus_application_open_location_full (NAUTILUS_APPLICATION (application), home,
+ NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW, NULL, NULL, NULL);
- nautilus_window_slot_go_home (nautilus_window_get_active_slot (window), 0);
+ g_object_unref (home);
}
static void
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
index 1b4fae187..a1f3f3fa9 100644
--- a/src/nautilus-application.c
+++ b/src/nautilus-application.c
@@ -417,10 +417,120 @@ get_window_slot_for_location (NautilusApplication *application, GFile *location)
return slot;
}
+static void
+new_window_show_callback (GtkWidget *widget,
+ gpointer user_data)
+{
+ NautilusWindow *window;
+
+ window = NAUTILUS_WINDOW (user_data);
+ nautilus_window_close (window);
+
+ g_signal_handlers_disconnect_by_func (widget,
+ G_CALLBACK (new_window_show_callback),
+ user_data);
+}
+
+void
+nautilus_application_open_location_full (NautilusApplication *application,
+ GFile *location,
+ NautilusWindowOpenFlags flags,
+ GList *selection,
+ NautilusWindow *target_window,
+ NautilusWindowSlot *target_slot)
+{
+ NautilusWindowSlot *active_slot;
+ NautilusWindow *active_window;
+ GFile *old_location;
+ char *old_uri, *new_uri;
+ gboolean use_same;
+
+ use_same = TRUE;
+ active_window = NAUTILUS_WINDOW (gtk_application_get_active_window (GTK_APPLICATION (application)));
+ active_slot = nautilus_window_get_active_slot (active_window);
+
+ /* Just for debug.*/
+
+ old_location = nautilus_window_slot_get_location (active_slot);
+ /* this happens at startup */
+ if (old_location == NULL)
+ old_uri = g_strdup ("(none)");
+ else
+ old_uri = g_file_get_uri (old_location);
+
+ new_uri = g_file_get_uri (location);
+
+ DEBUG ("Application opening location, old: %s, new: %s", old_uri, new_uri);
+ nautilus_profile_start ("Application opening location, old: %s, new: %s", old_uri, new_uri);
+
+ g_free (old_uri);
+ g_free (new_uri);
+ /* end debug */
+
+ if ((target_window && NAUTILUS_IS_DESKTOP_WINDOW (target_window)) ||
+ (!target_window && NAUTILUS_IS_DESKTOP_WINDOW (active_window))) {
+ NautilusWindow *desktop_target_window;
+
+ desktop_target_window = target_window ? target_window : active_window;
+ use_same = !nautilus_desktop_window_loaded (NAUTILUS_DESKTOP_WINDOW (desktop_target_window));
+
+ /* if we're requested to open a new tab on the desktop, open a window
+ * instead.
+ */
+ if (flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB) {
+ flags ^= NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB;
+ flags |= NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW;
+ }
+ }
+
+ g_assert (!((flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW) != 0 &&
+ (flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB) != 0));
+
+ /* and if the flags specify so, this is overridden */
+ if ((flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW) != 0) {
+ use_same = FALSE;
+ }
+
+ /* now get/create the window */
+ if (use_same) {
+ if (!target_window) {
+ if (!target_slot) {
+ target_window = active_window;
+ } else {
+ target_window = nautilus_window_slot_get_window (target_slot);
+ }
+ }
+ } else {
+ target_window = nautilus_application_create_window (application,
+ gtk_window_get_screen (GTK_WINDOW (active_window)));
+ }
+
+ g_assert (target_window != NULL);
+
+ /* close the current window if the flags say so */
+ if ((flags & NAUTILUS_WINDOW_OPEN_FLAG_CLOSE_BEHIND) != 0) {
+ if (NAUTILUS_IS_DESKTOP_WINDOW (active_window)) {
+ if (gtk_widget_get_visible (GTK_WIDGET (target_window))) {
+ nautilus_window_close (active_window);
+ } else {
+ g_signal_connect_object (target_window,
+ "show",
+ G_CALLBACK (new_window_show_callback),
+ active_window,
+ G_CONNECT_AFTER);
+ }
+ }
+ }
+
+ /* Application is the one that manages windows, so this flag shouldn't use
+ * it anymore by any client */
+ flags &= ~NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW;
+ nautilus_window_open_location_full (target_window, location, flags, selection, target_slot);
+}
static void
open_window (NautilusApplication *application,
- GFile *location)
+ GFile *location)
{
NautilusWindow *window;
@@ -428,9 +538,13 @@ open_window (NautilusApplication *application,
window = nautilus_application_create_window (application, gdk_screen_get_default ());
if (location != NULL) {
- nautilus_window_go_to (window, location);
+ nautilus_application_open_location_full (application, location, 0, NULL, window, NULL);
} else {
- nautilus_window_slot_go_home (nautilus_window_get_active_slot (window), 0);
+ GFile *home;
+ home = g_file_new_for_path (g_get_home_dir ());
+ nautilus_application_open_location_full (application, home, 0, NULL, window, NULL);
+
+ g_object_unref (home);
}
nautilus_profile_end (NULL);
@@ -438,9 +552,9 @@ open_window (NautilusApplication *application,
void
nautilus_application_open_location (NautilusApplication *application,
- GFile *location,
- GFile *selection,
- const char *startup_id)
+ GFile *location,
+ GFile *selection,
+ const char *startup_id)
{
NautilusWindow *window;
NautilusWindowSlot *slot;
@@ -448,22 +562,19 @@ nautilus_application_open_location (NautilusApplication *application,
nautilus_profile_start (NULL);
+ if (selection != NULL) {
+ sel_list = g_list_prepend (sel_list, nautilus_file_get (selection));
+ }
+
slot = get_window_slot_for_location (application, location);
if (!slot) {
window = nautilus_application_create_window (application, gdk_screen_get_default ());
- slot = nautilus_window_get_active_slot (window);
} else {
window = nautilus_window_slot_get_window (slot);
- nautilus_window_set_active_slot (window, slot);
- gtk_window_present (GTK_WINDOW (window));
}
- if (selection != NULL) {
- sel_list = g_list_prepend (sel_list, nautilus_file_get (selection));
- }
-
- nautilus_window_slot_open_location_full (slot, location, 0, sel_list, NULL, NULL);
+ nautilus_application_open_location_full (application, location, 0, sel_list, window, slot);
if (sel_list != NULL) {
nautilus_file_list_free (sel_list);
@@ -487,7 +598,6 @@ nautilus_application_open (GApplication *app,
NautilusApplication *self = NAUTILUS_APPLICATION (app);
gboolean force_new = (g_strcmp0 (hint, "new-window") == 0);
NautilusWindowSlot *slot = NULL;
- NautilusWindow *window;
GFile *file;
gint idx;
@@ -505,11 +615,7 @@ nautilus_application_open (GApplication *app,
open_window (self, file);
} else {
/* We open the location again to update any possible selection */
- nautilus_window_slot_open_location (slot, file, 0);
-
- window = nautilus_window_slot_get_window (slot);
- nautilus_window_set_active_slot (window, slot);
- gtk_window_present (GTK_WINDOW (window));
+ nautilus_application_open_location_full (NAUTILUS_APPLICATION (app), file, 0, NULL, NULL, slot);
}
}
}
@@ -997,6 +1103,7 @@ update_dbus_opened_locations (NautilusApplication *app)
gsize locations_size = 0;
gchar **locations_array;
NautilusWindow *window;
+ GFile *location;
g_return_if_fail (NAUTILUS_IS_APPLICATION (app));
@@ -1005,9 +1112,10 @@ update_dbus_opened_locations (NautilusApplication *app)
for (sl = nautilus_window_get_slots (window); sl; sl = sl->next) {
NautilusWindowSlot *slot = sl->data;
- gchar *uri = nautilus_window_slot_get_location_uri (slot);
+ location = nautilus_window_slot_get_location (slot);
- if (uri) {
+ if (location != NULL) {
+ gchar *uri = g_file_get_uri (location);
GList *found = g_list_find_custom (locations, uri, (GCompareFunc) g_strcmp0);
if (!found) {
diff --git a/src/nautilus-application.h b/src/nautilus-application.h
index 179a4f46b..4aaa90c7d 100644
--- a/src/nautilus-application.h
+++ b/src/nautilus-application.h
@@ -71,6 +71,13 @@ void nautilus_application_open_location (NautilusApplication *application,
GFile *selection,
const char *startup_id);
+void nautilus_application_open_location_full (NautilusApplication *application,
+ GFile *location,
+ NautilusWindowOpenFlags flags,
+ GList *selection,
+ NautilusWindow *target_window,
+ NautilusWindowSlot *target_slot);
+
NautilusBookmarkList *
nautilus_application_get_bookmarks (NautilusApplication *application);
void nautilus_application_edit_bookmarks (NautilusApplication *application,
diff --git a/src/nautilus-bookmarks-window.c b/src/nautilus-bookmarks-window.c
index 122aba469..d0345442f 100644
--- a/src/nautilus-bookmarks-window.c
+++ b/src/nautilus-bookmarks-window.c
@@ -609,7 +609,8 @@ on_row_activated (GtkTreeView *view,
return;
}
- nautilus_window_go_to (self->priv->parent_window, location);
+ nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()),
+ location, 0, NULL, NULL, NULL);
g_object_unref (location);
}
diff --git a/src/nautilus-desktop-window.c b/src/nautilus-desktop-window.c
index a7c647cac..bde4622f2 100644
--- a/src/nautilus-desktop-window.c
+++ b/src/nautilus-desktop-window.c
@@ -24,6 +24,7 @@
#include <config.h>
#include "nautilus-desktop-window.h"
#include "nautilus-window.h"
+#include "nautilus-application.h"
#include <X11/Xatom.h>
#include <gdk/gdkx.h>
@@ -57,7 +58,8 @@ nautilus_desktop_window_update_directory (NautilusDesktopWindow *window)
window->details->loaded = FALSE;
location = g_file_new_for_uri (EEL_DESKTOP_URI);
- nautilus_window_go_to (NAUTILUS_WINDOW (window), location);
+ nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()),
+ location, 0, NULL, NAUTILUS_WINDOW (window), NULL);
window->details->loaded = TRUE;
g_object_unref (location);
diff --git a/src/nautilus-files-view-dnd.c b/src/nautilus-files-view-dnd.c
index 90c5b469c..6ce84bef4 100644
--- a/src/nautilus-files-view-dnd.c
+++ b/src/nautilus-files-view-dnd.c
@@ -30,6 +30,7 @@
#include "nautilus-files-view-dnd.h"
#include "nautilus-files-view.h"
+#include "nautilus-application.h"
#include <eel/eel-stock-dialogs.h>
#include <eel/eel-string.h>
@@ -540,7 +541,9 @@ nautilus_files_view_handle_hover (NautilusFilesView *view,
target_is_dir = nautilus_file_get_file_type (target_file) == G_FILE_TYPE_DIRECTORY;
current_location = nautilus_window_slot_get_location (slot);
if (target_is_dir && ! (current_location != NULL && g_file_equal(location, current_location))) {
- nautilus_window_slot_open_location (slot, location, 0);
+ nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()),
+ location, NAUTILUS_WINDOW_OPEN_FLAG_DONT_MAKE_ACTIVE,
+ NULL, NULL, slot);
}
g_object_unref (location);
nautilus_file_unref (target_file);
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index 995811537..217943725 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -4174,14 +4174,12 @@ static GList *
get_extension_background_menu_items (NautilusFilesView *view)
{
NautilusWindow *window;
- NautilusFile *file;
GList *items;
GList *providers;
GList *l;
window = nautilus_files_view_get_window (view);
providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_MENU_PROVIDER);
- file = nautilus_window_slot_get_file (view->details->slot);
items = NULL;
for (l = providers; l != NULL; l = l->next) {
@@ -4191,7 +4189,7 @@ get_extension_background_menu_items (NautilusFilesView *view)
provider = NAUTILUS_MENU_PROVIDER (l->data);
file_items = nautilus_menu_provider_get_background_items (provider,
GTK_WIDGET (window),
- file);
+ view->details->directory_as_file);
items = g_list_concat (items, file_items);
}
@@ -4983,15 +4981,14 @@ action_open_scripts_folder (GSimpleAction *action,
GVariant *state,
gpointer user_data)
{
- NautilusFilesView *view;
static GFile *location = NULL;
if (location == NULL) {
location = g_file_new_for_uri (scripts_directory_uri);
}
- view = NAUTILUS_FILES_VIEW (user_data);
- nautilus_window_slot_open_location (view->details->slot, location, 0);
+ nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()),
+ location, 0, NULL, NULL, NULL);
}
typedef struct _CopyCallbackData {
@@ -5048,26 +5045,30 @@ static void
add_bookmarks_for_window_slot (CopyCallbackData *data,
NautilusWindowSlot *slot)
{
+ GFile *location;
char *uri;
- uri = nautilus_window_slot_get_location_uri (slot);
- if (uri != NULL) {
+ location = nautilus_window_slot_get_location (slot);
+ if (location != NULL) {
+ uri = g_file_get_uri (location);
add_bookmark_for_uri (data, uri);
+ g_free (uri);
}
- g_free (uri);
}
static void
remove_bookmarks_for_window_slot (CopyCallbackData *data,
NautilusWindowSlot *slot)
{
+ GFile *location;
char *uri;
- uri = nautilus_window_slot_get_location_uri (slot);
- if (uri != NULL) {
+ location = nautilus_window_slot_get_location (slot);
+ if (location != NULL) {
+ uri = g_file_get_uri (location);
remove_bookmark_for_uri (data, uri);
+ g_free (uri);
}
- g_free (uri);
}
static void
diff --git a/src/nautilus-location-entry.c b/src/nautilus-location-entry.c
index f0c637d09..4c738bed2 100644
--- a/src/nautilus-location-entry.c
+++ b/src/nautilus-location-entry.c
@@ -225,11 +225,8 @@ drag_data_received_callback (GtkWidget *widget,
gpointer callback_data)
{
char **names;
- NautilusApplication *application;
int name_count;
- NautilusWindow *new_window;
GtkWidget *window;
- GdkScreen *screen;
gboolean new_windows_for_extras;
char *prompt;
char *detail;
@@ -290,13 +287,10 @@ drag_data_received_callback (GtkWidget *widget,
if (new_windows_for_extras) {
int i;
- application = NAUTILUS_APPLICATION (g_application_get_default ());
- screen = gtk_window_get_screen (GTK_WINDOW (window));
-
for (i = 1; names[i] != NULL; ++i) {
- new_window = nautilus_application_create_window (application, screen);
location = g_file_new_for_uri (names[i]);
- nautilus_window_go_to (new_window, location);
+ nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()),
+ location, NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW, NULL, NULL, NULL);
g_object_unref (location);
}
}
diff --git a/src/nautilus-mime-actions.c b/src/nautilus-mime-actions.c
index 225138308..493aee422 100644
--- a/src/nautilus-mime-actions.c
+++ b/src/nautilus-mime-actions.c
@@ -26,6 +26,7 @@
#include "nautilus-mime-actions.h"
#include "nautilus-window-slot.h"
+#include "nautilus-application.h"
#include <eel/eel-glib-extensions.h>
#include <eel/eel-stock-dialogs.h>
@@ -1548,7 +1549,8 @@ activate_files (ActivateParameters *parameters)
uri = nautilus_file_get_activation_uri (file);
f = g_file_new_for_uri (uri);
- nautilus_window_slot_open_location (parameters->slot, f, flags);
+ nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()),
+ f, flags, NULL, NULL, NULL);
g_object_unref (f);
g_free (uri);
}
diff --git a/src/nautilus-places-view.c b/src/nautilus-places-view.c
index 7a4d15fc3..1d5db8bdd 100644
--- a/src/nautilus-places-view.c
+++ b/src/nautilus-places-view.c
@@ -19,6 +19,7 @@
#include "nautilus-mime-actions.h"
#include "nautilus-places-view.h"
#include "nautilus-window-slot.h"
+#include "nautilus-application.h"
#include "gtk/gtkplacesviewprivate.h"
typedef struct
@@ -199,16 +200,12 @@ nautilus_places_view_set_location (NautilusView *view,
/*
* If it's not trying to open the places view itself, simply
- * delegates the location to window-slot, which takes care of
+ * delegates the location to application, which takes care of
* selecting the appropriate view.
*/
if (!g_strcmp0 (uri, "other-locations:///") == 0) {
- GtkWidget *slot;
-
- slot = gtk_widget_get_ancestor (GTK_WIDGET (view), NAUTILUS_TYPE_WINDOW_SLOT);
- g_assert (slot != NULL);
-
- nautilus_window_slot_open_location (NAUTILUS_WINDOW_SLOT (slot), location, 0);
+ nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()),
+ location, 0, NULL, NULL, NULL);
} else {
g_set_object (&priv->location, location);
}
diff --git a/src/nautilus-window-slot-dnd.c b/src/nautilus-window-slot-dnd.c
index af15c18bc..6c9fea571 100644
--- a/src/nautilus-window-slot-dnd.c
+++ b/src/nautilus-window-slot-dnd.c
@@ -26,6 +26,7 @@
#include <config.h>
#include "nautilus-notebook.h"
+#include "nautilus-application.h"
#include "nautilus-files-view-dnd.h"
#include "nautilus-window-slot-dnd.h"
@@ -79,8 +80,6 @@ static void
switch_location (NautilusDragSlotProxyInfo *drag_info)
{
GFile *location;
- GFile *current_location;
- NautilusWindowSlot *target_slot;
GtkWidget *window;
if (drag_info->target_file == NULL) {
@@ -90,13 +89,10 @@ switch_location (NautilusDragSlotProxyInfo *drag_info)
window = gtk_widget_get_toplevel (drag_info->widget);
g_assert (NAUTILUS_IS_WINDOW (window));
- target_slot = nautilus_window_get_active_slot (NAUTILUS_WINDOW (window));
-
- current_location = nautilus_window_slot_get_location (target_slot);
location = nautilus_file_get_location (drag_info->target_file);
- if (! (current_location != NULL && g_file_equal (location, current_location))) {
- nautilus_window_slot_open_location (target_slot, location, 0);
- }
+ nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()),
+ location, NAUTILUS_WINDOW_OPEN_FLAG_DONT_MAKE_ACTIVE,
+ NULL, NAUTILUS_WINDOW (window), NULL);
g_object_unref (location);
}
@@ -158,6 +154,7 @@ slot_proxy_drag_motion (GtkWidget *widget,
GdkAtom target;
int action;
char *target_uri;
+ GFile *location;
gboolean valid_text_drag;
gboolean valid_xds_drag;
@@ -195,7 +192,8 @@ slot_proxy_drag_motion (GtkWidget *widget,
}
if (target_slot != NULL) {
- target_uri = nautilus_window_slot_get_current_uri (target_slot);
+ location = nautilus_window_slot_get_location (target_slot);
+ target_uri = g_file_get_uri (location);
}
}
@@ -334,6 +332,7 @@ slot_proxy_handle_drop (GtkWidget *widget,
NautilusFilesView *target_view;
char *target_uri;
GList *uri_list;
+ GFile *location;
if (!drag_info->have_data ||
!drag_info->have_valid_data) {
@@ -355,7 +354,8 @@ slot_proxy_handle_drop (GtkWidget *widget,
if (drag_info->target_file != NULL) {
target_uri = nautilus_file_get_uri (drag_info->target_file);
} else if (target_slot != NULL) {
- target_uri = nautilus_window_slot_get_current_uri (target_slot);
+ location = nautilus_window_slot_get_location (target_slot);
+ target_uri = g_file_get_uri (location);
}
target_view = NULL;
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index a47a17845..d48be27cf 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -62,6 +62,7 @@ enum {
PROP_WINDOW,
PROP_ICON,
PROP_VIEW_WIDGET,
+ PROP_LOADING,
NUM_PROPERTIES
};
@@ -69,6 +70,7 @@ struct NautilusWindowSlotDetails {
NautilusWindow *window;
gboolean active : 1;
+ guint loading : 1;
/* slot contains
* 1) an vbox containing extra_location_widgets
@@ -123,8 +125,6 @@ struct NautilusWindowSlotDetails {
GCancellable *mount_cancellable;
GError *mount_error;
gboolean tried_mount;
- NautilusWindowGoToCallback open_callback;
- gpointer open_callback_user_data;
gchar *view_mode_before_search;
gchar *view_mode_before_places;
};
@@ -142,6 +142,10 @@ static void nautilus_window_slot_emit_location_change (NautilusWindowSlot *slot,
static gboolean nautilus_window_slot_content_view_matches (NautilusWindowSlot *slot, const char *iid);
static NautilusView* nautilus_window_slot_get_view_for_location (NautilusWindowSlot *slot, GFile *location);
static void nautilus_window_slot_set_content_view (NautilusWindowSlot *slot, const char *id);
+static void nautilus_window_slot_set_loading (NautilusWindowSlot *slot, gboolean loading);
+char * nautilus_window_slot_get_location_uri (NautilusWindowSlot *slot);
+static void nautilus_window_slot_set_search_visible (NautilusWindowSlot *slot,
+ gboolean visible);
static NautilusView*
nautilus_window_slot_get_view_for_location (NautilusWindowSlot *slot,
@@ -315,7 +319,7 @@ query_editor_changed_callback (NautilusQueryEditor *editor,
view = nautilus_window_slot_get_current_view (slot);
nautilus_view_set_search_query (view, query);
- nautilus_window_slot_open_location (slot, nautilus_view_get_location (view), 0);
+ nautilus_window_slot_open_location_full (slot, nautilus_view_get_location (view), 0, NULL);
}
static void
@@ -350,9 +354,7 @@ hide_query_editor (NautilusWindowSlot *slot)
nautilus_window_slot_open_location_full (slot,
nautilus_view_get_location (view),
0,
- selection,
- NULL,
- NULL);
+ selection);
nautilus_file_list_free (selection);
}
@@ -416,7 +418,7 @@ show_query_editor (NautilusWindowSlot *slot)
}
}
-void
+static void
nautilus_window_slot_set_search_visible (NautilusWindowSlot *slot,
gboolean visible)
{
@@ -559,6 +561,9 @@ nautilus_window_slot_get_property (GObject *object,
case PROP_VIEW_WIDGET:
g_value_set_object (value, nautilus_window_slot_get_view_widget (slot));
break;
+ case PROP_LOADING:
+ g_value_set_boolean (value, nautilus_window_slot_get_loading (slot));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -692,196 +697,58 @@ nautilus_window_slot_init (NautilusWindowSlot *slot)
#define MAX_URI_IN_DIALOG_LENGTH 60
static void begin_location_change (NautilusWindowSlot *slot,
- GFile *location,
- GFile *previous_location,
- GList *new_selection,
- NautilusLocationChangeType type,
- guint distance,
- const char *scroll_pos,
- NautilusWindowGoToCallback callback,
- gpointer user_data);
+ GFile *location,
+ GFile *previous_location,
+ GList *new_selection,
+ NautilusLocationChangeType type,
+ guint distance,
+ const char *scroll_pos);
static void free_location_change (NautilusWindowSlot *slot);
static void end_location_change (NautilusWindowSlot *slot);
static void cancel_location_change (NautilusWindowSlot *slot);
static void got_file_info_for_view_selection_callback (NautilusFile *file,
gpointer callback_data);
-static gboolean setup_view (NautilusWindowSlot *slot,
- NautilusView *view,
- GError **error);
+static gboolean setup_view (NautilusWindowSlot *slot,
+ NautilusView *view);
static void load_new_location (NautilusWindowSlot *slot,
GFile *location,
GList *selection,
gboolean tell_current_content_view,
gboolean tell_new_content_view);
-static void
-new_window_show_callback (GtkWidget *widget,
- gpointer user_data){
- NautilusWindow *window;
-
- window = NAUTILUS_WINDOW (user_data);
- nautilus_window_close (window);
-
- g_signal_handlers_disconnect_by_func (widget,
- G_CALLBACK (new_window_show_callback),
- user_data);
-}
-
void
-nautilus_window_slot_open_location_full (NautilusWindowSlot *slot,
- GFile *location,
- NautilusWindowOpenFlags flags,
- GList *new_selection,
- NautilusWindowGoToCallback callback,
- gpointer user_data)
+nautilus_window_slot_open_location_full (NautilusWindowSlot *slot,
+ GFile *location,
+ NautilusWindowOpenFlags flags,
+ GList *new_selection)
{
- NautilusWindow *window;
- NautilusWindow *target_window;
- NautilusWindowSlot *target_slot;
- NautilusWindowOpenFlags slot_flags;
GFile *old_location;
GList *old_selection;
- char *old_uri, *new_uri;
- int new_slot_position;
- gboolean use_same;
- gboolean is_desktop;
-
- window = nautilus_window_slot_get_window (slot);
-
- target_window = NULL;
- target_slot = NULL;
- use_same = TRUE;
-
- /* this happens at startup */
- old_uri = nautilus_window_slot_get_location_uri (slot);
- if (old_uri == NULL) {
- old_uri = g_strdup ("(none)");
- use_same = TRUE;
- }
- new_uri = g_file_get_uri (location);
-
- DEBUG ("Opening location, old: %s, new: %s", old_uri, new_uri);
- nautilus_profile_start ("Opening location, old: %s, new: %s", old_uri, new_uri);
-
- g_free (old_uri);
- g_free (new_uri);
-
- is_desktop = NAUTILUS_IS_DESKTOP_WINDOW (window);
-
- if (is_desktop) {
- use_same = !nautilus_desktop_window_loaded (NAUTILUS_DESKTOP_WINDOW (window));
-
- /* if we're requested to open a new tab on the desktop, open a window
- * instead.
- */
- if (flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB) {
- flags ^= NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB;
- flags |= NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW;
- }
- }
-
- g_assert (!((flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW) != 0 &&
- (flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB) != 0));
-
- /* and if the flags specify so, this is overridden */
- if ((flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW) != 0) {
- use_same = FALSE;
- }
-
- old_location = nautilus_window_slot_get_location (slot);
-
- /* now get/create the window */
- if (use_same) {
- target_window = window;
- } else {
- target_window = nautilus_application_create_window
- (NAUTILUS_APPLICATION (g_application_get_default ()),
- gtk_window_get_screen (GTK_WINDOW (window)));
- }
-
- g_assert (target_window != NULL);
-
- /* if the flags say we want a new tab, open a slot in the current window */
- if ((flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB) != 0) {
- g_assert (target_window == window);
-
- slot_flags = 0;
-
- new_slot_position = g_settings_get_enum (nautilus_preferences, NAUTILUS_PREFERENCES_NEW_TAB_POSITION);
- if (new_slot_position == NAUTILUS_NEW_TAB_POSITION_END) {
- slot_flags = NAUTILUS_WINDOW_OPEN_SLOT_APPEND;
- }
-
- target_slot = nautilus_window_open_slot (window,
- slot_flags);
- }
-
- /* close the current window if the flags say so */
- if ((flags & NAUTILUS_WINDOW_OPEN_FLAG_CLOSE_BEHIND) != 0) {
- if (!is_desktop) {
- if (gtk_widget_get_visible (GTK_WIDGET (target_window))) {
- nautilus_window_close (window);
- } else {
- g_signal_connect_object (target_window,
- "show",
- G_CALLBACK (new_window_show_callback),
- window,
- G_CONNECT_AFTER);
- }
- }
- }
-
- if (target_slot == NULL) {
- if (target_window == window) {
- target_slot = slot;
- } else {
- target_slot = nautilus_window_get_active_slot (target_window);
- }
- }
+ NautilusWindow *window;
+ gboolean is_desktop;
old_selection = NULL;
+ old_location = nautilus_window_slot_get_location (slot);
+ window = nautilus_window_slot_get_window (slot);
+ is_desktop = NAUTILUS_IS_DESKTOP_CANVAS_VIEW (window);
+
if (slot->details->content_view) {
old_selection = nautilus_view_get_selection (slot->details->content_view);
}
-
- if (target_window == window && target_slot == slot && !is_desktop &&
- old_location && g_file_equal (old_location, location) &&
- nautilus_file_selection_equal (old_selection, new_selection)) {
-
- if (callback != NULL) {
- callback (window, location, NULL, user_data);
- }
-
- goto done;
- }
+ if (!is_desktop &&
+ old_location && g_file_equal (old_location, location) &&
+ nautilus_file_selection_equal (old_selection, new_selection))
+ goto done;
slot->details->pending_use_default_location = ((flags & NAUTILUS_WINDOW_OPEN_FLAG_USE_DEFAULT_LOCATION) != 0);
- begin_location_change (target_slot, location, old_location, new_selection,
- NAUTILUS_LOCATION_CHANGE_STANDARD, 0, NULL, callback, user_data);
+ begin_location_change (slot, location, old_location, new_selection,
+ NAUTILUS_LOCATION_CHANGE_STANDARD, 0, NULL);
done:
nautilus_file_list_free (old_selection);
nautilus_profile_end (NULL);
}
-static gboolean
-report_callback (NautilusWindowSlot *slot,
- GError *error)
-{
- if (slot->details->open_callback != NULL) {
- gboolean res;
- res = slot->details->open_callback (nautilus_window_slot_get_window (slot),
- slot->details->pending_location,
- error, slot->details->open_callback_user_data);
- slot->details->open_callback = NULL;
- slot->details->open_callback_user_data = NULL;
-
- return res;
- }
-
- return FALSE;
-}
-
/*
* begin_location_change
*
@@ -894,22 +761,18 @@ report_callback (NautilusWindowSlot *slot,
* @distance: If type is back or forward, the index into the back or forward chain. If
* type is standard or reload, this is ignored, and must be 0.
* @scroll_pos: The file to scroll to when the location is loaded.
- * @callback: function to be called when the location is changed.
- * @user_data: data for @callback.
*
* This is the core function for changing the location of a window. Every change to the
* location begins here.
*/
static void
-begin_location_change (NautilusWindowSlot *slot,
- GFile *location,
- GFile *previous_location,
- GList *new_selection,
- NautilusLocationChangeType type,
- guint distance,
- const char *scroll_pos,
- NautilusWindowGoToCallback callback,
- gpointer user_data)
+begin_location_change (NautilusWindowSlot *slot,
+ GFile *location,
+ GFile *previous_location,
+ GList *new_selection,
+ NautilusLocationChangeType type,
+ guint distance,
+ const char *scroll_pos)
{
NautilusDirectory *directory;
NautilusFile *file;
@@ -971,9 +834,6 @@ begin_location_change (NautilusWindowSlot *slot,
slot->details->pending_scroll_to = g_strdup (scroll_pos);
- slot->details->open_callback = callback;
- slot->details->open_callback_user_data = user_data;
-
/* The code to force a reload is here because if we do it
* after determining an initial view (in the components), then
* we end up fetching things twice.
@@ -1101,7 +961,7 @@ viewed_file_changed_callback (NautilusFile *file,
go_to_file = g_file_new_for_path (g_get_home_dir ());
}
- nautilus_window_slot_open_location (slot, go_to_file, 0);
+ nautilus_window_slot_open_location_full (slot, go_to_file, 0, NULL);
g_clear_object (&parent);
g_object_unref (go_to_file);
@@ -1115,6 +975,19 @@ viewed_file_changed_callback (NautilusFile *file,
}
static void
+nautilus_window_slot_go_home (NautilusWindowSlot *slot,
+ NautilusWindowOpenFlags flags)
+{
+ GFile *home;
+
+ g_return_if_fail (NAUTILUS_IS_WINDOW_SLOT (slot));
+
+ home = g_file_new_for_path (g_get_home_dir ());
+ nautilus_window_slot_open_location_full (slot, home, flags, NULL);
+ g_object_unref (home);
+}
+
+static void
nautilus_window_slot_set_viewed_file (NautilusWindowSlot *slot,
NautilusFile *file)
{
@@ -1197,6 +1070,73 @@ mount_not_mounted_callback (GObject *source_object,
}
static void
+nautilus_window_slot_display_view_selection_failure (NautilusWindow *window,
+ NautilusFile *file,
+ GFile *location,
+ GError *error)
+{
+ char *error_message;
+ char *detail_message;
+ char *scheme_string;
+
+ /* Some sort of failure occurred. How 'bout we tell the user? */
+
+ error_message = g_strdup (_("Oops! Something went wrong."));
+ detail_message = NULL;
+ if (error == NULL) {
+ if (nautilus_file_is_directory (file)) {
+ detail_message = g_strdup (_("Unable to display the contents of this folder."));
+ } else {
+ detail_message = g_strdup (_("This location doesn't appear to be a folder."));
+ }
+ } else if (error->domain == G_IO_ERROR) {
+ switch (error->code) {
+ case G_IO_ERROR_NOT_FOUND:
+ detail_message = g_strdup (_("Unable to find the requested file. Please check the spelling and try again."));
+ break;
+ case G_IO_ERROR_NOT_SUPPORTED:
+ scheme_string = g_file_get_uri_scheme (location);
+ if (scheme_string != NULL) {
+ detail_message = g_strdup_printf (_("ā€œ%sā€ locations are not supported."),
+ scheme_string);
+ } else {
+ detail_message = g_strdup (_("Unable to handle this kind of location."));
+ }
+ g_free (scheme_string);
+ break;
+ case G_IO_ERROR_NOT_MOUNTED:
+ detail_message = g_strdup (_("Unable to access the requested location."));
+ break;
+ case G_IO_ERROR_PERMISSION_DENIED:
+ detail_message = g_strdup (_("Don't have permission to access the requested location."));
+ break;
+ case G_IO_ERROR_HOST_NOT_FOUND:
+ /* This case can be hit for user-typed strings like "foo" due to
+ * the code that guesses web addresses when there's no initial "/".
+ * But this case is also hit for legitimate web addresses when
+ * the proxy is set up wrong.
+ */
+ detail_message = g_strdup (_("Unable to find the requested location. Please check the spelling or the network settings."));
+ break;
+ case G_IO_ERROR_CANCELLED:
+ case G_IO_ERROR_FAILED_HANDLED:
+ goto done;
+ default:
+ break;
+ }
+ }
+
+ if (detail_message == NULL) {
+ detail_message = g_strdup_printf (_("Unhandled error message: %s"), error->message);
+ }
+
+ eel_show_error_dialog (error_message, detail_message, GTK_WINDOW (window));
+ done:
+ g_free (error_message);
+ g_free (detail_message);
+}
+
+static void
got_file_info_for_view_selection_callback (NautilusFile *file,
gpointer callback_data)
{
@@ -1309,23 +1249,16 @@ got_file_info_for_view_selection_callback (NautilusFile *file,
}
if (view != NULL) {
- GError *err = NULL;
-
- setup_view (slot, view, &err);
-
- report_callback (slot, err);
- g_clear_error (&err);
+ setup_view (slot, view);
} else {
if (error == NULL) {
error = g_error_new (G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
_("Unable to load location"));
}
- if (!report_callback (slot, error)) {
- nautilus_window_slot_display_view_selection_failure (window,
- file,
- location,
- error);
- }
+ nautilus_window_slot_display_view_selection_failure (window,
+ file,
+ location,
+ error);
if (!gtk_widget_get_visible (GTK_WIDGET (window))) {
/* Destroy never-had-a-chance-to-be-seen window. This case
@@ -1348,7 +1281,7 @@ got_file_info_for_view_selection_callback (NautilusFile *file,
root = g_file_new_for_path ("/");
/* the last fallback is to go to a known place that can't be deleted! */
- nautilus_window_slot_open_location (slot, location, 0);
+ nautilus_window_slot_open_location_full (slot, location, 0, NULL);
g_object_unref (root);
}
} else {
@@ -1399,12 +1332,10 @@ got_file_info_for_view_selection_callback (NautilusFile *file,
* view, and the current location will be used.
*/
static gboolean
-setup_view (NautilusWindowSlot *slot,
- NautilusView *view,
- GError **error_out)
+setup_view (NautilusWindowSlot *slot,
+ NautilusView *view)
{
gboolean ret = TRUE;
- GError *error = NULL;
GFile *old_location;
nautilus_profile_start (NULL);
@@ -1440,20 +1371,14 @@ setup_view (NautilusWindowSlot *slot,
TRUE);
g_list_free_full (selection, g_object_unref);
} else {
- /* Something is busted, there was no location to load. */
- ret = FALSE;
- error = g_error_new (G_IO_ERROR,
- G_IO_ERROR_NOT_FOUND,
- _("Unable to load location"));
- }
-
- if (error != NULL) {
- g_propagate_error (error_out, error);
- } else {
- change_view (slot);
- gtk_widget_show (GTK_WIDGET (slot->details->window));
+ ret = FALSE;
+ goto out;
}
+ change_view (slot);
+ gtk_widget_show (GTK_WIDGET (slot->details->window));
+
+out:
nautilus_profile_end (NULL);
return ret;
@@ -1585,73 +1510,6 @@ cancel_location_change (NautilusWindowSlot *slot)
}
void
-nautilus_window_slot_display_view_selection_failure (NautilusWindow *window,
- NautilusFile *file,
- GFile *location,
- GError *error)
-{
- char *error_message;
- char *detail_message;
- char *scheme_string;
-
- /* Some sort of failure occurred. How 'bout we tell the user? */
-
- error_message = g_strdup (_("Oops! Something went wrong."));
- detail_message = NULL;
- if (error == NULL) {
- if (nautilus_file_is_directory (file)) {
- detail_message = g_strdup (_("Unable to display the contents of this folder."));
- } else {
- detail_message = g_strdup (_("This location doesn't appear to be a folder."));
- }
- } else if (error->domain == G_IO_ERROR) {
- switch (error->code) {
- case G_IO_ERROR_NOT_FOUND:
- detail_message = g_strdup (_("Unable to find the requested file. Please check the spelling and try again."));
- break;
- case G_IO_ERROR_NOT_SUPPORTED:
- scheme_string = g_file_get_uri_scheme (location);
- if (scheme_string != NULL) {
- detail_message = g_strdup_printf (_("ā€œ%sā€ locations are not supported."),
- scheme_string);
- } else {
- detail_message = g_strdup (_("Unable to handle this kind of location."));
- }
- g_free (scheme_string);
- break;
- case G_IO_ERROR_NOT_MOUNTED:
- detail_message = g_strdup (_("Unable to access the requested location."));
- break;
- case G_IO_ERROR_PERMISSION_DENIED:
- detail_message = g_strdup (_("Don't have permission to access the requested location."));
- break;
- case G_IO_ERROR_HOST_NOT_FOUND:
- /* This case can be hit for user-typed strings like "foo" due to
- * the code that guesses web addresses when there's no initial "/".
- * But this case is also hit for legitimate web addresses when
- * the proxy is set up wrong.
- */
- detail_message = g_strdup (_("Unable to find the requested location. Please check the spelling or the network settings."));
- break;
- case G_IO_ERROR_CANCELLED:
- case G_IO_ERROR_FAILED_HANDLED:
- goto done;
- default:
- break;
- }
- }
-
- if (detail_message == NULL) {
- detail_message = g_strdup_printf (_("Unhandled error message: %s"), error->message);
- }
-
- eel_show_error_dialog (error_message, detail_message, GTK_WINDOW (window));
- done:
- g_free (error_message);
- g_free (detail_message);
-}
-
-void
nautilus_window_slot_set_content_view (NautilusWindowSlot *slot,
const char *id)
{
@@ -1685,7 +1543,7 @@ nautilus_window_slot_set_content_view (NautilusWindowSlot *slot,
slot->details->location_change_type = NAUTILUS_LOCATION_CHANGE_RELOAD;
- if (!setup_view (slot, NAUTILUS_VIEW (view), NULL)) {
+ if (!setup_view (slot, NAUTILUS_VIEW (view))) {
/* Just load the homedir. */
nautilus_window_slot_go_home (slot, FALSE);
}
@@ -1722,7 +1580,7 @@ nautilus_window_back_or_forward (NautilusWindow *window,
location = nautilus_bookmark_get_location (bookmark);
if (flags != 0) {
- nautilus_window_slot_open_location (slot, location, flags);
+ nautilus_window_slot_open_location_full (slot, location, flags, NULL);
} else {
char *scroll_pos;
@@ -1733,8 +1591,7 @@ nautilus_window_back_or_forward (NautilusWindow *window,
location, old_location, NULL,
back ? NAUTILUS_LOCATION_CHANGE_BACK : NAUTILUS_LOCATION_CHANGE_FORWARD,
distance,
- scroll_pos,
- NULL, NULL);
+ scroll_pos);
g_free (scroll_pos);
}
@@ -1772,8 +1629,7 @@ nautilus_window_slot_force_reload (NautilusWindowSlot *slot)
}
begin_location_change
(slot, location, location, selection,
- NAUTILUS_LOCATION_CHANGE_RELOAD, 0, current_pos,
- NULL, NULL);
+ NAUTILUS_LOCATION_CHANGE_RELOAD, 0, current_pos);
g_free (current_pos);
g_object_unref (location);
g_list_free_full (selection, g_object_unref);
@@ -2152,6 +2008,8 @@ view_started_loading (NautilusWindowSlot *slot,
gtk_widget_grab_focus (GTK_WIDGET (slot->details->window));
gtk_widget_show (GTK_WIDGET (slot->details->window));
+
+ nautilus_window_slot_set_loading (slot, TRUE);
}
static void
@@ -2172,6 +2030,8 @@ view_ended_loading (NautilusWindowSlot *slot,
}
nautilus_window_slot_set_allow_stop (slot, FALSE);
+
+ nautilus_window_slot_set_loading (slot, FALSE);
}
static void
@@ -2466,6 +2326,7 @@ nautilus_window_slot_class_init (NautilusWindowSlotClass *klass)
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
+
signals[LOCATION_CHANGED] =
g_signal_new ("location-changed",
G_TYPE_FROM_CLASS (klass),
@@ -2483,6 +2344,12 @@ nautilus_window_slot_class_init (NautilusWindowSlotClass *klass)
"Whether the slot is the active slot of the window",
FALSE,
G_PARAM_READWRITE);
+ properties[PROP_LOADING] =
+ g_param_spec_boolean ("loading",
+ "Whether the slot loading",
+ "Whether the slot is loading a new location",
+ FALSE,
+ G_PARAM_READABLE);
properties[PROP_WINDOW] =
g_param_spec_object ("window",
@@ -2554,12 +2421,6 @@ nautilus_window_slot_set_window (NautilusWindowSlot *slot,
}
}
-NautilusView *
-nautilus_window_slot_get_view (NautilusWindowSlot *slot)
-{
- return slot->details->content_view;
-}
-
/* nautilus_window_slot_update_title:
*
* Re-calculate the slot title.
@@ -2624,20 +2485,6 @@ nautilus_window_slot_stop_loading (NautilusWindowSlot *slot)
cancel_location_change (slot);
}
-/* returns either the pending or the actual current uri */
-char *
-nautilus_window_slot_get_current_uri (NautilusWindowSlot *slot)
-{
- GFile *location;
-
- location = nautilus_window_slot_get_current_location (slot);
- if (location != NULL) {
- return g_file_get_uri (location);
- }
-
- return NULL;
-}
-
NautilusView*
nautilus_window_slot_get_current_view (NautilusWindowSlot *slot)
{
@@ -2650,44 +2497,6 @@ nautilus_window_slot_get_current_view (NautilusWindowSlot *slot)
return NULL;
}
-void
-nautilus_window_slot_go_home (NautilusWindowSlot *slot,
- NautilusWindowOpenFlags flags)
-{
- GFile *home;
-
- g_return_if_fail (NAUTILUS_IS_WINDOW_SLOT (slot));
-
- home = g_file_new_for_path (g_get_home_dir ());
- nautilus_window_slot_open_location (slot, home, flags);
- g_object_unref (home);
-}
-
-void
-nautilus_window_slot_go_up (NautilusWindowSlot *slot,
- NautilusWindowOpenFlags flags)
-{
- GFile *parent;
-
- if (slot->details->location == NULL) {
- return;
- }
-
- parent = g_file_get_parent (slot->details->location);
- if (parent == NULL) {
- return;
- }
-
- nautilus_window_slot_open_location (slot, parent, flags);
- g_object_unref (parent);
-}
-
-NautilusFile *
-nautilus_window_slot_get_file (NautilusWindowSlot *slot)
-{
- return slot->details->viewed_file;
-}
-
NautilusBookmark *
nautilus_window_slot_get_bookmark (NautilusWindowSlot *slot)
{
@@ -2764,3 +2573,22 @@ nautilus_window_slot_set_active (NautilusWindowSlot *slot,
g_object_notify_by_pspec (G_OBJECT (slot), properties[PROP_ACTIVE]);
}
}
+
+static void
+nautilus_window_slot_set_loading (NautilusWindowSlot *slot,
+ gboolean loading)
+{
+ g_return_if_fail (NAUTILUS_IS_WINDOW_SLOT (slot));
+
+ slot->details->loading = loading;
+
+ g_object_notify_by_pspec (G_OBJECT (slot), properties[PROP_LOADING]);
+}
+
+gboolean
+nautilus_window_slot_get_loading (NautilusWindowSlot *slot)
+{
+ g_return_val_if_fail (NAUTILUS_IS_WINDOW_SLOT (slot), FALSE);
+
+ return slot->details->loading;
+}
diff --git a/src/nautilus-window-slot.h b/src/nautilus-window-slot.h
index 238d9268e..14fa425df 100644
--- a/src/nautilus-window-slot.h
+++ b/src/nautilus-window-slot.h
@@ -72,31 +72,17 @@ NautilusWindow * nautilus_window_slot_get_window (NautilusWindowSlot *
void nautilus_window_slot_set_window (NautilusWindowSlot *slot,
NautilusWindow *window);
-/* convenience wrapper without selection and callback/user_data */
-#define nautilus_window_slot_open_location(slot, location, flags)\
- nautilus_window_slot_open_location_full(slot, location, flags, NULL, NULL, NULL)
-
-void nautilus_window_slot_open_location_full (NautilusWindowSlot *slot,
- GFile *location,
- NautilusWindowOpenFlags flags,
- GList *new_selection,
- NautilusWindowGoToCallback callback,
- gpointer user_data);
+void nautilus_window_slot_open_location_full (NautilusWindowSlot *slot,
+ GFile *location,
+ NautilusWindowOpenFlags flags,
+ GList *new_selection);
GFile * nautilus_window_slot_get_location (NautilusWindowSlot *slot);
-char * nautilus_window_slot_get_location_uri (NautilusWindowSlot *slot);
-NautilusFile * nautilus_window_slot_get_file (NautilusWindowSlot *slot);
NautilusBookmark *nautilus_window_slot_get_bookmark (NautilusWindowSlot *slot);
-NautilusView* nautilus_window_slot_get_view (NautilusWindowSlot *slot);
-
-NautilusView* nautilus_window_slot_get_current_view (NautilusWindowSlot *slot);
-char * nautilus_window_slot_get_current_uri (NautilusWindowSlot *slot);
GList * nautilus_window_slot_get_back_history (NautilusWindowSlot *slot);
GList * nautilus_window_slot_get_forward_history (NautilusWindowSlot *slot);
-void nautilus_window_slot_set_search_visible (NautilusWindowSlot *slot,
- gboolean visible);
gboolean nautilus_window_slot_get_allow_stop (NautilusWindowSlot *slot);
void nautilus_window_slot_set_allow_stop (NautilusWindowSlot *slot,
@@ -111,16 +97,6 @@ gboolean nautilus_window_slot_handle_event (NautilusWindowSlot *slot,
void nautilus_window_slot_queue_reload (NautilusWindowSlot *slot);
-void nautilus_window_slot_go_home (NautilusWindowSlot *slot,
- NautilusWindowOpenFlags flags);
-void nautilus_window_slot_go_up (NautilusWindowSlot *slot,
- NautilusWindowOpenFlags flags);
-
-void nautilus_window_slot_display_view_selection_failure (NautilusWindow *window,
- NautilusFile *file,
- GFile *location,
- GError *error);
-
GIcon* nautilus_window_slot_get_icon (NautilusWindowSlot *slot);
GtkWidget* nautilus_window_slot_get_view_widget (NautilusWindowSlot *slot);
@@ -129,5 +105,9 @@ gboolean nautilus_window_slot_get_active (NautilusWindowSlot *
void nautilus_window_slot_set_active (NautilusWindowSlot *slot,
gboolean active);
+gboolean nautilus_window_slot_get_loading (NautilusWindowSlot *slot);
+
+/* Only used by slot-dnd */
+NautilusView* nautilus_window_slot_get_current_view (NautilusWindowSlot *slot);
#endif /* NAUTILUS_WINDOW_SLOT_H */
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 50db396c9..23df900e4 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -82,6 +82,7 @@ static void mouse_forward_button_changed (gpointer callbac
static void use_extra_mouse_buttons_changed (gpointer callback_data);
static void nautilus_window_initialize_actions (NautilusWindow *window);
static GtkWidget * nautilus_window_ensure_location_entry (NautilusWindow *window);
+static void nautilus_window_report_location_change (NautilusWindow *window);
/* Sanity check: highest mouse button value I could find was 14. 5 is our
* lower threshold (well-documented to be the one of the button events for the
@@ -198,13 +199,14 @@ action_go_home (GSimpleAction *action,
gpointer user_data)
{
NautilusWindow *window;
- NautilusWindowSlot *slot;
+ GFile *home;
window = NAUTILUS_WINDOW (user_data);
- slot = nautilus_window_get_active_slot (window);
+ home = g_file_new_for_path (g_get_home_dir ());
- nautilus_window_slot_go_home (slot,
- nautilus_event_get_window_open_flags ());
+ nautilus_window_open_location_full (window, home, nautilus_event_get_window_open_flags (), NULL, NULL);
+
+ g_object_unref (home);
}
static void
@@ -246,7 +248,10 @@ action_up (GSimpleAction *action,
if (location != NULL) {
parent = g_file_get_parent (location);
if (parent != NULL)
- nautilus_window_slot_go_up (slot, nautilus_event_get_window_open_flags ());
+ nautilus_window_open_location_full (NAUTILUS_WINDOW (user_data),
+ parent,
+ nautilus_event_get_window_open_flags (),
+ NULL, NULL);
g_clear_object (&parent);
}
@@ -470,13 +475,59 @@ undo_manager_changed (NautilusWindow *window)
g_free (redo_description);
}
+static void
+on_location_changed (NautilusWindow *window)
+{
+
+ nautilus_window_report_location_change (window);
+ gtk_places_sidebar_set_location (GTK_PLACES_SIDEBAR (window->priv->places_sidebar),
+ nautilus_window_slot_get_location (nautilus_window_get_active_slot (window)));
+}
+
+static void
+on_slot_loading_changed (NautilusWindowSlot *slot,
+ GParamSpec *pspec,
+ NautilusWindow *window)
+{
+ if (nautilus_window_get_active_slot (window) == slot)
+ on_location_changed (window);
+}
+
void
-nautilus_window_go_to (NautilusWindow *window, GFile *location)
+nautilus_window_open_location_full (NautilusWindow *window,
+ GFile *location,
+ NautilusWindowOpenFlags flags,
+ GList *selection,
+ NautilusWindowSlot *target_slot)
{
- g_return_if_fail (NAUTILUS_IS_WINDOW (window));
+ NautilusWindowSlot *active_slot;
+ gboolean new_tab_at_end;
+
+ active_slot = nautilus_window_get_active_slot (window);
- nautilus_window_slot_open_location (nautilus_window_get_active_slot (window),
- location, 0);
+ /* Assert that we are not managing new windows */
+ g_assert (! (flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW));
+ /* if the flags say we want a new tab, open a slot in the current window */
+ if ((flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB) != 0) {
+ new_tab_at_end = g_settings_get_enum (nautilus_preferences, NAUTILUS_PREFERENCES_NEW_TAB_POSITION) == NAUTILUS_NEW_TAB_POSITION_END;
+ if (new_tab_at_end)
+ flags |= NAUTILUS_WINDOW_OPEN_SLOT_APPEND;
+
+ target_slot = nautilus_window_open_slot (window, flags);
+ }
+
+ if (target_slot == NULL) {
+ target_slot = active_slot;
+ }
+
+ /* Make the opened location the one active if we weren't ask for the
+ * oposite, since it's the most usual use case */
+ if (!(flags & NAUTILUS_WINDOW_OPEN_FLAG_DONT_MAKE_ACTIVE)) {
+ gtk_window_present (GTK_WINDOW (window));
+ nautilus_window_set_active_slot (window, target_slot);
+ }
+
+ nautilus_window_slot_open_location_full (target_slot, location, flags, selection);
}
static int
@@ -569,7 +620,7 @@ location_entry_location_changed_callback (GtkWidget *widget,
restore_focus_widget (window);
- nautilus_window_slot_open_location (window->priv->active_slot, location, 0);
+ nautilus_window_open_location_full (window, location, 0, NULL, NULL);
}
static void
@@ -593,6 +644,21 @@ notebook_switch_page_cb (GtkNotebook *notebook,
}
static void
+connect_slot (NautilusWindow *window,
+ NautilusWindowSlot *slot)
+{
+ g_signal_connect (slot, "notify::loading",
+ G_CALLBACK (on_slot_loading_changed), window);
+}
+
+static void
+disconnect_slot (NautilusWindow *window,
+ NautilusWindowSlot *slot)
+{
+ g_signal_handlers_disconnect_by_data (slot, window);
+}
+
+static void
close_slot (NautilusWindow *window,
NautilusWindowSlot *slot,
gboolean remove_from_notebook)
@@ -604,6 +670,8 @@ close_slot (NautilusWindow *window,
DEBUG ("Closing slot %p", slot);
+ disconnect_slot (window, slot);
+
window->priv->slots = g_list_remove (window->priv->slots, slot);
g_signal_emit (window, signals[SLOT_REMOVED], 0, slot);
@@ -621,13 +689,14 @@ close_slot (NautilusWindow *window,
NautilusWindowSlot *
nautilus_window_open_slot (NautilusWindow *window,
- NautilusWindowOpenSlotFlags flags)
+ NautilusWindowOpenFlags flags)
{
NautilusWindowSlot *slot;
g_assert (NAUTILUS_IS_WINDOW (window));
slot = nautilus_window_slot_new (window);
+ connect_slot (window, slot);
g_signal_handlers_block_by_func (window->priv->notebook,
G_CALLBACK (notebook_switch_page_cb),
@@ -652,22 +721,15 @@ void
nautilus_window_new_tab (NautilusWindow *window)
{
NautilusWindowSlot *current_slot;
- NautilusWindowSlot *new_slot;
NautilusWindowOpenFlags flags;
GFile *location;
- int new_slot_position;
char *scheme;
current_slot = nautilus_window_get_active_slot (window);
location = nautilus_window_slot_get_location (current_slot);
if (location != NULL) {
- flags = 0;
-
- new_slot_position = g_settings_get_enum (nautilus_preferences, NAUTILUS_PREFERENCES_NEW_TAB_POSITION);
- if (new_slot_position == NAUTILUS_NEW_TAB_POSITION_END) {
- flags = NAUTILUS_WINDOW_OPEN_SLOT_APPEND;
- }
+ flags = g_settings_get_enum (nautilus_preferences, NAUTILUS_PREFERENCES_NEW_TAB_POSITION);
scheme = g_file_get_uri_scheme (location);
if (strcmp (scheme, "x-nautilus-search") == 0) {
@@ -678,9 +740,8 @@ nautilus_window_new_tab (NautilusWindow *window)
g_free (scheme);
- new_slot = nautilus_window_open_slot (window, flags);
- nautilus_window_set_active_slot (window, new_slot);
- nautilus_window_slot_open_location (new_slot, location, 0);
+ flags |= NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB;
+ nautilus_window_open_location_full (window, location, flags, NULL, NULL);
g_object_unref (location);
}
}
@@ -845,34 +906,6 @@ setup_side_pane_width (NautilusWindow *window)
window->priv->side_pane_width);
}
-static void
-nautilus_window_location_opened (NautilusWindow *window,
- GFile *location,
- GError *error,
- gpointer user_data)
-{
- g_return_if_fail (NAUTILUS_IS_WINDOW (window));
-
- if (error) {
- NautilusFile *old_file;
- GFile *old_location;
-
- old_file = nautilus_window_slot_get_file (window->priv->active_slot);
- old_location = nautilus_file_get_location (old_file);
-
- gtk_places_sidebar_set_location (GTK_PLACES_SIDEBAR (window->priv->places_sidebar), old_location);
-
- g_warning ("error opening location: %s", error->message);
-
- nautilus_window_slot_display_view_selection_failure (window,
- old_file,
- location,
- error);
-
- g_object_unref (old_location);
- }
-}
-
/* Callback used when the places sidebar changes location; we need to change the displayed folder */
static void
open_location_cb (NautilusWindow *window,
@@ -896,12 +929,8 @@ open_location_cb (NautilusWindow *window,
break;
}
- nautilus_window_slot_open_location_full (window->priv->active_slot,
- location,
- flags,
- NULL,
- (NautilusWindowGoToCallback) nautilus_window_location_opened,
- NULL);
+ nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()),
+ location, flags, NULL, NULL, NULL);
}
/* Callback used when the places sidebar needs us to present an error message */
@@ -1023,21 +1052,6 @@ places_sidebar_drag_perform_drop_cb (GtkPlacesSidebar *sidebar,
g_list_free_full (source_uri_list, g_free);
}
-/* Callback for our own loading_uri signal. We update the sidebar's path. */
-static void
-window_loading_uri_cb (NautilusWindow *window,
- char *location,
- gpointer user_data)
-{
- if (window->priv->places_sidebar) {
- GFile *file;
-
- file = g_file_new_for_uri (location);
- gtk_places_sidebar_set_location (GTK_PLACES_SIDEBAR (window->priv->places_sidebar), file);
- g_object_unref (file);
- }
-}
-
/* Callback used in the "empty trash" menu item from the places sidebar */
static void
action_empty_trash (GSimpleAction *action,
@@ -1226,9 +1240,6 @@ nautilus_window_set_up_sidebar (NautilusWindow *window)
G_CALLBACK (places_sidebar_drag_perform_drop_cb), window);
g_signal_connect (window->priv->places_sidebar, "populate-popup",
G_CALLBACK (places_sidebar_populate_popup_cb), window);
-
- g_signal_connect (window, "loading-uri",
- G_CALLBACK (window_loading_uri_cb), window);
}
void
@@ -1502,9 +1513,8 @@ static void
on_notification_operation_open_clicked (GtkWidget *notification,
NautilusWindow *window)
{
- nautilus_window_slot_open_location (window->priv->active_slot,
- window->priv->folder_to_open,
- 0);
+ nautilus_window_open_location_full (window, window->priv->folder_to_open,
+ 0, NULL, NULL);
hide_notification_operation (window);
}
@@ -1576,7 +1586,7 @@ path_bar_location_changed_callback (GtkWidget *widget,
if (i >= 0) {
nautilus_window_back_or_forward (window, TRUE, i, 0);
} else {
- nautilus_window_slot_open_location (slot, location, 0);
+ nautilus_window_open_location_full (window, location, 0, NULL, NULL);
}
}
@@ -2164,12 +2174,15 @@ static void
nautilus_window_report_location_change (NautilusWindow *window)
{
NautilusWindowSlot *slot;
+ GFile *location;
gchar *uri;
slot = nautilus_window_get_active_slot (window);
- uri = nautilus_window_slot_get_current_uri (slot);
+ location = nautilus_window_slot_get_location (slot);
- if (uri != NULL) {
+ /* location can be null on creating for first time the slot */
+ if (location != NULL) {
+ uri = g_file_get_uri (location);
g_signal_emit (window, signals[LOADING_URI], 0, uri);
g_free (uri);
}
@@ -2182,8 +2195,6 @@ nautilus_window_set_active_slot (NautilusWindow *window, NautilusWindowSlot *new
g_assert (NAUTILUS_IS_WINDOW (window));
- DEBUG ("Setting new slot %p as active", new_slot);
-
if (new_slot) {
g_assert ((window == nautilus_window_slot_get_window (new_slot)));
}
@@ -2194,6 +2205,8 @@ nautilus_window_set_active_slot (NautilusWindow *window, NautilusWindowSlot *new
return;
}
+ DEBUG ("Setting new slot %p as active, old slot inactive %p", new_slot, old_slot);
+
/* make old slot inactive if it exists (may be NULL after init, for example) */
if (old_slot != NULL) {
/* inform slot & view */
@@ -2204,13 +2217,12 @@ nautilus_window_set_active_slot (NautilusWindow *window, NautilusWindowSlot *new
/* make new slot active, if it exists */
if (new_slot) {
- /* inform sidebar panels */
- nautilus_window_report_location_change (window);
-
nautilus_toolbar_set_active_slot (NAUTILUS_TOOLBAR (window->priv->toolbar), new_slot);
/* inform slot & view */
nautilus_window_slot_set_active (new_slot, TRUE);
+
+ on_location_changed (window);
}
}
diff --git a/src/nautilus-window.h b/src/nautilus-window.h
index 2bffe051e..4caa55da1 100644
--- a/src/nautilus-window.h
+++ b/src/nautilus-window.h
@@ -41,14 +41,11 @@ typedef enum {
NAUTILUS_WINDOW_OPEN_FLAG_CLOSE_BEHIND = 1 << 0,
NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW = 1 << 1,
NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB = 1 << 2,
- NAUTILUS_WINDOW_OPEN_FLAG_USE_DEFAULT_LOCATION = 1 << 3
+ NAUTILUS_WINDOW_OPEN_SLOT_APPEND = 1 << 3,
+ NAUTILUS_WINDOW_OPEN_FLAG_USE_DEFAULT_LOCATION = 1 << 4,
+ NAUTILUS_WINDOW_OPEN_FLAG_DONT_MAKE_ACTIVE = 1 << 5
} NautilusWindowOpenFlags;
-typedef enum {
- NAUTILUS_WINDOW_OPEN_SLOT_NONE = 0,
- NAUTILUS_WINDOW_OPEN_SLOT_APPEND = 1
-} NautilusWindowOpenSlotFlags;
-
typedef gboolean (* NautilusWindowGoToCallback) (NautilusWindow *window,
GFile *location,
GError *error,
@@ -105,16 +102,19 @@ GType nautilus_window_get_type (void);
NautilusWindow * nautilus_window_new (GdkScreen *screen);
void nautilus_window_close (NautilusWindow *window);
+void nautilus_window_open_location_full (NautilusWindow *window,
+ GFile *location,
+ NautilusWindowOpenFlags flags,
+ GList *selection,
+ NautilusWindowSlot *target_slot);
-void nautilus_window_go_to (NautilusWindow *window,
- GFile *location);
void nautilus_window_new_tab (NautilusWindow *window);
NautilusWindowSlot * nautilus_window_get_active_slot (NautilusWindow *window);
void nautilus_window_set_active_slot (NautilusWindow *window,
NautilusWindowSlot *slot);
GList * nautilus_window_get_slots (NautilusWindow *window);
NautilusWindowSlot * nautilus_window_open_slot (NautilusWindow *window,
- NautilusWindowOpenSlotFlags flags);
+ NautilusWindowOpenFlags flags);
void nautilus_window_slot_close (NautilusWindow *window,
NautilusWindowSlot *slot);