Hello.
I made this patch for dwm-5.6.1 (but will work on other versions). I know that 
it is very ugly beucase i added pthread, but works for ma. Please report any 
bugs.

Regards,
Slawek Gonet
Only in dwm-5.6.1: blinking_urgent.patch
Only in dwm-5.6.1: blinking_urgent.patch~
diff -up dwm-5.6.1/dwm.c dwm-5.6.1rc/dwm.c
--- dwm-5.6.1/dwm.c     2009-07-26 15:01:50.000000000 +0200
+++ dwm-5.6.1rc/dwm.c   2009-08-22 22:44:53.796226140 +0200
@@ -36,11 +36,13 @@
 #include <X11/Xlib.h>
 #include <X11/Xproto.h>
 #include <X11/Xutil.h>
+#include <pthread.h>
 #ifdef XINERAMA
 #include <X11/extensions/Xinerama.h>
 #endif /* XINERAMA */
 
 /* macros */
+#define NUM_THREADS             1
 #define BUTTONMASK              (ButtonPressMask|ButtonReleaseMask)
 #define CLEANMASK(mask)         (mask & ~(numlockmask|LockMask))
 #define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= 
(RY) && (Y) < (RY) + (RH))
@@ -266,6 +268,8 @@ static Display *dpy;
 static DC dc;
 static Monitor *mons = NULL, *selmon = NULL;
 static Window root;
+int blinkurgent = True;
+int redraw_needed = False;
 
 /* configuration, allows nested code to access above variables */
 #include "config.h"
@@ -496,10 +500,28 @@ cleanupmons(void) {
 }
 
 void
+*blinktoggle(void *threadid) {
+  int temp = 1;
+  long tid;
+  tid = (long)threadid;
+  unsigned int sec;
+  sec = 1;
+  while(temp == 1) {
+     blinkurgent = !blinkurgent;
+     if(redraw_needed) drawbars();
+     sleep(sec);
+  }
+  pthread_exit(NULL);
+}
+
+
+void
 clearurgent(Client *c) {
        XWMHints *wmh;
 
        c->isurgent = False;
+       blinkurgent = False;
+       redraw_needed = False;
        if(!(wmh = XGetWMHints(dpy, c->win)))
                return;
        wmh->flags &= ~XUrgencyHint;
@@ -657,8 +679,8 @@ drawbar(Monitor *m) {
                if(ISVISIBLE(c))
                        n++;
                occ |= c->tags;
-               if(c->isurgent)
-                       urg |= c->tags;
+               if(c->isurgent && blinkurgent)
+                          urg |= c->tags;
        }
        dc.x = 0;
        for(i = 0; i < LENGTH(tags); i++) {
@@ -1847,6 +1869,12 @@ updatewmhints(Client *c) {
                }
                else
                        c->isurgent = (wmh->flags & XUrgencyHint) ? True : 
False;
+               if(c->isurgent) {
+                 redraw_needed = True;
+               }
+               else {
+                 redraw_needed = False;
+               }
                XFree(wmh);
        }
 }
@@ -1941,7 +1969,8 @@ zoom(const Arg *arg) {
 
 int
 main(int argc, char *argv[]) {
-       if(argc == 2 && !strcmp("-v", argv[1]))
+        XInitThreads();
+        if(argc == 2 && !strcmp("-v", argv[1]))
                die("dwm-"VERSION", © 2006-2009 dwm engineers, see LICENSE for 
details\n");
        else if(argc != 1)
                die("usage: dwm [-v]\n");
@@ -1949,11 +1978,24 @@ main(int argc, char *argv[]) {
                fputs("warning: no locale support\n", stderr);
        if(!(dpy = XOpenDisplay(NULL)))
                die("dwm: cannot open display\n");
+
+       pthread_t threads[NUM_THREADS];
+       int rc;
+       long t;
+       for(t=0; t<NUM_THREADS; t++){
+         printf("In main: creating thread %ld\n", t);
+         rc = pthread_create(&threads[0], NULL, blinktoggle, (void *)t);
+         if (rc){
+           printf("ERROR; return code from pthread_create() is %d\n", rc);
+           exit(-1);
+         }
+       }       
        checkotherwm();
        setup();
        scan();
        run();
        cleanup();
        XCloseDisplay(dpy);
+       pthread_exit(NULL);
        return 0;
 }
diff -up dwm-5.6.1/Makefile dwm-5.6.1rc/Makefile
--- dwm-5.6.1/Makefile  2009-07-26 15:01:50.000000000 +0200
+++ dwm-5.6.1rc/Makefile        2009-08-22 22:42:36.038242547 +0200
@@ -5,6 +5,7 @@ include config.mk
 
 SRC = dwm.c
 OBJ = ${SRC:.c=.o}
+LDFLAGS += "-lpthread"
 
 all: options dwm
 

Attachment: pgpPpO9qa6rz3.pgp
Description: PGP signature

Reply via email to