Convert TTY status to Xft
This commit is contained in:
committed by
Pasi Kallinen
parent
e53b76b0e5
commit
9d1aac189e
+1
-1
@@ -382,7 +382,7 @@ extern Boolean nhCvtStringToPixel(Display *, XrmValuePtr, Cardinal *,
|
||||
extern void get_window_frame_extents(Widget, long *, long *, long *, long *);
|
||||
extern void get_widget_window_geometry(Widget, int *, int *, int *, int *);
|
||||
extern char *fontname_boldify(const char *);
|
||||
extern Dimension nhFontHeight(Widget);
|
||||
extern Dimension nhFontHeight(Widget, int);
|
||||
extern char key_event_to_char(XKeyEvent *);
|
||||
extern void msgkey(Widget, XtPointer, XEvent *, Boolean *);
|
||||
extern void highlight_yn(boolean);
|
||||
|
||||
+14
-1
@@ -752,11 +752,22 @@ nhFreePixel(
|
||||
* assumption of ascent + descent is not always valid.
|
||||
*/
|
||||
Dimension
|
||||
nhFontHeight(Widget w)
|
||||
nhFontHeight(Widget w, int win_type)
|
||||
{
|
||||
#ifdef USE_XFT
|
||||
|
||||
XftFont *font = X11_new_font(w, 0, win_type);
|
||||
Dimension height = font->height;
|
||||
X11_release_font(w, font);
|
||||
return height;
|
||||
|
||||
#else /* !USE_XFT */
|
||||
|
||||
Arg args[1];
|
||||
XFontStruct *fs;
|
||||
|
||||
nhUse(win_type);
|
||||
|
||||
#ifdef _XawTextSink_h
|
||||
Widget sink = NULL;
|
||||
XawTextPosition pos = 0;
|
||||
@@ -776,6 +787,8 @@ nhFontHeight(Widget w)
|
||||
|
||||
/* Assume font height is ascent + descent. */
|
||||
return fs->ascent + fs->descent;
|
||||
|
||||
#endif /* ?USE_XFT */
|
||||
}
|
||||
|
||||
static String *default_resource_data = 0, /* NULL-terminated arrays */
|
||||
|
||||
+110
-9
@@ -558,7 +558,7 @@ create_tty_status(Widget parent, Widget top)
|
||||
X11_status_widget = XtCreateManagedWidget("status_form", windowWidgetClass,
|
||||
form, args, num_args);
|
||||
|
||||
int height = nhFontHeight(X11_status_widget) * 3;
|
||||
int height = nhFontHeight(X11_status_widget, NHW_STATUS) * 3;
|
||||
num_args = 0;
|
||||
XtSetArg(args[num_args], XtNheight, height); num_args++;
|
||||
XtSetValues(form, args, num_args);
|
||||
@@ -618,7 +618,7 @@ tty_status_redraw(Widget w)
|
||||
num_args = 0;
|
||||
XtSetArg(args[num_args], XtNwidth, &width); num_args++;
|
||||
XtGetValues(w, args, num_args);
|
||||
int height = nhFontHeight(w);
|
||||
int height = nhFontHeight(w, NHW_STATUS);
|
||||
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
@@ -770,17 +770,116 @@ tty_render_text(Widget w, const XRectangle *clip, int x, int y,
|
||||
nhUse(attr);
|
||||
#endif
|
||||
|
||||
Arg args[5];
|
||||
Cardinal num_args;
|
||||
XGCValues values;
|
||||
Pixel fgpixel, bgpixel;
|
||||
XFontStruct *font;
|
||||
XFontStruct *font_italic = NULL; /* custodial */
|
||||
int goldwidth = 0;
|
||||
|
||||
/* Get the colors */
|
||||
Pixel fgpixel, bgpixel;
|
||||
tty_status_colors(w, color, attr, &fgpixel, &bgpixel);
|
||||
|
||||
#ifdef USE_XPM
|
||||
|
||||
/* Get the font */
|
||||
XftFont *font = X11_new_font(w, (attr & HL_BOLD) != 0, NHW_STATUS);
|
||||
|
||||
/* Get the drawing resources */
|
||||
Display *display = XtDisplay(w);
|
||||
Screen *screen = DefaultScreenOfDisplay(display);
|
||||
Visual *visual = DefaultVisualOfScreen(screen);
|
||||
Colormap cmap = DefaultColormapOfScreen(screen);
|
||||
XftDraw *draw = XftDrawCreate(display, XtWindow(w), visual, cmap);
|
||||
|
||||
/* Convert the colors to Xft form */
|
||||
XftColor fgcolor, bgcolor;
|
||||
X11_new_color(w, fgpixel, &fgcolor);
|
||||
X11_new_color(w, bgpixel, &bgcolor);
|
||||
|
||||
/* If drawing a hitpoint bar, we'll need a clipping rectangle */
|
||||
if (clip != NULL) {
|
||||
XftDrawSetClipRectangles(draw, 0, 0, clip, 1);
|
||||
}
|
||||
|
||||
/* Gold will begin with a glyph string. Convert this to the proper
|
||||
character, which might possibly be Unicode */
|
||||
if (fld == BL_GOLD && memcmp(text, "\\G", 2) == 0) {
|
||||
char *end;
|
||||
unsigned long glyphcode = strtoul(text+2, &end, 16);
|
||||
if ((glyphcode >> 16) == (unsigned) svc.context.rndencode && *end == ':') {
|
||||
/* We have a proper glyph code */
|
||||
glyph_info glyphinfo;
|
||||
glyphcode &= 0xFFFF;
|
||||
map_glyphinfo(0, 0, glyphcode, 0, &glyphinfo);
|
||||
X11_map_symbol goldsym = X11_glyph_char(&glyphinfo);
|
||||
|
||||
/* Get the width of the gold symbol */
|
||||
XGlyphInfo extents;
|
||||
#ifdef ENHANCED_SYMBOLS
|
||||
FcChar32 goldch = goldsym;
|
||||
XftTextExtents32(display, font, &goldch, 1, &extents);
|
||||
#else /* !ENHANCED_SYMBOLS */
|
||||
FcChar8 goldch = goldsym;
|
||||
XftTextExtents8(display, font, &goldch, 1, &extents);
|
||||
#endif /* ?ENHANCED_SYMBOLS */
|
||||
goldwidth = extents.width - extents.x;
|
||||
|
||||
/* Render the gold symbol */
|
||||
XftDrawRect(draw, &bgcolor, x, y, goldwidth, font->height);
|
||||
#ifdef ENHANCED_SYMBOLS
|
||||
XftDrawString32(draw, &fgcolor, font, x, y + font->ascent, &goldch, 1);
|
||||
#else /* !ENHANCED_SYMBOLS */
|
||||
XftDrawString8(draw, &fgcolor, font, x, y + font->ascent, &goldch, 1);
|
||||
#endif /* ?ENHANCED_SYMBOLS */
|
||||
|
||||
text = end;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get the width of the rendered string, not including goldwidth */
|
||||
XGlyphInfo extents;
|
||||
XftTextExtents8(display, font, (const FcChar8 *) text, strlen(text), &extents);
|
||||
int width = extents.width - extents.x;
|
||||
|
||||
/* Place version on the right */
|
||||
if (fld == BL_VERS) {
|
||||
Cardinal num_args = 0;
|
||||
Arg args[1];
|
||||
Dimension wwidth;
|
||||
XtSetArg(args[num_args], XtNwidth, &wwidth); num_args++;
|
||||
XtGetValues(w, args, num_args);
|
||||
int x2 = wwidth - width;
|
||||
if (x2 > x) {
|
||||
x = x2;
|
||||
}
|
||||
}
|
||||
|
||||
/* Render the string */
|
||||
XftDrawRect(draw, &bgcolor, x + goldwidth, y, width, font->height);
|
||||
XftDrawString8(draw, &fgcolor, font,
|
||||
x + goldwidth, y + font->ascent,
|
||||
(const FcChar8 *) text, strlen(text));
|
||||
width += goldwidth;
|
||||
|
||||
#ifdef STATUS_HILITES
|
||||
/* Implement underline */
|
||||
if (attr & HL_ULINE) {
|
||||
XftDrawRect(draw, &fgcolor, x, y + font->ascent, width, 1);
|
||||
}
|
||||
#endif /* STATUS_HILITES */
|
||||
|
||||
/* Release resources */
|
||||
|
||||
XftColorFree(display, visual, cmap, &fgcolor);
|
||||
XftColorFree(display, visual, cmap, &bgcolor);
|
||||
XftDrawDestroy(draw);
|
||||
X11_release_font(w, font);
|
||||
|
||||
#else /* !USE_XPM */
|
||||
|
||||
Arg args[5];
|
||||
Cardinal num_args;
|
||||
XGCValues values;
|
||||
XFontStruct *font;
|
||||
XFontStruct *font_italic = NULL; /* custodial */
|
||||
|
||||
values.foreground = fgpixel;
|
||||
values.background = bgpixel;
|
||||
|
||||
@@ -805,6 +904,7 @@ tty_render_text(Widget w, const XRectangle *clip, int x, int y,
|
||||
}
|
||||
}
|
||||
|
||||
/* Get a graphics context */
|
||||
values.font = font->fid;
|
||||
values.function = GXcopy;
|
||||
GC ggc = XtGetGC(w,
|
||||
@@ -907,6 +1007,7 @@ tty_render_text(Widget w, const XRectangle *clip, int x, int y,
|
||||
if (font_italic != NULL) {
|
||||
XFreeFont(XtDisplay(w), font_italic);
|
||||
}
|
||||
#endif /* ?USE_XPM */
|
||||
|
||||
/* Caller will advance x by the width */
|
||||
return width;
|
||||
@@ -1139,7 +1240,7 @@ create_status_window_fancy(struct xwindow *wp, /* window pointer */
|
||||
&right_margin); num_args++;
|
||||
XtGetValues(wp->w, args, num_args);
|
||||
|
||||
wp->pixel_height = 2 * nhFontHeight(wp->w) + top_margin + bottom_margin;
|
||||
wp->pixel_height = 2 * nhFontHeight(wp->w, NHW_STATUS) + top_margin + bottom_margin;
|
||||
wp->pixel_width = COLNO * fs->max_bounds.width
|
||||
+ left_margin + right_margin;
|
||||
|
||||
|
||||
+1
-1
@@ -154,7 +154,7 @@ display_text_window(struct xwindow *wp, boolean blocking)
|
||||
width = text_info->max_width + text_info->extra_width;
|
||||
text_info->blocked = blocking;
|
||||
text_info->destroy_on_ack = FALSE;
|
||||
font_height = nhFontHeight(wp->w);
|
||||
font_height = nhFontHeight(wp->w, NHW_TEXT);
|
||||
|
||||
/*
|
||||
* Calculate the number of lines to use. First, find the number of
|
||||
|
||||
Reference in New Issue
Block a user