diff --git a/config.def.h b/config.def.h index b528ca3..c41a1e6 100644 --- a/config.def.h +++ b/config.def.h @@ -22,7 +22,11 @@ static uint32_t colors[][3] = { [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x444444ff }, [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x005577ff }, [SchemeUrg] = { 0, 0, 0x770000ff }, + [SchemeOcc] = { 0xbbbbbbff, 0x222222ff, 0x444444ff }, + [SchemeEmpty] = { 0x555555ff, 0x222222ff, 0x444444ff }, + [SchemeKb] = { 0x88aaaaff, 0x222222ff, 0x444444ff }, }; +static const char *kblayouts[] = { "en", "th" }; /* tagging */ static char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; diff --git a/dwl.c b/dwl.c index a348dec..474da92 100644 --- a/dwl.c +++ b/dwl.c @@ -91,7 +91,7 @@ #define TEXTW(mon, text) (drwl_font_getwidth(mon->drw, text) + mon->lrpad) /* enums */ -enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ +enum { SchemeNorm, SchemeSel, SchemeUrg, SchemeOcc, SchemeEmpty, SchemeKb }; /* color schemes */ enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ enum { XDGShell, LayerShell, X11 }; /* client types */ enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrUnmanaged, LyrOverlay, @@ -459,6 +459,7 @@ static struct wlr_session_lock_v1 *cur_lock; static struct wlr_seat *seat; static KeyboardGroup *kb_group; +static xkb_layout_index_t kblayout; static unsigned int cursor_mode; static Client *grabc; static int grabcx, grabcy; /* client-relative */ @@ -1682,7 +1683,8 @@ drawbar(Monitor *m) int x, w, tw = 0; int boxs = m->drw->font->height / 9; int boxw = m->drw->font->height / 6 + 2; - uint32_t i, occ = 0, urg = 0; + uint32_t i, occ = 0, urg = 0, sel; + const char *kb = kblayout < LENGTH(kblayouts) ? kblayouts[kblayout] : "??"; Client *c; Buffer *buf; @@ -1696,6 +1698,10 @@ drawbar(Monitor *m) drwl_setscheme(m->drw, colors[SchemeNorm]); tw = TEXTW(m, stext) - m->lrpad + 2; /* 2px right padding */ drwl_text(m->drw, m->b.width - tw, 0, tw, m->b.height, 0, stext, 0); + w = TEXTW(m, kb) + m->lrpad; + drwl_setscheme(m->drw, colors[SchemeKb]); + drwl_text(m->drw, m->b.width - tw - w, 0, w, m->b.height, m->lrpad / 2, kb, 0); + tw += w; } wl_list_for_each(c, &clients, link) { @@ -1709,12 +1715,11 @@ drawbar(Monitor *m) c = focustop(m); for (i = 0; i < LENGTH(tags); i++) { w = TEXTW(m, tags[i]); - drwl_setscheme(m->drw, colors[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); + sel = m->tagset[m->seltags] & 1 << i; + drwl_setscheme(m->drw, colors[sel ? SchemeSel : occ & 1 << i ? SchemeOcc : SchemeEmpty]); drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, - m == selmon && c && c->tags & 1 << i, - urg & 1 << i); + if (sel) + drwl_rect(m->drw, x + m->lrpad / 2, m->b.height - 2, w - m->lrpad, 1, 1, 0); x += w; } w = TEXTW(m, m->ltsymbol); @@ -1723,7 +1728,7 @@ drawbar(Monitor *m) if ((w = m->b.width - tw - x) > m->b.height) { if (c) { - drwl_setscheme(m->drw, colors[m == selmon ? SchemeSel : SchemeNorm]); + drwl_setscheme(m->drw, colors[SchemeNorm]); drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, client_get_title(c), 0); if (c && c->isfloating) drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0); @@ -2047,6 +2052,10 @@ keypressmod(struct wl_listener *listener, void *data) return; wlr_seat_set_keyboard(seat, &group->wlr_group->keyboard); + if (group->wlr_group->keyboard.modifiers.group != kblayout) { + kblayout = group->wlr_group->keyboard.modifiers.group; + drawbars(); + } /* Send modifiers to the client. */ wlr_seat_keyboard_notify_modifiers(seat, &group->wlr_group->keyboard.modifiers);