2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
22
#include <dbus/dbus-glib.h>
23
#include <dbus/dbus-glib-bindings.h>
25
#include "interface-applet-signals.h"
26
#include "interface-applet-methods.h"
27
#include "dbus-applet-spec.h"
28
//#include "dbus-sub-applet-spec.h"
29
#include "interface-applet-object.h"
31
G_DEFINE_TYPE(dbusApplet, cd_dbus_applet, G_TYPE_OBJECT);
34
static void cd_dbus_applet_class_init(dbusAppletClass *klass)
38
cd_dbus_applet_init_signals_once (klass);
40
dbus_g_object_type_install_info (cd_dbus_applet_get_type(), &dbus_glib_cd_dbus_applet_object_info);
42
static void cd_dbus_applet_init (dbusApplet *pDbusApplet)
46
pDbusApplet->connection = cairo_dock_get_session_connection ();
47
pDbusApplet->proxy = cairo_dock_get_main_proxy ();
49
//dbus_g_object_type_install_info (cd_dbus_applet_get_type(), &dbus_glib_cd_dbus_sub_applet_object_info);
54
dbusApplet * cd_dbus_get_dbus_applet_from_instance (CairoDockModuleInstance *pModuleInstance)
56
const gchar *cModuleName = pModuleInstance->pModule->pVisitCard->cModuleName;
57
dbusApplet *pDbusApplet = NULL;
59
for (a = myData.pAppletList; a != NULL; a = a->next)
61
pDbusApplet = a->data;
62
if (strcmp (cModuleName, pDbusApplet->cModuleName) == 0)
65
return (a ? pDbusApplet : NULL);
68
static dbusApplet * _remove_dbus_applet_from_list (CairoDockModuleInstance *pModuleInstance)
70
const gchar *cModuleName = pModuleInstance->pModule->pVisitCard->cModuleName;
71
dbusApplet *pDbusApplet;
73
for (a = myData.pAppletList; a != NULL; a = a->next)
75
pDbusApplet = a->data;
76
if (strcmp (cModuleName, pDbusApplet->cModuleName) == 0)
79
myData.pAppletList = g_list_delete_link (myData.pAppletList, a);
80
return (a ? pDbusApplet : NULL);
83
#define _applet_list_is_empty() (myData.pAppletList == NULL)
85
dbusApplet *cd_dbus_create_remote_applet_object (CairoDockModuleInstance *pModuleInstance)
87
g_return_val_if_fail (pModuleInstance != NULL && myData.pMainObject != NULL, NULL); // l'interface principale a deja enregistre notre domaine, etc.
88
const gchar *cModuleName = pModuleInstance->pModule->pVisitCard->cModuleName;
89
g_print ("%s (%s)\n", __func__, cModuleName);
91
// on assure l'unicite.
92
dbusApplet *pDbusApplet = cd_dbus_get_dbus_applet_from_instance (pModuleInstance);
93
if (pDbusApplet != NULL)
95
cd_warning ("this applet (%s) already has a remote object on the bus", cModuleName);
99
// on cree l'objet DBus correspondant a l'applet.
100
pDbusApplet = g_object_new (cd_dbus_applet_get_type(), NULL); // appelle cd_dbus_applet_class_init() et cd_dbus_applet_init().
101
pDbusApplet->cModuleName = g_strdup (cModuleName);
102
pDbusApplet->pModuleInstance = pModuleInstance;
104
// on l'enregistre sous un chemin propre a l'applet.
105
gchar *cPath = g_strconcat ("/org/cairodock/CairoDock/", cModuleName, NULL);
106
dbus_g_connection_register_g_object (pDbusApplet->connection, cPath, G_OBJECT(pDbusApplet));
109
// on s'abonne aux notifications qu'on voudra propager sur le bus.
110
if (pDbusApplet->proxy != NULL && _applet_list_is_empty ()) // 1ere applet Dbus.
112
cairo_dock_register_notification (CAIRO_DOCK_CLICK_ICON,
113
(CairoDockNotificationFunc) cd_dbus_applet_emit_on_click_icon,
114
CAIRO_DOCK_RUN_AFTER,
116
cairo_dock_register_notification (CAIRO_DOCK_MIDDLE_CLICK_ICON,
117
(CairoDockNotificationFunc) cd_dbus_applet_emit_on_middle_click_icon,
118
CAIRO_DOCK_RUN_AFTER,
120
cairo_dock_register_notification (CAIRO_DOCK_SCROLL_ICON,
121
(CairoDockNotificationFunc) cd_dbus_applet_emit_on_scroll_icon,
122
CAIRO_DOCK_RUN_AFTER,
124
cairo_dock_register_notification (CAIRO_DOCK_BUILD_MENU,
125
(CairoDockNotificationFunc) cd_dbus_applet_emit_on_build_menu,
126
CAIRO_DOCK_RUN_FIRST,
128
cairo_dock_register_notification (CAIRO_DOCK_DROP_DATA,
129
(CairoDockNotificationFunc) cd_dbus_applet_emit_on_drop_data,
130
CAIRO_DOCK_RUN_AFTER,
134
myData.pAppletList = g_list_prepend (myData.pAppletList, pDbusApplet);
138
void cd_dbus_delete_remote_applet_object (CairoDockModuleInstance *pModuleInstance)
140
dbusApplet *pDbusApplet = _remove_dbus_applet_from_list (pModuleInstance);
142
if (_applet_list_is_empty ())
144
cd_dbus_unregister_notifications ();
147
if (pDbusApplet != NULL)
148
g_object_unref (pDbusApplet);
151
void cd_dbus_unregister_notifications (void)
153
cairo_dock_remove_notification_func (CAIRO_DOCK_CLICK_ICON,
154
(CairoDockNotificationFunc) cd_dbus_applet_emit_on_click_icon,
156
cairo_dock_remove_notification_func (CAIRO_DOCK_MIDDLE_CLICK_ICON,
157
(CairoDockNotificationFunc) cd_dbus_applet_emit_on_middle_click_icon,
159
cairo_dock_remove_notification_func (CAIRO_DOCK_SCROLL_ICON,
160
(CairoDockNotificationFunc) cd_dbus_applet_emit_on_scroll_icon,
162
cairo_dock_remove_notification_func (CAIRO_DOCK_BUILD_MENU,
163
(CairoDockNotificationFunc) cd_dbus_applet_emit_on_build_menu,
165
cairo_dock_remove_notification_func (CAIRO_DOCK_DROP_DATA,
166
(CairoDockNotificationFunc) cd_dbus_applet_emit_on_drop_data,
171
gboolean cd_dbus_applet_is_used (const gchar *cModuleName)
173
//g_print ("%s (%s in %s)\n", __func__, cModuleName, myData.cActiveModules);
174
if (myData.cActiveModules == NULL)
176
gchar *str = g_strstr_len (myData.cActiveModules, -1, cModuleName);
177
return (str && (str[strlen(cModuleName)] == ';' || str[strlen(cModuleName)] == '\0'));
180
void cd_dbus_launch_distant_applet_in_dir (const gchar *cModuleName, const gchar *cDirPath)
182
gchar *cCommand = g_strdup_printf ("cd \"%s/%s/%s\" && ./\"%s\"", cDirPath, "third-party", cModuleName, cModuleName);
183
g_print ("on lance une applet distante : '%s'\n", cCommand);
184
cairo_dock_launch_command (cCommand);
188
void cd_dbus_launch_distant_applet (const gchar *cModuleName)
190
gchar *cFilePath = g_strdup_printf ("%s/%s", MY_APPLET_SHARE_DATA_DIR"/third-party", cModuleName);
191
if (g_file_test (cFilePath, G_FILE_TEST_EXISTS))
193
cd_dbus_launch_distant_applet_in_dir (cModuleName, MY_APPLET_SHARE_DATA_DIR);
198
cFilePath = g_strdup_printf ("%s/%s/%s", g_cCairoDockDataDir, "third-party", cModuleName);
199
if (g_file_test (cFilePath, G_FILE_TEST_EXISTS))
201
cd_dbus_launch_distant_applet_in_dir (cModuleName, g_cCairoDockDataDir);