Adding the -f option
authorphillbush <phillbush@cock.li>
Fri, 31 Jul 2020 14:01:53 +0000 (11:01 -0300)
committerphillbush <phillbush@cock.li>
Fri, 31 Jul 2020 14:01:53 +0000 (11:01 -0300)
xmenu.1
xmenu.c

diff --git a/xmenu.1 b/xmenu.1
index 1e602df..e897cad 100644 (file)
--- a/xmenu.1
+++ b/xmenu.1
@@ -3,7 +3,7 @@
 xmenu \- menu utility for X
 .SH SYNOPSIS
 .B xmenu
 xmenu \- menu utility for X
 .SH SYNOPSIS
 .B xmenu
-.RB [ \-iw ]
+.RB [ \-fiw ]
 .RB [ -p
 .IR position ]
 .RI [ title ]
 .RB [ -p
 .IR position ]
 .RI [ title ]
@@ -16,6 +16,13 @@ and outputs the item selected to stdout.
 .PP
 The options are as follows:
 .TP
 .PP
 The options are as follows:
 .TP
+.B -f
+Make glyphs align based solely on the first font specified.
+Without this option, glyphs are aligned based on the font in which they are found.
+This option may correct alignment of CJK glyphs
+if a CJK font is specified after a Latin font,
+but may break the alignment of other glyphs in some cases.
+.TP
 .B -i
 Disable icons.
 This makes xmenu loading faster when not using icons.
 .B -i
 Disable icons.
 This makes xmenu loading faster when not using icons.
diff --git a/xmenu.c b/xmenu.c
index c5a0795..68c8360 100644 (file)
--- a/xmenu.c
+++ b/xmenu.c
@@ -95,6 +95,7 @@ static Atom wmdelete;
 static Atom netatom[NetLast];
 
 /* flags */
 static Atom netatom[NetLast];
 
 /* flags */
+static int fflag = 0;   /* whether glyphs should align based on the first font */
 static int iflag = 0;   /* whether to disable icons */
 static int mflag = 0;   /* whether the user specified a monitor with -p */
 static int pflag = 0;   /* whether the user specified a position with -p */
 static int iflag = 0;   /* whether to disable icons */
 static int mflag = 0;   /* whether the user specified a monitor with -p */
 static int pflag = 0;   /* whether the user specified a position with -p */
@@ -116,8 +117,11 @@ main(int argc, char *argv[])
        XClassHint classh;
        int ch;
 
        XClassHint classh;
        int ch;
 
-       while ((ch = getopt(argc, argv, "ip:w")) != -1) {
+       while ((ch = getopt(argc, argv, "fip:w")) != -1) {
                switch (ch) {
                switch (ch) {
+               case 'f':
+                       fflag = 1;
+                       break;
                case 'i':
                        iflag = 1;
                        break;
                case 'i':
                        iflag = 1;
                        break;
@@ -642,6 +646,9 @@ drawtext(XftDraw *draw, XftColor *color, int x, int y, unsigned h, const char *t
        FcChar32 ucode;
        XftFont *currfont;
        int textlen = 0;
        FcChar32 ucode;
        XftFont *currfont;
        int textlen = 0;
+       int texty;
+
+       texty = y + (h - (dc.fonts[0]->ascent + dc.fonts[0]->descent))/2 + dc.fonts[0]->ascent;
 
        s = text;
        while (*s) {
 
        s = text;
        while (*s) {
@@ -667,9 +674,8 @@ drawtext(XftDraw *draw, XftColor *color, int x, int y, unsigned h, const char *t
                textlen += ext.xOff;
 
                if (draw) {
                textlen += ext.xOff;
 
                if (draw) {
-                       int texty;
-
-                       texty = y + (h - (currfont->ascent + currfont->descent))/2 + currfont->ascent;
+                       if (!fflag)
+                               texty = y + (h - (currfont->ascent + currfont->descent))/2 + currfont->ascent;
                        XftDrawStringUtf8(draw, color, currfont, x, texty,
                                          (XftChar8 *)s, len);
                        x += ext.xOff;
                        XftDrawStringUtf8(draw, color, currfont, x, texty,
                                          (XftChar8 *)s, len);
                        x += ext.xOff;
@@ -1272,6 +1278,6 @@ cleanup(void)
 static void
 usage(void)
 {
 static void
 usage(void)
 {
-       (void)fprintf(stderr, "usage: xmenu [-iw] [-p position] [title]\n");
+       (void)fprintf(stderr, "usage: xmenu [-fiw] [-p position] [title]\n");
        exit(1);
 }
        exit(1);
 }