aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormarkt <markt>2006-07-23 09:51:54 (GMT)
committermarkt <markt>2006-07-23 09:51:54 (GMT)
commitbe2f40a10d9c11a56c0c53307be5557a127027e9 (patch)
tree0cd5067c32dc42dbcbb59ad32d7d2a08f44cdf6f /src
parentb0b28c4bbb20ffcf56b445caca112d8866c9c788 (diff)
downloadfluxbox-be2f40a10d9c11a56c0c53307be5557a127027e9.zip
fluxbox-be2f40a10d9c11a56c0c53307be5557a127027e9.tar.bz2
use a timer to make sure focus always reverts if possible
Diffstat (limited to 'src')
-rw-r--r--src/FbTk/FbWindow.hh2
-rw-r--r--src/WinClient.cc6
-rw-r--r--src/WinClient.hh4
-rw-r--r--src/Window.cc2
-rw-r--r--src/fluxbox.cc26
-rw-r--r--src/fluxbox.hh5
6 files changed, 26 insertions, 19 deletions
diff --git a/src/FbTk/FbWindow.hh b/src/FbTk/FbWindow.hh
index 0226121..c5494b0 100644
--- a/src/FbTk/FbWindow.hh
+++ b/src/FbTk/FbWindow.hh
@@ -137,7 +137,7 @@ public:
137 } 137 }
138 virtual void lower(); 138 virtual void lower();
139 virtual void raise(); 139 virtual void raise();
140 virtual void setInputFocus(int revert_to, int time); 140 void setInputFocus(int revert_to, int time);
141 /// defines a cursor for this window 141 /// defines a cursor for this window
142 void setCursor(Cursor cur); 142 void setCursor(Cursor cur);
143#ifdef NOT_USED 143#ifdef NOT_USED
diff --git a/src/WinClient.cc b/src/WinClient.cc
index daf3d42..73b5d45 100644
--- a/src/WinClient.cc
+++ b/src/WinClient.cc
@@ -66,7 +66,6 @@ WinClient::WinClient(Window win, BScreen &screen, FluxboxWindow *fbwin):FbTk::Fb
66 m_modal(0), 66 m_modal(0),
67 send_focus_message(false), 67 send_focus_message(false),
68 send_close_message(false), 68 send_close_message(false),
69 m_waiting_focus(false),
70 m_win_gravity(0), 69 m_win_gravity(0),
71 m_title(""), m_icon_title(""), 70 m_title(""), m_icon_title(""),
72 m_class_name(""), m_instance_name(""), 71 m_class_name(""), m_instance_name(""),
@@ -189,11 +188,6 @@ bool WinClient::sendFocus() {
189 return true; 188 return true;
190} 189}
191 190
192void WinClient::setInputFocus(int revert_to, int time) {
193 FbTk::FbWindow::setInputFocus(revert_to, time);
194 m_waiting_focus = true;
195}
196
197void WinClient::sendClose(bool forceful) { 191void WinClient::sendClose(bool forceful) {
198 if (forceful || !send_close_message) 192 if (forceful || !send_close_message)
199 XKillClient(display(), window()); 193 XKillClient(display(), window());
diff --git a/src/WinClient.hh b/src/WinClient.hh
index 4808807..3a9d792 100644
--- a/src/WinClient.hh
+++ b/src/WinClient.hh
@@ -53,9 +53,6 @@ public:
53 bool sendFocus(); // returns whether we sent a message or not 53 bool sendFocus(); // returns whether we sent a message or not
54 // i.e. whether we assume the focus will get taken 54 // i.e. whether we assume the focus will get taken
55 bool acceptsFocus() const; // will this window accept focus (according to hints) 55 bool acceptsFocus() const; // will this window accept focus (according to hints)
56 void setInputFocus(int revert_to, int time);
57 inline bool isWaitingFocus() { return m_waiting_focus; }
58 void receivedFocus() { m_waiting_focus = false; m_focussig.notify(); }
59 void sendClose(bool forceful = false); 56 void sendClose(bool forceful = false);
60 // not aware of anything that makes this false at present 57 // not aware of anything that makes this false at present
61 inline bool isClosable() const { return true; } 58 inline bool isClosable() const { return true; }
@@ -200,7 +197,6 @@ private:
200 // or indicates that we are modal if don't have any transients 197 // or indicates that we are modal if don't have any transients
201 int m_modal; 198 int m_modal;
202 bool send_focus_message, send_close_message; 199 bool send_focus_message, send_close_message;
203 bool m_waiting_focus;
204 200
205 int m_win_gravity; 201 int m_win_gravity;
206 202
diff --git a/src/Window.cc b/src/Window.cc
index 265d948..f2b57f2 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -2112,7 +2112,7 @@ void FluxboxWindow::setFocusFlag(bool focus) {
2112 if (was_focused != focus) { 2112 if (was_focused != focus) {
2113 m_focussig.notify(); 2113 m_focussig.notify();
2114 if (m_client) 2114 if (m_client)
2115 m_client->receivedFocus(); 2115 m_client->focusSig().notify();
2116 } 2116 }
2117} 2117}
2118 2118
diff --git a/src/fluxbox.cc b/src/fluxbox.cc
index b5b5ddb..abe43d2 100644
--- a/src/fluxbox.cc
+++ b/src/fluxbox.cc
@@ -221,6 +221,7 @@ Fluxbox::Fluxbox(int argc, char **argv, const char *dpy_name, const char *rcfile
221 m_masked(0), 221 m_masked(0),
222 m_rc_file(rcfilename ? rcfilename : ""), 222 m_rc_file(rcfilename ? rcfilename : ""),
223 m_argv(argv), m_argc(argc), 223 m_argv(argv), m_argc(argc),
224 m_revert_screen(0),
224 m_starting(true), 225 m_starting(true),
225 m_restarting(false), 226 m_restarting(false),
226 m_shutdown(false), 227 m_shutdown(false),
@@ -273,6 +274,13 @@ Fluxbox::Fluxbox(int argc, char **argv, const char *dpy_name, const char *rcfile
273 m_reconfig_timer.setTimeout(to); 274 m_reconfig_timer.setTimeout(to);
274 m_reconfig_timer.setCommand(reconfig_cmd); 275 m_reconfig_timer.setCommand(reconfig_cmd);
275 m_reconfig_timer.fireOnce(true); 276 m_reconfig_timer.fireOnce(true);
277
278 // set a timer to revert focus on FocusOut, in case no FocusIn arrives
279 FbTk::RefCount<FbTk::Command> revert_cmd(new FbTk::SimpleCommand<Fluxbox>(*this, &Fluxbox::revert_focus));
280 m_revert_timer.setCommand(revert_cmd);
281 m_revert_timer.setTimeout(to);
282 m_revert_timer.fireOnce(true);
283
276 // XSynchronize(disp, True); 284 // XSynchronize(disp, True);
277 285
278 s_singleton = this; 286 s_singleton = this;
@@ -681,9 +689,6 @@ void Fluxbox::handleEvent(XEvent * const e) {
681 break; // found the screen, no more search 689 break; // found the screen, no more search
682 } 690 }
683 } 691 }
684
685 if (screen != 0)
686 FocusControl::revertFocus(*screen);
687 } 692 }
688 693
689 // try FbTk::EventHandler first 694 // try FbTk::EventHandler first
@@ -877,9 +882,12 @@ void Fluxbox::handleEvent(XEvent * const e) {
877#endif // DEBUG 882#endif // DEBUG
878 } else if (winclient && winclient == FocusControl::focusedWindow() && 883 } else if (winclient && winclient == FocusControl::focusedWindow() &&
879 (winclient->fbwindow() == 0 884 (winclient->fbwindow() == 0
880 || !winclient->fbwindow()->isMoving())) 885 || !winclient->fbwindow()->isMoving())) {
881 // we don't unfocus a moving window 886 // we don't unfocus a moving window
882 FocusControl::setFocusedWindow(0); 887 FocusControl::setFocusedWindow(0);
888 m_revert_screen = &winclient->screen();
889 m_revert_timer.start();
890 }
883 } 891 }
884 break; 892 break;
885 case ClientMessage: 893 case ClientMessage:
@@ -1300,8 +1308,9 @@ void Fluxbox::update(FbTk::Subject *changedsub) {
1300 FocusControl::unfocusWindow(client); 1308 FocusControl::unfocusWindow(client);
1301 // make sure nothing else uses this window before focus reverts 1309 // make sure nothing else uses this window before focus reverts
1302 FocusControl::setFocusedWindow(0); 1310 FocusControl::setFocusedWindow(0);
1303 } else if (!FocusControl::focusedWindow() && client.isWaitingFocus()) 1311 m_revert_screen = &screen;
1304 FocusControl::revertFocus(screen); 1312 m_revert_timer.start();
1313 }
1305 } 1314 }
1306} 1315}
1307 1316
@@ -1776,6 +1785,11 @@ void Fluxbox::timed_reconfigure() {
1776 m_reconfigure_wait = m_reread_menu_wait = false; 1785 m_reconfigure_wait = m_reread_menu_wait = false;
1777} 1786}
1778 1787
1788void Fluxbox::revert_focus() {
1789 if (m_revert_screen && !FocusControl::focusedWindow())
1790 FocusControl::revertFocus(*m_revert_screen);
1791}
1792
1779bool Fluxbox::validateClient(const WinClient *client) const { 1793bool Fluxbox::validateClient(const WinClient *client) const {
1780 WinClientMap::const_iterator it = 1794 WinClientMap::const_iterator it =
1781 find_if(m_window_search.begin(), 1795 find_if(m_window_search.begin(),
diff --git a/src/fluxbox.hh b/src/fluxbox.hh
index 7fa5f5d..e7bc18d 100644
--- a/src/fluxbox.hh
+++ b/src/fluxbox.hh
@@ -185,6 +185,7 @@ public:
185 void attachSignals(WinClient &winclient); 185 void attachSignals(WinClient &winclient);
186 186
187 void timed_reconfigure(); 187 void timed_reconfigure();
188 void revert_focus();
188 189
189 bool isStartup() const { return m_starting; } 190 bool isStartup() const { return m_starting; }
190 bool isRestarting() const { return m_restarting; } 191 bool isRestarting() const { return m_restarting; }
@@ -289,7 +290,9 @@ private:
289 290
290 XEvent m_last_event; 291 XEvent m_last_event;
291 292
292 FbTk::Timer m_reconfig_timer; ///< when we execute reconfig command we must wait at least to next event round 293 ///< when we execute reconfig command we must wait until next event round
294 FbTk::Timer m_reconfig_timer, m_revert_timer;
295 BScreen *m_revert_screen;
293 296
294 std::auto_ptr<Keys> m_key; 297 std::auto_ptr<Keys> m_key;
295 298