Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## 2026-01-21 - XSync vs XFlush in Drawing
**Learning:** `drw_map` currently uses `XSync(drw->dpy, False)`, which forces a round-trip to the X server. This is good for debugging but bad for performance. `XFlush` or relying on the event loop is usually sufficient for drawing operations.
**Action:** In future optimizations, consider replacing `XSync` with `XFlush` in drawing paths, but be aware of synchronization requirements. For now, optimizing memory allocation in `drawstatusbar` is safer and cleaner.
80 changes: 40 additions & 40 deletions bar.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,42 +53,43 @@ int drawstatusbar(Monitor *m, int bh, char *stext) {
int len;
int cmdcounter;
short isCode = 0;
char *text;
char text[1024];
char *p;

len = strlen(stext) + 1;
if (!(text = (char *)malloc(sizeof(char) * len))) {
die("malloc");
if (len > sizeof(text)) {
len = sizeof(text);
}
p = text;
memcpy(text, stext, len);
text[len - 1] = '\0';
p = text;

/* compute width of the status text */
w = 0;
i = -1;
while (text[++i]) {
if (text[i] == '^') {
while (p[++i]) {
if (p[i] == '^') {
if (!isCode) {
isCode = 1;
text[i] = '\0';
w += TEXTW(text) - lrpad;
text[i] = '^';
if (text[++i] == 'f') {
w += atoi(text + ++i);
p[i] = '\0';
w += TEXTW(p) - lrpad;
p[i] = '^';
if (p[++i] == 'f') {
w += atoi(p + ++i);
}
} else {
isCode = 0;
text = text + i + 1;
p = p + i + 1;
i = -1;
}
}
}
if (!isCode) {
w += TEXTW(text) - lrpad;
w += TEXTW(p) - lrpad;
} else {
isCode = 0;
}
text = p;
p = text;
statuswidth = w;
w += 2; /* 1px padding on both sides */
ret = x = m->ww - w - getsystraywidth();
Expand All @@ -103,64 +104,64 @@ int drawstatusbar(Monitor *m, int bh, char *stext) {

int customcolor = 0;

while (text[++i]) {
if (text[i] == '^' && !isCode) {
while (p[++i]) {
if (p[i] == '^' && !isCode) {
isCode = 1;

text[i] = '\0';
w = TEXTW(text) - lrpad;
drw_text(drw, x, 0, w, bh, 0, text, 0, 0);
p[i] = '\0';
w = TEXTW(p) - lrpad;
drw_text(drw, x, 0, w, bh, 0, p, 0, 0);

x += w;

/* process code */
while (text[++i] != '^') {
if (text[i] == 'c') {
while (p[++i] != '^') {
if (p[i] == 'c') {
char buf[8];
memcpy(buf, text + i + 1, 7);
memcpy(buf, p + i + 1, 7);
buf[7] = '\0';
customcolor = 1;
drw_clr_create(drw, &drw->scheme[ColBg], buf);
i += 7;
} else if (text[i] == 't') {
} else if (p[i] == 't') {
char buf[8];
memcpy(buf, text + i + 1, 7);
memcpy(buf, p + i + 1, 7);
buf[7] = '\0';
customcolor = 1;
drw_clr_create(drw, &drw->scheme[ColFg], buf);
i += 7;
} else if (text[i] == 'd') {
} else if (p[i] == 'd') {
drw_clr_create(drw, &drw->scheme[ColBg],
statusbarcolors[ColBg]);
drw_clr_create(drw, &drw->scheme[ColFg],
statusbarcolors[ColFg]);
} else if (text[i] == 'r') {
int rx = atoi(text + ++i);
while (text[++i] != ',') {
} else if (p[i] == 'r') {
int rx = atoi(p + ++i);
while (p[++i] != ',') {
;
}
int ry = atoi(text + ++i);
while (text[++i] != ',') {
int ry = atoi(p + ++i);
while (p[++i] != ',') {
;
}
int rw = atoi(text + ++i);
while (text[++i] != ',') {
int rw = atoi(p + ++i);
while (p[++i] != ',') {
;
}
int rh = atoi(text + ++i);
int rh = atoi(p + ++i);

drw_rect(drw, rx + x, ry, rw, rh, 1, 0);
} else if (text[i] == 'f') {
x += atoi(text + ++i);
} else if (text[i] == 'o') {
} else if (p[i] == 'f') {
x += atoi(p + ++i);
} else if (p[i] == 'o') {
if (cmdcounter <= 20) {
commandoffsets[cmdcounter] = x;
cmdcounter++;
}
}
}

text = text + i + 1;
p = p + i + 1;
i = -1;
isCode = 0;
}
Expand Down Expand Up @@ -189,12 +190,11 @@ int drawstatusbar(Monitor *m, int bh, char *stext) {
}

if (!isCode) {
w = TEXTW(text) - lrpad;
drw_text(drw, x, 0, w, bh, 0, text, 0, 0);
w = TEXTW(p) - lrpad;
drw_text(drw, x, 0, w, bh, 0, p, 0, 0);
}

drw_setscheme(drw, statusscheme);
free(p);

return ret;
}
Expand Down