@@ -48,6 +48,9 @@ FocusScope {
4848 property rect inputMethodRect
4949 property real rightEdgePushProgress: 0
5050 property Item availableDesktopArea
51+ property PanelState panelState
52+
53+ readonly property var temporarySelectedWorkspace: state == "spread" ? screensAndWorkspaces.lastClickedWorkspace : null
5154
5255 // Configuration
5356 property string mode: "staged"
@@ -243,6 +246,25 @@ FocusScope {
243246 }
244247 }
245248
249+ GlobalShortcut {
250+ id: showWorkspaceSwitcherShortcutLeft
251+ shortcut: Qt.AltModifier|Qt.ControlModifier|Qt.Key_Left
252+ active: !workspaceSwitcher.active
253+ onTriggered: {
254+ root.focus = true;
255+ workspaceSwitcher.showLeft()
256+ }
257+ }
258+ GlobalShortcut {
259+ id: showWorkspaceSwitcherShortcutRight
260+ shortcut: Qt.AltModifier|Qt.ControlModifier|Qt.Key_Right
261+ active: !workspaceSwitcher.active
262+ onTriggered: {
263+ root.focus = true;
264+ workspaceSwitcher.showRight()
265+ }
266+ }
267+
246268 QtObject {
247269 id: priv
248270 objectName: "DesktopStagePrivate"
@@ -378,23 +400,23 @@ FocusScope {
378400 readonly property real windowDecorationHeight: units.gu(3)
379401 }
380402
381− Component.onCompleted: priv.updateMainAndSideStageIndexes();
403+ Component.onCompleted: priv.updateMainAndSideStageIndexes()
382404
383405 Connections {
384− target: PanelState
406+ target: panelState
385407 onCloseClicked: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.close(); } }
386408 onMinimizeClicked: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.requestMinimize(); } }
387409 onRestoreClicked: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.requestRestore(); } }
388410 }
389411
390412 Binding {
391− target: PanelState
413+ target: panelState
392414 property: "decorationsVisible"
393415 value: priv.focusedAppDelegate !== null && priv.focusedAppDelegate.maximized // FIXME for Locally integrated menus
394416 }
395417
396418 Binding {
397− target: PanelState
419+ target: panelState
398420 property: "title"
399421 value: {
400422 if (priv.focusedAppDelegate !== null) {
@@ -409,7 +431,7 @@ FocusScope {
409431 }
410432
411433 Binding {
412− target: PanelState
434+ target: panelState
413435 property: "focusedPersistentSurfaceId"
414436 value: {
415437 if (priv.focusedAppDelegate !== null) {
@@ -423,21 +445,21 @@ FocusScope {
423445 }
424446
425447 Binding {
426− target: PanelState
448+ target: panelState
427449 property: "dropShadow"
428450 value: priv.focusedAppDelegate && !priv.focusedAppDelegate.maximized && priv.foregroundMaximizedAppDelegate !== null && mode == "windowed"
429451 }
430452
431453 Binding {
432− target: PanelState
454+ target: panelState
433455 property: "closeButtonShown"
434456 value: priv.focusedAppDelegate && priv.focusedAppDelegate.maximized && !priv.focusedAppDelegate.isDash
435457 }
436458
437459 Component.onDestruction: {
438− PanelState.title = "";
439− PanelState.decorationsVisible = false;
440− PanelState.dropShadow = false;
460+ panelState.title = "";
461+ panelState.decorationsVisible = false;
462+ panelState.dropShadow = false;
441463 }
442464
443465 Instantiator {
@@ -483,6 +505,7 @@ FocusScope {
483505 PropertyChanges { target: cancelSpreadMouseArea; enabled: true }
484506 PropertyChanges { target: blurLayer; visible: true; blurRadius: 32; brightness: .65; opacity: 1 }
485507 PropertyChanges { target: wallpaper; visible: false }
508+ PropertyChanges { target: screensAndWorkspaces; opacity: 1 }
486509 },
487510 State {
488511 name: "stagedRightEdge"; when: root.spreadEnabled && (rightEdgeDragArea.dragging || rightEdgePushProgress > 0) && root.mode == "staged"
@@ -530,11 +553,18 @@ FocusScope {
530553 Transition {
531554 from: "stagedRightEdge,sideStagedRightEdge,windowedRightEdge"; to: "spread"
532555 PropertyAction { target: spreadItem; property: "highlightedIndex"; value: -1 }
556+ PropertyAction { target: screensAndWorkspaces; property: "activeWorkspace"; value: WMScreen.currentWorkspace }
557+ ScriptAction { script: { print("blabal***********************", WMScreen.currentWorkspace) } }
533558 PropertyAnimation { target: blurLayer; properties: "brightness,blurRadius"; duration: priv.animationDuration }
559+ UbuntuNumberAnimation { target: screensAndWorkspaces; property: "opacity"; duration: priv.animationDuration }
534560 },
535561 Transition {
536562 to: "spread"
563+ PropertyAction { target: screensAndWorkspaces; property: "activeWorkspace"; value: WMScreen.currentWorkspace }
564+ ScriptAction { script: { print("blabal***********************", WMScreen.currentWorkspace) } }
537565 PropertyAction { target: spreadItem; property: "highlightedIndex"; value: appRepeater.count > 1 ? 1 : 0 }
566+ PropertyAction { target: floatingFlickable; property: "contentX"; value: 0 }
567+ UbuntuNumberAnimation { target: screensAndWorkspaces; property: "opacity"; duration: priv.animationDuration }
538568 },
539569 Transition {
540570 from: "spread"
@@ -550,6 +580,7 @@ FocusScope {
550580 }
551581 PropertyAction { target: spreadItem; property: "highlightedIndex"; value: -1 }
552582 PropertyAction { target: floatingFlickable; property: "contentX"; value: 0 }
583+ PropertyAction { target: screensAndWorkspaces; property: "lastClickedWorkspace"; value: null }
553584 }
554585 },
555586 Transition {
@@ -592,10 +623,21 @@ FocusScope {
592623 visible: false
593624 }
594625
626+ ScreensAndWorkspaces {
627+ id: screensAndWorkspaces
628+ anchors { left: parent.left; top: parent.top; right: parent.right; leftMargin: root.leftMargin }
629+ height: Math.max(units.gu(30), parent.height * .3)
630+ background: root.background
631+ opacity: 0
632+ visible: opacity > 0
633+ onCloseSpread: priv.goneToSpread = false;
634+ onLastClickedWorkspaceChanged: activeWorkspace = lastClickedWorkspace
635+ }
636+
595637 Spread {
596638 id: spreadItem
597639 objectName: "spreadItem"
598− anchors.fill: appContainer
640+ anchors { left: parent.left; bottom: parent.bottom; right: parent.right; top: screensAndWorkspaces.bottom }
599641 leftMargin: root.availableDesktopArea.x
600642 model: root.topLevelSurfaceList
601643 spreadFlickable: floatingFlickable
@@ -610,6 +652,83 @@ FocusScope {
610652 appRepeater.itemAt(highlightedIndex).close();
611653 }
612654 }
655+
656+ FloatingFlickable {
657+ id: floatingFlickable
658+ objectName: "spreadFlickable"
659+ anchors.fill: parent
660+ enabled: false
661+ contentWidth: spreadItem.spreadTotalWidth
662+
663+ function snap(toIndex) {
664+ var delegate = appRepeater.itemAt(toIndex)
665+ var targetContentX = floatingFlickable.contentWidth / spreadItem.totalItemCount * toIndex;
666+ if (targetContentX - floatingFlickable.contentX > spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) {
667+ var offset = (spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) - (targetContentX - floatingFlickable.contentX)
668+ snapAnimation.to = floatingFlickable.contentX - offset;
669+ snapAnimation.start();
670+ } else if (targetContentX - floatingFlickable.contentX < spreadItem.leftStackXPos + units.gu(1)) {
671+ var offset = (spreadItem.leftStackXPos + units.gu(1)) - (targetContentX - floatingFlickable.contentX);
672+ snapAnimation.to = floatingFlickable.contentX - offset;
673+ snapAnimation.start();
674+ }
675+ }
676+ UbuntuNumberAnimation {id: snapAnimation; target: floatingFlickable; property: "contentX"}
677+ }
678+
679+ MouseArea {
680+ id: hoverMouseArea
681+ objectName: "hoverMouseArea"
682+ anchors.fill: parent
683+ propagateComposedEvents: true
684+ hoverEnabled: true
685+ enabled: false
686+ visible: enabled
687+
688+ property int scrollAreaWidth: width / 3
689+ property bool progressiveScrollingEnabled: false
690+
691+ onPressed: mouse.accepted = false
692+
693+ onMouseXChanged: {
694+ mouse.accepted = false
695+
696+ if (hoverMouseArea.pressed) {
697+ return;
698+ }
699+
700+ // Find the hovered item and mark it active
701+ for (var i = appRepeater.count - 1; i >= 0; i--) {
702+ var appDelegate = appRepeater.itemAt(i);
703+ var mapped = mapToItem(appDelegate, hoverMouseArea.mouseX, hoverMouseArea.mouseY)
704+ var itemUnder = appDelegate.childAt(mapped.x, mapped.y);
705+ if (itemUnder && (itemUnder.objectName === "dragArea" || itemUnder.objectName === "windowInfoItem" || itemUnder.objectName == "closeMouseArea")) {
706+ spreadItem.highlightedIndex = i;
707+ break;
708+ }
709+ }
710+
711+ if (floatingFlickable.contentWidth > floatingFlickable.width) {
712+ var margins = floatingFlickable.width * 0.05;
713+
714+ if (!progressiveScrollingEnabled && mouseX < floatingFlickable.width - scrollAreaWidth) {
715+ progressiveScrollingEnabled = true
716+ }
717+
718+ // do we need to scroll?
719+ if (mouseX < scrollAreaWidth + margins) {
720+ var progress = Math.min(1, (scrollAreaWidth + margins - mouseX) / (scrollAreaWidth - margins));
721+ var contentX = (1 - progress) * (floatingFlickable.contentWidth - floatingFlickable.width)
722+ floatingFlickable.contentX = Math.max(0, Math.min(floatingFlickable.contentX, contentX))
723+ }
724+ if (mouseX > floatingFlickable.width - scrollAreaWidth && progressiveScrollingEnabled) {
725+ var progress = Math.min(1, (mouseX - (floatingFlickable.width - scrollAreaWidth)) / (scrollAreaWidth - margins))
726+ var contentX = progress * (floatingFlickable.contentWidth - floatingFlickable.width)
727+ floatingFlickable.contentX = Math.min(floatingFlickable.contentWidth - floatingFlickable.width, Math.max(floatingFlickable.contentX, contentX))
728+ }
729+ }
730+ }
731+ }
613732 }
614733
615734 Connections {
@@ -704,6 +823,24 @@ FocusScope {
704823 }
705824 }
706825
826+ MirSurfaceItem {
827+ id: fakeDragItem
828+ property real previewScale: .5
829+ height: (screensAndWorkspaces.height - units.gu(8)) / 2
830+ // w : h = iw : ih
831+ width: implicitWidth * height / implicitHeight
832+ surfaceWidth: -1
833+ surfaceHeight: -1
834+ opacity: surface != null ? 1 : 0
835+ Behavior on opacity { UbuntuNumberAnimation {} }
836+ visible: opacity > 0
837+
838+ Drag.active: surface != null
839+ Drag.keys: ["application"]
840+
841+ z: 1000
842+ }
843+
707844 Repeater {
708845 id: appRepeater
709846 model: topLevelSurfaceList
@@ -732,6 +869,9 @@ FocusScope {
732869 }
733870 z: normalZ
734871
872+ opacity: fakeDragItem.surface == model.window.surface && fakeDragItem.Drag.active ? 0 : 1
873+ Behavior on opacity { UbuntuNumberAnimation {} }
874+
735875 // Normally we want x/y where the surface thinks it is. Width/height of our delegate will
736876 // match what the actual surface size is.
737877 // Don't write to those, they will be set by states
@@ -912,7 +1052,6 @@ FocusScope {
9121052 function claimFocus() {
9131053 if (root.state == "spread") {
9141054 spreadItem.highlightedIndex = index
915− priv.goneToSpread = false;
9161055 }
9171056 if (root.mode == "stagedWithSideStage") {
9181057 if (appDelegate.stage == ApplicationInfoInterface.SideStage && !sideStage.shown) {
@@ -1246,8 +1385,6 @@ FocusScope {
12461385 y: spreadMaths.targetY
12471386 z: index
12481387 height: spreadItem.spreadItemHeight
1249− requestedWidth: decoratedWindow.oldRequestedWidth
1250− requestedHeight: decoratedWindow.oldRequestedHeight
12511388 visible: spreadMaths.itemVisible
12521389 }
12531390 PropertyChanges { target: dragArea; enabled: true }
@@ -1267,8 +1404,6 @@ FocusScope {
12671404 y: stagedRightEdgeMaths.animatedY
12681405 z: stagedRightEdgeMaths.animatedZ
12691406 height: stagedRightEdgeMaths.animatedHeight
1270− requestedWidth: decoratedWindow.oldRequestedWidth
1271− requestedHeight: decoratedWindow.oldRequestedHeight
12721407 visible: appDelegate.x < root.width
12731408 }
12741409 PropertyChanges {
@@ -1298,8 +1433,6 @@ FocusScope {
12981433 y: windowedRightEdgeMaths.animatedY
12991434 z: windowedRightEdgeMaths.animatedZ
13001435 height: stagedRightEdgeMaths.animatedHeight
1301− requestedWidth: decoratedWindow.oldRequestedWidth
1302− requestedHeight: decoratedWindow.oldRequestedHeight
13031436 }
13041437 PropertyChanges {
13051438 target: decoratedWindow
@@ -1322,11 +1455,15 @@ FocusScope {
13221455 target: appDelegate
13231456 x: stageMaths.itemX
13241457 y: root.availableDesktopArea.y
1325− requestedWidth: appContainer.width
1326− requestedHeight: root.availableDesktopArea.height
13271458 visuallyMaximized: true
13281459 visible: appDelegate.x < root.width
13291460 }
1461+ PropertyChanges {
1462+ target: appDelegate
1463+ requestedWidth: appContainer.width
1464+ requestedHeight: root.availableDesktopArea.height
1465+ restoreEntryValues: false
1466+ }
13301467 PropertyChanges {
13311468 target: decoratedWindow
13321469 hasDecoration: false
@@ -1355,11 +1492,15 @@ FocusScope {
13551492 x: stageMaths.itemX
13561493 y: root.availableDesktopArea.y
13571494 z: stageMaths.itemZ
1358− requestedWidth: stageMaths.itemWidth
1359− requestedHeight: root.availableDesktopArea.height
13601495 visuallyMaximized: true
13611496 visible: appDelegate.x < root.width
13621497 }
1498+ PropertyChanges {
1499+ target: appDelegate
1500+ requestedWidth: stageMaths.itemWidth
1501+ requestedHeight: root.availableDesktopArea.height
1502+ restoreEntryValues: false
1503+ }
13631504 PropertyChanges {
13641505 target: decoratedWindow
13651506 hasDecoration: false
@@ -1381,8 +1522,12 @@ FocusScope {
13811522 requestedY: 0;
13821523 visuallyMinimized: false;
13831524 visuallyMaximized: true
1525+ }
1526+ PropertyChanges {
1527+ target: appDelegate
13841528 requestedWidth: root.availableDesktopArea.width;
13851529 requestedHeight: appContainer.height;
1530+ restoreEntryValues: false
13861531 }
13871532 PropertyChanges { target: touchControls; enabled: true }
13881533 },
@@ -1392,8 +1537,12 @@ FocusScope {
13921537 target: appDelegate;
13931538 requestedX: 0
13941539 requestedY: 0
1395− requestedWidth: appContainer.width;
1396− requestedHeight: appContainer.height;
1540+ }
1541+ PropertyChanges {
1542+ target: appDelegate
1543+ requestedWidth: appContainer.width
1544+ requestedHeight: appContainer.height
1545+ restoreEntryValues: false
13971546 }
13981547 PropertyChanges { target: decoratedWindow; hasDecoration: false }
13991548 },
@@ -1408,6 +1557,12 @@ FocusScope {
14081557 PropertyChanges { target: touchControls; enabled: true }
14091558 PropertyChanges { target: resizeArea; enabled: true }
14101559 PropertyChanges { target: decoratedWindow; shadowOpacity: .3}
1560+ PropertyChanges {
1561+ target: appDelegate
1562+ requestedWidth: windowedWidth
1563+ requestedHeight: windowedHeight
1564+ restoreEntryValues: false
1565+ }
14111566 },
14121567 State {
14131568 name: "restored";
@@ -1508,6 +1663,10 @@ FocusScope {
15081663 }
15091664 }
15101665 ]
1666+ onStateChanged: {
1667+ print("item", index, "state changed", state)
1668+ }
1669+
15111670 transitions: [
15121671 Transition {
15131672 from: "staged,stagedWithSideStage"
@@ -1521,6 +1680,7 @@ FocusScope {
15211680 UbuntuNumberAnimation { target: appDelegate; properties: "x,y,requestedX,requestedY,requestedWidth,requestedHeight"; duration: priv.animationDuration}
15221681 },
15231682 Transition {
1683+ from: "normal,restored,maximized,maximizedHorizontally,maximizedVertically,maximizedLeft,maximizedRight,maximizedTopLeft,maximizedBottomLeft,maximizedTopRight,maximizedBottomRight,staged,stagedWithSideStage,windowedRightEdge,stagedRightEdge";
15241684 to: "spread"
15251685 // DecoratedWindow wants the scaleToPreviewSize set before enabling scaleToPreview
15261686 PropertyAction { target: appDelegate; properties: "z,visible" }
@@ -1606,7 +1766,7 @@ FocusScope {
16061766 ]
16071767
16081768 Binding {
1609− target: PanelState
1769+ target: panelState
16101770 property: "decorationsAlwaysVisible"
16111771 value: appDelegate && appDelegate.maximized && touchControls.overlayShown
16121772 }
@@ -1627,6 +1787,7 @@ FocusScope {
16271787 borderThickness: units.gu(2)
16281788 enabled: false
16291789 visible: enabled
1790+ readyToAssesBounds: !appDelegate._constructing
16301791
16311792 onPressed: {
16321793 appDelegate.activate();
@@ -1650,18 +1811,13 @@ FocusScope {
16501811 width: implicitWidth
16511812 height: implicitHeight
16521813 highlightSize: windowInfoItem.iconMargin / 2
1653− altDragEnabled: root.mode == "windowed"
16541814 boundsItem: root.availableDesktopArea
1815+ panelState: root.panelState
1816+ altDragEnabled: root.mode == "windowed"
16551817
16561818 requestedWidth: appDelegate.requestedWidth
16571819 requestedHeight: appDelegate.requestedHeight
16581820
1659− property int oldRequestedWidth: -1
1660− property int oldRequestedHeight: -1
1661−
1662− onRequestedWidthChanged: oldRequestedWidth = requestedWidth
1663− onRequestedHeightChanged: oldRequestedHeight = requestedHeight
1664−
16651821 onCloseClicked: { appDelegate.close(); }
16661822 onMaximizeClicked: {
16671823 if (appDelegate.canBeMaximized) {
@@ -1742,6 +1898,8 @@ FocusScope {
17421898 anchors.fill: decoratedWindow
17431899 enabled: false
17441900 closeable: !appDelegate.isDash
1901+ stage: root
1902+ dragDelegate: fakeDragItem
17451903
17461904 onClicked: {
17471905 spreadItem.highlightedIndex = index;
@@ -1784,12 +1942,15 @@ FocusScope {
17841942 objectName: "closeMouseArea"
17851943 anchors { left: parent.left; top: parent.top; leftMargin: -height / 2; topMargin: -height / 2 + spreadMaths.closeIconOffset }
17861944 readonly property var mousePos: hoverMouseArea.mapToItem(appDelegate, hoverMouseArea.mouseX, hoverMouseArea.mouseY)
1787− visible: !appDelegate.isDash && dragArea.distance == 0
1945+ readonly property bool shown: !appDelegate.isDash && dragArea.distance == 0
17881946 && index == spreadItem.highlightedIndex
17891947 && mousePos.y < (decoratedWindow.height / 3)
17901948 && mousePos.y > -units.gu(4)
17911949 && mousePos.x > -units.gu(4)
17921950 && mousePos.x < (decoratedWindow.width * 2 / 3)
1951+ opacity: shown ? 1 : 0
1952+ visible: opacity > 0
1953+ Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } }
17931954 height: units.gu(6)
17941955 width: height
17951956
@@ -1860,83 +2021,19 @@ FocusScope {
18602021 leftMargin: root.availableDesktopArea.x
18612022 appContainerWidth: appContainer.width
18622023 appContainerHeight: appContainer.height
2024+ panelState: root.panelState
18632025 }
18642026
1865− MouseArea {
1866− id: hoverMouseArea
1867− objectName: "hoverMouseArea"
1868− anchors.fill: appContainer
1869− propagateComposedEvents: true
1870− hoverEnabled: true
1871− enabled: false
1872− visible: enabled
1873−
1874− property int scrollAreaWidth: width / 3
1875− property bool progressiveScrollingEnabled: false
1876−
1877− onMouseXChanged: {
1878− mouse.accepted = false
1879−
1880− if (hoverMouseArea.pressed) {
1881− return;
1882− }
1883−
1884− // Find the hovered item and mark it active
1885− for (var i = appRepeater.count - 1; i >= 0; i--) {
1886− var appDelegate = appRepeater.itemAt(i);
1887− var mapped = mapToItem(appDelegate, hoverMouseArea.mouseX, hoverMouseArea.mouseY)
1888− var itemUnder = appDelegate.childAt(mapped.x, mapped.y);
1889− if (itemUnder && (itemUnder.objectName === "dragArea" || itemUnder.objectName === "windowInfoItem" || itemUnder.objectName == "closeMouseArea")) {
1890− spreadItem.highlightedIndex = i;
1891− break;
1892− }
1893− }
1894−
1895− if (floatingFlickable.contentWidth > floatingFlickable.width) {
1896− var margins = floatingFlickable.width * 0.05;
1897−
1898− if (!progressiveScrollingEnabled && mouseX < floatingFlickable.width - scrollAreaWidth) {
1899− progressiveScrollingEnabled = true
1900− }
1901−
1902− // do we need to scroll?
1903− if (mouseX < scrollAreaWidth + margins) {
1904− var progress = Math.min(1, (scrollAreaWidth + margins - mouseX) / (scrollAreaWidth - margins));
1905− var contentX = (1 - progress) * (floatingFlickable.contentWidth - floatingFlickable.width)
1906− floatingFlickable.contentX = Math.max(0, Math.min(floatingFlickable.contentX, contentX))
1907− }
1908− if (mouseX > floatingFlickable.width - scrollAreaWidth && progressiveScrollingEnabled) {
1909− var progress = Math.min(1, (mouseX - (floatingFlickable.width - scrollAreaWidth)) / (scrollAreaWidth - margins))
1910− var contentX = progress * (floatingFlickable.contentWidth - floatingFlickable.width)
1911− floatingFlickable.contentX = Math.min(floatingFlickable.contentWidth - floatingFlickable.width, Math.max(floatingFlickable.contentX, contentX))
1912− }
1913− }
1914− }
1915−
1916− onPressed: mouse.accepted = false
1917− }
1918−
1919− FloatingFlickable {
1920− id: floatingFlickable
1921− objectName: "spreadFlickable"
1922− anchors.fill: appContainer
1923− enabled: false
1924− contentWidth: spreadItem.spreadTotalWidth
1925−
1926− function snap(toIndex) {
1927− var delegate = appRepeater.itemAt(toIndex)
1928− var targetContentX = floatingFlickable.contentWidth / spreadItem.totalItemCount * toIndex;
1929− if (targetContentX - floatingFlickable.contentX > spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) {
1930− var offset = (spreadItem.rightStackXPos - (spreadItem.spreadItemWidth / 2)) - (targetContentX - floatingFlickable.contentX)
1931− snapAnimation.to = Math.max(0, floatingFlickable.contentX - offset);
1932− snapAnimation.start();
1933− } else if (targetContentX - floatingFlickable.contentX < spreadItem.leftStackXPos + units.gu(1)) {
1934− var offset = (spreadItem.leftStackXPos + units.gu(1)) - (targetContentX - floatingFlickable.contentX);
1935− snapAnimation.to = Math.max(0, floatingFlickable.contentX - offset);
1936− snapAnimation.start();
2027+ WorkspaceSwitcher {
2028+ id: workspaceSwitcher
2029+ anchors.centerIn: parent
2030+ height: units.gu(20)
2031+ background: root.background
2032+ onActiveChanged: {
2033+ if (!active) {
2034+ appContainer.focus = true;
19372035 }
19382036 }
1939− UbuntuNumberAnimation {id: snapAnimation; target: floatingFlickable; property: "contentX"}
19402037 }
19412038
19422039 PropertyAnimation {