~ubuntu-branches/ubuntu/vivid/cairo-dock-plug-ins/vivid

« back to all changes in this revision

Viewing changes to Dbus/src/interface-applet-object.c

Tags: upstream-2.0.9
ImportĀ upstreamĀ versionĀ 2.0.9

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
* This file is a part of the Cairo-Dock project
 
3
*
 
4
* Copyright : (C) see the 'copyright' file.
 
5
* E-mail    : see the 'copyright' file.
 
6
*
 
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.
 
11
*
 
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/>.
 
18
*/
 
19
 
 
20
 
 
21
#include <glib.h>
 
22
#include <dbus/dbus-glib.h>
 
23
#include <dbus/dbus-glib-bindings.h>
 
24
 
 
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"
 
30
 
 
31
G_DEFINE_TYPE(dbusApplet, cd_dbus_applet, G_TYPE_OBJECT);
 
32
 
 
33
 
 
34
static void cd_dbus_applet_class_init(dbusAppletClass *klass)
 
35
{
 
36
        cd_message("");
 
37
        
 
38
        cd_dbus_applet_init_signals_once (klass);
 
39
        
 
40
        dbus_g_object_type_install_info (cd_dbus_applet_get_type(), &dbus_glib_cd_dbus_applet_object_info);
 
41
}
 
42
static void cd_dbus_applet_init (dbusApplet *pDbusApplet)
 
43
{
 
44
        cd_message("");
 
45
        
 
46
        pDbusApplet->connection = cairo_dock_get_session_connection ();
 
47
        pDbusApplet->proxy = cairo_dock_get_main_proxy ();
 
48
        
 
49
        //dbus_g_object_type_install_info (cd_dbus_applet_get_type(), &dbus_glib_cd_dbus_sub_applet_object_info);
 
50
}
 
51
 
 
52
 
 
53
 
 
54
dbusApplet * cd_dbus_get_dbus_applet_from_instance (CairoDockModuleInstance *pModuleInstance)
 
55
{
 
56
        const gchar *cModuleName = pModuleInstance->pModule->pVisitCard->cModuleName;
 
57
        dbusApplet *pDbusApplet = NULL;
 
58
        GList *a;
 
59
        for (a = myData.pAppletList; a != NULL; a = a->next)
 
60
        {
 
61
                pDbusApplet = a->data;
 
62
                if (strcmp (cModuleName, pDbusApplet->cModuleName) == 0)
 
63
                        break ;
 
64
        }
 
65
        return (a ? pDbusApplet : NULL);
 
66
}
 
67
 
 
68
static dbusApplet * _remove_dbus_applet_from_list (CairoDockModuleInstance *pModuleInstance)
 
69
{
 
70
        const gchar *cModuleName = pModuleInstance->pModule->pVisitCard->cModuleName;
 
71
        dbusApplet *pDbusApplet;
 
72
        GList *a;
 
73
        for (a = myData.pAppletList; a != NULL; a = a->next)
 
74
        {
 
75
                pDbusApplet = a->data;
 
76
                if (strcmp (cModuleName, pDbusApplet->cModuleName) == 0)
 
77
                        break ;
 
78
        }
 
79
        myData.pAppletList = g_list_delete_link (myData.pAppletList, a);
 
80
        return (a ? pDbusApplet : NULL);
 
81
}
 
82
 
 
83
#define _applet_list_is_empty() (myData.pAppletList == NULL)
 
84
 
 
85
dbusApplet *cd_dbus_create_remote_applet_object (CairoDockModuleInstance *pModuleInstance)
 
86
{
 
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);
 
90
        
 
91
        // on assure l'unicite.
 
92
        dbusApplet *pDbusApplet = cd_dbus_get_dbus_applet_from_instance (pModuleInstance);
 
93
        if (pDbusApplet != NULL)
 
94
        {
 
95
                cd_warning ("this applet (%s) already has a remote object on the bus", cModuleName);
 
96
                return pDbusApplet;
 
97
        }
 
98
        
 
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;
 
103
        
 
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));
 
107
        g_free (cPath);
 
108
        
 
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.
 
111
        {
 
112
                cairo_dock_register_notification (CAIRO_DOCK_CLICK_ICON,
 
113
                        (CairoDockNotificationFunc) cd_dbus_applet_emit_on_click_icon,
 
114
                        CAIRO_DOCK_RUN_AFTER,
 
115
                        NULL);
 
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,
 
119
                        NULL);
 
120
                cairo_dock_register_notification (CAIRO_DOCK_SCROLL_ICON,
 
121
                        (CairoDockNotificationFunc) cd_dbus_applet_emit_on_scroll_icon,
 
122
                        CAIRO_DOCK_RUN_AFTER,
 
123
                        NULL);
 
124
                cairo_dock_register_notification (CAIRO_DOCK_BUILD_MENU,
 
125
                        (CairoDockNotificationFunc) cd_dbus_applet_emit_on_build_menu,
 
126
                        CAIRO_DOCK_RUN_FIRST,
 
127
                        NULL);
 
128
                cairo_dock_register_notification (CAIRO_DOCK_DROP_DATA,
 
129
                        (CairoDockNotificationFunc) cd_dbus_applet_emit_on_drop_data,
 
130
                        CAIRO_DOCK_RUN_AFTER,
 
131
                        NULL);
 
132
        }
 
133
        
 
134
        myData.pAppletList = g_list_prepend (myData.pAppletList, pDbusApplet);
 
135
        return pDbusApplet;
 
136
}
 
137
 
 
138
void cd_dbus_delete_remote_applet_object (CairoDockModuleInstance *pModuleInstance)
 
139
{
 
140
        dbusApplet *pDbusApplet = _remove_dbus_applet_from_list (pModuleInstance);
 
141
        
 
142
        if (_applet_list_is_empty ())
 
143
        {
 
144
                cd_dbus_unregister_notifications ();
 
145
        }
 
146
        
 
147
        if (pDbusApplet != NULL)
 
148
                g_object_unref (pDbusApplet);
 
149
}
 
150
 
 
151
void cd_dbus_unregister_notifications (void)
 
152
{
 
153
        cairo_dock_remove_notification_func (CAIRO_DOCK_CLICK_ICON,
 
154
                (CairoDockNotificationFunc) cd_dbus_applet_emit_on_click_icon,
 
155
                NULL);
 
156
        cairo_dock_remove_notification_func (CAIRO_DOCK_MIDDLE_CLICK_ICON,
 
157
                (CairoDockNotificationFunc) cd_dbus_applet_emit_on_middle_click_icon,
 
158
                NULL);
 
159
        cairo_dock_remove_notification_func (CAIRO_DOCK_SCROLL_ICON,
 
160
                (CairoDockNotificationFunc) cd_dbus_applet_emit_on_scroll_icon,
 
161
                NULL);
 
162
        cairo_dock_remove_notification_func (CAIRO_DOCK_BUILD_MENU,
 
163
                (CairoDockNotificationFunc) cd_dbus_applet_emit_on_build_menu,
 
164
                NULL);
 
165
        cairo_dock_remove_notification_func (CAIRO_DOCK_DROP_DATA,
 
166
                (CairoDockNotificationFunc) cd_dbus_applet_emit_on_drop_data,
 
167
                NULL);
 
168
}
 
169
 
 
170
 
 
171
gboolean cd_dbus_applet_is_used (const gchar *cModuleName)
 
172
{
 
173
        //g_print ("%s (%s in %s)\n", __func__, cModuleName, myData.cActiveModules);
 
174
        if (myData.cActiveModules == NULL)
 
175
                return FALSE;
 
176
        gchar *str = g_strstr_len (myData.cActiveModules, -1, cModuleName);
 
177
        return (str && (str[strlen(cModuleName)] == ';' || str[strlen(cModuleName)] == '\0'));
 
178
}
 
179
 
 
180
void cd_dbus_launch_distant_applet_in_dir (const gchar *cModuleName, const gchar *cDirPath)
 
181
{
 
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);
 
185
        g_free (cCommand);
 
186
}
 
187
 
 
188
void cd_dbus_launch_distant_applet (const gchar *cModuleName)
 
189
{
 
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))
 
192
        {
 
193
                cd_dbus_launch_distant_applet_in_dir (cModuleName, MY_APPLET_SHARE_DATA_DIR);
 
194
        }
 
195
        else
 
196
        {
 
197
                g_free (cFilePath);
 
198
                cFilePath = g_strdup_printf ("%s/%s/%s", g_cCairoDockDataDir, "third-party", cModuleName);
 
199
                if (g_file_test (cFilePath, G_FILE_TEST_EXISTS))
 
200
                {
 
201
                        cd_dbus_launch_distant_applet_in_dir (cModuleName, g_cCairoDockDataDir);
 
202
                }
 
203
        }
 
204
        g_free (cFilePath);
 
205
}