~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-disk-usage.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:
22
22
#include <sys/types.h>
23
23
#include <sys/statfs.h>
24
24
#include <mntent.h>
 
25
#include <math.h>
25
26
 
26
27
#include <cairo-dock.h>
27
28
 
29
30
#include "applet-disk-usage.h"
30
31
 
31
32
 
32
 
static void _cd_shortcuts_get_fs_stat (const gchar *cDiskURI, CDDiskUsage *pDiskUsage)
 
33
void cd_shortcuts_get_fs_stat (const gchar *cDiskURI, CDDiskUsage *pDiskUsage)
33
34
{
34
35
        static struct statfs sts;
35
36
        const gchar *cMountPath = (strncmp (cDiskURI, "file://", 7) == 0 ? cDiskURI + 7 : cDiskURI);
39
40
        {
40
41
                if (pDiskUsage->iType == 0)
41
42
                        pDiskUsage->iType = sts.f_type;
42
 
                pDiskUsage->iPrevAvail = pDiskUsage->iAvail;
43
43
                pDiskUsage->iAvail = (long long)sts.f_bavail * sts.f_bsize;  // Blocs libres pour utilisateurs
44
44
                pDiskUsage->iFree  = (long long)sts.f_bfree  * sts.f_bsize;  // Blocs libres
45
45
                pDiskUsage->iTotal = (long long)sts.f_blocks * sts.f_bsize;  // Nombre total de blocs
49
49
        else
50
50
        {
51
51
                pDiskUsage->iTotal = 0;
 
52
                pDiskUsage->iAvail = 0;
52
53
        }
53
54
}
54
55
 
55
 
static void _cd_shortcuts_get_disk_usage (CairoDockModuleInstance *myApplet)
56
 
{
57
 
        //cd_message ("%s ()", __func__);
58
 
        const gchar *cMountPath;
59
 
        GList *pElement = myData.pDiskUsageList;
60
 
        CDDiskUsage *pDiskUsage;
61
 
        long long iAvail, iFree, iTotal, iUsed, iType;
62
 
        Icon *pIcon;
63
 
        GList *ic;
64
 
        GList *pIconsList = CD_APPLET_MY_ICONS_LIST;
65
 
        for (ic = pIconsList; ic != NULL; ic = ic->next)
66
 
        {
67
 
                pIcon = ic->data;
68
 
                //g_print ("%s (%s, %d)\n", __func__, pIcon->cCommand, pIcon->iType);
69
 
                if (pIcon->iType != 6)
70
 
                        break;
71
 
                if (pIcon->cCommand != NULL)
72
 
                {
73
 
                        if (pElement != NULL)
74
 
                        {
75
 
                                pDiskUsage = pElement->data;
76
 
                                pElement = pElement->next;
77
 
                        }
78
 
                        else
79
 
                        {
80
 
                                //g_print ("+ %s\n", pIcon->cCommand);
81
 
                                pDiskUsage = g_new0 (CDDiskUsage, 1);
82
 
                                myData.pDiskUsageList = g_list_append (myData.pDiskUsageList, pDiskUsage);
83
 
                        }
84
 
                        
85
 
                        _cd_shortcuts_get_fs_stat (pIcon->cCommand, pDiskUsage);
86
 
                }
87
 
        }
88
 
}
89
56
 
90
57
static gboolean _cd_shortcuts_update_disk_usage (CairoDockModuleInstance *myApplet)
91
58
{
92
 
        g_return_val_if_fail (myData.pDiskUsageList != NULL, TRUE);
93
 
        
94
59
        CD_APPLET_ENTER;
95
60
        CairoContainer *pContainer = CD_APPLET_MY_ICONS_LIST_CONTAINER;
96
 
        cairo_t *ctx = (0 ? myDrawContext : cairo_dock_create_context_from_container (pContainer));
97
 
        GList *pElement = myData.pDiskUsageList;
98
61
        CDDiskUsage *pDiskUsage;
99
62
        Icon *pIcon;
100
63
        double fValue;
103
66
        for (ic = pIconsList; ic != NULL; ic = ic->next)
104
67
        {
105
68
                pIcon = ic->data;
106
 
                if (pIcon->iType != 6)
 
69
                if (pIcon->iType != CD_DRIVE_GROUP)  // les disques sont en 1er
107
70
                        break;
108
 
                if (pIcon->cCommand != NULL && pElement != NULL)
 
71
                if (pIcon->cCommand != NULL)
109
72
                {
110
 
                        pDiskUsage = pElement->data;
111
 
                        if (pDiskUsage->iPrevAvail != pDiskUsage->iAvail)
 
73
                        // get data
 
74
                        pDiskUsage = CD_APPLET_GET_MY_ICON_DATA (pIcon);
 
75
                        if (pDiskUsage == NULL)
 
76
                                continue;
 
77
                        cd_shortcuts_get_fs_stat (pIcon->cCommand, pDiskUsage);
 
78
                        
 
79
                        // update from data
 
80
                        if (pDiskUsage->iTotal != 0 && (pDiskUsage->iPrevAvail == 0 || (double)fabs (pDiskUsage->iPrevAvail - pDiskUsage->iAvail) / pDiskUsage->iTotal > .001))  // .1 % d'ecart ou info encore non renseignee (un disque n'est jamais totalement vide).
112
81
                        {
 
82
                                pDiskUsage->iPrevAvail = pDiskUsage->iAvail;
113
83
                                switch (myConfig.iDisplayType)
114
84
                                {
115
85
                                        case CD_SHOW_FREE_SPACE :
116
86
                                                fValue = (double) pDiskUsage->iAvail / pDiskUsage->iTotal;
117
 
                                                cairo_dock_set_size_as_quick_info (ctx, pIcon, pContainer, pDiskUsage->iAvail);
 
87
                                                cairo_dock_set_size_as_quick_info (pIcon, pContainer, pDiskUsage->iAvail);
118
88
                                        break ;
119
89
                                        case CD_SHOW_USED_SPACE :
120
90
                                                fValue = (double) - pDiskUsage->iUsed / pDiskUsage->iTotal;  // <0 => du vert au rouge.
121
 
                                                cairo_dock_set_size_as_quick_info (ctx, pIcon, pContainer, pDiskUsage->iUsed);
 
91
                                                cairo_dock_set_size_as_quick_info (pIcon, pContainer, pDiskUsage->iUsed);
122
92
                                        break ;
123
93
                                        case CD_SHOW_FREE_SPACE_PERCENT :
124
94
                                                fValue = (double) pDiskUsage->iAvail / pDiskUsage->iTotal;
125
 
                                                cairo_dock_set_quick_info_full (ctx, pIcon, pContainer, "%.1f%%", 100.*fValue);
 
95
                                                cairo_dock_set_quick_info_printf (pIcon, pContainer, "%.1f%%", 100.*fValue);
126
96
                                        break ;
127
97
                                        case CD_SHOW_USED_SPACE_PERCENT :
128
98
                                                fValue = (double) - pDiskUsage->iUsed / pDiskUsage->iTotal;  // <0 => du vert au rouge.
129
 
                                                cairo_dock_set_quick_info_full (ctx, pIcon, pContainer, "%.1f%%", -100.*fValue);
 
99
                                                cairo_dock_set_quick_info_printf (pIcon, pContainer, "%.1f%%", -100.*fValue);
130
100
                                        break ;
 
101
                                        default:
 
102
                                                fValue = 0.;
 
103
                                        break;
131
104
                                }
132
105
                                
133
 
                                if (myConfig.bDrawBar)
 
106
                                if (myConfig.bDrawBar && pIcon->pIconBuffer != NULL)
134
107
                                {
135
108
                                        int iWidth, iHeight;
136
109
                                        cairo_dock_get_icon_extent (pIcon, pContainer, &iWidth, &iHeight);
137
 
                                        cairo_surface_t *pSurface = cairo_dock_create_surface_for_icon (pIcon->cFileName, ctx, iWidth, iHeight);
 
110
                                        cairo_surface_t *pSurface = cairo_dock_create_surface_for_icon (pIcon->cFileName, iWidth, iHeight);
138
111
                                        cairo_t *pIconContext = cairo_create (pIcon->pIconBuffer);
139
112
                                        
140
 
                                        cairo_dock_set_icon_surface_with_bar (pIconContext, pSurface, fValue, pIcon, pContainer);
 
113
                                        cairo_dock_set_icon_surface_with_bar (pIconContext, pSurface, fValue, pIcon);
141
114
                                        
142
115
                                        cairo_destroy (pIconContext);
143
116
                                        cairo_surface_destroy (pSurface);
144
117
                                }
145
118
                                
146
 
                                if (pDiskUsage->iPrevAvail != 0)
147
 
                                        cairo_dock_redraw_icon (pIcon, pContainer);
 
119
                                cairo_dock_redraw_icon (pIcon, pContainer);
148
120
                        }
149
 
                        pElement = pElement->next;
150
121
                }
151
122
        }
152
 
        if (ctx != myDrawContext)
153
 
                cairo_destroy (ctx);
154
 
        
155
 
        CD_APPLET_LEAVE(TRUE);
156
 
        //return TRUE;
 
123
        
 
124
        if (myDesklet)
 
125
                cairo_dock_redraw_container (myContainer);
 
126
        
 
127
        CD_APPLET_LEAVE (TRUE);
157
128
}
158
129
 
159
130
 
164
135
                if (myData.pDiskTask == NULL)
165
136
                {
166
137
                        myData.pDiskTask = cairo_dock_new_task (myConfig.iCheckInterval,
167
 
                                (CairoDockGetDataAsyncFunc) _cd_shortcuts_get_disk_usage,
 
138
                                (CairoDockGetDataAsyncFunc) NULL,
168
139
                                (CairoDockUpdateSyncFunc) _cd_shortcuts_update_disk_usage,
169
140
                                myApplet);
170
141
                }
175
146
void cd_shortcuts_stop_disk_periodic_task (CairoDockModuleInstance *myApplet)
176
147
{
177
148
        cairo_dock_stop_task (myData.pDiskTask);
178
 
        g_list_foreach (myData.pDiskUsageList, (GFunc) g_free, NULL);
179
 
        g_list_free (myData.pDiskUsageList);
180
 
        myData.pDiskUsageList = NULL;
181
149
}
182
150
 
183
151
void cd_shortcuts_free_disk_periodic_task (CairoDockModuleInstance *myApplet)
228
196
        GString *sInfo = g_string_new ("");
229
197
        // on recupere les infos de taille.
230
198
        CDDiskUsage diskUsage;
231
 
        _cd_shortcuts_get_fs_stat (cDiskURI, &diskUsage);
 
199
        cd_shortcuts_get_fs_stat (cDiskURI, &diskUsage);
232
200
        
233
201
        // on recupere les infos du file system.
234
202
        if (diskUsage.iTotal > 0)  // le disque est monte.