~compiz-team/compiz-core/0.9.7

« back to all changes in this revision

Viewing changes to plugins/place/src/screen-size-change/src/screen-size-change.cpp

  • Committer: Tarmac
  • Author(s): Chris Townsend
  • Date: 2013-04-25 16:06:04 UTC
  • mfrom: (3134.1.1 compiz-core)
  • Revision ID: tarmac-20130425160604-htp720605yu4rtyq
Backport of lp:compiz/0.9.9 revno. 3646 to fix bug #763148. Also had to backport the code in the PlaceWindow destructor.

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
compiz::place::ScreenSizeChangeObject::adjustForSize (const CompSize &oldSize,
38
38
                                                      const CompSize &newSize)
39
39
{
40
 
    int            vpX, vpY, shiftX, shiftY;
 
40
    int            vpX, vpY;
41
41
    compiz::window::Geometry g, vpRelRect;
42
42
    int            pivotX, pivotY;
43
 
    int            curVpOffsetX = getViewport ().x () * newSize.width ();
44
 
    int            curVpOffsetY = getViewport ().y () * newSize.height ();
45
43
 
46
44
    g = getGeometry ();
47
45
    compiz::window::Geometry og (g);
59
57
    if (pivotY < 0)
60
58
        vpY -= 1;
61
59
 
62
 
    /* if window's target vp is to the left of the leftmost viewport on that
63
 
       row, assign its target vp column as 0 (-s->x rel. to current vp) */
64
 
    if (getViewport ().x () + vpX < 0)
65
 
        vpX = -getViewport ().x ();
66
 
 
67
 
    /* if window's target vp is above the topmost viewport on that column,
68
 
       assign its target vp row as 0 (-s->y rel. to current vp) */
69
 
    if (getViewport ().y () + vpY < 0)
70
 
        vpY = -getViewport ().y ();
71
 
 
72
60
    unsigned int mask = mSaver.pop (vpRelRect, CHANGE_X | CHANGE_Y |
73
61
                                               CHANGE_WIDTH | CHANGE_HEIGHT);
74
62
 
75
63
    if (mask)
76
64
    {
77
65
        /* set position/size to saved original rectangle */
78
 
        g.applyChange (compiz::window::Geometry (vpRelRect.x () + vpX * newSize.width (),
79
 
                                                 vpRelRect.y () + vpY * newSize.height (),
 
66
        g.applyChange (compiz::window::Geometry (vpRelRect.x (),
 
67
                                                 vpRelRect.y (),
80
68
                                                 vpRelRect.width (),
81
69
                                                 vpRelRect.height (),
82
70
                                                 vpRelRect.border ()), mask);
90
78
        vpRelRect.setWidth (g.width ());
91
79
        vpRelRect.setHeight (g.height ());
92
80
 
93
 
        g.setPos (g.pos ());
94
 
 
95
 
        shiftX = vpX * (newSize.width () - oldSize.width ());
96
 
        shiftY = vpY * (newSize.width () - oldSize.height ());
 
81
        g = vpRelRect;
97
82
 
98
83
        /* if coords. relative to viewport are outside new viewport area,
99
84
           shift window left/up so that it falls inside */
100
 
        if (vpRelRect.x () >= newSize.width ())
101
 
            shiftX -= vpRelRect.x () - (newSize.width () - 1);
102
 
        if (vpRelRect.y () >= newSize.height ())
103
 
            shiftY -= vpRelRect.y () - (newSize.height () - 1);
104
 
 
105
 
        if (shiftX)
106
 
            g.setX (g.x () + shiftX);
107
 
 
108
 
        if (shiftY)
109
 
            g.setY (g.y () + shiftY);
 
85
        if (vpRelRect.x () + vpRelRect.width() >= newSize.width ())
 
86
            g.setX (g.x () - (vpRelRect.x () + vpRelRect.width () - newSize.width ()));
 
87
        if (vpRelRect.y () + vpRelRect.height() >= newSize.height ())
 
88
            g.setY (g.y () - (vpRelRect.y () + vpRelRect.width () - newSize.height ()));
110
89
 
111
90
        g.setWidth (vpRelRect.width ());
112
91
        g.setHeight (vpRelRect.height ());
113
92
    }
114
93
 
115
 
    /* Handle non-(0,0) current viewport by shifting by curVpOffsetX,Y,
116
 
       and bring window to (0,0) by shifting by minus its vp offset */
117
 
 
118
 
    g.setX (g.x () + curVpOffsetX - (getViewport ().x () + vpX) * newSize.width ());
119
 
    g.setY (g.y () + curVpOffsetY - (getViewport ().y () + vpY) * newSize.height ());
120
 
 
121
94
    unsigned int flags = 0;
122
95
    const CompRect &workArea = getWorkarea (g);
123
96
 
124
97
    compiz::place::clampGeometryToWorkArea (g, workArea, getExtents (), flags, newSize);
125
98
 
126
 
    g.setX (g.x () - curVpOffsetX + (getViewport ().x () + vpX) * newSize.width ());
127
 
    g.setY (g.y () - curVpOffsetY + (getViewport ().y () + vpY) * newSize.height ());
128
 
 
129
99
    if (!mask)
130
100
    {
131
101
        /* save window geometry (relative to viewport) so that it
151
121
        mSaver.push (vpRelRect, remaining);
152
122
    }
153
123
 
 
124
    g.setX (g.x () + vpX * newSize.width ());
 
125
    g.setY (g.y () + vpY * newSize.height ());
 
126
 
154
127
    /* for maximized/fullscreen windows, update saved pos/size XXX,
155
128
     * also pull in the old code to handle maximized windows which
156
129
     * currently can't be implemented yet */