summaryrefslogtreecommitdiff
path: root/capplet/matekbd-indicator-plugins-add.c
diff options
context:
space:
mode:
Diffstat (limited to 'capplet/matekbd-indicator-plugins-add.c')
-rw-r--r--capplet/matekbd-indicator-plugins-add.c207
1 files changed, 207 insertions, 0 deletions
diff --git a/capplet/matekbd-indicator-plugins-add.c b/capplet/matekbd-indicator-plugins-add.c
new file mode 100644
index 0000000..0b34251
--- /dev/null
+++ b/capplet/matekbd-indicator-plugins-add.c
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2006 Sergey V. Udaltsov <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+
+#include "matekbd-indicator-plugins-capplet.h"
+
+#include <string.h>
+#include <sys/stat.h>
+
+#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+#include <glib/gi18n.h>
+
+#include <libxklavier/xklavier.h>
+
+static void
+CappletAddAvailablePluginFunc (const char *fullPath,
+ MatekbdIndicatorPluginManagerRecord * rec,
+ MatekbdIndicatorPluginsCapplet * gipc)
+{
+ GtkListStore *availablePluginsModel;
+ GtkTreeIter iter;
+ const MatekbdIndicatorPlugin *plugin = rec->plugin;
+
+ if (NULL !=
+ g_slist_find_custom (gipc->applet_cfg.enabled_plugins,
+ fullPath, (GCompareFunc) strcmp))
+ return;
+
+ availablePluginsModel =
+ GTK_LIST_STORE (g_object_get_data (G_OBJECT (gipc->capplet),
+ "matekbd_indicator_plugins_add.availablePluginsModel"));
+ if (availablePluginsModel == NULL)
+ return;
+
+ if (plugin != NULL)
+ {
+ gtk_list_store_append (availablePluginsModel, &iter);
+ gtk_list_store_set (availablePluginsModel, &iter,
+ NAME_COLUMN, plugin->name,
+ FULLPATH_COLUMN, fullPath, -1);
+ }
+}
+
+static void
+CappletFillAvailablePluginList (GtkTreeView *
+ availablePluginsList,
+ MatekbdIndicatorPluginsCapplet * gipc)
+{
+ GtkListStore *availablePluginsModel =
+ GTK_LIST_STORE (gtk_tree_view_get_model
+ (GTK_TREE_VIEW (availablePluginsList)));
+ GSList *pluginPathNode = gipc->applet_cfg.enabled_plugins;
+ GHashTable *allPluginRecs = gipc->plugin_manager.all_plugin_recs;
+
+ gtk_list_store_clear (availablePluginsModel);
+ if (allPluginRecs == NULL)
+ return;
+
+ g_object_set_data (G_OBJECT (gipc->capplet),
+ "matekbd_indicator_plugins_add.availablePluginsModel",
+ availablePluginsModel);
+ g_hash_table_foreach (allPluginRecs,
+ (GHFunc) CappletAddAvailablePluginFunc, gipc);
+ g_object_set_data (G_OBJECT (gipc->capplet),
+ "matekbd_indicator_plugins_add.availablePluginsModel",
+ NULL);
+ pluginPathNode = g_slist_next (pluginPathNode);
+}
+
+static void
+CappletAvailablePluginsSelectionChanged (GtkTreeSelection *
+ selection,
+ MatekbdIndicatorPluginsCapplet * gipc)
+{
+ GtkWidget *availablePluginsList =
+ GTK_WIDGET (gtk_tree_selection_get_tree_view (selection));
+ gboolean isAnythingSelected = FALSE;
+ GtkWidget *lblDescription =
+ GTK_WIDGET (g_object_get_data (G_OBJECT (gipc->capplet),
+ "matekbd_indicator_plugins_add.lblDescription"));
+
+ char *fullPath =
+ CappletGetSelectedPluginPath (GTK_TREE_VIEW (availablePluginsList),
+ gipc);
+ isAnythingSelected = fullPath != NULL;
+ gtk_label_set_text (GTK_LABEL (lblDescription),
+ g_strconcat ("<small><i>",
+ _("No description."),
+ "</i></small>", NULL));
+ gtk_label_set_use_markup (GTK_LABEL (lblDescription), TRUE);
+
+ if (fullPath != NULL)
+ {
+ const MatekbdIndicatorPlugin *plugin =
+ matekbd_indicator_plugin_manager_get_plugin (&gipc->plugin_manager,
+ fullPath);
+ if (plugin != NULL && plugin->description != NULL)
+ gtk_label_set_text (GTK_LABEL (lblDescription),
+ g_strconcat ("<small><i>",
+ plugin->
+ description, "</i></small>", NULL));
+ gtk_label_set_use_markup (GTK_LABEL (lblDescription), TRUE);
+ }
+ gtk_widget_set_sensitive (GTK_WIDGET
+ (g_object_get_data
+ (G_OBJECT (gipc->capplet),
+ "matekbd_indicator_plugins_add.btnOK")),
+ isAnythingSelected);
+}
+
+void
+CappletEnablePlugin (GtkWidget * btnAdd, MatekbdIndicatorPluginsCapplet * gipc)
+{
+ /* default domain! */
+ GtkBuilder *builder;
+ GError *error = NULL;
+ GtkWidget *popup;
+ GtkWidget *availablePluginsList;
+ GtkTreeModel *availablePluginsModel;
+ GtkCellRenderer *renderer =
+ GTK_CELL_RENDERER (gtk_cell_renderer_text_new ());
+ GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes (NULL,
+ renderer,
+ "text",
+ 0,
+ NULL);
+ GtkTreeSelection *selection;
+ gint response;
+
+ builder = gtk_builder_new ();
+
+ if (!gtk_builder_add_from_file (builder,
+ UIDIR "/matekbd-indicator-plugins_add.ui",
+ &error)) {
+ g_warning ("Could not load builder file: %s", error->message);
+ g_error_free(error);
+ return;
+ }
+
+ popup = GTK_WIDGET (gtk_builder_get_object (builder,
+ "matekbd_indicator_plugins_add"));
+
+ availablePluginsList = GTK_WIDGET (gtk_builder_get_object (builder,
+ "allPlugins"));
+ availablePluginsModel =
+ GTK_TREE_MODEL (gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING));
+ gtk_tree_view_set_model (GTK_TREE_VIEW (availablePluginsList),
+ availablePluginsModel);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (availablePluginsList), column);
+ selection =
+ gtk_tree_view_get_selection (GTK_TREE_VIEW (availablePluginsList));
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
+ CappletFillAvailablePluginList (GTK_TREE_VIEW (availablePluginsList), gipc);
+ g_signal_connect (G_OBJECT (selection), "changed",
+ G_CALLBACK
+ (CappletAvailablePluginsSelectionChanged), gipc);
+ g_object_set_data (G_OBJECT (gipc->capplet),
+ "matekbd_indicator_plugins_add.btnOK",
+ GTK_WIDGET (gtk_builder_get_object (builder, "btnOK")));
+ g_object_set_data (G_OBJECT (gipc->capplet),
+ "matekbd_indicator_plugins_add.lblDescription",
+ GTK_WIDGET (gtk_builder_get_object (builder, "lblDescription")));
+ CappletAvailablePluginsSelectionChanged (selection, gipc);
+ response = gtk_dialog_run (GTK_DIALOG (popup));
+ g_object_set_data (G_OBJECT (gipc->capplet),
+ "matekbd_indicator_plugins_add.lblDescription", NULL);
+ g_object_set_data (G_OBJECT (gipc->capplet),
+ "matekbd_indicator_plugins_add.btnOK", NULL);
+ gtk_widget_hide_all (popup);
+ if (response == GTK_RESPONSE_OK)
+ {
+ char *fullPath =
+ CappletGetSelectedPluginPath (GTK_TREE_VIEW (availablePluginsList),
+ gipc);
+ if (fullPath != NULL)
+ {
+ matekbd_indicator_plugin_manager_enable_plugin (&gipc->
+ plugin_manager,
+ &gipc->
+ applet_cfg.
+ enabled_plugins,
+ fullPath);
+ CappletFillActivePluginList (gipc);
+ g_free (fullPath);
+ matekbd_indicator_config_save_to_mateconf (&gipc->applet_cfg);
+ }
+ }
+ gtk_widget_destroy (popup);
+}