diff --git a/src/FocusControl.cc b/src/FocusControl.cc index 78752bb7..701373b4 100644 --- a/src/FocusControl.cc +++ b/src/FocusControl.cc @@ -81,7 +81,8 @@ FocusControl::FocusControl(BScreen &screen): m_focused_win_list(screen), m_creation_order_win_list(screen), m_cycling_list(0), m_was_iconic(false), - m_cycling_last(0) { + m_cycling_last(0), + m_ignore_mouse_x(-1), m_ignore_mouse_y(-1) { m_cycling_window = m_focused_list.clientList().end(); @@ -400,6 +401,28 @@ void FocusControl::dirFocus(FluxboxWindow &win, FocusDir dir) { } +void FocusControl::ignoreAtPointer() +{ + int ignore_i; + unsigned int ignore_ui; + Window ignore_w; + + XQueryPointer(m_screen.rootWindow().display(), + m_screen.rootWindow().window(), &ignore_w, &ignore_w, + &m_ignore_mouse_x, &m_ignore_mouse_y, + &ignore_i, &ignore_i, &ignore_ui); +} + +void FocusControl::ignoreAt(int x, int y) +{ + m_ignore_mouse_x = x; m_ignore_mouse_y = y; +} + +bool FocusControl::isIgnored(int x, int y) +{ + return x == m_ignore_mouse_x && y == m_ignore_mouse_y; +} + void FocusControl::removeClient(WinClient &client) { if (client.screen().isShuttingdown()) return; diff --git a/src/FocusControl.hh b/src/FocusControl.hh index 4de4310a..91681abc 100644 --- a/src/FocusControl.hh +++ b/src/FocusControl.hh @@ -93,6 +93,15 @@ public: bool isMouseFocus() const { return focusModel() == MOUSEFOCUS; } /// @return true if tab focus mode is mouse tab focus bool isMouseTabFocus() const { return tabFocusModel() == MOUSETABFOCUS; } + + /// Set the "ignore" pointer location to the current pointer location + void ignoreAtPointer(); + /// Set the "ignore" pointer location to the given coordinates + void ignoreAt(int x, int y); + /// @return true if events at the given X/Y coordinate should be ignored + /// (ie, they were previously cached via one of the ignoreAt calls) + bool isIgnored(int x, int y); + /// @return true if cycling is in progress bool isCycling() const { return m_cycling_list != 0; } /// Appends a client to the front of the focus list @@ -157,6 +166,7 @@ private: const FocusableList *m_cycling_list; Focusable *m_was_iconic; WinClient *m_cycling_last; + int m_ignore_mouse_x, m_ignore_mouse_y; static WinClient *s_focused_window; static FluxboxWindow *s_focused_fbwindow; diff --git a/src/Screen.cc b/src/Screen.cc index 02351a5a..1581571d 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -1098,6 +1098,9 @@ void BScreen::changeWorkspaceID(unsigned int id, bool revert) { id == m_current_workspace->workspaceID()) return; + /* Ignore all EnterNotify events until the pointer actually moves */ + this->focusControl().ignoreAtPointer(); + FbTk::App::instance()->sync(false); FluxboxWindow *focused = FocusControl::focusedFbWindow(); diff --git a/src/Window.cc b/src/Window.cc index edc2b8e3..b2bfcf74 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -1213,6 +1213,9 @@ void FluxboxWindow::moveResize(int new_x, int new_y, if (!moving) { m_last_resize_x = new_x; m_last_resize_y = new_y; + + /* Ignore all EnterNotify events until the pointer actually moves */ + screen().focusControl().ignoreAtPointer(); } } @@ -1670,6 +1673,10 @@ void FluxboxWindow::lower() { #ifdef DEBUG cerr<<"FluxboxWindow("<