all repos — fluxbox @ 54b49c63a641fb742f014403c924ae8f81f73824

custom fork of the fluxbox windowmanager

Merge branch 'mousefocus'
Jim Ramsay i.am@jimramsay.com
commit

54b49c63a641fb742f014403c924ae8f81f73824

parent

04538cbaa1f74b3b7dd397fa515617d8691980d4

5 files changed, 55 insertions(+), 3 deletions(-)

jump to
M src/FocusControl.ccsrc/FocusControl.cc

@@ -81,7 +81,8 @@ m_focused_list(screen), m_creation_order_list(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();

@@ -398,6 +399,28 @@

if (foundwin) foundwin->focus(); +} + +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) {
M src/FocusControl.hhsrc/FocusControl.hh

@@ -93,6 +93,15 @@ /// @return true if focus mode is mouse focus

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 @@ Focusables::const_iterator m_cycling_window;

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;
M src/Screen.ccsrc/Screen.cc

@@ -1098,6 +1098,9 @@ if (! m_current_workspace || id >= m_workspaces_list.size() ||

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();
M src/Window.ccsrc/Window.cc

@@ -1213,6 +1213,9 @@

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 @@ return;

#ifdef DEBUG cerr<<"FluxboxWindow("<<title()<<")::lower()"<<endl; #endif // DEBUG + + /* Ignore all EnterNotify events until the pointer actually moves */ + screen().focusControl().ignoreAtPointer(); + // get root window WinClient *client = getRootTransientFor(m_client);

@@ -2684,13 +2691,17 @@ sa.w = ev.window;

sa.enter = sa.leave = False; XCheckIfEvent(display, &dummy, queueScanner, (char *) &sa); - if ((!sa.leave || sa.inferior) && !screen().focusControl().isCycling() ) { + if ((!sa.leave || sa.inferior) && + !screen().focusControl().isCycling() && + !screen().focusControl().isIgnored(ev.x_root, ev.y_root) ) { focus(); } } } - if (screen().focusControl().isMouseTabFocus() && client && client != m_client) { + if (screen().focusControl().isMouseTabFocus() && + client && client != m_client && + !screen().focusControl().isIgnored(ev.x_root, ev.y_root) ) { setCurrentClient(*client, isFocused()); }
M src/fluxbox.ccsrc/fluxbox.cc

@@ -899,6 +899,11 @@ void Fluxbox::handleUnmapNotify(XUnmapEvent &ue) {

BScreen *screen = searchScreen(ue.event); + if (screen) { + /* Ignore all EnterNotify events until the pointer actually moves */ + screen->focusControl().ignoreAtPointer(); + } + if (ue.event != ue.window && (!screen || !ue.send_event)) { return; }