Rémy Lefevre <lefevreremy <at> gmail.com> writes:

> 
> Bryan Bennett <bbenne10 <at> gmail.com> writes:
> 
> > 
> > I apologize. I misread your initial mail. I remember having a similar
> problem with virtual box but seem to remember that it was the result of a
> mismatch between the guest additions and the virtualbox version rather than
> being related to the wm. Are you sure your versions match?
> 
> I finally found my problem. It is located in the function "configurerequest"
> in dwm.c. It's written "c->x = m->mx + ev->x;" and "c->y = m->my + ev->y;"
> which means that the new coordinates are interpreted relatively to the
> position of the monitor. Which is not the intended behavior. So I replace
> those lines by "c->x = ev->x;" and "c->y = ev->y;" respectively. And it
> works when I want to move a window to a monitor on the left. But, when I
> want to move a window to a monitor on the right, it didn't work. I found few
> lines below in dwm.c: 
> 
> if((c->x + c->w) > m->mx + m->mw && c->isfloating)
>                               c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* 
> center in x direction */
>                       if((c->y + c->h) > m->my + m->mh && c->isfloating)
>                               c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* 
> center in y direction */
> 
> which mean that when the window tries to go out of the screen on the right,
> center it back. It's one more time not the intended behavior, so I comment
> those lines. And it's know working like a charm. I suggest the maintainer to
> update the code in dwm repository in order to fix this problem for the next
> releases.
> 
> 


Here is my patch:

diff -u dwm.c dwm.c
--- dwm.c       2013-06-13 13:20:35.794942637 +0200
+++ dwm.c       2013-06-13 15:27:06.503336161 +0200
@@ -604,11 +604,11 @@
                        m = c->mon;
                        if(ev->value_mask & CWX) {
                                c->oldx = c->x;
-                               c->x = m->mx + ev->x;
+                               c->x = ev->x;
                        }
                        if(ev->value_mask & CWY) {
                                c->oldy = c->y;
-                               c->y = m->my + ev->y;
+                               c->y = ev->y;
                        }
                        if(ev->value_mask & CWWidth) {
                                c->oldw = c->w;
@@ -618,14 +618,13 @@
                                c->oldh = c->h;
                                c->h = ev->height;
                        }
-                       if((c->x + c->w) > m->mx + m->mw && c->isfloating)
-                               c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* 
center in x direction */
-                       if((c->y + c->h) > m->my + m->mh && c->isfloating)
-                               c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* 
center in y direction */
                        if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & 
(CWWidth|CWHeight)))
                                configure(c);
                        if(ISVISIBLE(c))
                                XMoveResizeWindow(dpy, c->win, c->x, c->y, 
c->w, c->h);
+                       if ((m = recttomon(c->x, c->y, c->w, c->h)) != c->mon)
+                               sendmon(c, m);
+                       
                }
                else
                        configure(c);
@@ -1132,11 +1131,6 @@
        c->h = c->oldh = wa->height;
        c->oldbw = wa->border_width;
 
-       if(c->x + WIDTH(c) > c->mon->mx + c->mon->mw)
-               c->x = c->mon->mx + c->mon->mw - WIDTH(c);
-       if(c->y + HEIGHT(c) > c->mon->my + c->mon->mh)
-               c->y = c->mon->my + c->mon->mh - HEIGHT(c);
-       c->x = MAX(c->x, c->mon->mx);
        /* only fix client y-offset, if the client center might cover the bar */
        c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >=
c->mon->wx)
                   && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh :
c->mon->my);






Reply via email to