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