diff options
| author | 20kdc <[email protected]> | 2018-09-05 20:40:10 +0100 | 
|---|---|---|
| committer | lukefromdc <[email protected]> | 2018-10-19 14:04:19 -0400 | 
| commit | 09146ca4fc0c504e75f39be16eefb29ddec5a8e9 (patch) | |
| tree | 01cc36e5957a3b53ade199405a4f5426fc780dec | |
| parent | adeaed26a97c887be5d727d6b1bff46b97ef7de2 (diff) | |
| download | caja-09146ca4fc0c504e75f39be16eefb29ddec5a8e9.tar.bz2 caja-09146ca4fc0c504e75f39be16eefb29ddec5a8e9.tar.xz  | |
Add 'Configurable' interface and add support to caja-file-management-properties
| -rw-r--r-- | libcaja-extension/Makefile.am | 2 | ||||
| -rw-r--r-- | libcaja-extension/caja-configurable.c | 88 | ||||
| -rw-r--r-- | libcaja-extension/caja-configurable.h | 68 | ||||
| -rw-r--r-- | src/caja-file-management-properties.c | 63 | 
4 files changed, 218 insertions, 3 deletions
diff --git a/libcaja-extension/Makefile.am b/libcaja-extension/Makefile.am index 03b24d82..269c08c2 100644 --- a/libcaja-extension/Makefile.am +++ b/libcaja-extension/Makefile.am @@ -34,6 +34,7 @@ libcaja_extension_include_HEADERS = \  	caja-property-page-provider.h \  	caja-property-page.h \  	caja-menu.h \ +	caja-configurable.h \  	$(NULL)  libcaja_extension_la_SOURCES = \ @@ -50,6 +51,7 @@ libcaja_extension_la_SOURCES = \  	caja-property-page-provider.c \  	caja-property-page.c \  	caja-menu.c \ +	caja-configurable.c \  	$(NULL)  pkgconfigdir=$(libdir)/pkgconfig diff --git a/libcaja-extension/caja-configurable.c b/libcaja-extension/caja-configurable.c new file mode 100644 index 00000000..ca5c11a8 --- /dev/null +++ b/libcaja-extension/caja-configurable.c @@ -0,0 +1,88 @@ +/* + *  caja-configurable.c - Interface for configuration + * + *  Copyright (C) 2003 Novell, Inc. + * + *  This library is free software; you can redistribute it and/or + *  modify it under the terms of the GNU Library General Public + *  License as published by the Free Software Foundation; either + *  version 2 of the License, or (at your option) any later version. + * + *  This library is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *  Library General Public License for more details. + * + *  You should have received a copy of the GNU Library General Public + *  License along with this library; if not, write to the Free + *  Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + * + *  Author: 20kdc <[email protected]> + *  Based on caja-menu-provider.c by Dave Camp <[email protected]> + * + */ + +#include <config.h> +#include "caja-configurable.h" + +#include <glib-object.h> + +/** + * SECTION:caja-configurable + * @title: CajaConfigurable + * @short_description: Interface to allow an extension to be configured + * @include: libcaja-extension/caja-configurable.h + * + * #CajaConfigurable allows an extension to show a configuration page. + * The presence of CajaConfigurable enables the 'Configure' button. + */ + +static void +caja_configurable_base_init (gpointer g_class) +{ +} + +GType +caja_configurable_get_type (void) +{ +    static GType type = 0; + +    if (!type) { +        const GTypeInfo info = { +            sizeof (CajaConfigurableIface), +            caja_configurable_base_init, +            NULL, +            NULL, +            NULL, +            NULL, +            0, +            0, +            NULL +        }; + +        type = g_type_register_static (G_TYPE_INTERFACE, +                                       "CajaConfigurable", +                                       &info, 0); +        g_type_interface_add_prerequisite (type, G_TYPE_OBJECT); +    } + +    return type; +} + +/** + * caja_configurable_run: + * @provider: a #CajaConfigurable + */ +void +caja_configurable_run_config (CajaConfigurable *provider) +{ +    if (!CAJA_IS_CONFIGURABLE(provider)) { +        return; +    } + +    if (CAJA_CONFIGURABLE_GET_IFACE (provider)->run_config) { +        CAJA_CONFIGURABLE_GET_IFACE (provider)->run_config(provider); +    } +} + + diff --git a/libcaja-extension/caja-configurable.h b/libcaja-extension/caja-configurable.h new file mode 100644 index 00000000..3343b940 --- /dev/null +++ b/libcaja-extension/caja-configurable.h @@ -0,0 +1,68 @@ +/* + *  caja-configurable.c - Interface for configuration + * + *  Copyright (C) 2003 Novell, Inc. + * + *  This library is free software; you can redistribute it and/or + *  modify it under the terms of the GNU Library General Public + *  License as published by the Free Software Foundation; either + *  version 2 of the License, or (at your option) any later version. + * + *  This library is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *  Library General Public License for more details. + * + *  You should have received a copy of the GNU Library General Public + *  License along with this library; if not, write to the Free + *  Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + * + *  Author: 20kdc <[email protected]> + *  Based on caja-menu-provider.h by Dave Camp <[email protected]> + * + */ + +/* This interface is implemented by Caja extensions that want to + * have configuration screens (this is particularly important for open-terminal) + */ + +#ifndef CAJA_CONFIGURABLE_H +#define CAJA_CONFIGURABLE_H + +#include <glib-object.h> +#include <gtk/gtk.h> +#include "caja-extension-types.h" +#include "caja-file-info.h" +#include "caja-menu.h" + +G_BEGIN_DECLS + +#define CAJA_TYPE_CONFIGURABLE           (caja_configurable_get_type ()) +#define CAJA_CONFIGURABLE(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), CAJA_TYPE_CONFIGURABLE, CajaConfigurable)) +#define CAJA_IS_CONFIGURABLE(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CAJA_TYPE_CONFIGURABLE)) +#define CAJA_CONFIGURABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), CAJA_TYPE_CONFIGURABLE, CajaConfigurableIface)) + +typedef struct _CajaConfigurable       CajaConfigurable; +typedef struct _CajaConfigurableIface  CajaConfigurableIface; + +/** + * CajaConfigurableIface: + * @g_iface: The parent interface. + * @run: Starts the configuration panel (should use g_dialog_run) + * + * Interface for extensions to provide additional menu items. + */ + +struct _CajaConfigurableIface { +    GTypeInterface g_iface; + +    void (*run_config) (CajaConfigurable *provider); +}; + +/* Interface Functions */ +GType caja_configurable_get_type   (void); +void  caja_configurable_run_config (CajaConfigurable *provider); + +G_END_DECLS + +#endif diff --git a/src/caja-file-management-properties.c b/src/caja-file-management-properties.c index 0568f360..29039add 100644 --- a/src/caja-file-management-properties.c +++ b/src/caja-file-management-properties.c @@ -43,6 +43,8 @@  #include <libcaja-private/caja-autorun.h> +#include <libcaja-extension/caja-configurable.h> +  /* string enum preferences */  #define CAJA_FILE_MANAGEMENT_PROPERTIES_DEFAULT_VIEW_WIDGET "default_view_combobox"  #define CAJA_FILE_MANAGEMENT_PROPERTIES_ICON_VIEW_ZOOM_WIDGET "icon_view_zoom_combobox" @@ -622,6 +624,7 @@ out:  }  static gulong extension_about_id = 0; +static gulong extension_configure_id = 0;  static void  extension_about_clicked (GtkButton *button, Extension *ext) @@ -642,8 +645,29 @@ extension_about_clicked (GtkButton *button, Extension *ext)      gtk_widget_destroy (GTK_WIDGET (extension_about_dialog));  } +static int extension_configure_check (Extension *ext) +{ +    if (!ext->state) // For now, only allow configuring enabled extensions. +    { +        return 0; +    } +    if (!CAJA_IS_CONFIGURABLE(ext->module)) +    { +        return 0; +    } +    return 1; +} +  static void -extension_list_selection_changed (GtkTreeSelection *selection, GtkButton *about_button) +extension_configure_clicked (GtkButton *button, Extension *ext) +{ +    if (extension_configure_check(ext)) { +        caja_configurable_run_config(CAJA_CONFIGURABLE(ext->module)); +    } +} + +static void +extension_list_selection_changed_about (GtkTreeSelection *selection, GtkButton *about_button)  {      GtkTreeModel *model;      GtkTreeIter iter; @@ -668,6 +692,34 @@ extension_list_selection_changed (GtkTreeSelection *selection, GtkButton *about_  }  static void +extension_list_selection_changed_configure (GtkTreeSelection *selection, GtkButton *configure_button) +{ +    GtkTreeModel *model; +    GtkTreeIter iter; +    Extension *ext; + +    gtk_widget_set_sensitive (GTK_WIDGET (configure_button), FALSE); + +    if (extension_configure_id > 0) +    { +        g_signal_handler_disconnect (configure_button, extension_configure_id); +        extension_configure_id = 0; +    } + +    if (!gtk_tree_selection_get_selected (selection, &model, &iter)) +        return; + +    gtk_tree_model_get (model, &iter, EXT_STRUCT_COLUMN, &ext, -1); +    if (ext != NULL) { +        // Unconfigurable extensions remain unconfigurable. +        if (extension_configure_check(ext)) { +            gtk_widget_set_sensitive (GTK_WIDGET (configure_button), TRUE); +            extension_configure_id = g_signal_connect (configure_button, "clicked", G_CALLBACK (extension_configure_clicked), ext); +        } +    } +} + +static void  extension_state_toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer data)  {  	GtkTreeIter iter; @@ -819,7 +871,7 @@ caja_file_management_properties_dialog_setup_extension_page (GtkBuilder *builder      GtkTreeIter iter;      GtkIconTheme *icon_theme;      GdkPixbuf *ext_pixbuf_icon; -    GtkButton *about_button; +    GtkButton *about_button, *configure_button;      gchar *ext_text_info;      GList *extensions; @@ -883,11 +935,16 @@ caja_file_management_properties_dialog_setup_extension_page (GtkBuilder *builder      }      about_button = GTK_BUTTON (gtk_builder_get_object (builder, "about_extension_button")); +    configure_button = GTK_BUTTON (gtk_builder_get_object (builder, "configure_extension_button")); +      selection = gtk_tree_view_get_selection (view);      gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);      g_signal_connect (selection, "changed", -                      G_CALLBACK (extension_list_selection_changed), +                      G_CALLBACK (extension_list_selection_changed_about),                        about_button); +    g_signal_connect (selection, "changed", +                      G_CALLBACK (extension_list_selection_changed_configure), +                      configure_button);  }  static void  | 
