diff --git a/win/X11/winX.c b/win/X11/winX.c index b009ab865..f641cfb56 100644 --- a/win/X11/winX.c +++ b/win/X11/winX.c @@ -135,7 +135,7 @@ struct window_procs X11_procs = { #ifdef STATUS_HILITES | WC2_RESET_STATUS | WC2_HILITE_STATUS #endif - | WC2_EXTRASTATUS + | WC2_EXTRASTATUS | WC2_HITPOINTBAR | WC2_MENU_SHIFT ), {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* color availability */ X11_init_nhwindows, diff --git a/win/X11/winstat.c b/win/X11/winstat.c index 326a37473..263a16c99 100644 --- a/win/X11/winstat.c +++ b/win/X11/winstat.c @@ -116,6 +116,7 @@ static void tty_status_blink(XtPointer client_data, XtIntervalId *timer); #endif static void tty_status_redraw(Widget); static int tty_render_field(Widget, int, int, enum statusfields); +static void tty_status_colors(Widget, int, int, Pixel *, Pixel *); static int tty_render_text(Widget, int, int, const char *, int, int, enum statusfields); static unsigned long X11_condition_bits, old_condition_bits; @@ -588,6 +589,11 @@ tty_status_redraw(Widget w) int num_args; Dimension width; + /* Name is placed here */ + int name_x = 0; + int name_y = 0; + int name_width = 0; + /* Get the height of the font and the width of the widget */ num_args = 0; XtSetArg(args[num_args], XtNwidth, &width); num_args++; @@ -604,7 +610,13 @@ tty_status_redraw(Widget w) if (fld == BL_FLUSH) { break; } - x += tty_render_field(w, x, y, fld); + int wid = tty_render_field(w, x, y, fld); + if (fld == BL_TITLE) { + name_x = x; + name_y = y; + name_width = wid; + } + x += wid; } x = 0; y += height; @@ -616,12 +628,37 @@ tty_status_redraw(Widget w) if (fld == BL_FLUSH) { break; } - x += tty_render_field(w, x, y, fld); + int wid = tty_render_field(w, x, y, fld); + if (fld == BL_TITLE) { + name_x = x; + name_y = y; + name_width = wid; + } + x += wid; } x = 0; y += height; } } + + if (name_width != 0 && iflags.wc2_hitpointbar) { + XGCValues values; + Pixel fgpixel, bgpixel; + struct tty_status_field const *fldp = &X11_status_labels[BL_TITLE]; + tty_status_colors(w, fldp->color, fldp->attrs, &fgpixel, &bgpixel); + values.foreground = fgpixel ^ bgpixel; + values.background = fgpixel ^ bgpixel; + values.function = GXxor; + values.fill_style = FillSolid; + GC ggc = XtGetGC(w, + GCFunction | GCForeground | GCBackground | GCFillStyle, + &values); + XFillRectangle(XtDisplay(w), XtWindow(w), ggc, + name_x, name_y, + name_width * X11_status_labels[BL_HP].percent / 100, + height); + XtReleaseGC(w, ggc); + } } /* Render one field of the TTY status */ @@ -692,7 +729,6 @@ tty_render_field(Widget w, int x, int y, enum statusfields fld) if (formats[fld].post != NULL) { width += tty_render_text(w, x + width, y, formats[fld].post, NO_COLOR, 0, BL_FLUSH); } - /* @@@TODO: do the percent field */ } } break; @@ -719,28 +755,17 @@ tty_render_text(Widget w, int x, int y, const char *text, int color, int attr, XFontStruct *font_italic = NULL; /* custodial */ int goldwidth = 0; - /* Get default foreground and background colors, and font */ + /* Get the colors */ + tty_status_colors(w, color, attr, &fgpixel, &bgpixel); + + values.foreground = fgpixel; + values.background = bgpixel; + + /* Get the font */ num_args = 0; - XtSetArg(args[num_args], XtNforeground, &fgpixel); num_args++; - XtSetArg(args[num_args], XtNbackground, &bgpixel); num_args++; XtSetArg(args[num_args], XtNfont, &font); num_args++; XtGetValues(w, args, num_args); - /* Implement color if requested */ -#ifdef STATUS_HILITES - if (color != NO_COLOR) { - XrmValue source; - XrmValue dest; - Pixel pixel; - const char *cname = fancy_status_hilite_colors[color]; - source.addr = (XPointer) cname; - source.size = (unsigned int) strlen(cname) + 1; - dest.size = (unsigned int) sizeof (Pixel); - dest.addr = (XPointer) &pixel; - if (XtConvertAndStore(w, XtRString, &source, XtRPixel, &dest)) - fgpixel = pixel; - } - /* Implement bold font */ if (attr & HL_BOLD) { struct xwindow *wp = find_widget(w); @@ -757,30 +782,6 @@ tty_render_text(Widget w, int x, int y, const char *text, int color, int attr, } } - /* Implement dim text */ - if (attr & HL_DIM) { - fgpixel = (fgpixel & 0xFEFEFE) >> 1; - bgpixel = (bgpixel & 0xFEFEFE) >> 1; - } - - /* Implement blink */ - if ((attr & HL_BLINK) && blink) { - fgpixel = bgpixel; - } - - /* Get a graphics context */ - if (attr & HL_INVERSE) { - values.foreground = bgpixel; - values.background = fgpixel; - } else { - values.foreground = fgpixel; - values.background = bgpixel; - } -#else /* !STATUS_HILITES */ - values.foreground = fgpixel; - values.background = bgpixel; -#endif /* ?STATUS_HILITES */ - values.font = font->fid; values.function = GXcopy; GC ggc = XtGetGC(w, @@ -881,6 +882,57 @@ tty_render_text(Widget w, int x, int y, const char *text, int color, int attr, return width; } +static void +tty_status_colors(Widget w, int color, int attr, Pixel *fgpixel, Pixel *bgpixel) +{ + Cardinal num_args; + Arg args[5]; + + /* Get the default colors */ + num_args = 0; + XtSetArg(args[num_args], XtNforeground, fgpixel); num_args++; + XtSetArg(args[num_args], XtNbackground, bgpixel); num_args++; + XtGetValues(w, args, num_args); + + /* Implement color if requested */ +#ifdef STATUS_HILITES + if (color != NO_COLOR) { + XrmValue source; + XrmValue dest; + Pixel pixel; + const char *cname = fancy_status_hilite_colors[color]; + source.addr = (XPointer) cname; + source.size = (unsigned int) strlen(cname) + 1; + dest.size = (unsigned int) sizeof (Pixel); + dest.addr = (XPointer) &pixel; + if (XtConvertAndStore(w, XtRString, &source, XtRPixel, &dest)) + *fgpixel = pixel; + } + + /* Implement dim text */ + if (attr & HL_DIM) { + *fgpixel = (*fgpixel & 0xFEFEFE) >> 1; + *bgpixel = (*bgpixel & 0xFEFEFE) >> 1; + } + + /* Implement blink */ + if ((attr & HL_BLINK) && blink) { + *fgpixel = *bgpixel; + } + + /* Get a graphics context */ + if (attr & HL_INVERSE) { + Pixel swap; + swap = *fgpixel; + *fgpixel = *bgpixel; + *bgpixel = swap; + } +#else + nhUse(color); + nhUse(attr); +#endif +} + /*ARGSUSED*/ void create_status_window_tty(struct xwindow *wp, /* window pointer */