@@ -42,6 +42,38 @@ AbstractStage {
4242 }
4343 }
4444
45+ // Alt+LMB handlers
46+ function windowMoveRequested(scenePos) {
47+ var candidate;
48+ if (priv.focusedAppDelegate && priv.focusedAppDelegate.contains(mapToItem(priv.focusedAppDelegate, scenePos.x, scenePos.y))) {
49+ candidate = priv.focusedAppDelegate;
50+ } else {
51+ candidate = appContainer.childAt(scenePos.x, scenePos.y);
52+ }
53+
54+ if (candidate && candidate.moveHandler) {
55+ print("!!! Window move requested", scenePos);
56+ var localPos = mapToItem(candidate, scenePos.x, scenePos.y)
57+ candidate.focus = true;
58+ candidate.moveHandler.handlePressedChanged(true, Qt.LeftButton, localPos.x, localPos.y);
59+ }
60+ }
61+ function windowMoveUpdated(scenePos) {
62+ if (priv.focusedAppDelegate) {
63+ print("!!! Window move updated", scenePos);
64+ var localPos = mapToItem(priv.focusedAppDelegate, scenePos.x, scenePos.y)
65+ priv.focusedAppDelegate.moveHandler.handlePositionChanged(localPos);
66+ }
67+ }
68+ function windowMoveEnded() {
69+ if (priv.focusedAppDelegate) {
70+ print("!!! Window move ended");
71+ priv.focusedAppDelegate.moveHandler.handlePressedChanged(false, Qt.LeftButton);
72+ priv.focusedAppDelegate.moveHandler.handleReleased();
73+ fakeRectangle.commit();
74+ }
75+ }
76+
4577 // Used by TutorialRight
4678 property bool spreadShown: spread.state == "altTab"
4779
@@ -248,6 +280,20 @@ AbstractStage {
248280 source: root.background
249281 }
250282
283+ Timer { // fix a race condition between TopLevelSurfaceRepeater and app (usually dash) starting up; set a focusedAppDelegate
284+ running: !appRepeater.startingUp
285+ interval: 1
286+ onTriggered: {
287+ for (var i = 0; i < appRepeater.count; i++) {
288+ var appDelegate = appRepeater.itemAt(i);
289+ if (appDelegate && appDelegate.focus) {
290+ priv.focusedAppDelegate = appDelegate;
291+ break;
292+ }
293+ }
294+ }
295+ }
296+
251297 TopLevelSurfaceRepeater {
252298 id: appRepeater
253299 model: topLevelSurfaceList
@@ -350,7 +396,8 @@ AbstractStage {
350396 readonly property var surface: model.surface
351397 readonly property alias resizeArea: resizeArea
352398 readonly property alias focusedSurface: decoratedWindow.focusedSurface
353− readonly property bool dragging: touchControls.overlayShown ? touchControls.dragging : decoratedWindow.dragging
399+ readonly property bool dragging: moveHandler.dragging
400+ readonly property alias moveHandler: decoratedWindow.moveHandler // for Alt+LMB dragging
354401
355402 readonly property bool isDash: model.application.appId == "unity8-dash"
356403 readonly property alias clientAreaItem: decoratedWindow.clientAreaItem