diff options
Diffstat (limited to 'src/output.c')
-rw-r--r-- | src/output.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/output.c b/src/output.c new file mode 100644 index 0000000..379710e --- /dev/null +++ b/src/output.c @@ -0,0 +1,157 @@ +#include <stdbool.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <fcntl.h> +#include <dirent.h> + +#include "i3status.h" + +/* + * Writes an errormessage to statusbar + * + */ +void write_error_to_statusbar(const char *message) { + cleanup_rbar_dir(); + create_file("error"); + write_to_statusbar("error", message, true); +} + +/* + * Returns the correct color format for dzen (^fg(color)) or wmii (color <normcolors>) + * + */ +char *color(const char *colorstr) { + static char colorbuf[32]; +#ifdef DZEN + (void)snprintf(colorbuf, sizeof(colorbuf), "^fg(%s)", colorstr); +#else + (void)snprintf(colorbuf, sizeof(colorbuf), "%s %s ", colorstr, wmii_normcolors); +#endif + return colorbuf; +} + +/* + * Cleans wmii's /rbar directory by deleting all regular files + * + */ +void cleanup_rbar_dir() { +#ifdef DZEN + return; +#endif + struct dirent *ent; + DIR *dir; + char pathbuf[strlen(wmii_path)+256+1]; + + if ((dir = opendir(wmii_path)) == NULL) + exit(EXIT_FAILURE); + + while ((ent = readdir(dir)) != NULL) { + if (ent->d_type == DT_REG) { + (void)snprintf(pathbuf, sizeof(pathbuf), "%s%s", wmii_path, ent->d_name); + if (unlink(pathbuf) == -1) + exit(EXIT_FAILURE); + } + } + + (void)closedir(dir); +} + +/* + * Creates the specified file in wmii's /rbar directory with + * correct modes and initializes colors if colormode is enabled + * + */ +void create_file(const char *name) { +#ifdef DZEN + return; +#endif + char pathbuf[strlen(wmii_path)+256+1]; + int fd; + int flags = O_CREAT | O_WRONLY; + struct stat statbuf; + + (void)snprintf(pathbuf, sizeof(pathbuf), "%s%s", wmii_path, name); + + /* Overwrite file's contents if it exists */ + if (stat(pathbuf, &statbuf) >= 0) + flags |= O_TRUNC; + + if ((fd = open(pathbuf, flags, S_IRUSR | S_IWUSR)) < 0) + exit(EXIT_FAILURE); + if (use_colors) { + char *tmp = color("#888888"); + if (write(fd, tmp, strlen(tmp)) != (ssize_t)strlen(tmp)) + exit(EXIT_FAILURE); + } + (void)close(fd); +} + +/* + * Waits until wmii_path/rbar exists (= the filesystem gets mounted), + * cleans up all files and creates the needed files + * + */ +void setup(void) { + unsigned int i; + char pathbuf[512]; + +#ifndef DZEN + struct stat statbuf; + /* Wait until wmii_path/rbar exists */ + for (; stat(wmii_path, &statbuf) < 0; sleep(interval)); +#endif + + cleanup_rbar_dir(); + if (wlan_interface) + create_file(concat(order[ORDER_WLAN],"wlan")); + if (eth_interface) + create_file(concat(order[ORDER_ETH],"eth")); + if (get_cpu_temperature) + create_file(concat(order[ORDER_CPU_TEMPERATURE], "cpu_temperature")); + create_file(concat(order[ORDER_LOAD],"load")); + if (time_format) + create_file(concat(order[ORDER_TIME],"time")); + for (i = 0; i < num_run_watches; i += 2) { + snprintf(pathbuf, sizeof(pathbuf), "%s%s", order[ORDER_RUN], run_watches[i]); + create_file(pathbuf); + } +} + +/* + * Writes the given message in the corresponding file in wmii's /rbar directory + * + */ +void write_to_statusbar(const char *name, const char *message, bool final_entry) { +#ifdef DZEN + if (final_entry) { + if (printf("%s^p(6)\n", message) < 0) { + perror("printf"); + exit(1); + } + + fflush(stdout); + return; + } + if (printf("%s" BAR, message) < 0) { + perror("printf"); + exit(1); + } + return; +#endif + + char pathbuf[strlen(wmii_path)+256+1]; + int fd; + + (void)snprintf(pathbuf, sizeof(pathbuf), "%s%s", wmii_path, name); + if ((fd = open(pathbuf, O_RDWR)) == -1) { + /* Try to re-setup stuff and just continue */ + setup(); + return; + } + if (write(fd, message, strlen(message)) != (ssize_t)strlen(message)) + exit(EXIT_FAILURE); + (void)close(fd); +} |