summaryrefslogtreecommitdiff
path: root/src/FbWinFrame.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/FbWinFrame.cc')
-rw-r--r--src/FbWinFrame.cc82
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 */
197void FbWinFrame::shade() { 196void 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
546void FbWinFrame::saveGeometry() { 538void 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
556void FbWinFrame::applyState() { 550void 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
1518bool FbWinFrame::useHandle() const { 1517bool 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
1522int FbWinFrame::getShape() const { 1522int FbWinFrame::getShape() const {
@@ -1734,10 +1734,8 @@ unsigned int FbWinFrame::normalWidth() const {
1734} 1734}
1735 1735
1736unsigned int FbWinFrame::normalHeight() const { 1736unsigned 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