Port FocusChain to AbstractOutput
This commit is contained in:
parent
02a9457bbc
commit
22649137d6
5 changed files with 35 additions and 17 deletions
|
@ -500,20 +500,18 @@ bool Workspace::activateNextClient(AbstractClient* c)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Workspace::setCurrentScreen(int new_screen)
|
void Workspace::setCurrentOutput(AbstractOutput *output)
|
||||||
{
|
{
|
||||||
if (new_screen < 0 || new_screen >= screens()->count())
|
|
||||||
return;
|
|
||||||
if (!options->focusPolicyIsReasonable())
|
if (!options->focusPolicyIsReasonable())
|
||||||
return;
|
return;
|
||||||
closeActivePopup();
|
closeActivePopup();
|
||||||
VirtualDesktop *desktop = VirtualDesktopManager::self()->currentDesktop();
|
VirtualDesktop *desktop = VirtualDesktopManager::self()->currentDesktop();
|
||||||
AbstractClient *get_focus = FocusChain::self()->getForActivation(desktop, new_screen);
|
AbstractClient *get_focus = FocusChain::self()->getForActivation(desktop, output);
|
||||||
if (get_focus == nullptr)
|
if (get_focus == nullptr)
|
||||||
get_focus = findDesktop(true, desktop);
|
get_focus = findDesktop(true, desktop);
|
||||||
if (get_focus != nullptr && get_focus != mostRecentlyActivatedClient())
|
if (get_focus != nullptr && get_focus != mostRecentlyActivatedClient())
|
||||||
requestFocus(get_focus);
|
requestFocus(get_focus);
|
||||||
screens()->setCurrent(new_screen);
|
screens()->setCurrent(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Workspace::gotFocusIn(const AbstractClient* c)
|
void Workspace::gotFocusIn(const AbstractClient* c)
|
||||||
|
|
|
@ -52,10 +52,10 @@ void FocusChain::removeDesktop(VirtualDesktop *desktop)
|
||||||
|
|
||||||
AbstractClient *FocusChain::getForActivation(VirtualDesktop *desktop) const
|
AbstractClient *FocusChain::getForActivation(VirtualDesktop *desktop) const
|
||||||
{
|
{
|
||||||
return getForActivation(desktop, screens()->current());
|
return getForActivation(desktop, screens()->currentOutput());
|
||||||
}
|
}
|
||||||
|
|
||||||
AbstractClient *FocusChain::getForActivation(VirtualDesktop *desktop, int screen) const
|
AbstractClient *FocusChain::getForActivation(VirtualDesktop *desktop, AbstractOutput *output) const
|
||||||
{
|
{
|
||||||
auto it = m_desktopFocusChains.constFind(desktop);
|
auto it = m_desktopFocusChains.constFind(desktop);
|
||||||
if (it == m_desktopFocusChains.constEnd()) {
|
if (it == m_desktopFocusChains.constEnd()) {
|
||||||
|
@ -66,7 +66,7 @@ AbstractClient *FocusChain::getForActivation(VirtualDesktop *desktop, int screen
|
||||||
auto tmp = chain.at(i);
|
auto tmp = chain.at(i);
|
||||||
// TODO: move the check into Client
|
// TODO: move the check into Client
|
||||||
if (tmp->isShown(false) && tmp->isOnCurrentActivity()
|
if (tmp->isShown(false) && tmp->isOnCurrentActivity()
|
||||||
&& ( !m_separateScreenFocus || tmp->screen() == screen)) {
|
&& ( !m_separateScreenFocus || tmp->output() == output)) {
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -207,7 +207,7 @@ bool FocusChain::isUsableFocusCandidate(AbstractClient *c, AbstractClient *prev)
|
||||||
{
|
{
|
||||||
return c != prev &&
|
return c != prev &&
|
||||||
c->isShown(false) && c->isOnCurrentDesktop() && c->isOnCurrentActivity() &&
|
c->isShown(false) && c->isOnCurrentDesktop() && c->isOnCurrentActivity() &&
|
||||||
(!m_separateScreenFocus || c->isOnScreen(prev ? prev->screen() : screens()->current()));
|
(!m_separateScreenFocus || c->isOnOutput(prev ? prev->output() : screens()->currentOutput()));
|
||||||
}
|
}
|
||||||
|
|
||||||
AbstractClient *FocusChain::nextForDesktop(AbstractClient *reference, VirtualDesktop *desktop) const
|
AbstractClient *FocusChain::nextForDesktop(AbstractClient *reference, VirtualDesktop *desktop) const
|
||||||
|
|
|
@ -18,6 +18,7 @@ namespace KWin
|
||||||
{
|
{
|
||||||
// forward declarations
|
// forward declarations
|
||||||
class AbstractClient;
|
class AbstractClient;
|
||||||
|
class AbstractOutput;
|
||||||
class VirtualDesktop;
|
class VirtualDesktop;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -98,10 +99,10 @@ public:
|
||||||
* If no Client for activation is found @c null is returned.
|
* If no Client for activation is found @c null is returned.
|
||||||
*
|
*
|
||||||
* @param desktop The virtual desktop to look for a Client for activation
|
* @param desktop The virtual desktop to look for a Client for activation
|
||||||
* @param screen The screen to constrain the search on with separate screen focus
|
* @param output The screen to constrain the search on with separate screen focus
|
||||||
* @return :X11Client *The Client which could be activated or @c null if there is none.
|
* @return :X11Client *The Client which could be activated or @c null if there is none.
|
||||||
*/
|
*/
|
||||||
AbstractClient *getForActivation(VirtualDesktop *desktop, int screen) const;
|
AbstractClient *getForActivation(VirtualDesktop *desktop, AbstractOutput *output) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks whether the most recently used focus chain contains the given @p client.
|
* @brief Checks whether the most recently used focus chain contains the given @p client.
|
||||||
|
|
|
@ -1307,27 +1307,44 @@ static bool screenSwitchImpossible()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AbstractOutput *Workspace::nextOutput(AbstractOutput *reference) const
|
||||||
|
{
|
||||||
|
const auto outputs = kwinApp()->platform()->enabledOutputs();
|
||||||
|
const int index = outputs.indexOf(reference);
|
||||||
|
Q_ASSERT(index != -1);
|
||||||
|
return outputs[(index + 1) % outputs.count()];
|
||||||
|
}
|
||||||
|
|
||||||
|
AbstractOutput *Workspace::previousOutput(AbstractOutput *reference) const
|
||||||
|
{
|
||||||
|
const auto outputs = kwinApp()->platform()->enabledOutputs();
|
||||||
|
const int index = outputs.indexOf(reference);
|
||||||
|
Q_ASSERT(index != -1);
|
||||||
|
return outputs[(index + outputs.count() - 1) % outputs.count()];
|
||||||
|
}
|
||||||
|
|
||||||
void Workspace::slotSwitchToScreen()
|
void Workspace::slotSwitchToScreen()
|
||||||
{
|
{
|
||||||
if (screenSwitchImpossible())
|
if (screenSwitchImpossible())
|
||||||
return;
|
return;
|
||||||
const int i = senderValue(sender());
|
AbstractOutput *output = kwinApp()->platform()->findOutput(senderValue(sender()));
|
||||||
if (i > -1)
|
if (output) {
|
||||||
setCurrentScreen(i);
|
setCurrentOutput(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Workspace::slotSwitchToNextScreen()
|
void Workspace::slotSwitchToNextScreen()
|
||||||
{
|
{
|
||||||
if (screenSwitchImpossible())
|
if (screenSwitchImpossible())
|
||||||
return;
|
return;
|
||||||
setCurrentScreen((screens()->current() + 1) % screens()->count());
|
setCurrentOutput(nextOutput(screens()->currentOutput()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Workspace::slotSwitchToPrevScreen()
|
void Workspace::slotSwitchToPrevScreen()
|
||||||
{
|
{
|
||||||
if (screenSwitchImpossible())
|
if (screenSwitchImpossible())
|
||||||
return;
|
return;
|
||||||
setCurrentScreen((screens()->current() + screens()->count() - 1) % screens()->count());
|
setCurrentOutput(previousOutput(screens()->currentOutput()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Workspace::slotWindowToScreen()
|
void Workspace::slotWindowToScreen()
|
||||||
|
|
|
@ -317,7 +317,9 @@ public:
|
||||||
// D-Bus interface
|
// D-Bus interface
|
||||||
QString supportInformation() const;
|
QString supportInformation() const;
|
||||||
|
|
||||||
void setCurrentScreen(int new_screen);
|
AbstractOutput *nextOutput(AbstractOutput *reference) const;
|
||||||
|
AbstractOutput *previousOutput(AbstractOutput *reference) const;
|
||||||
|
void setCurrentOutput(AbstractOutput *output);
|
||||||
|
|
||||||
void setShowingDesktop(bool showing);
|
void setShowingDesktop(bool showing);
|
||||||
bool showingDesktop() const;
|
bool showingDesktop() const;
|
||||||
|
|
Loading…
Reference in a new issue