More ifdefs; use Xft font to split messages
This commit is contained in:
committed by
Pasi Kallinen
parent
cada45a786
commit
3f8e704231
+14
-10
@@ -84,7 +84,7 @@ struct text_map_info_t {
|
|||||||
square_ascent, /* placement of changes. */
|
square_ascent, /* placement of changes. */
|
||||||
square_lbearing;
|
square_lbearing;
|
||||||
|
|
||||||
#ifdef ENHANCED_SYMBOLS
|
#if defined(ENHANCED_SYMBOLS) && !defined(USE_XFT)
|
||||||
XFontStruct *font;
|
XFontStruct *font;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
@@ -131,7 +131,12 @@ struct line_element {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct mesg_info_t {
|
struct mesg_info_t {
|
||||||
|
#ifdef USE_XFT
|
||||||
|
Pixel fgpixel; /* Color for text drawing */
|
||||||
|
#else
|
||||||
|
GC gc; /* GC for text drawing */
|
||||||
XFontStruct *fs; /* Font for the window. */
|
XFontStruct *fs; /* Font for the window. */
|
||||||
|
#endif
|
||||||
int num_lines; /* line count */
|
int num_lines; /* line count */
|
||||||
struct line_element *head; /* head of circular line queue */
|
struct line_element *head; /* head of circular line queue */
|
||||||
struct line_element *line_here; /* current drawn line position */
|
struct line_element *line_here; /* current drawn line position */
|
||||||
@@ -139,11 +144,6 @@ struct mesg_info_t {
|
|||||||
/* bottom of screen */
|
/* bottom of screen */
|
||||||
struct line_element *last_pause_head; /* pointer to head of previous */
|
struct line_element *last_pause_head; /* pointer to head of previous */
|
||||||
/* turn */
|
/* turn */
|
||||||
#ifdef USE_XFT
|
|
||||||
Pixel fgpixel; /* Color for text drawing */
|
|
||||||
#else
|
|
||||||
GC gc; /* GC for text drawing */
|
|
||||||
#endif
|
|
||||||
int char_width, /* Saved font information so we can */
|
int char_width, /* Saved font information so we can */
|
||||||
char_height, /* calculate the correct placement */
|
char_height, /* calculate the correct placement */
|
||||||
char_ascent, /* of changes. */
|
char_ascent, /* of changes. */
|
||||||
@@ -161,7 +161,9 @@ struct mesg_info_t {
|
|||||||
struct status_info_t {
|
struct status_info_t {
|
||||||
struct text_buffer text; /* Just a text buffer. */
|
struct text_buffer text; /* Just a text buffer. */
|
||||||
Pixel fg, bg; /* foreground and background */
|
Pixel fg, bg; /* foreground and background */
|
||||||
|
#ifndef USE_XFT
|
||||||
XFontStruct *fs; /* Status window font structure. */
|
XFontStruct *fs; /* Status window font structure. */
|
||||||
|
#endif
|
||||||
Dimension spacew; /* width of one space */
|
Dimension spacew; /* width of one space */
|
||||||
Position x, y[3]; /* x coord (not used), y for up to three lines */
|
Position x, y[3]; /* x coord (not used), y for up to three lines */
|
||||||
Dimension wd, ht; /* width (not used), height (same for all lines) */
|
Dimension wd, ht; /* width (not used), height (same for all lines) */
|
||||||
@@ -202,7 +204,9 @@ struct menu_info_t {
|
|||||||
struct menu curr_menu; /* Menu being displayed. */
|
struct menu curr_menu; /* Menu being displayed. */
|
||||||
struct menu new_menu; /* New menu being built. */
|
struct menu new_menu; /* New menu being built. */
|
||||||
|
|
||||||
|
#ifndef USE_XFT
|
||||||
XFontStruct *fs; /* Font for the window. */
|
XFontStruct *fs; /* Font for the window. */
|
||||||
|
#endif
|
||||||
long menu_count; /* number entered by user */
|
long menu_count; /* number entered by user */
|
||||||
Dimension line_height; /* Total height of a line of text. */
|
Dimension line_height; /* Total height of a line of text. */
|
||||||
Dimension internal_height; /* Internal height between widget & border */
|
Dimension internal_height; /* Internal height between widget & border */
|
||||||
@@ -225,10 +229,6 @@ struct menu_info_t {
|
|||||||
*/
|
*/
|
||||||
struct text_info_t {
|
struct text_info_t {
|
||||||
struct text_buffer text;
|
struct text_buffer text;
|
||||||
XFontStruct *fs; /* Font for the text window. */
|
|
||||||
int max_width; /* Width of widest line so far. */
|
|
||||||
int extra_width, /* Sum of left and right border widths. */
|
|
||||||
extra_height; /* Sum of top and bottom border widths. */
|
|
||||||
boolean blocked; /* */
|
boolean blocked; /* */
|
||||||
boolean destroy_on_ack; /* Destroy this window when acknowledged. */
|
boolean destroy_on_ack; /* Destroy this window when acknowledged. */
|
||||||
#ifdef GRAPHIC_TOMBSTONE
|
#ifdef GRAPHIC_TOMBSTONE
|
||||||
@@ -250,8 +250,10 @@ struct xwindow {
|
|||||||
|
|
||||||
boolean nh_colors_inited;
|
boolean nh_colors_inited;
|
||||||
XColor nh_colors[CLR_MAX];
|
XColor nh_colors[CLR_MAX];
|
||||||
|
#ifndef USE_XFT
|
||||||
XFontStruct *boldfs; /* Bold font */
|
XFontStruct *boldfs; /* Bold font */
|
||||||
Display *boldfs_dpy; /* Bold font display */
|
Display *boldfs_dpy; /* Bold font display */
|
||||||
|
#endif
|
||||||
char *title;
|
char *title;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
@@ -361,8 +363,10 @@ extern boolean X11_blink;
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* ### Window.c ### */
|
/* ### Window.c ### */
|
||||||
|
#ifndef USE_XFT
|
||||||
extern Font WindowFont(Widget);
|
extern Font WindowFont(Widget);
|
||||||
extern XFontStruct *WindowFontStruct(Widget);
|
extern XFontStruct *WindowFontStruct(Widget);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ### dialogs.c ### */
|
/* ### dialogs.c ### */
|
||||||
extern Widget CreateDialog(Widget, String, XtCallbackProc, XtCallbackProc);
|
extern Widget CreateDialog(Widget, String, XtCallbackProc, XtCallbackProc);
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ WindowClassRec windowClassRec = {
|
|||||||
|
|
||||||
WidgetClass windowWidgetClass = (WidgetClass) &windowClassRec;
|
WidgetClass windowWidgetClass = (WidgetClass) &windowClassRec;
|
||||||
|
|
||||||
|
#ifndef USE_XFT
|
||||||
Font
|
Font
|
||||||
WindowFont(Widget w)
|
WindowFont(Widget w)
|
||||||
{
|
{
|
||||||
@@ -179,3 +180,4 @@ WindowFontStruct(Widget w)
|
|||||||
{
|
{
|
||||||
return ((WindowWidget) w)->window.font;
|
return ((WindowWidget) w)->window.font;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
+5
-1
@@ -1161,8 +1161,10 @@ X11_create_nhwindow(int type)
|
|||||||
wp->pixel_height = 0;
|
wp->pixel_height = 0;
|
||||||
wp->keep_window = FALSE;
|
wp->keep_window = FALSE;
|
||||||
wp->nh_colors_inited = FALSE;
|
wp->nh_colors_inited = FALSE;
|
||||||
|
#ifndef USE_XFT
|
||||||
wp->boldfs = (XFontStruct *) 0;
|
wp->boldfs = (XFontStruct *) 0;
|
||||||
wp->boldfs_dpy = (Display *) 0;
|
wp->boldfs_dpy = (Display *) 0;
|
||||||
|
#endif
|
||||||
wp->title = (char *) 0;
|
wp->title = (char *) 0;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@@ -1304,11 +1306,13 @@ X11_destroy_nhwindow(winid window)
|
|||||||
WIN_INVEN = WIN_ERR;
|
WIN_INVEN = WIN_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef USE_XFT
|
||||||
if (wp->boldfs) {
|
if (wp->boldfs) {
|
||||||
XFreeFont(wp->boldfs_dpy, wp->boldfs);
|
XFreeFont(wp->boldfs_dpy, wp->boldfs);
|
||||||
wp->boldfs = (XFontStruct *) 0;
|
wp->boldfs = (XFontStruct *) 0;
|
||||||
wp->boldfs_dpy = (Display *) 0;
|
wp->boldfs_dpy = (Display *) 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (wp->title) {
|
if (wp->title) {
|
||||||
free(wp->title);
|
free(wp->title);
|
||||||
@@ -3158,7 +3162,6 @@ X11_italic_font(Display *display, XFontStruct *font)
|
|||||||
|
|
||||||
return font2;
|
return font2;
|
||||||
}
|
}
|
||||||
#endif /* !USE_XFT */
|
|
||||||
|
|
||||||
#ifdef ENHANCED_SYMBOLS
|
#ifdef ENHANCED_SYMBOLS
|
||||||
/* Given an XFontStruct, return a corresponding font that supports Unicode */
|
/* Given an XFontStruct, return a corresponding font that supports Unicode */
|
||||||
@@ -3202,6 +3205,7 @@ X11_unicode_font(Display *display, XFontStruct *font)
|
|||||||
return unifont;
|
return unifont;
|
||||||
}
|
}
|
||||||
#endif /* ENHANCED_SYMBOLS */
|
#endif /* ENHANCED_SYMBOLS */
|
||||||
|
#endif /* !USE_XFT */
|
||||||
|
|
||||||
#ifdef USE_XFT
|
#ifdef USE_XFT
|
||||||
|
|
||||||
|
|||||||
+25
-6
@@ -72,12 +72,15 @@ static void X11_free_gc(struct xwindow *wp, GC gc, X11_color color);
|
|||||||
static void X11_draw_image_string(Display *display, Drawable d,
|
static void X11_draw_image_string(Display *display, Drawable d,
|
||||||
GC ggc, int x, int y,
|
GC ggc, int x, int y,
|
||||||
const X11_map_symbol *string, int length);
|
const X11_map_symbol *string, int length);
|
||||||
#endif /* ?USE_XFT */
|
|
||||||
#ifdef ENHANCED_SYMBOLS
|
#ifdef ENHANCED_SYMBOLS
|
||||||
static void X11_set_map_font(struct xwindow *wp);
|
static void X11_set_map_font(struct xwindow *wp);
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* ?USE_XFT */
|
||||||
static Font X11_get_map_font(struct xwindow *wp);
|
static Font X11_get_map_font(struct xwindow *wp);
|
||||||
|
#ifndef USE_XFT
|
||||||
static XFontStruct *X11_get_map_font_struct(struct xwindow *wp);
|
static XFontStruct *X11_get_map_font_struct(struct xwindow *wp);
|
||||||
|
#endif
|
||||||
|
static void get_text_gc(struct xwindow *, Font);
|
||||||
static boolean init_tiles(struct xwindow *);
|
static boolean init_tiles(struct xwindow *);
|
||||||
static void set_button_values(Widget, int, int, unsigned);
|
static void set_button_values(Widget, int, int, unsigned);
|
||||||
static void map_check_size_change(struct xwindow *);
|
static void map_check_size_change(struct xwindow *);
|
||||||
@@ -85,7 +88,6 @@ static void map_update(struct xwindow *, int, int, int, int, boolean);
|
|||||||
static void init_text(struct xwindow *);
|
static void init_text(struct xwindow *);
|
||||||
static void map_exposed(Widget, XtPointer, XtPointer);
|
static void map_exposed(Widget, XtPointer, XtPointer);
|
||||||
static void set_gc(Widget, Font, const char *, Pixel, GC *, GC *);
|
static void set_gc(Widget, Font, const char *, Pixel, GC *, GC *);
|
||||||
static void get_text_gc(struct xwindow *, Font);
|
|
||||||
static void map_all_unexplored(struct map_info_t *);
|
static void map_all_unexplored(struct map_info_t *);
|
||||||
static void get_char_info(struct xwindow *);
|
static void get_char_info(struct xwindow *);
|
||||||
static void display_cursor(struct xwindow *);
|
static void display_cursor(struct xwindow *);
|
||||||
@@ -844,7 +846,11 @@ set_gc(
|
|||||||
GC *regular, GC *inverse)
|
GC *regular, GC *inverse)
|
||||||
{
|
{
|
||||||
XGCValues values;
|
XGCValues values;
|
||||||
|
#ifdef USE_XFT
|
||||||
|
XtGCMask mask = GCFunction | GCForeground | GCBackground;
|
||||||
|
#else
|
||||||
XtGCMask mask = GCFunction | GCForeground | GCBackground | GCFont;
|
XtGCMask mask = GCFunction | GCForeground | GCBackground | GCFont;
|
||||||
|
#endif
|
||||||
Pixel curpixel;
|
Pixel curpixel;
|
||||||
Arg arg[1];
|
Arg arg[1];
|
||||||
|
|
||||||
@@ -1587,10 +1593,16 @@ X11_make_gc(
|
|||||||
values.background = bgpixel;
|
values.background = bgpixel;
|
||||||
}
|
}
|
||||||
values.function = GXcopy;
|
values.function = GXcopy;
|
||||||
|
#ifdef USE_XFT
|
||||||
|
ggc = XtGetGC(wp->w,
|
||||||
|
GCFunction | GCForeground | GCBackground,
|
||||||
|
&values);
|
||||||
|
#else
|
||||||
values.font = X11_get_map_font(wp);
|
values.font = X11_get_map_font(wp);
|
||||||
ggc = XtGetGC(wp->w,
|
ggc = XtGetGC(wp->w,
|
||||||
GCFunction | GCForeground | GCBackground | GCFont,
|
GCFunction | GCForeground | GCBackground | GCFont,
|
||||||
&values);
|
&values);
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
ggc = (cur_inv ? text_map->inv_copy_gc : text_map->copy_gc);
|
ggc = (cur_inv ? text_map->inv_copy_gc : text_map->copy_gc);
|
||||||
}
|
}
|
||||||
@@ -1784,7 +1796,7 @@ create_map_window(
|
|||||||
|
|
||||||
map_info = wp->map_information =
|
map_info = wp->map_information =
|
||||||
(struct map_info_t *) alloc(sizeof (struct map_info_t));
|
(struct map_info_t *) alloc(sizeof (struct map_info_t));
|
||||||
#ifdef ENHANCED_SYMBOLS
|
#if defined(ENHANCED_SYMBOLS) && !defined(USE_XFT)
|
||||||
X11_set_map_font(wp);
|
X11_set_map_font(wp);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1835,7 +1847,7 @@ create_map_window(
|
|||||||
map_all_unexplored(map_info);
|
map_all_unexplored(map_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENHANCED_SYMBOLS
|
#if defined(ENHANCED_SYMBOLS) && !defined(USE_XFT)
|
||||||
static void
|
static void
|
||||||
X11_set_map_font(struct xwindow *wp)
|
X11_set_map_font(struct xwindow *wp)
|
||||||
{
|
{
|
||||||
@@ -1853,14 +1865,20 @@ X11_set_map_font(struct xwindow *wp)
|
|||||||
map_info->text_map.font = fs;
|
map_info->text_map.font = fs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* ENHANCED_SYMBOLS && !USE_XFT */
|
||||||
|
|
||||||
static Font
|
static Font
|
||||||
X11_get_map_font(struct xwindow *wp)
|
X11_get_map_font(struct xwindow *wp)
|
||||||
{
|
{
|
||||||
|
#ifdef USE_XFT
|
||||||
|
nhUse(wp);
|
||||||
|
return 0;
|
||||||
|
#else /* !USE_XFT */
|
||||||
return X11_get_map_font_struct(wp)->fid;
|
return X11_get_map_font_struct(wp)->fid;
|
||||||
|
#endif /* ?USE_XFT */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef USE_XFT
|
||||||
static XFontStruct *
|
static XFontStruct *
|
||||||
X11_get_map_font_struct(struct xwindow *wp)
|
X11_get_map_font_struct(struct xwindow *wp)
|
||||||
{
|
{
|
||||||
@@ -1876,6 +1894,7 @@ X11_get_map_font_struct(struct xwindow *wp)
|
|||||||
return WindowFontStruct(wp->w);
|
return WindowFontStruct(wp->w);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#endif /* USE_XFT */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Destroy this map window.
|
* Destroy this map window.
|
||||||
@@ -1900,7 +1919,7 @@ destroy_map_window(struct xwindow *wp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Free the font structure if we allocated one */
|
/* Free the font structure if we allocated one */
|
||||||
#ifdef ENHANCED_SYMBOLS
|
#if defined(ENHANCED_SYMBOLS) && !defined(USE_XFT)
|
||||||
XFreeFont(XtDisplay(wp->w), text_map->font);
|
XFreeFont(XtDisplay(wp->w), text_map->font);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+50
-18
@@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
static struct line_element *get_previous(struct line_element *);
|
static struct line_element *get_previous(struct line_element *);
|
||||||
static void set_circle_buf(struct mesg_info_t *, int);
|
static void set_circle_buf(struct mesg_info_t *, int);
|
||||||
static char *split(char *, XFontStruct *, Dimension);
|
static char *split(char *, struct xwindow *, Dimension);
|
||||||
static void add_line(struct mesg_info_t *, const char *);
|
static void add_line(struct mesg_info_t *, const char *);
|
||||||
static void redraw_message_window(struct xwindow *);
|
static void redraw_message_window(struct xwindow *);
|
||||||
static void mesg_check_size_change(struct xwindow *);
|
static void mesg_check_size_change(struct xwindow *);
|
||||||
@@ -83,7 +83,9 @@ create_message_window(struct xwindow *wp, /* window pointer */
|
|||||||
wp->mesg_information = mesg_info =
|
wp->mesg_information = mesg_info =
|
||||||
(struct mesg_info_t *) alloc(sizeof (struct mesg_info_t));
|
(struct mesg_info_t *) alloc(sizeof (struct mesg_info_t));
|
||||||
|
|
||||||
|
#ifndef USE_XFT
|
||||||
mesg_info->fs = 0;
|
mesg_info->fs = 0;
|
||||||
|
#endif
|
||||||
mesg_info->num_lines = 0;
|
mesg_info->num_lines = 0;
|
||||||
mesg_info->head = mesg_info->line_here = mesg_info->last_pause =
|
mesg_info->head = mesg_info->line_here = mesg_info->last_pause =
|
||||||
mesg_info->last_pause_head = (struct line_element *) 0;
|
mesg_info->last_pause_head = (struct line_element *) 0;
|
||||||
@@ -151,26 +153,37 @@ create_message_window(struct xwindow *wp, /* window pointer */
|
|||||||
* is appResources.message_lines high and DEFAULT_MESSAGE_WIDTH wide.
|
* is appResources.message_lines high and DEFAULT_MESSAGE_WIDTH wide.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Save character information for fast use later. */
|
||||||
|
#ifdef USE_XFT
|
||||||
|
XftFont *font = X11_new_font(wp->w, 0, NHW_MESSAGE);
|
||||||
|
XGlyphInfo extents;
|
||||||
|
mesg_info->char_width = font->max_advance_width;
|
||||||
|
mesg_info->char_height = font->height;
|
||||||
|
mesg_info->char_ascent = font->ascent;
|
||||||
|
mesg_info->char_lbearing = 0;
|
||||||
|
/* Xft seems to offer no direct way to distinguish proportional from
|
||||||
|
monospaced fonts. Assume that "!" will be narrower than maximum. */
|
||||||
|
XftTextExtents8(XtDisplay(wp->w), font, (const FcChar8*) "!", 1, &extents);
|
||||||
|
int min_width = extents.width - extents.x;
|
||||||
|
/* "Maximum" is likely to include things like Chinese characters that
|
||||||
|
* display at double width. Use the width of "M". */
|
||||||
|
XftTextExtents8(XtDisplay(wp->w), font, (const FcChar8*) "M", 1, &extents);
|
||||||
|
int max_width = extents.width - extents.x;
|
||||||
|
X11_release_font(wp->w, font);
|
||||||
|
#else
|
||||||
/* Get the font information. */
|
/* Get the font information. */
|
||||||
num_args = 0;
|
num_args = 0;
|
||||||
XtSetArg(args[num_args], XtNfont, &mesg_info->fs);
|
XtSetArg(args[num_args], XtNfont, &mesg_info->fs);
|
||||||
num_args++;
|
num_args++;
|
||||||
XtGetValues(wp->w, args, num_args);
|
XtGetValues(wp->w, args, num_args);
|
||||||
|
|
||||||
/* Save character information for fast use later. */
|
|
||||||
#ifdef USE_XFT
|
|
||||||
XftFont *font = X11_new_font(wp->w, 0, NHW_MESSAGE);
|
|
||||||
mesg_info->char_width = font->max_advance_width;
|
|
||||||
mesg_info->char_height = font->height;
|
|
||||||
mesg_info->char_ascent = font->ascent;
|
|
||||||
mesg_info->char_lbearing = 0;
|
|
||||||
X11_release_font(wp->w, font);
|
|
||||||
#else
|
|
||||||
mesg_info->char_width = mesg_info->fs->max_bounds.width;
|
mesg_info->char_width = mesg_info->fs->max_bounds.width;
|
||||||
mesg_info->char_height =
|
mesg_info->char_height =
|
||||||
mesg_info->fs->max_bounds.ascent + mesg_info->fs->max_bounds.descent;
|
mesg_info->fs->max_bounds.ascent + mesg_info->fs->max_bounds.descent;
|
||||||
mesg_info->char_ascent = mesg_info->fs->max_bounds.ascent;
|
mesg_info->char_ascent = mesg_info->fs->max_bounds.ascent;
|
||||||
mesg_info->char_lbearing = -mesg_info->fs->min_bounds.lbearing;
|
mesg_info->char_lbearing = -mesg_info->fs->min_bounds.lbearing;
|
||||||
|
int min_width = mesg_info->fs->min_bounds.width;
|
||||||
|
int max_width = mesg_info->fs->max_bounds.width;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
get_gc(wp->w, mesg_info);
|
get_gc(wp->w, mesg_info);
|
||||||
@@ -178,12 +191,11 @@ create_message_window(struct xwindow *wp, /* window pointer */
|
|||||||
wp->pixel_height = ((int) iflags.msg_history) * mesg_info->char_height;
|
wp->pixel_height = ((int) iflags.msg_history) * mesg_info->char_height;
|
||||||
|
|
||||||
/* If a variable spaced font, only use 2/3 of the default size */
|
/* If a variable spaced font, only use 2/3 of the default size */
|
||||||
if (mesg_info->fs->min_bounds.width != mesg_info->fs->max_bounds.width) {
|
if (min_width != max_width) {
|
||||||
wp->pixel_width = ((2 * DEFAULT_MESSAGE_WIDTH) / 3)
|
wp->pixel_width = ((2 * DEFAULT_MESSAGE_WIDTH) / 3)
|
||||||
* mesg_info->fs->max_bounds.width;
|
* max_width;
|
||||||
} else
|
} else
|
||||||
wp->pixel_width =
|
wp->pixel_width = (DEFAULT_MESSAGE_WIDTH * max_width);
|
||||||
(DEFAULT_MESSAGE_WIDTH * mesg_info->fs->max_bounds.width);
|
|
||||||
|
|
||||||
/* Set the new width and height. */
|
/* Set the new width and height. */
|
||||||
num_args = 0;
|
num_args = 0;
|
||||||
@@ -259,7 +271,7 @@ append_message(struct xwindow *wp, const char *str)
|
|||||||
remainder = buf;
|
remainder = buf;
|
||||||
do {
|
do {
|
||||||
mark = remainder;
|
mark = remainder;
|
||||||
remainder = split(mark, wp->mesg_information->fs, wp->pixel_width);
|
remainder = split(mark, wp, wp->pixel_width);
|
||||||
add_line(wp->mesg_information, mark);
|
add_line(wp->mesg_information, mark);
|
||||||
} while (remainder);
|
} while (remainder);
|
||||||
}
|
}
|
||||||
@@ -366,10 +378,16 @@ set_circle_buf(struct mesg_info_t *mesg_info, int count)
|
|||||||
* not, back up from the end by words until we find a place to split.
|
* not, back up from the end by words until we find a place to split.
|
||||||
*/
|
*/
|
||||||
static char *
|
static char *
|
||||||
split(char *s,
|
split(
|
||||||
XFontStruct *fs, /* Font for the window. */
|
char *s,
|
||||||
|
struct xwindow *wp,
|
||||||
Dimension pixel_width)
|
Dimension pixel_width)
|
||||||
{
|
{
|
||||||
|
#ifdef USE_XFT
|
||||||
|
XftFont *font = X11_new_font(wp->w, 0, NHW_MESSAGE);
|
||||||
|
#else
|
||||||
|
XFontStruct *fs = wp->mesg_information->fs; /* Font for the window. */
|
||||||
|
#endif
|
||||||
char save, *end, *remainder;
|
char save, *end, *remainder;
|
||||||
|
|
||||||
save = '\0';
|
save = '\0';
|
||||||
@@ -377,7 +395,18 @@ split(char *s,
|
|||||||
end = eos(s); /* point to null at end of string */
|
end = eos(s); /* point to null at end of string */
|
||||||
|
|
||||||
/* assume that if end == s, XXXXXX returns 0) */
|
/* assume that if end == s, XXXXXX returns 0) */
|
||||||
while ((Dimension) XTextWidth(fs, s, (int) strlen(s)) > pixel_width) {
|
while (TRUE) {
|
||||||
|
#ifdef USE_XFT
|
||||||
|
XGlyphInfo extents;
|
||||||
|
XftTextExtents8(XtDisplay(wp->w), font, (const FcChar8*) s, strlen(s), &extents);
|
||||||
|
if (extents.width - extents.x < pixel_width) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if ((Dimension) XTextWidth(fs, s, (int) strlen(s)) < pixel_width) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
*end-- = save;
|
*end-- = save;
|
||||||
while (*end != ' ') {
|
while (*end != ' ') {
|
||||||
if (end == s)
|
if (end == s)
|
||||||
@@ -388,6 +417,9 @@ split(char *s,
|
|||||||
*end = '\0';
|
*end = '\0';
|
||||||
remainder = end + 1;
|
remainder = end + 1;
|
||||||
}
|
}
|
||||||
|
#ifdef USE_XFT
|
||||||
|
X11_release_font(wp->w, font);
|
||||||
|
#endif
|
||||||
return remainder;
|
return remainder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-19
@@ -136,16 +136,10 @@ add_to_text_window(struct xwindow *wp, int attr, /* currently unused */
|
|||||||
const char *str)
|
const char *str)
|
||||||
{
|
{
|
||||||
struct text_info_t *text_info = wp->text_information;
|
struct text_info_t *text_info = wp->text_information;
|
||||||
int width;
|
|
||||||
|
|
||||||
nhUse(attr);
|
nhUse(attr);
|
||||||
|
|
||||||
append_text_buffer(&text_info->text, str, FALSE);
|
append_text_buffer(&text_info->text, str, FALSE);
|
||||||
|
|
||||||
/* Calculate text width and save longest line */
|
|
||||||
width = XTextWidth(text_info->fs, str, (int) strlen(str));
|
|
||||||
if (width > text_info->max_width)
|
|
||||||
text_info->max_width = width;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -208,9 +202,6 @@ create_text_window(struct xwindow *wp)
|
|||||||
(struct text_info_t *) alloc(sizeof(struct text_info_t));
|
(struct text_info_t *) alloc(sizeof(struct text_info_t));
|
||||||
|
|
||||||
init_text_buffer(&text_info->text);
|
init_text_buffer(&text_info->text);
|
||||||
text_info->max_width = 0;
|
|
||||||
text_info->extra_width = 0;
|
|
||||||
text_info->extra_height = 0;
|
|
||||||
text_info->blocked = FALSE;
|
text_info->blocked = FALSE;
|
||||||
text_info->destroy_on_ack = TRUE; /* Ok to destroy before display */
|
text_info->destroy_on_ack = TRUE; /* Ok to destroy before display */
|
||||||
#ifdef GRAPHIC_TOMBSTONE
|
#ifdef GRAPHIC_TOMBSTONE
|
||||||
@@ -269,15 +260,6 @@ create_text_window(struct xwindow *wp)
|
|||||||
args, /* set some values */
|
args, /* set some values */
|
||||||
num_args); /* number of values to set */
|
num_args); /* number of values to set */
|
||||||
X11_wrap_widget_if_Xft(wp->w, NHW_TEXT);
|
X11_wrap_widget_if_Xft(wp->w, NHW_TEXT);
|
||||||
|
|
||||||
/* Get the font and margin information. */
|
|
||||||
num_args = 0;
|
|
||||||
XtSetArg(args[num_args], XtNfont, &text_info->fs);
|
|
||||||
num_args++;
|
|
||||||
XtGetValues(wp->w, args, num_args);
|
|
||||||
|
|
||||||
text_info->extra_width = 0;
|
|
||||||
text_info->extra_height = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -495,12 +477,16 @@ rip_exposed(Widget w, XtPointer client_data UNUSED,
|
|||||||
XDestroyImage(rip_image); /* data bytes free'd also */
|
XDestroyImage(rip_image); /* data bytes free'd also */
|
||||||
}
|
}
|
||||||
|
|
||||||
mask = GCFunction | GCForeground | GCGraphicsExposures | GCFont;
|
|
||||||
values.graphics_exposures = False;
|
values.graphics_exposures = False;
|
||||||
XtSetArg(args[0], XtNforeground, &values.foreground);
|
XtSetArg(args[0], XtNforeground, &values.foreground);
|
||||||
XtGetValues(w, args, 1);
|
XtGetValues(w, args, 1);
|
||||||
values.function = GXcopy;
|
values.function = GXcopy;
|
||||||
|
#ifdef USE_XFT
|
||||||
|
mask = GCFunction | GCForeground | GCGraphicsExposures;
|
||||||
|
#else
|
||||||
|
mask = GCFunction | GCForeground | GCGraphicsExposures | GCFont;
|
||||||
values.font = WindowFont(w);
|
values.font = WindowFont(w);
|
||||||
|
#endif
|
||||||
ggc = XtGetGC(w, mask, &values);
|
ggc = XtGetGC(w, mask, &values);
|
||||||
|
|
||||||
if (rip_pixmap != None) {
|
if (rip_pixmap != None) {
|
||||||
|
|||||||
Reference in New Issue
Block a user