Compare commits

...

4 Commits

Author SHA1 Message Date
8b1a14decb
Bind double click to full screen toggle 2021-11-21 21:22:14 +01:00
d0fb24bf6b
Use GDK button constants 2021-11-21 21:22:14 +01:00
2571bf15a9
Resolve key binding conflict
Toggle fullscreen vs. toggle scale to fit.
2021-11-21 21:07:51 +01:00
1c57eef05a
Sort files in the browser as well 2021-11-21 21:07:51 +01:00
6 changed files with 61 additions and 29 deletions

View File

@ -614,7 +614,7 @@ fastiv_browser_button_press_event(GtkWidget *widget, GdkEventButton *event)
FastivBrowser *self = FASTIV_BROWSER(widget); FastivBrowser *self = FASTIV_BROWSER(widget);
if (event->type != GDK_BUTTON_PRESS || event->state != 0) if (event->type != GDK_BUTTON_PRESS || event->state != 0)
return FALSE; return FALSE;
if (event->button == 1) if (event->button == GDK_BUTTON_PRIMARY)
gtk_widget_grab_focus(widget); gtk_widget_grab_focus(widget);
const Entry *entry = entry_at(self, event->x, event->y); const Entry *entry = entry_at(self, event->x, event->y);
@ -622,11 +622,11 @@ fastiv_browser_button_press_event(GtkWidget *widget, GdkEventButton *event)
return FALSE; return FALSE;
switch (event->button) { switch (event->button) {
case 1: case GDK_BUTTON_PRIMARY:
g_signal_emit(widget, browser_signals[ITEM_ACTIVATED], 0, g_signal_emit(widget, browser_signals[ITEM_ACTIVATED], 0,
entry->filename, GTK_PLACES_OPEN_NORMAL); entry->filename, GTK_PLACES_OPEN_NORMAL);
return TRUE; return TRUE;
case 2: case GDK_BUTTON_MIDDLE:
g_signal_emit(widget, browser_signals[ITEM_ACTIVATED], 0, g_signal_emit(widget, browser_signals[ITEM_ACTIVATED], 0,
entry->filename, GTK_PLACES_OPEN_NEW_WINDOW); entry->filename, GTK_PLACES_OPEN_NEW_WINDOW);
return TRUE; return TRUE;
@ -768,6 +768,19 @@ fastiv_browser_init(FastivBrowser *self)
// --- Public interface -------------------------------------------------------- // --- Public interface --------------------------------------------------------
static gint
entry_compare(gconstpointer a, gconstpointer b)
{
const Entry *entry1 = a;
const Entry *entry2 = b;
GFile *location1 = g_file_new_for_path(entry1->filename);
GFile *location2 = g_file_new_for_path(entry2->filename);
gint result = fastiv_io_filecmp(location1, location2);
g_object_unref(location1);
g_object_unref(location2);
return result;
}
void void
fastiv_browser_load( fastiv_browser_load(
FastivBrowser *self, FastivBrowserFilterCallback cb, const char *path) FastivBrowser *self, FastivBrowserFilterCallback cb, const char *path)
@ -791,8 +804,6 @@ fastiv_browser_load(
break; break;
if (g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY) if (g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY)
continue; continue;
// TODO(p): Support being passed a sort function.
if (cb && !cb(g_file_info_get_name(info))) if (cb && !cb(g_file_info_get_name(info)))
continue; continue;
@ -801,6 +812,8 @@ fastiv_browser_load(
} }
g_object_unref(enumerator); g_object_unref(enumerator);
// TODO(p): Sort the entries before. // TODO(p): Support being passed a sort function.
g_array_sort(self->entries, entry_compare);
reload_thumbnails(self); reload_thumbnails(self);
} }

View File

@ -1048,3 +1048,19 @@ fastiv_io_lookup_thumbnail(const gchar *target, FastivIoThumbnailSize size)
g_free(uri); g_free(uri);
return result; return result;
} }
int
fastiv_io_filecmp(GFile *location1, GFile *location2)
{
if (g_file_has_prefix(location1, location2))
return +1;
if (g_file_has_prefix(location2, location1))
return -1;
gchar *name1 = g_file_get_parse_name(location1);
gchar *name2 = g_file_get_parse_name(location2);
int result = g_utf8_collate(name1, name2);
g_free(name1);
g_free(name2);
return result;
}

View File

@ -57,3 +57,5 @@ cairo_surface_t *fastiv_io_open_from_data(
const char *data, size_t len, const gchar *path, GError **error); const char *data, size_t len, const gchar *path, GError **error);
cairo_surface_t *fastiv_io_lookup_thumbnail( cairo_surface_t *fastiv_io_lookup_thumbnail(
const gchar *target, FastivIoThumbnailSize size); const gchar *target, FastivIoThumbnailSize size);
int fastiv_io_filecmp(GFile *f1, GFile *f2);

View File

@ -17,6 +17,7 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "fastiv-io.h" // fastiv_io_filecmp
#include "fastiv-sidebar.h" #include "fastiv-sidebar.h"
struct _FastivSidebar { struct _FastivSidebar {
@ -107,24 +108,12 @@ create_row(GFile *file, const char *icon_name)
} }
static gint static gint
listbox_sort( listbox_compare(
GtkListBoxRow *row1, GtkListBoxRow *row2, G_GNUC_UNUSED gpointer user_data) GtkListBoxRow *row1, GtkListBoxRow *row2, G_GNUC_UNUSED gpointer user_data)
{ {
GFile *location1 = return fastiv_io_filecmp(
g_object_get_qdata(G_OBJECT(row1), fastiv_sidebar_location_quark()); g_object_get_qdata(G_OBJECT(row1), fastiv_sidebar_location_quark()),
GFile *location2 = g_object_get_qdata(G_OBJECT(row2), fastiv_sidebar_location_quark()));
g_object_get_qdata(G_OBJECT(row2), fastiv_sidebar_location_quark());
if (g_file_has_prefix(location1, location2))
return +1;
if (g_file_has_prefix(location2, location1))
return -1;
gchar *name1 = g_file_get_parse_name(location1);
gchar *name2 = g_file_get_parse_name(location2);
gint result = g_utf8_collate(name1, name2);
g_free(name1);
g_free(name2);
return result;
} }
static void static void
@ -371,7 +360,7 @@ fastiv_sidebar_init(FastivSidebar *self)
g_signal_connect(self->listbox, "row-activated", g_signal_connect(self->listbox, "row-activated",
G_CALLBACK(on_open_breadcrumb), self); G_CALLBACK(on_open_breadcrumb), self);
gtk_list_box_set_sort_func( gtk_list_box_set_sort_func(
GTK_LIST_BOX(self->listbox), listbox_sort, self, NULL); GTK_LIST_BOX(self->listbox), listbox_compare, self, NULL);
// Fill up what would otherwise be wasted space, // Fill up what would otherwise be wasted space,
// as it is in the examples of Nautilus and Thunar. // as it is in the examples of Nautilus and Thunar.

View File

@ -331,7 +331,7 @@ fastiv_view_key_press_event(GtkWidget *widget, GdkEventKey *event)
return set_scale(self, self->scale * SCALE_STEP); return set_scale(self, self->scale * SCALE_STEP);
case GDK_KEY_minus: case GDK_KEY_minus:
return set_scale(self, self->scale / SCALE_STEP); return set_scale(self, self->scale / SCALE_STEP);
case GDK_KEY_f: case GDK_KEY_F:
return set_scale_to_fit(self, !self->scale_to_fit); return set_scale_to_fit(self, !self->scale_to_fit);
} }
return FALSE; return FALSE;

View File

@ -355,6 +355,16 @@ on_notify_thumbnail_size(
gtk_widget_set_sensitive(g.minus, size > FASTIV_IO_THUMBNAIL_SIZE_MIN); gtk_widget_set_sensitive(g.minus, size > FASTIV_IO_THUMBNAIL_SIZE_MIN);
} }
static void
toggle_fullscreen(void)
{
if (gdk_window_get_state(gtk_widget_get_window(g.window)) &
GDK_WINDOW_STATE_FULLSCREEN)
gtk_window_unfullscreen(GTK_WINDOW(g.window));
else
gtk_window_fullscreen(GTK_WINDOW(g.window));
}
// Cursor keys, e.g., simply cannot be bound through accelerators // Cursor keys, e.g., simply cannot be bound through accelerators
// (and GtkWidget::keynav-failed would arguably be an awful solution). // (and GtkWidget::keynav-failed would arguably be an awful solution).
// //
@ -410,11 +420,7 @@ on_key_press(G_GNUC_UNUSED GtkWidget *widget, GdkEventKey *event,
case GDK_KEY_F11: case GDK_KEY_F11:
case GDK_KEY_f: case GDK_KEY_f:
if (gdk_window_get_state(gtk_widget_get_window(g.window)) & toggle_fullscreen();
GDK_WINDOW_STATE_FULLSCREEN)
gtk_window_unfullscreen(GTK_WINDOW(g.window));
else
gtk_window_fullscreen(GTK_WINDOW(g.window));
return TRUE; return TRUE;
} }
} }
@ -459,6 +465,12 @@ on_button_press_view(G_GNUC_UNUSED GtkWidget *widget, GdkEventButton *event)
case 8: // back case 8: // back
gtk_stack_set_visible_child(GTK_STACK(g.stack), g.browser_paned); gtk_stack_set_visible_child(GTK_STACK(g.stack), g.browser_paned);
return TRUE; return TRUE;
case GDK_BUTTON_PRIMARY:
if (event->type == GDK_2BUTTON_PRESS) {
toggle_fullscreen();
return TRUE;
}
return FALSE;
default: default:
return FALSE; return FALSE;
} }