|
Packit |
76ec6a |
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
Packit |
76ec6a |
#include <config.h>
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
#include <gtk/gtk.h>
|
|
Packit |
76ec6a |
#include <glibtop/mountlist.h>
|
|
Packit |
76ec6a |
#include <glibtop/fsusage.h>
|
|
Packit |
76ec6a |
#include <glib/gi18n.h>
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
#include "disks.h"
|
|
Packit |
76ec6a |
#include "application.h"
|
|
Packit |
76ec6a |
#include "util.h"
|
|
Packit |
76ec6a |
#include "settings-keys.h"
|
|
Packit |
76ec6a |
#include "legacy/treeview.h"
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
enum DiskColumns
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
/* string columns* */
|
|
Packit |
76ec6a |
DISK_DEVICE,
|
|
Packit |
76ec6a |
DISK_DIR,
|
|
Packit |
76ec6a |
DISK_TYPE,
|
|
Packit |
76ec6a |
DISK_TOTAL,
|
|
Packit |
76ec6a |
DISK_FREE,
|
|
Packit |
76ec6a |
DISK_AVAIL,
|
|
Packit |
76ec6a |
/* USED has to be the last column */
|
|
Packit |
76ec6a |
DISK_USED,
|
|
Packit |
76ec6a |
// then unvisible columns
|
|
Packit |
76ec6a |
/* PixBuf column */
|
|
Packit |
76ec6a |
DISK_ICON,
|
|
Packit |
76ec6a |
/* numeric columns */
|
|
Packit |
76ec6a |
DISK_USED_PERCENTAGE,
|
|
Packit |
76ec6a |
DISK_N_COLUMNS
|
|
Packit |
76ec6a |
};
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static void
|
|
Packit |
76ec6a |
cb_sort_changed (GtkTreeSortable *model, gpointer data)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
GsmApplication *app = (GsmApplication *) data;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
gsm_tree_view_save_state (GSM_TREE_VIEW (app->disk_list));
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static void
|
|
Packit |
76ec6a |
fsusage_stats(const glibtop_fsusage *buf,
|
|
Packit |
76ec6a |
guint64 *bused, guint64 *bfree, guint64 *bavail, guint64 *btotal,
|
|
Packit |
76ec6a |
gint *percentage)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
guint64 total = buf->blocks * buf->block_size;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
if (!total) {
|
|
Packit |
76ec6a |
/* not a real device */
|
|
Packit |
76ec6a |
*btotal = *bfree = *bavail = *bused = 0ULL;
|
|
Packit |
76ec6a |
*percentage = 0;
|
|
Packit |
76ec6a |
} else {
|
|
Packit |
76ec6a |
int percent;
|
|
Packit |
76ec6a |
*btotal = total;
|
|
Packit |
76ec6a |
*bfree = buf->bfree * buf->block_size;
|
|
Packit |
76ec6a |
*bavail = buf->bavail * buf->block_size;
|
|
Packit |
76ec6a |
*bused = *btotal - *bfree;
|
|
Packit |
76ec6a |
/* percent = 100.0f * *bused / *btotal; */
|
|
Packit |
76ec6a |
percent = 100 * *bused / (*bused + *bavail);
|
|
Packit |
76ec6a |
*percentage = CLAMP(percent, 0, 100);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static const char* get_icon_for_path(const char* path)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
GVolumeMonitor *monitor;
|
|
Packit |
76ec6a |
GList *mounts;
|
|
Packit |
76ec6a |
uint i;
|
|
Packit |
76ec6a |
GMount *mount;
|
|
Packit |
76ec6a |
GIcon *icon;
|
|
Packit |
76ec6a |
const char* name = "";
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
monitor = g_volume_monitor_get ();
|
|
Packit |
76ec6a |
mounts = g_volume_monitor_get_mounts (monitor);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
for (i = 0; i < g_list_length (mounts); i++) {
|
|
Packit |
76ec6a |
mount = G_MOUNT (g_list_nth_data(mounts, i));
|
|
Packit |
76ec6a |
if (strcmp(g_mount_get_name(mount), path))
|
|
Packit |
76ec6a |
continue;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
icon = g_mount_get_icon (mount);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
if (!icon)
|
|
Packit |
76ec6a |
continue;
|
|
Packit |
76ec6a |
name = g_icon_to_string (icon);
|
|
Packit |
76ec6a |
g_object_unref (icon);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
g_list_free_full (mounts, g_object_unref);
|
|
Packit |
76ec6a |
return name;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static GdkPixbuf*
|
|
Packit |
76ec6a |
get_icon_for_device(const char *mountpoint)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
const char* icon_name = get_icon_for_path(mountpoint);
|
|
Packit |
76ec6a |
if (!strcmp(icon_name, ""))
|
|
Packit |
76ec6a |
// FIXME: defaults to a safe value
|
|
Packit |
76ec6a |
icon_name = "drive-harddisk"; // get_icon_for_path("/");
|
|
Packit |
76ec6a |
return gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), icon_name, 24, GTK_ICON_LOOKUP_USE_BUILTIN, NULL);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static gboolean
|
|
Packit |
76ec6a |
find_disk_in_model(GtkTreeModel *model, const char *mountpoint,
|
|
Packit |
76ec6a |
GtkTreeIter *result)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
GtkTreeIter iter;
|
|
Packit |
76ec6a |
gboolean found = FALSE;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
if (gtk_tree_model_get_iter_first(model, &iter)) {
|
|
Packit |
76ec6a |
do {
|
|
Packit |
76ec6a |
char *dir;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
gtk_tree_model_get(model, &iter,
|
|
Packit |
76ec6a |
DISK_DIR, &dir,
|
|
Packit |
76ec6a |
-1);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
if (dir && !strcmp(dir, mountpoint)) {
|
|
Packit |
76ec6a |
*result = iter;
|
|
Packit |
76ec6a |
found = TRUE;
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
g_free(dir);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
} while (!found && gtk_tree_model_iter_next(model, &iter));
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
return found;
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static void
|
|
Packit |
76ec6a |
remove_old_disks(GtkTreeModel *model, const glibtop_mountentry *entries, guint n)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
GtkTreeIter iter;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
if (!gtk_tree_model_get_iter_first(model, &iter))
|
|
Packit |
76ec6a |
return;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
while (true) {
|
|
Packit |
76ec6a |
char *dir;
|
|
Packit |
76ec6a |
guint i;
|
|
Packit |
76ec6a |
gboolean found = FALSE;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
gtk_tree_model_get(model, &iter,
|
|
Packit |
76ec6a |
DISK_DIR, &dir,
|
|
Packit |
76ec6a |
-1);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
for (i = 0; i != n; ++i) {
|
|
Packit |
76ec6a |
if (!strcmp(dir, entries[i].mountdir)) {
|
|
Packit |
76ec6a |
found = TRUE;
|
|
Packit |
76ec6a |
break;
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
g_free(dir);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
if (!found) {
|
|
Packit |
76ec6a |
if (!gtk_list_store_remove(GTK_LIST_STORE(model), &iter))
|
|
Packit |
76ec6a |
break;
|
|
Packit |
76ec6a |
else
|
|
Packit |
76ec6a |
continue;
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
if (!gtk_tree_model_iter_next(model, &iter))
|
|
Packit |
76ec6a |
break;
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static void
|
|
Packit |
76ec6a |
add_disk(GtkListStore *list, const glibtop_mountentry *entry, bool show_all_fs)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
GdkPixbuf* pixbuf;
|
|
Packit |
76ec6a |
GtkTreeIter iter;
|
|
Packit |
76ec6a |
glibtop_fsusage usage;
|
|
Packit |
76ec6a |
guint64 bused, bfree, bavail, btotal;
|
|
Packit |
76ec6a |
gint percentage;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
glibtop_get_fsusage(&usage, entry->mountdir);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
if (not show_all_fs and usage.blocks == 0) {
|
|
Packit |
76ec6a |
if (find_disk_in_model(GTK_TREE_MODEL(list), entry->mountdir, &iter))
|
|
Packit |
76ec6a |
gtk_list_store_remove(list, &iter);
|
|
Packit |
76ec6a |
return;
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
fsusage_stats(&usage, &bused, &bfree, &bavail, &btotal, &percentage);
|
|
Packit |
76ec6a |
pixbuf = get_icon_for_device(entry->mountdir);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
/* if we can find a row with the same mountpoint, we get it but we
|
|
Packit |
76ec6a |
still need to update all the fields.
|
|
Packit |
76ec6a |
This makes selection persistent.
|
|
Packit |
76ec6a |
*/
|
|
Packit |
76ec6a |
if (!find_disk_in_model(GTK_TREE_MODEL(list), entry->mountdir, &iter))
|
|
Packit |
76ec6a |
gtk_list_store_append(list, &iter);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
gtk_list_store_set(list, &iter,
|
|
Packit |
76ec6a |
DISK_ICON, pixbuf,
|
|
Packit |
76ec6a |
DISK_DEVICE, entry->devname,
|
|
Packit |
76ec6a |
DISK_DIR, entry->mountdir,
|
|
Packit |
76ec6a |
DISK_TYPE, entry->type,
|
|
Packit |
76ec6a |
DISK_USED_PERCENTAGE, percentage,
|
|
Packit |
76ec6a |
DISK_TOTAL, btotal,
|
|
Packit |
76ec6a |
DISK_FREE, bfree,
|
|
Packit |
76ec6a |
DISK_AVAIL, bavail,
|
|
Packit |
76ec6a |
DISK_USED, bused,
|
|
Packit |
76ec6a |
-1);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static void
|
|
Packit |
76ec6a |
mount_changed (GVolumeMonitor *monitor, GMount *mount, GsmApplication *app)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
disks_update(app);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static gboolean
|
|
Packit |
76ec6a |
cb_timeout (gpointer data)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
GsmApplication *app = (GsmApplication *) data;
|
|
Packit |
76ec6a |
disks_update (app);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
return G_SOURCE_CONTINUE;
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
void
|
|
Packit |
76ec6a |
disks_update(GsmApplication *app)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
GtkListStore *list;
|
|
Packit |
76ec6a |
glibtop_mountentry * entries;
|
|
Packit |
76ec6a |
glibtop_mountlist mountlist;
|
|
Packit |
76ec6a |
guint i;
|
|
Packit |
76ec6a |
gboolean show_all_fs;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
list = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(app->disk_list)));
|
|
Packit |
76ec6a |
show_all_fs = app->settings->get_boolean (GSM_SETTING_SHOW_ALL_FS);
|
|
Packit |
76ec6a |
entries = glibtop_get_mountlist (&mountlist, show_all_fs);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
remove_old_disks(GTK_TREE_MODEL(list), entries, mountlist.number);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
for (i = 0; i < mountlist.number; i++)
|
|
Packit |
76ec6a |
add_disk(list, &entries[i], show_all_fs);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
g_free(entries);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static void
|
|
Packit |
76ec6a |
init_volume_monitor (GsmApplication *app)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
GVolumeMonitor *monitor = g_volume_monitor_get ();
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
g_signal_connect (monitor, "mount-added", G_CALLBACK (mount_changed), app);
|
|
Packit |
76ec6a |
g_signal_connect (monitor, "mount-changed", G_CALLBACK (mount_changed), app);
|
|
Packit |
76ec6a |
g_signal_connect (monitor, "mount-removed", G_CALLBACK (mount_changed), app);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
void
|
|
Packit |
76ec6a |
disks_freeze (GsmApplication *app)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
if (app->disk_timeout) {
|
|
Packit |
76ec6a |
g_source_remove (app->disk_timeout);
|
|
Packit |
76ec6a |
app->disk_timeout = 0;
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
void
|
|
Packit |
76ec6a |
disks_thaw (GsmApplication *app)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
if (app->disk_timeout)
|
|
Packit |
76ec6a |
return;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
app->disk_timeout = g_timeout_add (app->config.disks_update_interval,
|
|
Packit |
76ec6a |
cb_timeout,
|
|
Packit |
76ec6a |
app);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
void
|
|
Packit |
76ec6a |
disks_reset_timeout (GsmApplication *app)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
disks_freeze (app);
|
|
Packit |
76ec6a |
disks_thaw (app);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static void
|
|
Packit |
76ec6a |
cb_disk_columns_changed(GtkTreeView *treeview, gpointer data)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
gsm_tree_view_save_state (GSM_TREE_VIEW (treeview));
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static void open_dir(GtkTreeView *tree_view,
|
|
Packit |
76ec6a |
GtkTreePath *path,
|
|
Packit |
76ec6a |
GtkTreeViewColumn *column,
|
|
Packit |
76ec6a |
gpointer user_data)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
GtkTreeIter iter;
|
|
Packit |
76ec6a |
GtkTreeModel *model;
|
|
Packit |
76ec6a |
char *dir, *url;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
model = gtk_tree_view_get_model(tree_view);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
if (!gtk_tree_model_get_iter(model, &iter, path)) {
|
|
Packit |
76ec6a |
char *p;
|
|
Packit |
76ec6a |
p = gtk_tree_path_to_string(path);
|
|
Packit |
76ec6a |
g_warning("Cannot get iter for path '%s'\n", p);
|
|
Packit |
76ec6a |
g_free(p);
|
|
Packit |
76ec6a |
return;
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
gtk_tree_model_get(model, &iter, DISK_DIR, &dir, -1);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
url = g_strdup_printf("file://%s", dir);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
GError* error = 0;
|
|
Packit |
76ec6a |
if (!g_app_info_launch_default_for_uri(url, NULL, &error)) {
|
|
Packit |
76ec6a |
g_warning("Cannot open '%s' : %s\n", url, error->message);
|
|
Packit |
76ec6a |
g_error_free(error);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
g_free(url);
|
|
Packit |
76ec6a |
g_free(dir);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
static void
|
|
Packit |
76ec6a |
cb_disk_list_destroying (GtkWidget *self, gpointer data)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
g_signal_handlers_disconnect_by_func(self, (gpointer) cb_disk_columns_changed, data);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
g_signal_handlers_disconnect_by_func (gtk_tree_view_get_model (GTK_TREE_VIEW(self)),
|
|
Packit |
76ec6a |
(gpointer) cb_sort_changed,
|
|
Packit |
76ec6a |
data);
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
void
|
|
Packit |
76ec6a |
create_disk_view(GsmApplication *app, GtkBuilder *builder)
|
|
Packit |
76ec6a |
{
|
|
Packit |
76ec6a |
GtkScrolledWindow *scrolled;
|
|
Packit |
76ec6a |
GsmTreeView *disk_tree;
|
|
Packit |
76ec6a |
GtkListStore *model;
|
|
Packit |
76ec6a |
GtkTreeViewColumn *col;
|
|
Packit |
76ec6a |
GtkCellRenderer *cell;
|
|
Packit |
76ec6a |
guint i;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
init_volume_monitor (app);
|
|
Packit |
76ec6a |
const gchar * const titles[] = {
|
|
Packit |
76ec6a |
N_("Device"),
|
|
Packit |
76ec6a |
N_("Directory"),
|
|
Packit |
76ec6a |
N_("Type"),
|
|
Packit |
76ec6a |
N_("Total"),
|
|
Packit |
76ec6a |
N_("Free"),
|
|
Packit |
76ec6a |
N_("Available"),
|
|
Packit |
76ec6a |
N_("Used")
|
|
Packit |
76ec6a |
};
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
scrolled = GTK_SCROLLED_WINDOW (gtk_builder_get_object (builder, "disks_scrolled"));
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
model = gtk_list_store_new(DISK_N_COLUMNS, /* n columns */
|
|
Packit |
76ec6a |
G_TYPE_STRING, /* DISK_DEVICE */
|
|
Packit |
76ec6a |
G_TYPE_STRING, /* DISK_DIR */
|
|
Packit |
76ec6a |
G_TYPE_STRING, /* DISK_TYPE */
|
|
Packit |
76ec6a |
G_TYPE_UINT64, /* DISK_TOTAL */
|
|
Packit |
76ec6a |
G_TYPE_UINT64, /* DISK_FREE */
|
|
Packit |
76ec6a |
G_TYPE_UINT64, /* DISK_AVAIL */
|
|
Packit |
76ec6a |
G_TYPE_UINT64, /* DISK_USED */
|
|
Packit |
76ec6a |
GDK_TYPE_PIXBUF, /* DISK_ICON */
|
|
Packit |
76ec6a |
G_TYPE_INT /* DISK_USED_PERCENTAGE */
|
|
Packit |
76ec6a |
);
|
|
Packit |
76ec6a |
disk_tree = gsm_tree_view_new (g_settings_get_child (app->settings->gobj(), GSM_SETTINGS_CHILD_DISKS), TRUE);
|
|
Packit |
76ec6a |
gtk_tree_view_set_model (GTK_TREE_VIEW (disk_tree), GTK_TREE_MODEL (model));
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
g_signal_connect(G_OBJECT(disk_tree), "row-activated", G_CALLBACK(open_dir), NULL);
|
|
Packit |
76ec6a |
app->disk_list = disk_tree;
|
|
Packit |
76ec6a |
gtk_container_add(GTK_CONTAINER(scrolled), GTK_WIDGET (disk_tree));
|
|
Packit |
76ec6a |
g_object_unref(G_OBJECT(model));
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
/* icon + device */
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
col = gtk_tree_view_column_new();
|
|
Packit |
76ec6a |
cell = gtk_cell_renderer_pixbuf_new();
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
gtk_tree_view_column_pack_start(col, cell, FALSE);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_min_width(col, 30);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_attributes(col, cell, "pixbuf", DISK_ICON,
|
|
Packit |
76ec6a |
NULL);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
cell = gtk_cell_renderer_text_new();
|
|
Packit |
76ec6a |
gtk_tree_view_column_pack_start(col, cell, FALSE);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_attributes(col, cell, "text", DISK_DEVICE,
|
|
Packit |
76ec6a |
NULL);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_title(col, _(titles[DISK_DEVICE]));
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_sort_column_id(col, DISK_DEVICE);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_reorderable(col, TRUE);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_resizable(col, TRUE);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED);
|
|
Packit |
76ec6a |
gsm_tree_view_append_and_bind_column (GSM_TREE_VIEW (disk_tree), col);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
/* sizes - used */
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
for (i = DISK_DIR; i <= DISK_AVAIL; i++) {
|
|
Packit |
76ec6a |
cell = gtk_cell_renderer_text_new();
|
|
Packit |
76ec6a |
col = gtk_tree_view_column_new();
|
|
Packit |
76ec6a |
gtk_tree_view_column_pack_start(col, cell, TRUE);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_title(col, _(titles[i]));
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_resizable(col, TRUE);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_sort_column_id(col, i);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_reorderable(col, TRUE);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_min_width(col, i == DISK_TYPE ? 40 : 72);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED);
|
|
Packit |
76ec6a |
gsm_tree_view_append_and_bind_column (GSM_TREE_VIEW (disk_tree), col);
|
|
Packit |
76ec6a |
switch (i) {
|
|
Packit |
76ec6a |
case DISK_TOTAL:
|
|
Packit |
76ec6a |
case DISK_FREE:
|
|
Packit |
76ec6a |
case DISK_AVAIL:
|
|
Packit |
76ec6a |
g_object_set(cell, "xalign", 1.0f, NULL);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_cell_data_func(col, cell,
|
|
Packit |
76ec6a |
&procman::size_si_cell_data_func,
|
|
Packit |
76ec6a |
GUINT_TO_POINTER(i),
|
|
Packit |
76ec6a |
NULL);
|
|
Packit |
76ec6a |
break;
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
default:
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_attributes(col, cell,
|
|
Packit |
76ec6a |
"text", i,
|
|
Packit |
76ec6a |
NULL);
|
|
Packit |
76ec6a |
break;
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
}
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
/* used + percentage */
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
col = gtk_tree_view_column_new();
|
|
Packit |
76ec6a |
cell = gtk_cell_renderer_text_new();
|
|
Packit |
76ec6a |
g_object_set(cell, "xalign", 1.0f, NULL);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_min_width(col, 72);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED);
|
|
Packit |
76ec6a |
gtk_tree_view_column_pack_start(col, cell, FALSE);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_cell_data_func(col, cell,
|
|
Packit |
76ec6a |
&procman::size_si_cell_data_func,
|
|
Packit |
76ec6a |
GUINT_TO_POINTER(DISK_USED),
|
|
Packit |
76ec6a |
NULL);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_title(col, _(titles[DISK_USED]));
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
cell = gtk_cell_renderer_progress_new();
|
|
Packit |
76ec6a |
gtk_cell_renderer_set_padding(cell, 4.0f, 4.0f);
|
|
Packit |
76ec6a |
gtk_tree_view_column_pack_start(col, cell, TRUE);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_attributes(col, cell, "value",
|
|
Packit |
76ec6a |
DISK_USED_PERCENTAGE, NULL);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_resizable(col, TRUE);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_sort_column_id(col, DISK_USED);
|
|
Packit |
76ec6a |
gtk_tree_view_column_set_reorderable(col, TRUE);
|
|
Packit |
76ec6a |
gsm_tree_view_append_and_bind_column (GSM_TREE_VIEW (disk_tree), col);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
/* numeric sort */
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
gsm_tree_view_load_state (GSM_TREE_VIEW (disk_tree));
|
|
Packit |
76ec6a |
g_signal_connect (G_OBJECT(disk_tree), "destroy",
|
|
Packit |
76ec6a |
G_CALLBACK(cb_disk_list_destroying),
|
|
Packit |
76ec6a |
app);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
g_signal_connect (G_OBJECT(disk_tree), "columns-changed",
|
|
Packit |
76ec6a |
G_CALLBACK(cb_disk_columns_changed), app);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
g_signal_connect (G_OBJECT (model), "sort-column-changed",
|
|
Packit |
76ec6a |
G_CALLBACK (cb_sort_changed), app);
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
app->settings->signal_changed(GSM_SETTING_SHOW_ALL_FS).connect ([app](const Glib::ustring&) { disks_update (app); disks_reset_timeout (app); });
|
|
Packit |
76ec6a |
|
|
Packit |
76ec6a |
gtk_widget_show (GTK_WIDGET (disk_tree));
|
|
Packit |
76ec6a |
}
|