Apply cwm-3-exec.diff from http://aon.iki.fi/cwm/. Document the new

key binding.
This commit is contained in:
bernd 2007-04-27 18:08:14 +00:00
parent fa515a82d0
commit 890a32aa33
5 changed files with 90 additions and 0 deletions

View File

@ -378,6 +378,7 @@ int grab_drag(struct client_ctx *);
void grab_menuinit(struct screen_ctx *);
void *grab_menu(XButtonEvent *, struct menu_q *);
void grab_label(struct client_ctx *);
void grab_exec(void);
void xfree(void *);
void *xmalloc(size_t);
@ -425,6 +426,7 @@ void kbfunc_client_nogroup(struct client_ctx *, void *);
void kbfunc_client_maximize(struct client_ctx *, void *);
void kbfunc_client_vmaximize(struct client_ctx *, void *);
void kbfunc_menu_search(struct client_ctx *, void *);
void kbfunc_exec(struct client_ctx *, void *);
void kbfunc_term(struct client_ctx *cc, void *arg);
void kbfunc_lock(struct client_ctx *cc, void *arg);

1
conf.c
View File

@ -185,6 +185,7 @@ conf_setup(struct conf *c)
XK_Return, ControlMask|Mod1Mask, 0, NULL);
conf_bindkey(c, kbfunc_lock,
XK_Delete, ControlMask|Mod1Mask, 0, NULL);
conf_bindkey(c, kbfunc_exec, XK_question, Mod1Mask, 0, NULL);
conf_bindkey(c, kbfunc_client_hide,
XK_Return, Mod1Mask, KBFLAG_NEEDCLIENT, 0);
conf_bindkey(c, kbfunc_client_lower,

2
cwm.1
View File

@ -81,6 +81,8 @@ Switch to next group.
Switch to previous group.
.It Fa C-M-=
Toggle vertical maximization of window.
.It Fa M-?
Spawn \&"Exec program\&" dialog.
.El
The mouse bindings are also important, they are:

79
grab.c
View File

@ -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)
{

View File

@ -122,6 +122,12 @@ kbfunc_lock(struct client_ctx *cc, void *arg)
u_spawn(G_conf.lockpath);
}
void
kbfunc_exec(struct client_ctx *scratch, void *arg)
{
grab_exec();
}
void
kbfunc_client_label(struct client_ctx *cc, void *arg)
{