Blame src/util.cpp

Packit 76ec6a
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
Packit 76ec6a
#include <config.h>
Packit 76ec6a
Packit 76ec6a
#include <glib/gi18n.h>
Packit 76ec6a
#include <glib.h>
Packit 76ec6a
#include <gtk/gtk.h>
Packit 76ec6a
Packit 76ec6a
#include <glibtop/proctime.h>
Packit 76ec6a
#include <glibtop/procstate.h>
Packit 76ec6a
Packit 76ec6a
#include "util.h"
Packit 76ec6a
#include "application.h"
Packit 76ec6a
Packit 76ec6a
extern "C" {
Packit 76ec6a
#include "legacy/e_date.h"
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
const char*
Packit 76ec6a
format_process_state(guint state)
Packit 76ec6a
{
Packit 76ec6a
    const char *status;
Packit 76ec6a
Packit 76ec6a
    switch (state)
Packit 76ec6a
    {
Packit 76ec6a
        case GLIBTOP_PROCESS_RUNNING:
Packit 76ec6a
            status = _("Running");
Packit 76ec6a
            break;
Packit 76ec6a
Packit 76ec6a
        case GLIBTOP_PROCESS_STOPPED:
Packit 76ec6a
            status = _("Stopped");
Packit 76ec6a
            break;
Packit 76ec6a
Packit 76ec6a
        case GLIBTOP_PROCESS_ZOMBIE:
Packit 76ec6a
            status = _("Zombie");
Packit 76ec6a
            break;
Packit 76ec6a
Packit 76ec6a
        case GLIBTOP_PROCESS_UNINTERRUPTIBLE:
Packit 76ec6a
            status = _("Uninterruptible");
Packit 76ec6a
            break;
Packit 76ec6a
Packit 76ec6a
        default:
Packit 76ec6a
            status = _("Sleeping");
Packit 76ec6a
            break;
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    return status;
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
static char *
Packit 76ec6a
mnemonic_safe_process_name(const char *process_name)
Packit 76ec6a
{
Packit 76ec6a
    const char *p;
Packit 76ec6a
    GString *name;
Packit 76ec6a
Packit 76ec6a
    name = g_string_new ("");
Packit 76ec6a
Packit 76ec6a
    for(p = process_name; *p; ++p)
Packit 76ec6a
    {
Packit 76ec6a
        g_string_append_c (name, *p);
Packit 76ec6a
Packit 76ec6a
        if(*p == '_')
Packit 76ec6a
            g_string_append_c (name, '_');
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    return g_string_free (name, FALSE);
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
static inline unsigned divide(unsigned *q, unsigned *r, unsigned d)
Packit 76ec6a
{
Packit 76ec6a
    *q = *r / d;
Packit 76ec6a
    *r = *r % d;
Packit 76ec6a
    return *q != 0;
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
/*
Packit 76ec6a
 * @param d: duration in centiseconds
Packit 76ec6a
 * @type d: unsigned
Packit 76ec6a
 */
Packit 76ec6a
char *
Packit 76ec6a
procman::format_duration_for_display(unsigned centiseconds)
Packit 76ec6a
{
Packit 76ec6a
    unsigned weeks = 0, days = 0, hours = 0, minutes = 0, seconds = 0;
Packit 76ec6a
Packit 76ec6a
    (void)(divide(&seconds, &centiseconds, 100)
Packit 76ec6a
           && divide(&minutes, &seconds, 60)
Packit 76ec6a
           && divide(&hours, &minutes, 60)
Packit 76ec6a
           && divide(&days, &hours, 24)
Packit 76ec6a
           && divide(&weeks, &days, 7));
Packit 76ec6a
Packit 76ec6a
    if (weeks)
Packit 76ec6a
        /* xgettext: weeks, days */
Packit 76ec6a
        return g_strdup_printf(_("%uw%ud"), weeks, days);
Packit 76ec6a
Packit 76ec6a
    if (days)
Packit 76ec6a
        /* xgettext: days, hours (0 -> 23) */
Packit 76ec6a
        return g_strdup_printf(_("%ud%02uh"), days, hours);
Packit 76ec6a
Packit 76ec6a
    if (hours)
Packit 76ec6a
        /* xgettext: hours (0 -> 23), minutes, seconds */
Packit 76ec6a
        return g_strdup_printf(_("%u:%02u:%02u"), hours, minutes, seconds);
Packit 76ec6a
Packit 76ec6a
    /* xgettext: minutes, seconds, centiseconds */
Packit 76ec6a
    return g_strdup_printf(_("%u:%02u.%02u"), minutes, seconds, centiseconds);
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
GtkLabel*
Packit 76ec6a
procman_make_label_for_mmaps_or_ofiles(const char *format,
Packit 76ec6a
                                       const char *process_name,
Packit 76ec6a
                                       unsigned pid)
Packit 76ec6a
{
Packit 76ec6a
    GtkLabel* label;
Packit 76ec6a
    char *name, *title;
Packit 76ec6a
Packit 76ec6a
    name = mnemonic_safe_process_name (process_name);
Packit 76ec6a
    title = g_strdup_printf(format, name, pid);
Packit 76ec6a
    label = GTK_LABEL (gtk_label_new_with_mnemonic (title));
Packit 76ec6a
    gtk_widget_set_valign (GTK_WIDGET (label), GTK_ALIGN_CENTER);
Packit 76ec6a
    gtk_widget_set_halign (GTK_WIDGET (label), GTK_ALIGN_START);
Packit 76ec6a
Packit 76ec6a
    g_free (title);
Packit 76ec6a
    g_free (name);
Packit 76ec6a
Packit 76ec6a
    return label;
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
/**
Packit 76ec6a
 * procman::format_size:
Packit 76ec6a
 * @size:
Packit 76ec6a
 *
Packit 76ec6a
 * Formats the file size passed in @bytes in a way that is easy for
Packit 76ec6a
 * the user to read. Gives the size in bytes, kibibytes, mebibytes or
Packit 76ec6a
 * gibibytes, choosing whatever is appropriate.
Packit 76ec6a
 *
Packit 76ec6a
 * Returns: a newly allocated string with the size ready to be shown.
Packit 76ec6a
 **/
Packit 76ec6a
Packit 76ec6a
gchar*
Packit 76ec6a
procman::format_size(guint64 size, bool want_bits)
Packit 76ec6a
{
Packit 76ec6a
    if (want_bits)
Packit 76ec6a
        size *= 8;
Packit 76ec6a
Packit 76ec6a
    const GFormatSizeFlags flags = (want_bits ? G_FORMAT_SIZE_BITS : G_FORMAT_SIZE_IEC_UNITS);
Packit 76ec6a
    return g_format_size_full(size, flags);
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
gchar *
Packit 76ec6a
procman::get_nice_level (gint nice)
Packit 76ec6a
{
Packit 76ec6a
    if (nice < -7)
Packit 76ec6a
        return _("Very High");
Packit 76ec6a
    else if (nice < -2)
Packit 76ec6a
        return _("High");
Packit 76ec6a
    else if (nice < 3)
Packit 76ec6a
        return _("Normal");
Packit 76ec6a
    else if (nice < 7)
Packit 76ec6a
        return _("Low");
Packit 76ec6a
    else
Packit 76ec6a
        return _("Very Low");
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
gchar *
Packit 76ec6a
procman::get_nice_level_with_priority (gint nice)
Packit 76ec6a
{
Packit 76ec6a
    if (nice < -7)
Packit 76ec6a
        return _("Very High Priority");
Packit 76ec6a
    else if (nice < -2)
Packit 76ec6a
        return _("High Priority");
Packit 76ec6a
    else if (nice < 3)
Packit 76ec6a
        return _("Normal Priority");
Packit 76ec6a
    else if (nice < 7)
Packit 76ec6a
        return _("Low Priority");
Packit 76ec6a
    else
Packit 76ec6a
        return _("Very Low Priority");
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
gboolean
Packit 76ec6a
load_symbols(const char *module, ...)
Packit 76ec6a
{
Packit 76ec6a
    GModule *mod;
Packit 76ec6a
    gboolean found_all = TRUE;
Packit 76ec6a
    va_list args;
Packit 76ec6a
Packit 76ec6a
    mod = g_module_open(module, static_cast<GModuleFlags>(G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL));
Packit 76ec6a
Packit 76ec6a
    if (!mod)
Packit 76ec6a
        return FALSE;
Packit 76ec6a
Packit 76ec6a
    procman_debug("Found %s", module);
Packit 76ec6a
Packit 76ec6a
    va_start(args, module);
Packit 76ec6a
Packit 76ec6a
    while (1) {
Packit 76ec6a
        const char *name;
Packit 76ec6a
        void **symbol;
Packit 76ec6a
Packit 76ec6a
        name = va_arg(args, char*);
Packit 76ec6a
Packit 76ec6a
        if (!name)
Packit 76ec6a
            break;
Packit 76ec6a
Packit 76ec6a
        symbol = va_arg(args, void**);
Packit 76ec6a
Packit 76ec6a
        if (g_module_symbol(mod, name, symbol)) {
Packit 76ec6a
            procman_debug("Loaded %s from %s", name, module);
Packit 76ec6a
        }
Packit 76ec6a
        else {
Packit 76ec6a
            procman_debug("Could not load %s from %s", name, module);
Packit 76ec6a
            found_all = FALSE;
Packit 76ec6a
            break;
Packit 76ec6a
        }
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    va_end(args);
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
    if (found_all)
Packit 76ec6a
        g_module_make_resident(mod);
Packit 76ec6a
    else
Packit 76ec6a
        g_module_close(mod);
Packit 76ec6a
Packit 76ec6a
    return found_all;
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
static gboolean
Packit 76ec6a
is_debug_enabled(void)
Packit 76ec6a
{
Packit 76ec6a
    static gboolean init;
Packit 76ec6a
    static gboolean enabled;
Packit 76ec6a
Packit 76ec6a
    if (!init) {
Packit 76ec6a
        enabled = g_getenv("GNOME_SYSTEM_MONITOR_DEBUG") != NULL;
Packit 76ec6a
        init = TRUE;
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    return enabled;
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
static double
Packit 76ec6a
get_relative_time(void)
Packit 76ec6a
{
Packit 76ec6a
    static unsigned long start_time;
Packit 76ec6a
    GTimeVal tv;
Packit 76ec6a
Packit 76ec6a
    if (G_UNLIKELY(!start_time)) {
Packit 76ec6a
        glibtop_proc_time buf;
Packit 76ec6a
        glibtop_get_proc_time(&buf, getpid());
Packit 76ec6a
        start_time = buf.start_time;
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    g_get_current_time(&tv;;
Packit 76ec6a
    return (tv.tv_sec - start_time) + 1e-6 * tv.tv_usec;
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
static guint64
Packit 76ec6a
get_size_from_column(GtkTreeModel* model, GtkTreeIter* first,
Packit 76ec6a
                             const guint index)
Packit 76ec6a
{
Packit 76ec6a
    GValue value = { 0 };
Packit 76ec6a
    gtk_tree_model_get_value(model, first, index, &value);
Packit 76ec6a
Packit 76ec6a
    guint64 size;
Packit 76ec6a
    switch (G_VALUE_TYPE(&value)) {
Packit 76ec6a
        case G_TYPE_UINT:
Packit 76ec6a
            size = g_value_get_uint(&value);
Packit 76ec6a
            break;
Packit 76ec6a
        case G_TYPE_ULONG:
Packit 76ec6a
            size = g_value_get_ulong(&value);
Packit 76ec6a
            break;
Packit 76ec6a
        case G_TYPE_UINT64:
Packit 76ec6a
            size = g_value_get_uint64(&value);
Packit 76ec6a
            break;
Packit 76ec6a
        default:
Packit 76ec6a
            g_assert_not_reached();
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    g_value_unset(&value);
Packit 76ec6a
    return size;
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
void
Packit 76ec6a
procman_debug_real(const char *file, int line, const char *func,
Packit 76ec6a
                   const char *format, ...)
Packit 76ec6a
{
Packit 76ec6a
    va_list args;
Packit 76ec6a
    char *msg;
Packit 76ec6a
Packit 76ec6a
    if (G_LIKELY(!is_debug_enabled()))
Packit 76ec6a
        return;
Packit 76ec6a
Packit 76ec6a
    va_start(args, format);
Packit 76ec6a
    msg = g_strdup_vprintf(format, args);
Packit 76ec6a
    va_end(args);
Packit 76ec6a
Packit 76ec6a
    g_print ("[%.3f %s:%d %s] %s\n", get_relative_time(), file, line, func, msg);
Packit 76ec6a
Packit 76ec6a
    g_free(msg);
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
namespace procman
Packit 76ec6a
{
Packit 76ec6a
    void size_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
Packit 76ec6a
                             GtkTreeModel *model, GtkTreeIter *iter,
Packit 76ec6a
                             gpointer user_data)
Packit 76ec6a
    {
Packit 76ec6a
        const guint index = GPOINTER_TO_UINT(user_data);
Packit 76ec6a
Packit 76ec6a
        guint64 size;
Packit 76ec6a
        GValue value = { 0 };
Packit 76ec6a
Packit 76ec6a
        gtk_tree_model_get_value(model, iter, index, &value);
Packit 76ec6a
Packit 76ec6a
        switch (G_VALUE_TYPE(&value)) {
Packit 76ec6a
            case G_TYPE_ULONG:
Packit 76ec6a
                size = g_value_get_ulong(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            case G_TYPE_UINT64:
Packit 76ec6a
                size = g_value_get_uint64(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            default:
Packit 76ec6a
                g_assert_not_reached();
Packit 76ec6a
        }
Packit 76ec6a
Packit 76ec6a
        g_value_unset(&value);
Packit 76ec6a
Packit 76ec6a
        char *str = g_format_size_full(size, G_FORMAT_SIZE_IEC_UNITS);
Packit 76ec6a
        g_object_set(renderer, "text", str, NULL);
Packit 76ec6a
        g_free(str);
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
    /*
Packit 76ec6a
      Same as above but handles size == 0 as not available
Packit 76ec6a
    */
Packit 76ec6a
    void size_na_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
Packit 76ec6a
                                GtkTreeModel *model, GtkTreeIter *iter,
Packit 76ec6a
                                gpointer user_data)
Packit 76ec6a
    {
Packit 76ec6a
        const guint index = GPOINTER_TO_UINT(user_data);
Packit 76ec6a
Packit 76ec6a
        guint64 size;
Packit 76ec6a
        GValue value = { 0 };
Packit 76ec6a
Packit 76ec6a
        gtk_tree_model_get_value(model, iter, index, &value);
Packit 76ec6a
Packit 76ec6a
        switch (G_VALUE_TYPE(&value)) {
Packit 76ec6a
            case G_TYPE_ULONG:
Packit 76ec6a
                size = g_value_get_ulong(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            case G_TYPE_UINT64:
Packit 76ec6a
                size = g_value_get_uint64(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            default:
Packit 76ec6a
                g_assert_not_reached();
Packit 76ec6a
        }
Packit 76ec6a
Packit 76ec6a
        g_value_unset(&value);
Packit 76ec6a
Packit 76ec6a
        if (size == 0) {
Packit 76ec6a
            char *str = g_strdup_printf ("%s", _("N/A"));
Packit 76ec6a
            g_object_set(renderer, "markup", str, NULL);
Packit 76ec6a
            g_free(str);
Packit 76ec6a
        }
Packit 76ec6a
        else {
Packit 76ec6a
            char *str = g_format_size_full(size, G_FORMAT_SIZE_IEC_UNITS);
Packit 76ec6a
            g_object_set(renderer, "text", str, NULL);
Packit 76ec6a
            g_free(str);
Packit 76ec6a
        }
Packit 76ec6a
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    void io_rate_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
Packit 76ec6a
                                GtkTreeModel *model, GtkTreeIter *iter,
Packit 76ec6a
                                gpointer user_data)
Packit 76ec6a
    {
Packit 76ec6a
        const guint index = GPOINTER_TO_UINT(user_data);
Packit 76ec6a
Packit 76ec6a
        guint64 size;
Packit 76ec6a
        GValue value = { 0 };
Packit 76ec6a
Packit 76ec6a
        gtk_tree_model_get_value(model, iter, index, &value);
Packit 76ec6a
Packit 76ec6a
        switch (G_VALUE_TYPE(&value)) {
Packit 76ec6a
            case G_TYPE_ULONG:
Packit 76ec6a
                size = g_value_get_ulong(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            case G_TYPE_UINT64:
Packit 76ec6a
                size = g_value_get_uint64(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            default:
Packit 76ec6a
                g_assert_not_reached();
Packit 76ec6a
        }
Packit 76ec6a
Packit 76ec6a
        g_value_unset(&value);
Packit 76ec6a
Packit 76ec6a
        if (size == 0) {
Packit 76ec6a
            char *str = g_strdup_printf ("%s", _("N/A"));
Packit 76ec6a
            g_object_set(renderer, "markup", str, NULL);
Packit 76ec6a
            g_free(str);
Packit 76ec6a
        }
Packit 76ec6a
        else {
Packit 76ec6a
            g_object_set(renderer, "text", procman::format_rate(size, FALSE).c_str(), NULL);
Packit 76ec6a
        }
Packit 76ec6a
Packit 76ec6a
    }
Packit 76ec6a
    
Packit 76ec6a
    /*
Packit 76ec6a
        Cell data function to format a size value with SI units (to be used only for disk size, see bugzilla 693630)
Packit 76ec6a
    */
Packit 76ec6a
    void size_si_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
Packit 76ec6a
                             GtkTreeModel *model, GtkTreeIter *iter,
Packit 76ec6a
                             gpointer user_data)
Packit 76ec6a
    {
Packit 76ec6a
        const guint index = GPOINTER_TO_UINT(user_data);
Packit 76ec6a
Packit 76ec6a
        guint64 size;
Packit 76ec6a
        GValue value = { 0 };
Packit 76ec6a
Packit 76ec6a
        gtk_tree_model_get_value(model, iter, index, &value);
Packit 76ec6a
Packit 76ec6a
        switch (G_VALUE_TYPE(&value)) {
Packit 76ec6a
            case G_TYPE_ULONG:
Packit 76ec6a
                size = g_value_get_ulong(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            case G_TYPE_UINT64:
Packit 76ec6a
                size = g_value_get_uint64(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            default:
Packit 76ec6a
                g_assert_not_reached();
Packit 76ec6a
        }
Packit 76ec6a
Packit 76ec6a
        g_value_unset(&value);
Packit 76ec6a
Packit 76ec6a
        char *str = g_format_size(size);
Packit 76ec6a
        g_object_set(renderer, "text", str, NULL);
Packit 76ec6a
        g_free(str);
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    void duration_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
Packit 76ec6a
                                 GtkTreeModel *model, GtkTreeIter *iter,
Packit 76ec6a
                                 gpointer user_data)
Packit 76ec6a
    {
Packit 76ec6a
        const guint index = GPOINTER_TO_UINT(user_data);
Packit 76ec6a
Packit 76ec6a
        unsigned time;
Packit 76ec6a
        GValue value = { 0 };
Packit 76ec6a
Packit 76ec6a
        gtk_tree_model_get_value(model, iter, index, &value);
Packit 76ec6a
Packit 76ec6a
        switch (G_VALUE_TYPE(&value)) {
Packit 76ec6a
            case G_TYPE_ULONG:
Packit 76ec6a
                time = g_value_get_ulong(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            case G_TYPE_UINT64:
Packit 76ec6a
                time = g_value_get_uint64(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            default:
Packit 76ec6a
                g_assert_not_reached();
Packit 76ec6a
        }
Packit 76ec6a
Packit 76ec6a
        g_value_unset(&value);
Packit 76ec6a
Packit 76ec6a
        time = 100 * time / GsmApplication::get()->frequency;
Packit 76ec6a
        char *str = format_duration_for_display(time);
Packit 76ec6a
        g_object_set(renderer, "text", str, NULL);
Packit 76ec6a
        g_free(str);
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
    void time_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
Packit 76ec6a
                             GtkTreeModel *model, GtkTreeIter *iter,
Packit 76ec6a
                             gpointer user_data)
Packit 76ec6a
    {
Packit 76ec6a
        const guint index = GPOINTER_TO_UINT(user_data);
Packit 76ec6a
Packit 76ec6a
        time_t time;
Packit 76ec6a
        GValue value = { 0 };
Packit 76ec6a
Packit 76ec6a
        gtk_tree_model_get_value(model, iter, index, &value);
Packit 76ec6a
Packit 76ec6a
        switch (G_VALUE_TYPE(&value)) {
Packit 76ec6a
            case G_TYPE_ULONG:
Packit 76ec6a
                time = g_value_get_ulong(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            default:
Packit 76ec6a
                g_assert_not_reached();
Packit 76ec6a
        }
Packit 76ec6a
Packit 76ec6a
        g_value_unset(&value);
Packit 76ec6a
Packit 76ec6a
        char *str = procman_format_date_for_display(time);
Packit 76ec6a
        g_object_set(renderer, "text", str, NULL);
Packit 76ec6a
        g_free(str);
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    void status_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
Packit 76ec6a
                               GtkTreeModel *model, GtkTreeIter *iter,
Packit 76ec6a
                               gpointer user_data)
Packit 76ec6a
    {
Packit 76ec6a
        const guint index = GPOINTER_TO_UINT(user_data);
Packit 76ec6a
Packit 76ec6a
        guint state;
Packit 76ec6a
        GValue value = { 0 };
Packit 76ec6a
Packit 76ec6a
        gtk_tree_model_get_value(model, iter, index, &value);
Packit 76ec6a
Packit 76ec6a
        switch (G_VALUE_TYPE(&value)) {
Packit 76ec6a
            case G_TYPE_UINT:
Packit 76ec6a
                state = g_value_get_uint(&value);
Packit 76ec6a
                break;
Packit 76ec6a
Packit 76ec6a
            default:
Packit 76ec6a
                g_assert_not_reached();
Packit 76ec6a
        }
Packit 76ec6a
Packit 76ec6a
        g_value_unset(&value);
Packit 76ec6a
Packit 76ec6a
        const char *str = format_process_state(state);
Packit 76ec6a
        g_object_set(renderer, "text", str, NULL);
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    void priority_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
Packit 76ec6a
                             GtkTreeModel *model, GtkTreeIter *iter,
Packit 76ec6a
                             gpointer user_data)
Packit 76ec6a
    {
Packit 76ec6a
        const guint index = GPOINTER_TO_UINT(user_data);
Packit 76ec6a
Packit 76ec6a
        GValue value = { 0 };
Packit 76ec6a
Packit 76ec6a
        gtk_tree_model_get_value(model, iter, index, &value);
Packit 76ec6a
Packit 76ec6a
        gint priority = g_value_get_int(&value);
Packit 76ec6a
Packit 76ec6a
        g_value_unset(&value);
Packit 76ec6a
Packit 76ec6a
        g_object_set(renderer, "text", procman::get_nice_level(priority), NULL);
Packit 76ec6a
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    gint priority_compare_func(GtkTreeModel* model, GtkTreeIter* first,
Packit 76ec6a
                            GtkTreeIter* second, gpointer user_data)
Packit 76ec6a
    {
Packit 76ec6a
        const guint index = GPOINTER_TO_UINT(user_data);
Packit 76ec6a
        GValue value1 = { 0 };
Packit 76ec6a
        GValue value2 = { 0 };
Packit 76ec6a
        gtk_tree_model_get_value(model, first, index, &value1);
Packit 76ec6a
        gtk_tree_model_get_value(model, second, index, &value2);
Packit 76ec6a
        gint result = g_value_get_int(&value1) - g_value_get_int(&value2);
Packit 76ec6a
        g_value_unset(&value1);
Packit 76ec6a
        g_value_unset(&value2);
Packit 76ec6a
        return result;
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    gint number_compare_func(GtkTreeModel* model, GtkTreeIter* first,
Packit 76ec6a
                            GtkTreeIter* second, gpointer user_data)
Packit 76ec6a
    {
Packit 76ec6a
        const guint index = GPOINTER_TO_UINT(user_data);
Packit 76ec6a
Packit 76ec6a
        guint64 size1, size2;
Packit 76ec6a
        size1 = get_size_from_column(model, first, index);
Packit 76ec6a
        size2 = get_size_from_column(model, second, index);
Packit 76ec6a
Packit 76ec6a
        if ( size2 > size1 )
Packit 76ec6a
            return 1;
Packit 76ec6a
        else if ( size2 < size1 )
Packit 76ec6a
            return -1;
Packit 76ec6a
        return 0;
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
    template<>
Packit 76ec6a
    void tree_store_update<const char>(GtkTreeModel* model, GtkTreeIter* iter, int column, const char* new_value)
Packit 76ec6a
    {
Packit 76ec6a
        char* current_value;
Packit 76ec6a
Packit 76ec6a
        gtk_tree_model_get(model, iter, column, &current_value, -1);
Packit 76ec6a
Packit 76ec6a
        if (g_strcmp0(current_value, new_value) != 0)
Packit 76ec6a
            gtk_tree_store_set(GTK_TREE_STORE(model), iter, column, new_value, -1);
Packit 76ec6a
Packit 76ec6a
        g_free(current_value);
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
    std::string format_rate(guint64 rate, bool want_bits)
Packit 76ec6a
    {
Packit 76ec6a
        char* bytes = procman::format_size(rate, want_bits);
Packit 76ec6a
        // xgettext: rate, 10MiB/s or 10Mbit/s
Packit 76ec6a
        std::string formatted_rate(make_string(g_strdup_printf(_("%s/s"), bytes)));
Packit 76ec6a
        g_free(bytes);
Packit 76ec6a
        return formatted_rate;
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
    std::string format_network(guint64 rate)
Packit 76ec6a
    {
Packit 76ec6a
        char* bytes = procman::format_size(rate, GsmApplication::get()->config.network_in_bits);
Packit 76ec6a
        std::string formatted(bytes);
Packit 76ec6a
        g_free(bytes);
Packit 76ec6a
        return formatted;
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
    std::string format_network_rate(guint64 rate)
Packit 76ec6a
    {
Packit 76ec6a
        return procman::format_rate(rate, GsmApplication::get()->config.network_in_bits);
Packit 76ec6a
    }
Packit 76ec6a
Packit 76ec6a
}
Packit 76ec6a
Packit 76ec6a
Glib::ustring
Packit 76ec6a
get_monospace_system_font_name ()
Packit 76ec6a
{
Packit 76ec6a
    return Gio::Settings::create ("org.gnome.desktop.interface")->get_string ("monospace-font-name");
Packit 76ec6a
}