With the -fw option, the dmenu window pops in the middle of the screen,
giving a UI alternative to top or bottom menus.
---
 config.def.h |  2 ++
 dmenu.1      |  4 ++++
 dmenu.c      | 18 ++++++++++++++++--
 3 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/config.def.h b/config.def.h
index 1edb647..d7fd009 100644
--- a/config.def.h
+++ b/config.def.h
@@ -21,3 +21,5 @@ static unsigned int lines      = 0;
  * for example: " /?\"&[]"
  */
 static const char worddelimiters[] = " ";
+
+static int floating_window = 0;
diff --git a/dmenu.1 b/dmenu.1
index 323f93c..c1cb38d 100644
--- a/dmenu.1
+++ b/dmenu.1
@@ -4,6 +4,7 @@ dmenu \- dynamic menu
 .SH SYNOPSIS
 .B dmenu
 .RB [ \-bfiv ]
+.RB [ \-fw ]
 .RB [ \-l
 .IR lines ]
 .RB [ \-m
@@ -47,6 +48,9 @@ is faster, but will lock up X until stdin reaches 
end\-of\-file.
 .B \-i
 dmenu matches menu items case insensitively.
 .TP
+.B \-fw
+dmenu appears as a floating window.
+.TP
 .BI \-l " lines"
 dmenu lists items vertically, with the given number of lines.
 .TP
diff --git a/dmenu.c b/dmenu.c
index 86dbe16..31d6a0f 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -649,6 +649,12 @@ setup(void)
                x = info[i].x_org;
                y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
                mw = info[i].width;
+               if (floating_window)
+               {
+                       x += info[i].width / 3;
+                       y = info[i].height / 4;
+                       mw -= 2 * info[i].width / 3;
+               }
                XFree(info);
        } else
 #endif
@@ -659,6 +665,12 @@ setup(void)
                x = 0;
                y = topbar ? 0 : wa.height - mh;
                mw = wa.width;
+               if (floating_window)
+               {
+                       x = wa.width / 3;
+                       y = wa.height / 4;
+                       mw -= 2 * wa.width / 3;
+               }
        }
        promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
        inputw = MIN(inputw, mw/3);
@@ -698,7 +710,7 @@ setup(void)
 static void
 usage(void)
 {
-       fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m 
monitor]\n"
+       fputs("usage: dmenu [-bfiv] [-fw] [-l lines] [-p prompt] [-fn font] [-m 
monitor]\n"
              "             [-nb color] [-nf color] [-sb color] [-sf color] [-w 
windowid]\n", stderr);
        exit(1);
 }
@@ -721,7 +733,9 @@ main(int argc, char *argv[])
                else if (!strcmp(argv[i], "-i")) { /* case-insensitive item 
matching */
                        fstrncmp = strncasecmp;
                        fstrstr = cistrstr;
-               } else if (i + 1 == argc)
+               } else if (!strcmp(argv[i], "-fw"))  /* floating window */
+                       floating_window = 1;
+               else if (i + 1 == argc)
                        usage();
                /* these options take one argument */
                else if (!strcmp(argv[i], "-l"))   /* number of lines in 
vertical list */
-- 
2.29.2


Reply via email to