summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--twin/workspace.cpp67
1 files changed, 48 insertions, 19 deletions
diff --git a/twin/workspace.cpp b/twin/workspace.cpp
index b8e6a2731..950ebf92c 100644
--- a/twin/workspace.cpp
+++ b/twin/workspace.cpp
@@ -2556,36 +2556,65 @@ void Workspace::checkActiveBorder(const TQPoint &pos, Time now)
}
}
- bool active_left = pos.x() < activeLeft + activation_distance,
- active_right = pos.x() > activeRight - activation_distance,
- active_top = pos.y() < activeTop + activation_distance,
- active_bottom = pos.y() > activeBottom - activation_distance;
+ // These checks take activation distance into account, creating a
+ // virtual "activation band" for easier border/corner activation.
+ bool active_left = pos.x() < activeLeft + activation_distance,
+ active_right = pos.x() > activeRight - activation_distance,
+ active_top = pos.y() < activeTop + activation_distance,
+ active_bottom = pos.y() > activeBottom - activation_distance;
+
+ // These checks are used to make corner activation easier: we assume
+ // a 25% zone on the edge of each border where instead of half size
+ // tiling we perform quarter size tiling. The rest 50% is left for
+ // normal half size tiling.
+ uint active_width_quart = activeRight / 4,
+ active_height_quart = activeBottom / 4;
+
+ bool active_qleft = pos.x() < activeLeft + active_width_quart,
+ active_qright = pos.x() > activeRight - active_width_quart,
+ active_qtop = pos.y() < activeTop + active_height_quart,
+ active_qbottom = pos.y() > activeBottom - active_height_quart;
if (!active_left && !active_right && !active_top && !active_bottom)
return;
- kdDebug() << "active border activated "
+ kdDebug() << "active border activated "
<< pos.x() << ":" << pos.y() << endl;
ActiveBorder border = ActiveNone;
- if (active_left && active_top)
+ if (active_left && active_top) {
border = ActiveTopLeft;
- else if (active_right && active_top)
+ }
+ else if (active_right && active_top) {
border = ActiveTopRight;
- else if (active_left && active_bottom)
+ }
+ else if (active_left && active_bottom) {
border = ActiveBottomLeft;
- else if (active_right && active_bottom)
+ }
+ else if (active_right && active_bottom) {
border = ActiveBottomRight;
- else if (active_left)
- border = ActiveLeft;
- else if (active_right)
- border = ActiveRight;
- else if (active_top)
- border = ActiveTop;
- else if (active_bottom)
- border = ActiveBottom;
- else
- abort();
+ }
+ else if (active_left) {
+ border = active_qtop ? ActiveTopLeft
+ : (active_qbottom ? ActiveBottomLeft
+ : ActiveLeft);
+ }
+ else if (active_right) {
+ border = active_qtop ? ActiveTopRight
+ : (active_qbottom ? ActiveBottomRight
+ : ActiveRight);
+ }
+ else if (active_top) {
+ border = active_qleft ? ActiveTopLeft
+ : (active_qright ? ActiveTopRight
+ : ActiveTop);
+ }
+ else if (active_bottom) {
+ border = active_qleft ? ActiveBottomLeft
+ : (active_qright ? ActiveBottomRight
+ : ActiveBottom);
+ }
+ else abort();
if( active_windows[border] == None )
return;