diff options
author | Přemysl Eric Janouch <p@janouch.name> | 2022-01-12 11:12:01 +0100 |
---|---|---|
committer | Přemysl Eric Janouch <p@janouch.name> | 2022-01-12 11:12:32 +0100 |
commit | 757bc9beaabb8470a0d6cf2628269dbf720fbf31 (patch) | |
tree | 53529bf9b7da06d6b9e6555f72b686839e37c135 | |
parent | f632510d2a8b96e25f529c9f408fa1bef9693557 (diff) | |
download | fiv-757bc9beaabb8470a0d6cf2628269dbf720fbf31.tar.gz fiv-757bc9beaabb8470a0d6cf2628269dbf720fbf31.tar.xz fiv-757bc9beaabb8470a0d6cf2628269dbf720fbf31.zip |
Fully support GNOME's inode/directory mechanism
-rw-r--r-- | fiv-browser.c | 32 | ||||
-rw-r--r-- | fiv-browser.h | 1 | ||||
-rw-r--r-- | fiv.c | 5 |
3 files changed, 27 insertions, 11 deletions
diff --git a/fiv-browser.c b/fiv-browser.c index 9566e10..354d3b2 100644 --- a/fiv-browser.c +++ b/fiv-browser.c @@ -1550,12 +1550,9 @@ on_model_files_changed(FivIoModel *model, FivBrowser *self) { g_return_if_fail(model == self->model); - int selected = -1; gchar *selected_uri = NULL; - if (self->selected) { + if (self->selected) selected_uri = g_strdup(self->selected->uri); - self->selected = NULL; - } // TODO(p): Later implement arguments. thumbnailers_abort(self); @@ -1566,16 +1563,12 @@ on_model_files_changed(FivIoModel *model, FivBrowser *self) for (guint i = 0; i < files->len; i++) { g_array_append_val(self->entries, ((Entry) {.thumbnail = NULL, .uri = files->pdata[i]})); - if (!g_strcmp0(selected_uri, files->pdata[i])) - selected = i; files->pdata[i] = NULL; } g_ptr_array_free(files, TRUE); - // Beware that the pointer may shift with the storage. + fiv_browser_select(self, selected_uri); g_free(selected_uri); - if (selected >= 0) - self->selected = &g_array_index(self->entries, Entry, selected); reload_thumbnails(self); thumbnailers_start(self); @@ -1594,3 +1587,24 @@ fiv_browser_new(FivIoModel *model) on_model_files_changed(self->model, self); return GTK_WIDGET(self); } + +void +fiv_browser_select(FivBrowser *self, const char *uri) +{ + g_return_if_fail(FIV_IS_BROWSER(self)); + + self->selected = NULL; + gtk_widget_queue_draw(GTK_WIDGET(self)); + if (!uri) + return; + + for (guint i = 0; i < self->entries->len; i++) { + const Entry *entry = &g_array_index(self->entries, Entry, i); + if (!g_strcmp0(entry->uri, uri)) { + self->selected = entry; + break; + } + } + + // TODO(p): Scroll to selection. +} diff --git a/fiv-browser.h b/fiv-browser.h index 6a1a5c4..0a93721 100644 --- a/fiv-browser.h +++ b/fiv-browser.h @@ -25,3 +25,4 @@ G_DECLARE_FINAL_TYPE(FivBrowser, fiv_browser, FIV, BROWSER, GtkWidget) GtkWidget *fiv_browser_new(FivIoModel *model); +void fiv_browser_select(FivBrowser *self, const char *uri); @@ -880,11 +880,12 @@ open_any_file(GFile *file, gboolean force_browser) } else if (type == G_FILE_TYPE_DIRECTORY) { load_directory(uri); } else if (force_browser) { - // GNOME, e.g., invokes this as a hint to focus the particular file, - // which we can't currently do yet. + // GNOME, e.g., invokes this as a hint to focus the particular file. gchar *parent = parent_uri(file); load_directory(parent); g_free(parent); + + fiv_browser_select(FIV_BROWSER(g.browser), uri); } else { open(uri); } |