mirror of
https://github.com/leahneukirchen/cwm.git
synced 2023-08-10 21:13:12 +03:00
Apply cwm-3-exec.diff from http://aon.iki.fi/cwm/. Document the new
key binding.
This commit is contained in:
parent
fa515a82d0
commit
890a32aa33
2
calmwm.h
2
calmwm.h
|
@ -378,6 +378,7 @@ int grab_drag(struct client_ctx *);
|
||||||
void grab_menuinit(struct screen_ctx *);
|
void grab_menuinit(struct screen_ctx *);
|
||||||
void *grab_menu(XButtonEvent *, struct menu_q *);
|
void *grab_menu(XButtonEvent *, struct menu_q *);
|
||||||
void grab_label(struct client_ctx *);
|
void grab_label(struct client_ctx *);
|
||||||
|
void grab_exec(void);
|
||||||
|
|
||||||
void xfree(void *);
|
void xfree(void *);
|
||||||
void *xmalloc(size_t);
|
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_maximize(struct client_ctx *, void *);
|
||||||
void kbfunc_client_vmaximize(struct client_ctx *, void *);
|
void kbfunc_client_vmaximize(struct client_ctx *, void *);
|
||||||
void kbfunc_menu_search(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_term(struct client_ctx *cc, void *arg);
|
||||||
void kbfunc_lock(struct client_ctx *cc, void *arg);
|
void kbfunc_lock(struct client_ctx *cc, void *arg);
|
||||||
|
|
||||||
|
|
1
conf.c
1
conf.c
|
@ -185,6 +185,7 @@ conf_setup(struct conf *c)
|
||||||
XK_Return, ControlMask|Mod1Mask, 0, NULL);
|
XK_Return, ControlMask|Mod1Mask, 0, NULL);
|
||||||
conf_bindkey(c, kbfunc_lock,
|
conf_bindkey(c, kbfunc_lock,
|
||||||
XK_Delete, ControlMask|Mod1Mask, 0, NULL);
|
XK_Delete, ControlMask|Mod1Mask, 0, NULL);
|
||||||
|
conf_bindkey(c, kbfunc_exec, XK_question, Mod1Mask, 0, NULL);
|
||||||
conf_bindkey(c, kbfunc_client_hide,
|
conf_bindkey(c, kbfunc_client_hide,
|
||||||
XK_Return, Mod1Mask, KBFLAG_NEEDCLIENT, 0);
|
XK_Return, Mod1Mask, KBFLAG_NEEDCLIENT, 0);
|
||||||
conf_bindkey(c, kbfunc_client_lower,
|
conf_bindkey(c, kbfunc_client_lower,
|
||||||
|
|
2
cwm.1
2
cwm.1
|
@ -81,6 +81,8 @@ Switch to next group.
|
||||||
Switch to previous group.
|
Switch to previous group.
|
||||||
.It Fa C-M-=
|
.It Fa C-M-=
|
||||||
Toggle vertical maximization of window.
|
Toggle vertical maximization of window.
|
||||||
|
.It Fa M-?
|
||||||
|
Spawn \&"Exec program\&" dialog.
|
||||||
.El
|
.El
|
||||||
|
|
||||||
The mouse bindings are also important, they are:
|
The mouse bindings are also important, they are:
|
||||||
|
|
79
grab.c
79
grab.c
|
@ -430,6 +430,85 @@ grab_label(struct client_ctx *cc)
|
||||||
XUnmapWindow(G_dpy, sc->searchwin);
|
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
|
int
|
||||||
_sweepcalc(struct client_ctx *cc, int x0, int y0, int motionx, int motiony)
|
_sweepcalc(struct client_ctx *cc, int x0, int y0, int motionx, int motiony)
|
||||||
{
|
{
|
||||||
|
|
6
kbfunc.c
6
kbfunc.c
|
@ -122,6 +122,12 @@ kbfunc_lock(struct client_ctx *cc, void *arg)
|
||||||
u_spawn(G_conf.lockpath);
|
u_spawn(G_conf.lockpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
kbfunc_exec(struct client_ctx *scratch, void *arg)
|
||||||
|
{
|
||||||
|
grab_exec();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
kbfunc_client_label(struct client_ctx *cc, void *arg)
|
kbfunc_client_label(struct client_ctx *cc, void *arg)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user