From 9f2f232d99a5763e31f06037caa76b07663fad76 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Fri, 12 Oct 2018 20:46:19 +0300 Subject: [PATCH] X11: Allow bold attribute for menucolors --- doc/fixes36.2 | 2 +- include/winX.h | 3 +++ win/X11/winX.c | 28 ++++++++++++++++++++++++++++ win/X11/winmenu.c | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/doc/fixes36.2 b/doc/fixes36.2 index d470094ba..127f7ee1b 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -220,7 +220,7 @@ Qt: add Qt5 specific hints file for linux and Mac OS X (Ray Chason) Qt: enable compiling Qt5 on Windows (Ray Chason) Qt: entering extended commands, hide non-matching ones Qt: remember tile and font size -X11: implement menucolors and allow menus to obey inverse attribute +X11: implement menucolors and allow menus to obey some attributes X11: make key translations work with menus on Linux X11: allow mouse wheel scrolling to work in menus by default X11: handle paged menu control keys diff --git a/include/winX.h b/include/winX.h index 6939353c9..6bb771a9b 100644 --- a/include/winX.h +++ b/include/winX.h @@ -157,6 +157,8 @@ struct menu_info_t { XColor nh_colors[CLR_MAX]; XFontStruct *fs; /* Font for the window. */ + XFontStruct *boldfs; /* Bold font */ + Display *boldfs_dpy; long menu_count; /* number entered by user */ Dimension line_height; /* Total height of a line of text. */ Dimension internal_height; /* Internal height between widget & border */ @@ -297,6 +299,7 @@ E void FDECL(positionpopup, (Widget, BOOLEAN_P)); E struct xwindow *FDECL(find_widget, (Widget)); E Boolean FDECL(nhApproxColor, (Screen *, Colormap, char *, XColor *)); E void FDECL(get_widget_window_geometry, (Widget, int *, int *, int *, int *)); +E char *FDECL(fontname_boldify, (const char *)); E Dimension FDECL(nhFontHeight, (Widget)); E char FDECL(key_event_to_char, (XKeyEvent *)); E void FDECL(msgkey, (Widget, XtPointer, XEvent *)); diff --git a/win/X11/winX.c b/win/X11/winX.c index fa94043cd..39c650973 100644 --- a/win/X11/winX.c +++ b/win/X11/winX.c @@ -484,6 +484,34 @@ int *x, *y, *width, *height; *y -= top; } +/* Change the full font name string so the weight is "bold" */ +char * +fontname_boldify(fontname) +const char *fontname; +{ + static char buf[BUFSZ]; + char *bufp = buf; + int idx = 0; + + while (*fontname) { + if (*fontname == '-') + idx++; + *bufp = *fontname; + if (idx == 3) { + strcat(buf, "bold"); + bufp += 5; + do { + fontname++; + } while (*fontname && *fontname != '-'); + } else { + bufp++; + fontname++; + } + } + *bufp = '\0'; + return buf; +} + #ifdef TEXTCOLOR /* ARGSUSED */ static void diff --git a/win/X11/winmenu.c b/win/X11/winmenu.c index 77009b8d7..d90f6b0cc 100644 --- a/win/X11/winmenu.c +++ b/win/X11/winmenu.c @@ -778,6 +778,31 @@ Widget form,under; return all; } +void +load_boldfont(wp, w) +struct xwindow *wp; +Widget w; +{ + Arg args[1]; + XFontStruct *fs; + unsigned long ret; + char *fontname; + Display *dpy; + + if (wp->menu_information->boldfs) + return; + + XtSetArg(args[0], nhStr(XtNfont), &fs); + XtGetValues(w, args, 1); + + if (!XGetFontProperty(fs, XA_FONT, &ret)) + return; + + wp->menu_information->boldfs_dpy = dpy = XtDisplay(w); + fontname = fontname_boldify(XGetAtomName(dpy, (Atom)ret)); + wp->menu_information->boldfs = XLoadQueryFont(dpy, fontname); +} + void menu_create_entries(wp, curr_menu) struct xwindow *wp; @@ -843,6 +868,13 @@ struct menu *curr_menu; : labelWidgetClass, wp->w, args, num_args); + if (attr == ATR_BOLD) { + load_boldfont(wp, curr->w); + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNfont), wp->menu_information->boldfs); num_args++; + XtSetValues(curr->w, args, num_args); + } + if (canpick) XtAddCallback(linewidget, XtNcallback, menu_select, (XtPointer) curr); @@ -1285,6 +1317,8 @@ destroy_menu_window(wp) struct xwindow *wp; { clear_old_menu(wp); /* this will also destroy the widgets */ + if (wp->menu_information->boldfs) + XFreeFont(wp->menu_information->boldfs_dpy, wp->menu_information->boldfs); free((genericptr_t) wp->menu_information); wp->menu_information = (struct menu_info_t *) 0; wp->type = NHW_NONE; /* allow re-use */