diff options
author | Mark Tiefenbruck <mark@fluxbox.org> | 2007-12-22 02:35:05 (GMT) |
---|---|---|
committer | Mark Tiefenbruck <mark@fluxbox.org> | 2007-12-22 02:35:05 (GMT) |
commit | 0906477984edbd9f6e62fed3800ea9a441919a58 (patch) | |
tree | ff45afc3bfc55814da023afea15e6d1a2be053aa | |
parent | f6ee704a1d3429c6dedb03d84b4d70103cf8db15 (diff) | |
download | fluxbox_lack-0906477984edbd9f6e62fed3800ea9a441919a58.zip fluxbox_lack-0906477984edbd9f6e62fed3800ea9a441919a58.tar.bz2 |
leave fullscreen windows on top, even without the focus, as long as focused window is on another head
-rw-r--r-- | src/Window.cc | 35 | ||||
-rw-r--r-- | src/Window.hh | 2 |
2 files changed, 32 insertions, 5 deletions
diff --git a/src/Window.cc b/src/Window.cc index fed465e..4c1bf64 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -1499,11 +1499,11 @@ void FluxboxWindow::setFullscreen(bool flag) { | |||
1499 | m_last_resize_x = frame().x(); | 1499 | m_last_resize_x = frame().x(); |
1500 | m_last_resize_y = frame().y(); | 1500 | m_last_resize_y = frame().y(); |
1501 | 1501 | ||
1502 | moveToLayer(::Layer::ABOVE_DOCK); | ||
1503 | |||
1504 | fullscreen = true; | 1502 | fullscreen = true; |
1505 | 1503 | ||
1506 | stateSig().notify(); | 1504 | setFullscreenLayer(); |
1505 | if (!isFocused()) | ||
1506 | screen().focusedWindowSig().attach(this); | ||
1507 | 1507 | ||
1508 | } else if (!flag && isFullscreen()) { | 1508 | } else if (!flag && isFullscreen()) { |
1509 | 1509 | ||
@@ -1541,6 +1541,21 @@ void FluxboxWindow::setFullscreen(bool flag) { | |||
1541 | } | 1541 | } |
1542 | } | 1542 | } |
1543 | 1543 | ||
1544 | void FluxboxWindow::setFullscreenLayer() { | ||
1545 | |||
1546 | FluxboxWindow *foc = FocusControl::focusedFbWindow(); | ||
1547 | // if another window on the same head is focused, make sure we can see it | ||
1548 | if (isFocused() || !foc || &foc->screen() != &screen() || | ||
1549 | getOnHead() != foc->getOnHead()) { | ||
1550 | moveToLayer(::Layer::ABOVE_DOCK); | ||
1551 | } else { | ||
1552 | moveToLayer(m_old_layernum); | ||
1553 | lower(); | ||
1554 | } | ||
1555 | stateSig().notify(); | ||
1556 | |||
1557 | } | ||
1558 | |||
1544 | /** | 1559 | /** |
1545 | Maximize window both horizontal and vertical | 1560 | Maximize window both horizontal and vertical |
1546 | */ | 1561 | */ |
@@ -1899,10 +1914,15 @@ void FluxboxWindow::setFocusFlag(bool focus) { | |||
1899 | 1914 | ||
1900 | installColormap(focus); | 1915 | installColormap(focus); |
1901 | 1916 | ||
1917 | // if we're fullscreen and another window gains focus on the same head, | ||
1918 | // then we need to let the user see it | ||
1902 | if (fullscreen && !focus) | 1919 | if (fullscreen && !focus) |
1903 | moveToLayer(m_old_layernum); | 1920 | screen().focusedWindowSig().attach(this); |
1904 | if (fullscreen && focus) | 1921 | |
1922 | if (fullscreen && focus) { | ||
1905 | moveToLayer(::Layer::ABOVE_DOCK); | 1923 | moveToLayer(::Layer::ABOVE_DOCK); |
1924 | screen().focusedWindowSig().detach(this); | ||
1925 | } | ||
1906 | 1926 | ||
1907 | if (focus != frame().focused()) | 1927 | if (focus != frame().focused()) |
1908 | frame().setFocus(focus); | 1928 | frame().setFocus(focus); |
@@ -2922,6 +2942,11 @@ void FluxboxWindow::update(FbTk::Subject *subj) { | |||
2922 | titleSig().notify(); | 2942 | titleSig().notify(); |
2923 | } | 2943 | } |
2924 | 2944 | ||
2945 | } else if (subj && typeid(*subj) == typeid(BScreen::ScreenSubject)) { | ||
2946 | if (subj == &screen().focusedWindowSig()) { | ||
2947 | if (FocusControl::focusedFbWindow()) | ||
2948 | setFullscreenLayer(); | ||
2949 | } | ||
2925 | } | 2950 | } |
2926 | } | 2951 | } |
2927 | 2952 | ||
diff --git a/src/Window.hh b/src/Window.hh index 032ea07..e75b84c 100644 --- a/src/Window.hh +++ b/src/Window.hh | |||
@@ -547,6 +547,8 @@ private: | |||
547 | void associateClientWindow(bool use_attrs = false, int x = 0, int y = 0, unsigned int width = 1, unsigned int height = 1, int gravity = ForgetGravity, unsigned int client_bw = 0); | 547 | void associateClientWindow(bool use_attrs = false, int x = 0, int y = 0, unsigned int width = 1, unsigned int height = 1, int gravity = ForgetGravity, unsigned int client_bw = 0); |
548 | 548 | ||
549 | void setState(unsigned long stateval, bool setting_up); | 549 | void setState(unsigned long stateval, bool setting_up); |
550 | /// set the layer of a fullscreen window | ||
551 | void setFullscreenLayer(); | ||
550 | 552 | ||
551 | // modifies left and top if snap is necessary | 553 | // modifies left and top if snap is necessary |
552 | void doSnapping(int &left, int &top); | 554 | void doSnapping(int &left, int &top); |