Added function to search for windows master
authorGabriel Pérez-Cerezo <gabriel@gpcf.eu>
Sat, 21 Jan 2017 16:10:52 +0000 (17:10 +0100)
committerGabriel Pérez-Cerezo <gabriel@gpcf.eu>
Sat, 21 Jan 2017 16:10:52 +0000 (17:10 +0100)
config.def.h
dwm.c

index e579160..3c378ab 100644 (file)
@@ -146,6 +146,7 @@ static Command commands[] = {
        { "focusmon-",       focusmon,       {.i = -1} },
        { "tagmon+",         tagmon,         {.i = +1} },
        { "tagmon-",         tagmon,         {.i = -1} },
+       { "search",          search,         {-1}},
        { "view1",           view,           {.ui = 1 << 0} },
        { "view2",           view,           {.ui = 1 << 1} },
        { "view3",           view,           {.ui = 1 << 2} },
diff --git a/dwm.c b/dwm.c
index ca69939..55aa5e2 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -20,6 +20,7 @@
  *
  * To understand everything else, start reading main().
  */
+#define _GNU_SOURCE
 #include <errno.h>
 #include <fcntl.h>
 #include <locale.h>
@@ -65,6 +66,7 @@
 #define TAGMASK                 ((1 << LENGTH(tags)) - 1)
 #define TEXTW(X)                (textnw(X, strlen(X)) + dc.font.height)
 
+
 /* enums */
 enum { CurNormal, CurResize, CurMove, CurLast };        /* cursor */
 enum { ColBorder, ColFG, ColBG, ColLast };              /* color */
@@ -207,6 +209,7 @@ static void enternotify(XEvent *e);
 static Bool evpredicate();
 static void expose(XEvent *e);
 static void findwindow(const Arg *arg);
+static void findwindow_byname(const Arg *arg);
 static void focus(Client *c);
 static void focusin(XEvent *e);
 static void focusmon(const Arg *arg);
@@ -240,6 +243,7 @@ static void resizemouse(const Arg *arg);
 static void restack(Monitor *m);
 static void run(void);
 static void scan(void);
+static void search(Arg* term);
 static Bool sendevent(Client *c, Atom proto);
 static void sendmon(Client *c, Monitor *m);
 static void setclientstate(Client *c, long state);
@@ -543,6 +547,7 @@ cleanup(void) {
        XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
        XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
        close(fifofd);
+       remove(dwmfifo);
 }
 
 void
@@ -785,16 +790,22 @@ dispatchcmd(void)
        int i;
        char buf[BUFSIZ];
        ssize_t n;
-
+       const Arg inv = {-1};
+       Arg x;
        n = read(fifofd, buf, sizeof(buf) - 1);
        if (n == -1)
                die("Failed to read() from DWM fifo %s:", dwmfifo);
        buf[n] = '\0';
        for (i = 0; i < LENGTH(commands); i++) {
-               if (strcmp(commands[i].name, buf) == 0) {
-                       commands[i].func(&commands[i].arg);
-                       break;
-               }
+        if (strncmp(commands[i].name, buf, strlen(commands[i].name)) == 0) {
+          if (commands[i].arg.i == -1) {
+            x.v=buf+strlen(commands[i].name);
+            commands[i].func(&x);
+            break;
+            }
+          commands[i].func(&commands[i].arg);
+          break;
+        }
        }
 }
 
@@ -963,6 +974,36 @@ findwindow (const Arg *arg) {
       }
     }
 }
+void
+findwindow_byname (const Arg *arg) {
+  /* Tries to find a window by title. If it finds one,
+   it displays it. */
+  Arg a;
+  Monitor *m;
+  Client *c;
+  XClassHint ch = { NULL, NULL};
+  FILE *dbg=fopen("/tmp/dwmdebug","w");
+  
+  for (m=mons; m; m = m->next)
+    for (c=m->clients; c; c=c->next) {
+      fprintf(dbg, "'%s' '%s'", c->name, (char*)arg->v);
+      if (!strcmp(c->name,(char*)arg->v)) {
+       a.ui = c->tags;
+       view(&a);
+       unfocus(selmon->sel, True); /* this should focus the right monitor (not tested)*/
+       selmon = m;
+       focus(c);
+       restack(selmon);
+       if(ch.res_class)
+         XFree(ch.res_class);
+       if(ch.res_name)
+         XFree(ch.res_name);
+       return;
+      }
+    }
+  fclose(dbg);
+}
+
 
 void
 focus(Client *c) {
@@ -1222,7 +1263,10 @@ killclient(const Arg *arg) {
 void
 list_clients(const Arg *arg) {
   /* wrapper function */
-  listclients();
+  char* cmd = NULL;
+  asprintf(&cmd, "sort < /tmp/clients | uniq | dmenu | sed s/^/search/g |tr -d '\\n' > %s", dwmfifo);
+  listclients();/* for searching*/
+  system(cmd);
 }
 void
 listclients (void) {
@@ -1233,7 +1277,8 @@ listclients (void) {
   clist = fopen("/tmp/clients", "w");
   for (m=mons; m; m = m->next)
     for (c=m->clients; c; c = c->next)
-      fprintf(clist, "%s %o\n", c->name, c->tags);
+      //      fprintf(clist, "%s %o\n", c->name, c->tags);
+      fprintf(clist, "%s\n", c->name);
   fclose(clist);
 }
 
@@ -1621,6 +1666,14 @@ scan(void) {
        }
 }
 
+void search(Arg *term) {
+  /*search for windows*/
+  FILE *GG= fopen("/tmp/dwm.log", "w");
+  //  fprintf(GG, "TERM: %s", (char*) term->v);
+  fclose(GG);
+  findwindow_byname(term);
+}
+
 void
 sendmon(Client *c, Monitor *m) {
        if(c->mon == m)