diff --git a/abstract_client.cpp b/abstract_client.cpp
--- a/abstract_client.cpp
+++ b/abstract_client.cpp
@@ -1511,7 +1511,9 @@
};
QRect area = workspace()->clientArea(MaximizeArea, QPoint(xroot, yroot), desktop());
- if (options->electricBorderTiling()) {
+
+ bool electricBorderTilingEnabled = options->electricBorderTiling() || options->electricBorderCornerTiling();
+ if (electricBorderTilingEnabled) {
if (xroot <= area.x() + 20) {
mode |= QuickTileFlag::Left;
innerBorder = isInScreen(QPoint(area.x() - 1, yroot));
@@ -1522,10 +1524,16 @@
}
if (mode != QuickTileMode(QuickTileFlag::None)) {
- if (yroot <= area.y() + area.height() * options->electricBorderCornerRatio())
- mode |= QuickTileFlag::Top;
- else if (yroot >= area.y() + area.height() - area.height() * options->electricBorderCornerRatio())
- mode |= QuickTileFlag::Bottom;
+ if (options->electricBorderCornerTiling()) {
+ if (yroot <= area.y() + area.height() * options->electricBorderCornerRatio())
+ mode |= QuickTileFlag::Top;
+ else if (yroot >= area.y() + area.height() - area.height() * options->electricBorderCornerRatio())
+ mode |= QuickTileFlag::Bottom;
+ else if (!options->electricBorderTiling()) { // Discard middle border zones for corner only tiling
+ mode = QuickTileFlag::None;
+ innerBorder = false;
+ }
+ }
} else if (options->electricBorderMaximize() && yroot <= area.y() + 5 && isMaximizable()) {
mode = QuickTileFlag::Maximize;
innerBorder = isInScreen(QPoint(xroot, area.y() - 1));
diff --git a/kcmkwin/kwinscreenedges/main.cpp b/kcmkwin/kwinscreenedges/main.cpp
--- a/kcmkwin/kwinscreenedges/main.cpp
+++ b/kcmkwin/kwinscreenedges/main.cpp
@@ -61,12 +61,14 @@
connect(m_ui->triggerCooldownSpin, SIGNAL(valueChanged(int)), this, SLOT(changed()));
connect(m_ui->quickMaximizeBox, SIGNAL(stateChanged(int)), this, SLOT(changed()));
connect(m_ui->quickTileBox, SIGNAL(stateChanged(int)), this, SLOT(changed()));
+ connect(m_ui->quickCornerTileBox, &QCheckBox::stateChanged, this, [this] { changed(); });
connect(m_ui->electricBorderCornerRatio, SIGNAL(valueChanged(int)), this, SLOT(changed()));
// Visual feedback of action group conflicts
connect(m_ui->desktopSwitchCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(groupChanged()));
connect(m_ui->quickMaximizeBox, SIGNAL(stateChanged(int)), this, SLOT(groupChanged()));
connect(m_ui->quickTileBox, SIGNAL(stateChanged(int)), this, SLOT(groupChanged()));
+ connect(m_ui->quickCornerTileBox, &QCheckBox::stateChanged, this, &KWinScreenEdgesConfig::groupChanged);
load();
@@ -102,6 +104,7 @@
m_ui->triggerCooldownSpin->setValue(config.readEntry("ElectricBorderCooldown", 350));
m_ui->quickMaximizeBox->setChecked(config.readEntry("ElectricBorderMaximize", true));
m_ui->quickTileBox->setChecked(config.readEntry("ElectricBorderTiling", true));
+ m_ui->quickCornerTileBox->setChecked(config.readEntry("ElectricBorderCornerTiling", true));
m_ui->electricBorderCornerRatio->setValue(qRound(config.readEntry("ElectricBorderCornerRatio", 0.25)*100));
emit changed(false);
@@ -120,6 +123,7 @@
config.writeEntry("ElectricBorderCooldown", m_ui->triggerCooldownSpin->value());
config.writeEntry("ElectricBorderMaximize", m_ui->quickMaximizeBox->isChecked());
config.writeEntry("ElectricBorderTiling", m_ui->quickTileBox->isChecked());
+ config.writeEntry("ElectricBorderCornerTiling", m_ui->quickCornerTileBox->isChecked());
config.writeEntry("ElectricBorderCornerRatio", m_ui->electricBorderCornerRatio->value()/100.0);
config.sync();
@@ -147,6 +151,7 @@
m_ui->triggerCooldownSpin->setValue(350);
m_ui->quickMaximizeBox->setChecked(true);
m_ui->quickTileBox->setChecked(true);
+ m_ui->quickCornerTileBox->setChecked(true);
m_ui->electricBorderCornerRatio->setValue(25);
emit changed(true);
diff --git a/kcmkwin/kwinscreenedges/main.ui b/kcmkwin/kwinscreenedges/main.ui
--- a/kcmkwin/kwinscreenedges/main.ui
+++ b/kcmkwin/kwinscreenedges/main.ui
@@ -7,7 +7,7 @@
0
0
488
- 511
+ 570
@@ -66,6 +66,13 @@
+ -
+
+
+ Tile windows by dragging them to the corners of the screen
+
+
+
-
-
@@ -90,7 +97,7 @@
false
- Quarter tiling triggered in the outer
+ Corner tiling triggered in the outer
electricBorderCornerRatio
@@ -305,50 +312,50 @@
- quickTileBox
+ quickCornerTileBox
toggled(bool)
label_3
setEnabled(bool)
- 93
- 306
+ 107
+ 337
- 105
- 329
+ 166
+ 376
- quickTileBox
+ quickCornerTileBox
toggled(bool)
electricBorderCornerRatio
setEnabled(bool)
- 164
- 312
+ 178
+ 337
301
345
- quickTileBox
+ quickCornerTileBox
toggled(bool)
label_4
setEnabled(bool)
- 220
- 305
+ 234
+ 337
- 340
- 329
+ 434
+ 376
diff --git a/kwin.kcfg b/kwin.kcfg
--- a/kwin.kcfg
+++ b/kwin.kcfg
@@ -180,6 +180,9 @@
true
+
+ true
+
0.25
0.0
diff --git a/options.h b/options.h
--- a/options.h
+++ b/options.h
@@ -150,7 +150,11 @@
**/
Q_PROPERTY(bool electricBorderTiling READ electricBorderTiling WRITE setElectricBorderTiling NOTIFY electricBorderTilingChanged)
/**
- * Whether a window is tiled to half screen when reaching left or right screen edge while been moved.
+ * Whether a window is tiled to quarter screen when reaching top-left, top-right, bottom-left or bottom-right border zones of the screen while been moved.
+ **/
+ Q_PROPERTY(bool electricBorderCornerTiling READ electricBorderCornerTiling WRITE setElectricBorderCornerTiling NOTIFY electricBorderCornerTilingChanged)
+ /**
+ * The ratio of the corner tiling zone height to the current screen height.
**/
Q_PROPERTY(float electricBorderCornerRatio READ electricBorderCornerRatio WRITE setElectricBorderCornerRatio NOTIFY electricBorderCornerRatioChanged)
Q_PROPERTY(bool borderlessMaximizedWindows READ borderlessMaximizedWindows WRITE setBorderlessMaximizedWindows NOTIFY borderlessMaximizedWindowsChanged)
@@ -507,6 +511,13 @@
bool electricBorderTiling() const {
return electric_border_tiling;
}
+ /**
+ * @returns true if window is tiled to quarter screen when reaching
+ * top-left, top-right, bottom-left or bottom-right border zones of the screen while been moved.
+ **/
+ bool electricBorderCornerTiling() const {
+ return electric_border_corner_tiling;
+ }
/**
* @returns the factor that determines the corner part of the edge (ie. 0.1 means tiny corner)
**/
@@ -653,6 +664,7 @@
void setCondensedTitle(bool condensedTitle);
void setElectricBorderMaximize(bool electricBorderMaximize);
void setElectricBorderTiling(bool electricBorderTiling);
+ void setElectricBorderCornerTiling(bool electricBorderCornerTiling);
void setElectricBorderCornerRatio(float electricBorderCornerRatio);
void setBorderlessMaximizedWindows(bool borderlessMaximizedWindows);
void setKillPingTimeout(int killPingTimeout);
@@ -844,6 +856,7 @@
void condensedTitleChanged();
void electricBorderMaximizeChanged();
void electricBorderTilingChanged();
+ void electricBorderCornerTilingChanged();
void electricBorderCornerRatioChanged();
void borderlessMaximizedWindowsChanged();
void killPingTimeoutChanged();
@@ -938,6 +951,7 @@
bool electric_border_maximize;
bool electric_border_tiling;
+ bool electric_border_corner_tiling;
float electric_border_corner_ratio;
bool borderless_maximized_windows;
bool show_geometry_tip;
diff --git a/options.cpp b/options.cpp
--- a/options.cpp
+++ b/options.cpp
@@ -144,6 +144,7 @@
, CmdAllModKey(Options::defaultKeyCmdAllModKey())
, electric_border_maximize(false)
, electric_border_tiling(false)
+ , electric_border_corner_tiling(false)
, electric_border_corner_ratio(0.0)
, borderless_maximized_windows(false)
, show_geometry_tip(false)
@@ -534,6 +535,15 @@
emit electricBorderTilingChanged();
}
+void Options::setElectricBorderCornerTiling(bool electricBorderCornerTiling)
+{
+ if (electric_border_corner_tiling == electricBorderCornerTiling) {
+ return;
+ }
+ electric_border_corner_tiling = electricBorderCornerTiling;
+ emit electricBorderCornerTilingChanged();
+}
+
void Options::setElectricBorderCornerRatio(float electricBorderCornerRatio)
{
if (electric_border_corner_ratio == electricBorderCornerRatio) {
@@ -885,6 +895,7 @@
setBorderlessMaximizedWindows(m_settings->borderlessMaximizedWindows());
setElectricBorderMaximize(m_settings->electricBorderMaximize());
setElectricBorderTiling(m_settings->electricBorderTiling());
+ setElectricBorderCornerTiling(m_settings->electricBorderCornerTiling());
setElectricBorderCornerRatio(m_settings->electricBorderCornerRatio());
setWindowsBlockCompositing(m_settings->windowsBlockCompositing());