add vim like modes

This commit is contained in:
speedie 2023-02-25 17:44:52 +01:00
parent 9657db6891
commit e88b499d7c
6 changed files with 85 additions and 13 deletions

View file

@ -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 },
};

View file

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

View file

@ -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} },
};

View file

@ -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 */

View file

@ -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);
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));
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) {
insert(buf, len);
if (!iscntrl(*buf) && type && selkeys ) {
if (allowkeys) {
insert(buf, len);
} else {
allowkeys = !allowkeys;
}
drawmenu();
}

View file

@ -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 },