aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BUGS12
-rw-r--r--ChangeLog3
-rw-r--r--src/FbTk/Menu.hh3
-rw-r--r--src/FbTk/MultLayers.cc8
-rw-r--r--src/FbTk/MultLayers.hh8
-rw-r--r--src/FbTk/XLayer.cc7
-rw-r--r--src/WinClient.cc21
-rw-r--r--src/WinClient.hh11
-rw-r--r--src/Window.cc70
-rw-r--r--src/fluxbox.cc12
10 files changed, 104 insertions, 51 deletions
diff --git a/BUGS b/BUGS
index 0ceb3ac..8250bbd 100644
--- a/BUGS
+++ b/BUGS
@@ -14,14 +14,10 @@ BUGS:
14 * After startup the font of the toolbar is to big; reload config works 14 * After startup the font of the toolbar is to big; reload config works
15 around this. 15 around this.
16 => is this fixed now?? (as of ResourceManager changes) 16 => is this fixed now?? (as of ResourceManager changes)
17 => Don't think so, extra info = seems to happen for Multiple screens
17 18
18 * Saving of number of workspaces on restart 19 * Saving of number of workspaces on restart
19 20
20 * Multiple transients:
21 in openoffice - focus jumps between until user does something
22 in mozilla - alt-tabbing does strange thigns with other transient
23 layer-wise (other transient flashes)
24
25 * gaim (0.64) crashes when remembering dimensions... is this a gaim 21 * gaim (0.64) crashes when remembering dimensions... is this a gaim
26 bug? 22 bug?
27 23
@@ -78,6 +74,12 @@ Fixed bugs (or not-our-fault bugs):
78 indicate the change until you point to another option. 74 indicate the change until you point to another option.
79 => Fixed 75 => Fixed
80 76
77 * Multiple transients:
78 in openoffice - focus jumps between until user does something
79 in mozilla - alt-tabbing does strange thigns with other transient
80 layer-wise (other transient flashes)
81 => fixed
82
81------------------------------ 83------------------------------
82Core dumps and notes 84Core dumps and notes
83 85
diff --git a/ChangeLog b/ChangeLog
index 50bebe3..5622ba0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,9 @@
1(Format: Year/Month/Day) 1(Format: Year/Month/Day)
2Changes for 0.9.5: 2Changes for 0.9.5:
3*03/07/20: 3*03/07/20:
4 * Fix aspects of focus and raising, including transients (Simon)
5 - fixes focus toggling with transients and sloppy focus
6 WinClient.hh/cc Window.cc fluxbox.cc MultLayers.hh/cc XLayer.hh/cc Menu.hh
4 * Fix menu [re]drawing, particularly when selecting options (Simon) 7 * Fix menu [re]drawing, particularly when selecting options (Simon)
5 Menu.hh/cc 8 Menu.hh/cc
6 * Fix disappearing Remember menu, plus titles of sub-window menus 9 * Fix disappearing Remember menu, plus titles of sub-window menus
diff --git a/src/FbTk/Menu.hh b/src/FbTk/Menu.hh
index 9ab69b4..fba7ae2 100644
--- a/src/FbTk/Menu.hh
+++ b/src/FbTk/Menu.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: Menu.hh,v 1.21 2003/07/20 10:41:56 rathnor Exp $ 25// $Id: Menu.hh,v 1.22 2003/07/20 18:05:39 rathnor Exp $
26 26
27#ifndef FBTK_MENU_HH 27#ifndef FBTK_MENU_HH
28#define FBTK_MENU_HH 28#define FBTK_MENU_HH
@@ -37,7 +37,6 @@
37#include "RefCount.hh" 37#include "RefCount.hh"
38#include "Command.hh" 38#include "Command.hh"
39#include "Observer.hh" 39#include "Observer.hh"
40#include "XLayerItem.hh"
41#include "FbPixmap.hh" 40#include "FbPixmap.hh"
42#include "MenuTheme.hh" 41#include "MenuTheme.hh"
43 42
diff --git a/src/FbTk/MultLayers.cc b/src/FbTk/MultLayers.cc
index fea4dae..9e3272b 100644
--- a/src/FbTk/MultLayers.cc
+++ b/src/FbTk/MultLayers.cc
@@ -20,7 +20,7 @@
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE. 21// DEALINGS IN THE SOFTWARE.
22 22
23// $Id: MultLayers.cc,v 1.6 2003/02/18 15:08:12 rathnor Exp $ 23// $Id: MultLayers.cc,v 1.7 2003/07/20 18:05:39 rathnor Exp $
24 24
25#include "MultLayers.hh" 25#include "MultLayers.hh"
26#include "XLayer.hh" 26#include "XLayer.hh"
@@ -32,7 +32,9 @@ using namespace std;
32 32
33using namespace FbTk; 33using namespace FbTk;
34 34
35MultLayers::MultLayers(int numlayers) { 35MultLayers::MultLayers(int numlayers) :
36 m_lock(0)
37{
36 for (int i=0; i < numlayers; ++i) 38 for (int i=0; i < numlayers; ++i)
37 m_layers.push_back(new XLayer(*this, i)); 39 m_layers.push_back(new XLayer(*this, i));
38} 40}
@@ -150,6 +152,8 @@ void MultLayers::moveToLayer(XLayerItem &item, int layernum) {
150} 152}
151 153
152void MultLayers::restack() { 154void MultLayers::restack() {
155 if (!isUpdatable())
156 return;
153 157
154 int layernum=0, winnum=0, size = this->size(); 158 int layernum=0, winnum=0, size = this->size();
155 159
diff --git a/src/FbTk/MultLayers.hh b/src/FbTk/MultLayers.hh
index 5cfc731..29c80a8 100644
--- a/src/FbTk/MultLayers.hh
+++ b/src/FbTk/MultLayers.hh
@@ -20,7 +20,7 @@
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE. 21// DEALINGS IN THE SOFTWARE.
22 22
23// $Id: MultLayers.hh,v 1.5 2003/02/09 14:11:14 rathnor Exp $ 23// $Id: MultLayers.hh,v 1.6 2003/07/20 18:05:40 rathnor Exp $
24 24
25#ifndef FBTK_MULTLAYERS_HH 25#ifndef FBTK_MULTLAYERS_HH
26#define FBTK_MULTLAYERS_HH 26#define FBTK_MULTLAYERS_HH
@@ -59,9 +59,15 @@ public:
59 XLayer *getLayer(size_t num); 59 XLayer *getLayer(size_t num);
60 const XLayer *getLayer(size_t num) const; 60 const XLayer *getLayer(size_t num) const;
61 61
62 inline bool isUpdatable() const { return m_lock == 0; }
63 inline void lock() { ++m_lock; }
64 inline void unlock() { if (--m_lock == 0) restack(); }
65
62private: 66private:
63 std::vector<XLayer *> m_layers; 67 std::vector<XLayer *> m_layers;
64 68
69 int m_lock;
70
65}; 71};
66 72
67}; 73};
diff --git a/src/FbTk/XLayer.cc b/src/FbTk/XLayer.cc
index 023a80d..8164444 100644
--- a/src/FbTk/XLayer.cc
+++ b/src/FbTk/XLayer.cc
@@ -20,7 +20,7 @@
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE. 21// DEALINGS IN THE SOFTWARE.
22 22
23// $Id: XLayer.cc,v 1.8 2003/04/15 23:20:31 rathnor Exp $ 23// $Id: XLayer.cc,v 1.9 2003/07/20 18:05:40 rathnor Exp $
24 24
25#include "XLayer.hh" 25#include "XLayer.hh"
26#include "XLayerItem.hh" 26#include "XLayerItem.hh"
@@ -39,6 +39,9 @@ XLayer::~XLayer() {
39} 39}
40 40
41void XLayer::restack() { 41void XLayer::restack() {
42 if (!m_manager.isUpdatable())
43 return;
44
42 int num_windows = countWindows(); 45 int num_windows = countWindows();
43 46
44 // each LayerItem can contain several windows 47 // each LayerItem can contain several windows
@@ -78,6 +81,8 @@ int XLayer::countWindows() {
78 81
79// Stack all windows associated with 'item' below the 'above' item 82// Stack all windows associated with 'item' below the 'above' item
80void XLayer::stackBelowItem(XLayerItem *item, XLayerItem *above) { 83void XLayer::stackBelowItem(XLayerItem *item, XLayerItem *above) {
84 if (!m_manager.isUpdatable())
85 return;
81 86
82 Window *winlist; 87 Window *winlist;
83 size_t winnum, size, num = item->numWindows(); 88 size_t winnum, size, num = item->numWindows();
diff --git a/src/WinClient.cc b/src/WinClient.cc
index ddd3cd1..416dd63 100644
--- a/src/WinClient.cc
+++ b/src/WinClient.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: WinClient.cc,v 1.17 2003/07/10 11:58:13 fluxgen Exp $ 22// $Id: WinClient.cc,v 1.18 2003/07/20 18:05:39 rathnor Exp $
23 23
24#include "WinClient.hh" 24#include "WinClient.hh"
25 25
@@ -54,7 +54,7 @@ WinClient::WinClient(Window win, BScreen &screen, FluxboxWindow *fbwin):FbTk::Fb
54 wm_hint_flags(0), 54 wm_hint_flags(0),
55 send_focus_message(false), 55 send_focus_message(false),
56 m_win(fbwin), 56 m_win(fbwin),
57 modal(false), 57 m_modal(0),
58 m_title(""), m_icon_title(""), 58 m_title(""), m_icon_title(""),
59 m_class_name(""), m_instance_name(""), 59 m_class_name(""), m_instance_name(""),
60 m_blackbox_hint(0), 60 m_blackbox_hint(0),
@@ -245,8 +245,9 @@ void WinClient::updateTransientInfo() {
245 return; 245 return;
246 246
247 if (win != None && m_win->screen().rootWindow() == win) { 247 if (win != None && m_win->screen().rootWindow() == win) {
248 modal = true; 248 // transient for root window... = transient for group
249 return; // transient for root window... 249 // I don't think we are group-aware yet
250 return;
250 } 251 }
251 252
252 FluxboxWindow *transient_win = Fluxbox::instance()->searchWindow(win); 253 FluxboxWindow *transient_win = Fluxbox::instance()->searchWindow(win);
@@ -514,3 +515,15 @@ bool WinClient::hasGroupLeftWindow() const {
514 } 515 }
515 return false; 516 return false;
516} 517}
518
519void WinClient::addModal() {
520 ++m_modal;
521 if (transient_for)
522 transient_for->addModal();
523}
524
525void WinClient::removeModal() {
526 --m_modal;
527 if (transient_for)
528 transient_for->removeModal();
529}
diff --git a/src/WinClient.hh b/src/WinClient.hh
index c72208f..cedbdd7 100644
--- a/src/WinClient.hh
+++ b/src/WinClient.hh
@@ -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: WinClient.hh,v 1.8 2003/06/23 14:16:05 rathnor Exp $ 22// $Id: WinClient.hh,v 1.9 2003/07/20 18:05:39 rathnor Exp $
23 23
24#ifndef WINCLIENT_HH 24#ifndef WINCLIENT_HH
25#define WINCLIENT_HH 25#define WINCLIENT_HH
@@ -70,7 +70,10 @@ public:
70 TransientList &transientList() { return transients; } 70 TransientList &transientList() { return transients; }
71 const TransientList &transientList() const { return transients; } 71 const TransientList &transientList() const { return transients; }
72 bool isTransient() const { return transient_for != 0; } 72 bool isTransient() const { return transient_for != 0; }
73 bool isModal() const { return modal; } 73
74 bool isModal() const { return m_modal > 0; }
75 void addModal(); // some transient of ours (or us) is modal
76 void removeModal(); // some transient (or us) is no longer modal
74 77
75 bool operator == (const FluxboxWindow &win) const { 78 bool operator == (const FluxboxWindow &win) const {
76 return (m_win == &win); 79 return (m_win == &win);
@@ -138,7 +141,9 @@ public:
138 enum { F_NOINPUT = 0, F_PASSIVE, F_LOCALLYACTIVE, F_GLOBALLYACTIVE }; 141 enum { F_NOINPUT = 0, F_PASSIVE, F_LOCALLYACTIVE, F_GLOBALLYACTIVE };
139 142
140private: 143private:
141 bool modal; 144 // number of transients which we are modal for
145 // or indicates that we are modal if don't have any transients
146 int m_modal;
142 147
143 std::string m_title, m_icon_title; 148 std::string m_title, m_icon_title;
144 std::string m_class_name, m_instance_name; 149 std::string m_class_name, m_instance_name;
diff --git a/src/Window.cc b/src/Window.cc
index bfb7dae..4e45370 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.206 2003/07/20 08:12:36 rathnor Exp $ 25// $Id: Window.cc,v 1.207 2003/07/20 18:05:39 rathnor Exp $
26 26
27#include "Window.hh" 27#include "Window.hh"
28 28
@@ -145,6 +145,11 @@ void raiseFluxboxWindow(FluxboxWindow &win) {
145 if (win.oplock) return; 145 if (win.oplock) return;
146 win.oplock = true; 146 win.oplock = true;
147 147
148 // we need to lock actual restacking so that raising above active transient
149 // won't do anything nasty
150 if (!win.winClient().transientList().empty())
151 win.screen().layerManager().lock();
152
148 if (!win.isIconic()) { 153 if (!win.isIconic()) {
149 win.screen().updateNetizenWindowRaise(win.clientWindow()); 154 win.screen().updateNetizenWindowRaise(win.clientWindow());
150 win.layerItem().raise(); 155 win.layerItem().raise();
@@ -159,6 +164,9 @@ void raiseFluxboxWindow(FluxboxWindow &win) {
159 raiseFluxboxWindow(*(*it)->fbwindow()); 164 raiseFluxboxWindow(*(*it)->fbwindow());
160 } 165 }
161 win.oplock = false; 166 win.oplock = false;
167
168 if (!win.winClient().transientList().empty())
169 win.screen().layerManager().unlock();
162} 170}
163 171
164/// lower window and do the same for each transient it holds 172/// lower window and do the same for each transient it holds
@@ -166,6 +174,11 @@ void lowerFluxboxWindow(FluxboxWindow &win) {
166 if (win.oplock) return; 174 if (win.oplock) return;
167 win.oplock = true; 175 win.oplock = true;
168 176
177 // we need to lock actual restacking so that raising above active transient
178 // won't do anything nasty
179 if (!win.winClient().transientList().empty())
180 win.screen().layerManager().lock();
181
169 if (!win.isIconic()) { 182 if (!win.isIconic()) {
170 win.screen().updateNetizenWindowLower(win.clientWindow()); 183 win.screen().updateNetizenWindowLower(win.clientWindow());
171 win.layerItem().lower(); 184 win.layerItem().lower();
@@ -179,6 +192,8 @@ void lowerFluxboxWindow(FluxboxWindow &win) {
179 lowerFluxboxWindow(*(*it)->fbwindow()); 192 lowerFluxboxWindow(*(*it)->fbwindow());
180 } 193 }
181 win.oplock = false; 194 win.oplock = false;
195 if (!win.winClient().transientList().empty())
196 win.screen().layerManager().unlock();
182} 197}
183 198
184/// raise window and do the same for each transient it holds 199/// raise window and do the same for each transient it holds
@@ -186,6 +201,9 @@ void tempRaiseFluxboxWindow(FluxboxWindow &win) {
186 if (win.oplock) return; 201 if (win.oplock) return;
187 win.oplock = true; 202 win.oplock = true;
188 203
204 if (!win.winClient().transientList().empty())
205 win.screen().layerManager().lock();
206
189 if (!win.isIconic()) { 207 if (!win.isIconic()) {
190 // don't update netizen, as it is only temporary 208 // don't update netizen, as it is only temporary
191 win.layerItem().tempRaise(); 209 win.layerItem().tempRaise();
@@ -200,6 +218,10 @@ void tempRaiseFluxboxWindow(FluxboxWindow &win) {
200 tempRaiseFluxboxWindow(*(*it)->fbwindow()); 218 tempRaiseFluxboxWindow(*(*it)->fbwindow());
201 } 219 }
202 win.oplock = false; 220 win.oplock = false;
221
222 if (!win.winClient().transientList().empty())
223 win.screen().layerManager().unlock();
224
203} 225}
204 226
205class SetClientCmd:public FbTk::Command { 227class SetClientCmd:public FbTk::Command {
@@ -1107,8 +1129,6 @@ bool FluxboxWindow::setInputFocus() {
1107 if (! validateClient()) 1129 if (! validateClient())
1108 return false; 1130 return false;
1109 1131
1110 bool ret = false;
1111
1112 if (!m_client->transients.empty() && m_client->isModal()) { 1132 if (!m_client->transients.empty() && m_client->isModal()) {
1113 WinClient::TransientList::iterator it = m_client->transients.begin(); 1133 WinClient::TransientList::iterator it = m_client->transients.begin();
1114 WinClient::TransientList::iterator it_end = m_client->transients.end(); 1134 WinClient::TransientList::iterator it_end = m_client->transients.end();
@@ -1116,30 +1136,19 @@ bool FluxboxWindow::setInputFocus() {
1116 if ((*it)->isModal()) 1136 if ((*it)->isModal())
1117 return (*it)->fbwindow()->setCurrentClient(**it, true); 1137 return (*it)->fbwindow()->setCurrentClient(**it, true);
1118 } 1138 }
1139 }
1140 if (m_client->getFocusMode() == WinClient::F_LOCALLYACTIVE ||
1141 m_client->getFocusMode() == WinClient::F_PASSIVE) {
1142 m_client->setInputFocus(RevertToPointerRoot, CurrentTime);
1119 } else { 1143 } else {
1120 if (m_client->getFocusMode() == WinClient::F_LOCALLYACTIVE || 1144 return false;
1121 m_client->getFocusMode() == WinClient::F_PASSIVE) {
1122 m_client->setInputFocus(RevertToPointerRoot, CurrentTime);
1123 } else {
1124 return false;
1125 }
1126
1127 screen().setFocusedWindow(*m_client);
1128
1129 Fluxbox::instance()->setFocusedWindow(this);
1130
1131 frame().setFocus(true);
1132
1133 m_client->sendFocus();
1134
1135 if ((screen().isSloppyFocus() || screen().isSemiSloppyFocus())
1136 && screen().doAutoRaise())
1137 m_timer.start();
1138
1139 ret = true;
1140 } 1145 }
1141 1146
1142 return ret; 1147 if ((screen().isSloppyFocus() || screen().isSemiSloppyFocus())
1148 && screen().doAutoRaise())
1149 m_timer.start();
1150
1151 return true;
1143} 1152}
1144 1153
1145void FluxboxWindow::hide() { 1154void FluxboxWindow::hide() {
@@ -1224,8 +1233,9 @@ void FluxboxWindow::deiconify(bool reassoc, bool do_raise) {
1224 1233
1225 frame().show(); 1234 frame().show();
1226 1235
1227 if (was_iconic && screen().doFocusNew()) 1236 if (was_iconic && screen().doFocusNew()) {
1228 setInputFocus(); 1237 setInputFocus();
1238 }
1229 1239
1230 if (focused != frame().focused()) 1240 if (focused != frame().focused())
1231 frame().setFocus(focused); 1241 frame().setFocus(focused);
@@ -1579,9 +1589,11 @@ void FluxboxWindow::setFocusFlag(bool focus) {
1579 if (focused) 1589 if (focused)
1580 gettimeofday(&m_last_focus_time, 0); 1590 gettimeofday(&m_last_focus_time, 0);
1581 1591
1592 screen().setFocusedWindow(*m_client);
1593 m_client->sendFocus();
1582 frame().setFocus(focus); 1594 frame().setFocus(focus);
1583 1595
1584 if ((screen().isSloppyFocus() || screen().isSemiSloppyFocus()) && 1596 if (!focused && (screen().isSloppyFocus() || screen().isSemiSloppyFocus()) &&
1585 screen().doAutoRaise()) 1597 screen().doAutoRaise())
1586 m_timer.stop(); 1598 m_timer.stop();
1587} 1599}
@@ -2042,8 +2054,9 @@ void FluxboxWindow::mapNotifyEvent(XMapEvent &ne) {
2042 2054
2043 setState(NormalState); 2055 setState(NormalState);
2044 2056
2045 if (client->isTransient() || screen().doFocusNew()) 2057 if (client->isTransient() || screen().doFocusNew()) {
2046 setInputFocus(); 2058 setInputFocus();
2059 }
2047 else 2060 else
2048 setFocusFlag(false); 2061 setFocusFlag(false);
2049 2062
@@ -2555,8 +2568,9 @@ void FluxboxWindow::enterNotifyEvent(XCrossingEvent &ev) {
2555 2568
2556 // if client is set, use setCurrent client, otherwise just setInputFocus 2569 // if client is set, use setCurrent client, otherwise just setInputFocus
2557 if ((!sa.leave || sa.inferior) && 2570 if ((!sa.leave || sa.inferior) &&
2558 ((client && setCurrentClient(*client, true)) || setInputFocus())) 2571 ((client && setCurrentClient(*client, true)) || setInputFocus())) {
2559 installColormap(True); 2572 installColormap(True);
2573 }
2560 } 2574 }
2561 } 2575 }
2562} 2576}
diff --git a/src/fluxbox.cc b/src/fluxbox.cc
index 027da76..b7a4d5b 100644
--- a/src/fluxbox.cc
+++ b/src/fluxbox.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: fluxbox.cc,v 1.171 2003/07/18 15:40:55 rathnor Exp $ 25// $Id: fluxbox.cc,v 1.172 2003/07/20 18:05:39 rathnor Exp $
26 26
27#include "fluxbox.hh" 27#include "fluxbox.hh"
28 28
@@ -891,11 +891,13 @@ void Fluxbox::handleEvent(XEvent * const e) {
891 break; 891 break;
892 892
893 FluxboxWindow *win = searchWindow(e->xfocus.window); 893 FluxboxWindow *win = searchWindow(e->xfocus.window);
894 if (win && ! win->isFocused()) 894 if (win && ! win->isFocused()) {
895 setFocusedWindow(win); 895 setFocusedWindow(win);
896 }
896 897
897 } break; 898 } break;
898 case FocusOut:{ 899 case FocusOut:{
900
899 if (e->xfocus.mode == NotifyUngrab || 901 if (e->xfocus.mode == NotifyUngrab ||
900 e->xfocus.detail == NotifyPointer) 902 e->xfocus.detail == NotifyPointer)
901 break; 903 break;
@@ -904,8 +906,7 @@ void Fluxbox::handleEvent(XEvent * const e) {
904#ifdef DEBUG 906#ifdef DEBUG
905 cerr<<__FILE__<<"("<<__FUNCTION__<<") Focus out is not a FluxboxWindow !!"<<endl; 907 cerr<<__FILE__<<"("<<__FUNCTION__<<") Focus out is not a FluxboxWindow !!"<<endl;
906#endif // DEBUG 908#endif // DEBUG
907 if (getFocusedWindow()) 909
908 getFocusedWindow()->setInputFocus();
909 } 910 }
910 } 911 }
911 break; 912 break;
@@ -1084,8 +1085,9 @@ void Fluxbox::handleClientMessage(XClientMessageEvent &ce) {
1084 1085
1085 } else if (ce.message_type == m_fbatoms->getFluxboxChangeWindowFocusAtom()) { 1086 } else if (ce.message_type == m_fbatoms->getFluxboxChangeWindowFocusAtom()) {
1086 FluxboxWindow *win = searchWindow(ce.window); 1087 FluxboxWindow *win = searchWindow(ce.window);
1087 if (win && win->isVisible() && win->setInputFocus()) 1088 if (win && win->isVisible() && win->setInputFocus()) {
1088 win->installColormap(true); 1089 win->installColormap(true);
1090 }
1089 } else if (ce.message_type == m_fbatoms->getFluxboxCycleWindowFocusAtom()) { 1091 } else if (ce.message_type == m_fbatoms->getFluxboxCycleWindowFocusAtom()) {
1090 BScreen *screen = searchScreen(ce.window); 1092 BScreen *screen = searchScreen(ce.window);
1091 1093