1 /*
2 * panel-applets-manager.c
3 *
4 * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
5 * Copyright (C) 2010 Vincent Untz <vuntz@gnome.org>
6 * Copyright (C) 2012-2021 MATE Developers
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21 * 02110-1301, USA.
22 */
23
24 #include <config.h>
25
26 #include <gio/gio.h>
27
28 #include <libpanel-util/panel-cleanup.h>
29
30 #include "panel-modules.h"
31
32 #include "panel-applets-manager.h"
33
G_DEFINE_ABSTRACT_TYPE(MatePanelAppletsManager,mate_panel_applets_manager,G_TYPE_OBJECT)34 G_DEFINE_ABSTRACT_TYPE (MatePanelAppletsManager, mate_panel_applets_manager, G_TYPE_OBJECT)
35
36 static void
37 mate_panel_applets_manager_init (MatePanelAppletsManager *manager)
38 {
39 }
40
41 static void
mate_panel_applets_manager_class_init(MatePanelAppletsManagerClass * class)42 mate_panel_applets_manager_class_init (MatePanelAppletsManagerClass *class)
43 {
44 }
45
46 /* Generic methods */
47
48 static GSList *mate_panel_applets_managers = NULL;
49
50 static void
_mate_panel_applets_manager_cleanup(gpointer data)51 _mate_panel_applets_manager_cleanup (gpointer data)
52 {
53 g_slist_free_full (mate_panel_applets_managers, g_object_unref);
54 mate_panel_applets_managers = NULL;
55 }
56
57 static void
_mate_panel_applets_managers_ensure_loaded(void)58 _mate_panel_applets_managers_ensure_loaded (void)
59 {
60 GIOExtensionPoint *point;
61 GList *extensions, *l;
62
63 if (mate_panel_applets_managers != NULL)
64 return;
65
66 panel_cleanup_register (PANEL_CLEAN_FUNC (_mate_panel_applets_manager_cleanup), NULL);
67
68 panel_modules_ensure_loaded ();
69
70 point = g_io_extension_point_lookup (MATE_PANEL_APPLETS_MANAGER_EXTENSION_POINT_NAME);
71
72 extensions = g_io_extension_point_get_extensions (point);
73
74 if (extensions == NULL)
75 g_error ("No MatePanelAppletsManager implementations exist.");
76
77 for (l = extensions; l != NULL; l = l->next) {
78 GIOExtension *extension;
79 GType type;
80 GObject *object;
81
82 extension = l->data;
83 type = g_io_extension_get_type (extension);
84 object = g_object_new (type, NULL);
85 mate_panel_applets_managers = g_slist_prepend (mate_panel_applets_managers, object);
86 }
87
88 mate_panel_applets_managers = g_slist_reverse (mate_panel_applets_managers);
89 }
90
91 GList *
mate_panel_applets_manager_get_applets(void)92 mate_panel_applets_manager_get_applets (void)
93 {
94 GSList *l;
95 GList *retval = NULL;
96
97 _mate_panel_applets_managers_ensure_loaded ();
98
99 for (l = mate_panel_applets_managers; l != NULL; l = l->next) {
100 GList *applets;
101 MatePanelAppletsManager *manager = MATE_PANEL_APPLETS_MANAGER (l->data);
102
103 applets = MATE_PANEL_APPLETS_MANAGER_GET_CLASS (manager)->get_applets (manager);
104 if (applets)
105 retval = g_list_concat (retval, applets);
106 }
107
108 return retval;
109 }
110
111 gboolean
mate_panel_applets_manager_factory_activate(const gchar * iid)112 mate_panel_applets_manager_factory_activate (const gchar *iid)
113 {
114 GSList *l;
115
116 _mate_panel_applets_managers_ensure_loaded ();
117
118 for (l = mate_panel_applets_managers; l != NULL; l = l->next) {
119 MatePanelAppletsManager *manager = MATE_PANEL_APPLETS_MANAGER (l->data);
120
121 if (MATE_PANEL_APPLETS_MANAGER_GET_CLASS (manager)->factory_activate (manager, iid))
122 return TRUE;
123 }
124
125 return FALSE;
126 }
127
128 void
mate_panel_applets_manager_factory_deactivate(const gchar * iid)129 mate_panel_applets_manager_factory_deactivate (const gchar *iid)
130 {
131 GSList *l;
132
133 _mate_panel_applets_managers_ensure_loaded ();
134
135 for (l = mate_panel_applets_managers; l != NULL; l = l->next) {
136 MatePanelAppletsManager *manager = MATE_PANEL_APPLETS_MANAGER (l->data);
137
138 if (MATE_PANEL_APPLETS_MANAGER_GET_CLASS (manager)->factory_deactivate (manager, iid))
139 return;
140 }
141 }
142
143 MatePanelAppletInfo *
mate_panel_applets_manager_get_applet_info(const gchar * iid)144 mate_panel_applets_manager_get_applet_info (const gchar *iid)
145 {
146 GSList *l;
147 MatePanelAppletInfo *retval = NULL;
148
149 _mate_panel_applets_managers_ensure_loaded ();
150
151 for (l = mate_panel_applets_managers; l != NULL; l = l->next) {
152 MatePanelAppletsManager *manager = MATE_PANEL_APPLETS_MANAGER (l->data);
153
154 retval = MATE_PANEL_APPLETS_MANAGER_GET_CLASS (manager)->get_applet_info (manager, iid);
155
156 if (retval != NULL)
157 return retval;
158 }
159
160 return NULL;
161 }
162
163 MatePanelAppletInfo *
mate_panel_applets_manager_get_applet_info_from_old_id(const gchar * iid)164 mate_panel_applets_manager_get_applet_info_from_old_id (const gchar *iid)
165 {
166 GSList *l;
167 MatePanelAppletInfo *retval = NULL;
168
169 _mate_panel_applets_managers_ensure_loaded ();
170
171 for (l = mate_panel_applets_managers; l != NULL; l = l->next) {
172 MatePanelAppletsManager *manager = MATE_PANEL_APPLETS_MANAGER (l->data);
173
174 retval = MATE_PANEL_APPLETS_MANAGER_GET_CLASS (manager)->get_applet_info_from_old_id (manager, iid);
175
176 if (retval != NULL)
177 return retval;
178 }
179
180 return NULL;
181 }
182
183 gboolean
mate_panel_applets_manager_load_applet(const gchar * iid,MatePanelAppletFrameActivating * frame_act)184 mate_panel_applets_manager_load_applet (const gchar *iid,
185 MatePanelAppletFrameActivating *frame_act)
186 {
187 GSList *l;
188
189 _mate_panel_applets_managers_ensure_loaded ();
190
191 for (l = mate_panel_applets_managers; l != NULL; l = l->next) {
192 MatePanelAppletsManager *manager = MATE_PANEL_APPLETS_MANAGER (l->data);
193
194 if (!MATE_PANEL_APPLETS_MANAGER_GET_CLASS (manager)->get_applet_info (manager, iid))
195 continue;
196
197 return MATE_PANEL_APPLETS_MANAGER_GET_CLASS (manager)->load_applet (manager, iid, frame_act);
198 }
199
200 return FALSE;
201 }
202
203 GtkWidget *
mate_panel_applets_manager_get_applet_widget(const gchar * iid,guint uid)204 mate_panel_applets_manager_get_applet_widget (const gchar *iid,
205 guint uid)
206 {
207 GSList *l;
208
209 _mate_panel_applets_managers_ensure_loaded ();
210
211 for (l = mate_panel_applets_managers; l != NULL; l = l->next) {
212 MatePanelAppletsManager *manager = MATE_PANEL_APPLETS_MANAGER (l->data);
213
214 if (!MATE_PANEL_APPLETS_MANAGER_GET_CLASS (manager)->get_applet_info (manager, iid))
215 continue;
216
217 return MATE_PANEL_APPLETS_MANAGER_GET_CLASS (manager)->get_applet_widget (manager, iid, uid);
218 }
219
220 return NULL;
221 }
222