diff --git a/xmenu.1 b/xmenu.1 index 30ea36b..f5d95e5 100644 --- a/xmenu.1 +++ b/xmenu.1 @@ -3,7 +3,7 @@ xmenu \- menu utility for X .SH SYNOPSIS .B xmenu -.RB [ \-iw ] +.RB [ \-irw ] .RB [ -p .IR position ] .RI [ title ] @@ -54,6 +54,10 @@ specifies that .B xmenu must spawn at the position 100x500 of the monitor 0. .TP +.B -r +If this option is set, the right mouse button is disabled; +so pressing it will not trigger any menu item. +.TP .B -w Asks the window manager to draw a border around the menus. This option may be buggy in some window managers, diff --git a/xmenu.c b/xmenu.c index 3eab38d..4bea2da 100644 --- a/xmenu.c +++ b/xmenu.c @@ -31,6 +31,7 @@ static Atom netatom[NetLast]; /* flags */ static int iflag = 0; /* whether to disable icons */ +static int rflag = 0; /* whether to disable right-click */ 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 wflag = 0; /* whether to let the window manager control XMenu */ @@ -42,7 +43,7 @@ static int wflag = 0; /* whether to let the window manager control XMenu */ static void usage(void) { - (void)fprintf(stderr, "usage: xmenu [-iw] [-p position] [title]\n"); + (void)fprintf(stderr, "usage: xmenu [-irw] [-p position] [title]\n"); exit(1); } @@ -1055,6 +1056,17 @@ itemcycle(struct Menu *currmenu, int direction) return item; } +/* check if button is used to open a item on click */ +static int +isclickbutton(unsigned int button) +{ + if (button == Button1) + return 1; + if (!rflag && button == Button3) + return 1; + return 0; +} + /* run event loop */ static void run(struct Menu *currmenu) @@ -1091,6 +1103,8 @@ run(struct Menu *currmenu) drawmenus(currmenu); break; case ButtonRelease: + if (!isclickbutton(ev.xbutton.button)) + break; menu = getmenu(currmenu, ev.xbutton.window); item = getitem(menu, ev.xbutton.y); if (menu == NULL || item == NULL) @@ -1240,7 +1254,7 @@ main(int argc, char *argv[]) XClassHint classh; int ch; - while ((ch = getopt(argc, argv, "ip:w")) != -1) { + while ((ch = getopt(argc, argv, "ip:rw")) != -1) { switch (ch) { case 'i': iflag = 1; @@ -1249,6 +1263,9 @@ main(int argc, char *argv[]) pflag = 1; parseposition(optarg); break; + case 'r': + rflag = 1; + break; case 'w': wflag = 1; break;