Convert the text window to Xft

This commit is contained in:
Ray Chason
2026-08-19 09:37:41 +03:00
committed by Pasi Kallinen
parent cfe67ecc62
commit 31f5ca334d
+29 -75
View File
@@ -17,7 +17,8 @@
#include <X11/Shell.h>
#include <X11/Xos.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/AsciiText.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/Viewport.h>
#include <X11/Xaw/Cardinals.h>
#include <X11/Xatom.h>
@@ -43,12 +44,16 @@
*/
static const char text_translations[] = "#override\n\
<BtnDown>: dismiss_text()\n\
<Btn1Down>: dismiss_text()\n\
<Btn4Down>: scroll(8)\n\
<Btn5Down>: scroll(2)\n\
<Key>: key_dismiss_text()";
#ifdef GRAPHIC_TOMBSTONE
static const char rip_translations[] = "#override\n\
<BtnDown>: rip_dismiss_text()\n\
<Btn1Down>: rip_dismiss_text()\n\
<Btn4Down>: scroll(8)\n\
<Btn5Down>: scroll(2)\n\
<Key>: rip_dismiss_text()";
static Widget create_ripout_widget(Widget);
@@ -147,42 +152,13 @@ display_text_window(struct xwindow *wp, boolean blocking)
struct text_info_t *text_info;
Arg args[8];
Cardinal num_args;
Dimension width, height, font_height;
int nlines;
text_info = wp->text_information;
width = text_info->max_width + text_info->extra_width;
text_info->blocked = blocking;
text_info->destroy_on_ack = FALSE;
font_height = nhFontHeight(wp->w, NHW_TEXT);
/*
* Calculate the number of lines to use. First, find the number of
* lines that would fit on the screen. Next, remove four of these
* lines to give room for a possible window manager titlebar (some
* wm's put a titlebar on transient windows). Make sure we have
* _some_ lines. Finally, use the number of lines in the text if
* there are fewer than the max.
*/
nlines = (XtScreen(wp->w)->height - text_info->extra_height) / font_height;
nlines -= 4;
if (nlines > text_info->text.num_lines)
nlines = text_info->text.num_lines;
if (nlines <= 0)
nlines = 1;
height = nlines * font_height + text_info->extra_height;
num_args = 0;
if (nlines < text_info->text.num_lines) {
/* add on width of scrollbar. Really should look this up,
* but can't until the window is realized. Chicken-and-egg problem.
*/
width += 20;
}
#ifdef GRAPHIC_TOMBSTONE
if (text_info->is_rip) {
Widget rip = create_ripout_widget(XtParent(wp->w));
@@ -195,18 +171,10 @@ display_text_window(struct xwindow *wp, boolean blocking)
}
#endif
if (width > (Dimension) XtScreen(wp->w)->width) { /* too wide for screen */
/* Back off some amount - we really need to back off the scrollbar */
/* width plus some extra. */
width = XtScreen(wp->w)->width - 20;
}
XtSetArg(args[num_args], XtNstring, text_info->text.text);
num_args++;
XtSetArg(args[num_args], XtNwidth, width);
num_args++;
XtSetArg(args[num_args], XtNheight, height);
XtSetArg(args[num_args], XtNlabel, text_info->text.text);
num_args++;
XtSetValues(wp->w, args, num_args);
X11_update_label_if_Xft(wp->w);
#ifdef TRANSIENT_TEXT
XtRealizeWidget(wp->popup);
@@ -217,22 +185,6 @@ display_text_window(struct xwindow *wp, boolean blocking)
nh_XtPopup(wp->popup, (int) XtGrabNone, wp->w);
/* Kludge alert. Scrollbars are not sized correctly by the Text widget */
/* if added before the window is displayed, so do it afterward. */
num_args = 0;
if (nlines < text_info->text.num_lines) { /* add vert scrollbar */
XtSetArg(args[num_args], nhStr(XtNscrollVertical),
XawtextScrollAlways);
num_args++;
}
if (width >= (Dimension)(XtScreen(wp->w)->width - 20)) { /* too wide */
XtSetArg(args[num_args], nhStr(XtNscrollHorizontal),
XawtextScrollAlways);
num_args++;
}
if (num_args)
XtSetValues(wp->w, args, num_args);
/* We want the user to acknowledge. */
if (blocking) {
(void) x_event(EXIT_ON_EXIT);
@@ -246,7 +198,6 @@ create_text_window(struct xwindow *wp)
struct text_info_t *text_info;
Arg args[8];
Cardinal num_args;
Position top_margin, bottom_margin, left_margin, right_margin;
Widget form;
wp->type = NHW_TEXT;
@@ -280,46 +231,49 @@ create_text_window(struct xwindow *wp)
wp->popup,
XtParseTranslationTable("<Message>WM_PROTOCOLS: delete_text()"));
/* Create the viewport */
num_args = 0;
XtSetArg(args[num_args], XtNallowVert, True);
num_args++;
XtSetArg(args[num_args], XtNallowHoriz, True);
num_args++;
Widget viewport = XtCreateManagedWidget(
"text_viewport", /* name */
viewportWidgetClass, /* widget class from Window.h */
wp->popup, /* parent widget */
args, /* set some values */
num_args); /* number of values to set */
num_args = 0;
XtSetArg(args[num_args], XtNallowShellResize, True), num_args++;
XtSetArg(args[num_args], XtNtranslations,
XtParseTranslationTable(text_translations)), num_args++;
form = XtCreateManagedWidget("form", formWidgetClass, wp->popup, args,
form = XtCreateManagedWidget("form", formWidgetClass, viewport, args,
num_args);
num_args = 0;
XtSetArg(args[num_args], nhStr(XtNdisplayCaret), False);
num_args++;
XtSetArg(args[num_args], XtNresize, XawtextResizeBoth);
num_args++;
XtSetArg(args[num_args], XtNtranslations,
XtParseTranslationTable(text_translations));
num_args++;
XtSetArg(args[num_args], XtNjustify, XtJustifyLeft); num_args++;
wp->w = XtCreateManagedWidget(svk.killer.name[0] && WIN_MAP == WIN_ERR
? "tombstone"
: "text_text", /* name */
asciiTextWidgetClass,
labelWidgetClass,
form, /* parent widget */
args, /* set some values */
num_args); /* number of values to set */
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++;
XtSetArg(args[num_args], nhStr(XtNtopMargin), &top_margin);
num_args++;
XtSetArg(args[num_args], nhStr(XtNbottomMargin), &bottom_margin);
num_args++;
XtSetArg(args[num_args], nhStr(XtNleftMargin), &left_margin);
num_args++;
XtSetArg(args[num_args], nhStr(XtNrightMargin), &right_margin);
num_args++;
XtGetValues(wp->w, args, num_args);
text_info->extra_width = left_margin + right_margin;
text_info->extra_height = top_margin + bottom_margin;
text_info->extra_width = 0;
text_info->extra_height = 0;
}
void