This commit is contained in:
mikeyjk 2014-02-08 17:34:58 +08:00
commit f3fbfd555a
2 changed files with 28 additions and 27 deletions

View File

@ -1,6 +1,6 @@
CC ?= gcc
STRIP ?= strip
CFLAGS = -std=c99 -fshort-wchar -Os
CFLAGS = -std=c99 -O2
LDFLAGS = -lxcb
XINERAMA ?= 0
ifneq "$(XINERAMA)" "0"

51
bar.c
View File

@ -128,7 +128,7 @@ xcb_set_fontset (int i)
}
int
draw_char (screen_t *screen, int x, int align, wchar_t ch)
draw_char (screen_t *screen, int x, int align, uint16_t ch)
{
int ch_width;
@ -182,41 +182,39 @@ parse (char *text)
xcb_fill_rect (clear_gc, 0, 0, bar_width, bar_height);
for (;;) {
if (*p == '\0')
return;
if (*p == '\n')
if (*p == '\0' || *p == '\n')
return;
if (*p == '\\' && p++ && *p != '\\' && strchr (control_characters, *p)) {
switch (*p++) {
case 'f':
xcb_set_fg (isdigit(*p) ? (*p)-'0' : 11);
xcb_set_fg (isdigit(*p) ? *p-'0' : 11);
p++;
break;
case 'b':
xcb_set_bg (isdigit(*p) ? (*p)-'0' : 10);
xcb_set_bg (isdigit(*p) ? *p-'0' : 10);
p++;
break;
case 'u':
xcb_set_ud (isdigit(*p) ? (*p)-'0' : 10);
xcb_set_ud (isdigit(*p) ? *p-'0' : 10);
p++;
break;
#if XINERAMA
case 's':
if ((*p) == 'r') {
if (*p == 'r') {
screen = &screens[num_screens - 1];
} else if ((*p) == 'l') {
} else if (*p == 'l') {
screen = &screens[0];
} else if ((*p) == 'n') {
} else if (*p == 'n') {
if (screen == &screens[num_screens - 1])
break;
screen++;
} else if ((*p) == 'p') {
} else if (*p == 'p') {
if (screen == screens)
break;
screen--;
} else if (isdigit(*p)) {
int index = (*p)-'0';
int index = *p-'0';
if (index < num_screens) {
screen = &screens[index];
} else {
@ -244,32 +242,33 @@ parse (char *text)
break;
}
} else { /* utf-8 -> ucs-2 */
wchar_t t;
uint8_t *utf = (uint8_t *)p;
uint16_t ucs;
if (!(p[0] & 0x80)) {
t = p[0];
if (utf[0] < 0x80) {
ucs = utf[0];
p += 1;
}
else if ((p[0] & 0xe0) == 0xc0 && (p[1] & 0xc0) == 0x80) {
t = (p[0] & 0x1f) << 6 | (p[1] & 0x3f);
else if ((utf[0] & 0xe0) == 0xc0) {
ucs = (utf[0] & 0x1f) << 6 | (utf[1] & 0x3f);
p += 2;
}
else if ((p[0] & 0xf0) == 0xe0 && (p[1] & 0xc0) == 0x80 && (p[2] & 0xc0) == 0x80) {
t = (p[0] & 0xf) << 12 | (p[1] & 0x3f) << 6 | (p[2] & 0x3f);
else if ((utf[0] & 0xf0) == 0xe0) {
ucs = (utf[0] & 0xf) << 12 | (utf[1] & 0x3f) << 6 | (utf[2] & 0x3f);
p += 3;
}
else { /* ASCII chars > 127 go in the extended latin range */
t = 0xc200 + p[0];
else { /* Handle ascii > 0x80 */
ucs = utf[0];
p += 1;
}
/* The character is outside the main font charset, use the fallback */
if (t < fontset[FONT_MAIN].char_min || t > fontset[FONT_MAIN].char_max)
if (ucs < fontset[FONT_MAIN].char_min || ucs > fontset[FONT_MAIN].char_max)
xcb_set_fontset (FONT_FALLBACK);
else
xcb_set_fontset (FONT_MAIN);
pos_x += draw_char (screen, pos_x, align, t);
pos_x += draw_char (screen, pos_x, align, ucs);
}
}
}
@ -326,7 +325,7 @@ enum {
};
void
set_ewmh_atoms ()
set_ewmh_atoms (void)
{
const char *atom_names[] = {
"_NET_WM_WINDOW_TYPE",
@ -612,7 +611,9 @@ main (int argc, char **argv)
else break; /* ...bail out */
}
if (pollin[0].revents & POLLIN) { /* New input, process it */
fgets (input, sizeof(input), stdin);
if (fgets (input, sizeof(input), stdin) == NULL)
break; /* EOF received */
parse (input);
redraw = 1;
}