diff options
Diffstat (limited to 'src/Window.cc')
-rw-r--r-- | src/Window.cc | 61 |
1 files changed, 49 insertions, 12 deletions
diff --git a/src/Window.cc b/src/Window.cc index b03ee6f..f28f6ab 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -311,8 +311,7 @@ FluxboxWindow::FluxboxWindow(WinClient &client, FbWinFrameTheme &tm, | |||
311 | m_old_pos_x(0), m_old_pos_y(0), | 311 | m_old_pos_x(0), m_old_pos_y(0), |
312 | m_old_width(1), m_old_height(1), | 312 | m_old_width(1), m_old_height(1), |
313 | m_last_button_x(0), m_last_button_y(0), | 313 | m_last_button_x(0), m_last_button_y(0), |
314 | m_frame(tm, client.screen().imageControl(), 0, 0, 100, 100), | 314 | m_frame(client.screen(), tm, client.screen().imageControl(), layer, 0, 0, 100, 100), |
315 | m_layeritem(m_frame.window(), layer), | ||
316 | m_layernum(layer.getLayerNum()), | 315 | m_layernum(layer.getLayerNum()), |
317 | m_old_layernum(0), | 316 | m_old_layernum(0), |
318 | m_parent(client.screen().rootWindow()), | 317 | m_parent(client.screen().rootWindow()), |
@@ -344,6 +343,7 @@ FluxboxWindow::~FluxboxWindow() { | |||
344 | 343 | ||
345 | // no longer a valid window to do stuff with | 344 | // no longer a valid window to do stuff with |
346 | Fluxbox::instance()->removeWindowSearchGroup(frame().window().window()); | 345 | Fluxbox::instance()->removeWindowSearchGroup(frame().window().window()); |
346 | Fluxbox::instance()->removeWindowSearchGroup(frame().tabcontainer().window()); | ||
347 | 347 | ||
348 | Client2ButtonMap::iterator it = m_labelbuttons.begin(); | 348 | Client2ButtonMap::iterator it = m_labelbuttons.begin(); |
349 | Client2ButtonMap::iterator it_end = m_labelbuttons.end(); | 349 | Client2ButtonMap::iterator it_end = m_labelbuttons.end(); |
@@ -394,6 +394,12 @@ void FluxboxWindow::init() { | |||
394 | 394 | ||
395 | frame().setUseShape(!m_shaped); | 395 | frame().setUseShape(!m_shaped); |
396 | 396 | ||
397 | if (screen().getDefaultExternalTabs()) { | ||
398 | frame().setTabMode(FbWinFrame::EXTERNAL); | ||
399 | } else { | ||
400 | frame().setTabMode(FbWinFrame::INTERNAL); | ||
401 | } | ||
402 | |||
397 | //!! TODO init of client should be better | 403 | //!! TODO init of client should be better |
398 | // we don't want to duplicate code here and in attachClient | 404 | // we don't want to duplicate code here and in attachClient |
399 | m_clientlist.push_back(m_client); | 405 | m_clientlist.push_back(m_client); |
@@ -467,6 +473,7 @@ void FluxboxWindow::init() { | |||
467 | m_timer.fireOnce(true); | 473 | m_timer.fireOnce(true); |
468 | 474 | ||
469 | Fluxbox::instance()->saveWindowSearchGroup(frame().window().window(), this); | 475 | Fluxbox::instance()->saveWindowSearchGroup(frame().window().window(), this); |
476 | Fluxbox::instance()->saveWindowSearchGroup(frame().tabcontainer().window(), this); | ||
470 | 477 | ||
471 | /**************************************************/ | 478 | /**************************************************/ |
472 | /* Read state above here, apply state below here. */ | 479 | /* Read state above here, apply state below here. */ |
@@ -1146,8 +1153,11 @@ void FluxboxWindow::updateTitleFromClient(WinClient &client) { | |||
1146 | client.updateTitle(); | 1153 | client.updateTitle(); |
1147 | // compare old title with new and see if we need to update | 1154 | // compare old title with new and see if we need to update |
1148 | // graphics | 1155 | // graphics |
1149 | if (m_labelbuttons[&client]->text() != client.title()) | 1156 | if (m_labelbuttons[&client]->text() != client.title()) { |
1150 | m_labelbuttons[&client]->setText(client.title()); | 1157 | m_labelbuttons[&client]->setText(client.title()); |
1158 | if (&client == m_client) | ||
1159 | frame().setFocusTitle(client.title()); | ||
1160 | } | ||
1151 | } | 1161 | } |
1152 | 1162 | ||
1153 | /// update icon title from client | 1163 | /// update icon title from client |
@@ -2648,7 +2658,7 @@ void FluxboxWindow::buttonPressEvent(XButtonEvent &be) { | |||
2648 | setInputFocus(); | 2658 | setInputFocus(); |
2649 | } | 2659 | } |
2650 | 2660 | ||
2651 | if (frame().window().window() == be.window) { | 2661 | if (frame().window().window() == be.window || frame().tabcontainer().window() == be.window) { |
2652 | if (screen().clickRaises()) | 2662 | if (screen().clickRaises()) |
2653 | raise(); | 2663 | raise(); |
2654 | #ifdef DEBUG | 2664 | #ifdef DEBUG |
@@ -2694,17 +2704,28 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { | |||
2694 | if (isMoving() && me.window == parent()) { | 2704 | if (isMoving() && me.window == parent()) { |
2695 | me.window = frame().window().window(); | 2705 | me.window = frame().window().window(); |
2696 | } | 2706 | } |
2697 | bool inside_titlebar = (frame().titlebar() == me.window || frame().label() == me.window || | 2707 | |
2698 | frame().handle() == me.window || frame().window() == me.window); | 2708 | bool inside_titlebar = (frame().titlebar() == me.window |
2709 | || frame().label() == me.window | ||
2710 | || frame().tabcontainer() == me.window | ||
2711 | || frame().handle() == me.window | ||
2712 | || frame().window() == me.window); | ||
2699 | 2713 | ||
2700 | if (Fluxbox::instance()->getIgnoreBorder() | 2714 | if (Fluxbox::instance()->getIgnoreBorder() |
2701 | && !(me.state & Mod1Mask) // really should check for exact matches | 2715 | && !(me.state & Mod1Mask) // really should check for exact matches |
2702 | && !(isMoving() || isResizing() || m_attaching_tab != 0)) { | 2716 | && !(isMoving() || isResizing() || m_attaching_tab != 0)) { |
2703 | int borderw = frame().window().borderWidth(); | 2717 | int borderw = frame().window().borderWidth(); |
2704 | if (me.x_root < (frame().x() + borderw) || | 2718 | //!! TODO(tabs): the below test ought to be in FbWinFrame |
2719 | if ((me.x_root < (frame().x() + borderw) || | ||
2705 | me.y_root < (frame().y() + borderw) || | 2720 | me.y_root < (frame().y() + borderw) || |
2706 | me.x_root > (frame().x() + (int)frame().width() + borderw) || | 2721 | me.x_root > (frame().x() + (int)frame().width() + borderw) || |
2707 | me.y_root > (frame().y() + (int)frame().height() + borderw)) | 2722 | me.y_root > (frame().y() + (int)frame().height() + borderw)) && |
2723 | ( !frame().externalTabMode() || | ||
2724 | (me.x_root < (frame().tabcontainer().x() + borderw) || | ||
2725 | me.y_root < (frame().tabcontainer().y() + borderw) || | ||
2726 | me.x_root > (frame().tabcontainer().x() + (int)frame().tabcontainer().width() + borderw) || | ||
2727 | me.y_root > (frame().tabcontainer().y() + (int)frame().tabcontainer().height() + borderw) | ||
2728 | ))) | ||
2708 | return; | 2729 | return; |
2709 | } | 2730 | } |
2710 | 2731 | ||
@@ -2794,7 +2815,7 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { | |||
2794 | } else { | 2815 | } else { |
2795 | //moveResize(dx, dy, frame().width(), frame().height()); | 2816 | //moveResize(dx, dy, frame().width(), frame().height()); |
2796 | // need to move the base window without interfering with transparency | 2817 | // need to move the base window without interfering with transparency |
2797 | frame().window().moveResize(dx, dy, frame().width(), frame().height()); | 2818 | frame().quietMoveResize(dx, dy, frame().width(), frame().height()); |
2798 | } | 2819 | } |
2799 | 2820 | ||
2800 | screen().showPosition(dx, dy); | 2821 | screen().showPosition(dx, dy); |
@@ -3077,11 +3098,26 @@ void FluxboxWindow::applyDecorations(bool initial) { | |||
3077 | frame().setBorderWidth(border_width); | 3098 | frame().setBorderWidth(border_width); |
3078 | } | 3099 | } |
3079 | 3100 | ||
3080 | // we rely on frame not doing anything if it is already shown/hidden | 3101 | // tab deocration only affects if we're external |
3081 | if (decorations.titlebar) | 3102 | // must do before the setTabMode in case it goes |
3082 | client_move |= frame().showTitlebar(); | 3103 | // to external and is meant to be hidden |
3104 | if (decorations.tab) | ||
3105 | client_move |= frame().showTabs(); | ||
3083 | else | 3106 | else |
3107 | client_move |= frame().hideTabs(); | ||
3108 | |||
3109 | // we rely on frame not doing anything if it is already shown/hidden | ||
3110 | if (decorations.titlebar) { | ||
3111 | bool change = frame().showTitlebar(); | ||
3112 | client_move |= change; | ||
3113 | if (change && !screen().getDefaultExternalTabs()) { | ||
3114 | client_move |= frame().setTabMode(FbWinFrame::INTERNAL); | ||
3115 | } | ||
3116 | } else { | ||
3084 | client_move |= frame().hideTitlebar(); | 3117 | client_move |= frame().hideTitlebar(); |
3118 | if (decorations.tab) | ||
3119 | client_move |= frame().setTabMode(FbWinFrame::EXTERNAL); | ||
3120 | } | ||
3085 | 3121 | ||
3086 | if (decorations.handle) { | 3122 | if (decorations.handle) { |
3087 | client_move |= frame().showHandle(); | 3123 | client_move |= frame().showHandle(); |
@@ -4048,6 +4084,7 @@ void FluxboxWindow::associateClient(WinClient &client) { | |||
4048 | Fluxbox::instance()->getTabsPadding()); | 4084 | Fluxbox::instance()->getTabsPadding()); |
4049 | 4085 | ||
4050 | m_labelbuttons[&client] = btn; | 4086 | m_labelbuttons[&client] = btn; |
4087 | |||
4051 | 4088 | ||
4052 | 4089 | ||
4053 | FbTk::EventManager &evm = *FbTk::EventManager::instance(); | 4090 | FbTk::EventManager &evm = *FbTk::EventManager::instance(); |