diff options
Diffstat (limited to 'src/FbWinFrame.cc')
-rw-r--r-- | src/FbWinFrame.cc | 103 |
1 files changed, 61 insertions, 42 deletions
diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc index 266f5c4..d4a3d66 100644 --- a/src/FbWinFrame.cc +++ b/src/FbWinFrame.cc | |||
@@ -166,16 +166,16 @@ void FbWinFrame::shade() { | |||
166 | } | 166 | } |
167 | 167 | ||
168 | 168 | ||
169 | void FbWinFrame::move(int x, int y) { | 169 | void FbWinFrame::move(int x, int y, int win_gravity) { |
170 | moveResize(x, y, 0, 0, true, false); | 170 | moveResize(x, y, 0, 0, true, false, win_gravity); |
171 | } | 171 | } |
172 | 172 | ||
173 | void FbWinFrame::resize(unsigned int width, unsigned int height) { | 173 | void FbWinFrame::resize(unsigned int width, unsigned int height, int win_gravity) { |
174 | moveResize(0, 0, width, height, false, true); | 174 | moveResize(0, 0, width, height, false, true, win_gravity); |
175 | } | 175 | } |
176 | 176 | ||
177 | // need an atomic moveresize where possible | 177 | // need an atomic moveresize where possible |
178 | void FbWinFrame::moveResizeForClient(int x, int y, unsigned int width, unsigned int height, bool move, bool resize) { | 178 | void FbWinFrame::moveResizeForClient(int x, int y, unsigned int width, unsigned int height, bool move, bool resize, int win_gravity) { |
179 | // total height for frame | 179 | // total height for frame |
180 | 180 | ||
181 | unsigned int total_height = height; | 181 | unsigned int total_height = height; |
@@ -188,14 +188,17 @@ void FbWinFrame::moveResizeForClient(int x, int y, unsigned int width, unsigned | |||
188 | if (m_use_handle) | 188 | if (m_use_handle) |
189 | total_height += m_handle.height() + m_handle.borderWidth(); | 189 | total_height += m_handle.height() + m_handle.borderWidth(); |
190 | } | 190 | } |
191 | moveResize(x, y, width, total_height, move, resize); | 191 | moveResize(x, y, width, total_height, move, resize, win_gravity); |
192 | } | 192 | } |
193 | 193 | ||
194 | void FbWinFrame::resizeForClient(unsigned int width, unsigned int height) { | 194 | void FbWinFrame::resizeForClient(unsigned int width, unsigned int height, int win_gravity) { |
195 | moveResizeForClient(0, 0, width, height, false, true); | 195 | moveResizeForClient(0, 0, width, height, false, true, win_gravity); |
196 | } | 196 | } |
197 | 197 | ||
198 | void FbWinFrame::moveResize(int x, int y, unsigned int width, unsigned int height, bool move, bool resize) { | 198 | void FbWinFrame::moveResize(int x, int y, unsigned int width, unsigned int height, bool move, bool resize, int win_gravity) { |
199 | if(win_gravity!=ForgetGravity) { | ||
200 | gravityTranslate(x, y, width + m_window.borderWidth()*2, height + m_window.borderWidth()*2, win_gravity, false); | ||
201 | } | ||
199 | if (move && x == window().x() && y == window().y()) | 202 | if (move && x == window().x() && y == window().y()) |
200 | move = false; | 203 | move = false; |
201 | 204 | ||
@@ -1456,6 +1459,10 @@ void FbWinFrame::updateTransparent() { | |||
1456 | // if win_gravity is negative, it does an inverse translation | 1459 | // if win_gravity is negative, it does an inverse translation |
1457 | // This function should be used when a window is mapped/unmapped/pos configured | 1460 | // This function should be used when a window is mapped/unmapped/pos configured |
1458 | void FbWinFrame::gravityTranslate(int &x, int &y, int win_gravity, bool move_frame) { | 1461 | void FbWinFrame::gravityTranslate(int &x, int &y, int win_gravity, bool move_frame) { |
1462 | gravityTranslate(x, y, m_window.width(), m_window.height(), win_gravity, move_frame); | ||
1463 | } | ||
1464 | //use width and height given instead of the real values, allows figuring out where to place a window before doing a moveResize | ||
1465 | void FbWinFrame::gravityTranslate(int &x, int &y, unsigned int width, unsigned int height, int win_gravity, bool move_frame) { | ||
1459 | bool invert = false; | 1466 | bool invert = false; |
1460 | if (win_gravity < 0) { | 1467 | if (win_gravity < 0) { |
1461 | invert = true; | 1468 | invert = true; |
@@ -1483,44 +1490,57 @@ void FbWinFrame::gravityTranslate(int &x, int &y, int win_gravity, bool move_fra | |||
1483 | int x_offset = 0; | 1490 | int x_offset = 0; |
1484 | int y_offset = 0; | 1491 | int y_offset = 0; |
1485 | 1492 | ||
1486 | // mostly no X offset, since we don't have extra frame on the sides | 1493 | /* win_gravity: placed at the reference point |
1487 | switch (win_gravity) { | 1494 | * StaticGravity the left top corner of the client window |
1488 | case NorthWestGravity: | 1495 | * NorthWestGravity the left top corner of the frame window |
1489 | case NorthGravity: | 1496 | * NorthGravity the center of the frame window's top side |
1490 | case NorthEastGravity: | 1497 | * NorthEastGravity the right top corner of the frame window |
1491 | // no offset, since the top point is still the same | 1498 | * EastGravity the center of the frame window's right side |
1492 | break; | 1499 | * SouthEastGravity the right bottom corner of the frame window |
1493 | case SouthWestGravity: | 1500 | * SouthGravity the center of the frame window's bottom side |
1494 | case SouthGravity: | 1501 | * SouthWestGravity the left bottom corner of the frame window |
1495 | case SouthEastGravity: | 1502 | * WestGravity the center of the frame window's left side |
1496 | // window shifted down by height of titlebar, and the handle | 1503 | * CenterGravity the center of the frame window |
1497 | // since that's necessary to get the bottom of the frame | 1504 | */ |
1498 | // all the way up | 1505 | |
1499 | if (m_use_titlebar) | 1506 | |
1500 | y_offset -= m_titlebar.height() + m_titlebar.borderWidth(); | 1507 | //vertical offset |
1501 | if (m_use_handle) | 1508 | //North Gravities don't require a vertical offset |
1502 | y_offset -= m_handle.height() + m_handle.borderWidth(); | 1509 | //South Gravities |
1503 | break; | 1510 | if (win_gravity==SouthWestGravity || win_gravity==SouthGravity || |
1504 | case WestGravity: | 1511 | win_gravity==SouthEastGravity) { |
1505 | case EastGravity: | 1512 | //We start on the frame so going the full height would take us one pixel past the edge of the frame |
1506 | case CenterGravity: | 1513 | y_offset-=height-1; |
1507 | // these centered ones are a little more interesting | 1514 | } |
1508 | if (m_use_titlebar) | 1515 | |
1509 | y_offset -= m_titlebar.height() + m_titlebar.borderWidth(); | 1516 | //vertical centering |
1510 | if (m_use_handle) | 1517 | if (win_gravity==WestGravity || win_gravity==CenterGravity || |
1511 | y_offset -= m_handle.height() + m_handle.borderWidth(); | 1518 | win_gravity==EastGravity) { |
1512 | y_offset /= 2; | 1519 | y_offset-=height/2; |
1513 | break; | 1520 | } |
1514 | case StaticGravity: | 1521 | |
1522 | //horizontal offset | ||
1523 | //West Gravities don't require a horizontal offset | ||
1524 | //East Gravities | ||
1525 | if (win_gravity==NorthEastGravity || win_gravity==EastGravity || | ||
1526 | win_gravity==SouthEastGravity ) { | ||
1527 | //Starting on the frame so offset of one width would end up one pixel beyond the border | ||
1528 | x_offset-=width-1; | ||
1529 | } | ||
1530 | //horizontal centering | ||
1531 | if (win_gravity==NorthGravity || win_gravity==CenterGravity || | ||
1532 | win_gravity==SouthGravity ) { | ||
1533 | x_offset-=width/2; | ||
1534 | } | ||
1535 | |||
1536 | if( win_gravity==StaticGravity ) { | ||
1515 | if (m_use_titlebar) | 1537 | if (m_use_titlebar) |
1516 | y_offset -= m_titlebar.height() + m_titlebar.borderWidth(); | 1538 | y_offset -= m_titlebar.height() + m_titlebar.borderWidth(); |
1517 | // static is the only one that also has the | ||
1518 | // border taken into account | ||
1519 | x_offset -= m_window.borderWidth(); | 1539 | x_offset -= m_window.borderWidth(); |
1520 | y_offset -= m_window.borderWidth(); | 1540 | y_offset -= m_window.borderWidth(); |
1521 | break; | ||
1522 | } | 1541 | } |
1523 | 1542 | ||
1543 | |||
1524 | if (invert) { | 1544 | if (invert) { |
1525 | x_offset = -x_offset; | 1545 | x_offset = -x_offset; |
1526 | y_offset = -y_offset; | 1546 | y_offset = -y_offset; |
@@ -1528,7 +1548,6 @@ void FbWinFrame::gravityTranslate(int &x, int &y, int win_gravity, bool move_fra | |||
1528 | 1548 | ||
1529 | x += x_offset; | 1549 | x += x_offset; |
1530 | y += y_offset; | 1550 | y += y_offset; |
1531 | |||
1532 | if (move_frame && (x_offset != 0 || y_offset != 0)) { | 1551 | if (move_frame && (x_offset != 0 || y_offset != 0)) { |
1533 | move(x, y); | 1552 | move(x, y); |
1534 | } | 1553 | } |