2016-11-24 15:26:45 +00:00
|
|
|
/*
|
|
|
|
*
|
|
|
|
* gkrellm_hdplop.c
|
|
|
|
* dae (jolly.frederic@fnac.net)
|
|
|
|
*
|
|
|
|
* gkrellm plugin for wmhdplop:
|
|
|
|
* http://hules.free.fr/wmhdplop/
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
|
|
* 02111-1307, USA.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <libgen.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
#include "global.h"
|
|
|
|
#include "wmhdplop.h"
|
|
|
|
#define PLUGIN_VERSION VERSION
|
|
|
|
|
|
|
|
#define PLUGIN_NAME "gkhdplop"
|
|
|
|
#define PLUGIN_DESC "wmhdplop gkrellm port"
|
|
|
|
#define PLUGIN_URL "http://hules.free.fr/wmhdplop/"
|
|
|
|
#define PLUGIN_STYLE PLUGIN_NAME
|
|
|
|
#define PLUGIN_KEYWORD PLUGIN_NAME
|
|
|
|
|
|
|
|
|
|
|
|
static GkrellmMonitor *mon = NULL;
|
|
|
|
static GkrellmChart *chart = NULL;
|
|
|
|
static GkrellmChartconfig *chart_config = NULL;
|
|
|
|
|
|
|
|
#define TIMER1 50 /* main updates every 40 ms */
|
|
|
|
#define TIMER2 50 * TIMER1 /* small updates every 1600 ms */
|
|
|
|
|
|
|
|
#define PLUGIN_HEIGHT 64
|
|
|
|
|
|
|
|
static gint timeout_id;
|
|
|
|
static int option_timer = 0;
|
|
|
|
|
|
|
|
/* Options stuffs */
|
|
|
|
GtkWidget *swap_check = NULL;
|
|
|
|
GtkWidget *io_check = NULL;
|
|
|
|
GtkWidget *leds_check = NULL;
|
|
|
|
GtkWidget *colormap = NULL;
|
|
|
|
GtkWidget *hdlist_check = NULL;
|
|
|
|
GtkWidget *throughput_threshold = NULL;
|
|
|
|
GtkWidget *hddtemp_check = NULL;
|
|
|
|
GtkWidget *entry_smallfont = NULL, *entry_bigfont = NULL;
|
|
|
|
|
|
|
|
static gboolean update_plugin(void)
|
|
|
|
{
|
|
|
|
GdkEventExpose event;
|
|
|
|
gint ret_val;
|
|
|
|
gtk_signal_emit_by_name(GTK_OBJECT(chart->drawing_area), "expose_event", &event, &ret_val);
|
|
|
|
return TRUE; /* restart timer */
|
|
|
|
}
|
|
|
|
|
|
|
|
static gint chart_expose_event(GtkWidget *widget UNUSED, GdkEventExpose *ev UNUSED)
|
|
|
|
{
|
|
|
|
int update_options = 0;
|
|
|
|
option_timer++;
|
|
|
|
if (option_timer == TIMER2 / TIMER1) {
|
|
|
|
option_timer = 0;
|
|
|
|
update_options = 1;
|
|
|
|
}
|
|
|
|
gkrellm_hdplop_update(update_options);
|
|
|
|
gkrellm_draw_chart_to_screen(chart);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gint wheel_event(GtkWidget *widget UNUSED, GdkEventScroll *ev)
|
|
|
|
{
|
|
|
|
if (ev->direction == GDK_SCROLL_UP)
|
|
|
|
next_displayed_hd(); //change_displayed_hd(+1);
|
|
|
|
else if (ev->direction == GDK_SCROLL_DOWN)
|
|
|
|
prev_displayed_hd(); //change_displayed_hd(-1);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gint button_release_event(GtkWidget *widget UNUSED, GdkEventButton *ev, gpointer data UNUSED)
|
|
|
|
{
|
|
|
|
if (ev->button == 3) {
|
|
|
|
gkrellm_open_config_window(mon);
|
|
|
|
} else if (ev->button == 1) {
|
|
|
|
change_displayed_hd(+1);
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void disable_plugin(void)
|
|
|
|
{
|
|
|
|
if (timeout_id)
|
|
|
|
gtk_timeout_remove(timeout_id);
|
|
|
|
timeout_id = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void create_plugin(GtkWidget *vbox, gint first_create)
|
|
|
|
{
|
|
|
|
if(first_create) {
|
|
|
|
chart = gkrellm_chart_new0();
|
|
|
|
}
|
|
|
|
|
|
|
|
gkrellm_set_chart_height_default(chart, PLUGIN_HEIGHT);
|
|
|
|
gkrellm_chart_create(vbox, mon, chart, &chart_config);
|
|
|
|
|
|
|
|
if (first_create) {
|
|
|
|
hdplop_main(chart->w, chart->h, chart->drawing_area->window);
|
|
|
|
} else {
|
|
|
|
dockimlib2_gkrellm_xinit(app->dock, chart->drawing_area->window);
|
|
|
|
reshape(chart->w, chart->h);
|
|
|
|
}
|
|
|
|
if (first_create) {
|
|
|
|
//printf("chart : w=%d, h=%d\n", chart->w, chart->h);
|
|
|
|
gtk_signal_connect(GTK_OBJECT(chart->drawing_area),
|
|
|
|
"expose_event", (GtkSignalFunc) chart_expose_event, NULL);
|
|
|
|
gtk_signal_connect(GTK_OBJECT(chart->drawing_area),
|
|
|
|
"button_release_event", GTK_SIGNAL_FUNC(button_release_event), NULL);
|
|
|
|
g_signal_connect(G_OBJECT(chart->drawing_area),
|
|
|
|
"scroll_event", G_CALLBACK(wheel_event), NULL);
|
|
|
|
}
|
|
|
|
/* Update plugin every TIMER1 ms */
|
|
|
|
if (!timeout_id)
|
|
|
|
timeout_id = g_timeout_add(TIMER1, (GtkFunction) update_plugin, NULL);
|
|
|
|
gkrellm_disable_plugin_connect(mon, disable_plugin);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void option_toggled_cb(GtkToggleButton *button, gpointer user_data UNUSED)
|
|
|
|
{
|
|
|
|
gboolean active = gtk_toggle_button_get_active(button);
|
|
|
|
GtkWidget *togglebutton = GTK_WIDGET(button);
|
|
|
|
|
|
|
|
if (togglebutton == swap_check) {
|
|
|
|
Prefs.disable_swap_matrix = !active;
|
|
|
|
}
|
|
|
|
else if (togglebutton == io_check) {
|
|
|
|
Prefs.disable_io_matrix = !active;
|
|
|
|
}
|
|
|
|
else if (togglebutton == hdlist_check) {
|
|
|
|
if (active) {
|
|
|
|
Prefs.hdlist_pos = AL_BOTTOM + AL_LEFT;
|
|
|
|
gtk_widget_set_sensitive(leds_check, TRUE);
|
|
|
|
gtk_widget_set_sensitive(hddtemp_check, TRUE);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Prefs.hdlist_pos = AL_NONE;
|
|
|
|
gtk_widget_set_sensitive(leds_check, FALSE);
|
|
|
|
gtk_widget_set_sensitive(hddtemp_check, FALSE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (togglebutton == leds_check) {
|
|
|
|
Prefs.disable_hd_leds = !active;
|
|
|
|
}
|
|
|
|
else if (togglebutton == hddtemp_check) {
|
|
|
|
Prefs.enable_hddtemp = active;
|
|
|
|
app->displayed_hd_changed = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void cb_colormap_modified(GtkWidget *widget UNUSED, GtkSpinButton *spin)
|
|
|
|
{
|
|
|
|
Prefs.iomatrix_colormap = gtk_spin_button_get_value_as_int(spin);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void cb_spinbutton_modified(GtkWidget *widget UNUSED, GtkSpinButton *spin)
|
|
|
|
{
|
|
|
|
if (GTK_WIDGET(spin) == throughput_threshold) {
|
|
|
|
Prefs.popup_throughput_threshold = gtk_spin_button_get_value_as_float(spin);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void cb_reload_fonts(GtkWidget *widget) {
|
2016-11-24 15:26:51 +00:00
|
|
|
(void) widget;
|
2016-11-24 15:26:45 +00:00
|
|
|
if (strcmp(gtk_entry_get_text(GTK_ENTRY(entry_smallfont)), app->current_smallfont_name) ||
|
|
|
|
strcmp(gtk_entry_get_text(GTK_ENTRY(entry_bigfont)), app->current_bigfont_name)) {
|
|
|
|
ASSIGN_STRING(Prefs.smallfontname, gtk_entry_get_text(GTK_ENTRY(entry_smallfont)));
|
|
|
|
ASSIGN_STRING(Prefs.bigfontname, gtk_entry_get_text(GTK_ENTRY(entry_bigfont)));
|
|
|
|
init_fonts(app);
|
|
|
|
if (app->smallfont == NULL) {
|
|
|
|
gkrellm_config_message_dialog("font problem..", "could not load the small font");
|
|
|
|
} else gtk_entry_set_text(GTK_ENTRY(entry_smallfont), app->current_smallfont_name);
|
|
|
|
if (app->bigfont == NULL) {
|
|
|
|
gkrellm_config_message_dialog("font problem..", "could not load the big font");
|
|
|
|
} else gtk_entry_set_text(GTK_ENTRY(entry_bigfont), app->current_bigfont_name);
|
|
|
|
/* force recomputations of some dimensions */
|
|
|
|
app->displayed_hd_changed = 1; app->reshape_cnt++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void create_plugin_tab(GtkWidget *tab_vbox)
|
|
|
|
{
|
|
|
|
GtkWidget *tabs = NULL;
|
|
|
|
GtkWidget *options_tab = NULL;
|
|
|
|
GtkWidget *info_tab = NULL;
|
|
|
|
GtkWidget *info = NULL;
|
|
|
|
GtkWidget *about_tab = NULL;
|
|
|
|
GtkWidget *about = NULL;
|
|
|
|
GtkWidget *main_box;
|
|
|
|
|
|
|
|
static gchar *info_text[] =
|
|
|
|
{
|
|
|
|
"<b>" PLUGIN_NAME "\n\n",
|
|
|
|
PLUGIN_DESC "\n\n",
|
|
|
|
"improve your productivity with " PLUGIN_NAME ":\n",
|
|
|
|
"It monitors your hard-drives by sending visual stimuli to your cortex\n",
|
|
|
|
"each time your /dev/hdx writes or reads anything.\n",
|
|
|
|
"Try to launch openoffice and enjoy the gkhdplop show!\n\n",
|
|
|
|
"<i>Usage:\n\n",
|
|
|
|
"- Change the hard drive with the mouse wheel\n",
|
|
|
|
"- Animation reflecting swap activity...\n",
|
|
|
|
"- Background animation reflecting disk activity...\n",
|
|
|
|
"- Small led indicating disk activity...\n",
|
|
|
|
"- Several glittering color schemes...\n",
|
|
|
|
"- Popup display with the io throughput...\n",
|
|
|
|
};
|
|
|
|
|
|
|
|
static gchar *about_text =
|
|
|
|
_(
|
|
|
|
PLUGIN_NAME " " PLUGIN_VERSION "\n"
|
|
|
|
"a " PLUGIN_DESC "\n\n"
|
|
|
|
"Copyright (c) 2004 dae\n"
|
|
|
|
"jolly.frederic@fnac.net\n"
|
|
|
|
"http://quadaemon.free.fr\n\n"
|
|
|
|
"Based on wmhdplop\nCopyright (c) 2003,2004 pouaite\n"
|
|
|
|
PLUGIN_URL "\n\n"
|
|
|
|
"Released under the GNU Public Licence"
|
|
|
|
);
|
|
|
|
|
|
|
|
tabs = gtk_notebook_new();
|
|
|
|
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(tabs), GTK_POS_TOP);
|
|
|
|
gtk_box_pack_start(GTK_BOX(tab_vbox), tabs, TRUE, TRUE, 0);
|
|
|
|
|
|
|
|
/* Options tab */
|
|
|
|
options_tab = gkrellm_gtk_notebook_page(tabs, _("Options"));
|
|
|
|
|
|
|
|
main_box = gtk_vbox_new(FALSE, 0);
|
|
|
|
gtk_widget_set_name(main_box, "main_box");
|
|
|
|
gtk_widget_ref(main_box);
|
|
|
|
gtk_object_set_data_full(GTK_OBJECT (options_tab), "main_box", main_box,
|
|
|
|
(GtkDestroyNotify) gtk_widget_unref);
|
|
|
|
gtk_widget_show(main_box);
|
|
|
|
gtk_container_add(GTK_CONTAINER (options_tab), main_box);
|
|
|
|
|
|
|
|
/* io button */
|
|
|
|
gkrellm_gtk_check_button_connected(main_box, &io_check, !Prefs.disable_io_matrix, 1, 1, 0,
|
|
|
|
option_toggled_cb, NULL, _("Show disk activity"));
|
|
|
|
/* swap button */
|
|
|
|
gkrellm_gtk_check_button_connected(main_box, &swap_check, !Prefs.disable_swap_matrix, 1, 1, 0,
|
|
|
|
option_toggled_cb, NULL, _("Show swap activity"));
|
|
|
|
/* hdlist button */
|
|
|
|
gkrellm_gtk_check_button_connected(main_box, &hdlist_check,
|
|
|
|
(Prefs.hdlist_pos == AL_NONE)?FALSE:TRUE, 1, 1, 0,
|
|
|
|
option_toggled_cb, NULL, _("Show disk name"));
|
|
|
|
/* leds button */
|
|
|
|
gkrellm_gtk_check_button_connected(main_box, &leds_check, !Prefs.disable_hd_leds, 1, 1, 0,
|
|
|
|
option_toggled_cb, NULL, _("Led indicating disk activity"));
|
|
|
|
gtk_widget_set_sensitive(leds_check, (Prefs.hdlist_pos == AL_NONE)?FALSE:TRUE);
|
|
|
|
/* hddtemp button */
|
|
|
|
gkrellm_gtk_check_button_connected(main_box, &hddtemp_check, Prefs.enable_hddtemp, 1, 1, 0,
|
|
|
|
option_toggled_cb, NULL,
|
|
|
|
_("Display hd temperature (requires hddtemp daemon running on port 7634)"));
|
|
|
|
gtk_widget_set_sensitive(hddtemp_check, (Prefs.hdlist_pos == AL_NONE)?FALSE:TRUE);
|
|
|
|
/* colormap spin button */
|
|
|
|
gkrellm_gtk_spin_button(main_box, NULL, Prefs.iomatrix_colormap, 0, 4, 1, 1, 0, 0,
|
|
|
|
cb_colormap_modified, NULL, FALSE, _("Colormap"));
|
|
|
|
|
|
|
|
/* threshold spin button */
|
|
|
|
gkrellm_gtk_spin_button(main_box, &throughput_threshold, Prefs.popup_throughput_threshold, 0., 500, 0.1, 1, 1, 0,
|
|
|
|
cb_spinbutton_modified, NULL, FALSE, _("minimum io throughput (MB/s)"));
|
|
|
|
|
|
|
|
{
|
|
|
|
GtkWidget *frame = gtk_frame_new("Fonts");
|
|
|
|
gtk_box_pack_start(GTK_BOX(main_box), frame, TRUE, FALSE, 0);
|
|
|
|
|
|
|
|
GtkWidget *hbox0 = gtk_hbox_new(FALSE, 4);
|
|
|
|
gtk_container_add(GTK_CONTAINER(frame), hbox0);
|
|
|
|
|
|
|
|
GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
|
|
|
|
gtk_box_pack_start(GTK_BOX(hbox0), vbox, TRUE, FALSE, 0);
|
|
|
|
|
|
|
|
GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
|
|
|
|
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, FALSE, 0);
|
|
|
|
entry_smallfont = gtk_entry_new();
|
|
|
|
gtk_box_pack_start(GTK_BOX(hbox), entry_smallfont, TRUE, FALSE, 0);
|
|
|
|
GtkWidget *pLabel = gtk_label_new("Small font (without .ttf extension):");
|
|
|
|
gtk_entry_set_text(GTK_ENTRY(entry_smallfont), app->current_smallfont_name);
|
|
|
|
gtk_box_pack_start(GTK_BOX(hbox), pLabel, TRUE, FALSE, 0);
|
|
|
|
|
|
|
|
hbox = gtk_hbox_new(FALSE, 0);
|
|
|
|
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, FALSE, 0);
|
|
|
|
entry_bigfont = gtk_entry_new();
|
|
|
|
gtk_box_pack_start(GTK_BOX(hbox), entry_bigfont, TRUE, FALSE, 0);
|
|
|
|
gtk_entry_set_text(GTK_ENTRY(entry_bigfont), app->current_bigfont_name);
|
|
|
|
pLabel = gtk_label_new("Big font (without .ttf extension)");
|
|
|
|
gtk_box_pack_start(GTK_BOX(hbox), pLabel, TRUE, FALSE, 0);
|
|
|
|
|
|
|
|
gkrellm_gtk_button_connected(hbox0, NULL, TRUE/* expand*/, TRUE /* fill*/, 0 /*pad*/,
|
|
|
|
G_CALLBACK(cb_reload_fonts), NULL, "reload fonts");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Info tab */
|
|
|
|
info_tab = gkrellm_gtk_framed_notebook_page(tabs, _("Info"));
|
|
|
|
info = gkrellm_gtk_scrolled_text_view(info_tab, NULL, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
|
|
|
|
|
|
|
gkrellm_gtk_text_view_append_strings(info, info_text, sizeof(info_text) / sizeof(gchar *));
|
|
|
|
|
|
|
|
/* About tab */
|
|
|
|
about_tab = gkrellm_gtk_notebook_page(tabs, _("About"));
|
|
|
|
about = gtk_label_new(about_text);
|
|
|
|
gtk_box_pack_start(GTK_BOX(about_tab), about, TRUE, TRUE, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void save_plugin_config(FILE *f)
|
|
|
|
{
|
|
|
|
fprintf(f, "%s options %d %d %d %d %d %d %f smallfont=%s bigfont=%s\n", PLUGIN_KEYWORD,
|
|
|
|
Prefs.disable_swap_matrix,
|
|
|
|
Prefs.disable_io_matrix,
|
|
|
|
Prefs.disable_hd_leds,
|
|
|
|
Prefs.hdlist_pos,
|
|
|
|
Prefs.enable_hddtemp,
|
|
|
|
Prefs.iomatrix_colormap,
|
|
|
|
Prefs.popup_throughput_threshold,
|
|
|
|
app->current_smallfont_name, app->current_bigfont_name);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void load_plugin_config(gchar *config_line)
|
|
|
|
{
|
|
|
|
char sf[1000], bf[1000]; sf[0] = bf[0] = 0;
|
|
|
|
int n =sscanf(config_line, "options %d %d %d %d %d %d %f smallfont=%1000s bigfont=%1000s",
|
|
|
|
&Prefs.disable_swap_matrix,
|
|
|
|
&Prefs.disable_io_matrix,
|
|
|
|
&Prefs.disable_hd_leds,
|
|
|
|
&Prefs.hdlist_pos,
|
|
|
|
&Prefs.enable_hddtemp,
|
|
|
|
&Prefs.iomatrix_colormap,
|
|
|
|
&Prefs.popup_throughput_threshold,
|
|
|
|
sf, bf);
|
|
|
|
if (n>= 8) Prefs.smallfontname = strdup(sf);
|
|
|
|
if (n>= 9) Prefs.bigfontname = strdup(bf);
|
|
|
|
}
|
|
|
|
|
|
|
|
static GkrellmMonitor hdplop_mon =
|
|
|
|
{
|
|
|
|
PLUGIN_NAME, /* Name, for config tab. */
|
|
|
|
0, /* Id, 0 if a plugin */
|
|
|
|
create_plugin, /* The create_plugin() function */
|
|
|
|
NULL, /* The update_plugin() function */
|
|
|
|
create_plugin_tab, /* The create_plugin_tab() config function */
|
|
|
|
NULL, /* The apply_plugin_config() function */
|
|
|
|
|
|
|
|
save_plugin_config, /* The save_plugin_config() function */
|
|
|
|
load_plugin_config, /* The load_plugin_config() function */
|
|
|
|
PLUGIN_KEYWORD, /* config keyword */
|
|
|
|
|
|
|
|
NULL, /* Undefined 2 */
|
|
|
|
NULL, /* Undefined 1 */
|
|
|
|
NULL, /* private */
|
|
|
|
|
|
|
|
MON_CPU, /* Insert plugin before this monitor. */
|
|
|
|
NULL, /* Handle if a plugin, filled in by GKrellM */
|
|
|
|
NULL /* path if a plugin, filled in by GKrellM */
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
GkrellmMonitor *gkrellm_init_plugin(void)
|
|
|
|
{
|
|
|
|
gkrellm_add_meter_style(&hdplop_mon, PLUGIN_STYLE);
|
|
|
|
return (mon = &hdplop_mon);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|