diff options
Diffstat (limited to 'src/FbWinFrame.cc')
-rw-r--r-- | src/FbWinFrame.cc | 82 |
1 files changed, 40 insertions, 42 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 | ||