From 09146ca4fc0c504e75f39be16eefb29ddec5a8e9 Mon Sep 17 00:00:00 2001 From: 20kdc Date: Wed, 5 Sep 2018 20:40:10 +0100 Subject: [PATCH] Add 'Configurable' interface and add support to caja-file-management-properties --- libcaja-extension/Makefile.am | 2 + libcaja-extension/caja-configurable.c | 88 +++++++++++++++++++++++++++ libcaja-extension/caja-configurable.h | 68 +++++++++++++++++++++ src/caja-file-management-properties.c | 63 ++++++++++++++++++- 4 files changed, 218 insertions(+), 3 deletions(-) create mode 100644 libcaja-extension/caja-configurable.c create mode 100644 libcaja-extension/caja-configurable.h diff --git a/libcaja-extension/Makefile.am b/libcaja-extension/Makefile.am index 03b24d820..269c08c2c 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 000000000..ca5c11a8a --- /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 + * Based on caja-menu-provider.c by Dave Camp + * + */ + +#include +#include "caja-configurable.h" + +#include + +/** + * 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 000000000..3343b9400 --- /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 + * Based on caja-menu-provider.h by Dave Camp + * + */ + +/* 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 +#include +#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 0568f360f..29039add4 100644 --- a/src/caja-file-management-properties.c +++ b/src/caja-file-management-properties.c @@ -43,6 +43,8 @@ #include +#include + /* 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 @@ other_type_combo_box_changed (GtkComboBox *combo_box, GtkComboBox *action_combo_ } 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; @@ -667,6 +691,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) { @@ -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