📄 alerts.c
字号:
/* 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 + -