bool KeyboardNavigation::initiate (CompAction *action, CompAction::State state, CompOption::Vector &option, FocusDirection direction) { CompWindow *window = screen->findWindow( screen->activeWindow() ); if (window) { /* Don't allow focus change for certain special windows */ if (window->overrideRedirect() || (window->type() & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) { return false; } DEBUG_LOG("Initiating search for nearest window: " << direction); NearestWindow nearestWindow (window, direction); screen->forEachWindow( boost::bind( &KeyboardNavigation::NearestWindow::inspectWindow, &nearestWindow, _1 ) ); CompWindow *focusWindow = nearestWindow.result(); if (focusWindow != NULL) { DEBUG_LOG("Found focusWindow: " << focusWindow->id() << " " << focusWindow->x() << "x" << focusWindow->y()); focusWindow->moveInputFocusTo(); focusWindow->activate(); return true; } else { DEBUG_LOG("Unable to find focus window!"); } } return false; }