mirror of
https://github.com/vale981/spectrwm
synced 2025-03-05 09:51:38 -05:00
Only read external script output when available in the main loop.
Rename bar_fmt_print to bar_draw. Change all bar_update calls to bar_draw, except in main. Rename bar_update to bar_extra_update. To clarify, bar_extra_update reads the external bar script output and redraws the bar if needed; bar_draw only redraws the bar with the current external bar script output.
This commit is contained in:
parent
b6d8befdac
commit
3855da68fe
1 changed files with 42 additions and 30 deletions
72
spectrwm.c
72
spectrwm.c
|
@ -820,13 +820,14 @@ void adjust_font(struct ws_win *);
|
||||||
void bar_class_name(char *, size_t, struct swm_region *);
|
void bar_class_name(char *, size_t, struct swm_region *);
|
||||||
void bar_class_title_name(char *, size_t, struct swm_region *);
|
void bar_class_title_name(char *, size_t, struct swm_region *);
|
||||||
void bar_cleanup(struct swm_region *);
|
void bar_cleanup(struct swm_region *);
|
||||||
|
void bar_extra_setup(void);
|
||||||
void bar_extra_stop(void);
|
void bar_extra_stop(void);
|
||||||
|
void bar_extra_update(void);
|
||||||
void bar_fmt(const char *, char *, struct swm_region *, size_t);
|
void bar_fmt(const char *, char *, struct swm_region *, size_t);
|
||||||
void bar_fmt_expand(char *, size_t);
|
void bar_fmt_expand(char *, size_t);
|
||||||
void bar_fmt_print(void);
|
void bar_draw(void);
|
||||||
void bar_print(struct swm_region *, const char *);
|
void bar_print(struct swm_region *, const char *);
|
||||||
void bar_print_legacy(struct swm_region *, const char *);
|
void bar_print_legacy(struct swm_region *, const char *);
|
||||||
void bar_refresh(void);
|
|
||||||
void bar_replace(char *, char *, struct swm_region *, size_t);
|
void bar_replace(char *, char *, struct swm_region *, size_t);
|
||||||
void bar_replace_pad(char *, int *, size_t);
|
void bar_replace_pad(char *, int *, size_t);
|
||||||
char * bar_replace_seq(char *, char *, struct swm_region *, size_t *,
|
char * bar_replace_seq(char *, char *, struct swm_region *, size_t *,
|
||||||
|
@ -834,7 +835,6 @@ char * bar_replace_seq(char *, char *, struct swm_region *, size_t *,
|
||||||
void bar_setup(struct swm_region *);
|
void bar_setup(struct swm_region *);
|
||||||
void bar_title_name(char *, size_t, struct swm_region *);
|
void bar_title_name(char *, size_t, struct swm_region *);
|
||||||
void bar_toggle(struct swm_region *, union arg *);
|
void bar_toggle(struct swm_region *, union arg *);
|
||||||
void bar_update(void);
|
|
||||||
void bar_urgent(char *, size_t);
|
void bar_urgent(char *, size_t);
|
||||||
void bar_window_float(char *, size_t, struct swm_region *);
|
void bar_window_float(char *, size_t, struct swm_region *);
|
||||||
void bar_window_name(char *, size_t, struct swm_region *);
|
void bar_window_name(char *, size_t, struct swm_region *);
|
||||||
|
@ -2160,8 +2160,9 @@ bar_fmt_expand(char *fmtexp, size_t sz)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Redraws the bar; need to follow with xcb_flush() or focus_flush(). */
|
||||||
void
|
void
|
||||||
bar_fmt_print(void)
|
bar_draw(void)
|
||||||
{
|
{
|
||||||
char fmtexp[SWM_BAR_MAX], fmtnew[SWM_BAR_MAX];
|
char fmtexp[SWM_BAR_MAX], fmtnew[SWM_BAR_MAX];
|
||||||
char fmtrep[SWM_BAR_MAX];
|
char fmtrep[SWM_BAR_MAX];
|
||||||
|
@ -2194,11 +2195,13 @@ bar_fmt_print(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Reads external script output; call when stdin is readable. */
|
||||||
void
|
void
|
||||||
bar_update(void)
|
bar_extra_update(void)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
char b[SWM_BAR_MAX];
|
char b[SWM_BAR_MAX];
|
||||||
|
int redraw = 0;
|
||||||
|
|
||||||
if (bar_enabled && bar_extra && bar_extra_running) {
|
if (bar_enabled && bar_extra && bar_extra_running) {
|
||||||
while (fgets(b, sizeof(b), stdin) != NULL) {
|
while (fgets(b, sizeof(b), stdin) != NULL) {
|
||||||
|
@ -2216,6 +2219,8 @@ bar_update(void)
|
||||||
|
|
||||||
/* Append new output to bar. */
|
/* Append new output to bar. */
|
||||||
strlcat(bar_ext, b, sizeof(bar_ext));
|
strlcat(bar_ext, b, sizeof(bar_ext));
|
||||||
|
|
||||||
|
redraw = 1;
|
||||||
} else {
|
} else {
|
||||||
/* Buffer output. */
|
/* Buffer output. */
|
||||||
strlcat(bar_ext_buf, b, sizeof(bar_ext_buf));
|
strlcat(bar_ext_buf, b, sizeof(bar_ext_buf));
|
||||||
|
@ -2223,7 +2228,7 @@ bar_update(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (errno != EAGAIN) {
|
if (errno != EAGAIN) {
|
||||||
warn("bar_update: bar_extra failed");
|
warn("bar_action failed");
|
||||||
bar_extra_stop();
|
bar_extra_stop();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -2236,10 +2241,17 @@ bar_update(void)
|
||||||
if (!bar_enabled)
|
if (!bar_enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bar_ext[0] = '\0';
|
/* Clear bar script output if bar script is not running. */
|
||||||
|
if (bar_ext[0] != '\0') {
|
||||||
|
bar_ext[0] = '\0';
|
||||||
|
redraw = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bar_fmt_print();
|
if (redraw) {
|
||||||
|
bar_draw();
|
||||||
|
xcb_flush(conn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -2281,13 +2293,13 @@ bar_toggle(struct swm_region *r, union arg *args)
|
||||||
stack();
|
stack();
|
||||||
|
|
||||||
/* must be after stack */
|
/* must be after stack */
|
||||||
bar_update();
|
bar_draw();
|
||||||
|
|
||||||
focus_flush();
|
focus_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
bar_refresh(void)
|
bar_extra_setup(void)
|
||||||
{
|
{
|
||||||
struct swm_region *r;
|
struct swm_region *r;
|
||||||
uint32_t wa[2];
|
uint32_t wa[2];
|
||||||
|
@ -2338,7 +2350,7 @@ bar_refresh(void)
|
||||||
XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa);
|
XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa);
|
||||||
}
|
}
|
||||||
|
|
||||||
bar_update();
|
bar_draw();
|
||||||
xcb_flush(conn);
|
xcb_flush(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2505,7 +2517,7 @@ bar_setup(struct swm_region *r)
|
||||||
"%d x %d\n", WINID(r->bar), X(r->bar), Y(r->bar), WIDTH(r->bar),
|
"%d x %d\n", WINID(r->bar), X(r->bar), Y(r->bar), WIDTH(r->bar),
|
||||||
HEIGHT(r->bar));
|
HEIGHT(r->bar));
|
||||||
|
|
||||||
bar_refresh();
|
bar_extra_setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -2568,8 +2580,8 @@ version(struct swm_region *r, union arg *args)
|
||||||
"Version: %s Build: %s", SPECTRWM_VERSION, buildstr);
|
"Version: %s Build: %s", SPECTRWM_VERSION, buildstr);
|
||||||
else
|
else
|
||||||
strlcpy(bar_vertext, "", sizeof bar_vertext);
|
strlcpy(bar_vertext, "", sizeof bar_vertext);
|
||||||
bar_update();
|
|
||||||
|
|
||||||
|
bar_draw();
|
||||||
xcb_flush(conn);
|
xcb_flush(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3224,7 +3236,7 @@ focus_win(struct ws_win *win)
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
bar_update();
|
bar_draw();
|
||||||
|
|
||||||
DNPRINTF(SWM_D_FOCUS, "focus_win: done.\n");
|
DNPRINTF(SWM_D_FOCUS, "focus_win: done.\n");
|
||||||
}
|
}
|
||||||
|
@ -3346,7 +3358,7 @@ switchws(struct swm_region *r, union arg *args)
|
||||||
|
|
||||||
/* Clear bar if new ws is empty. */
|
/* Clear bar if new ws is empty. */
|
||||||
if (new_ws->focus_pending == NULL)
|
if (new_ws->focus_pending == NULL)
|
||||||
bar_update();
|
bar_draw();
|
||||||
|
|
||||||
focus_flush();
|
focus_flush();
|
||||||
|
|
||||||
|
@ -3455,7 +3467,7 @@ cyclescr(struct swm_region *r, union arg *args)
|
||||||
rr->s[i].root, XCB_CURRENT_TIME);
|
rr->s[i].root, XCB_CURRENT_TIME);
|
||||||
|
|
||||||
/* Clear bar since empty. */
|
/* Clear bar since empty. */
|
||||||
bar_update();
|
bar_draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
focus_flush();
|
focus_flush();
|
||||||
|
@ -3768,7 +3780,7 @@ cycle_layout(struct swm_region *r, union arg *args)
|
||||||
ws->cur_layout = &layouts[0];
|
ws->cur_layout = &layouts[0];
|
||||||
|
|
||||||
stack();
|
stack();
|
||||||
bar_update();
|
bar_draw();
|
||||||
|
|
||||||
focus_win(get_region_focus(r));
|
focus_win(get_region_focus(r));
|
||||||
|
|
||||||
|
@ -3788,7 +3800,7 @@ stack_config(struct swm_region *r, union arg *args)
|
||||||
|
|
||||||
if (args->id != SWM_ARG_ID_STACKINIT)
|
if (args->id != SWM_ARG_ID_STACKINIT)
|
||||||
stack();
|
stack();
|
||||||
bar_update();
|
bar_draw();
|
||||||
|
|
||||||
focus_flush();
|
focus_flush();
|
||||||
}
|
}
|
||||||
|
@ -7443,7 +7455,7 @@ expose(xcb_expose_event_t *e)
|
||||||
for (i = 0; i < num_screens; i++)
|
for (i = 0; i < num_screens; i++)
|
||||||
TAILQ_FOREACH(r, &screens[i].rl, entry)
|
TAILQ_FOREACH(r, &screens[i].rl, entry)
|
||||||
if (e->window == WINID(r->bar))
|
if (e->window == WINID(r->bar))
|
||||||
bar_update();
|
bar_draw();
|
||||||
|
|
||||||
xcb_flush(conn);
|
xcb_flush(conn);
|
||||||
}
|
}
|
||||||
|
@ -7528,7 +7540,7 @@ buttonpress(xcb_button_press_event_t *e)
|
||||||
XCB_INPUT_FOCUS_PARENT, e->root, e->time);
|
XCB_INPUT_FOCUS_PARENT, e->root, e->time);
|
||||||
|
|
||||||
/* Clear bar since empty. */
|
/* Clear bar since empty. */
|
||||||
bar_update();
|
bar_draw();
|
||||||
|
|
||||||
handled = 1;
|
handled = 1;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -7909,7 +7921,7 @@ enternotify(xcb_enter_notify_event_t *e)
|
||||||
XCB_INPUT_FOCUS_PARENT, e->root, e->time);
|
XCB_INPUT_FOCUS_PARENT, e->root, e->time);
|
||||||
|
|
||||||
/* Clear bar since empty. */
|
/* Clear bar since empty. */
|
||||||
bar_update();
|
bar_draw();
|
||||||
|
|
||||||
focus_flush();
|
focus_flush();
|
||||||
}
|
}
|
||||||
|
@ -8107,7 +8119,7 @@ propertynotify(xcb_property_notify_event_t *e)
|
||||||
}
|
}
|
||||||
} else if (e->atom == XCB_ATOM_WM_CLASS ||
|
} else if (e->atom == XCB_ATOM_WM_CLASS ||
|
||||||
e->atom == XCB_ATOM_WM_NAME) {
|
e->atom == XCB_ATOM_WM_NAME) {
|
||||||
bar_update();
|
bar_draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
xcb_flush(conn);
|
xcb_flush(conn);
|
||||||
|
@ -8855,7 +8867,7 @@ main(int argc, char *argv[])
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
fd_set rd;
|
fd_set rd;
|
||||||
int rd_max;
|
int rd_max;
|
||||||
int do_bar_update = 0;
|
int stdin_ready = 0;
|
||||||
int num_readable;
|
int num_readable;
|
||||||
|
|
||||||
/* suppress unused warning since var is needed */
|
/* suppress unused warning since var is needed */
|
||||||
|
@ -9018,10 +9030,11 @@ noconfig:
|
||||||
tv.tv_sec = 1;
|
tv.tv_sec = 1;
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
num_readable = select(rd_max + 1, &rd, NULL, NULL, &tv);
|
num_readable = select(rd_max + 1, &rd, NULL, NULL, &tv);
|
||||||
if (num_readable == -1 && errno != EINTR)
|
if (num_readable == -1 && errno != EINTR) {
|
||||||
DNPRINTF(SWM_D_MISC, "select failed");
|
DNPRINTF(SWM_D_MISC, "select failed");
|
||||||
else if (num_readable > 0 && FD_ISSET(STDIN_FILENO, &rd))
|
} else if (num_readable > 0 && FD_ISSET(STDIN_FILENO, &rd)) {
|
||||||
do_bar_update = 1;
|
stdin_ready = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (restart_wm)
|
if (restart_wm)
|
||||||
restart(NULL, NULL);
|
restart(NULL, NULL);
|
||||||
|
@ -9032,10 +9045,9 @@ noconfig:
|
||||||
if (!running)
|
if (!running)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (do_bar_update) {
|
if (stdin_ready) {
|
||||||
do_bar_update = 0;
|
stdin_ready = 0;
|
||||||
bar_update();
|
bar_extra_update();
|
||||||
xcb_flush(conn);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
done:
|
done:
|
||||||
|
|
Loading…
Add table
Reference in a new issue