mirror of
https://github.com/mintycube/dwmblocks.git
synced 2024-10-22 14:05:47 +02:00
fix: Fix timer logic for blocks
This commit is contained in:
parent
c42a4215c8
commit
12d4decdd4
@ -24,6 +24,5 @@ int block_init(block *const block);
|
|||||||
int block_deinit(block *const block);
|
int block_deinit(block *const block);
|
||||||
int block_execute(block *const block, const uint8_t button);
|
int block_execute(block *const block, const uint8_t button);
|
||||||
int block_update(block *const block);
|
int block_update(block *const block);
|
||||||
bool block_must_run(const block *const block, const unsigned int time);
|
|
||||||
|
|
||||||
#endif // BLOCK_H
|
#endif // BLOCK_H
|
||||||
|
@ -7,7 +7,6 @@ typedef struct {
|
|||||||
bool is_debug_mode;
|
bool is_debug_mode;
|
||||||
} cli_arguments;
|
} cli_arguments;
|
||||||
|
|
||||||
int cli_init(cli_arguments* const args, const char* const argv[],
|
cli_arguments cli_parse_arguments(const char* const argv[], const int argc);
|
||||||
const int argc);
|
|
||||||
|
|
||||||
#endif // CLI_H
|
#endif // CLI_H
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define TIMER_H
|
#define TIMER_H
|
||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "block.h"
|
#include "block.h"
|
||||||
|
|
||||||
@ -15,5 +16,6 @@ typedef struct {
|
|||||||
|
|
||||||
timer timer_new(const block *const blocks, const unsigned short block_count);
|
timer timer_new(const block *const blocks, const unsigned short block_count);
|
||||||
int timer_arm(timer *const timer);
|
int timer_arm(timer *const timer);
|
||||||
|
bool timer_must_run_block(const timer *const timer, const block *const block);
|
||||||
|
|
||||||
#endif // TIMER_H
|
#endif // TIMER_H
|
||||||
|
12
src/block.c
12
src/block.c
@ -144,15 +144,3 @@ int block_update(block *const block) {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool block_must_run(const block *const block, const unsigned int time) {
|
|
||||||
if (time == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (block->interval == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return time % block->interval == 0;
|
|
||||||
}
|
|
||||||
|
15
src/cli.c
15
src/cli.c
@ -1,19 +1,22 @@
|
|||||||
#include "cli.h"
|
#include "cli.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int cli_init(cli_arguments *const args, const char *const argv[],
|
cli_arguments cli_parse_arguments(const char *const argv[], const int argc) {
|
||||||
const int argc) {
|
errno = 0;
|
||||||
args->is_debug_mode = false;
|
cli_arguments args = {
|
||||||
|
.is_debug_mode = false,
|
||||||
|
};
|
||||||
|
|
||||||
int opt = -1;
|
int opt = -1;
|
||||||
opterr = 0; // Suppress getopt's built-in invalid opt message
|
opterr = 0; // Suppress getopt's built-in invalid opt message
|
||||||
while ((opt = getopt(argc, (char *const *)argv, "dh")) != -1) {
|
while ((opt = getopt(argc, (char *const *)argv, "dh")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'd':
|
case 'd':
|
||||||
args->is_debug_mode = true;
|
args.is_debug_mode = true;
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
(void)fprintf(stderr, "error: unknown option `-%c'\n", optopt);
|
(void)fprintf(stderr, "error: unknown option `-%c'\n", optopt);
|
||||||
@ -22,9 +25,9 @@ int cli_init(cli_arguments *const args, const char *const argv[],
|
|||||||
// fall through
|
// fall through
|
||||||
default:
|
default:
|
||||||
(void)fprintf(stderr, "usage: %s [-d]\n", BINARY);
|
(void)fprintf(stderr, "usage: %s [-d]\n", BINARY);
|
||||||
return 1;
|
errno = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return args;
|
||||||
}
|
}
|
||||||
|
11
src/main.c
11
src/main.c
@ -1,5 +1,6 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
@ -38,10 +39,10 @@ static int deinit_blocks(block *const blocks,
|
|||||||
|
|
||||||
static int execute_blocks(block *const blocks,
|
static int execute_blocks(block *const blocks,
|
||||||
const unsigned short block_count,
|
const unsigned short block_count,
|
||||||
const unsigned int time) {
|
const timer *const timer) {
|
||||||
for (unsigned short i = 0; i < block_count; ++i) {
|
for (unsigned short i = 0; i < block_count; ++i) {
|
||||||
block *const block = &blocks[i];
|
block *const block = &blocks[i];
|
||||||
if (!block_must_run(block, time)) {
|
if (!timer_must_run_block(timer, block)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +56,7 @@ static int execute_blocks(block *const blocks,
|
|||||||
|
|
||||||
static int trigger_event(block *const blocks, const unsigned short block_count,
|
static int trigger_event(block *const blocks, const unsigned short block_count,
|
||||||
timer *const timer) {
|
timer *const timer) {
|
||||||
if (execute_blocks(blocks, block_count, timer->time) != 0) {
|
if (execute_blocks(blocks, block_count, timer) != 0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,8 +118,8 @@ static int event_loop(block *const blocks, const unsigned short block_count,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(const int argc, const char *const argv[]) {
|
int main(const int argc, const char *const argv[]) {
|
||||||
cli_arguments cli_args;
|
const cli_arguments cli_args = cli_parse_arguments(argv, argc);
|
||||||
if (cli_init(&cli_args, argv, argc) != 0) {
|
if (errno != 0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
21
src/timer.c
21
src/timer.c
@ -1,6 +1,7 @@
|
|||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
@ -32,10 +33,12 @@ static unsigned int compute_reset_value(const block *const blocks,
|
|||||||
}
|
}
|
||||||
|
|
||||||
timer timer_new(const block *const blocks, const unsigned short block_count) {
|
timer timer_new(const block *const blocks, const unsigned short block_count) {
|
||||||
|
const unsigned int reset_value = compute_reset_value(blocks, block_count);
|
||||||
|
|
||||||
timer timer = {
|
timer timer = {
|
||||||
.time = 0,
|
.time = reset_value, // Initial value to execute all blocks.
|
||||||
.tick = compute_tick(blocks, block_count),
|
.tick = compute_tick(blocks, block_count),
|
||||||
.reset_value = compute_reset_value(blocks, block_count),
|
.reset_value = reset_value,
|
||||||
};
|
};
|
||||||
|
|
||||||
return timer;
|
return timer;
|
||||||
@ -51,7 +54,19 @@ int timer_arm(timer *const timer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Wrap `time` to the interval [1, reset_value].
|
// Wrap `time` to the interval [1, reset_value].
|
||||||
timer->time = (timer->time + timer->tick) % timer->reset_value + 1;
|
timer->time = (timer->time + timer->tick) % timer->reset_value;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool timer_must_run_block(const timer *const timer, const block *const block) {
|
||||||
|
if (timer->time == timer->reset_value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (block->interval == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return timer->time % block->interval == 0;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user