]> granicus.if.org Git - nethack/commitdiff
X11: Allow bold attribute for menucolors
authorPasi Kallinen <paxed@alt.org>
Fri, 12 Oct 2018 17:46:19 +0000 (20:46 +0300)
committerPasi Kallinen <paxed@alt.org>
Fri, 12 Oct 2018 17:46:19 +0000 (20:46 +0300)
doc/fixes36.2
include/winX.h
win/X11/winX.c
win/X11/winmenu.c

index d470094ba1e32f42841cee14942be16124643d89..127f7ee1b54792da6a43043aeb99cee12b716478 100644 (file)
@@ -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
index 6939353c9602e23a5a8dc3df04de3b4d0836c0de..6bb771a9b0032204a05ffcccc9da18a74cc67b1c 100644 (file)
@@ -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 *));
index fa94043cdac2b2cef8a06246f72eeb57f58730d9..39c650973742273e84a306147cd483f04e9196dc 100644 (file)
@@ -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
index 77009b8d7f4616891ae208cbce5b9cf6d176cc09..d90f6b0ccd1df80e6147eaf8480017f4df15ba25 100644 (file)
@@ -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 */