Browse Source

Add clean status_surface. cmd syntax: "w;h;bg <statusline>"

Martin Duquesnoy 12 years ago
parent
commit
ff269f01b3
8 changed files with 73 additions and 3 deletions
  1. 2 1
      src/config.h
  2. 2 0
      src/event.c
  3. 1 1
      src/mouse.c
  4. 62 0
      src/status.c
  5. 2 0
      src/status.h
  6. 1 1
      src/util.c
  7. 1 0
      src/wmfs.c
  8. 2 0
      src/wmfs.h

+ 2 - 1
src/config.h

@@ -83,7 +83,8 @@ static const struct { char *name; void (*func)(Uicb cmd); } uicb_list[] =
      { "client_tab_next_opened",  uicb_client_tab_next_opened },
 
      /* Status */
-     { "status" , uicb_status },
+     { "status" ,        uicb_status },
+     { "status_surface", uicb_status_surface },
 
      /* Mouse */
      { "mouse_resize", uicb_mouse_resize },

+ 2 - 0
src/event.c

@@ -29,6 +29,7 @@ event_buttonpress(XEvent *e)
      struct barwin *b;
 
      screen_update_sel();
+     status_flush_surface();
 
      SLIST_FOREACH(b, &W->h.barwin, next)
           if(b->win == ev->window)
@@ -325,6 +326,7 @@ event_keypress(XEvent *e)
      struct keybind *k;
 
      screen_update_sel();
+     status_flush_surface();
 
      SLIST_FOREACH(k, &W->h.keybind, next)
           if(k->keysym == keysym && KEYPRESS_MASK(k->mod) == KEYPRESS_MASK(ev->state))

+ 1 - 1
src/mouse.c

@@ -26,7 +26,7 @@ mouse_resize(struct client *c)
      int d, u, ox, oy, ix, iy;
      int mx, my;
 
-     XQueryPointer(W->dpy, W->root, &w, &w, &ox, &oy, &d, &d, (uint *)&u);
+     XQueryPointer(W->dpy, W->root, &w, &w, &ox, &oy, &d, &d, (unsigned int *)&u);
      XGrabServer(W->dpy);
 
      if(c->flags & CLIENT_FREE)

+ 62 - 0
src/status.c

@@ -528,6 +528,68 @@ status_manage(struct status_ctx *ctx)
      status_copy_mousebind(ctx);
 }
 
+void
+status_flush_surface(void)
+{
+     struct barwin *b;
+
+     while(!SLIST_EMPTY(&W->h.vbarwin))
+     {
+          b = SLIST_FIRST(&W->h.vbarwin);
+          SLIST_REMOVE_HEAD(&W->h.vbarwin, vnext);
+          barwin_remove(b);
+     }
+}
+
+static void
+status_surface(int w, int h, Color bg, char *status)
+{
+     struct barwin *b;
+     struct status_ctx ctx;
+     int d, x, y;
+
+     if(!status)
+          return;
+
+     XQueryPointer(W->dpy, W->root, (Window*)&d, (Window*)&d, &x, &y, &d, &d, (unsigned int *)&d);
+
+     b = barwin_new(W->root, x, y, w, h, 0, bg, false);
+     barwin_map(b);
+
+     ctx = status_new_ctx(b, SLIST_FIRST(&W->h.theme));
+     ctx.status = xstrdup(status);
+
+     SLIST_INSERT_HEAD(&W->h.vbarwin, b, vnext);
+
+     status_manage(&ctx);
+     status_free_ctx(&ctx);
+}
+
+void
+uicb_status_surface(Uicb cmd)
+{
+     char *p, *ccmd = xstrdup(cmd);
+     int w, h;
+     Color bg;
+
+     if(!ccmd || !(p = strchr(ccmd, ' ')))
+          return;
+
+     if(sscanf(ccmd, "%d,%d,#%x", &w, &h, &bg) != 3
+        || !w || !h)
+     {
+          free(ccmd);
+          return;
+     }
+
+     *p = '\0';
+     ++p;
+
+     status_surface(w, h, bg, p);
+
+     free(ccmd);
+}
+
 /* Syntax: "<infobar name> <status string>" */
 void
 uicb_status(Uicb cmd)

+ 2 - 0
src/status.h

@@ -16,6 +16,8 @@ void status_copy_mousebind(struct status_ctx *ctx);
 void status_parse(struct status_ctx *ctx);
 void status_render(struct status_ctx *ctx);
 void status_manage(struct status_ctx *ctx);
+void status_flush_surface(void);
 void uicb_status(Uicb cmd);
+void uicb_status_surface(Uicb cmd);
 
 #endif /* STATUS_H */

+ 1 - 1
src/util.c

@@ -149,7 +149,7 @@ parse_args(char *str, char delim, char end, int narg, char *args[])
      int i = 0;
 
      for(args[0] = str; *str && (*str != end || *(str - 1) == '\\') && i < narg; ++str)
-          if(*str == delim)
+          if(*str == delim && i < narg - 1)
           {
                *str = '\0';
                args[++i] = ++str;

+ 1 - 0
src/wmfs.c

@@ -160,6 +160,7 @@ wmfs_xinit(void)
       * Barwin linked list
       */
      SLIST_INIT(&W->h.barwin);
+     SLIST_INIT(&W->h.vbarwin);
 
      /*
       * Optional dep init

+ 2 - 0
src/wmfs.h

@@ -95,6 +95,7 @@ struct barwin
      SLIST_HEAD(, mousebind) statusmousebinds;
      SLIST_ENTRY(barwin) next;  /* global barwin */
      SLIST_ENTRY(barwin) enext; /* element barwin */
+     SLIST_ENTRY(barwin) vnext; /* volatile barwin */
 };
 
 struct status_seq
@@ -363,6 +364,7 @@ struct wmfs
           SLIST_HEAD(, rule) rule;
           SLIST_HEAD(, mousebind) mousebind;
           SLIST_HEAD(, launcher) launcher;
+          SLIST_HEAD(, barwin) vbarwin;
      } h;
 
      /*