summary refs log tree commit diff
path: root/grab.c
diff options
context:
space:
mode:
authorbernd <bernd>2007-04-27 18:08:14 +0000
committerbernd <bernd>2007-04-27 18:08:14 +0000
commit890a32aa33a71b66c2b976342ffad80150f05bb8 (patch)
treea0db449ee079a37eb29e483314e9785f614c7731 /grab.c
parentfa515a82d06813c0ee1a0ae049b14b79626bf664 (diff)
downloadcwm-890a32aa33a71b66c2b976342ffad80150f05bb8.tar.gz
cwm-890a32aa33a71b66c2b976342ffad80150f05bb8.tar.xz
cwm-890a32aa33a71b66c2b976342ffad80150f05bb8.zip
Apply cwm-3-exec.diff from http://aon.iki.fi/cwm/. Document the new
key binding.
Diffstat (limited to 'grab.c')
-rw-r--r--grab.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/grab.c b/grab.c
index 72b4523..3148272 100644
--- a/grab.c
+++ b/grab.c
@@ -430,6 +430,85 @@ grab_label(struct client_ctx *cc)
 	XUnmapWindow(G_dpy, sc->searchwin);
 }
 
+#define ExecMask (KeyPressMask|ExposureMask)
+
+void
+grab_exec(void)
+{
+	int x, y, dx, dy, fontheight, focusrevert, len;
+	char cmdstr[MAXPATHLEN];
+	char dispstr[MAXPATHLEN + sizeof("exec>") - 1];
+	char chr, str[2];
+	enum ctltype ctl;
+	struct fontdesc *font = DefaultFont;
+	struct screen_ctx *sc = screen_current();
+	XEvent e;
+	Window focuswin;
+
+	cmdstr[0] = '\0';
+
+	xu_ptr_getpos(sc->rootwin, &x, &y);
+
+	dy = fontheight = font_ascent(font) + font_descent(font) + 1;
+	dx = font_width(font, "exec>", 5);
+
+	XMoveResizeWindow(G_dpy, sc->searchwin, x, y, dx, dy);
+	XSelectInput(G_dpy, sc->searchwin, ExecMask);
+	XMapRaised(G_dpy, sc->searchwin);
+
+	XGetInputFocus(G_dpy, &focuswin, &focusrevert);
+	XSetInputFocus(G_dpy, sc->searchwin,
+	    RevertToPointerRoot, CurrentTime);
+
+	for (;;) {
+		XMaskEvent(G_dpy, ExecMask, &e);
+
+		switch (e.type) {
+		case KeyPress:
+			if (input_keycodetrans(e.xkey.keycode, e.xkey.state,
+				&ctl, &chr, 0) < 0)
+				continue;
+
+			switch (ctl) {
+			case CTL_ERASEONE:
+				if ((len = strlen(cmdstr)) > 0)
+					cmdstr[len - 1] = '\0';
+				break;
+			case CTL_RETURN:
+				if (strlen(cmdstr) > 0)
+					u_spawn(cmdstr);
+				goto out;
+				break;
+			case CTL_ABORT:
+				goto out;
+			default:
+				break;
+			}
+
+			if (chr != '\0') {
+				str[0] = chr;
+				str[1] = '\0';
+				strlcat(cmdstr, str, sizeof(cmdstr));
+			}
+		case Expose:
+			snprintf(dispstr, sizeof(dispstr), "exec>%s", cmdstr);
+
+			dx = font_width(font, dispstr, strlen(dispstr));
+			dy = fontheight;
+
+			XClearWindow(G_dpy, sc->searchwin);
+			XResizeWindow(G_dpy, sc->searchwin, dx, dy);
+
+			font_draw(font, dispstr, strlen(dispstr),
+			    sc->searchwin, 0, font_ascent(font) + 1);
+			break;
+		}
+	}
+ out:
+	XSetInputFocus(G_dpy, focuswin, focusrevert, CurrentTime);
+	XUnmapWindow(G_dpy, sc->searchwin);
+}
+
 int
 _sweepcalc(struct client_ctx *cc, int x0, int y0, int motionx, int motiony)
 {