summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Davenport <qball@blame.services>2022-08-19 20:08:41 +0200
committerDave Davenport <qball@blame.services>2022-08-19 20:08:41 +0200
commitd74ebdb41b49a151737cd3b2705d053f9840bdcd (patch)
treebbbab934beebcb9ff39531885d0148efda2a2d5c
parent78d596dc535d2a6ecba873071fa4a3edd4062b84 (diff)
[Dmenu] Add a minimum update rate for dmenu reading.dmenu-timer-fix
This avoid slow loading for some weird slow spaced out input stream. (one input every 250ms). Not sure what use-case this fixes. This fix does cause a noticable slow-down on very large lists. Issue: #1680
-rw-r--r--source/modes/dmenu.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/source/modes/dmenu.c b/source/modes/dmenu.c
index c0066099..d6431f55 100644
--- a/source/modes/dmenu.c
+++ b/source/modes/dmenu.c
@@ -256,6 +256,7 @@ static gpointer read_input_thread(gpointer userdata) {
pd->async_queue = g_async_queue_new();
Block *block = NULL;
+ GTimer *tim = g_timer_new();
int fd = pd->fd;
while (1) {
// Wait for input from the input or from the main thread.
@@ -295,10 +296,14 @@ static gpointer read_input_thread(gpointer userdata) {
memmove(&line[0], &line[i + 1], nread - (i + 1));
nread -= (i + 1);
i = 0;
- if (block && block->length == BLOCK_LINES_SIZE) {
- g_async_queue_push(pd->async_queue, block);
- block = NULL;
- write(pd->pipefd2[1], "r", 1);
+ if (block) {
+ double elapsed = g_timer_elapsed(tim, NULL);
+ if ( elapsed >= 0.1 || block->length == BLOCK_LINES_SIZE) {
+ g_timer_start(tim);
+ g_async_queue_push(pd->async_queue, block);
+ block = NULL;
+ write(pd->pipefd2[1], "r", 1);
+ }
}
} else {
i++;
@@ -311,6 +316,7 @@ static gpointer read_input_thread(gpointer userdata) {
read_add_block(pd, &block, line, nread);
}
if (block) {
+ g_timer_start(tim);
g_async_queue_push(pd->async_queue, block);
block = NULL;
write(pd->pipefd2[1], "r", 1);
@@ -326,12 +332,14 @@ static gpointer read_input_thread(gpointer userdata) {
nread = 0;
}
if (block) {
+ g_timer_start(tim);
g_async_queue_push(pd->async_queue, block);
block = NULL;
write(pd->pipefd2[1], "r", 1);
}
}
}
+ g_timer_destroy(tim);
free(line);
write(pd->pipefd2[1], "q", 1);
return NULL;