📄 mem.c
字号:
w_scroll = w; } if (!mon_in_motion) { if (w_scroll > mem.decal_label->w) x_scroll = (x_scroll + ((gkrellm_update_HZ() < 7) ? 2 : 1)) % (w_scroll - mem.decal_label->w / 3); else x_scroll = 0; } gkrellm_draw_panel_layers(mem.panel); gkrellm_draw_panel_layers(swap.panel); }static gintmeminfo_expose_event(GtkWidget *widget, GdkEventExpose *ev) { GdkPixmap *pixmap = NULL; if (widget == mem.panel->drawing_area) pixmap = mem.panel->pixmap; else if (widget == swap.panel->drawing_area) pixmap = swap.panel->pixmap; else if (swap_chart.chart && widget == swap_chart.chart->drawing_area) pixmap = swap_chart.chart->pixmap; if (pixmap) gdk_draw_drawable(widget->window, gkrellm_draw_GC(1), pixmap, ev->area.x, ev->area.y, ev->area.x, ev->area.y, ev->area.width, ev->area.height); return FALSE; }static gintcb_panel_enter(GtkWidget *w, GdkEventButton *ev, MeminfoMeter *mm) { if (mm->label_is_data) mm->mouse_entered = TRUE; return FALSE; }static gintcb_panel_leave(GtkWidget *w, GdkEventButton *ev, MeminfoMeter *mm) { mm->mouse_entered = FALSE; return FALSE; }static gintcb_panel_release(GtkWidget *widget, GdkEventButton *ev) { if (ev->button == 3) return FALSE; if (mon_in_motion) { if (mon_in_motion->restore_label) { if (mon_in_motion->label_is_data) gkrellm_config_modified(); mon_in_motion->label_is_data = FALSE; draw_decal_label(mon_in_motion, 1); } mon_in_motion->restore_label = TRUE; } mon_in_motion = NULL; x_moved = FALSE; return FALSE; }static gintcb_panel_press(GtkWidget *widget, GdkEventButton *ev, MeminfoMeter *mm) { if (ev->button == 3) { gkrellm_open_config_window(mon_mem); return FALSE; } if ( ev->button == 1 && mm->launch.button && gkrellm_in_decal(mm->launch.button->decal, ev) ) return FALSE; if (widget == mem.panel->drawing_area) mon_in_motion = &mem; else if (widget == swap.panel->drawing_area) mon_in_motion = &swap; else return FALSE; if (! mon_in_motion->label_is_data) { mon_in_motion->label_is_data = TRUE; mon_in_motion->restore_label = FALSE; mon_in_motion->mouse_entered = TRUE; gkrellm_config_modified(); } x_mon_motion = ev->x; draw_decal_label(mon_in_motion, 1); x_moved = FALSE; return FALSE; }static gintcb_panel_motion(GtkWidget *widget, GdkEventButton *ev) { GdkModifierType state; GkrellmDecal *d; PangoFontDescription *font_desc; gchar buf[128]; gint w, x_delta; state = ev->state; if ( ! mon_in_motion || ! (state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK)) || ! mon_in_motion->label_is_data ) { mon_in_motion = NULL; return FALSE; } d = mon_in_motion->decal_label; font_desc = gkrellm_meter_alt_textstyle(mon_in_motion->style_id)->font; format_meminfo_data(mon_in_motion, mon_in_motion->data_format_shadow, buf, sizeof(buf)); w = gkrellm_gdk_string_width(font_desc, buf); if (w > d->w) { x_delta = ev->x - x_mon_motion; x_mon_motion = ev->x; d->x_off += x_delta; if (d->x_off < -w) d->x_off = -w; if (d->x_off > d->w) d->x_off = d->w; x_scroll = d->w / 3 - d->x_off; if (mem.label_is_data) draw_decal_label(&mem, 1); if (swap.label_is_data) draw_decal_label(&swap, 1); mon_in_motion->restore_label = FALSE; } x_moved = TRUE; return FALSE; }static voidsetup_scaling(GkrellmChartconfig *cf, MeminfoChart *mc) { GkrellmChart *cp = mc->chart; gint res = DEFAULT_GRID_RES, grids = FULL_SCALE_GRIDS; if (cp) { grids = gkrellm_get_chartconfig_fixed_grids(cp->config); res = gkrellm_get_chartconfig_grid_resolution(cp->config); } if (grids == 0) grids = FULL_SCALE_GRIDS; if (swap.krell_delta) swap.krell_delta->full_scale = res * grids / gkrellm_update_HZ(); }static voiddestroy_chart(MeminfoChart *mc) { if (! mc->chart) return; gkrellm_chart_destroy(mc->chart); mc->chart = NULL; mc->enabled = FALSE; }static voidcreate_chart(MeminfoChart *mc, gint first_create) { GkrellmChart *cp; static GkrellmPiximage *piximage; if (first_create) mc->chart = gkrellm_chart_new0(); cp = mc->chart; if (gkrellm_load_piximage("bg_chart", NULL, &piximage, SWAP_STYLE_NAME)) gkrellm_chart_bg_piximage_override(cp, piximage, gkrellm_bg_grid_piximage(swap.style_id)); gkrellm_set_chart_height_default(cp, DEFAULT_SWAP_CHART_HEIGHT); gkrellm_chart_create(mc->vbox, mon_swap, cp, &mc->chart_config); mc->out_cd = gkrellm_add_default_chartdata(cp, _("Swap Out")); mc->in_cd = gkrellm_add_default_chartdata(cp, _("Swap In")); gkrellm_set_draw_chart_function(cp, refresh_chart, mc); gkrellm_chartconfig_fixed_grids_connect(cp->config, setup_scaling, mc); gkrellm_chartconfig_grid_resolution_connect(cp->config, setup_scaling, mc); gkrellm_chartconfig_grid_resolution_adjustment(cp->config, TRUE, 0, (gfloat) MIN_GRID_RES, (gfloat) MAX_GRID_RES, 0, 0, 0, 70); gkrellm_chartconfig_grid_resolution_label(cp->config, _("Swap in/out pages per sec")); if (gkrellm_get_chartconfig_grid_resolution(cp->config) < MIN_GRID_RES) gkrellm_set_chartconfig_grid_resolution(cp->config, DEFAULT_GRID_RES); gkrellm_alloc_chartdata(cp); if (first_create) { g_signal_connect(G_OBJECT(cp->drawing_area), "expose_event", G_CALLBACK(meminfo_expose_event), NULL); g_signal_connect(G_OBJECT(cp->drawing_area), "button_press_event", G_CALLBACK(cb_extra), mc); gtk_widget_show(mc->vbox); } else refresh_chart(mc); /* Avoid second lag at theme/size switches */ mc->enabled = TRUE; ascent = 0; }static voidconnect_panel_signals(GkrellmPanel *p, MeminfoMeter *mm) { g_signal_connect(G_OBJECT (p->drawing_area), "expose_event", G_CALLBACK(meminfo_expose_event), NULL); g_signal_connect(G_OBJECT(p->drawing_area), "button_press_event", G_CALLBACK(cb_panel_press), mm); g_signal_connect(G_OBJECT(p->drawing_area), "button_release_event", G_CALLBACK(cb_panel_release), NULL); g_signal_connect(G_OBJECT(p->drawing_area), "motion_notify_event", G_CALLBACK(cb_panel_motion), NULL); g_signal_connect(G_OBJECT(p->drawing_area), "enter_notify_event", G_CALLBACK(cb_panel_enter), mm); g_signal_connect(G_OBJECT(p->drawing_area), "leave_notify_event", G_CALLBACK(cb_panel_leave), mm); }static voidcreate_mem_panel(GtkWidget *vbox, gint first_create) { GkrellmPiximage *im = NULL; MeminfoMeter *mm; GkrellmPanel *p; GkrellmTextstyle *ts; GkrellmStyle *s; gchar *expand, buf[64], *u; gint w_label, label_x_position, label_y_off; mm = &mem; if (first_create) mm->panel = gkrellm_panel_new0(); if (!mem.all_krells) /* Krells are not in panel krell list where */ { /* they would be automatically destroyed. */ gkrellm_destroy_krell(mem.krell_buffers); gkrellm_destroy_krell(mem.krell_cache); } p = mm->panel; /* I've got two extra krells for buffers and cache. Use the #included | images unless themer has customized. */ s = gkrellm_copy_style(gkrellm_meter_style(mm->style_id)); s->krell_yoff = 0; s->krell_depth = 1; s->krell_x_hot = -1; gkrellm_get_gkrellmrc_integer("mem_krell_cache_depth", &s->krell_depth); gkrellm_get_gkrellmrc_integer("mem_krell_cache_x_hot", &s->krell_x_hot); gkrellm_get_gkrellmrc_integer("mem_krell_cache_yoff", &s->krell_yoff); expand = gkrellm_get_gkrellmrc_string("mem_krell_cache_expand"); gkrellm_set_krell_expand(s, expand); g_free(expand); gkrellm_load_piximage("krell_cache", krell_cache_xpm, &im, MEM_STYLE_NAME); mm->krell_cache = gkrellm_create_krell(p, im, s); gkrellm_monotonic_krell_values(mm->krell_cache, FALSE); s->krell_yoff = 0; s->krell_depth = 1; s->krell_x_hot = -1; gkrellm_get_gkrellmrc_integer("mem_krell_buffers_depth", &s->krell_depth); gkrellm_get_gkrellmrc_integer("mem_krell_buffers_x_hot", &s->krell_x_hot); gkrellm_get_gkrellmrc_integer("mem_krell_buffers_yoff", &s->krell_yoff); expand = gkrellm_get_gkrellmrc_string("mem_krell_buffers_expand"); gkrellm_set_krell_expand(s, expand); g_free(expand); gkrellm_load_piximage("krell_buffers", krell_buffers_xpm, &im,MEM_STYLE_NAME); mm->krell_buffers = gkrellm_create_krell(p, im, s); gkrellm_monotonic_krell_values(mm->krell_buffers, FALSE); /* Unlike the style pointer passed to gkrellm_panel_configure(), the krells | don't need the style to persist. */ g_free(s); if (im) gkrellm_destroy_piximage(im); s = gkrellm_meter_style(mm->style_id); gkrellm_panel_label_get_position(s, &label_x_position, &label_y_off); mm->krell_used = gkrellm_create_krell(p, gkrellm_krell_meter_piximage(mm->style_id), s); gkrellm_monotonic_krell_values(mm->krell_used, FALSE); if (mem.label) g_free(mem.label); if (label_x_position == GKRELLM_LABEL_NONE) mem.label = g_strdup(""); else mem.label = g_strdup(_("Mem")); if (!g_utf8_validate(mem.label, -1, NULL)) { u = g_locale_to_utf8(mem.label, -1, NULL, NULL, NULL); g_free(mem.label); mem.label = u; } snprintf(buf, sizeof(buf), "%sMemfj8", mem.label); mm->decal_label = gkrellm_create_decal_text(p, buf, gkrellm_meter_textstyle(mm->style_id), s, -1, (label_y_off > 0) ? label_y_off : -1, -1); gkrellm_panel_configure(p, NULL, s); gkrellm_panel_create(vbox, mon_mem, p); ts = &mm->decal_label->text_style; w_label = gkrellm_gdk_string_width(ts->font, mm->label) + ts->effect; mm->x_label = gkrellm_label_x_position(label_x_position, mm->decal_label->w, w_label, 0); draw_decal_label(mm, 0); if (first_create) connect_panel_signals(p, mm); mm->launch.margin.left = - mm->x_label + 2; mm->launch.margin.right = -(mm->decal_label->w - mm->x_label - w_label) +2; gkrellm_setup_decal_launcher(p, &mm->launch, mm->decal_label); if (!mm->enabled) gkrellm_panel_hide(p); if (!mem.all_krells) { gkrellm_remove_krell(mem.panel, mem.krell_buffers); gkrellm_remove_krell(mem.panel, mem.krell_cache); } }static voidcreate_swap_panel(GtkWidget *vbox, gint first_create) { MeminfoMeter *mm; GkrellmPanel *p; GkrellmStyle *style, *panel_style; GkrellmTextstyle *ts; gchar buf[64], *u; gint w_label, label_x_position, label_y_off; mm = &swap; if (first_create) mm->panel = gkrellm_panel_new0(); p = mm->panel; style = gkrellm_meter_style(mm->style_id); gkrellm_panel_label_get_position(style, &label_x_position, &label_y_off); /* Need a chart styled krell on the swap meter panel, but want it to track | the meter krell margins. */ panel_style = gkrellm_copy_style(gkrellm_panel_style(DEFAULT_STYLE_ID)); panel_style->krell_left_margin = style->krell_left_margin; panel_style->krell_right_margin = style->krell_right_margin; mm->krell_delta = gkrellm_create_krell(p, gkrellm_krell_panel_piximage(DEFAULT_STYLE_ID), panel_style); g_free(panel_style); /* unlike panels, krell styles need not persist */ mm->krell_used = gkrellm_create_krell(p, gkrellm_krell_meter_piximage(mm->style_id), style); gkrellm_monotonic_krell_values(mm->krell_used, FALSE); if (swap.label) g_free(swap.label); if (label_x_position == GKRELLM_LABEL_NONE) swap.label = g_strdup(""); else swap.label = g_strdup(_("Swap")); if (!g_utf8_validate(swap.label, -1, NULL)) { u = g_locale_to_utf8(swap.label, -1, NULL, NULL, NULL); g_free(swap.label); swap.label = u; } snprintf(buf, sizeof(buf), "%sMemfj8", swap.label); mm->decal_label = gkrellm_create_decal_text(p, buf, gkrellm_meter_textstyle(mm->style_id), style, -1, (label_y_off > 0) ? label_y_off : -1, -1); gkrellm_panel_configure(p, NULL, style); gkrellm_panel_create(vbox, mon_swap, p); ts = &mm->decal_label->text_style; w_label = gkrellm_gdk_string_width(ts->font, mm->label) + ts->effect; mm->x_label = gkrellm_label_x_position(label_x_position, mm->decal_label->w, w_label, 0); draw_decal_label(mm, 0); if (first_create) connect_panel_signals(p, mm); mm->launch.margin.left = - mm->x_label + 1; mm->launch.margin.right = -(mm->decal_label->w - mm->x_label - w_label) +1; gkrellm_setup_decal_launcher(p, &mm->launch, mm->decal_label); if (!mm->enabled) gkrellm_panel_hide(p); }static voidspacer_visibility(void) { gint top, bot; top = swap_chart.enabled ? GKRELLM_SPACER_CHART : GKRELLM_SPACER_METER; bot = (swap_chart.enabled && !(mem.enabled || swap.enabled)) ? GKRELLM_SPACER_CHART : GKRELLM_SPACER_METER; gkrellm_spacers_set_types(mon_mem, top, bot); if (mem.enabled || swap.enabled || swap_chart.enabled) gkrellm_spacers_show(mon_mem); else gkrellm_spacers_hide(mon_mem); } /* No separate swap monitor create function. Use create_mem() to create | swap chart, mem meter, and swap meter so they will all be a unit in | the same vbox. */static voidcreate_mem(GtkWidget *vbox, gint first_create) { if (first_create) { swap_chart.vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), swap_chart.vbox, FALSE, FALSE, 0); (*read_mem_data)(); (*read_swap_data)(); } if (swap_chart.enabled) create_chart(&swap_chart, first_create); create_mem_panel(vbox, first_create); create_swap_panel(vbox, first_create); setup_scaling(NULL, &swap_chart); spacer_visibility(); }#define MEM_CONFIG_KEYWORD "meminfo"static voidcb_alert_trigger(GkrellmAlert *alert, MeminfoMeter *m) { /* Full panel alert, default decal. */ alert->panel = m->panel; }static voidcreate_alert(MeminfoMeter *m) { gchar *label; if (m == &mem) label = _("Memory"); else label = _("Swap"); m->alert = gkrellm_alert_create(NULL, label, _("Percent Usage"), TRUE, FALSE, TRUE, 100, 10, 1, 10, 0); gkrellm_alert_trigger_connect(m->alert, cb_alert_trigger, m); gkrellm_alert_command_process_connect(m->alert, cb_command_process, m); }static voidsave_meminfo_config(FILE *f) { fprintf(f, "%s mem_meter %d %d %d\n", MEM_CONFIG_KEYWORD, mem.enabled, mem.label_is_data, mem.all_krells); fprintf(f, "%s swap_meter %d %d\n", MEM_CONFIG_KEYWORD, swap.enabled, swap.label_is_data); fprintf(f, "%s swap_chart %d %d\n", MEM_CONFIG_KEYWORD, swap_chart.enabled, swap_chart.extra_info); gkrellm_save_chartconfig(f, swap_chart.chart_config, MEM_CONFIG_KEYWORD, NULL); fprintf(f, "%s mem_launch %s\n", MEM_CONFIG_KEYWORD,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -