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());