Compare commits

..

No commits in common. "cce2b6ba51addf1b28088174708a3c09a7f81329" and "00fa76cb69d8c03b039a532edecb6fcb2c97af1d" have entirely different histories.

102
fiv.c
View File

@ -700,28 +700,49 @@ update_files_index(void)
} }
static void static void
change_directory_without_reload(const char *uri) load_directory_without_reload(const char *uri)
{ {
if (g.directory) { gchar *uri_duplicated = g_strdup(uri);
// Note that this function can be passed g.directory directly. if (g.directory_back && !strcmp(uri, g.directory_back->data)) {
if (!strcmp(uri, g.directory)) // We're going back in history.
return; if (g.directory) {
g.directory_forward =
g_list_prepend(g.directory_forward, g.directory);
g.directory = NULL;
}
GList *link = g.directory_back;
g.directory_back = g_list_remove_link(g.directory_back, link);
g_list_free_full(link, g_free);
} else if (g.directory_forward && !strcmp(uri, g.directory_forward->data)) {
// We're going forward in history.
if (g.directory) {
g.directory_back =
g_list_prepend(g.directory_back, g.directory);
g.directory = NULL;
}
GList *link = g.directory_forward;
g.directory_forward = g_list_remove_link(g.directory_forward, link);
g_list_free_full(link, g_free);
} else if (g.directory && strcmp(uri, g.directory)) {
// We're on a new subpath. // We're on a new subpath.
g_list_free_full(g.directory_forward, g_free); g_list_free_full(g.directory_forward, g_free);
g.directory_forward = NULL; g.directory_forward = NULL;
g.directory_back = g_list_prepend(g.directory_back, g.directory); g.directory_back = g_list_prepend(g.directory_back, g.directory);
g.directory = NULL;
} }
g.directory = g_strdup(uri); g_free(g.directory);
g.directory = uri_duplicated;
} }
static void static void
load_directory_without_switching(const char *uri) load_directory_without_switching(const char *uri)
{ {
if (uri) { if (uri) {
change_directory_without_reload(uri); load_directory_without_reload(uri);
GtkAdjustment *vadjustment = gtk_scrolled_window_get_vadjustment( GtkAdjustment *vadjustment = gtk_scrolled_window_get_vadjustment(
GTK_SCROLLED_WINDOW(g.browser_scroller)); GTK_SCROLLED_WINDOW(g.browser_scroller));
@ -747,6 +768,9 @@ load_directory(const char *uri)
{ {
load_directory_without_switching(uri); load_directory_without_switching(uri);
// XXX: When something outside the filtered entries is open, the index is
// kept at -1, and browsing doesn't work. How to behave here?
// Should we add it to the pointer array as an exception?
if (uri) { if (uri) {
switch_to_browser_noselect(); switch_to_browser_noselect();
@ -755,46 +779,6 @@ load_directory(const char *uri)
} }
} }
static void
go_back(void)
{
if (gtk_stack_get_visible_child(GTK_STACK(g.stack)) == g.view_box) {
switch_to_browser_noselect();
} else if (g.directory_back) {
if (g.directory)
g.directory_forward =
g_list_prepend(g.directory_forward, g.directory);
const gchar *uri = g.directory = g.directory_back->data;
GList *link = g.directory_back;
g.directory_back = g_list_remove_link(g.directory_back, link);
g_list_free(link);
load_directory(uri);
}
}
static void
go_forward(void)
{
if (g.directory_forward) {
if (g.directory)
g.directory_back =
g_list_prepend(g.directory_back, g.directory);
const gchar *uri = g.directory = g.directory_forward->data;
GList *link = g.directory_forward;
g.directory_forward = g_list_remove_link(g.directory_forward, link);
g_list_free(link);
load_directory(uri);
} else if (g.uri) {
switch_to_view();
}
}
static void static void
on_model_files_changed(FivIoModel *model, G_GNUC_UNUSED gpointer user_data) on_model_files_changed(FivIoModel *model, G_GNUC_UNUSED gpointer user_data)
{ {
@ -893,10 +877,6 @@ open_image(const char *uri)
update_files_index(); update_files_index();
g_free(parent); g_free(parent);
// XXX: When something outside currently filtered entries is open,
// g.files_index is kept at -1, and browsing doesn't work.
// How to behave here?
switch_to_view(); switch_to_view();
} }
@ -1419,10 +1399,16 @@ on_key_press(G_GNUC_UNUSED GtkWidget *widget, GdkEventKey *event,
case GDK_MOD1_MASK: case GDK_MOD1_MASK:
switch (event->keyval) { switch (event->keyval) {
case GDK_KEY_Left: case GDK_KEY_Left:
go_back(); if (gtk_stack_get_visible_child(GTK_STACK(g.stack)) == g.view_box)
switch_to_browser_noselect();
else if (g.directory_back)
load_directory(g.directory_back->data);
return TRUE; return TRUE;
case GDK_KEY_Right: case GDK_KEY_Right:
go_forward(); if (g.directory_forward)
load_directory(g.directory_forward->data);
else if (g.uri)
switch_to_view();
return TRUE; return TRUE;
} }
break; break;
@ -1584,7 +1570,7 @@ on_button_press_view(G_GNUC_UNUSED GtkWidget *widget, GdkEventButton *event)
switch (event->button) { switch (event->button) {
case 4: // back (GdkWin32, GdkQuartz) case 4: // back (GdkWin32, GdkQuartz)
case 8: // back case 8: // back
go_back(); switch_to_browser_noselect();
return TRUE; return TRUE;
case GDK_BUTTON_PRIMARY: case GDK_BUTTON_PRIMARY:
if (event->type == GDK_2BUTTON_PRESS) { if (event->type == GDK_2BUTTON_PRESS) {
@ -1606,11 +1592,15 @@ on_button_press_browser_paned(
switch (event->button) { switch (event->button) {
case 4: // back (GdkWin32, GdkQuartz) case 4: // back (GdkWin32, GdkQuartz)
case 8: // back case 8: // back
go_back(); if (g.directory_back)
load_directory(g.directory_back->data);
return TRUE; return TRUE;
case 5: // forward (GdkWin32, GdkQuartz) case 5: // forward (GdkWin32, GdkQuartz)
case 9: // forward case 9: // forward
go_forward(); if (g.directory_forward)
load_directory(g.directory_forward->data);
else if (g.uri)
switch_to_view();
return TRUE; return TRUE;
default: default:
return FALSE; return FALSE;