diff options
author | rathnor <rathnor> | 2003-07-24 03:19:02 (GMT) |
---|---|---|
committer | rathnor <rathnor> | 2003-07-24 03:19:02 (GMT) |
commit | d4131b25bbf3b988f86b40deb2be940ba3db849d (patch) | |
tree | 6063d193760e5b75495d5845b548e95feda4d392 /src/Window.cc | |
parent | 75b98260377ca2e5a22d85d05595b40ae6f65638 (diff) | |
download | fluxbox_pavel-d4131b25bbf3b988f86b40deb2be940ba3db849d.zip fluxbox_pavel-d4131b25bbf3b988f86b40deb2be940ba3db849d.tar.bz2 |
fix some bugs + issues with maximisation.
it should be much safer now
Diffstat (limited to 'src/Window.cc')
-rw-r--r-- | src/Window.cc | 177 |
1 files changed, 115 insertions, 62 deletions
diff --git a/src/Window.cc b/src/Window.cc index a84d710..0ba7a4a 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Window.cc,v 1.209 2003/07/21 17:54:07 rathnor Exp $ | 25 | // $Id: Window.cc,v 1.210 2003/07/24 03:19:02 rathnor Exp $ |
26 | 26 | ||
27 | #include "Window.hh" | 27 | #include "Window.hh" |
28 | 28 | ||
@@ -533,8 +533,11 @@ void FluxboxWindow::init() { | |||
533 | } | 533 | } |
534 | 534 | ||
535 | if (maximized && functions.maximize) { // start maximized | 535 | if (maximized && functions.maximize) { // start maximized |
536 | maximized = MAX_NONE; | 536 | // This will set it to the appropriate style of maximisation |
537 | maximize(); | 537 | int req_maximized = maximized; |
538 | // NOTE: don't manually change maximized ANYWHERE else, it isn't safe | ||
539 | maximized = MAX_NONE; // it is not maximized now | ||
540 | maximize(req_maximized); | ||
538 | } | 541 | } |
539 | 542 | ||
540 | if (stuck) { | 543 | if (stuck) { |
@@ -1291,64 +1294,101 @@ void FluxboxWindow::withdraw() { | |||
1291 | /** | 1294 | /** |
1292 | Maximize window both horizontal and vertical | 1295 | Maximize window both horizontal and vertical |
1293 | */ | 1296 | */ |
1294 | void FluxboxWindow::maximize() { | 1297 | void FluxboxWindow::maximize(int type) { |
1295 | if (isIconic()) | 1298 | if (isIconic()) |
1296 | deiconify(); | 1299 | deiconify(); |
1297 | 1300 | ||
1298 | if (!maximized) { | 1301 | int head = screen().getHead(frame().window()); |
1299 | // save old values | 1302 | int new_x = frame().x(), |
1300 | int head = screen().getHead(frame().window()); | 1303 | new_y = frame().y(), |
1301 | m_old_width = frame().width(); | 1304 | new_w = frame().width(), |
1302 | m_old_height = frame().height(); | 1305 | new_h = frame().height(); |
1303 | m_old_pos_x = frame().x(); | 1306 | |
1304 | m_old_pos_y = frame().y(); | 1307 | int orig_max = maximized; |
1305 | unsigned int left_x = screen().maxLeft(head); | 1308 | |
1306 | unsigned int max_width = screen().maxRight(head); | 1309 | // These evaluate whether we need to TOGGLE the value for that field |
1307 | unsigned int max_top = screen().maxTop(head); | 1310 | // Why? If maximize is only set to zero outside this, |
1308 | moveResize(left_x, max_top, | 1311 | // and we only EVER toggle them, then: |
1309 | max_width - left_x - 2*frame().window().borderWidth(), | 1312 | // 1) We will never loose the old_ values |
1310 | screen().maxBottom(head) - max_top - 2*frame().window().borderWidth()); | 1313 | // 2) It shouldn't get confused |
1311 | maximized = MAX_FULL; | 1314 | |
1312 | } else { // demaximize, restore to old values | 1315 | // Worst case being that some action will toggle the wrong way, but |
1313 | moveResize(m_old_pos_x, m_old_pos_y, | 1316 | // we still won't lose the state in that case. |
1314 | m_old_width, m_old_height); | 1317 | |
1315 | maximized = MAX_NONE; | 1318 | // NOTE: There is one option to the way this works - what it does when |
1319 | // fully maximised and maximise(vert, horz) is selected. | ||
1320 | // There are 2 options here - either: | ||
1321 | // 1) maximiseVertical results in a vertically (not horz) maximised window, or | ||
1322 | // 2) " toggles vertical maximisation, thus resulting in a horizontally | ||
1323 | // maximised window. | ||
1324 | // | ||
1325 | // The current implementation uses style 1, to change this, removed the | ||
1326 | // item corresponding to the [[ ]] comment | ||
1327 | |||
1328 | // toggle maximize vertically? | ||
1329 | // when _don't_ we want to toggle? | ||
1330 | // - type is horizontal maximise, [[and we aren't fully maximised]] or | ||
1331 | // - [[ type is vertical maximise and we are fully maximised ]] | ||
1332 | // - type is none and we are not vertically maximised, or | ||
1333 | // - type is full and we are not horizontally maximised, but already vertically | ||
1334 | if (!(type == MAX_HORZ && orig_max != MAX_FULL || | ||
1335 | type == MAX_VERT && orig_max == MAX_FULL || | ||
1336 | type == MAX_NONE && !(orig_max & MAX_VERT) || | ||
1337 | type == MAX_FULL && orig_max == MAX_VERT)) { | ||
1338 | // already maximized in that direction? | ||
1339 | if (orig_max & MAX_VERT) { | ||
1340 | new_y = m_old_pos_y; | ||
1341 | new_h = m_old_height; | ||
1342 | } else { | ||
1343 | m_old_pos_y = new_y; | ||
1344 | m_old_height = new_h; | ||
1345 | new_y = screen().maxTop(head); | ||
1346 | new_h = screen().maxBottom(head) - new_y - 2*frame().window().borderWidth(); | ||
1347 | } | ||
1348 | maximized ^= MAX_VERT; | ||
1349 | } | ||
1350 | |||
1351 | // maximize horizontally? | ||
1352 | if (!(type == MAX_VERT && orig_max != MAX_FULL || | ||
1353 | type == MAX_HORZ && orig_max == MAX_FULL || | ||
1354 | type == MAX_NONE && !(orig_max & MAX_HORZ) || | ||
1355 | type == MAX_FULL && orig_max == MAX_HORZ)) { | ||
1356 | // already maximized in that direction? | ||
1357 | if (orig_max & MAX_HORZ) { | ||
1358 | new_x = m_old_pos_x; | ||
1359 | new_w = m_old_width; | ||
1360 | } else { | ||
1361 | // only save if we weren't already maximized | ||
1362 | m_old_pos_x = new_x; | ||
1363 | m_old_width = new_w; | ||
1364 | new_x = screen().maxLeft(head); | ||
1365 | new_w = screen().maxRight(head) - new_x - 2*frame().window().borderWidth(); | ||
1366 | } | ||
1367 | maximized ^= MAX_HORZ; | ||
1316 | } | 1368 | } |
1369 | |||
1370 | moveResize(new_x, new_y, new_w, new_h); | ||
1317 | 1371 | ||
1318 | } | 1372 | } |
1319 | /** | 1373 | /** |
1320 | * Maximize window horizontal | 1374 | * Maximize window horizontal |
1321 | */ | 1375 | */ |
1322 | void FluxboxWindow::maximizeHorizontal() { | 1376 | void FluxboxWindow::maximizeHorizontal() { |
1323 | if (! (maximized & MAX_HORZ) ) { | 1377 | maximize(MAX_HORZ); |
1324 | const int head = screen().getHead(frame().window()); | ||
1325 | const unsigned int left_x = screen().maxLeft(head); | ||
1326 | const unsigned int max_width = screen().maxRight(head); | ||
1327 | m_old_width = frame().width(); | ||
1328 | m_old_pos_x = frame().x(); | ||
1329 | moveResize(left_x, frame().y(), max_width - left_x, frame().height()); | ||
1330 | maximized |= MAX_HORZ; | ||
1331 | } else { | ||
1332 | moveResize(m_old_pos_x, frame().y(), m_old_width, frame().height()); | ||
1333 | maximized &= ~MAX_HORZ; | ||
1334 | } | ||
1335 | } | 1378 | } |
1336 | 1379 | ||
1337 | /** | 1380 | /** |
1338 | * Maximize window vertical | 1381 | * Maximize window vertical |
1339 | */ | 1382 | */ |
1340 | void FluxboxWindow::maximizeVertical() { | 1383 | void FluxboxWindow::maximizeVertical() { |
1341 | if (! (maximized & MAX_VERT) ) { | 1384 | maximize(MAX_VERT); |
1342 | const int head = screen().getHead(frame().window()); | 1385 | } |
1343 | const unsigned int max_top = screen().maxTop(head); | 1386 | |
1344 | m_old_height = frame().height(); | 1387 | /** |
1345 | m_old_pos_y = frame().y(); | 1388 | * Maximize window fully |
1346 | moveResize(frame().x(), max_top, frame().width(), screen().maxBottom(head) - max_top); | 1389 | */ |
1347 | maximized |= MAX_VERT; | 1390 | void FluxboxWindow::maximizeFull() { |
1348 | } else { | 1391 | maximize(MAX_FULL); |
1349 | moveResize(frame().x(), m_old_pos_y, frame().width(), m_old_height); | ||
1350 | maximized &= ~MAX_VERT; | ||
1351 | } | ||
1352 | } | 1392 | } |
1353 | 1393 | ||
1354 | 1394 | ||
@@ -1853,9 +1893,9 @@ void FluxboxWindow::restoreAttributes() { | |||
1853 | (m_blackbox_attrib.flags & ATTRIB_MAXVERT)) | 1893 | (m_blackbox_attrib.flags & ATTRIB_MAXVERT)) |
1854 | maximized = MAX_FULL; | 1894 | maximized = MAX_FULL; |
1855 | else if (m_blackbox_attrib.flags & ATTRIB_MAXVERT) | 1895 | else if (m_blackbox_attrib.flags & ATTRIB_MAXVERT) |
1856 | maximizeVertical(); | 1896 | maximized = MAX_VERT; |
1857 | else if (m_blackbox_attrib.flags & ATTRIB_MAXHORIZ) | 1897 | else if (m_blackbox_attrib.flags & ATTRIB_MAXHORIZ) |
1858 | maximizeHorizontal(); | 1898 | maximized = MAX_HORZ; |
1859 | 1899 | ||
1860 | m_blackbox_attrib.premax_x = x; | 1900 | m_blackbox_attrib.premax_x = x; |
1861 | m_blackbox_attrib.premax_y = y; | 1901 | m_blackbox_attrib.premax_y = y; |
@@ -3144,22 +3184,35 @@ void FluxboxWindow::changeBlackboxHints(const BlackboxHints &net) { | |||
3144 | (net.attrib & ATTRIB_SHADED))) | 3184 | (net.attrib & ATTRIB_SHADED))) |
3145 | shade(); | 3185 | shade(); |
3146 | 3186 | ||
3147 | if ((net.flags & (ATTRIB_MAXVERT | ATTRIB_MAXHORIZ)) && | 3187 | if (net.flags & (ATTRIB_MAXVERT | ATTRIB_MAXHORIZ)) { |
3148 | ((m_blackbox_attrib.attrib & (ATTRIB_MAXVERT | ATTRIB_MAXHORIZ)) != | 3188 | // make maximise look like the net maximise flags |
3149 | (net.attrib & (ATTRIB_MAXVERT | ATTRIB_MAXHORIZ)))) { | 3189 | int want_max = MAX_NONE; |
3150 | if (maximized) { | 3190 | |
3151 | maximize(); | 3191 | if (net.flags & ATTRIB_MAXVERT) |
3152 | } else { | 3192 | want_max |= MAX_VERT; |
3153 | if ((net.flags & ATTRIB_MAXHORIZ) && (net.flags & ATTRIB_MAXVERT)) | 3193 | if (net.flags & ATTRIB_MAXHORIZ) |
3154 | maximize(); | 3194 | want_max |= MAX_HORZ; |
3155 | else if (net.flags & ATTRIB_MAXVERT) | 3195 | |
3156 | maximizeVertical(); | 3196 | if (want_max == MAX_NONE && maximized != MAX_NONE) { |
3157 | else if (net.flags & ATTRIB_MAXHORIZ) | 3197 | maximize(MAX_NONE); |
3158 | maximizeHorizontal(); | 3198 | } else if (want_max == MAX_FULL && maximized != MAX_FULL) { |
3159 | 3199 | maximize(MAX_FULL); | |
3200 | // horz and vert are a little trickier to morph | ||
3201 | } | ||
3202 | // to toggle vert | ||
3203 | // either we want vert and aren't | ||
3204 | // or we want horizontal, and are vertically (or full) at present | ||
3205 | if (want_max == MAX_VERT && !(maximized & MAX_VERT) || | ||
3206 | want_max == MAX_HORZ && (maximized & MAX_VERT)) { | ||
3207 | maximize(MAX_VERT); | ||
3208 | } | ||
3209 | // note that if we want horz, it WONT be vert any more from above | ||
3210 | if (want_max == MAX_HORZ && !(maximized & MAX_HORZ) || | ||
3211 | want_max == MAX_VERT && (maximized & MAX_HORZ)) { | ||
3212 | maximize(MAX_HORZ); | ||
3160 | } | 3213 | } |
3161 | } | 3214 | } |
3162 | 3215 | ||
3163 | if ((net.flags & ATTRIB_OMNIPRESENT) && | 3216 | if ((net.flags & ATTRIB_OMNIPRESENT) && |
3164 | ((m_blackbox_attrib.attrib & ATTRIB_OMNIPRESENT) != | 3217 | ((m_blackbox_attrib.attrib & ATTRIB_OMNIPRESENT) != |
3165 | (net.attrib & ATTRIB_OMNIPRESENT))) | 3218 | (net.attrib & ATTRIB_OMNIPRESENT))) |
@@ -3384,7 +3437,7 @@ void FluxboxWindow::setupWindow() { | |||
3384 | typedef SimpleCommand<FluxboxWindow> WindowCmd; | 3437 | typedef SimpleCommand<FluxboxWindow> WindowCmd; |
3385 | 3438 | ||
3386 | CommandRef iconify_cmd(new WindowCmd(*this, &FluxboxWindow::iconify)); | 3439 | CommandRef iconify_cmd(new WindowCmd(*this, &FluxboxWindow::iconify)); |
3387 | CommandRef maximize_cmd(new WindowCmd(*this, &FluxboxWindow::maximize)); | 3440 | CommandRef maximize_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeFull)); |
3388 | CommandRef maximize_vert_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeVertical)); | 3441 | CommandRef maximize_vert_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeVertical)); |
3389 | CommandRef maximize_horiz_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeHorizontal)); | 3442 | CommandRef maximize_horiz_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeHorizontal)); |
3390 | CommandRef close_cmd(new WindowCmd(*this, &FluxboxWindow::close)); | 3443 | CommandRef close_cmd(new WindowCmd(*this, &FluxboxWindow::close)); |