browser: provide access to the current view

This is relevant for plug-ins.
This commit is contained in:
Pierre Pronchery 2024-06-02 21:50:48 +02:00
parent 1d5a8595f1
commit 82c579e945
10 changed files with 173 additions and 74 deletions

View File

@ -27,6 +27,7 @@
#ifndef DESKTOP_BROWSER_H
# define DESKTOP_BROWSER_H
# include "Browser/browser.h"
# include "Browser/desktop.h"
# include "Browser/plugin.h"
# include "Browser/vfs.h"

54
include/Browser/browser.h Normal file
View File

@ -0,0 +1,54 @@
/* $Id$ */
/* Copyright (c) 2024 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Browser */
/* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY ITS AUTHORS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
#ifndef BROWSER_BROWSER_BROWSER_H
# define BROWSER_BROWSER_BROWSER_H
# include <gtk/gtk.h>
/* Browser */
/* public */
/* types */
typedef enum _BrowserView
{
BROWSER_VIEW_DETAILS = 0,
# if GTK_CHECK_VERSION(2, 6, 0)
BROWSER_VIEW_ICONS,
BROWSER_VIEW_LIST,
BROWSER_VIEW_THUMBNAILS
# endif
} BrowserView;
# define BROWSER_VIEW_FIRST BROWSER_VIEW_DETAILS
# if GTK_CHECK_VERSION(2, 6, 0)
# define BROWSER_VIEW_LAST BROWSER_VIEW_DETAILS
# else
# define BROWSER_VIEW_LAST BROWSER_VIEW_THUMBNAILS
# endif
# define BROWSER_VIEW_COUNT (BROWSER_VIEW_LAST + 1)
#endif /* !BROWSER_BROWSER_BROWSER_H */

View File

@ -31,6 +31,7 @@
# include <sys/stat.h>
# include <gtk/gtk.h>
# include <Desktop.h>
# include "browser.h"
# include "vfs.h"
@ -44,19 +45,26 @@ typedef struct _BrowserPlugin BrowserPlugin;
typedef struct _BrowserPluginHelper
{
Browser * browser;
/* accessors */
GdkPixbuf * (*get_icon)(Browser * browser, char const * filename,
char const * type, struct stat * lst, struct stat * st,
int size);
int (*get_icon_size)(Browser * browser, BrowserView view);
Mime * (*get_mime)(Browser * browser);
char const * (*get_type)(Browser * browser, char const * filename,
mode_t mode);
BrowserView (*get_view)(Browser * browser);
int (*set_location)(Browser * browser, char const * path);
int (*error)(Browser * browser, char const * message, int ret);
void (*refresh)(Browser * browser);
/* Config */
char const * (*config_get)(Browser * browser, char const * section,
char const * variable);
int (*config_set)(Browser * browser, char const * section,
char const * variable, char const * value);
int (*error)(Browser * browser, char const * message, int ret);
GdkPixbuf * (*get_icon)(Browser * browser, char const * filename,
char const * type, struct stat * lst, struct stat * st,
int size);
Mime * (*get_mime)(Browser * browser);
char const * (*get_type)(Browser * browser, char const * filename,
mode_t mode);
void (*refresh)(Browser * browser);
int (*set_location)(Browser * browser, char const * path);
} BrowserPluginHelper;
typedef const struct _BrowserPluginDefinition

View File

@ -1,6 +1,9 @@
includes=desktop.h,plugin.h,vfs.h
includes=browser.h,desktop.h,plugin.h,vfs.h
dist=Makefile
[browser.h]
install=$(INCLUDEDIR)/Desktop/Browser
[desktop.h]
install=$(INCLUDEDIR)/Desktop/Browser

View File

@ -187,8 +187,8 @@ struct _Browser
GtkWidget * detailview;
#if GTK_CHECK_VERSION(2, 6, 0)
GtkWidget * iconview;
BrowserView view;
#endif
BrowserView view;
GtkListStore * store;
GtkWidget * statusbar;
guint statusbar_id;
@ -256,6 +256,7 @@ static gboolean _browser_plugin_is_enabled(Browser * browser,
static GdkPixbuf * _browser_get_icon(Browser * browser, char const * filename,
char const * type, struct stat * lst, struct stat * st,
int size);
static int _browser_get_icon_size(Browser * browser, BrowserView view);
static Mime * _browser_get_mime(Browser * browser);
static GList * _browser_get_selection(Browser * browser);
static char const * _browser_get_type(Browser * browser, char const * filename,
@ -320,7 +321,7 @@ Browser * browser_new(GtkWidget * window, GtkAccelGroup * group,
/* config */
/* set defaults */
#if GTK_CHECK_VERSION(2, 6, 0)
browser->prefs.default_view = BV_ICONS;
browser->prefs.default_view = BROWSER_VIEW_ICONS;
#endif
browser->prefs.alternate_rows = TRUE;
browser->prefs.confirm_before_delete = TRUE;
@ -353,8 +354,10 @@ Browser * browser_new(GtkWidget * window, GtkAccelGroup * group,
browser->pl_helper.config_set = _browser_config_set;
browser->pl_helper.error = browser_error;
browser->pl_helper.get_icon = _browser_get_icon;
browser->pl_helper.get_icon_size = _browser_get_icon_size;
browser->pl_helper.get_mime = _browser_get_mime;
browser->pl_helper.get_type = _browser_get_type;
browser->pl_helper.get_view = browser_get_view;
browser->pl_helper.refresh = browser_refresh;
browser->pl_helper.set_location = browser_set_location;
@ -517,13 +520,16 @@ Browser * browser_new(GtkWidget * window, GtkAccelGroup * group,
#if GTK_CHECK_VERSION(2, 6, 0)
browser->iconview = NULL;
browser->view = browser->prefs.default_view;
#else
browser->view = BROWSER_VIEW_DETAILS;
#endif
browser_set_view(browser, browser->view);
#if GTK_CHECK_VERSION(2, 6, 0)
if(browser->iconview != NULL)
gtk_widget_grab_focus(browser->iconview);
#else
browser_set_view(browser, BV_DETAILS);
gtk_widget_grab_focus(browser->detailview);
else
#endif
gtk_widget_grab_focus(browser->detailview);
/* preferences */
browser->pr_window = NULL;
@ -830,13 +836,13 @@ int browser_config_load(Browser * browser)
&& p != NULL)
{
if(strcmp(p, "details") == 0)
browser->prefs.default_view = BV_DETAILS;
browser->prefs.default_view = BROWSER_VIEW_DETAILS;
else if(strcmp(p, "icons") == 0)
browser->prefs.default_view = BV_ICONS;
browser->prefs.default_view = BROWSER_VIEW_ICONS;
else if(strcmp(p, "list") == 0)
browser->prefs.default_view = BV_LIST;
browser->prefs.default_view = BROWSER_VIEW_LIST;
else if(strcmp(p, "thumbnails") == 0)
browser->prefs.default_view = BV_THUMBNAILS;
browser->prefs.default_view = BROWSER_VIEW_THUMBNAILS;
string_delete(p);
}
#endif
@ -857,15 +863,16 @@ int browser_config_save(Browser * browser)
{
int ret = 0;
#if GTK_CHECK_VERSION(2, 6, 0)
char * str[BV_COUNT] = { "details", "icons", "list", "thumbnails" };
char * str[BROWSER_VIEW_COUNT] = { "details", "icons", "list",
"thumbnails" };
#endif
if(browser->config == NULL)
return 0; /* XXX ignore error */
#if GTK_CHECK_VERSION(2, 6, 0)
/* XXX deserves a rework (enum) */
if(browser->prefs.default_view >= BV_FIRST
&& browser->prefs.default_view <= BV_LAST)
if(browser->prefs.default_view >= BROWSER_VIEW_FIRST
&& browser->prefs.default_view <= BROWSER_VIEW_LAST)
ret |= config_set(browser->config, NULL, "default_view",
str[browser->prefs.default_view]);
#endif
@ -1783,7 +1790,7 @@ void browser_select_all(Browser * browser)
GtkTreeSelection * sel;
#if GTK_CHECK_VERSION(2, 6, 0)
if(browser_get_view(browser) != BV_DETAILS)
if(browser_get_view(browser) != BROWSER_VIEW_DETAILS)
{
gtk_icon_view_select_all(GTK_ICON_VIEW(browser->iconview));
return;
@ -1804,7 +1811,7 @@ GList * browser_selection_copy(Browser * browser)
char * q;
#if GTK_CHECK_VERSION(2, 6, 0)
if(browser_get_view(browser) != BV_DETAILS)
if(browser_get_view(browser) != BROWSER_VIEW_DETAILS)
sel = gtk_icon_view_get_selected_items(GTK_ICON_VIEW(
browser->iconview));
else
@ -2490,7 +2497,7 @@ void browser_unselect_all(Browser * browser)
GtkTreeSelection * sel;
#if GTK_CHECK_VERSION(2, 6, 0)
if(browser_get_view(browser) != BV_DETAILS)
if(browser_get_view(browser) != BROWSER_VIEW_DETAILS)
{
gtk_icon_view_unselect_all(GTK_ICON_VIEW(browser->iconview));
return;
@ -2578,6 +2585,26 @@ static GdkPixbuf * _browser_get_icon(Browser * browser, char const * filename,
}
/* browser_get_icon_size */
static int _browser_get_icon_size(Browser * browser, BrowserView view)
{
switch(view)
{
case BROWSER_VIEW_DETAILS:
return BROWSER_ICON_SIZE_SMALL_ICONS;
#if GTK_CHECK_VERSION(2, 6, 0)
case BROWSER_VIEW_ICONS:
return BROWSER_ICON_SIZE_ICONS;
case BROWSER_VIEW_LIST:
return BROWSER_ICON_SIZE_SMALL_ICONS;
case BROWSER_VIEW_THUMBNAILS:
return BROWSER_ICON_SIZE_THUMBNAILS;
#endif
}
return -1;
}
/* browser_get_mime */
static Mime * _browser_get_mime(Browser * browser)
{
@ -2593,7 +2620,7 @@ static GList * _browser_get_selection(Browser * browser)
if(browser->current == NULL)
return NULL;
#if GTK_CHECK_VERSION(2, 6, 0)
if(browser_get_view(browser) != BV_DETAILS)
if(browser_get_view(browser) != BROWSER_VIEW_DETAILS)
return gtk_icon_view_get_selected_items(GTK_ICON_VIEW(
browser->iconview));
#endif
@ -2772,22 +2799,22 @@ void browser_set_view(Browser * browser, BrowserView view)
#if GTK_CHECK_VERSION(2, 6, 0)
switch(view)
{
case BV_DETAILS:
case BROWSER_VIEW_DETAILS:
_view_details(browser);
break;
case BV_ICONS:
case BROWSER_VIEW_ICONS:
_view_icons(browser);
break;
case BV_LIST:
case BROWSER_VIEW_LIST:
_view_list(browser);
break;
case BV_THUMBNAILS:
case BROWSER_VIEW_THUMBNAILS:
_view_thumbnails(browser);
break;
}
# if GTK_CHECK_VERSION(3, 0, 0)
/* XXX necessary with Gtk+ 3 */
if(view != BV_DETAILS)
if(view != BROWSER_VIEW_DETAILS)
browser_refresh(browser);
# endif
#else
@ -2811,7 +2838,7 @@ static void _view_details(Browser * browser)
fprintf(stderr, "DEBUG: %s() %u\n", __func__, browser->view);
#endif
#if GTK_CHECK_VERSION(2, 6, 0)
if(browser->view != BV_DETAILS)
if(browser->view != BROWSER_VIEW_DETAILS)
{
sel = gtk_icon_view_get_selected_items(GTK_ICON_VIEW(
browser->iconview));
@ -2969,7 +2996,7 @@ static void _view_icons_view(Browser * browser)
# ifdef DEBUG
fprintf(stderr, "DEBUG: %s() %u\n", __func__, browser->view);
# endif
if(browser->view == BV_DETAILS)
if(browser->view == BROWSER_VIEW_DETAILS)
{
if((treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(
browser->detailview)))
@ -3216,7 +3243,7 @@ static gboolean _view_on_button_press(GtkWidget * widget,
/* FIXME error checking + sub-functions */
gtk_tree_model_get_iter(GTK_TREE_MODEL(browser->store), &iter, path);
#if GTK_CHECK_VERSION(2, 6, 0)
if(browser_get_view(browser) != BV_DETAILS)
if(browser_get_view(browser) != BROWSER_VIEW_DETAILS)
{
if(gtk_icon_view_path_is_selected(GTK_ICON_VIEW(
browser->iconview), path)
@ -3273,7 +3300,7 @@ static GtkTreePath * _view_on_button_press_path(Browser * browser,
if(event->button == 3)
{
#if GTK_CHECK_VERSION(2, 6, 0)
if(view != BV_DETAILS)
if(view != BROWSER_VIEW_DETAILS)
path = gtk_icon_view_get_path_at_pos(GTK_ICON_VIEW(
browser->iconview),
(int)event->x, (int)event->y);
@ -3289,7 +3316,7 @@ static GtkTreePath * _view_on_button_press_path(Browser * browser,
path = NULL;
/* FIXME only considers one selected item */
#if GTK_CHECK_VERSION(2, 6, 0)
if(view != BV_DETAILS)
if(view != BROWSER_VIEW_DETAILS)
gtk_icon_view_get_cursor(GTK_ICON_VIEW(
browser->iconview), &path,
NULL);
@ -3447,7 +3474,7 @@ static gboolean _view_on_button_press_show(Browser * browser, GdkEventButton * e
GtkWidget * menu)
{
#if GTK_CHECK_VERSION(2, 6, 0)
if(browser_get_view(browser) != BV_DETAILS)
if(browser_get_view(browser) != BROWSER_VIEW_DETAILS)
gtk_menu_attach_to_widget(GTK_MENU(menu), browser->iconview,
NULL);
else

View File

@ -49,23 +49,6 @@
/* types */
typedef enum _BrowserView
{
BV_DETAILS = 0,
# if GTK_CHECK_VERSION(2, 6, 0)
BV_ICONS,
BV_LIST,
BV_THUMBNAILS
} BrowserView;
# define BV_FIRST BV_DETAILS
# define BV_LAST BV_THUMBNAILS
# else
} BrowserView;
# define BV_FIRST BV_DETAILS
# define BV_LAST BV_DETAILS
# endif
# define BV_COUNT (BV_LAST + 1)
typedef struct _BrowserPrefs
{
# if GTK_CHECK_VERSION(2, 6, 0)

View File

@ -237,17 +237,17 @@ void on_view_as(gpointer data)
view = browser_get_view(browser);
switch(view)
{
case BV_DETAILS:
browser_set_view(browser, BV_ICONS);
case BROWSER_VIEW_DETAILS:
browser_set_view(browser, BROWSER_VIEW_ICONS);
break;
case BV_LIST:
browser_set_view(browser, BV_THUMBNAILS);
case BROWSER_VIEW_LIST:
browser_set_view(browser, BROWSER_VIEW_THUMBNAILS);
break;
case BV_ICONS:
browser_set_view(browser, BV_LIST);
case BROWSER_VIEW_ICONS:
browser_set_view(browser, BROWSER_VIEW_LIST);
break;
case BV_THUMBNAILS:
browser_set_view(browser, BV_DETAILS);
case BROWSER_VIEW_THUMBNAILS:
browser_set_view(browser, BROWSER_VIEW_DETAILS);
break;
}
}
@ -258,7 +258,7 @@ void on_view_details(gpointer data)
{
Browser * browser = data;
browser_set_view(browser, BV_DETAILS);
browser_set_view(browser, BROWSER_VIEW_DETAILS);
}
@ -267,7 +267,7 @@ void on_view_icons(gpointer data)
{
Browser * browser = data;
browser_set_view(browser, BV_ICONS);
browser_set_view(browser, BROWSER_VIEW_ICONS);
}
@ -276,7 +276,7 @@ void on_view_list(gpointer data)
{
Browser * browser = data;
browser_set_view(browser, BV_LIST);
browser_set_view(browser, BROWSER_VIEW_LIST);
}
@ -285,7 +285,7 @@ void on_view_thumbnails(gpointer data)
{
Browser * browser = data;
browser_set_view(browser, BV_THUMBNAILS);
browser_set_view(browser, BROWSER_VIEW_THUMBNAILS);
}
#endif

View File

@ -124,17 +124,17 @@ int main(int argc, char * argv[])
switch(o)
{
case 'D':
view = BV_DETAILS;
view = BROWSER_VIEW_DETAILS;
break;
#if GTK_CHECK_VERSION(2, 6, 0)
case 'I':
view = BV_ICONS;
view = BROWSER_VIEW_ICONS;
break;
case 'L':
view = BV_LIST;
view = BROWSER_VIEW_LIST;
break;
case 'T':
view = BV_THUMBNAILS;
view = BROWSER_VIEW_THUMBNAILS;
break;
#endif
default:

View File

@ -567,7 +567,7 @@ static void _browserwindow_on_view_details(gpointer data)
{
BrowserWindow * browser = data;
browser_set_view(browser->browser, BV_DETAILS);
browser_set_view(browser->browser, BROWSER_VIEW_DETAILS);
}
@ -576,7 +576,7 @@ static void _browserwindow_on_view_icons(gpointer data)
{
BrowserWindow * browser = data;
browser_set_view(browser->browser, BV_ICONS);
browser_set_view(browser->browser, BROWSER_VIEW_ICONS);
}
@ -585,7 +585,7 @@ static void _browserwindow_on_view_list(gpointer data)
{
BrowserWindow * browser = data;
browser_set_view(browser->browser, BV_LIST);
browser_set_view(browser->browser, BROWSER_VIEW_LIST);
}
@ -594,7 +594,7 @@ static void _browserwindow_on_view_thumbnails(gpointer data)
{
BrowserWindow * browser = data;
browser_set_view(browser->browser, BV_THUMBNAILS);
browser_set_view(browser->browser, BROWSER_VIEW_THUMBNAILS);
}
# endif /* GTK_CHECK_VERSION(2, 6, 0) */

View File

@ -101,9 +101,11 @@ static int _properties_config_set(Properties * properties, char const * section,
static GdkPixbuf * _properties_get_icon(Properties * properties,
char const * filename, char const * type, struct stat * lst,
struct stat * st, int size);
static int _properties_get_icon_size(Properties * properties, BrowserView view);
static Mime * _properties_get_mime(Properties * properties);
static char const * _properties_get_type(Properties * properties,
char const * filename, mode_t mode);
static BrowserView _properties_get_view(Properties * properties);
static int _properties_set_location(Properties * properties,
char const * filename);
@ -173,8 +175,10 @@ static Properties * _properties_new(Mime * mime, char const * plugin,
properties->helper.config_set = _properties_config_set;
properties->helper.error = _properties_error;
properties->helper.get_icon = _properties_get_icon;
properties->helper.get_icon_size = _properties_get_icon_size;
properties->helper.get_mime = _properties_get_mime;
properties->helper.get_type = _properties_get_type;
properties->helper.get_view = _properties_get_view;
properties->helper.set_location = _properties_helper_set_location;
properties->window = NULL;
if(properties->filename == NULL)
@ -325,6 +329,16 @@ static GdkPixbuf * _properties_get_icon(Properties * properties,
}
/* properties_get_icon_size */
static int _properties_get_icon_size(Properties * properties, BrowserView view)
{
(void) properties;
(void) view;
return BROWSER_ICON_SIZE_ICONS;
}
/* properties_get_mime */
static Mime * _properties_get_mime(Properties * properties)
{
@ -340,6 +354,15 @@ static char const * _properties_get_type(Properties * properties,
}
/* properties_get_view */
static BrowserView _properties_get_view(Properties * properties)
{
(void) properties;
return BROWSER_VIEW_DETAILS;
}
/* properties_set_location */
static int _properties_set_location(Properties * properties,
char const * filename)