on xenial help sign in
merge
commit0650b49c9a2c13311efd81fc2f52c1402dc12ad1 authorLarry Price <larry.price@canonical.com> dateTue 26 Jul 2016, 15:49 (10 years ago) parent389290207e4e7b
898 files changed+48068−31583
CMakeLists.txt+14−2 build.sh+2−2 data/51-unity8-greeter.conf+2 data/CMakeLists.txt+11 data/com.canonical.Unity8.gschema.xml+5 data/devices.conf+30 data/unity8-dash.desktop.in−1 data/unity8-dash.png data/unity8-greeter-init.conf+12 data/unity8-greeter-wrapper+98 data/unity8-greeter.desktop.in+7 data/unity8-greeter.pkla+44 data/unity8.conf+31−12 debian/bileto_pre_release_hook+5 debian/changelog+427 debian/control+30−12 debian/rules+5−9 debian/unity8-greeter.install+5 debian/unity8-private.install+3−3 debian/unity8.install+2 debian/usr.bin.unity8-dash+21 doc/devices.conf+15 libs/CMakeLists.txt−1 libs/UbuntuGestures/CMakeLists.txt−41 libs/UbuntuGestures/CandidateInactivityTimer.cpp−46 libs/UbuntuGestures/CandidateInactivityTimer.h−51 libs/UbuntuGestures/DebugHelpers.cpp−95 libs/UbuntuGestures/DebugHelpers.h−31 libs/UbuntuGestures/Pool.h−124 libs/UbuntuGestures/TimeSource.cpp−49 libs/UbuntuGestures/TimeSource.h−64 libs/UbuntuGestures/Timer.cpp−152 libs/UbuntuGestures/Timer.h−122 libs/UbuntuGestures/TouchOwnershipEvent.h−50 libs/UbuntuGestures/TouchRegistry.cpp−553 libs/UbuntuGestures/TouchRegistry.h−201 libs/UbuntuGestures/UnownedTouchEvent.h−45 plugins/AccountsService/AccountsService.cpp+24−2 plugins/AccountsService/AccountsService.h+13−1 plugins/AccountsService/AccountsService.qmltypes−41 plugins/AccountsService/CMakeLists.txt+5 plugins/AccountsService/com.canonical.unity.AccountsService.xml+4 plugins/CMakeLists.txt+3−2 plugins/Cursor/CMakeLists.txt+6−1 plugins/Cursor/Cursor.qml+37−6 plugins/Cursor/Cursor.qmltypes−78 plugins/Cursor/CursorImageInfo.cpp+96 plugins/Cursor/CursorImageInfo.h+72 plugins/Cursor/CursorImageProvider.cpp+51−22 plugins/Cursor/CursorImageProvider.h+12−4 plugins/Cursor/MousePointer.cpp+42−32 plugins/Cursor/MousePointer.h+9−7 plugins/Cursor/plugin.cpp+4−2 plugins/Cursor/qmldir+1−1 plugins/Dash/AudioProgressBar.qml+1−1 plugins/Dash/CMakeLists.txt+4 plugins/Dash/CardCreator.js+171−84 plugins/Dash/CardCreatorCache.qml+3−3 plugins/Dash/CardSocialActions.qml+94 plugins/Dash/Dash.qmltypes−100 plugins/Dash/ScopeStyle.qml+1−1 plugins/Dash/abstractdashview.h+1−3 plugins/Dash/graphics/music_progress_bg.png plugins/Dash/horizontaljournal.cpp+1−4 plugins/Dash/listviewwithpageheader.cpp+56−36 plugins/Dash/listviewwithpageheader.h+2−1 plugins/Dash/organicgrid.cpp+3−4 plugins/Dash/qmldir+1 plugins/Dash/verticaljournal.cpp+3−4 plugins/GlobalShortcut/GlobalShortcut.qmltypes−31 plugins/Greeter/Unity/Launcher/CMakeLists.txt+1−1 plugins/Greeter/Unity/Launcher/Launcher.qmltypes−182 plugins/Greeter/Unity/Launcher/launcheritem.cpp+14 plugins/Greeter/Unity/Launcher/launcheritem.h+3−1 plugins/Greeter/Unity/Launcher/launchermodelas.cpp+2−7 plugins/Greeter/Unity/Launcher/launchermodelas.h−1 plugins/IntegratedLightDM/CMakeLists.txt−40 plugins/LightDM/CMakeLists.txt+26 plugins/IntegratedLightDM/DBusGreeter.cpp → plugins/LightDM/DBusGreeter.cpp+5−4 plugins/IntegratedLightDM/DBusGreeter.h → plugins/LightDM/DBusGreeter.h plugins/IntegratedLightDM/DBusGreeterList.cpp → plugins/LightDM/DBusGreeterList.cpp plugins/IntegratedLightDM/DBusGreeterList.h → plugins/LightDM/DBusGreeterList.h plugins/LightDM/FullLightDM/CMakeLists.txt+28 plugins/LightDM/FullLightDM/qmldir+3 plugins/IntegratedLightDM/Greeter.cpp → plugins/LightDM/Greeter.cpp+13−2 plugins/IntegratedLightDM/Greeter.h → plugins/LightDM/Greeter.h+5−2 plugins/IntegratedLightDM/GreeterPrivate.h → plugins/LightDM/GreeterPrivate.h plugins/IntegratedLightDM/IntegratedLightDM.qmltypes → plugins/LightDM/IntegratedLightDM.qmltypes plugins/LightDM/IntegratedLightDM/CMakeLists.txt+33 plugins/LightDM/IntegratedLightDM/QLightDM/Greeter+17 plugins/LightDM/IntegratedLightDM/QLightDM/SessionsModel+17 plugins/LightDM/IntegratedLightDM/QLightDM/UsersModel+17 plugins/IntegratedLightDM/liblightdm/CMakeLists.txt → plugins/LightDM/IntegratedLightDM/liblightdm/CMakeLists.txt+4−2 plugins/IntegratedLightDM/liblightdm/Greeter.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.cpp plugins/IntegratedLightDM/liblightdm/Greeter.h → plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.h plugins/IntegratedLightDM/liblightdm/GreeterPrivate.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.cpp+1−2 plugins/IntegratedLightDM/liblightdm/GreeterPrivate.h → plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.h plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.cpp+88 plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.h+72 plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.cpp+36 plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.h+54 plugins/IntegratedLightDM/liblightdm/UsersModel.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModel.cpp+4−1 plugins/IntegratedLightDM/liblightdm/UsersModel.h → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModel.h+2−1 plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp+5−3 plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.h → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.h+2−1 plugins/LightDM/IntegratedLightDM/qmldir+3 plugins/LightDM/SessionsModel.cpp+122 plugins/LightDM/SessionsModel.h+68 plugins/IntegratedLightDM/UsersModel.cpp → plugins/LightDM/UsersModel.cpp plugins/IntegratedLightDM/UsersModel.h → plugins/LightDM/UsersModel.h plugins/IntegratedLightDM/plugin.cpp → plugins/LightDM/plugin.cpp+26−4 plugins/IntegratedLightDM/plugin.h → plugins/LightDM/plugin.h+5−5 plugins/IntegratedLightDM/qmldir → plugins/LightDM/qmldir plugins/Lights/CMakeLists.txt+1 plugins/Lights/Lights.qmltypes−45 plugins/Lights/android-hardware.h−4 plugins/Powerd/Powerd.qmltypes−39 plugins/ScreenGrabber/CMakeLists.txt−13 plugins/ScreenGrabber/qmldir−3 plugins/ScreenGrabber/screengrabber.cpp−115 plugins/ScreenshotDirectory/CMakeLists.txt+9 plugins/ScreenGrabber/ScreenGrabber.qmltypes → plugins/ScreenshotDirectory/ScreenGrabber.qmltypes plugins/ScreenshotDirectory/ScreenshotDirectory.cpp+64 plugins/ScreenshotDirectory/ScreenshotDirectory.h+39 plugins/ScreenGrabber/plugin.cpp → plugins/ScreenshotDirectory/plugin.cpp+5−7 plugins/ScreenGrabber/plugin.h → plugins/ScreenshotDirectory/plugin.h+5−7 plugins/ScreenshotDirectory/qmldir+2 plugins/SessionBroadcast/CMakeLists.txt+5 plugins/SessionBroadcast/SessionBroadcast.cpp+5−1 plugins/SessionBroadcast/SessionBroadcast.h+3 plugins/SessionBroadcast/SessionBroadcast.qmltypes−19 plugins/UInput/UInput.qmltypes−44 plugins/Ubuntu/DownloadDaemonListener/CMakeLists.txt−1 plugins/Ubuntu/DownloadDaemonListener/DownloadDaemonListener.qmltypes−60 plugins/Ubuntu/Gestures/AxisVelocityCalculator.h+1−1 plugins/Ubuntu/Gestures/CMakeLists.txt+9−5 plugins/Ubuntu/Gestures/Damper.h−89 plugins/Ubuntu/Gestures/Direction.h+1 plugins/Ubuntu/Gestures/DirectionalDragArea.cpp−932 plugins/Ubuntu/Gestures/DirectionalDragArea.h−143 plugins/Ubuntu/Gestures/DirectionalDragArea_p.h−169 plugins/Ubuntu/Gestures/FloatingFlickable.cpp−150 plugins/Ubuntu/Gestures/FloatingFlickable.h−86 plugins/Ubuntu/Gestures/Gestures.qmltypes−209 plugins/Ubuntu/Gestures/MouseEventGenerator.cpp+64 plugins/Ubuntu/Gestures/MouseEventGenerator.h+48 plugins/Ubuntu/Gestures/PressedOutsideNotifier.h+1−1 plugins/Ubuntu/Gestures/TouchDispatcher.cpp+1−5 plugins/Ubuntu/Gestures/TouchGate.cpp+2−2 plugins/Ubuntu/Gestures/TouchGestureArea.cpp+16−15 plugins/Ubuntu/Gestures/TouchGestureArea.h+9−10 plugins/Ubuntu/Gestures/plugin.cpp+3−5 plugins/Ubuntu/Payments/Payments.qmltypes−43 plugins/Ubuntu/SystemImage/SystemImage.qmltypes−19 plugins/Unity/Connectivity/Connectivity.qmltypes−19 plugins/Unity/DashCommunicator/DashCommunicator.qmltypes−47 plugins/Unity/Indicators/CMakeLists.txt+4 plugins/Unity/Indicators/Indicators.qmltypes−264 plugins/Unity/Indicators/indicatorsmanager.cpp+1−1 plugins/Unity/InputInfo/InputInfo.qmltypes−71 plugins/Unity/InputInfo/linux/qinputdeviceinfo_linux.cpp+7−2 plugins/Unity/InputInfo/linux/qinputdeviceinfo_linux_p.h−2 plugins/Unity/InputInfo/plugin.h+1−1 plugins/Unity/InputInfo/qdeclarativeinputdevicemodel_p.h+3−3 plugins/Unity/Launcher/CMakeLists.txt+5−1 plugins/Unity/Launcher/Launcher.qmltypes−182 plugins/Unity/Launcher/asadapter.cpp+6−2 plugins/Unity/Launcher/launcheritem.cpp+14−9 plugins/Unity/Launcher/launcheritem.h+3 plugins/Unity/Launcher/launchermodel.cpp+58−26 plugins/Unity/Launcher/launchermodel.h+1−1 plugins/Unity/Platform/Platform.qmltypes−20 plugins/Unity/Session/CMakeLists.txt+4 plugins/Unity/Session/Session.qmltypes−85 plugins/Unity/Session/dbusunitysessionservice.cpp+61−24 plugins/Unity/Session/dbusunitysessionservice.h+7 plugins/Utils/CMakeLists.txt+5−1 plugins/Utils/Utils.qmltypes−175 plugins/Utils/WindowInputMonitor.cpp+8−8 plugins/Utils/WindowInputMonitor.h+8−2 plugins/Utils/deviceconfigparser.cpp+8 plugins/Utils/deviceconfigparser.h+1 plugins/Utils/globalfunctions.cpp+1−4 plugins/Utils/plugin.cpp−8 plugins/Utils/plugin.h−1 plugins/Utils/windowscreenshotprovider.cpp−59 plugins/Utils/windowstatestorage.cpp+2−2 plugins/Utils/windowstatestorage.h+14−4 plugins/WindowManager/CMakeLists.txt+14 plugins/WindowManager/TopLevelSurfaceList.cpp+486 plugins/WindowManager/TopLevelSurfaceList.h+223 tests/plugins/ScreenGrabber/grabber.qml → plugins/WindowManager/WindowManagerPlugin.cpp+9−12 plugins/WindowManager/WindowManagerPlugin.h+32 plugins/WindowManager/qmldir+2 plugins/Wizard/Wizard.qmltypes−33 po/aa.po+287−125 po/am.po+331−139 po/ar.po+299−128 po/ast.po+369−172 po/az.po+295−127 po/be.po+299−128 po/bg.po+287−125 po/bn.po+299−128 po/br.po+353−183 po/bs.po+299−128 po/ca.po+402−182 po/ca@valencia.po+295−127 po/ce.po+287−125 po/ckb.po+287−125 po/co.po+964 po/cs.po+299−128 po/cy.po+299−128 po/da.po+299−128 po/de.po+406−192 po/el.po+368−184 po/en_AU.po+333−132 po/en_GB.po+335−134 po/eo.po+287−125 po/es.po+341−137 po/eu.po+299−128 po/fa.po+335−133 po/fi.po+399−193 po/fo.po+371−205 po/fr.po+352−146 po/ga.po+299−128 po/gd.po+339−136 po/gl.po+399−194 po/gv.po+295−127 po/he.po+299−128 po/hi.po+287−125 po/hr.po+460−190 po/hu.po+333−139 po/hy.po+291−126 po/ia.po+400−192 po/id.po+295−127 po/is.po+295−127 po/it.po+334−133 po/ja.po+295−127 po/km.po+315−150 po/kn.po+287−125 po/ko.po+299−137 po/ku.po+295−127 po/ky.po+287−125 po/lo.po+287−125 po/lt.po+287−125 po/lv.po+299−128 po/ml.po+287−125 po/mr.po+287−125 po/ms.po+410−186 po/my.po+287−125 po/nb.po+333−132 po/ne.po+287−125 po/nl.po+329−139 po/nn.po+287−125 po/oc.po+638−215 po/or.po+287−125 po/pa.po+299−128 po/pl.po+387−169 po/pt.po+405−202 po/pt_BR.po+312−141 po/ro.po+299−128 po/ru.po+383−182 po/shn.po+287−125 po/si.po+287−125 po/sk.po+379−133 po/sl.po+398−183 po/sq.po+325−153 po/sr.po+335−142 po/sv.po+334−132 po/sw.po+299−128 po/ta.po+287−125 po/te.po+287−125 po/th.po+287−125 po/tr.po+299−128 po/ug.po+319−148 po/uk.po+334−133 po/unity8.pot+286−124 po/ur.po+287−125 po/uz.po+287−125 po/vi.po+287−125 po/wo.po+299−128 po/xh.po+287−125 po/zh_CN.po+397−205 po/zh_HK.po+295−127 po/zh_TW.po+329−167 qml/Components/DelayedLockscreen.qml+1 qml/Components/Dialogs.qml+10−13 qml/Components/DragHandle.qml+43−25 qml/Components/FadingLabel.qml+42 qml/Components/FloatingFlickable.qml+59 qml/Components/InputMethod.qml+10−46 qml/Components/ScreenGrabber.qml → qml/Components/ItemGrabber.qml+27−17 qml/Components/Header.qml → qml/Components/ItemSnapshot.qml+26−9 qml/Components/KeyboardShortcutsOverlay.qml+334 qml/Components/KeymapSwitcher.qml+65 qml/Components/LazyImage.qml+3−1 qml/Components/ListItems/graphics/ListItemDividerHorizontal@18.png qml/Components/Lockscreen.qml+8 qml/Components/MediaServices/MediaServices.qml+386 qml/Components/MediaServices/MediaServicesControls.qml+192 qml/Components/MediaServices/MediaServicesHeader.qml+71 qml/Components/MediaServices/VideoPlayer.qml+155 qml/Components/MediaServices/VideoPlayerControls.qml+158 qml/Components/ModeSwitchWarningDialog.qml+1−1 qml/Components/NotificationAudio.qml+11−10 qml/Components/PanelState/PanelState.qml+6−4 qml/Components/PassphraseLockscreen.qml+4 qml/Components/PhysicalKeysMapper.qml+2−22 qml/Components/PinLockscreen.qml+6−1 qml/Components/PinPadButton.qml+17−2 qml/Components/Rating.qml+1 qml/Components/RatingStyle.qml+3 qml/Dash/Previews/PreviewSharing.qml → qml/Components/SharingPicker.qml+2−14 qml/Components/UbuntuShapeForItem.qml+1 qml/Components/VirtualTouchPad.qml+1−1 qml/Components/WindowControlButtons.qml+48−39 qml/Components/graphics/close@20.png qml/Components/graphics/icon_star_empty@20.png qml/Components/graphics/icon_star_full@20.png qml/Components/graphics/icon_star_half@20.png qml/Components/graphics/icon_star_off@20.png qml/Components/graphics/icon_star_on@20.png qml/Components/graphics/non-selected@18.png qml/Components/graphics/window-close.svg+164−14 qml/Components/graphics/window-maximize.svg+164−12 qml/Components/graphics/window-minimize.svg+164−13 qml/Components/graphics/window-window.svg+41 qml/Dash/CardCarousel.qml+1−1 qml/Dash/CardGrid.qml+1−2 qml/Dash/CardHorizontalList.qml+1 qml/Dash/CardTool.qml+31−10 qml/Dash/CardVerticalJournal.qml+1 qml/Dash/Dash.qml+11−11 qml/Dash/DashApplication.qml+15−7 qml/Dash/DashCategoryBase.qml+3−11 qml/Dash/DashPageHeader.qml+31−36 qml/Dash/DashRenderer.qml+6 qml/Dash/Filters/FilterExpandableWidget.qml+96 qml/Dash/Filters/FilterOptionSelector.qml+4 qml/Dash/Filters/FilterWidget.qml+3 qml/Dash/Filters/FilterWidgetFactory.qml+10−1 qml/Dash/GenericScopeView.qml+31−11 qml/Dash/PageHeaderExtraPanel.qml+34−10 qml/Dash/Previews/Preview.qml+21−1 qml/Dash/Previews/PreviewActionCombo.qml+1−1 qml/Dash/Previews/PreviewActions.qml+9−8 qml/Dash/Previews/PreviewIconActions.qml+15 qml/Dash/Previews/PreviewImageGallery.qml+3 qml/Dash/Previews/PreviewInlineVideo.qml+65 qml/Dash/Previews/PreviewMediaToolbar.qml+25−5 qml/Dash/Previews/PreviewPayments.qml+1−1 qml/Dash/Previews/PreviewRatingEdit.qml+4−1 qml/Dash/Previews/PreviewRatingInput.qml+41−42 qml/Dash/Previews/PreviewWidget.qml+3 qml/Dash/Previews/PreviewWidgetFactory.qml+11−1 qml/Dash/Previews/PreviewZoomableImage.qml+14−8 qml/Dash/ScopesList.qml+2−13 qml/Dash/graphics/dash_divider_top_darkgrad@27.png qml/Dash/graphics/dash_divider_top_lightgrad@27.png qml/Dash/graphics/header_handlearrow2@27.png qml/Dash/graphics/header_handlearrow@27.png qml/Dash/graphics/icon_clear@20.png qml/Dash/graphics/icon_search_active@20.png qml/Dash/graphics/icon_search_inactive@20.png qml/Dash/graphics/navigation_shadow@18.png qml/Dash/graphics/navigation_shadow_light@18.png qml/Dash/graphics/overview_hint@27.png qml/Dash/graphics/pagination_dot_off@30.png qml/Dash/graphics/pagination_dot_on@30.png qml/Dash/graphics/paper.png qml/Dash/graphics/pixel.png qml/Dash/graphics/play_button@18.png qml/Dash/graphics/play_button_active@18.png qml/Dash/graphics/play_button_active_big@20.png qml/Dash/graphics/play_button_big@20.png qml/Dash/graphics/tabbarchevron@27.png qml/Dash/graphics/tablet/icon_close_preview@20.png qml/Dash/graphics/tooltip_arrow@27.png qml/DisabledScreenNotice.qml+11−4 qml/Greeter/CoverPage.qml+23−1 qml/Components/WindowScreenshot.qml → qml/Greeter/FullLightDMImpl.qml+7−14 qml/Greeter/Greeter.qml+189−72 qml/Greeter/GreeterPrompt.qml+197 qml/Greeter/IntegratedLightDMImpl.qml+1−1 qml/Greeter/LightDM.qml → qml/Greeter/LightDMService.qml+14−3 qml/Greeter/LoginList.qml+77−81 qml/Greeter/NarrowView.qml+20−3 qml/Greeter/WideView.qml+11−4 qml/Greeter/graphics/dot_empty.png qml/Greeter/graphics/dot_filled.png qml/Greeter/graphics/dot_pointer.png qml/Greeter/graphics/icon_arrow.png qml/Greeter/graphics/infographic_circle_back.png qml/Greeter/qmldir+1 qml/Launcher/Launcher.qml+17−25 qml/Launcher/LauncherDelegate.qml+13−19 qml/Launcher/LauncherPanel.qml+31−14 qml/Launcher/graphics/divider-line.png qml/Launcher/graphics/focused_app_arrow@30.png qml/Launcher/graphics/home@18.png qml/Launcher/graphics/quicklist_tooltip@30.png qml/Notifications/Notification.qml+160−119 qml/Notifications/NotificationButton.qml+72 qml/Notifications/NotificationMenuItemFactory.qml+8−10 qml/Notifications/Notifications.qml+23−14 qml/Notifications/OptionToggle.qml+12−10 qml/Notifications/ShapedIcon.qml+1 qml/Notifications/SwipeToAct.qml+16−20 qml/Notifications/grip-large.svg−150 qml/OrientedShell.qml+34−19 qml/Panel/Indicators/MenuItemFactory.qml+5−4 qml/Panel/Indicators/MessageMenuItemFactory.qml+1−5 qml/Panel/Indicators/client/IndicatorsClient.qml+8−2 qml/Panel/Indicators/client/IndicatorsList.qml+7 qml/Panel/IndicatorsMenu.qml+40−24 qml/Panel/Panel.qml+29−24 qml/Panel/graphics/rectangular_dropshadow@30.png qml/Rotation/HalfLoopRotationAnimation.qml+2−1 qml/Rotation/ImmediateRotationAction.qml+11−22 qml/Rotation/NinetyRotationAnimation.qml+14−16 qml/Rotation/RotationStates.qml+25−5 qml/Rotation/UpdateShellTransformations.qml+42 qml/Shell.qml+164−136 qml/Stages/AbstractStage.qml+12−4 qml/Stages/Animations/BaseSessionAnimation.qml−96 qml/Stages/Animations/SwipeFromBottomAnimation.qml−53 qml/Stages/ApplicationWindow.qml+156−74 qml/Stages/DecoratedWindow.qml+57−26 qml/Stages/DesktopSpread.qml+25−19 qml/Stages/DesktopSpreadDelegate.qml+5−4 qml/Stages/DesktopStage.qml+299−150 qml/Stages/OrientationChangeAnimation.qml+30−6 qml/Stages/PhoneStage.qml+158−95 qml/Stages/PromptSurfaceAnimations.qml+81 qml/Stages/ShimStage.qml → qml/Stages/ResizeGrip.qml+22−20 qml/Stages/SessionContainer.qml−180 qml/Stages/SideStage.qml+1−2 qml/Stages/Splash.qml+6−17 qml/Stages/SpreadDelegate.qml+12−16 qml/Stages/StagedFullscreenPolicy.qml+12−14 qml/Stages/SurfaceContainer.qml+45−57 qml/Stages/TabletSideStageTouchGesture.qml+3 qml/Stages/TabletStage.qml+317−245 qml/Stages/TopLevelSurfaceRepeater.qml+52 qml/Stages/TransformedSpreadDelegate.qml+4−4 qml/Stages/TransformedTabletSpreadDelegate.qml+29−23 qml/Stages/WindowControlsOverlay.qml+219 qml/Stages/WindowDecoration.qml+42−15 qml/Stages/WindowResizeArea.qml+40−20 qml/Stages/WindowedFullscreenPolicy.qml+5−7 qml/Stages/graphics/PageHeaderBaseDividerBottom@18.png qml/Stages/graphics/PageHeaderBaseDividerLight@18.png qml/Stages/graphics/arrows-centre.png qml/Stages/graphics/arrows.png qml/Stages/graphics/dropshadow2gu@30.png qml/Stages/graphics/sidestage_handle@20.png qml/Tutorial/InactivityTimer.qml+26−10 qml/Tutorial/Tutorial.qml+7−6 qml/Tutorial/TutorialBottom.qml−124 qml/Tutorial/TutorialContent.qml+51−134 qml/Tutorial/TutorialLeft.qml+2−2 qml/Tutorial/TutorialLeftLong.qml+3−1 qml/Tutorial/TutorialPage.qml+2−2 qml/Tutorial/TutorialRight.qml+2−2 qml/Tutorial/TutorialTop.qml+2−3 qml/Tutorial/graphics/background1.png qml/Tutorial/graphics/background2.png qml/Wizard/Pages/10-welcome.qml+17−4 qml/Wizard/Pages/50-timezone.qml+5−2 qml/Wizard/Pages/data/Desktop_header_bkg.png qml/Wizard/Pages/data/Desktop_splash_screen_bkg.png qml/Wizard/Pages/data/Phone_header_bkg.png qml/Wizard/Pages/data/Phone_splash_screen_bkg.png qml/Wizard/Pages/data/Tick@30.png qml/Wizard/Pages/data/timezonemap/map.png qml/Wizard/Pages/data/timezonemap/pin.png qml/Wizard/Pages/data/timezonemap/timezone_-1.png qml/Wizard/Pages/data/timezonemap/timezone_-10.png qml/Wizard/Pages/data/timezonemap/timezone_-11.png qml/Wizard/Pages/data/timezonemap/timezone_-2.png qml/Wizard/Pages/data/timezonemap/timezone_-3.5.png qml/Wizard/Pages/data/timezonemap/timezone_-3.png qml/Wizard/Pages/data/timezonemap/timezone_-4.5.png qml/Wizard/Pages/data/timezonemap/timezone_-4.png qml/Wizard/Pages/data/timezonemap/timezone_-5.png qml/Wizard/Pages/data/timezonemap/timezone_-6.png qml/Wizard/Pages/data/timezonemap/timezone_-7.png qml/Wizard/Pages/data/timezonemap/timezone_-8.png qml/Wizard/Pages/data/timezonemap/timezone_-9.5.png qml/Wizard/Pages/data/timezonemap/timezone_-9.png qml/Wizard/Pages/data/timezonemap/timezone_0.png qml/Wizard/Pages/data/timezonemap/timezone_1.png qml/Wizard/Pages/data/timezonemap/timezone_10.5.png qml/Wizard/Pages/data/timezonemap/timezone_10.png qml/Wizard/Pages/data/timezonemap/timezone_11.png qml/Wizard/Pages/data/timezonemap/timezone_12.75.png qml/Wizard/Pages/data/timezonemap/timezone_12.png qml/Wizard/Pages/data/timezonemap/timezone_13.png qml/Wizard/Pages/data/timezonemap/timezone_2.png qml/Wizard/Pages/data/timezonemap/timezone_3.5.png qml/Wizard/Pages/data/timezonemap/timezone_3.png qml/Wizard/Pages/data/timezonemap/timezone_4.5.png qml/Wizard/Pages/data/timezonemap/timezone_4.png qml/Wizard/Pages/data/timezonemap/timezone_5.5.png qml/Wizard/Pages/data/timezonemap/timezone_5.75.png qml/Wizard/Pages/data/timezonemap/timezone_5.png qml/Wizard/Pages/data/timezonemap/timezone_6.5.png qml/Wizard/Pages/data/timezonemap/timezone_6.png qml/Wizard/Pages/data/timezonemap/timezone_7.png qml/Wizard/Pages/data/timezonemap/timezone_8.5.png qml/Wizard/Pages/data/timezonemap/timezone_8.png qml/Wizard/Pages/data/timezonemap/timezone_9.5.png qml/Wizard/Pages/data/timezonemap/timezone_9.png qml/Wizard/Pages/passcode-desktop.qml+27−10 qml/Wizard/PasswordMeter.qml+3−1 qml/Wizard/Wizard.qml+6−2 qml/graphics/dropshadow_left@20.png qml/graphics/dropshadow_right@20.png src/CMakeLists.txt+2−4 src/Dash/CMakeLists.txt+1 src/Dash/main.cpp+34−21 src/SecondaryWindow.cpp+9 src/ShellApplication.cpp+17−1 src/ShellView.cpp+6−2 tools/unix-signal-handler.cpp → src/UnixSignalHandler.cpp+4−6 tools/unix-signal-handler.h → src/UnixSignalHandler.h src/main.cpp+13 src/qmldebuggerutils.h+33 tests/CMakeLists.txt+7−2 tests/autopilot/unity8/dash.py+2−3 tests/autopilot/unity8/fixture_setup.py+1−1 tests/autopilot/unity8/greeter/tests/test_args.py−5 tests/autopilot/unity8/settings_wizard/__init__.py−555 tests/autopilot/unity8/settings_wizard/fixture_setup.py−58 tests/autopilot/unity8/settings_wizard/ofono_helper.py−116 tests/autopilot/unity8/settings_wizard/tests/__init__.py tests/autopilot/unity8/settings_wizard/tests/test_settings_wizard.py−99 tests/autopilot/unity8/shell/tests/__init__.py+1−1 tests/data/unity/backgrounds/blue.png tests/data/unity/backgrounds/red.png tests/graphics/applicationIcons/browser@18.png tests/graphics/applicationIcons/calendar@18.png tests/graphics/applicationIcons/camera@18.png tests/graphics/applicationIcons/contacts-app@18.png tests/graphics/applicationIcons/dash.png tests/graphics/applicationIcons/dialer-app@18.png tests/graphics/applicationIcons/evernote@18.png tests/graphics/applicationIcons/facebook@18.png tests/graphics/applicationIcons/gallery@18.png tests/graphics/applicationIcons/gmail@18.png tests/graphics/applicationIcons/libreoffice@18.png tests/graphics/applicationIcons/map@18.png tests/graphics/applicationIcons/messages-app@18.png tests/graphics/applicationIcons/notepad@18.png tests/graphics/applicationIcons/pinterest@18.png tests/graphics/applicationIcons/soundcloud@18.png tests/graphics/applicationIcons/system-settings@18.png tests/graphics/applicationIcons/twitter@18.png tests/graphics/applicationIcons/weather@18.png tests/graphics/applicationIcons/wikipedia@18.png tests/graphics/applicationIcons/youtube@18.png tests/graphics/avatars/amanda@12.png tests/graphics/avatars/anna_olsson@12.png tests/graphics/avatars/funky@12.png tests/graphics/clock@18.png tests/libs/CMakeLists.txt−1 tests/libs/UbuntuGestures/CMakeLists.txt−16 tests/libs/UbuntuGestures/tst_TouchRegistry.cpp−974 tests/mocks/AccountsService/AccountsService.cpp+24 tests/mocks/AccountsService/AccountsService.h+16 tests/mocks/AccountsService/AccountsService.qmltypes−41 tests/mocks/Biometryd/CMakeLists.txt+14 libs/UbuntuGestures/TouchOwnershipEvent.cpp → tests/mocks/Biometryd/MockBiometryd.cpp+20−12 plugins/ScreenGrabber/screengrabber.h → tests/mocks/Biometryd/MockBiometryd.h+21−20 tests/mocks/Biometryd/MockDevice.cpp+29 tests/mocks/Biometryd/MockDevice.h+40 tests/mocks/Biometryd/MockIdentifier.cpp+28 tests/mocks/Biometryd/MockIdentifier.h+36 libs/UbuntuGestures/UbuntuGesturesGlobal.h → tests/mocks/Biometryd/MockObserver.cpp+6−7 tests/plugins/Ubuntu/Gestures/tst_Damper.cpp → tests/mocks/Biometryd/MockObserver.h+15−18 tests/mocks/Biometryd/MockOperation.cpp+56 tests/mocks/Unity/Application/SessionManager.h → tests/mocks/Biometryd/MockOperation.h+18−14 libs/UbuntuGestures/UnownedTouchEvent.cpp → tests/mocks/Biometryd/plugin.cpp+16−14 tests/mocks/Biometryd/plugin.h+31 tests/mocks/Biometryd/qmldir+3 tests/mocks/CMakeLists.txt+2−1 tests/mocks/Cursor/qmldir+1−1 tests/mocks/GSettings.1.0/GSettings.qmltypes−42 tests/mocks/GSettings.1.0/fake_gsettings.cpp+127−38 tests/mocks/GSettings.1.0/fake_gsettings.h+51−26 tests/mocks/IntegratedLightDM/qmldir−3 tests/mocks/LightDM/CMakeLists.txt+1 tests/mocks/IntegratedLightDM/IntegratedLightDM.qmltypes → tests/mocks/LightDM/IntegratedLightDM.qmltypes tests/mocks/IntegratedLightDM/CMakeLists.txt → tests/mocks/LightDM/IntegratedLightDM/CMakeLists.txt+9−7 tests/mocks/IntegratedLightDM/MockGreeter.cpp → tests/mocks/LightDM/IntegratedLightDM/MockGreeter.cpp+16 tests/mocks/IntegratedLightDM/MockGreeter.h → tests/mocks/LightDM/IntegratedLightDM/MockGreeter.h+5 tests/mocks/LightDM/IntegratedLightDM/MockSessionsModel.cpp+37 plugins/Utils/windowscreenshotprovider.h → tests/mocks/LightDM/IntegratedLightDM/MockSessionsModel.h+12−9 tests/mocks/IntegratedLightDM/MockUsersModel.cpp → tests/mocks/LightDM/IntegratedLightDM/MockUsersModel.cpp tests/mocks/IntegratedLightDM/MockUsersModel.h → tests/mocks/LightDM/IntegratedLightDM/MockUsersModel.h tests/mocks/IntegratedLightDM/QLightDM/Greeter → tests/mocks/LightDM/IntegratedLightDM/QLightDM/Greeter plugins/Ubuntu/Gestures/Damper.cpp → tests/mocks/LightDM/IntegratedLightDM/QLightDM/SessionsModel+1−8 tests/mocks/IntegratedLightDM/QLightDM/UsersModel → tests/mocks/LightDM/IntegratedLightDM/QLightDM/UsersModel tests/mocks/IntegratedLightDM/liblightdm/CMakeLists.txt → tests/mocks/LightDM/IntegratedLightDM/liblightdm/CMakeLists.txt+4−2 tests/mocks/IntegratedLightDM/liblightdm/Greeter.cpp → tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.cpp+9−2 tests/mocks/IntegratedLightDM/liblightdm/Greeter.h → tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.h+1 tests/mocks/IntegratedLightDM/liblightdm/GreeterPrivate.cpp → tests/mocks/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.cpp tests/mocks/IntegratedLightDM/liblightdm/GreeterPrivate.h → tests/mocks/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.h+1−1 tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModel.cpp+99 tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModel.h+72 tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.cpp+73 tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.h+59 tests/mocks/IntegratedLightDM/liblightdm/UsersModel.cpp → tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModel.cpp+4−1 tests/mocks/IntegratedLightDM/liblightdm/UsersModel.h → tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModel.h+2−1 tests/mocks/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp → tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp+29−23 tests/mocks/IntegratedLightDM/liblightdm/UsersModelPrivate.h → tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.h+2−1 tests/mocks/IntegratedLightDM/plugin.cpp → tests/mocks/LightDM/IntegratedLightDM/plugin.cpp+15−4 tests/mocks/IntegratedLightDM/plugin.h → tests/mocks/LightDM/IntegratedLightDM/plugin.h+1−1 tests/mocks/LightDM/IntegratedLightDM/qmldir+2 tests/mocks/Lights/Lights.qmltypes−45 tests/mocks/MeeGo/QOfono/QOfono.qmltypes−30 tests/mocks/Powerd/Powerd.qmltypes−39 tests/mocks/QMenuModel/QMenuModel.qmltypes−111 tests/mocks/QtMultimedia/CMakeLists.txt+8−2 tests/mocks/QtMultimedia/QtMultimedia.qmltypes−62 tests/mocks/QtMultimedia/VideoSurface.qml+111 tests/mocks/QtMultimedia/audio.cpp−119 tests/mocks/QtMultimedia/audio.h−92 tests/mocks/QtMultimedia/mediaplayer.cpp+318 tests/mocks/QtMultimedia/mediaplayer.h+223 tests/mocks/QtMultimedia/plugin.cpp+7−3 tests/mocks/QtMultimedia/videooutput.cpp+127 tests/mocks/QtMultimedia/videooutput.h+52 tests/mocks/Ubuntu/DownloadDaemonListener/DownloadDaemonListener.qmltypes−60 tests/mocks/Ubuntu/Payments/MockPayments.cpp+1 tests/mocks/Ubuntu/Payments/Payments.qmltypes−44 tests/mocks/Ubuntu/SystemImage/SystemImage.qmltypes−20 tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/LanguagePlugin.qmltypes−10 tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/MockLanguagePlugin.qml+3−2 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/SecurityPrivacy.qmltypes−39 tests/mocks/Ubuntu/SystemSettings/TimeDate/CMakeLists.txt+1−1 tests/mocks/Ubuntu/SystemSettings/TimeDate/MockTimeDate.qml+15−3 tests/mocks/Ubuntu/SystemSettings/TimeDate/qmldir+1−1 tests/mocks/Ubuntu/Telephony/Telephony.qmltypes−58 tests/mocks/Ubuntu/Thumbnailer/Thumbnailer.qmltypes−17 tests/mocks/Unity/Application/Application.qmltypes−517 tests/mocks/Unity/Application/ApplicationInfo.cpp+191−108 tests/mocks/Unity/Application/ApplicationInfo.h+43−25 tests/mocks/Unity/Application/ApplicationManager.cpp+127−75 tests/mocks/Unity/Application/ApplicationManager.h+12−14 tests/mocks/Unity/Application/ApplicationScreenshotProvider.cpp−79 tests/mocks/Unity/Application/ApplicationScreenshotProvider.h−34 tests/mocks/Unity/Application/ApplicationTestInterface.cpp−117 tests/mocks/Unity/Application/ApplicationTestInterface.h−45 tests/mocks/Unity/Application/CMakeLists.txt+3−6 tests/mocks/Unity/Application/MirSurface.cpp+192−30 tests/mocks/Unity/Application/MirSurface.h+59−12 tests/mocks/Unity/Application/MirSurfaceItem.cpp+30−14 tests/mocks/Unity/Application/MirSurfaceItem.h+1−1 tests/mocks/Unity/Application/MirSurfaceListModel.cpp+159 tests/mocks/Unity/Application/MirSurfaceListModel.h+62 tests/mocks/Unity/Application/ObjectListModel.h+2 tests/mocks/Unity/Application/Session.cpp−209 tests/mocks/Unity/Application/Session.h−104 tests/mocks/Unity/Application/SessionManager.cpp−55 tests/mocks/Unity/Application/SurfaceManager.cpp+16−9 tests/mocks/Unity/Application/SurfaceManager.h+5−2 tests/mocks/Unity/Application/UbuntuKeyboardInfo.cpp−60 tests/mocks/Unity/Application/UbuntuKeyboardInfo.h−66 tests/mocks/Unity/Application/VirtualKeyboard.cpp+22−4 tests/mocks/Unity/Application/VirtualKeyboard.h+5−2 tests/mocks/Unity/Application/plugin.cpp+28−41 tests/mocks/Unity/Application/resources/VirtualKeyboard.qml+1−6 tests/mocks/Unity/Application/resources/screenshots/browser@12.png tests/mocks/Unity/Application/resources/screenshots/camera@12.png tests/mocks/Unity/Application/resources/screenshots/dialer@12.png tests/mocks/Unity/Application/resources/screenshots/facebook@12.png tests/mocks/Unity/Application/resources/screenshots/gallery@12.png tests/mocks/Unity/Application/resources/screenshots/libreoffice@12.png tests/mocks/Unity/Application/resources/screenshots/map@12.png tests/mocks/Unity/Application/resources/screenshots/music@12.png tests/mocks/Unity/Application/resources/screenshots/twitter@12.png tests/mocks/Unity/Application/resources/screenshots/unity8-dash@12.png tests/mocks/Unity/Application/resources/screenshots/vkb_portrait.png tests/mocks/Unity/Application/resources/vkb_portrait.png tests/mocks/Unity/CMakeLists.txt+3−1 tests/mocks/Unity/Connectivity/Connectivity.qmltypes−20 tests/mocks/Unity/DashCommunicator/DashCommunicator.qmltypes−46 tests/mocks/Unity/Indicators/Indicators.qmltypes−232 tests/mocks/Unity/InputInfo/plugin.h+1−1 tests/mocks/Unity/InputInfo/qinputdeviceinfo_mock.cpp+1−1 tests/mocks/Unity/Launcher/CMakeLists.txt+1−1 tests/mocks/Unity/Launcher/Launcher.qmltypes−187 tests/mocks/Unity/Launcher/MockLauncherItem.cpp+14 tests/mocks/Unity/Launcher/MockLauncherItem.h+3 tests/mocks/Unity/Launcher/MockLauncherModel.cpp+8 tests/mocks/Unity/Launcher/MockLauncherModel.h+1−1 tests/mocks/Unity/Notifications/MockNotificationModel.cpp+6−11 tests/mocks/Unity/Notifications/Notifications.qmltypes−149 tests/mocks/Unity/Screens/plugin.h+1−1 tests/mocks/Unity/Unity.qmltypes−469 tests/mocks/Unity/fake_categories.cpp+4−1 tests/mocks/Unity/fake_expandablefilterwidget.cpp+53 tests/mocks/Unity/fake_expandablefilterwidget.h+48 tests/mocks/Unity/fake_filters.cpp+19−8 tests/mocks/Unity/fake_filters.h+4−4 tests/mocks/Unity/fake_optionselectorfilter.cpp+5 tests/mocks/Unity/fake_optionselectorfilter.h+2 tests/mocks/Unity/fake_optionselectoroptions.cpp+13 tests/mocks/Unity/fake_optionselectoroptions.h+2 tests/mocks/Unity/fake_previewmodel.cpp+1−1 tests/mocks/Unity/fake_resultsmodel.cpp+2 tests/mocks/Unity/fake_scope.cpp+18−4 tests/mocks/Unity/fake_scope.h+2−1 tests/mocks/Unity/fake_scopes.cpp+12 tests/mocks/Unity/fake_scopesoverview.cpp+1−1 tests/mocks/Utils/CMakeLists.txt+9−2 tests/mocks/Utils/Utils.qmltypes−178 tests/mocks/Utils/plugin.cpp+1−9 tests/mocks/Utils/plugin.h+1−2 tests/mocks/Utils/windowstatestorage.cpp+3−2 tests/mocks/Utils/windowstatestorage.h+18−4 tests/mocks/Wizard/Wizard.qmltypes−37 tests/mocks/libusermetrics/UserMetrics.cpp+1−1 tests/mocks/libusermetrics/libusermetricsoutput/ColorTheme.h−1 tests/mocks/libusermetrics/libusermetricsoutput/UserMetrics.h−1 tests/plugins/AccountsService/CMakeLists.txt+5−5 tests/plugins/CMakeLists.txt+3−3 tests/plugins/Cursor/CMakeLists.txt+8 tests/mocks/Unity/Application/SessionModel.h → tests/plugins/Cursor/TextEntry.qml+18−19 tests/plugins/Cursor/tst_Cursor.qml+144 tests/plugins/Dash/CMakeLists.txt+4 tests/plugins/Dash/cardcreator/1.res+19−55 tests/plugins/Dash/cardcreator/1.res.cardcreator+14−51 tests/plugins/Dash/cardcreator/1.tst+1 tests/plugins/Dash/cardcreator/10.res+5−14 tests/plugins/Dash/cardcreator/10.res.cardcreator+1−11 tests/plugins/Dash/cardcreator/10.tst+1 tests/plugins/Dash/cardcreator/11.res+21−57 tests/plugins/Dash/cardcreator/11.res.cardcreator+16−53 tests/plugins/Dash/cardcreator/11.tst+1 tests/plugins/Dash/cardcreator/12.res+110 tests/plugins/Dash/cardcreator/12.res.cardcreator+108 tests/plugins/Dash/cardcreator/12.tst+4 tests/plugins/Dash/cardcreator/2.res+5−14 tests/plugins/Dash/cardcreator/2.res.cardcreator+1−11 tests/plugins/Dash/cardcreator/2.tst+1 tests/plugins/Dash/cardcreator/3.res+17−62 tests/plugins/Dash/cardcreator/3.res.cardcreator+13−59 tests/plugins/Dash/cardcreator/3.tst+1 tests/plugins/Dash/cardcreator/4.res+6−7 tests/plugins/Dash/cardcreator/4.res.cardcreator+2−4 tests/plugins/Dash/cardcreator/4.tst+1 tests/plugins/Dash/cardcreator/5.res+12−63 tests/plugins/Dash/cardcreator/5.res.cardcreator+8−60 tests/plugins/Dash/cardcreator/5.tst+1 tests/plugins/Dash/cardcreator/6.res+4−5 tests/plugins/Dash/cardcreator/6.res.cardcreator+2−4 tests/plugins/Dash/cardcreator/6.tst+1 tests/plugins/Dash/cardcreator/7.res+5−14 tests/plugins/Dash/cardcreator/7.res.cardcreator+1−11 tests/plugins/Dash/cardcreator/7.tst+1 tests/plugins/Dash/cardcreator/8.res+6−7 tests/plugins/Dash/cardcreator/8.res.cardcreator+2−4 tests/plugins/Dash/cardcreator/8.tst+1 tests/plugins/Dash/cardcreator/9.res+6−7 tests/plugins/Dash/cardcreator/9.res.cardcreator+2−4 tests/plugins/Dash/cardcreator/9.tst+1 tests/plugins/Dash/cardcreatortest.cpp+9−6 tests/plugins/Dash/cardcreatortest.qml+4−4 tests/plugins/Dash/horizontaljournaltest.cpp+1−4 tests/plugins/Dash/listviewwithpageheadersectionexternalmodeltest.cpp+3−6 tests/plugins/Dash/listviewwithpageheadersectiontest.cpp+24−6 tests/plugins/Dash/listviewwithpageheadertest.cpp+21−4 tests/plugins/Dash/listviewwithpageheadertestsection.qml+15−3 tests/plugins/Dash/listviewwithpageheadertestsectionexternalmodel.qml+2−1 tests/plugins/Dash/organicgridtest.cpp+1−4 tests/plugins/Dash/tst_ListViewWithPageHeaderQML.qml+4−2 tests/plugins/Dash/tst_ScopeStyle.qml+1−1 tests/plugins/Dash/verticaljournaltest.cpp+1−4 tests/plugins/LightDM/CMakeLists.txt+1 tests/plugins/IntegratedLightDM/CMakeLists.txt → tests/plugins/LightDM/IntegratedLightDM/CMakeLists.txt+37−13 tests/plugins/IntegratedLightDM/dbus.cpp → tests/plugins/LightDM/IntegratedLightDM/dbus.cpp+3−5 tests/plugins/IntegratedLightDM/greeter.qml → tests/plugins/LightDM/IntegratedLightDM/greeter.qml+1−1 tests/plugins/IntegratedLightDM/integrated.cpp → tests/plugins/LightDM/IntegratedLightDM/integrated.cpp tests/plugins/IntegratedLightDM/pam.cpp → tests/plugins/LightDM/IntegratedLightDM/pam.cpp+3−1 tests/plugins/LightDM/IntegratedLightDM/sessionsmodel.cpp+96 tests/plugins/IntegratedLightDM/usersmodel.cpp → tests/plugins/LightDM/IntegratedLightDM/usersmodel.cpp tests/plugins/ScreenGrabber/CMakeLists.txt−14 tests/plugins/ScreenGrabber/ScreenGrabberTest.cpp−77 tests/plugins/Ubuntu/Gestures/CMakeLists.txt+6−5 tests/plugins/Ubuntu/Gestures/DownwardsLauncher.qml−72 tests/plugins/Ubuntu/Gestures/GestureTest.cpp+2−2 tests/plugins/Ubuntu/Gestures/LeftwardsLauncher.qml−76 tests/plugins/Ubuntu/Gestures/RightwardsLauncher.qml−76 tests/plugins/Ubuntu/Gestures/UpwardsLauncher.qml−76 tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp−1250 tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.qml−76 tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.cpp+25−18 tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.qml+1 tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+1−1 tests/plugins/Unity/Indicators/MenuContentActivatorTest.cpp+1 tests/plugins/Unity/Launcher/CMakeLists.txt+3−1 tests/plugins/Unity/Launcher/launchermodeltest.cpp+49−6 tests/plugins/Unity/Session/CMakeLists.txt+31−1 tests/plugins/Unity/Session/LightDMServer.cpp+29 tests/plugins/Unity/Session/LightDMServer.h+38 tests/plugins/Unity/Session/LogindServer.cpp+33 tests/plugins/Unity/Session/LogindServer.h+43 tests/plugins/Unity/Session/interfaces.xml+17 tests/plugins/Unity/Session/server.cpp+50 tests/plugins/Unity/Session/sessionbackendtest.cpp+15−16 tests/plugins/Utils/WindowInputMonitorTest.cpp+52−11 tests/qmltests/CMakeLists.txt+4−2 tests/qmltests/Components/CMakeLists.txt+10−3 tests/qmltests/Components/tst_Dialogs.qml+4−2 tests/qmltests/Components/tst_DragHandle.cpp+28−24 tests/qmltests/Components/tst_DragHandle.qml+22−4 tests/qmltests/Components/tst_DragHandle/BottomEdgeShowable.qml+108 tests/qmltests/Components/tst_DragHandle/HorizontalShowable.qml → tests/qmltests/Components/tst_DragHandle/LeftEdgeShowable.qml tests/qmltests/Components/tst_DragHandle/RightEdgeShowable.qml+108 tests/qmltests/Components/tst_DragHandle/VerticalShowable.qml → tests/qmltests/Components/tst_DragHandle/TopEdgeShowable.qml+7−7 tests/qmltests/Components/tst_EdgeDragEvaluator.cpp+1−1 tests/qmltests/Components/tst_LazyImage/portrait.png tests/qmltests/Components/tst_LazyImage/square.png tests/qmltests/Components/tst_LazyImage/wide.png tests/qmltests/Components/tst_Lockscreen.qml+20−1 tests/qmltests/Components/tst_MediaServices.qml+230 tests/qmltests/Components/tst_PhysicalKeysMapper.qml+12−21 tests/qmltests/Dash/Previews/tst_PreviewSharing.qml → tests/qmltests/Components/tst_SharingPicker.qml+8−8 tests/qmltests/Dash/CardHelpers.js+9−7 tests/qmltests/Dash/Filters/tst_FilterExpandableWidget.qml+99 tests/qmltests/Dash/Filters/tst_FilterWidgetFactory.qml+2−1 tests/qmltests/Dash/Previews/tst_Preview.qml−1 tests/qmltests/Dash/Previews/tst_PreviewActions.qml+100−17 tests/qmltests/Dash/Previews/tst_PreviewExpandable.qml+23−4 tests/qmltests/Dash/Previews/tst_PreviewIconActions.qml+14−4 tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+3−2 tests/qmltests/Dash/Previews/tst_PreviewInlineVideo.qml+114 tests/qmltests/Dash/Previews/tst_PreviewMediaToolbar.qml+3−3 tests/qmltests/Dash/Previews/tst_PreviewRatingDisplayCreationRanges.qml+51−15 tests/qmltests/Dash/Previews/tst_PreviewRatingEdit.qml+8−1 tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml+18−6 tests/qmltests/Dash/Previews/tst_PreviewWidgetFactory.qml+18−17 tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+17 tests/qmltests/Dash/artwork/avatar@12.png tests/qmltests/Dash/artwork/background.png tests/qmltests/Dash/artwork/checkers.png tests/qmltests/Dash/artwork/emblem.png tests/qmltests/Dash/artwork/music-player-design.png tests/qmltests/Dash/tst_Card.qml+61−14 tests/qmltests/Dash/tst_CardTool.qml+1−1 tests/qmltests/Dash/tst_Dash.qml+150−125 tests/qmltests/Dash/tst_DashContent.qml+70−5 tests/qmltests/Dash/tst_DashPageHeader.qml−24 tests/qmltests/Dash/tst_DashShell.qml+13−3 tests/qmltests/Dash/tst_GenericScopeView.qml+37−2 tests/qmltests/Dash/tst_PreviewView.qml+3−3 tests/qmltests/Greeter/TestView.qml+10−3 tests/qmltests/Greeter/tst_Greeter.qml+205−26 tests/qmltests/Greeter/tst_Infographics.qml+1−1 tests/qmltests/Greeter/tst_NarrowView.qml+24−3 tests/qmltests/Greeter/tst_WideView.qml+108−35 tests/qmltests/Launcher/tst_Launcher.qml+81−15 tests/qmltests/Notifications/tst_Notifications.qml+139−54 tests/qmltests/Notifications/tst_OptionToggle.qml+10−1 tests/qmltests/Notifications/tst_SwipeToAct.qml+11−1 tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+15−6 tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+1 tests/qmltests/Panel/tst_ActiveCallHint.qml+3−2 tests/qmltests/Panel/tst_IndicatorsMenu.qml+29−1 tests/qmltests/Panel/tst_Panel.qml+2−2 tests/qmltests/Stages/ApplicationCheckBox.qml+133−58 tests/qmltests/Stages/RecursingChildSessionControl.qml−145 tests/qmltests/Stages/SurfaceManagerControls.qml+7−8 tests/qmltests/Stages/tst_ApplicationWindow.qml+181−73 tests/qmltests/Stages/tst_DesktopStage.qml+446−166 tests/qmltests/Stages/tst_PhoneStage.qml+272−82 tests/qmltests/Stages/tst_SessionContainer.qml−331 tests/qmltests/Stages/tst_SpreadDelegate.qml+3−2 tests/qmltests/Stages/tst_SurfaceContainer.qml+114−45 tests/qmltests/Stages/tst_TabletStage.qml+459−105 tests/qmltests/Stages/tst_WindowResizeArea.qml+52−39 tests/qmltests/Tutorial/tst_Tutorial.qml+181−219 tests/qmltests/UnityLogo.png tests/qmltests/Wizard/tst_Wizard.qml+8−15 tests/qmltests/tst_OrientedShell.qml+176−119 tests/qmltests/tst_Shell.qml+361−202 tests/qmltests/tst_ShellWithPin.qml+18−20 tests/qmltests/utils/Unity/Test/tst_UnityTest.qml+31 tests/uqmlscene/main.cpp−1 tests/utils/modules/Unity/Test/CMakeLists.txt+9−3 tests/utils/modules/Unity/Test/Test.qmltypes−60 tests/utils/modules/Unity/Test/UnityTestCase.qml+135−21 tests/utils/modules/Unity/Test/testutil.cpp+19−2 tests/utils/modules/Unity/Test/testutil.h+1 tools/CMakeLists.txt+1−1 tools/scopetool.cpp+1−1
CMakeLists.txt+14−2
@@ -57,12 +57,24 @@ find_package(Qt5DBus 5.4 REQUIRED)
5757find_package(Qt5Concurrent 5.4 REQUIRED)
5858find_package(Qt5Sql 5.4 REQUIRED)
5959
60−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=14)
60+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=19)
6161pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
6262pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
6363pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
6464pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
6565
66+pkg_check_modules(UBUNTUGESTURES REQUIRED UbuntuGestures)
67+
68+### Check UbuntuGestures private headers. No pkg-config (.pc) file is provided for them
69+find_path(UBUNTUGESTUREPRIV
70+ NAMES UbuntuGestures/private/damper_p.h UbuntuGestures/private/ucswipearea_p.h UbuntuGestures/private/ucswipearea_p_p.h
71+ PATHS ${UBUNTUGESTURES_INCLUDEDIR}/UbuntuGestures/${UBUNTUGESTURES_VERSION}
72+ NO_DEFAULT_PATH)
73+if (${UBUNTUGESTUREPRIV} STREQUAL UBUNTUGESTUREPRIV-NOTFOUND)
74+ message(FATAL_ERROR "UbuntuGestures private headers not found.")
75+endif()
76+# end of UbuntuGesture private headers check
77+
6678# Standard install paths
6779include(GNUInstallDirs)
6880
@@ -116,6 +128,7 @@ set(SHELL_APP unity8)
116128set(DASH_APP unity8-dash)
117129set(SCOPE_TOOL unity-scope-tool)
118130set(INDICATORS_CLIENT_APP indicators-client)
131+set(GREETER_APP unity8-greeter)
119132set(MOCK_INDICATOR_SERVICE_APP unity-mock-indicator-service)
120133
121134include_directories(
@@ -144,7 +157,6 @@ endif()
144157
145158# add subdirectories to build
146159add_subdirectory(include)
147−add_subdirectory(libs)
148160add_subdirectory(src)
149161add_subdirectory(tools)
150162add_subdirectory(qml)
build.sh+2−2
@@ -46,11 +46,11 @@ install_dependencies() {
4646 qmenumodel-qml \
4747 qml-module-qtquick-layouts \
4848 qml-module-qtquick-xmllistmodel \
49+ qml-module-ubuntu-components \
50+ qml-module-ubuntu-thumbnailer0.1 \
4951 qtdeclarative5-gsettings1.0 \
50− qtdeclarative5-ubuntu-ui-toolkit-plugin \
5152 qtdeclarative5-ubuntu-settings-components \
5253 qtdeclarative5-ubuntu-telephony0.1 \
53− qtdeclarative5-ubuntu-thumbnailer0.1 \
5454 qtdeclarative5-unity-notifications-plugin \
5555 qml-module-ubuntu-connectivity \
5656 ubuntu-mobile-icons \
data/51-unity8-greeter.confnew file+2
@@ -0,0 +1,2 @@
1+[Seat:*]
2+greeter-session=unity8-greeter
data/CMakeLists.txt+11
@@ -2,6 +2,7 @@
22configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
33configure_file(${DASH_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${DASH_APP}.desktop @ONLY)
44configure_file(${INDICATORS_CLIENT_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop @ONLY)
5+configure_file(${GREETER_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${GREETER_APP}.desktop @ONLY)
56
67# install desktop files
78install(FILES
@@ -11,6 +12,16 @@ install(FILES
1112 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
1213 )
1314
15+install(FILES
16+ ${CMAKE_CURRENT_BINARY_DIR}/${GREETER_APP}.desktop
17+ DESTINATION ${CMAKE_INSTALL_DATADIR}/lightdm/greeters
18+ )
19+
20+install(FILES
21+ 51-unity8-greeter.conf
22+ DESTINATION ${CMAKE_INSTALL_DATADIR}/lightdm/lightdm.conf.d
23+ )
24+
1425# install dash icon
1526install(FILES
1627 ${CMAKE_CURRENT_SOURCE_DIR}/${DASH_APP}.png
data/com.canonical.Unity8.gschema.xml+5
@@ -27,6 +27,11 @@
2727 <summary>Maximum push needed to overcome edge barrier</summary>
2828 <description>How much you have to push (in grid units) the mouse against an edge barrier when sensibility is 1.</description>
2929 </key>
30+ <key type="u" name="edge-drag-width">
31+ <default>2</default>
32+ <summary>The width of the edge drag areas</summary>
33+ <description>How big (in grid units) the edge-drag sensitive area should be.</description>
34+ </key>
3035 <key type="b" name="autohide-launcher">
3136 <default>true</default>
3237 <summary>Autohide the launcher</summary>
data/devices.confnew file+30
@@ -0,0 +1,30 @@
1+# This file can hold multiple device configs. Devices are separated by sections.
2+#
3+# SupportedOrientations holds a list of all enabled orientations. A standard
4+# phone will usually have Portrait,Landcape,InvertedLandscape in order to
5+# disable upside down usage.
6+#
7+# PrimaryOrientation gives the orientation the device will start up with
8+# when there is no orientations sensor input available (yet) or lock to
9+# when an application specifies to be locked to PrimaryOrientation.
10+#
11+# The other Orientation settings can be used to re-map the orientations.
12+# A device might be used with different orientations than how the screen
13+# is physically mounted on the hardware.
14+#
15+# Category can be phone, tablet, or desktop. This option determines
16+# whether the side stage is shown (tablet) or not (phone). Using
17+# desktop will load the shell in windowed mode. Note that the user
18+# can override/change this by connecting input hardware or change
19+# user settings.
20+#
21+# Any options not listed will default to the values of the example below.
22+
23+# [devicename]
24+# SupportedOrientations=Portrait,InvertedPortrait,Landscape,InvertedLandscape
25+# PrimaryOrientation=PrimaryOrienation
26+# PortraitOrientation=Portrait
27+# InvertedPortraitOrientation=InvertedPortrait
28+# LandscapeOrientation=Landscape
29+# InvertedLandscapeOrientation=InvertedLandscape
30+# Category=phone
data/unity8-dash.desktop.in−1
@@ -7,4 +7,3 @@ Terminal=false
77Icon=@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/Dash/unity8-dash.png
88NoDisplay=true
99X-Ubuntu-Touch=true
10−X-Ubuntu-Supported-Orientations=primary
data/unity8-dash.png

Binary file not shown.

data/unity8-greeter-init.confnew file+12
@@ -0,0 +1,12 @@
1+description "Unity 8 Greeter initialization"
2+author "Michael Terry <mterry@ubuntu.com>"
3+
4+start on unity8-greeter-started
5+task
6+emits indicator-services-start
7+
8+script
9+ start --no-wait ofono-setup || true
10+ initctl emit --no-wait indicator-services-start || true
11+ start --no-wait maliit-server || true
12+end script
data/unity8-greeter-wrappernew file+98
@@ -0,0 +1,98 @@
1+#!/bin/sh
2+# -*- Mode: sh; indent-tabs-mode: nil; tab-width: 4 -*-
3+#
4+# Copyright (C) 2011,2013 Canonical Ltd
5+# Author: Michael Terry <michael.terry@canonical.com>
6+#
7+# This program is free software: you can redistribute it and/or modify it under
8+# the terms of the GNU General Public License as published by the Free Software
9+# Foundation, version 3 of the License.
10+#
11+# See http://www.gnu.org/copyleft/gpl.html the full text of the license.
12+
13+# This wrapper merely ensures that init and friends live only as long as this
14+# script does. Otherwise, it's very easy for some processes to not notice that
15+# the session died. We could try to do this in-process, but we want to do this
16+# cleanup even if the greeter aborts.
17+
18+trap cleanup TERM EXIT
19+
20+cleanup()
21+{
22+ trap - TERM EXIT
23+ # Kill upstart and indicators
24+ if [ -n "$INIT_PID" ]; then
25+ kill "$INIT_PID"
26+ fi
27+ if [ -n "$CMD_PID" ]; then
28+ kill "$CMD_PID"
29+ fi
30+ exit 0
31+}
32+
33+set_greeter_var()
34+{
35+ export "$1=$2"
36+ gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "{'$1': '$2'}"
37+ if [ -n "$INIT_PID" ]; then
38+ initctl set-env --global "$1=$2"
39+ fi
40+}
41+
42+SUB_SOCKET=$XDG_RUNTIME_DIR/mir_socket
43+rm -f $SUB_SOCKET # clear socket in case we were hard shut down
44+
45+# If touch session script (which sets up grid units and mir variables) is available, use it
46+TOUCH_WRAPPER=
47+if [ -x /usr/bin/ubuntu-touch-session ]; then
48+ TOUCH_WRAPPER=/usr/bin/ubuntu-touch-session
49+fi
50+
51+# Pretend that we're in an ubuntu-touch session, so that indicator-network
52+# will start.
53+export DESKTOP_SESSION=ubuntu-touch
54+
55+# We disable ofono using pulse. It causes problems with racing with the user's
56+# pulse. We need to come up with a better long-term fix for this, because we
57+# eventually need the greeter to play ringtones for users that aren't logged in.
58+set_greeter_var PA_DISABLED 1
59+
60+# Normal unity8 sessions are entirely driven by Upstart. But greeters
61+# are special. They need access to the file descriptors that lightdm
62+# creates for them and don't want to start all the services that a normal
63+# session would. So it's inconvenient to live within an upstart session.
64+# But... we still want to use Upstart for some services. So launch here.
65+MIR_SOCKET=$SUB_SOCKET $TOUCH_WRAPPER /sbin/upstart --user --no-startup-event &
66+INIT_PID=$!
67+while [ ! -e "$XDG_RUNTIME_DIR/upstart/sessions/$INIT_PID.session" ]; do sleep 0.1; done
68+export UPSTART_SESSION=$(/sbin/initctl list-sessions | grep "^$INIT_PID " | cut -d' ' -f2)
69+
70+# Start any pre-greeter tasks if needed (like wizard)
71+/sbin/initctl emit unity8-greeter-starting
72+
73+# Define language here for phone if available. When phone user switches their
74+# language, they expect that to affect the greeter too. But the user doesn't
75+# have permission to switch system language, only their own. So we notice if
76+# the phablet user exists and use their language if so. TODO: talk to design
77+# about whether we should switch language on fly as users are selected (this
78+# is very hard to do technically).
79+#
80+# Do this after unity8-greeter-starting, in case a customization upstart job
81+# changes language.
82+if [ "$(id -u phablet 2>/dev/null)" = "32011" ]; then
83+ USER_LANG=$(gdbus call --system --dest org.freedesktop.Accounts --object-path /org/freedesktop/Accounts/User32011 --method org.freedesktop.DBus.Properties.Get org.freedesktop.Accounts.User Language | cut -d\' -f2)
84+ if [ -n "$USER_LANG" ]; then
85+ set_greeter_var LANGUAGE "$USER_LANG"
86+ fi
87+ USER_LOCALE=$(gdbus call --system --dest org.freedesktop.Accounts --object-path /org/freedesktop/Accounts/User32011 --method org.freedesktop.DBus.Properties.Get org.freedesktop.Accounts.User FormatsLocale | cut -d\' -f2)
88+ if [ -n "$USER_LOCALE" ]; then
89+ set_greeter_var LANG "$USER_LOCALE"
90+ set_greeter_var LC_ALL "$USER_LOCALE"
91+ fi
92+fi
93+
94+# And finally actually start the greeter
95+exec env QT_QPA_PLATFORM=ubuntumirclient MIR_SERVER_FILE=$SUB_SOCKET $TOUCH_WRAPPER $@ &
96+CMD_PID=$!
97+wait $CMD_PID
98+CMD_PID=
data/unity8-greeter.desktop.innew file+7
@@ -0,0 +1,7 @@
1+[Desktop Entry]
2+Type=Application
3+Name=Unity 8 Greeter
4+Comment=The converged Unity shell's Greeter
5+Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8-greeter-wrapper @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8 --mode=greeter
6+X-LightDM-Session-Type=mir
7+X-Ubuntu-Touch=true
data/unity8-greeter.pklanew file+44
@@ -0,0 +1,44 @@
1+# DO NOT EDIT THIS FILE, it will be overwritten on update
2+# Place your local configurations under /etc/polkit-1/localauthority/
3+
4+[Disable Controlling of Network Devices]
5+Identity=unix-user:lightdm
6+Action=org.freedesktop.NetworkManager.enable-disable-network;org.freedesktop.NetworkManager.enable-disable-wifi;org.freedesktop.NetworkManager.enable-disable-wwan;org.freedesktop.NetworkManager.enable-disable-wimax;
7+ResultActive=no
8+ResultInactive=no
9+ResultsAny=no
10+
11+[Disable Sleep and Wake]
12+Identity=unix-user:lightdm
13+Action=org.freedesktop.NetworkManager.sleep-wake
14+ResultActive=no
15+ResultInactive=no
16+ResultsAny=no
17+
18+[Disable WiFi Sharing]
19+Identity=unix-user:lightdm
20+Action=org.freedesktop.NetworkManager.wifi.share.protected;org.freedesktop.NetworkManager.wifi.share.open
21+ResultActive=no
22+ResultInactive=no
23+ResultsAny=no
24+
25+[Disable Settings Modifications]
26+Identity=unix-user:lightdm
27+Action=org.freedesktop.NetworkManager.settings.modify.own;org.freedesktop.NetworkManager.settings.modify.system;org.freedesktop.NetworkManager.settings.modify.hostname
28+ResultActive=no
29+ResultInactive=no
30+ResultsAny=no
31+
32+[Disable User Connections]
33+Identity=unix-user:lightdm
34+Action=org.freedesktop.NetworkManager.use-user-connections
35+ResultActive=no
36+ResultInactive=no
37+ResultsAny=no
38+
39+[Enable Controlling of Network Connections]
40+Identity=unix-user:lightdm
41+Action=org.freedesktop.NetworkManager.network-control
42+ResultActive=yes
43+ResultInactive=no
44+ResultsAny=no
data/unity8.conf+31−12
@@ -3,7 +3,7 @@ author "Ricardo Mendoza <ricmm@ubuntu.com>"
33
44emits indicator-services-start
55
6−start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=unity8-mir)) and started dbus
6+start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=unity8-mir) or (xsession SESSION=unity8)) and started dbus
77stop on desktop-end
88
99kill timeout 120
@@ -44,22 +44,41 @@ pre-start script
4444 fi
4545
4646 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
47−end script
48−
49−exec ${BINARY:-unity8} $ARGS
50−
51−post-start script
52− initctl emit --no-wait indicator-services-start
5347
5448 # Disable Qt's stuttering 'touch compression' to fix scrolling smoothness
55− # issues (LP: #1486341). As a bonus, this eliminates most of the
56− # lag seen in the indicator panel pull-down (LP: #1488327) and also
49+ # issues (LP: #1486341, LP: #1556763). As a bonus, this eliminates most of
50+ # the lag seen in the indicator panel pull-down (LP: #1488327) and also
5751 # reduces lag seen in apps:
5852 initctl set-env --global QML_NO_TOUCH_COMPRESSION=1
5953
60− # For twice the fun and half the latency, try this (Warning: not all
61− # devices are fast enough to keep up smoothly yet)...
62− # initctl set-env MIR_SERVER_NBUFFERS=2
54+ if [ "$XDG_SESSION_DESKTOP" = "ubuntu-touch" ]; then
55+ # On Ubuntu Touch, we currently use a trick where we auto-login the
56+ # user without a LightDM greeter at all. In this case, we want to
57+ # start with the lockscreen visible. Once we switch to using a
58+ # proper greeter for the first login, we can remove this code path.
59+ initctl set-env MODE=full-greeter
60+ else
61+ initctl set-env MODE=full-shell
62+ fi
63+end script
64+
65+exec ${BINARY:-unity8} --mode=$MODE $ARGS
66+
67+post-start script
68+ # If no MIR_SOCKET was defined on launch, we try to set one here
69+ if [ -z "$(initctl get-env --global UNITY_MIR_SOCKET)" ]; then
70+ if [ -S "$XDG_RUNTIME_DIR/mir_socket" ]; then
71+ mir_socket=$XDG_RUNTIME_DIR/mir_socket
72+ elif [ -S "/tmp/mir_socket" ]; then
73+ mir_socket=/tmp/mir_socket
74+ fi
75+
76+ if [ -n "$mir_socket" ]; then
77+ initctl set-env --global MIR_SOCKET="$mir_socket"
78+ fi
79+ fi
80+
81+ initctl emit --no-wait indicator-services-start
6382end script
6483
6584post-stop script
debian/bileto_pre_release_hooknew file+5
@@ -0,0 +1,5 @@
1+#!/bin/sh
2+
3+set -eux
4+
5+sh ./po/update-unity-pot
debian/changelog+427
@@ -1,3 +1,430 @@
1+unity8 (8.13+16.10.20160714+fix1-0ubuntu2~1) yakkety; urgency=medium
2+
3+ * Rebuild against Qt 5.6.
4+ * Add https://code.launchpad.net/~aacid/unity8/floor_includes/+merge/300850
5+
6+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Fri, 22 Jul 2016 09:03:54 +0300
7+
8+unity8 (8.13+16.10.20160714-0ubuntu1) yakkety; urgency=medium
9+
10+ [ Daniel d'Andrada ]
11+ * Make use of MirSurface::inputBounds and drop UbuntuKeyboardInfo hack
12+
13+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 14 Jul 2016 07:09:29 +0000
14+
15+unity8 (8.12+16.10.20160711-0ubuntu1) yakkety; urgency=medium
16+
17+ [ Josh Arenson ]
18+ * Add a SessionsModel to lightdm to support the greeter's session
19+ chooser
20+ * Add unity8-greeter package which contains a basic, but usable
21+ LightDM greeter. (LP: #1324602)
22+
23+ [ Michael Terry ]
24+ * Make sure indicators and launcher hide when power button is pressed
25+ on greeter. (LP: #1595569)
26+ * Fix tablet greeter focus to be always-on, no longer hiding the OSK
27+ or forcing a mouse click to type a password. (LP: #1435923)
28+
29+ -- Michael Terry <michael.terry@canonical.com> Mon, 11 Jul 2016 17:24:20 +0000
30+
31+unity8 (8.12+16.10.20160707-0ubuntu1) yakkety; urgency=medium
32+
33+ [ Michael Zanetti ]
34+ * emit the correct role changed signal on count visible changed (LP:
35+ #1599925)
36+
37+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 07 Jul 2016 16:49:32 +0000
38+
39+unity8 (8.12+16.10.20160705-0ubuntu1) yakkety; urgency=medium
40+
41+ [ Michael Zanetti ]
42+ * don't displace windows if the OSK is on another screen (LP:
43+ #1598917)
44+
45+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 05 Jul 2016 10:00:57 +0000
46+
47+unity8 (8.12+16.10.20160627.5-0ubuntu1) yakkety; urgency=medium
48+
49+ [ Albert Astals Cid ]
50+ * Stop watching the old header item height once it's not our header
51+ anymore
52+ * LVWPH: cull the header item when not on view to save some painting
53+ * Adapt test to new mock behaviour
54+ * Don't let the mouse go outside the parentItem (LP: #1525350)
55+ * Use non deprecated package names
56+ * Mark system includes as such
57+ * Fix initialization order warning
58+ * Do not rely on deleteLater not crashing on null pointers
59+ * Add more headers of classes we use for automoc to be run
60+ * CardTool: Fix the fallback value to be a size and not an integer
61+ * CardTool: Include Ubuntu Components since we're using units.gu
62+ * Rework tst_PreviewRatingDisplayCreationRanges
63+
64+ [ Daniel d'Andrada ]
65+ * Cursor: Let AnimatedSprite run only on animated cursors and while
66+ the display is on (LP: #1588873, #1594358)
67+ * Fix missing screenshot when orientation changes while shell rotation
68+ ongoing (LP: #1587796)
69+
70+ [ Josh Arenson ]
71+ * Make PreviewRatingSingleDisplay visible again after editing a
72+ review. (LP: #1587097)
73+ * Correct errors in all png images to prevent libpng warnings.
74+
75+ [ Lukáš Tinkl ]
76+ * Fix some smaller issues with OOBE wizard password pages (LP:
77+ #1590467)
78+ * Prevent mouse wheel events from going through shell elements (LP:
79+ #1536268)
80+ * Do not let mouse and wheel events pass thru the titlebar (LP:
81+ #1588424)
82+ * Hide the maximize window button based on size restrictions (LP:
83+ #1541982)
84+
85+ [ Marco Trevisan (Treviño) ]
86+ * Unity8.conf: ensure MIR_SOCKET is set for future customers (such as
87+ the dash)
88+ * ClientIndicator: be more informative about loading failures for
89+ dynamically created objects
90+
91+ [ Michael Terry ]
92+ * Stop unity8 from getting in a "switch-to-greeter" loop when locking
93+ on a desktop. (LP: #1593718)
94+
95+ [ Michael Zanetti ]
96+ * set minimum window sizes on dash
97+ * displace application windows when the OSK would cover them
98+
99+ [ Nick Dedekind ]
100+ * Force dash to always stay in the main stage. (lp:#1592404) (LP:
101+ #1592404)
102+ * Save the last surface stage on stage drop. (LP: #1579003)
103+ * Default portrait only apps to the side stage. (LP: #1573153)
104+
105+ [ Albert Astals Cid, Andrea Cimitan, Michał Sawicz, Nick Dedekind ]
106+ * Added live video playback in dash previews
107+
108+ -- Michael Zanetti <michael.zanetti@canonical.com> Mon, 27 Jun 2016 18:48:59 +0000
109+
110+unity8 (8.12+16.10.20160620.3-0ubuntu1) yakkety; urgency=medium
111+
112+ [ Michael Terry, Michał Sawicz ]
113+ * Support unlocking via fingerprint, if one is registered.
114+
115+ -- Michael Terry <michael.terry@canonical.com> Mon, 20 Jun 2016 20:25:25 +0000
116+
117+unity8 (8.12+16.10.20160617-0ubuntu1) yakkety; urgency=medium
118+
119+ [ Michael Terry ]
120+ * Do not create Label/Icon if we don't need it
121+ * Fix Z-ordering of prompt surfaces (LP: #1586219)
122+ * Drop bottom edge tutorials completely and small fixes for other
123+ edges. (LP: #1565103)
124+ * Redo visuals for greeter prompt box. (LP: #1435923)
125+ * Make tutorial qmltests more robust. (LP: #1590810)
126+ * Stop showing an extra lockscreen in desktop unity8 sessions. (LP:
127+ #1582987)
128+
129+ [ Albert Astals Cid ]
130+ * Improve dash plugin mock
131+ * Stabilize PreviewExpandableTest::test_all_widgets_height
132+ * Workaround QTBUG-53460
133+ * Split artShape code for cardTool card and regular card
134+ * Simplify the code since fixedArtSize code is mandatory for regular
135+ cards
136+ * Desktop stage: Support rotatesWindowContents (LP: #1547481)
137+ * Turn if if else into if elseif else
138+ * Fix leaks in QInputDeviceManagerPrivate::addDevice
139+ * Do not call |= on uninitialized sigterm.sa_flags
140+ * initialize udevMonitor
141+ * Make notifier and notifierFd function local variables
142+ * Fix crash if a component that is not an Item is given to
143+ sectionDelegate
144+ * Tests: Do not use dynamic_cast if we're not going to test it anyway
145+ * Minor coverity fixes
146+ * Fix warning about anchors.fill in ProportionalShape (LP: #1590963)
147+ * Make wait in cleanup() wait for snapTo animation to have finished
148+
149+ [ Alexandros Frantzis ]
150+ * Improve the way notifications interact with power management (LP:
151+ #1570922)
152+
153+ [ Andrea Cimitan ]
154+ * Correctly refresh cardcreator cache on artshapestyle changes (LP:
155+ #1588335)
156+ * Same tweaks we have for click scope now for libertine
157+ * add a timer to pull to refresh to work on small windows (LP:
158+ #1589060)
159+
160+ [ Daniel d'Andrada ]
161+ * Clean up debug leftovers
162+ * Ensure mouse and window movement are pixel-aligned (LP: #1510382)
163+ * Fix SpreadDelegate rotation animations
164+ * No point in version-controlling files that are automatically
165+ generated
166+ * Center cursor on screen when it's first shown
167+ * Custom cursor name just have to start with "custom"
168+ * Work around AnimatedSprite infinite loop bug (LP: #1588929)
169+
170+ [ Josh Arenson ]
171+ * Disable showDash when it is already shown. (LP: #1506708)
172+ * Add a timestamp to the dash log (LP: #1580074)
173+ * Add timestamp to unity8 log (LP: #1498169)
174+
175+ [ Lukáš Tinkl ]
176+ * Implement keyboard shortcuts info panel
177+ * Implement window controls overlay activatable with 3 fingers tap
178+ (LP: #1489020)
179+ * Select correct Chinese input method for OSK in the wizard (LP:
180+ #1588633)
181+
182+ [ Michael Zanetti ]
183+ * Add support for the launcher surface pips displaying the correct
184+ number of surfaces
185+ * Add support for the persistent alert state. (LP: #1575147, #1584348,
186+ #1586621)
187+ * send a Alt-release event on alt+tab instead of delaying it
188+ completely and invoking it later (LP: #1565236)
189+
190+ [ Stephen M. Webb ]
191+ * added a new upstart $SESSION for unity8-desktop-session (LP:
192+ #1376715)
193+
194+ -- Michael Terry <michael.terry@canonical.com> Fri, 17 Jun 2016 01:22:57 +0000
195+
196+unity8 (8.12+16.10.20160601.1-0ubuntu1) yakkety; urgency=medium
197+
198+ [ Pawel Stolowski ]
199+ * Added apparmor profile for unity8-dash.
200+
201+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 01 Jun 2016 20:59:03 +0000
202+
203+unity8 (8.12+16.10.20160527-0ubuntu1) yakkety; urgency=medium
204+
205+ [ Albert Astals Cid ]
206+ * Activate on click for SimpleMessages (LP: #1421696)
207+ * Add override
208+ * Change the art back to the cardData value if it changes from broken
209+ to valid image (LP: #1533577)
210+ * Concierge mode generated code optimization
211+ * Don't use context properties but properties of the delegates
212+ * Listen to contentItem::widthChanged instead of
213+ Flickable::contentWidthChanged (LP: #1565763)
214+ * Make some AP code faster
215+ * Make tests a bit more stable
216+ * Make unity8 and unity8-dash handle termination signals
217+ * Remove workaround not needed anymore (LP: #1475643)
218+ * Resolve cardArtStyle on compile time
219+ * Set the theme earlier (LP: #1574048)
220+
221+ [ Albert Astals Cid, Daniel d'Andrada ]
222+ * Remove DirectionalDragArea and libs/UbuntuGestures and port to SDK
223+ equivalents
224+
225+ [ Andrea Cimitan ]
226+ * Hide the preview review input field when a rating is required (LP:
227+ #1541971)
228+
229+ [ CI Train Bot ]
230+ * Resync trunk.
231+
232+ [ Daniel d'Andrada ]
233+ * Fix DragHandle so it works in all directions
234+ * Support animated cursors
235+ * WindowInputMonitor - also map Qt::Key_HomePage to our home key
236+ * plugins/Cursor: properly register to the screen's QPlatformCursor
237+ when screen changes (LP: #1579742)
238+
239+ [ Josh Arenson ]
240+ * Close the PageHeaderExtraPanel when a filter option is selected (LP:
241+ #1569498)
242+ * Wrap primaryFilter in a flickable to make it behave nicely. (LP:
243+ #1569492)
244+
245+ [ Lukáš Tinkl ]
246+ * First snap decision should always be expanded, unless user decides
247+ otherwise (LP: #1580090, #1575045)
248+ * Fullscreen notification bug fixes (LP: #1583944, #1581498, #1422711)
249+ * Implement maximizing windows horizontally/vertically
250+ * Lock the session when putting the laptop into sleep (LP: #1581063)
251+
252+ [ Lukáš Tinkl, Michael Terry ]
253+ * With a maximized window, "dragging" the panel down should restore it
254+
255+ [ Michael Terry ]
256+ * Change some dash button colors from orange to green. (LP: #1581047)
257+ * Use PageHeader instead Ambiance's PageHeadStyle
258+ * Use new setTimeZone method to set user-friendly timezone name in the
259+ wizard. (LP: #1566295)
260+
261+ [ Michael Zanetti ]
262+ * Remove the background dimming when the launcher is revealed by a
263+ drag (LP: #1575137)
264+ * reenable or drop disabled tests
265+
266+ -- Michael Terry <michael.terry@canonical.com> Fri, 27 May 2016 13:54:44 +0000
267+
268+unity8 (8.12+16.10.20160520.1-0ubuntu1) yakkety; urgency=medium
269+
270+ [ Lukáš Tinkl ]
271+ * Don't dim screen when the indicators are open (LP: #1564342)
272+ * Fix upcoming alarms ETA labels (LP: #1576741)
273+ * Stabilize flaky wizard tests (LP: #1582994)
274+
275+ [ Michael Zanetti ]
276+ * fix the SIM PIN darkening after it got removed accidentally (LP:
277+ #1577147)
278+
279+ [ Michał Sawicz, Nick Dedekind ]
280+ * Fixed saving current stage and loss of surface focus when switching
281+ stages
282+
283+ [ Nick Dedekind ]
284+ * Fixed incorrect osk surface item resizing the surface.
285+
286+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 20 May 2016 08:44:19 +0000
287+
288+unity8 (8.12+16.04.20160518.1-0ubuntu1) xenial; urgency=medium
289+
290+ [ CI Train Bot ]
291+ * Resync trunk.
292+
293+ [ Daniel d'Andrada, Michał Sawicz ]
294+ * Move prompt surfaces from MirSurface to Application
295+
296+ -- Nick Dedekind <ci-train-bot@canonical.com> Wed, 18 May 2016 11:20:04 +0000
297+
298+unity8 (8.12+16.04.20160504.2-0ubuntu1) xenial; urgency=medium
299+
300+ [ Albert Astals Cid ]
301+ * Expandable Filter Widget
302+ * Pass the category correctly
303+
304+ [ Albert Astals Cid, CI Train Bot ]
305+ * Make the previewActions react to the actions model changing (LP:
306+ #1485887)
307+ * Reload Preview Zoomable Image source if it gets updated
308+ * Update the icon also to the original one if that's what the scope
309+ wants
310+
311+ [ Andrea Cimitan ]
312+ * Add social actions to cards
313+
314+ [ CI Train Bot ]
315+ * Resync trunk.
316+
317+ -- Pawel Stolowski <ci-train-bot@canonical.com> Wed, 04 May 2016 18:09:33 +0000
318+
319+unity8 (8.12+16.04.20160429.2-0ubuntu1) xenial; urgency=medium
320+
321+ [ CI Train Bot ]
322+ * Resync trunk.
323+
324+ [ Daniel d'Andrada ]
325+ * Ensure shell transformations use bindings as OrientedShell can get
326+ resized
327+ * Make shell rotation animation work on multimonitor scenarios.
328+ * Refactor screenshotting code and make it work in multimonitor
329+ scenarios
330+
331+ [ Gerry Boland, Nick Dedekind ]
332+ * Indicators: set menu height binding while fully open/closed, fixes
333+ dynamic grid unit bug.
334+
335+ [ Michael Zanetti ]
336+ * Call the dash sizing hack when units.gu changes
337+ * Temporary means to override GUs on the internal screen
338+ * reduce some paint layers.
339+
340+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 29 Apr 2016 20:07:37 +0000
341+
342+unity8 (8.12+16.04.20160427.3-0ubuntu1) xenial; urgency=medium
343+
344+ [ Albert Astals Cid ]
345+ * Add env var to enable js debugging/profiling even if not built on
346+ debug mode
347+ * Better error message if the item does not exist
348+ * CardCreator: Remove ShaderEffectSource (LP: #1544875)
349+ * Compile with Qt 5.6 (LP: #1565632)
350+ * LVWPH: Account for contentHeight not really being "all" of the
351+ content height (LP: #1569976)
352+ * NotificationAudio: We don't need weird "ifdef" for multimedia 5.6 vs
353+ 5.0 roles anymore
354+ * See all/less -> Show all/less (LP: #1349471)
355+ * Stabilize test_superTabToCycleLauncher
356+ * Take into account that sectionItem height can change
357+ * Turn verify intro tryCompareFunction
358+ * forceLayout before calling positionViewAtIndex (LP: #1553475)
359+ * rootObject can be null for a small moment after setSource is called
360+ (LP: #1560501)
361+
362+ [ CI Train Bot ]
363+ * Resync trunk.
364+
365+ [ Daniel van Vugt ]
366+ * Reinstate the touch performance/smoothness fix (LP: #1486341, LP:
367+ #1556763). (LP: #1556763, #1486341)
368+
369+ [ Josh Arenson ]
370+ * Change the color of the activity pulse to blue (LP: #1568082)
371+ * Make scope filter settings button the same color as other foreground
372+ elements (LP: #1563357)
373+
374+ [ Lukáš Tinkl ]
375+ * Drop OOBE wizard autopilot tests
376+ * Fix labels in desktop spread
377+ * Fix upcoming event ETAs falling out of sync (LP: #1557571)
378+ * Hide the close button for dash (LP: #1550056, #1564347)
379+ * Notifications visual update, close button on mouse hover (LP:
380+ #1564343)
381+ * Shell visual update
382+ * Stabilize wizard tests
383+ * Unity8 windows now cascade instead of opening all in the top left
384+ corner (LP: #1513813)
385+
386+ [ Michael Terry ]
387+ * Fix some unreliable test code.
388+ * Ignore Home Key presses when the greeter is up. (LP: #1565818)
389+
390+ [ Michael Zanetti ]
391+ * Drop the rotation lock for the dash (LP: #1465331, #1574165)
392+ * improve the pin lockscreen
393+ * install devices.conf by default
394+
395+ [ Ted Gould ]
396+ * Switch to using uid/pwdent for getting username
397+
398+ -- Michael Terry <michael.terry@canonical.com> Wed, 27 Apr 2016 15:01:28 +0000
399+
400+unity8 (8.12+16.04.20160421.1-0ubuntu1) xenial; urgency=medium
401+
402+ [ Daniel d'Andrada ]
403+ * Refactor keymap switching code
404+ * Surface-based window management
405+ * Use Item.grabToImage() instead of qtmir's ApplicationScreenshot
406+ provider
407+
408+ [ Michael Zanetti ]
409+ * Fixes for programmatically closing Applications
410+
411+ [ Robert Bruce Park ]
412+ * Use new bileto_pre_release_hook
413+
414+ -- Gerry Boland <ci-train-bot@canonical.com> Thu, 21 Apr 2016 13:48:02 +0000
415+
416+unity8 (8.12+16.04.20160414.1-0ubuntu1) xenial; urgency=medium
417+
418+ [ Michael Terry ]
419+ * Make sure that usageMode is set on startup, fixing a problem with
420+ the tutorial not noticing that it is running on a desktop. (LP:
421+ #1564351)
422+
423+ [ Michael Zanetti ]
424+ * make the edge drag area width configurable (LP: #1559512)
425+
426+ -- Michael Zanetti <michael.zanetti@canonical.com> Thu, 14 Apr 2016 21:20:28 +0000
427+
1428unity8 (8.12+16.04.20160401-0ubuntu1) xenial; urgency=medium
2429
3430 * Add missing Testsuite header
debian/control+30−12
@@ -5,6 +5,7 @@ Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
55Build-Depends: cmake,
66 dbus-test-runner,
77 debhelper (>= 9),
8+ dh-apparmor,
89 doxyqml,
910# To allow cross-compiling to work, we also must append :native
1011# to g++ so we don't try to run armhf g++
@@ -22,6 +23,7 @@ Build-Depends: cmake,
2223 libglib2.0-dev,
2324 libgsettings-qt-dev,
2425 libhardware-dev,
26+ liblightdm-qt5-3-dev,
2527 libpam0g-dev,
2628 libpay2-dev,
2729 libpulse-dev,
@@ -29,8 +31,10 @@ Build-Depends: cmake,
2931 libqt5svg5-dev,
3032 libqt5xmlpatterns5-dev,
3133 libsystemsettings-dev,
34+ libubuntugestures5-dev,
35+ libubuntugestures5-private-dev,
3236 libudev-dev,
33− libunity-api-dev (>= 7.108),
37+ libunity-api-dev (>= 7.116),
3438 libusermetricsoutput1-dev,
3539# Need those X11 libs touch emulation from mouse events in manual QML tests on a X11 desktop
3640 libx11-dev[!armhf],
@@ -41,11 +45,14 @@ Build-Depends: cmake,
4145 python3-all:any,
4246 python3-setuptools,
4347 qml-module-qt-labs-folderlistmodel,
48+ qml-module-qtmultimedia (>= 5.4.1-1ubuntu19~overlay2),
4449 qml-module-qtquick-layouts,
4550 qml-module-qtquick-xmllistmodel,
4651 qml-module-qtquick2,
4752 qml-module-qtsysteminfo,
4853 qml-module-qttest,
54+ qml-module-ubuntu-components (>= 1.3.1845) | qml-module-ubuntu-components-gles (>= 1.3.1845),
55+ qml-module-ubuntu-web,
4956 qt5-default,
5057 qtbase5-dev (>= 5.4),
5158 qtbase5-dev-tools,
@@ -53,11 +60,8 @@ Build-Depends: cmake,
5360 qtdeclarative5-dev (>= 5.4),
5461 qtdeclarative5-dev-tools,
5562 qtdeclarative5-private-dev (>= 5.4),
56− qtdeclarative5-qtmultimedia-plugin (>= 5.4.1-1ubuntu19~overlay2),
5763 qtdeclarative5-ubuntu-content1,
5864 qtdeclarative5-ubuntu-settings-components (>= 0.7),
59− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
60− qtdeclarative5-ubuntu-web-plugin,
6165 ttf-ubuntu-font-family,
6266Standards-Version: 3.9.4
6367Homepage: http://launchpad.net/unity
@@ -72,13 +76,24 @@ X-Ubuntu-Use-Langpack: yes
7276Package: indicators-client
7377Architecture: amd64 armhf i386
7478Depends: qmenumodel-qml (>= 0.2.9),
75− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
79+ qml-module-ubuntu-components (>= 1.3.1845) | qml-module-ubuntu-components-gles (>= 1.3.1845),
7680 unity8 (= ${binary:Version}),
7781 ${misc:Depends},
7882 ${shlibs:Depends},
7983Description: Indicators client test application
8084 This package contains the client application for indicators used by autopilot
8185
86+Package: unity8-greeter
87+Architecture: any
88+Depends: unity8 (= ${binary:Version}),
89+ unity-system-compositor,
90+ ${misc:Depends},
91+ ${shlibs:Depends}
92+Recommends: lightdm
93+Provides: lightdm-greeter
94+Description: The Unity8 Greeter
95+ The Unity 8 greeter is the primary login greeter for Ubuntu devices.
96+
8297Package: unity-scope-tool
8398Architecture: any
8499Depends: unity8-common (= ${source:Version}),
@@ -100,13 +115,15 @@ Depends: dmz-cursor-theme,
100115 libcap2-bin,
101116 libglib2.0-bin,
102117 qmenumodel-qml (>= 0.2.9),
118+ qml-module-biometryd,
103119 qml-module-qt-labs-folderlistmodel,
104120 qml-module-qtquick-xmllistmodel,
105121 qml-module-qtsysteminfo,
122+ qml-module-ubuntu-web,
106123 qtdeclarative5-qtmir-plugin (>= 0.4.8),
107124 qtdeclarative5-ubuntu-telephony0.1,
108125 qtdeclarative5-ubuntu-web-plugin,
109− ubuntu-system-settings,
126+ ubuntu-system-settings (>= 0.4),
110127 unity-launcher-impl-7,
111128 unity8-common (= ${source:Version}),
112129 unity8-private (= ${binary:Version}),
@@ -119,6 +136,7 @@ Recommends: indicator-session,
119136Breaks: indicator-network (<< 0.5.1+14.10.20141014),
120137 ubuntu-touch-session (<< 0.107),
121138 unity8-greeter (<< 7.89),
139+ ubuntu-keyboard (<< 0.100),
122140Replaces: ubuntu-touch-session (<< 0.82~),
123141 unity8-greeter (<< 7.89),
124142Conflicts: ubuntu-system-settings-wizard,
@@ -128,15 +146,15 @@ Description: Unity 8 shell
128146Package: unity8-common
129147Architecture: all
130148Depends: qml-module-qtquick-layouts,
149+ qml-module-ubuntu-components (>= 1.3.1845) | qml-module-ubuntu-components-gles (>= 1.3.1845),
150+ qml-module-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
131151 qtdeclarative5-ubuntu-settings-components (>= 0.7),
132− qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
133− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
134152 qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
135153 ubuntu-thumbnailer-impl-0,
136− unity-application-impl-14,
154+ unity-application-impl-19,
137155 unity-notifications-impl-3,
138156 unity-plugin-scopes | unity-scopes-impl,
139− unity-scopes-impl-11,
157+ unity-scopes-impl-12,
140158 unity8-fake-env | unity-application-impl,
141159 ${misc:Depends},
142160Breaks: unity8 (<< 7.86),
@@ -179,7 +197,7 @@ Pre-Depends: ${misc:Pre-Depends},
179197Depends: ${misc:Depends},
180198 ${shlibs:Depends},
181199Provides: unity-application-impl,
182− unity-application-impl-14,
200+ unity-application-impl-19,
183201Replaces: unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1)
184202Description: Fake environment for running Unity 8 shell
185203 Provides fake implementations of some QML modules used by Unity 8 shell
@@ -189,7 +207,7 @@ Package: unity8-private
189207Architecture: any
190208Multi-Arch: same
191209Pre-Depends: ${misc:Pre-Depends},
192−Depends: accountsservice-ubuntu-schemas (>= 0.0.5),
210+Depends: accountsservice-ubuntu-schemas (>= 0.0.7),
193211 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
194212 libhardware2,
195213 pay-service,
debian/rules+5−9
@@ -29,18 +29,14 @@ override_dh_install:
2929 cd $(CURDIR)
3030 dh_install -X'*.pyc' --fail-missing
3131
32+override_dh_installdeb:
33+ dh_apparmor --profile-name=usr.bin.unity8-dash -punity8-dash
34+ dh_installdeb
35+
3236# use private lib directories
3337override_dh_makeshlibs:
3438 dh_makeshlibs -Nunity8-private -Nunity8-fake-env
3539
36−# libMockLightDM-qml.so links against liblightdm-qt5-2.so which doesn't exist
40+# libMockLightDM-qml.so links against liblightdm-qt5-3.so which doesn't exist
3741override_dh_shlibdeps:
3842 dh_shlibdeps -XlibMockLightDM-qml.so
39−
40−override_dh_auto_clean:
41− dh_auto_clean
42− # only run under "CI Train"
43− if [ -n "$(SILONAME)" -a -x /usr/bin/bzr ]; then \
44− ./po/update-unity-pot; \
45− bzr commit --message "Update translation template" po/unity8.pot; \
46− fi
debian/unity8-greeter.installnew file+5
@@ -0,0 +1,5 @@
1+data/unity8-greeter-wrapper usr/bin/
2+data/unity8-greeter-init.conf usr/share/upstart/sessions/
3+data/unity8-greeter.pkla /var/lib/polkit-1/localauthority/10-vendor.d/
4+usr/share/lightdm/greeters/unity8-greeter.desktop
5+usr/share/lightdm/lightdm.conf.d/51-unity8-greeter.conf
debian/unity8-private.install+3−3
@@ -1,19 +1,19 @@
11usr/lib/*/libunity8-private.*
2−usr/lib/*/unity8/libUbuntuGestures*
32usr/lib/*/unity8/qml/AccountsService
43usr/lib/*/unity8/qml/Cursor
54usr/lib/*/unity8/qml/Dash
65usr/lib/*/unity8/qml/GlobalShortcut
76usr/lib/*/unity8/qml/Greeter
8−usr/lib/*/unity8/qml/IntegratedLightDM
7+usr/lib/*/unity8/qml/LightDM
98usr/lib/*/unity8/qml/Lights
109usr/lib/*/unity8/qml/Powerd
11−usr/lib/*/unity8/qml/ScreenGrabber
10+usr/lib/*/unity8/qml/ScreenshotDirectory
1211usr/lib/*/unity8/qml/SessionBroadcast
1312usr/lib/*/unity8/qml/Ubuntu
1413usr/lib/*/unity8/qml/Unity
1514usr/lib/*/unity8/qml/UInput
1615usr/lib/*/unity8/qml/Utils
16+usr/lib/*/unity8/qml/WindowManager
1717usr/lib/*/unity8/qml/Wizard
1818usr/share/accountsservice/interfaces
1919usr/share/dbus-1/interfaces
debian/unity8.install+2
@@ -1,7 +1,9 @@
1+debian/usr.bin.unity8-dash etc/apparmor.d
12var/lib/unity8/version
23data/unity8-dash.conf usr/share/upstart/sessions/
34data/unity8-filewatcher.conf usr/share/upstart/sessions/
45data/unity8.conf usr/share/upstart/sessions/
6+data/devices.conf etc/ubuntu/
57usr/bin/unity8
68usr/bin/unity8-dash
79usr/share/applications/unity8-dash.desktop
debian/usr.bin.unity8-dashnew file+21
@@ -0,0 +1,21 @@
1+# vim:syntax=apparmor
2+
3+#include <tunables/global>
4+
5+# v2 compatible wildly permissive profile
6+profile unity8-dash /usr/bin/unity8-dash (attach_disconnected) {
7+ capability,
8+ network,
9+ / rwkl,
10+ /** rwlkm,
11+ /** pix,
12+
13+ mount,
14+ remount,
15+ umount,
16+ pivot_root,
17+ dbus,
18+ signal,
19+ ptrace,
20+ unix,
21+}
doc/devices.conf+15
@@ -28,3 +28,18 @@ InvertedPortraitOrientation=InvertedPortrait
2828LandscapeOrientation=Landscape
2929InvertedLandscapeOrientation=InvertedLandscape
3030Category=phone
31+
32+# Example for the Nexus 7
33+# This device has the screen mounted in portrait, but we run it as a landscape
34+# device and we want the side stage on it.
35+[flo]
36+PrimaryOrientation=LandscapeOrienation
37+Category=tablet
38+
39+# Example for the Nexus 4
40+# The screen is already mounted the way we want it, so no special config
41+# required. However, we don't want the phone to rotate upside down, so lets
42+# restrict that.
43+[mako]
44+SupportedOrientations=Portrait,Landscape,InvertedLandscape
45+Category=phone
libs/CMakeLists.txtdeleted−1
@@ -1 +0,0 @@
1−add_subdirectory(UbuntuGestures)
libs/UbuntuGestures/CMakeLists.txtdeleted−41
@@ -1,41 +0,0 @@
1−# in order to include Qt's private headers
2−remove_definitions(-DQT_NO_KEYWORDS)
3−
4−set(UbuntuGestures_SOURCES
5− CandidateInactivityTimer.cpp
6− DebugHelpers.cpp
7− Timer.cpp
8− TimeSource.cpp
9− TouchOwnershipEvent.cpp
10− TouchRegistry.cpp
11− UnownedTouchEvent.cpp
12−)
13−
14−add_definitions(-DUBUNTUGESTURES_LIBRARY)
15−
16−add_library(UbuntuGestures SHARED ${UbuntuGestures_SOURCES})
17−
18−qt5_use_modules(UbuntuGestures Core Quick)
19−
20−# So that Foo.cpp can #include "Foo.moc"
21−include_directories(${CMAKE_CURRENT_BINARY_DIR})
22−
23−install(TARGETS UbuntuGestures
24− DESTINATION ${SHELL_PRIVATE_LIBDIR})
25−
26−
27−# There's no cmake var for v8 include path :-/ so create one
28−LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
29−if(${Qt5Core_VERSION_STRING} VERSION_LESS "5.1.0")
30− SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/../QtV8/${Qt5Core_VERSION_STRING}/QtV8)
31−else()
32− SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/QtV8/${Qt5Core_VERSION_STRING}/QtV8)
33−endif()
34−
35−# DANGER! DANGER! Using Qt's private API!
36−include_directories(
37− ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
38− ${Qt5Quick_INCLUDE_DIRS}
39− ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
40− ${Qt5V8_PRIVATE_INCLUDE_DIR}
41−)
libs/UbuntuGestures/CandidateInactivityTimer.cppdeleted−46
@@ -1,46 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "CandidateInactivityTimer.h"
18−
19−namespace UbuntuGestures {
20−
21−CandidateInactivityTimer::CandidateInactivityTimer(int touchId, QQuickItem *candidate,
22− AbstractTimer *timer, QObject *parent)
23− : QObject(parent)
24− , m_timer(timer)
25− , m_touchId(touchId)
26− , m_candidate(candidate)
27−{
28− connect(m_timer, &AbstractTimer::timeout,
29− this, &CandidateInactivityTimer::onTimeout);
30− m_timer->setInterval(durationMs);
31− m_timer->setSingleShot(true);
32− m_timer->start();
33−}
34−
35−CandidateInactivityTimer::~CandidateInactivityTimer()
36−{
37− delete m_timer;
38−}
39−
40−void CandidateInactivityTimer::onTimeout()
41−{
42− qWarning("[TouchRegistry] Candidate for touch %d defaulted!", m_touchId);
43− Q_EMIT candidateDefaulted(m_touchId, m_candidate);
44−}
45−
46−} // namespace UbuntuGestures
libs/UbuntuGestures/CandidateInactivityTimer.hdeleted−51
@@ -1,51 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H
18−#define UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H
19−
20−#include <QObject>
21−
22−class QQuickItem;
23−
24−#include "Timer.h"
25−
26−namespace UbuntuGestures {
27−
28−class UBUNTUGESTURES_EXPORT CandidateInactivityTimer : public QObject {
29− Q_OBJECT
30−public:
31− CandidateInactivityTimer(int touchId, QQuickItem *candidate,
32− AbstractTimer *timer,
33− QObject *parent = nullptr);
34−
35− virtual ~CandidateInactivityTimer();
36−
37− const int durationMs = 1000;
38−
39−Q_SIGNALS:
40− void candidateDefaulted(int touchId, QQuickItem *candidate);
41−private Q_SLOTS:
42− void onTimeout();
43−private:
44− AbstractTimer *m_timer;
45− int m_touchId;
46− QQuickItem *m_candidate;
47−};
48−
49−} // namespace UbuntuGestures
50−
51−#endif // UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H
libs/UbuntuGestures/DebugHelpers.cppdeleted−95
@@ -1,95 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "DebugHelpers.h"
18−#include <QTouchEvent>
19−#include <QMouseEvent>
20−
21−QString touchPointStateToString(Qt::TouchPointState state)
22−{
23− switch (state) {
24− case Qt::TouchPointPressed:
25− return QStringLiteral("pressed");
26− case Qt::TouchPointMoved:
27− return QStringLiteral("moved");
28− case Qt::TouchPointStationary:
29− return QStringLiteral("stationary");
30− case Qt::TouchPointReleased:
31− return QStringLiteral("released");
32− default:
33− return QStringLiteral("INVALID_STATE");
34− }
35−}
36−
37−QString touchEventToString(const QTouchEvent *ev)
38−{
39− QString message;
40−
41− switch (ev->type()) {
42− case QEvent::TouchBegin:
43− message.append("TouchBegin ");
44− break;
45− case QEvent::TouchUpdate:
46− message.append("TouchUpdate ");
47− break;
48− case QEvent::TouchEnd:
49− message.append("TouchEnd ");
50− break;
51− case QEvent::TouchCancel:
52− message.append("TouchCancel ");
53− break;
54− default:
55− message.append("INVALID_TOUCH_EVENT_TYPE ");
56− }
57−
58− foreach(const QTouchEvent::TouchPoint& touchPoint, ev->touchPoints()) {
59− message.append(
60− QStringLiteral("(id:%1, state:%2, scenePos:(%3,%4)) ")
61− .arg(touchPoint.id())
62− .arg(touchPointStateToString(touchPoint.state()))
63− .arg(touchPoint.scenePos().x())
64− .arg(touchPoint.scenePos().y())
65− );
66− }
67−
68− return message;
69−}
70−
71−QString mouseEventToString(const QMouseEvent *ev)
72−{
73− QString message;
74−
75− switch (ev->type()) {
76− case QEvent::MouseButtonPress:
77− message.append("MouseButtonPress ");
78− break;
79− case QEvent::MouseButtonRelease:
80− message.append("MouseButtonRelease ");
81− break;
82− case QEvent::MouseButtonDblClick:
83− message.append("MouseButtonDblClick ");
84− break;
85− case QEvent::MouseMove:
86− message.append("MouseMove ");
87− break;
88− default:
89− message.append("INVALID_MOUSE_EVENT_TYPE ");
90− }
91−
92− message.append(QStringLiteral("pos(%1, %2)").arg(ev->x()).arg(ev->y()));
93−
94− return message;
95−}
libs/UbuntuGestures/DebugHelpers.hdeleted−31
@@ -1,31 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef UBUNTUGESTURES_DEBUG_HELPER_H
18−#define UBUNTUGESTURES_DEBUG_HELPER_H
19−
20−#include <QString>
21−
22−#include "UbuntuGesturesGlobal.h"
23−
24−class QMouseEvent;
25−class QTouchEvent;
26−
27−UBUNTUGESTURES_EXPORT QString touchPointStateToString(Qt::TouchPointState state);
28−UBUNTUGESTURES_EXPORT QString touchEventToString(const QTouchEvent *ev);
29−UBUNTUGESTURES_EXPORT QString mouseEventToString(const QMouseEvent *ev);
30−
31−#endif // UBUNTUGESTURES_DEBUG_HELPER_H
libs/UbuntuGestures/Pool.hdeleted−124
@@ -1,124 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef UBUNTUGESTURES_POOL_H
18−#define UBUNTUGESTURES_POOL_H
19−
20−#include <QVector>
21−
22−#include "UbuntuGesturesGlobal.h"
23−
24−/*
25− An object pool.
26− Avoids unnecessary creations/initializations and deletions/destructions of items. Useful
27− in a scenario where items are created and destroyed very frequently but the total number
28− of items at any given time remains small. They're stored in a unordered fashion.
29−
30− To be used in Pool, ItemType needs to have the following methods:
31−
32− - ItemType();
33−
34− A constructor that takes no parameters. An object contructed with it must return false if
35− isValid() is called.
36−
37− - bool isValid() const;
38−
39− Returns wheter the object holds a valid , "filled" state or is empty.
40− Used by Pool to check if the slot occupied by this object is actually available.
41−
42− - void reset();
43−
44− Resets the object to its initial, empty, state. After calling this method, isValid() must
45− return false.
46− */
47−template <class ItemType> class Pool
48−{
49−public:
50− Pool() : m_lastUsedIndex(-1) {
51− }
52−
53− class Iterator {
54− public:
55− Iterator() : index(-1), item(nullptr) {}
56− Iterator(int index, ItemType *item)
57− : index(index), item(item) {}
58−
59− ItemType *operator->() const { return item; }
60− ItemType &operator*() const { return *item; }
61− ItemType &value() const { return *item; }
62−
63− operator bool() const { return item != nullptr; }
64−
65− int index;
66− ItemType *item;
67− };
68−
69− ItemType &getEmptySlot() {
70− Q_ASSERT(m_lastUsedIndex < m_slots.size());
71−
72− // Look for an in-between vacancy first
73− for (int i = 0; i < m_lastUsedIndex; ++i) {
74− ItemType &item = m_slots[i];
75− if (!item.isValid()) {
76− return item;
77− }
78− }
79−
80− ++m_lastUsedIndex;
81− if (m_lastUsedIndex >= m_slots.size()) {
82− m_slots.resize(m_lastUsedIndex + 1);
83− }
84−
85− return m_slots[m_lastUsedIndex];
86− }
87−
88− void freeSlot(Iterator &iterator) {
89− m_slots[iterator.index].reset();
90− if (iterator.index == m_lastUsedIndex) {
91− do {
92− --m_lastUsedIndex;
93− } while (m_lastUsedIndex >= 0 && !m_slots.at(m_lastUsedIndex).isValid());
94− }
95− }
96−
97− // Iterates through all valid items (i.e. the occupied slots)
98− // calling the given function, with the option of ending the loop early.
99− //
100− // bool Func(Iterator& item)
101− //
102− // Returning true means it wants to continue the "for" loop, false
103− // terminates the loop.
104− template<typename Func> void forEach(Func func) {
105− Iterator it;
106− for (it.index = 0; it.index <= m_lastUsedIndex; ++it.index) {
107− it.item = &m_slots[it.index];
108− if (!it.item->isValid())
109− continue;
110−
111− if (!func(it))
112− break;
113− }
114− }
115−
116− bool isEmpty() const { return m_lastUsedIndex == -1; }
117−
118−
119−private:
120− QVector<ItemType> m_slots;
121− int m_lastUsedIndex;
122−};
123−
124−#endif // UBUNTUGESTURES_POOL_H
libs/UbuntuGestures/TimeSource.cppdeleted−49
@@ -1,49 +0,0 @@
1−/*
2− * Copyright (C) 2013 - Canonical Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it
5− * under the terms of the GNU Lesser General Public License, as
6− * published by the Free Software Foundation; either version 2.1 or 3.0
7− * of the License.
8− *
9− * This program is distributed in the hope that it will be useful, but
10− * WITHOUT ANY WARRANTY; without even the implied warranties of
11− * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
12− * PURPOSE. See the applicable version of the GNU Lesser General Public
13− * License for more details.
14− *
15− * You should have received a copy of both the GNU Lesser General Public
16− * License along with this program. If not, see <http://www.gnu.org/licenses/>
17− *
18− * Authored by: Daniel d'Andrada <daniel.dandrada@canonical.com>
19− */
20−
21−#include "TimeSource.h"
22−
23−#include <QElapsedTimer>
24−
25−namespace UbuntuGestures {
26−class RealTimeSourcePrivate {
27−public:
28− QElapsedTimer timer;
29−};
30−}
31−
32−using namespace UbuntuGestures;
33−
34−RealTimeSource::RealTimeSource()
35− : UbuntuGestures::TimeSource()
36− , d(new RealTimeSourcePrivate)
37−{
38− d->timer.start();
39−}
40−
41−RealTimeSource::~RealTimeSource()
42−{
43− delete d;
44−}
45−
46−qint64 RealTimeSource::msecsSinceReference()
47−{
48− return d->timer.elapsed();
49−}
libs/UbuntuGestures/TimeSource.hdeleted−64
@@ -1,64 +0,0 @@
1−/*
2− * Copyright (C) 2013,2015 Canonical Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it
5− * under the terms of the GNU Lesser General Public License, as
6− * published by the Free Software Foundation; either version 2.1 or 3.0
7− * of the License.
8− *
9− * This program is distributed in the hope that it will be useful, but
10− * WITHOUT ANY WARRANTY; without even the implied warranties of
11− * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
12− * PURPOSE. See the applicable version of the GNU Lesser General Public
13− * License for more details.
14− *
15− * You should have received a copy of both the GNU Lesser General Public
16− * License along with this program. If not, see <http://www.gnu.org/licenses/>
17− *
18− * Authored by: Daniel d'Andrada <daniel.dandrada@canonical.com>
19− */
20−
21−#ifndef UBUNTUGESTURES_TIMESOURCE_H
22−#define UBUNTUGESTURES_TIMESOURCE_H
23−
24−#include "UbuntuGesturesGlobal.h"
25−#include <QSharedPointer>
26−
27−namespace UbuntuGestures {
28−/*
29− Interface for a time source.
30− */
31−class UBUNTUGESTURES_EXPORT TimeSource {
32−public:
33− virtual ~TimeSource() {}
34− /* Returns the current time in milliseconds since some reference time in the past. */
35− virtual qint64 msecsSinceReference() = 0;
36−};
37−typedef QSharedPointer<TimeSource> SharedTimeSource;
38−
39−/*
40− Implementation of a time source
41− */
42−class RealTimeSourcePrivate;
43−class UBUNTUGESTURES_EXPORT RealTimeSource : public TimeSource {
44−public:
45− RealTimeSource();
46− virtual ~RealTimeSource();
47− qint64 msecsSinceReference() override;
48−private:
49− RealTimeSourcePrivate *d;
50−};
51−
52−/*
53− A fake time source, useful for tests
54− */
55−class FakeTimeSource : public TimeSource {
56−public:
57− FakeTimeSource() { m_msecsSinceReference = 0; }
58− qint64 msecsSinceReference() override { return m_msecsSinceReference; }
59− qint64 m_msecsSinceReference;
60−};
61−
62−} // namespace UbuntuGestures
63−
64−#endif // UBUNTUGESTURES_TIMESOURCE_H
libs/UbuntuGestures/Timer.cppdeleted−152
@@ -1,152 +0,0 @@
1−/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "Timer.h"
18−
19−namespace UbuntuGestures {
20−
21−Timer::Timer(QObject *parent) : AbstractTimer(parent)
22−{
23− m_timer.setSingleShot(false);
24− connect(&m_timer, &QTimer::timeout, this, &AbstractTimer::timeout);
25−}
26−
27−int Timer::interval() const
28−{
29− return m_timer.interval();
30−}
31−
32−void Timer::setInterval(int msecs)
33−{
34− m_timer.setInterval(msecs);
35−}
36−
37−void Timer::start()
38−{
39− m_timer.start();
40− AbstractTimer::start();
41−}
42−
43−void Timer::stop()
44−{
45− m_timer.stop();
46− AbstractTimer::stop();
47−}
48−
49−bool Timer::isSingleShot() const
50−{
51− return m_timer.isSingleShot();
52−}
53−
54−void Timer::setSingleShot(bool value)
55−{
56− m_timer.setSingleShot(value);
57−}
58−
59−/////////////////////////////////// FakeTimer //////////////////////////////////
60−
61−FakeTimer::FakeTimer(const SharedTimeSource &timeSource, QObject *parent)
62− : UbuntuGestures::AbstractTimer(parent)
63− , m_interval(0)
64− , m_singleShot(false)
65− , m_timeSource(timeSource)
66−{
67−}
68−
69−void FakeTimer::update()
70−{
71− if (!isRunning()) {
72− return;
73− }
74−
75− if (m_nextTimeoutTime <= m_timeSource->msecsSinceReference()) {
76− if (isSingleShot()) {
77− stop();
78− } else {
79− m_nextTimeoutTime += interval();
80− }
81− Q_EMIT timeout();
82− }
83−}
84−
85−void FakeTimer::start()
86−{
87− AbstractTimer::start();
88− m_nextTimeoutTime = m_timeSource->msecsSinceReference() + (qint64)interval();
89−}
90−
91−int FakeTimer::interval() const
92−{
93− return m_interval;
94−}
95−
96−void FakeTimer::setInterval(int msecs)
97−{
98− m_interval = msecs;
99−}
100−
101−bool FakeTimer::isSingleShot() const
102−{
103− return m_singleShot;
104−}
105−
106−void FakeTimer::setSingleShot(bool value)
107−{
108− m_singleShot = value;
109−}
110−
111−/////////////////////////////////// FakeTimerFactory //////////////////////////////////
112−
113−FakeTimerFactory::FakeTimerFactory()
114−{
115− m_timeSource.reset(new FakeTimeSource);
116−}
117−
118−void FakeTimerFactory::updateTime(qint64 targetTime)
119−{
120− qint64 minTimeoutTime = targetTime;
121−
122− for (int i = 0; i < timers.count(); ++i) {
123− FakeTimer *timer = timers[i].data();
124− if (timer && timer->isRunning() && timer->nextTimeoutTime() < minTimeoutTime) {
125− minTimeoutTime = timer->nextTimeoutTime();
126− }
127− }
128−
129− m_timeSource->m_msecsSinceReference = minTimeoutTime;
130−
131− for (int i = 0; i < timers.count(); ++i) {
132− FakeTimer *timer = timers[i].data();
133− if (timer) {
134− timer->update();
135− }
136− }
137−
138− if (m_timeSource->msecsSinceReference() < targetTime) {
139− updateTime(targetTime);
140− }
141−}
142−
143−AbstractTimer *FakeTimerFactory::createTimer(QObject *parent)
144−{
145− FakeTimer *fakeTimer = new FakeTimer(m_timeSource, parent);
146−
147− timers.append(fakeTimer);
148−
149− return fakeTimer;
150−}
151−
152−} // namespace UbuntuGestures
libs/UbuntuGestures/Timer.hdeleted−122
@@ -1,122 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef UBUNTUGESTURES_TIMER_H
18−#define UBUNTUGESTURES_TIMER_H
19−
20−#include "UbuntuGesturesGlobal.h"
21−#include "TimeSource.h"
22−
23−#include <QObject>
24−#include <QPointer>
25−#include <QTimer>
26−
27−namespace UbuntuGestures {
28−
29−/* Defines an interface for a Timer. Useful for tests. */
30−class UBUNTUGESTURES_EXPORT AbstractTimer : public QObject
31−{
32− Q_OBJECT
33−public:
34− AbstractTimer(QObject *parent) : QObject(parent), m_isRunning(false) {}
35− virtual int interval() const = 0;
36− virtual void setInterval(int msecs) = 0;
37− virtual void start() { m_isRunning = true; }
38− virtual void start(int msecs)
39− {
40− setInterval(msecs);
41− start();
42− }
43− virtual void stop() { m_isRunning = false; }
44− bool isRunning() const { return m_isRunning; }
45− virtual bool isSingleShot() const = 0;
46− virtual void setSingleShot(bool value) = 0;
47−Q_SIGNALS:
48− void timeout();
49−private:
50− bool m_isRunning;
51−};
52−
53−/* Essentially a QTimer wrapper */
54−class UBUNTUGESTURES_EXPORT Timer : public AbstractTimer
55−{
56− Q_OBJECT
57−public:
58− Timer(QObject *parent = nullptr);
59−
60− int interval() const override;
61− void setInterval(int msecs) override;
62− void start() override;
63− void stop() override;
64− bool isSingleShot() const override;
65− void setSingleShot(bool value) override;
66−private:
67− QTimer m_timer;
68−};
69−
70−/* For tests */
71−class UBUNTUGESTURES_EXPORT FakeTimer : public AbstractTimer
72−{
73− Q_OBJECT
74−public:
75− FakeTimer(const SharedTimeSource &timeSource, QObject *parent = nullptr);
76−
77− void update();
78− qint64 nextTimeoutTime() const { return m_nextTimeoutTime; }
79−
80− int interval() const override;
81− void setInterval(int msecs) override;
82− void start() override;
83− bool isSingleShot() const override;
84− void setSingleShot(bool value) override;
85−private:
86− int m_interval;
87− bool m_singleShot;
88− SharedTimeSource m_timeSource;
89− qint64 m_nextTimeoutTime;
90−};
91−
92−class UBUNTUGESTURES_EXPORT AbstractTimerFactory
93−{
94−public:
95− virtual ~AbstractTimerFactory() {}
96− virtual AbstractTimer *createTimer(QObject *parent = nullptr) = 0;
97−};
98−
99−class UBUNTUGESTURES_EXPORT TimerFactory : public AbstractTimerFactory
100−{
101−public:
102− AbstractTimer *createTimer(QObject *parent = nullptr) override { return new Timer(parent); }
103−};
104−
105−class UBUNTUGESTURES_EXPORT FakeTimerFactory : public AbstractTimerFactory
106−{
107−public:
108− FakeTimerFactory();
109− virtual ~FakeTimerFactory() {}
110−
111− void updateTime(qint64 msecsSinceReference);
112− QSharedPointer<TimeSource> timeSource() { return m_timeSource; }
113−
114− AbstractTimer *createTimer(QObject *parent = nullptr) override;
115− QList<QPointer<FakeTimer>> timers;
116−private:
117− QSharedPointer<FakeTimeSource> m_timeSource;
118−};
119−
120−} // namespace UbuntuGestures
121−
122−#endif // UBUNTUGESTURES_TIMER_H
libs/UbuntuGestures/TouchOwnershipEvent.hdeleted−50
@@ -1,50 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef UBUNTU_TOUCHOWNERSHIPEVENT_H
18−#define UBUNTU_TOUCHOWNERSHIPEVENT_H
19−
20−#include <QEvent>
21−#include "UbuntuGesturesGlobal.h"
22−
23−/*
24− When an item get an ownership event for a touch it can grab/steal that touch
25− with a clean conscience.
26− */
27−class UBUNTUGESTURES_EXPORT TouchOwnershipEvent : public QEvent
28−{
29−public:
30− TouchOwnershipEvent(int touchId, bool gained);
31−
32− static Type touchOwnershipEventType();
33−
34− /*
35− Whether ownership was gained (true) or lost (false)
36− */
37− bool gained() const { return m_gained; }
38−
39− /*
40− Id of the touch whose ownership was granted.
41− */
42− int touchId() const { return m_touchId; }
43−
44−private:
45− static Type m_touchOwnershipType;
46− int m_touchId;
47− bool m_gained;
48−};
49−
50−#endif // UBUNTU_TOUCHOWNERSHIPEVENT_H
libs/UbuntuGestures/TouchRegistry.cppdeleted−553
@@ -1,553 +0,0 @@
1−/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "TouchRegistry.h"
18−
19−#include <QCoreApplication>
20−#include <QDebug>
21−
22−#pragma GCC diagnostic push
23−#pragma GCC diagnostic ignored "-pedantic"
24−#include <private/qquickitem_p.h>
25−#pragma GCC diagnostic pop
26−
27−#include "CandidateInactivityTimer.h"
28−#include "Timer.h"
29−#include "TouchOwnershipEvent.h"
30−#include "UnownedTouchEvent.h"
31−
32−#define TOUCHREGISTRY_DEBUG 0
33−
34−#if TOUCHREGISTRY_DEBUG
35− #include "DebugHelpers.h"
36− #define UG_DEBUG qDebug() << "[TouchRegistry]"
37−#endif // TOUCHREGISTRY_DEBUG
38−
39−using namespace UbuntuGestures;
40−
41−TouchRegistry *TouchRegistry::m_instance = nullptr;
42−
43−TouchRegistry::TouchRegistry(QObject *parent)
44− : QObject(parent)
45− , m_inDispatchLoop(false)
46− , m_timerFactory(new TimerFactory)
47−{
48−}
49−
50−TouchRegistry::~TouchRegistry()
51−{
52− Q_ASSERT(m_instance != nullptr);
53− m_instance = nullptr;
54− delete m_timerFactory;
55−}
56−
57−TouchRegistry *TouchRegistry::instance()
58−{
59− if (m_instance == nullptr) {
60− m_instance = new TouchRegistry;
61− }
62− return m_instance;
63−}
64−
65−void TouchRegistry::setTimerFactory(AbstractTimerFactory *timerFactory)
66−{
67− delete m_timerFactory;
68− m_timerFactory = timerFactory;
69−}
70−
71−void TouchRegistry::update(const QTouchEvent *event)
72−{
73− #if TOUCHREGISTRY_DEBUG
74− UG_DEBUG << "got" << qPrintable(touchEventToString(event));
75− #endif
76−
77− const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
78− for (int i = 0; i < touchPoints.count(); ++i) {
79− const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
80− if (touchPoint.state() == Qt::TouchPointPressed) {
81− TouchInfo &touchInfo = m_touchInfoPool.getEmptySlot();
82− touchInfo.init(touchPoint.id());
83− } else if (touchPoint.state() == Qt::TouchPointReleased) {
84− Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(touchPoint.id());
85−
86− touchInfo->physicallyEnded = true;
87− }
88− }
89−
90− deliverTouchUpdatesToUndecidedCandidatesAndWatchers(event);
91−
92− freeEndedTouchInfos();
93−}
94−
95−void TouchRegistry::deliverTouchUpdatesToUndecidedCandidatesAndWatchers(const QTouchEvent *event)
96−{
97− // TODO: Look into how we could optimize this whole thing.
98− // Although it's not really a problem as we should have at most two candidates
99− // for each point and there should not be many active points at any given moment.
100− // But having three nested for-loops does scare.
101−
102− const QList<QTouchEvent::TouchPoint> &updatedTouchPoints = event->touchPoints();
103−
104− // Maps an item to the touches in this event he should be informed about.
105− // E.g.: a QTouchEvent might have three touches but a given item might be interested in only
106− // one of them. So he will get a UnownedTouchEvent from this QTouchEvent containing only that
107− // touch point.
108− QHash<QQuickItem*, QList<int>> touchIdsForItems;
109−
110− // Build touchIdsForItems
111− m_touchInfoPool.forEach([&](Pool<TouchInfo>::Iterator &touchInfo) {
112− if (touchInfo->isOwned() && touchInfo->watchers.isEmpty())
113− return true;
114−
115− for (int j = 0; j < updatedTouchPoints.count(); ++j) {
116− if (updatedTouchPoints[j].id() == touchInfo->id) {
117− if (!touchInfo->isOwned()) {
118− for (int i = 0; i < touchInfo->candidates.count(); ++i) {
119− CandidateInfo &candidate = touchInfo->candidates[i];
120− Q_ASSERT(!candidate.item.isNull());
121− if (candidate.state != CandidateInfo::InterimOwner) {
122− touchIdsForItems[candidate.item.data()].append(touchInfo->id);
123− }
124− }
125− }
126−
127− const QList<QPointer<QQuickItem>> &watchers = touchInfo->watchers;
128− for (int i = 0; i < watchers.count(); ++i) {
129− if (!watchers[i].isNull()) {
130− touchIdsForItems[watchers[i].data()].append(touchInfo->id);
131− }
132− }
133−
134− return true;
135− }
136− }
137−
138− return true;
139− });
140−
141− // TODO: Consider what happens if an item calls any of TouchRegistry's public methods
142− // from the event handler callback.
143− m_inDispatchLoop = true;
144− auto it = touchIdsForItems.constBegin();
145− while (it != touchIdsForItems.constEnd()) {
146− QQuickItem *item = it.key();
147− const QList<int> &touchIds = it.value();
148− dispatchPointsToItem(event, touchIds, item);
149− ++it;
150− };
151− m_inDispatchLoop = false;
152−}
153−
154−void TouchRegistry::freeEndedTouchInfos()
155−{
156− m_touchInfoPool.forEach([&](Pool<TouchInfo>::Iterator &touchInfo) {
157− if (touchInfo->ended()) {
158− m_touchInfoPool.freeSlot(touchInfo);
159− }
160− return true;
161− });
162−}
163−
164−/*
165− Extracts the touches with the given touchIds from event and send them in a
166− UnownedTouchEvent to the given item
167− */
168−void TouchRegistry::dispatchPointsToItem(const QTouchEvent *event, const QList<int> &touchIds,
169− QQuickItem *item)
170−{
171− Qt::TouchPointStates touchPointStates = 0;
172− QList<QTouchEvent::TouchPoint> touchPoints;
173−
174− const QList<QTouchEvent::TouchPoint> &allTouchPoints = event->touchPoints();
175−
176− QTransform windowToCandidateTransform = QQuickItemPrivate::get(item)->windowToItemTransform();
177− QMatrix4x4 windowToCandidateMatrix(windowToCandidateTransform);
178−
179− for (int i = 0; i < allTouchPoints.count(); ++i) {
180− const QTouchEvent::TouchPoint &originalTouchPoint = allTouchPoints[i];
181− if (touchIds.contains(originalTouchPoint.id())) {
182− QTouchEvent::TouchPoint touchPoint = originalTouchPoint;
183−
184− translateTouchPointFromScreenToWindowCoords(touchPoint);
185−
186− // Set the point's local coordinates to that of the item
187− touchPoint.setRect(windowToCandidateTransform.mapRect(touchPoint.sceneRect()));
188− touchPoint.setStartPos(windowToCandidateTransform.map(touchPoint.startScenePos()));
189− touchPoint.setLastPos(windowToCandidateTransform.map(touchPoint.lastScenePos()));
190− touchPoint.setVelocity(windowToCandidateMatrix.mapVector(touchPoint.velocity()).toVector2D());
191−
192− touchPoints.append(touchPoint);
193− touchPointStates |= touchPoint.state();
194− }
195− }
196−
197− QTouchEvent *eventForItem = new QTouchEvent(event->type(),
198− event->device(),
199− event->modifiers(),
200− touchPointStates,
201− touchPoints);
202− eventForItem->setWindow(event->window());
203− eventForItem->setTimestamp(event->timestamp());
204− eventForItem->setTarget(event->target());
205−
206− UnownedTouchEvent unownedTouchEvent(eventForItem);
207−
208− #if TOUCHREGISTRY_DEBUG
209− UG_DEBUG << "Sending unowned" << qPrintable(touchEventToString(eventForItem))
210− << "to" << item;
211− #endif
212−
213− QCoreApplication::sendEvent(item, &unownedTouchEvent);
214−}
215−
216−void TouchRegistry::translateTouchPointFromScreenToWindowCoords(QTouchEvent::TouchPoint &touchPoint)
217−{
218− touchPoint.setScreenRect(touchPoint.sceneRect());
219− touchPoint.setStartScreenPos(touchPoint.startScenePos());
220− touchPoint.setLastScreenPos(touchPoint.lastScenePos());
221−
222− touchPoint.setSceneRect(touchPoint.rect());
223− touchPoint.setStartScenePos(touchPoint.startPos());
224− touchPoint.setLastScenePos(touchPoint.lastPos());
225−}
226−
227−bool TouchRegistry::eventFilter(QObject *watched, QEvent *event)
228−{
229− Q_UNUSED(watched);
230−
231− switch (event->type()) {
232− case QEvent::TouchBegin:
233− case QEvent::TouchUpdate:
234− case QEvent::TouchEnd:
235− case QEvent::TouchCancel:
236− update(static_cast<QTouchEvent*>(event));
237− break;
238− default:
239− // do nothing
240− break;
241− }
242−
243− // Do not filter out the event. i.e., let it be handled further as
244− // we're just monitoring events
245− return false;
246−}
247−
248−void TouchRegistry::addCandidateOwnerForTouch(int id, QQuickItem *candidate)
249−{
250− #if TOUCHREGISTRY_DEBUG
251− UG_DEBUG << "addCandidateOwnerForTouch id" << id << "candidate" << candidate;
252− #endif
253−
254− Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
255− if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
256−
257− if (touchInfo->isOwned()) {
258− qWarning("TouchRegistry: trying to add candidate owner for a touch that's already owned");
259− return;
260− }
261−
262− // TODO: Check if candidate already exists
263−
264− CandidateInfo candidateInfo;
265− candidateInfo.state = CandidateInfo::Undecided;
266− candidateInfo.item = candidate;
267− candidateInfo.inactivityTimer = new CandidateInactivityTimer(id, candidate,
268− m_timerFactory->createTimer(),
269− this);
270− connect(candidateInfo.inactivityTimer, &CandidateInactivityTimer::candidateDefaulted,
271− this, &TouchRegistry::rejectCandidateOwnerForTouch);
272−
273− touchInfo->candidates.append(candidateInfo);
274−
275− connect(candidate, &QObject::destroyed, this, [=](){ pruneNullCandidatesForTouch(id); });
276−}
277−
278−void TouchRegistry::addTouchWatcher(int touchId, QQuickItem *watcher)
279−{
280− #if TOUCHREGISTRY_DEBUG
281− UG_DEBUG << "addTouchWatcher id" << touchId << "watcher" << watcher;
282− #endif
283−
284− Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(touchId);
285− if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
286−
287− // TODO: Check if watcher already exists
288−
289− touchInfo->watchers.append(watcher);
290−}
291−
292−void TouchRegistry::removeCandidateOwnerForTouch(int id, QQuickItem *candidate)
293−{
294− #if TOUCHREGISTRY_DEBUG
295− UG_DEBUG << "removeCandidateOwnerForTouch id" << id << "candidate" << candidate;
296− #endif
297−
298− Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
299− if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
300−
301−
302− // TODO: check if the candidate is in fact the owner of the touch
303−
304− bool removed = false;
305− for (int i = 0; i < touchInfo->candidates.count() && !removed; ++i) {
306− if (touchInfo->candidates[i].item == candidate) {
307− removeCandidateOwnerForTouchByIndex(touchInfo, i);
308− removed = true;
309− }
310− }
311−}
312−
313−void TouchRegistry::pruneNullCandidatesForTouch(int touchId)
314−{
315− #if TOUCHREGISTRY_DEBUG
316− UG_DEBUG << "pruneNullCandidatesForTouch touchId" << touchId;
317− #endif
318−
319− Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(touchId);
320− if (!touchInfo) {
321− // doesn't matter as touch is already gone.
322− return;
323− }
324−
325− int i = 0;
326− while (i < touchInfo->candidates.count()) {
327− if (touchInfo->candidates[i].item.isNull()) {
328− removeCandidateOwnerForTouchByIndex(touchInfo, i);
329− } else {
330− ++i;
331− }
332− }
333−}
334−
335−void TouchRegistry::removeCandidateOwnerForTouchByIndex(Pool<TouchRegistry::TouchInfo>::Iterator &touchInfo,
336− int candidateIndex)
337−{
338− // TODO: check if the candidate is in fact the owner of the touch
339−
340− Q_ASSERT(candidateIndex < touchInfo->candidates.count());
341−
342− if (candidateIndex == 0 && touchInfo->candidates[candidateIndex].state != CandidateInfo::Undecided) {
343− qCritical("TouchRegistry: touch owner is being removed.");
344− }
345− removeCandidateHelper(touchInfo, candidateIndex);
346−
347− if (candidateIndex == 0) {
348− // the top candidate has been removed. if the new top candidate
349− // wants the touch let him know he's now the owner.
350− if (touchInfo->isOwned()) {
351− touchInfo->notifyCandidatesOfOwnershipResolution();
352− }
353− }
354−
355− if (!m_inDispatchLoop && touchInfo->ended()) {
356− m_touchInfoPool.freeSlot(touchInfo);
357− }
358−}
359−
360−void TouchRegistry::requestTouchOwnership(int id, QQuickItem *candidate)
361−{
362− Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
363− if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
364−
365− Q_ASSERT(!touchInfo->isOwned());
366−
367− int candidateIndex = -1;
368− for (int i = 0; i < touchInfo->candidates.count(); ++i) {
369− CandidateInfo &candidateInfo = touchInfo->candidates[i];
370− if (candidateInfo.item == candidate) {
371− candidateInfo.state = CandidateInfo::Requested;
372− delete candidateInfo.inactivityTimer;
373− candidateInfo.inactivityTimer = nullptr;
374− candidateIndex = i;
375− break;
376− }
377− }
378− #if TOUCHREGISTRY_DEBUG
379− UG_DEBUG << "requestTouchOwnership id " << id << "candidate" << candidate << "index: " << candidateIndex;
380− #endif
381−
382− // add it as a candidate if not present yet
383− if (candidateIndex < 0) {
384− CandidateInfo candidateInfo;
385− candidateInfo.state = CandidateInfo::InterimOwner;
386− candidateInfo.item = candidate;
387− candidateInfo.inactivityTimer = nullptr;
388− touchInfo->candidates.append(candidateInfo);
389− // it's the last one
390− candidateIndex = touchInfo->candidates.count() - 1;
391− connect(candidate, &QObject::destroyed, this, [=](){ pruneNullCandidatesForTouch(id); });
392− }
393−
394− // If it's the top candidate it means it's now the owner. Let
395− // it know about it.
396− if (candidateIndex == 0) {
397− touchInfo->notifyCandidatesOfOwnershipResolution();
398− }
399−}
400−
401−Pool<TouchRegistry::TouchInfo>::Iterator TouchRegistry::findTouchInfo(int id)
402−{
403− Pool<TouchInfo>::Iterator touchInfo;
404−
405− m_touchInfoPool.forEach([&](Pool<TouchInfo>::Iterator &someTouchInfo) -> bool {
406− if (someTouchInfo->id == id) {
407− touchInfo = someTouchInfo;
408− return false;
409− } else {
410− return true;
411− }
412− });
413−
414− return touchInfo;
415−}
416−
417−
418−void TouchRegistry::rejectCandidateOwnerForTouch(int id, QQuickItem *candidate)
419−{
420− // NB: It's technically possible that candidate is a dangling pointer at this point.
421− // Although that would most likely be due to a bug in our code.
422− // In any case, only dereference it after it's confirmed that it indeed exists.
423−
424− #if TOUCHREGISTRY_DEBUG
425− UG_DEBUG << "rejectCandidateOwnerForTouch id" << id << "candidate" << (void*)candidate;
426− #endif
427−
428− Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
429− if (!touchInfo) {
430− #if TOUCHREGISTRY_DEBUG
431− UG_DEBUG << "Failed to find TouchInfo for id" << id;
432− #endif
433− return;
434− }
435−
436− int rejectedCandidateIndex = -1;
437−
438− // Check if the given candidate is valid and still undecided
439− for (int i = 0; i < touchInfo->candidates.count() && rejectedCandidateIndex == -1; ++i) {
440− CandidateInfo &candidateInfo = touchInfo->candidates[i];
441− if (candidateInfo.item == candidate) {
442− Q_ASSERT(i > 0 || candidateInfo.state == CandidateInfo::Undecided);
443− if (i == 0 && candidateInfo.state != CandidateInfo::Undecided) {
444− qCritical() << "TouchRegistry: Can't reject item (" << (void*)candidate
445− << ") as it already owns touch" << id;
446− return;
447− } else {
448− // we found the guy and it's all fine.
449− rejectedCandidateIndex = i;
450− }
451− }
452− }
453−
454− // If we reached this point it's because the given candidate exists and is indeed undecided.
455−
456− Q_ASSERT(rejectedCandidateIndex >= 0 && rejectedCandidateIndex < touchInfo->candidates.size());
457−
458− {
459− TouchOwnershipEvent lostOwnershipEvent(id, false /*gained*/);
460− QCoreApplication::sendEvent(candidate, &lostOwnershipEvent);
461− }
462−
463− removeCandidateHelper(touchInfo, rejectedCandidateIndex);
464−
465− if (rejectedCandidateIndex == 0) {
466− // the top candidate has been removed. if the new top candidate
467− // wants the touch let him know he's now the owner.
468− if (touchInfo->isOwned()) {
469− touchInfo->notifyCandidatesOfOwnershipResolution();
470− }
471− }
472−}
473−
474−void TouchRegistry::removeCandidateHelper(Pool<TouchInfo>::Iterator &touchInfo, int candidateIndex)
475−{
476− {
477− CandidateInfo &candidateInfo = touchInfo->candidates[candidateIndex];
478−
479− delete candidateInfo.inactivityTimer;
480− candidateInfo.inactivityTimer = nullptr;
481−
482− if (candidateInfo.item) {
483− disconnect(candidateInfo.item.data(), nullptr, this, nullptr);
484− }
485− }
486− touchInfo->candidates.removeAt(candidateIndex);
487−}
488−
489−////////////////////////////////////// TouchRegistry::TouchInfo ////////////////////////////////////
490−
491−TouchRegistry::TouchInfo::TouchInfo(int id)
492−{
493− init(id);
494−}
495−
496−void TouchRegistry::TouchInfo::reset()
497−{
498− id = -1;
499−
500− for (int i = 0; i < candidates.count(); ++i) {
501− CandidateInfo &candidate = candidates[i];
502− delete candidate.inactivityTimer;
503− candidate.inactivityTimer.clear(); // shoundn't be needed but anyway...
504− }
505−}
506−
507−void TouchRegistry::TouchInfo::init(int id)
508−{
509− this->id = id;
510− physicallyEnded = false;
511− candidates.clear();
512− watchers.clear();
513−}
514−
515−bool TouchRegistry::TouchInfo::isOwned() const
516−{
517− return !candidates.isEmpty() && candidates.first().state != CandidateInfo::Undecided;
518−}
519−
520−bool TouchRegistry::TouchInfo::ended() const
521−{
522− Q_ASSERT(isValid());
523− return physicallyEnded && (isOwned() || candidates.isEmpty());
524−}
525−
526−void TouchRegistry::TouchInfo::notifyCandidatesOfOwnershipResolution()
527−{
528− Q_ASSERT(isOwned());
529−
530− #if TOUCHREGISTRY_DEBUG
531− UG_DEBUG << "sending TouchOwnershipEvent(id =" << id
532− << " gained) to candidate" << candidates[0].item;
533− #endif
534−
535− // need to take a copy of the item list in case
536− // we call back in to remove candidate during the lost ownership event.
537− QList<QPointer<QQuickItem>> items;
538− Q_FOREACH(const CandidateInfo& info, candidates) {
539− items << info.item;
540− }
541−
542− TouchOwnershipEvent gainedOwnershipEvent(id, true /*gained*/);
543− QCoreApplication::sendEvent(items[0], &gainedOwnershipEvent);
544−
545− TouchOwnershipEvent lostOwnershipEvent(id, false /*gained*/);
546− for (int i = 1; i < items.count(); ++i) {
547− #if TOUCHREGISTRY_DEBUG
548− UG_DEBUG << "sending TouchOwnershipEvent(id =" << id << " lost) to candidate"
549− << items[i];
550− #endif
551− QCoreApplication::sendEvent(items[i], &lostOwnershipEvent);
552− }
553−}
libs/UbuntuGestures/TouchRegistry.hdeleted−201
@@ -1,201 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef UNITY_TOUCHREGISTRY_H
18−#define UNITY_TOUCHREGISTRY_H
19−
20−#include <QQuickItem>
21−#include <QObject>
22−#include <QPointer>
23−#include <QTouchEvent>
24−#include <QVector>
25−
26−#include "UbuntuGesturesGlobal.h"
27−#include "CandidateInactivityTimer.h"
28−#include "Timer.h"
29−#include "Pool.h"
30−
31−namespace UbuntuGestures {
32− class AbstractTimerFactory;
33−}
34−
35−/*
36− Where the ownership of touches is registered.
37−
38− Singleton used for adding a touch point ownership model analogous to the one
39− described in the XInput 2.2 protocol[1] on top of the existing input dispatch logic in QQuickWindow.
40−
41− It provides a much more flexible and powerful way of dealing with pointer ownership than the existing
42− mechanisms in Qt. Namely QQuickItem::grabTouchPoints, QuickItem::keepTouchGrab,
43− QQuickItem::setFiltersChildMouseEvents, QQuickItem::ungrabTouchPoints and QQuickItem::touchUngrabEvent.
44−
45− Usage:
46−
47− 1- An item receives a a new touch point. If he's not sure whether he wants it yet, he calls:
48− TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, this);
49− touchEvent->ignore();
50− Ignoring the event is crucial so that it can be seen by other interested parties, which will
51− behave similarly.
52−
53− 2- That item will then start receiving UnownedTouchEvents for that touch from step 1. Once he's
54− made a decision he calls either:
55− TouchRegistry::instance()->requestTouchOwnership(touchId, this);
56− If he wants the touch point or:
57− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, this);
58−  if he does not want it.
59−
60− Candidates are put in a priority queue. The first one to call addCandidateOwnerForTouch() will
61− take precedence over the others for receiving ownership over the touch point (from now on called
62− simply top-candidate).
63−
64− If the top-candidate calls requestTouchOwnership() he will immediately receive a
65− TouchOwnershipEvent(gained=true) for that touch point. He can then safely call
66− QQuickItem::grabTouchPoints to actually get the owned touch points. The other candidates
67− will receive TouchOwnershipEvent(gained=false) and will no longer receive UnownedTouchEvents
68− for that touch point. They will have to undo whatever action they were performing with that
69− touch point.
70−
71− But if the top-candidate calls removeCandidateOwnerForTouch() instead, he's popped from the
72− candidacy queue and ownership is given to the new top-most candidate if he has already
73− made his decision, that is.
74−
75− The TouchRegistry cannot enforce the results of this pointer ownership negotiation (i.e.,
76− who gets to grab the touch points) as that would clash with QQuickWindow's input event
77− dispatching logic. The candidates have to respect the decision and grab the touch points
78− themselves.
79−
80− If an item wants ownership over touches as soon as he receives the TouchBegin for them, his step 1
81− would be instead:
82− TouchRegistry::instance()->requestTouchOwnership(touchId, this);
83− touchEvent->accept();
84− He won't get any UnownedTouchEvent for that touch as he is already the interim owner (ie, QQuickWindow
85− will keep sending touch updates to him already). Eventually he will be notified once ownership has
86− been granted to him (from TouchRegistry perspective), from which point onwards he could safely assume
87− other TouchRegistry users wouldn't snatch this touch away from him.
88−
89− Items oblivious to TouchRegistry will lose their touch points without warning, just like in plain Qt.
90−
91− [1] - http://www.x.org/releases/X11R7.7/doc/inputproto/XI2proto.txt (see multitouch-ownership)
92− */
93−class UBUNTUGESTURES_EXPORT TouchRegistry : public QObject
94−{
95− Q_OBJECT
96−public:
97− virtual ~TouchRegistry();
98−
99− // Returns a pointer to the application's TouchRegistry instance.
100− static TouchRegistry *instance();
101−
102− void update(const QTouchEvent *event);
103−
104− // Calls update() if the given event is a QTouchEvent
105− bool eventFilter(QObject *watched, QEvent *event) override;
106−
107− // An item that might later request ownership over the given touch point.
108− // He will be kept informed about that touch point through UnownedTouchEvents
109− // All candidates must eventually decide whether they want to own the touch point
110− // or not. That decision is informed through requestTouchOwnership() or
111− // removeCandidateOwnerForTouch()
112− void addCandidateOwnerForTouch(int id, QQuickItem *candidate);
113−
114− // The same as rejecting ownership of a touch
115− void removeCandidateOwnerForTouch(int id, QQuickItem *candidate);
116−
117− // The candidate object wants to be the owner of the touch with the given id.
118− // If he's currently the oldest/top-most candidate, he will get an ownership
119− // event immediately. If not, he will get ownership if (or once) he becomes the
120− // top-most candidate.
121− void requestTouchOwnership(int id, QQuickItem *candidate);
122−
123− // An item that has no interest (effective or potential) in owning a touch point
124− // but would nonetheless like to be kept up-to-date on its state.
125− void addTouchWatcher(int touchId, QQuickItem *watcherItem);
126−
127− // Useful for tests, where you should use fake timers
128− void setTimerFactory(UbuntuGestures::AbstractTimerFactory *timerFactory);
129−
130−private Q_SLOTS:
131− void rejectCandidateOwnerForTouch(int id, QQuickItem *candidate);
132−
133−private:
134− // Only instance() can cronstruct one
135− TouchRegistry(QObject *parent = nullptr);
136−
137− class CandidateInfo {
138− public:
139− enum {
140− // A candidate owner that doesn't yet know for sure whether he wants the touch point
141− // (gesture recognition is stilll going on)
142− Undecided = 0,
143− // A candidate owner that wants the touch but hasn't been granted it yet,
144− // most likely because there's an undecided candidate with higher priority
145− Requested = 1,
146− // An item that is the interim owner of the touch, receiving QTouchEvents of it
147− // from QQuickWindow. Ie, it's the actual touch owner from Qt's point of view.
148− // It wants to keep its touch ownership but hasn't been granted it by TouchRegistry
149− // yet because of undecided candidates higher up.
150− InterimOwner = 2
151− } state;
152− QPointer<QQuickItem> item;
153− QPointer<UbuntuGestures::CandidateInactivityTimer> inactivityTimer;
154− };
155−
156− class TouchInfo {
157− public:
158− TouchInfo() : id(-1) {}
159− TouchInfo(int id);
160− bool isValid() const { return id >= 0; }
161− void reset();
162− void init(int id);
163− int id;
164− bool physicallyEnded;
165− bool isOwned() const;
166− bool ended() const;
167− void notifyCandidatesOfOwnershipResolution();
168−
169− // TODO optimize storage (s/QList/Pool)
170− QList<CandidateInfo> candidates;
171− QList<QPointer<QQuickItem>> watchers;
172− };
173−
174− void pruneNullCandidatesForTouch(int touchId);
175− void removeCandidateOwnerForTouchByIndex(Pool<TouchInfo>::Iterator &touchInfo, int candidateIndex);
176− void removeCandidateHelper(Pool<TouchInfo>::Iterator &touchInfo, int candidateIndex);
177−
178− Pool<TouchInfo>::Iterator findTouchInfo(int id);
179−
180− void deliverTouchUpdatesToUndecidedCandidatesAndWatchers(const QTouchEvent *event);
181−
182− static void translateTouchPointFromScreenToWindowCoords(QTouchEvent::TouchPoint &touchPoint);
183−
184− static void dispatchPointsToItem(const QTouchEvent *event, const QList<int> &touchIds,
185− QQuickItem *item);
186− void freeEndedTouchInfos();
187−
188− Pool<TouchInfo> m_touchInfoPool;
189−
190− // the singleton instance
191− static TouchRegistry *m_instance;
192−
193− bool m_inDispatchLoop;
194−
195− UbuntuGestures::AbstractTimerFactory *m_timerFactory;
196−
197− friend class tst_TouchRegistry;
198− friend class tst_DirectionalDragArea;
199−};
200−
201−#endif // UNITY_TOUCHREGISTRY_H
libs/UbuntuGestures/UnownedTouchEvent.hdeleted−45
@@ -1,45 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef UBUNTU_UNOWNEDTOUCHEVENT_H
18−#define UBUNTU_UNOWNEDTOUCHEVENT_H
19−
20−#include <QTouchEvent>
21−#include <QScopedPointer>
22−#include "UbuntuGesturesGlobal.h"
23−
24−/*
25− A touch event with touch points that do not belong the item receiving it.
26−
27− See TouchRegistry::addCandidateOwnerForTouch and TouchRegistry::addTouchWatcher
28− */
29−class UBUNTUGESTURES_EXPORT UnownedTouchEvent : public QEvent
30−{
31−public:
32− UnownedTouchEvent(QTouchEvent *touchEvent);
33− static Type unownedTouchEventType();
34−
35− // TODO: It might be cleaner to store the information directly in UnownedTouchEvent
36− // instead of carrying around a synthesized QTouchEvent. But the latter option
37− // is very convenient.
38− QTouchEvent *touchEvent();
39−
40−private:
41− static Type m_unownedTouchEventType;
42− QScopedPointer<QTouchEvent> m_touchEvent;
43−};
44−
45−#endif // UBUNTU_UNOWNEDTOUCHEVENT_H
plugins/AccountsService/AccountsService.cpp+24−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013, 2015 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -22,6 +22,8 @@
2222#include <QStringList>
2323#include <QDebug>
2424
25+#include <glib.h>
26+
2527#define IFACE_ACCOUNTS_USER QStringLiteral("org.freedesktop.Accounts.User")
2628#define IFACE_LOCATION_HERE QStringLiteral("com.ubuntu.location.providers.here.AccountsService")
2729#define IFACE_UBUNTU_INPUT QStringLiteral("com.ubuntu.AccountsService.Input")
@@ -34,8 +36,10 @@
3436#define PROP_DEMO_EDGES QStringLiteral("demo-edges")
3537#define PROP_DEMO_EDGES_COMPLETED QStringLiteral("DemoEdgesCompleted")
3638#define PROP_EMAIL QStringLiteral("Email")
39+#define PROP_ENABLE_FINGERPRINT_IDENTIFICATION QStringLiteral("EnableFingerprintIdentification")
3740#define PROP_ENABLE_INDICATORS_WHILE_LOCKED QStringLiteral("EnableIndicatorsWhileLocked")
3841#define PROP_ENABLE_LAUNCHER_WHILE_LOCKED QStringLiteral("EnableLauncherWhileLocked")
42+#define PROP_FAILED_FINGERPRINT_LOGINS QStringLiteral("FailedFingerprintLogins")
3943#define PROP_FAILED_LOGINS QStringLiteral("FailedLogins")
4044#define PROP_INPUT_SOURCES QStringLiteral("InputSources")
4145#define PROP_LICENSE_ACCEPTED QStringLiteral("LicenseAccepted")
@@ -91,12 +95,14 @@ AccountsService::AccountsService(QObject* parent, const QString &user)
9195 registerProperty(IFACE_ACCOUNTS_USER, PROP_INPUT_SOURCES, QStringLiteral("keymapsChanged"));
9296 registerProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED, QStringLiteral("hereEnabledChanged"));
9397 registerProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH, QStringLiteral("hereLicensePathChanged"));
98+ registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_FINGERPRINT_IDENTIFICATION, QStringLiteral("enableFingerprintIdentificationChanged"));
9499 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED, QStringLiteral("enableLauncherWhileLockedChanged"));
95100 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED, QStringLiteral("enableIndicatorsWhileLockedChanged"));
96101 registerProperty(IFACE_UBUNTU_SECURITY, PROP_PASSWORD_DISPLAY_HINT, QStringLiteral("passwordDisplayHintChanged"));
97102 registerProperty(IFACE_UBUNTU_SECURITY_OLD, PROP_STATS_WELCOME_SCREEN, QStringLiteral("statsWelcomeScreenChanged"));
98103 registerProperty(IFACE_UNITY, PROP_DEMO_EDGES, QStringLiteral("demoEdgesChanged"));
99104 registerProperty(IFACE_UNITY, PROP_DEMO_EDGES_COMPLETED, QStringLiteral("demoEdgesCompletedChanged"));
105+ registerProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_FINGERPRINT_LOGINS, QStringLiteral("failedFingerprintLoginsChanged"));
100106 registerProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS, QStringLiteral("failedLoginsChanged"));
101107
102108 registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_CURSOR_SPEED,
@@ -126,7 +132,7 @@ AccountsService::AccountsService(QObject* parent, const QString &user)
126132 registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_TWO_FINGER_SCROLL,
127133 m_unityInput, QStringLiteral("setTouchpadTwoFingerScroll"));
128134
129− setUser(!user.isEmpty() ? user : QString::fromUtf8(qgetenv("USER")));
135+ setUser(!user.isEmpty() ? user : QString::fromUtf8(g_get_user_name()));
130136}
131137
132138QString AccountsService::user() const
@@ -174,6 +180,12 @@ void AccountsService::markDemoEdgeCompleted(const QString &edge)
174180 }
175181}
176182
183+bool AccountsService::enableFingerprintIdentification() const
184+{
185+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_FINGERPRINT_IDENTIFICATION);
186+ return value.toBool();
187+}
188+
177189bool AccountsService::enableLauncherWhileLocked() const
178190{
179191 auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED);
@@ -272,6 +284,16 @@ QStringList AccountsService::keymaps() const
272284 return {QStringLiteral("us")};
273285}
274286
287+uint AccountsService::failedFingerprintLogins() const
288+{
289+ return getProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_FINGERPRINT_LOGINS).toUInt();
290+}
291+
292+void AccountsService::setFailedFingerprintLogins(uint failedFingerprintLogins)
293+{
294+ setProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_FINGERPRINT_LOGINS, failedFingerprintLogins);
295+}
296+
275297uint AccountsService::failedLogins() const
276298{
277299 return getProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS).toUInt();
plugins/AccountsService/AccountsService.h+13−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013, 2015 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -41,6 +41,9 @@ class AccountsService: public QObject
4141 Q_PROPERTY (QStringList demoEdgesCompleted
4242 READ demoEdgesCompleted
4343 NOTIFY demoEdgesCompletedChanged)
44+ Q_PROPERTY (bool enableFingerprintIdentification
45+ READ enableFingerprintIdentification
46+ NOTIFY enableFingerprintIdentificationChanged)
4447 Q_PROPERTY (bool enableLauncherWhileLocked
4548 READ enableLauncherWhileLocked
4649 NOTIFY enableLauncherWhileLockedChanged)
@@ -60,6 +63,10 @@ class AccountsService: public QObject
6063 READ failedLogins
6164 WRITE setFailedLogins
6265 NOTIFY failedLoginsChanged)
66+ Q_PROPERTY (uint failedFingerprintLogins
67+ READ failedFingerprintLogins
68+ WRITE setFailedFingerprintLogins
69+ NOTIFY failedFingerprintLoginsChanged)
6370 Q_PROPERTY(bool hereEnabled
6471 READ hereEnabled
6572 WRITE setHereEnabled
@@ -91,6 +98,7 @@ public:
9198 void setDemoEdges(bool demoEdges);
9299 QStringList demoEdgesCompleted() const;
93100 Q_INVOKABLE void markDemoEdgeCompleted(const QString &edge);
101+ bool enableFingerprintIdentification() const;
94102 bool enableLauncherWhileLocked() const;
95103 bool enableIndicatorsWhileLocked() const;
96104 QString backgroundFile() const;
@@ -98,6 +106,8 @@ public:
98106 PasswordDisplayHint passwordDisplayHint() const;
99107 uint failedLogins() const;
100108 void setFailedLogins(uint failedLogins);
109+ uint failedFingerprintLogins() const;
110+ void setFailedFingerprintLogins(uint failedFingerprintLogins);
101111 bool hereEnabled() const;
102112 void setHereEnabled(bool enabled);
103113 QString hereLicensePath() const;
@@ -112,12 +122,14 @@ Q_SIGNALS:
112122 void userChanged();
113123 void demoEdgesChanged();
114124 void demoEdgesCompletedChanged();
125+ void enableFingerprintIdentificationChanged();
115126 void enableLauncherWhileLockedChanged();
116127 void enableIndicatorsWhileLockedChanged();
117128 void backgroundFileChanged();
118129 void statsWelcomeScreenChanged();
119130 void passwordDisplayHintChanged();
120131 void failedLoginsChanged();
132+ void failedFingerprintLoginsChanged();
121133 void hereEnabledChanged();
122134 void hereLicensePathChanged();
123135 void realNameChanged();
plugins/AccountsService/AccountsService.qmltypesdeleted−41
@@ -1,41 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable AccountsService 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "AccountsService"
12− prototype: "QObject"
13− exports: ["AccountsService/AccountsService 0.1"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Enum {
18− name: "PasswordDisplayHint"
19− values: {
20− "Keyboard": 0,
21− "Numeric": 1
22− }
23− }
24− Property { name: "user"; type: "string" }
25− Property { name: "demoEdges"; type: "bool" }
26− Property { name: "demoEdgesCompleted"; type: "QStringList"; isReadonly: true }
27− Property { name: "enableLauncherWhileLocked"; type: "bool"; isReadonly: true }
28− Property { name: "enableIndicatorsWhileLocked"; type: "bool"; isReadonly: true }
29− Property { name: "backgroundFile"; type: "string"; isReadonly: true }
30− Property { name: "statsWelcomeScreen"; type: "bool"; isReadonly: true }
31− Property { name: "passwordDisplayHint"; type: "PasswordDisplayHint"; isReadonly: true }
32− Property { name: "failedLogins"; type: "uint" }
33− Property { name: "hereEnabled"; type: "bool" }
34− Property { name: "hereLicensePath"; type: "string"; isReadonly: true }
35− Property { name: "hereLicensePathValid"; type: "bool"; isReadonly: true }
36− Method {
37− name: "markDemoEdgeCompleted"
38− Parameter { name: "edge"; type: "string" }
39− }
40− }
41−}
plugins/AccountsService/CMakeLists.txt+5
@@ -1,4 +1,5 @@
11add_definitions(-DSM_BUSNAME=systemBus)
2+include_directories(${GLIB_INCLUDE_DIRS})
23
34add_library(AccountsService-qml MODULE
45 AccountsService.cpp
@@ -8,6 +9,10 @@ add_library(AccountsService-qml MODULE
89
910qt5_use_modules(AccountsService-qml DBus Qml)
1011
12+target_link_libraries(AccountsService-qml
13+ ${GLIB_LIBRARIES}
14+ )
15+
1116add_unity8_plugin(AccountsService 0.1 AccountsService TARGETS AccountsService-qml)
1217
1318set(DBUS_IFACE_DIR "${CMAKE_INSTALL_PREFIX}/share/dbus-1/interfaces")
plugins/AccountsService/com.canonical.unity.AccountsService.xml+4
@@ -47,5 +47,9 @@
4747 <annotation name="org.freedesktop.Accounts.DefaultValue" value="0"/>
4848 </property>
4949
50+ <property name="FailedFingerprintLogins" type="u" access="readwrite">
51+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="0"/>
52+ </property>
53+
5054 </interface>
5155</node>
plugins/CMakeLists.txt+3−2
@@ -15,14 +15,15 @@ add_subdirectory(AccountsService)
1515add_subdirectory(Cursor)
1616add_subdirectory(GlobalShortcut)
1717add_subdirectory(Greeter)
18−add_subdirectory(IntegratedLightDM)
18+add_subdirectory(LightDM)
1919add_subdirectory(Lights)
2020add_subdirectory(Dash)
2121add_subdirectory(Powerd)
22+add_subdirectory(ScreenshotDirectory)
2223add_subdirectory(SessionBroadcast)
23−add_subdirectory(ScreenGrabber)
2424add_subdirectory(Ubuntu)
2525add_subdirectory(UInput)
2626add_subdirectory(Unity)
2727add_subdirectory(Utils)
28+add_subdirectory(WindowManager)
2829add_subdirectory(Wizard)
plugins/Cursor/CMakeLists.txt+6−1
@@ -3,13 +3,18 @@ add_subdirectory(3rd_party)
33include_directories(
44 ${CMAKE_CURRENT_SOURCE_DIR}
55 ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/xcursor
6+)
7+
8+include_directories(
9+ SYSTEM
610 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
711)
812
913set(QMLPLUGIN_SRC
1014 plugin.cpp
11− MousePointer.cpp
15+ CursorImageInfo.cpp
1216 CursorImageProvider.cpp
17+ MousePointer.cpp
1318 # We need to run moc on this header
1419 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirMousePointerInterface.h
1520 )
plugins/Cursor/Cursor.qml+37−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -15,14 +15,45 @@
1515 */
1616
1717import QtQuick 2.4
18−import Cursor 1.0 // For MousePointer
18+import Cursor 1.1
19+import Powerd 0.1
1920
2021MousePointer {
2122 id: mousePointer
2223
23− Image {
24− x: -mousePointer.hotspotX
25− y: -mousePointer.hotspotY
26− source: "image://cursor/" + mousePointer.themeName + "/" + mousePointer.cursorName
24+ CursorImageInfo {
25+ id: imageInfo
26+ themeName: mousePointer.themeName
27+ cursorName: mousePointer.cursorName
28+ }
29+
30+ Loader {
31+ active: mousePointer.visible && imageInfo.frameCount > 1
32+ sourceComponent: AnimatedSprite {
33+ x: -imageInfo.hotspot.x
34+ y: -imageInfo.hotspot.y
35+ source: "image://cursor/" + mousePointer.themeName + "/" + mousePointer.cursorName
36+
37+ interpolate: false
38+
39+ width: imageInfo.frameWidth
40+ height: imageInfo.frameHeight
41+
42+ frameCount: imageInfo.frameCount
43+ frameDuration: imageInfo.frameDuration
44+ frameWidth: imageInfo.frameWidth
45+ frameHeight: imageInfo.frameHeight
46+
47+ running: Powerd.status === Powerd.On
48+ }
49+ }
50+
51+ Loader {
52+ active: mousePointer.visible && imageInfo.frameCount === 1
53+ sourceComponent: Image {
54+ x: -imageInfo.hotspot.x
55+ y: -imageInfo.hotspot.y
56+ source: "image://cursor/" + mousePointer.themeName + "/" + mousePointer.cursorName
57+ }
2758 }
2859}
plugins/Cursor/Cursor.qmltypesdeleted−78
@@ -1,78 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Cursor 1.0 plugins'
8−
9−Module {
10− Component {
11− name: "MirMousePointerInterface"
12− defaultProperty: "data"
13− prototype: "QQuickItem"
14− Property { name: "cursorName"; type: "string"; isReadonly: true }
15− Property { name: "themeName"; type: "string"; isReadonly: true }
16− Property { name: "hotspotX"; type: "double"; isReadonly: true }
17− Property { name: "hotspotY"; type: "double"; isReadonly: true }
18− Signal {
19− name: "cursorNameChanged"
20− Parameter { name: "name"; type: "string" }
21− }
22− Signal {
23− name: "themeNameChanged"
24− Parameter { name: "name"; type: "string" }
25− }
26− Signal {
27− name: "hotspotXChanged"
28− Parameter { name: "value"; type: "double" }
29− }
30− Signal {
31− name: "hotspotYChanged"
32− Parameter { name: "value"; type: "double" }
33− }
34− Method {
35− name: "handleMouseEvent"
36− Parameter { name: "timestamp"; type: "ulong" }
37− Parameter { name: "movement"; type: "QPointF" }
38− Parameter { name: "buttons"; type: "Qt::MouseButtons" }
39− Parameter { name: "modifiers"; type: "Qt::KeyboardModifiers" }
40− }
41− Method {
42− name: "handleWheelEvent"
43− Parameter { name: "timestamp"; type: "ulong" }
44− Parameter { name: "angleDelta"; type: "QPoint" }
45− Parameter { name: "modifiers"; type: "Qt::KeyboardModifiers" }
46− }
47− }
48− Component {
49− name: "MousePointer"
50− defaultProperty: "data"
51− prototype: "MirMousePointerInterface"
52− exports: ["Cursor/MousePointer 1.0"]
53− exportMetaObjectRevisions: [0]
54− Signal {
55− name: "pushedLeftBoundary"
56− Parameter { name: "amount"; type: "double" }
57− Parameter { name: "buttons"; type: "Qt::MouseButtons" }
58− }
59− Signal {
60− name: "pushedRightBoundary"
61− Parameter { name: "amount"; type: "double" }
62− Parameter { name: "buttons"; type: "Qt::MouseButtons" }
63− }
64− Method {
65− name: "handleMouseEvent"
66− Parameter { name: "timestamp"; type: "ulong" }
67− Parameter { name: "movement"; type: "QPointF" }
68− Parameter { name: "buttons"; type: "Qt::MouseButtons" }
69− Parameter { name: "modifiers"; type: "Qt::KeyboardModifiers" }
70− }
71− Method {
72− name: "handleWheelEvent"
73− Parameter { name: "timestamp"; type: "ulong" }
74− Parameter { name: "angleDelta"; type: "QPoint" }
75− Parameter { name: "modifiers"; type: "Qt::KeyboardModifiers" }
76− }
77− }
78−}
plugins/Cursor/CursorImageInfo.cppnew file+96
@@ -0,0 +1,96 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "CursorImageInfo.h"
18+
19+CursorImageInfo::CursorImageInfo(QObject *parent)
20+ : QObject(parent)
21+{
22+}
23+
24+void CursorImageInfo::setCursorName(const QString &cursorName)
25+{
26+ if (cursorName != m_cursorName) {
27+ m_cursorName = cursorName;
28+ update();
29+ Q_EMIT cursorNameChanged();
30+ }
31+}
32+
33+void CursorImageInfo::setThemeName(const QString &themeName)
34+{
35+ if (m_themeName != themeName) {
36+ m_themeName = themeName;
37+ update();
38+ Q_EMIT themeNameChanged();
39+ }
40+}
41+
42+void CursorImageInfo::update()
43+{
44+ m_cursorImage = CursorImageProvider::instance()->fetchCursor(m_themeName, m_cursorName);
45+
46+ Q_EMIT hotspotChanged();
47+ Q_EMIT frameWidthChanged();
48+ Q_EMIT frameHeightChanged();
49+ Q_EMIT frameCountChanged();
50+ Q_EMIT frameDurationChanged();
51+}
52+
53+QPoint CursorImageInfo::hotspot() const
54+{
55+ if (m_cursorImage) {
56+ return m_cursorImage->hotspot;
57+ } else {
58+ return QPoint();
59+ }
60+}
61+
62+qreal CursorImageInfo::frameWidth() const
63+{
64+ if (m_cursorImage) {
65+ return m_cursorImage->frameWidth;
66+ } else {
67+ return 0;
68+ }
69+}
70+
71+qreal CursorImageInfo::frameHeight() const
72+{
73+ if (m_cursorImage) {
74+ return m_cursorImage->frameHeight;
75+ } else {
76+ return 0;
77+ }
78+}
79+
80+int CursorImageInfo::frameCount() const
81+{
82+ if (m_cursorImage) {
83+ return m_cursorImage->frameCount;
84+ } else {
85+ return 0;
86+ }
87+}
88+
89+int CursorImageInfo::frameDuration() const
90+{
91+ if (m_cursorImage) {
92+ return m_cursorImage->frameDuration;
93+ } else {
94+ return 0;
95+ }
96+}
plugins/Cursor/CursorImageInfo.hnew file+72
@@ -0,0 +1,72 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef CURSOR_IMAGE_INFO_H
18+#define CURSOR_IMAGE_INFO_H
19+
20+#include "CursorImageProvider.h"
21+
22+#include <QObject>
23+#include <QString>
24+
25+class CursorImageInfo : public QObject
26+{
27+ Q_OBJECT
28+
29+ Q_PROPERTY(QString themeName READ themeName WRITE setThemeName NOTIFY themeNameChanged)
30+ Q_PROPERTY(QString cursorName READ cursorName WRITE setCursorName NOTIFY cursorNameChanged)
31+
32+ Q_PROPERTY(QPoint hotspot READ hotspot NOTIFY hotspotChanged)
33+ Q_PROPERTY(qreal frameWidth READ frameWidth NOTIFY frameWidthChanged)
34+ Q_PROPERTY(qreal frameHeight READ frameHeight NOTIFY frameHeightChanged)
35+ Q_PROPERTY(int frameCount READ frameCount NOTIFY frameCountChanged)
36+ Q_PROPERTY(int frameDuration READ frameDuration NOTIFY frameDurationChanged)
37+
38+public:
39+ CursorImageInfo(QObject *parent = nullptr);
40+
41+ QString themeName() const { return m_themeName; }
42+ void setThemeName(const QString &);
43+
44+ QString cursorName() const { return m_cursorName; }
45+ void setCursorName(const QString &);
46+
47+ QPoint hotspot() const;
48+ qreal frameWidth() const;
49+ qreal frameHeight() const;
50+ int frameCount() const;
51+ int frameDuration() const;
52+
53+Q_SIGNALS:
54+ void themeNameChanged();
55+ void cursorNameChanged();
56+ void hotspotChanged();
57+ void frameWidthChanged();
58+ void frameHeightChanged();
59+ void frameCountChanged();
60+ void frameDurationChanged();
61+
62+private Q_SLOTS:
63+ void update();
64+
65+private:
66+ QString m_themeName;
67+ QString m_cursorName;
68+
69+ CursorImage *m_cursorImage{nullptr};
70+};
71+
72+#endif // CURSOR_IMAGE_INFO_H
plugins/Cursor/CursorImageProvider.cpp+51−22
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software: you can redistribute it and/or modify it under
55 * the terms of the GNU Lesser General Public License version 3, as published by
@@ -46,6 +46,9 @@ BuiltInCursorImage::BuiltInCursorImage()
4646 qimage.fill(Qt::transparent);
4747 QPainter imagePainter(&qimage);
4848
49+ frameWidth = qimage.width();
50+ frameHeight = qimage.height();
51+
4952 QSvgRenderer *svgRenderer = new QSvgRenderer(QByteArray(svgString));
5053 svgRenderer->render(&imagePainter);
5154 delete svgRenderer;
@@ -59,6 +62,8 @@ BlankCursorImage::BlankCursorImage()
5962{
6063 qimage = QImage(1, 1, QImage::Format_ARGB32);
6164 qimage.fill(Qt::transparent);
65+ frameWidth = qimage.width();
66+ frameHeight = qimage.height();
6267}
6368
6469/////
@@ -69,40 +74,74 @@ CustomCursorImage::CustomCursorImage(const QCursor &cursor)
6974{
7075 qimage = cursor.pixmap().toImage();
7176 hotspot = cursor.hotSpot();
77+ frameWidth = qimage.width();
78+ frameHeight = qimage.height();
7279}
7380
7481/////
7582// XCursorImage
7683
7784XCursorImage::XCursorImage(const QString &theme, const QString &file)
78− : xcursorImages(nullptr)
7985{
8086 // TODO: Consider grid unit value
8187 // Hardcoding to a medium size for now
8288 int preferredCursorHeightPx = 32;
8389
84− xcursorImages = XcursorLibraryLoadImages(QFile::encodeName(file), QFile::encodeName(theme),
90+ XcursorImages *xcursorImages = XcursorLibraryLoadImages(QFile::encodeName(file), QFile::encodeName(theme),
8591 preferredCursorHeightPx);
86− if (!xcursorImages) {
92+ if (!xcursorImages || xcursorImages->nimage == 0) {
8793 return;
8894 }
8995
90− // Just take the first one. It will have multiple images in case of an animated cursor.
91− // TODO: Support animated cursors
92− if ( xcursorImages->nimage > 0) {
93− XcursorImage *xcursorImage = xcursorImages->images[0];
96+ frameCount = xcursorImages->nimage;
9497
95− qimage = QImage((uchar*)xcursorImage->pixels,
96− xcursorImage->width, xcursorImage->height, QImage::Format_ARGB32);
98+ for (int i = 0; i < xcursorImages->nimage; ++i) {
99+ XcursorImage *xcursorImage = xcursorImages->images[0];
100+ if (frameWidth < (int)xcursorImage->width) {
101+ frameWidth = xcursorImage->width;
102+ }
103+ if (frameHeight < (int)xcursorImage->height) {
104+ frameHeight = xcursorImage->height;
105+ }
106+ if (i == 0) {
107+ frameDuration = (int)xcursorImage->delay;
108+ } else {
109+ if (frameDuration != (int)xcursorImage->delay) {
110+ qWarning().nospace() << "CursorImageProvider: XCursorImage("<<theme<<","<<file<<") has"
111+ " varying delays in its animation. Animation won't look right.";
112+ }
113+ }
114+ }
97115
116+ {
117+ // Assume that the hotspot position does not animate
118+ XcursorImage *xcursorImage = xcursorImages->images[0];
98119 hotspot.setX(xcursorImage->xhot);
99120 hotspot.setY(xcursorImage->yhot);
100121 }
122+
123+ // Build the sprite as a single row of frames
124+ qimage = QImage(frameWidth*frameCount, frameHeight, QImage::Format_ARGB32);
125+ qimage.fill(Qt::transparent);
126+
127+ {
128+ QPainter painter(&qimage);
129+
130+ for (int i = 0; i < xcursorImages->nimage; ++i) {
131+ XcursorImage *xcursorImage = xcursorImages->images[i];
132+
133+ auto frameImage = QImage((uchar*)xcursorImage->pixels,
134+ xcursorImage->width, xcursorImage->height, QImage::Format_ARGB32);
135+
136+ painter.drawImage(QPoint(i*frameWidth, 0), frameImage);
137+ }
138+ }
139+
140+ XcursorImagesDestroy(xcursorImages);
101141}
102142
103143XCursorImage::~XCursorImage()
104144{
105− XcursorImagesDestroy(xcursorImages);
106145}
107146
108147/////
@@ -205,16 +244,6 @@ QImage CursorImageProvider::requestImage(const QString &cursorThemeAndName, QSiz
205244 return cursorImage->qimage;
206245}
207246
208−QPoint CursorImageProvider::hotspot(const QString &themeName, const QString &cursorName)
209−{
210− CursorImage *cursorImage = fetchCursor(themeName, cursorName);
211− if (cursorImage) {
212− return cursorImage->hotspot;
213− } else {
214− return QPoint(0,0);
215− }
216−}
217−
218247CursorImage *CursorImageProvider::fetchCursor(const QString &cursorThemeAndName)
219248{
220249 QString themeName;
@@ -271,7 +300,7 @@ CursorImage *CursorImageProvider::fetchCursorHelper(const QString &themeName, co
271300{
272301 if (cursorName == QLatin1String("blank")) {
273302 return &m_blankCursorImage;
274− } else if (cursorName == QLatin1String("custom")) {
303+ } else if (cursorName.startsWith(QLatin1String("custom"))) {
275304 return m_customCursorImage.data();
276305 } else {
277306 QMap<QString, CursorImage*> &themeCursors = m_cursors[themeName];
plugins/Cursor/CursorImageProvider.h+12−4
@@ -31,15 +31,23 @@ public:
3131 virtual ~CursorImage() {}
3232
3333 QImage qimage;
34+
35+ // TODO: consider if there's a need to animate the hotspot
36+ // ie, if there's a need to make it an array of points, one for each frame.
37+ // Maybe no single xcursor (or at least the ones we know of or use)
38+ // vary its hotspot position through its animation.
3439 QPoint hotspot;
40+
41+ int frameWidth{0};
42+ int frameHeight{0};
43+ int frameCount{1};
44+ int frameDuration{40};
3545};
3646
3747class XCursorImage : public CursorImage {
3848public:
3949 XCursorImage(const QString &theme, const QString &file);
4050 virtual ~XCursorImage();
41−
42− XcursorImages *xcursorImages;
4351};
4452
4553class BuiltInCursorImage : public CursorImage {
@@ -68,16 +76,16 @@ public:
6876
6977 QImage requestImage(const QString &cursorName, QSize *size, const QSize &requestedSize) override;
7078
71− QPoint hotspot(const QString &themeName, const QString &cursorName);
79+ CursorImage *fetchCursor(const QString &themeName, const QString &cursorName);
7280
7381 void setCustomCursor(const QCursor &customCursor);
7482
7583private:
7684 CursorImage *fetchCursor(const QString &cursorThemeAndName);
77− CursorImage *fetchCursor(const QString &themeName, const QString &cursorName);
7885 CursorImage *fetchCursorHelper(const QString &themeName, const QString &cursorName);
7986
8087 // themeName -> (cursorName -> cursorImage)
88+ // TODO: discard old, unused, cursors
8189 QMap<QString, QMap<QString, CursorImage*> > m_cursors;
8290
8391 QScopedPointer<CursorImage> m_builtInCursorImage;
plugins/Cursor/MousePointer.cpp+42−32
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software: you can redistribute it and/or modify it under
55 * the terms of the GNU Lesser General Public License version 3, as published by
@@ -29,10 +29,7 @@ MousePointer::MousePointer(QQuickItem *parent)
2929 : MirMousePointerInterface(parent)
3030 , m_cursorName(QStringLiteral("left_ptr"))
3131 , m_themeName(QStringLiteral("default"))
32− , m_hotspotX(0)
33− , m_hotspotY(0)
3432{
35− updateHotspot();
3633}
3734
3835void MousePointer::handleMouseEvent(ulong timestamp, QPointF movement, Qt::MouseButtons buttons,
@@ -46,21 +43,26 @@ void MousePointer::handleMouseEvent(ulong timestamp, QPointF movement, Qt::Mouse
4643 Q_EMIT mouseMoved();
4744 }
4845
49− qreal newX = x() + movement.x();
46+ m_accumulatedMovement += movement;
47+ // don't apply the fractional part
48+ QPointF appliedMovement(int(m_accumulatedMovement.x()), int(m_accumulatedMovement.y()));
49+ m_accumulatedMovement -= appliedMovement;
50+
51+ qreal newX = x() + appliedMovement.x();
5052 if (newX < 0) {
5153 Q_EMIT pushedLeftBoundary(qAbs(newX), buttons);
5254 newX = 0;
53− } else if (newX > parentItem()->width()) {
54− Q_EMIT pushedRightBoundary(newX - parentItem()->width(), buttons);
55− newX = parentItem()->width();
55+ } else if (newX >= parentItem()->width()) {
56+ Q_EMIT pushedRightBoundary(newX - (parentItem()->width() - 1), buttons);
57+ newX = parentItem()->width() - 1;
5658 }
5759 setX(newX);
5860
59− qreal newY = y() + movement.y();
61+ qreal newY = y() + appliedMovement.y();
6062 if (newY < 0) {
6163 newY = 0;
62− } else if (newY > parentItem()->height()) {
63− newY = parentItem()->height();
64+ } else if (newY >= parentItem()->height()) {
65+ newY = parentItem()->height() - 1;
6466 }
6567 setY(newY);
6668
@@ -89,8 +91,32 @@ void MousePointer::itemChange(ItemChange change, const ItemChangeData &value)
8991
9092void MousePointer::registerWindow(QWindow *window)
9193{
92− if (m_registeredWindow && window != m_registeredWindow) {
93− auto previousCursor = dynamic_cast<MirPlatformCursor*>(m_registeredWindow->screen()->handle()->cursor());
94+ if (window == m_registeredWindow) {
95+ return;
96+ }
97+
98+ if (m_registeredWindow) {
99+ m_registeredWindow->disconnect(this);
100+ }
101+
102+ m_registeredWindow = window;
103+
104+ if (m_registeredWindow) {
105+ connect(window, &QWindow::screenChanged, this, &MousePointer::registerScreen);
106+ registerScreen(window->screen());
107+ } else {
108+ registerScreen(nullptr);
109+ }
110+}
111+
112+void MousePointer::registerScreen(QScreen *screen)
113+{
114+ if (m_registeredScreen == screen) {
115+ return;
116+ }
117+
118+ if (m_registeredScreen) {
119+ auto previousCursor = dynamic_cast<MirPlatformCursor*>(m_registeredScreen->handle()->cursor());
94120 if (previousCursor) {
95121 previousCursor->setMousePointer(nullptr);
96122 } else {
@@ -98,10 +124,10 @@ void MousePointer::registerWindow(QWindow *window)
98124 }
99125 }
100126
101− m_registeredWindow = window;
127+ m_registeredScreen = screen;
102128
103− if (m_registeredWindow) {
104− auto cursor = dynamic_cast<MirPlatformCursor*>(window->screen()->handle()->cursor());
129+ if (m_registeredScreen) {
130+ auto cursor = dynamic_cast<MirPlatformCursor*>(m_registeredScreen->handle()->cursor());
105131 if (cursor) {
106132 cursor->setMousePointer(this);
107133 } else {
@@ -115,22 +141,6 @@ void MousePointer::setCursorName(const QString &cursorName)
115141 if (cursorName != m_cursorName) {
116142 m_cursorName = cursorName;
117143 Q_EMIT cursorNameChanged(m_cursorName);
118− updateHotspot();
119− }
120−}
121−
122−void MousePointer::updateHotspot()
123−{
124− QPoint newHotspot = CursorImageProvider::instance()->hotspot(m_themeName, m_cursorName);
125−
126− if (m_hotspotX != newHotspot.x()) {
127− m_hotspotX = newHotspot.x();
128− Q_EMIT hotspotXChanged(m_hotspotX);
129− }
130−
131− if (m_hotspotY != newHotspot.y()) {
132− m_hotspotY = newHotspot.y();
133− Q_EMIT hotspotYChanged(m_hotspotY);
134144 }
135145}
136146
plugins/Cursor/MousePointer.h+9−7
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software: you can redistribute it and/or modify it under
55 * the terms of the GNU Lesser General Public License version 3, as published by
@@ -20,6 +20,7 @@
2020// Qt
2121#include <QPointer>
2222#include <QWindow>
23+#include <QScreen>
2324
2425// Unity API
2526#include <unity/shell/application/MirMousePointerInterface.h>
@@ -35,9 +36,6 @@ public:
3536 void setThemeName(const QString &themeName) override;
3637 QString themeName() const override { return m_themeName; }
3738
38− qreal hotspotX() const override { return m_hotspotX; }
39− qreal hotspotY() const override { return m_hotspotY; }
40−
4139 void setCustomCursor(const QCursor &) override;
4240
4341public Q_SLOTS:
@@ -53,15 +51,19 @@ Q_SIGNALS:
5351protected:
5452 void itemChange(ItemChange change, const ItemChangeData &value) override;
5553
54+private Q_SLOTS:
55+ void registerScreen(QScreen *screen);
56+
5657private:
5758 void registerWindow(QWindow *window);
58− void updateHotspot();
5959
6060 QPointer<QWindow> m_registeredWindow;
61+ QPointer<QScreen> m_registeredScreen;
6162 QString m_cursorName;
6263 QString m_themeName;
63− int m_hotspotX;
64− int m_hotspotY;
64+
65+ // Accumulated, unapplied, mouse movement.
66+ QPointF m_accumulatedMovement;
6567};
6668
6769#endif // MOUSEPOINTER_H
plugins/Cursor/plugin.cpp+4−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -22,13 +22,15 @@
2222#include "plugin.h"
2323
2424// local
25+#include "CursorImageInfo.h"
2526#include "CursorImageProvider.h"
2627#include "MousePointer.h"
2728
2829void CursorPlugin::registerTypes(const char *uri)
2930{
3031 Q_ASSERT(uri == QLatin1String("Cursor"));
31− qmlRegisterType<MousePointer>(uri, 1, 0, "MousePointer");
32+ qmlRegisterType<CursorImageInfo>(uri, 1, 1, "CursorImageInfo");
33+ qmlRegisterType<MousePointer>(uri, 1, 1, "MousePointer");
3234}
3335
3436void CursorPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
plugins/Cursor/qmldir+1−1
@@ -1,3 +1,3 @@
11module Cursor
22plugin Cursor-qml
3−Cursor 1.0 Cursor.qml
3+Cursor 1.1 Cursor.qml
plugins/Dash/AudioProgressBar.qml+1−1
@@ -49,6 +49,6 @@ Item {
4949 rightMargin: maxWidth - (maxWidth * root.progress)
5050 }
5151 height: units.dp(2)
52− backgroundColor: UbuntuColors.orange
52+ backgroundColor: theme.palette.normal.activity
5353 }
5454}
plugins/Dash/CMakeLists.txt+4
@@ -10,6 +10,10 @@ endif()
1010include_directories(
1111 ${CMAKE_CURRENT_SOURCE_DIR}
1212 ${CMAKE_CURRENT_BINARY_DIR}
13+)
14+
15+include_directories(
16+ SYSTEM
1317 ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
1418 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
1519 ${Qt5V8_PRIVATE_INCLUDE_DIR}
plugins/Dash/CardCreator.js+171−84
@@ -59,82 +59,100 @@ var kBackgroundLoaderCode = 'Loader {\n\
5959 } \n\
6060 }\n';
6161
62+// %1 is the aspect of the UbuntuShape
63+var kArtUbuntuShapeCode = 'UbuntuShape { \n\
64+ anchors.fill: parent; \n\
65+ source: artImage; \n\
66+ sourceFillMode: UbuntuShape.PreserveAspectCrop; \n\
67+ radius: "medium"; \n\
68+ aspect: %1; \n\
69+ }';
70+
71+var kArtProportionalShapeCode = 'ProportionalShape { \n\
72+ anchors.left: parent.left; \n\
73+ anchors.right: parent.right; \n\
74+ source: artImage; \n\
75+ aspect: UbuntuShape.DropShadow; \n\
76+ }';
77+
6278// %1 is used as anchors of artShapeHolder
6379// %2 is used as image width
6480// %3 is used as image height
65−// %4 is used for artShapeSource.hideSource and inner Loader visible
66−// %5 is used as aspect ratio fallback
67−// %6 is whether the loader should be asynchronous or not
81+// %4 is whether the image should be visible
82+// %5 is whether the loader should be asynchronous or not
83+// %6 is the shape code we want to use
6884// %7 is injected as code to artImage
6985// %8 is used as image fallback
7086var kArtShapeHolderCode = 'Item { \n\
7187 id: artShapeHolder; \n\
72− height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height; \n\
73− width: root.fixedArtShapeSize.width > 0 ? root.fixedArtShapeSize.width : artShapeLoader.width; \n\
88+ height: root.fixedArtShapeSize.height; \n\
89+ width: root.fixedArtShapeSize.width; \n\
7490 anchors { %1 } \n\
7591 Loader { \n\
7692 id: artShapeLoader; \n\
7793 objectName: "artShapeLoader"; \n\
7894 readonly property string cardArt: cardData && cardData["art"] || %8; \n\
95+ onCardArtChanged: { if (item) { item.image.source = cardArt; } } \n\
7996 active: cardArt != ""; \n\
80− asynchronous: %6; \n\
97+ asynchronous: %5; \n\
8198 visible: status == Loader.Ready; \n\
8299 sourceComponent: Item { \n\
83100 id: artShape; \n\
84101 objectName: "artShape"; \n\
85102 visible: image.status == Image.Ready; \n\
86103 readonly property alias image: artImage; \n\
87− ShaderEffectSource { \n\
88− id: artShapeSource; \n\
89− sourceItem: artImage; \n\
90− anchors.centerIn: parent; \n\
91− width: 1; \n\
92− height: 1; \n\
93− hideSource: %4; \n\
94− } \n\
95− Loader { \n\
96− anchors.fill: parent; \n\
104+ %6 \n\
105+ width: root.fixedArtShapeSize.width; \n\
106+ height: root.fixedArtShapeSize.height; \n\
107+ CroppedImageMinimumSourceSize { \n\
108+ id: artImage; \n\
109+ objectName: "artImage"; \n\
110+ source: artShapeLoader.cardArt; \n\
111+ asynchronous: %5; \n\
97112 visible: %4; \n\
98− sourceComponent: root.artShapeStyle === "icon" ? artShapeIconComponent : artShapeShapeComponent; \n\
99− Component { \n\
100− id: artShapeShapeComponent; \n\
101− UbuntuShape { \n\
102− source: artShapeSource; \n\
103− sourceFillMode: UbuntuShape.PreserveAspectCrop; \n\
104− radius: "medium"; \n\
105− aspect: { \n\
106− switch (root.artShapeStyle) { \n\
107− case "inset": return UbuntuShape.Inset; \n\
108− case "shadow": return UbuntuShape.DropShadow; \n\
109− default: \n\
110− case "flat": return UbuntuShape.Flat; \n\
111− } \n\
112− } \n\
113− } \n\
114− } \n\
115− Component { \n\
116− id: artShapeIconComponent; \n\
117− ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; } \n\
118− } \n\
119− } \n\
120− readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1; \n\
121− readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : %5; \n\
122− Component.onCompleted: { updateWidthHeightBindings(); } \n\
123− Connections { target: root; onFixedArtShapeSizeChanged: updateWidthHeightBindings(); } \n\
124− function updateWidthHeightBindings() { \n\
125− if (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) { \n\
126− width = root.fixedArtShapeSize.width; \n\
127− height = root.fixedArtShapeSize.height; \n\
128− } else { \n\
129− width = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.width }); \n\
130− height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height }); \n\
131− } \n\
113+ width: %2; \n\
114+ height: %3; \n\
115+ %7 \n\
132116 } \n\
117+ } \n\
118+ } \n\
119+ }\n';
120+
121+// %1 is used as anchors of artShapeHolder
122+// %2 is used as image width
123+// %3 is used as image height
124+// %4 is whether the image should be visible
125+// %5 is whether the loader should be asynchronous or not
126+// %6 is the shape code we want to use
127+// %7 is injected as code to artImage
128+// %8 is used as image fallback
129+var kArtShapeHolderCodeCardToolCard = 'Item { \n\
130+ id: artShapeHolder; \n\
131+ height: artShapeLoader.height; \n\
132+ width: artShapeLoader.width; \n\
133+ anchors { %1 } \n\
134+ Loader { \n\
135+ id: artShapeLoader; \n\
136+ objectName: "artShapeLoader"; \n\
137+ readonly property string cardArt: cardData && cardData["art"] || %8; \n\
138+ onCardArtChanged: { if (item) { item.image.source = cardArt; } } \n\
139+ active: cardArt != ""; \n\
140+ asynchronous: %5; \n\
141+ visible: status == Loader.Ready; \n\
142+ sourceComponent: Item { \n\
143+ id: artShape; \n\
144+ objectName: "artShape"; \n\
145+ visible: image.status == Image.Ready; \n\
146+ readonly property alias image: artImage; \n\
147+ %6 \n\
148+ width: image.status !== Image.Ready ? 0 : image.width; \n\
149+ height: image.status !== Image.Ready ? 0 : image.height; \n\
133150 CroppedImageMinimumSourceSize { \n\
134151 id: artImage; \n\
135152 objectName: "artImage"; \n\
136153 source: artShapeLoader.cardArt; \n\
137− asynchronous: %6; \n\
154+ asynchronous: %5; \n\
155+ visible: %4; \n\
138156 width: %2; \n\
139157 height: %3; \n\
140158 %7 \n\
@@ -325,7 +343,7 @@ var kTouchdownCode = 'UbuntuShape { \n\
325343 id: touchdown; \n\
326344 objectName: "touchdown"; \n\
327345 anchors { %1 } \n\
328− visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed; \n\
346+ visible: root.pressed; \n\
329347 radius: "medium"; \n\
330348 borderSource: "radius_pressed.sci" \n\
331349 }\n';
@@ -358,6 +376,17 @@ var kAttributesRowCode = 'CardAttributes { \n\
358376 model: cardData && cardData["attributes"]; \n\
359377 }\n';
360378
379+// %1 is used as anchors of socialActionsRow
380+// %2 is used as color of socialActionsRow
381+var kSocialActionsRowCode = 'CardSocialActions { \n\
382+ id: socialActionsRow; \n\
383+ objectName: "socialActionsRow"; \n\
384+ anchors { %1 } \n\
385+ color: %2; \n\
386+ model: cardData && cardData["socialActions"]; \n\
387+ onClicked: root.action(actionId); \n\
388+ }\n';
389+
361390// %1 is used as top anchor of summary
362391// %2 is used as topMargin anchor of summary
363392// %3 is used as color of summary
@@ -408,7 +437,7 @@ function sanitizeColor(colorString) {
408437 return colorString;
409438}
410439
411−function cardString(template, components, isCardTool) {
440+function cardString(template, components, isCardTool, artShapeStyle) {
412441 var code;
413442
414443 var templateInteractive = (template == null ? true : (template["non-interactive"] !== undefined ? !template["non-interactive"] : true)) ? "true" : "false";
@@ -416,19 +445,19 @@ function cardString(template, components, isCardTool) {
416445 code = 'AbstractButton { \n\
417446 id: root; \n\
418447 property var cardData; \n\
419− property string artShapeStyle: "inset"; \n\
420448 property string backgroundShapeStyle: "inset"; \n\
421449 property real fontScale: 1.0; \n\
422450 property var scopeStyle: null; \n\
423− %2\
424− property size fixedArtShapeSize: Qt.size(-1, -1); \n\
425451 readonly property string title: cardData && cardData["title"] || ""; \n\
426452 property bool showHeader: true; \n\
427453 implicitWidth: childrenRect.width; \n\
428454 enabled: %1; \n\
429455 \n'.arg(templateInteractive);
430456
431− code = code.arg(isCardTool ? "" : "property int fixedHeaderHeight: -1; \n");
457+ if (!isCardTool) {
458+ code += "property int fixedHeaderHeight: -1; \n\
459+ property size fixedArtShapeSize: Qt.size(-1, -1); \n";
460+ }
432461
433462 var hasArt = components["art"] && components["art"]["field"] || false;
434463 var hasSummary = components["summary"] || false;
@@ -444,9 +473,11 @@ function cardString(template, components, isCardTool) {
444473 var hasSubtitle = hasTitle && components["subtitle"] || false;
445474 var hasHeaderRow = hasMascot && hasTitle;
446475 var hasAttributes = hasTitle && components["attributes"] && components["attributes"]["field"] || false;
476+ var hasSocialActions = hasTitle && components["social-actions"] || false;
447477 var isAudio = template["quick-preview-type"] === "audio";
448478 var asynchronous = isCardTool ? "false" : "true";
449479
480+ code += 'signal action(var actionId);\n';
450481 if (isAudio) {
451482 // For now we only support audio cards with [optional] art, title, subtitle
452483 // in horizontal mode
@@ -485,47 +516,71 @@ function cardString(template, components, isCardTool) {
485516 if (hasArt) {
486517 code += 'readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);\n';
487518
519+ var artShapeAspect;
520+ if (isCardTool) {
521+ var artShapeAspect = components["art"] && components["art"]["aspect-ratio"] || 1;
522+ if (isNaN(artShapeAspect)) {
523+ artShapeAspect = 1;
524+ }
525+ } else {
526+ artShapeAspect = "(root.fixedArtShapeSize.width / root.fixedArtShapeSize.height)";
527+ }
528+
488529 var widthCode, heightCode;
489530 var artAnchors;
490531 if (isHorizontal) {
491532 artAnchors = 'left: parent.left';
492533 if (hasMascot || hasTitle) {
493− widthCode = 'height * artShape.aspect'
534+ widthCode = 'height * ' + artShapeAspect;
494535 heightCode = 'headerHeight + 2 * units.gu(1)';
495536 } else {
496537 // This side of the else is a bit silly, who wants an horizontal layout without mascot and title?
497538 // So we define a "random" height of the image height + 2 gu for the margins
498− widthCode = 'height * artShape.aspect'
539+ widthCode = 'height * ' + artShapeAspect
499540 heightCode = 'units.gu(7.625)';
500541 }
501542 } else {
502543 artAnchors = 'horizontalCenter: parent.horizontalCenter;';
503544 widthCode = 'root.width'
504− heightCode = 'width / artShape.aspect';
545+ heightCode = 'width / ' + artShapeAspect;
505546 }
506547
507− var aspectRatio = components["art"] && components["art"]["aspect-ratio"] || 1;
508− if (isNaN(aspectRatio)) {
509− aspectRatio = 1;
510− }
511548 var fallback = !isCardTool && components["art"] && components["art"]["fallback"] || "";
512549 fallback = encodeURI(fallback);
513550 var fallbackStatusCode = "";
514551 var fallbackURICode = '""';
515552 if (fallback !== "") {
516− // fallbackStatusCode has %6 in it because we want to substitute it for fallbackURICode
553+ // fallbackStatusCode has %8 in it because we want to substitute it for fallbackURICode
517554 // which in kArtShapeHolderCode is %8
518555 fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %8;';
519556 fallbackURICode = 'decodeURI("%1")'.arg(fallback);
520557 }
521− code += kArtShapeHolderCode.arg(artAnchors)
522− .arg(widthCode)
523− .arg(heightCode)
524− .arg(isConciergeMode ? "false" : "true")
525− .arg(aspectRatio)
526− .arg(asynchronous)
527− .arg(fallbackStatusCode)
528− .arg(fallbackURICode);
558+ var artShapeHolderShapeCode;
559+ if (!isConciergeMode) {
560+ if (artShapeStyle === "icon") {
561+ artShapeHolderShapeCode = kArtProportionalShapeCode;
562+ } else {
563+ var artShapeHolderShapeAspect;
564+ switch (artShapeStyle) {
565+ case "inset": artShapeHolderShapeAspect = "UbuntuShape.Inset"; break;
566+ case "shadow": artShapeHolderShapeAspect = "UbuntuShape.DropShadow"; break;
567+ default:
568+ case "flat": artShapeHolderShapeAspect = "UbuntuShape.Flat"; break;
569+ }
570+ artShapeHolderShapeCode = kArtUbuntuShapeCode.arg(artShapeHolderShapeAspect);
571+ }
572+ } else {
573+ artShapeHolderShapeCode = "";
574+ }
575+ var artShapeHolderCode = isCardTool ? kArtShapeHolderCodeCardToolCard : kArtShapeHolderCode;
576+ code += artShapeHolderCode.arg(artAnchors)
577+ .arg(widthCode)
578+ .arg(heightCode)
579+ .arg(isConciergeMode ? "true" : "false")
580+ .arg(asynchronous)
581+ .arg(artShapeHolderShapeCode)
582+ .arg(fallbackStatusCode)
583+ .arg(fallbackURICode);
529584 } else {
530585 code += 'readonly property size artShapeSize: Qt.size(-1, -1);\n'
531586 }
@@ -848,18 +903,50 @@ function cardString(template, components, isCardTool) {
848903 code += kSummaryLabelCode.arg(summaryTopAnchor).arg(summaryTopMargin).arg(summaryColor);
849904 }
850905
851− var touchdownAnchors;
852− if (hasBackground) {
853− touchdownAnchors = 'fill: backgroundLoader';
854− } else if (touchdownOnArtShape) {
855− touchdownAnchors = 'fill: artShapeHolder';
856− } else {
857− touchdownAnchors = 'fill: root'
906+ if (hasSocialActions) {
907+ var socialAnchors;
908+ var socialTopAnchor;
909+
910+ if (hasSummary) socialTopAnchor = 'summary.bottom;';
911+ else if (isHorizontal && hasArt) socialTopAnchor = 'artShapeHolder.bottom;';
912+ else if (headerAsOverlay && hasArt) socialTopAnchor = 'artShapeHolder.bottom;';
913+ else if (hasHeaderRow) socialTopAnchor = 'row.bottom;';
914+ else if (hasTitleContainer) socialTopAnchor = 'headerTitleContainer.bottom;';
915+ else if (hasMascot) socialTopAnchor = 'mascotImage.bottom;';
916+ else if (hasAttributes) socialTopAnchor = 'attributesRow.bottom;';
917+ else if (hasSubtitle) socialTopAnchor = 'subtitleLabel.bottom;';
918+ else if (hasTitle) socialTopAnchor = 'titleLabel.bottom;';
919+ else if (hasArt) socialTopAnchor = 'artShapeHolder.bottom;';
920+ else socialTopAnchor = 'parent.top';
921+
922+ socialAnchors = 'top: ' + socialTopAnchor + ' left: parent.left; right: parent.right; topMargin: units.gu(1);'
923+
924+ var socialColor;
925+ if (hasBackground) {
926+ socialColor = summaryColorWithBackground;
927+ } else {
928+ socialColor = 'root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText';
929+ }
930+
931+ code += kSocialActionsRowCode.arg(socialAnchors).arg(socialColor);
932+ }
933+
934+ if (artShapeStyle != "shadow" && artShapeStyle != "icon") {
935+ var touchdownAnchors;
936+ if (hasBackground) {
937+ touchdownAnchors = 'fill: backgroundLoader';
938+ } else if (touchdownOnArtShape) {
939+ touchdownAnchors = 'fill: artShapeHolder';
940+ } else {
941+ touchdownAnchors = 'fill: root'
942+ }
943+ code += kTouchdownCode.arg(touchdownAnchors);
858944 }
859− code += kTouchdownCode.arg(touchdownAnchors);
860945
861946 var implicitHeight = 'implicitHeight: ';
862− if (hasSummary) {
947+ if (hasSocialActions) {
948+ implicitHeight += 'socialActionsRow.y + socialActionsRow.height + units.gu(1);\n';
949+ } else if (hasSummary) {
863950 implicitHeight += 'summary.y + summary.height + units.gu(1);\n';
864951 } else if (isAudio) {
865952 implicitHeight += 'audioButton.height;\n';
@@ -889,13 +976,13 @@ function cardString(template, components, isCardTool) {
889976 return code;
890977}
891978
892−function createCardComponent(parent, template, components, isCardTool, identifier) {
979+function createCardComponent(parent, template, components, isCardTool, artShapeStyle, identifier) {
893980 var imports = 'import QtQuick 2.4; \n\
894981 import Ubuntu.Components 1.3; \n\
895982 import Ubuntu.Settings.Components 0.1; \n\
896983 import Dash 0.1;\n\
897984 import Utils 0.1;\n';
898− var card = cardString(template, components, isCardTool);
985+ var card = cardString(template, components, isCardTool, artShapeStyle);
899986 var code = imports + 'Component {\n' + card + '}\n';
900987
901988 try {
plugins/Dash/CardCreatorCache.qml+3−3
@@ -23,16 +23,16 @@ QtObject {
2323
2424 property var cache: new Object();
2525
26− function getCardComponent(template, components, isCardTool) {
26+ function getCardComponent(template, components, isCardTool, artShapeStyle) {
2727 if (template === undefined || components === undefined)
2828 return undefined;
2929
3030 var tString = JSON.stringify(template);
3131 var cString = JSON.stringify(components);
32− var allString = tString + cString + isCardTool;
32+ var allString = tString + cString + isCardTool + artShapeStyle;
3333 var component = cache[allString];
3434 if (component === undefined) {
35− component = CardCreator.createCardComponent(root, template, components, isCardTool, allString);
35+ component = CardCreator.createCardComponent(root, template, components, isCardTool, artShapeStyle, allString);
3636 cache[allString] = component;
3737 }
3838 return component;
plugins/Dash/CardSocialActions.qmlnew file+94
@@ -0,0 +1,94 @@
1+/*
2+ * Copyright 2016 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4
18+import QtQuick.Layouts 1.1
19+import Ubuntu.Components 1.3
20+
21+Column {
22+ id: socialActions
23+ spacing: units.gu(0.5)
24+
25+ property alias model: repeater.model
26+ property color color: theme.palette.normal.baseText
27+
28+ signal clicked(var actionId)
29+
30+ Rectangle {
31+ id: divider
32+ visible: repeater.count > 0
33+ anchors {
34+ left: parent.left;
35+ right: parent.right;
36+ leftMargin:units.dp(1);
37+ rightMargin: units.dp(1);
38+ }
39+ color: Qt.darker(theme.palette.normal.background, 1.12)
40+ height: visible ? units.dp(1) : 0
41+ }
42+
43+ Row {
44+ id: row
45+ anchors {
46+ left: parent.left
47+ right: parent.right
48+ leftMargin: units.gu(1)
49+ rightMargin: units.gu(1)
50+ }
51+ spacing: units.gu(2)
52+ readonly property int visibleItems: {
53+ if (width <= units.gu(12)) // small card
54+ return 2;
55+ else if (width <= units.gu(21)) // medium card
56+ return 3;
57+ else // large or horizontal card
58+ return 4;
59+ }
60+
61+ Repeater {
62+ id: repeater
63+ delegate: Loader {
64+ height: units.gu(2)
65+ active: index < row.visibleItems
66+ sourceComponent: AbstractButton {
67+ objectName: "delegate" + index
68+ height: units.gu(2)
69+ width: icon.width
70+ Icon {
71+ id: icon
72+ objectName: "icon"
73+
74+ readonly property url urlIcon: modelData && modelData["icon"] || ""
75+ readonly property url urlTemporaryIcon: "temporaryIcon" in modelData && modelData["temporaryIcon"] || ""
76+
77+ height: units.gu(2)
78+ // FIXME Workaround for bug https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1421293
79+ width: implicitWidth > 0 && implicitHeight > 0 ? (implicitWidth / implicitHeight * height) : implicitWidth
80+ source: urlIcon
81+ color: socialActions.color
82+
83+ onUrlIconChanged: {
84+ if (urlIcon) source = urlIcon
85+ }
86+ }
87+
88+ onClicked: socialActions.clicked(modelData["id"]);
89+ onPressedChanged: if (pressed && icon.urlTemporaryIcon != "") icon.source = icon.urlTemporaryIcon
90+ }
91+ }
92+ }
93+ }
94+}
plugins/Dash/Dash.qmltypesdeleted−100
@@ -1,100 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Dash 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "AbstractDashView"
12− defaultProperty: "data"
13− prototype: "QQuickItem"
14− Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
15− Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
16− Property { name: "columnSpacing"; type: "double" }
17− Property { name: "rowSpacing"; type: "double" }
18− Property { name: "cacheBuffer"; type: "int" }
19− Property { name: "displayMarginBeginning"; type: "double" }
20− Property { name: "displayMarginEnd"; type: "double" }
21− }
22− Component {
23− name: "HorizontalJournal"
24− defaultProperty: "data"
25− prototype: "AbstractDashView"
26− exports: ["Dash/HorizontalJournal 0.1"]
27− exportMetaObjectRevisions: [0]
28− Property { name: "rowHeight"; type: "double" }
29− }
30− Component {
31− name: "ListViewWithPageHeader"
32− defaultProperty: "flickableData"
33− prototype: "QQuickFlickable"
34− exports: ["Dash/ListViewWithPageHeader 0.1"]
35− exportMetaObjectRevisions: [0]
36− Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
37− Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
38− Property { name: "pageHeader"; type: "QQuickItem"; isPointer: true }
39− Property { name: "sectionDelegate"; type: "QQmlComponent"; isPointer: true }
40− Property { name: "sectionProperty"; type: "string" }
41− Property { name: "forceNoClip"; type: "bool" }
42− Property { name: "stickyHeaderHeight"; type: "int"; isReadonly: true }
43− Property { name: "headerItemShownHeight"; type: "double"; isReadonly: true }
44− Property { name: "cacheBuffer"; type: "int" }
45− Signal { name: "headerChanged" }
46− Method { name: "positionAtBeginning" }
47− Method { name: "showHeader" }
48− Method { name: "firstCreatedIndex"; type: "int" }
49− Method { name: "createdItemCount"; type: "int" }
50− Method {
51− name: "item"
52− type: "QQuickItem*"
53− Parameter { name: "modelIndex"; type: "int" }
54− }
55− Method {
56− name: "maximizeVisibleArea"
57− type: "bool"
58− Parameter { name: "modelIndex"; type: "int" }
59− }
60− Method {
61− name: "maximizeVisibleArea"
62− type: "bool"
63− Parameter { name: "modelIndex"; type: "int" }
64− Parameter { name: "itemHeight"; type: "int" }
65− }
66− }
67− Component {
68− name: "OrganicGrid"
69− defaultProperty: "data"
70− prototype: "AbstractDashView"
71− exports: ["Dash/OrganicGrid 0.1"]
72− exportMetaObjectRevisions: [0]
73− Property { name: "smallDelegateSize"; type: "QSizeF" }
74− Property { name: "bigDelegateSize"; type: "QSizeF" }
75− }
76− Component {
77− name: "VerticalJournal"
78− defaultProperty: "data"
79− prototype: "AbstractDashView"
80− exports: ["Dash/VerticalJournal 0.1"]
81− exportMetaObjectRevisions: [0]
82− Property { name: "columnWidth"; type: "double" }
83− }
84− Component {
85− prototype: "QObject"
86− name: "CardCreatorCache"
87− exports: ["CardCreatorCache -1.-1"]
88− exportMetaObjectRevisions: [-1]
89− isComposite: true
90− isCreatable: false
91− isSingleton: true
92− Property { name: "cache"; type: "QVariant" }
93− Method {
94− name: "getCardComponent"
95− type: "QVariant"
96− Parameter { name: "template"; type: "QVariant" }
97− Parameter { name: "components"; type: "QVariant" }
98− }
99− }
100−}
plugins/Dash/ScopeStyle.qml+1−1
@@ -70,7 +70,7 @@ QtObject {
7070 readonly property url navigationBackground: "navigation-background" in d.headerStyle ? d.headerStyle["navigation-background"] : "color:///#f5f5f5"
7171
7272 /// Color of the primary preview button
73− readonly property color previewButtonColor: "preview-button-color" in style ? style["preview-button-color"] : UbuntuColors.orange
73+ readonly property color previewButtonColor: "preview-button-color" in style ? style["preview-button-color"] : theme.palette.normal.positive
7474
7575 //! @cond
7676 property var d: QtObject {
plugins/Dash/abstractdashview.h+1−3
@@ -21,11 +21,9 @@
2121
2222class QAbstractItemModel;
2323class QQmlComponent;
24−#pragma GCC diagnostic push
25−#pragma GCC diagnostic ignored "-pedantic"
24+
2625#include <private/qqmldelegatemodel_p.h>
2726#include <qqmlinfo.h>
28−#pragma GCC diagnostic pop
2927
3028class AbstractDashView : public QQuickItem
3129{
plugins/Dash/graphics/music_progress_bg.png

Binary file not shown.

plugins/Dash/horizontaljournal.cpp+1−4
@@ -26,12 +26,9 @@
2626#include "horizontaljournal.h"
2727
2828#include <qqmlengine.h>
29−#pragma GCC diagnostic push
30−#pragma GCC diagnostic ignored "-pedantic"
31−#include <private/qqmldelegatemodel_p.h>
3229#include <qqmlinfo.h>
30+#include <private/qqmldelegatemodel_p.h>
3331#include <private/qquickitem_p.h>
34−#pragma GCC diagnostic pop
3532
3633HorizontalJournal::HorizontalJournal()
3734 : m_firstVisibleIndex(-1)
plugins/Dash/listviewwithpageheader.cpp+56−36
@@ -95,13 +95,11 @@
9595#include <QDebug>
9696#include <qqmlinfo.h>
9797#include <qqmlengine.h>
98−#pragma GCC diagnostic push
99−#pragma GCC diagnostic ignored "-pedantic"
98+#include <private/qqmlcontext_p.h>
10099#include <private/qqmldelegatemodel_p.h>
101100#include <private/qqmlglobal_p.h>
102101#include <private/qquickitem_p.h>
103102#include <private/qquickanimation_p.h>
104−#pragma GCC diagnostic pop
105103// #include <private/qquickrectangle_p.h>
106104
107105qreal ListViewWithPageHeader::ListItem::height() const
@@ -168,7 +166,7 @@ ListViewWithPageHeader::ListViewWithPageHeader()
168166 m_contentYAnimation->setDuration(200);
169167 m_contentYAnimation->setTargetObject(this);
170168
171− connect(this, &ListViewWithPageHeader::contentWidthChanged, this, &ListViewWithPageHeader::onContentWidthChanged);
169+ connect(contentItem(), &QQuickItem::widthChanged, this, &ListViewWithPageHeader::onContentWidthChanged);
172170 connect(this, &ListViewWithPageHeader::contentHeightChanged, this, &ListViewWithPageHeader::onContentHeightChanged);
173171 connect(this, &ListViewWithPageHeader::heightChanged, this, &ListViewWithPageHeader::onHeightChanged);
174172 connect(m_contentYAnimation, &QQuickNumberAnimation::runningChanged, this, &ListViewWithPageHeader::contentYAnimationRunningChanged);
@@ -255,6 +253,7 @@ void ListViewWithPageHeader::setHeader(QQuickItem *headerItem)
255253 oldHeaderHeight = m_headerItem->height();
256254 oldHeaderY = m_headerItem->y();
257255 m_headerItem->setParentItem(nullptr);
256+ QQuickItemPrivate::get(m_headerItem)->removeItemChangeListener(this, QQuickItemPrivate::ImplicitHeight);
258257 }
259258 m_headerItem = headerItem;
260259 if (m_headerItem) {
@@ -285,10 +284,12 @@ void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
285284
286285 m_sectionDelegate = delegate;
287286
288− m_topSectionItem = getSectionItem(QString());
289− m_topSectionItem->setZ(3);
290− QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
291− connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
287+ m_topSectionItem = getSectionItem(QString(), false /*watchGeometry*/);
288+ if (m_topSectionItem) {
289+ m_topSectionItem->setZ(3);
290+ QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
291+ connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
292+ }
292293
293294 // TODO create sections for existing items
294295
@@ -514,6 +515,11 @@ qreal ListViewWithPageHeader::minYExtent() const
514515 return m_minYExtent;
515516}
516517
518+qreal ListViewWithPageHeader::maxYExtent() const
519+{
520+ return height() - contentHeight();
521+}
522+
517523void ListViewWithPageHeader::componentComplete()
518524{
519525 if (m_delegateModel)
@@ -694,14 +700,18 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
694700 if (flags & QQmlDelegateModel::Destroyed) {
695701 item->setParentItem(nullptr);
696702 }
697− listItem->sectionItem()->deleteLater();
703+ if (listItem->sectionItem()) {
704+ listItem->sectionItem()->deleteLater();
705+ }
698706 delete listItem;
699707}
700708
701709void ListViewWithPageHeader::releaseItem(ListItem *listItem)
702710{
703− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
704− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
711+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
712+ if (listItem->sectionItem()) {
713+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
714+ }
705715 m_itemsToRelease << listItem;
706716}
707717
@@ -744,14 +754,12 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
744754 return getSectionItem(section);
745755}
746756
747−QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
757+QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText, bool watchGeometry)
748758{
749759 QQuickItem *sectionItem = nullptr;
750760
751761 QQmlContext *creationContext = m_sectionDelegate->creationContext();
752762 QQmlContext *context = new QQmlContext(creationContext ? creationContext : qmlContext(this));
753− context->setContextProperty(QStringLiteral("section"), sectionText);
754− context->setContextProperty(QStringLiteral("delegateIndex"), -1);
755763 QObject *nobj = m_sectionDelegate->beginCreate(context);
756764 if (nobj) {
757765 QQml_setParent_noEvent(context, nobj);
@@ -759,6 +767,8 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
759767 if (!sectionItem) {
760768 delete nobj;
761769 } else {
770+ sectionItem->setProperty("text", sectionText);
771+ sectionItem->setProperty("delegateIndex", -1);
762772 sectionItem->setZ(2);
763773 QQml_setParent_noEvent(sectionItem, m_clipItem);
764774 sectionItem->setParentItem(m_clipItem);
@@ -768,7 +778,9 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
768778 }
769779 m_sectionDelegate->completeCreate();
770780
771− // TODO attach to sectionItem so we can accomodate to it changing its height
781+ if (watchGeometry && sectionItem) {
782+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
783+ }
772784
773785 return sectionItem;
774786}
@@ -792,8 +804,7 @@ void ListViewWithPageHeader::updateSectionItem(int modelIndex)
792804 if (!item->sectionItem()) {
793805 item->setSectionItem(getSectionItem(sectionText));
794806 } else {
795− QQmlContext *context = QQmlEngine::contextForObject(item->sectionItem())->parentContext();
796− context->setContextProperty(QStringLiteral("section"), sectionText);
807+ item->sectionItem()->setProperty("text", sectionText);
797808 }
798809 } else {
799810 if (item->sectionItem()) {
@@ -914,8 +925,7 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
914925 polish();
915926 }
916927 if (listItem->sectionItem()) {
917− QQmlContext *context = QQmlEngine::contextForObject(listItem->sectionItem())->parentContext();
918− context->setContextProperty(QStringLiteral("delegateIndex"), modelIndex);
928+ listItem->sectionItem()->setProperty("delegateIndex", modelIndex);
919929 }
920930 adjustMinYExtent();
921931 m_contentHeightDirty = true;
@@ -939,9 +949,10 @@ void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
939949 return;
940950
941951 item->setParentItem(m_clipItem);
952+ // FIXME Why do we need the refreshExpressions call?
942953 QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
943− context->setContextProperty(QStringLiteral("ListViewWithPageHeader"), this);
944− context->setContextProperty(QStringLiteral("heightToClip"), QVariant::fromValue<int>(0));
954+ QQmlContextPrivate::get(context)->data->refreshExpressions();
955+ item->setProperty("heightToClip", QVariant::fromValue<int>(0));
945956 if (modelIndex == m_asyncRequestedIndex) {
946957 createItem(modelIndex, false);
947958 refill();
@@ -1107,8 +1118,7 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
11071118 for (int i = 0; i < m_visibleItems.count(); ++i) {
11081119 ListItem *item = m_visibleItems[i];
11091120 if (item->sectionItem()) {
1110− QQmlContext *context = QQmlEngine::contextForObject(item->sectionItem())->parentContext();
1111− context->setContextProperty(QStringLiteral("delegateIndex"), m_firstVisibleIndex + i);
1121+ item->sectionItem()->setProperty("delegateIndex", m_firstVisibleIndex + i);
11121122 }
11131123 }
11141124
@@ -1126,15 +1136,23 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
11261136 }
11271137}
11281138
1129−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1139+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
11301140{
11311141 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
11321142 if (heightDiff != 0) {
1133− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1143+ if (!m_visibleItems.isEmpty()) {
11341144 ListItem *firstItem = m_visibleItems.first();
1135− firstItem->setY(firstItem->y() - heightDiff);
1136− adjustMinYExtent();
1137− layout();
1145+ const auto prevFirstItemY = firstItem->y();
1146+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1147+ firstItem->setY(firstItem->y() - heightDiff);
1148+ } else if (item == firstItem->sectionItem()) {
1149+ firstItem->setY(firstItem->y() + heightDiff);
1150+ }
1151+
1152+ if (firstItem->y() != prevFirstItemY) {
1153+ adjustMinYExtent();
1154+ layout();
1155+ }
11381156 }
11391157 refill();
11401158 adjustMinYExtent();
@@ -1186,7 +1204,7 @@ void ListViewWithPageHeader::headerHeightChanged(qreal newHeaderHeight, qreal ol
11861204
11871205void ListViewWithPageHeader::adjustMinYExtent()
11881206{
1189− if (m_visibleItems.isEmpty() || contentHeight() < height()) {
1207+ if (m_visibleItems.isEmpty() || (contentHeight() + m_minYExtent < height())) {
11901208 m_minYExtent = 0;
11911209 } else {
11921210 qreal nonCreatedHeight = 0;
@@ -1270,8 +1288,7 @@ void ListViewWithPageHeader::layout()
12701288 } else {
12711289 // Update the top sticky section header
12721290 const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
1273− QQmlContext *context = QQmlEngine::contextForObject(m_topSectionItem)->parentContext();
1274− context->setContextProperty(QStringLiteral("section"), section);
1291+ m_topSectionItem->setProperty("text", section);
12751292
12761293 QQuickItemPrivate::get(m_topSectionItem)->setCulled(false);
12771294 m_topSectionItem->setY(topSectionStickPos);
@@ -1283,19 +1300,18 @@ void ListViewWithPageHeader::layout()
12831300 break;
12841301 delegateIndex--;
12851302 }
1286− context->setContextProperty(QStringLiteral("delegateIndex"), delegateIndex);
1303+ m_topSectionItem->setProperty("delegateIndex", delegateIndex);
12871304 if (item->sectionItem()) {
12881305 QQuickItemPrivate::get(item->sectionItem())->setCulled(true);
12891306 }
12901307 }
12911308 }
12921309 }
1293− QQmlContext *context = QQmlEngine::contextForObject(item->m_item)->parentContext();
12941310 const qreal clipFrom = visibleFrom + (!item->sectionItem() && m_topSectionItem && !QQuickItemPrivate::get(m_topSectionItem)->culled ? m_topSectionItem->height() : 0);
12951311 if (!cull && pos < clipFrom) {
1296− context->setContextProperty(QStringLiteral("heightToClip"), clipFrom - pos);
1312+ item->m_item->setProperty("heightToClip", clipFrom - pos);
12971313 } else {
1298− context->setContextProperty(QStringLiteral("heightToClip"), QVariant::fromValue<int>(0));
1314+ item->m_item->setProperty("heightToClip", QVariant::fromValue<int>(0));
12991315 }
13001316// qDebug() << "ListViewWithPageHeader::layout" << item->m_item;
13011317 pos += item->height();
@@ -1318,6 +1334,10 @@ void ListViewWithPageHeader::layout()
13181334 }
13191335 }
13201336 }
1337+ if (m_headerItem) {
1338+ const bool cullHeader = m_headerItem->y() + m_headerItem->height() < contentY();
1339+ QQuickItemPrivate::get(m_headerItem)->setCulled(cullHeader);
1340+ }
13211341 m_inLayout = false;
13221342}
13231343
@@ -1368,7 +1388,7 @@ void ListViewWithPageHeader::updatePolish()
13681388
13691389 m_contentHeightDirty = false;
13701390 adjustMinYExtent();
1371− if (contentHeight < height()) {
1391+ if (contentHeight + m_minYExtent < height()) {
13721392 // need this since in the previous call to adjustMinYExtent contentHeight is not set yet
13731393 m_minYExtent = 0;
13741394 }
plugins/Dash/listviewwithpageheader.h+2−1
@@ -115,6 +115,7 @@ protected:
115115 void componentComplete() override;
116116 void viewportMoved(Qt::Orientations orient) override;
117117 qreal minYExtent() const override;
118+ qreal maxYExtent() const override;
118119 void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
119120 void itemImplicitHeightChanged(QQuickItem *item) override;
120121 void updatePolish() override;
@@ -166,7 +167,7 @@ private:
166167 void reallyReleaseItem(ListItem *item);
167168 void updateWatchedRoles();
168169 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169− QQuickItem *getSectionItem(const QString &sectionText);
170+ QQuickItem *getSectionItem(const QString &sectionText, bool watchGeometry = true);
170171 void updateSectionItem(int modelIndex);
171172 void initializeValuesForEmptyList();
172173
plugins/Dash/organicgrid.cpp+3−4
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014, 2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -16,10 +16,9 @@
1616
1717#include "organicgrid.h"
1818
19−#pragma GCC diagnostic push
20−#pragma GCC diagnostic ignored "-pedantic"
19+#include <math.h>
20+
2121#include <private/qquickitem_p.h>
22−#pragma GCC diagnostic pop
2322
2423OrganicGrid::OrganicGrid()
2524 : m_firstVisibleIndex(-1)
plugins/Dash/qmldir+1
@@ -5,6 +5,7 @@ singleton CardCreatorCache 0.1 CardCreatorCache.qml
55singleton DashAudioPlayer 0.1 DashAudioPlayer.qml
66ScopeStyle 0.1 ScopeStyle.qml
77CardAttributes 0.1 CardAttributes.qml
8+CardSocialActions 0.1 CardSocialActions.qml
89CroppedImageMinimumSourceSize 0.1 CroppedImageMinimumSourceSize.qml
910AudioProgressBar 0.1 AudioProgressBar.qml
1011CardAudioProgress 0.1 CardAudioProgress.qml
plugins/Dash/verticaljournal.cpp+3−4
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -27,10 +27,9 @@
2727 */
2828#include "verticaljournal.h"
2929
30−#pragma GCC diagnostic push
31−#pragma GCC diagnostic ignored "-pedantic"
30+#include <math.h>
31+
3232#include <private/qquickitem_p.h>
33−#pragma GCC diagnostic pop
3433
3534VerticalJournal::VerticalJournal()
3635 : m_columnWidth(0)
plugins/GlobalShortcut/GlobalShortcut.qmltypesdeleted−31
@@ -1,31 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable GlobalShortcut 1.0 plugins'
8−
9−Module {
10− Component {
11− name: "GlobalShortcut"
12− defaultProperty: "data"
13− prototype: "QQuickItem"
14− exports: ["GlobalShortcut/GlobalShortcut 1.0"]
15− exportMetaObjectRevisions: [0]
16− Property { name: "shortcut"; type: "QVariant" }
17− Property { name: "active"; type: "bool" }
18− Signal {
19− name: "shortcutChanged"
20− Parameter { name: "shortcut"; type: "QVariant" }
21− }
22− Signal {
23− name: "triggered"
24− Parameter { name: "shortcut"; type: "string" }
25− }
26− Signal {
27− name: "activeChanged"
28− Parameter { name: "active"; type: "bool" }
29− }
30− }
31−}
plugins/Greeter/Unity/Launcher/CMakeLists.txt+1−1
@@ -1,4 +1,4 @@
1−pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=7)
1+pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=9)
22pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
33
44add_definitions(-DSM_BUSNAME=systemBus)
plugins/Greeter/Unity/Launcher/Launcher.qmltypesdeleted−182
@@ -1,182 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Launcher 0.1 plugins/Greeter'
8−
9−Module {
10− Component {
11− name: "LauncherItem"
12− prototype: "unity::shell::launcher::LauncherItemInterface"
13− exports: ["Unity.Launcher/LauncherItem 0.1"]
14− isCreatable: false
15− exportMetaObjectRevisions: [0]
16− }
17− Component {
18− name: "LauncherModel"
19− prototype: "unity::shell::launcher::LauncherModelInterface"
20− exports: ["Unity.Launcher/LauncherModel 0.1"]
21− isCreatable: false
22− isSingleton: true
23− exportMetaObjectRevisions: [0]
24− Method {
25− name: "requestRemove"
26− Parameter { name: "appId"; type: "string" }
27− }
28− Method { name: "refresh" }
29− Method {
30− name: "get"
31− type: "unity::shell::launcher::LauncherItemInterface*"
32− Parameter { name: "index"; type: "int" }
33− }
34− Method {
35− name: "move"
36− Parameter { name: "oldIndex"; type: "int" }
37− Parameter { name: "newIndex"; type: "int" }
38− }
39− Method {
40− name: "pin"
41− Parameter { name: "appId"; type: "string" }
42− Parameter { name: "index"; type: "int" }
43− }
44− Method {
45− name: "pin"
46− Parameter { name: "appId"; type: "string" }
47− }
48− Method {
49− name: "quickListActionInvoked"
50− Parameter { name: "appId"; type: "string" }
51− Parameter { name: "actionIndex"; type: "int" }
52− }
53− Method {
54− name: "setUser"
55− Parameter { name: "username"; type: "string" }
56− }
57− Method {
58− name: "getUrlForAppId"
59− type: "string"
60− Parameter { name: "appId"; type: "string" }
61− }
62− }
63− Component {
64− name: "QuickListModel"
65− prototype: "unity::shell::launcher::QuickListModelInterface"
66− exports: ["Unity.Launcher/QuickListModel 0.1"]
67− isCreatable: false
68− exportMetaObjectRevisions: [0]
69− }
70− Component {
71− name: "unity::shell::launcher::LauncherItemInterface"
72− prototype: "QObject"
73− exports: ["Unity.Launcher/LauncherItemInterface 0.1"]
74− isCreatable: false
75− exportMetaObjectRevisions: [0]
76− Property { name: "appId"; type: "string"; isReadonly: true }
77− Property { name: "name"; type: "string"; isReadonly: true }
78− Property { name: "icon"; type: "string"; isReadonly: true }
79− Property { name: "pinned"; type: "bool"; isReadonly: true }
80− Property { name: "running"; type: "bool"; isReadonly: true }
81− Property { name: "recent"; type: "bool"; isReadonly: true }
82− Property { name: "progress"; type: "int"; isReadonly: true }
83− Property { name: "count"; type: "int"; isReadonly: true }
84− Property { name: "countVisible"; type: "bool"; isReadonly: true }
85− Property { name: "focused"; type: "bool"; isReadonly: true }
86− Property {
87− name: "quickList"
88− type: "unity::shell::launcher::QuickListModelInterface"
89− isReadonly: true
90− isPointer: true
91− }
92− Signal {
93− name: "nameChanged"
94− Parameter { name: "name"; type: "string" }
95− }
96− Signal {
97− name: "iconChanged"
98− Parameter { name: "icon"; type: "string" }
99− }
100− Signal {
101− name: "pinnedChanged"
102− Parameter { name: "pinned"; type: "bool" }
103− }
104− Signal {
105− name: "runningChanged"
106− Parameter { name: "running"; type: "bool" }
107− }
108− Signal {
109− name: "recentChanged"
110− Parameter { name: "running"; type: "bool" }
111− }
112− Signal {
113− name: "progressChanged"
114− Parameter { name: "progress"; type: "int" }
115− }
116− Signal {
117− name: "countChanged"
118− Parameter { name: "count"; type: "int" }
119− }
120− Signal {
121− name: "countVisibleChanged"
122− Parameter { name: "countVisible"; type: "bool" }
123− }
124− Signal {
125− name: "focusedChanged"
126− Parameter { name: "focused"; type: "bool" }
127− }
128− }
129− Component {
130− name: "unity::shell::launcher::LauncherModelInterface"
131− prototype: "QAbstractListModel"
132− exports: ["Unity.Launcher/LauncherModelInterface 0.1"]
133− isCreatable: false
134− exportMetaObjectRevisions: [0]
135− Property {
136− name: "applicationManager"
137− type: "unity::shell::application::ApplicationManagerInterface"
138− isPointer: true
139− }
140− Property { name: "onlyPinned"; type: "bool" }
141− Signal { name: "hint" }
142− Method {
143− name: "move"
144− Parameter { name: "oldIndex"; type: "int" }
145− Parameter { name: "newIndex"; type: "int" }
146− }
147− Method {
148− name: "get"
149− type: "unity::shell::launcher::LauncherItemInterface*"
150− Parameter { name: "index"; type: "int" }
151− }
152− Method {
153− name: "pin"
154− Parameter { name: "appId"; type: "string" }
155− Parameter { name: "index"; type: "int" }
156− }
157− Method {
158− name: "pin"
159− Parameter { name: "appId"; type: "string" }
160− }
161− Method {
162− name: "requestRemove"
163− Parameter { name: "appId"; type: "string" }
164− }
165− Method {
166− name: "quickListActionInvoked"
167− Parameter { name: "appId"; type: "string" }
168− Parameter { name: "actionIndex"; type: "int" }
169− }
170− Method {
171− name: "setUser"
172− Parameter { name: "username"; type: "string" }
173− }
174− }
175− Component {
176− name: "unity::shell::launcher::QuickListModelInterface"
177− prototype: "QAbstractListModel"
178− exports: ["Unity.Launcher/QuickListInterface 0.1"]
179− isCreatable: false
180− exportMetaObjectRevisions: [0]
181− }
182−}
plugins/Greeter/Unity/Launcher/launcheritem.cpp+14
@@ -32,6 +32,7 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
3232 m_countVisible(false),
3333 m_focused(false),
3434 m_alerting(false),
35+ m_surfaceCount(0),
3536 m_quickList(new QuickListModel(this))
3637{
3738 QuickListEntry nameAction;
@@ -179,6 +180,19 @@ void LauncherItem::setAlerting(bool alerting)
179180 }
180181}
181182
183+int LauncherItem::surfaceCount() const
184+{
185+ return m_surfaceCount;
186+}
187+
188+void LauncherItem::setSurfaceCount(int surfaceCount)
189+{
190+ if (m_surfaceCount != surfaceCount) {
191+ m_surfaceCount = surfaceCount;
192+ Q_EMIT surfaceCountChanged(surfaceCount);
193+ }
194+}
195+
182196unity::shell::launcher::QuickListModelInterface *LauncherItem::quickList() const
183197{
184198 return m_quickList;
plugins/Greeter/Unity/Launcher/launcheritem.h+3−1
@@ -42,6 +42,7 @@ public:
4242 bool countVisible() const override;
4343 bool focused() const override;
4444 bool alerting() const override;
45+ int surfaceCount() const override;
4546
4647 unity::shell::launcher::QuickListModelInterface *quickList() const override;
4748
@@ -56,7 +57,7 @@ private:
5657 void setCountVisible(bool countVisible);
5758 void setFocused(bool focused);
5859 void setAlerting(bool alerting);
59−
60+ void setSurfaceCount(int surfaceCount);
6061
6162private:
6263 QString m_appId;
@@ -70,6 +71,7 @@ private:
7071 bool m_countVisible;
7172 bool m_focused;
7273 bool m_alerting;
74+ int m_surfaceCount;
7375 QuickListModel *m_quickList;
7476
7577 friend class LauncherModel;
plugins/Greeter/Unity/Launcher/launchermodelas.cpp+2−7
@@ -69,18 +69,13 @@ QVariant LauncherModel::data(const QModelIndex &index, int role) const
6969 return item->focused();
7070 case RoleRunning:
7171 return item->running();
72+ case RoleSurfaceCount:
73+ return item->surfaceCount();
7274 }
7375
7476 return QVariant();
7577}
7678
77−void LauncherModel::setAlerting(const QString &appId, bool alerting)
78−{
79− Q_UNUSED(appId)
80− Q_UNUSED(alerting)
81− qWarning() << "This is a read only implementation. Cannot set alert-state of items.";
82−}
83−
8479unity::shell::launcher::LauncherItemInterface *LauncherModel::get(int index) const
8580{
8681 if (index < 0 || index >= m_list.count()) {
plugins/Greeter/Unity/Launcher/launchermodelas.h−1
@@ -41,7 +41,6 @@ public:
4141
4242 QVariant data(const QModelIndex &index, int role) const override;
4343
44− Q_INVOKABLE void setAlerting(const QString &appId, bool alerting) override;
4544 Q_INVOKABLE unity::shell::launcher::LauncherItemInterface* get(int index) const override;
4645 Q_INVOKABLE void move(int oldIndex, int newIndex) override;
4746 Q_INVOKABLE void pin(const QString &appId, int index = -1) override;
plugins/IntegratedLightDM/CMakeLists.txtdeleted−40
@@ -1,40 +0,0 @@
1−pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
2−# TODO: Once we split out a separate greeter process, uncomment these lines
3−#pkg_check_modules(LIBLIGHTDM REQUIRED liblightdm-qt5-2)
4−
5−add_subdirectory(liblightdm)
6−
7−include_directories(
8− ${CMAKE_CURRENT_SOURCE_DIR}
9− ${CMAKE_CURRENT_BINARY_DIR}
10− ${CMAKE_SOURCE_DIR}/plugins/Utils
11− ${CMAKE_SOURCE_DIR}/tests/mocks/IntegratedLightDM
12− #${LIBLIGHTDM_INCLUDE_DIRS}
13− ${libunity8-private_SOURCE_DIR}
14− ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
15−)
16−
17−set(QMLPLUGIN_SRC
18− ../Utils/unitysortfilterproxymodelqml.cpp # FIXME evaluate a more generic approach for using other plugins
19− DBusGreeter.cpp
20− DBusGreeterList.cpp
21− Greeter.cpp
22− plugin.cpp
23− UsersModel.cpp
24− )
25−
26−add_library(IntegratedLightDM-qml MODULE
27− ${QMLPLUGIN_SRC}
28− )
29−
30−target_link_libraries(IntegratedLightDM-qml
31− integratedLightDM
32− unity8-private
33−# TODO: Once we split out a separate greeter process, uncomment these lines
34−# ${LIBLIGHTDM_LDFLAGS}
35− ${LIBUSERMETRICSOUTPUT_LDFLAGS}
36− )
37−
38−qt5_use_modules(IntegratedLightDM-qml DBus Gui Qml)
39−
40−add_unity8_plugin(IntegratedLightDM 0.1 IntegratedLightDM TARGETS IntegratedLightDM-qml)
plugins/LightDM/CMakeLists.txtnew file+26
@@ -0,0 +1,26 @@
1+pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
2+
3+find_package(Qt5Core REQUIRED)
4+find_package(Qt5Quick REQUIRED)
5+
6+include_directories(
7+ ${CMAKE_CURRENT_SOURCE_DIR}
8+ ${CMAKE_CURRENT_BINARY_DIR}
9+ ${CMAKE_SOURCE_DIR}/plugins/Utils
10+ ${CMAKE_BINARY_DIR}/tests/mocks/LightDM/IntegratedLightDM
11+ ${libunity8-private_SOURCE_DIR}
12+ ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
13+)
14+
15+set(QMLPLUGIN_SRC
16+ ../Utils/unitysortfilterproxymodelqml.cpp
17+ DBusGreeter.cpp
18+ DBusGreeterList.cpp
19+ Greeter.cpp
20+ plugin.cpp
21+ SessionsModel.cpp
22+ UsersModel.cpp
23+ )
24+
25+add_subdirectory(FullLightDM)
26+add_subdirectory(IntegratedLightDM)
plugins/IntegratedLightDM/DBusGreeter.cpp → plugins/LightDM/DBusGreeter.cpprenamed+5−4
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014, 2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -24,7 +24,8 @@ DBusGreeter::DBusGreeter(Greeter *greeter, const QString &path)
2424 : UnityDBusObject(path, QStringLiteral("com.canonical.UnityGreeter"), true, greeter),
2525 m_greeter(greeter)
2626{
27− connect(m_greeter, &Greeter::isActiveChanged, this, &DBusGreeter::isActiveChangedHandler);
27+ connect(m_greeter, &Greeter::isActiveChanged,
28+ this, &DBusGreeter::isActiveChangedHandler);
2829}
2930
3031bool DBusGreeter::isActive() const
@@ -34,12 +35,12 @@ bool DBusGreeter::isActive() const
3435
3536void DBusGreeter::ShowGreeter()
3637{
37− return Q_EMIT m_greeter->showGreeter();
38+ Q_EMIT m_greeter->showGreeter();
3839}
3940
4041void DBusGreeter::HideGreeter()
4142{
42− return Q_EMIT m_greeter->hideGreeter();
43+ Q_EMIT m_greeter->hideGreeter();
4344}
4445
4546void DBusGreeter::isActiveChangedHandler()
plugins/IntegratedLightDM/DBusGreeter.h → plugins/LightDM/DBusGreeter.hrenamed

The content is the same.

plugins/IntegratedLightDM/DBusGreeterList.cpp → plugins/LightDM/DBusGreeterList.cpprenamed

The content is the same.

plugins/IntegratedLightDM/DBusGreeterList.h → plugins/LightDM/DBusGreeterList.hrenamed

The content is the same.

plugins/LightDM/FullLightDM/CMakeLists.txtnew file+28
@@ -0,0 +1,28 @@
1+pkg_check_modules(LIBLIGHTDM REQUIRED liblightdm-qt5-3)
2+
3+set(PLUGIN_CLASSNAME "FullLightDM")
4+
5+add_definitions(-DFULL_LIGHTDM)
6+
7+include_directories(
8+ ../
9+ ${LIBLIGHTDM_INCLUDE_DIRS}
10+ ${CMAKE_CURRENT_BINARY_DIR}
11+ )
12+
13+foreach(source_file ${QMLPLUGIN_SRC})
14+ list(APPEND RELATIVE_QMLPLUGIN_SRC ../${source_file})
15+endforeach()
16+
17+add_library(FullLightDM-qml MODULE
18+ ${RELATIVE_QMLPLUGIN_SRC}
19+ )
20+
21+target_link_libraries(FullLightDM-qml
22+ unity8-private
23+ ${LIBLIGHTDM_LDFLAGS}
24+ ${LIBUSERMETRICSOUTPUT_LDFLAGS}
25+ )
26+
27+qt5_use_modules(FullLightDM-qml DBus Gui Qml)
28+add_unity8_plugin(FullLightDM 0.1 LightDM/FullLightDM TARGETS FullLightDM-qml)
plugins/LightDM/FullLightDM/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module LightDM.FullLightDM
2+plugin FullLightDM-qml
3+typeinfo FullLightDM.qmltypes
plugins/IntegratedLightDM/Greeter.cpp → plugins/LightDM/Greeter.cpprenamed+13−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -13,7 +13,6 @@
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 *
16− * Author: Michael Terry <michael.terry@canonical.com>
1716 */
1817
1918#include "Greeter.h"
@@ -72,12 +71,24 @@ QString Greeter::authenticationUser() const
7271 return d->m_greeter->authenticationUser();
7372}
7473
74+QString Greeter::defaultSessionHint() const
75+{
76+ Q_D(const Greeter);
77+ return d->m_greeter->defaultSessionHint();
78+}
79+
7580bool Greeter::promptless() const
7681{
7782 Q_D(const Greeter);
7883 return d->promptless;
7984}
8085
86+QString Greeter::selectUser() const
87+{
88+ Q_D(const Greeter);
89+ return d->m_greeter->selectUserHint();
90+}
91+
8192void Greeter::authenticate(const QString &username)
8293{
8394 Q_D(Greeter);
plugins/IntegratedLightDM/Greeter.h → plugins/LightDM/Greeter.hrenamed+5−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012,2013 Canonical, Ltd.
2+ * Copyright (C) 2012,2013,2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -13,7 +13,6 @@
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 *
16− * Authors: Michael Terry <michael.terry@canonical.com>
1716 */
1817
1918/* This class is a really tiny filter around QLightDM::Greeter. There are some
@@ -37,7 +36,9 @@ class Greeter : public QObject
3736 Q_PROPERTY(bool active READ isActive WRITE setIsActive NOTIFY isActiveChanged)
3837 Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
3938 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
39+ Q_PROPERTY(QString defaultSession READ defaultSessionHint CONSTANT)
4040 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
41+ Q_PROPERTY(QString selectUser READ selectUser CONSTANT)
4142
4243public:
4344 explicit Greeter(QObject* parent=0);
@@ -45,7 +46,9 @@ public:
4546 bool isActive() const;
4647 bool isAuthenticated() const;
4748 QString authenticationUser() const;
49+ QString defaultSessionHint() const;
4850 bool promptless() const;
51+ QString selectUser() const;
4952
5053public Q_SLOTS:
5154 void authenticate(const QString &username=QString());
plugins/IntegratedLightDM/GreeterPrivate.h → plugins/LightDM/GreeterPrivate.hrenamed

The content is the same.

plugins/IntegratedLightDM/IntegratedLightDM.qmltypes → plugins/LightDM/IntegratedLightDM.qmltypesrenamed

The content is the same.

plugins/LightDM/IntegratedLightDM/CMakeLists.txtnew file+33
@@ -0,0 +1,33 @@
1+set(PLUGIN_CLASSNAME "IntegratedLightDM")
2+
3+add_definitions(-DINTEGRATED_LIGHTDM)
4+
5+foreach(include_directory ${QMLPLUGIN_INCLUDES})
6+ list(APPEND RELATIVE_QMLPLUGIN_INCLUDES ../${include_directory})
7+endforeach()
8+
9+include_directories(
10+ . #QLightDM
11+ ${QMLPLUGIN_INCLUDES}
12+ ${libunity8-private_SOURCE_DIR}
13+ ${CMAKE_CURRENT_BINARY_DIR}
14+)
15+
16+foreach(source_file ${QMLPLUGIN_SRC})
17+ list(APPEND RELATIVE_QMLPLUGIN_SRC ../${source_file})
18+endforeach()
19+
20+add_library(IntegratedLightDM-qml MODULE
21+ ${RELATIVE_QMLPLUGIN_SRC}
22+ )
23+
24+target_link_libraries(IntegratedLightDM-qml
25+ integratedLightDM
26+ unity8-private
27+ ${LIBUSERMETRICSOUTPUT_LDFLAGS}
28+ )
29+
30+qt5_use_modules(IntegratedLightDM-qml DBus Gui Qml)
31+add_unity8_plugin(IntegratedLightDM 0.1 LightDM/IntegratedLightDM TARGETS IntegratedLightDM-qml)
32+
33+add_subdirectory(liblightdm)
plugins/LightDM/IntegratedLightDM/QLightDM/Greeternew file+17
@@ -0,0 +1,17 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "../liblightdm/Greeter.h"
plugins/LightDM/IntegratedLightDM/QLightDM/SessionsModelnew file+17
@@ -0,0 +1,17 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "../liblightdm/SessionsModel.h"
plugins/LightDM/IntegratedLightDM/QLightDM/UsersModelnew file+17
@@ -0,0 +1,17 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "../liblightdm/UsersModel.h"
plugins/IntegratedLightDM/liblightdm/CMakeLists.txt → plugins/LightDM/IntegratedLightDM/liblightdm/CMakeLists.txtrenamed+4−2
@@ -2,8 +2,10 @@ pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
22
33set(LibLightDM_SOURCES
44 Greeter.cpp
5+ SessionsModel.cpp
56 UsersModel.cpp
67 GreeterPrivate.cpp
8+ SessionsModelPrivate.cpp
79 UsersModelPrivate.cpp
810 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
911 ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
@@ -46,8 +48,8 @@ set_target_properties(integratedLightDMSession PROPERTIES
4648 COMPILE_FLAGS "-DSM_BUSNAME=sessionBus -fPIC")
4749set_target_properties(MockLightDM-demo-shared PROPERTIES
4850 COMPILE_FLAGS "-DSM_BUSNAME=systemBus"
49− OUTPUT_NAME lightdm-qt5-2)
51+ OUTPUT_NAME lightdm-qt5-3)
5052
5153install(TARGETS MockLightDM-demo-shared
52− DESTINATION ${SHELL_INSTALL_QML}/mocks/IntegratedLightDM/demo
54+ DESTINATION ${SHELL_INSTALL_QML}/mocks/LightDM/IntegratedLightDM/demo
5355 )
plugins/IntegratedLightDM/liblightdm/Greeter.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.cpprenamed

The content is the same.

plugins/IntegratedLightDM/liblightdm/Greeter.h → plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.hrenamed

The content is the same.

plugins/IntegratedLightDM/liblightdm/GreeterPrivate.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.cpprenamed+1−2
@@ -50,8 +50,7 @@ public:
5050 {
5151 qRegisterMetaType<QLightDM::GreeterImpl::ResponseFuture>("QLightDM::GreeterImpl::ResponseFuture");
5252
53− connect(&futureWatcher, &QFutureWatcher<int>::finished,
54− this, &GreeterImpl::finishPam);
53+ connect(&futureWatcher, &QFutureWatcher<int>::finished, this, &GreeterImpl::finishPam);
5554 connect(this, SIGNAL(showMessage(pam_handle *, QString, QLightDM::Greeter::MessageType)),
5655 this, SLOT(handleMessage(pam_handle *, QString, QLightDM::Greeter::MessageType)));
5756 // This next connect is how we pass ResponseFutures between threads
plugins/IntegratedLightDM/liblightdm/GreeterPrivate.h → plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.hrenamed

The content is the same.

plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.cppnew file+88
@@ -0,0 +1,88 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+
19+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
20+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
21+ * COUNTERPART IN tests/mocks/LightDM/IntegratedLightDM/liblightdm
22+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
23+
24+// LightDM currently is Qt4 compatible, and so doesn't define setRoleNames.
25+// To use the same method of setting role name that it does, we
26+// set our compatibility to Qt4 here too.
27+#define QT_DISABLE_DEPRECATED_BEFORE QT_VERSION_CHECK(4, 0, 0)
28+
29+#include "SessionsModel.h"
30+#include "SessionsModelPrivate.h"
31+#include <QtCore/QDir>
32+#include <QtCore/QString>
33+
34+namespace QLightDM
35+{
36+
37+SessionsModel::SessionsModel(QObject* parent) :
38+ QAbstractListModel(parent),
39+ d_ptr(new SessionsModelPrivate(this))
40+{
41+ Q_D(SessionsModel);
42+ m_roleNames = QAbstractListModel::roleNames();
43+ m_roleNames[KeyRole] = "key";
44+ m_roleNames[TypeRole] = "type";
45+}
46+
47+SessionsModel::~SessionsModel()
48+{
49+ delete d_ptr;
50+}
51+
52+QVariant SessionsModel::data(const QModelIndex& index, int role) const
53+{
54+ Q_D(const SessionsModel);
55+
56+ if(!index.isValid()) {
57+ return QVariant();
58+ }
59+
60+ int row = index.row();
61+
62+ switch (role) {
63+ case QLightDM::SessionsModel::KeyRole:
64+ return d->sessionItems[row].key;
65+ case Qt::DisplayRole:
66+ return d->sessionItems[row].name;
67+ default:
68+ return QVariant();
69+ }
70+}
71+
72+QHash<int, QByteArray> SessionsModel::roleNames() const
73+{
74+ return m_roleNames;
75+}
76+
77+int SessionsModel::rowCount(const QModelIndex& parent) const
78+{
79+ Q_D(const SessionsModel);
80+
81+ if (parent.isValid()) {
82+ return 0;
83+ } else { // parent is root
84+ return d->sessionItems.size();
85+ }
86+}
87+
88+} // namespace QLightDM
plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.hnew file+72
@@ -0,0 +1,72 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#ifndef UNITY_INTEGRATED_SESSIONSMODEL_H
19+#define UNITY_INTEGRATED_SESSIONSMODEL_H
20+
21+#include <QtCore/QAbstractListModel>
22+#include <QtCore/QString>
23+
24+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
25+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
26+ * COUNTERPART IN tests/mocks/LightDM/IntegratedLightDM/liblightdm
27+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
28+
29+// This is taken from liblightdm and modified to confirm to our syle conventions
30+namespace QLightDM
31+{
32+class SessionsModelPrivate;
33+
34+class Q_DECL_EXPORT SessionsModel : public QAbstractListModel
35+ {
36+ Q_OBJECT
37+
38+ Q_ENUMS(SessionModelRoles SessionType)
39+
40+ public:
41+
42+ enum SessionModelRoles {
43+ //name is exposed as Qt::DisplayRole
44+ //comment is exposed as Qt::TooltipRole
45+ KeyRole = Qt::UserRole,
46+ IdRole = KeyRole, /** Deprecated */
47+ TypeRole
48+ };
49+
50+ enum SessionType {
51+ LocalSessions,
52+ RemoteSessions
53+ };
54+
55+ explicit SessionsModel(QObject* parent=0); /** Deprecated. Loads local sessions*/
56+ explicit SessionsModel(SessionsModel::SessionType, QObject* parent=0);
57+ virtual ~SessionsModel();
58+
59+ QHash<int, QByteArray> roleNames() const override;
60+ int rowCount(const QModelIndex& parent) const override;
61+ QVariant data(const QModelIndex& index, int role) const override;
62+
63+ protected:
64+ SessionsModelPrivate* const d_ptr;
65+
66+ private:
67+ QHash<int, QByteArray> m_roleNames;
68+ Q_DECLARE_PRIVATE(SessionsModel)
69+ };
70+}
71+
72+#endif // UNITY_INTEGRATED_SESSIONSMODEL_H
plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.cppnew file+36
@@ -0,0 +1,36 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#include "SessionsModelPrivate.h"
19+
20+#include <QDir>
21+#include <QSettings>
22+#include <QStringList>
23+
24+namespace QLightDM
25+{
26+
27+SessionsModelPrivate::SessionsModelPrivate(SessionsModel* parent)
28+ : q_ptr(parent)
29+{
30+ // Since this model is never visible, as there is only 1 session,
31+ // just use the session name as the key
32+ QString sessionName = qgetenv("XDG_SESSION_DESKTOP");
33+ sessionItems.append({sessionName, "", sessionName, ""});
34+}
35+
36+} // namespace QLightDM
plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.hnew file+54
@@ -0,0 +1,54 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#ifndef UNITY_INTEGRATED_SESSIONSMODEL_PRIVATE_H
19+#define UNITY_INTEGRATED_SESSIONSMODEL_PRIVATE_H
20+
21+#include <QtCore/QList>
22+#include <QtCore/QString>
23+
24+namespace QLightDM
25+{
26+class SessionsModel;
27+
28+class SessionItem
29+{
30+public:
31+ QString key;
32+ QString type; // unused
33+ QString name;
34+ QString comment; // unused
35+};
36+
37+class SessionsModelPrivate
38+{
39+public:
40+ explicit SessionsModelPrivate(SessionsModel* parent=0);
41+ virtual ~SessionsModelPrivate() = default;
42+
43+ QList<SessionItem> sessionItems;
44+
45+protected:
46+ SessionsModel* const q_ptr;
47+
48+private:
49+ Q_DECLARE_PUBLIC(SessionsModel)
50+};
51+
52+} // namespace QLightDM
53+
54+#endif // UNITY_INTEGRATED_SESSIONSMODEL_PRIVATE_H
plugins/IntegratedLightDM/liblightdm/UsersModel.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModel.cpprenamed+4−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -52,6 +52,7 @@ UsersModel::UsersModel(QObject *parent) :
5252 roles[SessionRole] = "session";
5353 roles[HasMessagesRole] = "hasMessages";
5454 roles[ImagePathRole] = "imagePath";
55+ roles[UidRole] = "uid";
5556 setRoleNames(roles);
5657
5758 connect(d_ptr, &UsersModelPrivate::dataChanged, this, [this](int i) {
@@ -101,6 +102,8 @@ QVariant UsersModel::data(const QModelIndex &index, int role) const
101102 return d->entries[row].has_messages;
102103 case UsersModel::ImagePathRole:
103104 return "";
105+ case UsersModel::UidRole:
106+ return d->entries[row].uid;
104107 default:
105108 return QVariant();
106109 }
plugins/IntegratedLightDM/liblightdm/UsersModel.h → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModel.hrenamed+2−1
@@ -50,7 +50,8 @@ public:
5050 SessionRole,
5151 HasMessagesRole,
5252 ImagePathRole,
53− BackgroundPathRole
53+ BackgroundPathRole,
54+ UidRole
5455 };
5556
5657 int rowCount(const QModelIndex &parent) const override;
plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.cpprenamed+5−3
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -26,6 +26,7 @@
2626#include <QDir>
2727#include <QSettings>
2828#include <QStringList>
29+#include <unistd.h>
2930
3031namespace QLightDM
3132{
@@ -37,6 +38,7 @@ UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
3738{
3839 QFileInfo demoFile(QDir::homePath() + "/.unity8-greeter-demo");
3940 QString currentUser = g_get_user_name();
41+ uid_t currentUid = getuid();
4042
4143 if (demoFile.exists()) {
4244 QSettings settings(demoFile.filePath(), QSettings::NativeFormat);
@@ -46,10 +48,10 @@ UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
4648 Q_FOREACH(const QString &user, users)
4749 {
4850 QString name = settings.value(user + "/name", user).toString();
49− entries.append({user, name, 0, 0, false, false, 0, 0});
51+ entries.append({user, name, 0, 0, false, false, 0, 0, currentUid++});
5052 }
5153 } else {
52− entries.append({currentUser, 0, 0, 0, false, false, 0, 0});
54+ entries.append({currentUser, 0, 0, 0, false, false, 0, 0, currentUid});
5355
5456 connect(m_service, &AccountsServiceDBusAdaptor::maybeChanged,
5557 this, [this](const QString &user) {
plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.h → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.hrenamed+2−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -40,6 +40,7 @@ public:
4040 bool has_messages;
4141 QString session;
4242 QString infographic;
43+ uid_t uid;
4344};
4445
4546class UsersModelPrivate : public QObject
plugins/LightDM/IntegratedLightDM/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module LightDM.IntegratedLightDM
2+plugin IntegratedLightDM-qml
3+typeinfo IntegratedLightDM.qmltypes
plugins/LightDM/SessionsModel.cppnew file+122
@@ -0,0 +1,122 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#include "SessionsModel.h"
19+#include <QtCore/QFile>
20+#include <QtCore/QSortFilterProxyModel>
21+
22+QHash<int, QByteArray> SessionsModel::roleNames() const
23+{
24+ return m_roleNames;
25+}
26+
27+int SessionsModel::rowCount(const QModelIndex& parent) const
28+{
29+ return m_model->rowCount(parent);
30+}
31+
32+QList<QUrl> SessionsModel::iconSearchDirectories() const
33+{
34+ return m_iconSearchDirectories;
35+}
36+
37+void SessionsModel::setIconSearchDirectories(const QList<QUrl> searchDirectories)
38+{
39+ // QML gives us a url with file:// prepended which breaks QFile::exists()
40+ // so convert the url to a local file
41+ QList<QUrl> localList = {};
42+ Q_FOREACH(const QUrl& searchDirectory, searchDirectories)
43+ {
44+ localList.append(searchDirectory.toLocalFile());
45+ }
46+ m_iconSearchDirectories = localList;
47+ Q_EMIT iconSearchDirectoriesChanged();
48+}
49+
50+QUrl SessionsModel::iconUrl(const QString sessionName) const
51+{
52+ Q_FOREACH(const QUrl& searchDirectory, m_iconSearchDirectories)
53+ {
54+ // This is an established icon naming convention
55+ QString customIconUrl = searchDirectory.toString(QUrl::StripTrailingSlash) +
56+ "/custom_" + sessionName + "_badge.png";
57+ QString iconUrl = searchDirectory.toString(QUrl::StripTrailingSlash) +
58+ "/" + sessionName + "_badge.png";
59+
60+ QFile customIconFile(customIconUrl);
61+ QFile iconFile(iconUrl);
62+ if (customIconFile.exists()) {
63+ return QUrl(customIconUrl);
64+ } else if (iconFile.exists()) {
65+ return QUrl(iconUrl);
66+ } else{
67+ // Search the legacy way
68+ QString path = searchDirectory.toString(QUrl::StripTrailingSlash) + "/";
69+ if (sessionName == "ubuntu" || sessionName == "ubuntu-2d") {
70+ path += "ubuntu_badge.png";
71+ } else if(
72+ sessionName == "gnome-classic" ||
73+ sessionName == "gnome-flashback-compiz" ||
74+ sessionName == "gnome-flashback-metacity" ||
75+ sessionName == "gnome-shell" ||
76+ sessionName == "gnome-wayland" ||
77+ sessionName == "gnome"
78+ ){
79+ path += "gnome_badge.png";
80+ } else if (sessionName == "plasma") {
81+ path += "kde_badge.png";
82+ } else if (sessionName == "xterm") {
83+ path += "recovery_console_badge.png";
84+ } else if (sessionName == "remote-login") {
85+ path += "remote_login_help.png";
86+ }
87+
88+ if (QFile(path).exists()) {
89+ return path;
90+ }
91+ }
92+ }
93+
94+ // FIXME make this smarter
95+ return QUrl("./graphics/session_icons/unknown_badge.png");
96+}
97+
98+QVariant SessionsModel::data(const QModelIndex& index, int role) const
99+{
100+ switch (role) {
101+ case SessionsModel::IconRole:
102+ return iconUrl(m_model->data(index, Qt::DisplayRole).toString());
103+ default:
104+ return m_model->data(index, role);
105+ }
106+}
107+
108+SessionsModel::SessionsModel(QObject* parent)
109+ : UnitySortFilterProxyModelQML(parent)
110+{
111+ // Add a custom IconRole that isn't in either of the lightdm implementations
112+ m_model = new QLightDM::SessionsModel(this);
113+ m_roleNames = m_model->roleNames();
114+ m_roleNames[IconRole] = "icon_url";
115+
116+ setModel(m_model);
117+ setSourceModel(m_model);
118+ setSortCaseSensitivity(Qt::CaseInsensitive);
119+ setSortLocaleAware(true);
120+ setSortRole(Qt::DisplayRole);
121+ sort(0);
122+}
plugins/LightDM/SessionsModel.hnew file+68
@@ -0,0 +1,68 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#ifndef UNITY_SESSIONSMODEL_H
19+#define UNITY_SESSIONSMODEL_H
20+
21+#include <unitysortfilterproxymodelqml.h>
22+#include <QLightDM/SessionsModel>
23+#include <QtCore/QHash>
24+#include <QtCore/QObject>
25+#include <QtCore/QUrl>
26+
27+class SessionsModel : public UnitySortFilterProxyModelQML
28+{
29+ Q_OBJECT
30+
31+ Q_ENUMS(SessionModelRoles)
32+
33+ Q_PROPERTY(QList<QUrl> iconSearchDirectories READ iconSearchDirectories
34+ WRITE setIconSearchDirectories NOTIFY iconSearchDirectoriesChanged)
35+Q_SIGNALS:
36+ void iconSearchDirectoriesChanged();
37+
38+public:
39+ enum SessionModelRoles {
40+ /* This is tricky / ugly. Since we are ultimately chaining 3 enums together,
41+ * the _first_ value of this enum MUST be the _last_ value of
42+ * QLightDM::SessionsModel::SessionModelRoles and consquently, this must
43+ * also match the last value in the corresponding enum of the integrated lib
44+ */
45+ TypeRole = QLightDM::SessionsModel::SessionModelRoles::TypeRole,
46+ IconRole
47+ };
48+
49+ explicit SessionsModel(QObject* parent=nullptr);
50+
51+ QHash<int, QByteArray> roleNames() const override;
52+ int rowCount(const QModelIndex& parent) const override;
53+ QVariant data(const QModelIndex& index, int role) const override;
54+ QList<QUrl> iconSearchDirectories() const;
55+ Q_INVOKABLE QUrl iconUrl(const QString sessionName) const;
56+
57+ void setIconSearchDirectories(const QList<QUrl> searchDirectories);
58+private:
59+ QLightDM::SessionsModel* m_model;
60+ QHash<int, QByteArray> m_roleNames;
61+ QList<QUrl> m_iconSearchDirectories{
62+ QUrl("/usr/share/unity8/Greeter/graphics/session_icons"),
63+ QUrl("/usr/local/share/unity-greeter"),
64+ QUrl("/usr/share/unity-greeter/")};
65+
66+};
67+
68+#endif // UNITY_SESSIONSMODEL_H
plugins/IntegratedLightDM/UsersModel.cpp → plugins/LightDM/UsersModel.cpprenamed

The content is the same.

plugins/IntegratedLightDM/UsersModel.h → plugins/LightDM/UsersModel.hrenamed

The content is the same.

plugins/IntegratedLightDM/plugin.cpp → plugins/LightDM/plugin.cpprenamed+26−4
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012,2013, 2015 Canonical, Ltd.
2+ * Copyright (C) 2012,2013,2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -19,9 +19,11 @@
1919#include "DBusGreeter.h"
2020#include "DBusGreeterList.h"
2121#include "Greeter.h"
22+#include "SessionsModel.h"
2223#include "UsersModel.h"
2324#include <libusermetricsoutput/ColorTheme.h>
2425#include <libusermetricsoutput/UserMetrics.h>
26+#include <QLightDM/SessionsModel>
2527#include <QLightDM/UsersModel>
2628
2729#include <QAbstractItemModel>
@@ -40,6 +42,13 @@ static QObject *greeter_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
4042 return greeter;
4143}
4244
45+static QObject *sessions_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
46+{
47+ Q_UNUSED(engine)
48+ Q_UNUSED(scriptEngine)
49+ return new SessionsModel();
50+}
51+
4352static QObject *users_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
4453{
4554 Q_UNUSED(engine)
@@ -54,16 +63,29 @@ static QObject *infographic_provider(QQmlEngine *engine, QJSEngine *scriptEngine
5463 return UserMetricsOutput::UserMetrics::getInstance();
5564}
5665
57−void IntegratedLightDMPlugin::registerTypes(const char *uri)
66+void PLUGIN_CLASSNAME::registerTypes(const char *uri)
5867{
5968 qmlRegisterType<QAbstractItemModel>();
6069 qmlRegisterType<UserMetricsOutput::ColorTheme>();
6170
62− Q_ASSERT(uri == QLatin1String("IntegratedLightDM"));
71+#if defined INTEGRATED_LIGHTDM
72+ Q_ASSERT(uri == QLatin1String("LightDM.IntegratedLightDM"));
73+ qmlRegisterSingletonType<Greeter>(uri, 0, 1, "Greeter", greeter_provider);
74+#elif defined FULL_LIGHTDM
75+ Q_ASSERT(uri == QLatin1String("LightDM.FullLightDM"));
76+ qmlRegisterSingletonType<QLightDM::Greeter>(uri, 0, 1, "Greeter", greeter_provider);
77+#else
78+ #error No library defined in LightDM plugin
79+#endif
80+
6381 qRegisterMetaType<QLightDM::Greeter::MessageType>("QLightDM::Greeter::MessageType");
6482 qRegisterMetaType<QLightDM::Greeter::PromptType>("QLightDM::Greeter::PromptType");
65− qmlRegisterSingletonType<Greeter>(uri, 0, 1, "Greeter", greeter_provider);
83+
84+ qmlRegisterSingletonType<SessionsModel>(uri, 0, 1, "Sessions", sessions_provider);
85+ qmlRegisterUncreatableType<SessionsModel>(uri, 0, 1, "SessionRoles", QStringLiteral("Type is not instantiable"));
86+
6687 qmlRegisterSingletonType<UsersModel>(uri, 0, 1, "Users", users_provider);
6788 qmlRegisterUncreatableType<QLightDM::UsersModel>(uri, 0, 1, "UserRoles", QStringLiteral("Type is not instantiable"));
89+
6890 qmlRegisterSingletonType<UserMetricsOutput::UserMetrics>(uri, 0, 1, "Infographic", infographic_provider);
6991}
plugins/IntegratedLightDM/plugin.h → plugins/LightDM/plugin.hrenamed+5−5
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012,2013, 2015 Canonical, Ltd.
2+ * Copyright (C) 2012,2013,2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -15,13 +15,13 @@
1515 *
1616 */
1717
18−#ifndef INTEGRATED_LIGHTDM_PLUGIN_H
19−#define INTEGRATED_LIGHTDM_PLUGIN_H
18+#ifndef LIGHTDM_PLUGIN_H
19+#define LIGHTDM_PLUGIN_H
2020
2121#include <QtQml/QQmlEngine>
2222#include <QtQml/QQmlExtensionPlugin>
2323
24−class IntegratedLightDMPlugin : public QQmlExtensionPlugin
24+class PLUGIN_CLASSNAME : public QQmlExtensionPlugin
2525{
2626 Q_OBJECT
2727 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
@@ -30,4 +30,4 @@ public:
3030 void registerTypes(const char *uri) override;
3131};
3232
33−#endif /* INTEGRATED_LIGHTDM_PLUGIN_H */
33+#endif /* LIGHTDM_PLUGIN_H */
plugins/IntegratedLightDM/qmldir → plugins/LightDM/qmldirrenamed

The content is the same.

plugins/Lights/CMakeLists.txt+1
@@ -2,6 +2,7 @@ pkg_check_modules(ANDROID_HEADERS REQUIRED android-headers)
22pkg_check_modules(ANDROID_HARDWARE REQUIRED libhardware)
33
44include_directories(
5+ SYSTEM
56 ${ANDROID_HEADERS_INCLUDE_DIRS}
67)
78
plugins/Lights/Lights.qmltypesdeleted−45
@@ -1,45 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Lights 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "Lights"
12− prototype: "QObject"
13− exports: ["Lights/Lights 0.1"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Enum {
18− name: "State"
19− values: {
20− "Off": 0,
21− "On": 1
22− }
23− }
24− Property { name: "state"; type: "State" }
25− Property { name: "color"; type: "QColor" }
26− Property { name: "onMillisec"; type: "int" }
27− Property { name: "offMillisec"; type: "int" }
28− Signal {
29− name: "stateChanged"
30− Parameter { name: "newState"; type: "State" }
31− }
32− Signal {
33− name: "colorChanged"
34− Parameter { name: "color"; type: "QColor" }
35− }
36− Signal {
37− name: "onMillisecChanged"
38− Parameter { name: "onMs"; type: "int" }
39− }
40− Signal {
41− name: "offMillisecChanged"
42− Parameter { name: "offMs"; type: "int" }
43− }
44− }
45−}
plugins/Lights/android-hardware.h−4
@@ -15,9 +15,5 @@
1515 *
1616 */
1717
18−// The purpose of this header wrapper is just to avoid having warnings being reported on
19−// code from external header files, as we can't do anything about them.
20−#pragma GCC system_header
21−
2218#include <hardware/hardware.h>
2319#include <hardware/lights.h>
plugins/Powerd/Powerd.qmltypesdeleted−39
@@ -1,39 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Powerd 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "Powerd"
12− prototype: "QObject"
13− exports: ["Powerd/Powerd 0.1"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Enum {
18− name: "DisplayStateChangeReason"
19− values: {
20− "Unknown": 0,
21− "Inactivity": 1,
22− "PowerKey": 2,
23− "Proximity": 3
24− }
25− }
26− Enum {
27− name: "Status"
28− values: {
29− "Off": 0,
30− "On": 1
31− }
32− }
33− Property { name: "status"; type: "Status"; isReadonly: true }
34− Signal {
35− name: "statusChanged"
36− Parameter { name: "reason"; type: "DisplayStateChangeReason" }
37− }
38− }
39−}
plugins/ScreenGrabber/CMakeLists.txtdeleted−13
@@ -1,13 +0,0 @@
1−include_directories(
2− ${CMAKE_CURRENT_BINARY_DIR}
3−)
4−
5−set(SCREENGRABBERSOURCES
6− screengrabber.cpp
7− plugin.cpp
8−)
9−
10−add_library(ScreenGrabber-qml MODULE ${SCREENGRABBERSOURCES})
11−qt5_use_modules(ScreenGrabber-qml Qml Gui Quick Concurrent)
12−
13−add_unity8_plugin(ScreenGrabber 0.1 ScreenGrabber TARGETS ScreenGrabber-qml)
plugins/ScreenGrabber/qmldirdeleted−3
@@ -1,3 +0,0 @@
1−module ScreenGrabber
2−plugin ScreenGrabber-qml
3−typeinfo ScreenGrabber.qmltypes
plugins/ScreenGrabber/screengrabber.cppdeleted−115
@@ -1,115 +0,0 @@
1−/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "screengrabber.h"
18−
19−#include <QDir>
20−#include <QDateTime>
21−#include <QStandardPaths>
22−#include <QTemporaryDir>
23−#include <QtGui/QImage>
24−#include <QtGui/QGuiApplication>
25−#include <QtQuick/QQuickWindow>
26−
27−#include <QDebug>
28−
29−QString saveScreenshot(const QImage &screenshot, const QString &filename, const QString &format, int quality)
30−{
31− if (screenshot.save(filename, format.toLatin1().data(), quality)) {
32− return filename;
33− } else {
34− qWarning() << "ScreenGrabber: failed to save snapshot!";
35− }
36− return QString();
37−}
38−
39−ScreenGrabber::ScreenGrabber(QObject *parent)
40− : QObject(parent)
41−{
42− QObject::connect(&m_watcher,
43− &QFutureWatcher<QString>::finished,
44− this,
45− &ScreenGrabber::onScreenshotSaved);
46−
47− QDir screenshotsDir;
48− if (qEnvironmentVariableIsSet("UNITY_TESTING")) {
49− QTemporaryDir tDir;
50− tDir.setAutoRemove(false);
51− screenshotsDir = tDir.path();
52− } else {
53− screenshotsDir = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
54− }
55− screenshotsDir.mkpath(QStringLiteral("Screenshots"));
56− screenshotsDir.cd(QStringLiteral("Screenshots"));
57− if (screenshotsDir.exists()) {
58− fileNamePrefix = screenshotsDir.absolutePath();
59− fileNamePrefix.append("/screenshot");
60− } else {
61− qWarning() << "ScreenGrabber: failed to create directory at: " << screenshotsDir.absolutePath();
62− }
63−}
64−
65−void ScreenGrabber::captureAndSave(int angle)
66−{
67− if (fileNamePrefix.isEmpty())
68− {
69− qWarning() << "ScreenShotter: no directory to save screenshot";
70− return;
71− }
72−
73− const QWindowList windows = QGuiApplication::topLevelWindows();
74− if (windows.empty())
75− {
76− qWarning() << "ScreenShotter: no top level windows found!";
77− return;
78− }
79−
80− QQuickWindow *main_window = qobject_cast<QQuickWindow *>(windows[0]);
81− if (!main_window)
82− {
83− qWarning() << "ScreenShotter: can only take screenshots of QQuickWindows";
84− return;
85− }
86−
87− const QImage screenshot = main_window->grabWindow().transformed(QTransform().rotate(angle));
88− const QString filename = makeFileName();
89− qDebug() << "Saving screenshot to" << filename;
90− QFuture<QString> saveFuture(QtConcurrent::run(saveScreenshot, screenshot, filename, getFormat(), screenshotQuality));
91− m_watcher.setFuture(saveFuture);
92−}
93−
94−void ScreenGrabber::onScreenshotSaved()
95−{
96− const QString filename = m_watcher.future().result();
97− if (!filename.isEmpty()) {
98− Q_EMIT screenshotSaved(filename);
99− }
100−}
101−
102−QString ScreenGrabber::makeFileName() const
103−{
104− QString fileName(fileNamePrefix);
105− fileName.append(QDateTime::currentDateTime().toString(QStringLiteral("yyyyMMdd_hhmmsszzz")));
106− fileName.append(".");
107− fileName.append(getFormat());
108− return fileName;
109−}
110−
111−QString ScreenGrabber::getFormat() const
112−{
113− //TODO: This should be configurable (perhaps through gsettings?)
114− return QStringLiteral("png");
115−}
plugins/ScreenshotDirectory/CMakeLists.txtnew file+9
@@ -0,0 +1,9 @@
1+set(PLUGIN_SOURCES
2+ ScreenshotDirectory.cpp
3+ plugin.cpp
4+)
5+
6+add_library(ScreenshotDirectory-qml MODULE ${PLUGIN_SOURCES})
7+qt5_use_modules(ScreenshotDirectory-qml Qml Gui Quick)
8+
9+add_unity8_plugin(ScreenshotDirectory 0.1 ScreenshotDirectory TARGETS ScreenshotDirectory-qml)
plugins/ScreenGrabber/ScreenGrabber.qmltypes → plugins/ScreenshotDirectory/ScreenGrabber.qmltypesrenamed

The content is the same.

plugins/ScreenshotDirectory/ScreenshotDirectory.cppnew file+64
@@ -0,0 +1,64 @@
1+/*
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "ScreenshotDirectory.h"
18+
19+#include <QDir>
20+#include <QDateTime>
21+#include <QStandardPaths>
22+#include <QTemporaryDir>
23+
24+#include <QDebug>
25+
26+ScreenshotDirectory::ScreenshotDirectory(QObject *parent)
27+ : QObject(parent)
28+{
29+ QDir screenshotsDir;
30+ if (qEnvironmentVariableIsSet("UNITY_TESTING")) {
31+ QTemporaryDir tDir;
32+ tDir.setAutoRemove(false);
33+ screenshotsDir = tDir.path();
34+ } else {
35+ screenshotsDir = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
36+ }
37+ screenshotsDir.mkpath(QStringLiteral("Screenshots"));
38+ screenshotsDir.cd(QStringLiteral("Screenshots"));
39+ if (screenshotsDir.exists()) {
40+ m_fileNamePrefix = screenshotsDir.absolutePath();
41+ m_fileNamePrefix.append("/screenshot");
42+ } else {
43+ qWarning() << "ScreenshotDirectory: failed to create directory at:" << screenshotsDir.absolutePath();
44+ }
45+}
46+
47+QString ScreenshotDirectory::makeFileName() const
48+{
49+ if (m_fileNamePrefix.isEmpty()) {
50+ return QString();
51+ }
52+
53+ QString fileName(m_fileNamePrefix);
54+ fileName.append(QDateTime::currentDateTime().toString(QStringLiteral("yyyyMMdd_hhmmsszzz")));
55+ fileName.append(".");
56+ fileName.append(format());
57+ return fileName;
58+}
59+
60+QString ScreenshotDirectory::format() const
61+{
62+ //TODO: This should be configurable (perhaps through gsettings?)
63+ return QStringLiteral("png");
64+}
plugins/ScreenshotDirectory/ScreenshotDirectory.hnew file+39
@@ -0,0 +1,39 @@
1+/*
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef SCREENSHOTDIRECTORY_H
18+#define SCREENSHOTDIRECTORY_H
19+
20+#include <QObject>
21+#include <QString>
22+
23+class ScreenshotDirectory: public QObject
24+{
25+ Q_OBJECT
26+
27+public:
28+ explicit ScreenshotDirectory(QObject *parent = 0);
29+ ~ScreenshotDirectory() = default;
30+
31+public Q_SLOTS:
32+ QString makeFileName() const;
33+
34+private:
35+ QString format() const;
36+ QString m_fileNamePrefix;
37+};
38+
39+#endif // SCREENSHOTDIRECTORY_H
plugins/ScreenGrabber/plugin.cpp → plugins/ScreenshotDirectory/plugin.cpprenamed+5−7
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014,2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,17 +12,15 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Alberto Aguirre <alberto.aguirre@canonical.com>
1715 */
1816
1917#include "plugin.h"
20−#include "screengrabber.h"
18+#include "ScreenshotDirectory.h"
2119
2220#include <QtQml/qqml.h>
2321
24−void ScreenGrabberPlugin::registerTypes(const char *uri)
22+void ScreenshotDirectoryPlugin::registerTypes(const char *uri)
2523{
26− Q_ASSERT(uri == QLatin1String("ScreenGrabber"));
27− qmlRegisterType<ScreenGrabber>(uri, 0, 1, "ScreenGrabber");
24+ Q_ASSERT(uri == QLatin1String("ScreenshotDirectory"));
25+ qmlRegisterType<ScreenshotDirectory>(uri, 0, 1, "ScreenshotDirectory");
2826}
plugins/ScreenGrabber/plugin.h → plugins/ScreenshotDirectory/plugin.hrenamed+5−7
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014,2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,16 +12,14 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Alberto Aguirre <alberto.aguirre@canonical.com>
1715 */
1816
19−#ifndef SCREENGRABBER_PLUGIN_H
20−#define SCREENGRABBER_PLUGIN_H
17+#ifndef SCREENSHOTDIRECTORY_PLUGIN_H
18+#define SCREENSHOTDIRECTORY_PLUGIN_H
2119
2220#include <QtQml/QQmlExtensionPlugin>
2321
24−class ScreenGrabberPlugin : public QQmlExtensionPlugin
22+class ScreenshotDirectoryPlugin : public QQmlExtensionPlugin
2523{
2624 Q_OBJECT
2725 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
@@ -30,4 +28,4 @@ public:
3028 void registerTypes(const char *uri) override;
3129};
3230
33−#endif // SCREENGRABBER_PLUGIN_H
31+#endif // SCREENSHOTDIRECTORY_PLUGIN_H
plugins/ScreenshotDirectory/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module ScreenshotDirectory
2+plugin ScreenshotDirectory-qml
plugins/SessionBroadcast/CMakeLists.txt+5
@@ -1,3 +1,4 @@
1+include_directories(${GLIB_INCLUDE_DIRS})
12add_definitions(-DSM_BUSNAME=systemBus)
23
34add_library(SessionBroadcast-qml MODULE
@@ -7,4 +8,8 @@ add_library(SessionBroadcast-qml MODULE
78
89qt5_use_modules(SessionBroadcast-qml DBus Qml)
910
11+target_link_libraries(SessionBroadcast-qml
12+ ${GLIB_LIBRARIES}
13+ )
14+
1015add_unity8_plugin(SessionBroadcast 0.1 SessionBroadcast TARGETS SessionBroadcast-qml)
plugins/SessionBroadcast/SessionBroadcast.cpp+5−1
@@ -19,9 +19,13 @@
1919#include "SessionBroadcast.h"
2020#include <QDBusConnection>
2121
22+#include <glib.h>
23+
2224SessionBroadcast::SessionBroadcast(QObject* parent)
2325 : QObject(parent)
2426{
27+ m_username = QString::fromUtf8(g_get_user_name());
28+
2529 auto connection = QDBusConnection::SM_BUSNAME();
2630
2731 connection.connect(QStringLiteral("com.canonical.Unity.Greeter.Broadcast"),
@@ -35,7 +39,7 @@ SessionBroadcast::SessionBroadcast(QObject* parent)
3539void SessionBroadcast::onShowHome(const QString &username)
3640{
3741 // Only listen to requests meant for us
38− if (username == qgetenv("USER")) {
42+ if (username == m_username) {
3943 Q_EMIT showHome();
4044 }
4145}
plugins/SessionBroadcast/SessionBroadcast.h+3
@@ -36,6 +36,9 @@ Q_SIGNALS:
3636
3737private Q_SLOTS:
3838 void onShowHome(const QString &username);
39+
40+private:
41+ QString m_username;
3942};
4043
4144#endif
plugins/SessionBroadcast/SessionBroadcast.qmltypesdeleted−19
@@ -1,19 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable SessionBroadcast 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "SessionBroadcast"
12− prototype: "QObject"
13− exports: ["SessionBroadcast/SessionBroadcast 0.1"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Signal { name: "showHome" }
18− }
19−}
plugins/UInput/UInput.qmltypesdeleted−44
@@ -1,44 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable UInput 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "UInput"
12− prototype: "QObject"
13− exports: ["UInput/UInput 0.1"]
14− exportMetaObjectRevisions: [0]
15− Enum {
16− name: "Button"
17− values: {
18− "ButtonLeft": 0,
19− "ButtonRight": 1,
20− "ButtonMiddle": 2
21− }
22− }
23− Method { name: "createMouse" }
24− Method { name: "removeMouse" }
25− Method {
26− name: "moveMouse"
27− Parameter { name: "dx"; type: "int" }
28− Parameter { name: "dy"; type: "int" }
29− }
30− Method {
31− name: "pressMouse"
32− Parameter { name: "button"; type: "Button" }
33− }
34− Method {
35− name: "releaseMouse"
36− Parameter { name: "button"; type: "Button" }
37− }
38− Method {
39− name: "scrollMouse"
40− Parameter { name: "dh"; type: "int" }
41− Parameter { name: "dv"; type: "int" }
42− }
43− }
44−}
plugins/Ubuntu/DownloadDaemonListener/CMakeLists.txt−1
@@ -1,7 +1,6 @@
11include_directories(
22 ${CMAKE_CURRENT_SOURCE_DIR}
33 ${CMAKE_CURRENT_BINARY_DIR}
4− ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
54)
65
76set(DOWNLOADDAEMONLISTENER_SOURCES
plugins/Ubuntu/DownloadDaemonListener/DownloadDaemonListener.qmltypesdeleted−60
@@ -1,60 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Ubuntu.DownloadDaemonListener 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "DownloadTracker"
12− prototype: "QObject"
13− exports: ["Ubuntu.DownloadDaemonListener/DownloadTracker 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "service"; type: "string" }
16− Property { name: "dbusPath"; type: "string" }
17− Property { name: "serviceReady"; type: "bool"; isReadonly: true }
18− Signal {
19− name: "serviceChanged"
20− Parameter { name: "service"; type: "string" }
21− }
22− Signal {
23− name: "dbusPathChanged"
24− Parameter { name: "dbusPath"; type: "string" }
25− }
26− Signal {
27− name: "serviceReadyChanged"
28− Parameter { name: "serviceReady"; type: "bool" }
29− }
30− Signal {
31− name: "canceled"
32− Parameter { name: "success"; type: "bool" }
33− }
34− Signal {
35− name: "error"
36− Parameter { name: "error"; type: "string" }
37− }
38− Signal {
39− name: "finished"
40− Parameter { name: "path"; type: "string" }
41− }
42− Signal {
43− name: "paused"
44− Parameter { name: "success"; type: "bool" }
45− }
46− Signal {
47− name: "progress"
48− Parameter { name: "received"; type: "qulonglong" }
49− Parameter { name: "total"; type: "qulonglong" }
50− }
51− Signal {
52− name: "resumed"
53− Parameter { name: "success"; type: "bool" }
54− }
55− Signal {
56− name: "started"
57− Parameter { name: "success"; type: "bool" }
58− }
59− }
60−}
plugins/Ubuntu/Gestures/AxisVelocityCalculator.h+1−1
@@ -24,7 +24,7 @@
2424#include "UbuntuGesturesQmlGlobal.h"
2525#include <stdint.h>
2626#include <QtCore/QObject>
27−#include "TimeSource.h"
27+#include <TimeSource>
2828
2929/*
3030 Estimates the current velocity of a finger based on recent movement along an axis
plugins/Ubuntu/Gestures/CMakeLists.txt+9−5
@@ -4,27 +4,30 @@ remove_definitions(-DQT_NO_KEYWORDS)
44set(UbuntuGesturesQml_SOURCES
55 plugin.cpp
66 AxisVelocityCalculator.cpp
7− Damper.cpp
87 Direction.cpp
9− DirectionalDragArea.cpp
10− FloatingFlickable.cpp
8+ MouseEventGenerator.cpp
119 PressedOutsideNotifier.cpp
1210 TouchDispatcher.cpp
1311 TouchGate.cpp
1412 TouchGestureArea.cpp
1513)
1614
15+pkg_check_modules(UBUNTUGESTURES REQUIRED UbuntuGestures)
16+
1717add_definitions(-DUBUNTUGESTURESQML_LIBRARY)
1818
1919add_library(UbuntuGesturesQml MODULE ${UbuntuGesturesQml_SOURCES})
20−target_link_libraries(UbuntuGesturesQml UbuntuGestures)
20+target_link_libraries(UbuntuGesturesQml ${UBUNTUGESTURES_LIBRARIES})
2121
2222qt5_use_modules(UbuntuGesturesQml Core Quick)
2323
2424# So that Foo.cpp can #include "Foo.moc"
2525include_directories(${CMAKE_CURRENT_BINARY_DIR})
2626
27−include_directories(${CMAKE_SOURCE_DIR}/libs/UbuntuGestures)
27+include_directories(
28+ SYSTEM
29+ ${UBUNTUGESTURES_INCLUDE_DIRS}
30+)
2831
2932# There's no cmake var for v8 include path :-/ so create one
3033LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
@@ -32,6 +35,7 @@ SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/QtV8/${Qt5Core_VERSION_STRING}/QtV8)
3235
3336# DANGER! DANGER! Using Qt's private API!
3437include_directories(
38+ SYSTEM
3539 ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
3640 ${Qt5Quick_INCLUDE_DIRS}
3741 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
plugins/Ubuntu/Gestures/Damper.hdeleted−89
@@ -1,89 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef UBUNTU_GESTURES_DAMPER_H
18−#define UBUNTU_GESTURES_DAMPER_H
19−
20−#include <QtCore/QPointF>
21−
22−/*
23− Decreases the oscillations of a value along an axis.
24− */
25−template <class Type> class Damper {
26−public:
27− Damper() : m_value(0), m_maxDelta(0) { }
28−
29− // Maximum delta between the raw value and its dampened counterpart.
30− void setMaxDelta(Type maxDelta) {
31− if (maxDelta < 0) qFatal("Damper::maxDelta must be a positive number.");
32− m_maxDelta = maxDelta;
33− }
34− Type maxDelta() const { return m_maxDelta; }
35−
36− void reset(Type value) {
37− m_value = value;
38− }
39−
40− Type update(Type value) {
41− Type delta = value - m_value;
42− if (delta > 0 && delta > m_maxDelta) {
43− m_value += delta - m_maxDelta;
44− } else if (delta < 0 && delta < -m_maxDelta) {
45− m_value += delta + m_maxDelta;
46− }
47−
48− return m_value;
49− }
50−
51− Type value() const { return m_value; }
52−
53−private:
54− Type m_value;
55− Type m_maxDelta;
56−};
57−
58−/*
59− A point that has its movement dampened.
60− */
61−class DampedPointF {
62−public:
63− void setMaxDelta(qreal maxDelta) {
64− m_x.setMaxDelta(maxDelta);
65− m_y.setMaxDelta(maxDelta);
66− }
67−
68− qreal maxDelta() const { return m_x.maxDelta(); }
69−
70− void reset(const QPointF point) {
71− m_x.reset(point.x());
72− m_y.reset(point.y());
73− }
74−
75− void update(const QPointF point) {
76− m_x.update(point.x());
77− m_y.update(point.y());
78− }
79−
80− qreal x() const { return m_x.value(); }
81− qreal y() const { return m_y.value(); }
82−private:
83− Damper<qreal> m_x;
84− Damper<qreal> m_y;
85−};
86−
87−QDebug operator<<(QDebug dbg, const DampedPointF &p);
88−
89−#endif // UBUNTU_GESTURES_DAMPER_H
plugins/Ubuntu/Gestures/Direction.h+1
@@ -29,6 +29,7 @@ class UBUNTUGESTURESQML_EXPORT Direction : public QObject {
2929 Q_ENUMS(Type)
3030
3131public:
32+ // Make sure it is kept synchronized with SDK UCSwipeArea::Direction
3233 enum Type {
3334 Rightwards, // Along the positive direction of the X axis
3435 Leftwards, // Along the negative direction of the X axis
plugins/Ubuntu/Gestures/DirectionalDragArea.cppdeleted−932
@@ -1,932 +0,0 @@
1−/*
2− * Copyright (C) 2013-2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#define ACTIVETOUCHESINFO_DEBUG 0
18−#define DIRECTIONALDRAGAREA_DEBUG 0
19−
20−#include "DirectionalDragArea.h"
21−
22−#include <QQuickWindow>
23−#include <QtCore/qmath.h>
24−#include <QScreen>
25−#include <QDebug>
26−
27−#pragma GCC diagnostic push
28−#pragma GCC diagnostic ignored "-pedantic"
29−#include <private/qquickwindow_p.h>
30−#pragma GCC diagnostic pop
31−
32−// local
33−#include "TouchOwnershipEvent.h"
34−#include "TouchRegistry.h"
35−#include "UnownedTouchEvent.h"
36−
37−#include "DirectionalDragArea_p.h"
38−
39−using namespace UbuntuGestures;
40−
41−#if DIRECTIONALDRAGAREA_DEBUG
42−#define ddaDebug(params) qDebug().nospace() << "[DDA(" << qPrintable(objectName()) << ")] " << params
43−#include "DebugHelpers.h"
44−
45−namespace {
46−const char *statusToString(DirectionalDragAreaPrivate::Status status)
47−{
48− if (status == DirectionalDragAreaPrivate::WaitingForTouch) {
49− return "WaitingForTouch";
50− } else if (status == DirectionalDragAreaPrivate::Undecided) {
51− return "Undecided";
52− } else {
53− return "Recognized";
54− }
55−}
56−
57−} // namespace {
58−#else // DIRECTIONALDRAGAREA_DEBUG
59−#define ddaDebug(params) ((void)0)
60−#endif // DIRECTIONALDRAGAREA_DEBUG
61−
62−DirectionalDragArea::DirectionalDragArea(QQuickItem *parent)
63− : QQuickItem(parent)
64− , d(new DirectionalDragAreaPrivate(this))
65−{
66− d->setRecognitionTimer(new Timer(this));
67− d->recognitionTimer->setInterval(d->maxTime);
68− d->recognitionTimer->setSingleShot(true);
69−
70− connect(this, &QQuickItem::enabledChanged, d, &DirectionalDragAreaPrivate::giveUpIfDisabledOrInvisible);
71− connect(this, &QQuickItem::visibleChanged, d, &DirectionalDragAreaPrivate::giveUpIfDisabledOrInvisible);
72−}
73−
74−Direction::Type DirectionalDragArea::direction() const
75−{
76− return d->direction;
77−}
78−
79−void DirectionalDragArea::setDirection(Direction::Type direction)
80−{
81− if (direction != d->direction) {
82− d->direction = direction;
83− Q_EMIT directionChanged(d->direction);
84− }
85−}
86−
87−void DirectionalDragAreaPrivate::setDistanceThreshold(qreal value)
88−{
89− if (distanceThreshold != value) {
90− distanceThreshold = value;
91− distanceThresholdSquared = distanceThreshold * distanceThreshold;
92− }
93−}
94−
95−void DirectionalDragAreaPrivate::setMaxTime(int value)
96−{
97− if (maxTime != value) {
98− maxTime = value;
99− recognitionTimer->setInterval(maxTime);
100− }
101−}
102−
103−void DirectionalDragAreaPrivate::setRecognitionTimer(UbuntuGestures::AbstractTimer *timer)
104−{
105− int interval = 0;
106− bool timerWasRunning = false;
107− bool wasSingleShot = false;
108−
109− // can be null when called from the constructor
110− if (recognitionTimer) {
111− interval = recognitionTimer->interval();
112− timerWasRunning = recognitionTimer->isRunning();
113− if (recognitionTimer->parent() == this) {
114− delete recognitionTimer;
115− }
116− }
117−
118− recognitionTimer = timer;
119− timer->setInterval(interval);
120− timer->setSingleShot(wasSingleShot);
121− connect(timer, &UbuntuGestures::AbstractTimer::timeout,
122− this, &DirectionalDragAreaPrivate::rejectGesture);
123− if (timerWasRunning) {
124− recognitionTimer->start();
125− }
126−}
127−
128−void DirectionalDragAreaPrivate::setTimeSource(const SharedTimeSource &timeSource)
129−{
130− this->timeSource = timeSource;
131− activeTouches.m_timeSource = timeSource;
132−}
133−
134−qreal DirectionalDragArea::distance() const
135−{
136− if (Direction::isHorizontal(d->direction)) {
137− return d->publicPos.x() - d->startPos.x();
138− } else {
139− return d->publicPos.y() - d->startPos.y();
140− }
141−}
142−
143−void DirectionalDragAreaPrivate::updateSceneDistance()
144−{
145− QPointF totalMovement = publicScenePos - startScenePos;
146− sceneDistance = projectOntoDirectionVector(totalMovement);
147−}
148−
149−qreal DirectionalDragArea::sceneDistance() const
150−{
151− return d->sceneDistance;
152−}
153−
154−qreal DirectionalDragArea::touchX() const
155−{
156− return d->publicPos.x();
157−}
158−
159−qreal DirectionalDragArea::touchY() const
160−{
161− return d->publicPos.y();
162−}
163−
164−qreal DirectionalDragArea::touchSceneX() const
165−{
166− return d->publicScenePos.x();
167−}
168−
169−qreal DirectionalDragArea::touchSceneY() const
170−{
171− return d->publicScenePos.y();
172−}
173−
174−bool DirectionalDragArea::dragging() const
175−{
176− return d->status == DirectionalDragAreaPrivate::Recognized;
177−}
178−
179−bool DirectionalDragArea::pressed() const
180−{
181− return d->status != DirectionalDragAreaPrivate::WaitingForTouch;
182−}
183−
184−bool DirectionalDragArea::immediateRecognition() const
185−{
186− return d->immediateRecognition;
187−}
188−
189−void DirectionalDragArea::setImmediateRecognition(bool enabled)
190−{
191− if (d->immediateRecognition != enabled) {
192− d->immediateRecognition = enabled;
193− Q_EMIT immediateRecognitionChanged(enabled);
194− }
195−}
196−
197−bool DirectionalDragArea::monitorOnly() const
198−{
199− return d->monitorOnly;
200−}
201−
202−void DirectionalDragArea::setMonitorOnly(bool monitorOnly)
203−{
204− if (d->monitorOnly != monitorOnly) {
205− d->monitorOnly = monitorOnly;
206−
207− if (monitorOnly && d->status == DirectionalDragAreaPrivate::Undecided) {
208− TouchRegistry::instance()->removeCandidateOwnerForTouch(d->touchId, this);
209− // We still wanna know when it ends for keeping the composition time window up-to-date
210− TouchRegistry::instance()->addTouchWatcher(d->touchId, this);
211− }
212−
213− Q_EMIT monitorOnlyChanged(monitorOnly);
214− }
215−}
216−
217−void DirectionalDragArea::removeTimeConstraints()
218−{
219− d->setMaxTime(60 * 60 * 1000);
220− d->compositionTime = 0;
221− ddaDebug("removed time constraints");
222−}
223−
224−bool DirectionalDragArea::event(QEvent *event)
225−{
226− if (event->type() == TouchOwnershipEvent::touchOwnershipEventType()) {
227− d->touchOwnershipEvent(static_cast<TouchOwnershipEvent *>(event));
228− return true;
229− } else if (event->type() == UnownedTouchEvent::unownedTouchEventType()) {
230− d->unownedTouchEvent(static_cast<UnownedTouchEvent *>(event));
231− return true;
232− } else {
233− return QQuickItem::event(event);
234− }
235−}
236−
237−void DirectionalDragAreaPrivate::touchOwnershipEvent(TouchOwnershipEvent *event)
238−{
239− if (event->gained()) {
240− QVector<int> ids;
241− ids.append(event->touchId());
242− ddaDebug("grabbing touch");
243− q->grabTouchPoints(ids);
244−
245− // Work around for Qt bug. If we grab a touch that is being used for mouse pointer
246− // emulation it will cause the emulation logic to go nuts.
247− // Thus we have to also grab the mouse in this case.
248− //
249− // The fix for this bug has landed in Qt 5.4 (https://codereview.qt-project.org/96887)
250− // TODO: Remove this workaround once we start using Qt 5.4
251− if (q->window()) {
252− QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(q->window());
253− if (windowPrivate->touchMouseId == event->touchId() && q->window()->mouseGrabberItem()) {
254− ddaDebug("removing mouse grabber");
255− q->window()->mouseGrabberItem()->ungrabMouse();
256− }
257− }
258− } else {
259− // We still wanna know when it ends for keeping the composition time window up-to-date
260− TouchRegistry::instance()->addTouchWatcher(touchId, q);
261−
262− setStatus(WaitingForTouch);
263− }
264−}
265−
266−void DirectionalDragAreaPrivate::unownedTouchEvent(UnownedTouchEvent *unownedTouchEvent)
267−{
268− QTouchEvent *event = unownedTouchEvent->touchEvent();
269−
270− Q_ASSERT(!event->touchPointStates().testFlag(Qt::TouchPointPressed));
271−
272− ddaDebug("Unowned " << timeSource->msecsSinceReference() << " " << qPrintable(touchEventToString(event)));
273−
274− switch (status) {
275− case WaitingForTouch:
276− // do nothing
277− break;
278− case Undecided:
279− Q_ASSERT(q->isEnabled() && q->isVisible());
280− unownedTouchEvent_undecided(unownedTouchEvent);
281− break;
282− default: // Recognized:
283− if (monitorOnly) {
284− // Treat unowned event as if we owned it, but we are really just watching it
285− touchEvent_recognized(event);
286− }
287− break;
288− }
289−
290− activeTouches.update(event);
291−}
292−
293−void DirectionalDragAreaPrivate::unownedTouchEvent_undecided(UnownedTouchEvent *unownedTouchEvent)
294−{
295− const QTouchEvent::TouchPoint *touchPoint = fetchTargetTouchPoint(unownedTouchEvent->touchEvent());
296− if (!touchPoint) {
297− qCritical() << "DirectionalDragArea[status=Undecided]: touch " << touchId
298− << "missing from UnownedTouchEvent without first reaching state Qt::TouchPointReleased. "
299− "Considering it as released.";
300−
301− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
302− setStatus(WaitingForTouch);
303− return;
304− }
305−
306− const QPointF &touchScenePos = touchPoint->scenePos();
307−
308− if (touchPoint->state() == Qt::TouchPointReleased) {
309− // touch has ended before recognition concluded
310− ddaDebug("Touch has ended before recognition concluded");
311− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
312− setStatus(WaitingForTouch);
313− return;
314− }
315−
316− previousDampedScenePos.setX(dampedScenePos.x());
317− previousDampedScenePos.setY(dampedScenePos.y());
318− dampedScenePos.update(touchScenePos);
319−
320− if (!movingInRightDirection()) {
321− ddaDebug("Rejecting gesture because touch point is moving in the wrong direction.");
322− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
323− // We still wanna know when it ends for keeping the composition time window up-to-date
324− TouchRegistry::instance()->addTouchWatcher(touchId, q);
325− setStatus(WaitingForTouch);
326− return;
327− }
328−
329− if (isWithinTouchCompositionWindow()) {
330− // There's still time for some new touch to appear and ruin our party as it would be combined
331− // with our touchId one and therefore deny the possibility of a single-finger gesture.
332− ddaDebug("Sill within composition window. Let's wait more.");
333− return;
334− }
335−
336− if (movedFarEnoughAlongGestureAxis()) {
337− if (!monitorOnly) {
338− TouchRegistry::instance()->requestTouchOwnership(touchId, q);
339− }
340− setStatus(Recognized);
341− setPublicPos(touchPoint->pos());
342− setPublicScenePos(touchScenePos);
343− } else if (isPastMaxDistance()) {
344− ddaDebug("Rejecting gesture because it went farther than maxDistance without getting recognized.");
345− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
346− // We still wanna know when it ends for keeping the composition time window up-to-date
347− TouchRegistry::instance()->addTouchWatcher(touchId, q);
348− setStatus(WaitingForTouch);
349− } else {
350− ddaDebug("Didn't move far enough yet. Let's wait more.");
351− }
352−}
353−
354−void DirectionalDragArea::touchEvent(QTouchEvent *event)
355−{
356− // TODO: Consider when more than one touch starts in the same event (although it's not possible
357− // with Mir's android-input). Have to track them all. Consider it a plus/bonus.
358−
359− ddaDebug(d->timeSource->msecsSinceReference() << " " << qPrintable(touchEventToString(event)));
360−
361− if (!isEnabled() || !isVisible()) {
362− QQuickItem::touchEvent(event);
363− return;
364− }
365−
366− switch (d->status) {
367− case DirectionalDragAreaPrivate::WaitingForTouch:
368− d->touchEvent_absent(event);
369− break;
370− case DirectionalDragAreaPrivate::Undecided:
371− d->touchEvent_undecided(event);
372− break;
373− default: // Recognized:
374− d->touchEvent_recognized(event);
375− break;
376− }
377−
378− d->activeTouches.update(event);
379−}
380−
381−void DirectionalDragAreaPrivate::touchEvent_absent(QTouchEvent *event)
382−{
383− // TODO: accept/reject is for the whole event, not per touch id. See how that affects us.
384−
385− if (!event->touchPointStates().testFlag(Qt::TouchPointPressed)) {
386− // Nothing to see here. No touch starting in this event.
387− return;
388− }
389−
390− // to be proven wrong, if that's the case
391− bool allGood = true;
392−
393− if (isWithinTouchCompositionWindow()) {
394− // too close to the last touch start. So we consider them as starting roughly at the same time.
395− // Can't be a single-touch gesture.
396− ddaDebug("A new touch point came in but we're still within time composition window. Ignoring it.");
397− allGood = false;
398− }
399−
400− const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
401−
402− const QTouchEvent::TouchPoint *newTouchPoint = nullptr;
403− for (int i = 0; i < touchPoints.count() && allGood; ++i) {
404− const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
405− if (touchPoint.state() == Qt::TouchPointPressed) {
406− if (newTouchPoint) {
407− // more than one touch starting in this QTouchEvent. Can't be a single-touch gesture
408− allGood = false;
409− } else {
410− // that's our candidate
411− newTouchPoint = &touchPoint;
412− }
413− }
414− }
415−
416− if (allGood) {
417− allGood = sanityCheckRecognitionProperties();
418− if (!allGood) {
419− qWarning("DirectionalDragArea: recognition properties are wrongly set. Gesture recognition"
420− " is impossible");
421− }
422− }
423−
424− if (allGood) {
425− Q_ASSERT(newTouchPoint);
426−
427− startPos = newTouchPoint->pos();
428− startScenePos = newTouchPoint->scenePos();
429− touchId = newTouchPoint->id();
430− dampedScenePos.reset(startScenePos);
431− setPublicPos(startPos);
432−
433− setPublicScenePos(startScenePos);
434− updateSceneDirectionVector();
435−
436− if (recognitionIsDisabled()) {
437− // Behave like a dumb TouchArea
438− ddaDebug("Gesture recognition is disabled. Requesting touch ownership immediately.");
439− setStatus(Recognized);
440− if (monitorOnly) {
441− watchPressedTouchPoints(touchPoints);
442− event->ignore();
443− } else {
444− TouchRegistry::instance()->requestTouchOwnership(touchId, q);
445− event->accept();
446− }
447− } else {
448− // just monitor the touch points for now.
449− if (monitorOnly) {
450− watchPressedTouchPoints(touchPoints);
451− } else {
452− TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, q);
453− }
454−
455− setStatus(Undecided);
456− // Let the item below have it. We will monitor it and grab it later if a gesture
457− // gets recognized.
458− event->ignore();
459− }
460− } else {
461− watchPressedTouchPoints(touchPoints);
462− event->ignore();
463− }
464−}
465−
466−void DirectionalDragAreaPrivate::touchEvent_undecided(QTouchEvent *event)
467−{
468− Q_ASSERT(fetchTargetTouchPoint(event) == nullptr);
469−
470− // We're not interested in new touch points. We already have our candidate (touchId).
471− // But we do want to know when those new touches end for keeping the composition time
472− // window up-to-date
473− event->ignore();
474− watchPressedTouchPoints(event->touchPoints());
475−
476− if (event->touchPointStates().testFlag(Qt::TouchPointPressed) && isWithinTouchCompositionWindow()) {
477− // multi-finger drags are not accepted
478− ddaDebug("Multi-finger drags are not accepted");
479−
480− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
481− // We still wanna know when it ends for keeping the composition time window up-to-date
482− TouchRegistry::instance()->addTouchWatcher(touchId, q);
483−
484− setStatus(WaitingForTouch);
485− }
486−}
487−
488−void DirectionalDragAreaPrivate::touchEvent_recognized(QTouchEvent *event)
489−{
490− const QTouchEvent::TouchPoint *touchPoint = fetchTargetTouchPoint(event);
491−
492− if (!touchPoint) {
493− qCritical() << "DirectionalDragArea[status=Recognized]: touch " << touchId
494− << "missing from QTouchEvent without first reaching state Qt::TouchPointReleased. "
495− "Considering it as released.";
496− setStatus(WaitingForTouch);
497− } else {
498− setPublicPos(touchPoint->pos());
499− setPublicScenePos(touchPoint->scenePos());
500−
501− if (touchPoint->state() == Qt::TouchPointReleased) {
502− setStatus(WaitingForTouch);
503− }
504− }
505−}
506−
507−void DirectionalDragAreaPrivate::watchPressedTouchPoints(const QList<QTouchEvent::TouchPoint> &touchPoints)
508−{
509− for (int i = 0; i < touchPoints.count(); ++i) {
510− const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
511− if (touchPoint.state() == Qt::TouchPointPressed) {
512− TouchRegistry::instance()->addTouchWatcher(touchPoint.id(), q);
513− }
514− }
515−}
516−
517−bool DirectionalDragAreaPrivate::recognitionIsDisabled() const
518−{
519− return immediateRecognition || (distanceThreshold <= 0 && compositionTime <= 0);
520−}
521−
522−bool DirectionalDragAreaPrivate::sanityCheckRecognitionProperties()
523−{
524− return recognitionIsDisabled()
525− || (distanceThreshold < maxDistance && compositionTime < maxTime);
526−}
527−
528−const QTouchEvent::TouchPoint *DirectionalDragAreaPrivate::fetchTargetTouchPoint(QTouchEvent *event)
529−{
530− const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
531− const QTouchEvent::TouchPoint *touchPoint = 0;
532− for (int i = 0; i < touchPoints.size(); ++i) {
533− if (touchPoints.at(i).id() == touchId) {
534− touchPoint = &touchPoints.at(i);
535− break;
536− }
537− }
538− return touchPoint;
539−}
540−
541−bool DirectionalDragAreaPrivate::movingInRightDirection() const
542−{
543− if (direction == Direction::Horizontal || direction == Direction::Vertical) {
544− return true;
545− } else {
546− QPointF movementVector(dampedScenePos.x() - previousDampedScenePos.x(),
547− dampedScenePos.y() - previousDampedScenePos.y());
548−
549− qreal scalarProjection = projectOntoDirectionVector(movementVector);
550−
551− return scalarProjection >= 0.;
552− }
553−}
554−
555−bool DirectionalDragAreaPrivate::movedFarEnoughAlongGestureAxis() const
556−{
557− if (distanceThreshold <= 0.) {
558− // distance threshold check is disabled
559− return true;
560− } else {
561− QPointF totalMovement(dampedScenePos.x() - startScenePos.x(),
562− dampedScenePos.y() - startScenePos.y());
563−
564− qreal scalarProjection = projectOntoDirectionVector(totalMovement);
565−
566− ddaDebug(" movedFarEnoughAlongGestureAxis: scalarProjection=" << scalarProjection
567− << ", distanceThreshold=" << distanceThreshold);
568−
569− if (direction == Direction::Horizontal || direction == Direction::Vertical) {
570− return qAbs(scalarProjection) > distanceThreshold;
571− } else {
572− return scalarProjection > distanceThreshold;
573− }
574− }
575−}
576−
577−bool DirectionalDragAreaPrivate::isPastMaxDistance() const
578−{
579− QPointF totalMovement(dampedScenePos.x() - startScenePos.x(),
580− dampedScenePos.y() - startScenePos.y());
581−
582− qreal squaredDistance = totalMovement.x()*totalMovement.x() + totalMovement.y()*totalMovement.y();
583− return squaredDistance > maxDistance*maxDistance;
584−}
585−
586−void DirectionalDragAreaPrivate::giveUpIfDisabledOrInvisible()
587−{
588− if (!q->isEnabled() || !q->isVisible()) {
589− if (status == Undecided) {
590− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
591− // We still wanna know when it ends for keeping the composition time window up-to-date
592− TouchRegistry::instance()->addTouchWatcher(touchId, q);
593− }
594−
595− if (status != WaitingForTouch) {
596− ddaDebug("Resetting status because got disabled or made invisible");
597− setStatus(WaitingForTouch);
598− }
599− }
600−}
601−
602−void DirectionalDragAreaPrivate::rejectGesture()
603−{
604− if (status == Undecided) {
605− ddaDebug("Rejecting gesture because it's taking too long to drag beyond the threshold.");
606−
607− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
608− // We still wanna know when it ends for keeping the composition time window up-to-date
609− TouchRegistry::instance()->addTouchWatcher(touchId, q);
610−
611− setStatus(WaitingForTouch);
612− }
613−}
614−
615−void DirectionalDragAreaPrivate::setStatus(Status newStatus)
616−{
617− if (newStatus == status)
618− return;
619−
620− Status oldStatus = status;
621−
622− if (oldStatus == Undecided) {
623− recognitionTimer->stop();
624− }
625−
626− status = newStatus;
627− Q_EMIT statusChanged(status);
628−
629− ddaDebug(statusToString(oldStatus) << " -> " << statusToString(newStatus));
630−
631− switch (newStatus) {
632− case WaitingForTouch:
633− if (oldStatus == Recognized) {
634− Q_EMIT q->draggingChanged(false);
635− }
636− Q_EMIT q->pressedChanged(false);
637− break;
638− case Undecided:
639− recognitionTimer->start();
640− Q_EMIT q->pressedChanged(true);
641− break;
642− case Recognized:
643− if (oldStatus == WaitingForTouch) { // for immediate recognition
644− Q_EMIT q->pressedChanged(true);
645− }
646− Q_EMIT q->draggingChanged(true);
647− break;
648− default:
649− // no-op
650− break;
651− }
652−}
653−
654−void DirectionalDragAreaPrivate::setPublicPos(const QPointF point)
655−{
656− bool xChanged = publicPos.x() != point.x();
657− bool yChanged = publicPos.y() != point.y();
658−
659− // Public position should not get updated while the gesture is still being recognized
660− // (ie, Undecided status).
661− Q_ASSERT(status == WaitingForTouch || status == Recognized);
662−
663− if (status == Recognized && !recognitionIsDisabled()) {
664− // When the gesture finally gets recognized, the finger will likely be
665− // reasonably far from the edge. If we made the contentX immediately
666− // follow the finger position it would be visually unpleasant as it
667− // would appear right next to the user's finger out of nowhere (ie,
668− // it would jump). Instead, we make contentX go towards the user's
669− // finger in several steps. ie., in an animated way.
670− QPointF delta = point - publicPos;
671− // the trick is not to go all the way (1.0) as it would cause a sudden jump
672− publicPos.rx() += 0.4 * delta.x();
673− publicPos.ry() += 0.4 * delta.y();
674− } else {
675− // no smoothing when initializing or if gesture recognition was immediate as there will
676− // be no jump.
677− publicPos = point;
678− }
679−
680− if (xChanged) {
681− Q_EMIT q->touchXChanged(publicPos.x());
682− if (Direction::isHorizontal(direction))
683− Q_EMIT q->distanceChanged(q->distance());
684− }
685−
686− if (yChanged) {
687− Q_EMIT q->touchYChanged(publicPos.y());
688− if (Direction::isVertical(direction))
689− Q_EMIT q->distanceChanged(q->distance());
690− }
691−}
692−
693−void DirectionalDragAreaPrivate::setPublicScenePos(const QPointF point)
694−{
695− bool xChanged = publicScenePos.x() != point.x();
696− bool yChanged = publicScenePos.y() != point.y();
697−
698− if (!xChanged && !yChanged)
699− return;
700−
701− // Public position should not get updated while the gesture is still being recognized
702− // (ie, Undecided status).
703− Q_ASSERT(status == WaitingForTouch || status == Recognized);
704−
705− qreal oldSceneDistance = sceneDistance;
706−
707− if (status == Recognized && !recognitionIsDisabled()) {
708− // When the gesture finally gets recognized, the finger will likely be
709− // reasonably far from the edge. If we made the contentX immediately
710− // follow the finger position it would be visually unpleasant as it
711− // would appear right next to the user's finger out of nowhere (ie,
712− // it would jump). Instead, we make contentX go towards the user's
713− // finger in several steps. ie., in an animated way.
714− QPointF delta = point - publicScenePos;
715− // the trick is not to go all the way (1.0) as it would cause a sudden jump
716− publicScenePos.rx() += 0.4 * delta.x();
717− publicScenePos.ry() += 0.4 * delta.y();
718− } else {
719− // no smoothing when initializing or if gesture recognition was immediate as there will
720− // be no jump.
721− publicScenePos = point;
722− }
723−
724− updateSceneDistance();
725−
726− if (oldSceneDistance != sceneDistance) {
727− Q_EMIT q->sceneDistanceChanged(sceneDistance);
728− }
729−
730− if (xChanged) {
731− Q_EMIT q->touchSceneXChanged(publicScenePos.x());
732− }
733−
734− if (yChanged) {
735− Q_EMIT q->touchSceneYChanged(publicScenePos.y());
736− }
737−}
738−
739−bool DirectionalDragAreaPrivate::isWithinTouchCompositionWindow()
740−{
741− return
742− compositionTime > 0 &&
743− !activeTouches.isEmpty() &&
744− timeSource->msecsSinceReference() <=
745− activeTouches.mostRecentStartTime() + (qint64)compositionTime;
746−}
747−
748−void DirectionalDragArea::itemChange(ItemChange change, const ItemChangeData &value)
749−{
750− if (change == QQuickItem::ItemSceneChange) {
751− if (value.window != nullptr) {
752− value.window->installEventFilter(TouchRegistry::instance());
753−
754− // TODO: Handle window->screen() changes (ie window changing screens)
755−
756− qreal pixelsPerInch = value.window->screen()->physicalDotsPerInch();
757− if (pixelsPerInch < 0) {
758− // It can return garbage when run in a XVFB server (Virtual Framebuffer 'fake' X server)
759− pixelsPerInch = 72;
760− }
761−
762− d->setPixelsPerMm(pixelsPerInch / 25.4);
763− }
764− }
765−}
766−
767−void DirectionalDragAreaPrivate::setPixelsPerMm(qreal pixelsPerMm)
768−{
769− dampedScenePos.setMaxDelta(1. * pixelsPerMm);
770− setDistanceThreshold(4. * pixelsPerMm);
771− maxDistance = 10. * pixelsPerMm;
772−}
773−
774−//************************** ActiveTouchesInfo **************************
775−
776−ActiveTouchesInfo::ActiveTouchesInfo(const SharedTimeSource &timeSource)
777− : m_timeSource(timeSource)
778−{
779−}
780−
781−void ActiveTouchesInfo::update(QTouchEvent *event)
782−{
783− if (!(event->touchPointStates() & (Qt::TouchPointPressed | Qt::TouchPointReleased))) {
784− // nothing to update
785− #if ACTIVETOUCHESINFO_DEBUG
786− qDebug("[DDA::ActiveTouchesInfo] Nothing to Update");
787− #endif
788− return;
789− }
790−
791− const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
792− for (int i = 0; i < touchPoints.count(); ++i) {
793− const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
794− if (touchPoint.state() == Qt::TouchPointPressed) {
795− addTouchPoint(touchPoint.id());
796− } else if (touchPoint.state() == Qt::TouchPointReleased) {
797− removeTouchPoint(touchPoint.id());
798− }
799− }
800−}
801−
802−#if ACTIVETOUCHESINFO_DEBUG
803−QString ActiveTouchesInfo::toString()
804−{
805− QString string = "(";
806−
807− {
808− QTextStream stream(&string);
809− m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
810− stream << "(id=" << touchInfo->id << ",startTime=" << touchInfo->startTime << ")";
811− return true;
812− });
813− }
814−
815− string.append(")");
816−
817− return string;
818−}
819−#endif // ACTIVETOUCHESINFO_DEBUG
820−
821−void ActiveTouchesInfo::addTouchPoint(int touchId)
822−{
823− ActiveTouchInfo &activeTouchInfo = m_touchInfoPool.getEmptySlot();
824− activeTouchInfo.id = touchId;
825− activeTouchInfo.startTime = m_timeSource->msecsSinceReference();
826−
827− #if ACTIVETOUCHESINFO_DEBUG
828− qDebug() << "[DDA::ActiveTouchesInfo]" << qPrintable(toString());
829− #endif
830−}
831−
832−qint64 ActiveTouchesInfo::touchStartTime(int touchId)
833−{
834− qint64 result = -1;
835−
836− m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
837− if (touchId == touchInfo->id) {
838− result = touchInfo->startTime;
839− return false;
840− } else {
841− return true;
842− }
843− });
844−
845− Q_ASSERT(result != -1);
846− return result;
847−}
848−
849−void ActiveTouchesInfo::removeTouchPoint(int touchId)
850−{
851− m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
852− if (touchId == touchInfo->id) {
853− m_touchInfoPool.freeSlot(touchInfo);
854− return false;
855− } else {
856− return true;
857− }
858− });
859−
860− #if ACTIVETOUCHESINFO_DEBUG
861− qDebug() << "[DDA::ActiveTouchesInfo]" << qPrintable(toString());
862− #endif
863−}
864−
865−qint64 ActiveTouchesInfo::mostRecentStartTime()
866−{
867− Q_ASSERT(!m_touchInfoPool.isEmpty());
868−
869− qint64 highestStartTime = -1;
870−
871− m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &activeTouchInfo) {
872− if (activeTouchInfo->startTime > highestStartTime) {
873− highestStartTime = activeTouchInfo->startTime;
874− }
875− return true;
876− });
877−
878− return highestStartTime;
879−}
880−
881−void DirectionalDragAreaPrivate::updateSceneDirectionVector()
882−{
883− QPointF localOrigin(0., 0.);
884− QPointF localDirection;
885− switch (direction) {
886− case Direction::Upwards:
887− localDirection.rx() = 0.;
888− localDirection.ry() = -1.;
889− break;
890− case Direction::Downwards:
891− case Direction::Vertical:
892− localDirection.rx() = 0.;
893− localDirection.ry() = 1;
894− break;
895− case Direction::Leftwards:
896− localDirection.rx() = -1.;
897− localDirection.ry() = 0.;
898− break;
899− default: // Direction::Rightwards || Direction.Horizontal
900− localDirection.rx() = 1.;
901− localDirection.ry() = 0.;
902− break;
903− }
904− QPointF sceneOrigin = q->mapToScene(localOrigin);
905− QPointF sceneDirection = q->mapToScene(localDirection);
906− sceneDirectionVector = sceneDirection - sceneOrigin;
907−}
908−
909−qreal DirectionalDragAreaPrivate::projectOntoDirectionVector(const QPointF sceneVector) const
910−{
911− // same as dot product as sceneDirectionVector is a unit vector
912− return sceneVector.x() * sceneDirectionVector.x() +
913− sceneVector.y() * sceneDirectionVector.y();
914−}
915−
916−DirectionalDragAreaPrivate::DirectionalDragAreaPrivate(DirectionalDragArea *q)
917− : q(q)
918− , status(WaitingForTouch)
919− , sceneDistance(0)
920− , touchId(-1)
921− , direction(Direction::Rightwards)
922− , distanceThreshold(0)
923− , distanceThresholdSquared(0.)
924− , maxTime(400)
925− , compositionTime(60)
926− , immediateRecognition(false)
927− , recognitionTimer(nullptr)
928− , timeSource(new RealTimeSource)
929− , activeTouches(timeSource)
930− , monitorOnly(false)
931−{
932−}
plugins/Ubuntu/Gestures/DirectionalDragArea.hdeleted−143
@@ -1,143 +0,0 @@
1−/*
2− * Copyright (C) 2013,2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef DIRECTIONAL_DRAG_AREA_H
18−#define DIRECTIONAL_DRAG_AREA_H
19−
20−#include <QtQuick/QQuickItem>
21−#include "UbuntuGesturesQmlGlobal.h"
22−#include "Damper.h"
23−#include "Direction.h"
24−
25−// lib UbuntuGestures
26−#include <Pool.h>
27−#include <Timer.h>
28−
29−class TouchOwnershipEvent;
30−class UnownedTouchEvent;
31−class DirectionalDragAreaPrivate;
32−
33−/*
34− An area that detects axis-aligned single-finger drag gestures
35−
36− If a drag deviates too much from the components' direction recognition will
37− fail. It will also fail if the drag or flick is too short. E.g. a noisy or
38− fidgety click
39−
40− See doc/DirectionalDragArea.svg
41− */
42−class UBUNTUGESTURESQML_EXPORT DirectionalDragArea : public QQuickItem {
43− Q_OBJECT
44−
45− // The direction in which the gesture should move in order to be recognized.
46− Q_PROPERTY(Direction::Type direction READ direction WRITE setDirection NOTIFY directionChanged)
47−
48− // The distance travelled by the finger along the axis specified by
49− // DirectionalDragArea's direction.
50− Q_PROPERTY(qreal distance READ distance NOTIFY distanceChanged)
51−
52− // The distance travelled by the finger along the axis specified by
53− // DirectionalDragArea's direction in scene coordinates
54− Q_PROPERTY(qreal sceneDistance READ sceneDistance NOTIFY sceneDistanceChanged)
55−
56− // Position of the touch point performing the drag relative to this item.
57− Q_PROPERTY(qreal touchX READ touchX NOTIFY touchXChanged)
58− Q_PROPERTY(qreal touchY READ touchY NOTIFY touchYChanged)
59−
60− // Position of the touch point performing the drag, in scene's coordinate system
61− Q_PROPERTY(qreal touchSceneX READ touchSceneX NOTIFY touchSceneXChanged)
62− Q_PROPERTY(qreal touchSceneY READ touchSceneY NOTIFY touchSceneYChanged)
63−
64− // Whether a drag gesture is taking place
65− Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged)
66−
67− // Whether the drag area is pressed.
68− Q_PROPERTY(bool pressed READ pressed NOTIFY pressedChanged)
69−
70− // Whether a gesture should be Recognized as soon a touch lands on the area.
71− // With this property enabled it will work pretty much like a MultiPointTouchArea,
72− // just with a different API.
73− //
74− // It's false by default. In most cases you will not want that enabled.
75− Q_PROPERTY(bool immediateRecognition
76− READ immediateRecognition
77− WRITE setImmediateRecognition
78− NOTIFY immediateRecognitionChanged)
79−
80− // Whether we are merely monitoring touch events (in which case, we don't
81− // claim ownership of the touch).
82− Q_PROPERTY(bool monitorOnly READ monitorOnly WRITE setMonitorOnly NOTIFY monitorOnlyChanged)
83−
84− Q_ENUMS(Direction)
85−public:
86− DirectionalDragArea(QQuickItem *parent = 0);
87−
88− Direction::Type direction() const;
89− void setDirection(Direction::Type);
90−
91− qreal distance() const;
92− qreal sceneDistance() const;
93−
94− qreal touchX() const;
95− qreal touchY() const;
96−
97− qreal touchSceneX() const;
98− qreal touchSceneY() const;
99−
100− bool dragging() const;
101−
102− bool pressed() const;
103−
104− bool immediateRecognition() const;
105− void setImmediateRecognition(bool enabled);
106−
107− bool monitorOnly() const;
108− void setMonitorOnly(bool monitorOnly);
109−
110− bool event(QEvent *e) override;
111−
112− /*
113− In qmltests, sequences of touch events are sent all at once, unlike in "real life".
114− Also qmltests might run really slowly, e.g. when run from inside virtual machines.
115− Thus to remove a variable that qmltests cannot really control, namely time, this
116− function removes all constraints that are sensible to elapsed time.
117−
118− This effectively makes the DirectionalDragArea easier to fool.
119− */
120− Q_INVOKABLE void removeTimeConstraints();
121−
122−Q_SIGNALS:
123− void directionChanged(Direction::Type direction);
124− void draggingChanged(bool value);
125− void pressedChanged(bool value);
126− void distanceChanged(qreal value);
127− void sceneDistanceChanged(qreal value);
128− void touchXChanged(qreal value);
129− void touchYChanged(qreal value);
130− void touchSceneXChanged(qreal value);
131− void touchSceneYChanged(qreal value);
132− void immediateRecognitionChanged(bool value);
133− void monitorOnlyChanged(bool value);
134−
135−protected:
136− void touchEvent(QTouchEvent *event) override;
137− void itemChange(ItemChange change, const ItemChangeData &value) override;
138−
139−public: // so tests can access it
140− DirectionalDragAreaPrivate *d;
141−};
142−
143−#endif // DIRECTIONAL_DRAG_AREA_H
plugins/Ubuntu/Gestures/DirectionalDragArea_p.hdeleted−169
@@ -1,169 +0,0 @@
1−/*
2− * Copyright (C) 2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef DIRECTIONAL_DRAG_AREA_PRIV_H
18−#define DIRECTIONAL_DRAG_AREA_PRIV_H
19−
20−// Information about an active touch point
21−struct UBUNTUGESTURESQML_EXPORT ActiveTouchInfo {
22− ActiveTouchInfo() : id(-1), startTime(-1) {}
23− bool isValid() const { return id != -1; }
24− void reset() { id = -1; }
25− int id;
26− qint64 startTime;
27−};
28−class UBUNTUGESTURESQML_EXPORT ActiveTouchesInfo {
29−public:
30− ActiveTouchesInfo(const UbuntuGestures::SharedTimeSource &timeSource);
31− void update(QTouchEvent *event);
32− qint64 touchStartTime(int id);
33− bool isEmpty() const { return m_touchInfoPool.isEmpty(); }
34− qint64 mostRecentStartTime();
35− UbuntuGestures::SharedTimeSource m_timeSource;
36−private:
37− void addTouchPoint(int touchId);
38− void removeTouchPoint(int touchId);
39− #if ACTIVETOUCHESINFO_DEBUG
40− QString toString();
41− #endif
42−
43− Pool<ActiveTouchInfo> m_touchInfoPool;
44−};
45−
46−class UBUNTUGESTURESQML_EXPORT DirectionalDragAreaPrivate : public QObject {
47− Q_OBJECT
48−
49− Q_ENUMS(Status)
50−public:
51− DirectionalDragAreaPrivate(DirectionalDragArea *q);
52−
53−public Q_SLOTS:
54− void giveUpIfDisabledOrInvisible();
55− void rejectGesture();
56−
57−public:
58− // Describes the state of the directional drag gesture.
59− enum Status {
60− // Waiting for a new touch point to land on this area. No gesture is being processed
61− // or tracked.
62− WaitingForTouch,
63−
64− // A touch point has landed on this area but it's not know yet whether it is
65− // performing a drag in the correct direction.
66− // If it's decided that the touch point is not performing a directional drag gesture,
67− // it will be rejected/ignored and status will return to WaitingForTouch.
68− Undecided, //Recognizing,
69−
70− // There's a touch point in this area and it performed a drag in the correct
71− // direction.
72− //
73− // Once recognized, the gesture state will move back to WaitingForTouch only once
74− // that touch point ends. The gesture will remain in the Recognized state even if
75− // the touch point starts moving in other directions or halts.
76− Recognized,
77− };
78−
79− void touchEvent_absent(QTouchEvent *event);
80− void touchEvent_undecided(QTouchEvent *event);
81− void touchEvent_recognized(QTouchEvent *event);
82− bool movingInRightDirection() const;
83− bool movedFarEnoughAlongGestureAxis() const;
84− bool isPastMaxDistance() const;
85− const QTouchEvent::TouchPoint *fetchTargetTouchPoint(QTouchEvent *event);
86− void setStatus(Status newStatus);
87− void setPublicPos(const QPointF point);
88− void setPublicScenePos(const QPointF point);
89− bool isWithinTouchCompositionWindow();
90− void updateSceneDirectionVector();
91− // returns the scalar projection between the given vector (in scene coordinates)
92− // and m_sceneDirectionVector
93− qreal projectOntoDirectionVector(const QPointF sceneVector) const;
94− void touchOwnershipEvent(TouchOwnershipEvent *event);
95− void unownedTouchEvent(UnownedTouchEvent *event);
96− void unownedTouchEvent_undecided(UnownedTouchEvent *unownedTouchEvent);
97− void watchPressedTouchPoints(const QList<QTouchEvent::TouchPoint> &touchPoints);
98− bool recognitionIsDisabled() const;
99− bool sanityCheckRecognitionProperties();
100− void updateSceneDistance();
101− void setMaxTime(int value);
102− void setDistanceThreshold(qreal value);
103− void setPixelsPerMm(qreal pixelsPerMm);
104− QString objectName() const { return q->objectName(); }
105−
106− // Replaces the existing Timer with the given one.
107− //
108− // Useful for providing a fake timer when testing.
109− void setRecognitionTimer(UbuntuGestures::AbstractTimer *timer);
110−
111− // Useful for testing, where a fake time source can be supplied
112− void setTimeSource(const UbuntuGestures::SharedTimeSource &timeSource);
113−
114− DirectionalDragArea *q;
115−
116− // The current status of the directional drag gesture area.
117− Status status;
118−
119− QPointF startPos;
120− QPointF startScenePos;
121− qreal sceneDistance;
122− int touchId;
123−
124− // The touch position exposed in the public API.
125− // It only starts to move once the gesture gets recognized.
126− QPointF publicPos;
127− QPointF publicScenePos;
128−
129− // A movement damper is used in some of the gesture recognition calculations
130− // to get rid of noise or small oscillations in the touch position.
131− DampedPointF dampedScenePos;
132− QPointF previousDampedScenePos;
133−
134− // Unit vector in scene coordinates describing the direction of the gesture recognition
135− QPointF sceneDirectionVector;
136−
137− Direction::Type direction;
138−
139− // How far a touch point has to move from its initial position along the gesture axis in order
140− // for it to be recognized as a directional drag.
141− qreal distanceThreshold;
142− qreal distanceThresholdSquared; // it's pow(distanceThreshold, 2)
143−
144− // Maximum time (in milliseconds) the gesture can take to go beyond the distance threshold
145− int maxTime;
146−
147− // Maximum distance the gesture can go without crossing the axis-aligned distance threshold
148− qreal maxDistance;
149−
150− // Maximum time (in milliseconds) after the start of a given touch point where
151− // subsequent touch starts are grouped with the first one into an N-touches gesture
152− // (e.g. a two-fingers tap or drag).
153− int compositionTime;
154−
155− bool immediateRecognition;
156−
157− UbuntuGestures::AbstractTimer *recognitionTimer;
158−
159− UbuntuGestures::SharedTimeSource timeSource;
160−
161− ActiveTouchesInfo activeTouches;
162−
163− bool monitorOnly;
164−
165−Q_SIGNALS:
166− void statusChanged(Status value);
167−};
168−
169−#endif // DIRECTIONAL_DRAG_AREA_PRIV_H
plugins/Ubuntu/Gestures/FloatingFlickable.cppdeleted−150
@@ -1,150 +0,0 @@
1−/*
2− * Copyright (C) 2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "FloatingFlickable.h"
18−
19−#include <private/qquickflickable_p.h>
20−#include "DirectionalDragArea.h"
21−
22−#include <QDebug>
23−
24−FloatingFlickable::FloatingFlickable(QQuickItem *parent)
25− : QQuickItem(parent)
26− , m_mousePressed(false)
27−{
28− m_dragArea = new DirectionalDragArea(this);
29− m_dragArea->setWidth(width());
30− m_dragArea->setHeight(height());
31− m_dragArea->setDirection(Direction::Horizontal);
32− connect(m_dragArea, &DirectionalDragArea::touchXChanged,
33− this, &FloatingFlickable::onDragAreaTouchPosChanged);
34− connect(m_dragArea, &DirectionalDragArea::touchYChanged,
35− this, &FloatingFlickable::onDragAreaTouchPosChanged);
36− connect(m_dragArea, &DirectionalDragArea::draggingChanged,
37− this, &FloatingFlickable::onDragAreaDraggingChanged);
38− connect(m_dragArea, &DirectionalDragArea::directionChanged, this, &FloatingFlickable::directionChanged);
39−
40− m_flickable = new QQuickFlickable(this);
41− m_flickable->setEnabled(false);
42− m_flickable->setWidth(width());
43− m_flickable->setHeight(height());
44− connect(m_flickable, &QQuickFlickable::contentWidthChanged, this, &FloatingFlickable::contentWidthChanged);
45− connect(m_flickable, &QQuickFlickable::contentHeightChanged, this, &FloatingFlickable::contentHeightChanged);
46− connect(m_flickable, &QQuickFlickable::contentXChanged, this, &FloatingFlickable::contentXChanged);
47− connect(m_flickable, &QQuickFlickable::contentYChanged, this, &FloatingFlickable::contentYChanged);
48−
49− connect(this, &QQuickItem::widthChanged, this, &FloatingFlickable::updateChildrenWidth);
50− connect(this, &QQuickItem::heightChanged, this, &FloatingFlickable::updateChildrenHeight);
51−}
52−
53−qreal FloatingFlickable::contentWidth() const
54−{
55− return m_flickable->contentWidth();
56−}
57−
58−void FloatingFlickable::setContentWidth(qreal contentWidth)
59−{
60− m_flickable->setContentWidth(contentWidth);
61−}
62−
63−qreal FloatingFlickable::contentHeight() const
64−{
65− return m_flickable->contentHeight();
66−}
67−
68−void FloatingFlickable::setContentHeight(qreal contentHeight)
69−{
70− m_flickable->setContentHeight(contentHeight);
71−}
72−
73−qreal FloatingFlickable::contentX() const
74−{
75− return m_flickable->contentX();
76−}
77−
78−void FloatingFlickable::setContentX(qreal contentX)
79−{
80− m_flickable->setContentX(contentX);
81−}
82−
83−qreal FloatingFlickable::contentY() const
84−{
85− return m_flickable->contentY();
86−}
87−
88−void FloatingFlickable::setContentY(qreal contentY)
89−{
90− m_flickable->setContentY(contentY);
91−}
92−
93−Direction::Type FloatingFlickable::direction() const
94−{
95− return m_dragArea->direction();
96−}
97−
98−void FloatingFlickable::setDirection(Direction::Type direction)
99−{
100− m_dragArea->setDirection(direction);
101− if (Direction::isHorizontal(direction)) {
102− m_flickable->setFlickableDirection(QQuickFlickable::HorizontalFlick);
103− } else {
104− m_flickable->setFlickableDirection(QQuickFlickable::VerticalFlick);
105− }
106−}
107−
108−void FloatingFlickable::updateChildrenWidth()
109−{
110− m_dragArea->setWidth(width());
111− m_flickable->setWidth(width());
112−}
113−
114−void FloatingFlickable::updateChildrenHeight()
115−{
116− m_dragArea->setHeight(height());
117− m_flickable->setHeight(height());
118−}
119−
120−void FloatingFlickable::onDragAreaTouchPosChanged(qreal)
121−{
122− if (m_mousePressed) {
123− QMouseEvent mouseEvent(QEvent::MouseMove,
124− QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
125− Qt::NoButton, Qt::LeftButton, Qt::NoModifier);
126−
127− QCoreApplication::sendEvent(m_flickable, &mouseEvent);
128−
129− }
130−}
131−
132−void FloatingFlickable::onDragAreaDraggingChanged(bool dragging)
133−{
134− if (dragging && !m_mousePressed) {
135− QMouseEvent mouseEvent(QEvent::MouseButtonPress,
136− QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
137− Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
138−
139− QCoreApplication::sendEvent(m_flickable, &mouseEvent);
140− m_mousePressed = true;
141−
142− } else if (!dragging && m_mousePressed) {
143− QMouseEvent mouseEvent(QEvent::MouseButtonRelease,
144− QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
145− Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
146−
147− QCoreApplication::sendEvent(m_flickable, &mouseEvent);
148− m_mousePressed = false;
149− }
150−}
plugins/Ubuntu/Gestures/FloatingFlickable.hdeleted−86
@@ -1,86 +0,0 @@
1−/*
2− * Copyright (C) 2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef FLOATING_FLICKABLE_H
18−#define FLOATING_FLICKABLE_H
19−
20−#include <QQuickItem>
21−#include "UbuntuGesturesQmlGlobal.h"
22−#include "Direction.h"
23−
24−class DirectionalDragArea;
25−class QQuickFlickable;
26−
27−/*
28− A Flickable that can be put in front of the item to be flicked and
29− still have the item-to-be-flicked receive input events that are not flicks.
30−
31− Ie, it's a Flickable that, input-wise, is transparent to non-flick gestures.
32−
33− With a regular Flickable you would have to make the item-to-be-flicked a child
34− of Flicakble to achieve the same result. FloatingFlickable has no such requirement
35− or limitation.
36− */
37−class UBUNTUGESTURESQML_EXPORT FloatingFlickable : public QQuickItem {
38− Q_OBJECT
39−
40− Q_PROPERTY(qreal contentWidth READ contentWidth WRITE setContentWidth NOTIFY contentWidthChanged)
41− Q_PROPERTY(qreal contentHeight READ contentHeight WRITE setContentHeight NOTIFY contentHeightChanged)
42− Q_PROPERTY(qreal contentX READ contentX WRITE setContentX NOTIFY contentXChanged)
43− Q_PROPERTY(qreal contentY READ contentY WRITE setContentY NOTIFY contentYChanged)
44−
45− Q_PROPERTY(Direction::Type direction READ direction WRITE setDirection NOTIFY directionChanged)
46−
47−Q_SIGNALS:
48− void contentWidthChanged();
49− void contentHeightChanged();
50− void contentXChanged();
51− void contentYChanged();
52− void directionChanged();
53−
54−public:
55− FloatingFlickable(QQuickItem *parent = nullptr);
56−
57− qreal contentWidth() const;
58− void setContentWidth(qreal contentWidth);
59−
60− qreal contentHeight() const;
61− void setContentHeight(qreal contentHeight);
62−
63− qreal contentX() const;
64− void setContentX(qreal contentX);
65−
66− qreal contentY() const;
67− void setContentY(qreal contentY);
68−
69− Direction::Type direction() const;
70− void setDirection(Direction::Type);
71−
72−private Q_SLOTS:
73− void updateChildrenWidth();
74− void updateChildrenHeight();
75− void onDragAreaTouchPosChanged(qreal);
76− void onDragAreaDraggingChanged(bool value);
77−
78−private:
79− DirectionalDragArea *m_dragArea;
80− QQuickFlickable *m_flickable;
81− bool m_mousePressed;
82−
83− friend class tst_FloatingFlickable;
84−};
85−
86−#endif // FLOATING_FLICKABLE_H
plugins/Ubuntu/Gestures/Gestures.qmltypesdeleted−209
@@ -1,209 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Ubuntu.Gestures 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "AxisVelocityCalculator"
12− prototype: "QObject"
13− exports: ["Ubuntu.Gestures/AxisVelocityCalculator 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "trackedPosition"; type: "double" }
16− Signal {
17− name: "trackedPositionChanged"
18− Parameter { name: "value"; type: "double" }
19− }
20− Method { name: "calculate"; type: "double" }
21− Method { name: "reset" }
22− }
23− Component {
24− name: "Direction"
25− prototype: "QObject"
26− exports: ["Ubuntu.Gestures/Direction 0.1"]
27− isCreatable: false
28− isSingleton: true
29− exportMetaObjectRevisions: [0]
30− Enum {
31− name: "Type"
32− values: {
33− "Rightwards": 0,
34− "Leftwards": 1,
35− "Downwards": 2,
36− "Upwards": 3,
37− "Horizontal": 4,
38− "Vertical": 5
39− }
40− }
41− Method {
42− name: "isHorizontal"
43− type: "bool"
44− Parameter { name: "type"; type: "Direction::Type" }
45− }
46− Method {
47− name: "isVertical"
48− type: "bool"
49− Parameter { name: "type"; type: "Direction::Type" }
50− }
51− Method {
52− name: "isPositive"
53− type: "bool"
54− Parameter { name: "type"; type: "Direction::Type" }
55− }
56− }
57− Component {
58− name: "DirectionalDragArea"
59− defaultProperty: "data"
60− prototype: "QQuickItem"
61− exports: ["Ubuntu.Gestures/DirectionalDragArea 0.1"]
62− exportMetaObjectRevisions: [0]
63− Property { name: "direction"; type: "Direction::Type" }
64− Property { name: "distance"; type: "double"; isReadonly: true }
65− Property { name: "sceneDistance"; type: "double"; isReadonly: true }
66− Property { name: "touchX"; type: "double"; isReadonly: true }
67− Property { name: "touchY"; type: "double"; isReadonly: true }
68− Property { name: "touchSceneX"; type: "double"; isReadonly: true }
69− Property { name: "touchSceneY"; type: "double"; isReadonly: true }
70− Property { name: "dragging"; type: "bool"; isReadonly: true }
71− Property { name: "pressed"; type: "bool"; isReadonly: true }
72− Property { name: "immediateRecognition"; type: "bool" }
73− Signal {
74− name: "directionChanged"
75− Parameter { name: "direction"; type: "Direction::Type" }
76− }
77− Signal {
78− name: "draggingChanged"
79− Parameter { name: "value"; type: "bool" }
80− }
81− Signal {
82− name: "pressedChanged"
83− Parameter { name: "value"; type: "bool" }
84− }
85− Signal {
86− name: "distanceChanged"
87− Parameter { name: "value"; type: "double" }
88− }
89− Signal {
90− name: "sceneDistanceChanged"
91− Parameter { name: "value"; type: "double" }
92− }
93− Signal {
94− name: "touchXChanged"
95− Parameter { name: "value"; type: "double" }
96− }
97− Signal {
98− name: "touchYChanged"
99− Parameter { name: "value"; type: "double" }
100− }
101− Signal {
102− name: "touchSceneXChanged"
103− Parameter { name: "value"; type: "double" }
104− }
105− Signal {
106− name: "touchSceneYChanged"
107− Parameter { name: "value"; type: "double" }
108− }
109− Signal {
110− name: "immediateRecognitionChanged"
111− Parameter { name: "value"; type: "bool" }
112− }
113− Method { name: "removeTimeConstraints" }
114− }
115− Component {
116− name: "FloatingFlickable"
117− defaultProperty: "data"
118− prototype: "QQuickItem"
119− exports: ["Ubuntu.Gestures/FloatingFlickable 0.1"]
120− exportMetaObjectRevisions: [0]
121− Property { name: "contentWidth"; type: "double" }
122− Property { name: "contentHeight"; type: "double" }
123− Property { name: "contentX"; type: "double" }
124− Property { name: "contentY"; type: "double" }
125− Property { name: "direction"; type: "Direction::Type" }
126− }
127− Component {
128− name: "GestureTouchPoint"
129− prototype: "QObject"
130− exports: ["Ubuntu.Gestures/GestureTouchPoint 0.1"]
131− isCreatable: false
132− exportMetaObjectRevisions: [0]
133− Property { name: "pointId"; type: "int"; isReadonly: true }
134− Property { name: "pressed"; type: "bool"; isReadonly: true }
135− Property { name: "x"; type: "double"; isReadonly: true }
136− Property { name: "y"; type: "double"; isReadonly: true }
137− Property { name: "dragging"; type: "bool"; isReadonly: true }
138− }
139− Component {
140− name: "PressedOutsideNotifier"
141− defaultProperty: "data"
142− prototype: "QQuickItem"
143− exports: ["Ubuntu.Gestures/PressedOutsideNotifier 0.1"]
144− exportMetaObjectRevisions: [0]
145− Signal { name: "pressedOutside" }
146− }
147− Component {
148− name: "TouchGate"
149− defaultProperty: "data"
150− prototype: "QQuickItem"
151− exports: ["Ubuntu.Gestures/TouchGate 0.1"]
152− exportMetaObjectRevisions: [0]
153− Property { name: "targetItem"; type: "QQuickItem"; isPointer: true }
154− Signal {
155− name: "targetItemChanged"
156− Parameter { name: "item"; type: "QQuickItem"; isPointer: true }
157− }
158− }
159− Component {
160− name: "TouchGestureArea"
161− defaultProperty: "data"
162− prototype: "QQuickItem"
163− exports: ["Ubuntu.Gestures/TouchGestureArea 0.1"]
164− exportMetaObjectRevisions: [0]
165− Enum {
166− name: "Status"
167− values: {
168− "WaitingForTouch": 0,
169− "Undecided": 1,
170− "Recognized": 2,
171− "Rejected": 3
172− }
173− }
174− Property { name: "touchPoints"; type: "GestureTouchPoint"; isList: true; isReadonly: true }
175− Property { name: "dragging"; type: "bool"; isReadonly: true }
176− Property { name: "minimumTouchPoints"; type: "int" }
177− Property { name: "maximumTouchPoints"; type: "int" }
178− Signal {
179− name: "statusChanged"
180− Parameter { name: "status"; type: "Status" }
181− }
182− Signal { name: "touchPointsUpdated" }
183− Signal {
184− name: "draggingChanged"
185− Parameter { name: "dragging"; type: "bool" }
186− }
187− Signal {
188− name: "minimumTouchPointsChanged"
189− Parameter { name: "value"; type: "bool" }
190− }
191− Signal {
192− name: "maximumTouchPointsChanged"
193− Parameter { name: "value"; type: "bool" }
194− }
195− Signal {
196− name: "pressed"
197− Parameter { name: "points"; type: "QList<QObject*>" }
198− }
199− Signal {
200− name: "released"
201− Parameter { name: "points"; type: "QList<QObject*>" }
202− }
203− Signal {
204− name: "updated"
205− Parameter { name: "points"; type: "QList<QObject*>" }
206− }
207− Signal { name: "clicked" }
208− }
209−}
plugins/Ubuntu/Gestures/MouseEventGenerator.cppnew file+64
@@ -0,0 +1,64 @@
1+/*
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "MouseEventGenerator.h"
18+
19+#include <QCoreApplication>
20+#include <QMouseEvent>
21+#include <QQuickItem>
22+
23+MouseEventGenerator::MouseEventGenerator(QObject *parent)
24+ : QObject(parent)
25+{
26+}
27+
28+void MouseEventGenerator::move(const QPointF position)
29+{
30+ if (!m_mousePressed || !m_targetItem) {
31+ return;
32+ }
33+
34+ QMouseEvent mouseEvent(QEvent::MouseMove,
35+ QPointF(position.x(), position.y()), Qt::NoButton, Qt::LeftButton, Qt::NoModifier);
36+
37+ QCoreApplication::sendEvent(m_targetItem, &mouseEvent);
38+}
39+
40+void MouseEventGenerator::press(const QPointF position)
41+{
42+ if (m_mousePressed || !m_targetItem) {
43+ return;
44+ }
45+
46+ QMouseEvent mouseEvent(QEvent::MouseButtonPress,
47+ QPointF(position.x(), position.y()), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
48+
49+ QCoreApplication::sendEvent(m_targetItem, &mouseEvent);
50+ m_mousePressed = true;
51+}
52+
53+void MouseEventGenerator::release(const QPointF position)
54+{
55+ if (!m_mousePressed || !m_targetItem) {
56+ return;
57+ }
58+
59+ QMouseEvent mouseEvent(QEvent::MouseButtonRelease,
60+ QPointF(position.x(), position.y()), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
61+
62+ QCoreApplication::sendEvent(m_targetItem, &mouseEvent);
63+ m_mousePressed = false;
64+}
plugins/Ubuntu/Gestures/MouseEventGenerator.hnew file+48
@@ -0,0 +1,48 @@
1+/*
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef MOUSEEVENTGENERATOR_H
18+#define MOUSEEVENTGENERATOR_H
19+
20+#include <QObject>
21+#include <QPointF>
22+
23+#include "UbuntuGesturesQmlGlobal.h"
24+
25+class QQuickItem;
26+
27+class UBUNTUGESTURESQML_EXPORT MouseEventGenerator : public QObject {
28+ Q_OBJECT
29+ Q_PROPERTY(QQuickItem* targetItem MEMBER m_targetItem NOTIFY targetItemChanged)
30+
31+public:
32+ MouseEventGenerator(QObject *parent = nullptr);
33+
34+ Q_INVOKABLE void move(const QPointF position);
35+ Q_INVOKABLE void press(const QPointF position);
36+ Q_INVOKABLE void release(const QPointF position);
37+
38+Q_SIGNALS:
39+ void targetItemChanged(QQuickItem *);
40+
41+private:
42+ bool m_mousePressed {false};
43+ QQuickItem *m_targetItem {nullptr};
44+
45+ friend class tst_FloatingFlickable;
46+};
47+
48+#endif // MOUSEEVENTGENERATOR_H
plugins/Ubuntu/Gestures/PressedOutsideNotifier.h+1−1
@@ -23,7 +23,7 @@
2323#include <QPointer>
2424#include <QTimer>
2525
26−#include "UbuntuGesturesGlobal.h"
26+#include <ubuntugesturesglobal.h>
2727
2828/*
2929 Notifies when a point, mouse or touch, is pressed outside its area.
plugins/Ubuntu/Gestures/TouchDispatcher.cpp+1−5
@@ -19,11 +19,7 @@
1919#include <QGuiApplication>
2020#include <QScopedPointer>
2121#include <QStyleHints>
22−
23−#pragma GCC diagnostic push
24−#pragma GCC diagnostic ignored "-pedantic"
2522#include <private/qquickitem_p.h>
26−#pragma GCC diagnostic pop
2723
2824#define TOUCHDISPATCHER_DEBUG 0
2925
@@ -225,7 +221,7 @@ void TouchDispatcher::dispatchAsMouse(
225221 QEvent::Type eventType;
226222 if (touchMouse->state() == Qt::TouchPointPressed) {
227223 eventType = QEvent::MouseButtonPress;
228− } if (touchMouse->state() == Qt::TouchPointReleased) {
224+ } else if (touchMouse->state() == Qt::TouchPointReleased) {
229225 eventType = QEvent::MouseButtonRelease;
230226 m_touchMouseId = -1;
231227 } else {
plugins/Ubuntu/Gestures/TouchGate.cpp+2−2
@@ -20,8 +20,8 @@
2020#include <QDebug>
2121#include <QQuickWindow>
2222
23−#include <TouchOwnershipEvent.h>
24−#include <TouchRegistry.h>
23+#include <TouchOwnershipEvent>
24+#include <TouchRegistry>
2525
2626#if TOUCHGATE_DEBUG
2727#define ugDebug(params) qDebug().nospace() << "[TouchGate(" << (void*)this << ")] " << params
plugins/Ubuntu/Gestures/TouchGestureArea.cpp+16−15
@@ -16,10 +16,11 @@
1616
1717#include "TouchGestureArea.h"
1818
19−// local
20−#include "TouchOwnershipEvent.h"
21−#include "TouchRegistry.h"
22−#include "UnownedTouchEvent.h"
19+#include <UbuntuGestures/TouchOwnershipEvent>
20+#include <UbuntuGestures/TouchRegistry>
21+#include <UbuntuGestures/UnownedTouchEvent>
22+// #include "TouchRegistry.h"
23+// #include "UnownedTouchEvent.h"
2324
2425#include <QGuiApplication>
2526#include <QStyleHints>
@@ -374,7 +375,7 @@ void TouchGestureArea::unownedTouchEvent_waitingForMoreTouches(QTouchEvent *even
374375 }
375376 }
376377
377− if (m_candidateTouches.count() == 0) {
378+ if (m_candidateTouches.isEmpty()) {
378379 setInternalStatus(InternalStatus::WaitingForTouch);
379380 }
380381}
@@ -438,7 +439,7 @@ void TouchGestureArea::unownedTouchEvent_rejected(QTouchEvent *event)
438439 }
439440 }
440441
441− if (m_watchedTouches.count() == 0) {
442+ if (m_watchedTouches.isEmpty()) {
442443 setInternalStatus(InternalStatus::WaitingForTouch);
443444 }
444445}
@@ -526,7 +527,7 @@ void TouchGestureArea::updateTouchPoints(QTouchEvent *touchEvent)
526527 if (updateable) {
527528 if (!dragging() && m_status == InternalStatus::Recognized) {
528529 bool allWantDrag = !m_liveTouchPoints.isEmpty();
529− Q_FOREACH(auto point, m_liveTouchPoints) {
530+ Q_FOREACH(const auto &point, m_liveTouchPoints) {
530531 allWantDrag &= point->dragging();
531532 }
532533 // only dragging if all points are dragging.
@@ -588,13 +589,15 @@ void TouchGestureArea::setInternalStatus(uint newStatus)
588589 resyncCachedTouchPoints();
589590 break;
590591 case InternalStatus::WaitingForMoreTouches:
591− m_recognitionTimer->start(m_recognitionPeriod);
592+ m_recognitionTimer->setInterval(m_recognitionPeriod);
593+ m_recognitionTimer->start();
592594 break;
593595 case InternalStatus::Recognized:
594596 resyncCachedTouchPoints();
595597 break;
596598 case InternalStatus::WaitingForRejection:
597− m_recognitionTimer->start(m_releaseRejectPeriod);
599+ m_recognitionTimer->setInterval(m_releaseRejectPeriod);
600+ m_recognitionTimer->start();
598601 break;
599602 case InternalStatus::Rejected:
600603 resyncCachedTouchPoints();
@@ -643,11 +646,9 @@ bool TouchGestureArea::dragging() const
643646QQmlListProperty<GestureTouchPoint> TouchGestureArea::touchPoints()
644647{
645648 return QQmlListProperty<GestureTouchPoint>(this,
646− 0,
647− nullptr,
648− TouchGestureArea::touchPoint_count,
649− TouchGestureArea::touchPoint_at,
650− 0);
649+ nullptr,
650+ TouchGestureArea::touchPoint_count,
651+ TouchGestureArea::touchPoint_at);
651652}
652653
653654int TouchGestureArea::minimumTouchPoints() const
@@ -718,7 +719,7 @@ void TouchGestureArea::rejectGesture()
718719 }
719720 m_candidateTouches.clear();
720721
721− if (m_watchedTouches.count() == 0) {
722+ if (m_watchedTouches.isEmpty()) {
722723 setInternalStatus(InternalStatus::WaitingForTouch);
723724 } else {
724725 setInternalStatus(InternalStatus::Rejected);
plugins/Ubuntu/Gestures/TouchGestureArea.h+9−10
@@ -21,8 +21,7 @@
2121
2222#include <QQuickItem>
2323
24−// lib UbuntuGestures
25−#include <Timer.h>
24+#include <UbuntuGestures/Timer>
2625
2726class TouchOwnershipEvent;
2827class UnownedTouchEvent;
@@ -106,8 +105,8 @@ private:
106105/*
107106 An area that detects multi-finger gestures.
108107
109− We can use this to detect gestures contstrained by a minimim and/or maximum number of touch points.
110− This components uses the touch registry to apply for ownership of touch points.
108+ We can use this to detect gestures constrained by a minimum and/or maximum number of touch points.
109+ This component uses the touch registry to apply for ownership of touch points.
111110 This way we can use the component in conjuntion with the directional drag area to compete for ownwership
112111 or gestures; unlike the MultiPointTouchArea.
113112 */
@@ -137,7 +136,7 @@ public:
137136 Recognized,
138137 Rejected
139138 };
140− TouchGestureArea(QQuickItem* parent = NULL);
139+ TouchGestureArea(QQuickItem* parent = nullptr);
141140 ~TouchGestureArea();
142141
143142 bool event(QEvent *e) override;
@@ -165,10 +164,10 @@ Q_SIGNALS:
165164
166165 void touchPointsUpdated();
167166 void draggingChanged(bool dragging);
168− void minimumTouchPointsChanged(bool value);
169− void maximumTouchPointsChanged(bool value);
170− void recognitionPeriodChanged(bool value);
171− void releaseRejectPeriodChanged(bool value);
167+ void minimumTouchPointsChanged(int value);
168+ void maximumTouchPointsChanged(int value);
169+ void recognitionPeriodChanged(int value);
170+ void releaseRejectPeriodChanged(int value);
172171
173172 void pressed(const QList<QObject*>& points);
174173 void released(const QList<QObject*>& points);
@@ -176,7 +175,7 @@ Q_SIGNALS:
176175 void clicked();
177176
178177protected:
179− void itemChange(ItemChange change, const ItemChangeData &value);
178+ void itemChange(ItemChange change, const ItemChangeData &value) override;
180179
181180private Q_SLOTS:
182181 void rejectGesture();
plugins/Ubuntu/Gestures/plugin.cpp+3−5
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013,2015 Canonical, Ltd.
2+ * Copyright (C) 2013,2015,2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -17,8 +17,7 @@
1717#include "plugin.h"
1818#include "AxisVelocityCalculator.h"
1919#include "Direction.h"
20−#include "DirectionalDragArea.h"
21−#include "FloatingFlickable.h"
20+#include "MouseEventGenerator.h"
2221#include "PressedOutsideNotifier.h"
2322#include "TouchGate.h"
2423#include "TouchGestureArea.h"
@@ -34,9 +33,8 @@ static QObject* directionSingleton(QQmlEngine* engine, QJSEngine* scriptEngine)
3433void UbuntuGesturesQmlPlugin::registerTypes(const char *uri)
3534{
3635 qmlRegisterSingletonType<Direction>(uri, 0, 1, "Direction", directionSingleton);
37− qmlRegisterType<DirectionalDragArea>(uri, 0, 1, "DirectionalDragArea");
3836 qmlRegisterType<AxisVelocityCalculator>(uri, 0, 1, "AxisVelocityCalculator");
39− qmlRegisterType<FloatingFlickable>(uri, 0, 1, "FloatingFlickable");
37+ qmlRegisterType<MouseEventGenerator>(uri, 0, 1, "MouseEventGenerator");
4038 qmlRegisterType<PressedOutsideNotifier>(uri, 0, 1, "PressedOutsideNotifier");
4139 qmlRegisterType<TouchGate>(uri, 0, 1, "TouchGate");
4240 qmlRegisterType<TouchGestureArea>(uri, 0, 1, "TouchGestureArea");
plugins/Ubuntu/Payments/Payments.qmltypesdeleted−43
@@ -1,43 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Ubuntu.Payments 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "Payments"
12− prototype: "QObject"
13− exports: ["Ubuntu.Payments/Payments 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "currency"; type: "string" }
16− Property { name: "price"; type: "double" }
17− Property { name: "storeItemId"; type: "string" }
18− Property { name: "formattedPrice"; type: "string"; isReadonly: true }
19− Signal {
20− name: "currencyChanged"
21− Parameter { name: "currency"; type: "string" }
22− }
23− Signal {
24− name: "priceChanged"
25− Parameter { name: "price"; type: "double" }
26− }
27− Signal {
28− name: "storeItemIdChanged"
29− Parameter { name: "store_item_id"; type: "string" }
30− }
31− Signal {
32− name: "formattedPriceChanged"
33− Parameter { name: "formatted_price"; type: "string" }
34− }
35− Signal {
36− name: "purchaseError"
37− Parameter { name: "error"; type: "string" }
38− }
39− Signal { name: "purchaseCompleted" }
40− Signal { name: "purchaseCancelled" }
41− Method { name: "start" }
42− }
43−}
plugins/Ubuntu/SystemImage/SystemImage.qmltypesdeleted−19
@@ -1,19 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Ubuntu.SystemImage 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "SystemImage"
12− prototype: "QObject"
13− exports: ["Ubuntu.SystemImage/SystemImage 0.1"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Method { name: "factoryReset" }
18− }
19−}
plugins/Unity/Connectivity/Connectivity.qmltypesdeleted−19
@@ -1,19 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Connectivity 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "Connectivity"
12− prototype: "QObject"
13− exports: ["Unity.Connectivity/Connectivity 0.1"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Method { name: "unlockAllModems" }
18− }
19−}
plugins/Unity/DashCommunicator/DashCommunicator.qmltypesdeleted−47
@@ -1,47 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.DashCommunicator 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "DashCommunicator"
12− prototype: "QThread"
13− exports: ["Unity.DashCommunicator/DashCommunicator 0.1"]
14− exportMetaObjectRevisions: [0]
15− Method {
16− name: "setCurrentScope"
17− Parameter { name: "index"; type: "int" }
18− Parameter { name: "animate"; type: "bool" }
19− Parameter { name: "isSwipe"; type: "bool" }
20− }
21− }
22− Component {
23− name: "DashCommunicatorService"
24− prototype: "QObject"
25− exports: ["Unity.DashCommunicator/DashCommunicatorService 0.1"]
26− exportMetaObjectRevisions: [0]
27− Signal {
28− name: "setCurrentScopeRequested"
29− Parameter { name: "index"; type: "int" }
30− Parameter { name: "animate"; type: "bool" }
31− Parameter { name: "isSwipe"; type: "bool" }
32− }
33− }
34− Component {
35− name: "QThread"
36− prototype: "QObject"
37− Signal { name: "started" }
38− Signal { name: "finished" }
39− Method {
40− name: "start"
41− Parameter { type: "Priority" }
42− }
43− Method { name: "start" }
44− Method { name: "terminate" }
45− Method { name: "quit" }
46− }
47−}
plugins/Unity/Indicators/CMakeLists.txt+4
@@ -6,6 +6,10 @@ find_package(Qt5Quick REQUIRED)
66include_directories(
77 ${CMAKE_CURRENT_SOURCE_DIR}
88 ${CMAKE_CURRENT_BINARY_DIR}
9+)
10+
11+include_directories(
12+ SYSTEM
913 ${GLIB_INCLUDE_DIRS}
1014 ${GIO_INCLUDE_DIRS}
1115 ${QMENUMODEL_INCLUDE_DIRS}
plugins/Unity/Indicators/Indicators.qmltypesdeleted−264
@@ -1,264 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Indicators 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "ActionRootState"
12− prototype: "RootStateObject"
13− exports: ["Unity.Indicators/ActionRootState 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "actionGroup"; type: "QDBusActionGroup"; isPointer: true }
16− Property { name: "actionName"; type: "string" }
17− }
18− Component {
19− name: "ActionState"
20− prototype: "QObject"
21− exports: ["Unity.Indicators/ActionState 0.1"]
22− isCreatable: false
23− exportMetaObjectRevisions: [0]
24− Enum {
25− name: "ActionStates"
26− values: {
27− "Label": 0,
28− "IconSource": 1,
29− "AccessableName": 2,
30− "Visible": 3
31− }
32− }
33− }
34− Component {
35− name: "FlatMenuProxyModelRole"
36− prototype: "QObject"
37− exports: ["Unity.Indicators/FlatMenuProxyModelRole 0.1"]
38− isCreatable: false
39− exportMetaObjectRevisions: [0]
40− Enum {
41− name: "Roles"
42− values: {
43− "Action": 1,
44− "Label": 2,
45− "Extra": 3,
46− "Depth": 4,
47− "hasSection": 5,
48− "hasSubMenu": 6
49− }
50− }
51− }
52− Component {
53− name: "IndicatorsManager"
54− prototype: "QObject"
55− exports: ["Unity.Indicators/IndicatorsManager 0.1"]
56− exportMetaObjectRevisions: [0]
57− Property { name: "loaded"; type: "bool"; isReadonly: true }
58− Property { name: "profile"; type: "string" }
59− Signal {
60− name: "loadedChanged"
61− Parameter { type: "bool" }
62− }
63− Signal {
64− name: "profileChanged"
65− Parameter { type: "string" }
66− }
67− Signal {
68− name: "indicatorLoaded"
69− Parameter { name: "indicator_name"; type: "string" }
70− }
71− Signal {
72− name: "indicatorAboutToBeUnloaded"
73− Parameter { name: "indicator_name"; type: "string" }
74− }
75− Method { name: "load" }
76− Method { name: "unload" }
77− }
78− Component {
79− name: "IndicatorsModel"
80− prototype: "QAbstractListModel"
81− exports: ["Unity.Indicators/IndicatorsModel 0.1"]
82− exportMetaObjectRevisions: [0]
83− Property { name: "count"; type: "int"; isReadonly: true }
84− Property { name: "profile"; type: "string" }
85− Signal {
86− name: "indicatorDataChanged"
87− Parameter { name: "data"; type: "QVariant" }
88− }
89− Method { name: "load" }
90− Method { name: "unload" }
91− Method {
92− name: "data"
93− type: "QVariant"
94− Parameter { name: "row"; type: "int" }
95− Parameter { name: "role"; type: "int" }
96− }
97− }
98− Component {
99− name: "IndicatorsModelRole"
100− prototype: "QObject"
101− exports: ["Unity.Indicators/IndicatorsModelRole 0.1"]
102− isCreatable: false
103− exportMetaObjectRevisions: [0]
104− Enum {
105− name: "Roles"
106− values: {
107− "Identifier": 0,
108− "Position": 1,
109− "IndicatorProperties": 2
110− }
111− }
112− }
113− Component {
114− name: "MenuContentActivator"
115− prototype: "QObject"
116− exports: ["Unity.Indicators/MenuContentActivator 0.1"]
117− exportMetaObjectRevisions: [0]
118− Property { name: "baseIndex"; type: "int" }
119− Property { name: "running"; type: "bool" }
120− Property { name: "count"; type: "int" }
121− Property { name: "content"; type: "MenuContentState"; isList: true; isReadonly: true }
122− Signal {
123− name: "baseIndexChanged"
124− Parameter { name: "baseIndex"; type: "int" }
125− }
126− Signal {
127− name: "deltaChanged"
128− Parameter { name: "delta"; type: "int" }
129− }
130− Signal {
131− name: "runningChanged"
132− Parameter { name: "running"; type: "bool" }
133− }
134− Signal {
135− name: "countChanged"
136− Parameter { name: "count"; type: "int" }
137− }
138− Method { name: "restart" }
139− Method { name: "stop" }
140− Method { name: "clear" }
141− Method {
142− name: "isMenuContentActive"
143− type: "bool"
144− Parameter { name: "index"; type: "int" }
145− }
146− }
147− Component {
148− name: "MenuContentState"
149− prototype: "QObject"
150− exports: ["Unity.Indicators/MenuContentState 0.1"]
151− isCreatable: false
152− exportMetaObjectRevisions: [0]
153− Property { name: "active"; type: "bool"; isReadonly: true }
154− }
155− Component {
156− name: "ModelActionRootState"
157− prototype: "RootStateObject"
158− exports: ["Unity.Indicators/ModelActionRootState 0.1"]
159− exportMetaObjectRevisions: [0]
160− Property { name: "menu"; type: "UnityMenuModel"; isPointer: true }
161− Signal { name: "indexChanged" }
162− }
163− Component {
164− name: "ModelPrinter"
165− prototype: "QObject"
166− exports: ["Unity.Indicators/ModelPrinter 0.1"]
167− exportMetaObjectRevisions: [0]
168− Property { name: "model"; type: "UnityMenuModel"; isPointer: true }
169− Property { name: "text"; type: "string"; isReadonly: true }
170− Method { name: "text"; type: "string" }
171− }
172− Component {
173− name: "NetworkActionState"
174− prototype: "QObject"
175− exports: ["Unity.Indicators/NetworkActionState 0.1"]
176− isCreatable: false
177− exportMetaObjectRevisions: [0]
178− Enum {
179− name: "NetworkActionStates"
180− values: {
181− "Connection": 1,
182− "SignalStrength": 2
183− }
184− }
185− }
186− Component {
187− name: "NetworkConnection"
188− prototype: "QObject"
189− exports: ["Unity.Indicators/NetworkConnection 0.1"]
190− isCreatable: false
191− exportMetaObjectRevisions: [0]
192− Enum {
193− name: "NetworkConnectionStates"
194− values: {
195− "Initial": 0,
196− "Activating": 1,
197− "Activated": 2,
198− "Deactivating": 3
199− }
200− }
201− }
202− Component {
203− name: "RootStateObject"
204− prototype: "QObject"
205− Property { name: "valid"; type: "bool"; isReadonly: true }
206− Property { name: "title"; type: "string"; isReadonly: true }
207− Property { name: "leftLabel"; type: "string"; isReadonly: true }
208− Property { name: "rightLabel"; type: "string"; isReadonly: true }
209− Property { name: "icons"; type: "QStringList"; isReadonly: true }
210− Property { name: "accessibleName"; type: "string"; isReadonly: true }
211− Property { name: "indicatorVisible"; type: "bool"; isReadonly: true }
212− Signal { name: "updated" }
213− }
214− Component {
215− name: "SharedUnityMenuModel"
216− prototype: "QObject"
217− exports: ["Unity.Indicators/SharedUnityMenuModel 0.1"]
218− exportMetaObjectRevisions: [0]
219− Property { name: "busName"; type: "QByteArray" }
220− Property { name: "menuObjectPath"; type: "QByteArray" }
221− Property { name: "actions"; type: "QVariantMap" }
222− Property { name: "model"; type: "UnityMenuModel"; isReadonly: true; isPointer: true }
223− }
224− Component {
225− name: "UnityMenuModelCache"
226− prototype: "QObject"
227− exports: ["Unity.Indicators/UnityMenuModelCache 0.1"]
228− isCreatable: false
229− isSingleton: true
230− exportMetaObjectRevisions: [0]
231− Method {
232− name: "contains"
233− type: "bool"
234− Parameter { name: "path"; type: "QByteArray" }
235− }
236− }
237− Component {
238− name: "UnityMenuModelStack"
239− prototype: "QObject"
240− exports: ["Unity.Indicators/UnityMenuModelStack 0.1"]
241− exportMetaObjectRevisions: [0]
242− Property { name: "head"; type: "UnityMenuModel"; isPointer: true }
243− Property { name: "tail"; type: "UnityMenuModel"; isReadonly: true; isPointer: true }
244− Property { name: "count"; type: "int"; isReadonly: true }
245− Signal {
246− name: "headChanged"
247− Parameter { name: "head"; type: "UnityMenuModel"; isPointer: true }
248− }
249− Signal {
250− name: "tailChanged"
251− Parameter { name: "tail"; type: "UnityMenuModel"; isPointer: true }
252− }
253− Signal {
254− name: "countChanged"
255− Parameter { name: "count"; type: "int" }
256− }
257− Method {
258− name: "push"
259− Parameter { name: "model"; type: "UnityMenuModel"; isPointer: true }
260− Parameter { name: "menuIndex"; type: "int" }
261− }
262− Method { name: "pop"; type: "UnityMenuModel*" }
263− }
264−}
plugins/Unity/Indicators/indicatorsmanager.cpp+1−1
@@ -291,7 +291,7 @@ Indicator::Ptr IndicatorsManager::indicator(const QString& indicator_name)
291291 // The rest of the indicators respect their default profile (which is "phone", even on desktop PCs)
292292 if ((new_indicator->identifier() == QStringLiteral("indicator-session"))
293293 || (new_indicator->identifier() == QStringLiteral("indicator-power") && m_platform.isPC())) {
294− new_indicator->setProfile(QStringLiteral("desktop"));
294+ new_indicator->setProfile(m_profile.replace(QStringLiteral("phone"), QStringLiteral("desktop")));
295295 } else {
296296 new_indicator->setProfile(m_profile);
297297 }
plugins/Unity/InputInfo/InputInfo.qmltypesdeleted−71
@@ -1,71 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.InputInfo 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "QDeclarativeInputDeviceModel"
12− prototype: "QAbstractListModel"
13− exports: ["Unity.InputInfo/InputDeviceModel 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "deviceFilter"; type: "QInputDevice::InputType" }
16− Property { name: "count"; type: "int"; isReadonly: true }
17− Signal {
18− name: "deviceAdded"
19− Parameter { name: "devicePath"; type: "string" }
20− }
21− Signal {
22− name: "deviceRemoved"
23− Parameter { name: "devicePath"; type: "string" }
24− }
25− Signal {
26− name: "deviceFilterChanged"
27− Parameter { name: "filter"; type: "QInputDevice::InputType" }
28− }
29− Method { name: "updateDeviceList" }
30− Method {
31− name: "indexOf"
32− type: "int"
33− Parameter { name: "devicePath"; type: "string" }
34− }
35− Method {
36− name: "get"
37− type: "QInputDevice*"
38− Parameter { name: "index"; type: "int" }
39− }
40− }
41− Component {
42− name: "QInputDevice"
43− prototype: "QObject"
44− exports: ["Unity.InputInfo/InputInfo 0.1"]
45− exportMetaObjectRevisions: [0]
46− Enum {
47− name: "InputType"
48− values: {
49− "Unknown": 0,
50− "Button": 1,
51− "Mouse": 2,
52− "TouchPad": 4,
53− "TouchScreen": 8,
54− "Keyboard": 16,
55− "Switch": 32
56− }
57− }
58− Enum {
59− name: "InputTypeFlags"
60− values: {
61− "Unknown": 0,
62− "Button": 1,
63− "Mouse": 2,
64− "TouchPad": 4,
65− "TouchScreen": 8,
66− "Keyboard": 16,
67− "Switch": 32
68− }
69− }
70− }
71−}
plugins/Unity/InputInfo/linux/qinputdeviceinfo_linux.cpp+7−2
@@ -44,6 +44,7 @@
4444#include <libudev.h>
4545#include <libevdev/libevdev.h>
4646#include <fcntl.h>
47+#include <unistd.h>
4748#include <QDebug>
4849#include <QSocketNotifier>
4950#include <QTimer>
@@ -52,6 +53,7 @@
5253QInputDeviceManagerPrivate::QInputDeviceManagerPrivate(QObject *parent) :
5354 QObject(parent),
5455 currentFilter(QInputDevice::Unknown),
56+ udevMonitor(0),
5557 udevice(0)
5658{
5759 QTimer::singleShot(250,this,SLOT(init()));
@@ -83,9 +85,9 @@ void QInputDeviceManagerPrivate::init()
8385 udev_enumerate_add_match_subsystem(enumerate, subsystem.toLatin1());
8486
8587 udev_monitor_enable_receiving(udevMonitor);
86− notifierFd = udev_monitor_get_fd(udevMonitor);
88+ int notifierFd = udev_monitor_get_fd(udevMonitor);
8789
88− notifier = new QSocketNotifier(notifierFd, QSocketNotifier::Read, this);
90+ QSocketNotifier *notifier = new QSocketNotifier(notifierFd, QSocketNotifier::Read, this);
8991 connect(notifier, SIGNAL(activated(int)), this, SLOT(onUDevChanges()));
9092
9193 udev_enumerate_scan_devices(enumerate);
@@ -168,6 +170,7 @@ QInputDevice *QInputDeviceManagerPrivate::addDevice(struct udev_device *udev)
168170 rc = libevdev_new_from_fd(fd, &dev);
169171 if (rc < 0) {
170172 qWarning() << "Failed to init libevdev ("<< strerror(-rc) << ")";
173+ close(fd);
171174 return Q_NULLPTR;
172175 }
173176
@@ -195,6 +198,8 @@ QInputDevice *QInputDeviceManagerPrivate::addDevice(struct udev_device *udev)
195198 }
196199 }
197200
201+ libevdev_free(dev);
202+ close(fd);
198203 return inputDevice;
199204}
200205
plugins/Unity/InputInfo/linux/qinputdeviceinfo_linux_p.h−2
@@ -83,8 +83,6 @@ private:
8383
8484 QInputDevice *addDevice(const QString &path);
8585 void removeDevice(const QString &path);
86− QSocketNotifier *notifier;
87− int notifierFd;
8886 struct udev_monitor *udevMonitor;
8987 QInputDevice::InputTypeFlags getInputTypeFlags(struct udev_device *);
9088 struct udev *udevice;
plugins/Unity/InputInfo/plugin.h+1−1
@@ -24,7 +24,7 @@ class InputInfoPlugin : public QQmlExtensionPlugin
2424 Q_OBJECT
2525 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
2626public:
27− void registerTypes(const char *uri);
27+ void registerTypes(const char *uri) override;
2828};
2929
3030#endif // INPUTINFO_PLUGIN_H
plugins/Unity/InputInfo/qdeclarativeinputdevicemodel_p.h+3−3
@@ -69,8 +69,8 @@ public:
6969 explicit QDeclarativeInputDeviceModel(QObject *parent = 0);
7070 virtual ~QDeclarativeInputDeviceModel();
7171
72− QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
73− int rowCount(const QModelIndex &parent = QModelIndex()) const;
72+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
73+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
7474
7575 void setDeviceFilter(QInputDevice::InputType filter);
7676 QInputDevice::InputType deviceFilter();
@@ -78,7 +78,7 @@ public:
7878 Q_INVOKABLE int indexOf(const QString &devicePath) const;
7979
8080 Q_INVOKABLE QInputDevice *get(int index) const;
81− QHash<int, QByteArray> roleNames() const;
81+ QHash<int, QByteArray> roleNames() const override;
8282
8383Q_SIGNALS:
8484 void deviceAdded(const QString &devicePath);
plugins/Unity/Launcher/CMakeLists.txt+5−1
@@ -1,4 +1,4 @@
1−pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=7)
1+pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=9)
22pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
33
44add_definitions(-DSM_BUSNAME=systemBus)
@@ -7,6 +7,7 @@ include_directories(
77 ${CMAKE_CURRENT_SOURCE_DIR}
88 ${CMAKE_SOURCE_DIR}/plugins/AccountsService
99 ${GSETTINGS_QT_INCLUDE_DIRS}
10+ ${GLIB_INCLUDE_DIRS}
1011 ${libunity8-private_SOURCE_DIR}
1112)
1213
@@ -22,6 +23,8 @@ set(QMLLAUNCHERPLUGIN_SRC
2223 asadapter.cpp
2324 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
2425 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
26+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
27+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceListInterface.h
2528 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherItemInterface.h
2629 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherModelInterface.h
2730 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/QuickListModelInterface.h
@@ -34,6 +37,7 @@ add_library(UnityLauncher-qml MODULE
3437target_link_libraries(UnityLauncher-qml
3538 unity8-private
3639 ${GSETTINGS_QT_LDFLAGS}
40+ ${GLIB_LIBRARIES}
3741 )
3842
3943qt5_use_modules(UnityLauncher-qml DBus Qml Gui)
plugins/Unity/Launcher/Launcher.qmltypesdeleted−182
@@ -1,182 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Launcher 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "LauncherItem"
12− prototype: "unity::shell::launcher::LauncherItemInterface"
13− exports: ["Unity.Launcher/LauncherItem 0.1"]
14− isCreatable: false
15− exportMetaObjectRevisions: [0]
16− }
17− Component {
18− name: "LauncherModel"
19− prototype: "unity::shell::launcher::LauncherModelInterface"
20− exports: ["Unity.Launcher/LauncherModel 0.1"]
21− isCreatable: false
22− isSingleton: true
23− exportMetaObjectRevisions: [0]
24− Method {
25− name: "requestRemove"
26− Parameter { name: "appId"; type: "string" }
27− }
28− Method { name: "refresh" }
29− Method {
30− name: "get"
31− type: "unity::shell::launcher::LauncherItemInterface*"
32− Parameter { name: "index"; type: "int" }
33− }
34− Method {
35− name: "move"
36− Parameter { name: "oldIndex"; type: "int" }
37− Parameter { name: "newIndex"; type: "int" }
38− }
39− Method {
40− name: "pin"
41− Parameter { name: "appId"; type: "string" }
42− Parameter { name: "index"; type: "int" }
43− }
44− Method {
45− name: "pin"
46− Parameter { name: "appId"; type: "string" }
47− }
48− Method {
49− name: "quickListActionInvoked"
50− Parameter { name: "appId"; type: "string" }
51− Parameter { name: "actionIndex"; type: "int" }
52− }
53− Method {
54− name: "setUser"
55− Parameter { name: "username"; type: "string" }
56− }
57− Method {
58− name: "getUrlForAppId"
59− type: "string"
60− Parameter { name: "appId"; type: "string" }
61− }
62− }
63− Component {
64− name: "QuickListModel"
65− prototype: "unity::shell::launcher::QuickListModelInterface"
66− exports: ["Unity.Launcher/QuickListModel 0.1"]
67− isCreatable: false
68− exportMetaObjectRevisions: [0]
69− }
70− Component {
71− name: "unity::shell::launcher::LauncherItemInterface"
72− prototype: "QObject"
73− exports: ["Unity.Launcher/LauncherItemInterface 0.1"]
74− isCreatable: false
75− exportMetaObjectRevisions: [0]
76− Property { name: "appId"; type: "string"; isReadonly: true }
77− Property { name: "name"; type: "string"; isReadonly: true }
78− Property { name: "icon"; type: "string"; isReadonly: true }
79− Property { name: "pinned"; type: "bool"; isReadonly: true }
80− Property { name: "running"; type: "bool"; isReadonly: true }
81− Property { name: "recent"; type: "bool"; isReadonly: true }
82− Property { name: "progress"; type: "int"; isReadonly: true }
83− Property { name: "count"; type: "int"; isReadonly: true }
84− Property { name: "countVisible"; type: "bool"; isReadonly: true }
85− Property { name: "focused"; type: "bool"; isReadonly: true }
86− Property {
87− name: "quickList"
88− type: "unity::shell::launcher::QuickListModelInterface"
89− isReadonly: true
90− isPointer: true
91− }
92− Signal {
93− name: "nameChanged"
94− Parameter { name: "name"; type: "string" }
95− }
96− Signal {
97− name: "iconChanged"
98− Parameter { name: "icon"; type: "string" }
99− }
100− Signal {
101− name: "pinnedChanged"
102− Parameter { name: "pinned"; type: "bool" }
103− }
104− Signal {
105− name: "runningChanged"
106− Parameter { name: "running"; type: "bool" }
107− }
108− Signal {
109− name: "recentChanged"
110− Parameter { name: "running"; type: "bool" }
111− }
112− Signal {
113− name: "progressChanged"
114− Parameter { name: "progress"; type: "int" }
115− }
116− Signal {
117− name: "countChanged"
118− Parameter { name: "count"; type: "int" }
119− }
120− Signal {
121− name: "countVisibleChanged"
122− Parameter { name: "countVisible"; type: "bool" }
123− }
124− Signal {
125− name: "focusedChanged"
126− Parameter { name: "focused"; type: "bool" }
127− }
128− }
129− Component {
130− name: "unity::shell::launcher::LauncherModelInterface"
131− prototype: "QAbstractListModel"
132− exports: ["Unity.Launcher/LauncherModelInterface 0.1"]
133− isCreatable: false
134− exportMetaObjectRevisions: [0]
135− Property {
136− name: "applicationManager"
137− type: "unity::shell::application::ApplicationManagerInterface"
138− isPointer: true
139− }
140− Property { name: "onlyPinned"; type: "bool" }
141− Signal { name: "hint" }
142− Method {
143− name: "move"
144− Parameter { name: "oldIndex"; type: "int" }
145− Parameter { name: "newIndex"; type: "int" }
146− }
147− Method {
148− name: "get"
149− type: "unity::shell::launcher::LauncherItemInterface*"
150− Parameter { name: "index"; type: "int" }
151− }
152− Method {
153− name: "pin"
154− Parameter { name: "appId"; type: "string" }
155− Parameter { name: "index"; type: "int" }
156− }
157− Method {
158− name: "pin"
159− Parameter { name: "appId"; type: "string" }
160− }
161− Method {
162− name: "requestRemove"
163− Parameter { name: "appId"; type: "string" }
164− }
165− Method {
166− name: "quickListActionInvoked"
167− Parameter { name: "appId"; type: "string" }
168− Parameter { name: "actionIndex"; type: "int" }
169− }
170− Method {
171− name: "setUser"
172− Parameter { name: "username"; type: "string" }
173− }
174− }
175− Component {
176− name: "unity::shell::launcher::QuickListModelInterface"
177− prototype: "QAbstractListModel"
178− exports: ["Unity.Launcher/QuickListInterface 0.1"]
179− isCreatable: false
180− exportMetaObjectRevisions: [0]
181− }
182−}
plugins/Unity/Launcher/asadapter.cpp+6−2
@@ -18,14 +18,18 @@
1818#include "launcheritem.h"
1919#include "AccountsServiceDBusAdaptor.h"
2020
21+#include <glib.h>
22+
2123#include <QDebug>
2224
2325ASAdapter::ASAdapter()
2426{
2527 m_accounts = new AccountsServiceDBusAdaptor();
26− m_user = qgetenv("USER");
28+
29+ m_user = QString::fromUtf8(g_get_user_name());
30+
2731 if (m_user.isEmpty()) {
28− qWarning() << "$USER not valid. Account Service integration will not work.";
32+ qWarning() << "username not valid. Account Service integration will not work.";
2933 }
3034}
3135
plugins/Unity/Launcher/launcheritem.cpp+14−9
@@ -35,6 +35,7 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
3535 m_countVisible(false),
3636 m_focused(false),
3737 m_alerting(false),
38+ m_surfaceCount(0),
3839 m_quickList(new QuickListModel(this))
3940{
4041 Q_ASSERT(parent != nullptr);
@@ -162,9 +163,6 @@ void LauncherItem::setCount(int count)
162163 if (m_count != count) {
163164 m_count = count;
164165 Q_EMIT countChanged(count);
165− if (m_countVisible) {
166− setAlerting(true);
167− }
168166 }
169167}
170168
@@ -178,9 +176,6 @@ void LauncherItem::setCountVisible(bool countVisible)
178176 if (m_countVisible != countVisible) {
179177 m_countVisible = countVisible;
180178 Q_EMIT countVisibleChanged(countVisible);
181− if (countVisible) {
182− setAlerting(true);
183− }
184179 }
185180}
186181
@@ -193,9 +188,6 @@ void LauncherItem::setFocused(bool focused)
193188{
194189 if (m_focused != focused) {
195190 m_focused = focused;
196− if (focused) {
197− setAlerting(false);
198− }
199191 Q_EMIT focusedChanged(focused);
200192 }
201193}
@@ -213,6 +205,19 @@ void LauncherItem::setAlerting(bool alerting)
213205 }
214206}
215207
208+int LauncherItem::surfaceCount() const
209+{
210+ return m_surfaceCount;
211+}
212+
213+void LauncherItem::setSurfaceCount(int surfaceCount)
214+{
215+ if (m_surfaceCount != surfaceCount) {
216+ m_surfaceCount = surfaceCount;
217+ Q_EMIT surfaceCountChanged(surfaceCount);
218+ }
219+}
220+
216221unity::shell::launcher::QuickListModelInterface *LauncherItem::quickList() const
217222{
218223 return m_quickList;
plugins/Unity/Launcher/launcheritem.h+3
@@ -45,6 +45,7 @@ public:
4545 bool countVisible() const override;
4646 bool focused() const override;
4747 bool alerting() const override;
48+ int surfaceCount() const override;
4849
4950 unity::shell::launcher::QuickListModelInterface *quickList() const override;
5051
@@ -59,6 +60,7 @@ private:
5960 void setCountVisible(bool countVisible);
6061 void setFocused(bool focused);
6162 void setAlerting(bool alerting);
63+ void setSurfaceCount(int surfaceCount);
6264
6365private:
6466 QString m_appId;
@@ -72,6 +74,7 @@ private:
7274 bool m_countVisible;
7375 bool m_focused;
7476 bool m_alerting;
77+ int m_surfaceCount;
7578 QuickListModel *m_quickList;
7679 QuickListEntry m_quitAction;
7780
plugins/Unity/Launcher/launchermodel.cpp+58−26
@@ -25,6 +25,7 @@
2525#include "asadapter.h"
2626
2727#include <unity/shell/application/ApplicationInfoInterface.h>
28+#include <unity/shell/application/MirSurfaceListInterface.h>
2829
2930#include <QDesktopServices>
3031#include <QDebug>
@@ -88,6 +89,8 @@ QVariant LauncherModel::data(const QModelIndex &index, int role) const
8889 return item->alerting();
8990 case RoleRunning:
9091 return item->running();
92+ case RoleSurfaceCount:
93+ return item->surfaceCount();
9194 default:
9295 qWarning() << Q_FUNC_INFO << "missing role, implement me";
9396 return QVariant();
@@ -96,18 +99,6 @@ QVariant LauncherModel::data(const QModelIndex &index, int role) const
9699 return QVariant();
97100}
98101
99−void LauncherModel::setAlerting(const QString &appId, bool alerting) {
100− int index = findApplication(appId);
101− if (index >= 0) {
102− QModelIndex modelIndex = this->index(index);
103− LauncherItem *item = m_list.at(index);
104− if (!item->focused()) {
105− item->setAlerting(alerting);
106− Q_EMIT dataChanged(modelIndex, modelIndex, {RoleAlerting});
107− }
108− }
109−}
110−
111102unity::shell::launcher::LauncherItemInterface *LauncherModel::get(int index) const
112103{
113104 if (index < 0 || index >= m_list.count()) {
@@ -358,11 +349,13 @@ void LauncherModel::countChanged(const QString &appId, int count)
358349 if (idx >= 0) {
359350 LauncherItem *item = m_list.at(idx);
360351 item->setCount(count);
361− if (item->countVisible()) {
362− setAlerting(item->appId(), true);
352+ QVector<int> changedRoles = {RoleCount};
353+ if (item->countVisible() && !item->alerting() && !item->focused()) {
354+ changedRoles << RoleAlerting;
355+ item->setAlerting(true);
363356 }
364357 m_asAdapter->syncItems(m_list);
365− Q_EMIT dataChanged(index(idx), index(idx), {RoleCount});
358+ Q_EMIT dataChanged(index(idx), index(idx), changedRoles);
366359 }
367360}
368361
@@ -372,10 +365,12 @@ void LauncherModel::countVisibleChanged(const QString &appId, bool countVisible)
372365 if (idx >= 0) {
373366 LauncherItem *item = m_list.at(idx);
374367 item->setCountVisible(countVisible);
375− if (countVisible) {
376− setAlerting(item->appId(), true);
368+ QVector<int> changedRoles = {RoleCountVisible};
369+ if (countVisible && !item->alerting() && !item->focused()) {
370+ changedRoles << RoleAlerting;
371+ item->setAlerting(true);
377372 }
378− Q_EMIT dataChanged(index(idx), index(idx), {RoleCountVisible});
373+ Q_EMIT dataChanged(index(idx), index(idx), changedRoles);
379374
380375 // If countVisible goes to false, and the item is neither pinned nor recent we can drop it
381376 if (!countVisible && !item->pinned() && !item->recent()) {
@@ -498,8 +493,10 @@ void LauncherModel::alert(const QString &appId)
498493 int idx = findApplication(appId);
499494 if (idx >= 0) {
500495 LauncherItem *item = m_list.at(idx);
501− setAlerting(item->appId(), true);
502− Q_EMIT dataChanged(index(idx), index(idx), {RoleAlerting});
496+ if (!item->focused() && !item->alerting()) {
497+ item->setAlerting(true);
498+ Q_EMIT dataChanged(index(idx), index(idx), {RoleAlerting});
499+ }
503500 }
504501}
505502
@@ -525,28 +522,50 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
525522 item->setRecent(true);
526523 Q_EMIT dataChanged(index(itemIndex), index(itemIndex), {RoleRecent});
527524 }
525+ if (item->surfaceCount() != app->surfaceCount()) {
526+ item->setSurfaceCount(app->surfaceCount());
527+ Q_EMIT dataChanged(index(itemIndex), index(itemIndex), {RoleSurfaceCount});
528+ }
529+
528530 item->setRunning(true);
529531 } else {
530532 LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString(), this);
531533 item->setRecent(true);
532534 item->setRunning(true);
533535 item->setFocused(app->focused());
534−
536+ item->setSurfaceCount(app->surfaceCount());
535537 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
536538 m_list.append(item);
537539 endInsertRows();
538540 }
541+ connect(app, &ApplicationInfoInterface::surfaceCountChanged, this, &LauncherModel::applicationSurfaceCountChanged);
539542 m_asAdapter->syncItems(m_list);
540543 Q_EMIT dataChanged(index(itemIndex), index(itemIndex), {RoleRunning});
541544}
542545
546+void LauncherModel::applicationSurfaceCountChanged(int count)
547+{
548+ ApplicationInfoInterface *app = static_cast<ApplicationInfoInterface*>(sender());
549+ int idx = findApplication(app->appId());
550+ if (idx < 0) {
551+ qWarning() << "Received a surface count changed event from an app that's not in the Launcher model";
552+ return;
553+ }
554+ LauncherItem *item = m_list.at(idx);
555+ if (item->surfaceCount() != count) {
556+ item->setSurfaceCount(count);
557+ Q_EMIT dataChanged(index(idx), index(idx), {RoleSurfaceCount});
558+ }
559+}
560+
543561void LauncherModel::applicationRemoved(const QModelIndex &parent, int row)
544562{
545563 Q_UNUSED(parent)
546564
565+ ApplicationInfoInterface *app = m_appManager->get(row);
547566 int appIndex = -1;
548567 for (int i = 0; i < m_list.count(); ++i) {
549− if (m_list.at(i)->appId() == m_appManager->get(row)->appId()) {
568+ if (m_list.at(i)->appId() == app->appId()) {
550569 appIndex = i;
551570 break;
552571 }
@@ -557,17 +576,24 @@ void LauncherModel::applicationRemoved(const QModelIndex &parent, int row)
557576 return;
558577 }
559578
579+ disconnect(app, &ApplicationInfoInterface::surfaceCountChanged, this, &LauncherModel::applicationSurfaceCountChanged);
580+
560581 LauncherItem * item = m_list.at(appIndex);
561− item->setRunning(false);
562582
563583 if (!item->pinned()) {
564584 beginRemoveRows(QModelIndex(), appIndex, appIndex);
565585 m_list.takeAt(appIndex)->deleteLater();
566586 endRemoveRows();
567587 m_asAdapter->syncItems(m_list);
568− Q_EMIT dataChanged(index(appIndex), index(appIndex), {RolePinned});
588+ } else {
589+ QVector<int> changedRoles = {RoleRunning};
590+ item->setRunning(false);
591+ if (item->focused()) {
592+ changedRoles << RoleFocused;
593+ item->setFocused(false);
594+ }
595+ Q_EMIT dataChanged(index(appIndex), index(appIndex), changedRoles);
569596 }
570− Q_EMIT dataChanged(index(appIndex), index(appIndex), {RoleRunning});
571597}
572598
573599void LauncherModel::focusedAppIdChanged()
@@ -576,8 +602,14 @@ void LauncherModel::focusedAppIdChanged()
576602 for (int i = 0; i < m_list.count(); ++i) {
577603 LauncherItem *item = m_list.at(i);
578604 if (!item->focused() && item->appId() == appId) {
605+ QVector<int> changedRoles;
606+ changedRoles << RoleFocused;
579607 item->setFocused(true);
580− Q_EMIT dataChanged(index(i), index(i), {RoleFocused});
608+ if (item->alerting()) {
609+ changedRoles << RoleAlerting;
610+ item->setAlerting(false);
611+ }
612+ Q_EMIT dataChanged(index(i), index(i), changedRoles);
581613 } else if (item->focused() && item->appId() != appId) {
582614 item->setFocused(false);
583615 Q_EMIT dataChanged(index(i), index(i), {RoleFocused});
plugins/Unity/Launcher/launchermodel.h+1−1
@@ -45,7 +45,6 @@ public:
4545
4646 QVariant data(const QModelIndex &index, int role) const override;
4747
48− Q_INVOKABLE void setAlerting(const QString &appId, bool alerting) override;
4948 Q_INVOKABLE unity::shell::launcher::LauncherItemInterface* get(int index) const override;
5049 Q_INVOKABLE void move(int oldIndex, int newIndex) override;
5150 Q_INVOKABLE void pin(const QString &appId, int index = -1) override;
@@ -79,6 +78,7 @@ private Q_SLOTS:
7978 void applicationAdded(const QModelIndex &parent, int row);
8079 void applicationRemoved(const QModelIndex &parent, int row);
8180 void focusedAppIdChanged();
81+ void applicationSurfaceCountChanged(int);
8282
8383private:
8484 QList<LauncherItem*> m_list;
plugins/Unity/Platform/Platform.qmltypesdeleted−20
@@ -1,20 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Platform 1.0 plugins'
8−
9−Module {
10− Component {
11− name: "Platform"
12− prototype: "QObject"
13− exports: ["Unity.Platform/Platform 1.0"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Property { name: "chassis"; type: "string"; isReadonly: true }
18− Property { name: "isPC"; type: "bool"; isReadonly: true }
19− }
20−}
plugins/Unity/Session/CMakeLists.txt+4
@@ -2,9 +2,12 @@ include_directories(
22 ${CMAKE_CURRENT_SOURCE_DIR}
33 ${CMAKE_CURRENT_BINARY_DIR}
44 ${GIO_INCLUDE_DIRS}
5+ ${GLIB_INCLUDE_DIRS}
56 ${libunity8-private_SOURCE_DIR}
67)
78
9+add_definitions(-DSM_BUSNAME=systemBus)
10+
811set(QMLSESSIONPLUGIN_SRC
912 plugin.cpp
1013 dbusunitysessionservice.cpp
@@ -19,6 +22,7 @@ qt5_use_modules(UnitySession-qml DBus Qml)
1922target_link_libraries(UnitySession-qml
2023 unity8-private
2124 ${GIO_LDFLAGS}
25+ ${GLIB_LIBRARIES}
2226 )
2327
2428# export the qmldir and qmltypes files
plugins/Unity/Session/Session.qmltypesdeleted−85
@@ -1,85 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Session 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "DBusUnitySessionService"
12− prototype: "UnityDBusObject"
13− exports: ["Unity.Session/DBusUnitySessionService 0.1"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Signal {
18− name: "LogoutRequested"
19− Parameter { name: "have_inhibitors"; type: "bool" }
20− }
21− Signal {
22− name: "logoutRequested"
23− Parameter { name: "have_inhibitors"; type: "bool" }
24− }
25− Signal {
26− name: "RebootRequested"
27− Parameter { name: "have_inhibitors"; type: "bool" }
28− }
29− Signal {
30− name: "rebootRequested"
31− Parameter { name: "have_inhibitors"; type: "bool" }
32− }
33− Signal {
34− name: "ShutdownRequested"
35− Parameter { name: "have_inhibitors"; type: "bool" }
36− }
37− Signal {
38− name: "shutdownRequested"
39− Parameter { name: "have_inhibitors"; type: "bool" }
40− }
41− Signal { name: "LogoutReady" }
42− Signal { name: "logoutReady" }
43− Signal { name: "LockRequested" }
44− Signal { name: "lockRequested" }
45− Signal { name: "Locked" }
46− Signal { name: "Unlocked" }
47− Method { name: "Logout" }
48− Method { name: "Reboot" }
49− Method { name: "Shutdown" }
50− Method { name: "Suspend" }
51− Method { name: "Hibernate" }
52− Method { name: "HybridSleep" }
53− Method { name: "RequestLogout" }
54− Method { name: "RequestReboot" }
55− Method { name: "RequestShutdown" }
56− Method { name: "EndSession" }
57− Method { name: "CanHibernate"; type: "bool" }
58− Method { name: "CanSuspend"; type: "bool" }
59− Method { name: "CanHybridSleep"; type: "bool" }
60− Method { name: "CanReboot"; type: "bool" }
61− Method { name: "CanShutdown"; type: "bool" }
62− Method { name: "CanLock"; type: "bool" }
63− Method { name: "UserName"; type: "string" }
64− Method { name: "RealName"; type: "string" }
65− Method { name: "HostName"; type: "string" }
66− Method { name: "PromptLock" }
67− Method { name: "Lock" }
68− Method { name: "IsLocked"; type: "bool" }
69− Method { name: "logout" }
70− Method { name: "reboot" }
71− Method { name: "shutdown" }
72− Method { name: "endSession" }
73− }
74− Component {
75− name: "OrientationLock"
76− prototype: "QObject"
77− exports: ["Unity.Session/OrientationLock 0.1"]
78− isCreatable: false
79− isSingleton: true
80− exportMetaObjectRevisions: [0]
81− Property { name: "enabled"; type: "bool"; isReadonly: true }
82− Property { name: "savedOrientation"; type: "Qt::ScreenOrientation" }
83− }
84− Component { name: "UnityDBusObject"; prototype: "QObject" }
85−}
plugins/Unity/Session/dbusunitysessionservice.cpp+61−24
@@ -30,6 +30,9 @@
3030#include <QDateTime>
3131#include <QDBusUnixFileDescriptor>
3232
33+// Glib
34+#include <glib.h>
35+
3336#define LOGIN1_SERVICE QStringLiteral("org.freedesktop.login1")
3437#define LOGIN1_PATH QStringLiteral("/org/freedesktop/login1")
3538#define LOGIN1_IFACE QStringLiteral("org.freedesktop.login1.Manager")
@@ -61,19 +64,19 @@ public:
6164 QStringLiteral("GetSessionByPID"));
6265 msg << (quint32) getpid();
6366
64− QDBusReply<QDBusObjectPath> reply = QDBusConnection::systemBus().call(msg);
67+ QDBusReply<QDBusObjectPath> reply = QDBusConnection::SM_BUSNAME().call(msg);
6568 if (reply.isValid()) {
6669 logindSessionPath = reply.value().path();
6770
6871 // start watching the Active property
69− QDBusConnection::systemBus().connect(LOGIN1_SERVICE, logindSessionPath, QStringLiteral("org.freedesktop.DBus.Properties"), QStringLiteral("PropertiesChanged"),
70− this, SLOT(onPropertiesChanged(QString,QVariantMap,QStringList)));
72+ QDBusConnection::SM_BUSNAME().connect(LOGIN1_SERVICE, logindSessionPath, QStringLiteral("org.freedesktop.DBus.Properties"), QStringLiteral("PropertiesChanged"),
73+ this, SLOT(onPropertiesChanged(QString,QVariantMap,QStringList)));
7174
7275 setupSystemdInhibition();
7376
7477 // re-enable the inhibition upon resume from sleep
75− QDBusConnection::systemBus().connect(LOGIN1_SERVICE, LOGIN1_PATH, LOGIN1_IFACE, QStringLiteral("PrepareForSleep"),
76− this, SLOT(onResuming(bool)));
78+ QDBusConnection::SM_BUSNAME().connect(LOGIN1_SERVICE, LOGIN1_PATH, LOGIN1_IFACE, QStringLiteral("PrepareForSleep"),
79+ this, SLOT(onResuming(bool)));
7780 } else {
7881 qWarning() << "Failed to get logind session path" << reply.error().message();
7982 }
@@ -93,7 +96,7 @@ public:
9396 msg << "Unity8 handles power events"; // why
9497 msg << "block"; // mode
9598
96− QDBusPendingCall pendingCall = QDBusConnection::systemBus().asyncCall(msg);
99+ QDBusPendingCall pendingCall = QDBusConnection::SM_BUSNAME().asyncCall(msg);
97100 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall, this);
98101 connect(watcher, &QDBusPendingCallWatcher::finished,
99102 this, [this](QDBusPendingCallWatcher* watcher) {
@@ -111,7 +114,7 @@ public:
111114 bool checkLogin1Call(const QString &method) const
112115 {
113116 QDBusMessage msg = QDBusMessage::createMethodCall(LOGIN1_SERVICE, LOGIN1_PATH, LOGIN1_IFACE, method);
114− QDBusReply<QString> reply = QDBusConnection::systemBus().call(msg);
117+ QDBusReply<QString> reply = QDBusConnection::SM_BUSNAME().call(msg);
115118 return reply.isValid() && (reply == QStringLiteral("yes") || reply == QStringLiteral("challenge"));
116119 }
117120
@@ -122,7 +125,7 @@ public:
122125 LOGIN1_IFACE,
123126 method);
124127 msg.setArguments(args);
125− QDBusConnection::systemBus().asyncCall(msg);
128+ QDBusConnection::SM_BUSNAME().asyncCall(msg);
126129 }
127130
128131 void setActive(bool active)
@@ -154,7 +157,7 @@ public:
154157 msg << LOGIN1_SESSION_IFACE;
155158 msg << ACTIVE_KEY;
156159
157− QDBusPendingCall pendingCall = QDBusConnection::systemBus().asyncCall(msg);
160+ QDBusPendingCall pendingCall = QDBusConnection::SM_BUSNAME().asyncCall(msg);
158161 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall, this);
159162 connect(watcher, &QDBusPendingCallWatcher::finished,
160163 this, [this](QDBusPendingCallWatcher* watcher) {
@@ -188,7 +191,7 @@ public:
188191 msg << LOGIN1_SESSION_IFACE;
189192 msg << IDLE_SINCE_KEY;
190193
191− QDBusReply<QVariant> reply = QDBusConnection::systemBus().call(msg);
194+ QDBusReply<QVariant> reply = QDBusConnection::SM_BUSNAME().call(msg);
192195 if (reply.isValid()) {
193196 return reply.value().value<quint64>();
194197 } else {
@@ -205,7 +208,7 @@ public:
205208 LOGIN1_SESSION_IFACE,
206209 QStringLiteral("SetIdleHint"));
207210 msg << idle;
208− QDBusConnection::systemBus().asyncCall(msg);
211+ QDBusConnection::SM_BUSNAME().asyncCall(msg);
209212 }
210213
211214private Q_SLOTS:
@@ -224,11 +227,14 @@ private Q_SLOTS:
224227 {
225228 if (!active) {
226229 setupSystemdInhibition();
230+ } else {
231+ Q_EMIT prepareForSleep();
227232 }
228233 }
229234
230235Q_SIGNALS:
231236 void screensaverActiveChanged(bool active);
237+ void prepareForSleep();
232238};
233239
234240Q_GLOBAL_STATIC(DBusUnitySessionServicePrivate, d)
@@ -237,11 +243,12 @@ DBusUnitySessionService::DBusUnitySessionService()
237243 : UnityDBusObject(QStringLiteral("/com/canonical/Unity/Session"), QStringLiteral("com.canonical.Unity"))
238244{
239245 if (!d->logindSessionPath.isEmpty()) {
240− // connect our Lock() slot to the logind's session Lock() signal
241− QDBusConnection::systemBus().connect(LOGIN1_SERVICE, d->logindSessionPath, LOGIN1_SESSION_IFACE, QStringLiteral("Lock"), this, SLOT(Lock()));
246+ // connect our PromptLock() slot to the logind's session Lock() signal
247+ QDBusConnection::SM_BUSNAME().connect(LOGIN1_SERVICE, d->logindSessionPath, LOGIN1_SESSION_IFACE, QStringLiteral("Lock"), this, SLOT(PromptLock()));
242248 // ... and our Unlocked() signal to the logind's session Unlock() signal
243249 // (lightdm handles the unlocking by calling logind's Unlock method which in turn emits this signal we connect to)
244− QDBusConnection::systemBus().connect(LOGIN1_SERVICE, d->logindSessionPath, LOGIN1_SESSION_IFACE, QStringLiteral("Unlock"), this, SIGNAL(Unlocked()));
250+ QDBusConnection::SM_BUSNAME().connect(LOGIN1_SERVICE, d->logindSessionPath, LOGIN1_SESSION_IFACE, QStringLiteral("Unlock"), this, SLOT(doUnlock()));
251+ connect(d, &DBusUnitySessionServicePrivate::prepareForSleep, this, &DBusUnitySessionService::PromptLock);
245252 } else {
246253 qWarning() << "Failed to connect to logind's session Lock/Unlock signals";
247254 }
@@ -295,12 +302,7 @@ bool DBusUnitySessionService::CanLock() const
295302
296303QString DBusUnitySessionService::UserName() const
297304{
298− struct passwd *p = getpwuid(geteuid());
299− if (p) {
300− return QString::fromUtf8(p->pw_name);
301− }
302−
303− return QString();
305+ return QString::fromUtf8(g_get_user_name());
304306}
305307
306308QString DBusUnitySessionService::RealName() const
@@ -330,15 +332,41 @@ QString DBusUnitySessionService::HostName() const
330332
331333void DBusUnitySessionService::PromptLock()
332334{
335+ // Prompt as in quick. No locking animation needed. Usually used by
336+ // indicator-session in combination with a switch to greeter or other
337+ // user session.
333338 Q_EMIT LockRequested();
334339 Q_EMIT lockRequested();
335340}
336341
337342void DBusUnitySessionService::Lock()
338343{
339− // signal u8 to show the lockscreen/greeter
344+ // Normal lock (with animation, as compared to PromptLock above). Usually
345+ // used by indicator-session to lock the session in place.
346+ //
347+ // FIXME: We also -- as a bit of a hack around indicator-session not fully
348+ // supporting a phone profile -- switch to greeter here. The unity7 flow is
349+ // that the user chooses "Lock/Switch" from the indicator, and then can go
350+ // to greeter by selecting "Switch" again from the indicator, which is now
351+ // exposed by the desktop_lockscreen profile. But since in unity8, we try
352+ // to expose most things all the time, we don't use the separate lockscreen
353+ // profile. Instead, we just go directly to the greeter the first time
354+ // a user presses "Lock/Switch". This isn't what this DBus call is
355+ // supposed to do, but we can live with it for now.
356+ //
357+ // Here's a bug about indicator-session growing a converged Touch profile:
358+ // https://launchpad.net/bugs/1557716
359+ //
360+ // We only do this here in the animated-lock call because that's the only
361+ // time the indicator locks without also asking the display manager to
362+ // switch sessions on us. And since we are switching screens, we also
363+ // don't bother respecting the animate request, simply doing a PromptLock.
340364 PromptLock();
365+ switchToGreeter();
366+}
341367
368+void DBusUnitySessionService::switchToGreeter()
369+{
342370 // lock the session using the org.freedesktop.DisplayManager system DBUS service
343371 const QString sessionPath = QString::fromLocal8Bit(qgetenv("XDG_SESSION_PATH"));
344372 QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.freedesktop.DisplayManager"),
@@ -346,7 +374,7 @@ void DBusUnitySessionService::Lock()
346374 QStringLiteral("org.freedesktop.DisplayManager.Session"),
347375 QStringLiteral("Lock"));
348376
349− QDBusPendingCall pendingCall = QDBusConnection::systemBus().asyncCall(msg);
377+ QDBusPendingCall pendingCall = QDBusConnection::SM_BUSNAME().asyncCall(msg);
350378 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall, this);
351379 connect(watcher, &QDBusPendingCallWatcher::finished,
352380 this, [this](QDBusPendingCallWatcher* watcher) {
@@ -363,6 +391,12 @@ void DBusUnitySessionService::Lock()
363391 });
364392}
365393
394+void DBusUnitySessionService::doUnlock()
395+{
396+ Q_EMIT Unlocked();
397+ Q_EMIT unlocked();
398+}
399+
366400bool DBusUnitySessionService::IsLocked() const
367401{
368402 return !d->isSessionActive;
@@ -392,16 +426,19 @@ void DBusUnitySessionService::Shutdown()
392426
393427void DBusUnitySessionService::Suspend()
394428{
429+ PromptLock();
395430 d->makeLogin1Call(QStringLiteral("Suspend"), {false});
396431}
397432
398433void DBusUnitySessionService::Hibernate()
399434{
435+ PromptLock();
400436 d->makeLogin1Call(QStringLiteral("Hibernate"), {false});
401437}
402438
403439void DBusUnitySessionService::HybridSleep()
404440{
441+ PromptLock();
405442 d->makeLogin1Call(QStringLiteral("HybridSleep"), {false});
406443}
407444
@@ -481,7 +518,7 @@ void DBusGnomeScreensaverWrapper::SetActive(bool lock)
481518
482519void DBusGnomeScreensaverWrapper::Lock()
483520{
484− performAsyncUnityCall(QStringLiteral("Lock"));
521+ performAsyncUnityCall(QStringLiteral("PromptLock"));
485522}
486523
487524quint32 DBusGnomeScreensaverWrapper::GetActiveTime() const
@@ -518,7 +555,7 @@ bool DBusScreensaverWrapper::SetActive(bool lock)
518555
519556void DBusScreensaverWrapper::Lock()
520557{
521− performAsyncUnityCall(QStringLiteral("Lock"));
558+ performAsyncUnityCall(QStringLiteral("PromptLock"));
522559}
523560
524561quint32 DBusScreensaverWrapper::GetActiveTime() const
plugins/Unity/Session/dbusunitysessionservice.h+7
@@ -106,6 +106,7 @@ Q_SIGNALS:
106106 * Emitted after the session has been unlocked.
107107 */
108108 Q_SCRIPTABLE void Unlocked();
109+ void unlocked();
109110
110111public Q_SLOTS:
111112 /**
@@ -258,6 +259,12 @@ public Q_SLOTS:
258259 * @return whether the session is currently locked
259260 */
260261 Q_SCRIPTABLE bool IsLocked() const;
262+
263+private Q_SLOTS:
264+ void doUnlock();
265+
266+private:
267+ void switchToGreeter();
261268};
262269
263270class DBusGnomeSessionManagerWrapper : public UnityDBusObject
plugins/Utils/CMakeLists.txt+5−1
@@ -1,6 +1,10 @@
11include_directories(
22 ${CMAKE_CURRENT_SOURCE_DIR}
33 ${CMAKE_CURRENT_BINARY_DIR}
4+)
5+
6+include_directories(
7+ SYSTEM
48 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
59 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
610 ${GIO_INCLUDE_DIRS}
@@ -9,6 +13,7 @@ include_directories(
913set(QMLPLUGIN_SRC
1014 activefocuslogger.cpp
1115 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
16+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
1217 applicationsfiltermodel.cpp
1318 constants.cpp
1419 WindowInputMonitor.cpp
@@ -18,7 +23,6 @@ set(QMLPLUGIN_SRC
1823 Timer.cpp
1924 unitymenumodelpaths.cpp
2025 windowinputfilter.cpp
21− windowscreenshotprovider.cpp
2226 easingcurve.cpp
2327 windowstatestorage.cpp
2428 timezoneFormatter.cpp
plugins/Utils/Utils.qmltypesdeleted−175
@@ -1,175 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Utils 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "EasingCurve"
12− prototype: "QObject"
13− exports: ["Utils/EasingCurve 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "type"; type: "QEasingCurve::Type" }
16− Property { name: "period"; type: "double" }
17− Property { name: "progress"; type: "double" }
18− Property { name: "value"; type: "double"; isReadonly: true }
19− }
20− Component {
21− name: "QAbstractProxyModel"
22− prototype: "QAbstractItemModel"
23− Property { name: "sourceModel"; type: "QAbstractItemModel"; isPointer: true }
24− }
25− Component { name: "QIdentityProxyModel"; prototype: "QAbstractProxyModel" }
26− Component {
27− name: "QLimitProxyModelQML"
28− prototype: "QIdentityProxyModel"
29− exports: ["Utils/LimitProxyModel 0.1"]
30− exportMetaObjectRevisions: [0]
31− Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
32− Property { name: "limit"; type: "int" }
33− Property { name: "count"; type: "int"; isReadonly: true }
34− Signal { name: "totalCountChanged" }
35− }
36− Component {
37− name: "QSortFilterProxyModel"
38− prototype: "QAbstractProxyModel"
39− Property { name: "filterRegExp"; type: "QRegExp" }
40− Property { name: "filterKeyColumn"; type: "int" }
41− Property { name: "dynamicSortFilter"; type: "bool" }
42− Property { name: "filterCaseSensitivity"; type: "Qt::CaseSensitivity" }
43− Property { name: "sortCaseSensitivity"; type: "Qt::CaseSensitivity" }
44− Property { name: "isSortLocaleAware"; type: "bool" }
45− Property { name: "sortRole"; type: "int" }
46− Property { name: "filterRole"; type: "int" }
47− Method {
48− name: "setFilterRegExp"
49− Parameter { name: "pattern"; type: "string" }
50− }
51− Method {
52− name: "setFilterWildcard"
53− Parameter { name: "pattern"; type: "string" }
54− }
55− Method {
56− name: "setFilterFixedString"
57− Parameter { name: "pattern"; type: "string" }
58− }
59− Method { name: "clear" }
60− Method { name: "invalidate" }
61− }
62− Component {
63− name: "RelativeTimeFormatter"
64− prototype: "TimeFormatter"
65− exports: ["Utils/RelativeTimeFormatter 0.1"]
66− exportMetaObjectRevisions: [0]
67− }
68− Component {
69− name: "TimeFormatter"
70− prototype: "QObject"
71− exports: ["Utils/GDateTimeFormatter 0.1", "Utils/TimeFormatter 0.1"]
72− exportMetaObjectRevisions: [0, 0]
73− Property { name: "format"; type: "string" }
74− Property { name: "timeString"; type: "string"; isReadonly: true }
75− Property { name: "time"; type: "qlonglong" }
76− Signal {
77− name: "formatChanged"
78− Parameter { name: "format"; type: "string" }
79− }
80− Signal {
81− name: "timeStringChanged"
82− Parameter { name: "timeString"; type: "string" }
83− }
84− Signal {
85− name: "timeChanged"
86− Parameter { name: "time"; type: "qlonglong" }
87− }
88− }
89− Component {
90− name: "UnityMenuModelPaths"
91− prototype: "QObject"
92− exports: ["Utils/UnityMenuModelPaths 0.1"]
93− exportMetaObjectRevisions: [0]
94− Property { name: "source"; type: "QVariant" }
95− Property { name: "busName"; type: "QByteArray"; isReadonly: true }
96− Property { name: "actions"; type: "QVariantMap"; isReadonly: true }
97− Property { name: "menuObjectPath"; type: "QByteArray"; isReadonly: true }
98− Property { name: "busNameHint"; type: "QByteArray" }
99− Property { name: "actionsHint"; type: "QByteArray" }
100− Property { name: "menuObjectPathHint"; type: "QByteArray" }
101− }
102− Component {
103− name: "UnitySortFilterProxyModelQML"
104− prototype: "QSortFilterProxyModel"
105− exports: ["Utils/UnitySortFilterProxyModel 0.1"]
106− exportMetaObjectRevisions: [0]
107− Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
108− Property { name: "totalCount"; type: "int"; isReadonly: true }
109− Property { name: "count"; type: "int"; isReadonly: true }
110− Property { name: "invertMatch"; type: "bool" }
111− Signal {
112− name: "invertMatchChanged"
113− Parameter { type: "bool" }
114− }
115− Method {
116− name: "get"
117− type: "QVariantMap"
118− Parameter { name: "row"; type: "int" }
119− }
120− Method {
121− name: "data"
122− type: "QVariant"
123− Parameter { name: "row"; type: "int" }
124− Parameter { name: "role"; type: "int" }
125− }
126− Method { name: "count"; type: "int" }
127− Method {
128− name: "findFirst"
129− type: "int"
130− Parameter { name: "role"; type: "int" }
131− Parameter { name: "value"; type: "QVariant" }
132− }
133− Method {
134− name: "mapRowToSource"
135− type: "int"
136− Parameter { name: "row"; type: "int" }
137− }
138− Method {
139− name: "mapFromSource"
140− type: "int"
141− Parameter { name: "row"; type: "int" }
142− }
143− Method {
144− name: "mapToSource"
145− type: "int"
146− Parameter { name: "row"; type: "int" }
147− }
148− }
149− Component {
150− name: "WindowInputFilter"
151− defaultProperty: "data"
152− prototype: "QQuickItem"
153− exports: ["Utils/WindowInputFilter 0.1"]
154− exportMetaObjectRevisions: [0]
155− }
156− Component {
157− name: "WindowStateStorage"
158− prototype: "QObject"
159− exports: ["Utils/WindowStateStorage 0.1"]
160− isCreatable: false
161− isSingleton: true
162− exportMetaObjectRevisions: [0]
163− Method {
164− name: "saveGeometry"
165− Parameter { name: "windowId"; type: "string" }
166− Parameter { name: "rect"; type: "QRect" }
167− }
168− Method {
169− name: "getGeometry"
170− type: "QRect"
171− Parameter { name: "windowId"; type: "string" }
172− Parameter { name: "defaultValue"; type: "QRect" }
173− }
174− }
175−}
plugins/Utils/WindowInputMonitor.cpp+8−8
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -30,7 +30,6 @@ WindowInputMonitor::WindowInputMonitor(UnityUtil::AbstractTimer *timer,
3030 QQuickItem *parent)
3131 : QQuickItem(parent)
3232 , m_windowBeingTouched(false)
33− , m_homeKeyPressed(false)
3433 , m_windowLastTouchedTimer(elapsedTimer)
3534 , m_activationTimer(timer)
3635{
@@ -42,6 +41,7 @@ WindowInputMonitor::WindowInputMonitor(UnityUtil::AbstractTimer *timer,
4241 connect(m_activationTimer, &UnityUtil::AbstractTimer::timeout,
4342 this, &WindowInputMonitor::emitActivatedIfNoTouchesAround);
4443 m_activationTimer->setInterval(msecsWithoutTouches);
44+ m_activationTimer->setSingleShot(true);
4545}
4646
4747WindowInputMonitor::~WindowInputMonitor()
@@ -67,19 +67,19 @@ void WindowInputMonitor::update(QEvent *event)
6767 if (event->type() == QEvent::KeyPress) {
6868 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
6969
70− m_homeKeyPressed = true;
71−
72− if (keyEvent->key() == Qt::Key_Super_L && !keyEvent->isAutoRepeat()
70+ if (m_pressedHomeKey == 0 && m_homeKeys.contains(keyEvent->key()) && !keyEvent->isAutoRepeat()
71+ && !m_activationTimer->isRunning()
7372 && !m_windowBeingTouched
7473 && m_windowLastTouchedTimer->elapsed() >= msecsWithoutTouches) {
74+ m_pressedHomeKey = keyEvent->key();
7575 m_activationTimer->start();
7676 }
7777
7878 } else if (event->type() == QEvent::KeyRelease) {
7979 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
8080
81− if (keyEvent->key() == Qt::Key_Super_L) {
82− m_homeKeyPressed = false;
81+ if (keyEvent->key() == m_pressedHomeKey) {
82+ m_pressedHomeKey = 0;
8383 }
8484
8585 } else if (event->type() == QEvent::TouchBegin) {
@@ -116,7 +116,7 @@ void WindowInputMonitor::setupFilterOnWindow(QQuickWindow *window)
116116
117117void WindowInputMonitor::emitActivatedIfNoTouchesAround()
118118{
119− if (!m_homeKeyPressed && !m_windowBeingTouched &&
119+ if (m_pressedHomeKey == 0 && !m_windowBeingTouched &&
120120 (m_windowLastTouchedTimer->elapsed() > msecsWithoutTouches)) {
121121 Q_EMIT homeKeyActivated();
122122 }
plugins/Utils/WindowInputMonitor.h+8−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -18,6 +18,7 @@
1818#define UNITY_WINDOWINPUTMONITOR_H
1919
2020#include <QQuickItem>
21+#include <QList>
2122#include <QPointer>
2223
2324#include "Timer.h"
@@ -83,9 +84,14 @@ private Q_SLOTS:
8384private:
8485 QPointer<QQuickWindow> m_filteredWindow;
8586 bool m_windowBeingTouched;
86− bool m_homeKeyPressed;
8787 UnityUtil::AbstractElapsedTimer *m_windowLastTouchedTimer;
8888 UnityUtil::AbstractTimer *m_activationTimer;
89+
90+ // Qt::Keys that are mapped to our "home" key.
91+ QList<int> m_homeKeys{Qt::Key_Super_L, Qt::Key_HomePage};
92+ // Which Qt::Key from m_homeKeys is currently pressed.
93+ // 0 if none
94+ int m_pressedHomeKey{0};
8995};
9096
9197#endif // UNITY_WINDOWINPUTMONITOR_H
plugins/Utils/deviceconfigparser.cpp+8
@@ -23,6 +23,7 @@
2323
2424DeviceConfigParser::DeviceConfigParser(QObject *parent): QObject(parent)
2525{
26+ // Local files have highest priority
2627 QString path;
2728 Q_FOREACH (const QString &standardPath, QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation)) {
2829 if (QFileInfo(standardPath + "/devices.conf").exists()) {
@@ -31,9 +32,16 @@ DeviceConfigParser::DeviceConfigParser(QObject *parent): QObject(parent)
3132 }
3233 }
3334
35+ // Check if there is an override in the device tarball (/system/etc/)
36+ if (path.isEmpty() && QFileInfo::exists("/system/etc/ubuntu/devices.conf")) {
37+ path = "/system/etc/ubuntu/devices.conf";
38+ }
39+
40+ // No higher priority files found. Use standard of /etc/
3441 if (path.isEmpty()) {
3542 path = "/etc/ubuntu/devices.conf";
3643 }
44+
3745 qDebug() << "Using" << path << "as device configuration file";
3846 m_config = new QSettings(path, QSettings::IniFormat, this);
3947}
plugins/Utils/deviceconfigparser.h+1
@@ -25,6 +25,7 @@ class DeviceConfigParser: public QObject
2525 Q_OBJECT
2626 Q_PROPERTY(QString name READ name WRITE setName NOTIFY changed)
2727
28+ // NOTE: When changing this properties, also update the examples in docs and data
2829 Q_PROPERTY(Qt::ScreenOrientation primaryOrientation READ primaryOrientation NOTIFY changed)
2930 Q_PROPERTY(Qt::ScreenOrientations supportedOrientations READ supportedOrientations NOTIFY changed)
3031 Q_PROPERTY(Qt::ScreenOrientation landscapeOrientation READ landscapeOrientation NOTIFY changed)
plugins/Utils/globalfunctions.cpp+1−4
@@ -16,11 +16,8 @@
1616
1717#include "globalfunctions.h"
1818
19−#pragma GCC diagnostic push
20−#pragma GCC diagnostic ignored "-pedantic"
21−#include <private/qquickitem_p.h>
22−#pragma GCC diagnostic pop
2319#include <QQmlEngine>
20+#include <private/qquickitem_p.h>
2421
2522GlobalFunctions::GlobalFunctions(QObject *parent)
2623 : QObject(parent)
plugins/Utils/plugin.cpp−8
@@ -31,7 +31,6 @@
3131#include "unitysortfilterproxymodelqml.h"
3232#include "unitymenumodelpaths.h"
3333#include "windowinputfilter.h"
34−#include "windowscreenshotprovider.h"
3534#include "windowstatestorage.h"
3635#include "constants.h"
3736#include "timezoneFormatter.h"
@@ -82,10 +81,3 @@ void UtilsPlugin::registerTypes(const char *uri)
8281 qmlRegisterType<DeviceConfigParser>(uri, 0, 1, "DeviceConfigParser");
8382 qmlRegisterSingletonType<GlobalFunctions>(uri, 0, 1, "Functions", createGlobalFunctions);
8483}
85−
86−void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
87−{
88− QQmlExtensionPlugin::initializeEngine(engine, uri);
89−
90− engine->addImageProvider(QStringLiteral("window"), new WindowScreenshotProvider);
91−}
plugins/Utils/plugin.h−1
@@ -29,7 +29,6 @@ class UtilsPlugin : public QQmlExtensionPlugin
2929
3030public:
3131 void registerTypes(const char *uri) override;
32− void initializeEngine(QQmlEngine *engine, const char *uri) override;
3332};
3433
3534#endif
plugins/Utils/windowscreenshotprovider.cppdeleted−59
@@ -1,59 +0,0 @@
1−/*
2− * Copyright (C) 2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "windowscreenshotprovider.h"
18−
19−#include <QGuiApplication>
20−#include <QQuickWindow>
21−
22−WindowScreenshotProvider::WindowScreenshotProvider()
23− : QQuickImageProvider(QQmlImageProviderBase::Image, 0)
24−{
25−}
26−
27−// A very simple implementation where we assume that there's only one window and that it's a
28−// QQuickWindow. Thus the id parameter is irrelevant.
29−//
30−// Idea: Make the id contain the objectName of the QQuickWindow once we care about a multi-display
31−// compositor?
32−// Strictly speaking that could be the actual QWindow::winId(), but that's mostly a
33−// meaningless arbitrary number.
34−QImage WindowScreenshotProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
35−{
36− Q_UNUSED(id);
37− Q_UNUSED(requestedSize);
38−
39− QWindowList windows = QGuiApplication::topLevelWindows();
40−
41− if (windows.count() != 1) {
42− size->rwidth() = 0;
43− size->rheight() = 0;
44− return QImage();
45− }
46−
47− QQuickWindow *quickWindow = qobject_cast<QQuickWindow *>(windows[0]);
48−
49− if (!quickWindow) {
50− size->rwidth() = 0;
51− size->rheight() = 0;
52− return QImage();
53− }
54−
55− QImage image = quickWindow->grabWindow();
56− size->rwidth() = image.width();
57− size->rheight() = image.height();
58− return image;
59−}
plugins/Utils/windowstatestorage.cpp+2−2
@@ -95,7 +95,7 @@ void WindowStateStorage::saveStage(const QString &appId, int stage)
9595 saveValue(queryString);
9696}
9797
98−int WindowStateStorage::getStage(const QString &appId) const
98+int WindowStateStorage::getStage(const QString &appId, int defaultValue) const
9999{
100100 const QString queryString = QStringLiteral("SELECT * FROM stage WHERE appId = '%1';")
101101 .arg(sanitiseString(appId));
@@ -103,7 +103,7 @@ int WindowStateStorage::getStage(const QString &appId) const
103103 QSqlQuery query = getValue(queryString);
104104
105105 if (!query.first()) {
106− return unity::shell::application::ApplicationInfoInterface::MainStage;
106+ return defaultValue;
107107 }
108108 return query.value("stage").toInt();
109109}
plugins/Utils/windowstatestorage.h+14−4
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2015 Canonical Ltd.
2+ * Copyright 2015-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -25,9 +25,19 @@ class WindowStateStorage: public QObject
2525 Q_ENUMS(WindowState)
2626public:
2727 enum WindowState {
28− WindowStateNormal,
29− WindowStateMaximized
28+ WindowStateNormal = 1 << 0,
29+ WindowStateMaximized = 1 << 1,
30+ WindowStateMinimized = 1 << 2,
31+ WindowStateFullscreen = 1 << 3,
32+ WindowStateMaximizedLeft = 1 << 4,
33+ WindowStateMaximizedRight = 1 << 5,
34+ WindowStateMaximizedHorizontally = 1 << 6,
35+ WindowStateMaximizedVertically = 1 << 7
3036 };
37+ Q_DECLARE_FLAGS(WindowStates, WindowState)
38+#if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0))
39+ Q_FLAG(WindowStates)
40+#endif
3141
3242 WindowStateStorage(QObject *parent = 0);
3343 virtual ~WindowStateStorage();
@@ -39,7 +49,7 @@ public:
3949 Q_INVOKABLE QRect getGeometry(const QString &windowId, const QRect defaultValue) const;
4050
4151 Q_INVOKABLE void saveStage(const QString &appId, int stage);
42− Q_INVOKABLE int getStage(const QString &appId) const;
52+ Q_INVOKABLE int getStage(const QString &appId, int defaultValue) const;
4353
4454private:
4555 void initdb();
plugins/WindowManager/CMakeLists.txtnew file+14
@@ -0,0 +1,14 @@
1+set(WINDOWMANAGER_SRC
2+ TopLevelSurfaceList.cpp
3+ WindowManagerPlugin.cpp
4+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
5+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
6+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
7+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceListInterface.h
8+ )
9+
10+add_library(windowmanager-qml SHARED ${WINDOWMANAGER_SRC})
11+
12+qt5_use_modules(windowmanager-qml Qml Quick Gui)
13+
14+add_unity8_plugin(WindowManager 0.1 WindowManager TARGETS windowmanager-qml)
plugins/WindowManager/TopLevelSurfaceList.cppnew file+486
@@ -0,0 +1,486 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "TopLevelSurfaceList.h"
18+
19+// unity-api
20+#include <unity/shell/application/ApplicationInfoInterface.h>
21+#include <unity/shell/application/MirSurfaceInterface.h>
22+#include <unity/shell/application/MirSurfaceListInterface.h>
23+
24+#include <QMetaObject>
25+
26+Q_LOGGING_CATEGORY(UNITY_TOPSURFACELIST, "unity.topsurfacelist", QtDebugMsg)
27+
28+#define DEBUG_MSG qCDebug(UNITY_TOPSURFACELIST).nospace().noquote() << __func__
29+
30+using namespace unity::shell::application;
31+
32+TopLevelSurfaceList::TopLevelSurfaceList(QObject *parent) :
33+ QAbstractListModel(parent)
34+{
35+ DEBUG_MSG << "()";
36+}
37+
38+TopLevelSurfaceList::~TopLevelSurfaceList()
39+{
40+ DEBUG_MSG << "()";
41+}
42+
43+int TopLevelSurfaceList::rowCount(const QModelIndex &parent) const
44+{
45+ return !parent.isValid() ? m_surfaceList.size() : 0;
46+}
47+
48+QVariant TopLevelSurfaceList::data(const QModelIndex& index, int role) const
49+{
50+ if (index.row() < 0 || index.row() >= m_surfaceList.size())
51+ return QVariant();
52+
53+ if (role == SurfaceRole) {
54+ MirSurfaceInterface *surface = m_surfaceList.at(index.row()).surface;
55+ return QVariant::fromValue(surface);
56+ } else if (role == ApplicationRole) {
57+ return QVariant::fromValue(m_surfaceList.at(index.row()).application);
58+ } else if (role == IdRole) {
59+ return QVariant::fromValue(m_surfaceList.at(index.row()).id);
60+ } else {
61+ return QVariant();
62+ }
63+}
64+
65+void TopLevelSurfaceList::raise(MirSurfaceInterface *surface)
66+{
67+ if (!surface)
68+ return;
69+
70+ DEBUG_MSG << "(MirSurface[" << (void*)surface << "])";
71+
72+ int i = indexOf(surface);
73+ if (i != -1) {
74+ raiseId(m_surfaceList.at(i).id);
75+ }
76+}
77+
78+void TopLevelSurfaceList::appendPlaceholder(ApplicationInfoInterface *application)
79+{
80+ DEBUG_MSG << "(" << application->appId() << ")";
81+
82+ appendSurfaceHelper(nullptr, application);
83+}
84+
85+void TopLevelSurfaceList::appendSurface(MirSurfaceInterface *surface, ApplicationInfoInterface *application)
86+{
87+ Q_ASSERT(surface != nullptr);
88+
89+ bool filledPlaceholder = false;
90+ for (int i = 0; i < m_surfaceList.count() && !filledPlaceholder; ++i) {
91+ ModelEntry &entry = m_surfaceList[i];
92+ if (entry.application == application && entry.surface == nullptr) {
93+ entry.surface = surface;
94+ connectSurface(surface);
95+ DEBUG_MSG << " appId=" << application->appId() << " surface=" << surface
96+ << ", filling out placeholder. after: " << toString();
97+ Q_EMIT dataChanged(index(i) /* topLeft */, index(i) /* bottomRight */, QVector<int>() << SurfaceRole);
98+ filledPlaceholder = true;
99+ }
100+ }
101+
102+ if (!filledPlaceholder) {
103+ DEBUG_MSG << " appId=" << application->appId() << " surface=" << surface << ", adding new row";
104+ appendSurfaceHelper(surface, application);
105+ }
106+}
107+
108+void TopLevelSurfaceList::appendSurfaceHelper(MirSurfaceInterface *surface, ApplicationInfoInterface *application)
109+{
110+ if (m_modelState == IdleState) {
111+ m_modelState = InsertingState;
112+ beginInsertRows(QModelIndex(), m_surfaceList.size() /*first*/, m_surfaceList.size() /*last*/);
113+ } else {
114+ Q_ASSERT(m_modelState == ResettingState);
115+ // No point in signaling anything if we're resetting the whole model
116+ }
117+
118+ int id = generateId();
119+ m_surfaceList.append(ModelEntry(surface, application, id));
120+ if (surface) {
121+ connectSurface(surface);
122+ }
123+
124+ if (m_modelState == InsertingState) {
125+ endInsertRows();
126+ Q_EMIT countChanged();
127+ Q_EMIT listChanged();
128+ m_modelState = IdleState;
129+ }
130+
131+ DEBUG_MSG << " after " << toString();
132+}
133+
134+void TopLevelSurfaceList::connectSurface(MirSurfaceInterface *surface)
135+{
136+ connect(surface, &MirSurfaceInterface::focusedChanged, this, [this, surface](bool focused){
137+ if (focused) {
138+ this->raise(surface);
139+ }
140+ });
141+ connect(surface, &MirSurfaceInterface::liveChanged, this, [this, surface](bool live){
142+ if (!live) {
143+ onSurfaceDied(surface);
144+ }
145+ });
146+ connect(surface, &QObject::destroyed, this, [this, surface](){ this->onSurfaceDestroyed(surface); });
147+}
148+
149+void TopLevelSurfaceList::onSurfaceDied(MirSurfaceInterface *surface)
150+{
151+ int i = indexOf(surface);
152+ if (i == -1) {
153+ return;
154+ }
155+
156+ auto application = m_surfaceList[i].application;
157+
158+ // can't be starting if it already has a surface
159+ Q_ASSERT(application->state() != ApplicationInfoInterface::Starting);
160+
161+ if (application->state() == ApplicationInfoInterface::Running) {
162+ m_surfaceList[i].removeOnceSurfaceDestroyed = true;
163+ } else {
164+ // assume it got killed by the out-of-memory daemon.
165+ //
166+ // So leave entry in the model and only remove its surface, so shell can display a screenshot
167+ // in its place.
168+ m_surfaceList[i].removeOnceSurfaceDestroyed = false;
169+ }
170+}
171+
172+void TopLevelSurfaceList::onSurfaceDestroyed(MirSurfaceInterface *surface)
173+{
174+ int i = indexOf(surface);
175+ if (i == -1) {
176+ return;
177+ }
178+
179+ if (m_surfaceList[i].removeOnceSurfaceDestroyed) {
180+ removeAt(i);
181+ } else {
182+ m_surfaceList[i].surface = nullptr;
183+ Q_EMIT dataChanged(index(i) /* topLeft */, index(i) /* bottomRight */, QVector<int>() << SurfaceRole);
184+ DEBUG_MSG << " Removed surface from entry. After: " << toString();
185+ }
186+}
187+
188+void TopLevelSurfaceList::removeAt(int index)
189+{
190+ if (m_modelState == IdleState) {
191+ beginRemoveRows(QModelIndex(), index, index);
192+ m_modelState = RemovingState;
193+ } else {
194+ Q_ASSERT(m_modelState == ResettingState);
195+ // No point in signaling anything if we're resetting the whole model
196+ }
197+
198+ m_surfaceList.removeAt(index);
199+
200+ if (m_modelState == RemovingState) {
201+ endRemoveRows();
202+ Q_EMIT countChanged();
203+ Q_EMIT listChanged();
204+ m_modelState = IdleState;
205+ }
206+
207+ DEBUG_MSG << " after " << toString();
208+}
209+
210+int TopLevelSurfaceList::indexOf(MirSurfaceInterface *surface)
211+{
212+ for (int i = 0; i < m_surfaceList.count(); ++i) {
213+ if (m_surfaceList.at(i).surface == surface) {
214+ return i;
215+ }
216+ }
217+ return -1;
218+}
219+
220+void TopLevelSurfaceList::move(int from, int to)
221+{
222+ if (from == to) return;
223+ DEBUG_MSG << " from=" << from << " to=" << to;
224+
225+ if (from >= 0 && from < m_surfaceList.size() && to >= 0 && to < m_surfaceList.size()) {
226+ QModelIndex parent;
227+ /* When moving an item down, the destination index needs to be incremented
228+ by one, as explained in the documentation:
229+ http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html#beginMoveRows */
230+
231+ Q_ASSERT(m_modelState == IdleState);
232+ m_modelState = MovingState;
233+
234+ beginMoveRows(parent, from, from, parent, to + (to > from ? 1 : 0));
235+ m_surfaceList.move(from, to);
236+ endMoveRows();
237+ Q_EMIT listChanged();
238+
239+ m_modelState = IdleState;
240+
241+ DEBUG_MSG << " after " << toString();
242+ }
243+}
244+
245+MirSurfaceInterface *TopLevelSurfaceList::surfaceAt(int index) const
246+{
247+ if (index >=0 && index < m_surfaceList.count()) {
248+ return m_surfaceList[index].surface;
249+ } else {
250+ return nullptr;
251+ }
252+}
253+
254+ApplicationInfoInterface *TopLevelSurfaceList::applicationAt(int index) const
255+{
256+ if (index >=0 && index < m_surfaceList.count()) {
257+ return m_surfaceList[index].application;
258+ } else {
259+ return nullptr;
260+ }
261+}
262+
263+int TopLevelSurfaceList::idAt(int index) const
264+{
265+ if (index >=0 && index < m_surfaceList.count()) {
266+ return m_surfaceList[index].id;
267+ } else {
268+ return 0;
269+ }
270+}
271+
272+int TopLevelSurfaceList::indexForId(int id) const
273+{
274+ for (int i = 0; i < m_surfaceList.count(); ++i) {
275+ if (m_surfaceList[i].id == id) {
276+ return i;
277+ }
278+ }
279+ return -1;
280+}
281+
282+void TopLevelSurfaceList::doRaiseId(int id)
283+{
284+ int fromIndex = indexForId(id);
285+ if (fromIndex != -1) {
286+ move(fromIndex, 0 /* toIndex */);
287+ }
288+}
289+
290+void TopLevelSurfaceList::raiseId(int id)
291+{
292+ if (m_modelState == IdleState) {
293+ DEBUG_MSG << "(id=" << id << ") - do it now.";
294+ doRaiseId(id);
295+ } else {
296+ DEBUG_MSG << "(id=" << id << ") - Model busy (modelState=" << m_modelState << "). Try again in the next event loop.";
297+ // The model has just signalled some change. If we have a Repeater responding to this update, it will get nuts
298+ // if we perform yet another model change straight away.
299+ //
300+ // A bad sympton of this problem is a Repeater.itemAt(index) call returning null event though Repeater.count says
301+ // the index is definitely within bounds.
302+ QMetaObject::invokeMethod(this, "raiseId", Qt::QueuedConnection, Q_ARG(int, id));
303+ }
304+}
305+
306+int TopLevelSurfaceList::generateId()
307+{
308+ int id = m_nextId;
309+ m_nextId = nextFreeId(m_nextId + 1);
310+ Q_EMIT nextIdChanged();
311+ return id;
312+}
313+
314+int TopLevelSurfaceList::nextFreeId(int candidateId)
315+{
316+ if (candidateId > m_maxId) {
317+ return nextFreeId(1);
318+ } else {
319+ if (indexForId(candidateId) == -1) {
320+ // it's indeed free
321+ return candidateId;
322+ } else {
323+ return nextFreeId(candidateId + 1);
324+ }
325+ }
326+}
327+
328+QString TopLevelSurfaceList::toString()
329+{
330+ QString str;
331+ for (int i = 0; i < m_surfaceList.count(); ++i) {
332+ auto item = m_surfaceList.at(i);
333+
334+ QString itemStr = QString("(index=%1,appId=%2,surface=0x%3,id=%4)")
335+ .arg(i)
336+ .arg(item.application->appId())
337+ .arg((qintptr)item.surface, 0, 16)
338+ .arg(item.id);
339+
340+ if (i > 0) {
341+ str.append(",");
342+ }
343+ str.append(itemStr);
344+ }
345+ return str;
346+}
347+
348+void TopLevelSurfaceList::addApplication(ApplicationInfoInterface *application)
349+{
350+ DEBUG_MSG << "(" << application->appId() << ")";
351+ Q_ASSERT(!m_applications.contains(application));
352+ m_applications.append(application);
353+
354+ MirSurfaceListInterface *surfaceList = application->surfaceList();
355+
356+ if (application->state() != ApplicationInfoInterface::Stopped) {
357+ if (surfaceList->count() == 0) {
358+ appendPlaceholder(application);
359+ } else {
360+ for (int i = 0; i < surfaceList->count(); ++i) {
361+ appendSurface(surfaceList->get(i), application);
362+ }
363+ }
364+ }
365+
366+ connect(surfaceList, &QAbstractItemModel::rowsInserted, this,
367+ [this, application, surfaceList](const QModelIndex & /*parent*/, int first, int last)
368+ {
369+ for (int i = last; i >= first; --i) {
370+ this->appendSurface(surfaceList->get(i), application);
371+ }
372+ });
373+}
374+
375+void TopLevelSurfaceList::removeApplication(ApplicationInfoInterface *application)
376+{
377+ DEBUG_MSG << "(" << application->appId() << ")";
378+ Q_ASSERT(m_applications.contains(application));
379+
380+ MirSurfaceListInterface *surfaceList = application->surfaceList();
381+
382+ disconnect(surfaceList, 0, this, 0);
383+
384+ Q_ASSERT(m_modelState == IdleState);
385+ m_modelState = RemovingState;
386+
387+ int i = 0;
388+ while (i < m_surfaceList.count()) {
389+ if (m_surfaceList.at(i).application == application) {
390+ beginRemoveRows(QModelIndex(), i, i);
391+ m_surfaceList.removeAt(i);
392+ endRemoveRows();
393+ Q_EMIT countChanged();
394+ Q_EMIT listChanged();
395+ } else {
396+ ++i;
397+ }
398+ }
399+
400+ m_modelState = IdleState;
401+
402+ DEBUG_MSG << " after " << toString();
403+
404+ m_applications.removeAll(application);
405+}
406+
407+QAbstractListModel *TopLevelSurfaceList::applicationsModel() const
408+{
409+ return m_applicationsModel;
410+}
411+
412+void TopLevelSurfaceList::setApplicationsModel(QAbstractListModel* value)
413+{
414+ if (m_applicationsModel == value) {
415+ return;
416+ }
417+
418+ DEBUG_MSG << "(" << value << ")";
419+
420+ Q_ASSERT(m_modelState == IdleState);
421+ m_modelState = ResettingState;
422+
423+ beginResetModel();
424+
425+ if (m_applicationsModel) {
426+ m_surfaceList.clear();
427+ m_applications.clear();
428+ disconnect(m_applicationsModel, 0, this, 0);
429+ }
430+
431+ m_applicationsModel = value;
432+
433+ if (m_applicationsModel) {
434+ findApplicationRole();
435+
436+ connect(m_applicationsModel, &QAbstractItemModel::rowsInserted,
437+ this, [this](const QModelIndex &/*parent*/, int first, int last) {
438+ for (int i = first; i <= last; ++i) {
439+ auto application = getApplicationFromModelAt(i);
440+ addApplication(application);
441+ }
442+ });
443+
444+ connect(m_applicationsModel, &QAbstractItemModel::rowsAboutToBeRemoved,
445+ this, [this](const QModelIndex &/*parent*/, int first, int last) {
446+ for (int i = first; i <= last; ++i) {
447+ auto application = getApplicationFromModelAt(i);
448+ removeApplication(application);
449+ }
450+ });
451+
452+ for (int i = 0; i < m_applicationsModel->rowCount(); ++i) {
453+ auto application = getApplicationFromModelAt(i);
454+ addApplication(application);
455+ }
456+ }
457+
458+ endResetModel();
459+ m_modelState = IdleState;
460+}
461+
462+ApplicationInfoInterface *TopLevelSurfaceList::getApplicationFromModelAt(int index)
463+{
464+ QModelIndex modelIndex = m_applicationsModel->index(index);
465+
466+ QVariant variant = m_applicationsModel->data(modelIndex, m_applicationRole);
467+
468+ // variant.value<ApplicationInfoInterface*>() returns null for some reason.
469+ return static_cast<ApplicationInfoInterface*>(variant.value<QObject*>());
470+}
471+
472+void TopLevelSurfaceList::findApplicationRole()
473+{
474+ QHash<int, QByteArray> namesHash = m_applicationsModel->roleNames();
475+
476+ m_applicationRole = -1;
477+ for (auto i = namesHash.begin(); i != namesHash.end() && m_applicationRole == -1; ++i) {
478+ if (i.value() == "application") {
479+ m_applicationRole = i.key();
480+ }
481+ }
482+
483+ if (m_applicationRole == -1) {
484+ qFatal("TopLevelSurfaceList: applicationsModel must have a \"application\" role.");
485+ }
486+}
plugins/WindowManager/TopLevelSurfaceList.hnew file+223
@@ -0,0 +1,223 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef TOPLEVELSURFACELIST_H
18+#define TOPLEVELSURFACELIST_H
19+
20+#include <QAbstractListModel>
21+#include <QList>
22+#include <QLoggingCategory>
23+
24+Q_DECLARE_LOGGING_CATEGORY(UNITY_TOPSURFACELIST)
25+
26+namespace unity {
27+ namespace shell {
28+ namespace application {
29+ class ApplicationInfoInterface;
30+ class MirSurfaceInterface;
31+ }
32+ }
33+}
34+
35+/**
36+ * @brief A model of top-level surfaces
37+ *
38+ * It's an abstraction of top-level application windows.
39+ *
40+ * When an entry first appears, it normaly doesn't have a surface yet, meaning that the application is
41+ * still starting up. A shell should then display a splash screen or saved screenshot of the application
42+ * until its surface comes up.
43+ *
44+ * As applications can have multiple surfaces and you can also have entries without surfaces at all,
45+ * the only way to unambiguously refer to an entry in this model is through its id.
46+ */
47+class TopLevelSurfaceList : public QAbstractListModel
48+{
49+
50+ Q_OBJECT
51+
52+ /**
53+ * @brief A list model of applications.
54+ *
55+ * It's expected to have a role called "application" which returns a ApplicationInfoInterface
56+ */
57+ Q_PROPERTY(QAbstractListModel* applicationsModel READ applicationsModel
58+ WRITE setApplicationsModel
59+ NOTIFY applicationsModelChanged)
60+
61+ /**
62+ * @brief Number of top-level surfaces in this model
63+ *
64+ * This is the same as rowCount, added in order to keep compatibility with QML ListModels.
65+ */
66+ Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
67+
68+ /**
69+ The id to be used on the next entry created
70+ Useful for tests
71+ */
72+ Q_PROPERTY(int nextId READ nextId NOTIFY nextIdChanged)
73+public:
74+
75+ /**
76+ * @brief The Roles supported by the model
77+ *
78+ * SurfaceRole - A MirSurfaceInterface. It will be null if the application is still starting up
79+ * ApplicationRole - An ApplicationInfoInterface
80+ * IdRole - A unique identifier for this entry. Useful to unambiguosly track elements as they move around in the list
81+ */
82+ enum Roles {
83+ SurfaceRole = Qt::UserRole,
84+ ApplicationRole = Qt::UserRole + 1,
85+ IdRole = Qt::UserRole + 2,
86+ };
87+
88+ explicit TopLevelSurfaceList(QObject *parent = nullptr);
89+ virtual ~TopLevelSurfaceList();
90+
91+ // QAbstractItemModel methods
92+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
93+ QVariant data(const QModelIndex& index, int role) const override;
94+ QHash<int, QByteArray> roleNames() const override {
95+ QHash<int, QByteArray> roleNames { {SurfaceRole, "surface"},
96+ {ApplicationRole, "application"},
97+ {IdRole, "id"} };
98+ return roleNames;
99+ }
100+
101+ int nextId() const { return m_nextId; }
102+
103+ QAbstractListModel *applicationsModel() const;
104+ void setApplicationsModel(QAbstractListModel*);
105+
106+public Q_SLOTS:
107+ /**
108+ * @brief Returns the surface at the given index
109+ *
110+ * It will be a nullptr if the application is still starting up and thus hasn't yet created
111+ * and drawn into a surface.
112+ */
113+ unity::shell::application::MirSurfaceInterface *surfaceAt(int index) const;
114+
115+ /**
116+ * @brief Returns the application at the given index
117+ */
118+ unity::shell::application::ApplicationInfoInterface *applicationAt(int index) const;
119+
120+ /**
121+ * @brief Returns the unique id of the element at the given index
122+ */
123+ int idAt(int index) const;
124+
125+ /**
126+ * @brief Returns the index where the row with the given id is located
127+ *
128+ * Returns -1 if there's no row with the given id.
129+ */
130+ int indexForId(int id) const;
131+
132+ /**
133+ * @brief Raises the row with the given id to index 0
134+ */
135+ void raiseId(int id);
136+
137+ void doRaiseId(int id);
138+
139+Q_SIGNALS:
140+ void countChanged();
141+
142+ /**
143+ * @brief Emitted when the list changes
144+ *
145+ * Emitted when model gains an element, loses an element or when elements exchange positions.
146+ */
147+ void listChanged();
148+
149+ void nextIdChanged();
150+
151+ void applicationsModelChanged();
152+
153+private:
154+ void addApplication(unity::shell::application::ApplicationInfoInterface *application);
155+ void removeApplication(unity::shell::application::ApplicationInfoInterface *application);
156+
157+ int indexOf(unity::shell::application::MirSurfaceInterface *surface);
158+ void raise(unity::shell::application::MirSurfaceInterface *surface);
159+ void move(int from, int to);
160+ void appendSurfaceHelper(unity::shell::application::MirSurfaceInterface *surface,
161+ unity::shell::application::ApplicationInfoInterface *application);
162+ void connectSurface(unity::shell::application::MirSurfaceInterface *surface);
163+ int generateId();
164+ int nextFreeId(int candidateId);
165+ QString toString();
166+ void onSurfaceDestroyed(unity::shell::application::MirSurfaceInterface *surface);
167+ void onSurfaceDied(unity::shell::application::MirSurfaceInterface *surface);
168+ void removeAt(int index);
169+ void findApplicationRole();
170+
171+ unity::shell::application::ApplicationInfoInterface *getApplicationFromModelAt(int index);
172+
173+ /*
174+ Placeholder for a future surface from a starting or running application.
175+ Enables shell to give immediate feedback to the user by showing, eg,
176+ a splash screen.
177+
178+ It's a model row containing a null surface and the given application.
179+ */
180+ void appendPlaceholder(unity::shell::application::ApplicationInfoInterface *application);
181+
182+ /*
183+ Adds a model row with the given surface and application
184+
185+ Alternatively, if a placeholder exists for the given application it's
186+ filled with the given surface instead.
187+ */
188+ void appendSurface(unity::shell::application::MirSurfaceInterface *surface,
189+ unity::shell::application::ApplicationInfoInterface *application);
190+
191+ struct ModelEntry {
192+ ModelEntry(unity::shell::application::MirSurfaceInterface *surface, unity::shell::application::ApplicationInfoInterface *application, int id)
193+ : surface(surface), application(application), id(id) {}
194+ unity::shell::application::MirSurfaceInterface *surface;
195+ unity::shell::application::ApplicationInfoInterface *application;
196+ int id;
197+ bool removeOnceSurfaceDestroyed{false};
198+ };
199+
200+ QList<ModelEntry> m_surfaceList;
201+ int m_nextId{1};
202+ static const int m_maxId{1000000};
203+
204+ // applications that are being monitored
205+ QList<unity::shell::application::ApplicationInfoInterface *> m_applications;
206+
207+ QAbstractListModel* m_applicationsModel{nullptr};
208+ int m_applicationRole{-1};
209+
210+ enum ModelState {
211+ IdleState,
212+ InsertingState,
213+ RemovingState,
214+ MovingState,
215+ ResettingState
216+ };
217+ ModelState m_modelState{IdleState};
218+};
219+
220+Q_DECLARE_METATYPE(TopLevelSurfaceList*)
221+Q_DECLARE_METATYPE(QAbstractListModel*)
222+
223+#endif // TOPLEVELSURFACELIST_H
tests/plugins/ScreenGrabber/grabber.qml → plugins/WindowManager/WindowManagerPlugin.cpprenamed+9−12
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2015 Canonical Ltd.
2+ * Copyright (C) 2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -14,18 +14,15 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−import QtQuick 2.4
18−import ScreenGrabber 0.1
17+#include "WindowManagerPlugin.h"
1918
20−Rectangle {
21− property var grabber: screenGrabber
19+#include "TopLevelSurfaceList.h"
2220
23− width: 101 // width intentionally bigger than height to test rotation
24− height: 100
25− color: "green"
21+#include <QtQml>
2622
27− ScreenGrabber {
28− id: screenGrabber
29− objectName: "screenGrabber"
30− }
23+void WindowManagerPlugin::registerTypes(const char *uri)
24+{
25+ qmlRegisterType<TopLevelSurfaceList>(uri, 0, 1, "TopLevelSurfaceList");
26+
27+ qRegisterMetaType<QAbstractListModel*>("QAbstractListModel*");
3128}
plugins/WindowManager/WindowManagerPlugin.hnew file+32
@@ -0,0 +1,32 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef WINDOWMANAGER_PLUGIN_H
18+#define WINDOWMANAGER_PLUGIN_H
19+
20+#include <QtQml/QQmlEngine>
21+#include <QtQml/QQmlExtensionPlugin>
22+
23+class WindowManagerPlugin : public QQmlExtensionPlugin
24+{
25+ Q_OBJECT
26+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27+
28+public:
29+ void registerTypes(const char *uri) override;
30+};
31+
32+#endif // WINDOWMANAGER_PLUGIN_H
plugins/WindowManager/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module WindowManager
2+plugin windowmanager-qml
plugins/Wizard/Wizard.qmltypesdeleted−33
@@ -1,33 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Wizard 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "PageList"
12− prototype: "QObject"
13− exports: ["Wizard/PageList 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "index"; type: "int"; isReadonly: true }
16− Property { name: "numPages"; type: "int"; isReadonly: true }
17− Method { name: "prev"; type: "string" }
18− Method { name: "next"; type: "string" }
19− }
20− Component {
21− name: "System"
22− prototype: "QObject"
23− exports: ["Wizard/System 0.1"]
24− isCreatable: false
25− isSingleton: true
26− exportMetaObjectRevisions: [0]
27− Property { name: "wizardEnabled"; type: "bool" }
28− Method {
29− name: "updateSessionLanguage"
30− Parameter { name: "locale"; type: "string" }
31− }
32− }
33−}
po/aa.po+287−125
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
1111"PO-Revision-Date: 2016-02-12 10:18+0000\n"
1212"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
1313"Language-Team: Afar <aa@li.org>\n"
@@ -15,39 +15,39 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19+"X-Generator: Launchpad (build 18147)\n"
2020
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
2222msgid "Password: "
2323msgstr "Cuumita "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
2727msgid "Pin shortcut"
2828msgstr ""
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
3131msgid "Quit"
3232msgstr "Kat"
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
3535msgid "Unpin shortcut"
3636msgstr ""
3737
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
3939msgid "Device Locked"
4040msgstr ""
4141
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
4343msgid "You have been locked out due to too many failed passphrase attempts."
4444msgstr ""
4545
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
4747msgid "You have been locked out due to too many failed passcode attempts."
4848msgstr ""
4949
50−#: qml/Components/DelayedLockscreen.qml:74
50+#: qml/Components/DelayedLockscreen.qml:75
5151#, qt-format
5252msgid "Please wait %1 minute and then try again…"
5353msgid_plural "Please wait %1 minutes and then try again…"
@@ -73,8 +73,8 @@ msgctxt "Button: Log out from the system"
7373msgid "Log Out"
7474msgstr "Eweq"
7575
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
77−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
7878#: qml/Wizard/Pages/passcode-set.qml:32
7979msgid "Cancel"
8080msgstr "Bayis"
@@ -92,43 +92,213 @@ msgstr "Wadir-ugussuh digga maay litoo?"
9292msgid "No"
9393msgstr "Maleey"
9494
95−#: qml/Components/Dialogs.qml:183
95+#: qml/Components/Dialogs.qml:182
9696msgid "Yes"
9797msgstr "Yeey"
9898
99−#: qml/Components/Dialogs.qml:198
99+#: qml/Components/Dialogs.qml:197
100100msgctxt "Title: Power off/Restart dialog"
101101msgid "Power"
102102msgstr "Cayla"
103103
104−#: qml/Components/Dialogs.qml:199
104+#: qml/Components/Dialogs.qml:198
105105msgid ""
106106"Are you sure you would like\n"
107107"to power off?"
108108msgstr "Timmi haytuh digga maay litoo?"
109109
110−#: qml/Components/Dialogs.qml:201
110+#: qml/Components/Dialogs.qml:200
111111msgctxt "Button: Power off the system"
112112msgid "Power off"
113113msgstr "Timmi hayis"
114114
115−#: qml/Components/Dialogs.qml:210
115+#: qml/Components/Dialogs.qml:209
116116msgctxt "Button: Restart the system"
117117msgid "Restart"
118118msgstr "Wadir-qimbis"
119119
120−#: qml/Components/Lockscreen.qml:231
120+#: qml/Components/KeyboardShortcutsOverlay.qml:41
121+msgid "Keyboard Shortcuts"
122+msgstr ""
123+
124+#: qml/Components/KeyboardShortcutsOverlay.qml:55
125+msgid "Unity 8"
126+msgstr ""
127+
128+#: qml/Components/KeyboardShortcutsOverlay.qml:62
129+msgid "PrtScr"
130+msgstr ""
131+
132+#: qml/Components/KeyboardShortcutsOverlay.qml:67
133+msgid "Takes a screenshot."
134+msgstr ""
135+
136+#: qml/Components/KeyboardShortcutsOverlay.qml:75
137+msgid "Alt + PrtScr"
138+msgstr ""
139+
140+#: qml/Components/KeyboardShortcutsOverlay.qml:80
141+msgid "Takes a screenshot of a window."
142+msgstr ""
143+
144+#: qml/Components/KeyboardShortcutsOverlay.qml:88
145+msgid "Super + Space"
146+msgstr ""
147+
148+#: qml/Components/KeyboardShortcutsOverlay.qml:93
149+msgid "Switches to next keyboard layout."
150+msgstr ""
151+
152+#: qml/Components/KeyboardShortcutsOverlay.qml:101
153+msgid "Super + Shift + Space"
154+msgstr ""
155+
156+#: qml/Components/KeyboardShortcutsOverlay.qml:106
157+msgid "Switches to previous keyboard layout."
158+msgstr ""
159+
160+#: qml/Components/KeyboardShortcutsOverlay.qml:118
161+msgid "Launcher"
162+msgstr ""
163+
164+#: qml/Components/KeyboardShortcutsOverlay.qml:125
165+msgid "Super (Hold)"
166+msgstr ""
167+
168+#: qml/Components/KeyboardShortcutsOverlay.qml:130
169+msgid "Opens the launcher, displays shortcuts."
170+msgstr ""
171+
172+#: qml/Components/KeyboardShortcutsOverlay.qml:138
173+msgid "Alt + F1"
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:143
177+msgid "Opens launcher keyboard navigation mode."
178+msgstr ""
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:151
181+msgid "Super + Tab"
182+msgstr ""
183+
184+#: qml/Components/KeyboardShortcutsOverlay.qml:156
185+msgid "Switches applications via the launcher."
186+msgstr ""
187+
188+#: qml/Components/KeyboardShortcutsOverlay.qml:164
189+msgid "Super + 0 to 9"
190+msgstr ""
191+
192+#: qml/Components/KeyboardShortcutsOverlay.qml:169
193+msgid "Same as clicking on a launcher icon."
194+msgstr ""
195+
196+#: qml/Components/KeyboardShortcutsOverlay.qml:181
197+msgid "Scopes"
198+msgstr ""
199+
200+#: qml/Components/KeyboardShortcutsOverlay.qml:188
201+msgid "Super (Tap)"
202+msgstr ""
203+
204+#: qml/Components/KeyboardShortcutsOverlay.qml:193
205+msgid "Opens the Scopes home."
206+msgstr ""
207+
208+#: qml/Components/KeyboardShortcutsOverlay.qml:209
209+msgid "Switching"
210+msgstr ""
211+
212+#: qml/Components/KeyboardShortcutsOverlay.qml:216
213+msgid "Alt + Tab"
214+msgstr ""
215+
216+#: qml/Components/KeyboardShortcutsOverlay.qml:221
217+msgid "Switches between applications."
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:229
221+msgid "Super + W"
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:234
225+msgid "Opens the desktop spread."
226+msgstr ""
227+
228+#: qml/Components/KeyboardShortcutsOverlay.qml:242
229+msgid "Cursor Left or Right"
230+msgstr ""
231+
232+#: qml/Components/KeyboardShortcutsOverlay.qml:247
233+msgid "Moves the focus."
234+msgstr ""
235+
236+#: qml/Components/KeyboardShortcutsOverlay.qml:259
237+msgid "Windows"
238+msgstr ""
239+
240+#: qml/Components/KeyboardShortcutsOverlay.qml:266
241+msgid "Ctrl + Super + D"
242+msgstr ""
243+
244+#: qml/Components/KeyboardShortcutsOverlay.qml:271
245+msgid "Minimizes all windows."
246+msgstr ""
247+
248+#: qml/Components/KeyboardShortcutsOverlay.qml:279
249+msgid "Ctrl + Super + Up"
250+msgstr ""
251+
252+#: qml/Components/KeyboardShortcutsOverlay.qml:284
253+msgid "Maximizes the current window."
254+msgstr ""
255+
256+#: qml/Components/KeyboardShortcutsOverlay.qml:292
257+msgid "Ctrl + Super + Down"
258+msgstr ""
259+
260+#: qml/Components/KeyboardShortcutsOverlay.qml:297
261+msgid "Minimizes or restores the current window."
262+msgstr ""
263+
264+#: qml/Components/KeyboardShortcutsOverlay.qml:305
265+msgid "Ctrl + Super + Left or Right"
266+msgstr ""
267+
268+#: qml/Components/KeyboardShortcutsOverlay.qml:310
269+msgid "Semi-maximizes the current window."
270+msgstr ""
271+
272+#: qml/Components/KeyboardShortcutsOverlay.qml:318
273+msgid "Alt + F4"
274+msgstr ""
275+
276+#: qml/Components/KeyboardShortcutsOverlay.qml:323
277+msgid "Closes the current window."
278+msgstr ""
279+
280+#: qml/Components/Lockscreen.qml:239
121281msgid "Return to Call"
122282msgstr "Seecol gacis"
123283
124−#: qml/Components/Lockscreen.qml:231
284+#: qml/Components/Lockscreen.qml:239
125285msgid "Emergency Call"
126286msgstr ""
127287
128−#: qml/Components/Lockscreen.qml:263
288+#: qml/Components/Lockscreen.qml:271
129289msgid "OK"
130290msgstr "Hayya"
131291
292+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
293+#, qt-format
294+msgid "%1:%2:%3"
295+msgstr ""
296+
297+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
298+#, qt-format
299+msgid "%1:%2"
300+msgstr ""
301+
132302#: qml/Components/ModeSwitchWarningDialog.qml:32
133303msgid "Apps may have unsaved data:"
134304msgstr ""
@@ -155,26 +325,30 @@ msgstr ""
155325msgid "Close all"
156326msgstr "Inkih alif"
157327
158−#: qml/Dash/DashPageHeader.qml:337
328+#: qml/Components/SharingPicker.qml:54
329+msgid "Preview Share Item"
330+msgstr ""
331+
332+#: qml/Dash/DashPageHeader.qml:333
159333msgctxt "Button: Open the Ubuntu Store"
160334msgid "Store"
161335msgstr ""
162336
163−#: qml/Dash/DashPageHeader.qml:344
337+#: qml/Dash/DashPageHeader.qml:340
164338msgctxt "Button: Start a search in the current dash scope"
165339msgid "Search"
166340msgstr "Goranto"
167341
168−#: qml/Dash/DashPageHeader.qml:354
342+#: qml/Dash/DashPageHeader.qml:350
169343msgctxt "Button: Show the current dash scope settings"
170344msgid "Settings"
171345msgstr "Massosu"
172346
173−#: qml/Dash/DashPageHeader.qml:361
347+#: qml/Dash/DashPageHeader.qml:357
174348msgid "Remove from Favorites"
175349msgstr ""
176350
177−#: qml/Dash/DashPageHeader.qml:361
351+#: qml/Dash/DashPageHeader.qml:357
178352msgid "Add to Favorites"
179353msgstr ""
180354
@@ -186,24 +360,24 @@ msgstr ""
186360msgid "Reset"
187361msgstr ""
188362
189−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190−msgid "See less"
363+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
364+msgid "Show less"
191365msgstr ""
192366
193−#: qml/Dash/GenericScopeView.qml:570
194−msgid "See all"
367+#: qml/Dash/GenericScopeView.qml:580
368+msgid "Show all"
195369msgstr ""
196370
197−#: qml/Dash/GenericScopeView.qml:627
371+#: qml/Dash/GenericScopeView.qml:637
198372msgctxt "Label: Hint for dash search line edit"
199373msgid "Search"
200374msgstr "Goranto"
201375
202−#: qml/Dash/PageHeaderExtraPanel.qml:55
376+#: qml/Dash/PageHeaderExtraPanel.qml:56
203377msgid "Recent Searches"
204378msgstr ""
205379
206−#: qml/Dash/PageHeaderExtraPanel.qml:66
380+#: qml/Dash/PageHeaderExtraPanel.qml:67
207381msgid "Clear All"
208382msgstr ""
209383
@@ -216,22 +390,18 @@ msgid "Less..."
216390msgstr ""
217391
218392#: qml/Dash/Previews/PreviewCommentInput.qml:68
219−#: qml/Dash/Previews/PreviewRatingInput.qml:174
393+#: qml/Dash/Previews/PreviewRatingInput.qml:175
220394msgid "Send"
221395msgstr "Rub"
222396
223−#: qml/Dash/Previews/PreviewRatingInput.qml:84
397+#: qml/Dash/Previews/PreviewRatingInput.qml:82
224398msgid "Rate this"
225399msgstr ""
226400
227−#: qml/Dash/Previews/PreviewRatingInput.qml:129
401+#: qml/Dash/Previews/PreviewRatingInput.qml:157
228402msgid "Add a review"
229403msgstr ""
230404
231−#: qml/Dash/Previews/PreviewSharing.qml:66
232−msgid "Preview Share Item"
233−msgstr ""
234−
235405#: qml/Dash/PullToRefreshScopeStyle.qml:55
236406msgid "Pull to refresh…"
237407msgstr ""
@@ -244,92 +414,104 @@ msgstr ""
244414msgid "Enable location data"
245415msgstr ""
246416
247−#: qml/Dash/ScopesList.qml:67
417+#: qml/Dash/ScopesList.qml:55
248418msgid "Manage"
249419msgstr ""
250420
251−#: qml/Dash/ScopesList.qml:113
421+#: qml/Dash/ScopesList.qml:102
252422msgid "Home"
253423msgstr "Dabqi"
254424
255−#: qml/Dash/ScopesList.qml:114
425+#: qml/Dash/ScopesList.qml:103
256426msgid "Also installed"
257427msgstr ""
258428
259−#: qml/DisabledScreenNotice.qml:104
429+#: qml/DisabledScreenNotice.qml:109
260430msgid ""
261431"Your device is now connected to an external display. Use this screen as a "
262432"touch pad to interact with the pointer."
263433msgstr ""
264434
265−#: qml/Greeter/CoverPage.qml:118
435+#: qml/Greeter/CoverPage.qml:127
266436msgid "Unlock"
267437msgstr ""
268438
269−#: qml/Greeter/LoginList.qml:239
439+#: qml/Greeter/Greeter.qml:555
440+msgid "Try again"
441+msgstr ""
442+
443+#: qml/Greeter/LoginList.qml:63
444+msgid "Passphrase"
445+msgstr ""
446+
447+#: qml/Greeter/LoginList.qml:64
448+msgid "Passcode"
449+msgstr ""
450+
451+#: qml/Greeter/LoginList.qml:87
270452msgid "Retry"
271453msgstr "Qagis"
272454
273−#: qml/Greeter/LoginList.qml:240
274−msgid "Tap to unlock"
455+#: qml/Greeter/LoginList.qml:88
456+msgid "Log In"
275457msgstr ""
276458
277−#: qml/Greeter/NarrowView.qml:54
459+#: qml/Greeter/NarrowView.qml:55
278460msgid "Sorry, incorrect passphrase."
279461msgstr ""
280462
281−#: qml/Greeter/NarrowView.qml:55
463+#: qml/Greeter/NarrowView.qml:56
282464msgid "Sorry, incorrect passcode."
283465msgstr ""
284466
285−#: qml/Greeter/NarrowView.qml:56
467+#: qml/Greeter/NarrowView.qml:57
286468msgid "This will be your last attempt."
287469msgstr ""
288470
289−#: qml/Greeter/NarrowView.qml:58
471+#: qml/Greeter/NarrowView.qml:59
290472msgid ""
291473"If passphrase is entered incorrectly, your phone will conduct a factory "
292474"reset and all personal data will be deleted."
293475msgstr ""
294476
295−#: qml/Greeter/NarrowView.qml:59
477+#: qml/Greeter/NarrowView.qml:60
296478msgid ""
297479"If passcode is entered incorrectly, your phone will conduct a factory reset "
298480"and all personal data will be deleted."
299481msgstr ""
300482
301−#: qml/Greeter/NarrowView.qml:116
483+#: qml/Greeter/NarrowView.qml:129
302484#, qt-format
303485msgid "Enter %1"
304486msgstr "%1 culus"
305487
306−#: qml/Greeter/NarrowView.qml:117
488+#: qml/Greeter/NarrowView.qml:130
307489msgid "Enter passphrase"
308490msgstr "Tatur-maxco culus"
309491
310−#: qml/Greeter/NarrowView.qml:118
492+#: qml/Greeter/NarrowView.qml:131
311493msgid "Enter passcode"
312494msgstr "Tatur-mudenta culus"
313495
314−#: qml/Greeter/NarrowView.qml:119
496+#: qml/Greeter/NarrowView.qml:135
315497#, qt-format
316498msgid "Sorry, incorrect %1"
317499msgstr ""
318500
319−#: qml/Greeter/NarrowView.qml:120
501+#: qml/Greeter/NarrowView.qml:136
320502msgid "Sorry, incorrect passphrase"
321503msgstr ""
322504
323−#: qml/Greeter/NarrowView.qml:121
505+#: qml/Greeter/NarrowView.qml:137
324506msgctxt "passphrase"
325507msgid "Please re-enter"
326508msgstr ""
327509
328−#: qml/Greeter/NarrowView.qml:122
510+#: qml/Greeter/NarrowView.qml:138
329511msgid "Sorry, incorrect passcode"
330512msgstr ""
331513
332−#: qml/Notifications/NotificationMenuItemFactory.qml:129
514+#: qml/Notifications/NotificationMenuItemFactory.qml:124
333515msgid "Show password"
334516msgstr "Cuumita uybulluy"
335517
@@ -341,77 +523,77 @@ msgstr ""
341523msgid "Conference"
342524msgstr "Koboxu"
343525
344−#: qml/Panel/Indicators/MenuItemFactory.qml:761
526+#: qml/Panel/Indicators/MenuItemFactory.qml:762
345527msgid "Nothing is playing"
346528msgstr ""
347529
348−#: qml/Panel/Indicators/MenuItemFactory.qml:890
530+#: qml/Panel/Indicators/MenuItemFactory.qml:891
349531#, qt-format
350532msgid "%1 hour"
351533msgid_plural "%1 hours"
352534msgstr[0] "%1 saaqata"
353535msgstr[1] "%1 saaqata"
354536
355−#: qml/Panel/Indicators/MenuItemFactory.qml:894
537+#: qml/Panel/Indicators/MenuItemFactory.qml:895
356538#, qt-format
357539msgid "%1 minute"
358540msgid_plural "%1 minutes"
359541msgstr[0] "%1 miniti"
360542msgstr[1] "%1 miniti"
361543
362−#: qml/Panel/Indicators/MenuItemFactory.qml:899
544+#: qml/Panel/Indicators/MenuItemFactory.qml:900
363545#, qt-format
364546msgid "%1 second"
365547msgid_plural "%1 seconds"
366548msgstr[0] "%1 nammayye"
367549msgstr[1] "%1 nammayye"
368550
369−#: qml/Panel/Indicators/MenuItemFactory.qml:902
551+#: qml/Panel/Indicators/MenuItemFactory.qml:903
370552msgid "0 seconds"
371553msgstr "0 nammayye"
372554
373555#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
374−#: qml/Panel/Indicators/MenuItemFactory.qml:904
556+#: qml/Panel/Indicators/MenuItemFactory.qml:905
375557#, qt-format
376558msgid "%1 remaining"
377559msgstr "%1 raaqe"
378560
379−#: qml/Panel/Indicators/MenuItemFactory.qml:910
561+#: qml/Panel/Indicators/MenuItemFactory.qml:911
380562msgid "In queue…"
381563msgstr ""
382564
383−#: qml/Panel/Indicators/MenuItemFactory.qml:914
565+#: qml/Panel/Indicators/MenuItemFactory.qml:915
384566msgid "Downloading"
385567msgstr "Qulluumah"
386568
387−#: qml/Panel/Indicators/MenuItemFactory.qml:916
569+#: qml/Panel/Indicators/MenuItemFactory.qml:917
388570msgid "Paused, tap to resume"
389571msgstr ""
390572
391−#: qml/Panel/Indicators/MenuItemFactory.qml:918
573+#: qml/Panel/Indicators/MenuItemFactory.qml:919
392574msgid "Canceled"
393575msgstr "Bayteh"
394576
395−#: qml/Panel/Indicators/MenuItemFactory.qml:920
577+#: qml/Panel/Indicators/MenuItemFactory.qml:921
396578msgid "Finished"
397579msgstr "Duudumteh"
398580
399−#: qml/Panel/Indicators/MenuItemFactory.qml:922
581+#: qml/Panel/Indicators/MenuItemFactory.qml:923
400582msgid "Failed, tap to retry"
401583msgstr ""
402584
403−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
404−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
585+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
586+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
405587msgctxt "Button: Send a reply message"
406588msgid "Send"
407589msgstr "Rub"
408590
409−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
591+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
410592msgctxt "Label: Hint in message indicator line edit"
411593msgid "Reply"
412594msgstr ""
413595
414−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
596+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
415597msgctxt "Button: Call back on phone"
416598msgid "Call back"
417599msgstr ""
@@ -420,48 +602,24 @@ msgstr ""
420602msgid "Drag using 3 fingers any application from one window to the other"
421603msgstr ""
422604
423−#: qml/Tutorial/TutorialBottom.qml:78
424−msgid "Swipe up to add a contact"
425−msgstr ""
426−
427−#: qml/Tutorial/TutorialBottom.qml:80
428−msgid "Swipe up for favorite calculations"
429−msgstr ""
430−
431−#: qml/Tutorial/TutorialBottom.qml:82
432−msgid "Swipe up for recent calls"
433−msgstr ""
434−
435−#: qml/Tutorial/TutorialBottom.qml:84
436−msgid "Swipe up to create a message"
437−msgstr ""
438−
439−#: qml/Tutorial/TutorialBottom.qml:85
440−msgid "Swipe up to manage the app"
441−msgstr ""
442−
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447−#: qml/Tutorial/TutorialLeftLong.qml:47
605+#: qml/Tutorial/TutorialLeftLong.qml:49
448606msgid "Long swipe from the left edge to open the Today scope"
449607msgstr ""
450608
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
609+#: qml/Tutorial/TutorialLeft.qml:47
610+msgid "Short swipe from the left edge to open the launcher"
453611msgstr ""
454612
455613#: qml/Tutorial/TutorialRight.qml:55
456−msgid "Short or long swipe from the right edge to view your open apps"
614+msgid "Push your mouse against the right edge to view your open apps"
457615msgstr ""
458616
459−#: qml/Tutorial/TutorialTop.qml:53
460−msgid "Swipe from the top right edge to open the notification bar"
617+#: qml/Tutorial/TutorialRight.qml:56
618+msgid "Swipe from the right edge to view your open apps"
461619msgstr ""
462620
463−#: qml/Tutorial/TutorialTop.qml:54
464−msgid "Swipe from the top edge to open the notification bar"
621+#: qml/Tutorial/TutorialTop.qml:53
622+msgid "Swipe from the top edge to access notifications and quick settings"
465623msgstr ""
466624
467625#: qml/Wizard/Page.qml:54
@@ -473,11 +631,11 @@ msgstr "Derre"
473631msgid "Language"
474632msgstr ""
475633
476−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
477−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
634+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
635+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
478636#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
479637#: qml/Wizard/Pages/75-report-check.qml:84
480−#: qml/Wizard/Pages/passcode-desktop.qml:124
638+#: qml/Wizard/Pages/passcode-desktop.qml:141
481639#: qml/Wizard/Pages/password-set.qml:141
482640msgid "Next"
483641msgstr ""
@@ -539,7 +697,7 @@ msgstr ""
539697msgid "Time Zone"
540698msgstr ""
541699
542−#: qml/Wizard/Pages/50-timezone.qml:178
700+#: qml/Wizard/Pages/50-timezone.qml:181
543701msgid "Enter your city"
544702msgstr ""
545703
@@ -629,7 +787,7 @@ msgid "Service Terms"
629787msgstr ""
630788
631789#: qml/Wizard/Pages/passcode-confirm.qml:43
632−#: qml/Wizard/Pages/passcode-desktop.qml:80
790+#: qml/Wizard/Pages/passcode-desktop.qml:96
633791msgid "Confirm passcode"
634792msgstr ""
635793
@@ -646,24 +804,24 @@ msgstr ""
646804msgid "Lock Screen Passcode"
647805msgstr ""
648806
649−#: qml/Wizard/Pages/passcode-desktop.qml:56
807+#: qml/Wizard/Pages/passcode-desktop.qml:60
650808msgid "Enter 4 numbers to setup your passcode"
651809msgstr ""
652810
653−#: qml/Wizard/Pages/passcode-desktop.qml:65
811+#: qml/Wizard/Pages/passcode-desktop.qml:76
654812#: qml/Wizard/Pages/passcode-set.qml:54
655813msgid "Choose passcode"
656814msgstr ""
657815
658−#: qml/Wizard/Pages/passcode-desktop.qml:105
816+#: qml/Wizard/Pages/passcode-desktop.qml:126
659817msgid "Passcode too short"
660818msgstr ""
661819
662−#: qml/Wizard/Pages/passcode-desktop.qml:107
820+#: qml/Wizard/Pages/passcode-desktop.qml:128
663821msgid "Passcodes match"
664822msgstr ""
665823
666−#: qml/Wizard/Pages/passcode-desktop.qml:109
824+#: qml/Wizard/Pages/passcode-desktop.qml:130
667825msgid "Passcodes do not match"
668826msgstr ""
669827
@@ -712,26 +870,30 @@ msgid "To proceed with no SIM tap Skip."
712870msgstr ""
713871
714872#: qml/Wizard/PasswordMeter.qml:87
715−msgid "Passwords match"
873+msgid "Password too short"
716874msgstr ""
717875
718876#: qml/Wizard/PasswordMeter.qml:89
877+msgid "Passwords match"
878+msgstr ""
879+
880+#: qml/Wizard/PasswordMeter.qml:91
719881msgid "Passwords do not match"
720882msgstr ""
721883
722−#: qml/Wizard/PasswordMeter.qml:93
884+#: qml/Wizard/PasswordMeter.qml:95
723885msgid "Strong password"
724886msgstr ""
725887
726−#: qml/Wizard/PasswordMeter.qml:95
888+#: qml/Wizard/PasswordMeter.qml:97
727889msgid "Fair password"
728890msgstr ""
729891
730−#: qml/Wizard/PasswordMeter.qml:97
892+#: qml/Wizard/PasswordMeter.qml:99
731893msgid "Weak password"
732894msgstr ""
733895
734−#: qml/Wizard/PasswordMeter.qml:99
896+#: qml/Wizard/PasswordMeter.qml:101
735897msgid "Very weak password"
736898msgstr ""
737899
po/am.po+331−139
@@ -7,47 +7,47 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11−"PO-Revision-Date: 2016-03-24 19:07+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11+"PO-Revision-Date: 2016-07-05 02:15+0000\n"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-25 05:54+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19+"X-Generator: Launchpad (build 18147)\n"
2020
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
2222msgid "Password: "
2323msgstr "የ መግቢያ ቃል: "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
2727msgid "Pin shortcut"
2828msgstr "አቋራጭ ማጣበቂያ"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
3131msgid "Quit"
3232msgstr "ማጥፊያ"
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
3535msgid "Unpin shortcut"
3636msgstr "አቋራጭ መለያያ"
3737
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
3939msgid "Device Locked"
4040msgstr "አካሉ ተቆልፏል"
4141
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
4343msgid "You have been locked out due to too many failed passphrase attempts."
4444msgstr "ብዙ ጊዜ የተሳሳተ የ ማለፊያ ሀረግ ለማስገባት በ መሞከር ምክንያት ስልኩ ተቆልፏል"
4545
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
4747msgid "You have been locked out due to too many failed passcode attempts."
4848msgstr "ብዙ ጊዜ የተሳሳተ የ ማለፊያ ኮድ ለማስገባት በ መሞከር ምክንያት ስልኩ ተቆልፏል"
4949
50−#: qml/Components/DelayedLockscreen.qml:74
50+#: qml/Components/DelayedLockscreen.qml:75
5151#, qt-format
5252msgid "Please wait %1 minute and then try again…"
5353msgid_plural "Please wait %1 minutes and then try again…"
@@ -73,8 +73,8 @@ msgctxt "Button: Log out from the system"
7373msgid "Log Out"
7474msgstr "መውጫ"
7575
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
77−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
7878#: qml/Wizard/Pages/passcode-set.qml:32
7979msgid "Cancel"
8080msgstr "መሰረዣ"
@@ -92,16 +92,16 @@ msgstr "በእርግጥ እንደገና ማስነሳት ይፈልጋሉ?"
9292msgid "No"
9393msgstr "አይ"
9494
95−#: qml/Components/Dialogs.qml:183
95+#: qml/Components/Dialogs.qml:182
9696msgid "Yes"
9797msgstr "አዎ"
9898
99−#: qml/Components/Dialogs.qml:198
99+#: qml/Components/Dialogs.qml:197
100100msgctxt "Title: Power off/Restart dialog"
101101msgid "Power"
102102msgstr "ሐይል"
103103
104−#: qml/Components/Dialogs.qml:199
104+#: qml/Components/Dialogs.qml:198
105105msgid ""
106106"Are you sure you would like\n"
107107"to power off?"
@@ -109,28 +109,198 @@ msgstr ""
109109"በእርግጥ ሐይሉን ማጥፋት\n"
110110"ይፈልጋሉ?"
111111
112−#: qml/Components/Dialogs.qml:201
112+#: qml/Components/Dialogs.qml:200
113113msgctxt "Button: Power off the system"
114114msgid "Power off"
115115msgstr "ሐይል ማጥፊያ"
116116
117−#: qml/Components/Dialogs.qml:210
117+#: qml/Components/Dialogs.qml:209
118118msgctxt "Button: Restart the system"
119119msgid "Restart"
120120msgstr "እንደገና ማስጀመሪያ"
121121
122−#: qml/Components/Lockscreen.qml:231
122+#: qml/Components/KeyboardShortcutsOverlay.qml:41
123+msgid "Keyboard Shortcuts"
124+msgstr "የ ፊደል ገበታ አቋራጮች"
125+
126+#: qml/Components/KeyboardShortcutsOverlay.qml:55
127+msgid "Unity 8"
128+msgstr "Unity 8"
129+
130+#: qml/Components/KeyboardShortcutsOverlay.qml:62
131+msgid "PrtScr"
132+msgstr "PrtScr"
133+
134+#: qml/Components/KeyboardShortcutsOverlay.qml:67
135+msgid "Takes a screenshot."
136+msgstr "መመልከቻ ፎቶ ማንሻ"
137+
138+#: qml/Components/KeyboardShortcutsOverlay.qml:75
139+msgid "Alt + PrtScr"
140+msgstr "Alt + PrtScr"
141+
142+#: qml/Components/KeyboardShortcutsOverlay.qml:80
143+msgid "Takes a screenshot of a window."
144+msgstr "የ መስኮት መመልከቻ ፎቶ ማንሻ"
145+
146+#: qml/Components/KeyboardShortcutsOverlay.qml:88
147+msgid "Super + Space"
148+msgstr "Super + Space"
149+
150+#: qml/Components/KeyboardShortcutsOverlay.qml:93
151+msgid "Switches to next keyboard layout."
152+msgstr "የሚቀጥለው የ ፊደል ገበታ እቅድ መቀየሪያ"
153+
154+#: qml/Components/KeyboardShortcutsOverlay.qml:101
155+msgid "Super + Shift + Space"
156+msgstr "Super + Shift + Space"
157+
158+#: qml/Components/KeyboardShortcutsOverlay.qml:106
159+msgid "Switches to previous keyboard layout."
160+msgstr "ወዳለፈው የ ፊደል ገበታ እቅድ መቀየሪያ"
161+
162+#: qml/Components/KeyboardShortcutsOverlay.qml:118
163+msgid "Launcher"
164+msgstr "ማስነሻ"
165+
166+#: qml/Components/KeyboardShortcutsOverlay.qml:125
167+msgid "Super (Hold)"
168+msgstr "Super (ይጫኑ)"
169+
170+#: qml/Components/KeyboardShortcutsOverlay.qml:130
171+msgid "Opens the launcher, displays shortcuts."
172+msgstr "ማስነሻውን መክፈቻ እና አቋራጮች ማሳያ"
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:138
175+msgid "Alt + F1"
176+msgstr "Alt + F1"
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:143
179+msgid "Opens launcher keyboard navigation mode."
180+msgstr "መክፈቻ በ ፊደል ገበታ መቃኛ ዘዴ ማስነሻ"
181+
182+#: qml/Components/KeyboardShortcutsOverlay.qml:151
183+msgid "Super + Tab"
184+msgstr "Super + Tab"
185+
186+#: qml/Components/KeyboardShortcutsOverlay.qml:156
187+msgid "Switches applications via the launcher."
188+msgstr "መተግበሪያዎችን በ ማስጀመሪያ መቀየሪያ"
189+
190+#: qml/Components/KeyboardShortcutsOverlay.qml:164
191+msgid "Super + 0 to 9"
192+msgstr "Super + 0 እስከ 9"
193+
194+#: qml/Components/KeyboardShortcutsOverlay.qml:169
195+msgid "Same as clicking on a launcher icon."
196+msgstr "ተመሳሳይ በ ማስጀመሪያ ምልክት ላይ እንደ መጫን"
197+
198+#: qml/Components/KeyboardShortcutsOverlay.qml:181
199+msgid "Scopes"
200+msgstr "ክልል"
201+
202+#: qml/Components/KeyboardShortcutsOverlay.qml:188
203+msgid "Super (Tap)"
204+msgstr "Super (Tap)"
205+
206+#: qml/Components/KeyboardShortcutsOverlay.qml:193
207+msgid "Opens the Scopes home."
208+msgstr "የ ክልል ቤት መክፈቻ"
209+
210+#: qml/Components/KeyboardShortcutsOverlay.qml:209
211+msgid "Switching"
212+msgstr "በ መቀየር ላይ"
213+
214+#: qml/Components/KeyboardShortcutsOverlay.qml:216
215+msgid "Alt + Tab"
216+msgstr "Alt + Tab"
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:221
219+msgid "Switches between applications."
220+msgstr "በ መተግበሪያዎች መካከል መቀያየሪያ"
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:229
223+msgid "Super + W"
224+msgstr "Super + W"
225+
226+#: qml/Components/KeyboardShortcutsOverlay.qml:234
227+msgid "Opens the desktop spread."
228+msgstr "የ ዴስክቶፕ ማስፊያ መክፈቻ"
229+
230+#: qml/Components/KeyboardShortcutsOverlay.qml:242
231+msgid "Cursor Left or Right"
232+msgstr "መጠቆሚያ የ ግራ ወይንም የ ቀኝ"
233+
234+#: qml/Components/KeyboardShortcutsOverlay.qml:247
235+msgid "Moves the focus."
236+msgstr "ትኩረት ማንቀሳቀሻ"
237+
238+#: qml/Components/KeyboardShortcutsOverlay.qml:259
239+msgid "Windows"
240+msgstr "መስኮቶች"
241+
242+#: qml/Components/KeyboardShortcutsOverlay.qml:266
243+msgid "Ctrl + Super + D"
244+msgstr "Ctrl + Super + D"
245+
246+#: qml/Components/KeyboardShortcutsOverlay.qml:271
247+msgid "Minimizes all windows."
248+msgstr "ሁሉንም መስኮቶች ማሳነሻ"
249+
250+#: qml/Components/KeyboardShortcutsOverlay.qml:279
251+msgid "Ctrl + Super + Up"
252+msgstr "Ctrl + Super + Up"
253+
254+#: qml/Components/KeyboardShortcutsOverlay.qml:284
255+msgid "Maximizes the current window."
256+msgstr "የ አሁኑን መስኮት ማሳደጊያ"
257+
258+#: qml/Components/KeyboardShortcutsOverlay.qml:292
259+msgid "Ctrl + Super + Down"
260+msgstr "Ctrl + Super + Down"
261+
262+#: qml/Components/KeyboardShortcutsOverlay.qml:297
263+msgid "Minimizes or restores the current window."
264+msgstr "የ አሁኑን መስኮትማሳነሻ ወይንም እንደ ነበር መመለሻ"
265+
266+#: qml/Components/KeyboardShortcutsOverlay.qml:305
267+msgid "Ctrl + Super + Left or Right"
268+msgstr "Ctrl + Super + Left or Right"
269+
270+#: qml/Components/KeyboardShortcutsOverlay.qml:310
271+msgid "Semi-maximizes the current window."
272+msgstr "የ አሁኑን መስኮት በ ንዑስ-ማሳደጊያ"
273+
274+#: qml/Components/KeyboardShortcutsOverlay.qml:318
275+msgid "Alt + F4"
276+msgstr "Alt + F4"
277+
278+#: qml/Components/KeyboardShortcutsOverlay.qml:323
279+msgid "Closes the current window."
280+msgstr "የ አሁኑን መስኮት መዝጊያ"
281+
282+#: qml/Components/Lockscreen.qml:239
123283msgid "Return to Call"
124284msgstr "ወደ ጥሪ መመለሻ"
125285
126−#: qml/Components/Lockscreen.qml:231
286+#: qml/Components/Lockscreen.qml:239
127287msgid "Emergency Call"
128288msgstr "የ ድንገተኛ ጥሪ"
129289
130−#: qml/Components/Lockscreen.qml:263
290+#: qml/Components/Lockscreen.qml:271
131291msgid "OK"
132292msgstr "እሺ"
133293
294+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
295+#, qt-format
296+msgid "%1:%2:%3"
297+msgstr "%1:%2:%3"
298+
299+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
300+#, qt-format
301+msgid "%1:%2"
302+msgstr "%1:%2"
303+
134304#: qml/Components/ModeSwitchWarningDialog.qml:32
135305msgid "Apps may have unsaved data:"
136306msgstr "መተግበሪያው ያልተቀመጠ ዳታ ይዟል:"
@@ -157,26 +327,30 @@ msgstr "አሁን እንደገና መገናኛ!"
157327msgid "Close all"
158328msgstr "ሁሉንም መዝጊያ"
159329
160−#: qml/Dash/DashPageHeader.qml:337
330+#: qml/Components/SharingPicker.qml:54
331+msgid "Preview Share Item"
332+msgstr "የሚካፈሉትን እቃ ቅድመ እይታ"
333+
334+#: qml/Dash/DashPageHeader.qml:333
161335msgctxt "Button: Open the Ubuntu Store"
162336msgid "Store"
163337msgstr "ማስቀመጫ"
164338
165−#: qml/Dash/DashPageHeader.qml:344
339+#: qml/Dash/DashPageHeader.qml:340
166340msgctxt "Button: Start a search in the current dash scope"
167341msgid "Search"
168342msgstr "መፈለጊያ"
169343
170−#: qml/Dash/DashPageHeader.qml:354
344+#: qml/Dash/DashPageHeader.qml:350
171345msgctxt "Button: Show the current dash scope settings"
172346msgid "Settings"
173347msgstr "ማሰናጃዎች"
174348
175−#: qml/Dash/DashPageHeader.qml:361
349+#: qml/Dash/DashPageHeader.qml:357
176350msgid "Remove from Favorites"
177351msgstr "ከምወዳቸው ማስወገጃ"
178352
179−#: qml/Dash/DashPageHeader.qml:361
353+#: qml/Dash/DashPageHeader.qml:357
180354msgid "Add to Favorites"
181355msgstr "ወደምወዳቸው መጨመሪያ"
182356
@@ -188,24 +362,24 @@ msgstr "የ እርስዎን ውጤቶች እንደገና ማጣሪያ"
188362msgid "Reset"
189363msgstr "እንደ ነበረ መመለሻ"
190364
191−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192−msgid "See less"
193−msgstr "አነስተኛ መመልከቻ"
365+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
366+msgid "Show less"
367+msgstr "ትንሽ ማሳያ"
194368
195−#: qml/Dash/GenericScopeView.qml:570
196−msgid "See all"
197−msgstr "ሁሉንም መመልከቻ"
369+#: qml/Dash/GenericScopeView.qml:580
370+msgid "Show all"
371+msgstr "ሁሉንም ማሳያ"
198372
199−#: qml/Dash/GenericScopeView.qml:627
373+#: qml/Dash/GenericScopeView.qml:637
200374msgctxt "Label: Hint for dash search line edit"
201375msgid "Search"
202376msgstr "መፈለጊያ"
203377
204−#: qml/Dash/PageHeaderExtraPanel.qml:55
378+#: qml/Dash/PageHeaderExtraPanel.qml:56
205379msgid "Recent Searches"
206380msgstr "የ ቅርብ ጊዜ ፍለጋዎች"
207381
208−#: qml/Dash/PageHeaderExtraPanel.qml:66
382+#: qml/Dash/PageHeaderExtraPanel.qml:67
209383msgid "Clear All"
210384msgstr "ሁሉንም ማጽጃ"
211385
@@ -218,22 +392,18 @@ msgid "Less..."
218392msgstr "አነስተኛ..."
219393
220394#: qml/Dash/Previews/PreviewCommentInput.qml:68
221−#: qml/Dash/Previews/PreviewRatingInput.qml:174
395+#: qml/Dash/Previews/PreviewRatingInput.qml:175
222396msgid "Send"
223397msgstr "መላኪያ"
224398
225−#: qml/Dash/Previews/PreviewRatingInput.qml:84
399+#: qml/Dash/Previews/PreviewRatingInput.qml:82
226400msgid "Rate this"
227401msgstr "ለዚህ ደረጃ ይስጡ"
228402
229−#: qml/Dash/Previews/PreviewRatingInput.qml:129
403+#: qml/Dash/Previews/PreviewRatingInput.qml:157
230404msgid "Add a review"
231405msgstr "ግምገማ መጨመሪያ"
232406
233−#: qml/Dash/Previews/PreviewSharing.qml:66
234−msgid "Preview Share Item"
235−msgstr "የሚካፈሉትን እቃ ቅድመ እይታ"
236−
237407#: qml/Dash/PullToRefreshScopeStyle.qml:55
238408msgid "Pull to refresh…"
239409msgstr "ይሳቡ ለማነቃቃት…"
@@ -246,49 +416,61 @@ msgstr "ይልቀቁ ለማነቃቃት…"
246416msgid "Enable location data"
247417msgstr "የአካባቢ ዳታ ማስቻያ"
248418
249−#: qml/Dash/ScopesList.qml:67
419+#: qml/Dash/ScopesList.qml:55
250420msgid "Manage"
251421msgstr "አስተዳዳሪ"
252422
253−#: qml/Dash/ScopesList.qml:113
423+#: qml/Dash/ScopesList.qml:102
254424msgid "Home"
255425msgstr "ቤት"
256426
257−#: qml/Dash/ScopesList.qml:114
427+#: qml/Dash/ScopesList.qml:103
258428msgid "Also installed"
259429msgstr "እንዲሁም የተገጠሙ"
260430
261−#: qml/DisabledScreenNotice.qml:104
431+#: qml/DisabledScreenNotice.qml:109
262432msgid ""
263433"Your device is now connected to an external display. Use this screen as a "
264434"touch pad to interact with the pointer."
265435msgstr "የ እርስዎ አካል አሁን ከ ውጪ ማሳያ ጋር ተገናኝቷል: ይህን መመልከቻ እንደ ተችፓድ መጠቀሚያ"
266436
267−#: qml/Greeter/CoverPage.qml:118
437+#: qml/Greeter/CoverPage.qml:127
268438msgid "Unlock"
269439msgstr "መክፈቻ"
270440
271−#: qml/Greeter/LoginList.qml:239
441+#: qml/Greeter/Greeter.qml:555
442+msgid "Try again"
443+msgstr "እንደገና ይሞክሩ"
444+
445+#: qml/Greeter/LoginList.qml:63
446+msgid "Passphrase"
447+msgstr ""
448+
449+#: qml/Greeter/LoginList.qml:64
450+msgid "Passcode"
451+msgstr ""
452+
453+#: qml/Greeter/LoginList.qml:87
272454msgid "Retry"
273455msgstr "እንደገና ይሞክሩ"
274456
275−#: qml/Greeter/LoginList.qml:240
276−msgid "Tap to unlock"
277−msgstr "ለመክፈት መታ ያድርጉ"
457+#: qml/Greeter/LoginList.qml:88
458+msgid "Log In"
459+msgstr "መግቢያ"
278460
279−#: qml/Greeter/NarrowView.qml:54
461+#: qml/Greeter/NarrowView.qml:55
280462msgid "Sorry, incorrect passphrase."
281463msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
282464
283−#: qml/Greeter/NarrowView.qml:55
465+#: qml/Greeter/NarrowView.qml:56
284466msgid "Sorry, incorrect passcode."
285467msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
286468
287−#: qml/Greeter/NarrowView.qml:56
469+#: qml/Greeter/NarrowView.qml:57
288470msgid "This will be your last attempt."
289471msgstr "ይህ የመጨረሻ ሙከራዎ ነው"
290472
291−#: qml/Greeter/NarrowView.qml:58
473+#: qml/Greeter/NarrowView.qml:59
292474msgid ""
293475"If passphrase is entered incorrectly, your phone will conduct a factory "
294476"reset and all personal data will be deleted."
@@ -296,7 +478,7 @@ msgstr ""
296478"የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
297479"ይጠፋል"
298480
299−#: qml/Greeter/NarrowView.qml:59
481+#: qml/Greeter/NarrowView.qml:60
300482msgid ""
301483"If passcode is entered incorrectly, your phone will conduct a factory reset "
302484"and all personal data will be deleted."
@@ -304,38 +486,38 @@ msgstr ""
304486"የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
305487"ይጠፋል"
306488
307−#: qml/Greeter/NarrowView.qml:116
489+#: qml/Greeter/NarrowView.qml:129
308490#, qt-format
309491msgid "Enter %1"
310492msgstr "ማስገቢያ %1"
311493
312−#: qml/Greeter/NarrowView.qml:117
494+#: qml/Greeter/NarrowView.qml:130
313495msgid "Enter passphrase"
314496msgstr "የ ማለፊያ ሀረግ ያስገቡ"
315497
316−#: qml/Greeter/NarrowView.qml:118
498+#: qml/Greeter/NarrowView.qml:131
317499msgid "Enter passcode"
318500msgstr "የ ማለፊያ ኮድ ያስገቡ"
319501
320−#: qml/Greeter/NarrowView.qml:119
502+#: qml/Greeter/NarrowView.qml:135
321503#, qt-format
322504msgid "Sorry, incorrect %1"
323505msgstr "አዝናለሁ: የተሳሳተ%1"
324506
325−#: qml/Greeter/NarrowView.qml:120
507+#: qml/Greeter/NarrowView.qml:136
326508msgid "Sorry, incorrect passphrase"
327509msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
328510
329−#: qml/Greeter/NarrowView.qml:121
511+#: qml/Greeter/NarrowView.qml:137
330512msgctxt "passphrase"
331513msgid "Please re-enter"
332514msgstr "እባክዎን እንደገና-ያስገቡ"
333515
334−#: qml/Greeter/NarrowView.qml:122
516+#: qml/Greeter/NarrowView.qml:138
335517msgid "Sorry, incorrect passcode"
336518msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
337519
338−#: qml/Notifications/NotificationMenuItemFactory.qml:129
520+#: qml/Notifications/NotificationMenuItemFactory.qml:124
339521msgid "Show password"
340522msgstr "የመግቢያ ቃል ማሳያ"
341523
@@ -347,77 +529,77 @@ msgstr "ወደ ጥሪው ለመመለስ መታ ያድርጉ..."
347529msgid "Conference"
348530msgstr "ስብሰባ"
349531
350−#: qml/Panel/Indicators/MenuItemFactory.qml:761
532+#: qml/Panel/Indicators/MenuItemFactory.qml:762
351533msgid "Nothing is playing"
352534msgstr "ምንም አይጫወትም"
353535
354−#: qml/Panel/Indicators/MenuItemFactory.qml:890
536+#: qml/Panel/Indicators/MenuItemFactory.qml:891
355537#, qt-format
356538msgid "%1 hour"
357539msgid_plural "%1 hours"
358540msgstr[0] "%1 ሰአት"
359541msgstr[1] "%1 ሰአቶች"
360542
361−#: qml/Panel/Indicators/MenuItemFactory.qml:894
543+#: qml/Panel/Indicators/MenuItemFactory.qml:895
362544#, qt-format
363545msgid "%1 minute"
364546msgid_plural "%1 minutes"
365547msgstr[0] "%1 ደቂቃ"
366548msgstr[1] "%1 ደቂቃዎች"
367549
368−#: qml/Panel/Indicators/MenuItemFactory.qml:899
550+#: qml/Panel/Indicators/MenuItemFactory.qml:900
369551#, qt-format
370552msgid "%1 second"
371553msgid_plural "%1 seconds"
372554msgstr[0] "%1 ሰከንድ"
373555msgstr[1] "%1 ሰከንዶች"
374556
375−#: qml/Panel/Indicators/MenuItemFactory.qml:902
557+#: qml/Panel/Indicators/MenuItemFactory.qml:903
376558msgid "0 seconds"
377559msgstr "0 ሰከንዶች"
378560
379561#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
380−#: qml/Panel/Indicators/MenuItemFactory.qml:904
562+#: qml/Panel/Indicators/MenuItemFactory.qml:905
381563#, qt-format
382564msgid "%1 remaining"
383565msgstr "%1 የቀረው"
384566
385−#: qml/Panel/Indicators/MenuItemFactory.qml:910
567+#: qml/Panel/Indicators/MenuItemFactory.qml:911
386568msgid "In queue…"
387569msgstr "ወረፋ በመጠበቅ ላይ…"
388570
389−#: qml/Panel/Indicators/MenuItemFactory.qml:914
571+#: qml/Panel/Indicators/MenuItemFactory.qml:915
390572msgid "Downloading"
391573msgstr "በማውረድ ላይ"
392574
393−#: qml/Panel/Indicators/MenuItemFactory.qml:916
575+#: qml/Panel/Indicators/MenuItemFactory.qml:917
394576msgid "Paused, tap to resume"
395577msgstr "ማስቆሚያ: ለመቀጠል መታ ያድርጉ"
396578
397−#: qml/Panel/Indicators/MenuItemFactory.qml:918
579+#: qml/Panel/Indicators/MenuItemFactory.qml:919
398580msgid "Canceled"
399581msgstr "ተሰርዟል"
400582
401−#: qml/Panel/Indicators/MenuItemFactory.qml:920
583+#: qml/Panel/Indicators/MenuItemFactory.qml:921
402584msgid "Finished"
403585msgstr "ጨርሷል"
404586
405−#: qml/Panel/Indicators/MenuItemFactory.qml:922
587+#: qml/Panel/Indicators/MenuItemFactory.qml:923
406588msgid "Failed, tap to retry"
407589msgstr "አልተቻለም: እንደገና ለመሞከር መታ ያድርጉ"
408590
409−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
410−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
591+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
592+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
411593msgctxt "Button: Send a reply message"
412594msgid "Send"
413595msgstr "መላኪያ"
414596
415−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
597+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
416598msgctxt "Label: Hint in message indicator line edit"
417599msgid "Reply"
418600msgstr "መመለሻ"
419601
420−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
602+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
421603msgctxt "Button: Call back on phone"
422604msgid "Call back"
423605msgstr "መልሶ መደወያ"
@@ -426,49 +608,25 @@ msgstr "መልሶ መደወያ"
426608msgid "Drag using 3 fingers any application from one window to the other"
427609msgstr "መጎተቻ 3 ጣቶች በ መጠቀም ማንኛውንም መተግበሪያ ከ አንድ መስኮት ወደ ሌላ"
428610
429−#: qml/Tutorial/TutorialBottom.qml:78
430−msgid "Swipe up to add a contact"
431−msgstr "ወደ ላይ ይጥረጉ ግንኙነት ለ መጨመር"
432−
433−#: qml/Tutorial/TutorialBottom.qml:80
434−msgid "Swipe up for favorite calculations"
435−msgstr "ወደ ላይ ይጥረጉ የሚወዱትን ለማስላት"
436−
437−#: qml/Tutorial/TutorialBottom.qml:82
438−msgid "Swipe up for recent calls"
439−msgstr "ወደ ላይ ይጥረጉ ለ ቅርብ ጊዜ ጥሪዎች"
440−
441−#: qml/Tutorial/TutorialBottom.qml:84
442−msgid "Swipe up to create a message"
443−msgstr "ወደ ላይ ይጥረጉ መልእክት ለ መፍጠር"
444−
445−#: qml/Tutorial/TutorialBottom.qml:85
446−msgid "Swipe up to manage the app"
447−msgstr "ወደ ላይ ይጥረጉ መተግበሪያ ለማስተዳደር"
448−
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
452−
453−#: qml/Tutorial/TutorialLeftLong.qml:47
611+#: qml/Tutorial/TutorialLeftLong.qml:49
454612msgid "Long swipe from the left edge to open the Today scope"
455613msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
456614
457−#: qml/Tutorial/TutorialRight.qml:54
458−msgid "Hover your mouse on the right edge to view your open apps"
459−msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
615+#: qml/Tutorial/TutorialLeft.qml:47
616+msgid "Short swipe from the left edge to open the launcher"
617+msgstr "በ አጭሩ ይጥረጉ ከ ግራ ጠርዝ በኩል ማስጀመሪያውን ለ መክፈት"
460618
461619#: qml/Tutorial/TutorialRight.qml:55
462−msgid "Short or long swipe from the right edge to view your open apps"
463−msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
620+msgid "Push your mouse against the right edge to view your open apps"
621+msgstr "የ እርስዎን አይጥ መጠቆሚያ ወደ ቀኝ ጠርዝ በኩል ያስጠጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
464622
465−#: qml/Tutorial/TutorialTop.qml:53
466−msgid "Swipe from the top right edge to open the notification bar"
467−msgstr "ከ ላይ ቀኝ ጠርዝ በኩል ይጥረጉ የ ማስታወቂያ መደርደሪያ ለ መክፈት"
623+#: qml/Tutorial/TutorialRight.qml:56
624+msgid "Swipe from the right edge to view your open apps"
625+msgstr "ከ ቀኝ በኩል ይጥረጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
468626
469−#: qml/Tutorial/TutorialTop.qml:54
470−msgid "Swipe from the top edge to open the notification bar"
471−msgstr "ከ ላይ ጠርዝ በኩል ይጥረጉ የ ማስታወቂያ መደርደሪያ ለ መክፈት"
627+#: qml/Tutorial/TutorialTop.qml:53
628+msgid "Swipe from the top edge to access notifications and quick settings"
629+msgstr "ከ ላይ ጠረዝ በኩል ይጥረጉ ማስታወቂያዎች እና በፍጥነት ማሰናጃዎች ጋር ለ መድረስ"
472630
473631#: qml/Wizard/Page.qml:54
474632msgctxt "Button: Go back one page in the Wizard"
@@ -479,11 +637,11 @@ msgstr "ወደ ኋላ"
479637msgid "Language"
480638msgstr "ቋንቋ"
481639
482−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
483−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
640+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
641+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
484642#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
485643#: qml/Wizard/Pages/75-report-check.qml:84
486−#: qml/Wizard/Pages/passcode-desktop.qml:124
644+#: qml/Wizard/Pages/passcode-desktop.qml:141
487645#: qml/Wizard/Pages/password-set.qml:141
488646msgid "Next"
489647msgstr "ይቀጥሉ"
@@ -545,7 +703,7 @@ msgstr "እርስዎ በኋላ በ ስርአት ማሰናጃ ውስጥ መቀየ
545703msgid "Time Zone"
546704msgstr "የ ሰአት ክልል"
547705
548−#: qml/Wizard/Pages/50-timezone.qml:178
706+#: qml/Wizard/Pages/50-timezone.qml:181
549707msgid "Enter your city"
550708msgstr "የ እርስዎን ከተማ ያስገቡ"
551709
@@ -637,7 +795,7 @@ msgid "Service Terms"
637795msgstr "የ ግልጋሎት ስምምነቶች"
638796
639797#: qml/Wizard/Pages/passcode-confirm.qml:43
640−#: qml/Wizard/Pages/passcode-desktop.qml:80
798+#: qml/Wizard/Pages/passcode-desktop.qml:96
641799msgid "Confirm passcode"
642800msgstr "የማለፊያ ኮድ ማረጋገጫ"
643801
@@ -654,24 +812,24 @@ msgstr "እባክዎን እንደገና-ያስገቡ"
654812msgid "Lock Screen Passcode"
655813msgstr "የ መመልከቻው መቆለፊያ የ ማለፊያ ኮድ"
656814
657−#: qml/Wizard/Pages/passcode-desktop.qml:56
815+#: qml/Wizard/Pages/passcode-desktop.qml:60
658816msgid "Enter 4 numbers to setup your passcode"
659817msgstr "ያስገቡ 4 ቁጥሮች የ እርስዎን የ ማለፊያ ኮድ ለማሰናዳት"
660818
661−#: qml/Wizard/Pages/passcode-desktop.qml:65
819+#: qml/Wizard/Pages/passcode-desktop.qml:76
662820#: qml/Wizard/Pages/passcode-set.qml:54
663821msgid "Choose passcode"
664822msgstr "የ ማለፊያ ኮድ ይምረጡ"
665823
666−#: qml/Wizard/Pages/passcode-desktop.qml:105
824+#: qml/Wizard/Pages/passcode-desktop.qml:126
667825msgid "Passcode too short"
668826msgstr "የ ማለፊያ ኮዱ በጣም አጭር ነው"
669827
670−#: qml/Wizard/Pages/passcode-desktop.qml:107
828+#: qml/Wizard/Pages/passcode-desktop.qml:128
671829msgid "Passcodes match"
672830msgstr "የ ማለፊያ ኮዶቹ ተመሳሳይ ናቸው"
673831
674−#: qml/Wizard/Pages/passcode-desktop.qml:109
832+#: qml/Wizard/Pages/passcode-desktop.qml:130
675833msgid "Passcodes do not match"
676834msgstr "የ ማለፊያ ኮዶቹ አይመሳሰሉም"
677835
@@ -720,26 +878,30 @@ msgid "To proceed with no SIM tap Skip."
720878msgstr "ያለ ሲም ለ መቀጠል መዝለያውን መታ ያድርጉ"
721879
722880#: qml/Wizard/PasswordMeter.qml:87
881+msgid "Password too short"
882+msgstr "የ መግቢያ ቃል በጣም አጭር ነው"
883+
884+#: qml/Wizard/PasswordMeter.qml:89
723885msgid "Passwords match"
724886msgstr "የ መግቢያ ቃሎቹ ተመሳሳይ ናቸው"
725887
726−#: qml/Wizard/PasswordMeter.qml:89
888+#: qml/Wizard/PasswordMeter.qml:91
727889msgid "Passwords do not match"
728890msgstr "የ መግቢያ ቃሎቹ ተመሳሳይ አይደሉም"
729891
730−#: qml/Wizard/PasswordMeter.qml:93
892+#: qml/Wizard/PasswordMeter.qml:95
731893msgid "Strong password"
732894msgstr "ጠንካራ የ መግቢያ ቃል"
733895
734−#: qml/Wizard/PasswordMeter.qml:95
896+#: qml/Wizard/PasswordMeter.qml:97
735897msgid "Fair password"
736898msgstr "ደህና የ መግቢያ ቃል"
737899
738−#: qml/Wizard/PasswordMeter.qml:97
900+#: qml/Wizard/PasswordMeter.qml:99
739901msgid "Weak password"
740902msgstr "ደካማ የ መግቢያ ቃል"
741903
742−#: qml/Wizard/PasswordMeter.qml:99
904+#: qml/Wizard/PasswordMeter.qml:101
743905msgid "Very weak password"
744906msgstr "በጣም ደካማ የ መግቢያ ቃል"
745907
@@ -773,6 +935,12 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
773935#~ msgid "Search"
774936#~ msgstr "መፈለጊያ"
775937
938+#~ msgid "See less"
939+#~ msgstr "አነስተኛ መመልከቻ"
940+
941+#~ msgid "See all"
942+#~ msgstr "ሁሉንም መመልከቻ"
943+
776944#~ msgid "Skip intro"
777945#~ msgstr "መግቢያውን መዝለያ"
778946
@@ -982,6 +1150,9 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
9821150#~ msgid "View all your running tasks."
9831151#~ msgstr "እርስዎ የሚያስኬዱትን ተግባሮች በሙሉ መመልከቻ"
9841152
1153+#~ msgid "Tap to unlock"
1154+#~ msgstr "ለመክፈት መታ ያድርጉ"
1155+
9851156#~ msgctxt "Button: Shut down the system"
9861157#~ msgid "Shut down"
9871158#~ msgstr "ማጥፊያ"
@@ -1051,11 +1222,32 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
10511222#~ msgid "Call back"
10521223#~ msgstr "መልሶ መደወያ"
10531224
1054−#~ msgid "Welcome to your Ubuntu device."
1055−#~ msgstr "እንኳን ድህና መጡ ወደ ኡቡንቱ"
1225+#~ msgid "Swipe up for recent calls"
1226+#~ msgstr "ወደ ላይ ይጥረጉ ለ ቅርብ ጊዜ ጥሪዎች"
1227+
1228+#~ msgid "Swipe up for favorite calculations"
1229+#~ msgstr "ወደ ላይ ይጥረጉ የሚወዱትን ለማስላት"
1230+
1231+#~ msgid "Swipe up to manage the app"
1232+#~ msgstr "ወደ ላይ ይጥረጉ መተግበሪያ ለማስተዳደር"
1233+
1234+#~ msgid "Swipe up to create a message"
1235+#~ msgstr "ወደ ላይ ይጥረጉ መልእክት ለ መፍጠር"
1236+
1237+#~ msgid "Swipe up to add a contact"
1238+#~ msgstr "ወደ ላይ ይጥረጉ ግንኙነት ለ መጨመር"
1239+
1240+#~ msgid "Swipe from the top right edge to open the notification bar"
1241+#~ msgstr "ከ ላይ ቀኝ ጠርዝ በኩል ይጥረጉ የ ማስታወቂያ መደርደሪያ ለ መክፈት"
1242+
1243+#~ msgid "Swipe from the top edge to open the notification bar"
1244+#~ msgstr "ከ ላይ ጠርዝ በኩል ይጥረጉ የ ማስታወቂያ መደርደሪያ ለ መክፈት"
1245+
1246+#~ msgid "Short or long swipe from the right edge to view your open apps"
1247+#~ msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
10561248
1057−#~ msgid "Please select how you’d like to unlock your device."
1058−#~ msgstr "እባክዎን የ እርስዎን አካል እንዴት እንደሚከፈት ይምረጡ"
1249+#~ msgid "Swipe from the left edge to open the launcher"
1250+#~ msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
10591251
1060−#~ msgid "Your device is now ready to use."
1061−#~ msgstr "የ እርስዎ አካል አሁን ዝግጁ ነው"
1252+#~ msgid "Hover your mouse on the right edge to view your open apps"
1253+#~ msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
po/ar.po+299−128
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
1111"PO-Revision-Date: 2015-07-29 09:41+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
@@ -16,41 +16,41 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
1818"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
20+"X-Generator: Launchpad (build 18147)\n"
2121
22−#: plugins/IntegratedLightDM/Greeter.cpp:112
22+#: plugins/LightDM/Greeter.cpp:123
2323msgid "Password: "
2424msgstr "كلمة السر: "
2525
26−#: plugins/Unity/Launcher/launcheritem.cpp:48
27−#: plugins/Unity/Launcher/launcheritem.cpp:107
26+#: plugins/Unity/Launcher/launcheritem.cpp:49
27+#: plugins/Unity/Launcher/launcheritem.cpp:108
2828msgid "Pin shortcut"
2929msgstr "تثبيت الاختصار"
3030
31−#: plugins/Unity/Launcher/launcheritem.cpp:53
31+#: plugins/Unity/Launcher/launcheritem.cpp:54
3232msgid "Quit"
3333msgstr "خروج"
3434
35−#: plugins/Unity/Launcher/launcheritem.cpp:107
35+#: plugins/Unity/Launcher/launcheritem.cpp:108
3636msgid "Unpin shortcut"
3737msgstr "إزالة تثبيت الاختصار"
3838
39−#: qml/Components/DelayedLockscreen.qml:49
39+#: qml/Components/DelayedLockscreen.qml:50
4040msgid "Device Locked"
4141msgstr "الجهاز موصد"
4242
43−#: qml/Components/DelayedLockscreen.qml:64
43+#: qml/Components/DelayedLockscreen.qml:65
4444msgid "You have been locked out due to too many failed passphrase attempts."
4545msgstr ""
4646"لقد تم تأمين الجهاز ضد الفتح بسبب المحاولات العديدة الفاشلة للعبارة السرّية."
4747
48−#: qml/Components/DelayedLockscreen.qml:65
48+#: qml/Components/DelayedLockscreen.qml:66
4949msgid "You have been locked out due to too many failed passcode attempts."
5050msgstr ""
5151"لقد تم تأمين الجهاز ضد الفتح بسبب المحاولات العديدة الفاشلة للرمز السرّي."
5252
53−#: qml/Components/DelayedLockscreen.qml:74
53+#: qml/Components/DelayedLockscreen.qml:75
5454#, qt-format
5555msgid "Please wait %1 minute and then try again…"
5656msgid_plural "Please wait %1 minutes and then try again…"
@@ -80,8 +80,8 @@ msgctxt "Button: Log out from the system"
8080msgid "Log Out"
8181msgstr "خروج"
8282
83−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
84−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
83+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
84+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
8585#: qml/Wizard/Pages/passcode-set.qml:32
8686msgid "Cancel"
8787msgstr "إلغاء"
@@ -99,16 +99,16 @@ msgstr "هل أنت متأكد من رغبتك في إعادة تشغيل الج
9999msgid "No"
100100msgstr "لا"
101101
102−#: qml/Components/Dialogs.qml:183
102+#: qml/Components/Dialogs.qml:182
103103msgid "Yes"
104104msgstr "نعم"
105105
106−#: qml/Components/Dialogs.qml:198
106+#: qml/Components/Dialogs.qml:197
107107msgctxt "Title: Power off/Restart dialog"
108108msgid "Power"
109109msgstr "الطاقة"
110110
111−#: qml/Components/Dialogs.qml:199
111+#: qml/Components/Dialogs.qml:198
112112msgid ""
113113"Are you sure you would like\n"
114114"to power off?"
@@ -116,28 +116,198 @@ msgstr ""
116116"هل أنت متأكد من رغبتك\n"
117117"في إيقاف التشغيل؟"
118118
119−#: qml/Components/Dialogs.qml:201
119+#: qml/Components/Dialogs.qml:200
120120msgctxt "Button: Power off the system"
121121msgid "Power off"
122122msgstr "إيقاف التشغيل"
123123
124−#: qml/Components/Dialogs.qml:210
124+#: qml/Components/Dialogs.qml:209
125125msgctxt "Button: Restart the system"
126126msgid "Restart"
127127msgstr "إعادة التشغيل"
128128
129−#: qml/Components/Lockscreen.qml:231
129+#: qml/Components/KeyboardShortcutsOverlay.qml:41
130+msgid "Keyboard Shortcuts"
131+msgstr ""
132+
133+#: qml/Components/KeyboardShortcutsOverlay.qml:55
134+msgid "Unity 8"
135+msgstr ""
136+
137+#: qml/Components/KeyboardShortcutsOverlay.qml:62
138+msgid "PrtScr"
139+msgstr ""
140+
141+#: qml/Components/KeyboardShortcutsOverlay.qml:67
142+msgid "Takes a screenshot."
143+msgstr ""
144+
145+#: qml/Components/KeyboardShortcutsOverlay.qml:75
146+msgid "Alt + PrtScr"
147+msgstr ""
148+
149+#: qml/Components/KeyboardShortcutsOverlay.qml:80
150+msgid "Takes a screenshot of a window."
151+msgstr ""
152+
153+#: qml/Components/KeyboardShortcutsOverlay.qml:88
154+msgid "Super + Space"
155+msgstr ""
156+
157+#: qml/Components/KeyboardShortcutsOverlay.qml:93
158+msgid "Switches to next keyboard layout."
159+msgstr ""
160+
161+#: qml/Components/KeyboardShortcutsOverlay.qml:101
162+msgid "Super + Shift + Space"
163+msgstr ""
164+
165+#: qml/Components/KeyboardShortcutsOverlay.qml:106
166+msgid "Switches to previous keyboard layout."
167+msgstr ""
168+
169+#: qml/Components/KeyboardShortcutsOverlay.qml:118
170+msgid "Launcher"
171+msgstr ""
172+
173+#: qml/Components/KeyboardShortcutsOverlay.qml:125
174+msgid "Super (Hold)"
175+msgstr ""
176+
177+#: qml/Components/KeyboardShortcutsOverlay.qml:130
178+msgid "Opens the launcher, displays shortcuts."
179+msgstr ""
180+
181+#: qml/Components/KeyboardShortcutsOverlay.qml:138
182+msgid "Alt + F1"
183+msgstr ""
184+
185+#: qml/Components/KeyboardShortcutsOverlay.qml:143
186+msgid "Opens launcher keyboard navigation mode."
187+msgstr ""
188+
189+#: qml/Components/KeyboardShortcutsOverlay.qml:151
190+msgid "Super + Tab"
191+msgstr ""
192+
193+#: qml/Components/KeyboardShortcutsOverlay.qml:156
194+msgid "Switches applications via the launcher."
195+msgstr ""
196+
197+#: qml/Components/KeyboardShortcutsOverlay.qml:164
198+msgid "Super + 0 to 9"
199+msgstr ""
200+
201+#: qml/Components/KeyboardShortcutsOverlay.qml:169
202+msgid "Same as clicking on a launcher icon."
203+msgstr ""
204+
205+#: qml/Components/KeyboardShortcutsOverlay.qml:181
206+msgid "Scopes"
207+msgstr ""
208+
209+#: qml/Components/KeyboardShortcutsOverlay.qml:188
210+msgid "Super (Tap)"
211+msgstr ""
212+
213+#: qml/Components/KeyboardShortcutsOverlay.qml:193
214+msgid "Opens the Scopes home."
215+msgstr ""
216+
217+#: qml/Components/KeyboardShortcutsOverlay.qml:209
218+msgid "Switching"
219+msgstr ""
220+
221+#: qml/Components/KeyboardShortcutsOverlay.qml:216
222+msgid "Alt + Tab"
223+msgstr ""
224+
225+#: qml/Components/KeyboardShortcutsOverlay.qml:221
226+msgid "Switches between applications."
227+msgstr ""
228+
229+#: qml/Components/KeyboardShortcutsOverlay.qml:229
230+msgid "Super + W"
231+msgstr ""
232+
233+#: qml/Components/KeyboardShortcutsOverlay.qml:234
234+msgid "Opens the desktop spread."
235+msgstr ""
236+
237+#: qml/Components/KeyboardShortcutsOverlay.qml:242
238+msgid "Cursor Left or Right"
239+msgstr ""
240+
241+#: qml/Components/KeyboardShortcutsOverlay.qml:247
242+msgid "Moves the focus."
243+msgstr ""
244+
245+#: qml/Components/KeyboardShortcutsOverlay.qml:259
246+msgid "Windows"
247+msgstr ""
248+
249+#: qml/Components/KeyboardShortcutsOverlay.qml:266
250+msgid "Ctrl + Super + D"
251+msgstr ""
252+
253+#: qml/Components/KeyboardShortcutsOverlay.qml:271
254+msgid "Minimizes all windows."
255+msgstr ""
256+
257+#: qml/Components/KeyboardShortcutsOverlay.qml:279
258+msgid "Ctrl + Super + Up"
259+msgstr ""
260+
261+#: qml/Components/KeyboardShortcutsOverlay.qml:284
262+msgid "Maximizes the current window."
263+msgstr ""
264+
265+#: qml/Components/KeyboardShortcutsOverlay.qml:292
266+msgid "Ctrl + Super + Down"
267+msgstr ""
268+
269+#: qml/Components/KeyboardShortcutsOverlay.qml:297
270+msgid "Minimizes or restores the current window."
271+msgstr ""
272+
273+#: qml/Components/KeyboardShortcutsOverlay.qml:305
274+msgid "Ctrl + Super + Left or Right"
275+msgstr ""
276+
277+#: qml/Components/KeyboardShortcutsOverlay.qml:310
278+msgid "Semi-maximizes the current window."
279+msgstr ""
280+
281+#: qml/Components/KeyboardShortcutsOverlay.qml:318
282+msgid "Alt + F4"
283+msgstr ""
284+
285+#: qml/Components/KeyboardShortcutsOverlay.qml:323
286+msgid "Closes the current window."
287+msgstr ""
288+
289+#: qml/Components/Lockscreen.qml:239
130290msgid "Return to Call"
131291msgstr "العودة إلى المكالمة"
132292
133−#: qml/Components/Lockscreen.qml:231
293+#: qml/Components/Lockscreen.qml:239
134294msgid "Emergency Call"
135295msgstr "مكالمة طوارئ"
136296
137−#: qml/Components/Lockscreen.qml:263
297+#: qml/Components/Lockscreen.qml:271
138298msgid "OK"
139299msgstr "موافق"
140300
301+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
302+#, qt-format
303+msgid "%1:%2:%3"
304+msgstr ""
305+
306+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
307+#, qt-format
308+msgid "%1:%2"
309+msgstr ""
310+
141311#: qml/Components/ModeSwitchWarningDialog.qml:32
142312msgid "Apps may have unsaved data:"
143313msgstr ""
@@ -164,26 +334,30 @@ msgstr ""
164334msgid "Close all"
165335msgstr ""
166336
167−#: qml/Dash/DashPageHeader.qml:337
337+#: qml/Components/SharingPicker.qml:54
338+msgid "Preview Share Item"
339+msgstr ""
340+
341+#: qml/Dash/DashPageHeader.qml:333
168342msgctxt "Button: Open the Ubuntu Store"
169343msgid "Store"
170344msgstr "المتجر"
171345
172−#: qml/Dash/DashPageHeader.qml:344
346+#: qml/Dash/DashPageHeader.qml:340
173347msgctxt "Button: Start a search in the current dash scope"
174348msgid "Search"
175349msgstr "بحث"
176350
177−#: qml/Dash/DashPageHeader.qml:354
351+#: qml/Dash/DashPageHeader.qml:350
178352msgctxt "Button: Show the current dash scope settings"
179353msgid "Settings"
180354msgstr "الإعدادات"
181355
182−#: qml/Dash/DashPageHeader.qml:361
356+#: qml/Dash/DashPageHeader.qml:357
183357msgid "Remove from Favorites"
184358msgstr "حذف من المفضلات"
185359
186−#: qml/Dash/DashPageHeader.qml:361
360+#: qml/Dash/DashPageHeader.qml:357
187361msgid "Add to Favorites"
188362msgstr "إضافة إلى المفضلات"
189363
@@ -195,24 +369,24 @@ msgstr ""
195369msgid "Reset"
196370msgstr ""
197371
198−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
199−msgid "See less"
200−msgstr "شاهد أقل"
372+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
373+msgid "Show less"
374+msgstr ""
201375
202−#: qml/Dash/GenericScopeView.qml:570
203−msgid "See all"
204−msgstr "عرض الكل"
376+#: qml/Dash/GenericScopeView.qml:580
377+msgid "Show all"
378+msgstr ""
205379
206−#: qml/Dash/GenericScopeView.qml:627
380+#: qml/Dash/GenericScopeView.qml:637
207381msgctxt "Label: Hint for dash search line edit"
208382msgid "Search"
209383msgstr "بحث"
210384
211−#: qml/Dash/PageHeaderExtraPanel.qml:55
385+#: qml/Dash/PageHeaderExtraPanel.qml:56
212386msgid "Recent Searches"
213387msgstr ""
214388
215−#: qml/Dash/PageHeaderExtraPanel.qml:66
389+#: qml/Dash/PageHeaderExtraPanel.qml:67
216390msgid "Clear All"
217391msgstr ""
218392
@@ -225,22 +399,18 @@ msgid "Less..."
225399msgstr "أقل..."
226400
227401#: qml/Dash/Previews/PreviewCommentInput.qml:68
228−#: qml/Dash/Previews/PreviewRatingInput.qml:174
402+#: qml/Dash/Previews/PreviewRatingInput.qml:175
229403msgid "Send"
230404msgstr "أرسل"
231405
232−#: qml/Dash/Previews/PreviewRatingInput.qml:84
406+#: qml/Dash/Previews/PreviewRatingInput.qml:82
233407msgid "Rate this"
234408msgstr "قيّم ذلك"
235409
236−#: qml/Dash/Previews/PreviewRatingInput.qml:129
410+#: qml/Dash/Previews/PreviewRatingInput.qml:157
237411msgid "Add a review"
238412msgstr "أضف تعليق"
239413
240−#: qml/Dash/Previews/PreviewSharing.qml:66
241−msgid "Preview Share Item"
242−msgstr ""
243−
244414#: qml/Dash/PullToRefreshScopeStyle.qml:55
245415msgid "Pull to refresh…"
246416msgstr "اسحب للتحديث..."
@@ -253,49 +423,61 @@ msgstr "حرّر للتحديث..."
253423msgid "Enable location data"
254424msgstr "تفعيل بيانات الموقع"
255425
256−#: qml/Dash/ScopesList.qml:67
426+#: qml/Dash/ScopesList.qml:55
257427msgid "Manage"
258428msgstr "إدارة"
259429
260−#: qml/Dash/ScopesList.qml:113
430+#: qml/Dash/ScopesList.qml:102
261431msgid "Home"
262432msgstr "الرئيسية"
263433
264−#: qml/Dash/ScopesList.qml:114
434+#: qml/Dash/ScopesList.qml:103
265435msgid "Also installed"
266436msgstr "أيضا تم تثبيت"
267437
268−#: qml/DisabledScreenNotice.qml:104
438+#: qml/DisabledScreenNotice.qml:109
269439msgid ""
270440"Your device is now connected to an external display. Use this screen as a "
271441"touch pad to interact with the pointer."
272442msgstr ""
273443
274−#: qml/Greeter/CoverPage.qml:118
444+#: qml/Greeter/CoverPage.qml:127
275445msgid "Unlock"
276446msgstr "فك القفل"
277447
278−#: qml/Greeter/LoginList.qml:239
448+#: qml/Greeter/Greeter.qml:555
449+msgid "Try again"
450+msgstr ""
451+
452+#: qml/Greeter/LoginList.qml:63
453+msgid "Passphrase"
454+msgstr ""
455+
456+#: qml/Greeter/LoginList.qml:64
457+msgid "Passcode"
458+msgstr ""
459+
460+#: qml/Greeter/LoginList.qml:87
279461msgid "Retry"
280462msgstr "إعادة المحاولة"
281463
282−#: qml/Greeter/LoginList.qml:240
283−msgid "Tap to unlock"
284−msgstr "انقر لفك القفل"
464+#: qml/Greeter/LoginList.qml:88
465+msgid "Log In"
466+msgstr ""
285467
286−#: qml/Greeter/NarrowView.qml:54
468+#: qml/Greeter/NarrowView.qml:55
287469msgid "Sorry, incorrect passphrase."
288470msgstr "عذرًا، عبارة سرّية خاطئة."
289471
290−#: qml/Greeter/NarrowView.qml:55
472+#: qml/Greeter/NarrowView.qml:56
291473msgid "Sorry, incorrect passcode."
292474msgstr "عذرًا، رمز سرّي خاطيء."
293475
294−#: qml/Greeter/NarrowView.qml:56
476+#: qml/Greeter/NarrowView.qml:57
295477msgid "This will be your last attempt."
296478msgstr "هذه ستكون المحاولة الأخيرة لك."
297479
298−#: qml/Greeter/NarrowView.qml:58
480+#: qml/Greeter/NarrowView.qml:59
299481msgid ""
300482"If passphrase is entered incorrectly, your phone will conduct a factory "
301483"reset and all personal data will be deleted."
@@ -303,7 +485,7 @@ msgstr ""
303485"إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
304486"المصنع وسيتم حذف كافة البيانات الشخصية."
305487
306−#: qml/Greeter/NarrowView.qml:59
488+#: qml/Greeter/NarrowView.qml:60
307489msgid ""
308490"If passcode is entered incorrectly, your phone will conduct a factory reset "
309491"and all personal data will be deleted."
@@ -311,38 +493,38 @@ msgstr ""
311493"إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
312494"المصنع وسيتم حذف كافة البيانات الشخصية."
313495
314−#: qml/Greeter/NarrowView.qml:116
496+#: qml/Greeter/NarrowView.qml:129
315497#, qt-format
316498msgid "Enter %1"
317499msgstr "أدخِل %1"
318500
319−#: qml/Greeter/NarrowView.qml:117
501+#: qml/Greeter/NarrowView.qml:130
320502msgid "Enter passphrase"
321503msgstr "أدخِل العبارة السرية"
322504
323−#: qml/Greeter/NarrowView.qml:118
505+#: qml/Greeter/NarrowView.qml:131
324506msgid "Enter passcode"
325507msgstr "أدخِل الرمز السرّي"
326508
327−#: qml/Greeter/NarrowView.qml:119
509+#: qml/Greeter/NarrowView.qml:135
328510#, qt-format
329511msgid "Sorry, incorrect %1"
330512msgstr "نأسف، %1 غير صحيحية"
331513
332−#: qml/Greeter/NarrowView.qml:120
514+#: qml/Greeter/NarrowView.qml:136
333515msgid "Sorry, incorrect passphrase"
334516msgstr "نأسف، عبارة السّر غير صحيحية"
335517
336−#: qml/Greeter/NarrowView.qml:121
518+#: qml/Greeter/NarrowView.qml:137
337519msgctxt "passphrase"
338520msgid "Please re-enter"
339521msgstr "برجاء إعادة إدخالها"
340522
341−#: qml/Greeter/NarrowView.qml:122
523+#: qml/Greeter/NarrowView.qml:138
342524msgid "Sorry, incorrect passcode"
343525msgstr "نأسف، الرمز السري غير صحيح"
344526
345−#: qml/Notifications/NotificationMenuItemFactory.qml:129
527+#: qml/Notifications/NotificationMenuItemFactory.qml:124
346528msgid "Show password"
347529msgstr "عرض كلمة السر"
348530
@@ -354,11 +536,11 @@ msgstr "انقر للعودة إلى المكالمة..."
354536msgid "Conference"
355537msgstr "مؤتمر"
356538
357−#: qml/Panel/Indicators/MenuItemFactory.qml:761
539+#: qml/Panel/Indicators/MenuItemFactory.qml:762
358540msgid "Nothing is playing"
359541msgstr "لا شيء مُشغّل"
360542
361−#: qml/Panel/Indicators/MenuItemFactory.qml:890
543+#: qml/Panel/Indicators/MenuItemFactory.qml:891
362544#, qt-format
363545msgid "%1 hour"
364546msgid_plural "%1 hours"
@@ -369,7 +551,7 @@ msgstr[3] "%1 ساعات"
369551msgstr[4] "%1 ساعة"
370552msgstr[5] "%1 ساعة"
371553
372−#: qml/Panel/Indicators/MenuItemFactory.qml:894
554+#: qml/Panel/Indicators/MenuItemFactory.qml:895
373555#, qt-format
374556msgid "%1 minute"
375557msgid_plural "%1 minutes"
@@ -380,7 +562,7 @@ msgstr[3] "%1 دقائق"
380562msgstr[4] "%1 دقيقة"
381563msgstr[5] "%1 دقيقة"
382564
383−#: qml/Panel/Indicators/MenuItemFactory.qml:899
565+#: qml/Panel/Indicators/MenuItemFactory.qml:900
384566#, qt-format
385567msgid "%1 second"
386568msgid_plural "%1 seconds"
@@ -391,52 +573,52 @@ msgstr[3] "%1 ثوان"
391573msgstr[4] "%1 ثانية"
392574msgstr[5] "%1 ثانية"
393575
394−#: qml/Panel/Indicators/MenuItemFactory.qml:902
576+#: qml/Panel/Indicators/MenuItemFactory.qml:903
395577msgid "0 seconds"
396578msgstr "أقل من ثانية"
397579
398580#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
399−#: qml/Panel/Indicators/MenuItemFactory.qml:904
581+#: qml/Panel/Indicators/MenuItemFactory.qml:905
400582#, qt-format
401583msgid "%1 remaining"
402584msgstr "باق %1"
403585
404−#: qml/Panel/Indicators/MenuItemFactory.qml:910
586+#: qml/Panel/Indicators/MenuItemFactory.qml:911
405587msgid "In queue…"
406588msgstr "في الانتظار..."
407589
408−#: qml/Panel/Indicators/MenuItemFactory.qml:914
590+#: qml/Panel/Indicators/MenuItemFactory.qml:915
409591msgid "Downloading"
410592msgstr "التنزيل"
411593
412−#: qml/Panel/Indicators/MenuItemFactory.qml:916
594+#: qml/Panel/Indicators/MenuItemFactory.qml:917
413595msgid "Paused, tap to resume"
414596msgstr "مُلبث، انقر للاستئناف"
415597
416−#: qml/Panel/Indicators/MenuItemFactory.qml:918
598+#: qml/Panel/Indicators/MenuItemFactory.qml:919
417599msgid "Canceled"
418600msgstr "تم إلغائه"
419601
420−#: qml/Panel/Indicators/MenuItemFactory.qml:920
602+#: qml/Panel/Indicators/MenuItemFactory.qml:921
421603msgid "Finished"
422604msgstr "انتهى"
423605
424−#: qml/Panel/Indicators/MenuItemFactory.qml:922
606+#: qml/Panel/Indicators/MenuItemFactory.qml:923
425607msgid "Failed, tap to retry"
426608msgstr "فشل، انقل لإعادة المحاولة"
427609
428−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
429−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
610+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
611+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
430612msgctxt "Button: Send a reply message"
431613msgid "Send"
432614msgstr ""
433615
434−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
616+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
435617msgctxt "Label: Hint in message indicator line edit"
436618msgid "Reply"
437619msgstr "رد"
438620
439−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
621+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
440622msgctxt "Button: Call back on phone"
441623msgid "Call back"
442624msgstr ""
@@ -445,48 +627,24 @@ msgstr ""
445627msgid "Drag using 3 fingers any application from one window to the other"
446628msgstr ""
447629
448−#: qml/Tutorial/TutorialBottom.qml:78
449−msgid "Swipe up to add a contact"
450−msgstr ""
451−
452−#: qml/Tutorial/TutorialBottom.qml:80
453−msgid "Swipe up for favorite calculations"
454−msgstr ""
455−
456−#: qml/Tutorial/TutorialBottom.qml:82
457−msgid "Swipe up for recent calls"
458−msgstr ""
459−
460−#: qml/Tutorial/TutorialBottom.qml:84
461−msgid "Swipe up to create a message"
462−msgstr ""
463−
464−#: qml/Tutorial/TutorialBottom.qml:85
465−msgid "Swipe up to manage the app"
466−msgstr ""
467−
468−#: qml/Tutorial/TutorialLeft.qml:47
469−msgid "Swipe from the left edge to open the launcher"
470−msgstr ""
471−
472−#: qml/Tutorial/TutorialLeftLong.qml:47
630+#: qml/Tutorial/TutorialLeftLong.qml:49
473631msgid "Long swipe from the left edge to open the Today scope"
474632msgstr ""
475633
476−#: qml/Tutorial/TutorialRight.qml:54
477−msgid "Hover your mouse on the right edge to view your open apps"
634+#: qml/Tutorial/TutorialLeft.qml:47
635+msgid "Short swipe from the left edge to open the launcher"
478636msgstr ""
479637
480638#: qml/Tutorial/TutorialRight.qml:55
481−msgid "Short or long swipe from the right edge to view your open apps"
639+msgid "Push your mouse against the right edge to view your open apps"
482640msgstr ""
483641
484−#: qml/Tutorial/TutorialTop.qml:53
485−msgid "Swipe from the top right edge to open the notification bar"
642+#: qml/Tutorial/TutorialRight.qml:56
643+msgid "Swipe from the right edge to view your open apps"
486644msgstr ""
487645
488−#: qml/Tutorial/TutorialTop.qml:54
489−msgid "Swipe from the top edge to open the notification bar"
646+#: qml/Tutorial/TutorialTop.qml:53
647+msgid "Swipe from the top edge to access notifications and quick settings"
490648msgstr ""
491649
492650#: qml/Wizard/Page.qml:54
@@ -498,11 +656,11 @@ msgstr "عودة"
498656msgid "Language"
499657msgstr ""
500658
501−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
502−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
659+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
660+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
503661#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
504662#: qml/Wizard/Pages/75-report-check.qml:84
505−#: qml/Wizard/Pages/passcode-desktop.qml:124
663+#: qml/Wizard/Pages/passcode-desktop.qml:141
506664#: qml/Wizard/Pages/password-set.qml:141
507665msgid "Next"
508666msgstr ""
@@ -564,7 +722,7 @@ msgstr ""
564722msgid "Time Zone"
565723msgstr ""
566724
567−#: qml/Wizard/Pages/50-timezone.qml:178
725+#: qml/Wizard/Pages/50-timezone.qml:181
568726msgid "Enter your city"
569727msgstr ""
570728
@@ -654,7 +812,7 @@ msgid "Service Terms"
654812msgstr ""
655813
656814#: qml/Wizard/Pages/passcode-confirm.qml:43
657−#: qml/Wizard/Pages/passcode-desktop.qml:80
815+#: qml/Wizard/Pages/passcode-desktop.qml:96
658816msgid "Confirm passcode"
659817msgstr "تأكيد الرمز السري"
660818
@@ -671,24 +829,24 @@ msgstr ""
671829msgid "Lock Screen Passcode"
672830msgstr ""
673831
674−#: qml/Wizard/Pages/passcode-desktop.qml:56
832+#: qml/Wizard/Pages/passcode-desktop.qml:60
675833msgid "Enter 4 numbers to setup your passcode"
676834msgstr ""
677835
678−#: qml/Wizard/Pages/passcode-desktop.qml:65
836+#: qml/Wizard/Pages/passcode-desktop.qml:76
679837#: qml/Wizard/Pages/passcode-set.qml:54
680838msgid "Choose passcode"
681839msgstr ""
682840
683−#: qml/Wizard/Pages/passcode-desktop.qml:105
841+#: qml/Wizard/Pages/passcode-desktop.qml:126
684842msgid "Passcode too short"
685843msgstr ""
686844
687−#: qml/Wizard/Pages/passcode-desktop.qml:107
845+#: qml/Wizard/Pages/passcode-desktop.qml:128
688846msgid "Passcodes match"
689847msgstr ""
690848
691−#: qml/Wizard/Pages/passcode-desktop.qml:109
849+#: qml/Wizard/Pages/passcode-desktop.qml:130
692850msgid "Passcodes do not match"
693851msgstr ""
694852
@@ -737,26 +895,30 @@ msgid "To proceed with no SIM tap Skip."
737895msgstr ""
738896
739897#: qml/Wizard/PasswordMeter.qml:87
740−msgid "Passwords match"
898+msgid "Password too short"
741899msgstr ""
742900
743901#: qml/Wizard/PasswordMeter.qml:89
902+msgid "Passwords match"
903+msgstr ""
904+
905+#: qml/Wizard/PasswordMeter.qml:91
744906msgid "Passwords do not match"
745907msgstr ""
746908
747−#: qml/Wizard/PasswordMeter.qml:93
909+#: qml/Wizard/PasswordMeter.qml:95
748910msgid "Strong password"
749911msgstr ""
750912
751−#: qml/Wizard/PasswordMeter.qml:95
913+#: qml/Wizard/PasswordMeter.qml:97
752914msgid "Fair password"
753915msgstr ""
754916
755−#: qml/Wizard/PasswordMeter.qml:97
917+#: qml/Wizard/PasswordMeter.qml:99
756918msgid "Weak password"
757919msgstr ""
758920
759−#: qml/Wizard/PasswordMeter.qml:99
921+#: qml/Wizard/PasswordMeter.qml:101
760922msgid "Very weak password"
761923msgstr ""
762924
@@ -809,6 +971,9 @@ msgstr ""
809971#~ msgid "Well done"
810972#~ msgstr "أحسنت!"
811973
974+#~ msgid "See less"
975+#~ msgstr "شاهد أقل"
976+
812977#~ msgid ""
813978#~ "You have now mastered the edge gestures and can start using the "
814979#~ "phone<br><br>Tap on the screen to start"
@@ -861,6 +1026,12 @@ msgstr ""
8611026#~ msgid "Reboot"
8621027#~ msgstr "إعادة التشغيل"
8631028
1029+#~ msgid "See all"
1030+#~ msgstr "عرض الكل"
1031+
1032+#~ msgid "Tap to unlock"
1033+#~ msgstr "انقر لفك القفل"
1034+
8641035#~ msgid "Please re-enter"
8651036#~ msgstr "برجاء إعادة إدخالها"
8661037
po/ast.po+369−172
@@ -7,48 +7,48 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11−"PO-Revision-Date: 2016-03-12 00:17+0000\n"
12−"Last-Translator: enolp <enolp@softastur.org>\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11+"PO-Revision-Date: 2016-05-16 14:07+0000\n"
12+"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19+"X-Generator: Launchpad (build 18147)\n"
2020
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
2222msgid "Password: "
2323msgstr "Contraseña: "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
2727msgid "Pin shortcut"
2828msgstr "Anclar atayu"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
3131msgid "Quit"
3232msgstr "Colar"
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
3535msgid "Unpin shortcut"
3636msgstr "Desanclar atayu"
3737
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
3939msgid "Device Locked"
4040msgstr "Preséu bloquiáu"
4141
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
4343msgid "You have been locked out due to too many failed passphrase attempts."
4444msgstr "Quedasti bloquiáu polos escesivos intentos fallíos de fras de pasu."
4545
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
4747msgid "You have been locked out due to too many failed passcode attempts."
4848msgstr ""
4949"Quedasti bloquiáu polos escesivos intentos fallíos de códigu de pasu."
5050
51−#: qml/Components/DelayedLockscreen.qml:74
51+#: qml/Components/DelayedLockscreen.qml:75
5252#, qt-format
5353msgid "Please wait %1 minute and then try again…"
5454msgid_plural "Please wait %1 minutes and then try again…"
@@ -74,8 +74,8 @@ msgctxt "Button: Log out from the system"
7474msgid "Log Out"
7575msgstr "Zarrar sesión"
7676
77−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
78−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
77+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
78+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
7979#: qml/Wizard/Pages/passcode-set.qml:32
8080msgid "Cancel"
8181msgstr "Encaboxar"
@@ -93,16 +93,16 @@ msgstr "¿De xuru que quies reaniciar?"
9393msgid "No"
9494msgstr "Non"
9595
96−#: qml/Components/Dialogs.qml:183
96+#: qml/Components/Dialogs.qml:182
9797msgid "Yes"
9898msgstr "Sí"
9999
100−#: qml/Components/Dialogs.qml:198
100+#: qml/Components/Dialogs.qml:197
101101msgctxt "Title: Power off/Restart dialog"
102102msgid "Power"
103103msgstr "Apagáu"
104104
105−#: qml/Components/Dialogs.qml:199
105+#: qml/Components/Dialogs.qml:198
106106msgid ""
107107"Are you sure you would like\n"
108108"to power off?"
@@ -110,28 +110,198 @@ msgstr ""
110110"¿De xuru que te prestaría\n"
111111"apagar?"
112112
113−#: qml/Components/Dialogs.qml:201
113+#: qml/Components/Dialogs.qml:200
114114msgctxt "Button: Power off the system"
115115msgid "Power off"
116116msgstr "Apagar"
117117
118−#: qml/Components/Dialogs.qml:210
118+#: qml/Components/Dialogs.qml:209
119119msgctxt "Button: Restart the system"
120120msgid "Restart"
121121msgstr "Reaniciar"
122122
123−#: qml/Components/Lockscreen.qml:231
123+#: qml/Components/KeyboardShortcutsOverlay.qml:41
124+msgid "Keyboard Shortcuts"
125+msgstr ""
126+
127+#: qml/Components/KeyboardShortcutsOverlay.qml:55
128+msgid "Unity 8"
129+msgstr ""
130+
131+#: qml/Components/KeyboardShortcutsOverlay.qml:62
132+msgid "PrtScr"
133+msgstr ""
134+
135+#: qml/Components/KeyboardShortcutsOverlay.qml:67
136+msgid "Takes a screenshot."
137+msgstr ""
138+
139+#: qml/Components/KeyboardShortcutsOverlay.qml:75
140+msgid "Alt + PrtScr"
141+msgstr ""
142+
143+#: qml/Components/KeyboardShortcutsOverlay.qml:80
144+msgid "Takes a screenshot of a window."
145+msgstr ""
146+
147+#: qml/Components/KeyboardShortcutsOverlay.qml:88
148+msgid "Super + Space"
149+msgstr ""
150+
151+#: qml/Components/KeyboardShortcutsOverlay.qml:93
152+msgid "Switches to next keyboard layout."
153+msgstr ""
154+
155+#: qml/Components/KeyboardShortcutsOverlay.qml:101
156+msgid "Super + Shift + Space"
157+msgstr ""
158+
159+#: qml/Components/KeyboardShortcutsOverlay.qml:106
160+msgid "Switches to previous keyboard layout."
161+msgstr ""
162+
163+#: qml/Components/KeyboardShortcutsOverlay.qml:118
164+msgid "Launcher"
165+msgstr ""
166+
167+#: qml/Components/KeyboardShortcutsOverlay.qml:125
168+msgid "Super (Hold)"
169+msgstr ""
170+
171+#: qml/Components/KeyboardShortcutsOverlay.qml:130
172+msgid "Opens the launcher, displays shortcuts."
173+msgstr ""
174+
175+#: qml/Components/KeyboardShortcutsOverlay.qml:138
176+msgid "Alt + F1"
177+msgstr ""
178+
179+#: qml/Components/KeyboardShortcutsOverlay.qml:143
180+msgid "Opens launcher keyboard navigation mode."
181+msgstr ""
182+
183+#: qml/Components/KeyboardShortcutsOverlay.qml:151
184+msgid "Super + Tab"
185+msgstr ""
186+
187+#: qml/Components/KeyboardShortcutsOverlay.qml:156
188+msgid "Switches applications via the launcher."
189+msgstr ""
190+
191+#: qml/Components/KeyboardShortcutsOverlay.qml:164
192+msgid "Super + 0 to 9"
193+msgstr ""
194+
195+#: qml/Components/KeyboardShortcutsOverlay.qml:169
196+msgid "Same as clicking on a launcher icon."
197+msgstr ""
198+
199+#: qml/Components/KeyboardShortcutsOverlay.qml:181
200+msgid "Scopes"
201+msgstr ""
202+
203+#: qml/Components/KeyboardShortcutsOverlay.qml:188
204+msgid "Super (Tap)"
205+msgstr ""
206+
207+#: qml/Components/KeyboardShortcutsOverlay.qml:193
208+msgid "Opens the Scopes home."
209+msgstr ""
210+
211+#: qml/Components/KeyboardShortcutsOverlay.qml:209
212+msgid "Switching"
213+msgstr ""
214+
215+#: qml/Components/KeyboardShortcutsOverlay.qml:216
216+msgid "Alt + Tab"
217+msgstr ""
218+
219+#: qml/Components/KeyboardShortcutsOverlay.qml:221
220+msgid "Switches between applications."
221+msgstr ""
222+
223+#: qml/Components/KeyboardShortcutsOverlay.qml:229
224+msgid "Super + W"
225+msgstr ""
226+
227+#: qml/Components/KeyboardShortcutsOverlay.qml:234
228+msgid "Opens the desktop spread."
229+msgstr ""
230+
231+#: qml/Components/KeyboardShortcutsOverlay.qml:242
232+msgid "Cursor Left or Right"
233+msgstr ""
234+
235+#: qml/Components/KeyboardShortcutsOverlay.qml:247
236+msgid "Moves the focus."
237+msgstr ""
238+
239+#: qml/Components/KeyboardShortcutsOverlay.qml:259
240+msgid "Windows"
241+msgstr ""
242+
243+#: qml/Components/KeyboardShortcutsOverlay.qml:266
244+msgid "Ctrl + Super + D"
245+msgstr ""
246+
247+#: qml/Components/KeyboardShortcutsOverlay.qml:271
248+msgid "Minimizes all windows."
249+msgstr ""
250+
251+#: qml/Components/KeyboardShortcutsOverlay.qml:279
252+msgid "Ctrl + Super + Up"
253+msgstr ""
254+
255+#: qml/Components/KeyboardShortcutsOverlay.qml:284
256+msgid "Maximizes the current window."
257+msgstr ""
258+
259+#: qml/Components/KeyboardShortcutsOverlay.qml:292
260+msgid "Ctrl + Super + Down"
261+msgstr ""
262+
263+#: qml/Components/KeyboardShortcutsOverlay.qml:297
264+msgid "Minimizes or restores the current window."
265+msgstr ""
266+
267+#: qml/Components/KeyboardShortcutsOverlay.qml:305
268+msgid "Ctrl + Super + Left or Right"
269+msgstr ""
270+
271+#: qml/Components/KeyboardShortcutsOverlay.qml:310
272+msgid "Semi-maximizes the current window."
273+msgstr ""
274+
275+#: qml/Components/KeyboardShortcutsOverlay.qml:318
276+msgid "Alt + F4"
277+msgstr ""
278+
279+#: qml/Components/KeyboardShortcutsOverlay.qml:323
280+msgid "Closes the current window."
281+msgstr ""
282+
283+#: qml/Components/Lockscreen.qml:239
124284msgid "Return to Call"
125285msgstr "Tornar a la llamada"
126286
127−#: qml/Components/Lockscreen.qml:231
287+#: qml/Components/Lockscreen.qml:239
128288msgid "Emergency Call"
129289msgstr "Llamada d'emerxencia"
130290
131−#: qml/Components/Lockscreen.qml:263
291+#: qml/Components/Lockscreen.qml:271
132292msgid "OK"
133293msgstr "Aceutar"
134294
295+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
296+#, qt-format
297+msgid "%1:%2:%3"
298+msgstr ""
299+
300+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
301+#, qt-format
302+msgid "%1:%2"
303+msgstr ""
304+
135305#: qml/Components/ModeSwitchWarningDialog.qml:32
136306msgid "Apps may have unsaved data:"
137307msgstr "Apps que pueden tener datos sin guardar:"
@@ -140,7 +310,7 @@ msgstr "Apps que pueden tener datos sin guardar:"
140310msgctxt ""
141311"Re-dock means connect the device again to an external screen/mouse/keyboard"
142312msgid "Re-dock, save your work and close these apps to continue."
143−msgstr ""
313+msgstr "Reconeuta, guarda'l trabayu y zarra eses apps pa siguir."
144314
145315#: qml/Components/ModeSwitchWarningDialog.qml:63
146316msgid "Or force close now (unsaved data will be lost)."
@@ -158,57 +328,61 @@ msgstr "Reconeutar agora."
158328msgid "Close all"
159329msgstr "Zarrar too"
160330
161−#: qml/Dash/DashPageHeader.qml:337
331+#: qml/Components/SharingPicker.qml:54
332+msgid "Preview Share Item"
333+msgstr "Entever l'elementu compartíu"
334+
335+#: qml/Dash/DashPageHeader.qml:333
162336msgctxt "Button: Open the Ubuntu Store"
163337msgid "Store"
164338msgstr "Tienda"
165339
166−#: qml/Dash/DashPageHeader.qml:344
340+#: qml/Dash/DashPageHeader.qml:340
167341msgctxt "Button: Start a search in the current dash scope"
168342msgid "Search"
169343msgstr "Guetar"
170344
171−#: qml/Dash/DashPageHeader.qml:354
345+#: qml/Dash/DashPageHeader.qml:350
172346msgctxt "Button: Show the current dash scope settings"
173347msgid "Settings"
174348msgstr "Axustes"
175349
176−#: qml/Dash/DashPageHeader.qml:361
350+#: qml/Dash/DashPageHeader.qml:357
177351msgid "Remove from Favorites"
178352msgstr "Desaniciar de favoritos"
179353
180−#: qml/Dash/DashPageHeader.qml:361
354+#: qml/Dash/DashPageHeader.qml:357
181355msgid "Add to Favorites"
182356msgstr "Amestar a favoritos"
183357
184358#: qml/Dash/FiltersPopover.qml:60
185359msgid "Refine your results"
186−msgstr ""
360+msgstr "Refina los resultaos"
187361
188362#: qml/Dash/FiltersPopover.qml:69
189363msgid "Reset"
190−msgstr ""
364+msgstr "Reafitar"
191365
192−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
193−msgid "See less"
366+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
367+msgid "Show less"
194368msgstr "Ver menos"
195369
196−#: qml/Dash/GenericScopeView.qml:570
197−msgid "See all"
370+#: qml/Dash/GenericScopeView.qml:580
371+msgid "Show all"
198372msgstr "Ver too"
199373
200−#: qml/Dash/GenericScopeView.qml:627
374+#: qml/Dash/GenericScopeView.qml:637
201375msgctxt "Label: Hint for dash search line edit"
202376msgid "Search"
203377msgstr "Guetar"
204378
205−#: qml/Dash/PageHeaderExtraPanel.qml:55
379+#: qml/Dash/PageHeaderExtraPanel.qml:56
206380msgid "Recent Searches"
207−msgstr ""
381+msgstr "Guetes recién"
208382
209−#: qml/Dash/PageHeaderExtraPanel.qml:66
383+#: qml/Dash/PageHeaderExtraPanel.qml:67
210384msgid "Clear All"
211−msgstr ""
385+msgstr "Llimpiar too"
212386
213387#: qml/Dash/Previews/PreviewActionCombo.qml:35
214388msgid "More..."
@@ -219,22 +393,18 @@ msgid "Less..."
219393msgstr "Menos…"
220394
221395#: qml/Dash/Previews/PreviewCommentInput.qml:68
222−#: qml/Dash/Previews/PreviewRatingInput.qml:174
396+#: qml/Dash/Previews/PreviewRatingInput.qml:175
223397msgid "Send"
224398msgstr "Unviar"
225399
226−#: qml/Dash/Previews/PreviewRatingInput.qml:84
400+#: qml/Dash/Previews/PreviewRatingInput.qml:82
227401msgid "Rate this"
228402msgstr "Valorar esto"
229403
230−#: qml/Dash/Previews/PreviewRatingInput.qml:129
404+#: qml/Dash/Previews/PreviewRatingInput.qml:157
231405msgid "Add a review"
232406msgstr "Amestar una reseña"
233407
234−#: qml/Dash/Previews/PreviewSharing.qml:66
235−msgid "Preview Share Item"
236−msgstr "Entever l'elementu compartíu"
237−
238408#: qml/Dash/PullToRefreshScopeStyle.qml:55
239409msgid "Pull to refresh…"
240410msgstr "Tira p'anovar..."
@@ -247,49 +417,63 @@ msgstr "Sueltar p'anovar..."
247417msgid "Enable location data"
248418msgstr "Habilitar datos d'allugamientu"
249419
250−#: qml/Dash/ScopesList.qml:67
420+#: qml/Dash/ScopesList.qml:55
251421msgid "Manage"
252422msgstr "Xestionar"
253423
254−#: qml/Dash/ScopesList.qml:113
424+#: qml/Dash/ScopesList.qml:102
255425msgid "Home"
256426msgstr "Aniciu"
257427
258−#: qml/Dash/ScopesList.qml:114
428+#: qml/Dash/ScopesList.qml:103
259429msgid "Also installed"
260430msgstr "Tamién instalaos"
261431
262−#: qml/DisabledScreenNotice.qml:104
432+#: qml/DisabledScreenNotice.qml:109
263433msgid ""
264434"Your device is now connected to an external display. Use this screen as a "
265435"touch pad to interact with the pointer."
266436msgstr ""
437+"El preséu agora ta coneutáu con una pantalla esterna. Usa esta pantalla como "
438+"touch pad pa interactuar col punteru."
267439
268−#: qml/Greeter/CoverPage.qml:118
440+#: qml/Greeter/CoverPage.qml:127
269441msgid "Unlock"
270442msgstr "Desbloquiar"
271443
272−#: qml/Greeter/LoginList.qml:239
444+#: qml/Greeter/Greeter.qml:555
445+msgid "Try again"
446+msgstr ""
447+
448+#: qml/Greeter/LoginList.qml:63
449+msgid "Passphrase"
450+msgstr ""
451+
452+#: qml/Greeter/LoginList.qml:64
453+msgid "Passcode"
454+msgstr ""
455+
456+#: qml/Greeter/LoginList.qml:87
273457msgid "Retry"
274458msgstr "Reintentar"
275459
276−#: qml/Greeter/LoginList.qml:240
277−msgid "Tap to unlock"
278−msgstr "Calca pa desbloquiar"
460+#: qml/Greeter/LoginList.qml:88
461+msgid "Log In"
462+msgstr ""
279463
280−#: qml/Greeter/NarrowView.qml:54
464+#: qml/Greeter/NarrowView.qml:55
281465msgid "Sorry, incorrect passphrase."
282466msgstr "Perdón, fras de pasu incorreuta"
283467
284−#: qml/Greeter/NarrowView.qml:55
468+#: qml/Greeter/NarrowView.qml:56
285469msgid "Sorry, incorrect passcode."
286470msgstr "Perdón, códigu de pasu incorreutu."
287471
288−#: qml/Greeter/NarrowView.qml:56
472+#: qml/Greeter/NarrowView.qml:57
289473msgid "This will be your last attempt."
290474msgstr "Esti sedra'l to caberu intentu"
291475
292−#: qml/Greeter/NarrowView.qml:58
476+#: qml/Greeter/NarrowView.qml:59
293477msgid ""
294478"If passphrase is entered incorrectly, your phone will conduct a factory "
295479"reset and all personal data will be deleted."
@@ -297,7 +481,7 @@ msgstr ""
297481"Si s'inxerta la fras de pasu incorreutamente, el to teléfonu va reafitase y "
298482"van desaniciase tolos datos personales."
299483
300−#: qml/Greeter/NarrowView.qml:59
484+#: qml/Greeter/NarrowView.qml:60
301485msgid ""
302486"If passcode is entered incorrectly, your phone will conduct a factory reset "
303487"and all personal data will be deleted."
@@ -305,38 +489,38 @@ msgstr ""
305489"Si s'inxerta'l códigu de pasu incorreutamente, el to teléfonu va reafitase y "
306490"van desaniciase tolos datos personales."
307491
308−#: qml/Greeter/NarrowView.qml:116
492+#: qml/Greeter/NarrowView.qml:129
309493#, qt-format
310494msgid "Enter %1"
311495msgstr "Introduz %1"
312496
313−#: qml/Greeter/NarrowView.qml:117
497+#: qml/Greeter/NarrowView.qml:130
314498msgid "Enter passphrase"
315499msgstr "Introduz la fras de pasu"
316500
317−#: qml/Greeter/NarrowView.qml:118
501+#: qml/Greeter/NarrowView.qml:131
318502msgid "Enter passcode"
319503msgstr "Introduz el códigu de pasu"
320504
321−#: qml/Greeter/NarrowView.qml:119
505+#: qml/Greeter/NarrowView.qml:135
322506#, qt-format
323507msgid "Sorry, incorrect %1"
324508msgstr "Sentímoslo, %1 incorreutu"
325509
326−#: qml/Greeter/NarrowView.qml:120
510+#: qml/Greeter/NarrowView.qml:136
327511msgid "Sorry, incorrect passphrase"
328512msgstr "Sentímoslo, contraseña incorreuta"
329513
330−#: qml/Greeter/NarrowView.qml:121
514+#: qml/Greeter/NarrowView.qml:137
331515msgctxt "passphrase"
332516msgid "Please re-enter"
333517msgstr "Vuelve a escribila"
334518
335−#: qml/Greeter/NarrowView.qml:122
519+#: qml/Greeter/NarrowView.qml:138
336520msgid "Sorry, incorrect passcode"
337521msgstr "Sentímoslo, códigu de pasu incorreutu"
338522
339−#: qml/Notifications/NotificationMenuItemFactory.qml:129
523+#: qml/Notifications/NotificationMenuItemFactory.qml:124
340524msgid "Show password"
341525msgstr "Amosar contraseña"
342526
@@ -348,127 +532,103 @@ msgstr "Toca pa tornar a la llamada..."
348532msgid "Conference"
349533msgstr "Conferencia"
350534
351−#: qml/Panel/Indicators/MenuItemFactory.qml:761
535+#: qml/Panel/Indicators/MenuItemFactory.qml:762
352536msgid "Nothing is playing"
353537msgstr "Nun ta reproduciéndose nada"
354538
355−#: qml/Panel/Indicators/MenuItemFactory.qml:890
539+#: qml/Panel/Indicators/MenuItemFactory.qml:891
356540#, qt-format
357541msgid "%1 hour"
358542msgid_plural "%1 hours"
359543msgstr[0] "%1 hora"
360544msgstr[1] "%1 hores"
361545
362−#: qml/Panel/Indicators/MenuItemFactory.qml:894
546+#: qml/Panel/Indicators/MenuItemFactory.qml:895
363547#, qt-format
364548msgid "%1 minute"
365549msgid_plural "%1 minutes"
366550msgstr[0] "%1 minutu"
367551msgstr[1] "%1 minutos"
368552
369−#: qml/Panel/Indicators/MenuItemFactory.qml:899
553+#: qml/Panel/Indicators/MenuItemFactory.qml:900
370554#, qt-format
371555msgid "%1 second"
372556msgid_plural "%1 seconds"
373557msgstr[0] "%1 segundu"
374558msgstr[1] "%1 segundos"
375559
376−#: qml/Panel/Indicators/MenuItemFactory.qml:902
560+#: qml/Panel/Indicators/MenuItemFactory.qml:903
377561msgid "0 seconds"
378562msgstr "0 segundos"
379563
380564#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
381−#: qml/Panel/Indicators/MenuItemFactory.qml:904
565+#: qml/Panel/Indicators/MenuItemFactory.qml:905
382566#, qt-format
383567msgid "%1 remaining"
384568msgstr "Queden %1"
385569
386−#: qml/Panel/Indicators/MenuItemFactory.qml:910
570+#: qml/Panel/Indicators/MenuItemFactory.qml:911
387571msgid "In queue…"
388572msgstr "Na cola..."
389573
390−#: qml/Panel/Indicators/MenuItemFactory.qml:914
574+#: qml/Panel/Indicators/MenuItemFactory.qml:915
391575msgid "Downloading"
392576msgstr "Baxando"
393577
394−#: qml/Panel/Indicators/MenuItemFactory.qml:916
578+#: qml/Panel/Indicators/MenuItemFactory.qml:917
395579msgid "Paused, tap to resume"
396580msgstr "Posáu, toca pa reanudar"
397581
398−#: qml/Panel/Indicators/MenuItemFactory.qml:918
582+#: qml/Panel/Indicators/MenuItemFactory.qml:919
399583msgid "Canceled"
400584msgstr "Encaboxáu"
401585
402−#: qml/Panel/Indicators/MenuItemFactory.qml:920
586+#: qml/Panel/Indicators/MenuItemFactory.qml:921
403587msgid "Finished"
404588msgstr "Finó"
405589
406−#: qml/Panel/Indicators/MenuItemFactory.qml:922
590+#: qml/Panel/Indicators/MenuItemFactory.qml:923
407591msgid "Failed, tap to retry"
408592msgstr "Falló, toca pa reintentar"
409593
410−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
411−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
594+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
595+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
412596msgctxt "Button: Send a reply message"
413597msgid "Send"
414598msgstr "Unviar"
415599
416−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
600+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
417601msgctxt "Label: Hint in message indicator line edit"
418602msgid "Reply"
419603msgstr "Responder"
420604
421−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
605+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
422606msgctxt "Button: Call back on phone"
423607msgid "Call back"
424608msgstr "Devolver llamada"
425609
426610#: qml/Stages/SideStage.qml:76
427611msgid "Drag using 3 fingers any application from one window to the other"
428−msgstr ""
612+msgstr "Abasnar cualquier aplicación d'una ventana a otra usando 3 deos"
429613
430−#: qml/Tutorial/TutorialBottom.qml:78
431−msgid "Swipe up to add a contact"
432−msgstr ""
433−
434−#: qml/Tutorial/TutorialBottom.qml:80
435−msgid "Swipe up for favorite calculations"
436−msgstr ""
437−
438−#: qml/Tutorial/TutorialBottom.qml:82
439−msgid "Swipe up for recent calls"
440−msgstr ""
441−
442−#: qml/Tutorial/TutorialBottom.qml:84
443−msgid "Swipe up to create a message"
444−msgstr ""
445−
446−#: qml/Tutorial/TutorialBottom.qml:85
447−msgid "Swipe up to manage the app"
448−msgstr ""
449−
450−#: qml/Tutorial/TutorialLeft.qml:47
451−msgid "Swipe from the left edge to open the launcher"
452−msgstr ""
453−
454−#: qml/Tutorial/TutorialLeftLong.qml:47
614+#: qml/Tutorial/TutorialLeftLong.qml:49
455615msgid "Long swipe from the left edge to open the Today scope"
456−msgstr ""
616+msgstr "Eslizamientu llargu dende'l berbesu izquierdu pa ver el scope Güei"
457617
458−#: qml/Tutorial/TutorialRight.qml:54
459−msgid "Hover your mouse on the right edge to view your open apps"
618+#: qml/Tutorial/TutorialLeft.qml:47
619+msgid "Short swipe from the left edge to open the launcher"
460620msgstr ""
461621
462622#: qml/Tutorial/TutorialRight.qml:55
463−msgid "Short or long swipe from the right edge to view your open apps"
464−msgstr ""
623+msgid "Push your mouse against the right edge to view your open apps"
624+msgstr "Emburria'l mur escontra'l berbesu drechu pa ver les apps abiertes"
465625
466−#: qml/Tutorial/TutorialTop.qml:53
467−msgid "Swipe from the top right edge to open the notification bar"
626+#: qml/Tutorial/TutorialRight.qml:56
627+msgid "Swipe from the right edge to view your open apps"
468628msgstr ""
469629
470−#: qml/Tutorial/TutorialTop.qml:54
471−msgid "Swipe from the top edge to open the notification bar"
630+#: qml/Tutorial/TutorialTop.qml:53
631+msgid "Swipe from the top edge to access notifications and quick settings"
472632msgstr ""
473633
474634#: qml/Wizard/Page.qml:54
@@ -478,16 +638,16 @@ msgstr "Atrás"
478638
479639#: qml/Wizard/Pages/10-welcome.qml:27
480640msgid "Language"
481−msgstr ""
641+msgstr "Llingua"
482642
483−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
484−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
643+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
644+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
485645#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
486646#: qml/Wizard/Pages/75-report-check.qml:84
487−#: qml/Wizard/Pages/passcode-desktop.qml:124
647+#: qml/Wizard/Pages/passcode-desktop.qml:141
488648#: qml/Wizard/Pages/password-set.qml:141
489649msgid "Next"
490−msgstr ""
650+msgstr "Siguiente"
491651
492652#: qml/Wizard/Pages/30-wifi.qml:29
493653msgid "Connect to Wi‑Fi"
@@ -495,15 +655,15 @@ msgstr "Coneutase al WiFi"
495655
496656#: qml/Wizard/Pages/30-wifi.qml:130
497657msgid "Connected"
498−msgstr ""
658+msgstr "Coneutáu"
499659
500660#: qml/Wizard/Pages/30-wifi.qml:163
501661msgid "Available Wi-Fi networks"
502−msgstr ""
662+msgstr "Redes Wi-Fi disponibles"
503663
504664#: qml/Wizard/Pages/30-wifi.qml:164
505665msgid "No available Wi-Fi networks"
506−msgstr ""
666+msgstr "Nun hai redes Wi-Fi disponibles"
507667
508668#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
509669#: qml/Wizard/Pages/sim.qml:101
@@ -512,98 +672,102 @@ msgstr "Saltar"
512672
513673#: qml/Wizard/Pages/40-location.qml:27
514674msgid "Location Services"
515−msgstr ""
675+msgstr "Servicios d'allugamientu"
516676
517677#: qml/Wizard/Pages/40-location.qml:83
518678msgid ""
519679"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
520680"(recommended)"
521681msgstr ""
682+"Usar GPS, puntos Wi-Fi y redes móviles de mou anónimu pa detectar "
683+"l'allugamientu (recomendao)"
522684
523685#: qml/Wizard/Pages/40-location.qml:105
524686#, qt-format
525687msgid "By selecting this option you agree to the Nokia HERE %1."
526−msgstr ""
688+msgstr "Seleicionando esta opción aceutes los %1 de Nokia HERE."
527689
528690#: qml/Wizard/Pages/40-location.qml:106
529691msgctxt "part of: Nokia HERE terms and conditions"
530692msgid "terms and conditions"
531−msgstr ""
693+msgstr "términos y condiciones"
532694
533695#: qml/Wizard/Pages/40-location.qml:160
534696msgid "GPS only"
535−msgstr ""
697+msgstr "Sólo GPS"
536698
537699#: qml/Wizard/Pages/40-location.qml:214
538700msgid "Don't use my location"
539−msgstr ""
701+msgstr "Nun usar l'allugamientu"
540702
541703#: qml/Wizard/Pages/40-location.qml:260
542704msgid "You can change it later in System Settings."
543−msgstr ""
705+msgstr "Pues camudalo sero na Configuración del Sistema."
544706
545707#: qml/Wizard/Pages/50-timezone.qml:29
546708msgid "Time Zone"
547−msgstr ""
709+msgstr "Estaya horaria"
548710
549−#: qml/Wizard/Pages/50-timezone.qml:178
711+#: qml/Wizard/Pages/50-timezone.qml:181
550712msgid "Enter your city"
551−msgstr ""
713+msgstr "Escribe la ciudá"
552714
553715#: qml/Wizard/Pages/60-account.qml:24
554716msgid "Personalize Your Device"
555−msgstr ""
717+msgstr "Personaliza'l preséu"
556718
557719#: qml/Wizard/Pages/60-account.qml:48
558720msgid "Preferred Name"
559−msgstr ""
721+msgstr "Nome preferíu"
560722
561723#: qml/Wizard/Pages/70-passwd-type.qml:39
562724msgid "Lock Screen"
563−msgstr ""
725+msgstr "Bloquiar pantalla"
564726
565727#: qml/Wizard/Pages/70-passwd-type.qml:101
566728msgctxt "Label: Type of security method"
567729msgid "Create new password"
568−msgstr ""
730+msgstr "Crear contraseña nueva"
569731
570732#: qml/Wizard/Pages/70-passwd-type.qml:103
571733msgctxt "Label: Type of security method"
572734msgid "Create passcode (numbers only)"
573−msgstr ""
735+msgstr "Crear códigu d'accesu (sólo númberos)"
574736
575737#: qml/Wizard/Pages/70-passwd-type.qml:105
576738msgctxt "Label: Type of security method"
577739msgid "No lock code"
578−msgstr ""
740+msgstr "Ensin códigu de bloquéu"
579741
580742#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
581743msgid "Privacy Policy"
582−msgstr ""
744+msgstr "Política d'intimidá"
583745
584746#: qml/Wizard/Pages/75-report-check.qml:26
585747msgid "Help Us Improve"
586−msgstr ""
748+msgstr "Ayúdanos a meyorar"
587749
588750#: qml/Wizard/Pages/75-report-check.qml:59
589751msgid "Improve system performance by sending us crashes and error reports."
590752msgstr ""
753+"Ameyora'l rindimientu del sistema unviándonos los informes d'errores y "
754+"cuelgues."
591755
592756#: qml/Wizard/Pages/75-report-check.qml:60
593757msgid "Privacy policy"
594−msgstr ""
758+msgstr "Política d'intimidá"
595759
596760#: qml/Wizard/Pages/80-finished.qml:89
597761msgid "Welcome to Ubuntu"
598−msgstr ""
762+msgstr "Bienveníu/a a Ubuntu"
599763
600764#: qml/Wizard/Pages/80-finished.qml:104
601765msgid "You are ready to use your device now"
602−msgstr ""
766+msgstr "Ya tas preparáu pa usar el preséu"
603767
604768#: qml/Wizard/Pages/80-finished.qml:124
605769msgid "Get Started"
606−msgstr ""
770+msgstr "Primeros pasos"
607771
608772#: qml/Wizard/Pages/here-terms.qml:25
609773msgid "Terms & Conditions"
@@ -636,7 +800,7 @@ msgid "Service Terms"
636800msgstr ""
637801
638802#: qml/Wizard/Pages/passcode-confirm.qml:43
639−#: qml/Wizard/Pages/passcode-desktop.qml:80
803+#: qml/Wizard/Pages/passcode-desktop.qml:96
640804msgid "Confirm passcode"
641805msgstr "Confirmar códigu de pasu"
642806
@@ -653,24 +817,24 @@ msgstr ""
653817msgid "Lock Screen Passcode"
654818msgstr ""
655819
656−#: qml/Wizard/Pages/passcode-desktop.qml:56
820+#: qml/Wizard/Pages/passcode-desktop.qml:60
657821msgid "Enter 4 numbers to setup your passcode"
658822msgstr ""
659823
660−#: qml/Wizard/Pages/passcode-desktop.qml:65
824+#: qml/Wizard/Pages/passcode-desktop.qml:76
661825#: qml/Wizard/Pages/passcode-set.qml:54
662826msgid "Choose passcode"
663827msgstr ""
664828
665−#: qml/Wizard/Pages/passcode-desktop.qml:105
829+#: qml/Wizard/Pages/passcode-desktop.qml:126
666830msgid "Passcode too short"
667831msgstr ""
668832
669−#: qml/Wizard/Pages/passcode-desktop.qml:107
833+#: qml/Wizard/Pages/passcode-desktop.qml:128
670834msgid "Passcodes match"
671835msgstr ""
672836
673−#: qml/Wizard/Pages/passcode-desktop.qml:109
837+#: qml/Wizard/Pages/passcode-desktop.qml:130
674838msgid "Passcodes do not match"
675839msgstr ""
676840
@@ -692,7 +856,7 @@ msgstr ""
692856
693857#: qml/Wizard/Pages/password-set.qml:103
694858msgid "Confirm password"
695−msgstr ""
859+msgstr "Confirmar contraseña"
696860
697861#: qml/Wizard/Pages/sim.qml:27
698862msgid "No SIM card installed"
@@ -719,28 +883,32 @@ msgid "To proceed with no SIM tap Skip."
719883msgstr ""
720884
721885#: qml/Wizard/PasswordMeter.qml:87
722−msgid "Passwords match"
886+msgid "Password too short"
723887msgstr ""
724888
725889#: qml/Wizard/PasswordMeter.qml:89
726−msgid "Passwords do not match"
890+msgid "Passwords match"
727891msgstr ""
728892
729−#: qml/Wizard/PasswordMeter.qml:93
730−msgid "Strong password"
893+#: qml/Wizard/PasswordMeter.qml:91
894+msgid "Passwords do not match"
731895msgstr ""
732896
733897#: qml/Wizard/PasswordMeter.qml:95
734−msgid "Fair password"
735−msgstr ""
898+msgid "Strong password"
899+msgstr "Contraseña fuerte"
736900
737901#: qml/Wizard/PasswordMeter.qml:97
738−msgid "Weak password"
739−msgstr ""
902+msgid "Fair password"
903+msgstr "Contraseña aceutable"
740904
741905#: qml/Wizard/PasswordMeter.qml:99
906+msgid "Weak password"
907+msgstr "Contraseña feble"
908+
909+#: qml/Wizard/PasswordMeter.qml:101
742910msgid "Very weak password"
743−msgstr ""
911+msgstr "Contraseña feble enforma"
744912
745913#~ msgid "Skip intro"
746914#~ msgstr "Omitir la intro"
@@ -792,6 +960,9 @@ msgstr ""
792960#~ msgid "Search"
793961#~ msgstr "Guetar"
794962
963+#~ msgid "See less"
964+#~ msgstr "Ver menos"
965+
795966#~ msgid ""
796967#~ "You have now mastered the edge gestures and can start using the "
797968#~ "phone<br><br>Tap on the screen to start"
@@ -799,6 +970,9 @@ msgstr ""
799970#~ "Agora yá domines los xestos de los berbesos y pues entamar a usar el "
800971#~ "teléfonu<br><br>Toca la pantalla pa comenzar"
801972
973+#~ msgid "See all"
974+#~ msgstr "Ver too"
975+
802976#~ msgid "Power"
803977#~ msgstr "Enerxía"
804978
@@ -900,6 +1074,9 @@ msgstr ""
9001074#~ msgid "Reboot"
9011075#~ msgstr "Reaniciar"
9021076
1077+#~ msgid "Tap to unlock"
1078+#~ msgstr "Calca pa desbloquiar"
1079+
9031080#~ msgid "These are the shortcuts to favorite apps"
9041081#~ msgstr "Estos son los atayos a les aplicaciones favorites"
9051082
@@ -1057,11 +1234,31 @@ msgstr ""
10571234#~ msgid "Call back"
10581235#~ msgstr "Devolver llamada"
10591236
1060−#~ msgid "Your device is now ready to use."
1061−#~ msgstr "Agora'l to preséu ta preparáu pa usase."
1237+#~ msgid "Swipe up for recent calls"
1238+#~ msgstr "Eslizar pa llamaes recién"
1239+
1240+#~ msgid "Swipe up for favorite calculations"
1241+#~ msgstr "Eslizar pa los cálculos favoritos"
1242+
1243+#~ msgid "Swipe up to add a contact"
1244+#~ msgstr "Eslizar p'amestar un contactu"
1245+
1246+#~ msgid "Swipe from the left edge to open the launcher"
1247+#~ msgstr "Eslizar dende'l berbesu izquierdu p'abrir el llanzador"
1248+
1249+#~ msgid "Swipe from the top right edge to open the notification bar"
1250+#~ msgstr ""
1251+#~ "Esliza dende'l berbesu superior drechu p'abrir la barra de notificaciones"
1252+
1253+#~ msgid "Swipe from the top edge to open the notification bar"
1254+#~ msgstr "Esliza dende'l berbesu superior p'abrir la barra de notificaciones"
1255+
1256+#~ msgid "Short or long swipe from the right edge to view your open apps"
1257+#~ msgstr ""
1258+#~ "Eslizamientu curtiu o llargu dende'l berbesu drechu pa ver les apps abiertes"
10621259
1063−#~ msgid "Welcome to your Ubuntu device."
1064−#~ msgstr "Bienllegáu/ada al to preséu d'Ubuntu."
1260+#~ msgid "Swipe up to manage the app"
1261+#~ msgstr "Eslizar p'alministrar la app"
10651262
1066−#~ msgid "Please select how you’d like to unlock your device."
1067−#~ msgstr "Esbilla cómo te prestaría desbloquiar el to preséu, por favor."
1263+#~ msgid "Swipe up to create a message"
1264+#~ msgstr "Eslizar pa crear un mensaxe"
po/az.po+295−127
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
1111"PO-Revision-Date: 2014-09-03 16:39+0000\n"
1212"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,39 +15,39 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19+"X-Generator: Launchpad (build 18147)\n"
2020
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
2222msgid "Password: "
2323msgstr "Şifrә: "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
2727msgid "Pin shortcut"
2828msgstr "Pin qısayolu"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
3131msgid "Quit"
3232msgstr ""
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
3535msgid "Unpin shortcut"
3636msgstr "Açma qısayolu"
3737
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
3939msgid "Device Locked"
4040msgstr ""
4141
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
4343msgid "You have been locked out due to too many failed passphrase attempts."
4444msgstr ""
4545
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
4747msgid "You have been locked out due to too many failed passcode attempts."
4848msgstr ""
4949
50−#: qml/Components/DelayedLockscreen.qml:74
50+#: qml/Components/DelayedLockscreen.qml:75
5151#, qt-format
5252msgid "Please wait %1 minute and then try again…"
5353msgid_plural "Please wait %1 minutes and then try again…"
@@ -73,8 +73,8 @@ msgctxt "Button: Log out from the system"
7373msgid "Log Out"
7474msgstr ""
7575
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
77−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
7878#: qml/Wizard/Pages/passcode-set.qml:32
7979msgid "Cancel"
8080msgstr "İmtina"
@@ -92,43 +92,213 @@ msgstr "Yenidәn başlatmaq istәdiyinizә әminsiniz?"
9292msgid "No"
9393msgstr "Yox"
9494
95−#: qml/Components/Dialogs.qml:183
95+#: qml/Components/Dialogs.qml:182
9696msgid "Yes"
9797msgstr "Hə"
9898
99−#: qml/Components/Dialogs.qml:198
99+#: qml/Components/Dialogs.qml:197
100100msgctxt "Title: Power off/Restart dialog"
101101msgid "Power"
102102msgstr ""
103103
104−#: qml/Components/Dialogs.qml:199
104+#: qml/Components/Dialogs.qml:198
105105msgid ""
106106"Are you sure you would like\n"
107107"to power off?"
108108msgstr ""
109109
110−#: qml/Components/Dialogs.qml:201
110+#: qml/Components/Dialogs.qml:200
111111msgctxt "Button: Power off the system"
112112msgid "Power off"
113113msgstr ""
114114
115−#: qml/Components/Dialogs.qml:210
115+#: qml/Components/Dialogs.qml:209
116116msgctxt "Button: Restart the system"
117117msgid "Restart"
118118msgstr ""
119119
120−#: qml/Components/Lockscreen.qml:231
120+#: qml/Components/KeyboardShortcutsOverlay.qml:41
121+msgid "Keyboard Shortcuts"
122+msgstr ""
123+
124+#: qml/Components/KeyboardShortcutsOverlay.qml:55
125+msgid "Unity 8"
126+msgstr ""
127+
128+#: qml/Components/KeyboardShortcutsOverlay.qml:62
129+msgid "PrtScr"
130+msgstr ""
131+
132+#: qml/Components/KeyboardShortcutsOverlay.qml:67
133+msgid "Takes a screenshot."
134+msgstr ""
135+
136+#: qml/Components/KeyboardShortcutsOverlay.qml:75
137+msgid "Alt + PrtScr"
138+msgstr ""
139+
140+#: qml/Components/KeyboardShortcutsOverlay.qml:80
141+msgid "Takes a screenshot of a window."
142+msgstr ""
143+
144+#: qml/Components/KeyboardShortcutsOverlay.qml:88
145+msgid "Super + Space"
146+msgstr ""
147+
148+#: qml/Components/KeyboardShortcutsOverlay.qml:93
149+msgid "Switches to next keyboard layout."
150+msgstr ""
151+
152+#: qml/Components/KeyboardShortcutsOverlay.qml:101
153+msgid "Super + Shift + Space"
154+msgstr ""
155+
156+#: qml/Components/KeyboardShortcutsOverlay.qml:106
157+msgid "Switches to previous keyboard layout."
158+msgstr ""
159+
160+#: qml/Components/KeyboardShortcutsOverlay.qml:118
161+msgid "Launcher"
162+msgstr ""
163+
164+#: qml/Components/KeyboardShortcutsOverlay.qml:125
165+msgid "Super (Hold)"
166+msgstr ""
167+
168+#: qml/Components/KeyboardShortcutsOverlay.qml:130
169+msgid "Opens the launcher, displays shortcuts."
170+msgstr ""
171+
172+#: qml/Components/KeyboardShortcutsOverlay.qml:138
173+msgid "Alt + F1"
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:143
177+msgid "Opens launcher keyboard navigation mode."
178+msgstr ""
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:151
181+msgid "Super + Tab"
182+msgstr ""
183+
184+#: qml/Components/KeyboardShortcutsOverlay.qml:156
185+msgid "Switches applications via the launcher."
186+msgstr ""
187+
188+#: qml/Components/KeyboardShortcutsOverlay.qml:164
189+msgid "Super + 0 to 9"
190+msgstr ""
191+
192+#: qml/Components/KeyboardShortcutsOverlay.qml:169
193+msgid "Same as clicking on a launcher icon."
194+msgstr ""
195+
196+#: qml/Components/KeyboardShortcutsOverlay.qml:181
197+msgid "Scopes"
198+msgstr ""
199+
200+#: qml/Components/KeyboardShortcutsOverlay.qml:188
201+msgid "Super (Tap)"
202+msgstr ""
203+
204+#: qml/Components/KeyboardShortcutsOverlay.qml:193
205+msgid "Opens the Scopes home."
206+msgstr ""
207+
208+#: qml/Components/KeyboardShortcutsOverlay.qml:209
209+msgid "Switching"
210+msgstr ""
211+
212+#: qml/Components/KeyboardShortcutsOverlay.qml:216
213+msgid "Alt + Tab"
214+msgstr ""
215+
216+#: qml/Components/KeyboardShortcutsOverlay.qml:221
217+msgid "Switches between applications."
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:229
221+msgid "Super + W"
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:234
225+msgid "Opens the desktop spread."
226+msgstr ""
227+
228+#: qml/Components/KeyboardShortcutsOverlay.qml:242
229+msgid "Cursor Left or Right"
230+msgstr ""
231+
232+#: qml/Components/KeyboardShortcutsOverlay.qml:247
233+msgid "Moves the focus."
234+msgstr ""
235+
236+#: qml/Components/KeyboardShortcutsOverlay.qml:259
237+msgid "Windows"
238+msgstr ""
239+
240+#: qml/Components/KeyboardShortcutsOverlay.qml:266
241+msgid "Ctrl + Super + D"
242+msgstr ""
243+
244+#: qml/Components/KeyboardShortcutsOverlay.qml:271
245+msgid "Minimizes all windows."
246+msgstr ""
247+
248+#: qml/Components/KeyboardShortcutsOverlay.qml:279
249+msgid "Ctrl + Super + Up"
250+msgstr ""
251+
252+#: qml/Components/KeyboardShortcutsOverlay.qml:284
253+msgid "Maximizes the current window."
254+msgstr ""
255+
256+#: qml/Components/KeyboardShortcutsOverlay.qml:292
257+msgid "Ctrl + Super + Down"
258+msgstr ""
259+
260+#: qml/Components/KeyboardShortcutsOverlay.qml:297
261+msgid "Minimizes or restores the current window."
262+msgstr ""
263+
264+#: qml/Components/KeyboardShortcutsOverlay.qml:305
265+msgid "Ctrl + Super + Left or Right"
266+msgstr ""
267+
268+#: qml/Components/KeyboardShortcutsOverlay.qml:310
269+msgid "Semi-maximizes the current window."
270+msgstr ""
271+
272+#: qml/Components/KeyboardShortcutsOverlay.qml:318
273+msgid "Alt + F4"
274+msgstr ""
275+
276+#: qml/Components/KeyboardShortcutsOverlay.qml:323
277+msgid "Closes the current window."
278+msgstr ""
279+
280+#: qml/Components/Lockscreen.qml:239
121281msgid "Return to Call"
122282msgstr ""
123283
124−#: qml/Components/Lockscreen.qml:231
284+#: qml/Components/Lockscreen.qml:239
125285msgid "Emergency Call"
126286msgstr "Zərurət zəngi"
127287
128−#: qml/Components/Lockscreen.qml:263
288+#: qml/Components/Lockscreen.qml:271
129289msgid "OK"
130290msgstr "Oldu"
131291
292+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
293+#, qt-format
294+msgid "%1:%2:%3"
295+msgstr ""
296+
297+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
298+#, qt-format
299+msgid "%1:%2"
300+msgstr ""
301+
132302#: qml/Components/ModeSwitchWarningDialog.qml:32
133303msgid "Apps may have unsaved data:"
134304msgstr ""
@@ -155,26 +325,30 @@ msgstr ""
155325msgid "Close all"
156326msgstr ""
157327
158−#: qml/Dash/DashPageHeader.qml:337
328+#: qml/Components/SharingPicker.qml:54
329+msgid "Preview Share Item"
330+msgstr ""
331+
332+#: qml/Dash/DashPageHeader.qml:333
159333msgctxt "Button: Open the Ubuntu Store"
160334msgid "Store"
161335msgstr ""
162336
163−#: qml/Dash/DashPageHeader.qml:344
337+#: qml/Dash/DashPageHeader.qml:340
164338msgctxt "Button: Start a search in the current dash scope"
165339msgid "Search"
166340msgstr ""
167341
168−#: qml/Dash/DashPageHeader.qml:354
342+#: qml/Dash/DashPageHeader.qml:350
169343msgctxt "Button: Show the current dash scope settings"
170344msgid "Settings"
171345msgstr ""
172346
173−#: qml/Dash/DashPageHeader.qml:361
347+#: qml/Dash/DashPageHeader.qml:357
174348msgid "Remove from Favorites"
175349msgstr "Seçilmişlәrdәn çıxart"
176350
177−#: qml/Dash/DashPageHeader.qml:361
351+#: qml/Dash/DashPageHeader.qml:357
178352msgid "Add to Favorites"
179353msgstr "Seçilmişlәrә әlavә et"
180354
@@ -186,24 +360,24 @@ msgstr ""
186360msgid "Reset"
187361msgstr ""
188362
189−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190−msgid "See less"
191−msgstr "Daha azını gör"
363+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
364+msgid "Show less"
365+msgstr ""
192366
193−#: qml/Dash/GenericScopeView.qml:570
194−msgid "See all"
195−msgstr "Hamısını gör"
367+#: qml/Dash/GenericScopeView.qml:580
368+msgid "Show all"
369+msgstr ""
196370
197−#: qml/Dash/GenericScopeView.qml:627
371+#: qml/Dash/GenericScopeView.qml:637
198372msgctxt "Label: Hint for dash search line edit"
199373msgid "Search"
200374msgstr ""
201375
202−#: qml/Dash/PageHeaderExtraPanel.qml:55
376+#: qml/Dash/PageHeaderExtraPanel.qml:56
203377msgid "Recent Searches"
204378msgstr ""
205379
206−#: qml/Dash/PageHeaderExtraPanel.qml:66
380+#: qml/Dash/PageHeaderExtraPanel.qml:67
207381msgid "Clear All"
208382msgstr ""
209383
@@ -216,22 +390,18 @@ msgid "Less..."
216390msgstr "Az..."
217391
218392#: qml/Dash/Previews/PreviewCommentInput.qml:68
219−#: qml/Dash/Previews/PreviewRatingInput.qml:174
393+#: qml/Dash/Previews/PreviewRatingInput.qml:175
220394msgid "Send"
221395msgstr "Göndər"
222396
223−#: qml/Dash/Previews/PreviewRatingInput.qml:84
397+#: qml/Dash/Previews/PreviewRatingInput.qml:82
224398msgid "Rate this"
225399msgstr "Qiymәtlәndir"
226400
227−#: qml/Dash/Previews/PreviewRatingInput.qml:129
401+#: qml/Dash/Previews/PreviewRatingInput.qml:157
228402msgid "Add a review"
229403msgstr "Rəy yaz"
230404
231−#: qml/Dash/Previews/PreviewSharing.qml:66
232−msgid "Preview Share Item"
233−msgstr ""
234−
235405#: qml/Dash/PullToRefreshScopeStyle.qml:55
236406msgid "Pull to refresh…"
237407msgstr ""
@@ -244,49 +414,61 @@ msgstr ""
244414msgid "Enable location data"
245415msgstr ""
246416
247−#: qml/Dash/ScopesList.qml:67
417+#: qml/Dash/ScopesList.qml:55
248418msgid "Manage"
249419msgstr ""
250420
251−#: qml/Dash/ScopesList.qml:113
421+#: qml/Dash/ScopesList.qml:102
252422msgid "Home"
253423msgstr ""
254424
255−#: qml/Dash/ScopesList.qml:114
425+#: qml/Dash/ScopesList.qml:103
256426msgid "Also installed"
257427msgstr ""
258428
259−#: qml/DisabledScreenNotice.qml:104
429+#: qml/DisabledScreenNotice.qml:109
260430msgid ""
261431"Your device is now connected to an external display. Use this screen as a "
262432"touch pad to interact with the pointer."
263433msgstr ""
264434
265−#: qml/Greeter/CoverPage.qml:118
435+#: qml/Greeter/CoverPage.qml:127
266436msgid "Unlock"
267437msgstr ""
268438
269−#: qml/Greeter/LoginList.qml:239
439+#: qml/Greeter/Greeter.qml:555
440+msgid "Try again"
441+msgstr ""
442+
443+#: qml/Greeter/LoginList.qml:63
444+msgid "Passphrase"
445+msgstr ""
446+
447+#: qml/Greeter/LoginList.qml:64
448+msgid "Passcode"
449+msgstr ""
450+
451+#: qml/Greeter/LoginList.qml:87
270452msgid "Retry"
271453msgstr ""
272454
273−#: qml/Greeter/LoginList.qml:240
274−msgid "Tap to unlock"
455+#: qml/Greeter/LoginList.qml:88
456+msgid "Log In"
275457msgstr ""
276458
277−#: qml/Greeter/NarrowView.qml:54
459+#: qml/Greeter/NarrowView.qml:55
278460msgid "Sorry, incorrect passphrase."
279461msgstr "Bağışlayın, açar söz yanlışdır."
280462
281−#: qml/Greeter/NarrowView.qml:55
463+#: qml/Greeter/NarrowView.qml:56
282464msgid "Sorry, incorrect passcode."
283465msgstr "Təəssüf ki, açar kod yanlışdır."
284466
285−#: qml/Greeter/NarrowView.qml:56
467+#: qml/Greeter/NarrowView.qml:57
286468msgid "This will be your last attempt."
287469msgstr "Bu sizin son cəhdiniz olacaq."
288470
289−#: qml/Greeter/NarrowView.qml:58
471+#: qml/Greeter/NarrowView.qml:59
290472msgid ""
291473"If passphrase is entered incorrectly, your phone will conduct a factory "
292474"reset and all personal data will be deleted."
@@ -294,7 +476,7 @@ msgstr ""
294476"Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
295477"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
296478
297−#: qml/Greeter/NarrowView.qml:59
479+#: qml/Greeter/NarrowView.qml:60
298480msgid ""
299481"If passcode is entered incorrectly, your phone will conduct a factory reset "
300482"and all personal data will be deleted."
@@ -302,38 +484,38 @@ msgstr ""
302484"Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
303485"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
304486
305−#: qml/Greeter/NarrowView.qml:116
487+#: qml/Greeter/NarrowView.qml:129
306488#, qt-format
307489msgid "Enter %1"
308490msgstr ""
309491
310−#: qml/Greeter/NarrowView.qml:117
492+#: qml/Greeter/NarrowView.qml:130
311493msgid "Enter passphrase"
312494msgstr ""
313495
314−#: qml/Greeter/NarrowView.qml:118
496+#: qml/Greeter/NarrowView.qml:131
315497msgid "Enter passcode"
316498msgstr ""
317499
318−#: qml/Greeter/NarrowView.qml:119
500+#: qml/Greeter/NarrowView.qml:135
319501#, qt-format
320502msgid "Sorry, incorrect %1"
321503msgstr "Bağışlayın, %1 yanlışdır"
322504
323−#: qml/Greeter/NarrowView.qml:120
505+#: qml/Greeter/NarrowView.qml:136
324506msgid "Sorry, incorrect passphrase"
325507msgstr "Bağışlayın, açar söz yanlışdır"
326508
327−#: qml/Greeter/NarrowView.qml:121
509+#: qml/Greeter/NarrowView.qml:137
328510msgctxt "passphrase"
329511msgid "Please re-enter"
330512msgstr ""
331513
332−#: qml/Greeter/NarrowView.qml:122
514+#: qml/Greeter/NarrowView.qml:138
333515msgid "Sorry, incorrect passcode"
334516msgstr ""
335517
336−#: qml/Notifications/NotificationMenuItemFactory.qml:129
518+#: qml/Notifications/NotificationMenuItemFactory.qml:124
337519msgid "Show password"
338520msgstr "Şifrәni göstәr"
339521
@@ -345,77 +527,77 @@ msgstr "Zəngə qayıtmaq üçün toxunun..."
345527msgid "Conference"
346528msgstr "Konfrans"
347529
348−#: qml/Panel/Indicators/MenuItemFactory.qml:761
530+#: qml/Panel/Indicators/MenuItemFactory.qml:762
349531msgid "Nothing is playing"
350532msgstr ""
351533
352−#: qml/Panel/Indicators/MenuItemFactory.qml:890
534+#: qml/Panel/Indicators/MenuItemFactory.qml:891
353535#, qt-format
354536msgid "%1 hour"
355537msgid_plural "%1 hours"
356538msgstr[0] ""
357539msgstr[1] ""
358540
359−#: qml/Panel/Indicators/MenuItemFactory.qml:894
541+#: qml/Panel/Indicators/MenuItemFactory.qml:895
360542#, qt-format
361543msgid "%1 minute"
362544msgid_plural "%1 minutes"
363545msgstr[0] ""
364546msgstr[1] ""
365547
366−#: qml/Panel/Indicators/MenuItemFactory.qml:899
548+#: qml/Panel/Indicators/MenuItemFactory.qml:900
367549#, qt-format
368550msgid "%1 second"
369551msgid_plural "%1 seconds"
370552msgstr[0] ""
371553msgstr[1] ""
372554
373−#: qml/Panel/Indicators/MenuItemFactory.qml:902
555+#: qml/Panel/Indicators/MenuItemFactory.qml:903
374556msgid "0 seconds"
375557msgstr ""
376558
377559#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
378−#: qml/Panel/Indicators/MenuItemFactory.qml:904
560+#: qml/Panel/Indicators/MenuItemFactory.qml:905
379561#, qt-format
380562msgid "%1 remaining"
381563msgstr ""
382564
383−#: qml/Panel/Indicators/MenuItemFactory.qml:910
565+#: qml/Panel/Indicators/MenuItemFactory.qml:911
384566msgid "In queue…"
385567msgstr "Növbədədir..."
386568
387−#: qml/Panel/Indicators/MenuItemFactory.qml:914
569+#: qml/Panel/Indicators/MenuItemFactory.qml:915
388570msgid "Downloading"
389571msgstr "Endirilir"
390572
391−#: qml/Panel/Indicators/MenuItemFactory.qml:916
573+#: qml/Panel/Indicators/MenuItemFactory.qml:917
392574msgid "Paused, tap to resume"
393575msgstr "Dayandırıldı. Davam etmək üçün toxunun"
394576
395−#: qml/Panel/Indicators/MenuItemFactory.qml:918
577+#: qml/Panel/Indicators/MenuItemFactory.qml:919
396578msgid "Canceled"
397579msgstr "İmtina edildi"
398580
399−#: qml/Panel/Indicators/MenuItemFactory.qml:920
581+#: qml/Panel/Indicators/MenuItemFactory.qml:921
400582msgid "Finished"
401583msgstr "Bitdi"
402584
403−#: qml/Panel/Indicators/MenuItemFactory.qml:922
585+#: qml/Panel/Indicators/MenuItemFactory.qml:923
404586msgid "Failed, tap to retry"
405587msgstr "Alınmadı. Yenidәn cәhd etmək üçün toxunun"
406588
407−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
408−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
589+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
590+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
409591msgctxt "Button: Send a reply message"
410592msgid "Send"
411593msgstr ""
412594
413−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
595+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
414596msgctxt "Label: Hint in message indicator line edit"
415597msgid "Reply"
416598msgstr ""
417599
418−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
600+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
419601msgctxt "Button: Call back on phone"
420602msgid "Call back"
421603msgstr ""
@@ -424,48 +606,24 @@ msgstr ""
424606msgid "Drag using 3 fingers any application from one window to the other"
425607msgstr ""
426608
427−#: qml/Tutorial/TutorialBottom.qml:78
428−msgid "Swipe up to add a contact"
429−msgstr ""
430−
431−#: qml/Tutorial/TutorialBottom.qml:80
432−msgid "Swipe up for favorite calculations"
433−msgstr ""
434−
435−#: qml/Tutorial/TutorialBottom.qml:82
436−msgid "Swipe up for recent calls"
437−msgstr ""
438−
439−#: qml/Tutorial/TutorialBottom.qml:84
440−msgid "Swipe up to create a message"
441−msgstr ""
442−
443−#: qml/Tutorial/TutorialBottom.qml:85
444−msgid "Swipe up to manage the app"
445−msgstr ""
446−
447−#: qml/Tutorial/TutorialLeft.qml:47
448−msgid "Swipe from the left edge to open the launcher"
449−msgstr ""
450−
451−#: qml/Tutorial/TutorialLeftLong.qml:47
609+#: qml/Tutorial/TutorialLeftLong.qml:49
452610msgid "Long swipe from the left edge to open the Today scope"
453611msgstr ""
454612
455−#: qml/Tutorial/TutorialRight.qml:54
456−msgid "Hover your mouse on the right edge to view your open apps"
613+#: qml/Tutorial/TutorialLeft.qml:47
614+msgid "Short swipe from the left edge to open the launcher"
457615msgstr ""
458616
459617#: qml/Tutorial/TutorialRight.qml:55
460−msgid "Short or long swipe from the right edge to view your open apps"
618+msgid "Push your mouse against the right edge to view your open apps"
461619msgstr ""
462620
463−#: qml/Tutorial/TutorialTop.qml:53
464−msgid "Swipe from the top right edge to open the notification bar"
621+#: qml/Tutorial/TutorialRight.qml:56
622+msgid "Swipe from the right edge to view your open apps"
465623msgstr ""
466624
467−#: qml/Tutorial/TutorialTop.qml:54
468−msgid "Swipe from the top edge to open the notification bar"
625+#: qml/Tutorial/TutorialTop.qml:53
626+msgid "Swipe from the top edge to access notifications and quick settings"
469627msgstr ""
470628
471629#: qml/Wizard/Page.qml:54
@@ -477,11 +635,11 @@ msgstr ""
477635msgid "Language"
478636msgstr ""
479637
480−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
481−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
638+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
639+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
482640#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
483641#: qml/Wizard/Pages/75-report-check.qml:84
484−#: qml/Wizard/Pages/passcode-desktop.qml:124
642+#: qml/Wizard/Pages/passcode-desktop.qml:141
485643#: qml/Wizard/Pages/password-set.qml:141
486644msgid "Next"
487645msgstr ""
@@ -543,7 +701,7 @@ msgstr ""
543701msgid "Time Zone"
544702msgstr ""
545703
546−#: qml/Wizard/Pages/50-timezone.qml:178
704+#: qml/Wizard/Pages/50-timezone.qml:181
547705msgid "Enter your city"
548706msgstr ""
549707
@@ -633,7 +791,7 @@ msgid "Service Terms"
633791msgstr ""
634792
635793#: qml/Wizard/Pages/passcode-confirm.qml:43
636−#: qml/Wizard/Pages/passcode-desktop.qml:80
794+#: qml/Wizard/Pages/passcode-desktop.qml:96
637795msgid "Confirm passcode"
638796msgstr ""
639797
@@ -650,24 +808,24 @@ msgstr ""
650808msgid "Lock Screen Passcode"
651809msgstr ""
652810
653−#: qml/Wizard/Pages/passcode-desktop.qml:56
811+#: qml/Wizard/Pages/passcode-desktop.qml:60
654812msgid "Enter 4 numbers to setup your passcode"
655813msgstr ""
656814
657−#: qml/Wizard/Pages/passcode-desktop.qml:65
815+#: qml/Wizard/Pages/passcode-desktop.qml:76
658816#: qml/Wizard/Pages/passcode-set.qml:54
659817msgid "Choose passcode"
660818msgstr ""
661819
662−#: qml/Wizard/Pages/passcode-desktop.qml:105
820+#: qml/Wizard/Pages/passcode-desktop.qml:126
663821msgid "Passcode too short"
664822msgstr ""
665823
666−#: qml/Wizard/Pages/passcode-desktop.qml:107
824+#: qml/Wizard/Pages/passcode-desktop.qml:128
667825msgid "Passcodes match"
668826msgstr ""
669827
670−#: qml/Wizard/Pages/passcode-desktop.qml:109
828+#: qml/Wizard/Pages/passcode-desktop.qml:130
671829msgid "Passcodes do not match"
672830msgstr ""
673831
@@ -716,26 +874,30 @@ msgid "To proceed with no SIM tap Skip."
716874msgstr ""
717875
718876#: qml/Wizard/PasswordMeter.qml:87
719−msgid "Passwords match"
877+msgid "Password too short"
720878msgstr ""
721879
722880#: qml/Wizard/PasswordMeter.qml:89
881+msgid "Passwords match"
882+msgstr ""
883+
884+#: qml/Wizard/PasswordMeter.qml:91
723885msgid "Passwords do not match"
724886msgstr ""
725887
726−#: qml/Wizard/PasswordMeter.qml:93
888+#: qml/Wizard/PasswordMeter.qml:95
727889msgid "Strong password"
728890msgstr ""
729891
730−#: qml/Wizard/PasswordMeter.qml:95
892+#: qml/Wizard/PasswordMeter.qml:97
731893msgid "Fair password"
732894msgstr ""
733895
734−#: qml/Wizard/PasswordMeter.qml:97
896+#: qml/Wizard/PasswordMeter.qml:99
735897msgid "Weak password"
736898msgstr ""
737899
738−#: qml/Wizard/PasswordMeter.qml:99
900+#: qml/Wizard/PasswordMeter.qml:101
739901msgid "Very weak password"
740902msgstr ""
741903
@@ -776,6 +938,9 @@ msgstr ""
776938#~ msgid "Power off"
777939#~ msgstr "Söndür"
778940
941+#~ msgid "See all"
942+#~ msgstr "Hamısını gör"
943+
779944#~ msgid "All"
780945#~ msgstr "Hamısı"
781946
@@ -825,5 +990,8 @@ msgstr ""
825990#~ msgid "Settings"
826991#~ msgstr "Tənzimləmələr"
827992
993+#~ msgid "See less"
994+#~ msgstr "Daha azını gör"
995+
828996#~ msgid "Type or say a command"
829997#~ msgstr "Bir әmr söyləyin və ya yazın"
po/be.po+299−128
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
1111"PO-Revision-Date: 2015-12-13 13:12+0000\n"
1212"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
1313"Language-Team: Belarusian <be@li.org>\n"
@@ -16,42 +16,42 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
20+"X-Generator: Launchpad (build 18147)\n"
2121
22−#: plugins/IntegratedLightDM/Greeter.cpp:112
22+#: plugins/LightDM/Greeter.cpp:123
2323msgid "Password: "
2424msgstr "Пароль: "
2525
26−#: plugins/Unity/Launcher/launcheritem.cpp:48
27−#: plugins/Unity/Launcher/launcheritem.cpp:107
26+#: plugins/Unity/Launcher/launcheritem.cpp:49
27+#: plugins/Unity/Launcher/launcheritem.cpp:108
2828msgid "Pin shortcut"
2929msgstr "Замацаваць кнопку"
3030
31−#: plugins/Unity/Launcher/launcheritem.cpp:53
31+#: plugins/Unity/Launcher/launcheritem.cpp:54
3232msgid "Quit"
3333msgstr "Выйсці"
3434
35−#: plugins/Unity/Launcher/launcheritem.cpp:107
35+#: plugins/Unity/Launcher/launcheritem.cpp:108
3636msgid "Unpin shortcut"
3737msgstr "Адмацаваць кнопку"
3838
39−#: qml/Components/DelayedLockscreen.qml:49
39+#: qml/Components/DelayedLockscreen.qml:50
4040msgid "Device Locked"
4141msgstr "Прылада заблакаваная"
4242
43−#: qml/Components/DelayedLockscreen.qml:64
43+#: qml/Components/DelayedLockscreen.qml:65
4444msgid "You have been locked out due to too many failed passphrase attempts."
4545msgstr ""
4646"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў."
4747
48−#: qml/Components/DelayedLockscreen.qml:65
48+#: qml/Components/DelayedLockscreen.qml:66
4949msgid "You have been locked out due to too many failed passcode attempts."
5050msgstr ""
5151"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў уводу "
5252"кода доступу."
5353
54−#: qml/Components/DelayedLockscreen.qml:74
54+#: qml/Components/DelayedLockscreen.qml:75
5555#, qt-format
5656msgid "Please wait %1 minute and then try again…"
5757msgid_plural "Please wait %1 minutes and then try again…"
@@ -78,8 +78,8 @@ msgctxt "Button: Log out from the system"
7878msgid "Log Out"
7979msgstr "Выйсці"
8080
81−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
82−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
81+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
82+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
8383#: qml/Wizard/Pages/passcode-set.qml:32
8484msgid "Cancel"
8585msgstr "Скасаваць"
@@ -97,16 +97,16 @@ msgstr "Вы ўпэўнены, што жадаеце перазагрузіць?
9797msgid "No"
9898msgstr "Не"
9999
100−#: qml/Components/Dialogs.qml:183
100+#: qml/Components/Dialogs.qml:182
101101msgid "Yes"
102102msgstr "Так"
103103
104−#: qml/Components/Dialogs.qml:198
104+#: qml/Components/Dialogs.qml:197
105105msgctxt "Title: Power off/Restart dialog"
106106msgid "Power"
107107msgstr "Сілкаванне"
108108
109−#: qml/Components/Dialogs.qml:199
109+#: qml/Components/Dialogs.qml:198
110110msgid ""
111111"Are you sure you would like\n"
112112"to power off?"
@@ -114,28 +114,198 @@ msgstr ""
114114"Вы ўпэўнены, што хочаце\n"
115115"выключыць камп'ютэр?"
116116
117−#: qml/Components/Dialogs.qml:201
117+#: qml/Components/Dialogs.qml:200
118118msgctxt "Button: Power off the system"
119119msgid "Power off"
120120msgstr "Выключыць"
121121
122−#: qml/Components/Dialogs.qml:210
122+#: qml/Components/Dialogs.qml:209
123123msgctxt "Button: Restart the system"
124124msgid "Restart"
125125msgstr "Перазапуск"
126126
127−#: qml/Components/Lockscreen.qml:231
127+#: qml/Components/KeyboardShortcutsOverlay.qml:41
128+msgid "Keyboard Shortcuts"
129+msgstr ""
130+
131+#: qml/Components/KeyboardShortcutsOverlay.qml:55
132+msgid "Unity 8"
133+msgstr ""
134+
135+#: qml/Components/KeyboardShortcutsOverlay.qml:62
136+msgid "PrtScr"
137+msgstr ""
138+
139+#: qml/Components/KeyboardShortcutsOverlay.qml:67
140+msgid "Takes a screenshot."
141+msgstr ""
142+
143+#: qml/Components/KeyboardShortcutsOverlay.qml:75
144+msgid "Alt + PrtScr"
145+msgstr ""
146+
147+#: qml/Components/KeyboardShortcutsOverlay.qml:80
148+msgid "Takes a screenshot of a window."
149+msgstr ""
150+
151+#: qml/Components/KeyboardShortcutsOverlay.qml:88
152+msgid "Super + Space"
153+msgstr ""
154+
155+#: qml/Components/KeyboardShortcutsOverlay.qml:93
156+msgid "Switches to next keyboard layout."
157+msgstr ""
158+
159+#: qml/Components/KeyboardShortcutsOverlay.qml:101
160+msgid "Super + Shift + Space"
161+msgstr ""
162+
163+#: qml/Components/KeyboardShortcutsOverlay.qml:106
164+msgid "Switches to previous keyboard layout."
165+msgstr ""
166+
167+#: qml/Components/KeyboardShortcutsOverlay.qml:118
168+msgid "Launcher"
169+msgstr ""
170+
171+#: qml/Components/KeyboardShortcutsOverlay.qml:125
172+msgid "Super (Hold)"
173+msgstr ""
174+
175+#: qml/Components/KeyboardShortcutsOverlay.qml:130
176+msgid "Opens the launcher, displays shortcuts."
177+msgstr ""
178+
179+#: qml/Components/KeyboardShortcutsOverlay.qml:138
180+msgid "Alt + F1"
181+msgstr ""
182+
183+#: qml/Components/KeyboardShortcutsOverlay.qml:143
184+msgid "Opens launcher keyboard navigation mode."
185+msgstr ""
186+
187+#: qml/Components/KeyboardShortcutsOverlay.qml:151
188+msgid "Super + Tab"
189+msgstr ""
190+
191+#: qml/Components/KeyboardShortcutsOverlay.qml:156
192+msgid "Switches applications via the launcher."
193+msgstr ""
194+
195+#: qml/Components/KeyboardShortcutsOverlay.qml:164
196+msgid "Super + 0 to 9"
197+msgstr ""
198+
199+#: qml/Components/KeyboardShortcutsOverlay.qml:169
200+msgid "Same as clicking on a launcher icon."
201+msgstr ""
202+
203+#: qml/Components/KeyboardShortcutsOverlay.qml:181
204+msgid "Scopes"
205+msgstr ""
206+
207+#: qml/Components/KeyboardShortcutsOverlay.qml:188
208+msgid "Super (Tap)"
209+msgstr ""
210+
211+#: qml/Components/KeyboardShortcutsOverlay.qml:193
212+msgid "Opens the Scopes home."
213+msgstr ""
214+
215+#: qml/Components/KeyboardShortcutsOverlay.qml:209
216+msgid "Switching"
217+msgstr ""
218+
219+#: qml/Components/KeyboardShortcutsOverlay.qml:216
220+msgid "Alt + Tab"
221+msgstr ""
222+
223+#: qml/Components/KeyboardShortcutsOverlay.qml:221
224+msgid "Switches between applications."
225+msgstr ""
226+
227+#: qml/Components/KeyboardShortcutsOverlay.qml:229
228+msgid "Super + W"
229+msgstr ""
230+
231+#: qml/Components/KeyboardShortcutsOverlay.qml:234
232+msgid "Opens the desktop spread."
233+msgstr ""
234+
235+#: qml/Components/KeyboardShortcutsOverlay.qml:242
236+msgid "Cursor Left or Right"
237+msgstr ""
238+
239+#: qml/Components/KeyboardShortcutsOverlay.qml:247
240+msgid "Moves the focus."
241+msgstr ""
242+
243+#: qml/Components/KeyboardShortcutsOverlay.qml:259
244+msgid "Windows"
245+msgstr ""
246+
247+#: qml/Components/KeyboardShortcutsOverlay.qml:266
248+msgid "Ctrl + Super + D"
249+msgstr ""
250+
251+#: qml/Components/KeyboardShortcutsOverlay.qml:271
252+msgid "Minimizes all windows."
253+msgstr ""
254+
255+#: qml/Components/KeyboardShortcutsOverlay.qml:279
256+msgid "Ctrl + Super + Up"
257+msgstr ""
258+
259+#: qml/Components/KeyboardShortcutsOverlay.qml:284
260+msgid "Maximizes the current window."
261+msgstr ""
262+
263+#: qml/Components/KeyboardShortcutsOverlay.qml:292
264+msgid "Ctrl + Super + Down"
265+msgstr ""
266+
267+#: qml/Components/KeyboardShortcutsOverlay.qml:297
268+msgid "Minimizes or restores the current window."
269+msgstr ""
270+
271+#: qml/Components/KeyboardShortcutsOverlay.qml:305
272+msgid "Ctrl + Super + Left or Right"
273+msgstr ""
274+
275+#: qml/Components/KeyboardShortcutsOverlay.qml:310
276+msgid "Semi-maximizes the current window."
277+msgstr ""
278+
279+#: qml/Components/KeyboardShortcutsOverlay.qml:318
280+msgid "Alt + F4"
281+msgstr ""
282+
283+#: qml/Components/KeyboardShortcutsOverlay.qml:323
284+msgid "Closes the current window."
285+msgstr ""
286+
287+#: qml/Components/Lockscreen.qml:239
128288msgid "Return to Call"
129289msgstr "Вярнуцца да выкліку"
130290
131−#: qml/Components/Lockscreen.qml:231
291+#: qml/Components/Lockscreen.qml:239
132292msgid "Emergency Call"
133293msgstr "Терміновы выклік"
134294
135−#: qml/Components/Lockscreen.qml:263
295+#: qml/Components/Lockscreen.qml:271
136296msgid "OK"
137297msgstr "Добра"
138298
299+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
300+#, qt-format
301+msgid "%1:%2:%3"
302+msgstr ""
303+
304+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
305+#, qt-format
306+msgid "%1:%2"
307+msgstr ""
308+
139309#: qml/Components/ModeSwitchWarningDialog.qml:32
140310msgid "Apps may have unsaved data:"
141311msgstr "Прылады могуць мець незахованыя дадзеныя:"
@@ -162,26 +332,30 @@ msgstr "Перападлучыцца зараз!"
162332msgid "Close all"
163333msgstr "Зачыніць усё"
164334
165−#: qml/Dash/DashPageHeader.qml:337
335+#: qml/Components/SharingPicker.qml:54
336+msgid "Preview Share Item"
337+msgstr "Праглядзець элемент"
338+
339+#: qml/Dash/DashPageHeader.qml:333
166340msgctxt "Button: Open the Ubuntu Store"
167341msgid "Store"
168342msgstr "Крама"
169343
170−#: qml/Dash/DashPageHeader.qml:344
344+#: qml/Dash/DashPageHeader.qml:340
171345msgctxt "Button: Start a search in the current dash scope"
172346msgid "Search"
173347msgstr "Пошук"
174348
175−#: qml/Dash/DashPageHeader.qml:354
349+#: qml/Dash/DashPageHeader.qml:350
176350msgctxt "Button: Show the current dash scope settings"
177351msgid "Settings"
178352msgstr "Налады"
179353
180−#: qml/Dash/DashPageHeader.qml:361
354+#: qml/Dash/DashPageHeader.qml:357
181355msgid "Remove from Favorites"
182356msgstr "Выдаліць з абранага"
183357
184−#: qml/Dash/DashPageHeader.qml:361
358+#: qml/Dash/DashPageHeader.qml:357
185359msgid "Add to Favorites"
186360msgstr "Дадаць да абранага"
187361
@@ -193,24 +367,24 @@ msgstr ""
193367msgid "Reset"
194368msgstr ""
195369
196−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
197−msgid "See less"
198−msgstr "Карацей"
370+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
371+msgid "Show less"
372+msgstr ""
199373
200−#: qml/Dash/GenericScopeView.qml:570
201−msgid "See all"
202−msgstr "Больш падрабязна"
374+#: qml/Dash/GenericScopeView.qml:580
375+msgid "Show all"
376+msgstr ""
203377
204−#: qml/Dash/GenericScopeView.qml:627
378+#: qml/Dash/GenericScopeView.qml:637
205379msgctxt "Label: Hint for dash search line edit"
206380msgid "Search"
207381msgstr "Пошук"
208382
209−#: qml/Dash/PageHeaderExtraPanel.qml:55
383+#: qml/Dash/PageHeaderExtraPanel.qml:56
210384msgid "Recent Searches"
211385msgstr ""
212386
213−#: qml/Dash/PageHeaderExtraPanel.qml:66
387+#: qml/Dash/PageHeaderExtraPanel.qml:67
214388msgid "Clear All"
215389msgstr ""
216390
@@ -223,22 +397,18 @@ msgid "Less..."
223397msgstr "Менш..."
224398
225399#: qml/Dash/Previews/PreviewCommentInput.qml:68
226−#: qml/Dash/Previews/PreviewRatingInput.qml:174
400+#: qml/Dash/Previews/PreviewRatingInput.qml:175
227401msgid "Send"
228402msgstr "Адправіць"
229403
230−#: qml/Dash/Previews/PreviewRatingInput.qml:84
404+#: qml/Dash/Previews/PreviewRatingInput.qml:82
231405msgid "Rate this"
232406msgstr "Ацаніць"
233407
234−#: qml/Dash/Previews/PreviewRatingInput.qml:129
408+#: qml/Dash/Previews/PreviewRatingInput.qml:157
235409msgid "Add a review"
236410msgstr "Дадаць рэцэнзію"
237411
238−#: qml/Dash/Previews/PreviewSharing.qml:66
239−msgid "Preview Share Item"
240−msgstr "Праглядзець элемент"
241−
242412#: qml/Dash/PullToRefreshScopeStyle.qml:55
243413msgid "Pull to refresh…"
244414msgstr "Пацягніце для абнаўлення..."
@@ -251,49 +421,61 @@ msgstr "Адпусціце для абнаўлення..."
251421msgid "Enable location data"
252422msgstr "Уключыць дадзеныя аб месцазнаходжанні"
253423
254−#: qml/Dash/ScopesList.qml:67
424+#: qml/Dash/ScopesList.qml:55
255425msgid "Manage"
256426msgstr "Кіраванне"
257427
258−#: qml/Dash/ScopesList.qml:113
428+#: qml/Dash/ScopesList.qml:102
259429msgid "Home"
260430msgstr "Хатняя папка"
261431
262−#: qml/Dash/ScopesList.qml:114
432+#: qml/Dash/ScopesList.qml:103
263433msgid "Also installed"
264434msgstr "Таксама ўсталявана"
265435
266−#: qml/DisabledScreenNotice.qml:104
436+#: qml/DisabledScreenNotice.qml:109
267437msgid ""
268438"Your device is now connected to an external display. Use this screen as a "
269439"touch pad to interact with the pointer."
270440msgstr ""
271441
272−#: qml/Greeter/CoverPage.qml:118
442+#: qml/Greeter/CoverPage.qml:127
273443msgid "Unlock"
274444msgstr "Разблакаваць"
275445
276−#: qml/Greeter/LoginList.qml:239
446+#: qml/Greeter/Greeter.qml:555
447+msgid "Try again"
448+msgstr ""
449+
450+#: qml/Greeter/LoginList.qml:63
451+msgid "Passphrase"
452+msgstr ""
453+
454+#: qml/Greeter/LoginList.qml:64
455+msgid "Passcode"
456+msgstr ""
457+
458+#: qml/Greeter/LoginList.qml:87
277459msgid "Retry"
278460msgstr "Паспрабаваць зноў"
279461
280−#: qml/Greeter/LoginList.qml:240
281−msgid "Tap to unlock"
282−msgstr "Націсніце, каб разблакаваць"
462+#: qml/Greeter/LoginList.qml:88
463+msgid "Log In"
464+msgstr ""
283465
284−#: qml/Greeter/NarrowView.qml:54
466+#: qml/Greeter/NarrowView.qml:55
285467msgid "Sorry, incorrect passphrase."
286468msgstr "Даруйце, няслушны пароль."
287469
288−#: qml/Greeter/NarrowView.qml:55
470+#: qml/Greeter/NarrowView.qml:56
289471msgid "Sorry, incorrect passcode."
290472msgstr "Даруйце, няслушны код."
291473
292−#: qml/Greeter/NarrowView.qml:56
474+#: qml/Greeter/NarrowView.qml:57
293475msgid "This will be your last attempt."
294476msgstr "Апошняя спроба."
295477
296−#: qml/Greeter/NarrowView.qml:58
478+#: qml/Greeter/NarrowView.qml:59
297479msgid ""
298480"If passphrase is entered incorrectly, your phone will conduct a factory "
299481"reset and all personal data will be deleted."
@@ -301,7 +483,7 @@ msgstr ""
301483"Калі ўведзены пароль неправільны, Ваш тэлефон зробіць агульны скід налад і "
302484"ўсе асабістыя дадзеныя будуць выдалены."
303485
304−#: qml/Greeter/NarrowView.qml:59
486+#: qml/Greeter/NarrowView.qml:60
305487msgid ""
306488"If passcode is entered incorrectly, your phone will conduct a factory reset "
307489"and all personal data will be deleted."
@@ -309,38 +491,38 @@ msgstr ""
309491"Калі ўведзены код неправільны, Ваш тэлефон зробіць агульны скід налад і ўсе "
310492"асабістыя дадзеныя будуць выдалены."
311493
312−#: qml/Greeter/NarrowView.qml:116
494+#: qml/Greeter/NarrowView.qml:129
313495#, qt-format
314496msgid "Enter %1"
315497msgstr "Увядзіце %1"
316498
317−#: qml/Greeter/NarrowView.qml:117
499+#: qml/Greeter/NarrowView.qml:130
318500msgid "Enter passphrase"
319501msgstr "Увядзіце пароль"
320502
321−#: qml/Greeter/NarrowView.qml:118
503+#: qml/Greeter/NarrowView.qml:131
322504msgid "Enter passcode"
323505msgstr "Увядзіце код"
324506
325−#: qml/Greeter/NarrowView.qml:119
507+#: qml/Greeter/NarrowView.qml:135
326508#, qt-format
327509msgid "Sorry, incorrect %1"
328510msgstr "Даруйце, некарэктны %1"
329511
330−#: qml/Greeter/NarrowView.qml:120
512+#: qml/Greeter/NarrowView.qml:136
331513msgid "Sorry, incorrect passphrase"
332514msgstr "Даруйце, някарэктны пароль"
333515
334−#: qml/Greeter/NarrowView.qml:121
516+#: qml/Greeter/NarrowView.qml:137
335517msgctxt "passphrase"
336518msgid "Please re-enter"
337519msgstr "Калі ласка, паўтарыце ўвод"
338520
339−#: qml/Greeter/NarrowView.qml:122
521+#: qml/Greeter/NarrowView.qml:138
340522msgid "Sorry, incorrect passcode"
341523msgstr "Даруйце, некарэктны код"
342524
343−#: qml/Notifications/NotificationMenuItemFactory.qml:129
525+#: qml/Notifications/NotificationMenuItemFactory.qml:124
344526msgid "Show password"
345527msgstr "Паказаць пароль"
346528
@@ -352,11 +534,11 @@ msgstr "Націсніце, каб вярнуцца да выкліку..."
352534msgid "Conference"
353535msgstr "Канферэнцыя"
354536
355−#: qml/Panel/Indicators/MenuItemFactory.qml:761
537+#: qml/Panel/Indicators/MenuItemFactory.qml:762
356538msgid "Nothing is playing"
357539msgstr "Нічога не грае"
358540
359−#: qml/Panel/Indicators/MenuItemFactory.qml:890
541+#: qml/Panel/Indicators/MenuItemFactory.qml:891
360542#, qt-format
361543msgid "%1 hour"
362544msgid_plural "%1 hours"
@@ -364,7 +546,7 @@ msgstr[0] "%1 гадзіна"
364546msgstr[1] "%1 гадзіны"
365547msgstr[2] "%1 гадзінаў"
366548
367−#: qml/Panel/Indicators/MenuItemFactory.qml:894
549+#: qml/Panel/Indicators/MenuItemFactory.qml:895
368550#, qt-format
369551msgid "%1 minute"
370552msgid_plural "%1 minutes"
@@ -372,7 +554,7 @@ msgstr[0] "%1 хвіліна"
372554msgstr[1] "%1 хвіліны"
373555msgstr[2] "%1 хвілінаў"
374556
375−#: qml/Panel/Indicators/MenuItemFactory.qml:899
557+#: qml/Panel/Indicators/MenuItemFactory.qml:900
376558#, qt-format
377559msgid "%1 second"
378560msgid_plural "%1 seconds"
@@ -380,52 +562,52 @@ msgstr[0] "%1 секунда"
380562msgstr[1] "%1 секунды"
381563msgstr[2] "%1 секундаў"
382564
383−#: qml/Panel/Indicators/MenuItemFactory.qml:902
565+#: qml/Panel/Indicators/MenuItemFactory.qml:903
384566msgid "0 seconds"
385567msgstr "0 секунд"
386568
387569#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
388−#: qml/Panel/Indicators/MenuItemFactory.qml:904
570+#: qml/Panel/Indicators/MenuItemFactory.qml:905
389571#, qt-format
390572msgid "%1 remaining"
391573msgstr "%1 засталося"
392574
393−#: qml/Panel/Indicators/MenuItemFactory.qml:910
575+#: qml/Panel/Indicators/MenuItemFactory.qml:911
394576msgid "In queue…"
395577msgstr "У чарзе..."
396578
397−#: qml/Panel/Indicators/MenuItemFactory.qml:914
579+#: qml/Panel/Indicators/MenuItemFactory.qml:915
398580msgid "Downloading"
399581msgstr "Запампоўка"
400582
401−#: qml/Panel/Indicators/MenuItemFactory.qml:916
583+#: qml/Panel/Indicators/MenuItemFactory.qml:917
402584msgid "Paused, tap to resume"
403585msgstr "Прыпынена, націсніце для працягу"
404586
405−#: qml/Panel/Indicators/MenuItemFactory.qml:918
587+#: qml/Panel/Indicators/MenuItemFactory.qml:919
406588msgid "Canceled"
407589msgstr "Скасавана"
408590
409−#: qml/Panel/Indicators/MenuItemFactory.qml:920
591+#: qml/Panel/Indicators/MenuItemFactory.qml:921
410592msgid "Finished"
411593msgstr "Скончана"
412594
413−#: qml/Panel/Indicators/MenuItemFactory.qml:922
595+#: qml/Panel/Indicators/MenuItemFactory.qml:923
414596msgid "Failed, tap to retry"
415597msgstr "Не атрымалася, націсніце, каб паўтарыць спробу"
416598
417−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
418−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
599+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
600+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
419601msgctxt "Button: Send a reply message"
420602msgid "Send"
421603msgstr "Даслаць"
422604
423−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
605+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
424606msgctxt "Label: Hint in message indicator line edit"
425607msgid "Reply"
426608msgstr "Адказаць"
427609
428−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
610+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
429611msgctxt "Button: Call back on phone"
430612msgid "Call back"
431613msgstr "Патэлефанаваць"
@@ -434,48 +616,24 @@ msgstr "Патэлефанаваць"
434616msgid "Drag using 3 fingers any application from one window to the other"
435617msgstr ""
436618
437−#: qml/Tutorial/TutorialBottom.qml:78
438−msgid "Swipe up to add a contact"
439−msgstr ""
440−
441−#: qml/Tutorial/TutorialBottom.qml:80
442−msgid "Swipe up for favorite calculations"
443−msgstr ""
444−
445−#: qml/Tutorial/TutorialBottom.qml:82
446−msgid "Swipe up for recent calls"
447−msgstr ""
448−
449−#: qml/Tutorial/TutorialBottom.qml:84
450−msgid "Swipe up to create a message"
451−msgstr ""
452−
453−#: qml/Tutorial/TutorialBottom.qml:85
454−msgid "Swipe up to manage the app"
455−msgstr ""
456−
457−#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Swipe from the left edge to open the launcher"
459−msgstr ""
460−
461−#: qml/Tutorial/TutorialLeftLong.qml:47
619+#: qml/Tutorial/TutorialLeftLong.qml:49
462620msgid "Long swipe from the left edge to open the Today scope"
463621msgstr ""
464622
465−#: qml/Tutorial/TutorialRight.qml:54
466−msgid "Hover your mouse on the right edge to view your open apps"
623+#: qml/Tutorial/TutorialLeft.qml:47
624+msgid "Short swipe from the left edge to open the launcher"
467625msgstr ""
468626
469627#: qml/Tutorial/TutorialRight.qml:55
470−msgid "Short or long swipe from the right edge to view your open apps"
628+msgid "Push your mouse against the right edge to view your open apps"
471629msgstr ""
472630
473−#: qml/Tutorial/TutorialTop.qml:53
474−msgid "Swipe from the top right edge to open the notification bar"
631+#: qml/Tutorial/TutorialRight.qml:56
632+msgid "Swipe from the right edge to view your open apps"
475633msgstr ""
476634
477−#: qml/Tutorial/TutorialTop.qml:54
478−msgid "Swipe from the top edge to open the notification bar"
635+#: qml/Tutorial/TutorialTop.qml:53
636+msgid "Swipe from the top edge to access notifications and quick settings"
479637msgstr ""
480638
481639#: qml/Wizard/Page.qml:54
@@ -487,11 +645,11 @@ msgstr "Вярнуцца"
487645msgid "Language"
488646msgstr ""
489647
490−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
491−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
648+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
649+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
492650#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
493651#: qml/Wizard/Pages/75-report-check.qml:84
494−#: qml/Wizard/Pages/passcode-desktop.qml:124
652+#: qml/Wizard/Pages/passcode-desktop.qml:141
495653#: qml/Wizard/Pages/password-set.qml:141
496654msgid "Next"
497655msgstr ""
@@ -553,7 +711,7 @@ msgstr ""
553711msgid "Time Zone"
554712msgstr ""
555713
556−#: qml/Wizard/Pages/50-timezone.qml:178
714+#: qml/Wizard/Pages/50-timezone.qml:181
557715msgid "Enter your city"
558716msgstr ""
559717
@@ -643,7 +801,7 @@ msgid "Service Terms"
643801msgstr ""
644802
645803#: qml/Wizard/Pages/passcode-confirm.qml:43
646−#: qml/Wizard/Pages/passcode-desktop.qml:80
804+#: qml/Wizard/Pages/passcode-desktop.qml:96
647805msgid "Confirm passcode"
648806msgstr "Пацвердзіце код-пароль"
649807
@@ -660,24 +818,24 @@ msgstr ""
660818msgid "Lock Screen Passcode"
661819msgstr ""
662820
663−#: qml/Wizard/Pages/passcode-desktop.qml:56
821+#: qml/Wizard/Pages/passcode-desktop.qml:60
664822msgid "Enter 4 numbers to setup your passcode"
665823msgstr ""
666824
667−#: qml/Wizard/Pages/passcode-desktop.qml:65
825+#: qml/Wizard/Pages/passcode-desktop.qml:76
668826#: qml/Wizard/Pages/passcode-set.qml:54
669827msgid "Choose passcode"
670828msgstr ""
671829
672−#: qml/Wizard/Pages/passcode-desktop.qml:105
830+#: qml/Wizard/Pages/passcode-desktop.qml:126
673831msgid "Passcode too short"
674832msgstr ""
675833
676−#: qml/Wizard/Pages/passcode-desktop.qml:107
834+#: qml/Wizard/Pages/passcode-desktop.qml:128
677835msgid "Passcodes match"
678836msgstr ""
679837
680−#: qml/Wizard/Pages/passcode-desktop.qml:109
838+#: qml/Wizard/Pages/passcode-desktop.qml:130
681839msgid "Passcodes do not match"
682840msgstr ""
683841
@@ -726,26 +884,30 @@ msgid "To proceed with no SIM tap Skip."
726884msgstr ""
727885
728886#: qml/Wizard/PasswordMeter.qml:87
729−msgid "Passwords match"
887+msgid "Password too short"
730888msgstr ""
731889
732890#: qml/Wizard/PasswordMeter.qml:89
891+msgid "Passwords match"
892+msgstr ""
893+
894+#: qml/Wizard/PasswordMeter.qml:91
733895msgid "Passwords do not match"
734896msgstr ""
735897
736−#: qml/Wizard/PasswordMeter.qml:93
898+#: qml/Wizard/PasswordMeter.qml:95
737899msgid "Strong password"
738900msgstr ""
739901
740−#: qml/Wizard/PasswordMeter.qml:95
902+#: qml/Wizard/PasswordMeter.qml:97
741903msgid "Fair password"
742904msgstr ""
743905
744−#: qml/Wizard/PasswordMeter.qml:97
906+#: qml/Wizard/PasswordMeter.qml:99
745907msgid "Weak password"
746908msgstr ""
747909
748−#: qml/Wizard/PasswordMeter.qml:99
910+#: qml/Wizard/PasswordMeter.qml:101
749911msgid "Very weak password"
750912msgstr ""
751913
@@ -817,6 +979,12 @@ msgstr ""
817979#~ msgid "Skip intro"
818980#~ msgstr "Прапусціць уводзіны"
819981
982+#~ msgid "See all"
983+#~ msgstr "Больш падрабязна"
984+
985+#~ msgid "See less"
986+#~ msgstr "Карацей"
987+
820988#~ msgid "Store"
821989#~ msgstr "Крама"
822990
@@ -951,6 +1119,9 @@ msgstr ""
9511119#~ msgid "Reboot"
9521120#~ msgstr "Перазагрузіць"
9531121
1122+#~ msgid "Tap to unlock"
1123+#~ msgstr "Націсніце, каб разблакаваць"
1124+
9541125#~ msgid "Swipe up from the bottom edge."
9551126#~ msgstr "Правесці уверх ад ніжняга краю."
9561127
po/bg.po+287−125
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
1111"PO-Revision-Date: 2015-04-12 14:43+0000\n"
1212"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
1313"Language-Team: Bulgarian <bg@li.org>\n"
@@ -15,39 +15,39 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19+"X-Generator: Launchpad (build 18147)\n"
2020
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
2222msgid "Password: "
2323msgstr ""
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
2727msgid "Pin shortcut"
2828msgstr ""
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
3131msgid "Quit"
3232msgstr ""
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
3535msgid "Unpin shortcut"
3636msgstr ""
3737
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
3939msgid "Device Locked"
4040msgstr ""
4141
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
4343msgid "You have been locked out due to too many failed passphrase attempts."
4444msgstr ""
4545
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
4747msgid "You have been locked out due to too many failed passcode attempts."
4848msgstr ""
4949
50−#: qml/Components/DelayedLockscreen.qml:74
50+#: qml/Components/DelayedLockscreen.qml:75
5151#, qt-format
5252msgid "Please wait %1 minute and then try again…"
5353msgid_plural "Please wait %1 minutes and then try again…"
@@ -73,8 +73,8 @@ msgctxt "Button: Log out from the system"
7373msgid "Log Out"
7474msgstr ""
7575
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
77−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
7878#: qml/Wizard/Pages/passcode-set.qml:32
7979msgid "Cancel"
8080msgstr ""
@@ -92,16 +92,16 @@ msgstr ""
9292msgid "No"
9393msgstr ""
9494
95−#: qml/Components/Dialogs.qml:183
95+#: qml/Components/Dialogs.qml:182
9696msgid "Yes"
9797msgstr ""
9898
99−#: qml/Components/Dialogs.qml:198
99+#: qml/Components/Dialogs.qml:197
100100msgctxt "Title: Power off/Restart dialog"
101101msgid "Power"
102102msgstr ""
103103
104−#: qml/Components/Dialogs.qml:199
104+#: qml/Components/Dialogs.qml:198
105105msgid ""
106106"Are you sure you would like\n"
107107"to power off?"
@@ -109,28 +109,198 @@ msgstr ""
109109"Искате ли да \n"
110110"изключите захранването на устройството?"
111111
112−#: qml/Components/Dialogs.qml:201
112+#: qml/Components/Dialogs.qml:200
113113msgctxt "Button: Power off the system"
114114msgid "Power off"
115115msgstr ""
116116
117−#: qml/Components/Dialogs.qml:210
117+#: qml/Components/Dialogs.qml:209
118118msgctxt "Button: Restart the system"
119119msgid "Restart"
120120msgstr ""
121121
122−#: qml/Components/Lockscreen.qml:231
122+#: qml/Components/KeyboardShortcutsOverlay.qml:41
123+msgid "Keyboard Shortcuts"
124+msgstr ""
125+
126+#: qml/Components/KeyboardShortcutsOverlay.qml:55
127+msgid "Unity 8"
128+msgstr ""
129+
130+#: qml/Components/KeyboardShortcutsOverlay.qml:62
131+msgid "PrtScr"
132+msgstr ""
133+
134+#: qml/Components/KeyboardShortcutsOverlay.qml:67
135+msgid "Takes a screenshot."
136+msgstr ""
137+
138+#: qml/Components/KeyboardShortcutsOverlay.qml:75
139+msgid "Alt + PrtScr"
140+msgstr ""
141+
142+#: qml/Components/KeyboardShortcutsOverlay.qml:80
143+msgid "Takes a screenshot of a window."
144+msgstr ""
145+
146+#: qml/Components/KeyboardShortcutsOverlay.qml:88
147+msgid "Super + Space"
148+msgstr ""
149+
150+#: qml/Components/KeyboardShortcutsOverlay.qml:93
151+msgid "Switches to next keyboard layout."
152+msgstr ""
153+
154+#: qml/Components/KeyboardShortcutsOverlay.qml:101
155+msgid "Super + Shift + Space"
156+msgstr ""
157+
158+#: qml/Components/KeyboardShortcutsOverlay.qml:106
159+msgid "Switches to previous keyboard layout."
160+msgstr ""
161+
162+#: qml/Components/KeyboardShortcutsOverlay.qml:118
163+msgid "Launcher"
164+msgstr ""
165+
166+#: qml/Components/KeyboardShortcutsOverlay.qml:125
167+msgid "Super (Hold)"
168+msgstr ""
169+
170+#: qml/Components/KeyboardShortcutsOverlay.qml:130
171+msgid "Opens the launcher, displays shortcuts."
172+msgstr ""
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:138
175+msgid "Alt + F1"
176+msgstr ""
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:143
179+msgid "Opens launcher keyboard navigation mode."
180+msgstr ""
181+
182+#: qml/Components/KeyboardShortcutsOverlay.qml:151
183+msgid "Super + Tab"
184+msgstr ""
185+
186+#: qml/Components/KeyboardShortcutsOverlay.qml:156
187+msgid "Switches applications via the launcher."
188+msgstr ""
189+
190+#: qml/Components/KeyboardShortcutsOverlay.qml:164
191+msgid "Super + 0 to 9"
192+msgstr ""
193+
194+#: qml/Components/KeyboardShortcutsOverlay.qml:169
195+msgid "Same as clicking on a launcher icon."
196+msgstr ""
197+
198+#: qml/Components/KeyboardShortcutsOverlay.qml:181
199+msgid "Scopes"
200+msgstr ""
201+
202+#: qml/Components/KeyboardShortcutsOverlay.qml:188
203+msgid "Super (Tap)"
204+msgstr ""
205+
206+#: qml/Components/KeyboardShortcutsOverlay.qml:193
207+msgid "Opens the Scopes home."
208+msgstr ""
209+
210+#: qml/Components/KeyboardShortcutsOverlay.qml:209
211+msgid "Switching"
212+msgstr ""
213+
214+#: qml/Components/KeyboardShortcutsOverlay.qml:216
215+msgid "Alt + Tab"
216+msgstr ""
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:221
219+msgid "Switches between applications."
220+msgstr ""
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:229
223+msgid "Super + W"
224+msgstr ""
225+
226+#: qml/Components/KeyboardShortcutsOverlay.qml:234
227+msgid "Opens the desktop spread."
228+msgstr ""
229+
230+#: qml/Components/KeyboardShortcutsOverlay.qml:242
231+msgid "Cursor Left or Right"
232+msgstr ""
233+
234+#: qml/Components/KeyboardShortcutsOverlay.qml:247
235+msgid "Moves the focus."
236+msgstr ""
237+
238+#: qml/Components/KeyboardShortcutsOverlay.qml:259
239+msgid "Windows"
240+msgstr ""
241+
242+#: qml/Components/KeyboardShortcutsOverlay.qml:266
243+msgid "Ctrl + Super + D"
244+msgstr ""
245+
246+#: qml/Components/KeyboardShortcutsOverlay.qml:271
247+msgid "Minimizes all windows."
248+msgstr ""
249+
250+#: qml/Components/KeyboardShortcutsOverlay.qml:279
251+msgid "Ctrl + Super + Up"
252+msgstr ""
253+
254+#: qml/Components/KeyboardShortcutsOverlay.qml:284
255+msgid "Maximizes the current window."
256+msgstr ""
257+
258+#: qml/Components/KeyboardShortcutsOverlay.qml:292
259+msgid "Ctrl + Super + Down"
260+msgstr ""
261+
262+#: qml/Components/KeyboardShortcutsOverlay.qml:297
263+msgid "Minimizes or restores the current window."
264+msgstr ""
265+
266+#: qml/Components/KeyboardShortcutsOverlay.qml:305
267+msgid "Ctrl + Super + Left or Right"
268+msgstr ""
269+
270+#: qml/Components/KeyboardShortcutsOverlay.qml:310
271+msgid "Semi-maximizes the current window."
272+msgstr ""
273+
274+#: qml/Components/KeyboardShortcutsOverlay.qml:318
275+msgid "Alt + F4"
276+msgstr ""
277+
278+#: qml/Components/KeyboardShortcutsOverlay.qml:323
279+msgid "Closes the current window."
280+msgstr ""
281+
282+#: qml/Components/Lockscreen.qml:239
123283msgid "Return to Call"
124284msgstr ""
125285
126−#: qml/Components/Lockscreen.qml:231
286+#: qml/Components/Lockscreen.qml:239
127287msgid "Emergency Call"
128288msgstr "Спешно повикване"
129289
130−#: qml/Components/Lockscreen.qml:263
290+#: qml/Components/Lockscreen.qml:271
131291msgid "OK"
132292msgstr ""
133293
294+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
295+#, qt-format
296+msgid "%1:%2:%3"
297+msgstr ""
298+
299+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
300+#, qt-format
301+msgid "%1:%2"
302+msgstr ""
303+
134304#: qml/Components/ModeSwitchWarningDialog.qml:32
135305msgid "Apps may have unsaved data:"
136306msgstr ""
@@ -157,26 +327,30 @@ msgstr ""
157327msgid "Close all"
158328msgstr ""
159329
160−#: qml/Dash/DashPageHeader.qml:337
330+#: qml/Components/SharingPicker.qml:54
331+msgid "Preview Share Item"
332+msgstr ""
333+
334+#: qml/Dash/DashPageHeader.qml:333
161335msgctxt "Button: Open the Ubuntu Store"
162336msgid "Store"
163337msgstr ""
164338
165−#: qml/Dash/DashPageHeader.qml:344
339+#: qml/Dash/DashPageHeader.qml:340
166340msgctxt "Button: Start a search in the current dash scope"
167341msgid "Search"
168342msgstr ""
169343
170−#: qml/Dash/DashPageHeader.qml:354
344+#: qml/Dash/DashPageHeader.qml:350
171345msgctxt "Button: Show the current dash scope settings"
172346msgid "Settings"
173347msgstr ""
174348
175−#: qml/Dash/DashPageHeader.qml:361
349+#: qml/Dash/DashPageHeader.qml:357
176350msgid "Remove from Favorites"
177351msgstr ""
178352
179−#: qml/Dash/DashPageHeader.qml:361
353+#: qml/Dash/DashPageHeader.qml:357
180354msgid "Add to Favorites"
181355msgstr ""
182356
@@ -188,24 +362,24 @@ msgstr ""
188362msgid "Reset"
189363msgstr ""
190364
191−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192−msgid "See less"
365+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
366+msgid "Show less"
193367msgstr ""
194368
195−#: qml/Dash/GenericScopeView.qml:570
196−msgid "See all"
369+#: qml/Dash/GenericScopeView.qml:580
370+msgid "Show all"
197371msgstr ""
198372
199−#: qml/Dash/GenericScopeView.qml:627
373+#: qml/Dash/GenericScopeView.qml:637
200374msgctxt "Label: Hint for dash search line edit"
201375msgid "Search"
202376msgstr ""
203377
204−#: qml/Dash/PageHeaderExtraPanel.qml:55
378+#: qml/Dash/PageHeaderExtraPanel.qml:56
205379msgid "Recent Searches"
206380msgstr ""
207381
208−#: qml/Dash/PageHeaderExtraPanel.qml:66
382+#: qml/Dash/PageHeaderExtraPanel.qml:67
209383msgid "Clear All"
210384msgstr ""
211385
@@ -218,22 +392,18 @@ msgid "Less..."
218392msgstr "По-малко..."
219393
220394#: qml/Dash/Previews/PreviewCommentInput.qml:68
221−#: qml/Dash/Previews/PreviewRatingInput.qml:174
395+#: qml/Dash/Previews/PreviewRatingInput.qml:175
222396msgid "Send"
223397msgstr "Изпрати"
224398
225−#: qml/Dash/Previews/PreviewRatingInput.qml:84
399+#: qml/Dash/Previews/PreviewRatingInput.qml:82
226400msgid "Rate this"
227401msgstr "Оценете това"
228402
229−#: qml/Dash/Previews/PreviewRatingInput.qml:129
403+#: qml/Dash/Previews/PreviewRatingInput.qml:157
230404msgid "Add a review"
231405msgstr "Добави отзив"
232406
233−#: qml/Dash/Previews/PreviewSharing.qml:66
234−msgid "Preview Share Item"
235−msgstr ""
236−
237407#: qml/Dash/PullToRefreshScopeStyle.qml:55
238408msgid "Pull to refresh…"
239409msgstr ""
@@ -246,92 +416,104 @@ msgstr ""
246416msgid "Enable location data"
247417msgstr ""
248418
249−#: qml/Dash/ScopesList.qml:67
419+#: qml/Dash/ScopesList.qml:55
250420msgid "Manage"
251421msgstr ""
252422
253−#: qml/Dash/ScopesList.qml:113
423+#: qml/Dash/ScopesList.qml:102
254424msgid "Home"
255425msgstr ""
256426
257−#: qml/Dash/ScopesList.qml:114
427+#: qml/Dash/ScopesList.qml:103
258428msgid "Also installed"
259429msgstr ""
260430
261−#: qml/DisabledScreenNotice.qml:104
431+#: qml/DisabledScreenNotice.qml:109
262432msgid ""
263433"Your device is now connected to an external display. Use this screen as a "
264434"touch pad to interact with the pointer."
265435msgstr ""
266436
267−#: qml/Greeter/CoverPage.qml:118
437+#: qml/Greeter/CoverPage.qml:127
268438msgid "Unlock"
269439msgstr ""
270440
271−#: qml/Greeter/LoginList.qml:239
441+#: qml/Greeter/Greeter.qml:555
442+msgid "Try again"
443+msgstr ""
444+
445+#: qml/Greeter/LoginList.qml:63
446+msgid "Passphrase"
447+msgstr ""
448+
449+#: qml/Greeter/LoginList.qml:64
450+msgid "Passcode"
451+msgstr ""
452+
453+#: qml/Greeter/LoginList.qml:87
272454msgid "Retry"
273455msgstr ""
274456
275−#: qml/Greeter/LoginList.qml:240
276−msgid "Tap to unlock"
457+#: qml/Greeter/LoginList.qml:88
458+msgid "Log In"
277459msgstr ""
278460
279−#: qml/Greeter/NarrowView.qml:54
461+#: qml/Greeter/NarrowView.qml:55
280462msgid "Sorry, incorrect passphrase."
281463msgstr ""
282464
283−#: qml/Greeter/NarrowView.qml:55
465+#: qml/Greeter/NarrowView.qml:56
284466msgid "Sorry, incorrect passcode."
285467msgstr ""
286468
287−#: qml/Greeter/NarrowView.qml:56
469+#: qml/Greeter/NarrowView.qml:57
288470msgid "This will be your last attempt."
289471msgstr ""
290472
291−#: qml/Greeter/NarrowView.qml:58
473+#: qml/Greeter/NarrowView.qml:59
292474msgid ""
293475"If passphrase is entered incorrectly, your phone will conduct a factory "
294476"reset and all personal data will be deleted."
295477msgstr ""
296478
297−#: qml/Greeter/NarrowView.qml:59
479+#: qml/Greeter/NarrowView.qml:60
298480msgid ""
299481"If passcode is entered incorrectly, your phone will conduct a factory reset "
300482"and all personal data will be deleted."
301483msgstr ""
302484
303−#: qml/Greeter/NarrowView.qml:116
485+#: qml/Greeter/NarrowView.qml:129
304486#, qt-format
305487msgid "Enter %1"
306488msgstr ""
307489
308−#: qml/Greeter/NarrowView.qml:117
490+#: qml/Greeter/NarrowView.qml:130
309491msgid "Enter passphrase"
310492msgstr ""
311493
312−#: qml/Greeter/NarrowView.qml:118
494+#: qml/Greeter/NarrowView.qml:131
313495msgid "Enter passcode"
314496msgstr ""
315497
316−#: qml/Greeter/NarrowView.qml:119
498+#: qml/Greeter/NarrowView.qml:135
317499#, qt-format
318500msgid "Sorry, incorrect %1"
319501msgstr ""
320502
321−#: qml/Greeter/NarrowView.qml:120
503+#: qml/Greeter/NarrowView.qml:136
322504msgid "Sorry, incorrect passphrase"
323505msgstr ""
324506
325−#: qml/Greeter/NarrowView.qml:121
507+#: qml/Greeter/NarrowView.qml:137
326508msgctxt "passphrase"
327509msgid "Please re-enter"
328510msgstr ""
329511
330−#: qml/Greeter/NarrowView.qml:122
512+#: qml/Greeter/NarrowView.qml:138
331513msgid "Sorry, incorrect passcode"
332514msgstr ""
333515
334−#: qml/Notifications/NotificationMenuItemFactory.qml:129
516+#: qml/Notifications/NotificationMenuItemFactory.qml:124
335517msgid "Show password"
336518msgstr "Покажи паролата"
337519
@@ -343,77 +525,77 @@ msgstr ""
343525msgid "Conference"
344526msgstr ""
345527
346−#: qml/Panel/Indicators/MenuItemFactory.qml:761
528+#: qml/Panel/Indicators/MenuItemFactory.qml:762
347529msgid "Nothing is playing"
348530msgstr ""
349531
350−#: qml/Panel/Indicators/MenuItemFactory.qml:890
532+#: qml/Panel/Indicators/MenuItemFactory.qml:891
351533#, qt-format
352534msgid "%1 hour"
353535msgid_plural "%1 hours"
354536msgstr[0] ""
355537msgstr[1] ""
356538
357−#: qml/Panel/Indicators/MenuItemFactory.qml:894
539+#: qml/Panel/Indicators/MenuItemFactory.qml:895
358540#, qt-format
359541msgid "%1 minute"
360542msgid_plural "%1 minutes"
361543msgstr[0] ""
362544msgstr[1] ""
363545
364−#: qml/Panel/Indicators/MenuItemFactory.qml:899
546+#: qml/Panel/Indicators/MenuItemFactory.qml:900
365547#, qt-format
366548msgid "%1 second"
367549msgid_plural "%1 seconds"
368550msgstr[0] ""
369551msgstr[1] ""
370552
371−#: qml/Panel/Indicators/MenuItemFactory.qml:902
553+#: qml/Panel/Indicators/MenuItemFactory.qml:903
372554msgid "0 seconds"
373555msgstr ""
374556
375557#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
376−#: qml/Panel/Indicators/MenuItemFactory.qml:904
558+#: qml/Panel/Indicators/MenuItemFactory.qml:905
377559#, qt-format
378560msgid "%1 remaining"
379561msgstr ""
380562
381−#: qml/Panel/Indicators/MenuItemFactory.qml:910
563+#: qml/Panel/Indicators/MenuItemFactory.qml:911
382564msgid "In queue…"
383565msgstr ""
384566
385−#: qml/Panel/Indicators/MenuItemFactory.qml:914
567+#: qml/Panel/Indicators/MenuItemFactory.qml:915
386568msgid "Downloading"
387569msgstr ""
388570
389−#: qml/Panel/Indicators/MenuItemFactory.qml:916
571+#: qml/Panel/Indicators/MenuItemFactory.qml:917
390572msgid "Paused, tap to resume"
391573msgstr ""
392574
393−#: qml/Panel/Indicators/MenuItemFactory.qml:918
575+#: qml/Panel/Indicators/MenuItemFactory.qml:919
394576msgid "Canceled"
395577msgstr ""
396578
397−#: qml/Panel/Indicators/MenuItemFactory.qml:920
579+#: qml/Panel/Indicators/MenuItemFactory.qml:921
398580msgid "Finished"
399581msgstr ""
400582
401−#: qml/Panel/Indicators/MenuItemFactory.qml:922
583+#: qml/Panel/Indicators/MenuItemFactory.qml:923
402584msgid "Failed, tap to retry"
403585msgstr ""
404586
405−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
406−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
587+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
588+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
407589msgctxt "Button: Send a reply message"
408590msgid "Send"
409591msgstr ""
410592
411−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
593+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
412594msgctxt "Label: Hint in message indicator line edit"
413595msgid "Reply"
414596msgstr ""
415597
416−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
598+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
417599msgctxt "Button: Call back on phone"
418600msgid "Call back"
419601msgstr ""
@@ -422,48 +604,24 @@ msgstr ""
422604msgid "Drag using 3 fingers any application from one window to the other"
423605msgstr ""
424606
425−#: qml/Tutorial/TutorialBottom.qml:78
426−msgid "Swipe up to add a contact"
427−msgstr ""
428−
429−#: qml/Tutorial/TutorialBottom.qml:80
430−msgid "Swipe up for favorite calculations"
431−msgstr ""
432−
433−#: qml/Tutorial/TutorialBottom.qml:82
434−msgid "Swipe up for recent calls"
435−msgstr ""
436−
437−#: qml/Tutorial/TutorialBottom.qml:84
438−msgid "Swipe up to create a message"
439−msgstr ""
440−
441−#: qml/Tutorial/TutorialBottom.qml:85
442−msgid "Swipe up to manage the app"
443−msgstr ""
444−
445−#: qml/Tutorial/TutorialLeft.qml:47
446−msgid "Swipe from the left edge to open the launcher"
447−msgstr ""
448−
449−#: qml/Tutorial/TutorialLeftLong.qml:47
607+#: qml/Tutorial/TutorialLeftLong.qml:49
450608msgid "Long swipe from the left edge to open the Today scope"
451609msgstr ""
452610
453−#: qml/Tutorial/TutorialRight.qml:54
454−msgid "Hover your mouse on the right edge to view your open apps"
611+#: qml/Tutorial/TutorialLeft.qml:47
612+msgid "Short swipe from the left edge to open the launcher"
455613msgstr ""
456614
457615#: qml/Tutorial/TutorialRight.qml:55
458−msgid "Short or long swipe from the right edge to view your open apps"
616+msgid "Push your mouse against the right edge to view your open apps"
459617msgstr ""
460618
461−#: qml/Tutorial/TutorialTop.qml:53
462−msgid "Swipe from the top right edge to open the notification bar"
619+#: qml/Tutorial/TutorialRight.qml:56
620+msgid "Swipe from the right edge to view your open apps"
463621msgstr ""
464622
465−#: qml/Tutorial/TutorialTop.qml:54
466−msgid "Swipe from the top edge to open the notification bar"
623+#: qml/Tutorial/TutorialTop.qml:53
624+msgid "Swipe from the top edge to access notifications and quick settings"
467625msgstr ""
468626
469627#: qml/Wizard/Page.qml:54
@@ -475,11 +633,11 @@ msgstr ""
475633msgid "Language"
476634msgstr ""
477635
478−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
479−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
636+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
637+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
480638#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
481639#: qml/Wizard/Pages/75-report-check.qml:84
482−#: qml/Wizard/Pages/passcode-desktop.qml:124
640+#: qml/Wizard/Pages/passcode-desktop.qml:141
483641#: qml/Wizard/Pages/password-set.qml:141
484642msgid "Next"
485643msgstr ""
@@ -541,7 +699,7 @@ msgstr ""
541699msgid "Time Zone"
542700msgstr ""
543701
544−#: qml/Wizard/Pages/50-timezone.qml:178
702+#: qml/Wizard/Pages/50-timezone.qml:181
545703msgid "Enter your city"
546704msgstr ""
547705
@@ -631,7 +789,7 @@ msgid "Service Terms"
631789msgstr ""
632790
633791#: qml/Wizard/Pages/passcode-confirm.qml:43
634−#: qml/Wizard/Pages/passcode-desktop.qml:80
792+#: qml/Wizard/Pages/passcode-desktop.qml:96
635793msgid "Confirm passcode"
636794msgstr ""
637795
@@ -648,24 +806,24 @@ msgstr ""
648806msgid "Lock Screen Passcode"
649807msgstr ""
650808
651−#: qml/Wizard/Pages/passcode-desktop.qml:56
809+#: qml/Wizard/Pages/passcode-desktop.qml:60
652810msgid "Enter 4 numbers to setup your passcode"
653811msgstr ""
654812
655−#: qml/Wizard/Pages/passcode-desktop.qml:65
813+#: qml/Wizard/Pages/passcode-desktop.qml:76
656814#: qml/Wizard/Pages/passcode-set.qml:54
657815msgid "Choose passcode"
658816msgstr ""
659817
660−#: qml/Wizard/Pages/passcode-desktop.qml:105
818+#: qml/Wizard/Pages/passcode-desktop.qml:126
661819msgid "Passcode too short"
662820msgstr ""
663821
664−#: qml/Wizard/Pages/passcode-desktop.qml:107
822+#: qml/Wizard/Pages/passcode-desktop.qml:128
665823msgid "Passcodes match"
666824msgstr ""
667825
668−#: qml/Wizard/Pages/passcode-desktop.qml:109
826+#: qml/Wizard/Pages/passcode-desktop.qml:130
669827msgid "Passcodes do not match"
670828msgstr ""
671829
@@ -714,26 +872,30 @@ msgid "To proceed with no SIM tap Skip."
714872msgstr ""
715873
716874#: qml/Wizard/PasswordMeter.qml:87
717−msgid "Passwords match"
875+msgid "Password too short"
718876msgstr ""
719877
720878#: qml/Wizard/PasswordMeter.qml:89
879+msgid "Passwords match"
880+msgstr ""
881+
882+#: qml/Wizard/PasswordMeter.qml:91
721883msgid "Passwords do not match"
722884msgstr ""
723885
724−#: qml/Wizard/PasswordMeter.qml:93
886+#: qml/Wizard/PasswordMeter.qml:95
725887msgid "Strong password"
726888msgstr ""
727889
728−#: qml/Wizard/PasswordMeter.qml:95
890+#: qml/Wizard/PasswordMeter.qml:97
729891msgid "Fair password"
730892msgstr ""
731893
732−#: qml/Wizard/PasswordMeter.qml:97
894+#: qml/Wizard/PasswordMeter.qml:99
733895msgid "Weak password"
734896msgstr ""
735897
736−#: qml/Wizard/PasswordMeter.qml:99
898+#: qml/Wizard/PasswordMeter.qml:101
737899msgid "Very weak password"
738900msgstr ""
739901
po/bn.po+299−128
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
1111"PO-Revision-Date: 2015-11-27 19:38+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Bengali <bn@li.org>\n"
@@ -15,39 +15,39 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19+"X-Generator: Launchpad (build 18147)\n"
2020
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
2222msgid "Password: "
2323msgstr "পাসওয়ার্ড: "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
2727msgid "Pin shortcut"
2828msgstr "পিন"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
3131msgid "Quit"
3232msgstr ""
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
3535msgid "Unpin shortcut"
3636msgstr "আনপিন"
3737
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
3939msgid "Device Locked"
4040msgstr "ডিভাইসটি লক করা"
4141
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
4343msgid "You have been locked out due to too many failed passphrase attempts."
4444msgstr "অধিকবার পাসফ্রেজ ভুল দেওয়ার কারনে আপনার আইডি লক করা হয়েছে"
4545
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
4747msgid "You have been locked out due to too many failed passcode attempts."
4848msgstr "অধিকবার পাসকোড ভুল করার কারনে আপনার আইডি লক করা হয়েছে"
4949
50−#: qml/Components/DelayedLockscreen.qml:74
50+#: qml/Components/DelayedLockscreen.qml:75
5151#, qt-format
5252msgid "Please wait %1 minute and then try again…"
5353msgid_plural "Please wait %1 minutes and then try again…"
@@ -73,8 +73,8 @@ msgctxt "Button: Log out from the system"
7373msgid "Log Out"
7474msgstr ""
7575
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
77−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
7878#: qml/Wizard/Pages/passcode-set.qml:32
7979msgid "Cancel"
8080msgstr "বাতিল"
@@ -92,16 +92,16 @@ msgstr "আপনি কি পুনরায় চালু করতে চা
9292msgid "No"
9393msgstr "না"
9494
95−#: qml/Components/Dialogs.qml:183
95+#: qml/Components/Dialogs.qml:182
9696msgid "Yes"
9797msgstr "হ্যাঁ"
9898
99−#: qml/Components/Dialogs.qml:198
99+#: qml/Components/Dialogs.qml:197
100100msgctxt "Title: Power off/Restart dialog"
101101msgid "Power"
102102msgstr ""
103103
104−#: qml/Components/Dialogs.qml:199
104+#: qml/Components/Dialogs.qml:198
105105msgid ""
106106"Are you sure you would like\n"
107107"to power off?"
@@ -109,28 +109,198 @@ msgstr ""
109109"আপনি নিশ্চিত যে আপনি\n"
110110"বন্ধ করতে চান?"
111111
112−#: qml/Components/Dialogs.qml:201
112+#: qml/Components/Dialogs.qml:200
113113msgctxt "Button: Power off the system"
114114msgid "Power off"
115115msgstr "বন্ধ করুন"
116116
117−#: qml/Components/Dialogs.qml:210
117+#: qml/Components/Dialogs.qml:209
118118msgctxt "Button: Restart the system"
119119msgid "Restart"
120120msgstr "পুনরায় চালু"
121121
122−#: qml/Components/Lockscreen.qml:231
122+#: qml/Components/KeyboardShortcutsOverlay.qml:41
123+msgid "Keyboard Shortcuts"
124+msgstr ""
125+
126+#: qml/Components/KeyboardShortcutsOverlay.qml:55
127+msgid "Unity 8"
128+msgstr ""
129+
130+#: qml/Components/KeyboardShortcutsOverlay.qml:62
131+msgid "PrtScr"
132+msgstr ""
133+
134+#: qml/Components/KeyboardShortcutsOverlay.qml:67
135+msgid "Takes a screenshot."
136+msgstr ""
137+
138+#: qml/Components/KeyboardShortcutsOverlay.qml:75
139+msgid "Alt + PrtScr"
140+msgstr ""
141+
142+#: qml/Components/KeyboardShortcutsOverlay.qml:80
143+msgid "Takes a screenshot of a window."
144+msgstr ""
145+
146+#: qml/Components/KeyboardShortcutsOverlay.qml:88
147+msgid "Super + Space"
148+msgstr ""
149+
150+#: qml/Components/KeyboardShortcutsOverlay.qml:93
151+msgid "Switches to next keyboard layout."
152+msgstr ""
153+
154+#: qml/Components/KeyboardShortcutsOverlay.qml:101
155+msgid "Super + Shift + Space"
156+msgstr ""
157+
158+#: qml/Components/KeyboardShortcutsOverlay.qml:106
159+msgid "Switches to previous keyboard layout."
160+msgstr ""
161+
162+#: qml/Components/KeyboardShortcutsOverlay.qml:118
163+msgid "Launcher"
164+msgstr ""
165+
166+#: qml/Components/KeyboardShortcutsOverlay.qml:125
167+msgid "Super (Hold)"
168+msgstr ""
169+
170+#: qml/Components/KeyboardShortcutsOverlay.qml:130
171+msgid "Opens the launcher, displays shortcuts."
172+msgstr ""
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:138
175+msgid "Alt + F1"
176+msgstr ""
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:143
179+msgid "Opens launcher keyboard navigation mode."
180+msgstr ""
181+
182+#: qml/Components/KeyboardShortcutsOverlay.qml:151
183+msgid "Super + Tab"
184+msgstr ""
185+
186+#: qml/Components/KeyboardShortcutsOverlay.qml:156
187+msgid "Switches applications via the launcher."
188+msgstr ""
189+
190+#: qml/Components/KeyboardShortcutsOverlay.qml:164
191+msgid "Super + 0 to 9"
192+msgstr ""
193+
194+#: qml/Components/KeyboardShortcutsOverlay.qml:169
195+msgid "Same as clicking on a launcher icon."
196+msgstr ""
197+
198+#: qml/Components/KeyboardShortcutsOverlay.qml:181
199+msgid "Scopes"
200+msgstr ""
201+
202+#: qml/Components/KeyboardShortcutsOverlay.qml:188
203+msgid "Super (Tap)"
204+msgstr ""
205+
206+#: qml/Components/KeyboardShortcutsOverlay.qml:193
207+msgid "Opens the Scopes home."
208+msgstr ""
209+
210+#: qml/Components/KeyboardShortcutsOverlay.qml:209
211+msgid "Switching"
212+msgstr ""
213+
214+#: qml/Components/KeyboardShortcutsOverlay.qml:216
215+msgid "Alt + Tab"
216+msgstr ""
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:221
219+msgid "Switches between applications."
220+msgstr ""
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:229
223+msgid "Super + W"
224+msgstr ""
225+
226+#: qml/Components/KeyboardShortcutsOverlay.qml:234
227+msgid "Opens the desktop spread."
228+msgstr ""
229+
230+#: qml/Components/KeyboardShortcutsOverlay.qml:242
231+msgid "Cursor Left or Right"
232+msgstr ""
233+
234+#: qml/Components/KeyboardShortcutsOverlay.qml:247
235+msgid "Moves the focus."
236+msgstr ""
237+
238+#: qml/Components/KeyboardShortcutsOverlay.qml:259
239+msgid "Windows"
240+msgstr ""
241+
242+#: qml/Components/KeyboardShortcutsOverlay.qml:266
243+msgid "Ctrl + Super + D"
244+msgstr ""
245+
246+#: qml/Components/KeyboardShortcutsOverlay.qml:271
247+msgid "Minimizes all windows."
248+msgstr ""
249+
250+#: qml/Components/KeyboardShortcutsOverlay.qml:279
251+msgid "Ctrl + Super + Up"
252+msgstr ""
253+
254+#: qml/Components/KeyboardShortcutsOverlay.qml:284
255+msgid "Maximizes the current window."
256+msgstr ""
257+
258+#: qml/Components/KeyboardShortcutsOverlay.qml:292
259+msgid "Ctrl + Super + Down"
260+msgstr ""
261+
262+#: qml/Components/KeyboardShortcutsOverlay.qml:297
263+msgid "Minimizes or restores the current window."
264+msgstr ""
265+
266+#: qml/Components/KeyboardShortcutsOverlay.qml:305
267+msgid "Ctrl + Super + Left or Right"
268+msgstr ""
269+
270+#: qml/Components/KeyboardShortcutsOverlay.qml:310
271+msgid "Semi-maximizes the current window."
272+msgstr ""
273+
274+#: qml/Components/KeyboardShortcutsOverlay.qml:318
275+msgid "Alt + F4"
276+msgstr ""
277+
278+#: qml/Components/KeyboardShortcutsOverlay.qml:323
279+msgid "Closes the current window."
280+msgstr ""
281+
282+#: qml/Components/Lockscreen.qml:239
123283msgid "Return to Call"
124284msgstr "কল এ ফিরে যান"
125285
126−#: qml/Components/Lockscreen.qml:231
286+#: qml/Components/Lockscreen.qml:239
127287msgid "Emergency Call"
128288msgstr "জরুরী কল"
129289
130−#: qml/Components/Lockscreen.qml:263
290+#: qml/Components/Lockscreen.qml:271
131291msgid "OK"
132292msgstr "ঠিক আছে"
133293
294+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
295+#, qt-format
296+msgid "%1:%2:%3"
297+msgstr ""
298+
299+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
300+#, qt-format
301+msgid "%1:%2"
302+msgstr ""
303+
134304#: qml/Components/ModeSwitchWarningDialog.qml:32
135305msgid "Apps may have unsaved data:"
136306msgstr ""
@@ -157,26 +327,30 @@ msgstr ""
157327msgid "Close all"
158328msgstr ""
159329
160−#: qml/Dash/DashPageHeader.qml:337
330+#: qml/Components/SharingPicker.qml:54
331+msgid "Preview Share Item"
332+msgstr ""
333+
334+#: qml/Dash/DashPageHeader.qml:333
161335msgctxt "Button: Open the Ubuntu Store"
162336msgid "Store"
163337msgstr "স্টোর"
164338
165−#: qml/Dash/DashPageHeader.qml:344
339+#: qml/Dash/DashPageHeader.qml:340
166340msgctxt "Button: Start a search in the current dash scope"
167341msgid "Search"
168342msgstr "খুঁজুন"
169343
170−#: qml/Dash/DashPageHeader.qml:354
344+#: qml/Dash/DashPageHeader.qml:350
171345msgctxt "Button: Show the current dash scope settings"
172346msgid "Settings"
173347msgstr "সেটিংস"
174348
175−#: qml/Dash/DashPageHeader.qml:361
349+#: qml/Dash/DashPageHeader.qml:357
176350msgid "Remove from Favorites"
177351msgstr "পছন্দ থেকে মুছে ফেলুন"
178352
179−#: qml/Dash/DashPageHeader.qml:361
353+#: qml/Dash/DashPageHeader.qml:357
180354msgid "Add to Favorites"
181355msgstr "পছন্দতে যোগ করুন"
182356
@@ -188,24 +362,24 @@ msgstr ""
188362msgid "Reset"
189363msgstr ""
190364
191−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192−msgid "See less"
193−msgstr "কম দেখুন"
365+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
366+msgid "Show less"
367+msgstr ""
194368
195−#: qml/Dash/GenericScopeView.qml:570
196−msgid "See all"
197−msgstr "সব দেখুন"
369+#: qml/Dash/GenericScopeView.qml:580
370+msgid "Show all"
371+msgstr ""
198372
199−#: qml/Dash/GenericScopeView.qml:627
373+#: qml/Dash/GenericScopeView.qml:637
200374msgctxt "Label: Hint for dash search line edit"
201375msgid "Search"
202376msgstr "খুঁজুন"
203377
204−#: qml/Dash/PageHeaderExtraPanel.qml:55
378+#: qml/Dash/PageHeaderExtraPanel.qml:56
205379msgid "Recent Searches"
206380msgstr ""
207381
208−#: qml/Dash/PageHeaderExtraPanel.qml:66
382+#: qml/Dash/PageHeaderExtraPanel.qml:67
209383msgid "Clear All"
210384msgstr ""
211385
@@ -218,22 +392,18 @@ msgid "Less..."
218392msgstr "কম..."
219393
220394#: qml/Dash/Previews/PreviewCommentInput.qml:68
221−#: qml/Dash/Previews/PreviewRatingInput.qml:174
395+#: qml/Dash/Previews/PreviewRatingInput.qml:175
222396msgid "Send"
223397msgstr "পাঠান"
224398
225−#: qml/Dash/Previews/PreviewRatingInput.qml:84
399+#: qml/Dash/Previews/PreviewRatingInput.qml:82
226400msgid "Rate this"
227401msgstr "রেটিং দিন"
228402
229−#: qml/Dash/Previews/PreviewRatingInput.qml:129
403+#: qml/Dash/Previews/PreviewRatingInput.qml:157
230404msgid "Add a review"
231405msgstr "আপনার মতামত দিন"
232406
233−#: qml/Dash/Previews/PreviewSharing.qml:66
234−msgid "Preview Share Item"
235−msgstr ""
236−
237407#: qml/Dash/PullToRefreshScopeStyle.qml:55
238408msgid "Pull to refresh…"
239409msgstr "রিফ্রেশ করার জন্য টানুন"
@@ -246,93 +416,105 @@ msgstr "রিফ্রেশ করার জন্য ছেড়ে দিন"
246416msgid "Enable location data"
247417msgstr "অবস্থান নির্ণয় চালু করুন"
248418
249−#: qml/Dash/ScopesList.qml:67
419+#: qml/Dash/ScopesList.qml:55
250420msgid "Manage"
251421msgstr "ব্যবস্থাপনা"
252422
253−#: qml/Dash/ScopesList.qml:113
423+#: qml/Dash/ScopesList.qml:102
254424msgid "Home"
255425msgstr ""
256426
257−#: qml/Dash/ScopesList.qml:114
427+#: qml/Dash/ScopesList.qml:103
258428msgid "Also installed"
259429msgstr "আরও ইন্সটল করা রয়েছে..."
260430
261−#: qml/DisabledScreenNotice.qml:104
431+#: qml/DisabledScreenNotice.qml:109
262432msgid ""
263433"Your device is now connected to an external display. Use this screen as a "
264434"touch pad to interact with the pointer."
265435msgstr ""
266436
267−#: qml/Greeter/CoverPage.qml:118
437+#: qml/Greeter/CoverPage.qml:127
268438msgid "Unlock"
269439msgstr "লক খুলুন"
270440
271−#: qml/Greeter/LoginList.qml:239
441+#: qml/Greeter/Greeter.qml:555
442+msgid "Try again"
443+msgstr ""
444+
445+#: qml/Greeter/LoginList.qml:63
446+msgid "Passphrase"
447+msgstr ""
448+
449+#: qml/Greeter/LoginList.qml:64
450+msgid "Passcode"
451+msgstr ""
452+
453+#: qml/Greeter/LoginList.qml:87
272454msgid "Retry"
273455msgstr ""
274456
275−#: qml/Greeter/LoginList.qml:240
276−msgid "Tap to unlock"
277−msgstr "লক খোলার জন্য চাপ দিন"
457+#: qml/Greeter/LoginList.qml:88
458+msgid "Log In"
459+msgstr ""
278460
279−#: qml/Greeter/NarrowView.qml:54
461+#: qml/Greeter/NarrowView.qml:55
280462msgid "Sorry, incorrect passphrase."
281463msgstr "দুঃখিত, পাসওয়ার্ডটি ভুল হয়েছে।"
282464
283−#: qml/Greeter/NarrowView.qml:55
465+#: qml/Greeter/NarrowView.qml:56
284466msgid "Sorry, incorrect passcode."
285467msgstr "দুঃখিত, পাসকোডটি ভুল হয়েছে।"
286468
287−#: qml/Greeter/NarrowView.qml:56
469+#: qml/Greeter/NarrowView.qml:57
288470msgid "This will be your last attempt."
289471msgstr "এটিই আপনার সর্বশেষ সুযোগ।"
290472
291−#: qml/Greeter/NarrowView.qml:58
473+#: qml/Greeter/NarrowView.qml:59
292474msgid ""
293475"If passphrase is entered incorrectly, your phone will conduct a factory "
294476"reset and all personal data will be deleted."
295477msgstr ""
296478"ভুল পাসওয়ার্ড প্রদান করলে, আপনার ফোনটিতে থাকা সকল ব্যক্তিগত তথ্য মুছে যাবে।"
297479
298−#: qml/Greeter/NarrowView.qml:59
480+#: qml/Greeter/NarrowView.qml:60
299481msgid ""
300482"If passcode is entered incorrectly, your phone will conduct a factory reset "
301483"and all personal data will be deleted."
302484msgstr "ভুল পাসকোড প্রদান করলে, আপনার ফোনটির সকল ব্যক্তিগত তথ্য মুছে যাবে।"
303485
304−#: qml/Greeter/NarrowView.qml:116
486+#: qml/Greeter/NarrowView.qml:129
305487#, qt-format
306488msgid "Enter %1"
307489msgstr "%1 লিখুন"
308490
309−#: qml/Greeter/NarrowView.qml:117
491+#: qml/Greeter/NarrowView.qml:130
310492msgid "Enter passphrase"
311493msgstr "পাসওয়ার্ড লিখুন"
312494
313−#: qml/Greeter/NarrowView.qml:118
495+#: qml/Greeter/NarrowView.qml:131
314496msgid "Enter passcode"
315497msgstr "পাসকোড লিখুন"
316498
317−#: qml/Greeter/NarrowView.qml:119
499+#: qml/Greeter/NarrowView.qml:135
318500#, qt-format
319501msgid "Sorry, incorrect %1"
320502msgstr "দুঃখিত, %1 ভুল হয়েছে"
321503
322−#: qml/Greeter/NarrowView.qml:120
504+#: qml/Greeter/NarrowView.qml:136
323505msgid "Sorry, incorrect passphrase"
324506msgstr "দুঃখিত, পাসওয়ার্ড ভুল হয়েছে"
325507
326−#: qml/Greeter/NarrowView.qml:121
508+#: qml/Greeter/NarrowView.qml:137
327509msgctxt "passphrase"
328510msgid "Please re-enter"
329511msgstr "অনুগ্রহ করে আবার লিখুন"
330512
331−#: qml/Greeter/NarrowView.qml:122
513+#: qml/Greeter/NarrowView.qml:138
332514msgid "Sorry, incorrect passcode"
333515msgstr "দুঃখিত, পাসকোড ভুল হয়েছে"
334516
335−#: qml/Notifications/NotificationMenuItemFactory.qml:129
517+#: qml/Notifications/NotificationMenuItemFactory.qml:124
336518msgid "Show password"
337519msgstr "পাসওয়ার্ড দেখান"
338520
@@ -344,77 +526,77 @@ msgstr "কলে ফিরে যেতে চাপ দিন..."
344526msgid "Conference"
345527msgstr "কনফারেন্স"
346528
347−#: qml/Panel/Indicators/MenuItemFactory.qml:761
529+#: qml/Panel/Indicators/MenuItemFactory.qml:762
348530msgid "Nothing is playing"
349531msgstr "কোন কিছু বাজছে না।"
350532
351−#: qml/Panel/Indicators/MenuItemFactory.qml:890
533+#: qml/Panel/Indicators/MenuItemFactory.qml:891
352534#, qt-format
353535msgid "%1 hour"
354536msgid_plural "%1 hours"
355537msgstr[0] "%1 ঘণ্টা"
356538msgstr[1] "%1 ঘণ্টা"
357539
358−#: qml/Panel/Indicators/MenuItemFactory.qml:894
540+#: qml/Panel/Indicators/MenuItemFactory.qml:895
359541#, qt-format
360542msgid "%1 minute"
361543msgid_plural "%1 minutes"
362544msgstr[0] "%1 মিনিট"
363545msgstr[1] "%1 মিনিট"
364546
365−#: qml/Panel/Indicators/MenuItemFactory.qml:899
547+#: qml/Panel/Indicators/MenuItemFactory.qml:900
366548#, qt-format
367549msgid "%1 second"
368550msgid_plural "%1 seconds"
369551msgstr[0] "%1 সেকেন্ড"
370552msgstr[1] "%1 সেকেন্ড"
371553
372−#: qml/Panel/Indicators/MenuItemFactory.qml:902
554+#: qml/Panel/Indicators/MenuItemFactory.qml:903
373555msgid "0 seconds"
374556msgstr "0 সেকেন্ড"
375557
376558#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
377−#: qml/Panel/Indicators/MenuItemFactory.qml:904
559+#: qml/Panel/Indicators/MenuItemFactory.qml:905
378560#, qt-format
379561msgid "%1 remaining"
380562msgstr "%1 বাকি"
381563
382−#: qml/Panel/Indicators/MenuItemFactory.qml:910
564+#: qml/Panel/Indicators/MenuItemFactory.qml:911
383565msgid "In queue…"
384566msgstr "অপেক্ষায় রয়েছে..."
385567
386−#: qml/Panel/Indicators/MenuItemFactory.qml:914
568+#: qml/Panel/Indicators/MenuItemFactory.qml:915
387569msgid "Downloading"
388570msgstr "ডাউনলোড হচ্ছে"
389571
390−#: qml/Panel/Indicators/MenuItemFactory.qml:916
572+#: qml/Panel/Indicators/MenuItemFactory.qml:917
391573msgid "Paused, tap to resume"
392574msgstr "থামানো, শুরু করতে চাপ দিন"
393575
394−#: qml/Panel/Indicators/MenuItemFactory.qml:918
576+#: qml/Panel/Indicators/MenuItemFactory.qml:919
395577msgid "Canceled"
396578msgstr "বাতিল হয়েছে"
397579
398−#: qml/Panel/Indicators/MenuItemFactory.qml:920
580+#: qml/Panel/Indicators/MenuItemFactory.qml:921
399581msgid "Finished"
400582msgstr "শেষ"
401583
402−#: qml/Panel/Indicators/MenuItemFactory.qml:922
584+#: qml/Panel/Indicators/MenuItemFactory.qml:923
403585msgid "Failed, tap to retry"
404586msgstr "ব্যার্থ হয়েছে, পুনরায় চেষ্টা করতে চাপ দিন"
405587
406−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
407−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
588+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
589+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
408590msgctxt "Button: Send a reply message"
409591msgid "Send"
410592msgstr ""
411593
412−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
594+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
413595msgctxt "Label: Hint in message indicator line edit"
414596msgid "Reply"
415597msgstr "উত্তর দিন"
416598
417−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
599+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
418600msgctxt "Button: Call back on phone"
419601msgid "Call back"
420602msgstr "কল ব্যাক"
@@ -423,48 +605,24 @@ msgstr "কল ব্যাক"
423605msgid "Drag using 3 fingers any application from one window to the other"
424606msgstr ""
425607
426−#: qml/Tutorial/TutorialBottom.qml:78
427−msgid "Swipe up to add a contact"
428−msgstr ""
429−
430−#: qml/Tutorial/TutorialBottom.qml:80
431−msgid "Swipe up for favorite calculations"
432−msgstr ""
433−
434−#: qml/Tutorial/TutorialBottom.qml:82
435−msgid "Swipe up for recent calls"
436−msgstr ""
437−
438−#: qml/Tutorial/TutorialBottom.qml:84
439−msgid "Swipe up to create a message"
440−msgstr ""
441−
442−#: qml/Tutorial/TutorialBottom.qml:85
443−msgid "Swipe up to manage the app"
444−msgstr ""
445−
446−#: qml/Tutorial/TutorialLeft.qml:47
447−msgid "Swipe from the left edge to open the launcher"
448−msgstr ""
449−
450−#: qml/Tutorial/TutorialLeftLong.qml:47
608+#: qml/Tutorial/TutorialLeftLong.qml:49
451609msgid "Long swipe from the left edge to open the Today scope"
452610msgstr ""
453611
454−#: qml/Tutorial/TutorialRight.qml:54
455−msgid "Hover your mouse on the right edge to view your open apps"
612+#: qml/Tutorial/TutorialLeft.qml:47
613+msgid "Short swipe from the left edge to open the launcher"
456614msgstr ""
457615
458616#: qml/Tutorial/TutorialRight.qml:55
459−msgid "Short or long swipe from the right edge to view your open apps"
617+msgid "Push your mouse against the right edge to view your open apps"
460618msgstr ""
461619
462−#: qml/Tutorial/TutorialTop.qml:53
463−msgid "Swipe from the top right edge to open the notification bar"
620+#: qml/Tutorial/TutorialRight.qml:56
621+msgid "Swipe from the right edge to view your open apps"
464622msgstr ""
465623
466−#: qml/Tutorial/TutorialTop.qml:54
467−msgid "Swipe from the top edge to open the notification bar"
624+#: qml/Tutorial/TutorialTop.qml:53
625+msgid "Swipe from the top edge to access notifications and quick settings"
468626msgstr ""
469627
470628#: qml/Wizard/Page.qml:54
@@ -476,11 +634,11 @@ msgstr ""
476634msgid "Language"
477635msgstr ""
478636
479−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
480−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
637+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
638+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
481639#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
482640#: qml/Wizard/Pages/75-report-check.qml:84
483−#: qml/Wizard/Pages/passcode-desktop.qml:124
641+#: qml/Wizard/Pages/passcode-desktop.qml:141
484642#: qml/Wizard/Pages/password-set.qml:141
485643msgid "Next"
486644msgstr ""
@@ -542,7 +700,7 @@ msgstr ""
542700msgid "Time Zone"
543701msgstr ""
544702
545−#: qml/Wizard/Pages/50-timezone.qml:178
703+#: qml/Wizard/Pages/50-timezone.qml:181
546704msgid "Enter your city"
547705msgstr ""
548706
@@ -632,7 +790,7 @@ msgid "Service Terms"
632790msgstr ""
633791
634792#: qml/Wizard/Pages/passcode-confirm.qml:43
635−#: qml/Wizard/Pages/passcode-desktop.qml:80
793+#: qml/Wizard/Pages/passcode-desktop.qml:96
636794msgid "Confirm passcode"
637795msgstr ""
638796
@@ -649,24 +807,24 @@ msgstr ""
649807msgid "Lock Screen Passcode"
650808msgstr ""
651809
652−#: qml/Wizard/Pages/passcode-desktop.qml:56
810+#: qml/Wizard/Pages/passcode-desktop.qml:60
653811msgid "Enter 4 numbers to setup your passcode"
654812msgstr ""
655813
656−#: qml/Wizard/Pages/passcode-desktop.qml:65
814+#: qml/Wizard/Pages/passcode-desktop.qml:76
657815#: qml/Wizard/Pages/passcode-set.qml:54
658816msgid "Choose passcode"
659817msgstr ""
660818
661−#: qml/Wizard/Pages/passcode-desktop.qml:105
819+#: qml/Wizard/Pages/passcode-desktop.qml:126
662820msgid "Passcode too short"
663821msgstr ""
664822
665−#: qml/Wizard/Pages/passcode-desktop.qml:107
823+#: qml/Wizard/Pages/passcode-desktop.qml:128
666824msgid "Passcodes match"
667825msgstr ""
668826
669−#: qml/Wizard/Pages/passcode-desktop.qml:109
827+#: qml/Wizard/Pages/passcode-desktop.qml:130
670828msgid "Passcodes do not match"
671829msgstr ""
672830
@@ -715,26 +873,30 @@ msgid "To proceed with no SIM tap Skip."
715873msgstr ""
716874
717875#: qml/Wizard/PasswordMeter.qml:87
718−msgid "Passwords match"
876+msgid "Password too short"
719877msgstr ""
720878
721879#: qml/Wizard/PasswordMeter.qml:89
880+msgid "Passwords match"
881+msgstr ""
882+
883+#: qml/Wizard/PasswordMeter.qml:91
722884msgid "Passwords do not match"
723885msgstr ""
724886
725−#: qml/Wizard/PasswordMeter.qml:93
887+#: qml/Wizard/PasswordMeter.qml:95
726888msgid "Strong password"
727889msgstr ""
728890
729−#: qml/Wizard/PasswordMeter.qml:95
891+#: qml/Wizard/PasswordMeter.qml:97
730892msgid "Fair password"
731893msgstr ""
732894
733−#: qml/Wizard/PasswordMeter.qml:97
895+#: qml/Wizard/PasswordMeter.qml:99
734896msgid "Weak password"
735897msgstr ""
736898
737−#: qml/Wizard/PasswordMeter.qml:99
899+#: qml/Wizard/PasswordMeter.qml:101
738900msgid "Very weak password"
739901msgstr ""
740902
@@ -742,6 +904,12 @@ msgstr ""
742904#~ msgid "Reboot"
743905#~ msgstr "পুনরায় চালু করুন"
744906
907+#~ msgid "See all"
908+#~ msgstr "সব দেখুন"
909+
910+#~ msgid "See less"
911+#~ msgstr "কম দেখুন"
912+
745913#~ msgid "This action does different things for different apps"
746914#~ msgstr "এই কাজটি বিভিন্ন অ্যাপের জন্য ভিন্ন ভিন্ন ভাবে কাজ করে।"
747915
@@ -854,6 +1022,9 @@ msgstr ""
8541022#~ msgid "Shut down"
8551023#~ msgstr "বন্ধ করুন"
8561024
1025+#~ msgid "Tap to unlock"
1026+#~ msgstr "লক খোলার জন্য চাপ দিন"
1027+
8571028#~ msgid "Let’s get started."
8581029#~ msgstr "আসুন শুরু করা যাক।"
8591030
po/br.po+353−183
@@ -7,51 +7,51 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11−"PO-Revision-Date: 2016-02-22 12:29+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11+"PO-Revision-Date: 2016-04-27 12:20+0000\n"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19+"X-Generator: Launchpad (build 18147)\n"
2020
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
2222msgid "Password: "
2323msgstr "Ger-tremen : "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
2727msgid "Pin shortcut"
2828msgstr "Spilhennañ ar verradenn"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
3131msgid "Quit"
3232msgstr "Mont kuit"
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
3535msgid "Unpin shortcut"
3636msgstr "Dispilhennañ ar verradenn"
3737
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
3939msgid "Device Locked"
4040msgstr "Benveg prennet"
4141
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
4343msgid "You have been locked out due to too many failed passphrase attempts."
4444msgstr ""
4545"Prennet eo bet ho penveg abalamour da re a daolioù-esae c'hwitet evit merkañ "
4646"ho frazenn-dremen."
4747
48−#: qml/Components/DelayedLockscreen.qml:65
48+#: qml/Components/DelayedLockscreen.qml:66
4949msgid "You have been locked out due to too many failed passcode attempts."
5050msgstr ""
5151"Prennet eo bet ho penveg abalamour da re a daolioù-esae evit merkañ ho kod-"
5252"tremen."
5353
54−#: qml/Components/DelayedLockscreen.qml:74
54+#: qml/Components/DelayedLockscreen.qml:75
5555#, qt-format
5656msgid "Please wait %1 minute and then try again…"
5757msgid_plural "Please wait %1 minutes and then try again…"
@@ -77,8 +77,8 @@ msgctxt "Button: Log out from the system"
7777msgid "Log Out"
7878msgstr "Digevreañ"
7979
80−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
81−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
80+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
81+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
8282#: qml/Wizard/Pages/passcode-set.qml:32
8383msgid "Cancel"
8484msgstr "Nullañ"
@@ -96,16 +96,16 @@ msgstr "Ha sur oc'h e fell deoc'h adloc'hañ ?"
9696msgid "No"
9797msgstr "N'on ket"
9898
99−#: qml/Components/Dialogs.qml:183
99+#: qml/Components/Dialogs.qml:182
100100msgid "Yes"
101101msgstr "Ya"
102102
103−#: qml/Components/Dialogs.qml:198
103+#: qml/Components/Dialogs.qml:197
104104msgctxt "Title: Power off/Restart dialog"
105105msgid "Power"
106106msgstr "Enaouiñ"
107107
108−#: qml/Components/Dialogs.qml:199
108+#: qml/Components/Dialogs.qml:198
109109msgid ""
110110"Are you sure you would like\n"
111111"to power off?"
@@ -113,28 +113,198 @@ msgstr ""
113113"Ha sur oc'h e fell deoc'h\n"
114114"troc'hañ an tredan ?"
115115
116−#: qml/Components/Dialogs.qml:201
116+#: qml/Components/Dialogs.qml:200
117117msgctxt "Button: Power off the system"
118118msgid "Power off"
119119msgstr "Lazhañ"
120120
121−#: qml/Components/Dialogs.qml:210
121+#: qml/Components/Dialogs.qml:209
122122msgctxt "Button: Restart the system"
123123msgid "Restart"
124124msgstr "Adloc'hañ"
125125
126−#: qml/Components/Lockscreen.qml:231
126+#: qml/Components/KeyboardShortcutsOverlay.qml:41
127+msgid "Keyboard Shortcuts"
128+msgstr ""
129+
130+#: qml/Components/KeyboardShortcutsOverlay.qml:55
131+msgid "Unity 8"
132+msgstr ""
133+
134+#: qml/Components/KeyboardShortcutsOverlay.qml:62
135+msgid "PrtScr"
136+msgstr ""
137+
138+#: qml/Components/KeyboardShortcutsOverlay.qml:67
139+msgid "Takes a screenshot."
140+msgstr ""
141+
142+#: qml/Components/KeyboardShortcutsOverlay.qml:75
143+msgid "Alt + PrtScr"
144+msgstr ""
145+
146+#: qml/Components/KeyboardShortcutsOverlay.qml:80
147+msgid "Takes a screenshot of a window."
148+msgstr ""
149+
150+#: qml/Components/KeyboardShortcutsOverlay.qml:88
151+msgid "Super + Space"
152+msgstr ""
153+
154+#: qml/Components/KeyboardShortcutsOverlay.qml:93
155+msgid "Switches to next keyboard layout."
156+msgstr ""
157+
158+#: qml/Components/KeyboardShortcutsOverlay.qml:101
159+msgid "Super + Shift + Space"
160+msgstr ""
161+
162+#: qml/Components/KeyboardShortcutsOverlay.qml:106
163+msgid "Switches to previous keyboard layout."
164+msgstr ""
165+
166+#: qml/Components/KeyboardShortcutsOverlay.qml:118
167+msgid "Launcher"
168+msgstr ""
169+
170+#: qml/Components/KeyboardShortcutsOverlay.qml:125
171+msgid "Super (Hold)"
172+msgstr ""
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:130
175+msgid "Opens the launcher, displays shortcuts."
176+msgstr ""
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:138
179+msgid "Alt + F1"
180+msgstr ""
181+
182+#: qml/Components/KeyboardShortcutsOverlay.qml:143
183+msgid "Opens launcher keyboard navigation mode."
184+msgstr ""
185+
186+#: qml/Components/KeyboardShortcutsOverlay.qml:151
187+msgid "Super + Tab"
188+msgstr ""
189+
190+#: qml/Components/KeyboardShortcutsOverlay.qml:156
191+msgid "Switches applications via the launcher."
192+msgstr ""
193+
194+#: qml/Components/KeyboardShortcutsOverlay.qml:164
195+msgid "Super + 0 to 9"
196+msgstr ""
197+
198+#: qml/Components/KeyboardShortcutsOverlay.qml:169
199+msgid "Same as clicking on a launcher icon."
200+msgstr ""
201+
202+#: qml/Components/KeyboardShortcutsOverlay.qml:181
203+msgid "Scopes"
204+msgstr ""
205+
206+#: qml/Components/KeyboardShortcutsOverlay.qml:188
207+msgid "Super (Tap)"
208+msgstr ""
209+
210+#: qml/Components/KeyboardShortcutsOverlay.qml:193
211+msgid "Opens the Scopes home."
212+msgstr ""
213+
214+#: qml/Components/KeyboardShortcutsOverlay.qml:209
215+msgid "Switching"
216+msgstr ""
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:216
219+msgid "Alt + Tab"
220+msgstr ""
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:221
223+msgid "Switches between applications."
224+msgstr ""
225+
226+#: qml/Components/KeyboardShortcutsOverlay.qml:229
227+msgid "Super + W"
228+msgstr ""
229+
230+#: qml/Components/KeyboardShortcutsOverlay.qml:234
231+msgid "Opens the desktop spread."
232+msgstr ""
233+
234+#: qml/Components/KeyboardShortcutsOverlay.qml:242
235+msgid "Cursor Left or Right"
236+msgstr ""
237+
238+#: qml/Components/KeyboardShortcutsOverlay.qml:247
239+msgid "Moves the focus."
240+msgstr ""
241+
242+#: qml/Components/KeyboardShortcutsOverlay.qml:259
243+msgid "Windows"
244+msgstr ""
245+
246+#: qml/Components/KeyboardShortcutsOverlay.qml:266
247+msgid "Ctrl + Super + D"
248+msgstr ""
249+
250+#: qml/Components/KeyboardShortcutsOverlay.qml:271
251+msgid "Minimizes all windows."
252+msgstr ""
253+
254+#: qml/Components/KeyboardShortcutsOverlay.qml:279
255+msgid "Ctrl + Super + Up"
256+msgstr ""
257+
258+#: qml/Components/KeyboardShortcutsOverlay.qml:284
259+msgid "Maximizes the current window."
260+msgstr ""
261+
262+#: qml/Components/KeyboardShortcutsOverlay.qml:292
263+msgid "Ctrl + Super + Down"
264+msgstr ""
265+
266+#: qml/Components/KeyboardShortcutsOverlay.qml:297
267+msgid "Minimizes or restores the current window."
268+msgstr ""
269+
270+#: qml/Components/KeyboardShortcutsOverlay.qml:305
271+msgid "Ctrl + Super + Left or Right"
272+msgstr ""
273+
274+#: qml/Components/KeyboardShortcutsOverlay.qml:310
275+msgid "Semi-maximizes the current window."
276+msgstr ""
277+
278+#: qml/Components/KeyboardShortcutsOverlay.qml:318
279+msgid "Alt + F4"
280+msgstr ""
281+
282+#: qml/Components/KeyboardShortcutsOverlay.qml:323
283+msgid "Closes the current window."
284+msgstr ""
285+
286+#: qml/Components/Lockscreen.qml:239
127287msgid "Return to Call"
128288msgstr "Distreiñ d'ar bellgomzadenn"
129289
130−#: qml/Components/Lockscreen.qml:231
290+#: qml/Components/Lockscreen.qml:239
131291msgid "Emergency Call"
132292msgstr "Pellgomzadenn vallus"
133293
134−#: qml/Components/Lockscreen.qml:263
294+#: qml/Components/Lockscreen.qml:271
135295msgid "OK"
136296msgstr "Mat eo"
137297
298+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
299+#, qt-format
300+msgid "%1:%2:%3"
301+msgstr ""
302+
303+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
304+#, qt-format
305+msgid "%1:%2"
306+msgstr ""
307+
138308#: qml/Components/ModeSwitchWarningDialog.qml:32
139309msgid "Apps may have unsaved data:"
140310msgstr "Roadennoù ha n'int ket enrollet a c'hall bezañ gant an arloadoù :"
@@ -144,6 +314,8 @@ msgctxt ""
144314"Re-dock means connect the device again to an external screen/mouse/keyboard"
145315msgid "Re-dock, save your work and close these apps to continue."
146316msgstr ""
317+"Adkevreit ouzh ar savlec'h degemer, enrollot ho labour ha serrit an arloadoù-"
318+"mañ evit kenderc'hel."
147319
148320#: qml/Components/ModeSwitchWarningDialog.qml:63
149321msgid "Or force close now (unsaved data will be lost)."
@@ -162,57 +334,61 @@ msgstr "Adkevreañ bremañ !"
162334msgid "Close all"
163335msgstr "Serriñ pep tra"
164336
165−#: qml/Dash/DashPageHeader.qml:337
337+#: qml/Components/SharingPicker.qml:54
338+msgid "Preview Share Item"
339+msgstr "Rakwelet an elfenn lodet"
340+
341+#: qml/Dash/DashPageHeader.qml:333
166342msgctxt "Button: Open the Ubuntu Store"
167343msgid "Store"
168344msgstr "Stal"
169345
170−#: qml/Dash/DashPageHeader.qml:344
346+#: qml/Dash/DashPageHeader.qml:340
171347msgctxt "Button: Start a search in the current dash scope"
172348msgid "Search"
173349msgstr "Klask"
174350
175−#: qml/Dash/DashPageHeader.qml:354
351+#: qml/Dash/DashPageHeader.qml:350
176352msgctxt "Button: Show the current dash scope settings"
177353msgid "Settings"
178354msgstr "Arventennoù"
179355
180−#: qml/Dash/DashPageHeader.qml:361
356+#: qml/Dash/DashPageHeader.qml:357
181357msgid "Remove from Favorites"
182358msgstr "Lemel eus ar sinedoù"
183359
184−#: qml/Dash/DashPageHeader.qml:361
360+#: qml/Dash/DashPageHeader.qml:357
185361msgid "Add to Favorites"
186362msgstr "Ouzhpennañ d'ar sinedoù"
187363
188364#: qml/Dash/FiltersPopover.qml:60
189365msgid "Refine your results"
190−msgstr ""
366+msgstr "Purañ ho tisoc'hoù"
191367
192368#: qml/Dash/FiltersPopover.qml:69
193369msgid "Reset"
194−msgstr ""
370+msgstr "Adderaouekaat"
195371
196−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
197−msgid "See less"
198−msgstr "Gwelet nebeutoc'h"
372+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
373+msgid "Show less"
374+msgstr ""
199375
200−#: qml/Dash/GenericScopeView.qml:570
201−msgid "See all"
202−msgstr "Gwelet pep tra"
376+#: qml/Dash/GenericScopeView.qml:580
377+msgid "Show all"
378+msgstr ""
203379
204−#: qml/Dash/GenericScopeView.qml:627
380+#: qml/Dash/GenericScopeView.qml:637
205381msgctxt "Label: Hint for dash search line edit"
206382msgid "Search"
207383msgstr "Klask"
208384
209−#: qml/Dash/PageHeaderExtraPanel.qml:55
385+#: qml/Dash/PageHeaderExtraPanel.qml:56
210386msgid "Recent Searches"
211−msgstr ""
387+msgstr "Enklaskoù graet nevez zo"
212388
213−#: qml/Dash/PageHeaderExtraPanel.qml:66
389+#: qml/Dash/PageHeaderExtraPanel.qml:67
214390msgid "Clear All"
215−msgstr ""
391+msgstr "Diverkañ pep tra"
216392
217393#: qml/Dash/Previews/PreviewActionCombo.qml:35
218394msgid "More..."
@@ -223,22 +399,18 @@ msgid "Less..."
223399msgstr "Nebeutoc'h..."
224400
225401#: qml/Dash/Previews/PreviewCommentInput.qml:68
226−#: qml/Dash/Previews/PreviewRatingInput.qml:174
402+#: qml/Dash/Previews/PreviewRatingInput.qml:175
227403msgid "Send"
228404msgstr "Kas"
229405
230−#: qml/Dash/Previews/PreviewRatingInput.qml:84
406+#: qml/Dash/Previews/PreviewRatingInput.qml:82
231407msgid "Rate this"
232408msgstr "Priziit an dra-mañ"
233409
234−#: qml/Dash/Previews/PreviewRatingInput.qml:129
410+#: qml/Dash/Previews/PreviewRatingInput.qml:157
235411msgid "Add a review"
236412msgstr "Ouzhpennañ un ali"
237413
238−#: qml/Dash/Previews/PreviewSharing.qml:66
239−msgid "Preview Share Item"
240−msgstr "Rakwelet an elfenn lodet"
241−
242414#: qml/Dash/PullToRefreshScopeStyle.qml:55
243415msgid "Pull to refresh…"
244416msgstr "Tennañ evit freskaat..."
@@ -251,49 +423,61 @@ msgstr "Lezel da vont evit freskaat..."
251423msgid "Enable location data"
252424msgstr "Gweredekaat ar roadennoù lec'hiañ"
253425
254−#: qml/Dash/ScopesList.qml:67
426+#: qml/Dash/ScopesList.qml:55
255427msgid "Manage"
256428msgstr "Merañ"
257429
258−#: qml/Dash/ScopesList.qml:113
430+#: qml/Dash/ScopesList.qml:102
259431msgid "Home"
260432msgstr "Er gêr"
261433
262−#: qml/Dash/ScopesList.qml:114
434+#: qml/Dash/ScopesList.qml:103
263435msgid "Also installed"
264436msgstr "Staliet ivez"
265437
266−#: qml/DisabledScreenNotice.qml:104
438+#: qml/DisabledScreenNotice.qml:109
267439msgid ""
268440"Your device is now connected to an external display. Use this screen as a "
269441"touch pad to interact with the pointer."
270442msgstr ""
271443
272−#: qml/Greeter/CoverPage.qml:118
444+#: qml/Greeter/CoverPage.qml:127
273445msgid "Unlock"
274446msgstr "Dibrennañ"
275447
276−#: qml/Greeter/LoginList.qml:239
448+#: qml/Greeter/Greeter.qml:555
449+msgid "Try again"
450+msgstr ""
451+
452+#: qml/Greeter/LoginList.qml:63
453+msgid "Passphrase"
454+msgstr ""
455+
456+#: qml/Greeter/LoginList.qml:64
457+msgid "Passcode"
458+msgstr ""
459+
460+#: qml/Greeter/LoginList.qml:87
277461msgid "Retry"
278462msgstr "Esaeañ en-dro"
279463
280−#: qml/Greeter/LoginList.qml:240
281−msgid "Tap to unlock"
282−msgstr "Pouezañ evit dibrennañ"
464+#: qml/Greeter/LoginList.qml:88
465+msgid "Log In"
466+msgstr ""
283467
284−#: qml/Greeter/NarrowView.qml:54
468+#: qml/Greeter/NarrowView.qml:55
285469msgid "Sorry, incorrect passphrase."
286470msgstr "Siwazh, frazenn-dremen direizh"
287471
288−#: qml/Greeter/NarrowView.qml:55
472+#: qml/Greeter/NarrowView.qml:56
289473msgid "Sorry, incorrect passcode."
290474msgstr "Siwazh, kod-tremen direizh"
291475
292−#: qml/Greeter/NarrowView.qml:56
476+#: qml/Greeter/NarrowView.qml:57
293477msgid "This will be your last attempt."
294478msgstr "Ho taol-esae diwezhañ e vo."
295479
296−#: qml/Greeter/NarrowView.qml:58
480+#: qml/Greeter/NarrowView.qml:59
297481msgid ""
298482"If passphrase is entered incorrectly, your phone will conduct a factory "
299483"reset and all personal data will be deleted."
@@ -301,7 +485,7 @@ msgstr ""
301485"Ma vez ebarzhet ur frazenn-dremen direizh, e vo adderaouekaet ho pellgomzer "
302486"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel"
303487
304−#: qml/Greeter/NarrowView.qml:59
488+#: qml/Greeter/NarrowView.qml:60
305489msgid ""
306490"If passcode is entered incorrectly, your phone will conduct a factory reset "
307491"and all personal data will be deleted."
@@ -309,38 +493,38 @@ msgstr ""
309493"Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
310494"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
311495
312−#: qml/Greeter/NarrowView.qml:116
496+#: qml/Greeter/NarrowView.qml:129
313497#, qt-format
314498msgid "Enter %1"
315499msgstr "Merkañ %1"
316500
317−#: qml/Greeter/NarrowView.qml:117
501+#: qml/Greeter/NarrowView.qml:130
318502msgid "Enter passphrase"
319503msgstr "Merkañ ar frazenn-dremen"
320504
321−#: qml/Greeter/NarrowView.qml:118
505+#: qml/Greeter/NarrowView.qml:131
322506msgid "Enter passcode"
323507msgstr "Merkañ ar c'hod-tremen"
324508
325−#: qml/Greeter/NarrowView.qml:119
509+#: qml/Greeter/NarrowView.qml:135
326510#, qt-format
327511msgid "Sorry, incorrect %1"
328512msgstr "Siwazh, %1 direizh"
329513
330−#: qml/Greeter/NarrowView.qml:120
514+#: qml/Greeter/NarrowView.qml:136
331515msgid "Sorry, incorrect passphrase"
332516msgstr "Siwazh, frazenn-dremen direizh"
333517
334−#: qml/Greeter/NarrowView.qml:121
518+#: qml/Greeter/NarrowView.qml:137
335519msgctxt "passphrase"
336520msgid "Please re-enter"
337521msgstr "Adverkañ, mar plij"
338522
339−#: qml/Greeter/NarrowView.qml:122
523+#: qml/Greeter/NarrowView.qml:138
340524msgid "Sorry, incorrect passcode"
341525msgstr "Digarezit, kod-tremen direizh"
342526
343−#: qml/Notifications/NotificationMenuItemFactory.qml:129
527+#: qml/Notifications/NotificationMenuItemFactory.qml:124
344528msgid "Show password"
345529msgstr "Diskouez ar ger-tremen"
346530
@@ -352,77 +536,77 @@ msgstr "Touchit evit distreiñ d'ar bellgomzadenn..."
352536msgid "Conference"
353537msgstr "Kendiviz"
354538
355−#: qml/Panel/Indicators/MenuItemFactory.qml:761
539+#: qml/Panel/Indicators/MenuItemFactory.qml:762
356540msgid "Nothing is playing"
357541msgstr "Ne lenner netra bremañ"
358542
359−#: qml/Panel/Indicators/MenuItemFactory.qml:890
543+#: qml/Panel/Indicators/MenuItemFactory.qml:891
360544#, qt-format
361545msgid "%1 hour"
362546msgid_plural "%1 hours"
363547msgstr[0] "%1 eur"
364548msgstr[1] "%1 eur"
365549
366−#: qml/Panel/Indicators/MenuItemFactory.qml:894
550+#: qml/Panel/Indicators/MenuItemFactory.qml:895
367551#, qt-format
368552msgid "%1 minute"
369553msgid_plural "%1 minutes"
370554msgstr[0] "%1 vunutenn"
371555msgstr[1] "%1 vunutenn"
372556
373−#: qml/Panel/Indicators/MenuItemFactory.qml:899
557+#: qml/Panel/Indicators/MenuItemFactory.qml:900
374558#, qt-format
375559msgid "%1 second"
376560msgid_plural "%1 seconds"
377561msgstr[0] "%1 eilenn"
378562msgstr[1] "%1 eilenn"
379563
380−#: qml/Panel/Indicators/MenuItemFactory.qml:902
564+#: qml/Panel/Indicators/MenuItemFactory.qml:903
381565msgid "0 seconds"
382566msgstr "0 eilenn"
383567
384568#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
385−#: qml/Panel/Indicators/MenuItemFactory.qml:904
569+#: qml/Panel/Indicators/MenuItemFactory.qml:905
386570#, qt-format
387571msgid "%1 remaining"
388572msgstr "%1 o chom"
389573
390−#: qml/Panel/Indicators/MenuItemFactory.qml:910
574+#: qml/Panel/Indicators/MenuItemFactory.qml:911
391575msgid "In queue…"
392576msgstr "El lostennad..."
393577
394−#: qml/Panel/Indicators/MenuItemFactory.qml:914
578+#: qml/Panel/Indicators/MenuItemFactory.qml:915
395579msgid "Downloading"
396580msgstr "O pellgargañ"
397581
398−#: qml/Panel/Indicators/MenuItemFactory.qml:916
582+#: qml/Panel/Indicators/MenuItemFactory.qml:917
399583msgid "Paused, tap to resume"
400584msgstr "Ehanet, touchit evit adkregiñ"
401585
402−#: qml/Panel/Indicators/MenuItemFactory.qml:918
586+#: qml/Panel/Indicators/MenuItemFactory.qml:919
403587msgid "Canceled"
404588msgstr "Nullet"
405589
406−#: qml/Panel/Indicators/MenuItemFactory.qml:920
590+#: qml/Panel/Indicators/MenuItemFactory.qml:921
407591msgid "Finished"
408592msgstr "Echu"
409593
410−#: qml/Panel/Indicators/MenuItemFactory.qml:922
594+#: qml/Panel/Indicators/MenuItemFactory.qml:923
411595msgid "Failed, tap to retry"
412596msgstr "C'hwitet, touchit evit adkregiñ"
413597
414−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
415−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
598+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
599+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
416600msgctxt "Button: Send a reply message"
417601msgid "Send"
418602msgstr "Kas"
419603
420−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
604+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
421605msgctxt "Label: Hint in message indicator line edit"
422606msgid "Reply"
423607msgstr "Respont"
424608
425−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
609+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
426610msgctxt "Button: Call back on phone"
427611msgid "Call back"
428612msgstr "Gervel en-dro"
@@ -431,48 +615,24 @@ msgstr "Gervel en-dro"
431615msgid "Drag using 3 fingers any application from one window to the other"
432616msgstr ""
433617
434−#: qml/Tutorial/TutorialBottom.qml:78
435−msgid "Swipe up to add a contact"
436−msgstr ""
437−
438−#: qml/Tutorial/TutorialBottom.qml:80
439−msgid "Swipe up for favorite calculations"
440−msgstr ""
441−
442−#: qml/Tutorial/TutorialBottom.qml:82
443−msgid "Swipe up for recent calls"
444−msgstr ""
445−
446−#: qml/Tutorial/TutorialBottom.qml:84
447−msgid "Swipe up to create a message"
448−msgstr ""
449−
450−#: qml/Tutorial/TutorialBottom.qml:85
451−msgid "Swipe up to manage the app"
452−msgstr ""
453−
454−#: qml/Tutorial/TutorialLeft.qml:47
455−msgid "Swipe from the left edge to open the launcher"
456−msgstr ""
457−
458−#: qml/Tutorial/TutorialLeftLong.qml:47
618+#: qml/Tutorial/TutorialLeftLong.qml:49
459619msgid "Long swipe from the left edge to open the Today scope"
460620msgstr ""
461621
462−#: qml/Tutorial/TutorialRight.qml:54
463−msgid "Hover your mouse on the right edge to view your open apps"
622+#: qml/Tutorial/TutorialLeft.qml:47
623+msgid "Short swipe from the left edge to open the launcher"
464624msgstr ""
465625
466626#: qml/Tutorial/TutorialRight.qml:55
467−msgid "Short or long swipe from the right edge to view your open apps"
627+msgid "Push your mouse against the right edge to view your open apps"
468628msgstr ""
469629
470−#: qml/Tutorial/TutorialTop.qml:53
471−msgid "Swipe from the top right edge to open the notification bar"
630+#: qml/Tutorial/TutorialRight.qml:56
631+msgid "Swipe from the right edge to view your open apps"
472632msgstr ""
473633
474−#: qml/Tutorial/TutorialTop.qml:54
475−msgid "Swipe from the top edge to open the notification bar"
634+#: qml/Tutorial/TutorialTop.qml:53
635+msgid "Swipe from the top edge to access notifications and quick settings"
476636msgstr ""
477637
478638#: qml/Wizard/Page.qml:54
@@ -482,16 +642,16 @@ msgstr "Distreiñ"
482642
483643#: qml/Wizard/Pages/10-welcome.qml:27
484644msgid "Language"
485−msgstr ""
645+msgstr "Yezh"
486646
487−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
488−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
647+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
648+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
489649#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
490650#: qml/Wizard/Pages/75-report-check.qml:84
491−#: qml/Wizard/Pages/passcode-desktop.qml:124
651+#: qml/Wizard/Pages/passcode-desktop.qml:141
492652#: qml/Wizard/Pages/password-set.qml:141
493653msgid "Next"
494−msgstr ""
654+msgstr "War-lerc'h"
495655
496656#: qml/Wizard/Pages/30-wifi.qml:29
497657msgid "Connect to Wi‑Fi"
@@ -499,15 +659,15 @@ msgstr "Kevreañ ouzh ar Wi-Fi"
499659
500660#: qml/Wizard/Pages/30-wifi.qml:130
501661msgid "Connected"
502−msgstr ""
662+msgstr "Kevreet"
503663
504664#: qml/Wizard/Pages/30-wifi.qml:163
505665msgid "Available Wi-Fi networks"
506−msgstr ""
666+msgstr "Rouedadoù Wi-Fi da gaout"
507667
508668#: qml/Wizard/Pages/30-wifi.qml:164
509669msgid "No available Wi-Fi networks"
510−msgstr ""
670+msgstr "N'eus ket rouedadoù Wi-Fi da gaout"
511671
512672#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
513673#: qml/Wizard/Pages/sim.qml:101
@@ -516,7 +676,7 @@ msgstr "Tremen hebiou"
516676
517677#: qml/Wizard/Pages/40-location.qml:27
518678msgid "Location Services"
519−msgstr ""
679+msgstr "Servijoù lec'hiañ"
520680
521681#: qml/Wizard/Pages/40-location.qml:83
522682msgid ""
@@ -532,15 +692,15 @@ msgstr ""
532692#: qml/Wizard/Pages/40-location.qml:106
533693msgctxt "part of: Nokia HERE terms and conditions"
534694msgid "terms and conditions"
535−msgstr ""
695+msgstr "penndivizoù implij"
536696
537697#: qml/Wizard/Pages/40-location.qml:160
538698msgid "GPS only"
539−msgstr ""
699+msgstr "GPS hepken"
540700
541701#: qml/Wizard/Pages/40-location.qml:214
542702msgid "Don't use my location"
543−msgstr ""
703+msgstr "Arabat implijout ma lec'h"
544704
545705#: qml/Wizard/Pages/40-location.qml:260
546706msgid "You can change it later in System Settings."
@@ -548,15 +708,15 @@ msgstr ""
548708
549709#: qml/Wizard/Pages/50-timezone.qml:29
550710msgid "Time Zone"
551−msgstr ""
711+msgstr "Gwerzhid-eur"
552712
553−#: qml/Wizard/Pages/50-timezone.qml:178
713+#: qml/Wizard/Pages/50-timezone.qml:181
554714msgid "Enter your city"
555−msgstr ""
715+msgstr "Skrivit ho kêr"
556716
557717#: qml/Wizard/Pages/60-account.qml:24
558718msgid "Personalize Your Device"
559−msgstr ""
719+msgstr "Personelaat ho penveg"
560720
561721#: qml/Wizard/Pages/60-account.qml:48
562722msgid "Preferred Name"
@@ -564,30 +724,30 @@ msgstr ""
564724
565725#: qml/Wizard/Pages/70-passwd-type.qml:39
566726msgid "Lock Screen"
567−msgstr ""
727+msgstr "Prennañ ar skramm"
568728
569729#: qml/Wizard/Pages/70-passwd-type.qml:101
570730msgctxt "Label: Type of security method"
571731msgid "Create new password"
572−msgstr ""
732+msgstr "Krouiñ ur ger-tremen nevez"
573733
574734#: qml/Wizard/Pages/70-passwd-type.qml:103
575735msgctxt "Label: Type of security method"
576736msgid "Create passcode (numbers only)"
577−msgstr ""
737+msgstr "Krouiñ ur c'hod (difroù hepken)"
578738
579739#: qml/Wizard/Pages/70-passwd-type.qml:105
580740msgctxt "Label: Type of security method"
581741msgid "No lock code"
582−msgstr ""
742+msgstr "N'eus kod prennañ ebet"
583743
584744#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
585745msgid "Privacy Policy"
586−msgstr ""
746+msgstr "Reolennoù prevezded"
587747
588748#: qml/Wizard/Pages/75-report-check.qml:26
589749msgid "Help Us Improve"
590−msgstr ""
750+msgstr "Sikourit ac'hanomp da wellaat"
591751
592752#: qml/Wizard/Pages/75-report-check.qml:59
593753msgid "Improve system performance by sending us crashes and error reports."
@@ -595,19 +755,19 @@ msgstr ""
595755
596756#: qml/Wizard/Pages/75-report-check.qml:60
597757msgid "Privacy policy"
598−msgstr ""
758+msgstr "Reolennoù buhez prevez"
599759
600760#: qml/Wizard/Pages/80-finished.qml:89
601761msgid "Welcome to Ubuntu"
602−msgstr ""
762+msgstr "Donemat en Ubuntu"
603763
604764#: qml/Wizard/Pages/80-finished.qml:104
605765msgid "You are ready to use your device now"
606−msgstr ""
766+msgstr "Bremañ oc'h prest da implijout ho penveg"
607767
608768#: qml/Wizard/Pages/80-finished.qml:124
609769msgid "Get Started"
610−msgstr ""
770+msgstr "Kregiñ ganti"
611771
612772#: qml/Wizard/Pages/here-terms.qml:25
613773msgid "Terms & Conditions"
@@ -637,74 +797,74 @@ msgstr ""
637797
638798#: qml/Wizard/Pages/here-terms.qml:107
639799msgid "Service Terms"
640−msgstr ""
800+msgstr "Divizoù servij"
641801
642802#: qml/Wizard/Pages/passcode-confirm.qml:43
643−#: qml/Wizard/Pages/passcode-desktop.qml:80
803+#: qml/Wizard/Pages/passcode-desktop.qml:96
644804msgid "Confirm passcode"
645805msgstr "Kadarnaat ar c'hod-tremen"
646806
647807#: qml/Wizard/Pages/passcode-confirm.qml:45
648808msgid "Incorrect passcode."
649−msgstr ""
809+msgstr "Kod direizh"
650810
651811#: qml/Wizard/Pages/passcode-confirm.qml:45
652812msgctxt "Enter the passcode again"
653813msgid "Please re-enter."
654−msgstr ""
814+msgstr "Skrivit adarre, mar plij."
655815
656816#: qml/Wizard/Pages/passcode-desktop.qml:30
657817msgid "Lock Screen Passcode"
658−msgstr ""
818+msgstr "Kod da brennañ ar skramm"
659819
660−#: qml/Wizard/Pages/passcode-desktop.qml:56
820+#: qml/Wizard/Pages/passcode-desktop.qml:60
661821msgid "Enter 4 numbers to setup your passcode"
662−msgstr ""
822+msgstr "Skrivit 4 sifr evit lakaat ho kod"
663823
664−#: qml/Wizard/Pages/passcode-desktop.qml:65
824+#: qml/Wizard/Pages/passcode-desktop.qml:76
665825#: qml/Wizard/Pages/passcode-set.qml:54
666826msgid "Choose passcode"
667−msgstr ""
827+msgstr "Choaz ur c'hod"
668828
669−#: qml/Wizard/Pages/passcode-desktop.qml:105
829+#: qml/Wizard/Pages/passcode-desktop.qml:126
670830msgid "Passcode too short"
671−msgstr ""
831+msgstr "Kod re verr"
672832
673−#: qml/Wizard/Pages/passcode-desktop.qml:107
833+#: qml/Wizard/Pages/passcode-desktop.qml:128
674834msgid "Passcodes match"
675−msgstr ""
835+msgstr "klotañ a ra ar c'hodoù an eil gant egile"
676836
677−#: qml/Wizard/Pages/passcode-desktop.qml:109
837+#: qml/Wizard/Pages/passcode-desktop.qml:130
678838msgid "Passcodes do not match"
679−msgstr ""
839+msgstr "Ne glot ket ar c'hodoù an eil gant egile"
680840
681841#: qml/Wizard/Pages/passcode-set.qml:62
682842msgid "Passcode must be 4 characters long"
683−msgstr ""
843+msgstr "4 arouezenn a rank bezañ ar c'hod"
684844
685845#: qml/Wizard/Pages/password-set.qml:30
686846msgid "Lock Screen Password"
687−msgstr ""
847+msgstr "Ger-tremen da brennañ ar skramm"
688848
689849#: qml/Wizard/Pages/password-set.qml:61
690850msgid "Enter at least 8 characters"
691−msgstr ""
851+msgstr "Skrivit 8 arouezenn da vihanañ"
692852
693853#: qml/Wizard/Pages/password-set.qml:73
694854msgid "Choose password"
695−msgstr ""
855+msgstr "Choaz ur ger-tremen"
696856
697857#: qml/Wizard/Pages/password-set.qml:103
698858msgid "Confirm password"
699−msgstr ""
859+msgstr "Kadarnaat ar ger-tremen"
700860
701861#: qml/Wizard/Pages/sim.qml:27
702862msgid "No SIM card installed"
703−msgstr ""
863+msgstr "N'eus kartenn SIM ebet"
704864
705865#: qml/Wizard/Pages/sim.qml:54
706866msgid "SIM card added"
707−msgstr ""
867+msgstr "Lakaet ez eus bet ur gartenn SIM"
708868
709869#: qml/Wizard/Pages/sim.qml:55
710870msgid "You must restart the device to access the mobile network."
@@ -723,28 +883,32 @@ msgid "To proceed with no SIM tap Skip."
723883msgstr ""
724884
725885#: qml/Wizard/PasswordMeter.qml:87
726−msgid "Passwords match"
886+msgid "Password too short"
727887msgstr ""
728888
729889#: qml/Wizard/PasswordMeter.qml:89
890+msgid "Passwords match"
891+msgstr "Klotañ a ra ar gerioù-tremen an eil gant egile"
892+
893+#: qml/Wizard/PasswordMeter.qml:91
730894msgid "Passwords do not match"
731−msgstr ""
895+msgstr "Ne glot ket ar gerioù-tremen"
732896
733−#: qml/Wizard/PasswordMeter.qml:93
897+#: qml/Wizard/PasswordMeter.qml:95
734898msgid "Strong password"
735−msgstr ""
899+msgstr "Ger-tremen sur"
736900
737−#: qml/Wizard/PasswordMeter.qml:95
901+#: qml/Wizard/PasswordMeter.qml:97
738902msgid "Fair password"
739−msgstr ""
903+msgstr "Ger-tremen reizh"
740904
741−#: qml/Wizard/PasswordMeter.qml:97
905+#: qml/Wizard/PasswordMeter.qml:99
742906msgid "Weak password"
743−msgstr ""
907+msgstr "Ger-tremen diasur"
744908
745−#: qml/Wizard/PasswordMeter.qml:99
909+#: qml/Wizard/PasswordMeter.qml:101
746910msgid "Very weak password"
747−msgstr ""
911+msgstr "Ger-tremen diasur-kenañ"
748912
749913#~ msgid "Close"
750914#~ msgstr "Serriñ"
@@ -761,6 +925,9 @@ msgstr ""
761925#~ msgid "Right edge"
762926#~ msgstr "Bord dehoù"
763927
928+#~ msgid "See less"
929+#~ msgstr "Gwelet nebeutoc'h"
930+
764931#~ msgid ""
765932#~ "You have now mastered the edge gestures and can start using the "
766933#~ "phone<br><br>Tap on the screen to start"
@@ -806,6 +973,9 @@ msgstr ""
806973#~ msgid "Type or say a command"
807974#~ msgstr "Skrivit pe lavarit un urzhiad"
808975
976+#~ msgid "See all"
977+#~ msgstr "Gwelet pep tra"
978+
809979#~ msgid "Store"
810980#~ msgstr "Enrollañ"
811981
@@ -957,6 +1127,9 @@ msgstr ""
9571127#~ msgid "%1 〉"
9581128#~ msgstr "%1 〉"
9591129
1130+#~ msgid "Tap to unlock"
1131+#~ msgstr "Pouezañ evit dibrennañ"
1132+
9601133#~ msgid "This action does different things for different apps"
9611134#~ msgstr "An ober-mañ a ra meur a dra evit meur a arload"
9621135
@@ -1065,11 +1238,8 @@ msgstr ""
10651238#~ msgid "Call back"
10661239#~ msgstr "Gervel en-dro"
10671240
1068−#~ msgid "Welcome to your Ubuntu device."
1069−#~ msgstr "Donemat en ho penveg Ubuntu"
1070−
1071−#~ msgid "Please select how you’d like to unlock your device."
1072−#~ msgstr "Diuzit penaos e fell deoc'h dibrennañ ho penveg, mar plij."
1241+#~ msgid "Swipe up to add a contact"
1242+#~ msgstr "Riklit d'an nec'h evit ouzhpennañ un darempred"
10731243
1074−#~ msgid "Your device is now ready to use."
1075−#~ msgstr "Prest eo ho penveg da vezañ implijet bremañ."
1244+#~ msgid "Swipe up to create a message"
1245+#~ msgstr "Riklit d'an nec'h evit krouiñ ur gemennadenn"
po/bs.po+299−128
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
1111"PO-Revision-Date: 2015-12-01 20:06+0000\n"
1212"Last-Translator: Kenan Gutić <Unknown>\n"
1313"Language-Team: Bosnian <bs@li.org>\n"
@@ -16,39 +16,39 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
20+"X-Generator: Launchpad (build 18147)\n"
2121
22−#: plugins/IntegratedLightDM/Greeter.cpp:112
22+#: plugins/LightDM/Greeter.cpp:123
2323msgid "Password: "
2424msgstr "Šifra: "
2525
26−#: plugins/Unity/Launcher/launcheritem.cpp:48
27−#: plugins/Unity/Launcher/launcheritem.cpp:107
26+#: plugins/Unity/Launcher/launcheritem.cpp:49
27+#: plugins/Unity/Launcher/launcheritem.cpp:108
2828msgid "Pin shortcut"
2929msgstr "Prikačite prečicu"
3030
31−#: plugins/Unity/Launcher/launcheritem.cpp:53
31+#: plugins/Unity/Launcher/launcheritem.cpp:54
3232msgid "Quit"
3333msgstr "Napusti"
3434
35−#: plugins/Unity/Launcher/launcheritem.cpp:107
35+#: plugins/Unity/Launcher/launcheritem.cpp:108
3636msgid "Unpin shortcut"
3737msgstr "Otkačite prečicu"
3838
39−#: qml/Components/DelayedLockscreen.qml:49
39+#: qml/Components/DelayedLockscreen.qml:50
4040msgid "Device Locked"
4141msgstr "Uređaj zaključan"
4242
43−#: qml/Components/DelayedLockscreen.qml:64
43+#: qml/Components/DelayedLockscreen.qml:65
4444msgid "You have been locked out due to too many failed passphrase attempts."
4545msgstr "Izbačeni ste zbog previše neuspjelih pokušaja unosa pristupne fraze."
4646
47−#: qml/Components/DelayedLockscreen.qml:65
47+#: qml/Components/DelayedLockscreen.qml:66
4848msgid "You have been locked out due to too many failed passcode attempts."
4949msgstr "Izbačeni ste zbog previše neuspjelih pokušaja unosa pristupnog koda."
5050
51−#: qml/Components/DelayedLockscreen.qml:74
51+#: qml/Components/DelayedLockscreen.qml:75
5252#, qt-format
5353msgid "Please wait %1 minute and then try again…"
5454msgid_plural "Please wait %1 minutes and then try again…"
@@ -75,8 +75,8 @@ msgctxt "Button: Log out from the system"
7575msgid "Log Out"
7676msgstr "Odjavi se"
7777
78−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
79−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
78+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
79+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
8080#: qml/Wizard/Pages/passcode-set.qml:32
8181msgid "Cancel"
8282msgstr "Otkaži"
@@ -94,16 +94,16 @@ msgstr "Da li ste sigurni da želite ponovo pokrenuti?"
9494msgid "No"
9595msgstr "Ne"
9696
97−#: qml/Components/Dialogs.qml:183
97+#: qml/Components/Dialogs.qml:182
9898msgid "Yes"
9999msgstr "Da"
100100
101−#: qml/Components/Dialogs.qml:198
101+#: qml/Components/Dialogs.qml:197
102102msgctxt "Title: Power off/Restart dialog"
103103msgid "Power"
104104msgstr "Napajanje"
105105
106−#: qml/Components/Dialogs.qml:199
106+#: qml/Components/Dialogs.qml:198
107107msgid ""
108108"Are you sure you would like\n"
109109"to power off?"
@@ -111,28 +111,198 @@ msgstr ""
111111"Da li ste sigurni da želite\n"
112112"isključiti?"
113113
114−#: qml/Components/Dialogs.qml:201
114+#: qml/Components/Dialogs.qml:200
115115msgctxt "Button: Power off the system"
116116msgid "Power off"
117117msgstr "Isključi"
118118
119−#: qml/Components/Dialogs.qml:210
119+#: qml/Components/Dialogs.qml:209
120120msgctxt "Button: Restart the system"
121121msgid "Restart"
122122msgstr "Restartuj"
123123
124−#: qml/Components/Lockscreen.qml:231
124+#: qml/Components/KeyboardShortcutsOverlay.qml:41
125+msgid "Keyboard Shortcuts"
126+msgstr ""
127+
128+#: qml/Components/KeyboardShortcutsOverlay.qml:55
129+msgid "Unity 8"
130+msgstr ""
131+
132+#: qml/Components/KeyboardShortcutsOverlay.qml:62
133+msgid "PrtScr"
134+msgstr ""
135+
136+#: qml/Components/KeyboardShortcutsOverlay.qml:67
137+msgid "Takes a screenshot."
138+msgstr ""
139+
140+#: qml/Components/KeyboardShortcutsOverlay.qml:75
141+msgid "Alt + PrtScr"
142+msgstr ""
143+
144+#: qml/Components/KeyboardShortcutsOverlay.qml:80
145+msgid "Takes a screenshot of a window."
146+msgstr ""
147+
148+#: qml/Components/KeyboardShortcutsOverlay.qml:88
149+msgid "Super + Space"
150+msgstr ""
151+
152+#: qml/Components/KeyboardShortcutsOverlay.qml:93
153+msgid "Switches to next keyboard layout."
154+msgstr ""
155+
156+#: qml/Components/KeyboardShortcutsOverlay.qml:101
157+msgid "Super + Shift + Space"
158+msgstr ""
159+
160+#: qml/Components/KeyboardShortcutsOverlay.qml:106
161+msgid "Switches to previous keyboard layout."
162+msgstr ""
163+
164+#: qml/Components/KeyboardShortcutsOverlay.qml:118
165+msgid "Launcher"
166+msgstr ""
167+
168+#: qml/Components/KeyboardShortcutsOverlay.qml:125
169+msgid "Super (Hold)"
170+msgstr ""
171+
172+#: qml/Components/KeyboardShortcutsOverlay.qml:130
173+msgid "Opens the launcher, displays shortcuts."
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:138
177+msgid "Alt + F1"
178+msgstr ""
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:143
181+msgid "Opens launcher keyboard navigation mode."
182+msgstr ""
183+
184+#: qml/Components/KeyboardShortcutsOverlay.qml:151
185+msgid "Super + Tab"
186+msgstr ""
187+
188+#: qml/Components/KeyboardShortcutsOverlay.qml:156
189+msgid "Switches applications via the launcher."
190+msgstr ""
191+
192+#: qml/Components/KeyboardShortcutsOverlay.qml:164
193+msgid "Super + 0 to 9"
194+msgstr ""
195+
196+#: qml/Components/KeyboardShortcutsOverlay.qml:169
197+msgid "Same as clicking on a launcher icon."
198+msgstr ""
199+
200+#: qml/Components/KeyboardShortcutsOverlay.qml:181
201+msgid "Scopes"
202+msgstr ""
203+
204+#: qml/Components/KeyboardShortcutsOverlay.qml:188
205+msgid "Super (Tap)"
206+msgstr ""
207+
208+#: qml/Components/KeyboardShortcutsOverlay.qml:193
209+msgid "Opens the Scopes home."
210+msgstr ""
211+
212+#: qml/Components/KeyboardShortcutsOverlay.qml:209
213+msgid "Switching"
214+msgstr ""
215+
216+#: qml/Components/KeyboardShortcutsOverlay.qml:216
217+msgid "Alt + Tab"
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:221
221+msgid "Switches between applications."
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:229
225+msgid "Super + W"
226+msgstr ""
227+
228+#: qml/Components/KeyboardShortcutsOverlay.qml:234
229+msgid "Opens the desktop spread."
230+msgstr ""
231+
232+#: qml/Components/KeyboardShortcutsOverlay.qml:242
233+msgid "Cursor Left or Right"
234+msgstr ""
235+
236+#: qml/Components/KeyboardShortcutsOverlay.qml:247
237+msgid "Moves the focus."
238+msgstr ""
239+
240+#: qml/Components/KeyboardShortcutsOverlay.qml:259
241+msgid "Windows"
242+msgstr ""
243+
244+#: qml/Components/KeyboardShortcutsOverlay.qml:266
245+msgid "Ctrl + Super + D"
246+msgstr ""
247+
248+#: qml/Components/KeyboardShortcutsOverlay.qml:271
249+msgid "Minimizes all windows."
250+msgstr ""
251+
252+#: qml/Components/KeyboardShortcutsOverlay.qml:279
253+msgid "Ctrl + Super + Up"
254+msgstr ""
255+
256+#: qml/Components/KeyboardShortcutsOverlay.qml:284
257+msgid "Maximizes the current window."
258+msgstr ""
259+
260+#: qml/Components/KeyboardShortcutsOverlay.qml:292
261+msgid "Ctrl + Super + Down"
262+msgstr ""
263+
264+#: qml/Components/KeyboardShortcutsOverlay.qml:297
265+msgid "Minimizes or restores the current window."
266+msgstr ""
267+
268+#: qml/Components/KeyboardShortcutsOverlay.qml:305
269+msgid "Ctrl + Super + Left or Right"
270+msgstr ""
271+
272+#: qml/Components/KeyboardShortcutsOverlay.qml:310
273+msgid "Semi-maximizes the current window."
274+msgstr ""
275+
276+#: qml/Components/KeyboardShortcutsOverlay.qml:318
277+msgid "Alt + F4"
278+msgstr ""
279+
280+#: qml/Components/KeyboardShortcutsOverlay.qml:323
281+msgid "Closes the current window."
282+msgstr ""
283+
284+#: qml/Components/Lockscreen.qml:239
125285msgid "Return to Call"
126286msgstr "Povratak na Poziv"
127287
128−#: qml/Components/Lockscreen.qml:231
288+#: qml/Components/Lockscreen.qml:239
129289msgid "Emergency Call"
130290msgstr "Hitan Poziv"
131291
132−#: qml/Components/Lockscreen.qml:263
292+#: qml/Components/Lockscreen.qml:271
133293msgid "OK"
134294msgstr "U redu"
135295
296+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
297+#, qt-format
298+msgid "%1:%2:%3"
299+msgstr ""
300+
301+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
302+#, qt-format
303+msgid "%1:%2"
304+msgstr ""
305+
136306#: qml/Components/ModeSwitchWarningDialog.qml:32
137307msgid "Apps may have unsaved data:"
138308msgstr "Aplikacije možda imaju podataka koji nisu sačuvani:"
@@ -161,26 +331,30 @@ msgstr "Ponovo poveži sada"
161331msgid "Close all"
162332msgstr "Zatvori sve"
163333
164−#: qml/Dash/DashPageHeader.qml:337
334+#: qml/Components/SharingPicker.qml:54
335+msgid "Preview Share Item"
336+msgstr "Pogledaj stavku koja se dijeli"
337+
338+#: qml/Dash/DashPageHeader.qml:333
165339msgctxt "Button: Open the Ubuntu Store"
166340msgid "Store"
167341msgstr "Trgovina"
168342
169−#: qml/Dash/DashPageHeader.qml:344
343+#: qml/Dash/DashPageHeader.qml:340
170344msgctxt "Button: Start a search in the current dash scope"
171345msgid "Search"
172346msgstr "Pretraživanje"
173347
174−#: qml/Dash/DashPageHeader.qml:354
348+#: qml/Dash/DashPageHeader.qml:350
175349msgctxt "Button: Show the current dash scope settings"
176350msgid "Settings"
177351msgstr "Podešavanja"
178352
179−#: qml/Dash/DashPageHeader.qml:361
353+#: qml/Dash/DashPageHeader.qml:357
180354msgid "Remove from Favorites"
181355msgstr "Ukloni iz Omiljenih"
182356
183−#: qml/Dash/DashPageHeader.qml:361
357+#: qml/Dash/DashPageHeader.qml:357
184358msgid "Add to Favorites"
185359msgstr "Dodaj u Omiljene"
186360
@@ -192,24 +366,24 @@ msgstr ""
192366msgid "Reset"
193367msgstr ""
194368
195−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
196−msgid "See less"
197−msgstr "Pogledati manje"
369+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
370+msgid "Show less"
371+msgstr ""
198372
199−#: qml/Dash/GenericScopeView.qml:570
200−msgid "See all"
201−msgstr "Pogledati sve"
373+#: qml/Dash/GenericScopeView.qml:580
374+msgid "Show all"
375+msgstr ""
202376
203−#: qml/Dash/GenericScopeView.qml:627
377+#: qml/Dash/GenericScopeView.qml:637
204378msgctxt "Label: Hint for dash search line edit"
205379msgid "Search"
206380msgstr "Pretraži"
207381
208−#: qml/Dash/PageHeaderExtraPanel.qml:55
382+#: qml/Dash/PageHeaderExtraPanel.qml:56
209383msgid "Recent Searches"
210384msgstr ""
211385
212−#: qml/Dash/PageHeaderExtraPanel.qml:66
386+#: qml/Dash/PageHeaderExtraPanel.qml:67
213387msgid "Clear All"
214388msgstr ""
215389
@@ -222,22 +396,18 @@ msgid "Less..."
222396msgstr "Manje..."
223397
224398#: qml/Dash/Previews/PreviewCommentInput.qml:68
225−#: qml/Dash/Previews/PreviewRatingInput.qml:174
399+#: qml/Dash/Previews/PreviewRatingInput.qml:175
226400msgid "Send"
227401msgstr "Pošalji"
228402
229−#: qml/Dash/Previews/PreviewRatingInput.qml:84
403+#: qml/Dash/Previews/PreviewRatingInput.qml:82
230404msgid "Rate this"
231405msgstr "Ocijeni ovo"
232406
233−#: qml/Dash/Previews/PreviewRatingInput.qml:129
407+#: qml/Dash/Previews/PreviewRatingInput.qml:157
234408msgid "Add a review"
235409msgstr "Dodaj recenziju"
236410
237−#: qml/Dash/Previews/PreviewSharing.qml:66
238−msgid "Preview Share Item"
239−msgstr "Pogledaj stavku koja se dijeli"
240−
241411#: qml/Dash/PullToRefreshScopeStyle.qml:55
242412msgid "Pull to refresh…"
243413msgstr "Povući za osvježavanje..."
@@ -250,49 +420,61 @@ msgstr "Pustiti za osvježavanje..."
250420msgid "Enable location data"
251421msgstr "Omogućiti podatke o lokaciji"
252422
253−#: qml/Dash/ScopesList.qml:67
423+#: qml/Dash/ScopesList.qml:55
254424msgid "Manage"
255425msgstr "Upravljanje"
256426
257−#: qml/Dash/ScopesList.qml:113
427+#: qml/Dash/ScopesList.qml:102
258428msgid "Home"
259429msgstr "Početna"
260430
261−#: qml/Dash/ScopesList.qml:114
431+#: qml/Dash/ScopesList.qml:103
262432msgid "Also installed"
263433msgstr "Također instalirano"
264434
265−#: qml/DisabledScreenNotice.qml:104
435+#: qml/DisabledScreenNotice.qml:109
266436msgid ""
267437"Your device is now connected to an external display. Use this screen as a "
268438"touch pad to interact with the pointer."
269439msgstr ""
270440
271−#: qml/Greeter/CoverPage.qml:118
441+#: qml/Greeter/CoverPage.qml:127
272442msgid "Unlock"
273443msgstr "Otključaj"
274444
275−#: qml/Greeter/LoginList.qml:239
445+#: qml/Greeter/Greeter.qml:555
446+msgid "Try again"
447+msgstr ""
448+
449+#: qml/Greeter/LoginList.qml:63
450+msgid "Passphrase"
451+msgstr ""
452+
453+#: qml/Greeter/LoginList.qml:64
454+msgid "Passcode"
455+msgstr ""
456+
457+#: qml/Greeter/LoginList.qml:87
276458msgid "Retry"
277459msgstr "Ponovi"
278460
279−#: qml/Greeter/LoginList.qml:240
280−msgid "Tap to unlock"
281−msgstr "Kucnite za otključavanje"
461+#: qml/Greeter/LoginList.qml:88
462+msgid "Log In"
463+msgstr ""
282464
283−#: qml/Greeter/NarrowView.qml:54
465+#: qml/Greeter/NarrowView.qml:55
284466msgid "Sorry, incorrect passphrase."
285467msgstr "Izvinite, pogrešna pristupna fraza."
286468
287−#: qml/Greeter/NarrowView.qml:55
469+#: qml/Greeter/NarrowView.qml:56
288470msgid "Sorry, incorrect passcode."
289471msgstr "Izvinite, pogrešan pristupni kod."
290472
291−#: qml/Greeter/NarrowView.qml:56
473+#: qml/Greeter/NarrowView.qml:57
292474msgid "This will be your last attempt."
293475msgstr "Ovo će biti vaš posljednji pokušaj."
294476
295−#: qml/Greeter/NarrowView.qml:58
477+#: qml/Greeter/NarrowView.qml:59
296478msgid ""
297479"If passphrase is entered incorrectly, your phone will conduct a factory "
298480"reset and all personal data will be deleted."
@@ -300,7 +482,7 @@ msgstr ""
300482"Ako je pristupna fraza unesena pogrešno, vaš telefon će sprovesti reset na "
301483"fabričke postavke i svi osobni podaci će biti izbrisani."
302484
303−#: qml/Greeter/NarrowView.qml:59
485+#: qml/Greeter/NarrowView.qml:60
304486msgid ""
305487"If passcode is entered incorrectly, your phone will conduct a factory reset "
306488"and all personal data will be deleted."
@@ -308,38 +490,38 @@ msgstr ""
308490"Ako je pristupni kod unesen netačno, vaš telefon će sprovesti reset na "
309491"fabričke postavke i svi osobni podaci će biti izbrisani."
310492
311−#: qml/Greeter/NarrowView.qml:116
493+#: qml/Greeter/NarrowView.qml:129
312494#, qt-format
313495msgid "Enter %1"
314496msgstr "Unesite %1"
315497
316−#: qml/Greeter/NarrowView.qml:117
498+#: qml/Greeter/NarrowView.qml:130
317499msgid "Enter passphrase"
318500msgstr "Unesite propusnu frazu"
319501
320−#: qml/Greeter/NarrowView.qml:118
502+#: qml/Greeter/NarrowView.qml:131
321503msgid "Enter passcode"
322504msgstr "Unesite pristupni kod"
323505
324−#: qml/Greeter/NarrowView.qml:119
506+#: qml/Greeter/NarrowView.qml:135
325507#, qt-format
326508msgid "Sorry, incorrect %1"
327509msgstr "Izvinite, netačno %1"
328510
329−#: qml/Greeter/NarrowView.qml:120
511+#: qml/Greeter/NarrowView.qml:136
330512msgid "Sorry, incorrect passphrase"
331513msgstr "Izvinite, netačna propusna fraza"
332514
333−#: qml/Greeter/NarrowView.qml:121
515+#: qml/Greeter/NarrowView.qml:137
334516msgctxt "passphrase"
335517msgid "Please re-enter"
336518msgstr "Molim ponovo unesite"
337519
338−#: qml/Greeter/NarrowView.qml:122
520+#: qml/Greeter/NarrowView.qml:138
339521msgid "Sorry, incorrect passcode"
340522msgstr "Izvinite, netačan pristupni kod"
341523
342−#: qml/Notifications/NotificationMenuItemFactory.qml:129
524+#: qml/Notifications/NotificationMenuItemFactory.qml:124
343525msgid "Show password"
344526msgstr "Prikaži šifru"
345527
@@ -351,11 +533,11 @@ msgstr "Kucnite da uzvratite poziv..."
351533msgid "Conference"
352534msgstr "Savjetovanje"
353535
354−#: qml/Panel/Indicators/MenuItemFactory.qml:761
536+#: qml/Panel/Indicators/MenuItemFactory.qml:762
355537msgid "Nothing is playing"
356538msgstr "Ništa nije pokrenuto"
357539
358−#: qml/Panel/Indicators/MenuItemFactory.qml:890
540+#: qml/Panel/Indicators/MenuItemFactory.qml:891
359541#, qt-format
360542msgid "%1 hour"
361543msgid_plural "%1 hours"
@@ -363,7 +545,7 @@ msgstr[0] "%1 sat"
363545msgstr[1] "%1 sata"
364546msgstr[2] "%1 sati"
365547
366−#: qml/Panel/Indicators/MenuItemFactory.qml:894
548+#: qml/Panel/Indicators/MenuItemFactory.qml:895
367549#, qt-format
368550msgid "%1 minute"
369551msgid_plural "%1 minutes"
@@ -371,7 +553,7 @@ msgstr[0] "%1 minut"
371553msgstr[1] "%1 minuta"
372554msgstr[2] "%1 minuta"
373555
374−#: qml/Panel/Indicators/MenuItemFactory.qml:899
556+#: qml/Panel/Indicators/MenuItemFactory.qml:900
375557#, qt-format
376558msgid "%1 second"
377559msgid_plural "%1 seconds"
@@ -379,52 +561,52 @@ msgstr[0] "%1 sekunda"
379561msgstr[1] "%1 sekunde"
380562msgstr[2] "%1 sekundi"
381563
382−#: qml/Panel/Indicators/MenuItemFactory.qml:902
564+#: qml/Panel/Indicators/MenuItemFactory.qml:903
383565msgid "0 seconds"
384566msgstr "0 sekundi"
385567
386568#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
387−#: qml/Panel/Indicators/MenuItemFactory.qml:904
569+#: qml/Panel/Indicators/MenuItemFactory.qml:905
388570#, qt-format
389571msgid "%1 remaining"
390572msgstr "%1 preostalo"
391573
392−#: qml/Panel/Indicators/MenuItemFactory.qml:910
574+#: qml/Panel/Indicators/MenuItemFactory.qml:911
393575msgid "In queue…"
394576msgstr "U red..."
395577
396−#: qml/Panel/Indicators/MenuItemFactory.qml:914
578+#: qml/Panel/Indicators/MenuItemFactory.qml:915
397579msgid "Downloading"
398580msgstr "Preuzimanje"
399581
400−#: qml/Panel/Indicators/MenuItemFactory.qml:916
582+#: qml/Panel/Indicators/MenuItemFactory.qml:917
401583msgid "Paused, tap to resume"
402584msgstr "Pauzirano, kucnuti za nastavak"
403585
404−#: qml/Panel/Indicators/MenuItemFactory.qml:918
586+#: qml/Panel/Indicators/MenuItemFactory.qml:919
405587msgid "Canceled"
406588msgstr "Otkazano"
407589
408−#: qml/Panel/Indicators/MenuItemFactory.qml:920
590+#: qml/Panel/Indicators/MenuItemFactory.qml:921
409591msgid "Finished"
410592msgstr "Završeno"
411593
412−#: qml/Panel/Indicators/MenuItemFactory.qml:922
594+#: qml/Panel/Indicators/MenuItemFactory.qml:923
413595msgid "Failed, tap to retry"
414596msgstr "Neuspjelo, kucnuti za ponavljanje"
415597
416−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
417−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
598+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
599+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
418600msgctxt "Button: Send a reply message"
419601msgid "Send"
420602msgstr "Pošalji"
421603
422−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
604+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
423605msgctxt "Label: Hint in message indicator line edit"
424606msgid "Reply"
425607msgstr "Odgovorite"
426608
427−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
609+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
428610msgctxt "Button: Call back on phone"
429611msgid "Call back"
430612msgstr "Uzvrati poziv"
@@ -433,48 +615,24 @@ msgstr "Uzvrati poziv"
433615msgid "Drag using 3 fingers any application from one window to the other"
434616msgstr ""
435617
436−#: qml/Tutorial/TutorialBottom.qml:78
437−msgid "Swipe up to add a contact"
438−msgstr ""
439−
440−#: qml/Tutorial/TutorialBottom.qml:80
441−msgid "Swipe up for favorite calculations"
442−msgstr ""
443−
444−#: qml/Tutorial/TutorialBottom.qml:82
445−msgid "Swipe up for recent calls"
446−msgstr ""
447−
448−#: qml/Tutorial/TutorialBottom.qml:84
449−msgid "Swipe up to create a message"
450−msgstr ""
451−
452−#: qml/Tutorial/TutorialBottom.qml:85
453−msgid "Swipe up to manage the app"
454−msgstr ""
455−
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
459−
460−#: qml/Tutorial/TutorialLeftLong.qml:47
618+#: qml/Tutorial/TutorialLeftLong.qml:49
461619msgid "Long swipe from the left edge to open the Today scope"
462620msgstr ""
463621
464−#: qml/Tutorial/TutorialRight.qml:54
465−msgid "Hover your mouse on the right edge to view your open apps"
622+#: qml/Tutorial/TutorialLeft.qml:47
623+msgid "Short swipe from the left edge to open the launcher"
466624msgstr ""
467625
468626#: qml/Tutorial/TutorialRight.qml:55
469−msgid "Short or long swipe from the right edge to view your open apps"
627+msgid "Push your mouse against the right edge to view your open apps"
470628msgstr ""
471629
472−#: qml/Tutorial/TutorialTop.qml:53
473−msgid "Swipe from the top right edge to open the notification bar"
630+#: qml/Tutorial/TutorialRight.qml:56
631+msgid "Swipe from the right edge to view your open apps"
474632msgstr ""
475633
476−#: qml/Tutorial/TutorialTop.qml:54
477−msgid "Swipe from the top edge to open the notification bar"
634+#: qml/Tutorial/TutorialTop.qml:53
635+msgid "Swipe from the top edge to access notifications and quick settings"
478636msgstr ""
479637
480638#: qml/Wizard/Page.qml:54
@@ -486,11 +644,11 @@ msgstr "Nazad"
486644msgid "Language"
487645msgstr ""
488646
489−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
490−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
647+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
648+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
491649#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
492650#: qml/Wizard/Pages/75-report-check.qml:84
493−#: qml/Wizard/Pages/passcode-desktop.qml:124
651+#: qml/Wizard/Pages/passcode-desktop.qml:141
494652#: qml/Wizard/Pages/password-set.qml:141
495653msgid "Next"
496654msgstr ""
@@ -552,7 +710,7 @@ msgstr ""
552710msgid "Time Zone"
553711msgstr ""
554712
555−#: qml/Wizard/Pages/50-timezone.qml:178
713+#: qml/Wizard/Pages/50-timezone.qml:181
556714msgid "Enter your city"
557715msgstr ""
558716
@@ -642,7 +800,7 @@ msgid "Service Terms"
642800msgstr ""
643801
644802#: qml/Wizard/Pages/passcode-confirm.qml:43
645−#: qml/Wizard/Pages/passcode-desktop.qml:80
803+#: qml/Wizard/Pages/passcode-desktop.qml:96
646804msgid "Confirm passcode"
647805msgstr "Potvrdi pristupni kod"
648806
@@ -659,24 +817,24 @@ msgstr ""
659817msgid "Lock Screen Passcode"
660818msgstr ""
661819
662−#: qml/Wizard/Pages/passcode-desktop.qml:56
820+#: qml/Wizard/Pages/passcode-desktop.qml:60
663821msgid "Enter 4 numbers to setup your passcode"
664822msgstr ""
665823
666−#: qml/Wizard/Pages/passcode-desktop.qml:65
824+#: qml/Wizard/Pages/passcode-desktop.qml:76
667825#: qml/Wizard/Pages/passcode-set.qml:54
668826msgid "Choose passcode"
669827msgstr ""
670828
671−#: qml/Wizard/Pages/passcode-desktop.qml:105
829+#: qml/Wizard/Pages/passcode-desktop.qml:126
672830msgid "Passcode too short"
673831msgstr ""
674832
675−#: qml/Wizard/Pages/passcode-desktop.qml:107
833+#: qml/Wizard/Pages/passcode-desktop.qml:128
676834msgid "Passcodes match"
677835msgstr ""
678836
679−#: qml/Wizard/Pages/passcode-desktop.qml:109
837+#: qml/Wizard/Pages/passcode-desktop.qml:130
680838msgid "Passcodes do not match"
681839msgstr ""
682840
@@ -725,26 +883,30 @@ msgid "To proceed with no SIM tap Skip."
725883msgstr ""
726884
727885#: qml/Wizard/PasswordMeter.qml:87
728−msgid "Passwords match"
886+msgid "Password too short"
729887msgstr ""
730888
731889#: qml/Wizard/PasswordMeter.qml:89
890+msgid "Passwords match"
891+msgstr ""
892+
893+#: qml/Wizard/PasswordMeter.qml:91
732894msgid "Passwords do not match"
733895msgstr ""
734896
735−#: qml/Wizard/PasswordMeter.qml:93
897+#: qml/Wizard/PasswordMeter.qml:95
736898msgid "Strong password"
737899msgstr ""
738900
739−#: qml/Wizard/PasswordMeter.qml:95
901+#: qml/Wizard/PasswordMeter.qml:97
740902msgid "Fair password"
741903msgstr ""
742904
743−#: qml/Wizard/PasswordMeter.qml:97
905+#: qml/Wizard/PasswordMeter.qml:99
744906msgid "Weak password"
745907msgstr ""
746908
747−#: qml/Wizard/PasswordMeter.qml:99
909+#: qml/Wizard/PasswordMeter.qml:101
748910msgid "Very weak password"
749911msgstr ""
750912
@@ -767,6 +929,15 @@ msgstr ""
767929#~ msgid "Shut down"
768930#~ msgstr "Gašenje sistema"
769931
932+#~ msgid "See all"
933+#~ msgstr "Pogledati sve"
934+
935+#~ msgid "See less"
936+#~ msgstr "Pogledati manje"
937+
938+#~ msgid "Tap to unlock"
939+#~ msgstr "Kucnite za otključavanje"
940+
770941#~ msgid "Please re-enter"
771942#~ msgstr "Molimo ponovo unesite"
772943
po/ca.po+402−182

This diff is too big to show here.

po/ca@valencia.po+295−127

This diff is too big to show here.

po/ce.po+287−125

This diff is too big to show here.

po/ckb.po+287−125

This diff is too big to show here.

po/co.ponew file+964

This diff is too big to show here.

po/cs.po+299−128

This diff is too big to show here.

po/cy.po+299−128

This diff is too big to show here.

po/da.po+299−128

This diff is too big to show here.

po/de.po+406−192

This diff is too big to show here.

po/el.po+368−184

This diff is too big to show here.

po/en_AU.po+333−132

This diff is too big to show here.

po/en_GB.po+335−134

This diff is too big to show here.

po/eo.po+287−125

This diff is too big to show here.

po/es.po+341−137

This diff is too big to show here.

po/eu.po+299−128

This diff is too big to show here.

po/fa.po+335−133

This diff is too big to show here.

po/fi.po+399−193

This diff is too big to show here.

po/fo.po+371−205

This diff is too big to show here.

po/fr.po+352−146

This diff is too big to show here.

po/ga.po+299−128

This diff is too big to show here.

po/gd.po+339−136

This diff is too big to show here.

po/gl.po+399−194

This diff is too big to show here.

po/gv.po+295−127

This diff is too big to show here.

po/he.po+299−128

This diff is too big to show here.

po/hi.po+287−125

This diff is too big to show here.

po/hr.po+460−190

This diff is too big to show here.

po/hu.po+333−139

This diff is too big to show here.

po/hy.po+291−126

This diff is too big to show here.

po/ia.po+400−192

This diff is too big to show here.

po/id.po+295−127

This diff is too big to show here.

po/is.po+295−127

This diff is too big to show here.

po/it.po+334−133

This diff is too big to show here.

po/ja.po+295−127

This diff is too big to show here.

po/km.po+315−150

This diff is too big to show here.

po/kn.po+287−125

This diff is too big to show here.

po/ko.po+299−137

This diff is too big to show here.

po/ku.po+295−127

This diff is too big to show here.

po/ky.po+287−125

This diff is too big to show here.

po/lo.po+287−125

This diff is too big to show here.

po/lt.po+287−125

This diff is too big to show here.

po/lv.po+299−128

This diff is too big to show here.

po/ml.po+287−125

This diff is too big to show here.

po/mr.po+287−125

This diff is too big to show here.

po/ms.po+410−186

This diff is too big to show here.

po/my.po+287−125

This diff is too big to show here.

po/nb.po+333−132

This diff is too big to show here.

po/ne.po+287−125

This diff is too big to show here.

po/nl.po+329−139

This diff is too big to show here.

po/nn.po+287−125

This diff is too big to show here.

po/oc.po+638−215

This diff is too big to show here.

po/or.po+287−125

This diff is too big to show here.

po/pa.po+299−128

This diff is too big to show here.

po/pl.po+387−169

This diff is too big to show here.

po/pt.po+405−202

This diff is too big to show here.

po/pt_BR.po+312−141

This diff is too big to show here.

po/ro.po+299−128

This diff is too big to show here.

po/ru.po+383−182

This diff is too big to show here.

po/shn.po+287−125

This diff is too big to show here.

po/si.po+287−125

This diff is too big to show here.

po/sk.po+379−133

This diff is too big to show here.

po/sl.po+398−183

This diff is too big to show here.

po/sq.po+325−153

This diff is too big to show here.

po/sr.po+335−142

This diff is too big to show here.

po/sv.po+334−132

This diff is too big to show here.

po/sw.po+299−128

This diff is too big to show here.

po/ta.po+287−125

This diff is too big to show here.

po/te.po+287−125

This diff is too big to show here.

po/th.po+287−125

This diff is too big to show here.

po/tr.po+299−128

This diff is too big to show here.

po/ug.po+319−148

This diff is too big to show here.

po/uk.po+334−133

This diff is too big to show here.

po/unity8.pot+286−124

This diff is too big to show here.

po/ur.po+287−125

This diff is too big to show here.

po/uz.po+287−125

This diff is too big to show here.

po/vi.po+287−125

This diff is too big to show here.

po/wo.po+299−128

This diff is too big to show here.

po/xh.po+287−125

This diff is too big to show here.

po/zh_CN.po+397−205

This diff is too big to show here.

po/zh_HK.po+295−127

This diff is too big to show here.

po/zh_TW.po+329−167

This diff is too big to show here.

qml/Components/DelayedLockscreen.qml+1

This diff is too big to show here.

qml/Components/Dialogs.qml+10−13

This diff is too big to show here.

qml/Components/DragHandle.qml+43−25

This diff is too big to show here.

qml/Components/FadingLabel.qmlnew file+42

This diff is too big to show here.

qml/Components/FloatingFlickable.qmlnew file+59

This diff is too big to show here.

qml/Components/InputMethod.qml+10−46

This diff is too big to show here.

qml/Components/ScreenGrabber.qml → qml/Components/ItemGrabber.qmlrenamed+27−17

This diff is too big to show here.

qml/Components/Header.qml → qml/Components/ItemSnapshot.qmlrenamed+26−9

This diff is too big to show here.

qml/Components/KeyboardShortcutsOverlay.qmlnew file+334

This diff is too big to show here.

qml/Components/KeymapSwitcher.qmlnew file+65

This diff is too big to show here.

qml/Components/LazyImage.qml+3−1

This diff is too big to show here.

qml/Components/ListItems/graphics/ListItemDividerHorizontal@18.png

Binary file not shown.

qml/Components/Lockscreen.qml+8

This diff is too big to show here.

qml/Components/MediaServices/MediaServices.qmlnew file+386

This diff is too big to show here.

qml/Components/MediaServices/MediaServicesControls.qmlnew file+192

This diff is too big to show here.

qml/Components/MediaServices/MediaServicesHeader.qmlnew file+71

This diff is too big to show here.

qml/Components/MediaServices/VideoPlayer.qmlnew file+155

This diff is too big to show here.

qml/Components/MediaServices/VideoPlayerControls.qmlnew file+158

This diff is too big to show here.

qml/Components/ModeSwitchWarningDialog.qml+1−1

This diff is too big to show here.

qml/Components/NotificationAudio.qml+11−10

This diff is too big to show here.

qml/Components/PanelState/PanelState.qml+6−4

This diff is too big to show here.

qml/Components/PassphraseLockscreen.qml+4

This diff is too big to show here.

qml/Components/PhysicalKeysMapper.qml+2−22

This diff is too big to show here.

qml/Components/PinLockscreen.qml+6−1

This diff is too big to show here.

qml/Components/PinPadButton.qml+17−2

This diff is too big to show here.

qml/Components/Rating.qml+1

This diff is too big to show here.

qml/Components/RatingStyle.qml+3

This diff is too big to show here.

qml/Dash/Previews/PreviewSharing.qml → qml/Components/SharingPicker.qmlrenamed+2−14

This diff is too big to show here.

qml/Components/UbuntuShapeForItem.qml+1

This diff is too big to show here.

qml/Components/VirtualTouchPad.qml+1−1

This diff is too big to show here.

qml/Components/WindowControlButtons.qml+48−39

This diff is too big to show here.

qml/Components/graphics/close@20.png

Binary file not shown.

qml/Components/graphics/icon_star_empty@20.png

Binary file not shown.

qml/Components/graphics/icon_star_full@20.png

Binary file not shown.

qml/Components/graphics/icon_star_half@20.png

Binary file not shown.

qml/Components/graphics/icon_star_off@20.png

Binary file not shown.

qml/Components/graphics/icon_star_on@20.png

Binary file not shown.

qml/Components/graphics/non-selected@18.png

Binary file not shown.

qml/Components/graphics/window-close.svg+164−14

This diff is too big to show here.

qml/Components/graphics/window-maximize.svg+164−12

This diff is too big to show here.

qml/Components/graphics/window-minimize.svg+164−13

This diff is too big to show here.

qml/Components/graphics/window-window.svgnew file+41

This diff is too big to show here.

qml/Dash/CardCarousel.qml+1−1

This diff is too big to show here.

qml/Dash/CardGrid.qml+1−2

This diff is too big to show here.

qml/Dash/CardHorizontalList.qml+1

This diff is too big to show here.

qml/Dash/CardTool.qml+31−10

This diff is too big to show here.

qml/Dash/CardVerticalJournal.qml+1

This diff is too big to show here.

qml/Dash/Dash.qml+11−11

This diff is too big to show here.

qml/Dash/DashApplication.qml+15−7

This diff is too big to show here.

qml/Dash/DashCategoryBase.qml+3−11

This diff is too big to show here.

qml/Dash/DashPageHeader.qml+31−36

This diff is too big to show here.

qml/Dash/DashRenderer.qml+6

This diff is too big to show here.

qml/Dash/Filters/FilterExpandableWidget.qmlnew file+96

This diff is too big to show here.

qml/Dash/Filters/FilterOptionSelector.qml+4

This diff is too big to show here.

qml/Dash/Filters/FilterWidget.qml+3

This diff is too big to show here.

qml/Dash/Filters/FilterWidgetFactory.qml+10−1

This diff is too big to show here.

qml/Dash/GenericScopeView.qml+31−11

This diff is too big to show here.

qml/Dash/PageHeaderExtraPanel.qml+34−10

This diff is too big to show here.

qml/Dash/Previews/Preview.qml+21−1

This diff is too big to show here.

qml/Dash/Previews/PreviewActionCombo.qml+1−1

This diff is too big to show here.

qml/Dash/Previews/PreviewActions.qml+9−8

This diff is too big to show here.

qml/Dash/Previews/PreviewIconActions.qml+15

This diff is too big to show here.

qml/Dash/Previews/PreviewImageGallery.qml+3

This diff is too big to show here.

qml/Dash/Previews/PreviewInlineVideo.qmlnew file+65

This diff is too big to show here.

qml/Dash/Previews/PreviewMediaToolbar.qml+25−5

This diff is too big to show here.

qml/Dash/Previews/PreviewPayments.qml+1−1

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingEdit.qml+4−1

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingInput.qml+41−42

This diff is too big to show here.

qml/Dash/Previews/PreviewWidget.qml+3

This diff is too big to show here.

qml/Dash/Previews/PreviewWidgetFactory.qml+11−1

This diff is too big to show here.

qml/Dash/Previews/PreviewZoomableImage.qml+14−8

This diff is too big to show here.

qml/Dash/ScopesList.qml+2−13

This diff is too big to show here.

qml/Dash/graphics/dash_divider_top_darkgrad@27.png

Binary file not shown.

qml/Dash/graphics/dash_divider_top_lightgrad@27.png

Binary file not shown.

qml/Dash/graphics/header_handlearrow2@27.png

Binary file not shown.

qml/Dash/graphics/header_handlearrow@27.png

Binary file not shown.

qml/Dash/graphics/icon_clear@20.png

Binary file not shown.

qml/Dash/graphics/icon_search_active@20.png

Binary file not shown.

qml/Dash/graphics/icon_search_inactive@20.png

Binary file not shown.

qml/Dash/graphics/navigation_shadow@18.png

Binary file not shown.

qml/Dash/graphics/navigation_shadow_light@18.png

Binary file not shown.

qml/Dash/graphics/overview_hint@27.png

Binary file not shown.

qml/Dash/graphics/pagination_dot_off@30.png

Binary file not shown.

qml/Dash/graphics/pagination_dot_on@30.png

Binary file not shown.

qml/Dash/graphics/paper.png

Binary file not shown.

qml/Dash/graphics/pixel.png

Binary file not shown.

qml/Dash/graphics/play_button@18.png

Binary file not shown.

qml/Dash/graphics/play_button_active@18.png

Binary file not shown.

qml/Dash/graphics/play_button_active_big@20.png

Binary file not shown.

qml/Dash/graphics/play_button_big@20.png

Binary file not shown.

qml/Dash/graphics/tabbarchevron@27.png

Binary file not shown.

qml/Dash/graphics/tablet/icon_close_preview@20.png

Binary file not shown.

qml/Dash/graphics/tooltip_arrow@27.png

Binary file not shown.

qml/DisabledScreenNotice.qml+11−4

This diff is too big to show here.

qml/Greeter/CoverPage.qml+23−1

This diff is too big to show here.

qml/Components/WindowScreenshot.qml → qml/Greeter/FullLightDMImpl.qmlrenamed+7−14

This diff is too big to show here.

qml/Greeter/Greeter.qml+189−72

This diff is too big to show here.

qml/Greeter/GreeterPrompt.qmlnew file+197

This diff is too big to show here.

qml/Greeter/IntegratedLightDMImpl.qml+1−1

This diff is too big to show here.

qml/Greeter/LightDM.qml → qml/Greeter/LightDMService.qmlrenamed+14−3

This diff is too big to show here.

qml/Greeter/LoginList.qml+77−81

This diff is too big to show here.

qml/Greeter/NarrowView.qml+20−3

This diff is too big to show here.

qml/Greeter/WideView.qml+11−4

This diff is too big to show here.

qml/Greeter/graphics/dot_empty.png

Binary file not shown.

qml/Greeter/graphics/dot_filled.png

Binary file not shown.

qml/Greeter/graphics/dot_pointer.png

Binary file not shown.

qml/Greeter/graphics/icon_arrow.png

Binary file not shown.

qml/Greeter/graphics/infographic_circle_back.png

Binary file not shown.

qml/Greeter/qmldirnew file+1

This diff is too big to show here.

qml/Launcher/Launcher.qml+17−25

This diff is too big to show here.

qml/Launcher/LauncherDelegate.qml+13−19

This diff is too big to show here.

qml/Launcher/LauncherPanel.qml+31−14

This diff is too big to show here.

qml/Launcher/graphics/divider-line.png

Binary file not shown.

qml/Launcher/graphics/focused_app_arrow@30.png

Binary file not shown.

qml/Launcher/graphics/home@18.png

Binary file not shown.

qml/Launcher/graphics/quicklist_tooltip@30.png

Binary file not shown.

qml/Notifications/Notification.qml+160−119

This diff is too big to show here.

qml/Notifications/NotificationButton.qmlnew file+72

This diff is too big to show here.

qml/Notifications/NotificationMenuItemFactory.qml+8−10

This diff is too big to show here.

qml/Notifications/Notifications.qml+23−14

This diff is too big to show here.

qml/Notifications/OptionToggle.qml+12−10

This diff is too big to show here.

qml/Notifications/ShapedIcon.qml+1

This diff is too big to show here.

qml/Notifications/SwipeToAct.qml+16−20

This diff is too big to show here.

qml/Notifications/grip-large.svgdeleted−150

This diff is too big to show here.

qml/OrientedShell.qml+34−19

This diff is too big to show here.

qml/Panel/Indicators/MenuItemFactory.qml+5−4

This diff is too big to show here.

qml/Panel/Indicators/MessageMenuItemFactory.qml+1−5

This diff is too big to show here.

qml/Panel/Indicators/client/IndicatorsClient.qml+8−2

This diff is too big to show here.

qml/Panel/Indicators/client/IndicatorsList.qml+7

This diff is too big to show here.

qml/Panel/IndicatorsMenu.qml+40−24

This diff is too big to show here.

qml/Panel/Panel.qml+29−24

This diff is too big to show here.

qml/Panel/graphics/rectangular_dropshadow@30.png

Binary file not shown.

qml/Rotation/HalfLoopRotationAnimation.qml+2−1

This diff is too big to show here.

qml/Rotation/ImmediateRotationAction.qml+11−22

This diff is too big to show here.

qml/Rotation/NinetyRotationAnimation.qml+14−16

This diff is too big to show here.

qml/Rotation/RotationStates.qml+25−5

This diff is too big to show here.

qml/Rotation/UpdateShellTransformations.qmlnew file+42

This diff is too big to show here.

qml/Shell.qml+164−136

This diff is too big to show here.

qml/Stages/AbstractStage.qml+12−4

This diff is too big to show here.

qml/Stages/Animations/BaseSessionAnimation.qmldeleted−96

This diff is too big to show here.

qml/Stages/Animations/SwipeFromBottomAnimation.qmldeleted−53

This diff is too big to show here.

qml/Stages/ApplicationWindow.qml+156−74

This diff is too big to show here.

qml/Stages/DecoratedWindow.qml+57−26

This diff is too big to show here.

qml/Stages/DesktopSpread.qml+25−19

This diff is too big to show here.

qml/Stages/DesktopSpreadDelegate.qml+5−4

This diff is too big to show here.

qml/Stages/DesktopStage.qml+299−150

This diff is too big to show here.

qml/Stages/OrientationChangeAnimation.qml+30−6

This diff is too big to show here.

qml/Stages/PhoneStage.qml+158−95

This diff is too big to show here.

qml/Stages/PromptSurfaceAnimations.qmlnew file+81

This diff is too big to show here.

qml/Stages/ShimStage.qml → qml/Stages/ResizeGrip.qmlrenamed+22−20

This diff is too big to show here.

qml/Stages/SessionContainer.qmldeleted−180

This diff is too big to show here.

qml/Stages/SideStage.qml+1−2

This diff is too big to show here.

qml/Stages/Splash.qml+6−17

This diff is too big to show here.

qml/Stages/SpreadDelegate.qml+12−16

This diff is too big to show here.

qml/Stages/StagedFullscreenPolicy.qml+12−14

This diff is too big to show here.

qml/Stages/SurfaceContainer.qml+45−57

This diff is too big to show here.

qml/Stages/TabletSideStageTouchGesture.qml+3

This diff is too big to show here.

qml/Stages/TabletStage.qml+317−245

This diff is too big to show here.

qml/Stages/TopLevelSurfaceRepeater.qmlnew file+52

This diff is too big to show here.

qml/Stages/TransformedSpreadDelegate.qml+4−4

This diff is too big to show here.

qml/Stages/TransformedTabletSpreadDelegate.qml+29−23

This diff is too big to show here.

qml/Stages/WindowControlsOverlay.qmlnew file+219

This diff is too big to show here.

qml/Stages/WindowDecoration.qml+42−15

This diff is too big to show here.

qml/Stages/WindowResizeArea.qml+40−20

This diff is too big to show here.

qml/Stages/WindowedFullscreenPolicy.qml+5−7

This diff is too big to show here.

qml/Stages/graphics/PageHeaderBaseDividerBottom@18.png

Binary file not shown.

qml/Stages/graphics/PageHeaderBaseDividerLight@18.png

Binary file not shown.

qml/Stages/graphics/arrows-centre.pngnew file

Binary file not shown.

qml/Stages/graphics/arrows.pngnew file

Binary file not shown.

qml/Stages/graphics/dropshadow2gu@30.png

Binary file not shown.

qml/Stages/graphics/sidestage_handle@20.png

Binary file not shown.

qml/Tutorial/InactivityTimer.qml+26−10

This diff is too big to show here.

qml/Tutorial/Tutorial.qml+7−6

This diff is too big to show here.

qml/Tutorial/TutorialBottom.qmldeleted−124

This diff is too big to show here.

qml/Tutorial/TutorialContent.qml+51−134

This diff is too big to show here.

qml/Tutorial/TutorialLeft.qml+2−2

This diff is too big to show here.

qml/Tutorial/TutorialLeftLong.qml+3−1

This diff is too big to show here.

qml/Tutorial/TutorialPage.qml+2−2

This diff is too big to show here.

qml/Tutorial/TutorialRight.qml+2−2

This diff is too big to show here.

qml/Tutorial/TutorialTop.qml+2−3

This diff is too big to show here.

qml/Tutorial/graphics/background1.png

Binary file not shown.

qml/Tutorial/graphics/background2.png

Binary file not shown.

qml/Wizard/Pages/10-welcome.qml+17−4

This diff is too big to show here.

qml/Wizard/Pages/50-timezone.qml+5−2

This diff is too big to show here.

qml/Wizard/Pages/data/Desktop_header_bkg.png

Binary file not shown.

qml/Wizard/Pages/data/Desktop_splash_screen_bkg.png

Binary file not shown.

qml/Wizard/Pages/data/Phone_header_bkg.png

Binary file not shown.

qml/Wizard/Pages/data/Phone_splash_screen_bkg.png

Binary file not shown.

qml/Wizard/Pages/data/Tick@30.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/map.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/pin.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-1.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-10.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-11.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-2.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-3.5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-3.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-4.5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-4.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-6.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-7.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-8.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-9.5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-9.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_0.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_1.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_10.5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_10.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_11.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_12.75.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_12.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_13.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_2.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_3.5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_3.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_4.5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_4.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_5.5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_5.75.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_6.5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_6.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_7.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_8.5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_8.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_9.5.png

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_9.png

Binary file not shown.

qml/Wizard/Pages/passcode-desktop.qml+27−10

This diff is too big to show here.

qml/Wizard/PasswordMeter.qml+3−1

This diff is too big to show here.

qml/Wizard/Wizard.qml+6−2

This diff is too big to show here.

qml/graphics/dropshadow_left@20.png

Binary file not shown.

qml/graphics/dropshadow_right@20.png

Binary file not shown.

src/CMakeLists.txt+2−4

This diff is too big to show here.

src/Dash/CMakeLists.txt+1

This diff is too big to show here.

src/Dash/main.cpp+34−21

This diff is too big to show here.

src/SecondaryWindow.cpp+9

This diff is too big to show here.

src/ShellApplication.cpp+17−1

This diff is too big to show here.

src/ShellView.cpp+6−2

This diff is too big to show here.

tools/unix-signal-handler.cpp → src/UnixSignalHandler.cpprenamed+4−6

This diff is too big to show here.

tools/unix-signal-handler.h → src/UnixSignalHandler.hrenamed

The content is the same.

src/main.cpp+13

This diff is too big to show here.

src/qmldebuggerutils.hnew file+33

This diff is too big to show here.

tests/CMakeLists.txt+7−2

This diff is too big to show here.

tests/autopilot/unity8/dash.py+2−3

This diff is too big to show here.

tests/autopilot/unity8/fixture_setup.py+1−1

This diff is too big to show here.

tests/autopilot/unity8/greeter/tests/test_args.py−5

This diff is too big to show here.

tests/autopilot/unity8/settings_wizard/__init__.pydeleted−555

This diff is too big to show here.

tests/autopilot/unity8/settings_wizard/fixture_setup.pydeleted−58

This diff is too big to show here.

tests/autopilot/unity8/settings_wizard/ofono_helper.pydeleted−116

This diff is too big to show here.

tests/autopilot/unity8/settings_wizard/tests/__init__.pydeleted

No changes to the content.

tests/autopilot/unity8/settings_wizard/tests/test_settings_wizard.pydeleted−99

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/__init__.py+1−1

This diff is too big to show here.

tests/data/unity/backgrounds/blue.png

Binary file not shown.

tests/data/unity/backgrounds/red.png

Binary file not shown.

tests/graphics/applicationIcons/browser@18.png

Binary file not shown.

tests/graphics/applicationIcons/calendar@18.png

Binary file not shown.

tests/graphics/applicationIcons/camera@18.png

Binary file not shown.

tests/graphics/applicationIcons/contacts-app@18.png

Binary file not shown.

tests/graphics/applicationIcons/dash.png

Binary file not shown.

tests/graphics/applicationIcons/dialer-app@18.png

Binary file not shown.

tests/graphics/applicationIcons/evernote@18.png

Binary file not shown.

tests/graphics/applicationIcons/facebook@18.png

Binary file not shown.

tests/graphics/applicationIcons/gallery@18.png

Binary file not shown.

tests/graphics/applicationIcons/gmail@18.png

Binary file not shown.

tests/graphics/applicationIcons/libreoffice@18.png

Binary file not shown.

tests/graphics/applicationIcons/map@18.png

Binary file not shown.

tests/graphics/applicationIcons/messages-app@18.png

Binary file not shown.

tests/graphics/applicationIcons/notepad@18.png

Binary file not shown.

tests/graphics/applicationIcons/pinterest@18.png

Binary file not shown.

tests/graphics/applicationIcons/soundcloud@18.png

Binary file not shown.

tests/graphics/applicationIcons/system-settings@18.png

Binary file not shown.

tests/graphics/applicationIcons/twitter@18.png

Binary file not shown.

tests/graphics/applicationIcons/weather@18.png

Binary file not shown.

tests/graphics/applicationIcons/wikipedia@18.png

Binary file not shown.

tests/graphics/applicationIcons/youtube@18.png

Binary file not shown.

tests/graphics/avatars/amanda@12.png

Binary file not shown.

tests/graphics/avatars/anna_olsson@12.png

Binary file not shown.

tests/graphics/avatars/funky@12.png

Binary file not shown.

tests/graphics/clock@18.png

Binary file not shown.

tests/libs/CMakeLists.txtdeleted−1

This diff is too big to show here.

tests/libs/UbuntuGestures/CMakeLists.txtdeleted−16

This diff is too big to show here.

tests/libs/UbuntuGestures/tst_TouchRegistry.cppdeleted−974

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.cpp+24

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.h+16

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.qmltypesdeleted−41

This diff is too big to show here.

tests/mocks/Biometryd/CMakeLists.txtnew file+14

This diff is too big to show here.

libs/UbuntuGestures/TouchOwnershipEvent.cpp → tests/mocks/Biometryd/MockBiometryd.cpprenamed+20−12

This diff is too big to show here.

plugins/ScreenGrabber/screengrabber.h → tests/mocks/Biometryd/MockBiometryd.hrenamed+21−20

This diff is too big to show here.

tests/mocks/Biometryd/MockDevice.cppnew file+29

This diff is too big to show here.

tests/mocks/Biometryd/MockDevice.hnew file+40

This diff is too big to show here.

tests/mocks/Biometryd/MockIdentifier.cppnew file+28

This diff is too big to show here.

tests/mocks/Biometryd/MockIdentifier.hnew file+36

This diff is too big to show here.

libs/UbuntuGestures/UbuntuGesturesGlobal.h → tests/mocks/Biometryd/MockObserver.cpprenamed+6−7

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_Damper.cpp → tests/mocks/Biometryd/MockObserver.hrenamed+15−18

This diff is too big to show here.

tests/mocks/Biometryd/MockOperation.cppnew file+56

This diff is too big to show here.

tests/mocks/Unity/Application/SessionManager.h → tests/mocks/Biometryd/MockOperation.hrenamed+18−14

This diff is too big to show here.

libs/UbuntuGestures/UnownedTouchEvent.cpp → tests/mocks/Biometryd/plugin.cpprenamed+16−14

This diff is too big to show here.

tests/mocks/Biometryd/plugin.hnew file+31

This diff is too big to show here.

tests/mocks/Biometryd/qmldirnew file+3

This diff is too big to show here.

tests/mocks/CMakeLists.txt+2−1

This diff is too big to show here.

tests/mocks/Cursor/qmldir+1−1

This diff is too big to show here.

tests/mocks/GSettings.1.0/GSettings.qmltypesdeleted−42

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.cpp+127−38

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.h+51−26

This diff is too big to show here.

tests/mocks/IntegratedLightDM/qmldirdeleted−3

This diff is too big to show here.

tests/mocks/LightDM/CMakeLists.txtnew file+1

This diff is too big to show here.

tests/mocks/IntegratedLightDM/IntegratedLightDM.qmltypes → tests/mocks/LightDM/IntegratedLightDM.qmltypesrenamed

The content is the same.

tests/mocks/IntegratedLightDM/CMakeLists.txt → tests/mocks/LightDM/IntegratedLightDM/CMakeLists.txtrenamed+9−7

This diff is too big to show here.

tests/mocks/IntegratedLightDM/MockGreeter.cpp → tests/mocks/LightDM/IntegratedLightDM/MockGreeter.cpprenamed+16

This diff is too big to show here.

tests/mocks/IntegratedLightDM/MockGreeter.h → tests/mocks/LightDM/IntegratedLightDM/MockGreeter.hrenamed+5

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/MockSessionsModel.cppnew file+37

This diff is too big to show here.

plugins/Utils/windowscreenshotprovider.h → tests/mocks/LightDM/IntegratedLightDM/MockSessionsModel.hrenamed+12−9

This diff is too big to show here.

tests/mocks/IntegratedLightDM/MockUsersModel.cpp → tests/mocks/LightDM/IntegratedLightDM/MockUsersModel.cpprenamed

The content is the same.

tests/mocks/IntegratedLightDM/MockUsersModel.h → tests/mocks/LightDM/IntegratedLightDM/MockUsersModel.hrenamed

The content is the same.

tests/mocks/IntegratedLightDM/QLightDM/Greeter → tests/mocks/LightDM/IntegratedLightDM/QLightDM/Greeterrenamed

The content is the same.

plugins/Ubuntu/Gestures/Damper.cpp → tests/mocks/LightDM/IntegratedLightDM/QLightDM/SessionsModelrenamed+1−8

This diff is too big to show here.

tests/mocks/IntegratedLightDM/QLightDM/UsersModel → tests/mocks/LightDM/IntegratedLightDM/QLightDM/UsersModelrenamed

The content is the same.

tests/mocks/IntegratedLightDM/liblightdm/CMakeLists.txt → tests/mocks/LightDM/IntegratedLightDM/liblightdm/CMakeLists.txtrenamed+4−2

This diff is too big to show here.

tests/mocks/IntegratedLightDM/liblightdm/Greeter.cpp → tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.cpprenamed+9−2

This diff is too big to show here.

tests/mocks/IntegratedLightDM/liblightdm/Greeter.h → tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.hrenamed+1

This diff is too big to show here.

tests/mocks/IntegratedLightDM/liblightdm/GreeterPrivate.cpp → tests/mocks/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.cpprenamed

The content is the same.

tests/mocks/IntegratedLightDM/liblightdm/GreeterPrivate.h → tests/mocks/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.hrenamed+1−1

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModel.cppnew file+99

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModel.hnew file+72

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.cppnew file+73

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.hnew file+59

This diff is too big to show here.

tests/mocks/IntegratedLightDM/liblightdm/UsersModel.cpp → tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModel.cpprenamed+4−1

This diff is too big to show here.

tests/mocks/IntegratedLightDM/liblightdm/UsersModel.h → tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModel.hrenamed+2−1

This diff is too big to show here.

tests/mocks/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp → tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.cpprenamed+29−23

This diff is too big to show here.

tests/mocks/IntegratedLightDM/liblightdm/UsersModelPrivate.h → tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.hrenamed+2−1

This diff is too big to show here.

tests/mocks/IntegratedLightDM/plugin.cpp → tests/mocks/LightDM/IntegratedLightDM/plugin.cpprenamed+15−4

This diff is too big to show here.

tests/mocks/IntegratedLightDM/plugin.h → tests/mocks/LightDM/IntegratedLightDM/plugin.hrenamed+1−1

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Lights/Lights.qmltypesdeleted−45

This diff is too big to show here.

tests/mocks/MeeGo/QOfono/QOfono.qmltypesdeleted−30

This diff is too big to show here.

tests/mocks/Powerd/Powerd.qmltypesdeleted−39

This diff is too big to show here.

tests/mocks/QMenuModel/QMenuModel.qmltypesdeleted−111

This diff is too big to show here.

tests/mocks/QtMultimedia/CMakeLists.txt+8−2

This diff is too big to show here.

tests/mocks/QtMultimedia/QtMultimedia.qmltypesdeleted−62

This diff is too big to show here.

tests/mocks/QtMultimedia/VideoSurface.qmlnew file+111

This diff is too big to show here.

tests/mocks/QtMultimedia/audio.cppdeleted−119

This diff is too big to show here.

tests/mocks/QtMultimedia/audio.hdeleted−92

This diff is too big to show here.

tests/mocks/QtMultimedia/mediaplayer.cppnew file+318

This diff is too big to show here.

tests/mocks/QtMultimedia/mediaplayer.hnew file+223

This diff is too big to show here.

tests/mocks/QtMultimedia/plugin.cpp+7−3

This diff is too big to show here.

tests/mocks/QtMultimedia/videooutput.cppnew file+127

This diff is too big to show here.

tests/mocks/QtMultimedia/videooutput.hnew file+52

This diff is too big to show here.

tests/mocks/Ubuntu/DownloadDaemonListener/DownloadDaemonListener.qmltypesdeleted−60

This diff is too big to show here.

tests/mocks/Ubuntu/Payments/MockPayments.cpp+1

This diff is too big to show here.

tests/mocks/Ubuntu/Payments/Payments.qmltypesdeleted−44

This diff is too big to show here.

tests/mocks/Ubuntu/SystemImage/SystemImage.qmltypesdeleted−20

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/LanguagePlugin.qmltypesdeleted−10

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/MockLanguagePlugin.qml+3−2

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/SecurityPrivacy.qmltypesdeleted−39

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/TimeDate/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/TimeDate/MockTimeDate.qml+15−3

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/TimeDate/qmldir+1−1

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/Telephony.qmltypesdeleted−58

This diff is too big to show here.

tests/mocks/Ubuntu/Thumbnailer/Thumbnailer.qmltypesdeleted−17

This diff is too big to show here.

tests/mocks/Unity/Application/Application.qmltypesdeleted−517

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.cpp+191−108

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.h+43−25

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationManager.cpp+127−75

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationManager.h+12−14

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationScreenshotProvider.cppdeleted−79

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationScreenshotProvider.hdeleted−34

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationTestInterface.cppdeleted−117

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationTestInterface.hdeleted−45

This diff is too big to show here.

tests/mocks/Unity/Application/CMakeLists.txt+3−6

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurface.cpp+192−30

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurface.h+59−12

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceItem.cpp+30−14

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceItem.h+1−1

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceListModel.cppnew file+159

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceListModel.hnew file+62

This diff is too big to show here.

tests/mocks/Unity/Application/ObjectListModel.h+2

This diff is too big to show here.

tests/mocks/Unity/Application/Session.cppdeleted−209

This diff is too big to show here.

tests/mocks/Unity/Application/Session.hdeleted−104

This diff is too big to show here.

tests/mocks/Unity/Application/SessionManager.cppdeleted−55

This diff is too big to show here.

tests/mocks/Unity/Application/SurfaceManager.cpp+16−9

This diff is too big to show here.

tests/mocks/Unity/Application/SurfaceManager.h+5−2

This diff is too big to show here.

tests/mocks/Unity/Application/UbuntuKeyboardInfo.cppdeleted−60

This diff is too big to show here.

tests/mocks/Unity/Application/UbuntuKeyboardInfo.hdeleted−66

This diff is too big to show here.

tests/mocks/Unity/Application/VirtualKeyboard.cpp+22−4

This diff is too big to show here.

tests/mocks/Unity/Application/VirtualKeyboard.h+5−2

This diff is too big to show here.

tests/mocks/Unity/Application/plugin.cpp+28−41

This diff is too big to show here.

tests/mocks/Unity/Application/resources/VirtualKeyboard.qml+1−6

This diff is too big to show here.

tests/mocks/Unity/Application/resources/screenshots/browser@12.png

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/camera@12.png

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/dialer@12.png

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/facebook@12.png

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/gallery@12.png

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/libreoffice@12.png

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/map@12.png

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/music@12.png

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/twitter@12.png

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/unity8-dash@12.png

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/vkb_portrait.png

Binary file not shown.

tests/mocks/Unity/Application/resources/vkb_portrait.png

Binary file not shown.

tests/mocks/Unity/CMakeLists.txt+3−1

This diff is too big to show here.

tests/mocks/Unity/Connectivity/Connectivity.qmltypesdeleted−20

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/DashCommunicator.qmltypesdeleted−46

This diff is too big to show here.

tests/mocks/Unity/Indicators/Indicators.qmltypesdeleted−232

This diff is too big to show here.

tests/mocks/Unity/InputInfo/plugin.h+1−1

This diff is too big to show here.

tests/mocks/Unity/InputInfo/qinputdeviceinfo_mock.cpp+1−1

This diff is too big to show here.

tests/mocks/Unity/Launcher/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Unity/Launcher/Launcher.qmltypesdeleted−187

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherItem.cpp+14

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherItem.h+3

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherModel.cpp+8

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherModel.h+1−1

This diff is too big to show here.

tests/mocks/Unity/Notifications/MockNotificationModel.cpp+6−11

This diff is too big to show here.

tests/mocks/Unity/Notifications/Notifications.qmltypesdeleted−149

This diff is too big to show here.

tests/mocks/Unity/Screens/plugin.h+1−1

This diff is too big to show here.

tests/mocks/Unity/Unity.qmltypesdeleted−469

This diff is too big to show here.

tests/mocks/Unity/fake_categories.cpp+4−1

This diff is too big to show here.

tests/mocks/Unity/fake_expandablefilterwidget.cppnew file+53

This diff is too big to show here.

tests/mocks/Unity/fake_expandablefilterwidget.hnew file+48

This diff is too big to show here.

tests/mocks/Unity/fake_filters.cpp+19−8

This diff is too big to show here.

tests/mocks/Unity/fake_filters.h+4−4

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectorfilter.cpp+5

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectorfilter.h+2

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectoroptions.cpp+13

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectoroptions.h+2

This diff is too big to show here.

tests/mocks/Unity/fake_previewmodel.cpp+1−1

This diff is too big to show here.

tests/mocks/Unity/fake_resultsmodel.cpp+2

This diff is too big to show here.

tests/mocks/Unity/fake_scope.cpp+18−4

This diff is too big to show here.

tests/mocks/Unity/fake_scope.h+2−1

This diff is too big to show here.

tests/mocks/Unity/fake_scopes.cpp+12

This diff is too big to show here.

tests/mocks/Unity/fake_scopesoverview.cpp+1−1

This diff is too big to show here.

tests/mocks/Utils/CMakeLists.txt+9−2

This diff is too big to show here.

tests/mocks/Utils/Utils.qmltypesdeleted−178

This diff is too big to show here.

tests/mocks/Utils/plugin.cpp+1−9

This diff is too big to show here.

tests/mocks/Utils/plugin.h+1−2

This diff is too big to show here.

tests/mocks/Utils/windowstatestorage.cpp+3−2

This diff is too big to show here.

tests/mocks/Utils/windowstatestorage.h+18−4

This diff is too big to show here.

tests/mocks/Wizard/Wizard.qmltypesdeleted−37

This diff is too big to show here.

tests/mocks/libusermetrics/UserMetrics.cpp+1−1

This diff is too big to show here.

tests/mocks/libusermetrics/libusermetricsoutput/ColorTheme.hdeleted−1

This diff is too big to show here.

tests/mocks/libusermetrics/libusermetricsoutput/UserMetrics.hdeleted−1

This diff is too big to show here.

tests/plugins/AccountsService/CMakeLists.txt+5−5

This diff is too big to show here.

tests/plugins/CMakeLists.txt+3−3

This diff is too big to show here.

tests/plugins/Cursor/CMakeLists.txtnew file+8

This diff is too big to show here.

tests/mocks/Unity/Application/SessionModel.h → tests/plugins/Cursor/TextEntry.qmlrenamed+18−19

This diff is too big to show here.

tests/plugins/Cursor/tst_Cursor.qmlnew file+144

This diff is too big to show here.

tests/plugins/Dash/CMakeLists.txt+4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/1.res+19−55

This diff is too big to show here.

tests/plugins/Dash/cardcreator/1.res.cardcreator+14−51

This diff is too big to show here.

tests/plugins/Dash/cardcreator/1.tst+1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/10.res+5−14

This diff is too big to show here.

tests/plugins/Dash/cardcreator/10.res.cardcreator+1−11

This diff is too big to show here.

tests/plugins/Dash/cardcreator/10.tst+1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/11.res+21−57

This diff is too big to show here.

tests/plugins/Dash/cardcreator/11.res.cardcreator+16−53

This diff is too big to show here.

tests/plugins/Dash/cardcreator/11.tst+1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/12.resnew file+110

This diff is too big to show here.

tests/plugins/Dash/cardcreator/12.res.cardcreatornew file+108

This diff is too big to show here.

tests/plugins/Dash/cardcreator/12.tstnew file+4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/2.res+5−14

This diff is too big to show here.

tests/plugins/Dash/cardcreator/2.res.cardcreator+1−11

This diff is too big to show here.

tests/plugins/Dash/cardcreator/2.tst+1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/3.res+17−62

This diff is too big to show here.

tests/plugins/Dash/cardcreator/3.res.cardcreator+13−59

This diff is too big to show here.

tests/plugins/Dash/cardcreator/3.tst+1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.res+6−7

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.res.cardcreator+2−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.tst+1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.res+12−63

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.res.cardcreator+8−60

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.tst+1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.res+4−5

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.res.cardcreator+2−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.tst+1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.res+5−14

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.res.cardcreator+1−11

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.tst+1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/8.res+6−7

This diff is too big to show here.

tests/plugins/Dash/cardcreator/8.res.cardcreator+2−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/8.tst+1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/9.res+6−7

This diff is too big to show here.

tests/plugins/Dash/cardcreator/9.res.cardcreator+2−4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/9.tst+1

This diff is too big to show here.

tests/plugins/Dash/cardcreatortest.cpp+9−6

This diff is too big to show here.

tests/plugins/Dash/cardcreatortest.qml+4−4

This diff is too big to show here.

tests/plugins/Dash/horizontaljournaltest.cpp+1−4

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadersectionexternalmodeltest.cpp+3−6

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadersectiontest.cpp+24−6

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertest.cpp+21−4

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertestsection.qml+15−3

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertestsectionexternalmodel.qml+2−1

This diff is too big to show here.

tests/plugins/Dash/organicgridtest.cpp+1−4

This diff is too big to show here.

tests/plugins/Dash/tst_ListViewWithPageHeaderQML.qml+4−2

This diff is too big to show here.

tests/plugins/Dash/tst_ScopeStyle.qml+1−1

This diff is too big to show here.

tests/plugins/Dash/verticaljournaltest.cpp+1−4

This diff is too big to show here.

tests/plugins/LightDM/CMakeLists.txtnew file+1

This diff is too big to show here.

tests/plugins/IntegratedLightDM/CMakeLists.txt → tests/plugins/LightDM/IntegratedLightDM/CMakeLists.txtrenamed+37−13

This diff is too big to show here.

tests/plugins/IntegratedLightDM/dbus.cpp → tests/plugins/LightDM/IntegratedLightDM/dbus.cpprenamed+3−5

This diff is too big to show here.

tests/plugins/IntegratedLightDM/greeter.qml → tests/plugins/LightDM/IntegratedLightDM/greeter.qmlrenamed+1−1

This diff is too big to show here.

tests/plugins/IntegratedLightDM/integrated.cpp → tests/plugins/LightDM/IntegratedLightDM/integrated.cpprenamed

The content is the same.

tests/plugins/IntegratedLightDM/pam.cpp → tests/plugins/LightDM/IntegratedLightDM/pam.cpprenamed+3−1

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/sessionsmodel.cppnew file+96

This diff is too big to show here.

tests/plugins/IntegratedLightDM/usersmodel.cpp → tests/plugins/LightDM/IntegratedLightDM/usersmodel.cpprenamed

The content is the same.

tests/plugins/ScreenGrabber/CMakeLists.txtdeleted−14

This diff is too big to show here.

tests/plugins/ScreenGrabber/ScreenGrabberTest.cppdeleted−77

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/CMakeLists.txt+6−5

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/DownwardsLauncher.qmldeleted−72

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/GestureTest.cpp+2−2

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/LeftwardsLauncher.qmldeleted−76

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/RightwardsLauncher.qmldeleted−76

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/UpwardsLauncher.qmldeleted−76

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cppdeleted−1250

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.qmldeleted−76

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.cpp+25−18

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.qml+1

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+1−1

This diff is too big to show here.

tests/plugins/Unity/Indicators/MenuContentActivatorTest.cpp+1

This diff is too big to show here.

tests/plugins/Unity/Launcher/CMakeLists.txt+3−1

This diff is too big to show here.

tests/plugins/Unity/Launcher/launchermodeltest.cpp+49−6

This diff is too big to show here.

tests/plugins/Unity/Session/CMakeLists.txt+31−1

This diff is too big to show here.

tests/plugins/Unity/Session/LightDMServer.cppnew file+29

This diff is too big to show here.

tests/plugins/Unity/Session/LightDMServer.hnew file+38

This diff is too big to show here.

tests/plugins/Unity/Session/LogindServer.cppnew file+33

This diff is too big to show here.

tests/plugins/Unity/Session/LogindServer.hnew file+43

This diff is too big to show here.

tests/plugins/Unity/Session/interfaces.xmlnew file+17

This diff is too big to show here.

tests/plugins/Unity/Session/server.cppnew file+50

This diff is too big to show here.

tests/plugins/Unity/Session/sessionbackendtest.cpp+15−16

This diff is too big to show here.

tests/plugins/Utils/WindowInputMonitorTest.cpp+52−11

This diff is too big to show here.

tests/qmltests/CMakeLists.txt+4−2

This diff is too big to show here.

tests/qmltests/Components/CMakeLists.txt+10−3

This diff is too big to show here.

tests/qmltests/Components/tst_Dialogs.qml+4−2

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle.cpp+28−24

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle.qml+22−4

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle/BottomEdgeShowable.qmlnew file+108

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle/HorizontalShowable.qml → tests/qmltests/Components/tst_DragHandle/LeftEdgeShowable.qmlrenamed

The content is the same.

tests/qmltests/Components/tst_DragHandle/RightEdgeShowable.qmlnew file+108

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle/VerticalShowable.qml → tests/qmltests/Components/tst_DragHandle/TopEdgeShowable.qmlrenamed+7−7

This diff is too big to show here.

tests/qmltests/Components/tst_EdgeDragEvaluator.cpp+1−1

This diff is too big to show here.

tests/qmltests/Components/tst_LazyImage/portrait.png

Binary file not shown.

tests/qmltests/Components/tst_LazyImage/square.png

Binary file not shown.

tests/qmltests/Components/tst_LazyImage/wide.png

Binary file not shown.

tests/qmltests/Components/tst_Lockscreen.qml+20−1

This diff is too big to show here.

tests/qmltests/Components/tst_MediaServices.qmlnew file+230

This diff is too big to show here.

tests/qmltests/Components/tst_PhysicalKeysMapper.qml+12−21

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewSharing.qml → tests/qmltests/Components/tst_SharingPicker.qmlrenamed+8−8

This diff is too big to show here.

tests/qmltests/Dash/CardHelpers.js+9−7

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterExpandableWidget.qmlnew file+99

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterWidgetFactory.qml+2−1

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_Preview.qml−1

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewActions.qml+100−17

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewExpandable.qml+23−4

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewIconActions.qml+14−4

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+3−2

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewInlineVideo.qmlnew file+114

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewMediaToolbar.qml+3−3

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingDisplayCreationRanges.qml+51−15

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingEdit.qml+8−1

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml+18−6

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewWidgetFactory.qml+18−17

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+17

This diff is too big to show here.

tests/qmltests/Dash/artwork/avatar@12.png

Binary file not shown.

tests/qmltests/Dash/artwork/background.png

Binary file not shown.

tests/qmltests/Dash/artwork/checkers.png

Binary file not shown.

tests/qmltests/Dash/artwork/emblem.png

Binary file not shown.

tests/qmltests/Dash/artwork/music-player-design.png

Binary file not shown.

tests/qmltests/Dash/tst_Card.qml+61−14

This diff is too big to show here.

tests/qmltests/Dash/tst_CardTool.qml+1−1

This diff is too big to show here.

tests/qmltests/Dash/tst_Dash.qml+150−125

This diff is too big to show here.

tests/qmltests/Dash/tst_DashContent.qml+70−5

This diff is too big to show here.

tests/qmltests/Dash/tst_DashPageHeader.qml−24

This diff is too big to show here.

tests/qmltests/Dash/tst_DashShell.qml+13−3

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericScopeView.qml+37−2

This diff is too big to show here.

tests/qmltests/Dash/tst_PreviewView.qml+3−3

This diff is too big to show here.

tests/qmltests/Greeter/TestView.qml+10−3

This diff is too big to show here.

tests/qmltests/Greeter/tst_Greeter.qml+205−26

This diff is too big to show here.

tests/qmltests/Greeter/tst_Infographics.qml+1−1

This diff is too big to show here.

tests/qmltests/Greeter/tst_NarrowView.qml+24−3

This diff is too big to show here.

tests/qmltests/Greeter/tst_WideView.qml+108−35

This diff is too big to show here.

tests/qmltests/Launcher/tst_Launcher.qml+81−15

This diff is too big to show here.

tests/qmltests/Notifications/tst_Notifications.qml+139−54

This diff is too big to show here.

tests/qmltests/Notifications/tst_OptionToggle.qml+10−1

This diff is too big to show here.

tests/qmltests/Notifications/tst_SwipeToAct.qml+11−1

This diff is too big to show here.

tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+15−6

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+1

This diff is too big to show here.

tests/qmltests/Panel/tst_ActiveCallHint.qml+3−2

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorsMenu.qml+29−1

This diff is too big to show here.

tests/qmltests/Panel/tst_Panel.qml+2−2

This diff is too big to show here.

tests/qmltests/Stages/ApplicationCheckBox.qml+133−58

This diff is too big to show here.

tests/qmltests/Stages/RecursingChildSessionControl.qmldeleted−145

This diff is too big to show here.

tests/qmltests/Stages/SurfaceManagerControls.qml+7−8

This diff is too big to show here.

tests/qmltests/Stages/tst_ApplicationWindow.qml+181−73

This diff is too big to show here.

tests/qmltests/Stages/tst_DesktopStage.qml+446−166

This diff is too big to show here.

tests/qmltests/Stages/tst_PhoneStage.qml+272−82

This diff is too big to show here.

tests/qmltests/Stages/tst_SessionContainer.qmldeleted−331

This diff is too big to show here.

tests/qmltests/Stages/tst_SpreadDelegate.qml+3−2

This diff is too big to show here.

tests/qmltests/Stages/tst_SurfaceContainer.qml+114−45

This diff is too big to show here.

tests/qmltests/Stages/tst_TabletStage.qml+459−105

This diff is too big to show here.

tests/qmltests/Stages/tst_WindowResizeArea.qml+52−39

This diff is too big to show here.

tests/qmltests/Tutorial/tst_Tutorial.qml+181−219

This diff is too big to show here.

tests/qmltests/UnityLogo.png

Binary file not shown.

tests/qmltests/Wizard/tst_Wizard.qml+8−15

This diff is too big to show here.

tests/qmltests/tst_OrientedShell.qml+176−119

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+361−202

This diff is too big to show here.

tests/qmltests/tst_ShellWithPin.qml+18−20

This diff is too big to show here.

tests/qmltests/utils/Unity/Test/tst_UnityTest.qml+31

This diff is too big to show here.

tests/uqmlscene/main.cpp−1

This diff is too big to show here.

tests/utils/modules/Unity/Test/CMakeLists.txt+9−3

This diff is too big to show here.

tests/utils/modules/Unity/Test/Test.qmltypesdeleted−60

This diff is too big to show here.

tests/utils/modules/Unity/Test/UnityTestCase.qml+135−21

This diff is too big to show here.

tests/utils/modules/Unity/Test/testutil.cpp+19−2

This diff is too big to show here.

tests/utils/modules/Unity/Test/testutil.h+1

This diff is too big to show here.

tools/CMakeLists.txt+1−1

This diff is too big to show here.

tools/scopetool.cpp+1−1

This diff is too big to show here.