add -r option
[xmenu] / xmenu.c
diff --git a/xmenu.c b/xmenu.c
index 51412b3..4bea2da 100644 (file)
--- a/xmenu.c
+++ b/xmenu.c
@@ -31,6 +31,7 @@ static Atom netatom[NetLast];
 
 /* flags */
 static int iflag = 0;   /* whether to disable icons */
 
 /* 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 */
 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)
 {
 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);
 }
 
        exit(1);
 }
 
@@ -628,12 +629,12 @@ setupmenupos(struct Menu *menu)
        width = menu->w + config.border_pixels * 2;
        height = menu->h + config.border_pixels * 2;
        if (menu->parent == NULL) { /* if root menu, calculate in respect to cursor */
        width = menu->w + config.border_pixels * 2;
        height = menu->h + config.border_pixels * 2;
        if (menu->parent == NULL) { /* if root menu, calculate in respect to cursor */
-               if (pflag || (config.posx > mon.x && mon.x + mon.w - config.posx >= width))
+               if (pflag || (config.posx >= mon.x && mon.x + mon.w - config.posx >= width))
                        menu->x = config.posx;
                else if (config.posx > width)
                        menu->x = config.posx - width;
 
                        menu->x = config.posx;
                else if (config.posx > width)
                        menu->x = config.posx - width;
 
-               if (pflag || (config.posy > mon.y && mon.y + mon.h - config.posy >= height))
+               if (pflag || (config.posy >= mon.y && mon.y + mon.h - config.posy >= height))
                        menu->y = config.posy;
                else if (mon.y + mon.h > height)
                        menu->y = mon.y + mon.h - height;
                        menu->y = config.posy;
                else if (mon.y + mon.h > height)
                        menu->y = mon.y + mon.h - height;
@@ -1055,6 +1056,17 @@ itemcycle(struct Menu *currmenu, int direction)
        return item;
 }
 
        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)
 /* run event loop */
 static void
 run(struct Menu *currmenu)
@@ -1091,6 +1103,8 @@ run(struct Menu *currmenu)
                        drawmenus(currmenu);
                        break;
                case ButtonRelease:
                        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)
                        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;
 
        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;
                switch (ch) {
                case 'i':
                        iflag = 1;
@@ -1249,6 +1263,9 @@ main(int argc, char *argv[])
                        pflag = 1;
                        parseposition(optarg);
                        break;
                        pflag = 1;
                        parseposition(optarg);
                        break;
+               case 'r':
+                       rflag = 1;
+                       break;
                case 'w':
                        wflag = 1;
                        break;
                case 'w':
                        wflag = 1;
                        break;