10#include <QApplication>
16#include <QRadioButton>
21#include <KConfigGroup>
22#include <KLocalizedString>
23#include <KWindowSystem>
25#include "kwinoptions_settings.h"
27#include <kwin_effects_interface.h>
29#include "kwinoptions_kdeglobals_settings.h"
30#include "kwinoptions_settings.h"
32#define CLICK_TO_FOCUS 0
33#define CLICK_TO_FOCUS_MOUSE_PRECEDENT 1
34#define FOCUS_FOLLOWS_MOUSE 2
35#define FOCUS_FOLLOWS_MOUSE_PRECEDENT 3
36#define FOCUS_UNDER_MOUSE 4
37#define FOCUS_STRICTLY_UNDER_MOUSE 5
51 : KCModule(parent, KPluginMetaData())
52 , standAlone(_standAlone)
62 m_settings = settings;
63 addConfig(m_settings, widget());
65 connect(m_ui->windowFocusPolicy, qOverload<int>(&QComboBox::currentIndexChanged),
this, &KFocusConfig::focusPolicyChanged);
66 connect(m_ui->windowFocusPolicy, qOverload<int>(&QComboBox::currentIndexChanged),
this, &KFocusConfig::updateDefaultIndicator);
67 connect(
this, SIGNAL(defaultsIndicatorsVisibleChanged(
bool)),
this, SLOT(updateDefaultIndicator()));
69 connect(qApp, &QGuiApplication::screenAdded,
this, &KFocusConfig::updateMultiScreen);
70 connect(qApp, &QGuiApplication::screenRemoved,
this, &KFocusConfig::updateMultiScreen);
74void KFocusConfig::updateMultiScreen()
76 m_ui->multiscreenBehaviorLabel->setVisible(QApplication::screens().count() > 1);
77 m_ui->kcfg_SeparateScreenFocus->setVisible(QApplication::screens().count() > 1);
80void KFocusConfig::updateDefaultIndicator()
82 const bool isDefault = m_ui->windowFocusPolicy->currentIndex() == defaultFocusPolicyIndex;
83 m_ui->windowFocusPolicy->setProperty(
"_kde_highlight_neutral", defaultsIndicatorsVisible() && !isDefault);
84 m_ui->windowFocusPolicy->update();
87void KFocusConfig::updateFocusPolicyExplanatoryText()
89 const int focusPolicy = m_ui->windowFocusPolicy->currentIndex();
90 switch (focusPolicy) {
92 m_ui->windowFocusPolicyDescriptionLabel->setText(i18n(
"<em>Click to focus:</em> A window becomes active when you click into it. This behavior is common on other operating systems and likely what you want."));
95 m_ui->windowFocusPolicyDescriptionLabel->setText(i18n(
"<em>Click to focus (mouse precedence):</em> Mostly the same as <em>Click to focus</em>. If an active window has to be chosen by the system (eg. because the currently active one was closed) the window under the mouse is the preferred candidate. Unusual, but possible variant of <em>Click to focus</em>."));
98 m_ui->windowFocusPolicyDescriptionLabel->setText(i18n(
"<em>Focus follows mouse:</em> Moving the mouse onto a window will activate it. Eg. windows randomly appearing under the mouse will not gain the focus. <em>Focus stealing prevention</em> takes place as usual. Think as <em>Click to focus</em> just without having to actually click."));
101 m_ui->windowFocusPolicyDescriptionLabel->setText(i18n(
"This is mostly the same as <em>Focus follows mouse</em>. If an active window has to be chosen by the system (eg. because the currently active one was closed) the window under the mouse is the preferred candidate. Choose this, if you want a hover controlled focus."));
104 m_ui->windowFocusPolicyDescriptionLabel->setText(i18n(
"<em>Focus under mouse:</em> The focus always remains on the window under the mouse.<br/><strong>Warning:</strong> <em>Focus stealing prevention</em> and the <em>tabbox ('Alt+Tab')</em> contradict the activation policy and will not work. You very likely want to use <em>Focus follows mouse (mouse precedence)</em> instead!"));
107 m_ui->windowFocusPolicyDescriptionLabel->setText(i18n(
"<em>Focus strictly under mouse:</em> The focus is always on the window under the mouse (in doubt nowhere) very much like the focus behavior in an unmanaged legacy X11 environment.<br/><strong>Warning:</strong> <em>Focus stealing prevention</em> and the <em>tabbox ('Alt+Tab')</em> contradict the activation policy and will not work. You very likely want to use <em>Focus follows mouse (mouse precedence)</em> instead!"));
112void KFocusConfig::focusPolicyChanged()
114 int selectedFocusPolicy = 0;
115 bool selectedNextFocusPrefersMouseItem =
false;
116 const bool loadedNextFocusPrefersMouseItem = m_settings->nextFocusPrefersMouse();
118 updateFocusPolicyExplanatoryText();
120 int focusPolicy = m_ui->windowFocusPolicy->currentIndex();
121 switch (focusPolicy) {
123 selectedFocusPolicy = KWinOptionsSettings::EnumFocusPolicy::ClickToFocus;
126 selectedFocusPolicy = KWinOptionsSettings::EnumFocusPolicy::ClickToFocus;
127 selectedNextFocusPrefersMouseItem =
true;
130 selectedFocusPolicy = KWinOptionsSettings::EnumFocusPolicy::FocusFollowsMouse;
133 selectedFocusPolicy = KWinOptionsSettings::EnumFocusPolicy::FocusFollowsMouse;
134 selectedNextFocusPrefersMouseItem =
true;
137 selectedFocusPolicy = KWinOptionsSettings::EnumFocusPolicy::FocusUnderMouse;
140 selectedFocusPolicy = KWinOptionsSettings::EnumFocusPolicy::FocusStrictlyUnderMouse;
144 unmanagedWidgetChangeState(m_settings->focusPolicy() != selectedFocusPolicy || loadedNextFocusPrefersMouseItem != selectedNextFocusPrefersMouseItem);
146 unmanagedWidgetDefaultState(focusPolicy == defaultFocusPolicyIndex);
154 m_ui->delayFocusOnLabel->setEnabled(focusPolicy !=
CLICK_TO_FOCUS);
155 m_ui->kcfg_DelayFocusInterval->setEnabled(focusPolicy !=
CLICK_TO_FOCUS);
162 const bool loadedNextFocusPrefersMouseItem = m_settings->nextFocusPrefersMouse();
164 int focusPolicy = m_settings->focusPolicy();
166 switch (focusPolicy) {
169 case KWinOptionsSettings::EnumFocusPolicy::ClickToFocus:
170 m_ui->windowFocusPolicy->setCurrentIndex(
CLICK_TO_FOCUS + loadedNextFocusPrefersMouseItem);
172 case KWinOptionsSettings::EnumFocusPolicy::FocusFollowsMouse:
173 m_ui->windowFocusPolicy->setCurrentIndex(
FOCUS_FOLLOWS_MOUSE + loadedNextFocusPrefersMouseItem);
177 m_ui->windowFocusPolicy->setCurrentIndex(focusPolicy + 2);
180 updateFocusPolicyExplanatoryText();
187 int idxFocusPolicy = m_ui->windowFocusPolicy->currentIndex();
188 switch (idxFocusPolicy) {
191 m_settings->setFocusPolicy(KWinOptionsSettings::EnumFocusPolicy::ClickToFocus);
197 m_settings->setFocusPolicy(KWinOptionsSettings::EnumFocusPolicy::FocusFollowsMouse);
200 m_settings->setFocusPolicy(KWinOptionsSettings::EnumFocusPolicy::FocusUnderMouse);
203 m_settings->setFocusPolicy(KWinOptionsSettings::EnumFocusPolicy::FocusStrictlyUnderMouse);
212 QDBusMessage message =
213 QDBusMessage::createSignal(
"/KWin",
"org.kde.KWin",
"reloadConfig");
214 QDBusConnection::sessionBus().send(message);
220 KCModule::defaults();
221 m_ui->windowFocusPolicy->setCurrentIndex(defaultFocusPolicyIndex);
231 : KCModule(parent, KPluginMetaData())
232 , standAlone(_standAlone)
235 if (settings && globalSettings) {
242 m_settings = settings;
243 addConfig(m_settings, widget());
244 addConfig(globalSettings, widget());
246 m_ui->kcfg_Placement->setItemData(KWinOptionsSettings::PlacementChoices::Smart,
"Smart");
247 m_ui->kcfg_Placement->setItemData(KWinOptionsSettings::PlacementChoices::Maximizing,
"Maximizing");
248 m_ui->kcfg_Placement->setItemData(KWinOptionsSettings::PlacementChoices::Random,
"Random");
249 m_ui->kcfg_Placement->setItemData(KWinOptionsSettings::PlacementChoices::Centered,
"Centered");
250 m_ui->kcfg_Placement->setItemData(KWinOptionsSettings::PlacementChoices::ZeroCornered,
"ZeroCornered");
251 m_ui->kcfg_Placement->setItemData(KWinOptionsSettings::PlacementChoices::UnderMouse,
"UnderMouse");
258 m_ui->kcfg_AllowKDEAppsToRememberWindowPositions->setVisible(KWindowSystem::isPlatformX11());
260 m_ui->kcfg_ActivationDesktopPolicy->setItemData(KWinOptionsSettings::ActivationDesktopPolicyChoices::SwitchToOtherDesktop,
"SwitchToOtherDesktop");
261 m_ui->kcfg_ActivationDesktopPolicy->setItemData(KWinOptionsSettings::ActivationDesktopPolicyChoices::BringToCurrentDesktop,
"BringToCurrentDesktop");
270 QDBusMessage message =
271 QDBusMessage::createSignal(
"/KWin",
"org.kde.KWin",
"reloadConfig");
272 QDBusConnection::sessionBus().send(message);
283 : KCModule(parent, KPluginMetaData())
284 , standAlone(_standAlone)
294 m_settings = settings;
295 addConfig(m_settings, widget());
304 QDBusMessage message =
305 QDBusMessage::createSignal(
"/KWin",
"org.kde.KWin",
"reloadConfig");
306 QDBusConnection::sessionBus().send(message);
310#include "moc_windows.cpp"
void initialize(KWinOptionsSettings *settings, KWinOptionsKDEGlobalsSettings *globalSettings)
KAdvancedConfig(bool _standAlone, KWinOptionsSettings *settings, KWinOptionsKDEGlobalsSettings *globalSettings, QWidget *parent)
void initialize(KWinOptionsSettings *settings)
KFocusConfig(bool _standAlone, KWinOptionsSettings *settings, QWidget *parent)
KMovingConfig(bool _standAlone, KWinOptionsSettings *settings, QWidget *parent)
void initialize(KWinOptionsSettings *settings)
#define FOCUS_FOLLOWS_MOUSE
#define CLICK_TO_FOCUS_MOUSE_PRECEDENT
#define FOCUS_FOLLOWS_MOUSE_PRECEDENT
#define FOCUS_UNDER_MOUSE
#define FOCUS_STRICTLY_UNDER_MOUSE