⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alerts.c

📁 系统任务管理器
💻 C
📖 第 1 页 / 共 3 页
字号:
/* 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 <math.h>static GList	*gkrellm_alert_list,				*alert_plugin_list;static voidrun_command(GkrellmAlert *alert, gchar *command)	{	gchar	cmd[1024];	if (!command || !*command)		return;	if (alert->cb_command_process)		(*alert->cb_command_process)(alert, command, cmd, sizeof(cmd),				alert->cb_command_process_data);	else		snprintf(cmd, sizeof(cmd), "%s", command);	g_spawn_command_line_async(cmd, NULL);	}voidgkrellm_render_default_alert_decal(GkrellmAlert *alert)	{	GkrellmPiximage	*im;	GkrellmAlertdecal		*ad;	if (!alert)		return;	ad = &alert->ad;	if (ad->w <= 0 || ad->h <= 0)		return;	if (alert->high.alarm_on || alert->low.alarm_on)		gkrellm_get_decal_alarm_piximage(&im, &ad->nframes);	else if (alert->high.warn_on || alert->low.warn_on)		gkrellm_get_decal_warn_piximage(&im, &ad->nframes);	else		return;	gkrellm_scale_piximage_to_pixmap(im, &ad->pixmap, &ad->mask, ad->w,				ad->h * ad->nframes);	}gbooleangkrellm_alert_decal_visible(GkrellmAlert *alert)	{	if (alert && alert->ad.decal)		return TRUE;	return FALSE;	}static gbooleancreate_alert_objects(GkrellmAlert *alert)	{	GkrellmAlertdecal		*ad;//	GkrellmKrell			*k;	/* Whichever monitor created the alert that is being triggered:	|  1) has set a panel pointer in the create and is done, so I will make	|     here a default panel sized alert decal for him, or	|  2) has not set a panel ptr, but will do so in the callback and then	|     let me make the default alert, or	|  3) has done one of the 2 above panel possibilities, and will also	|     render a custom size/position for the alert decal and set the pixmap.	|     For this case, the alert decal may be a render of the default decal	|     image or may be a custom image from the monitor.  The work needed is	|     setting ad x,y,w,h and nframes and rendering to ad->pixmap.	*/	if (alert->cb_trigger)		(*alert->cb_trigger)(alert, alert->cb_trigger_data);	if (!alert->panel)		return FALSE;		/* Monitor may need trigger deferred */	ad = &alert->ad;	if (!alert->ad.pixmap /* && style is decal alert */)		{		ad->x = 0;		ad->y = 0;		ad->w = alert->panel->w;		ad->h = alert->panel->h;		gkrellm_render_default_alert_decal(alert);		}	/* Don't let create_decal append the decal, I want to insert it first so	|  it will appear under all other panel decals.	*/	ad->decal = gkrellm_create_decal_pixmap(NULL, ad->pixmap, ad->mask,				ad->nframes, NULL, ad->x, ad->y);	gkrellm_insert_decal(alert->panel, ad->decal, FALSE /* prepend */);#if 0	k = gkrellm_create_krell(NULL,			gkrellm_krell_mini_piximage(), gkrellm_krell_mini_style());	k->y0 = 5;	k->full_scale = 100;	alert->ak.krell = k;	gkrellm_insert_krell(alert->panel, k, TRUE);#endif	return TRUE;	}static voiddestroy_alert_objects(GkrellmAlert *alert)	{	gkrellm_destroy_decal(alert->ad.decal);	if (alert->ad.pixmap)		g_object_unref(G_OBJECT(alert->ad.pixmap));	alert->ad.pixmap = NULL;	alert->ad.mask = NULL;	alert->ad.decal = NULL;	gkrellm_destroy_krell(alert->ak.krell);	alert->ak.krell = NULL;	}static voidplugin_warn(GkrellmAlert *alert, gboolean state)	{	GList					*list;	GkrellmAlertPlugin		*gap;	GkrellmAlertPluginLink	*apl;	for (list = alert->plugin_list; list; list = list->next)		{		apl = (GkrellmAlertPluginLink *) list->data;		gap = apl->alert_plugin;		if (MONITOR_ENABLED(gap->mon) && gap->warn_func)			(*gap->warn_func)(alert, apl->data, state);		}	}static voidplugin_alarm(GkrellmAlert *alert, gboolean state)	{	GList					*list;	GkrellmAlertPlugin		*gap;	GkrellmAlertPluginLink	*apl;	for (list = alert->plugin_list; list; list = list->next)		{		apl = (GkrellmAlertPluginLink *) list->data;		gap = apl->alert_plugin;		if (MONITOR_ENABLED(gap->mon) && gap->alarm_func)			(*gap->alarm_func)(alert, apl->data, state);		}	}static voidtrigger_warn(GkrellmAlert *alert, GkrellmTrigger *trigger)	{	if (!trigger->warn_on)		{		trigger->warn_on = TRUE;		create_alert_objects(alert);		gkrellm_alert_list = g_list_append(gkrellm_alert_list, alert);		if (!alert->suppress_command)			{			run_command(alert, alert->warn_command);			plugin_warn(alert, ON);			}		alert->suppress_command = FALSE;		alert->warn_repeat = alert->warn_repeat_set;		}	}static voidstop_warn(GkrellmAlert *alert, GkrellmTrigger *trigger)	{	if (trigger->warn_on)		{		plugin_warn(alert, OFF);		trigger->warn_on = FALSE;		destroy_alert_objects(alert);		gkrellm_alert_list = g_list_remove(gkrellm_alert_list, alert);		alert->warn_repeat = 0;		alert->suppress_command = FALSE;		}	}static voidtrigger_alarm(GkrellmAlert *alert, GkrellmTrigger *trigger)	{	if (!trigger->alarm_on)		{		trigger->alarm_on = TRUE;		trigger->warn_delay = 0;		create_alert_objects(alert);		gkrellm_alert_list = g_list_append(gkrellm_alert_list, alert);		if (!alert->suppress_command)			{			run_command(alert, alert->alarm_command);			plugin_alarm(alert, ON);			}		alert->suppress_command = FALSE;		alert->alarm_repeat = alert->alarm_repeat_set;		}	}static voidstop_alarm(GkrellmAlert *alert, GkrellmTrigger *trigger)	{	if (trigger->alarm_on)		{		plugin_alarm(alert, OFF);		trigger->alarm_on = FALSE;		destroy_alert_objects(alert);		gkrellm_alert_list = g_list_remove(gkrellm_alert_list, alert);		alert->alarm_repeat = 0;;		alert->suppress_command = FALSE;		}	}voidgkrellm_freeze_alert(GkrellmAlert *alert)	{	if (alert)		alert->freeze = TRUE;	}voidgkrellm_thaw_alert(GkrellmAlert *alert)	{	if (alert)		alert->freeze = FALSE;	}static gbooleancheck_high_alarm_limit(GkrellmAlert *alert, gfloat value)	{	GkrellmTrigger	*trigger = &alert->high;	if (value < trigger->alarm_limit)		{		trigger->alarm_delay = alert->delay;		return FALSE;		}	if (trigger->alarm_delay == 0)		{		if (trigger->warn_delay > 0)			trigger->warn_delay -= 1;		return TRUE;		}	trigger->alarm_delay -= 1;	return FALSE;	}static gbooleancheck_high_warn_limit(GkrellmAlert *alert, gfloat value)	{	GkrellmTrigger	*trigger = &alert->high;	if (value < trigger->warn_limit)		{		trigger->warn_delay = alert->delay;		return FALSE;		}	if (trigger->warn_delay == 0)		return TRUE;	trigger->warn_delay -= 1;	return FALSE;	}static gbooleancheck_low_warn_limit(GkrellmAlert *alert, gfloat value)	{	GkrellmTrigger	*trigger = &alert->low;	if (value > trigger->warn_limit)		{		trigger->warn_delay = alert->delay;		return FALSE;		}	if (trigger->warn_delay == 0)		return TRUE;	trigger->warn_delay -= 1;	return FALSE;	}static gbooleancheck_low_alarm_limit(GkrellmAlert *alert, gfloat value)	{	GkrellmTrigger	*trigger = &alert->low;	if (value > trigger->alarm_limit)		{		trigger->alarm_delay = alert->delay;		return FALSE;		}	if (trigger->alarm_delay == 0)		{		if (trigger->warn_delay > 0)			trigger->warn_delay -= 1;		return TRUE;		}	trigger->alarm_delay -= 1;	return FALSE;	}voidgkrellm_check_alert(GkrellmAlert *alert, gfloat value)	{	GList					*plist;	GkrellmAlertPlugin		*gap;	GkrellmAlertPluginLink	*apl;	if (!alert || !alert->activated || alert->freeze || !_GK.initialized)		return;	if (alert->delay == 0 || GK.second_tick)		{		if (alert->check_low)			{			if (check_low_alarm_limit(alert, value))				{								stop_alarm(alert, &alert->high);				stop_warn(alert, &alert->high);				stop_warn(alert, &alert->low);				trigger_alarm(alert, &alert->low);				}			else				{				stop_alarm(alert, &alert->low);				if (check_low_warn_limit(alert, value))					{					stop_alarm(alert, &alert->high);					stop_warn(alert, &alert->high);					trigger_warn(alert, &alert->low);					}				else					stop_warn(alert, &alert->low);				}			}		if (alert->check_high)			{			if (check_high_alarm_limit(alert, value))				{				stop_warn(alert, &alert->high);				stop_warn(alert, &alert->low);				stop_alarm(alert, &alert->low);				trigger_alarm(alert, &alert->high);				}			else				{				stop_alarm(alert, &alert->high);				if (check_high_warn_limit(alert, value))					{					stop_warn(alert, &alert->low);					stop_alarm(alert, &alert->low);					trigger_warn(alert, &alert->high);					}				else					stop_warn(alert, &alert->high);				}			}		}	for (plist = alert->plugin_list; plist; plist = plist->next)		{		apl = (GkrellmAlertPluginLink *) plist->data;		gap = apl->alert_plugin;		if (MONITOR_ENABLED(gap->mon) && gap->check_func)			(*gap->check_func)(alert, apl->data, value);		}	}voidgkrellm_alert_trigger_connect(GkrellmAlert *alert, void (*func)(),			gpointer data)	{	if (!alert)		return;	alert->cb_trigger = func;	alert->cb_trigger_data = data;	}voidgkrellm_alert_stop_connect(GkrellmAlert *alert, void (*func)(), gpointer data)	{	if (!alert)		return;	alert->cb_stop = func;	alert->cb_stop_data = data;	}static voiddestroy_alert(GkrellmAlert *alert)	{	GList					*plist, *list;	GkrellmAlertPlugin		*gap;	GkrellmAlertPluginLink	*apl;	gpointer				data;	if (!alert)		return;	if (g_list_find(gkrellm_alert_list, alert))		{		gkrellm_alert_list = g_list_remove(gkrellm_alert_list, alert);		destroy_alert_objects(alert);		}	for (plist = alert_plugin_list; plist; plist = plist->next)		{		data = NULL;		gap = (GkrellmAlertPlugin *) plist->data;		for (list = alert->plugin_list; list; list = list->next)			{			apl = (GkrellmAlertPluginLink *) list->data;			if (apl->alert_plugin == gap)				{				data = apl->data;				break;				}			}		if (MONITOR_ENABLED(gap->mon) && gap->destroy_func)			(*gap->destroy_func)(alert, data);		}	gkrellm_free_glist_and_data(&alert->plugin_list);	/* should all be detached */	g_free(alert->name);	g_free(alert->unit_string);	g_free(alert->alarm_command);	g_free(alert->warn_command);	g_free(alert->id_string);	g_free(alert);	}voidgkrellm_alert_destroy(GkrellmAlert **ap)	{	if (!ap || !*ap)		return;	gkrellm_alert_window_destroy(ap);	destroy_alert(*ap);	*ap = NULL;	}GkrellmAlert *gkrellm_alert_create(GkrellmPanel *p, gchar *name, gchar *unit_string,		gboolean check_high, gboolean check_low, gboolean do_updates,		gfloat max_high, gfloat min_low,		gfloat step0, gfloat step1, gint digits)	{	GkrellmAlert	*alert;	alert = g_new0(GkrellmAlert, 1);	alert->panel = p;	alert->name = g_strdup(name);	alert->unit_string = g_strdup(unit_string);	alert->check_high = check_high;	alert->check_low = check_low;	alert->do_panel_updates = do_updates;	alert->max_high = max_high;	alert->min_low = min_low;	alert->step0 = step0;	alert->step1 = step1;	alert->digits = digits;	alert->alarm_command = g_strdup("");	alert->warn_command = g_strdup("");	alert->do_alarm_command = alert->do_warn_command = TRUE;	gkrellm_alert_set_triggers(alert, min_low, min_low, min_low, min_low);	alert->activated = FALSE;	alert->check_hardwired = FALSE;	return alert;	}  /* Set alarm trigger values for hardwired alarms which have no config  */voidgkrellm_alert_set_triggers(GkrellmAlert *alert,				gfloat high_alarm, gfloat high_warn,				gfloat low_warn, gfloat low_alarm)	{	if (alert->check_high)		{		alert->high.alarm_limit = high_alarm;		alert->high.warn_limit = high_warn;		}	if (alert->check_low)		{		alert->low.warn_limit = low_warn;		alert->low.alarm_limit = low_alarm;		}	alert->activated = TRUE;	alert->check_hardwired = TRUE;	}voidgkrellm_alert_commands_config(GkrellmAlert *alert,						gboolean alarm, gboolean warn)	{	alert->do_alarm_command = alarm;	alert->do_warn_command = warn;	}voidgkrellm_alert_set_delay(GkrellmAlert *alert, gint delay)	{	if (!alert)		return;	alert->delay = delay;	alert->low.warn_delay = alert->low.alarm_delay = delay;	alert->high.warn_delay = alert->high.alarm_delay = delay;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -