diff --git a/colors.h b/colors.h index 47f1555..d514a86 100644 --- a/colors.h +++ b/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 }, }; diff --git a/docs/example.Xresources b/docs/example.Xresources index 33954de..b852a2c 100644 --- a/docs/example.Xresources +++ b/docs/example.Xresources @@ -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 diff --git a/keybinds.h b/keybinds.h index 7331b72..6449a17 100644 --- a/keybinds.h +++ b/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} }, }; diff --git a/options.h b/options.h index b1802cb..6e05d4a 100644 --- a/options.h +++ b/options.h @@ -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 */ diff --git a/spmenu.c b/spmenu.c index 5def74e..747b15c 100644 --- a/spmenu.c +++ b/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); - 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(); } diff --git a/xresources.h b/xresources.h index b442ac3..8f361eb 100644 --- a/xresources.h +++ b/xresources.h @@ -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 },