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 <sys/types.h>
25
#include "applet-struct.h"
26
#include "applet-host.h"
28
#define CD_STATUS_NOTIFIER_ITEM_IFACE "org.kde.StatusNotifierItem"
29
#define CD_STATUS_NOTIFIER_ITEM_OBJ "/StatusNotifierItem"
30
#define CD_STATUS_NOTIFIER_HOST_ADDR "org.kde.StatusNotifierHost"
31
#define CD_STATUS_NOTIFIER_WATCHER_ADDR "org.kde.StatusNotifierWatcher"
32
#define CD_STATUS_NOTIFIER_WATCHER_OBJ "/StatusNotifierWatcher"
33
#define CD_STATUS_NOTIFIER_WATCHER_IFACE "org.kde.StatusNotifierWatcher"
35
static void cd_free_tooltip (CDToolTip *pToolTip);
36
static void cd_free_item_data (CDStatusNotifierItemData *pItemData);
37
static Icon *cd_satus_notifier_create_item_icon (const gchar *cService);
40
G_DEFINE_TYPE(statusNotifierHostObject, cd_satus_notifier_host, G_TYPE_OBJECT);
42
static void cd_satus_notifier_host_class_init(statusNotifierHostObjectClass *klass)
46
static void cd_satus_notifier_host_init (statusNotifierHostObject *pMainObject)
50
// Initialise the DBus connection
51
pMainObject->connection = cairo_dock_get_session_connection ();
53
//dbus_g_object_type_install_info(cd_satus_notifier_host_get_type(), &dbus_glib_cd_satus_notifier_host_object_info);
56
dbus_g_connection_register_g_object(pMainObject->connection, "/org/kde/StatusNotifierHost", G_OBJECT(pMainObject));
60
static CDCategoryEnum _find_category (const gchar *cCategory)
63
return CD_CATEGORY_APPLICATION_STATUS;
64
if (*cCategory == 'A')
65
return CD_CATEGORY_APPLICATION_STATUS;
66
if (*cCategory == 'C')
67
return CD_CATEGORY_COMMUNICATIONS;
68
if (*cCategory == 'S')
69
return CD_CATEGORY_SYSTEM_SERVICES;
70
if (*cCategory == 'H')
71
return CD_CATEGORY_HARDWARE;
72
return CD_CATEGORY_APPLICATION_STATUS;
75
static CDStatusEnum _find_status (const gchar *cStatus)
78
return CD_STATUS_ACTIVE;
80
return CD_STATUS_NEEDS_ATTENTION;
82
return CD_STATUS_ACTIVE;
84
return CD_STATUS_PASSIVE;
85
return CD_STATUS_ACTIVE;
88
static CDToolTip *_make_tooltip_from_dbus_struct (GValueArray *pToolTipTab)
90
CDToolTip *pToolTip = NULL;
93
pToolTip = g_new0 (CDToolTip, 1);
94
GValue *v = &pToolTipTab->values[0];
95
if (v && G_VALUE_HOLDS_STRING (v))
96
pToolTip->cIconName = g_strdup (g_value_get_string (v));
97
v = &pToolTipTab->values[2];
98
if (v && G_VALUE_HOLDS_STRING (v))
99
pToolTip->cTitle = g_strdup (g_value_get_string (v));
100
v = &pToolTipTab->values[3];
101
if (v && G_VALUE_HOLDS_STRING (v))
102
pToolTip->cMessage = g_strdup (g_value_get_string (v));
103
if (pToolTip->cMessage != NULL)
105
if (strncmp (pToolTip->cMessage, "<qt>", 4) == 0)
107
gchar *str = pToolTip->cMessage;
108
int n = strlen (str);
109
*(str + n - 5) = '\0';
110
pToolTip->cMessage = g_strdup (str+4);
113
/// remplacer <br/> pas \n
115
/// virer les <nobr> et </nobr>
117
/// virer les <img src=...> et </img>
124
static void _show_item_tooltip (Icon *pIcon, CDStatusNotifierItemData *pItemData)
126
gchar *cText = g_strdup_printf ("<b>%s</b>\n%s", pItemData->pToolTip->cTitle, pItemData->pToolTip->cMessage);
127
cairo_dock_show_temporary_dialog_with_icon (cText, pIcon, CAIRO_CONTAINER (myIcon->pSubDock), 4000, pItemData->pToolTip->cIconName);
131
static void _show_item_status (Icon *pIcon, CDStatusNotifierItemData *pItemData)
133
switch (pItemData->iStatus)
135
case CD_STATUS_PASSIVE :
137
cairo_dock_stop_icon_attention (pIcon, myIcon->pSubDock);
138
cairo_dock_redraw_icon (pIcon, CAIRO_CONTAINER (myIcon->pSubDock));
140
case CD_STATUS_ACTIVE :
143
cairo_dock_stop_icon_attention (pIcon, myIcon->pSubDock);
144
cairo_dock_redraw_icon (pIcon, CAIRO_CONTAINER (myIcon->pSubDock));
146
case CD_STATUS_NEEDS_ATTENTION:
148
cairo_dock_request_icon_attention (pIcon, myIcon->pSubDock, "rotate", 60);
154
static void on_new_item (DBusGProxy *proxy_watcher, const gchar *cService, CairoDockModuleInstance *myApplet)
157
g_print ("new item : '%s'\n", cService);
159
Icon *pIcon = cd_satus_notifier_create_item_icon (cService);
160
CD_APPLET_LEAVE_IF_FAIL (pIcon != NULL);
161
CDStatusNotifierItemData *pItemData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
162
CD_APPLET_LEAVE_IF_FAIL (pItemData != NULL);
164
cairo_dock_load_icon_buffers (pIcon, CAIRO_CONTAINER (myIcon->pSubDock));
166
if (myIcon->pSubDock)
167
cairo_dock_insert_icon_in_dock (pIcon, myIcon->pSubDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, CAIRO_DOCK_ANIMATE_ICON);
170
CD_APPLET_LOAD_MY_ICONS_LIST (g_list_copy (myData.pIcons), NULL, "Caroussel", NULL);
173
if (pItemData->iStatus != CD_STATUS_ACTIVE)
174
_show_item_status (pIcon, pItemData);
179
static void on_removed_item (DBusGProxy *proxy_watcher, const gchar *cService, CairoDockModuleInstance *myApplet)
182
g_print ("item removed : '%s'\n", cService);
184
gchar *str = strchr (cService, '/');
188
Icon *pIcon = cd_satus_notifier_find_icon_from_service (cService);
189
CD_APPLET_LEAVE_IF_FAIL (pIcon != NULL);
190
CDStatusNotifierItemData *pItemData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
191
CD_APPLET_LEAVE_IF_FAIL (pItemData != NULL);
193
myData.pIcons = g_list_remove (myData.pIcons, pIcon);
194
if (myIcon->pSubDock)
195
cairo_dock_detach_icon_from_dock (pIcon, myIcon->pSubDock, TRUE);
197
cd_free_item_data (pItemData);
198
CD_APPLET_SET_MY_ICON_DATA (pIcon, NULL);
199
cairo_dock_free_icon (pIcon);
201
cairo_dock_update_dock_size (myIcon->pSubDock);
206
static void on_new_item_title (DBusGProxy *proxy_item, Icon *pIcon)
209
g_print ("%s ()\n", __func__);
210
CDStatusNotifierItemData *pItemData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
211
CD_APPLET_LEAVE_IF_FAIL (pItemData != NULL);
213
gchar *cTitle = cairo_dock_dbus_get_property_as_string (pItemData->pProxyProps, CD_STATUS_NOTIFIER_ITEM_IFACE, "Title");
214
cairo_dock_set_icon_name (cTitle, pIcon, CAIRO_CONTAINER (myIcon->pSubDock));
220
static void on_new_item_icon (DBusGProxy *proxy_item, Icon *pIcon)
223
g_print ("%s ()\n", __func__);
224
CDStatusNotifierItemData *pItemData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
225
CD_APPLET_LEAVE_IF_FAIL (pItemData != NULL);
227
gchar *cIconName = cairo_dock_dbus_get_property_as_string (pItemData->pProxyProps, CD_STATUS_NOTIFIER_ITEM_IFACE, "IconName");
228
cairo_t *pIconContext = cairo_create (pIcon->pIconBuffer);
229
cairo_dock_set_image_on_icon (pIconContext, pItemData->cAttentionIconName, pIcon, CAIRO_CONTAINER (myIcon->pSubDock));
230
cairo_destroy (pIconContext);
236
static void on_new_item_attention_icon (DBusGProxy *proxy_item, Icon *pIcon)
239
g_print ("%s ()\n", __func__);
240
CDStatusNotifierItemData *pItemData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
241
CD_APPLET_LEAVE_IF_FAIL (pItemData != NULL);
243
g_free (pItemData->cAttentionIconName);
244
pItemData->cAttentionIconName = cairo_dock_dbus_get_property_as_string (pItemData->pProxyProps, CD_STATUS_NOTIFIER_ITEM_IFACE, "AttentionIconName");
245
if (pIcon->bIsDemandingAttention && pIcon->pIconBuffer)
247
cairo_t *pIconContext = cairo_create (pIcon->pIconBuffer);
248
cairo_dock_set_image_on_icon (pIconContext, pItemData->cAttentionIconName, pIcon, CAIRO_CONTAINER (myIcon->pSubDock));
249
cairo_destroy (pIconContext);
255
static void on_new_item_overlay_icon (DBusGProxy *proxy_item, Icon *pIcon)
258
g_print ("%s ()\n", __func__);
259
CDStatusNotifierItemData *pItemData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
260
CD_APPLET_LEAVE_IF_FAIL (pItemData != NULL);
262
g_free (pItemData->cOverlayIconName);
263
pItemData->cOverlayIconName = cairo_dock_dbus_get_property_as_string (pItemData->pProxyProps, CD_STATUS_NOTIFIER_ITEM_IFACE, "OverlayIconName");
264
if (pIcon->pIconBuffer)
266
cairo_t *pIconContext = cairo_create (pIcon->pIconBuffer);
267
cairo_dock_set_image_on_icon (pIconContext, pIcon->cFileName, pIcon, CAIRO_CONTAINER (myIcon->pSubDock));
268
cairo_destroy (pIconContext);
270
if (pItemData->cOverlayIconName != NULL)
272
CairoEmblem *pEmblem = cairo_dock_make_emblem (pItemData->cOverlayIconName, pIcon, CAIRO_CONTAINER (myIcon->pSubDock));
273
cairo_dock_set_emblem_position (pEmblem, CAIRO_DOCK_EMBLEM_MIDDLE);
274
cairo_dock_draw_emblem_on_icon (pEmblem, pIcon, CAIRO_CONTAINER (myIcon->pSubDock));
275
cairo_dock_free_emblem (pEmblem);
282
static void on_new_item_tooltip (DBusGProxy *proxy_item, Icon *pIcon)
285
g_print ("%s ()\n", __func__);
286
CDStatusNotifierItemData *pItemData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
287
CD_APPLET_LEAVE_IF_FAIL (pItemData != NULL);
289
cairo_dock_remove_dialog_if_any (pIcon);
290
cd_free_tooltip (pItemData->pToolTip);
291
pItemData->pToolTip = NULL;
293
GValueArray *pToolTipTab = cairo_dock_dbus_get_property_as_boxed (pItemData->pProxyProps, CD_STATUS_NOTIFIER_ITEM_IFACE, "ToolTip");
296
pItemData->pToolTip = _make_tooltip_from_dbus_struct (pToolTipTab);
298
if (pItemData->pToolTip && pItemData->pToolTip->cMessage != NULL)
299
_show_item_tooltip (pIcon, pItemData);
305
static void on_new_item_status (DBusGProxy *proxy_item, const gchar *cStatus, Icon *pIcon)
308
g_print ("%s (%s)\n", __func__, cStatus);
309
CDStatusNotifierItemData *pItemData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
310
CD_APPLET_LEAVE_IF_FAIL (pItemData != NULL);
312
pItemData->iStatus = _find_status (cStatus);
313
_show_item_status (pIcon, pItemData);
319
static int _compare_items (const CDStatusNotifierItemData *i1, const CDStatusNotifierItemData *i2)
325
return (i1->iCategory < i2->iCategory ? -1 : (i1->iCategory > i2->iCategory ? 1 : 0));
327
static Icon *cd_satus_notifier_create_item_icon (const gchar *cService)
329
gchar *str = strchr (cService, '/');
332
g_print (" + item '%s' on the bus\n", cService);
334
//\_________________ get the properties of the item.
335
DBusGProxy *pProxyItemProp = cairo_dock_create_new_session_proxy (
337
"/StatusNotifierItem",
338
"org.freedesktop.DBus.Properties");
339
if (pProxyItemProp == NULL)
342
g_print ("getting properties ...\n");
343
GHashTable *hProps = cairo_dock_dbus_get_all_properties (pProxyItemProp, CD_STATUS_NOTIFIER_ITEM_IFACE);
348
const gchar *cId = NULL;
349
v = g_hash_table_lookup (hProps, "Id");
350
if (v && G_VALUE_HOLDS_STRING (v))
352
cId = g_value_get_string (v);
354
g_print (" ID '%s\n", cId);
356
const gchar *cTitle = NULL;
357
v = g_hash_table_lookup (hProps, "Title"); // -> cName
358
if (v && G_VALUE_HOLDS_STRING (v))
360
cTitle = g_value_get_string (v);
362
g_print (" Title '%s\n", cTitle);
364
const gchar *cCategory = NULL;
365
v = g_hash_table_lookup (hProps, "Category"); // (ApplicationStatus, Communications, SystemServices, Hardware) -> fOrder
366
if (v && G_VALUE_HOLDS_STRING (v))
368
cCategory = g_value_get_string (v);
370
g_print (" Category '%s'\n", cCategory);
372
const gchar *cStatus = NULL;
373
v = g_hash_table_lookup (hProps, "Category"); // (Passive, Active, NeedsAttention) -> demands attention
374
if (v && G_VALUE_HOLDS_STRING (v))
376
cStatus = g_value_get_string (v);
378
g_print (" Status '%s'\n", cStatus);
380
v = g_hash_table_lookup (hProps, "WindowId");
382
if (v && G_VALUE_HOLDS_UINT(v))
384
iWindowId = g_value_get_uint (v);
386
g_print (" WindowId '%d'\n", iWindowId);
388
const gchar *cIconName = NULL;
389
v = g_hash_table_lookup (hProps, "IconName"); // -> cIFileName
390
if (v && G_VALUE_HOLDS_STRING (v))
392
cIconName = g_value_get_string (v);
394
g_print (" IconName '%s'\n", cIconName);
396
const gchar *cIconThemePath = NULL;
397
v = g_hash_table_lookup (hProps, "IconThemePath");
398
if (v && G_VALUE_HOLDS_STRING (v))
400
cIconThemePath = g_value_get_string (v);
402
g_print (" IconThemePath '%s'\n", cIconThemePath);
404
const gchar *cOverlayIconName = NULL;
405
v = g_hash_table_lookup (hProps, "OverlayIconName"); // -> emblem
406
if (v && G_VALUE_HOLDS_STRING (v))
408
cOverlayIconName = g_value_get_string (v);
410
g_print (" OverlayIconName '%s'\n", cOverlayIconName);
412
const gchar *cAttentionIconName = NULL;
413
v = g_hash_table_lookup (hProps, "AttentionIconName"); // -> keep for demands of attention
414
if (v && G_VALUE_HOLDS_STRING (v))
416
cAttentionIconName = g_value_get_string (v);
418
g_print (" AttentionIconName '%s'\n", cAttentionIconName);
420
const gchar *cAttentionMovieName = NULL;
421
v = g_hash_table_lookup (hProps, "AttentionMovieName"); // -> idem
422
if (v && G_VALUE_HOLDS_STRING (v))
424
cAttentionMovieName = g_value_get_string (v);
426
g_print (" AttentionMovieName '%s'\n", cAttentionMovieName);
428
GValueArray *pToolTipTab = NULL;
429
v = g_hash_table_lookup (hProps, "ToolTip");
430
if (v && G_VALUE_HOLDS_BOXED (v))
432
pToolTipTab = g_value_get_boxed (v);
435
g_print ("creating the icon...\n");
436
DBusGProxy *pProxyItem = cairo_dock_create_new_session_proxy (
438
"/StatusNotifierItem",
439
CD_STATUS_NOTIFIER_ITEM_IFACE);
440
if (pProxyItem == NULL)
443
//\_________________ create a new item.
444
CDStatusNotifierItemData *pItemData = g_new0 (CDStatusNotifierItemData, 1);
445
pItemData->cService = g_strdup (cService);
446
pItemData->pProxyProps = pProxyItemProp;
447
pItemData->pProxy = pProxyItem;
448
pItemData->cId = g_strdup (cId);
449
pItemData->iWindowId = iWindowId;
450
pItemData->iCategory = _find_category (cCategory);
451
pItemData->iStatus = _find_status (cStatus);
452
pItemData->cIconThemePath = g_strdup (cIconThemePath);
453
pItemData->cAttentionIconName = g_strdup (cAttentionIconName);
454
pItemData->cAttentionMovieName = g_strdup (cAttentionMovieName);
455
pItemData->cOverlayIconName = g_strdup (cOverlayIconName);
458
pItemData->pToolTip = _make_tooltip_from_dbus_struct (pToolTipTab);
461
//\_________________ create a new associated icon.
462
Icon *pIcon = cairo_dock_create_dummy_launcher (g_strdup (cTitle),
463
g_strdup (cIconName),
466
pItemData->iCategory);
467
CD_APPLET_SET_MY_ICON_DATA (pIcon, pItemData);
469
myData.pIcons = g_list_insert_sorted (myData.pIcons, pIcon, (GCompareFunc)_compare_items);
471
//\_________________ track any changes in the item.
472
dbus_g_proxy_add_signal(pProxyItem, "NewTitle",
474
dbus_g_proxy_connect_signal(pProxyItem, "NewTitle",
475
G_CALLBACK(on_new_item_title), myApplet, NULL);
477
dbus_g_proxy_add_signal(pProxyItem, "NewIcon",
479
dbus_g_proxy_connect_signal(pProxyItem, "NewIcon",
480
G_CALLBACK(on_new_item_icon), myApplet, NULL);
482
dbus_g_proxy_add_signal(pProxyItem, "NewAttentionIcon",
484
dbus_g_proxy_connect_signal(pProxyItem, "NewAttentionIcon",
485
G_CALLBACK(on_new_item_attention_icon), myApplet, NULL);
487
dbus_g_proxy_add_signal(pProxyItem, "NewOverlayIcon",
489
dbus_g_proxy_connect_signal(pProxyItem, "NewOverlayIcon",
490
G_CALLBACK(on_new_item_overlay_icon), myApplet, NULL);
492
dbus_g_proxy_add_signal(pProxyItem, "NewToolTip",
494
dbus_g_proxy_connect_signal(pProxyItem, "NewToolTip",
495
G_CALLBACK(on_new_item_tooltip), myApplet, NULL);
497
dbus_g_proxy_add_signal(pProxyItem, "NewStatus",
498
G_TYPE_STRING, G_TYPE_INVALID);
499
dbus_g_proxy_connect_signal(pProxyItem, "NewStatus",
500
G_CALLBACK(on_new_item_status), myApplet, NULL);
502
g_print ("destroy props...\n");
503
g_hash_table_destroy (hProps);
507
static void cd_free_tooltip (CDToolTip *pToolTip)
509
if (pToolTip == NULL)
511
g_free (pToolTip->cIconName);
512
g_free (pToolTip->cTitle);
513
g_free (pToolTip->cMessage);
517
static void cd_free_item_data (CDStatusNotifierItemData *pItemData)
519
if (pItemData == NULL)
521
if (pItemData->iSidPopupTooltip != 0)
522
g_source_remove (pItemData->iSidPopupTooltip);
523
g_object_unref (pItemData->pProxy);
524
g_object_unref (pItemData->pProxyProps);
525
g_free (pItemData->cService);
526
g_free (pItemData->cId);
527
g_free (pItemData->cAttentionIconName);
528
g_free (pItemData->cAttentionMovieName);
529
g_free (pItemData->cOverlayIconName);
530
cd_free_tooltip (pItemData->pToolTip);
536
void cd_satus_notifier_launch_service (void)
538
g_return_if_fail (myData.pMainObject == NULL);
541
// on cree l'objet distant principal.
542
g_print ("satus-notifier : Lancement du service\n");
543
pid_t pid = getpid ();
544
///myData.pMainObject = g_object_new (cd_satus_notifier_host_get_type(), NULL); // appelle class_init() et init().
546
// Register the service name no the bus.
547
myData.cHostName = g_strdup_printf (CD_STATUS_NOTIFIER_HOST_ADDR"-%d", pid);
548
g_print ("registering %s ...\n", myData.cHostName);
549
cairo_dock_register_service_name (myData.cHostName);
552
g_print ("getting the watcher...\n");
553
myData.pProxyWatcher = cairo_dock_create_new_session_proxy (
554
CD_STATUS_NOTIFIER_WATCHER_ADDR,
555
CD_STATUS_NOTIFIER_WATCHER_OBJ,
556
CD_STATUS_NOTIFIER_WATCHER_IFACE);
557
g_return_if_fail (myData.pProxyWatcher != NULL);
559
// register to the watcher.
560
g_print ("registering to the watcher...\n");
561
GError *erreur = NULL;
562
dbus_g_proxy_call (myData.pProxyWatcher, "RegisterStatusNotifierHost", &erreur,
563
G_TYPE_STRING, myData.cHostName,
568
cd_warning ("couldn't find a Status Notifier Watcher (%s)\nYour system doesn't support Systray 2.0", erreur->message);
569
g_error_free (erreur);
572
// connect to the signals.
573
dbus_g_proxy_add_signal(myData.pProxyWatcher, "StatusNotifierItemRegistered",
574
G_TYPE_STRING, G_TYPE_INVALID);
575
dbus_g_proxy_connect_signal(myData.pProxyWatcher, "StatusNotifierItemRegistered",
576
G_CALLBACK(on_new_item), myApplet, NULL);
577
dbus_g_proxy_add_signal(myData.pProxyWatcher, "StatusNotifierItemUnregistered",
578
G_TYPE_STRING, G_TYPE_INVALID);
579
dbus_g_proxy_connect_signal(myData.pProxyWatcher, "StatusNotifierItemUnregistered",
580
G_CALLBACK(on_removed_item), myApplet, NULL);
583
DBusGProxy *pProxyWatcherProps = cairo_dock_create_new_session_proxy (
584
CD_STATUS_NOTIFIER_WATCHER_ADDR,
585
CD_STATUS_NOTIFIER_WATCHER_OBJ,
586
"org.freedesktop.DBus.Properties");
587
gchar **cItemsName = cairo_dock_dbus_get_property_as_string_list (pProxyWatcherProps, CD_STATUS_NOTIFIER_WATCHER_IFACE, "RegisteredStatusNotifierItems");
588
g_object_unref (pProxyWatcherProps);
590
// create all the icons.
591
if (cItemsName != NULL)
594
for (i = 0; cItemsName[i] != NULL; i ++)
596
cd_satus_notifier_create_item_icon (cItemsName[i]);
598
g_strfreev (cItemsName);
600
CD_APPLET_LOAD_MY_ICONS_LIST (g_list_copy (myData.pIcons), NULL, "Caroussel", NULL);
604
void cd_satus_notifier_stop_service (void)
606
if (myData.pMainObject = NULL)
608
g_object_unref (myData.pMainObject);
609
g_object_unref (myData.pProxyWatcher);
613
for (ic = myData.pIcons; ic != NULL; ic = ic->next)
616
CDStatusNotifierItemData *pItemData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
617
cd_free_item_data (pItemData);
618
CD_APPLET_SET_MY_ICON_DATA (pIcon, NULL);
620
g_list_free (myData.pIcons);
621
CD_APPLET_DELETE_MY_ICONS_LIST;
624
Icon * cd_satus_notifier_find_icon_from_service (const gchar *cService)
628
for (ic = myData.pIcons; ic != NULL; ic = ic->next)
631
CDStatusNotifierItemData *pItemData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
632
if (pItemData && pItemData->cService && strcmp (pItemData->cService, cService) == 0)