diff options
Diffstat (limited to 'src/Window.cc')
-rw-r--r-- | src/Window.cc | 77 |
1 files changed, 35 insertions, 42 deletions
diff --git a/src/Window.cc b/src/Window.cc index 57fa1f5..7c3e36c 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -39,7 +39,6 @@ | |||
39 | #include "Remember.hh" | 39 | #include "Remember.hh" |
40 | #include "MenuCreator.hh" | 40 | #include "MenuCreator.hh" |
41 | #include "FocusControl.hh" | 41 | #include "FocusControl.hh" |
42 | #include "Layer.hh" | ||
43 | #include "IconButton.hh" | 42 | #include "IconButton.hh" |
44 | #include "ScreenPlacement.hh" | 43 | #include "ScreenPlacement.hh" |
45 | 44 | ||
@@ -261,7 +260,7 @@ private: | |||
261 | 260 | ||
262 | int FluxboxWindow::s_num_grabs = 0; | 261 | int FluxboxWindow::s_num_grabs = 0; |
263 | 262 | ||
264 | FluxboxWindow::FluxboxWindow(WinClient &client, FbTk::XLayer &layer): | 263 | FluxboxWindow::FluxboxWindow(WinClient &client): |
265 | Focusable(client.screen(), this), | 264 | Focusable(client.screen(), this), |
266 | oplock(false), | 265 | oplock(false), |
267 | m_hintsig(*this), | 266 | m_hintsig(*this), |
@@ -269,7 +268,7 @@ FluxboxWindow::FluxboxWindow(WinClient &client, FbTk::XLayer &layer): | |||
269 | m_layersig(*this), | 268 | m_layersig(*this), |
270 | m_workspacesig(*this), | 269 | m_workspacesig(*this), |
271 | m_creation_time(0), | 270 | m_creation_time(0), |
272 | moving(false), resizing(false), iconic(false), stuck(false), | 271 | moving(false), resizing(false), |
273 | m_initialized(false), | 272 | m_initialized(false), |
274 | m_attaching_tab(0), | 273 | m_attaching_tab(0), |
275 | display(FbTk::App::instance()->display()), | 274 | display(FbTk::App::instance()->display()), |
@@ -281,8 +280,6 @@ FluxboxWindow::FluxboxWindow(WinClient &client, FbTk::XLayer &layer): | |||
281 | m_old_decoration_mask(0), | 280 | m_old_decoration_mask(0), |
282 | m_client(&client), | 281 | m_client(&client), |
283 | m_toggled_decos(false), | 282 | m_toggled_decos(false), |
284 | m_icon_hidden(false), | ||
285 | m_focus_hidden(false), | ||
286 | m_focus_new(BoolAcc(screen().focusControl(), &FocusControl::focusNew)), | 283 | m_focus_new(BoolAcc(screen().focusControl(), &FocusControl::focusNew)), |
287 | m_mouse_focus(BoolAcc(screen().focusControl(), &FocusControl::isMouseFocus)), | 284 | m_mouse_focus(BoolAcc(screen().focusControl(), &FocusControl::isMouseFocus)), |
288 | m_click_focus(true), | 285 | m_click_focus(true), |
@@ -291,9 +288,8 @@ FluxboxWindow::FluxboxWindow(WinClient &client, FbTk::XLayer &layer): | |||
291 | screen().unfocusedWinButtonTheme()), | 288 | screen().unfocusedWinButtonTheme()), |
292 | m_theme(*this, screen().focusedWinFrameTheme(), | 289 | m_theme(*this, screen().focusedWinFrameTheme(), |
293 | screen().unfocusedWinFrameTheme()), | 290 | screen().unfocusedWinFrameTheme()), |
294 | m_frame(client.screen(), m_theme, layer, m_state), | 291 | m_frame(client.screen(), m_state, m_theme), |
295 | m_placed(false), | 292 | m_placed(false), |
296 | m_layernum(layer.getLayerNum()), | ||
297 | m_old_layernum(0), | 293 | m_old_layernum(0), |
298 | m_parent(client.screen().rootWindow()), | 294 | m_parent(client.screen().rootWindow()), |
299 | m_resize_corner(RIGHTBOTTOM) { | 295 | m_resize_corner(RIGHTBOTTOM) { |
@@ -440,7 +436,7 @@ void FluxboxWindow::init() { | |||
440 | /**************************************************/ | 436 | /**************************************************/ |
441 | 437 | ||
442 | if (m_client->isTransient() && m_client->transientFor()->fbwindow()) | 438 | if (m_client->isTransient() && m_client->transientFor()->fbwindow()) |
443 | stuck = m_client->transientFor()->fbwindow()->isStuck(); | 439 | m_state.stuck = m_client->transientFor()->fbwindow()->isStuck(); |
444 | 440 | ||
445 | if (!m_client->sizeHints().isResizable()) { | 441 | if (!m_client->sizeHints().isResizable()) { |
446 | functions.resize = functions.maximize = false; | 442 | functions.resize = functions.maximize = false; |
@@ -485,7 +481,7 @@ void FluxboxWindow::init() { | |||
485 | m_client->transientFor()->fbwindow() != this) | 481 | m_client->transientFor()->fbwindow() != this) |
486 | layerItem().setLayer(m_client->transientFor()->fbwindow()->layerItem().getLayer()); | 482 | layerItem().setLayer(m_client->transientFor()->fbwindow()->layerItem().getLayer()); |
487 | else // if no parent then set default layer | 483 | else // if no parent then set default layer |
488 | moveToLayer(m_layernum, m_layernum != ::Layer::NORMAL); | 484 | moveToLayer(m_state.layernum, m_state.layernum != ::Layer::NORMAL); |
489 | 485 | ||
490 | // transients should be on the same workspace as parent | 486 | // transients should be on the same workspace as parent |
491 | if (m_client->isTransient() && | 487 | if (m_client->isTransient() && |
@@ -515,8 +511,8 @@ void FluxboxWindow::init() { | |||
515 | 511 | ||
516 | setFocusFlag(false); // update graphics before mapping | 512 | setFocusFlag(false); // update graphics before mapping |
517 | 513 | ||
518 | if (stuck) { | 514 | if (m_state.stuck) { |
519 | stuck = false; | 515 | m_state.stuck = false; |
520 | stick(); | 516 | stick(); |
521 | } | 517 | } |
522 | 518 | ||
@@ -525,11 +521,11 @@ void FluxboxWindow::init() { | |||
525 | shade(); | 521 | shade(); |
526 | } | 522 | } |
527 | 523 | ||
528 | if (iconic) { | 524 | if (m_state.iconic) { |
529 | iconic = false; | 525 | m_state.iconic = false; |
530 | iconify(); | 526 | iconify(); |
531 | } else if (m_workspace_number == screen().currentWorkspaceID()) { | 527 | } else if (m_workspace_number == screen().currentWorkspaceID()) { |
532 | iconic = true; | 528 | m_state.iconic = true; |
533 | deiconify(false); | 529 | deiconify(false); |
534 | // check if we should prevent this window from gaining focus | 530 | // check if we should prevent this window from gaining focus |
535 | m_focused = false; // deiconify sets this | 531 | m_focused = false; // deiconify sets this |
@@ -1374,7 +1370,7 @@ void FluxboxWindow::iconify() { | |||
1374 | if (isIconic()) // no need to iconify if we're already | 1370 | if (isIconic()) // no need to iconify if we're already |
1375 | return; | 1371 | return; |
1376 | 1372 | ||
1377 | iconic = true; | 1373 | m_state.iconic = true; |
1378 | m_statesig.notify(); | 1374 | m_statesig.notify(); |
1379 | 1375 | ||
1380 | hide(true); | 1376 | hide(true); |
@@ -1396,14 +1392,14 @@ void FluxboxWindow::iconify() { | |||
1396 | } | 1392 | } |
1397 | 1393 | ||
1398 | void FluxboxWindow::deiconify(bool do_raise) { | 1394 | void FluxboxWindow::deiconify(bool do_raise) { |
1399 | if (numClients() == 0 || !iconic || oplock) | 1395 | if (numClients() == 0 || !m_state.iconic || oplock) |
1400 | return; | 1396 | return; |
1401 | 1397 | ||
1402 | oplock = true; | 1398 | oplock = true; |
1403 | 1399 | ||
1404 | // reassociate first, so it gets removed from screen's icon list | 1400 | // reassociate first, so it gets removed from screen's icon list |
1405 | screen().reassociateWindow(this, m_workspace_number, false); | 1401 | screen().reassociateWindow(this, m_workspace_number, false); |
1406 | iconic = false; | 1402 | m_state.iconic = false; |
1407 | m_statesig.notify(); | 1403 | m_statesig.notify(); |
1408 | 1404 | ||
1409 | // deiconify all transients | 1405 | // deiconify all transients |
@@ -1544,7 +1540,7 @@ void FluxboxWindow::setWorkspace(int n) { | |||
1544 | m_workspace_number = n; | 1540 | m_workspace_number = n; |
1545 | 1541 | ||
1546 | // notify workspace change | 1542 | // notify workspace change |
1547 | if (m_initialized && !stuck && old_wkspc != m_workspace_number) { | 1543 | if (m_initialized && old_wkspc != m_workspace_number) { |
1548 | #ifdef DEBUG | 1544 | #ifdef DEBUG |
1549 | cerr<<this<<" notify workspace signal"<<endl; | 1545 | cerr<<this<<" notify workspace signal"<<endl; |
1550 | #endif // DEBUG | 1546 | #endif // DEBUG |
@@ -1553,7 +1549,7 @@ void FluxboxWindow::setWorkspace(int n) { | |||
1553 | } | 1549 | } |
1554 | 1550 | ||
1555 | void FluxboxWindow::setLayerNum(int layernum) { | 1551 | void FluxboxWindow::setLayerNum(int layernum) { |
1556 | m_layernum = layernum; | 1552 | m_state.layernum = layernum; |
1557 | 1553 | ||
1558 | if (m_initialized) { | 1554 | if (m_initialized) { |
1559 | #ifdef DEBUG | 1555 | #ifdef DEBUG |
@@ -1595,7 +1591,7 @@ void FluxboxWindow::setShaded(bool val) { | |||
1595 | 1591 | ||
1596 | void FluxboxWindow::stick() { | 1592 | void FluxboxWindow::stick() { |
1597 | 1593 | ||
1598 | stuck = !stuck; | 1594 | m_state.stuck = !m_state.stuck; |
1599 | 1595 | ||
1600 | if (m_initialized) { | 1596 | if (m_initialized) { |
1601 | stateSig().notify(); | 1597 | stateSig().notify(); |
@@ -1611,7 +1607,7 @@ void FluxboxWindow::stick() { | |||
1611 | WinClient::TransientList::const_iterator it_end = (*client_it)->transientList().end(); | 1607 | WinClient::TransientList::const_iterator it_end = (*client_it)->transientList().end(); |
1612 | for (; it != it_end; ++it) { | 1608 | for (; it != it_end; ++it) { |
1613 | if ((*it)->fbwindow()) | 1609 | if ((*it)->fbwindow()) |
1614 | (*it)->fbwindow()->setStuck(stuck); | 1610 | (*it)->fbwindow()->setStuck(m_state.stuck); |
1615 | } | 1611 | } |
1616 | 1612 | ||
1617 | } | 1613 | } |
@@ -1619,7 +1615,7 @@ void FluxboxWindow::stick() { | |||
1619 | } | 1615 | } |
1620 | 1616 | ||
1621 | void FluxboxWindow::setStuck(bool val) { | 1617 | void FluxboxWindow::setStuck(bool val) { |
1622 | if (val != stuck) | 1618 | if (val != m_state.stuck) |
1623 | stick(); | 1619 | stick(); |
1624 | } | 1620 | } |
1625 | 1621 | ||
@@ -1685,11 +1681,11 @@ void FluxboxWindow::tempRaise() { | |||
1685 | 1681 | ||
1686 | 1682 | ||
1687 | void FluxboxWindow::raiseLayer() { | 1683 | void FluxboxWindow::raiseLayer() { |
1688 | moveToLayer(m_layernum-1); | 1684 | moveToLayer(m_state.layernum-1); |
1689 | } | 1685 | } |
1690 | 1686 | ||
1691 | void FluxboxWindow::lowerLayer() { | 1687 | void FluxboxWindow::lowerLayer() { |
1692 | moveToLayer(m_layernum+1); | 1688 | moveToLayer(m_state.layernum+1); |
1693 | } | 1689 | } |
1694 | 1690 | ||
1695 | 1691 | ||
@@ -1705,9 +1701,9 @@ void FluxboxWindow::moveToLayer(int layernum, bool force) { | |||
1705 | layernum = ::Layer::NUM_LAYERS - 1; | 1701 | layernum = ::Layer::NUM_LAYERS - 1; |
1706 | 1702 | ||
1707 | if (!m_initialized) | 1703 | if (!m_initialized) |
1708 | m_layernum = layernum; | 1704 | m_state.layernum = layernum; |
1709 | 1705 | ||
1710 | if ((m_layernum == layernum && !force) || !m_client) | 1706 | if ((m_state.layernum == layernum && !force) || !m_client) |
1711 | return; | 1707 | return; |
1712 | 1708 | ||
1713 | // get root window | 1709 | // get root window |
@@ -1741,13 +1737,13 @@ void FluxboxWindow::moveToLayer(int layernum, bool force) { | |||
1741 | } | 1737 | } |
1742 | 1738 | ||
1743 | void FluxboxWindow::setFocusHidden(bool value) { | 1739 | void FluxboxWindow::setFocusHidden(bool value) { |
1744 | m_focus_hidden = value; | 1740 | m_state.focus_hidden = value; |
1745 | if (m_initialized) | 1741 | if (m_initialized) |
1746 | m_statesig.notify(); | 1742 | m_statesig.notify(); |
1747 | } | 1743 | } |
1748 | 1744 | ||
1749 | void FluxboxWindow::setIconHidden(bool value) { | 1745 | void FluxboxWindow::setIconHidden(bool value) { |
1750 | m_icon_hidden= value; | 1746 | m_state.icon_hidden = value; |
1751 | if (m_initialized) | 1747 | if (m_initialized) |
1752 | m_statesig.notify(); | 1748 | m_statesig.notify(); |
1753 | } | 1749 | } |
@@ -2058,7 +2054,7 @@ void FluxboxWindow::mapNotifyEvent(XMapEvent &ne) { | |||
2058 | if (ne.override_redirect || !isVisible() || !client->validateClient()) | 2054 | if (ne.override_redirect || !isVisible() || !client->validateClient()) |
2059 | return; | 2055 | return; |
2060 | 2056 | ||
2061 | iconic = false; | 2057 | m_state.iconic = false; |
2062 | 2058 | ||
2063 | // setting state will cause all tabs to be mapped, but we only want the | 2059 | // setting state will cause all tabs to be mapped, but we only want the |
2064 | // original tab to be focused | 2060 | // original tab to be focused |
@@ -3415,10 +3411,6 @@ std::string FluxboxWindow::getWMRole() const { | |||
3415 | return (m_client ? m_client->getWMRole() : "FluxboxWindow"); | 3411 | return (m_client ? m_client->getWMRole() : "FluxboxWindow"); |
3416 | } | 3412 | } |
3417 | 3413 | ||
3418 | Focusable::WindowType FluxboxWindow::getWindowType() const { | ||
3419 | return (m_client ? m_client->getWindowType() : Focusable::TYPE_NORMAL); | ||
3420 | } | ||
3421 | |||
3422 | bool FluxboxWindow::isTransient() const { | 3414 | bool FluxboxWindow::isTransient() const { |
3423 | return (m_client && m_client->isTransient()); | 3415 | return (m_client && m_client->isTransient()); |
3424 | } | 3416 | } |
@@ -3803,9 +3795,10 @@ void FluxboxWindow::placeWindow(int head) { | |||
3803 | move(new_x, new_y); | 3795 | move(new_x, new_y); |
3804 | } | 3796 | } |
3805 | 3797 | ||
3806 | void FluxboxWindow::setWindowType(Focusable::WindowType type) { | 3798 | void FluxboxWindow::setWindowType(WindowState::WindowType type) { |
3799 | m_state.type = type; | ||
3807 | switch (type) { | 3800 | switch (type) { |
3808 | case Focusable::TYPE_DOCK: | 3801 | case WindowState::TYPE_DOCK: |
3809 | /* From Extended Window Manager Hints, draft 1.3: | 3802 | /* From Extended Window Manager Hints, draft 1.3: |
3810 | * | 3803 | * |
3811 | * _NET_WM_WINDOW_TYPE_DOCK indicates a dock or panel feature. | 3804 | * _NET_WM_WINDOW_TYPE_DOCK indicates a dock or panel feature. |
@@ -3821,7 +3814,7 @@ void FluxboxWindow::setWindowType(Focusable::WindowType type) { | |||
3821 | setDecorationMask(WindowState::DECOR_NONE); | 3814 | setDecorationMask(WindowState::DECOR_NONE); |
3822 | moveToLayer(::Layer::DOCK); | 3815 | moveToLayer(::Layer::DOCK); |
3823 | break; | 3816 | break; |
3824 | case Focusable::TYPE_DESKTOP: | 3817 | case WindowState::TYPE_DESKTOP: |
3825 | /* | 3818 | /* |
3826 | * _NET_WM_WINDOW_TYPE_DESKTOP indicates a "false desktop" window | 3819 | * _NET_WM_WINDOW_TYPE_DESKTOP indicates a "false desktop" window |
3827 | * We let it be the size it wants, but it gets no decoration, | 3820 | * We let it be the size it wants, but it gets no decoration, |
@@ -3837,9 +3830,9 @@ void FluxboxWindow::setWindowType(Focusable::WindowType type) { | |||
3837 | setTabable(false); | 3830 | setTabable(false); |
3838 | setMovable(false); | 3831 | setMovable(false); |
3839 | setResizable(false); | 3832 | setResizable(false); |
3840 | stick(); | 3833 | setStuck(true); |
3841 | break; | 3834 | break; |
3842 | case Focusable::TYPE_SPLASH: | 3835 | case WindowState::TYPE_SPLASH: |
3843 | /* | 3836 | /* |
3844 | * _NET_WM_WINDOW_TYPE_SPLASH indicates that the | 3837 | * _NET_WM_WINDOW_TYPE_SPLASH indicates that the |
3845 | * window is a splash screen displayed as an application | 3838 | * window is a splash screen displayed as an application |
@@ -3853,11 +3846,11 @@ void FluxboxWindow::setWindowType(Focusable::WindowType type) { | |||
3853 | setClickFocus(false); | 3846 | setClickFocus(false); |
3854 | setMovable(false); | 3847 | setMovable(false); |
3855 | break; | 3848 | break; |
3856 | case Focusable::TYPE_DIALOG: | 3849 | case WindowState::TYPE_DIALOG: |
3857 | setTabable(false); | 3850 | setTabable(false); |
3858 | break; | 3851 | break; |
3859 | case Focusable::TYPE_MENU: | 3852 | case WindowState::TYPE_MENU: |
3860 | case Focusable::TYPE_TOOLBAR: | 3853 | case WindowState::TYPE_TOOLBAR: |
3861 | /* | 3854 | /* |
3862 | * _NET_WM_WINDOW_TYPE_TOOLBAR and _NET_WM_WINDOW_TYPE_MENU | 3855 | * _NET_WM_WINDOW_TYPE_TOOLBAR and _NET_WM_WINDOW_TYPE_MENU |
3863 | * indicate toolbar and pinnable menu windows, respectively | 3856 | * indicate toolbar and pinnable menu windows, respectively |
@@ -3869,7 +3862,7 @@ void FluxboxWindow::setWindowType(Focusable::WindowType type) { | |||
3869 | setIconHidden(true); | 3862 | setIconHidden(true); |
3870 | moveToLayer(::Layer::ABOVE_DOCK); | 3863 | moveToLayer(::Layer::ABOVE_DOCK); |
3871 | break; | 3864 | break; |
3872 | case Focusable::TYPE_NORMAL: | 3865 | case WindowState::TYPE_NORMAL: |
3873 | default: | 3866 | default: |
3874 | break; | 3867 | break; |
3875 | } | 3868 | } |