diff -ur dmenu-2.8-orig/config.mk dmenu-2.8/config.mk --- dmenu-2.8-orig/config.mk 2007-03-07 05:30:51.000000000 -0700 +++ dmenu-2.8/config.mk 2007-04-02 19:50:04.000000000 -0600 @@ -12,7 +12,7 @@ # includes and libs INCS = -I. -I/usr/include -I${X11INC} -LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 +LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXinerama # flags CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" diff -ur dmenu-2.8-orig/dmenu.1 dmenu-2.8/dmenu.1 --- dmenu-2.8-orig/dmenu.1 2007-03-07 05:30:51.000000000 -0700 +++ dmenu-2.8/dmenu.1 2007-04-07 12:13:19.000000000 -0600 @@ -10,6 +10,7 @@ .RB [ \-p " "] .RB [ \-sb " "] .RB [ \-sf " "] +.RB [ \-xs " ] .RB [ \-v ] .SH DESCRIPTION .SS Overview @@ -40,6 +41,9 @@ .B \-sf defines the selected foreground color (#RGB, #RRGGBB, and color names are supported). .TP +.B \-xs +starts dmenu on the given Xinerama screen (1-indexed) +.TP .B \-v prints version information to standard output, then exits. .SH USAGE diff -ur dmenu-2.8-orig/main.c dmenu-2.8/main.c --- dmenu-2.8-orig/main.c 2007-03-07 05:30:51.000000000 -0700 +++ dmenu-2.8/main.c 2007-04-10 19:56:30.000000000 -0600 @@ -11,6 +11,7 @@ #include #include #include +#include #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) @@ -406,6 +407,27 @@ " [-p ] [-sb ] [-sf ] [-v]\n"); } +static void +queryscreeninfo(Display *dpy, XRectangle *rect, int screen) { + XineramaScreenInfo *xsi = NULL; + int nscreens = 1; + + if(XineramaIsActive(dpy)) + xsi = XineramaQueryScreens(dpy, &nscreens); + + if(xsi == NULL || screen > nscreens || screen < 0) { + rect->x = 0; + rect->y = 0; + rect->width = DisplayWidth( dpy, DefaultScreen(dpy)); + rect->height = DisplayHeight(dpy, DefaultScreen(dpy)); + } else { + rect->x = xsi[screen-1].x_org; + rect->y = xsi[screen-1].y_org; + rect->width = xsi[screen-1].width; + rect->height = xsi[screen-1].height; + } +} + /* extern */ int screen; @@ -422,8 +444,10 @@ char *selbg = SELBGCOLOR; char *selfg = SELFGCOLOR; int i, j; + int xinescreen = 1; Item *itm; XEvent ev; + XRectangle screeninfo; XModifierKeymap *modmap; XSetWindowAttributes wa; @@ -450,6 +474,9 @@ else if(!strncmp(argv[i], "-sf", 4)) { if(++i < argc) selfg = argv[i]; } + else if(!strncmp(argv[i], "-xs", 4)) { + if(++i < argc) xinescreen = atoi(argv[i]); + } else if(!strncmp(argv[i], "-v", 3)) eprint("dmenu-"VERSION", (C)opyright MMVI-MMVII Anselm R. Garbe\n"); else @@ -460,6 +487,9 @@ eprint("dmenu: cannot open display\n"); screen = DefaultScreen(dpy); root = RootWindow(dpy, screen); + + queryscreeninfo(dpy, &screeninfo, xinescreen); + if(isatty(STDIN_FILENO)) { maxname = readstdin(); running = grabkeyboard(); @@ -488,10 +518,10 @@ wa.override_redirect = 1; wa.background_pixmap = ParentRelative; wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask; - mw = DisplayWidth(dpy, screen); + mw = screeninfo.width; mh = dc.font.height + 2; - win = XCreateWindow(dpy, root, 0, - bottom ? DisplayHeight(dpy, screen) - mh : 0, mw, mh, 0, + win = XCreateWindow(dpy, root, screeninfo.x, + screeninfo.y + (bottom ? screeninfo.height - mh : 0), mw, mh, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);