Skip to content

Commit 7971704

Browse files
committed
sheet: Give status msgs a priority which decays with time
Allows errors to be displayed for longer without them blocking other status messages after the user has been given time to view them. Possibly errors should be displayed in a separate buffer or location, but while we are overloading the status this gives the user chance to view them.
1 parent b871542 commit 7971704

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

app/sheet.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ size_t display_data_rowcount(struct zsvsheet_display_dimensions *dims) {
166166
return dims->rows - dims->footer_span - dims->header_span;
167167
}
168168

169-
char zsvsheet_status_text[256] = {0};
169+
static int zsvsheet_status_priority;
170+
static char zsvsheet_status_text[256];
170171
static void zsvsheet_display_status_text(const struct zsvsheet_display_dimensions *ddims) {
171172
// clear the entire line
172173
mvprintw(ddims->rows - ddims->footer_span, 0, "%-*s", (int)sizeof(zsvsheet_status_text), "");
@@ -177,15 +178,24 @@ static void zsvsheet_display_status_text(const struct zsvsheet_display_dimension
177178
attroff(A_REVERSE);
178179
}
179180

180-
static void zsvsheet_priv_set_status(const struct zsvsheet_display_dimensions *ddims, int overwrite, const char *fmt,
181+
#define ZSVSHEET_STATUS_LOW_PRIO 1
182+
#define ZSVSHEET_STATUS_HIGH_PRIO 10
183+
184+
static void zsvsheet_priv_set_status(const struct zsvsheet_display_dimensions *ddims, int priority, const char *fmt,
181185
...) {
182-
if (overwrite || !*zsvsheet_status_text) {
186+
if (priority > zsvsheet_status_priority || !*zsvsheet_status_text) {
183187
va_list argv;
184188
va_start(argv, fmt);
185189
vsnprintf(zsvsheet_status_text, sizeof(zsvsheet_status_text), fmt, argv);
186190
va_end(argv);
187191
// note: if (n < (int)sizeof(zsvsheet_status_text)), then we just ignore
192+
zsvsheet_status_priority = priority;
188193
}
194+
195+
// The priority decays with each call which is at least n times per second as set by halfdelay
196+
if (zsvsheet_status_priority > 0)
197+
zsvsheet_status_priority--;
198+
189199
zsvsheet_display_status_text(ddims);
190200
}
191201

@@ -331,7 +341,7 @@ char zsvsheet_handle_find_next(struct zsvsheet_ui_buffer *uib, const char *needl
331341
*update_buffer = zsvsheet_goto_input_raw_row(uib, zsvsheet_opts->found_rownum, header_span, ddims, (size_t)-1);
332342
return 1;
333343
}
334-
zsvsheet_priv_set_status(ddims, 1, "Not found");
344+
zsvsheet_priv_set_status(ddims, ZSVSHEET_STATUS_HIGH_PRIO, "Not found");
335345
return 0;
336346
}
337347

@@ -394,11 +404,11 @@ static zsvsheet_status zsvsheet_open_file_handler(struct zsvsheet_proc_context *
394404
if ((err = zsvsheet_ui_buffer_open_file(filename, NULL, state->custom_prop_handler, di->ui_buffers.base,
395405
di->ui_buffers.current))) {
396406
if (err > 0)
397-
zsvsheet_priv_set_status(di->dimensions, 1, "%s: %s", filename, strerror(err));
407+
zsvsheet_priv_set_status(di->dimensions, ZSVSHEET_STATUS_HIGH_PRIO, "%s: %s", filename, strerror(err));
398408
else if (err < 0)
399-
zsvsheet_priv_set_status(di->dimensions, 1, "Unexpected error");
409+
zsvsheet_priv_set_status(di->dimensions, ZSVSHEET_STATUS_HIGH_PRIO, "Unexpected error");
400410
else
401-
zsvsheet_priv_set_status(di->dimensions, 1, "Not found: %s", filename);
411+
zsvsheet_priv_set_status(di->dimensions, ZSVSHEET_STATUS_HIGH_PRIO, "Not found: %s", filename);
402412
return zsvsheet_status_ignore;
403413
}
404414
no_input:
@@ -645,7 +655,7 @@ static void zsvsheet_check_buffer_worker_updates(struct zsvsheet_ui_buffer *ub,
645655
struct zsvsheet_sheet_context *handler_state) {
646656
pthread_mutex_lock(&ub->mutex);
647657
if (ub->status)
648-
zsvsheet_priv_set_status(display_dims, 1, ub->status);
658+
zsvsheet_priv_set_status(display_dims, ZSVSHEET_STATUS_LOW_PRIO, ub->status);
649659
if (ub->index_ready && ub->dimensions.row_count != ub->index->row_count + 1) {
650660
ub->dimensions.row_count = ub->index->row_count + 1;
651661
handler_state->display_info.update_buffer = true;
@@ -741,7 +751,7 @@ int ZSV_MAIN_FUNC(ZSV_COMMAND)(int argc, const char *argv[], struct zsv_opts *op
741751
ch = getch();
742752

743753
handler_state.display_info.update_buffer = false;
744-
zsvsheet_priv_set_status(&display_dims, 1, "");
754+
zsvsheet_priv_set_status(&display_dims, ZSVSHEET_STATUS_LOW_PRIO, "");
745755

746756
if (ch != ERR) {
747757
status = zsvsheet_key_press(ch, &handler_state);
@@ -758,7 +768,7 @@ int ZSV_MAIN_FUNC(ZSV_COMMAND)(int argc, const char *argv[], struct zsv_opts *op
758768
struct zsvsheet_opts zsvsheet_opts = {0};
759769
if (read_data(&ub, NULL, current_ui_buffer->input_offset.row, current_ui_buffer->input_offset.col, header_span,
760770
&zsvsheet_opts, custom_prop_handler)) {
761-
zsvsheet_priv_set_status(&display_dims, 1, "Unexpected error!"); // to do: better error message
771+
zsvsheet_priv_set_status(&display_dims, ZSVSHEET_STATUS_HIGH_PRIO, "Unexpected error!"); // to do: better error message
762772
continue;
763773
}
764774
}

app/sheet/handlers.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ zsvsheet_status zsvsheet_set_status(struct zsvsheet_proc_context *ctx, const cha
4545
va_end(argv);
4646
// note: if (n < (int)sizeof(zsvsheet_status_text)), then we just ignore
4747
zsvsheet_display_status_text(state->display_info.dimensions);
48+
zsvsheet_status_priority = ZSVSHEET_STATUS_PRIO_HIGH;
4849
return zsvsheet_status_ok;
4950
}
5051

0 commit comments

Comments
 (0)