📄 battery.c
字号:
t = bat->percent; if (t == -1) /* APM battery flags should cause hide... but */ snprintf(buf, sizeof(buf), "no bat"); else snprintf(buf, sizeof(buf), "%d%%", t); break; } d = bat->time_decal; w = gkrellm_gdk_string_width(d->text_style.font, buf); x = (d->w - w) / 2; if (x < 0) x = 0; d->x_off = x; gkrellm_draw_decal_text(bat->panel, d, buf, force ? -1 : t); }static voidupdate_battery_panel(Battery *bat) { GkrellmPanel *p = bat->panel; if (!p) return; if (!bat->present) { /* Battery can be removed while running */ gkrellm_panel_hide(p); return; } gkrellm_panel_show(p); if (bat->time_left > 0 && bat->charging) bat->charge_rate = (gfloat) (100 - bat->percent) / (gfloat) bat->time_left; else bat->charge_rate = 0.0; if (enable_estimate) estimate_battery_time_left(bat); if (bat->on_line) { gkrellm_reset_alert(bat->alert); gkrellm_freeze_alert(bat->alert); gkrellm_draw_decal_pixmap(p, bat->power_decal, D_MISC_AC); } else { if ( (bat == composite_battery && enable_composite) || (bat != composite_battery && enable_each) ) { gkrellm_thaw_alert(bat->alert); gkrellm_check_alert(bat->alert, alert_units_percent ? bat->percent : bat->time_left); } gkrellm_draw_decal_pixmap(p, bat->power_decal, D_MISC_BATTERY); } draw_time_left_decal(bat, FALSE); gkrellm_update_krell(p, bat->krell, bat->percent); gkrellm_draw_panel_layers(p); }static voidupdate_battery(void) { GList *list; Battery *bat; static gint seconds = 0; if (!enable_each && !enable_composite) return; if (GK.second_tick) { if (seconds == 0) { for (list = battery_list; list; list = list->next) ((Battery *) list->data)->present = FALSE; (*read_battery_data)(); for (list = battery_list; list; list = list->next) { bat = (Battery *) list->data; if (!bat->panel) create_battery_panel(bat, TRUE); if (bat->enabled) update_battery_panel(bat); } } seconds = (seconds + 1) % poll_interval; } }static gbooleancb_expose_event(GtkWidget *widget, GdkEventExpose *ev, GkrellmPanel *p) { gdk_draw_drawable(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], p->pixmap, ev->area.x, ev->area.y, ev->area.x, ev->area.y, ev->area.width, ev->area.height); return FALSE; }static gbooleancb_panel_enter(GtkWidget *w, GdkEventButton *ev, Battery *bat) { gkrellm_decal_on_top_layer(bat->time_decal, TRUE); gkrellm_draw_panel_layers(bat->panel); return FALSE; }static gbooleancb_panel_leave(GtkWidget *w, GdkEventButton *ev, Battery *bat) { gkrellm_decal_on_top_layer(bat->time_decal, FALSE); gkrellm_draw_panel_layers(bat->panel); return FALSE; }static gbooleancb_panel_press(GtkWidget *widget, GdkEventButton *ev, Battery *bat) { GkrellmDecal *d; static gboolean time_unavailable_warned; d = launch.decal; if (ev->button == 3) gkrellm_open_config_window(mon_battery); else if ( ev->button == 2 || (ev->button == 1 && !d) || (ev->button == 1 && d && ev->x < d->x) ) { if (bat->time_left == -1 && bat->present) { if (!time_unavailable_warned) gkrellm_message_dialog(_("GKrellM Battery"), _("Battery times are unavailable. You\n" "could select the Estimated Time option.")); time_unavailable_warned = TRUE; bat->display_mode = BATTERYDISPLAY_PERCENT; } else { bat->display_mode++; if (bat->display_mode == BATTERYDISPLAY_EOM) bat->display_mode = 0; draw_time_left_decal(bat, TRUE); gkrellm_draw_panel_layers(bat->panel); gkrellm_config_modified(); } } return FALSE; }static voidcreate_battery_panel(Battery *bat, gboolean first_create) { GkrellmPanel *p; GkrellmStyle *style; GkrellmMargin *m; gint x, w; if (!bat->panel) bat->panel = gkrellm_panel_new0(); p = bat->panel; style = gkrellm_meter_style(style_id); m = gkrellm_get_style_margins(style); bat->power_decal = gkrellm_create_decal_pixmap(p, gkrellm_decal_misc_pixmap(), gkrellm_decal_misc_mask(), N_MISC_DECALS, style, m->left, -1); x = bat->power_decal->x + bat->power_decal->w + 2; w = gkrellm_chart_width() - x - m->right; bat->time_decal = gkrellm_create_decal_text(p, "8/%", gkrellm_meter_textstyle(style_id), style, x, -1, w); bat->krell = gkrellm_create_krell(p, gkrellm_krell_meter_piximage(style_id), style); gkrellm_monotonic_krell_values(bat->krell, FALSE); gkrellm_set_krell_full_scale(bat->krell, 100, 1); gkrellm_panel_configure(p, NULL, style); gkrellm_panel_create(battery_vbox, mon_battery, p); /* Center the decals with respect to each other. */ if (bat->power_decal->h > bat->time_decal->h) bat->time_decal->y += (bat->power_decal->h - bat->time_decal->h) / 2; else bat->power_decal->y += (bat->time_decal->h - bat->power_decal->h) / 2; if (first_create) { g_signal_connect(G_OBJECT(p->drawing_area), "expose_event", G_CALLBACK(cb_expose_event), p); g_signal_connect(G_OBJECT(p->drawing_area), "button_press_event", G_CALLBACK(cb_panel_press), bat); g_signal_connect(G_OBJECT(p->drawing_area), "enter_notify_event", G_CALLBACK(cb_panel_enter), bat); g_signal_connect(G_OBJECT(p->drawing_area), "leave_notify_event", G_CALLBACK(cb_panel_leave), bat); } gkrellm_setup_decal_launcher(p, &launch, bat->time_decal); if ( (bat == composite_battery && enable_composite) || (bat->id == 0 && composite_battery && !enable_composite) || (bat->id == 0 && !composite_battery) ) launch_battery = bat; if (bat == composite_battery) bat->enabled = enable_composite; else bat->enabled = enable_each; if (bat->enabled) update_battery_panel(bat); else gkrellm_panel_hide(p); }static voidspacer_visibility(void) { GList *list; Battery *bat; gboolean enabled = FALSE; for (list = battery_list; list; list = list->next) { bat = (Battery *) list->data; enabled |= bat->enabled; } if (enabled) gkrellm_spacers_show(mon_battery); else gkrellm_spacers_hide(mon_battery); }static voidcreate_battery(GtkWidget *vbox, gint first_create) { GList *list; Battery *bat; battery_vbox = vbox; if (_GK.demo) enable_each = TRUE; for (list = battery_list; list; list = list->next) { bat = (Battery *) list->data; create_battery_panel(bat, first_create); } spacer_visibility(); } /* Expand alert command substitution variables: | $H - hostname $n - battery id | $t - time left $p - percent | $o - online (boolean) $c - charging (boolean) */static voidcb_command_process(GkrellmAlert *alert, gchar *src, gchar *buf, gint size, Battery *bat) { gchar c, *s; gint len, value; if (!buf || size < 1) return; --size; *buf = '\0'; if (!src) return; for (s = src; *s != '\0' && size > 0; ++s) { len = 1; if (*s == '$' && *(s + 1) != '\0') { value = -1; if ((c = *(s + 1)) == 'H') len = snprintf(buf, size, "%s", gkrellm_sys_get_host_name()); else if (c == 'n' && bat != composite_battery) value = bat->id; else if (c == 't') value = bat->time_left; else if (c == 'p') value = bat->percent; else if (c == 'o') value = bat->on_line; else if (c == 'c') value = bat->charging; else len = 0; if (value >= 0) len = snprintf(buf, size, "%d", value); ++s; } else *buf = *s; size -= len; buf += len; } *buf = '\0'; }static voidcb_battery_alert_trigger(GkrellmAlert *alert, Battery *bat) { GkrellmAlertdecal *ad; GkrellmDecal *d; alert->panel = bat->panel; ad = &alert->ad; d = bat->time_decal; ad->x = d->x + 1; ad->y = d->y - 2; ad->w = d->w - 1; ad->h = d->h + 4; gkrellm_render_default_alert_decal(alert); }static voiddup_battery_alert(void) { GList *list; Battery *bat; for (list = battery_list; list; list = list->next) { bat = (Battery *) list->data; gkrellm_alert_dup(&bat->alert, bat_alert); gkrellm_alert_trigger_connect(bat->alert, cb_battery_alert_trigger, bat); gkrellm_alert_command_process_connect(bat->alert, cb_command_process, bat); } } /* If the OS reports battery times, alerts will always have minutes units. | If the OS does not report battery times the initial alert create will | have minutes units if the estimate time option is enabled and it will | have battery percent level units if estimate time option is off. Alert | creates from load config will have units in effect at last save config. */static voidcreate_alert(void) { Battery *bat; if (!battery_list) return; bat = (Battery *) battery_list->data; if (!bat_alert) { alert_units_need_estimate_mode = FALSE; if ( alert_units_percent || (bat->time_left == -1 && !enable_estimate) ) { if (bat->time_left == -1) alert_units_percent = TRUE; bat_alert = gkrellm_alert_create(NULL, _("Battery"), _("Battery Percent Limits"), FALSE, TRUE, TRUE, 99, 0, 1, 10, 0); } else { bat_alert = gkrellm_alert_create(NULL, _("Battery"), _("Battery Minutes Remaining Limits"), FALSE, TRUE, TRUE, 500, 0, 1, 10, 0); if (bat->time_left == -1) alert_units_need_estimate_mode = TRUE; } } gkrellm_alert_config_connect(bat_alert, dup_battery_alert, NULL); /* This alert is a master to be dupped and is itself never checked */ }static voidsave_battery_config(FILE *f) { GList *list; Battery *bat; fprintf(f, "%s enable %d\n", BAT_CONFIG_KEYWORD, enable_each); fprintf(f, "%s enable_composite %d\n", BAT_CONFIG_KEYWORD, enable_composite); fprintf(f, "%s estimate_time %d\n", BAT_CONFIG_KEYWORD, enable_estimate); /* 2.1.15: scale saved float values to avoid decimal points in the config. */ fprintf(f, "%s estimate_time_discharge %.0f\n", BAT_CONFIG_KEYWORD, estimate_runtime[0] * GKRELLM_FLOAT_FACTOR); fprintf(f, "%s estimate_time_charge %.0f\n", BAT_CONFIG_KEYWORD, estimate_runtime[1] * GKRELLM_FLOAT_FACTOR); fprintf(f, "%s estimate_time_charge_model %d\n", BAT_CONFIG_KEYWORD, estimate_model[1]); fprintf(f, "%s full_cap_fallback %d\n", BAT_CONFIG_KEYWORD, full_cap_fallback); if (!_GK.client_mode) fprintf(f, "%s poll_interval %d\n", BAT_CONFIG_KEYWORD, poll_interval); if (launch.command) fprintf(f, "%s launch1 %s\n", BAT_CONFIG_KEYWORD, launch.command); if (launch.tooltip_comment) fprintf(f, "%s tooltip_comment %s\n", BAT_CONFIG_KEYWORD, launch.tooltip_comment); fprintf(f, "%s alert_units_percent %d\n", BAT_CONFIG_KEYWORD, alert_units_percent); for (list = battery_list; list; list = list->next) { bat = (Battery *) list->data; if (bat == composite_battery) /* Don't 2.1.16 backwards break */ fprintf(f, "%s display_mode_composite %d %d\n", BAT_CONFIG_KEYWORD, bat->display_mode, bat->id); else fprintf(f, "%s display_mode %d %d\n", BAT_CONFIG_KEYWORD, bat->display_mode, bat->id); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -