diff --git a/win/X11/wintext.c b/win/X11/wintext.c index 57c45540b..21db6199f 100644 --- a/win/X11/wintext.c +++ b/win/X11/wintext.c @@ -17,7 +17,8 @@ #include #include #include -#include +#include +#include #include #include @@ -43,12 +44,16 @@ */ static const char text_translations[] = "#override\n\ - : dismiss_text()\n\ + : dismiss_text()\n\ + : scroll(8)\n\ + : scroll(2)\n\ : key_dismiss_text()"; #ifdef GRAPHIC_TOMBSTONE static const char rip_translations[] = "#override\n\ - : rip_dismiss_text()\n\ + : rip_dismiss_text()\n\ + : scroll(8)\n\ + : scroll(2)\n\ : 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("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