diff options
| -rw-r--r-- | dwm.c | 132 |
1 files changed, 126 insertions, 6 deletions
| @@ -176,6 +176,7 @@ static void detachstack(Client *c); | |||
| 176 | static Monitor *dirtomon(int dir); | 176 | static Monitor *dirtomon(int dir); |
| 177 | static void drawbar(Monitor *m); | 177 | static void drawbar(Monitor *m); |
| 178 | static void drawbars(void); | 178 | static void drawbars(void); |
| 179 | static int drawstatusbar(Monitor *m, int bh, char* text); | ||
| 179 | static void enternotify(XEvent *e); | 180 | static void enternotify(XEvent *e); |
| 180 | static void expose(XEvent *e); | 181 | static void expose(XEvent *e); |
| 181 | static void focus(Client *c); | 182 | static void focus(Client *c); |
| @@ -258,10 +259,10 @@ static pid_t winpid(Window w); | |||
| 258 | 259 | ||
| 259 | /* variables */ | 260 | /* variables */ |
| 260 | static const char broken[] = "broken"; | 261 | static const char broken[] = "broken"; |
| 261 | static char stext[256]; | ||
| 262 | static int statusw; | 262 | static int statusw; |
| 263 | static int statussig; | 263 | static int statussig; |
| 264 | static pid_t statuspid = -1; | 264 | static pid_t statuspid = -1; |
| 265 | static char stext[1024]; | ||
| 265 | static int screen; | 266 | static int screen; |
| 266 | static int sw, sh; /* X display screen geometry width, height */ | 267 | static int sw, sh; /* X display screen geometry width, height */ |
| 267 | static int bh, blw = 0; /* bar geometry */ | 268 | static int bh, blw = 0; /* bar geometry */ |
| @@ -590,7 +591,7 @@ cleanup(void) | |||
| 590 | cleanupmon(mons); | 591 | cleanupmon(mons); |
| 591 | for (i = 0; i < CurLast; i++) | 592 | for (i = 0; i < CurLast; i++) |
| 592 | drw_cur_free(drw, cursor[i]); | 593 | drw_cur_free(drw, cursor[i]); |
| 593 | for (i = 0; i < LENGTH(colors); i++) | 594 | for (i = 0; i < LENGTH(colors) + 1; i++) |
| 594 | free(scheme[i]); | 595 | free(scheme[i]); |
| 595 | XDestroyWindow(dpy, wmcheckwin); | 596 | XDestroyWindow(dpy, wmcheckwin); |
| 596 | drw_free(drw); | 597 | drw_free(drw); |
| @@ -807,6 +808,126 @@ dirtomon(int dir) | |||
| 807 | return m; | 808 | return m; |
| 808 | } | 809 | } |
| 809 | 810 | ||
| 811 | int | ||
| 812 | drawstatusbar(Monitor *m, int bh, char* stext) { | ||
| 813 | int ret, i, w, x, len; | ||
| 814 | short isCode = 0; | ||
| 815 | char *text; | ||
| 816 | char *p; | ||
| 817 | Clr oldbg, oldfg; | ||
| 818 | |||
| 819 | len = strlen(stext) + 1 ; | ||
| 820 | if (!(text = (char*) malloc(sizeof(char)*len))) | ||
| 821 | die("malloc"); | ||
| 822 | p = text; | ||
| 823 | memcpy(text, stext, len); | ||
| 824 | |||
| 825 | /* compute width of the status text */ | ||
| 826 | w = 0; | ||
| 827 | i = -1; | ||
| 828 | while (text[++i]) { | ||
| 829 | if (text[i] == '^') { | ||
| 830 | if (!isCode) { | ||
| 831 | isCode = 1; | ||
| 832 | text[i] = '\0'; | ||
| 833 | w += TEXTW(text) - lrpad; | ||
| 834 | text[i] = '^'; | ||
| 835 | if (text[++i] == 'f') | ||
| 836 | w += atoi(text + ++i); | ||
| 837 | } else { | ||
| 838 | isCode = 0; | ||
| 839 | text = text + i + 1; | ||
| 840 | i = -1; | ||
| 841 | } | ||
| 842 | } | ||
| 843 | } | ||
| 844 | if (!isCode) | ||
| 845 | w += TEXTW(text) - lrpad; | ||
| 846 | else | ||
| 847 | isCode = 0; | ||
| 848 | text = p; | ||
| 849 | |||
| 850 | w += 2; /* 1px padding on both sides */ | ||
| 851 | ret = x = m->ww - w; | ||
| 852 | |||
| 853 | drw_setscheme(drw, scheme[LENGTH(colors)]); | ||
| 854 | drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; | ||
| 855 | drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; | ||
| 856 | drw_rect(drw, x, 0, w, bh, 1, 1); | ||
| 857 | x++; | ||
| 858 | |||
| 859 | /* process status text */ | ||
| 860 | i = -1; | ||
| 861 | while (text[++i]) { | ||
| 862 | if (text[i] == '^' && !isCode) { | ||
| 863 | isCode = 1; | ||
| 864 | |||
| 865 | text[i] = '\0'; | ||
| 866 | w = TEXTW(text) - lrpad; | ||
| 867 | drw_text(drw, x, 0, w, bh, 0, text, 0); | ||
| 868 | |||
| 869 | x += w; | ||
| 870 | |||
| 871 | /* process code */ | ||
| 872 | while (text[++i] != '^') { | ||
| 873 | if (text[i] == 'c') { | ||
| 874 | char buf[8]; | ||
| 875 | memcpy(buf, (char*)text+i+1, 7); | ||
| 876 | buf[7] = '\0'; | ||
| 877 | drw_clr_create(drw, &drw->scheme[ColFg], buf, alphas[i]); | ||
| 878 | i += 7; | ||
| 879 | } else if (text[i] == 'b') { | ||
| 880 | char buf[8]; | ||
| 881 | memcpy(buf, (char*)text+i+1, 7); | ||
| 882 | buf[7] = '\0'; | ||
| 883 | drw_clr_create(drw, &drw->scheme[ColBg], buf, alphas[i]); | ||
| 884 | i += 7; | ||
| 885 | } else if (text[i] == 'd') { | ||
| 886 | drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; | ||
| 887 | drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; | ||
| 888 | } else if (text[i] == 'w') { | ||
| 889 | Clr swp; | ||
| 890 | swp = drw->scheme[ColFg]; | ||
| 891 | drw->scheme[ColFg] = drw->scheme[ColBg]; | ||
| 892 | drw->scheme[ColBg] = swp; | ||
| 893 | } else if (text[i] == 'v') { | ||
| 894 | oldfg = drw->scheme[ColFg]; | ||
| 895 | oldbg = drw->scheme[ColBg]; | ||
| 896 | } else if (text[i] == 't') { | ||
| 897 | drw->scheme[ColFg] = oldfg; | ||
| 898 | drw->scheme[ColBg] = oldbg; | ||
| 899 | } else if (text[i] == 'r') { | ||
| 900 | int rx = atoi(text + ++i); | ||
| 901 | while (text[++i] != ','); | ||
| 902 | int ry = atoi(text + ++i); | ||
| 903 | while (text[++i] != ','); | ||
| 904 | int rw = atoi(text + ++i); | ||
| 905 | while (text[++i] != ','); | ||
| 906 | int rh = atoi(text + ++i); | ||
| 907 | |||
| 908 | drw_rect(drw, rx + x, ry, rw, rh, 1, 0); | ||
| 909 | } else if (text[i] == 'f') { | ||
| 910 | x += atoi(text + ++i); | ||
| 911 | } | ||
| 912 | } | ||
| 913 | |||
| 914 | text = text + i + 1; | ||
| 915 | i=-1; | ||
| 916 | isCode = 0; | ||
| 917 | } | ||
| 918 | } | ||
| 919 | |||
| 920 | if (!isCode) { | ||
| 921 | w = TEXTW(text) - lrpad; | ||
| 922 | drw_text(drw, x, 0, w, bh, 0, text, 0); | ||
| 923 | } | ||
| 924 | |||
| 925 | drw_setscheme(drw, scheme[SchemeNorm]); | ||
| 926 | free(p); | ||
| 927 | |||
| 928 | return ret; | ||
| 929 | } | ||
| 930 | |||
| 810 | void | 931 | void |
| 811 | drawbar(Monitor *m) | 932 | drawbar(Monitor *m) |
| 812 | { | 933 | { |
| @@ -837,9 +958,7 @@ drawbar(Monitor *m) | |||
| 837 | sw = statusw; | 958 | sw = statusw; |
| 838 | } | 959 | } |
| 839 | if (m == selmon) { /* status is only drawn on selected monitor */ | 960 | if (m == selmon) { /* status is only drawn on selected monitor */ |
| 840 | drw_setscheme(drw, scheme[SchemeNorm]); | 961 | tw = m->ww - drawstatusbar(m, bh, stext); |
| 841 | tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ | ||
| 842 | drw_text(drw, m->ww - tw - 2 * sp, 0, tw, bh, 0, stext, 0); | ||
| 843 | } | 962 | } |
| 844 | 963 | ||
| 845 | for (c = m->clients; c; c = c->next) { | 964 | for (c = m->clients; c; c = c->next) { |
| @@ -1750,7 +1869,8 @@ setup(void) | |||
| 1750 | cursor[CurResize] = drw_cur_create(drw, XC_sizing); | 1869 | cursor[CurResize] = drw_cur_create(drw, XC_sizing); |
| 1751 | cursor[CurMove] = drw_cur_create(drw, XC_fleur); | 1870 | cursor[CurMove] = drw_cur_create(drw, XC_fleur); |
| 1752 | /* init appearance */ | 1871 | /* init appearance */ |
| 1753 | scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); | 1872 | scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *)); |
| 1873 | scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], alphas[i], 3); | ||
| 1754 | for (i = 0; i < LENGTH(colors); i++) | 1874 | for (i = 0; i < LENGTH(colors); i++) |
| 1755 | scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3); | 1875 | scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3); |
| 1756 | /* init bars */ | 1876 | /* init bars */ |
