]> git.sur5r.net Git - i3/i3status/commitdiff
Add support for xmobar
authorMichael Stapelberg <michael@stapelberg.de>
Tue, 18 Aug 2009 19:29:44 +0000 (21:29 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Tue, 18 Aug 2009 19:29:44 +0000 (21:29 +0200)
Use i3status-xmobar | xmobar -o -t "%StdinReader%" -c "[Run StdinReader]"
You might need to copy the default configuration to ~/.xmobarrc

Makefile
debian/rules
i3status.c
i3status.h
src/config.c
src/get_wireless_info.c
src/output.c

index 24c829785e8c265cd7de236f4d1924bfbeb4cc8a..751d5af278db75781edef8ddb4321d6a37213b23 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -13,7 +13,7 @@ CFLAGS+=-D_GNU_SOURCE
 endif
 
 # Define this if you want i3status to spit out dzen2-compatible output on stdout
-CFLAGS+=-DDZEN
+#CFLAGS+=-DDZEN
 CFLAGS+=$(EXTRA_CFLAGS)
 
 src/%.o: src/%.c
index 88430644d52ee3051526cd5b83eada7779ac2970..3543851d8c6e5e4d93ae7b36d17da5d5f7222dc6 100755 (executable)
@@ -16,6 +16,10 @@ build-stamp:
        # Build with wmii support
        $(MAKE)
        cp $(CURDIR)/i3status $(CURDIR)/i3status-wmii
+       # Build with xmobar support
+       $(MAKE) distclean
+       $(MAKE) EXTRA_CFLAGS="-DXMOBAR"
+       cp $(CURDIR)/i3status $(CURDIR)/i3status-xmobar
        # Build with dzen support
        $(MAKE) distclean
        $(MAKE) EXTRA_CFLAGS="-DDZEN"
@@ -36,6 +40,7 @@ install: build
        dh_installdirs
        $(MAKE) DESTDIR=$(CURDIR)/debian/i3status/ install
        install -m 755 $(CURDIR)/i3status-wmii $(CURDIR)/debian/i3status/usr/bin/i3status-wmii
+       install -m 755 $(CURDIR)/i3status-xmobar $(CURDIR)/debian/i3status/usr/bin/i3status-xmobar
        dh_link usr/share/man/man1/i3status.1 usr/share/man/man1/i3status-wmii.1
 
 # Build architecture-independent files here.
index 909fa4f1d84a32eec60193045c6ce569b83a88ba..04fa57f8ef53e0382a98c6f3635695b2f1171639 100644 (file)
@@ -136,10 +136,10 @@ int main(int argc, char *argv[]) {
                                 for (i = 0; i < num_run_watches; i += 2) {
                                         bool running = process_runs(run_watches[i+1]);
                                         if (use_colors)
-                                                snprintf(part, sizeof(part), "%s%s: %s",
+                                                snprintf(part, sizeof(part), "%s%s: %s%s",
                                                         (running ? color("#00FF00") : color("#FF0000")),
                                                         run_watches[i],
-                                                        (running ? "yes" : "no"));
+                                                        (running ? "yes" : "no"), endcolor());
                                         else snprintf(part, sizeof(part), "%s: %s", run_watches[i], (running ? "yes" : "no"));
                                         snprintf(pathbuf, sizeof(pathbuf), "%d%s", order[ORDER_RUN], run_watches[i]);
                                         write_to_statusbar(pathbuf, part, false);
index 0eb9ce1293d5646cb60fcfe1b4f903039b5a28bf..73221a50c9fba114c1ddee6af7da795f9df008fc 100644 (file)
@@ -5,7 +5,11 @@
 
 #include "queue.h"
 
-#define BAR "^fg(#333333)^p(5;-2)^ro(2)^p()^fg()^p(5)"
+#ifdef DZEN
+       #define BAR "^fg(#333333)^p(5;-2)^ro(2)^p()^fg()^p(5)"
+#elif XMOBAR
+       #define BAR "<fc=#333333> | </fc>"
+#endif
 #define BEGINS_WITH(haystack, needle) (strncmp(haystack, needle, strlen(needle)) == 0)
 #define max(a, b) (a > b ? a : b)
 
@@ -55,6 +59,7 @@ bool slurp(char *filename, char *destination, int size);
 /* src/output.c */
 void write_error_to_statusbar(const char *message);
 char *color(const char *colorstr);
+char *endcolor() __attribute__ ((pure));
 void cleanup_rbar_dir();
 
 /* src/config.c */
index 2d9d6b67d5118b5233b2881b514ecd9ccdfa4507..19c03e996c568ca3014d8f86782b71cb01da9942 100644 (file)
@@ -4,6 +4,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <ctype.h>
+#include <glob.h>
 
 #include "i3status.h"
 
@@ -80,7 +81,7 @@ int load_configuration(const char *configfile) {
                         interval = atoi(dest_value);
                 OPT("wmii_path")
                 {
-#ifndef DZEN
+#if !defined(DZEN) && !defined(XMOBAR)
                         static glob_t globbuf;
                         struct stat stbuf;
                         if (glob(dest_value, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0)
@@ -139,7 +140,7 @@ int load_configuration(const char *configfile) {
         }
         fclose(handle);
 
-#ifndef DZEN
+#if !defined(DZEN) && !defined(XMOBAR)
         if (wmii_path == NULL)
                 exit(EXIT_FAILURE);
 #endif
index c257f5634e17f47e88c170db8dcd7df99437bf58..529ba71a44e2d242c9df7f6e2a0149f4105c5608 100644 (file)
@@ -34,10 +34,10 @@ const char *get_wireless_info() {
                         continue;
                 if ((quality == UCHAR_MAX) || (quality == 0)) {
                         if (use_colors)
-                                (void)snprintf(part, sizeof(part), "%sW: down", color("#FF0000"));
+                                (void)snprintf(part, sizeof(part), "%sW: down%s", color("#FF0000"), endcolor());
                         else (void)snprintf(part, sizeof(part), "W: down");
-                } else (void)snprintf(part, sizeof(part), "%sW: (%03d%%) %s",
-                                color("#00FF00"), quality, get_ip_addr(wlan_interface));
+                } else (void)snprintf(part, sizeof(part), "%sW: (%03d%%) %s%s",
+                                color("#00FF00"), quality, get_ip_addr(wlan_interface), endcolor());
                 return part;
         }
 
index 901a940be04bc40648e81c33550ee027c33562bd..c153a01126dcf69ce0dc92a56c4f47090f9eeb7f 100644 (file)
@@ -28,18 +28,32 @@ char *color(const char *colorstr) {
         static char colorbuf[32];
 #ifdef DZEN
         (void)snprintf(colorbuf, sizeof(colorbuf), "^fg(%s)", colorstr);
+#elif XMOBAR
+        (void)snprintf(colorbuf, sizeof(colorbuf), "<fc=%s>", colorstr);
 #else
         (void)snprintf(colorbuf, sizeof(colorbuf), "%s %s ", colorstr, wmii_normcolors);
 #endif
         return colorbuf;
 }
 
+/*
+ * Some color formats (xmobar) require to terminate colors again
+ *
+ */
+char *endcolor() {
+#ifdef XMOBAR
+        return "</fc>";
+#else
+        return "";
+#endif
+}
+
 /*
  * Cleans wmii's /rbar directory by deleting all regular files
  *
  */
 void cleanup_rbar_dir() {
-#ifdef DZEN
+#if defined(DZEN) || defined(XMOBAR)
         return;
 #endif
         struct dirent *ent;
@@ -66,7 +80,7 @@ void cleanup_rbar_dir() {
  *
  */
 void create_file(const char *name) {
-#ifdef DZEN
+#if defined(DZEN) || defined(XMOBAR)
         return;
 #endif
         char pathbuf[strlen(wmii_path)+256+1];
@@ -99,7 +113,7 @@ void setup(void) {
         unsigned int i;
         char pathbuf[512];
 
-#ifndef DZEN
+#if !defined(DZEN) && !defined(XMOBAR)
         struct stat statbuf;
         /* Wait until wmii_path/rbar exists */
         for (; stat(wmii_path, &statbuf) < 0; sleep(interval));
@@ -142,6 +156,22 @@ void write_to_statusbar(const char *name, const char *message, bool final_entry)
                 exit(1);
         }
         return;
+#elif XMOBAR
+        if (final_entry) {
+                if (printf("%s\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];