Compare commits

..
17 changed files with 63 additions and 99 deletions

View file

@ -5,7 +5,6 @@ BUILD_DIR := build
SRC_DIR := src SRC_DIR := src
INC_DIR := include INC_DIR := include
DEBUG := 0
VERBOSE := 0 VERBOSE := 0
LIBS := xcb-atom LIBS := xcb-atom
@ -27,10 +26,6 @@ ifeq ($(VERBOSE), 0)
Q := @ Q := @
endif endif
ifeq ($(DEBUG), 1)
CFLAGS += -g
endif
all: $(BUILD_DIR)/$(BIN) all: $(BUILD_DIR)/$(BIN)
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c config.h $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c config.h
@ -38,6 +33,7 @@ $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c config.h
$(PRINTF) "CC" $@ $(PRINTF) "CC" $@
$Q$(COMPILE.c) -o $@ $< $Q$(COMPILE.c) -o $@ $<
$(BUILD_DIR)/$(BIN): $(OBJS) $(BUILD_DIR)/$(BIN): $(OBJS)
$(PRINTF) "LD" $@ $(PRINTF) "LD" $@
$Q$(LINK.o) $^ $(LDLIBS) -o $@ $Q$(LINK.o) $^ $(LDLIBS) -o $@
@ -49,8 +45,6 @@ clean:
install: $(BUILD_DIR)/$(BIN) install: $(BUILD_DIR)/$(BIN)
$(PRINTF) "INSTALL" $(INSTALL_DIR)/$(BIN) $(PRINTF) "INSTALL" $(INSTALL_DIR)/$(BIN)
$Qinstall -D -m 755 $< $(INSTALL_DIR)/$(BIN) $Qinstall -D -m 755 $< $(INSTALL_DIR)/$(BIN)
cp ./bat.sh /usr/local/bin
cp ./wp.sh /usr/local/bin
uninstall: uninstall:
$(PRINTF) "RM" $(INSTALL_DIR)/$(BIN) $(PRINTF) "RM" $(INSTALL_DIR)/$(BIN)

View file

@ -90,8 +90,8 @@ You can define your status bar blocks in `config.h`:
```c ```c
#define BLOCKS(X) \ #define BLOCKS(X) \
... ...
X(" ", "wpctl get-volume @DEFAULT_AUDIO_SINK@ | cut -d' ' -f2", 0, 5) \ X("volume", 0, 5), \
X("󰥔 ", "date '+%H:%M:%S'", 1, 1) \ X("date", 1800, 1), \
... ...
``` ```
@ -99,7 +99,6 @@ Each block has the following properties:
| Property | Description | | Property | Description |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| Icon | An icon you wish to prepend to your block output. |
| Command | The command you wish to execute in your block. | | Command | The command you wish to execute in your block. |
| Update interval | Time in seconds, after which you want the block to update. If `0`, the block will never be updated. | | Update interval | Time in seconds, after which you want the block to update. If `0`, the block will never be updated. |
| Update signal | Signal to be used for triggering the block. Must be a positive integer. If `0`, a signal won't be set up for the block and it will be unclickable. | | Update signal | Signal to be used for triggering the block. Must be a positive integer. If `0`, a signal won't be set up for the block and it will be unclickable. |

14
bat.sh
View file

@ -1,14 +0,0 @@
status=$(cat /sys/class/power_supply/BAT0/status)
level=$(cat /sys/class/power_supply/BAT0/capacity)
case $status in
Full)
echo $level%o
;;
Charging)
echo $level%+
;;
Discharging)
echo $level%-
;;
esac

View file

@ -2,13 +2,13 @@
#define CONFIG_H #define CONFIG_H
// String used to delimit block outputs in the status. // String used to delimit block outputs in the status.
#define DELIMITER " " #define DELIMITER " "
// Maximum number of Unicode characters that a block can output. // Maximum number of Unicode characters that a block can output.
#define MAX_BLOCK_OUTPUT_LENGTH 45 #define MAX_BLOCK_OUTPUT_LENGTH 45
// Control whether blocks are clickable. // Control whether blocks are clickable.
#define CLICKABLE_BLOCKS 0 #define CLICKABLE_BLOCKS 1
// Control whether a leading delimiter should be prepended to the status. // Control whether a leading delimiter should be prepended to the status.
#define LEADING_DELIMITER 0 #define LEADING_DELIMITER 0
@ -16,10 +16,17 @@
// Control whether a trailing delimiter should be appended to the status. // Control whether a trailing delimiter should be appended to the status.
#define TRAILING_DELIMITER 0 #define TRAILING_DELIMITER 0
// Define blocks for the status feed as X(icon, cmd, interval, signal). // Define blocks for the status feed as X(cmd, interval, signal).
#define BLOCKS(X) \ #define BLOCKS(X) \
X(" ", "date +%H:%M:%S", 1, 1) \ X("sb-mail", 600, 1) \
X(" ", "bat.sh", 1, 1) \ X("sb-music", 0, 2) \
X(" ", "wp.sh", 1, 1) X("sb-disk", 1800, 3) \
X("sb-memory", 10, 4) \
X("sb-loadavg", 5, 5) \
X("sb-mic", 0, 6) \
X("sb-record", 0, 7) \
X("sb-volume", 0, 8) \
X("sb-battery", 5, 9) \
X("sb-date", 1, 10)
#endif // CONFIG_H #endif // CONFIG_H

View file

@ -1,15 +1,14 @@
#ifndef BLOCK_H #ifndef BLOCK_H
#define BLOCK_H #define BLOCK_H
#include <bits/stdint-uintn.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h>
#include <sys/types.h> #include <sys/types.h>
#include "config.h" #include "config.h"
#include "util.h" #include "util.h"
typedef struct { typedef struct {
const char *const icon;
const char *const command; const char *const command;
const unsigned int interval; const unsigned int interval;
const int signal; const int signal;
@ -19,11 +18,12 @@ typedef struct {
pid_t fork_pid; pid_t fork_pid;
} block; } block;
block block_new(const char *const icon, const char *const command, block block_new(const char *const command, const unsigned int interval,
const unsigned int interval, const int signal); const int signal);
int block_init(block *const block); 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

View file

@ -7,6 +7,7 @@ typedef struct {
bool is_debug_mode; bool is_debug_mode;
} cli_arguments; } cli_arguments;
cli_arguments cli_parse_arguments(const char* const argv[], const int argc); int cli_init(cli_arguments* const args, const char* const argv[],
const int argc);
#endif // CLI_H #endif // CLI_H

View file

@ -1,7 +1,7 @@
#ifndef SIGNAL_HANDLER_H #ifndef SIGNAL_HANDLER_H
#define SIGNAL_HANDLER_H #define SIGNAL_HANDLER_H
#include <signal.h> #include <bits/types/sigset_t.h>
#include "block.h" #include "block.h"
#include "timer.h" #include "timer.h"

View file

@ -2,7 +2,6 @@
#define TIMER_H #define TIMER_H
#include <signal.h> #include <signal.h>
#include <stdbool.h>
#include "block.h" #include "block.h"
@ -16,6 +15,5 @@ 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

View file

@ -1,8 +1,8 @@
#ifndef WATCHER_H #ifndef WATCHER_H
#define WATCHER_H #define WATCHER_H
#include <poll.h>
#include <stdbool.h> #include <stdbool.h>
#include <sys/poll.h>
#include "block.h" #include "block.h"
#include "main.h" #include "main.h"

View file

@ -1,8 +1,9 @@
#include "block.h" #include "block.h"
#include <bits/stdint-uintn.h>
#include <bits/types/FILE.h>
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -13,10 +14,9 @@
#include "config.h" #include "config.h"
#include "util.h" #include "util.h"
block block_new(const char *const icon, const char *const command, block block_new(const char *const command, const unsigned int interval,
const unsigned int interval, const int signal) { const int signal) {
block block = { block block = {
.icon = icon,
.command = command, .command = command,
.interval = interval, .interval = interval,
.signal = signal, .signal = signal,
@ -145,3 +145,15 @@ 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;
}

View file

@ -1,33 +1,30 @@
#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>
cli_arguments cli_parse_arguments(const char* const argv[], const int argc) { int cli_init(cli_arguments *const args, const char *const argv[],
errno = 0; const int argc) {
cli_arguments args = { args->is_debug_mode = false;
.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 'h':
// fall through
case '?': case '?':
(void)fprintf(stderr, "error: unknown option `-%c'\n", optopt); (void)fprintf(stderr, "error: unknown option `-%c'\n", optopt);
// fall through // fall through
case 'h':
// fall through
default: default:
(void)fprintf(stderr, "usage: %s [-d]\n", BINARY); (void)fprintf(stderr, "usage: %s [-d]\n", BINARY);
errno = 1; return 1;
} }
} }
return args; return 0;
} }

View file

@ -1,6 +1,5 @@
#include "main.h" #include "main.h"
#include <errno.h>
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
@ -39,10 +38,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 timer *const timer) { const unsigned int time) {
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 (!timer_must_run_block(timer, block)) { if (!block_must_run(block, time)) {
continue; continue;
} }
@ -56,7 +55,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) != 0) { if (execute_blocks(blocks, block_count, timer->time) != 0) {
return 1; return 1;
} }
@ -69,7 +68,7 @@ static int trigger_event(block *const blocks, const unsigned short block_count,
static int refresh_callback(block *const blocks, static int refresh_callback(block *const blocks,
const unsigned short block_count) { const unsigned short block_count) {
if (execute_blocks(blocks, block_count, NULL) != 0) { if (execute_blocks(blocks, block_count, 0) != 0) {
return 1; return 1;
} }
@ -118,8 +117,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[]) {
const cli_arguments cli_args = cli_parse_arguments(argv, argc); cli_arguments cli_args;
if (errno != 0) { if (cli_init(&cli_args, argv, argc) != 0) {
return 1; return 1;
} }
@ -128,8 +127,7 @@ int main(const int argc, const char *const argv[]) {
return 1; return 1;
} }
#define BLOCK(icon, command, interval, signal) \ #define BLOCK(command, interval, signal) block_new(command, interval, signal),
block_new(icon, command, interval, signal),
block blocks[BLOCK_COUNT] = {BLOCKS(BLOCK)}; block blocks[BLOCK_COUNT] = {BLOCKS(BLOCK)};
#undef BLOCK #undef BLOCK
const unsigned short block_count = LEN(blocks); const unsigned short block_count = LEN(blocks);

View file

@ -1,7 +1,8 @@
#include "signal-handler.h" #include "signal-handler.h"
#include <bits/stdint-uintn.h>
#include <bits/types/sigset_t.h>
#include <signal.h> #include <signal.h>
#include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <sys/signalfd.h> #include <sys/signalfd.h>
#include <sys/types.h> #include <sys/types.h>
@ -109,8 +110,6 @@ int signal_handler_process(signal_handler *const handler, timer *const timer) {
// fall through // fall through
case SIGINT: case SIGINT:
return 1; return 1;
default:
break;
} }
for (unsigned short i = 0; i < handler->block_count; ++i) { for (unsigned short i = 0; i < handler->block_count; ++i) {

View file

@ -49,7 +49,6 @@ bool status_update(status *const status) {
} }
#endif #endif
(void)strncat(status->current, block->icon, LEN(block->output));
(void)strncat(status->current, block->output, LEN(block->output)); (void)strncat(status->current, block->output, LEN(block->output));
} }
} }

View file

@ -1,7 +1,6 @@
#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>
@ -33,12 +32,10 @@ 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 = reset_value, // Initial value to execute all blocks. .time = 0,
.tick = compute_tick(blocks, block_count), .tick = compute_tick(blocks, block_count),
.reset_value = reset_value, .reset_value = compute_reset_value(blocks, block_count),
}; };
return timer; return timer;
@ -54,19 +51,7 @@ 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; timer->time = (timer->time + timer->tick) % timer->reset_value + 1;
return 0; return 0;
} }
bool timer_must_run_block(const timer *const timer, const block *const block) {
if (timer == NULL || timer->time == timer->reset_value) {
return true;
}
if (block->interval == 0) {
return false;
}
return timer->time % block->interval == 0;
}

View file

@ -1,9 +1,9 @@
#include "watcher.h" #include "watcher.h"
#include <errno.h> #include <errno.h>
#include <poll.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include <sys/poll.h>
#include "block.h" #include "block.h"
#include "util.h" #include "util.h"

11
wp.sh
View file

@ -1,11 +0,0 @@
#!/bin/sh
vol=$(echo "$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk -F' ' '{print $2}') * 100" | bc)
status=$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | grep -q "[MUTED]")
if wpctl get-volume @DEFAULT_AUDIO_SINK@| grep -q "[MUTED]"; then
echo "mut": $vol%
exit
fi
echo vol: $vol%