Add a size column to the "volumes" plug-in

This commit is contained in:
Pierre Pronchery 2015-07-06 21:46:17 +02:00
parent 15d605e464
commit 57a4351f10

View File

@ -63,6 +63,8 @@ enum _VolumesColumn
DC_FILESYSTEM,
DC_FLAGS,
DC_MOUNTPOINT,
DC_SIZE,
DC_SIZE_DISPLAY,
DC_FREE,
DC_FREE_DISPLAY,
DC_UPDATED
@ -164,8 +166,8 @@ static Volumes * _volumes_init(BrowserPluginHelper * helper)
volumes->store = gtk_list_store_new(DC_COUNT, GDK_TYPE_PIXBUF,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT,
G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_UINT,
G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING,
G_TYPE_BOOLEAN);
G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_STRING,
G_TYPE_UINT, G_TYPE_STRING, G_TYPE_BOOLEAN);
volumes->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(
volumes->store));
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(volumes->view), TRUE);
@ -173,24 +175,31 @@ static Volumes * _volumes_init(BrowserPluginHelper * helper)
_volumes_on_view_button_press), volumes);
g_signal_connect(volumes->view, "popup-menu", G_CALLBACK(
_volumes_on_view_popup_menu), volumes);
/* icon */
/* column: icon */
renderer = gtk_cell_renderer_pixbuf_new();
column = gtk_tree_view_column_new_with_attributes(NULL, renderer,
"pixbuf", DC_PIXBUF, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(volumes->view), column);
/* volume name */
/* column: volume name */
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Mountpoint"),
renderer, "text", DC_NAME, "ellipsize", DC_ELLIPSIZE,
"ellipsize-set", DC_ELLIPSIZE_SET, NULL);
gtk_tree_view_column_set_resizable(column, TRUE);
gtk_tree_view_append_column(GTK_TREE_VIEW(volumes->view), column);
/* free space */
/* column: size */
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Size"), renderer,
"text", DC_SIZE_DISPLAY, NULL);
gtk_tree_view_column_set_resizable(column, TRUE);
gtk_tree_view_append_column(GTK_TREE_VIEW(volumes->view), column);
/* column: free space */
renderer = gtk_cell_renderer_progress_new();
column = gtk_tree_view_column_new_with_attributes(_("Used"), renderer,
"text", DC_FREE_DISPLAY, "value", DC_FREE, NULL);
gtk_tree_view_column_set_resizable(column, TRUE);
gtk_tree_view_append_column(GTK_TREE_VIEW(volumes->view), column);
/* selection */
treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(volumes->view));
gtk_tree_selection_set_mode(treesel, GTK_SELECTION_SINGLE);
g_signal_connect(volumes->view, "row-activated", G_CALLBACK(
@ -268,7 +277,10 @@ static int _volumes_can_eject(unsigned int flags)
/* volumes_list */
static void _list_add(Volumes * volumes, char const * name, char const * device,
char const * filesystem, unsigned int flags,
char const * mountpoint, fsblkcnt_t free, fsblkcnt_t total);
char const * mountpoint, unsigned long bsize,
fsblkcnt_t free, fsblkcnt_t total);
static void _list_add_size(char * buf, size_t len, unsigned long bsize,
fsblkcnt_t total);
static GdkPixbuf * _list_get_icon(Volumes * volumes, VolumesPixbuf dp,
unsigned int flags, char const * mountpoint);
static GdkPixbuf * _list_get_icon_emblem(GdkPixbuf * pixbuf, int size,
@ -310,8 +322,8 @@ static void _volumes_list(Volumes * volumes)
_list_add(volumes, (mnt[i].f_flag & ST_ROOTFS)
? _("Root filesystem") : NULL,
mnt[i].f_mntfromname, mnt[i].f_fstypename,
flags, mnt[i].f_mntonname, mnt[i].f_bavail,
mnt[i].f_blocks);
flags, mnt[i].f_mntonname, mnt[i].f_frsize,
mnt[i].f_bavail, mnt[i].f_blocks);
}
#elif defined(MNT_NOWAIT)
if((res = getmntinfo(&mnt, MNT_NOWAIT)) <= 0)
@ -324,19 +336,20 @@ static void _volumes_list(Volumes * volumes)
_list_add(volumes, (mnt[i].f_flags & MNT_ROOTFS)
? _("Root filesystem") : NULL,
mnt[i].f_mntfromname, mnt[i].f_fstypename,
flags, mnt[i].f_mntonname, mnt[i].f_bavail,
mnt[i].f_blocks);
flags, mnt[i].f_mntonname, mnt[i].f_bsize,
mnt[i].f_bavail, mnt[i].f_blocks);
}
#else
_list_reset(volumes);
_list_add(volumes, _("Root filesystem"), NULL, NULL, 0, "/", 0, 0);
_list_add(volumes, _("Root filesystem"), NULL, NULL, 0, "/", 0, 0, 0);
#endif
_list_purge(volumes);
}
static void _list_add(Volumes * volumes, char const * name, char const * device,
char const * filesystem, unsigned int flags,
char const * mountpoint, fsblkcnt_t free, fsblkcnt_t total)
char const * mountpoint, unsigned long bsize,
fsblkcnt_t free, fsblkcnt_t total)
{
GtkTreeIter iter;
VolumesPixbuf dp;
@ -348,6 +361,7 @@ static void _list_add(Volumes * volumes, char const * name, char const * device,
double fraction = 0.0;
unsigned int f = 0;
char buf[16] = "";
char buf2[16];
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(\"%s\", \"%s\", \"%s\", \"%s\", %lu, %lu)\n",
@ -386,6 +400,7 @@ static void _list_add(Volumes * volumes, char const * name, char const * device,
f = fraction * 100;
snprintf(buf, sizeof(buf), "%.1lf%%", fraction * 100.0);
}
_list_add_size(buf2, sizeof(buf2), bsize, total);
_list_get_iter(volumes, &iter, mountpoint);
pixbuf = _list_get_icon(volumes, dp, flags, mountpoint);
gtk_list_store_set(volumes->store, &iter, DC_DEVICE, device,
@ -393,7 +408,31 @@ static void _list_add(Volumes * volumes, char const * name, char const * device,
DC_ELLIPSIZE, PANGO_ELLIPSIZE_END,
DC_ELLIPSIZE_SET, TRUE, DC_FILESYSTEM, filesystem,
DC_FLAGS, flags, DC_MOUNTPOINT, mountpoint, DC_FREE, f,
DC_FREE_DISPLAY, buf, DC_UPDATED, TRUE, -1);
DC_FREE_DISPLAY, buf, DC_SIZE, bsize * total,
DC_SIZE_DISPLAY, buf2, DC_UPDATED, TRUE, -1);
}
static void _list_add_size(char * buf, size_t len, unsigned long bsize,
fsblkcnt_t total)
{
double sz = bsize * total;
char * unit = _("bytes");
char const * format = "%.1f %s";
if(sz < 1024)
format = "%.0f %s";
else if((sz /= 1024) < 1024)
unit = _("kB");
else if((sz /= 1024) < 1024)
unit = _("MB");
else if((sz /= 1024) < 1024)
unit = _("GB");
else
{
sz /= 1024;
unit = _("TB");
}
snprintf(buf, len, format, sz, unit);
}
static GdkPixbuf * _list_get_icon(Volumes * volumes, VolumesPixbuf dp,