uptime.c
来自「系统任务管理器」· C语言 代码 · 共 316 行
C
316 行
/* GKrellM| Copyright (C) 1999-2006 Bill Wilson|| Author: Bill Wilson billw@gkrellm.net| Latest versions might be found at: http://gkrellm.net|| This program is free software which I release under the GNU General Public| License. You may redistribute and/or modify this program under the terms| of that 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. Version 2 is in the| COPYRIGHT file in the top level directory of this distribution.| | To get a copy of the GNU General Puplic License, write to the Free Software| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/#include "gkrellm.h"#include "gkrellm-private.h"#include "gkrellm-sysdeps.h"GkrellmMonitor *mon_uptime;static GkrellmPanel *uptime;static GkrellmDecal *decal_uptime;static GkrellmLauncher launch;static time_t base_uptime, uptime_seconds;time_t (*read_uptime)();static gint style_id;static gboolean uptime_enabled = TRUE;static gbooleansetup_uptime_interface(void) { if (!read_uptime && !_GK.client_mode && gkrellm_sys_uptime_init()) { read_uptime = gkrellm_sys_uptime_read_uptime; } return read_uptime ? TRUE : FALSE; }voidgkrellm_uptime_client_divert(time_t (*read_func)()) { read_uptime = read_func; }voidgkrellm_uptime_set_base_uptime(time_t base) { base_uptime = base; }static gintuptime_expose_event(GtkWidget *widget, GdkEventExpose *ev) { if (widget == uptime->drawing_area) { gdk_draw_drawable(widget->window, gkrellm_draw_GC(1), uptime->pixmap, ev->area.x, ev->area.y, ev->area.x, ev->area.y, ev->area.width, ev->area.height); } return FALSE; }static voiddraw_upminutes(gint minutes) { GkrellmTextstyle *ts; gint w1, w2, w; gint days, hours; gchar buf1[16], buf2[16], *s; ts = gkrellm_meter_textstyle(style_id); hours = minutes / 60; minutes %= 60; days = hours / 24; hours %= 24; s = buf1; snprintf(buf1, sizeof(buf1), "%dd %2d:%02d", days, hours, minutes); snprintf(buf2, sizeof(buf2), "%dd%2d:%02d", days, hours, minutes); w = w1 = gkrellm_gdk_string_width(ts->font, buf1); if (w1 > decal_uptime->w) { if ((w2 = gkrellm_gdk_string_width(ts->font, buf2)) > decal_uptime->w) { ts = gkrellm_meter_alt_textstyle(style_id); w = gkrellm_gdk_string_width(ts->font, buf1); } else { s = buf2; w = w2; } } /* Last chance to fit it in. */ if (w > decal_uptime->w) { snprintf(buf1, sizeof(buf1), "%dd%2d:", days, hours); s = buf1; } decal_uptime->x_off = (decal_uptime->w - w) / 2; if (decal_uptime->x_off < 0) decal_uptime->x_off = 0; decal_uptime->text_style.font = ts->font; gkrellm_draw_decal_text(uptime, decal_uptime, s, minutes); gkrellm_draw_panel_layers(uptime); }static voidupdate_uptime(void) { gint up_minutes; if (!uptime_enabled) return; /* Once every 10 seconds is default update period. */ if (GK.ten_second_tick || _GK.up_minutes < 0) { uptime_seconds = (*read_uptime)(); if (uptime_seconds > 0) up_minutes = (gint) (uptime_seconds / 60); else up_minutes = (gint)(time(0) - _GK.start_time + base_uptime) / 60; if (_GK.up_minutes != up_minutes) draw_upminutes(up_minutes); _GK.up_minutes = up_minutes; } }static voidcreate_uptime(GtkWidget *vbox, gint first_create) { GkrellmStyle *style; GkrellmMargin *m; GkrellmTextstyle *ts; gint w, chart_width = gkrellm_chart_width(); if (first_create) uptime = gkrellm_panel_new0(); style = gkrellm_meter_style(style_id); m = gkrellm_get_style_margins(style); ts = gkrellm_meter_textstyle(style_id); w = gkrellm_gdk_string_width(ts->font, "999d 23:99") + 2; if (w > chart_width - m->left - m->right) w = chart_width - m->left - m->right; decal_uptime = gkrellm_create_decal_text(uptime, "9d 12:99", ts, style, -1, -1, w); decal_uptime->x = (chart_width - decal_uptime->w) / 2; gkrellm_panel_configure(uptime, NULL, style); gkrellm_panel_create(vbox, mon_uptime, uptime); if (!uptime_enabled) { gkrellm_panel_hide(uptime); gkrellm_spacers_hide(mon_uptime); } else gkrellm_spacers_show(mon_uptime); if (first_create) g_signal_connect(G_OBJECT (uptime->drawing_area), "expose_event", G_CALLBACK(uptime_expose_event), NULL); gkrellm_setup_launcher(uptime, &launch, METER_PANEL_TYPE, 0); _GK.up_minutes = -1; update_uptime(); }#define UPTIME_CONFIG_KEYWORD "uptime"static voidsave_uptime_config(FILE *f) { fprintf(f, "%s enable %d\n", UPTIME_CONFIG_KEYWORD, uptime_enabled); fprintf(f, "%s launch %s\n", UPTIME_CONFIG_KEYWORD, launch.command); fprintf(f, "%s tooltip %s\n", UPTIME_CONFIG_KEYWORD, launch.tooltip_comment); }static voidload_uptime_config(gchar *arg) { gchar config[32], item[CFG_BUFSIZE]; gint n; n = sscanf(arg, "%31s %[^\n]", config, item); if (n == 2) { if (strcmp(config, "enable") == 0) sscanf(item, "%d", &uptime_enabled); else if (strcmp(config, "launch") == 0) launch.command = g_strdup(item); else if (strcmp(config, "tooltip") == 0) launch.tooltip_comment = g_strdup(item); } }/* --------------------------------------------------------------------- */static GtkWidget *uptime_enabled_button;static GtkWidget *launch_entry, *tooltip_entry;static voidcb_enable(GtkWidget *widget, gpointer data) { uptime_enabled = GTK_TOGGLE_BUTTON(uptime_enabled_button)->active; if (uptime_enabled) { gkrellm_panel_show(uptime); gkrellm_spacers_show(mon_uptime); } else { gkrellm_panel_hide(uptime); gkrellm_spacers_hide(mon_uptime); } }static voidcb_launch_entry(GtkWidget *widget, gpointer data) { gkrellm_apply_launcher(&launch_entry, &tooltip_entry, uptime, &launch, gkrellm_launch_button_cb); }static voidcreate_uptime_tab(GtkWidget *tab_vbox) { GtkWidget *tabs, *table, *vbox, *vbox1; 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 */ vbox = gkrellm_gtk_framed_notebook_page(tabs, _("Setup")); vbox1 = gkrellm_gtk_framed_vbox(vbox, _("Options"), 4, FALSE, 0, 2); gkrellm_gtk_check_button_connected(vbox1, &uptime_enabled_button, uptime_enabled, FALSE, FALSE, 10, cb_enable, NULL, _("Enable Uptime")); vbox1 = gkrellm_gtk_framed_vbox_end(vbox, _("Launch Commands"), 4, FALSE, 0, 2); table = gkrellm_gtk_launcher_table_new(vbox1, 1); gkrellm_gtk_config_launcher(table, 0, &launch_entry, &tooltip_entry, _("Uptime"), &launch); g_signal_connect(G_OBJECT(launch_entry), "changed", G_CALLBACK(cb_launch_entry), NULL); g_signal_connect(G_OBJECT(tooltip_entry), "changed", G_CALLBACK(cb_launch_entry), NULL); }static GkrellmMonitor monitor_uptime = { N_("Uptime"), /* Name, for config tab. */ MON_UPTIME, /* Id, 0 if a plugin */ create_uptime, /* The create function */ update_uptime, /* The update function */ create_uptime_tab, /* The config tab create function */ NULL, /* Instant config */ save_uptime_config, /* Save user conifg */ load_uptime_config, /* Load user config */ UPTIME_CONFIG_KEYWORD, /* config keyword */ NULL, /* Undef 2 */ NULL, /* Undef 1 */ NULL, /* Undef 0 */ 0, /* insert_before_id - place plugin before this mon */ NULL, /* Handle if a plugin, filled in by GKrellM */ NULL /* path if a plugin, filled in by GKrellM */ };GkrellmMonitor *gkrellm_init_uptime_monitor(void) { monitor_uptime.name = _(monitor_uptime.name); style_id = gkrellm_add_meter_style(&monitor_uptime, UPTIME_STYLE_NAME); mon_uptime = &monitor_uptime; if (setup_uptime_interface()) return &monitor_uptime; return NULL; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?