~cairo-dock-team/ubuntu/quantal/cairo-dock-plug-ins/3.0.2

« back to all changes in this revision

Viewing changes to shortcuts/src/applet-load-icons.c

Tags: upstream-2.2.0~0beta4
ImportĀ upstreamĀ versionĀ 2.2.0~0beta4

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
#include "applet-struct.h"
26
26
#include "applet-bookmarks.h"
27
27
#include "applet-disk-usage.h"
 
28
#include "applet-drives.h"
28
29
#include "applet-load-icons.h"
29
30
 
30
31
 
31
 
static void cd_shortcuts_on_change_drives (CairoDockFMEventType iEventType, const gchar *cURI, CairoDockModuleInstance *myApplet)
 
32
void cd_shortcuts_set_icon_order_by_name (Icon *pNewIcon, GList *pIconsList)
32
33
{
33
 
        CD_APPLET_ENTER;
34
 
        //\________________ On gere l'evenement sur le point de montage.
35
 
        cd_shortcuts_stop_disk_periodic_task (myApplet);
36
 
        
37
 
        cairo_dock_fm_manage_event_on_file (iEventType, cURI, myIcon, 6);
38
 
        
39
 
        cd_shortcuts_launch_disk_periodic_task (myApplet);
40
 
        
41
 
        //\________________ On met a jour les signets qui pointeraient sur un repertoire du point de montage nouvellement (de)monte.
42
 
        if (!myConfig.bListBookmarks)
43
 
        {
44
 
                CD_APPLET_LEAVE();
45
 
                //return;
46
 
        }
47
 
        if (! myIcon->pSubDock && (!myDesklet || !myDesklet->icons))
48
 
        {
49
 
                CD_APPLET_LEAVE();
50
 
                //return;
51
 
        }
52
34
        GList *ic;
53
 
        Icon *icon;
54
 
        gboolean bIsMounted;
55
 
        gchar *cTargetURI = cairo_dock_fm_is_mounted (cURI, &bIsMounted);
56
 
        if (cTargetURI == NULL)  // version bourrinne.
57
 
        {
58
 
                cd_shortcuts_on_change_bookmarks (CAIRO_DOCK_FILE_MODIFIED, NULL, myApplet);  // NULL <=> on recharge tout.
59
 
        }
60
 
        else  // version optimisee.
61
 
        {
62
 
                for (ic = (myDock ? myIcon->pSubDock->icons : myDesklet->icons); ic != NULL; ic = ic->next)
 
35
        Icon *pIcon;
 
36
        for (ic = pIconsList; ic != NULL; ic = ic->next)
 
37
        {
 
38
                pIcon = ic->data;
 
39
                if (pIcon->iType == pNewIcon->iType)
 
40
                        break;
 
41
        }
 
42
        GList *ic0 = ic;
 
43
        if (! ic0)
 
44
        {
 
45
                pNewIcon->fOrder = 0;
 
46
                return;
 
47
        }
 
48
        
 
49
        pIcon = ic0->data;
 
50
        if (cairo_dock_compare_icons_name (pNewIcon, pIcon) <= 0)
 
51
        {
 
52
                pNewIcon->fOrder = pIcon->fOrder - 1;
 
53
                g_print ("name : %s <= %s -> %.2f\n", pNewIcon->cName, pIcon->cName, pNewIcon->fOrder);
 
54
                return;
 
55
        }
 
56
        
 
57
        pNewIcon->fOrder = 0;
 
58
        for (ic = ic0; ic != NULL; ic = ic->next)
 
59
        {
 
60
                pIcon = ic->data;
 
61
                if (pIcon->iType != pNewIcon->iType)
 
62
                        break;
 
63
                if (cairo_dock_compare_icons_name (pNewIcon, pIcon) < 0)
63
64
                {
64
 
                        icon = ic->data;
65
 
                        if (icon->iType == 10)
 
65
                        if (ic->prev == NULL)
 
66
                                pNewIcon->fOrder = pIcon->fOrder - 1;
 
67
                        else
66
68
                        {
67
 
                                if (strncmp (cTargetURI, icon->cBaseURI, strlen (cTargetURI)) == 0)
68
 
                                {
69
 
                                        cd_message ("le signet %s est situe sur un point de montage ayant change (%s)", icon->cBaseURI, cTargetURI);
70
 
                                        gchar *cName = NULL, *cRealURI = NULL, *cIconName = NULL, *cUserName = NULL;
71
 
                                        int iVolumeID = 0;
72
 
                                        gboolean bIsDirectory = FALSE;
73
 
                                        double fOrder;
74
 
                                        if (cairo_dock_fm_get_file_info (icon->cBaseURI, &cName, &cRealURI, &cIconName, &bIsDirectory, &iVolumeID, &fOrder, mySystem.iFileSortType))
75
 
                                        {
76
 
                                                g_print (" -> %s (%d)\n", cIconName, bIsMounted);
77
 
                                                g_free (icon->cName);
78
 
                                                if (bIsMounted || cIconName == NULL)
79
 
                                                        icon->cName = cName;
80
 
                                                else
81
 
                                                {
82
 
                                                        icon->cName = g_strdup_printf ("%s\n[%s]", cName, D_("Unmounted"));
83
 
                                                        g_free (cName);
84
 
                                                }
85
 
                                                g_free (icon->cCommand);
86
 
                                                icon->cCommand = cRealURI;
87
 
                                                g_free (icon->cFileName);
88
 
                                                icon->cFileName = cIconName;
89
 
                                                icon->iVolumeID = iVolumeID;
90
 
                                                cairo_dock_load_one_icon_from_scratch (icon, (myDock ? CAIRO_CONTAINER (myIcon->pSubDock) : myContainer));
91
 
                                        }
92
 
                                }
 
69
                                Icon *pPrevIcon = ic->prev->data;
 
70
                                pNewIcon->fOrder = (pIcon->fOrder + pPrevIcon->fOrder) / 2;
93
71
                        }
 
72
                        g_print ("  name : %s < %s -> %.2f\n", pNewIcon->cName, pIcon->cName, pNewIcon->fOrder);
 
73
                        break;
94
74
                }
95
 
                g_free (cTargetURI);
 
75
                pNewIcon->fOrder = pIcon->fOrder + 1;
96
76
        }
97
 
        CD_APPLET_LEAVE();
98
77
}
99
 
static void cd_shortcuts_on_change_network (CairoDockFMEventType iEventType, const gchar *cURI, CairoDockModuleInstance *myApplet)
 
78
 
 
79
 
 
80
static void _cd_shortcuts_on_network_event (CairoDockFMEventType iEventType, const gchar *cURI, CairoDockModuleInstance *myApplet)
100
81
{
101
82
        CD_APPLET_ENTER;
102
 
        cairo_dock_fm_manage_event_on_file (iEventType, cURI, myIcon, 8);
 
83
        
 
84
        g_print (" * event %d on network '%s'\n", iEventType, cURI);
 
85
        GList *pIconsList = CD_APPLET_MY_ICONS_LIST;
 
86
        CairoContainer *pContainer = CD_APPLET_MY_ICONS_LIST_CONTAINER;
 
87
        CD_APPLET_LEAVE_IF_FAIL (pContainer != NULL);
 
88
        
 
89
        switch (iEventType)
 
90
        {
 
91
                case CAIRO_DOCK_FILE_DELETED :  // un reseau a ete deconnecte.
 
92
                {
 
93
                        Icon *pConcernedIcon = cairo_dock_get_icon_with_base_uri (pIconsList, cURI);
 
94
                        if (pConcernedIcon == NULL)  // on cherche par nom.
 
95
                        {
 
96
                                pConcernedIcon = cairo_dock_get_icon_with_name (pIconsList, cURI);
 
97
                        }
 
98
                        if (pConcernedIcon == NULL)
 
99
                        {
 
100
                                cd_warning ("  an unknown network was removed");
 
101
                                return ;
 
102
                        }
 
103
                        g_print (" %s will be removed\n", pConcernedIcon->cName);
 
104
                        
 
105
                        CD_APPLET_REMOVE_ICON_FROM_MY_ICONS_LIST (pConcernedIcon);
 
106
                }
 
107
                break ;
 
108
                
 
109
                case CAIRO_DOCK_FILE_CREATED :  // un reseau a ete connecte.
 
110
                {
 
111
                        //\_______________________ on verifie qu'elle n'existe pas deja.
 
112
                        Icon *pSameIcon = cairo_dock_get_icon_with_base_uri (pIconsList, cURI);
 
113
                        if (pSameIcon != NULL)
 
114
                        {
 
115
                                cd_warning ("this mount point (%s) already exists.", pSameIcon->cName);
 
116
                                return;  // on decide de ne rien faire, c'est surement un signal inutile.
 
117
                        }
 
118
                        
 
119
                        //\_______________________ on cree une icone pour cette nouvelle URI.
 
120
                        Icon *pNewIcon = cairo_dock_fm_create_icon_from_URI (cURI, pContainer, CAIRO_DOCK_FM_SORT_BY_NAME);
 
121
                        if (pNewIcon == NULL)
 
122
                        {
 
123
                                cd_warning ("couldn't create an icon for this network");
 
124
                                return ;
 
125
                        }
 
126
                        pNewIcon->iType = CD_NETWORK_GROUP;
 
127
                        
 
128
                        //\_______________________ on la place au bon endroit suivant son nom.
 
129
                        cd_shortcuts_set_icon_order_by_name (pNewIcon, pIconsList);
 
130
                        g_print (" new network : %s, order = %.2f\n", pNewIcon->cName, pNewIcon->fOrder);
 
131
                        
 
132
                        //\_______________________ on l'insere dans la liste.
 
133
                        CD_APPLET_ADD_ICON_IN_MY_ICONS_LIST (pNewIcon);
 
134
                        
 
135
                        //\_______________________ on affiche un message.
 
136
                        cairo_dock_show_temporary_dialog_with_icon_printf (
 
137
                                D_("%s has been connected"),
 
138
                                pNewIcon, pContainer,
 
139
                                4000,
 
140
                                NULL,  // son icone n'est pas encore chargee
 
141
                                pNewIcon->cName);
 
142
                }
 
143
                
 
144
                case CAIRO_DOCK_FILE_MODIFIED :  // un point de montage a ete (de)monte
 
145
                {
 
146
                        //\_______________________ on cherche l'icone concernee.
 
147
                        Icon *pConcernedIcon = cairo_dock_get_icon_with_base_uri (pIconsList, cURI);
 
148
                        if (pConcernedIcon == NULL)  // on cherche par nom.
 
149
                        {
 
150
                                pConcernedIcon = cairo_dock_get_icon_with_name (pIconsList, cURI);
 
151
                        }
 
152
                        if (pConcernedIcon == NULL)
 
153
                        {
 
154
                                cd_warning ("  an unknown network was modified");
 
155
                                return ;
 
156
                        }
 
157
                        g_print (" %s is modified\n", pConcernedIcon->cName);
 
158
                        
 
159
                        //\_______________________ on recupere les infos actuelles.
 
160
                        Icon *pNewIcon = cairo_dock_fm_create_icon_from_URI (cURI, pContainer, CAIRO_DOCK_FM_SORT_BY_NAME);
 
161
                        if (pNewIcon == NULL)
 
162
                        {
 
163
                                cd_warning ("couldn't create an icon for this network");
 
164
                                return ;
 
165
                        }
 
166
                        pNewIcon->iType = CD_NETWORK_GROUP;
 
167
                        
 
168
                        //\_______________________ on remplace l'icone si des choses ont change.
 
169
                        if (cairo_dock_strings_differ (pConcernedIcon->cName, pNewIcon->cName) || cairo_dock_strings_differ (pConcernedIcon->cFileName, pNewIcon->cFileName))
 
170
                        {
 
171
                                g_print (" '%s' -> '%s'\n'%s' -> '%s'\n", pConcernedIcon->cName, pNewIcon->cName, pConcernedIcon->cFileName, pNewIcon->cFileName);
 
172
                                
 
173
                                CD_APPLET_REMOVE_ICON_FROM_MY_ICONS_LIST (pConcernedIcon);
 
174
                                
 
175
                                cd_shortcuts_set_icon_order_by_name (pNewIcon, pIconsList);
 
176
                                CD_APPLET_ADD_ICON_IN_MY_ICONS_LIST (pNewIcon);
 
177
                        }
 
178
                        else
 
179
                        {
 
180
                                cairo_dock_free_icon (pNewIcon);
 
181
                        }
 
182
                }
 
183
        }
103
184
        CD_APPLET_LEAVE();
104
185
}
105
186
 
111
192
        
112
193
        if (myConfig.bListDrives)
113
194
        {
114
 
                pIconList = cairo_dock_fm_list_directory (CAIRO_DOCK_FM_VFS_ROOT, CAIRO_DOCK_FM_SORT_BY_NAME, 6, FALSE, &cFullURI);
115
 
                cd_message ("  cFullURI : %s", cFullURI);
116
 
                if (pIconList == NULL)
117
 
                {
118
 
                        cd_warning ("couldn't detect any drives");  // on decide de poursuivre malgre tout, pour les signets.
119
 
                }
120
 
                
121
 
                if (! cairo_dock_fm_add_monitor_full (cFullURI, TRUE, NULL, (CairoDockFMMonitorCallback) cd_shortcuts_on_change_drives, myApplet))
122
 
                        cd_warning ("Shortcuts : can't monitor drives");
123
 
                myData.cDisksURI = cFullURI;
 
195
                pIconList = cd_shortcuts_list_drives (myApplet);
124
196
        }
125
197
        
126
198
        if (myConfig.bListNetwork)
127
199
        {
128
 
                GList *pIconList2 = cairo_dock_fm_list_directory (CAIRO_DOCK_FM_NETWORK, CAIRO_DOCK_FM_SORT_BY_NAME, 8, FALSE, &cFullURI);
 
200
                GList *pIconList2 = cairo_dock_fm_list_directory (CAIRO_DOCK_FM_NETWORK, CAIRO_DOCK_FM_SORT_BY_NAME, CD_NETWORK_GROUP, FALSE, 100, &cFullURI);
129
201
                cd_message ("  cFullURI : %s", cFullURI);
130
202
                
131
 
                if (myConfig.bUseSeparator && pIconList2 != NULL && pIconList != NULL)
 
203
                /**if (myConfig.bUseSeparator && myDock && pIconList2 != NULL && pIconList != NULL)
132
204
                {
133
 
                        Icon *pSeparatorIcon = g_new0 (Icon, 1);
134
 
                        pSeparatorIcon->iType = 7;
 
205
                        Icon *pSeparatorIcon = cairo_dock_create_separator_icon (7, NULL);  // NULL => ne charge pas l'icone, car on est dans un thread.
135
206
                        pIconList = g_list_append (pIconList, pSeparatorIcon);
136
 
                }
 
207
                }*/
137
208
                
138
209
                pIconList = g_list_concat (pIconList, pIconList2);
139
210
                
140
 
                if (! cairo_dock_fm_add_monitor_full (cFullURI, TRUE, NULL, (CairoDockFMMonitorCallback) cd_shortcuts_on_change_network, myApplet))
 
211
                if (! cairo_dock_fm_add_monitor_full (cFullURI, TRUE, NULL, (CairoDockFMMonitorCallback) _cd_shortcuts_on_network_event, myApplet))
141
212
                        cd_warning ("Shortcuts : can't monitor network");
142
213
                myData.cNetworkURI = cFullURI;
143
214
        }
153
224
                
154
225
                GList *pIconList2 = cd_shortcuts_list_bookmarks (cBookmarkFilePath);
155
226
                
156
 
                if (myConfig.bUseSeparator && pIconList2 != NULL && pIconList != NULL)
 
227
                /**if (myConfig.bUseSeparator && myDock && pIconList2 != NULL && pIconList != NULL)
157
228
                {
158
 
                        Icon *pSeparatorIcon = g_new0 (Icon, 1);
159
 
                        pSeparatorIcon->iType = 9;
 
229
                        Icon *pSeparatorIcon = cairo_dock_create_separator_icon (9, NULL);  // NULL => ne charge pas l'icone, car on est dans un thread.
160
230
                        pIconList = g_list_append (pIconList, pSeparatorIcon);
161
 
                }
 
231
                }*/
162
232
                
163
233
                pIconList = g_list_concat (pIconList, pIconList2);
164
234
                
165
 
                if (! cairo_dock_fm_add_monitor_full (cBookmarkFilePath, FALSE, NULL, (CairoDockFMMonitorCallback) cd_shortcuts_on_change_bookmarks, myApplet))
 
235
                if (! cairo_dock_fm_add_monitor_full (cBookmarkFilePath, FALSE, NULL, (CairoDockFMMonitorCallback) cd_shortcuts_on_bookmarks_event, myApplet))
166
236
                        cd_warning ("Shortcuts : can't monitor bookmarks");
167
237
                
168
238
                myData.cBookmarksURI = cBookmarkFilePath;
181
251
gboolean cd_shortcuts_build_shortcuts_from_data (CairoDockModuleInstance *myApplet)
182
252
{
183
253
        g_return_val_if_fail (myIcon != NULL, FALSE);  // paranoia
184
 
        /*if (myIcon == NULL)
185
 
        {
186
 
                g_print ("annulation du chargement des raccourcis\n");
187
 
                g_list_foreach (myData.pIconList, (GFunc) cairo_dock_free_icon, NULL);
188
 
                g_list_free (myData.pIconList);
189
 
                myData.pIconList = NULL;
190
 
                return FALSE;
191
 
        }*/
 
254
        CD_APPLET_ENTER;
192
255
        
193
256
        //\_______________________ On efface l'ancienne liste.
194
257
        CD_APPLET_DELETE_MY_ICONS_LIST;
212
275
        //\_______________________ On lance la tache de mesure des disques.
213
276
        cd_shortcuts_launch_disk_periodic_task (myApplet);
214
277
        
215
 
        return TRUE;
 
278
        CD_APPLET_LEAVE (TRUE);
216
279
}
217