summaryrefslogtreecommitdiff
path: root/matecomponent/panel-module/mate-panel-applets-manager-matecomponent.c
diff options
context:
space:
mode:
Diffstat (limited to 'matecomponent/panel-module/mate-panel-applets-manager-matecomponent.c')
-rw-r--r--matecomponent/panel-module/mate-panel-applets-manager-matecomponent.c250
1 files changed, 250 insertions, 0 deletions
diff --git a/matecomponent/panel-module/mate-panel-applets-manager-matecomponent.c b/matecomponent/panel-module/mate-panel-applets-manager-matecomponent.c
new file mode 100644
index 00000000..3a0187a8
--- /dev/null
+++ b/matecomponent/panel-module/mate-panel-applets-manager-matecomponent.c
@@ -0,0 +1,250 @@
+/*
+ * mate-panel-applets-manager-matecomponent.c
+ *
+ * Copyright (C) 2010 Vincent Untz <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#include <config.h>
+
+#include <string.h>
+#include <libmatecomponent.h>
+
+#include <mate-panel-applets-manager.h>
+
+#include "mate-panel-applet-frame-matecomponent.h"
+
+#include "mate-panel-applets-manager-matecomponent.h"
+
+G_DEFINE_DYNAMIC_TYPE (MatePanelAppletsManagerMateComponent, mate_panel_applets_manager_matecomponent, PANEL_TYPE_APPLETS_MANAGER);
+
+struct _MatePanelAppletsManagerMateComponentPrivate
+{
+ GHashTable *applets;
+};
+
+static const char applet_requirements [] =
+ "has_all (repo_ids, ['IDL:MateComponent/Control:1.0',"
+ " 'IDL:MATE/Vertigo/MatePanelAppletShell:1.0']) && "
+ "defined (panel:icon)";
+
+static char *applet_sort_criteria [] = {
+ "name",
+ NULL
+ };
+
+static void
+mate_panel_applets_manager_matecomponent_load_applet_infos (MatePanelAppletsManagerMateComponent *manager)
+{
+ MateComponent_ServerInfoList *applet_list;
+ CORBA_Environment env;
+ const char * const *langs;
+ GSList *langs_gslist;
+ int i;
+
+ CORBA_exception_init (&env);
+
+ applet_list = matecomponent_activation_query (applet_requirements,
+ applet_sort_criteria,
+ &env);
+ if (MATECOMPONENT_EX (&env)) {
+ g_warning ("MateComponent query returned exception %s\n",
+ MATECOMPONENT_EX_REPOID (&env));
+
+ CORBA_exception_free (&env);
+ CORBA_free (applet_list);
+
+ return;
+ }
+
+ CORBA_exception_free (&env);
+
+ langs = g_get_language_names ();
+
+ langs_gslist = NULL;
+ for (i = 0; langs[i]; i++)
+ langs_gslist = g_slist_prepend (langs_gslist, (char *) langs[i]);
+
+ langs_gslist = g_slist_reverse (langs_gslist);
+
+ for (i = 0; i < applet_list->_length; i++) {
+ MateComponent_ServerInfo *info;
+ const char *name, *description, *icon;
+ MatePanelAppletInfo *applet_info;
+
+ info = &applet_list->_buffer[i];
+
+ name = matecomponent_server_info_prop_lookup (info,
+ "name",
+ langs_gslist);
+ description = matecomponent_server_info_prop_lookup (info,
+ "description",
+ langs_gslist);
+ icon = matecomponent_server_info_prop_lookup (info,
+ "panel:icon",
+ NULL);
+
+ applet_info = mate_panel_applet_info_new (info->iid, name, description, icon, NULL);
+
+ g_hash_table_insert (manager->priv->applets, g_strdup (info->iid), applet_info);
+ }
+
+ g_slist_free (langs_gslist);
+ CORBA_free (applet_list);
+}
+
+static GList *
+mate_panel_applets_manager_matecomponent_get_applets (MatePanelAppletsManager *manager)
+{
+ MatePanelAppletsManagerMateComponent *matecomponent_manager = MATE_PANEL_APPLETS_MANAGER_MATECOMPONENT (manager);
+
+ GHashTableIter iter;
+ gpointer key, value;
+ GList *retval = NULL;
+
+ g_hash_table_iter_init (&iter, matecomponent_manager->priv->applets);
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ retval = g_list_prepend (retval, value);
+
+ return g_list_reverse (retval);;
+}
+
+static gboolean
+mate_panel_applets_manager_matecomponent_factory_activate (MatePanelAppletsManager *manager,
+ const gchar *iid)
+{
+ MatePanelAppletsManagerMateComponent *matecomponent_manager = MATE_PANEL_APPLETS_MANAGER_MATECOMPONENT (manager);
+ MatePanelAppletInfo *info;
+
+ /* we let matecomponent deal with that, but we need to return the right value */
+
+ info = g_hash_table_lookup (matecomponent_manager->priv->applets, iid);
+
+ return (info != NULL);
+}
+
+static gboolean
+mate_panel_applets_manager_matecomponent_factory_deactivate (MatePanelAppletsManager *manager,
+ const gchar *iid)
+{
+ MatePanelAppletsManagerMateComponent *matecomponent_manager = MATE_PANEL_APPLETS_MANAGER_MATECOMPONENT (manager);
+ MatePanelAppletInfo *info;
+
+ /* we let matecomponent deal with that, but we need to return the right value */
+
+ info = g_hash_table_lookup (matecomponent_manager->priv->applets, iid);
+
+ return (info != NULL);
+}
+
+static MatePanelAppletInfo *
+mate_panel_applets_manager_matecomponent_get_applet_info (MatePanelAppletsManager *manager,
+ const gchar *iid)
+{
+ MatePanelAppletsManagerMateComponent *matecomponent_manager = MATE_PANEL_APPLETS_MANAGER_MATECOMPONENT (manager);
+
+ return g_hash_table_lookup (matecomponent_manager->priv->applets, iid);
+}
+
+static MatePanelAppletInfo *
+mate_panel_applets_manager_matecomponent_get_applet_info_from_old_id (MatePanelAppletsManager *manager,
+ const gchar *iid)
+{
+ MatePanelAppletsManagerMateComponent *matecomponent_manager = MATE_PANEL_APPLETS_MANAGER_MATECOMPONENT (manager);
+
+ return g_hash_table_lookup (matecomponent_manager->priv->applets, iid);
+}
+
+static gboolean
+mate_panel_applets_manager_matecomponent_load_applet (MatePanelAppletsManager *manager,
+ const gchar *iid,
+ MatePanelAppletFrameActivating *frame_act)
+{
+ return mate_panel_applet_frame_matecomponent_load (iid, frame_act);
+}
+
+static void
+mate_panel_applets_manager_matecomponent_finalize (GObject *object)
+{
+ MatePanelAppletsManagerMateComponent *manager = MATE_PANEL_APPLETS_MANAGER_MATECOMPONENT (object);
+
+ if (manager->priv->applets) {
+ g_hash_table_destroy (manager->priv->applets);
+ manager->priv->applets = NULL;
+ }
+
+ G_OBJECT_CLASS (mate_panel_applets_manager_matecomponent_parent_class)->finalize (object);
+}
+
+static void
+mate_panel_applets_manager_matecomponent_init (MatePanelAppletsManagerMateComponent *manager)
+{
+ manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager,
+ PANEL_TYPE_APPLETS_MANAGER_MATECOMPONENT,
+ MatePanelAppletsManagerMateComponentPrivate);
+
+ manager->priv->applets = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) mate_panel_applet_info_free);
+
+ mate_panel_applets_manager_matecomponent_load_applet_infos (manager);
+}
+
+static void
+mate_panel_applets_manager_matecomponent_class_finalize (MatePanelAppletsManagerMateComponentClass *class)
+{
+}
+
+static void
+mate_panel_applets_manager_matecomponent_class_init (MatePanelAppletsManagerMateComponentClass *class)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+ MatePanelAppletsManagerClass *manager_class = MATE_PANEL_APPLETS_MANAGER_CLASS (class);
+
+ /* This is a horrible hack: we shouldn't call matecomponent_init() here, but
+ * in g_io_module_load() or even
+ * mate_panel_applets_manager_matecomponent_register(). However, it looks like if
+ * there's no giomodule.cache file, the module gets unloaded, and
+ * matecomponent_init() gets called twice, which makes everythings goes wrong:
+ * matecomponent has been unloaded so believes it has to get initialized, but
+ * the types are already registered in the GType system. And bam. */
+
+ matecomponent_init (NULL, NULL);
+
+ gobject_class->finalize = mate_panel_applets_manager_matecomponent_finalize;
+
+ manager_class->get_applets = mate_panel_applets_manager_matecomponent_get_applets;
+ manager_class->factory_activate = mate_panel_applets_manager_matecomponent_factory_activate;
+ manager_class->factory_deactivate = mate_panel_applets_manager_matecomponent_factory_deactivate;
+ manager_class->get_applet_info = mate_panel_applets_manager_matecomponent_get_applet_info;
+ manager_class->get_applet_info_from_old_id = mate_panel_applets_manager_matecomponent_get_applet_info_from_old_id;
+ manager_class->load_applet = mate_panel_applets_manager_matecomponent_load_applet;
+
+ g_type_class_add_private (class, sizeof (MatePanelAppletsManagerMateComponentPrivate));
+}
+
+
+void
+mate_panel_applets_manager_matecomponent_register (GIOModule *module)
+{
+ mate_panel_applets_manager_matecomponent_register_type (G_TYPE_MODULE (module));
+ g_io_extension_point_implement (MATE_PANEL_APPLETS_MANAGER_EXTENSION_POINT_NAME,
+ PANEL_TYPE_APPLETS_MANAGER_MATECOMPONENT,
+ "matecomponent",
+ 10);
+}