]> code.delx.au - spectrwm/commitdiff
Add baraction script for batter and stuff.
authorMarco Peereboom <marco@conformal.com>
Thu, 22 Jan 2009 17:50:16 +0000 (17:50 +0000)
committerMarco Peereboom <marco@conformal.com>
Thu, 22 Jan 2009 17:50:16 +0000 (17:50 +0000)
bad mcbride broke colors in config file; need to go fix that now.

baraction.sh [new file with mode: 0644]
scrotwm.c
scrotwm.conf

diff --git a/baraction.sh b/baraction.sh
new file mode 100644 (file)
index 0000000..35b4a88
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+while :; do echo "battery" `apm -l` "%"; sleep 1; done
index 8b59687522a9133b01b38d6ef7b6aa630eaec0f2..116b81b0157c2fb6c5ef62b185beefdbb311c0a6 100644 (file)
--- a/scrotwm.c
+++ b/scrotwm.c
@@ -54,6 +54,7 @@
 #include <stdlib.h>
 #include <err.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <locale.h>
 #include <unistd.h>
 #include <time.h>
@@ -141,10 +142,16 @@ int                       cycle_visible = 0;
 double                 dialog_ratio = .6;
 /* status bar */
 #define SWM_BAR_MAX    (128)
+char                   *bar_argv[] = { NULL, NULL };
+int                    bar_pipe[2];
+char                   bar_ext[SWM_BAR_MAX];
 sig_atomic_t           bar_alarm = 0;
 int                    bar_enabled = 1;
+int                    bar_extra = 1;
+int                    bar_extra_running = 0;
 int                    bar_verbose = 1;
 int                    bar_height = 0;
+pid_t                  bar_pid;
 GC                     bar_gc;
 XGCValues              bar_gcv;
 int                    bar_fidx = 0;
@@ -155,12 +162,10 @@ char                      *bar_fonts[] = {
                            NULL
 };
 
-       
-
 /* terminal + args */
-char                           *spawn_term[] = { "xterm", NULL };
-char                           *spawn_menu[] = { "dmenu_run", "-fn", NULL,
-                                   "-nb", NULL, "-nf", NULL, "-sb", NULL, "-sf", NULL, NULL };
+char                   *spawn_term[] = { "xterm", NULL };
+char                   *spawn_menu[] = { "dmenu_run", "-fn", NULL,
+                           "-nb", NULL, "-nf", NULL, "-sb", NULL, "-sf", NULL, NULL };
 
 #define SWM_MENU_FN    (2)
 #define SWM_MENU_NB    (4)
@@ -245,7 +250,6 @@ struct workspace {
        } l_state;
 };
 
-
 enum   { SWM_S_COLOR_BAR, SWM_S_COLOR_BAR_BORDER, SWM_S_COLOR_BAR_FONT,
          SWM_S_COLOR_FOCUS, SWM_S_COLOR_UNFOCUS, SWM_S_COLOR_MAX };
 
@@ -406,6 +410,8 @@ conf_load(char *filename)
                                setscreencolor(var, i, SWM_S_COLOR_BAR_FONT);
                        else if (!strncmp(var, "bar_font", strlen("bar_font")))
                                asprintf(&bar_fonts[0], "%s", val);
+                       else if (!strncmp(var, "bar_action", strlen("bar_action")))
+                               asprintf(&bar_argv[0], "%s", val);
                        else
                                goto bad;
                        break;
@@ -450,6 +456,18 @@ bad:
        errx(1, "invalid conf file entry: %s=%s", var, val);
 }
 
+void
+socket_setnonblock(int fd)
+{
+       int                     flags;
+
+       if ((flags = fcntl(fd, F_GETFL, 0)) == -1)
+               err(1, "fcntl F_GETFL");
+       flags |= O_NONBLOCK;
+       if ((flags = fcntl(fd, F_SETFL, flags)) == -1)
+               err(1, "fcntl F_SETFL");
+}
+
 void
 bar_print(struct swm_region *r, char *s)
 {
@@ -459,6 +477,21 @@ bar_print(struct swm_region *r, char *s)
            strlen(s));
 }
 
+void
+bar_extra_stop(void)
+{
+       if (bar_pipe[0]) {
+               close(bar_pipe[0]);
+               bzero(bar_pipe, sizeof bar_pipe);
+       }
+       if (bar_pid) {
+               kill(bar_pid, SIGTERM);
+               bar_pid = 0;
+       }
+       strlcpy(bar_ext, "", sizeof bar_ext);
+       bar_extra = 0;
+}
+
 void
 bar_update(void)
 {
@@ -466,24 +499,42 @@ bar_update(void)
        struct tm               tm;
        struct swm_region       *r;
        int                     i, x;
+       size_t                  len;
        char                    s[SWM_BAR_MAX];
-       char                    e[SWM_BAR_MAX];
+       char                    loc[SWM_BAR_MAX];
+       char                    *b;
+
        if (bar_enabled == 0)
                return;
 
+       if (bar_extra && bar_extra_running) {
+               /* ignore short reads; it'll correct itself */
+               while ((b = fgetln(stdin, &len)) != NULL)
+                       if (b && b[len - 1] == '\n') {
+                               b[len - 1] = '\0';
+                               strlcpy(bar_ext, b, sizeof bar_ext);
+                       }
+               if (b == NULL && errno != EAGAIN) {
+                       fprintf(stderr, "bar_extra failed: errno: %d %s\n",
+                           errno, strerror(errno));
+                       bar_extra_stop();
+               }
+       } else
+               strlcpy(bar_ext, "", sizeof bar_ext);
+
        time(&tmt);
        localtime_r(&tmt, &tm);
        strftime(s, sizeof s, "%a %b %d %R %Z %Y", &tm);
        for (i = 0; i < ScreenCount(display); i++) {
                x = 1;
                TAILQ_FOREACH(r, &screens[i].rl, entry) {
-                       snprintf(e, sizeof e, "%s     %d:%d",
-                           s, x++, r->ws->idx + 1);
-                       bar_print(r, e);
+                       snprintf(loc, sizeof loc, "%s     %d:%d    %s",
+                           s, x++, r->ws->idx + 1, bar_ext);
+                       bar_print(r, loc);
                }
        }
        XSync(display, False);
+
        alarm(60);
 }
 
@@ -523,6 +574,55 @@ bar_toggle(struct swm_region *r, union arg *args)
                        bar_update();
 }
 
+void
+bar_refresh(void)
+{
+       XSetWindowAttributes    wa;
+       struct swm_region       *r;
+       int                     i;
+
+       /* do this here because the conf file is in memory */
+       if (bar_extra && bar_extra_running == 0 && bar_argv[0]) {
+               /* launch external status app */
+               bar_extra_running = 1;
+               if (pipe(bar_pipe) == -1)
+                       err(1, "pipe error");
+               socket_setnonblock(bar_pipe[0]);
+               socket_setnonblock(bar_pipe[1]); /* XXX hmmm, really? */
+               if (dup2(bar_pipe[0], 0) == -1)
+                       errx(1, "dup2");
+               if (dup2(bar_pipe[1], 1) == -1)
+                       errx(1, "dup2");
+               if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
+                       err(1, "could not disable SIGPIPE");
+               switch (bar_pid = fork()) {
+               case -1:
+                       err(1, "cannot fork");
+                       break;
+               case 0: /* child */
+                       close(bar_pipe[0]);
+                       execvp(bar_argv[0], bar_argv);
+                       err(1, "%s external app failed", bar_argv[0]);
+                       break;
+               default: /* parent */
+                       close(bar_pipe[1]);
+                       break;
+               }
+       }
+
+       bzero(&wa, sizeof wa);
+       for (i = 0; i < ScreenCount(display); i++)
+               TAILQ_FOREACH(r, &screens[i].rl, entry) {
+                       wa.border_pixel =
+                           screens[i].c[SWM_S_COLOR_BAR_BORDER].color;
+                       wa.background_pixel =
+                           screens[i].c[SWM_S_COLOR_BAR].color;
+                       XChangeWindowAttributes(display, r->bar_window,
+                           CWBackPixel | CWBorderPixel, &wa);
+               }
+       bar_update();
+}
+
 void
 bar_setup(struct swm_region *r)
 {
@@ -552,27 +652,7 @@ bar_setup(struct swm_region *r)
 
        if (signal(SIGALRM, bar_signal) == SIG_ERR)
                err(1, "could not install bar_signal");
-       bar_update();
-}
-
-void
-bar_refresh(void)
-{
-       XSetWindowAttributes    wa;
-       struct swm_region       *r;
-       int                     i;
-
-       bzero(&wa, sizeof wa);
-       for (i = 0; i < ScreenCount(display); i++)
-               TAILQ_FOREACH(r, &screens[i].rl, entry) {
-                       wa.border_pixel =
-                           screens[i].c[SWM_S_COLOR_BAR_BORDER].color;
-                       wa.background_pixel =
-                           screens[i].c[SWM_S_COLOR_BAR].color;
-                       XChangeWindowAttributes(display, r->bar_window,
-                           CWBackPixel | CWBorderPixel, &wa);
-               }
-       bar_update();
+       bar_refresh();
 }
 
 void
@@ -631,6 +711,8 @@ restart(struct swm_region *r, union arg *args)
        if (signal(SIGALRM, SIG_IGN) == SIG_ERR)
                errx(1, "can't disable alarm");
 
+       bar_extra_stop();
+       bar_extra = 1;
        XCloseDisplay(display);
        execvp(start_argv[0], start_argv);
        fprintf(stderr, "execvp failed\n");
index c4924cfb854c99750b6b115b3efd0776eb2abb9e..c00807f82b95714b445cee4a7140c052c6d95f09 100644 (file)
@@ -8,6 +8,7 @@ bar_border[1]           = rgb:00/80/80
 bar_color[1]           = black
 bar_font_color[1]      = rgb:a0/a0/a0
 bar_font               = -*-terminus-*-*-*-*-*-*-*-*-*-*-*-*
+#bar_action            = "./baraction.sh"
 
 # spawn app
 spawn_term             = xterm