Aw I was so close on the urgent patch, just missed the Arg ptr.
Here's a working version:

        { MODKEY, XK_u, focusurgent, {0} },

void
focusurgent(Arg *x) {
        for(c = stack; c && !(c->isurgent); c = c->snext);
        if(sel && sel != c) {
                grabbuttons(sel, False);
                XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
        }
        if(c) {
                Arg a;
                a.ui=c->tags;
                view(&a);
                clearurgent(c);
                detachstack(c);
                attachstack(c);
                grabbuttons(c, True);
                XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
                XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
        }
        else
                XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
        sel = c;
        drawbar();
}

On Thu 23 Apr 2009 - 10:10PM, Guillaume Quintin wrote:
> For the multihead, you can try my patch (even if it is not really the  
> same than having floating windows on the second screen)
>
> Basically, my patch stores all the informations on all detected monitors  
> in a table. There are two functions :
>
> win2mon : moves the selected client to the monitor number arg->i. The  
> client becomes floating, and visible on all tags (I find this useful but  
> you can remove it)
>
> win2main : moves the selected client back to the tag arg->ui and make it  
> tiled.
>
> It is up to you to configure your keys in your config.h.
>
>
> For the urgent hint patch I think that you can do the patch on your own,  
> I'll be interested in it. If I have time tomorrow I will give it a try  
> unless someone gives it before.
>
> -- 
> Kind regards
> Guillaume Quintin

> --- dwm.c.orig        2009-04-18 13:49:24.000000000 +0200
> +++ dwm.c     2009-04-20 00:49:20.971772171 +0200
> @@ -127,6 +127,11 @@
>       Bool isfloating;
>  } Rule;
>  
> +/* struct to store other monitors info */
> +typedef struct {
> +     int wx,wy,ww,wh;
> +} Monitor;
> +
>  /* function declarations */
>  static void applyrules(Client *c);
>  static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h);
> @@ -203,6 +208,8 @@
>  static int xerrordummy(Display *dpy, XErrorEvent *ee);
>  static int xerrorstart(Display *dpy, XErrorEvent *ee);
>  static void zoom(const Arg *arg);
> +void win2mon(const Arg *);
> +void win2main(const Arg *);
>  
>  /* variables */
>  static char stext[256];
> @@ -210,6 +217,7 @@
>  static int sx, sy, sw, sh; /* X display screen geometry x, y, width, height 
> */ 
>  static int by, bh, blw;    /* bar geometry y, height and layout symbol width 
> */
>  static int wx, wy, ww, wh; /* window area geometry x, y, width, height, bar 
> excluded */
> +Monitor *monitors;int nb_mon; /* the other monitors */
>  static unsigned int seltags = 0, sellt = 0;
>  static int (*xerrorxlib)(Display *, XErrorEvent *);
>  static unsigned int numlockmask = 0;
> @@ -1501,21 +1509,35 @@
>       int n, i = 0;
>       XineramaScreenInfo *info = NULL;
>  
> +     if ( monitors ) { free(monitors); }
> +
>       /* window area geometry */
> -     if(XineramaIsActive(dpy) && (info = XineramaQueryScreens(dpy, &n))) { 
> -             if(n > 1) {
> -                     int di, x, y;
> -                     unsigned int dui;
> -                     Window dummy;
> -                     if(XQueryPointer(dpy, root, &dummy, &dummy, &x, &y, 
> &di, &di, &dui))
> -                             for(i = 0; i < n; i++)
> -                                     if(INRECT(x, y, info[i].x_org, 
> info[i].y_org, info[i].width, info[i].height))
> -                                             break;
> +     if(XineramaIsActive(dpy) && (info = XineramaQueryScreens(dpy, &n)))
> +     {
> +             nb_mon = n - 1;
> +             monitors = malloc(n * sizeof(Monitor));
> +             if ( !monitors ) { die("Not enough memory for monitors' 
> informations."); }
> +
> +             int di, x, y;
> +             unsigned int dui;
> +             Window dummy;
> +             if(XQueryPointer(dpy, root, &dummy, &dummy, &x, &y, &di, &di, 
> &dui))
> +             {
> +                     for(i = 0; i < n; i++)
> +                     {
> +                             if(INRECT(x, y, info[i].x_org, info[i].y_org, 
> info[i].width, info[i].height))
> +                             {
> +                                     wx = info[i].x_org;
> +                                     wy = showbar && topbar ?  info[i].y_org 
> + bh : info[i].y_org;
> +                                     ww = info[i].width;
> +                                     wh = showbar ? info[i].height - bh : 
> info[i].height;
> +                             }
> +                             monitors[i].wx = info[i].x_org;
> +                             monitors[i].wy = info[i].y_org;
> +                             monitors[i].ww = info[i].width;
> +                             monitors[i].wh = info[i].height;
> +                     }
>               }
> -             wx = info[i].x_org;
> -             wy = showbar && topbar ?  info[i].y_org + bh : info[i].y_org;
> -             ww = info[i].width;
> -             wh = showbar ? info[i].height - bh : info[i].height;
>               XFree(info);
>       }
>       else
> @@ -1682,6 +1704,23 @@
>       arrange();
>  }
>  
> +void win2mon(const Arg *arg)
> +{
> +     if ( arg->i > nb_mon || !sel ) { return; }
> +     Monitor *m = &monitors[arg->i];
> +     sel->tags = ~0;
> +     sel->isfloating = 1;
> +     resize(sel,m->wx,m->wy,m->ww - 2 * sel->bw,m->wh - 2 * sel->bw);
> +     arrange();
> +}
> +
> +void win2main(const Arg *arg)
> +{
> +     if ( !sel ) { return; }
> +     sel->isfloating = 0;
> +     tag(arg);       
> +}
> +
>  int
>  main(int argc, char *argv[]) {
>       if(argc == 2 && !strcmp("-v", argv[1]))


Reply via email to