diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/FbWinFrame.cc | 52 | ||||
-rw-r--r-- | src/Window.cc | 35 | ||||
-rw-r--r-- | src/Window.hh | 15 |
3 files changed, 81 insertions, 21 deletions
diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc index d310f24..5dcd64a 100644 --- a/src/FbWinFrame.cc +++ b/src/FbWinFrame.cc | |||
@@ -19,7 +19,7 @@ | |||
19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. | 20 | // DEALINGS IN THE SOFTWARE. |
21 | 21 | ||
22 | // $Id: FbWinFrame.cc,v 1.72 2004/01/21 19:47:30 fluxgen Exp $ | 22 | // $Id: FbWinFrame.cc,v 1.73 2004/01/23 10:37:01 rathnor Exp $ |
23 | 23 | ||
24 | #include "FbWinFrame.hh" | 24 | #include "FbWinFrame.hh" |
25 | 25 | ||
@@ -455,10 +455,12 @@ bool FbWinFrame::showHandle() { | |||
455 | if (m_use_handle || theme().handleWidth() == 0) | 455 | if (m_use_handle || theme().handleWidth() == 0) |
456 | return false; | 456 | return false; |
457 | 457 | ||
458 | m_use_handle = true; | ||
459 | |||
460 | renderHandles(); | ||
458 | m_handle.show(); | 461 | m_handle.show(); |
459 | m_handle.showSubwindows(); // shows grips | 462 | m_handle.showSubwindows(); // shows grips |
460 | 463 | ||
461 | m_use_handle = true; | ||
462 | m_window.resize(m_window.width(), m_window.height() + m_handle.height() + | 464 | m_window.resize(m_window.width(), m_window.height() + m_handle.height() + |
463 | m_handle.borderWidth()); | 465 | m_handle.borderWidth()); |
464 | return true; | 466 | return true; |
@@ -636,6 +638,13 @@ void FbWinFrame::reconfigure() { | |||
636 | return; | 638 | return; |
637 | 639 | ||
638 | m_bevel = theme().bevelWidth(); | 640 | m_bevel = theme().bevelWidth(); |
641 | // reconfigure can't set borderwidth, as it doesn't know | ||
642 | // if it's meant to be borderless or not | ||
643 | |||
644 | unsigned int orig_handle_h = handle().height(); | ||
645 | if (m_use_handle && orig_handle_h != theme().handleWidth()) | ||
646 | m_window.resize(m_window.width(), m_window.height() - | ||
647 | orig_handle_h + theme().handleWidth()); | ||
639 | 648 | ||
640 | handle().resize(handle().width(), | 649 | handle().resize(handle().width(), |
641 | theme().handleWidth()); | 650 | theme().handleWidth()); |
@@ -663,32 +672,37 @@ void FbWinFrame::reconfigure() { | |||
663 | client_height -= titlebar_height; | 672 | client_height -= titlebar_height; |
664 | } | 673 | } |
665 | 674 | ||
666 | if (m_use_handle) { | 675 | // align handle and grips |
667 | // align handle and grips | 676 | const int grip_height = m_handle.height(); |
668 | const int grip_height = m_handle.height(); | 677 | const int grip_width = 20; //TODO |
669 | const int grip_width = 20; //TODO | 678 | const int handle_bw = static_cast<signed>(m_handle.borderWidth()); |
670 | const int handle_bw = static_cast<signed>(m_handle.borderWidth()); | ||
671 | |||
672 | const int ypos = m_window.height() - grip_height - m_handle.borderWidth(); | ||
673 | m_handle.moveResize(-handle_bw, ypos, | ||
674 | m_window.width(), grip_height); | ||
675 | |||
676 | m_grip_left.moveResize(-handle_bw, -handle_bw, | ||
677 | grip_width, grip_height); | ||
678 | 679 | ||
679 | m_grip_right.moveResize(m_handle.width() - grip_width - handle_bw, -handle_bw, | 680 | int ypos = m_window.height(); |
680 | grip_width, grip_height); | ||
681 | m_handle.raise(); | ||
682 | 681 | ||
683 | client_height -= m_handle.height() + m_handle.borderWidth(); | 682 | // if the handle isn't on, it's actually below the window |
683 | if (m_use_handle) | ||
684 | ypos -= grip_height + handle_bw; | ||
685 | |||
686 | // we do handle settings whether on or not so that if they get toggled | ||
687 | // then things are ok... | ||
688 | m_handle.moveResize(-handle_bw, ypos, | ||
689 | m_window.width(), grip_height); | ||
690 | |||
691 | m_grip_left.moveResize(-handle_bw, -handle_bw, | ||
692 | grip_width, grip_height); | ||
693 | |||
694 | m_grip_right.moveResize(m_handle.width() - grip_width - handle_bw, -handle_bw, | ||
695 | grip_width, grip_height); | ||
684 | 696 | ||
697 | if (m_use_handle) { | ||
698 | m_handle.raise(); | ||
699 | client_height -= m_handle.height() + m_handle.borderWidth(); | ||
685 | } else { | 700 | } else { |
686 | m_handle.lower(); | 701 | m_handle.lower(); |
687 | } | 702 | } |
688 | 703 | ||
689 | m_clientarea.moveResize(0, client_top, | 704 | m_clientarea.moveResize(0, client_top, |
690 | m_window.width(), client_height); | 705 | m_window.width(), client_height); |
691 | |||
692 | } | 706 | } |
693 | 707 | ||
694 | 708 | ||
diff --git a/src/Window.cc b/src/Window.cc index ff67a8d..a7e3afa 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.265 2004/01/21 15:42:59 fluxgen Exp $ | 25 | // $Id: Window.cc,v 1.266 2004/01/23 10:37:08 rathnor Exp $ |
26 | 26 | ||
27 | #include "Window.hh" | 27 | #include "Window.hh" |
28 | 28 | ||
@@ -264,6 +264,7 @@ FluxboxWindow::FluxboxWindow(WinClient &client, FbWinFrameTheme &tm, | |||
264 | m_diesig(*this), | 264 | m_diesig(*this), |
265 | m_focussig(*this), | 265 | m_focussig(*this), |
266 | m_titlesig(*this), | 266 | m_titlesig(*this), |
267 | m_themelistener(*this), | ||
267 | moving(false), resizing(false), shaded(false), | 268 | moving(false), resizing(false), shaded(false), |
268 | iconic(false), focused(false), | 269 | iconic(false), focused(false), |
269 | stuck(false), m_managed(false), | 270 | stuck(false), m_managed(false), |
@@ -280,6 +281,8 @@ FluxboxWindow::FluxboxWindow(WinClient &client, FbWinFrameTheme &tm, | |||
280 | m_parent(client.screen().rootWindow()), | 281 | m_parent(client.screen().rootWindow()), |
281 | m_resize_corner(RIGHTBOTTOM) { | 282 | m_resize_corner(RIGHTBOTTOM) { |
282 | 283 | ||
284 | tm.reconfigSig().attach(&m_themelistener); | ||
285 | |||
283 | init(); | 286 | init(); |
284 | } | 287 | } |
285 | 288 | ||
@@ -3457,3 +3460,33 @@ void FluxboxWindow::setupWindow() { | |||
3457 | 3460 | ||
3458 | menu().reconfigure(); // update graphics | 3461 | menu().reconfigure(); // update graphics |
3459 | } | 3462 | } |
3463 | |||
3464 | |||
3465 | /** | ||
3466 | * reconfigTheme: must be called after frame is reconfigured | ||
3467 | * Client windows need to be made the same size and location as | ||
3468 | * the frame's client area. | ||
3469 | */ | ||
3470 | void FluxboxWindow::reconfigTheme() { | ||
3471 | |||
3472 | m_frame.setBorderWidth(decorations.border?frame().theme().border().width():0); | ||
3473 | if (decorations.handle && frame().theme().handleWidth() != 0) | ||
3474 | frame().showHandle(); | ||
3475 | else | ||
3476 | frame().hideHandle(); | ||
3477 | |||
3478 | ClientList::iterator it = clientList().begin(); | ||
3479 | ClientList::iterator it_end = clientList().end(); | ||
3480 | |||
3481 | int x = m_frame.clientArea().x(), | ||
3482 | y = m_frame.clientArea().y(); | ||
3483 | |||
3484 | unsigned int width = m_frame.clientArea().width(), | ||
3485 | height = m_frame.clientArea().height(); | ||
3486 | |||
3487 | for (; it != it_end; ++it) { | ||
3488 | (*it)->moveResize(x, y, width, height); | ||
3489 | } | ||
3490 | |||
3491 | sendConfigureNotify(); | ||
3492 | } | ||
diff --git a/src/Window.hh b/src/Window.hh index 71c0b71..0ee053f 100644 --- a/src/Window.hh +++ b/src/Window.hh | |||
@@ -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.hh,v 1.106 2004/01/18 19:14:08 fluxgen Exp $ | 25 | // $Id: Window.hh,v 1.107 2004/01/23 10:38:25 rathnor Exp $ |
26 | 26 | ||
27 | #ifndef WINDOW_HH | 27 | #ifndef WINDOW_HH |
28 | #define WINDOW_HH | 28 | #define WINDOW_HH |
@@ -352,6 +352,8 @@ public: | |||
352 | FbTk::Subject &titleSig() { return m_titlesig; } | 352 | FbTk::Subject &titleSig() { return m_titlesig; } |
353 | /** @} */ // end group signals | 353 | /** @} */ // end group signals |
354 | 354 | ||
355 | void reconfigTheme(); | ||
356 | |||
355 | const timeval &lastFocusTime() const { return m_last_focus_time;} | 357 | const timeval &lastFocusTime() const { return m_last_focus_time;} |
356 | 358 | ||
357 | //@} | 359 | //@} |
@@ -410,6 +412,17 @@ private: | |||
410 | // state and hint signals | 412 | // state and hint signals |
411 | WinSubject m_hintsig, m_statesig, m_layersig, m_workspacesig, m_diesig, m_focussig, m_titlesig; | 413 | WinSubject m_hintsig, m_statesig, m_layersig, m_workspacesig, m_diesig, m_focussig, m_titlesig; |
412 | 414 | ||
415 | class ThemeListener: public FbTk::Observer { | ||
416 | public: | ||
417 | ThemeListener(FluxboxWindow &win):m_win(win) { } | ||
418 | void update(FbTk::Subject *) { | ||
419 | m_win.reconfigTheme(); | ||
420 | } | ||
421 | private: | ||
422 | FluxboxWindow &m_win; | ||
423 | }; | ||
424 | ThemeListener m_themelistener; | ||
425 | |||
413 | // Window states | 426 | // Window states |
414 | bool moving, resizing, shaded, iconic, | 427 | bool moving, resizing, shaded, iconic, |
415 | focused, stuck, m_managed; | 428 | focused, stuck, m_managed; |