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]))
Received on Fri Apr 24 2009 - 00:41:28 UTC
This archive was generated by hypermail 2.2.0 : Fri Apr 24 2009 - 00:48:05 UTC