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 + -
显示快捷键?