diff options
author | Mark Tiefenbruck <mark@fluxbox.org> | 2008-08-22 23:29:09 (GMT) |
---|---|---|
committer | Mark Tiefenbruck <mark@fluxbox.org> | 2008-08-22 23:29:09 (GMT) |
commit | e3fb16c993331de931042b3fbd4300124e2cc9eb (patch) | |
tree | baaceb1b040a71a1f8bcc8fdea42eb0a683e02ff | |
parent | c37a91e1504fa73da233cc59fe67ead56dbd3083 (diff) | |
download | fluxbox_lack-e3fb16c993331de931042b3fbd4300124e2cc9eb.zip fluxbox_lack-e3fb16c993331de931042b3fbd4300124e2cc9eb.tar.bz2 |
allow various combinations of shaded, maximized, and fullscreen states
-rw-r--r-- | src/FbWinFrame.cc | 82 | ||||
-rw-r--r-- | src/FbWinFrame.hh | 1 | ||||
-rw-r--r-- | src/Window.cc | 8 |
3 files changed, 41 insertions, 50 deletions
diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc index bac06d2..1f0a52e 100644 --- a/src/FbWinFrame.cc +++ b/src/FbWinFrame.cc | |||
@@ -88,7 +88,6 @@ FbWinFrame::FbWinFrame(BScreen &screen, | |||
88 | m_active_orig_client_bw(0), | 88 | m_active_orig_client_bw(0), |
89 | m_need_render(true), | 89 | m_need_render(true), |
90 | m_button_size(1), | 90 | m_button_size(1), |
91 | m_height_before_shade(1), | ||
92 | m_focused_alpha(AlphaAcc(*theme.focusedTheme(), &FbWinFrameTheme::alpha)), | 91 | m_focused_alpha(AlphaAcc(*theme.focusedTheme(), &FbWinFrameTheme::alpha)), |
93 | m_unfocused_alpha(AlphaAcc(*theme.unfocusedTheme(), &FbWinFrameTheme::alpha)), | 92 | m_unfocused_alpha(AlphaAcc(*theme.unfocusedTheme(), &FbWinFrameTheme::alpha)), |
94 | m_shape(m_window, theme->shapePlace()) { | 93 | m_shape(m_window, theme->shapePlace()) { |
@@ -195,21 +194,14 @@ void FbWinFrame::show() { | |||
195 | Toggle shade state, and resize window | 194 | Toggle shade state, and resize window |
196 | */ | 195 | */ |
197 | void FbWinFrame::shade() { | 196 | void FbWinFrame::shade() { |
198 | if (!m_use_titlebar) | 197 | if (!(m_state.deco_mask & DECORM_TITLEBAR)) |
199 | return; | 198 | return; |
200 | 199 | ||
201 | // toggle shade | 200 | // toggle shade |
201 | if (!m_state.shaded) | ||
202 | saveGeometry(); | ||
202 | m_state.shaded = !m_state.shaded; | 203 | m_state.shaded = !m_state.shaded; |
203 | if (m_state.shaded) { // i.e. should be shaded now | 204 | applyState(); |
204 | m_height_before_shade = m_window.height(); | ||
205 | m_window.resize(m_window.width(), m_titlebar.height()); | ||
206 | alignTabs(); | ||
207 | // need to update our shape | ||
208 | m_shape.update(); | ||
209 | } else { // should be unshaded | ||
210 | m_window.resize(m_window.width(), m_height_before_shade); | ||
211 | reconfigure(); | ||
212 | } | ||
213 | } | 205 | } |
214 | 206 | ||
215 | 207 | ||
@@ -246,8 +238,8 @@ void FbWinFrame::moveResize(int x, int y, unsigned int width, unsigned int heigh | |||
246 | if (move && x == window().x() && y == window().y()) | 238 | if (move && x == window().x() && y == window().y()) |
247 | move = false; | 239 | move = false; |
248 | 240 | ||
249 | if (resize && (m_state.shaded || (width == FbWinFrame::width() && | 241 | if (resize && width == FbWinFrame::width() && |
250 | height == FbWinFrame::height()))) | 242 | height == FbWinFrame::height()) |
251 | resize = false; | 243 | resize = false; |
252 | 244 | ||
253 | if (!move && !resize) | 245 | if (!move && !resize) |
@@ -544,44 +536,52 @@ void FbWinFrame::setMaximized(int value) { | |||
544 | } | 536 | } |
545 | 537 | ||
546 | void FbWinFrame::saveGeometry() { | 538 | void FbWinFrame::saveGeometry() { |
547 | if (m_state.fullscreen || m_state.maximized) | 539 | if (m_state.fullscreen || m_state.maximized == MAX_FULL) |
548 | return; | 540 | return; |
549 | 541 | ||
550 | m_state.x = x(); | 542 | m_state.x = x(); |
551 | m_state.y = y(); | 543 | m_state.y = y(); |
552 | m_state.width = width(); | 544 | if (!(m_state.maximized & MAX_HORZ)) |
553 | m_state.height = height(); | 545 | m_state.width = width(); |
546 | if (!m_state.shaded && !(m_state.maximized & MAX_VERT)) | ||
547 | m_state.height = height(); | ||
554 | } | 548 | } |
555 | 549 | ||
556 | void FbWinFrame::applyState() { | 550 | void FbWinFrame::applyState() { |
557 | applyDecorations(); | 551 | applyDecorations(); |
558 | 552 | ||
559 | if (m_state.fullscreen) { | 553 | const int head = m_screen.getHead(window()); |
560 | const int head = m_screen.getHead(window()); | 554 | int new_x = m_state.x, new_y = m_state.y; |
561 | moveResize(m_screen.getHeadX(head), m_screen.getHeadY(head), | 555 | unsigned int new_w = m_state.width, new_h = m_state.height; |
562 | m_screen.getHeadWidth(head), m_screen.getHeadHeight(head)); | 556 | |
563 | } else if (m_state.maximized) { | 557 | if (m_state.maximized & MAX_VERT) { |
564 | const int head = m_screen.getHead(window()); | 558 | new_y = m_screen.maxTop(head); |
565 | int new_x = m_state.x, new_y = m_state.y; | 559 | new_h = m_screen.maxBottom(head) - new_y - 2*window().borderWidth(); |
566 | unsigned int new_w = m_state.width, new_h = m_state.height; | ||
567 | if (m_state.maximized & MAX_VERT) { | ||
568 | new_y = m_screen.maxTop(head); | ||
569 | new_h = m_screen.maxBottom(head) - new_y - 2*window().borderWidth(); | ||
570 | } | ||
571 | if (m_state.maximized & MAX_HORZ) { | ||
572 | new_x = m_screen.maxLeft(head); | ||
573 | new_w = m_screen.maxRight(head) - new_x - 2*window().borderWidth(); | ||
574 | } | ||
575 | if (!m_screen.getMaxOverTabs()) { | 560 | if (!m_screen.getMaxOverTabs()) { |
576 | new_y += yOffset(); | 561 | new_y += yOffset(); |
577 | new_h -= heightOffset(); | 562 | new_h -= heightOffset(); |
563 | } | ||
564 | } | ||
565 | if (m_state.maximized & MAX_HORZ) { | ||
566 | new_x = m_screen.maxLeft(head); | ||
567 | new_w = m_screen.maxRight(head) - new_x - 2*window().borderWidth(); | ||
568 | if (!m_screen.getMaxOverTabs()) { | ||
578 | new_x += xOffset(); | 569 | new_x += xOffset(); |
579 | new_w -= widthOffset(); | 570 | new_w -= widthOffset(); |
580 | } | 571 | } |
581 | moveResize(new_x, new_y, new_w, new_h); | 572 | } |
582 | } else | 573 | |
583 | moveResize(m_state.x, m_state.y, m_state.width, m_state.height); | 574 | if (m_state.shaded) |
575 | new_h = m_titlebar.height(); | ||
584 | 576 | ||
577 | if (m_state.fullscreen) { | ||
578 | new_x = m_screen.getHeadX(head); | ||
579 | new_y = m_screen.getHeadY(head); | ||
580 | new_w = m_screen.getHeadWidth(head); | ||
581 | new_h = m_screen.getHeadHeight(head); | ||
582 | } | ||
583 | |||
584 | moveResize(new_x, new_y, new_w, new_h); | ||
585 | frameExtentSig().notify(); | 585 | frameExtentSig().notify(); |
586 | } | 586 | } |
587 | 587 | ||
@@ -973,7 +973,7 @@ void FbWinFrame::reconfigure() { | |||
973 | } | 973 | } |
974 | 974 | ||
975 | // leave client+grips alone if we're shaded (it'll get fixed when we unshade) | 975 | // leave client+grips alone if we're shaded (it'll get fixed when we unshade) |
976 | if (!m_state.shaded) { | 976 | if (!m_state.shaded || m_state.fullscreen) { |
977 | int client_top = 0; | 977 | int client_top = 0; |
978 | int client_height = m_window.height(); | 978 | int client_height = m_window.height(); |
979 | if (m_use_titlebar) { | 979 | if (m_use_titlebar) { |
@@ -1369,7 +1369,6 @@ void FbWinFrame::init() { | |||
1369 | m_button_size = 26; | 1369 | m_button_size = 26; |
1370 | 1370 | ||
1371 | m_label.setBorderWidth(0); | 1371 | m_label.setBorderWidth(0); |
1372 | m_state.shaded = false; | ||
1373 | 1372 | ||
1374 | setTabMode(NOTSET); | 1373 | setTabMode(NOTSET); |
1375 | 1374 | ||
@@ -1516,7 +1515,8 @@ bool FbWinFrame::useTitlebar() const { | |||
1516 | } | 1515 | } |
1517 | 1516 | ||
1518 | bool FbWinFrame::useHandle() const { | 1517 | bool FbWinFrame::useHandle() const { |
1519 | return !m_state.fullscreen && m_state.deco_mask & DECORM_HANDLE; | 1518 | return !m_state.fullscreen && !m_state.shaded && |
1519 | m_state.deco_mask & DECORM_HANDLE; | ||
1520 | } | 1520 | } |
1521 | 1521 | ||
1522 | int FbWinFrame::getShape() const { | 1522 | int FbWinFrame::getShape() const { |
@@ -1734,10 +1734,8 @@ unsigned int FbWinFrame::normalWidth() const { | |||
1734 | } | 1734 | } |
1735 | 1735 | ||
1736 | unsigned int FbWinFrame::normalHeight() const { | 1736 | unsigned int FbWinFrame::normalHeight() const { |
1737 | if ((m_state.maximized & MAX_VERT) || m_state.fullscreen) | 1737 | if ((m_state.maximized & MAX_VERT) || m_state.fullscreen || m_state.shaded) |
1738 | return m_state.height; | 1738 | return m_state.height; |
1739 | if (m_state.shaded) | ||
1740 | return m_height_before_shade; | ||
1741 | return height(); | 1739 | return height(); |
1742 | } | 1740 | } |
1743 | 1741 | ||
diff --git a/src/FbWinFrame.hh b/src/FbWinFrame.hh index 7f08175..55d47ed 100644 --- a/src/FbWinFrame.hh +++ b/src/FbWinFrame.hh | |||
@@ -467,7 +467,6 @@ private: | |||
467 | 467 | ||
468 | bool m_need_render; | 468 | bool m_need_render; |
469 | int m_button_size; ///< size for all titlebar buttons | 469 | int m_button_size; ///< size for all titlebar buttons |
470 | unsigned int m_height_before_shade; ///< height before shade, so we can restore it when we unshade | ||
471 | /// alpha values | 470 | /// alpha values |
472 | typedef FbTk::ConstObjectAccessor<unsigned char, FbWinFrameTheme> AlphaAcc; | 471 | typedef FbTk::ConstObjectAccessor<unsigned char, FbWinFrameTheme> AlphaAcc; |
473 | FbTk::DefaultValue<unsigned char, AlphaAcc> m_focused_alpha; | 472 | FbTk::DefaultValue<unsigned char, AlphaAcc> m_focused_alpha; |
diff --git a/src/Window.cc b/src/Window.cc index 52672c0..b175314 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -1465,9 +1465,6 @@ void FluxboxWindow::setFullscreen(bool flag) { | |||
1465 | 1465 | ||
1466 | if (flag && !isFullscreen()) { | 1466 | if (flag && !isFullscreen()) { |
1467 | 1467 | ||
1468 | if (isShaded()) | ||
1469 | shade(); | ||
1470 | |||
1471 | m_old_layernum = layerNum(); | 1468 | m_old_layernum = layerNum(); |
1472 | fullscreen = true; | 1469 | fullscreen = true; |
1473 | frame().setFullscreen(true); | 1470 | frame().setFullscreen(true); |
@@ -1535,9 +1532,6 @@ void FluxboxWindow::setMaximizedState(int type) { | |||
1535 | return; | 1532 | return; |
1536 | } | 1533 | } |
1537 | 1534 | ||
1538 | if (isShaded()) | ||
1539 | shade(); | ||
1540 | |||
1541 | if (isResizing()) | 1535 | if (isResizing()) |
1542 | stopResizing(); | 1536 | stopResizing(); |
1543 | 1537 | ||
@@ -1605,7 +1599,7 @@ void FluxboxWindow::shade() { | |||
1605 | frame().shade(); | 1599 | frame().shade(); |
1606 | 1600 | ||
1607 | shaded = !shaded; | 1601 | shaded = !shaded; |
1608 | 1602 | stateSig().notify(); | |
1609 | // TODO: this should set IconicState, but then we can't focus the window | 1603 | // TODO: this should set IconicState, but then we can't focus the window |
1610 | } | 1604 | } |
1611 | 1605 | ||