diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | src/Ewmh.cc | 7 | ||||
-rw-r--r-- | src/FbWinFrame.cc | 103 | ||||
-rw-r--r-- | src/FbWinFrame.hh | 13 | ||||
-rw-r--r-- | src/Window.cc | 23 | ||||
-rw-r--r-- | src/Window.hh | 3 |
6 files changed, 100 insertions, 53 deletions
@@ -1,7 +1,9 @@ | |||
1 | (Format: Year/Month/Day) | 1 | (Format: Year/Month/Day) |
2 | Changes for 0.9.13 | 2 | Changes for 0.9.13 |
3 | *05/03/16: | 3 | *05/03/16: |
4 | added new option to specify, on which screen fluxbox should handle | 4 | * fix for gravity field on _NET_MOVERESIZE_WINDOW (thanx to Rob Stevens) |
5 | Ewmh.cc, Window.(cc,hh), FbWinFrame.(cc,hh) | ||
6 | * added new option to specify, on which screen fluxbox should handle | ||
5 | the windows. default behavior is to handle each available screen. | 7 | the windows. default behavior is to handle each available screen. |
6 | closes #1159809. (Mathias) | 8 | closes #1159809. (Mathias) |
7 | 9 | ||
diff --git a/src/Ewmh.cc b/src/Ewmh.cc index 34c166c..d6ccf36 100644 --- a/src/Ewmh.cc +++ b/src/Ewmh.cc | |||
@@ -706,9 +706,10 @@ bool Ewmh::checkClientMessage(const XClientMessageEvent &ce, | |||
706 | // ce.data.l[2] = y | 706 | // ce.data.l[2] = y |
707 | // ce.data.l[3] = width | 707 | // ce.data.l[3] = width |
708 | // ce.data.l[4] = height | 708 | // ce.data.l[4] = height |
709 | // TODO: gravity and flags | 709 | // TODO: flags |
710 | winclient->fbwindow()->moveResize(ce.data.l[1], ce.data.l[2], | 710 | int win_gravity=ce.data.l[0] & 0xFF; |
711 | ce.data.l[3], ce.data.l[4]); | 711 | winclient->fbwindow()->moveResizeForClient(ce.data.l[1], ce.data.l[2], |
712 | ce.data.l[3], ce.data.l[4], win_gravity); | ||
712 | return true; | 713 | return true; |
713 | } | 714 | } |
714 | 715 | ||
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 | } |
diff --git a/src/FbWinFrame.hh b/src/FbWinFrame.hh index 32161d1..768f733 100644 --- a/src/FbWinFrame.hh +++ b/src/FbWinFrame.hh | |||
@@ -76,16 +76,16 @@ public: | |||
76 | inline bool isVisible() const { return m_visible; } | 76 | inline bool isVisible() const { return m_visible; } |
77 | /// shade frame (ie resize to titlebar size) | 77 | /// shade frame (ie resize to titlebar size) |
78 | void shade(); | 78 | void shade(); |
79 | void move(int x, int y); | 79 | void move(int x, int y, int win_gravity=ForgetGravity); |
80 | void resize(unsigned int width, unsigned int height); | 80 | void resize(unsigned int width, unsigned int height, int win_gravity=ForgetGravity); |
81 | /// resize client to specified size and resize frame to it | 81 | /// resize client to specified size and resize frame to it |
82 | void resizeForClient(unsigned int width, unsigned int height); | 82 | void resizeForClient(unsigned int width, unsigned int height, int win_gravity=ForgetGravity); |
83 | 83 | ||
84 | // for when there needs to be an atomic move+resize operation | 84 | // for when there needs to be an atomic move+resize operation |
85 | void moveResizeForClient(int x, int y, unsigned int width, unsigned int height, bool move = true, bool resize = true); | 85 | void moveResizeForClient(int x, int y, unsigned int width, unsigned int height, bool move = true, bool resize = true, int win_gravity=ForgetGravity); |
86 | 86 | ||
87 | // can elect to ignore move or resize (mainly for use of move/resize individual functions | 87 | // can elect to ignore move or resize (mainly for use of move/resize individual functions |
88 | void moveResize(int x, int y, unsigned int width, unsigned int height, bool move = true, bool resize = true); | 88 | void moveResize(int x, int y, unsigned int width, unsigned int height, bool move = true, bool resize = true, int win_gravity=ForgetGravity); |
89 | 89 | ||
90 | /// set focus/unfocus style | 90 | /// set focus/unfocus style |
91 | void setFocus(bool newvalue); | 91 | void setFocus(bool newvalue); |
@@ -133,7 +133,8 @@ public: | |||
133 | // this function translates its arguments according to win_gravity | 133 | // this function translates its arguments according to win_gravity |
134 | // if win_gravity is negative, it does an inverse translation | 134 | // if win_gravity is negative, it does an inverse translation |
135 | void gravityTranslate(int &x, int &y, int win_gravity, bool move_frame = false); | 135 | void gravityTranslate(int &x, int &y, int win_gravity, bool move_frame = false); |
136 | 136 | //use width and height given instead of the real values, allows figuring out where to place a window before doing a moveResize | |
137 | void gravityTranslate(int &x, int &y, unsigned int width, unsigned int height, int win_gravity, bool move_frame = false); | ||
137 | void setBorderWidth(unsigned int borderW); | 138 | void setBorderWidth(unsigned int borderW); |
138 | 139 | ||
139 | /** | 140 | /** |
diff --git a/src/Window.cc b/src/Window.cc index 0bee703..e1fea07 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -1387,6 +1387,29 @@ void FluxboxWindow::moveResize(int new_x, int new_y, | |||
1387 | 1387 | ||
1388 | } | 1388 | } |
1389 | 1389 | ||
1390 | void FluxboxWindow::moveResizeForClient(int new_x, int new_y, | ||
1391 | unsigned int new_width, unsigned int new_height, int gravity) { | ||
1392 | |||
1393 | // magic to detect if moved during initialisation | ||
1394 | if (!isInitialized()) | ||
1395 | m_old_pos_x = 1; | ||
1396 | frame().moveResizeForClient(new_x, new_y, new_width, new_height, true, true, gravity); | ||
1397 | setFocusFlag(focused); | ||
1398 | shaded = false; | ||
1399 | sendConfigureNotify(); | ||
1400 | |||
1401 | shape(); | ||
1402 | |||
1403 | if (!moving) { | ||
1404 | m_last_resize_x = new_x; | ||
1405 | m_last_resize_y = new_y; | ||
1406 | } | ||
1407 | |||
1408 | } | ||
1409 | |||
1410 | |||
1411 | |||
1412 | |||
1390 | // returns whether the focus was "set" to this window | 1413 | // returns whether the focus was "set" to this window |
1391 | // it doesn't guarantee that it has focus, but says that we have | 1414 | // it doesn't guarantee that it has focus, but says that we have |
1392 | // tried. A FocusqIn event should eventually arrive for that | 1415 | // tried. A FocusqIn event should eventually arrive for that |
diff --git a/src/Window.hh b/src/Window.hh index ac13da6..f4a038a 100644 --- a/src/Window.hh +++ b/src/Window.hh | |||
@@ -233,7 +233,8 @@ public: | |||
233 | void resize(unsigned int width, unsigned int height); | 233 | void resize(unsigned int width, unsigned int height); |
234 | /// move and resize frame to pox x,y and size width, height | 234 | /// move and resize frame to pox x,y and size width, height |
235 | void moveResize(int x, int y, unsigned int width, unsigned int height, int gravity = ForgetGravity); | 235 | void moveResize(int x, int y, unsigned int width, unsigned int height, int gravity = ForgetGravity); |
236 | 236 | /// move to pos x,y and resize client window to size width, height | |
237 | void moveResizeForClient(int x, int y, unsigned int width, unsigned int height, int gravity = ForgetGravity); | ||
237 | void setWorkspace(int n); | 238 | void setWorkspace(int n); |
238 | void changeBlackboxHints(const BlackboxHints &bh); | 239 | void changeBlackboxHints(const BlackboxHints &bh); |
239 | void updateFunctions(); | 240 | void updateFunctions(); |