|
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, ¢iseconds, 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, ¤t_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 |
}
|