add vim like modes
This commit is contained in:
parent
9657db6891
commit
e88b499d7c
2
colors.h
2
colors.h
|
@ -12,6 +12,7 @@ static const unsigned int alphas[][3] = {
|
|||
[SchemePrompt] = { fgalpha, bgalpha, borderalpha },
|
||||
[SchemeNormHighlight] = { fgalpha, bgalpha, borderalpha },
|
||||
[SchemeSelHighlight] = { fgalpha, bgalpha, borderalpha },
|
||||
[SchemeMode] = { fgalpha, bgalpha, borderalpha },
|
||||
[SchemeCaret] = { fgalpha, bgalpha, borderalpha },
|
||||
[SchemeNumber] = { fgalpha, bgalpha, borderalpha },
|
||||
[SchemeBorder] = { fgalpha, bgalpha, borderalpha },
|
||||
|
@ -30,6 +31,7 @@ static const char *colors[SchemeLast][2] = {
|
|||
[SchemeNormHighlight] = { col_normhlfgcolor, col_normhlbgcolor },
|
||||
[SchemeSelHighlight] = { col_selhlfgcolor, col_selhlbgcolor },
|
||||
[SchemeCaret] = { col_caretfgcolor, NULL },
|
||||
[SchemeMode] = { col_modefgcolor, col_modebgcolor },
|
||||
[SchemeNumber] = { col_numfgcolor, col_numbgcolor },
|
||||
[SchemeBorder] = { NULL, col_bordercolor },
|
||||
};
|
||||
|
|
|
@ -20,6 +20,8 @@ spmenu.col_selhlfgcolor: #ffffff
|
|||
spmenu.col_selhlbgcolor: #000000
|
||||
spmenu.col_caretfgcolor: #ffffff
|
||||
spmenu.col_bordercolor: #35638A
|
||||
spmenu.col_modefgcolor: #ffffff
|
||||
spmenu.col_modebgcolor: #35638A
|
||||
spmenu.col_sgrcolor0: #000000
|
||||
spmenu.col_sgrcolor1: #7f0000
|
||||
spmenu.col_sgrcolor2: #007f00
|
||||
|
|
18
keybinds.h
18
keybinds.h
|
@ -28,12 +28,26 @@
|
|||
|
||||
static Key keys[] = {
|
||||
/* modifier key function argument */
|
||||
{ 0, XK_Escape, switchmode, {0} },
|
||||
|
||||
{ 0, XK_Up, move, {.i = 1 } },
|
||||
{ 0, XK_Down, move, {.i = 2 } },
|
||||
{ 0, XK_Left, move, {.i = 3 } },
|
||||
{ 0, XK_Right, move, {.i = 4 } },
|
||||
{ CONTROL, XK_v, paste, {.i = 1 } }, /* primary buffer */
|
||||
{ CONTROL|SHIFT, XK_v, paste, {.i = 2 } },
|
||||
{ 0, XK_BackSpace, backspace, {0} },
|
||||
{ 0, XK_Return, selectitem, {.i = +1 } },
|
||||
};
|
||||
|
||||
static Key cmdkeys[] = {
|
||||
/* modifier key function argument */
|
||||
{ 0, XK_k, move, {.i = 1 } },
|
||||
{ 0, XK_j, move, {.i = 2 } },
|
||||
{ 0, XK_h, move, {.i = 3 } },
|
||||
{ 0, XK_l, move, {.i = 4 } },
|
||||
{ CONTROL, XK_v, paste, {.i = 1 } }, /* primary buffer */
|
||||
{ CONTROL|SHIFT, XK_v, paste, {.i = 2 } },
|
||||
{ CONTROL, XK_k, restoresel, {0} },
|
||||
{ CONTROL, XK_r, viewhist, {0} },
|
||||
{ CONTROL, XK_u, clear, {0} },
|
||||
|
@ -41,6 +55,8 @@ static Key keys[] = {
|
|||
{ 0, XK_BackSpace, backspace, {0} },
|
||||
{ 0, XK_Home, movestart, {0} },
|
||||
{ 0, XK_End, moveend, {0} },
|
||||
{ 0, XK_g, movestart, {0} },
|
||||
{ SHIFT, XK_g, moveend, {0} },
|
||||
{ 0, XK_Next, movenext, {0} },
|
||||
{ 0, XK_Prior, moveprev, {0} },
|
||||
{ 0, XK_Return, selectitem, {.i = +1 } },
|
||||
|
@ -49,4 +65,6 @@ static Key keys[] = {
|
|||
{ MODIFIER1, XK_f, moveword, {.i = +1 } },
|
||||
{ MODIFIER1, XK_p, navhistory, {.i = -1 } },
|
||||
{ MODIFIER1, XK_n, navhistory, {.i = +1 } },
|
||||
|
||||
{ 0, XK_i, switchmode, {0} },
|
||||
};
|
||||
|
|
|
@ -102,6 +102,10 @@ static char col_bordercolor[] = "#35638A"; /* Border color */
|
|||
/* Caret colors */
|
||||
static char col_caretfgcolor[] = "#ffffff"; /* Caret color */
|
||||
|
||||
/* Mode colors */
|
||||
static char col_modefgcolor[] = "#ffffff"; /* Mode text color */
|
||||
static char col_modebgcolor[] = "#35638A"; /* Mode background color */
|
||||
|
||||
/* SGR colors */
|
||||
static char col_sgrcolor0[] = "#000000"; /* SGR color #0 */
|
||||
static char col_sgrcolor1[] = "#7f0000"; /* SGR color #1 */
|
||||
|
|
60
spmenu.c
60
spmenu.c
|
@ -79,9 +79,14 @@ enum { SchemeLArrow,
|
|||
SchemeSelHighlight,
|
||||
SchemeCaret,
|
||||
SchemeNumber,
|
||||
SchemeMode,
|
||||
SchemeBorder,
|
||||
SchemeLast }; /* color schemes */
|
||||
|
||||
enum {
|
||||
ModeCommand,
|
||||
ModeInsert };
|
||||
|
||||
static char text[BUFSIZ] = "";
|
||||
|
||||
struct item {
|
||||
|
@ -112,6 +117,7 @@ static Imlib_Image image = NULL;
|
|||
#endif
|
||||
|
||||
static char numbers[NUMBERSBUFSIZE] = "";
|
||||
static char modetext[16] = "Insert";
|
||||
static char *embed;
|
||||
static int numlockmask = 0;
|
||||
static int bh, mw, mh;
|
||||
|
@ -131,6 +137,8 @@ static struct item *matches, *matchend;
|
|||
static struct item *prev, *curr, *next, *sel;
|
||||
static int mon = -1, screen;
|
||||
static int managed = 0;
|
||||
static int selkeys = 1; /* 0 is command mode */
|
||||
static int allowkeys = 1;
|
||||
|
||||
static Atom clip, utf8, types, dock;
|
||||
static Display *dpy;
|
||||
|
@ -183,6 +191,9 @@ static void selectitem(const Arg *arg);
|
|||
static void quit(const Arg *arg);
|
||||
static void complete(const Arg *arg);
|
||||
|
||||
static void switchmode(const Arg *arg);
|
||||
static void drawmenu(void);
|
||||
|
||||
#if USERTL
|
||||
static void apply_fribidi(char *str);
|
||||
#endif
|
||||
|
@ -361,6 +372,21 @@ loadimagecache(const char *file, int *width, int *height)
|
|||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
switchmode(const Arg *arg)
|
||||
{
|
||||
selkeys = !selkeys;
|
||||
allowkeys = !selkeys;
|
||||
|
||||
if (!selkeys) {
|
||||
strcpy(modetext, "Normal");
|
||||
} else {
|
||||
strcpy(modetext, "Insert");
|
||||
}
|
||||
|
||||
drawmenu();
|
||||
}
|
||||
|
||||
void
|
||||
appenditem(struct item *item, struct item **list, struct item **last)
|
||||
{
|
||||
|
@ -399,9 +425,9 @@ calcoffsets(void)
|
|||
else
|
||||
/* hide match count */
|
||||
if (hidematchcount) {
|
||||
n = mw - (promptw + inputw + TEXTW(leftarrow) + TEXTW(rightarrow));
|
||||
n = mw - (promptw + inputw + TEXTW(leftarrow) + TEXTW(rightarrow) + TEXTW(modetext));
|
||||
} else {
|
||||
n = mw - (promptw + inputw + TEXTW(leftarrow) + TEXTW(rightarrow) + TEXTW(numbers));
|
||||
n = mw - (promptw + inputw + TEXTW(leftarrow) + TEXTW(rightarrow) + TEXTW(numbers) + TEXTW(modetext));
|
||||
}
|
||||
/* calculate which items will begin the next page and previous page */
|
||||
for (i = 0, next = curr; next; next = next->right)
|
||||
|
@ -668,26 +694,30 @@ drawmenu(void)
|
|||
x += w;
|
||||
for (item = curr; item != next; item = item->right)
|
||||
if (hidematchcount) {
|
||||
x = drawitem(item, x, 0, MIN(TEXTWM(item->text), mw - x - TEXTW(rightarrow)));
|
||||
x = drawitem(item, x, 0, MIN(TEXTWM(item->text), mw - x - TEXTW(rightarrow) - TEXTW(modetext)));
|
||||
} else {
|
||||
x = drawitem(item, x, 0, MIN(TEXTWM(item->text), mw - x - TEXTW(rightarrow) - TEXTW(numbers)));
|
||||
x = drawitem(item, x, 0, MIN(TEXTWM(item->text), mw - x - TEXTW(rightarrow) - TEXTW(numbers) - TEXTW(modetext)));
|
||||
}
|
||||
if (next) {
|
||||
w = TEXTW(rightarrow);
|
||||
drw_setscheme(drw, scheme[SchemeRArrow]);
|
||||
|
||||
if (hidematchcount) {
|
||||
drw_text(drw, mw - w, 0, w, bh, lrpad / 2, rightarrow, 0, True);
|
||||
drw_text(drw, mw - w - TEXTW(modetext), 0, w, bh, lrpad / 2, rightarrow, 0, True);
|
||||
} else {
|
||||
drw_text(drw, mw - w - TEXTW(numbers), 0, w, bh, lrpad / 2, rightarrow, 0, True);
|
||||
drw_text(drw, mw - w - TEXTW(numbers) - TEXTW(modetext), 0, w, bh, lrpad / 2, rightarrow, 0, True);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!hidematchcount) {
|
||||
drw_setscheme(drw, scheme[SchemeNumber]);
|
||||
drw_text(drw, mw - TEXTW(numbers), 0, TEXTW(numbers), bh, lrpad / 2, numbers, 0, False);
|
||||
drw_text(drw, mw - TEXTW(numbers) - TEXTW(modetext), 0, TEXTW(numbers), bh, lrpad / 2, numbers, 0, False);
|
||||
}
|
||||
|
||||
drw_setscheme(drw, scheme[SchemeMode]);
|
||||
drw_text(drw, mw - TEXTW(modetext), 0, TEXTW(modetext), bh, lrpad / 2, modetext, 0, False);
|
||||
|
||||
drw_map(drw, win, 0, 0, mw, mh);
|
||||
}
|
||||
|
||||
|
@ -1298,6 +1328,7 @@ keypress(XEvent *e)
|
|||
KeySym keysym;
|
||||
XKeyEvent *ev;
|
||||
char buf[64];
|
||||
char keyArray;
|
||||
KeySym ksym = NoSymbol;
|
||||
Status status;
|
||||
|
||||
|
@ -1305,16 +1336,27 @@ keypress(XEvent *e)
|
|||
ev = &e->xkey;
|
||||
len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status);
|
||||
|
||||
//keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
|
||||
keysym = XkbKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0, 0);
|
||||
|
||||
if (selkeys) {
|
||||
for (i = 0; i < LENGTH(keys); i++) {
|
||||
if (keysym == keys[i].keysym && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) && keys[i].func)
|
||||
keys[i].func(&(keys[i].arg));
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < LENGTH(cmdkeys); i++) {
|
||||
if (keysym == cmdkeys[i].keysym && CLEANMASK(cmdkeys[i].mod) == CLEANMASK(ev->state) && cmdkeys[i].func)
|
||||
cmdkeys[i].func(&(cmdkeys[i].arg));
|
||||
}
|
||||
}
|
||||
|
||||
if (!iscntrl(*buf) && type) {
|
||||
if (!iscntrl(*buf) && type && selkeys ) {
|
||||
|
||||
if (allowkeys) {
|
||||
insert(buf, len);
|
||||
} else {
|
||||
allowkeys = !allowkeys;
|
||||
}
|
||||
|
||||
drawmenu();
|
||||
}
|
||||
|
|
|
@ -18,6 +18,8 @@ ResourcePref resources[] = {
|
|||
{ "col_menubgcolor", STRING, &col_menubgcolor },
|
||||
{ "col_numfgcolor", STRING, &col_numfgcolor },
|
||||
{ "col_numbgcolor", STRING, &col_numbgcolor },
|
||||
{ "col_modefgcolor", STRING, &col_modefgcolor },
|
||||
{ "col_modebgcolor", STRING, &col_modebgcolor },
|
||||
{ "col_normhlfgcolor", STRING, &col_normhlfgcolor },
|
||||
{ "col_normhlbgcolor", STRING, &col_normhlbgcolor },
|
||||
{ "col_selhlfgcolor", STRING, &col_selhlfgcolor },
|
||||
|
@ -44,6 +46,8 @@ ResourcePref resources[] = {
|
|||
{ "color6", STRING, &col_bordercolor },
|
||||
{ "color0", STRING, &col_numfgcolor },
|
||||
{ "color5", STRING, &col_numbgcolor },
|
||||
{ "color0", STRING, &col_modefgcolor },
|
||||
{ "color7", STRING, &col_modebgcolor },
|
||||
{ "color2", STRING, &col_normhlbgcolor },
|
||||
{ "color3", STRING, &col_selhlbgcolor },
|
||||
{ "color0", STRING, &col_normhlfgcolor },
|
||||
|
|
Loading…
Reference in a new issue