📄 alerts.c
字号:
}voidgkrellm_alert_delay_config(GkrellmAlert *alert, gint step, gint high, gint low) { if (!alert || step < 1 || high < step) return; low = (low / step) * step; high = (high / step) * step; alert->delay_high = (gfloat) high; alert->delay_low = (gfloat) low; alert->delay_step = (gfloat) step; gkrellm_alert_set_delay(alert, low); }voidgkrellm_alert_dup(GkrellmAlert **a_dst, GkrellmAlert *a_src) { GkrellmAlert *alert; if (!a_dst || !a_src) return; if (*a_dst) (*a_dst)->plugin_list = NULL; /* XXX fixme */ gkrellm_alert_destroy(a_dst); alert = gkrellm_alert_create(a_src->panel, a_src->name, a_src->unit_string, a_src->check_high, a_src->check_low, a_src->do_panel_updates, a_src->max_high, a_src->min_low, a_src->step0, a_src->step1, a_src->digits); gkrellm_dup_string(&alert->alarm_command, a_src->alarm_command); gkrellm_dup_string(&alert->warn_command, a_src->warn_command); alert->warn_repeat_set = a_src->warn_repeat_set; alert->alarm_repeat_set = a_src->alarm_repeat_set; alert->low = a_src->low; alert->high = a_src->high; gkrellm_alert_set_delay(alert, a_src->delay); alert->plugin_list = a_src->plugin_list; /* XXX fixme */ alert->activated = a_src->activated; *a_dst = alert; }static voidreset_alert(GkrellmAlert *alert, gboolean suppress) { GkrellmTrigger *th = &alert->high, *tl = &alert->low; if ( suppress && ( ((th->alarm_on || tl->alarm_on) && alert->alarm_repeat_set == 0) || ((th->warn_on || tl->warn_on) && alert->warn_repeat_set == 0) ) ) alert->suppress_command = TRUE; th->alarm_on = FALSE; th->warn_on = FALSE; tl->alarm_on = FALSE; tl->warn_on = FALSE; alert->alarm_repeat = 0; alert->warn_repeat = 0; destroy_alert_objects(alert); }voidgkrellm_reset_alert(GkrellmAlert *alert) { if (!alert) return; if (g_list_find(gkrellm_alert_list, alert)) { reset_alert(alert, FALSE); gkrellm_alert_list = g_list_remove(gkrellm_alert_list, alert); } }voidgkrellm_reset_alert_soft(GkrellmAlert *alert) { if (!alert) return; if (g_list_find(gkrellm_alert_list, alert)) { reset_alert(alert, TRUE); gkrellm_alert_list = g_list_remove(gkrellm_alert_list, alert); } }voidgkrellm_reset_panel_alerts(GkrellmPanel *p) { GList *list; GkrellmAlert *alert; gboolean done = FALSE; if (!p) return; while (!done) { done = TRUE; /* Assume won't find any */ for (list = gkrellm_alert_list; list; list = list->next) { alert = (GkrellmAlert *) list->data; if (alert->panel != p) continue; done = FALSE; reset_alert(alert, FALSE); gkrellm_alert_list = g_list_remove(gkrellm_alert_list, alert); alert->panel = NULL; alert->cb_trigger = NULL; alert->cb_trigger_data = NULL; alert->cb_stop = NULL; alert->cb_stop_data = NULL; break; } } } /* At theme changes, turn all alerts off so there won't be any alert decals | in monitor lists when they are destroyed. The alerts should just get | retriggered. Surely an alert going off is a good time to change themes. */voidgkrellm_alert_reset_all(void) { GList *list; for (list = gkrellm_alert_list; list; list = list->next) reset_alert((GkrellmAlert *) list->data, TRUE); g_list_free(gkrellm_alert_list); gkrellm_alert_list = NULL; }voidgkrellm_alert_update(void) { GList *list, *plist; GkrellmAlert *alert; GkrellmAlertdecal *ad; GkrellmAlertkrell *ak; GkrellmAlertPlugin *gap; GkrellmAlertPluginLink *apl; for (list = gkrellm_alert_list; list; list = list->next) { alert = (GkrellmAlert *) list->data; ad = &alert->ad; ak = &alert->ak; if (ak->krell) { ak->krell_position = (ak->krell_position + 2) % 100; gkrellm_update_krell(alert->panel, ak->krell, ak->krell_position); } if (ad->decal) { if (ad->frame <= 0) ad->dir = 1; else if (ad->frame >= ad->nframes - 1) ad->dir = 0; ad->frame += (ad->dir) ? 1 : -1; gkrellm_draw_decal_pixmap(alert->panel, ad->decal, ad->frame); } if (alert->do_panel_updates) gkrellm_draw_panel_layers(alert->panel); if (GK.second_tick) { if (alert->alarm_repeat > 0 && --alert->alarm_repeat == 0) { run_command(alert, alert->alarm_command); alert->alarm_repeat = alert->alarm_repeat_set; } if (alert->warn_repeat > 0 && --alert->warn_repeat == 0) { run_command(alert, alert->warn_command); alert->warn_repeat = alert->warn_repeat_set; } for (plist = alert->plugin_list; plist; plist = plist->next) { apl = (GkrellmAlertPluginLink *) plist->data; gap = apl->alert_plugin; if (MONITOR_ENABLED(gap->mon) && gap->update_func) (*gap->update_func)(alert, apl->data); } } } }gbooleangkrellm_alert_is_activated(GkrellmAlert *alert) { if (alert) return alert->activated; return FALSE; }voidgkrellm_alert_get_alert_state(GkrellmAlert *alert, gboolean *alarm_state, gboolean *warn_state) { *warn_state = (alert->high.warn_on || alert->low.warn_on); *alarm_state = (alert->high.alarm_on || alert->low.alarm_on); }/* ------------------------------------------------------------ *//* Plugin interface to alerts. */GkrellmAlertPlugin *gkrellm_alert_plugin_add(GkrellmMonitor *mon, gchar *name) { GkrellmAlertPlugin *gap; if (!mon || !name || !*name) return NULL; gap = g_new0(GkrellmAlertPlugin, 1); gap->mon = mon; gap->name = g_strdup(name); alert_plugin_list = g_list_append(alert_plugin_list, gap); return gap; }voidgkrellm_alert_plugin_alert_connect(GkrellmAlertPlugin *gap, void (*alarm_func)(), void (*warn_func)(), void (*update_func)(), void (*check_func)(), void (*destroy_func)()) { gap->alarm_func = alarm_func; gap->warn_func = warn_func; gap->update_func = update_func; gap->check_func = check_func; gap->destroy_func = destroy_func; }voidgkrellm_alert_plugin_config_connect(GkrellmAlertPlugin *gap, gchar *tab_name, void (*config_create_func)(), void (*config_apply_func), void (*config_save_func)(), void (*config_load_func)()) { if (!gap) return; g_free(gap->tab_name); gap->tab_name = g_strdup(tab_name); gap->config_create_func = config_create_func; gap->config_apply_func = config_apply_func; gap->config_save_func = config_save_func; gap->config_load_func = config_load_func; } /* The id_string is so a plugin can get a unique config name for an alert. */gchar *gkrellm_alert_plugin_config_get_id_string(GkrellmAlert *alert) { if (alert) return alert->id_string; return NULL; }voidgkrellm_alert_plugin_alert_attach(GkrellmAlertPlugin *gap, GkrellmAlert *alert, gpointer data) { GkrellmAlertPluginLink *apl; if (!gap || !alert) return; apl = g_new0(GkrellmAlertPluginLink, 1); apl->alert_plugin = gap; apl->data = data; alert->plugin_list = g_list_append(alert->plugin_list, apl); }voidgkrellm_alert_plugin_alert_detach(GkrellmAlertPlugin *gap, GkrellmAlert *alert) { GList *list; GkrellmAlertPluginLink *apl; if (!gap || !alert) return; for (list = alert->plugin_list; list; list = list->next) { apl = (GkrellmAlertPluginLink *) list->data; if (apl->alert_plugin == gap) { alert->plugin_list = g_list_remove(alert->plugin_list, apl); g_free(apl); break; } } }gpointergkrellm_alert_plugin_get_data(GkrellmAlertPlugin *gap,GkrellmAlert *alert) { GList *list; GkrellmAlertPluginLink *apl; if (!gap || !alert) return NULL; for (list = alert->plugin_list; list; list = list->next) { apl = (GkrellmAlertPluginLink *) list->data; if (apl->alert_plugin == gap) return apl->data; } return NULL; }voidgkrellm_alert_plugin_command_process(GkrellmAlert *alert, gchar *src, gchar *dst, gint dst_size) { if (alert && alert->cb_command_process) (*alert->cb_command_process)(alert, src, dst, dst_size, alert->cb_command_process_data); else snprintf(dst, dst_size, "%s", src); }/* ------------------------------------------------------------ */voidgkrellm_alert_command_process_connect(GkrellmAlert *alert, void (*func)(), gpointer data) { if (!alert) return; alert->cb_command_process = func; alert->cb_command_process_data = data; }voidgkrellm_alert_config_connect(GkrellmAlert *alert, void (*func)(),gpointer data) { if (!alert) return; alert->cb_config = func; alert->cb_config_data = data; }voidgkrellm_alert_config_create_connect(GkrellmAlert *alert, void (*func)(), gpointer data) { if (!alert) return; alert->cb_config_create = func; alert->cb_config_create_data = data; }static voidalert_delete(GtkWidget *widget, GkrellmAlert **ap) { GkrellmAlert *alert; if (!ap) return; alert = *ap; alert->activated = FALSE; alert->config_closing = TRUE; if (alert->cb_config) (*alert->cb_config)(alert, alert->cb_config_data); if (alert->config_window) gtk_widget_destroy(alert->config_window); destroy_alert(alert); *ap = NULL; }static voidalert_close(GtkWidget *widget, GkrellmAlert **ap) { GkrellmAlert *alert; if (!ap) return; alert = *ap; if (!alert->activated) alert_delete(NULL, ap); else if (alert->config_window) { gtk_widget_destroy(alert->config_window); alert->config_window = NULL; alert->delete_button = NULL; } }voidgkrellm_alert_window_destroy(GkrellmAlert **ap) { alert_close(NULL, ap); }static gintalert_config_window_delete_event(GtkWidget *widget, GdkEvent *ev, GkrellmAlert **ap) { alert_close(widget, ap); return FALSE; }static voidalert_apply(GtkWidget *widget, GkrellmAlert **ap) { GList *plist, *list; GkrellmAlert *alert; GkrellmAlertPlugin *gap; GkrellmAlertPluginLink *apl; gpointer data; gchar *s; GtkSpinButton *spin; gint n; alert = *ap; if (!alert->activated && !alert->config_modified) return; if (alert->high.alarm_limit_spin_button) { spin = GTK_SPIN_BUTTON(alert->high.alarm_limit_spin_button); alert->high.alarm_limit = gtk_spin_button_get_value(spin); spin = GTK_SPIN_BUTTON(alert->high.warn_limit_spin_button); alert->high.warn_limit = gtk_spin_button_get_value(spin); } if (alert->low.alarm_limit_spin_button) { spin = GTK_SPIN_BUTTON(alert->low.alarm_limit_spin_button); alert->low.alarm_limit = gtk_spin_button_get_value(spin); spin = GTK_SPIN_BUTTON(alert->low.warn_limit_spin_button); alert->low.warn_limit = gtk_spin_button_get_value(spin); } if (alert->high.alarm_limit == 0.0 && alert->low.alarm_limit == 0.0) return; if (alert->alarm_command_entry) { spin = GTK_SPIN_BUTTON(alert->alarm_repeat_spin_button); alert->alarm_repeat_set = gtk_spin_button_get_value_as_int(spin); s = gkrellm_gtk_entry_get_text(&alert->alarm_command_entry); gkrellm_dup_string(&alert->alarm_command, s); if (!*s) alert->alarm_repeat_set = 0; if (alert->high.alarm_on || alert->low.alarm_on) alert->alarm_repeat = alert->alarm_repeat_set; } if (alert->warn_command_entry) { spin = GTK_SPIN_BUTTON(alert->warn_repeat_spin_button); alert->warn_repeat_set = gtk_spin_button_get_value_as_int(spin); s = gkrellm_gtk_entry_get_text(&alert->warn_command_entry); gkrellm_dup_string(&alert->warn_command, s); if (!*s) alert->warn_repeat_set = 0; if (alert->high.warn_on || alert->low.warn_on) alert->warn_repeat = alert->warn_repeat_set; } if (alert->delay_spin_button) { spin = GTK_SPIN_BUTTON(alert->delay_spin_button); n = gtk_spin_button_get_value_as_int(spin); gkrellm_alert_set_delay(alert, n / alert->delay_step); } alert->activated = TRUE; 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->config_apply_func) (*gap->config_apply_func)(alert, data, alert->config_closing); } gtk_widget_set_sensitive(alert->delete_button, alert->activated); gtk_widget_set_sensitive(alert->icon_box, alert->activated); if (alert->cb_config) (*alert->cb_config)(alert, alert->cb_config_data); gkrellm_config_modified(); }static voidalert_ok(GtkWidget *widget, GkrellmAlert **ap) { (*ap)->config_closing = TRUE; alert_apply(NULL, ap); alert_close(NULL, ap); }static voidcb_delay_spin_changed(GtkAdjustment *adjustment, GkrellmAlert *alert) { GtkSpinButton *spin; gint delay; spin = GTK_SPIN_BUTTON(alert->delay_spin_button); delay = gtk_spin_button_get_value_as_int(spin); if ((delay % alert->delay_step) != 0) { delay = delay / alert->delay_step * alert->delay_step; gtk_spin_button_set_value(spin, delay); } alert->config_modified = TRUE; gtk_widget_set_sensitive(alert->icon_box, TRUE); }static voidcb_high_alarm_spin_changed(GtkAdjustment *adjustment, GkrellmAlert *alert) { GtkSpinButton *spin; gfloat alarm, warn; spin = GTK_SPIN_BUTTON(alert->high.alarm_limit_spin_button); alarm = gtk_spin_button_get_value(spin); spin = GTK_SPIN_BUTTON(alert->high.warn_limit_spin_button); warn = gtk_spin_button_get_value(spin);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -