diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/FocusControl.cc | 25 | ||||
-rw-r--r-- | src/FocusControl.hh | 10 | ||||
-rw-r--r-- | src/Screen.cc | 3 | ||||
-rw-r--r-- | src/Window.cc | 15 | ||||
-rw-r--r-- | src/fluxbox.cc | 5 |
5 files changed, 55 insertions, 3 deletions
diff --git a/src/FocusControl.cc b/src/FocusControl.cc index 78752bb..701373b 100644 --- a/src/FocusControl.cc +++ b/src/FocusControl.cc | |||
@@ -81,7 +81,8 @@ FocusControl::FocusControl(BScreen &screen): | |||
81 | m_focused_win_list(screen), m_creation_order_win_list(screen), | 81 | m_focused_win_list(screen), m_creation_order_win_list(screen), |
82 | m_cycling_list(0), | 82 | m_cycling_list(0), |
83 | m_was_iconic(false), | 83 | m_was_iconic(false), |
84 | m_cycling_last(0) { | 84 | m_cycling_last(0), |
85 | m_ignore_mouse_x(-1), m_ignore_mouse_y(-1) { | ||
85 | 86 | ||
86 | m_cycling_window = m_focused_list.clientList().end(); | 87 | m_cycling_window = m_focused_list.clientList().end(); |
87 | 88 | ||
@@ -400,6 +401,28 @@ void FocusControl::dirFocus(FluxboxWindow &win, FocusDir dir) { | |||
400 | 401 | ||
401 | } | 402 | } |
402 | 403 | ||
404 | void FocusControl::ignoreAtPointer() | ||
405 | { | ||
406 | int ignore_i; | ||
407 | unsigned int ignore_ui; | ||
408 | Window ignore_w; | ||
409 | |||
410 | XQueryPointer(m_screen.rootWindow().display(), | ||
411 | m_screen.rootWindow().window(), &ignore_w, &ignore_w, | ||
412 | &m_ignore_mouse_x, &m_ignore_mouse_y, | ||
413 | &ignore_i, &ignore_i, &ignore_ui); | ||
414 | } | ||
415 | |||
416 | void FocusControl::ignoreAt(int x, int y) | ||
417 | { | ||
418 | m_ignore_mouse_x = x; m_ignore_mouse_y = y; | ||
419 | } | ||
420 | |||
421 | bool FocusControl::isIgnored(int x, int y) | ||
422 | { | ||
423 | return x == m_ignore_mouse_x && y == m_ignore_mouse_y; | ||
424 | } | ||
425 | |||
403 | void FocusControl::removeClient(WinClient &client) { | 426 | void FocusControl::removeClient(WinClient &client) { |
404 | if (client.screen().isShuttingdown()) | 427 | if (client.screen().isShuttingdown()) |
405 | return; | 428 | return; |
diff --git a/src/FocusControl.hh b/src/FocusControl.hh index 4de4310..91681ab 100644 --- a/src/FocusControl.hh +++ b/src/FocusControl.hh | |||
@@ -93,6 +93,15 @@ public: | |||
93 | bool isMouseFocus() const { return focusModel() == MOUSEFOCUS; } | 93 | bool isMouseFocus() const { return focusModel() == MOUSEFOCUS; } |
94 | /// @return true if tab focus mode is mouse tab focus | 94 | /// @return true if tab focus mode is mouse tab focus |
95 | bool isMouseTabFocus() const { return tabFocusModel() == MOUSETABFOCUS; } | 95 | bool isMouseTabFocus() const { return tabFocusModel() == MOUSETABFOCUS; } |
96 | |||
97 | /// Set the "ignore" pointer location to the current pointer location | ||
98 | void ignoreAtPointer(); | ||
99 | /// Set the "ignore" pointer location to the given coordinates | ||
100 | void ignoreAt(int x, int y); | ||
101 | /// @return true if events at the given X/Y coordinate should be ignored | ||
102 | /// (ie, they were previously cached via one of the ignoreAt calls) | ||
103 | bool isIgnored(int x, int y); | ||
104 | |||
96 | /// @return true if cycling is in progress | 105 | /// @return true if cycling is in progress |
97 | bool isCycling() const { return m_cycling_list != 0; } | 106 | bool isCycling() const { return m_cycling_list != 0; } |
98 | /// Appends a client to the front of the focus list | 107 | /// Appends a client to the front of the focus list |
@@ -157,6 +166,7 @@ private: | |||
157 | const FocusableList *m_cycling_list; | 166 | const FocusableList *m_cycling_list; |
158 | Focusable *m_was_iconic; | 167 | Focusable *m_was_iconic; |
159 | WinClient *m_cycling_last; | 168 | WinClient *m_cycling_last; |
169 | int m_ignore_mouse_x, m_ignore_mouse_y; | ||
160 | 170 | ||
161 | static WinClient *s_focused_window; | 171 | static WinClient *s_focused_window; |
162 | static FluxboxWindow *s_focused_fbwindow; | 172 | static FluxboxWindow *s_focused_fbwindow; |
diff --git a/src/Screen.cc b/src/Screen.cc index 02351a5..1581571 100644 --- a/src/Screen.cc +++ b/src/Screen.cc | |||
@@ -1098,6 +1098,9 @@ void BScreen::changeWorkspaceID(unsigned int id, bool revert) { | |||
1098 | id == m_current_workspace->workspaceID()) | 1098 | id == m_current_workspace->workspaceID()) |
1099 | return; | 1099 | return; |
1100 | 1100 | ||
1101 | /* Ignore all EnterNotify events until the pointer actually moves */ | ||
1102 | this->focusControl().ignoreAtPointer(); | ||
1103 | |||
1101 | FbTk::App::instance()->sync(false); | 1104 | FbTk::App::instance()->sync(false); |
1102 | 1105 | ||
1103 | FluxboxWindow *focused = FocusControl::focusedFbWindow(); | 1106 | FluxboxWindow *focused = FocusControl::focusedFbWindow(); |
diff --git a/src/Window.cc b/src/Window.cc index edc2b8e..b2bfcf7 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -1213,6 +1213,9 @@ void FluxboxWindow::moveResize(int new_x, int new_y, | |||
1213 | if (!moving) { | 1213 | if (!moving) { |
1214 | m_last_resize_x = new_x; | 1214 | m_last_resize_x = new_x; |
1215 | m_last_resize_y = new_y; | 1215 | m_last_resize_y = new_y; |
1216 | |||
1217 | /* Ignore all EnterNotify events until the pointer actually moves */ | ||
1218 | screen().focusControl().ignoreAtPointer(); | ||
1216 | } | 1219 | } |
1217 | 1220 | ||
1218 | } | 1221 | } |
@@ -1670,6 +1673,10 @@ void FluxboxWindow::lower() { | |||
1670 | #ifdef DEBUG | 1673 | #ifdef DEBUG |
1671 | cerr<<"FluxboxWindow("<<title()<<")::lower()"<<endl; | 1674 | cerr<<"FluxboxWindow("<<title()<<")::lower()"<<endl; |
1672 | #endif // DEBUG | 1675 | #endif // DEBUG |
1676 | |||
1677 | /* Ignore all EnterNotify events until the pointer actually moves */ | ||
1678 | screen().focusControl().ignoreAtPointer(); | ||
1679 | |||
1673 | // get root window | 1680 | // get root window |
1674 | WinClient *client = getRootTransientFor(m_client); | 1681 | WinClient *client = getRootTransientFor(m_client); |
1675 | 1682 | ||
@@ -2684,13 +2691,17 @@ void FluxboxWindow::enterNotifyEvent(XCrossingEvent &ev) { | |||
2684 | sa.enter = sa.leave = False; | 2691 | sa.enter = sa.leave = False; |
2685 | XCheckIfEvent(display, &dummy, queueScanner, (char *) &sa); | 2692 | XCheckIfEvent(display, &dummy, queueScanner, (char *) &sa); |
2686 | 2693 | ||
2687 | if ((!sa.leave || sa.inferior) && !screen().focusControl().isCycling() ) { | 2694 | if ((!sa.leave || sa.inferior) && |
2695 | !screen().focusControl().isCycling() && | ||
2696 | !screen().focusControl().isIgnored(ev.x_root, ev.y_root) ) { | ||
2688 | focus(); | 2697 | focus(); |
2689 | } | 2698 | } |
2690 | } | 2699 | } |
2691 | } | 2700 | } |
2692 | 2701 | ||
2693 | if (screen().focusControl().isMouseTabFocus() && client && client != m_client) { | 2702 | if (screen().focusControl().isMouseTabFocus() && |
2703 | client && client != m_client && | ||
2704 | !screen().focusControl().isIgnored(ev.x_root, ev.y_root) ) { | ||
2694 | setCurrentClient(*client, isFocused()); | 2705 | setCurrentClient(*client, isFocused()); |
2695 | } | 2706 | } |
2696 | 2707 | ||
diff --git a/src/fluxbox.cc b/src/fluxbox.cc index 93768da..f44f8aa 100644 --- a/src/fluxbox.cc +++ b/src/fluxbox.cc | |||
@@ -899,6 +899,11 @@ void Fluxbox::handleUnmapNotify(XUnmapEvent &ue) { | |||
899 | 899 | ||
900 | BScreen *screen = searchScreen(ue.event); | 900 | BScreen *screen = searchScreen(ue.event); |
901 | 901 | ||
902 | if (screen) { | ||
903 | /* Ignore all EnterNotify events until the pointer actually moves */ | ||
904 | screen->focusControl().ignoreAtPointer(); | ||
905 | } | ||
906 | |||
902 | if (ue.event != ue.window && (!screen || !ue.send_event)) { | 907 | if (ue.event != ue.window && (!screen || !ue.send_event)) { |
903 | return; | 908 | return; |
904 | } | 909 | } |