on xenial help sign in
Merge remote-tracking branch 'u8t/master' into xenial_-_mir26
commit525969a26756a0b8552ada980421372ddb27c8b6 authorMarius Gripsgard <mariogrip@ubuntu.com> dateThu 28 Dec 2017, 08:22 (9 years ago) parent840cd4c4ae4ff9
592 files changed+38502−20118
CMakeLists.txt+29−12 CODING+24 build.sh+16 cmake/modules/QmlTest.cmake+188−12 data/com.canonical.Unity8.gschema.xml+18−3 data/unity8-dash.desktop.in−1 data/unity8-greeter-wrapper+7−4 data/unity8.conf+28−30 debian/changelog+401 debian/control+39−26 debian/rules+2−2 debian/shlibs.local+1 debian/tests/control+2−3 debian/tests/qmluitests.sh+4−14 debian/unity8-fake-env.install → debian/unity8-tests.install+4 debian/unity8-tests.lintian-overrides+1 debian/unity8.install+1−1 include/paths.h.in+26−1 plugins/AccountsService/AccountsService.h+1−1 plugins/Cursor/CursorImageInfo.cpp+1−2 plugins/Cursor/CursorImageProvider.cpp+2 plugins/Dash/abstractdashview.cpp+1−1 plugins/GlobalShortcut/globalshortcut.cpp+12−4 plugins/GlobalShortcut/globalshortcut.h+5 plugins/GlobalShortcut/globalshortcutregistry.cpp+14−4 plugins/Greeter/Unity/Launcher/CMakeLists.txt−1 plugins/Greeter/Unity/Launcher/launcheritem.cpp+13 plugins/Greeter/Unity/Launcher/launcheritem.h+3 plugins/Greeter/Unity/Launcher/quicklistmodel.cpp+2 plugins/LightDM/CMakeLists.txt+1−1 plugins/LightDM/DBusGreeterList.cpp+6−6 plugins/LightDM/DBusGreeterList.h+2−2 plugins/LightDM/FullLightDM/CMakeLists.txt+5−1 plugins/LightDM/Greeter.cpp+137−23 plugins/LightDM/Greeter.h+17−13 plugins/LightDM/GreeterPrivate.h+13−8 plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.cpp+7−4 plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.h+2−2 plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.cpp+27−22 plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.h+1 plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.cpp−1 plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.h+2−2 plugins/LightDM/IntegratedLightDM/liblightdm/UsersModel.h+1−2 plugins/LightDM/PromptsModel.cpp+97 plugins/LightDM/PromptsModel.h+70 plugins/LightDM/SessionsModel.cpp+1−2 plugins/LightDM/SessionsModel.h+5−7 plugins/LightDM/UsersModel.cpp+176−9 plugins/LightDM/UsersModel.h+6−8 plugins/LightDM/plugin.cpp+12−4 plugins/Lights/Lights.h+1−1 plugins/Powerd/Powerd.h+2−2 plugins/UInput/uinput.h+1−1 plugins/Ubuntu/CMakeLists.txt−2 plugins/Ubuntu/Gestures/CMakeLists.txt+1−1 plugins/Ubuntu/Gestures/Direction.h+1−1 plugins/Ubuntu/Gestures/TouchGestureArea.cpp−5 plugins/Ubuntu/Gestures/TouchGestureArea.h+1−1 plugins/Ubuntu/Payments/CMakeLists.txt−20 plugins/Ubuntu/Payments/Payments.cpp−136 plugins/Ubuntu/Payments/Payments.h−69 plugins/Ubuntu/Payments/qmldir−3 plugins/Ubuntu/SystemImage/CMakeLists.txt−15 plugins/Ubuntu/SystemImage/SystemImage.cpp−155 plugins/Ubuntu/SystemImage/SystemImage.h−84 plugins/Ubuntu/SystemImage/plugin.cpp−28 plugins/Ubuntu/SystemImage/qmldir−3 plugins/Unity/ApplicationMenu/CMakeLists.txt+19 plugins/Unity/ApplicationMenu/applicationmenuregistry.cpp+141 plugins/Unity/ApplicationMenu/applicationmenuregistry.h+83 plugins/Unity/ApplicationMenu/com.ubuntu.MenuRegistrar.xml+83 plugins/Unity/ApplicationMenu/dbusapplicationmenuregistry.cpp+44 tests/mocks/LightDM/IntegratedLightDM/MockUsersModel.h → plugins/Unity/ApplicationMenu/dbusapplicationmenuregistry.h+11−16 plugins/Unity/ApplicationMenu/plugin.cpp+42 plugins/Ubuntu/Payments/plugin.h → plugins/Unity/ApplicationMenu/plugin.h+6−5 plugins/Unity/ApplicationMenu/qmldir+3 plugins/Unity/CMakeLists.txt+1 plugins/Unity/DashCommunicator/CMakeLists.txt+1 plugins/Unity/DashCommunicator/dashconnection.cpp+3 plugins/Unity/Indicators/CMakeLists.txt+3 plugins/Unity/Indicators/indicators.h+5−5 plugins/Unity/Indicators/indicatorsmanager.h−2 plugins/Unity/Indicators/indicatorsmodel.h−1 plugins/Unity/Indicators/sharedunitymenumodel.cpp+4 plugins/Unity/InputInfo/qinputinfo.h+2−3 plugins/Unity/Launcher/CMakeLists.txt+5−1 plugins/Unity/Launcher/appdrawermodel.cpp+62 plugins/Ubuntu/SystemImage/plugin.h → plugins/Unity/Launcher/appdrawermodel.h+12−10 plugins/Unity/Launcher/launcheritem.cpp+43−6 plugins/Unity/Launcher/launcheritem.h+7−2 plugins/Unity/Launcher/launchermodel.cpp+56−52 plugins/Unity/Launcher/launchermodel.h+3−15 plugins/Unity/Launcher/plugin.cpp+2−1 plugins/Unity/Launcher/quicklistentry.cpp+11 plugins/Unity/Launcher/quicklistentry.h+4 plugins/Unity/Launcher/quicklistmodel.cpp+9 plugins/Unity/Launcher/quicklistmodel.h+1 plugins/Unity/Launcher/ualwrapper.cpp+73 tests/mocks/LightDM/IntegratedLightDM/plugin.h → plugins/Unity/Launcher/ualwrapper.h+15−12 plugins/Unity/Platform/platform.cpp+16−2 plugins/Unity/Session/dbusunitysessionservice.cpp+75−4 plugins/Unity/Session/dbusunitysessionservice.h+18−4 plugins/Unity/Session/plugin.cpp+1 plugins/Utils/CMakeLists.txt+7 plugins/Utils/ElapsedTimer.h+1−1 plugins/Utils/Timer.cpp+5−2 plugins/Utils/Timer.h+5−6 plugins/Utils/URLDispatcher.cpp+5−2 plugins/Utils/WindowInputMonitor.cpp+3 plugins/Utils/appdrawerproxymodel.cpp+189 plugins/Utils/appdrawerproxymodel.h+87 plugins/Utils/easingcurve.h−1 plugins/Utils/expressionfiltermodel.cpp+49 plugins/Utils/expressionfiltermodel.h+42 plugins/Utils/globalfunctions.cpp+5 plugins/Utils/globalfunctions.h+2 plugins/Utils/plugin.cpp+9−1 plugins/Utils/quicklistproxymodel.cpp+72 plugins/Utils/quicklistproxymodel.h+52 plugins/Utils/tabfocusfence.cpp+72 plugins/Utils/tabfocusfence.h+38 plugins/Utils/unitysortfilterproxymodelqml.h+5 plugins/Utils/windowstatestorage.cpp+37−7 plugins/Utils/windowstatestorage.h+10−5 plugins/WindowManager/AvailableDesktopArea.cpp+50 plugins/WindowManager/AvailableDesktopArea.h+38 plugins/WindowManager/CMakeLists.txt+12−1 plugins/WindowManager/TopLevelSurfaceList.cpp−481 plugins/WindowManager/TopLevelSurfaceList.h−223 plugins/WindowManager/TopLevelWindowModel.cpp+721 plugins/WindowManager/TopLevelWindowModel.h+266 plugins/WindowManager/Window.cpp+268 plugins/WindowManager/Window.h+176 tests/mocks/LightDM/IntegratedLightDM/QLightDM/Greeter → plugins/WindowManager/WindowManagerGlobal.h+8−2 plugins/WindowManager/WindowManagerPlugin.cpp+10−3 plugins/WindowManager/WindowMargins.cpp+74 plugins/WindowManager/WindowMargins.h+59 plugins/Wizard/PageList.cpp+5−6 plugins/Wizard/timezonemodel.h+1−1 po/aa.po+184−137 po/am.po+223−144 po/ar.po+219−166 po/ast.po+228−149 po/az.po+183−136 po/be.po+184−137 po/bg.po+183−136 po/bn.po+183−136 po/br.po+236−152 po/bs.po+184−137 po/ca.po+227−147 po/ca@valencia.po+183−136 po/ce.po+183−136 po/ckb.po+183−136 po/co.po+190−140 po/cs.po+184−137 po/cy.po+184−137 po/da.po+184−137 po/de.po+229−150 po/el.po+253−168 po/en_AU.po+190−140 po/en_GB.po+226−147 po/eo.po+184−137 po/es.po+232−151 po/et.po+942 po/eu.po+184−137 po/fa.po+226−147 po/fi.po+226−147 po/fo.po+184−137 po/fr.po+231−150 po/ga.po+184−137 po/gd.po+228−149 po/gl.po+231−151 po/gv.po+183−136 po/he.po+184−137 po/hi.po+183−136 po/hr.po+226−147 po/hu.po+226−147 po/hy.po+183−136 po/ia.po+226−147 po/id.po+183−136 po/is.po+183−136 po/it.po+230−149 po/ja.po+183−136 po/km.po+184−137 po/kn.po+183−136 po/ko.po+184−137 po/ku.po+211−164 po/ky.po+183−136 po/lo.po+183−136 po/lt.po+183−136 po/lv.po+184−137 po/ml.po+183−136 po/mr.po+183−136 po/ms.po+274−191 po/my.po+184−137 po/nb.po+227−148 po/ne.po+184−137 po/nl.po+226−147 po/nn.po+183−136 po/oc.po+220−146 po/or.po+183−136 po/pa.po+184−137 po/pl.po+225−146 po/pt.po+227−147 po/pt_BR.po+184−137 po/ro.po+184−137 po/ru.po+222−146 po/shn.po+183−136 po/si.po+183−136 po/sk.po+226−147 po/sl.po+216−145 po/sq.po+184−137 po/sr.po+224−145 po/sv.po+226−147 po/sw.po+184−137 po/ta.po+200−151 po/te.po+183−136 po/th.po+200−151 po/tr.po+226−147 po/ug.po+189−139 po/uk.po+227−148 po/unity8.pot+176−129 po/update-unity-pot+17 po/ur.po+183−136 po/uz.po+183−136 po/vi.po+183−136 po/wo.po+184−137 po/xh.po+183−136 po/zh_CN.po+197−141 po/zh_HK.po+183−136 po/zh_TW.po+207−147 qml/ApplicationMenus/ApplicationMenuItemFactory.qml+135 tests/mocks/LightDM/IntegratedLightDM/QLightDM/SessionsModel → qml/ApplicationMenus/ApplicationMenusLimits.qml+9−2 qml/ApplicationMenus/MenuBar.qml+513 qml/ApplicationMenus/MenuItem.qml+146 qml/ApplicationMenus/MenuNavigator.qml+101 qml/ApplicationMenus/MenuPopup.qml+510 qml/ApplicationMenus/RegisteredApplicationMenuModel.qml+56 qml/ApplicationMenus/qmldir+1 qml/CMakeLists.txt+1 qml/Components/Dialogs.qml+49−7 qml/Components/DragHandle.qml+1 qml/Components/EdgeBarrier.qml+1 qml/Components/EdgeBarrierController.qml+1 qml/Components/InputMethod.qml+5−4 qml/Components/KeyboardShortcutsOverlay.qml+28−2 qml/Components/KeymapSwitcher.qml+19−8 qml/Components/Lockscreen.qml+3−1 qml/Components/ModeSwitchWarningDialog.qml+8−2 qml/Components/PanelState/PanelState.qml+6−3 qml/Components/ScrollCalculator.qml+21−2 qml/Components/ShellDialog.qml+21−3 qml/Components/VirtualTouchPad.qml+269−1 qml/Components/WindowControlButtons.qml+2 qml/Dash/CardGrid.qml+2−3 qml/Dash/CardTool.qml+2−26 qml/Dash/GenericScopeView.qml+1−1 qml/Dash/Previews/PreviewAudioPlayback.qml+1 qml/Dash/Previews/PreviewPayments.qml−81 qml/Dash/Previews/PreviewRatingInput.qml+1−1 qml/Dash/Previews/PreviewWidgetFactory.qml−1 qml/Dash/ScopesList.qml+120−39 qml/Dash/ScopesListCategory.qml+4−1 qml/DisabledScreenNotice.qml+3−55 qml/Greeter/Circle.qml+1−1 qml/Greeter/FullLightDMImpl.qml+1 qml/Greeter/Greeter.qml+29−74 qml/Greeter/GreeterPrompt.qml+61−41 qml/Greeter/IntegratedLightDMImpl.qml+1 qml/Greeter/LightDMService.qml+4−4 qml/Greeter/LoginList.qml+44−113 qml/Greeter/NarrowView.qml+11−35 qml/Greeter/PromptList.qml+148 qml/Greeter/SessionsList.qml+34−17 qml/Greeter/WideView.qml+19−25 qml/Launcher/BackgroundBlur.qml+81 qml/Launcher/Drawer.qml+438 qml/Launcher/DrawerGridView.qml+49 tests/mocks/Ubuntu/Payments/plugin.cpp → qml/Launcher/DrawerListView.qml+19−9 qml/Launcher/Launcher.qml+214−48 qml/Launcher/LauncherDelegate.qml+8−9 qml/Launcher/LauncherPanel.qml+77−28 qml/Launcher/MoreAppsHeader.qml+69 qml/Launcher/graphics/home.svg+243 qml/Launcher/graphics/home@18.png qml/Launcher/graphics/launcher-app-focus-ring.svg−12 qml/OrientedShell.qml+16−7 plugins/Ubuntu/Payments/plugin.cpp → qml/Panel/FakePanelMenu.qml+8−10 qml/Panel/IndicatorPage.qml−188 qml/Panel/IndicatorItem.qml → qml/Panel/Indicators/IndicatorItem.qml+2−1 qml/Panel/Indicators/MenuItemFactory.qml → qml/Panel/Indicators/IndicatorMenuItemFactory.qml+29−11 qml/Panel/Indicators/client/IndicatorRepresentation.qml+18−5 qml/Panel/MenuContent.qml+9−12 qml/Panel/Panel.qml+330−91 qml/Panel/IndicatorsBar.qml → qml/Panel/PanelBar.qml+85−36 qml/Panel/IndicatorItemRow.qml → qml/Panel/PanelItemRow.qml+61−104 qml/Panel/IndicatorsMenu.qml → qml/Panel/PanelMenu.qml+71−33 qml/Panel/PanelMenuPage.qml+226 qml/Rotation/RotationStates.qml+2−2 qml/Shell.qml+150−64 qml/Stage/ApplicationWindow.qml+1 qml/Stage/ChildWindow.qml+203 qml/Stage/ChildWindowRepeater.qml+39 qml/Stage/ChildWindowTree.qml+138 qml/Stage/DecoratedWindow.qml+97−44 qml/Stage/FakeMaximizeDelegate.qml+7−7 qml/Stage/MoveHandler.qml+39−26 qml/Stage/Spread/Spread.qml+11 qml/Stage/Spread/WindowedRightEdgeMaths.qml+19−4 qml/Stage/Stage.qml+444−285 qml/Stage/StageMaths.qml+18−7 qml/Stage/StagedFullscreenPolicy.qml+7−13 qml/Stage/TopLevelSurfaceRepeater.qml−67 qml/Stage/WindowControlsOverlay.qml+23−26 qml/Stage/WindowDecoration.qml+84−19 qml/Stage/WindowInfoItem.qml+16 qml/Stage/WindowResizeArea.qml+15−70 qml/Stage/WindowStateSaver.qml+64 qml/Stage/WindowedFullscreenPolicy.qml+4−12 qml/Tutorial/TutorialContent.qml+1−2 qml/Tutorial/TutorialLeftLong.qml+2−2 qml/Wizard/Pages/30-wifi.qml−4 qml/Wizard/Pages/77-system-update.qml−156 src/CMakeLists.txt+11−3 src/DebuggingController.cpp+92 src/DebuggingController.h+57 src/MouseTouchAdaptor.cpp+28−1 src/MouseTouchAdaptor.h+1 src/Panel/CMakeLists.txt−3 src/Panel/Indicators/CMakeLists.txt−1 src/ShellApplication.cpp+8−1 src/ShellView.cpp+22 src/libunity8-private/abstractdbusservicemonitor.h+1−1 src/main.cpp+2−2 tests/CMakeLists.txt+21−9 tests/autopilot/unity8/dash.py+1−17 tests/autopilot/unity8/fixture_setup.py+1−1 tests/autopilot/unity8/shell/tests/__init__.py+1−1 tests/autopilot/unity8/shell/tests/test_helpers.py−49 tests/copyright/check_copyright.sh+33−4 tests/graphics/screenshots/gallery@12.png tests/mocks/AccountsService/AccountsService.cpp+2−3 tests/mocks/AccountsService/AccountsService.h+4−7 tests/mocks/AccountsService/CMakeLists.txt+3−3 tests/mocks/Biometryd/MockOperation.h−1 tests/mocks/CMakeLists.txt+15−15 tests/mocks/Cursor/CMakeLists.txt+1−1 tests/mocks/GSettings.1.0/fake_gsettings.cpp+14 tests/mocks/GSettings.1.0/fake_gsettings.h+7 tests/mocks/LightDM/CMakeLists.txt−1 tests/mocks/LightDM/IntegratedLightDM/CMakeLists.txt−51 tests/mocks/LightDM/IntegratedLightDM/MockGreeter.cpp−51 tests/mocks/LightDM/IntegratedLightDM/MockGreeter.h−42 tests/mocks/LightDM/IntegratedLightDM/MockSessionsModel.cpp−66 tests/mocks/LightDM/IntegratedLightDM/MockSessionsModel.h−44 tests/mocks/LightDM/IntegratedLightDM/MockUsersModel.cpp−44 tests/mocks/LightDM/IntegratedLightDM/liblightdm/CMakeLists.txt−20 tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.cpp−201 tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModel.cpp−123 tests/mocks/LightDM/IntegratedLightDM/plugin.cpp−79 tests/mocks/LightDM/IntegratedLightDM/qmldir−2 tests/mocks/LightDMController/CMakeLists.txt+15 tests/mocks/Ubuntu/SystemImage/plugin.cpp → tests/mocks/LightDMController/plugin.cpp+11−10 tests/mocks/Ubuntu/Payments/plugin.h → tests/mocks/LightDMController/plugin.h+4−6 tests/mocks/LightDMController/qmldir+2 tests/mocks/Lights/Lights.h+1−1 tests/mocks/Powerd/Powerd.h+2−2 tests/mocks/QMenuModel/dbus-enums.h+2−3 tests/mocks/QMenuModel/unitymenumodel.cpp+78−13 tests/mocks/QMenuModel/unitymenumodel.h+12−1 tests/mocks/QtMultimedia/mediaplayer.cpp+2−2 tests/mocks/QtMultimedia/mediaplayer.h+6−6 tests/mocks/QtMultimedia/videooutput.h+1−1 tests/mocks/UInput/mockuinput.h+1−1 tests/mocks/Ubuntu/CMakeLists.txt−2 tests/mocks/Ubuntu/Connectivity/networking-status.h+2−3 tests/mocks/Ubuntu/Payments/CMakeLists.txt−10 tests/mocks/Ubuntu/Payments/MockPayments.cpp−95 tests/mocks/Ubuntu/Payments/MockPayments.h−62 tests/mocks/Ubuntu/Payments/qmldir−3 tests/mocks/Ubuntu/SystemImage/CMakeLists.txt−10 tests/mocks/Ubuntu/SystemImage/MockSystemImage.cpp−50 tests/mocks/Ubuntu/SystemImage/MockSystemImage.h−56 tests/mocks/Ubuntu/SystemImage/qmldir−3 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/CMakeLists.txt+1−1 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.h+1−1 tests/mocks/Unity/Application/ApplicationInfo.cpp+58−27 tests/mocks/Unity/Application/ApplicationInfo.h+6−3 tests/mocks/Unity/Application/ApplicationManager.cpp+100−63 tests/mocks/Unity/Application/ApplicationManager.h+32−10 tests/mocks/Unity/Application/CMakeLists.txt+2−2 tests/mocks/Unity/Application/MirMock.cpp+13 tests/mocks/Unity/Application/MirMock.h+4 tests/mocks/Unity/Application/MirSurface.cpp+121−82 tests/mocks/Unity/Application/MirSurface.h+44−27 tests/mocks/Unity/Application/MirSurfaceItem.cpp+24−9 tests/mocks/Unity/Application/MirSurfaceItem.h+1−2 tests/mocks/Unity/Application/MirSurfaceListModel.cpp+17−39 tests/mocks/Unity/Application/MirSurfaceListModel.h+7−15 tests/mocks/Unity/Application/SurfaceManager.cpp+186−31 tests/mocks/Unity/Application/SurfaceManager.h+32−10 tests/mocks/Unity/Application/VirtualKeyboard.cpp+5−4 tests/mocks/Unity/Application/plugin.cpp+3−33 tests/mocks/Unity/Application/resources/Kate.qml+49 tests/mocks/Unity/Application/resources/KateDialog.qml+48 tests/mocks/Unity/Application/resources/KateMenu.qml+41 tests/mocks/Unity/Application/resources/surfaces.qrc+3 tests/mocks/Unity/ApplicationMenu/CMakeLists.txt+18 tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.cpp+47 tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.h+41 tests/mocks/Unity/ApplicationMenu/plugin.cpp+42 tests/mocks/Ubuntu/SystemImage/plugin.h → tests/mocks/Unity/ApplicationMenu/plugin.h+6−5 tests/mocks/Unity/ApplicationMenu/qmldir+3 tests/mocks/Unity/CMakeLists.txt+11 tests/mocks/Unity/Indicators/CMakeLists.txt+4 tests/mocks/Unity/Indicators/fakeindicatorsmodel.h−1 tests/mocks/Unity/Indicators/fakeindicatorsmodeldata.js+20−4 tests/mocks/Unity/InputInfo/qinputdeviceinfo_mock.cpp+6−2 tests/mocks/Unity/Launcher/CMakeLists.txt+4−2 tests/mocks/Unity/Launcher/MockAppDrawerModel.cpp+74 tests/mocks/Unity/Launcher/MockAppDrawerModel.h+32 tests/mocks/Unity/Launcher/MockLauncherItem.cpp+14−1 tests/mocks/Unity/Launcher/MockLauncherItem.h+6 tests/mocks/Unity/Launcher/MockLauncherModel.cpp+3 tests/mocks/Unity/Launcher/MockLauncherModel.h+1−1 tests/mocks/Unity/Launcher/MockQuickListModel.cpp+3−1 tests/mocks/Unity/Launcher/MockQuickListModel.h+2 tests/mocks/Unity/Launcher/plugin.cpp+4 tests/mocks/Unity/Notifications/MockActionModel.h+1−1 tests/mocks/Unity/Notifications/MockNotification.h+2−1 tests/mocks/Unity/Platform/CMakeLists.txt+1 tests/mocks/LightDM/IntegratedLightDM/QLightDM/UsersModel → tests/mocks/Unity/Platform/MockPlatform.qml+10−2 tests/mocks/Unity/Platform/qmldir+2 tests/mocks/Unity/Screens/screens.cpp+1−1 tests/mocks/Unity/Screens/screens.h+1−1 tests/mocks/Unity/fake_previewwidgetmodel.h+1−1 tests/mocks/Unity/fake_scope.cpp+2−2 tests/mocks/Unity/fake_scopes.cpp+8−2 tests/mocks/Unity/fake_scopesoverview.h+2 tests/mocks/Utils/CMakeLists.txt+8 tests/mocks/Utils/plugin.cpp+9−1 tests/mocks/Utils/windowstatestorage.cpp+23 tests/mocks/Utils/windowstatestorage.h+6−3 tests/mocks/liblightdm/CMakeLists.txt+18 tests/mocks/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.cpp → tests/mocks/liblightdm/GreeterPrivate.cpp tests/mocks/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.h → tests/mocks/liblightdm/GreeterPrivate.h tests/mocks/liblightdm/MockController.cpp+192 tests/mocks/liblightdm/MockController.h+106 tests/mocks/liblightdm/MockGreeter.cpp+316 tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.h → tests/mocks/liblightdm/MockGreeter.h+10−23 tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModel.cpp → tests/mocks/liblightdm/MockSessionsModel.cpp+39−42 tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModel.h → tests/mocks/liblightdm/MockSessionsModel.h+11−19 tests/mocks/liblightdm/MockUsersModel.cpp+220 tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModel.h → tests/mocks/liblightdm/MockUsersModel.h+9−18 tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.cpp → tests/mocks/liblightdm/SessionsModelPrivate.cpp+1−1 tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.h → tests/mocks/liblightdm/SessionsModelPrivate.h tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp → tests/mocks/liblightdm/UsersModelPrivate.cpp+23−23 tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.h → tests/mocks/liblightdm/UsersModelPrivate.h tests/mocks/libusermetrics/CMakeLists.txt+1 tests/mocks/libusermetrics/ColorTheme.cpp+4 tests/mocks/libusermetrics/UserMetrics.cpp+5 tests/plugins/AccountsService/CMakeLists.txt+6 tests/plugins/CMakeLists.txt+1 tests/plugins/Dash/CMakeLists.txt+26−1 tests/plugins/Dash/cardcreatortest.cpp+7−2 tests/plugins/Dash/horizontaljournaltest.cpp+5−2 tests/plugins/Dash/horizontaljournaltry.cpp+3−1 tests/plugins/Dash/listviewwithpageheadersectionexternalmodeltest.cpp+4−1 tests/plugins/Dash/listviewwithpageheadersectiontest.cpp+3−1 tests/plugins/Dash/listviewwithpageheadertest.cpp+3−1 tests/plugins/Dash/organicgridtest.cpp+4−1 tests/plugins/Dash/organicgridtry.cpp+3−1 tests/plugins/Dash/verticaljournaltest.cpp+5−2 tests/plugins/Dash/verticaljournaltry.cpp+3−1 tests/plugins/GlobalShortcut/CMakeLists.txt+11−5 tests/plugins/GlobalShortcut/GlobalShortcutTest.cpp+3−2 tests/plugins/Greeter/Unity/Launcher/CMakeLists.txt+5−22 tests/plugins/Greeter/Unity/Launcher/launchermodelastest.cpp+4−1 tests/plugins/ImageCache/CMakeLists.txt+10 tests/plugins/ImageCache/test.cpp+4−2 tests/plugins/LightDM/IntegratedLightDM/CMakeLists.txt+53−9 tests/plugins/LightDM/IntegratedLightDM/dbus.cpp+9−12 tests/plugins/LightDM/IntegratedLightDM/greeter.qml+2−7 tests/plugins/LightDM/IntegratedLightDM/promptsmodel.cpp+175 tests/plugins/LightDM/IntegratedLightDM/sessionsmodel.cpp+15−13 tests/plugins/LightDM/IntegratedLightDM/usersmodel.cpp+100−16 tests/plugins/SessionBroadcast/CMakeLists.txt+6 tests/plugins/Ubuntu/Gestures/CMakeLists.txt+8−4 tests/plugins/Ubuntu/Gestures/GestureTest.cpp+2−1 tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.qml+1−1 tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+3−1 tests/plugins/Unity/CMakeLists.txt+1 tests/plugins/Unity/Indicators/CMakeLists.txt+11−1 tests/plugins/Unity/Indicators/IndicatorsManagerTest.cpp+1−1 tests/plugins/Unity/Indicators/IndicatorsModelTest.cpp+1−1 tests/plugins/Unity/Launcher/CMakeLists.txt+13−4 tests/plugins/Unity/Launcher/launchermodeltest.cpp+112−11 tests/plugins/Unity/Platform/CMakeLists.txt+30 tests/plugins/Unity/Platform/platformtest.cpp+142 tests/plugins/Unity/Session/CMakeLists.txt+19−1 tests/plugins/Unity/Session/LogindServer.cpp+10 tests/plugins/Unity/Session/LogindServer.h+5 tests/plugins/Unity/Session/interfaces.xml+12 tests/plugins/Unity/Session/preload.c+43 tests/plugins/Unity/Session/sessionbackendtest.cpp+130−11 tests/plugins/Utils/CMakeLists.txt+11−1 tests/plugins/Utils/DeviceConfigParserTest.cpp+4−1 tests/plugins/Utils/WindowInputMonitorTest.cpp+107−10 tests/plugins/Utils/WindowStateStorageTest.cpp+73 tests/plugins/WindowManager/CMakeLists.txt+34 tests/plugins/WindowManager/UnityApplicationMocks.h+210 tests/plugins/WindowManager/tst_TopLevelWindowModel.cpp+130 tests/plugins/Wizard/CMakeLists.txt+6 tests/qmltests/ApplicationMenuDataLoader.qml+99 tests/qmltests/ApplicationMenus/tst_MenuBar.qml+409 tests/qmltests/ApplicationMenus/tst_MenuPopup.qml+360 tests/qmltests/CMakeLists.txt+28−7 tests/qmltests/Components/CMakeLists.txt+18−3 tests/qmltests/Components/tst_DragHandle.cpp+4−2 tests/qmltests/Components/tst_EdgeDragEvaluator.cpp+4−2 tests/qmltests/Components/tst_VirtualTouchPad.qml+55−1 tests/qmltests/Components/tst_ZoomableImage.qml+1−1 tests/qmltests/Dash/Previews/tst_Preview.qml+63 tests/qmltests/Dash/Previews/tst_PreviewExpandable.qml−5 tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+13−13 tests/qmltests/Dash/Previews/tst_PreviewPayments.qml−203 tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+5−5 tests/qmltests/Dash/tst_Dash.qml+9−54 tests/qmltests/Dash/tst_DashContent.qml+4−4 tests/qmltests/Dash/tst_DashShell.qml+9−70 tests/qmltests/Dash/tst_GenericScopeView.qml+6−22 tests/qmltests/Greeter/TestView.qml+7−21 tests/qmltests/Greeter/tst_Greeter.qml+62−117 tests/qmltests/Greeter/tst_Infographics.qml+1−11 tests/qmltests/Greeter/tst_NarrowView.qml+20−43 tests/qmltests/Greeter/tst_WideView.qml+145−122 tests/qmltests/Launcher/tst_Drawer.qml+385 tests/qmltests/Launcher/tst_Launcher.qml+117−15 tests/qmltests/Notifications/tst_Notifications.qml+11−11 tests/qmltests/Notifications/tst_SwipeToAct.qml+5−5 tests/qmltests/Panel/tst_IndicatorItem.qml → tests/qmltests/Panel/Indicators/tst_IndicatorItem.qml+1−1 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml → tests/qmltests/Panel/Indicators/tst_IndicatorMenuItemFactory.qml+8−3 tests/qmltests/Panel/IndicatorTest.qml → tests/qmltests/Panel/PanelTest.qml−5 tests/qmltests/Panel/tst_ActiveCallHint.qml+16−2 tests/qmltests/Panel/tst_MenuContent.qml+14−2 tests/qmltests/Panel/tst_Panel.qml+469−103 tests/qmltests/Panel/tst_IndicatorsBar.qml → tests/qmltests/Panel/tst_PanelBar.qml+24−33 tests/qmltests/Panel/tst_IndicatorItemRow.qml → tests/qmltests/Panel/tst_PanelItemRow.qml+36−32 tests/qmltests/Panel/tst_IndicatorsMenu.qml → tests/qmltests/Panel/tst_PanelMenu.qml+32−14 tests/qmltests/Panel/tst_IndicatorPage.qml → tests/qmltests/Panel/tst_PanelMenuPage.qml+53−47 tests/qmltests/Stage/ApplicationCheckBox.qml+2−2 tests/qmltests/Stage/tst_ApplicationWindow.qml+12−30 tests/qmltests/Stage/tst_DecoratedWindow.qml+40−5 tests/qmltests/Stage/tst_DesktopStage.qml+395−137 tests/qmltests/Stage/tst_PhoneStage.qml+32−43 tests/qmltests/Stage/tst_SurfaceContainer.qml+4 tests/qmltests/Stage/tst_TabletStage.qml+60−11 tests/qmltests/Stage/tst_WindowDecoration.qml+244 tests/qmltests/Stage/tst_WindowResizeArea.qml+18−75 tests/qmltests/Tutorial/tst_Tutorial.qml+36−13 tests/qmltests/Wizard/tst_Wizard.qml−6 tests/qmltests/tst_DisabledScreenNotice.qml+23−9 tests/qmltests/tst_OrientedShell.qml+115−25 tests/qmltests/tst_Shell.qml+843−368 tests/qmltests/tst_ShellWithPin.qml+37−122 tests/scripts/alert-launcher-icon.sh+16 tests/scripts/get-progress.sh+16 tests/scripts/list-launcher-icons.sh+16 tests/scripts/set-count-visible.sh+16 tests/scripts/set-count.sh+16 tests/scripts/set-progress.sh+16 tests/uqmlscene/CMakeLists.txt+14−2 tests/uqmlscene/main.cpp+7−3 tests/utils/modules/Unity/Test/CMakeLists.txt+4−2 tests/utils/modules/Unity/Test/StageTestCase.qml+68 tests/utils/modules/Unity/Test/UnityTestCase.qml+8−18 tests/utils/modules/Unity/Test/qmldir+2−1 tests/utils/modules/Unity/Test/testutil.cpp+1−1 tools/CMakeLists.txt+3−12 src/Panel/Indicators/client/CMakeLists.txt → tools/indicatorsclient/CMakeLists.txt src/Panel/Indicators/client/indicatorsclient.cpp → tools/indicatorsclient/indicatorsclient.cpp src/Panel/Indicators/client/indicatorsclient.h → tools/indicatorsclient/indicatorsclient.h src/Panel/Indicators/client/main.cpp → tools/indicatorsclient/main.cpp tools/menutool/CMakeLists.txt+5 tools/menutool/README+11 tools/menutool/menutool.cpp+62 tools/menutool/menutool.qml+118 tools/scopetool/CMakeLists.txt+12 tools/registry-tracker.cpp → tools/scopetool/registry-tracker.cpp tools/registry-tracker.h → tools/scopetool/registry-tracker.h tools/scopetool.cpp → tools/scopetool/scopetool.cpp tools/unlock-device+16
CMakeLists.txt+29−12
@@ -40,6 +40,19 @@ if(cmake_build_type_lower MATCHES coverage)
4040 ENABLE_COVERAGE_REPORT(TARGETS ${SHELL_APP} FILTER /usr/include ${CMAKE_SOURCE_DIR}/tests/* ${CMAKE_BINARY_DIR}/*)
4141endif()
4242
43+find_package (ECM 1.7.0 QUIET NO_MODULE)
44+if (ECM_FOUND)
45+ # Provides us with -DECM_ENABLE_SANITIZERS='X'
46+ # Where X can be address, thread, memory, leak, undefined
47+ include("${ECM_MODULE_DIR}/ECMEnableSanitizers.cmake")
48+endif()
49+
50+if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
51+ if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0.0")
52+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override" )
53+ endif()
54+endif()
55+
4356# Make sure we have all the needed symbols
4457set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs")
4558set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,defs")
@@ -49,22 +62,28 @@ add_custom_target(cppcheck COMMAND cppcheck --enable=all -q --error-exitcode=2
4962 ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/tests)
5063
5164include(FindPkgConfig)
52−find_package(Qt5Core 5.4 REQUIRED)
53−find_package(Qt5Qml 5.4 REQUIRED)
54−find_package(Qt5Quick 5.4 REQUIRED)
55−find_package(Qt5Gui 5.4 REQUIRED)
56−find_package(Qt5DBus 5.4 REQUIRED)
57−find_package(Qt5Concurrent 5.4 REQUIRED)
58−find_package(Qt5Sql 5.4 REQUIRED)
59−
60−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=22)
65+find_package(Qt5Core 5.6 REQUIRED)
66+find_package(Qt5Qml 5.6 REQUIRED)
67+find_package(Qt5Quick 5.6 REQUIRED)
68+find_package(Qt5Gui 5.6 REQUIRED)
69+find_package(Qt5DBus 5.6 REQUIRED)
70+find_package(Qt5Concurrent 5.6 REQUIRED)
71+find_package(Qt5Sql 5.6 REQUIRED)
72+find_package(Qt5Test 5.6 REQUIRED)
73+
74+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=27)
6175pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
6276pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
6377pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
78+pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=12)
6479pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
6580pkg_check_modules(GD3 REQUIRED gnome-desktop-3.0)
66−pkg_check_modules(UAL REQUIRED ubuntu-app-launch-2)
81+pkg_check_modules(UAL REQUIRED ubuntu-app-launch-3)
6782pkg_check_modules(UBUNTUGESTURES REQUIRED UbuntuGestures)
83+pkg_check_modules(QTDBUSTEST REQUIRED
84+ libqtdbustest-1
85+ libqtdbusmock-1
86+ )
6887
6988### Check UbuntuGestures private headers. No pkg-config (.pc) file is provided for them
7089find_path(UBUNTUGESTUREPRIV
@@ -138,8 +157,6 @@ include_directories(
138157 ${APPLICATION_API_INCLUDE_DIRS}
139158)
140159
141−set(ARTIFACTS_DIR "" CACHE PATH "Store test artifacts in this directory.")
142−
143160# Quiet logger
144161set(QUIET_LOGGER OFF CACHE BOOL "Disable test output on stdout.")
145162if(NOT QUIET_LOGGER)
CODING+24
@@ -162,3 +162,27 @@ $ PYTHONPATH=../tests/autopilot autopilot3 run unity8.some.very.long.test.name
162162or run them all with
163163
164164$ PYTHONPATH=../tests/autopilot autopilot3 run unity8
165+
166+Debugging techniques
167+====================
168+
169+Unity8 heavily uses Qt and with that Qt debugging techniques mostly apply in the
170+same fashion. There are, however, some additional unity8-specific notes:
171+
172+* Enable/disable Qt scenegraph visualizer on the fly:
173+
174+ $ qdbus com.canonical.Unity8.Debugging /com/canonical/Unity8/Debugging SetSceneGraphVisualizer <mode>
175+
176+ This is equivalent to exporting QSG_VISUALIZE=<mode> before running unity8, except it does it on the
177+ fly.
178+
179+* Toggle slow animations on the fly:
180+
181+ $ qdbus com.canonical.Unity8.Debugging /com/canonical/Unity8/Debugging SetSlowAnimations <true|false>
182+
183+* Change logging filter rules on the fly:
184+
185+ $ qdbus com.canonical.Unity8.Debugging /com/canonical/Unity8/Debugging SetLoggingFilterRules <filter>
186+
187+ This is equivalent to exporting QT_LOGGING_RULES or defining them in QT_LOGGING_CONF, except it does
188+ it on the fly.
build.sh+16
@@ -1,5 +1,21 @@
11#!/bin/sh
22
3+#
4+# Copyright (C) 2017 Canonical Ltd
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License version 3 as
8+# published by the Free Software Foundation.
9+#
10+# This program is distributed in the hope that it will be useful,
11+# but WITHOUT ANY WARRANTY; without even the implied warranty of
12+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+# GNU General Public License for more details.
14+#
15+# You should have received a copy of the GNU General Public License
16+# along with this program. If not, see <http://www.gnu.org/licenses/>.
17+#
18+
319SETUP=false
420CLEAN=false
521NUM_JOBS=$(( `grep -c ^processor /proc/cpuinfo` + 1 ))
cmake/modules/QmlTest.cmake+188−12
@@ -55,6 +55,55 @@ function(add_qml_test PATH COMPONENT_NAME)
5555endfunction()
5656
5757
58+# add_qml_test_data(path component_name
59+# [...]
60+# )
61+#
62+# Install file called ${component_name} (or ${component_name}.qml) under
63+# ${path}.
64+
65+function(add_qml_test_data PATH COMPONENT_NAME)
66+ cmake_parse_arguments(TEST "" "DESTINATION" "" ${ARGN})
67+
68+ set(filename "${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/${COMPONENT_NAME}")
69+
70+ if (IS_DIRECTORY "${filename}")
71+ # As a convenience, allow specifying a directory and we will install
72+ # all files in the dir. We do it this way rather than passing
73+ # DIRECTORY to install() because we want to process any qml files.
74+ file(GLOB subfiles RELATIVE "${filename}" "${filename}/*")
75+ foreach(subfile ${subfiles})
76+ add_qml_test_data("${PATH}/${COMPONENT_NAME}" "${subfile}")
77+ endforeach()
78+ return()
79+ endif()
80+
81+ if (NOT EXISTS "${filename}")
82+ set(filename "${filename}.qml")
83+ set(COMPONENT_NAME "${COMPONENT_NAME}.qml")
84+ endif()
85+
86+ if ("${filename}" MATCHES "\\.qml$")
87+ file(READ "${filename}" contents)
88+ string(REGEX REPLACE "(\"[./]*)/qml(/|\")" "\\1\\2" contents "${contents}")
89+ # this is for (at least) cardcreatortest which pulls in an architecture-specific
90+ # import into the plugins directory (which is a 'qml' once installed).
91+ string(REGEX REPLACE "(import \"[./]*)/plugins(/|\")" "\\1/qml\\2" contents "${contents}")
92+ set(filename "${CMAKE_CURRENT_BINARY_DIR}/${PATH}/${COMPONENT_NAME}")
93+ file(WRITE "${filename}" "${contents}")
94+ endif()
95+
96+ if (TEST_DESTINATION)
97+ set(DESTINATION "${TEST_DESTINATION}")
98+ else()
99+ file(RELATIVE_PATH relcurpath "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
100+ set(DESTINATION "${SHELL_APP_DIR}/${relcurpath}/${PATH}")
101+ endif()
102+
103+ install(FILES "${filename}" DESTINATION "${DESTINATION}")
104+endfunction()
105+
106+
58107# add_qml_unittest(path component_name
59108# [...]
60109# )
@@ -71,6 +120,10 @@ function(add_qml_unittest PATH COMPONENT_NAME)
71120 ${ARGN}
72121 ARGS -input ${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml ${QMLTEST_ARGS}
73122 )
123+
124+ if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml")
125+ add_qml_test_data("${PATH}" "tst_${COMPONENT_NAME}.qml")
126+ endif()
74127endfunction()
75128
76129
@@ -91,6 +144,10 @@ function(add_manual_qml_test PATH COMPONENT_NAME)
91144 ${ARGN}
92145 ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml ${QMLTEST_ARGS}
93146 )
147+
148+ if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml")
149+ add_qml_test_data("${PATH}" "tst_${COMPONENT_NAME}.qml")
150+ endif()
94151endfunction()
95152
96153
@@ -108,8 +165,7 @@ endfunction()
108165#
109166# Logging options in the standard form of "-o filename,format"
110167# will be appended to the arguments list, prefixed with ARG_PREFIX.
111−# XUnitXML files will be stored in current binary dir or under
112−# ARTIFACTS_DIR, if set.
168+# XUnitXML files will be stored in current binary dir.
113169#
114170# Three targets will be created:
115171# - test${component_name} - Runs the test
@@ -122,14 +178,8 @@ function(add_executable_test COMPONENT_NAME TARGET)
122178 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
123179 mangle_arguments()
124180
125− if(ARTIFACTS_DIR)
126− file(RELATIVE_PATH path ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
127− file(MAKE_DIRECTORY ${ARTIFACTS_DIR}/${path})
128− set(file_logger -o ${ARTIFACTS_DIR}/${path}/test${COMPONENT_NAME}.xml,xunitxml)
129− else()
130− file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
131− set(file_logger -o ${CMAKE_CURRENT_BINARY_DIR}/test${COMPONENT_NAME}.xml,xunitxml)
132− endif()
181+ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
182+ set(file_logger -o ${CMAKE_CURRENT_BINARY_DIR}/test${COMPONENT_NAME}.xml,xunitxml)
133183
134184 bake_arguments("${QMLTEST_ARG_PREFIX}" args ${iterations} ${file_logger} ${STDOUT_LOGGER})
135185
@@ -151,7 +201,7 @@ function(add_executable_test COMPONENT_NAME TARGET)
151201 add_qmltest_target(xvfbtest${COMPONENT_NAME} ${TARGET}
152202 COMMAND $<TARGET_FILE:xvfb-run> --server-args "-screen 0 1024x768x24" --auto-servernum ${qmltest_command}
153203 ${depends}
154− ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT} LD_PRELOAD=/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/mesa/libGL.so.1
204+ ENVIRONMENT QML2_IMPORT_PATH=${imports} LD_PRELOAD=/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/mesa/libGL.so.1 ${QMLTEST_ENVIRONMENT}
155205 TARGETS ${xvfb_targets}
156206 )
157207 endif()
@@ -207,8 +257,129 @@ function(add_manual_test COMPONENT_NAME TARGET)
207257endfunction()
208258
209259
260+# add_meta_test(target)
261+#
262+# Adds a test target that will run one of our "meta" test targets, like
263+# xvfbuitests. This script will run the specified suite of tests on an
264+# installed system.
265+
266+function(add_meta_test TARGET_NAME)
267+ cmake_parse_arguments(TEST "SERIAL" "" "DEPENDS" ${ARGN})
268+
269+ add_custom_target(${TARGET_NAME})
270+
271+ set(filename "${CMAKE_BINARY_DIR}/tests/scripts/${TARGET_NAME}.sh")
272+ if(TEST_SERIAL)
273+ file(WRITE "${filename}" "#!/bin/sh\n\n")
274+ else()
275+ file(WRITE "${filename}" "#!/usr/bin/parallel --shebang --no-notice\n\n")
276+ endif()
277+
278+ add_meta_dependencies(${TARGET_NAME} DEPENDS ${TEST_DEPENDS})
279+ # else we will write the rest of the script as we add cmake targets
280+
281+ install(FILES "${filename}"
282+ PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE
283+ GROUP_EXECUTE GROUP_READ
284+ WORLD_EXECUTE WORLD_READ
285+ DESTINATION "${SHELL_PRIVATE_LIBDIR}/tests/scripts"
286+ )
287+endfunction()
288+
289+
210290################### INTERNAL ####################
211291
292+function(install_test_script TARGET_NAME)
293+ cmake_parse_arguments(TEST "" "" "COMMAND;ENVIRONMENT" ${ARGN})
294+
295+ # Now write the above test into a shell script that we can run on an
296+ # installed system.
297+ set(script "#!/bin/sh\n\nset -x\n\n")
298+ foreach(ONE_ENV ${TEST_ENVIRONMENT})
299+ set(script "${script}export ${ONE_ENV}\n")
300+ endforeach()
301+ set(script "${script}export UNITY_TESTING_DATADIR=\"${CMAKE_INSTALL_PREFIX}/${SHELL_APP_DIR}\"\n")
302+ set(script "${script}export UNITY_TESTING_LIBDIR=\"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}\"\n")
303+ set(script "${script}\n")
304+ set(script "${script}XML_ARGS=\n")
305+ set(script "${script}if [ -n \"\$ARTIFACTS_DIR\" ]; then\n")
306+ set(script "${script} XML_ARGS=\"@XML_ARGS@\"\n")
307+ set(script "${script} mkdir -p \"@XML_DIR@\"\n")
308+ set(script "${script} touch \"@XML_FILE@\"\n")
309+ set(script "${script}fi\n")
310+ set(script "${script}\n")
311+ foreach(ONE_CMD ${TEST_COMMAND})
312+ set(script "${script}'${ONE_CMD}' ")
313+ endforeach()
314+ set(script "${script}\"\$@\"") # Allow passing arguments if desired
315+
316+ set(filename "${CMAKE_BINARY_DIR}/tests/scripts/${TARGET_NAME}.sh")
317+
318+ # Generate script to file then read it back to resolve any generator
319+ # expressions before we try to replace paths.
320+ file(GENERATE
321+ OUTPUT "${filename}"
322+ CONTENT "${script}"
323+ )
324+
325+ # Do replacement at install time to save needless work and to make sure
326+ # we are modifying file after generate step above (which doesn't happen
327+ # immediately). We can't use a custom-defined function or macro here...
328+ # So instead we use a giant ugly code block.
329+
330+ # START OF CODE BLOCK --------------------------------------------------
331+ install(CODE "
332+ file(READ \"${filename}\" replacestr)
333+
334+ # Now some replacements...
335+ # tests like to write xml output to our builddir; we don't need that, but we do want them in ARTIFACTS_DIR
336+ string(REGEX MATCH \"( '--parameter')? '-o'( '--parameter')? '[^']*,xunitxml' \" xmlargs \"\${replacestr}\")
337+ string(REGEX REPLACE \"( '--parameter')? '-o'( '--parameter')? '[^']*,xunitxml' \" \" \\\$XML_ARGS \" replacestr \"\${replacestr}\")
338+ string(REGEX REPLACE \"'[^']*/tests/\" \"'\\\$ARTIFACTS_DIR/tests/\" xmlargs \"\${xmlargs}\")
339+ string(REGEX REPLACE \".*'([^']*),xunitxml'.*\" \"\\\\1\" xmlfile \"\${xmlargs}\")
340+ string(REGEX REPLACE \"(.*)/[^/]*\" \"\\\\1\" xmldir \"\${xmlfile}\")
341+ string(REGEX REPLACE \"'\" \"\" xmlargs \"\${xmlargs}\") # strip single quotes
342+ string(REGEX REPLACE \"@XML_ARGS@\" \"\${xmlargs}\" replacestr \"\${replacestr}\")
343+ string(REGEX REPLACE \"@XML_DIR@\" \"\${xmldir}\" replacestr \"\${replacestr}\")
344+ string(REGEX REPLACE \"@XML_FILE@\" \"\${xmlfile}\" replacestr \"\${replacestr}\")
345+ # replace build/source roots with their install paths
346+ string(REPLACE \"${CMAKE_BINARY_DIR}/libs\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}\" replacestr \"\${replacestr}\")
347+ string(REPLACE \"${CMAKE_BINARY_DIR}/plugins\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_INSTALL_QML}\" replacestr \"\${replacestr}\")
348+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/libs\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/libs\" replacestr \"\${replacestr}\")
349+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/mocks\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_INSTALL_QML}/mocks\" replacestr \"\${replacestr}\")
350+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/plugins\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/plugins\" replacestr \"\${replacestr}\")
351+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/qmltests\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/qmltests\" replacestr \"\${replacestr}\")
352+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/uqmlscene\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}\" replacestr \"\${replacestr}\")
353+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/utils/modules\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_INSTALL_QML}/utils\" replacestr \"\${replacestr}\")
354+ string(REPLACE \"${CMAKE_SOURCE_DIR}/tests/plugins\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_APP_DIR}/tests/plugins\" replacestr \"\${replacestr}\")
355+ string(REPLACE \"${CMAKE_SOURCE_DIR}/tests/qmltests\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_APP_DIR}/tests/qmltests\" replacestr \"\${replacestr}\")
356+
357+ file(WRITE \"${filename}\" \"\${replacestr}\")
358+ ")
359+ # END OF CODE BLOCK --------------------------------------------------
360+
361+ install(FILES "${filename}"
362+ PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE
363+ GROUP_EXECUTE GROUP_READ
364+ WORLD_EXECUTE WORLD_READ
365+ DESTINATION "${SHELL_PRIVATE_LIBDIR}/tests/scripts"
366+ )
367+endfunction()
368+
369+function(add_meta_dependencies UPSTREAM_TARGET)
370+ cmake_parse_arguments(TEST "" "" "DEPENDS" ${ARGN})
371+
372+ foreach(depend ${TEST_DEPENDS})
373+ add_dependencies(${UPSTREAM_TARGET} ${depend})
374+
375+ # add depend to the meta test script that we will install on system
376+ set(filename "${CMAKE_BINARY_DIR}/tests/scripts/${UPSTREAM_TARGET}.sh")
377+ if (EXISTS "${filename}")
378+ file(APPEND "${filename}" "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/scripts/${depend}.sh \"\$@\" 2>&1\n")
379+ endif()
380+ endforeach()
381+endfunction()
382+
212383# add_qmltest_target(target_name target
213384# COMMAND test_exe [arg1 [...]] # execute this test with arguments
214385# [...] # see above for available arguments:
@@ -231,6 +402,11 @@ function(add_qmltest_target TARGET_NAME TARGET)
231402 DEPENDS ${TARGET} ${QMLTEST_DEPENDS}
232403 )
233404
405+ install_test_script(${TARGET_NAME}
406+ ENVIRONMENT ${QMLTEST_ENVIRONMENT}
407+ COMMAND ${QMLTEST_COMMAND}
408+ )
409+
234410 if(QMLTEST_ADD_TEST)
235411 add_test(
236412 NAME ${TARGET_NAME}
@@ -248,7 +424,7 @@ function(add_qmltest_target TARGET_NAME TARGET)
248424 endif()
249425
250426 foreach(UPSTREAM_TARGET ${QMLTEST_TARGETS})
251− add_dependencies(${UPSTREAM_TARGET} ${TARGET_NAME})
427+ add_meta_dependencies(${UPSTREAM_TARGET} DEPENDS ${TARGET_NAME})
252428 endforeach()
253429endfunction()
254430
data/com.canonical.Unity8.gschema.xml+18−3
@@ -12,7 +12,7 @@
1212 <description>The usage mode chosen will affect the Window Management behaviour.</description>
1313 </key>
1414 <key type="y" name="edge-barrier-sensitivity">
15− <default>35</default>
15+ <default>50</default>
1616 <range min="1" max="100"/>
1717 <summary>Sensitivity of screen edge barriers for the mouse pointer.</summary>
1818 <description>Some UI actions like revealing the launcher or the applications spread are triggered by pushing the mouse pointer against a screen edge. This key defines how much you have to push in order to trigger the associated action.</description>
@@ -23,7 +23,7 @@
2323 <description>How much you have to push (in grid units)the mouse against an edge barrier when sensibility is 100.</description>
2424 </key>
2525 <key type="u" name="edge-barrier-max-push">
26− <default>60</default>
26+ <default>120</default>
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>
@@ -33,7 +33,7 @@
3333 <description>How big (in grid units) the edge-drag sensitive area should be.</description>
3434 </key>
3535 <key type="b" name="autohide-launcher">
36− <default>true</default>
36+ <default>false</default>
3737 <summary>Autohide the launcher</summary>
3838 <description>This will only be applied in windowed mode. In staged mode, the launcher will always hide.</description>
3939 </key>
@@ -53,6 +53,21 @@
5353 <summary>Enable or disable the indicator pull down menus</summary>
5454 <description>Toggle the availability of the indicator pull down menus</description>
5555 </key>
56+ <key type="s" name="appstore-uri">
57+ <default>'application:///org.gnome.Software.desktop'</default>
58+ <summary>The uri to the app store</summary>
59+ <description>This will be used whenever the user triggers an action to open the app store.</description>
60+ </key>
61+ <key type="b" name="always-show-osk">
62+ <default>false</default>
63+ <summary>Force showing/hiding the OSK</summary>
64+ <description>Toggle the visibility of the On Screen Keyboard unconditionally</description>
65+ </key>
66+ <key type="b" name="osk-switch-visible">
67+ <default>false</default>
68+ <summary>Whether the OSK switch should be visible</summary>
69+ <description>Toggle the visibility of the OSK switch</description>
70+ </key>
5671 </schema>
5772
5873 <schema path="/com/canonical/unity8/greeter/" id="com.canonical.Unity8.Greeter" gettext-domain="unity8">
data/unity8-dash.desktop.in−1
@@ -5,5 +5,4 @@ Comment=An interface for using the Scopes system
55Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8-dash
66Terminal=false
77Icon=@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/Dash/unity8-dash.png
8−NoDisplay=true
98X-Ubuntu-Touch=true
data/unity8-greeter-wrapper+7−4
@@ -49,9 +49,12 @@ if which ubuntu-touch-session >/dev/null; then
4949 TOUCH_WRAPPER=ubuntu-touch-session
5050fi
5151
52−# Pretend that we're in an ubuntu-touch session, so that indicator-network
53−# will start.
54−export DESKTOP_SESSION=ubuntu-touch
52+# Advertise as a unity8 session, so that indicator-network will start.
53+export XDG_SESSION_DESKTOP=unity8
54+export DESKTOP_SESSION=$XDG_SESSION_DESKTOP
55+
56+set_greeter_var QT_IM_MODULE maliitphablet
57+set_greeter_var QT_QPA_PLATFORM ubuntumirclient
5558
5659# We disable ofono using pulse. It causes problems with racing with the user's
5760# pulse. We need to come up with a better long-term fix for this, because we
@@ -100,7 +103,7 @@ if [ "$(id -u phablet 2>/dev/null)" = "32011" ]; then
100103fi
101104
102105# And finally actually start the greeter
103−exec env QT_QPA_PLATFORM=ubuntumirclient MIR_SERVER_FILE=$SUB_SOCKET $TOUCH_WRAPPER $@ &
106+exec env MIR_SERVER_FILE=$SUB_SOCKET $TOUCH_WRAPPER $@ &
104107CMD_PID=$!
105108wait $CMD_PID
106109CMD_PID=
data/unity8.conf+28−30
@@ -8,31 +8,44 @@ stop on desktop-end
88
99kill timeout 120
1010
11+#
12+# Ensure the shell always gets unthrottled touch events, so that applications
13+# who want full speed low-latency input can get it (LP: #1497105) and so that
14+# apps can use QML touch compression safely (the QML touch compression
15+# algorithm does not support nesting well - LP: #1486341, LP: #1556763 - so
16+# must be fed by the raw input event stream from Unity8).
17+#
18+env QML_NO_TOUCH_COMPRESSION=1
19+
1120respawn
1221expect stop
1322
23+# FIXME Create an autopilot test that makes sure start+stop and restart
24+# work fine at least 2 times
25+
1426pre-start script
1527 # Tell unity-mir to raise SIGSTOP after we start
1628 initctl set-env UNITY_MIR_EMITS_SIGSTOP=1
1729
18− if [ -n "$MIR_SOCKET" ]; then
19− # FIXME Create an autopilot test that makes sure start+stop and restart
20− # work fine at least 2 times
21− # Save original value of MIR_SOCKET in case we are stopped,
22− # as we modify the variable for future jobs, including ourself.
23− UNITY_MIR_SOCKET=$(initctl get-env --global MIR_SOCKET)
24− initctl set-env --global UNITY_MIR_SOCKET=$UNITY_MIR_SOCKET
30+ # Save original value of MIR_SOCKET so that we can restore it when stopped,
31+ # as we modify the variable for future jobs, including ourself.
32+ initctl set-env UNITY_MIR_SOCKET=$MIR_SOCKET
2533
26− # Point unity8 at unity-system-compositor
34+ # Decide where we are going to put our own socket file
35+ if [ -n "$SNAP" ]; then
36+ # In snappy, we want to hard code our path because our apparmor profile
37+ # only lets us put the socket in one place. And consumers expect it
38+ # there.
39+ MIR_SERVER_FILE=/run/user/$(id -u)/mir_socket
40+ else
2741 MIR_SERVER_FILE=$XDG_RUNTIME_DIR/mir_socket
28− initctl set-env MIR_SERVER_FILE=$MIR_SERVER_FILE
29− initctl set-env MIR_SERVER_HOST_SOCKET=$UNITY_MIR_SOCKET
30−
31− # Point all future jobs in this session to our Mir socket instead of
32− # unity-system-compositor's socket.
33− initctl set-env --global MIR_SOCKET=$MIR_SERVER_FILE
34− gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
3542 fi
43+ initctl set-env MIR_SERVER_FILE=$MIR_SERVER_FILE
44+
45+ # Point all future jobs in this session to our Mir socket instead of
46+ # unity-system-compositor's socket.
47+ initctl set-env --global MIR_SOCKET=$MIR_SERVER_FILE
48+ gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
3649
3750 # Remove the normal and trusted sockets if still there
3851 if [ -S "$MIR_SERVER_FILE" ]; then
@@ -54,7 +67,6 @@ pre-start script
5467 # Workaround for text not rendering correctly
5568 initctl set-env --global QT_ENABLE_GLYPH_CACHE_WORKAROUND=1
5669
57−
5870 if [ "$XDG_SESSION_DESKTOP" = "ubuntu-touch" ]; then
5971 # On Ubuntu Touch, we currently use a trick where we auto-login the
6072 # user without a LightDM greeter at all. In this case, we want to
@@ -73,25 +85,11 @@ end script
7385exec ${BINARY:-unity8} --mode=$MODE $ARGS
7486
7587post-start script
76− # If no MIR_SOCKET was defined on launch, we try to set one here
77− if [ -z "$(initctl get-env --global UNITY_MIR_SOCKET)" ]; then
78− if [ -S "$XDG_RUNTIME_DIR/mir_socket" ]; then
79− mir_socket=$XDG_RUNTIME_DIR/mir_socket
80− elif [ -S "/tmp/mir_socket" ]; then
81− mir_socket=/tmp/mir_socket
82− fi
83−
84− if [ -n "$mir_socket" ]; then
85− initctl set-env --global MIR_SOCKET="$mir_socket"
86− fi
87− fi
88−
8988 initctl emit --no-wait indicator-services-start
9089end script
9190
9291post-stop script
9392 initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
94− initctl unset-env --global UNITY_MIR_SOCKET
9593 initctl unset-env --global MIR_SERVER_PROMPT_FILE
9694 initctl emit application-end
9795end script
debian/changelog+401
@@ -4,6 +4,402 @@ unity8 (8.16+ubports) xenial; urgency=medium
44
55 -- UBports auto importer <infra@ubports.com> Mon, 31 Jul 2017 03:12:43 +0200
66
7+unity8 (8.15+17.04.20170404.7-0ubuntu2) zesty; urgency=medium
8+
9+ [ Michael Zanetti ]
10+ * Make the default store uri point to gnome software center
11+
12+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Thu, 06 Apr 2017 10:49:29 +0300
13+
14+unity8 (8.15+17.04.20170404.7-0ubuntu1) zesty; urgency=medium
15+
16+ [ Albert Astals Cid ]
17+ * Tweak app drawer a bit (LP: #1667570)
18+
19+ [ Josh Arenson ]
20+ * Make some small changes to the greeter's session list
21+ * Handle a user in the greeter having never selected a session better
22+ (LP: #1673199)
23+
24+ [ Lukáš Tinkl ]
25+ * Do not occlude windows with an ongoing unmaximize transition (LP:
26+ #1666363)
27+ * Show and implement close buttons for child windows (LP: #1668053)
28+ * Sanitize the logic for pointer vs. touch menus, fixes hiding the
29+ window title in staged mode, when hovering the panel with mouse and
30+ no menus available.
31+
32+ [ Michael Zanetti ]
33+ * Don't hide the launcher on super press if it's locked visible (LP:
34+ #1675373)
35+ * fix searchfield selection in drawer (LP: #1677259)
36+ * make sure the stage has focus when going to spread (LP: #1672053,
37+ #1672673, #1676995)
38+ * don't autostart the dash app, but show its .desktop file instead
39+
40+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 04 Apr 2017 22:56:06 +0000
41+
42+unity8 (8.15+17.04.20170328.3-0ubuntu1) zesty; urgency=medium
43+
44+ [ Albert Astals Cid ]
45+ * mock: Remove empty property and move invokable
46+ * Tune quicklist item selection
47+ * Fix unminimizing going to the wrong position the second time (LP:
48+ #1671458)
49+ * Remove unclickable gaps on the menubar (LP: #1672722)
50+ * indicators client is a tool
51+ * Make sure we destroy the popups when the item goes away (LP:
52+ #1670338)
53+ * UnityApplicationMocks: Initialize m_state and m_requestedState
54+ * Don't use appInfo after checking it if is null
55+ * Initialize m_privateMode
56+ * Hook up aboutToShow for overflow menus (LP: #1676016)
57+
58+ [ Daniel d'Andrada ]
59+ * Give active focus to child surface qml items (LP: #1671072)
60+ * Satellite child windows (LP: #1673415)
61+ * Tell qtmir/miral about the available desktop area
62+
63+ [ Florian Boucault ]
64+ * WindowStateStorage: use a private QThreadPool to ensure that
65+ WindowStateStorage::saveValue always has a thread available to
66+ execute the query in. (LP: #1675424)
67+
68+ [ Lukáš Tinkl ]
69+ * Protect against loading invalid window geometry (LP: #1674262)
70+ * Remove usage of the deprecated (and non-functional) system-image-
71+ dbus service.
72+ * Implement Ctrl+Alt+T to launch the terminal app (LP: #1673500)
73+ * Only take normal and dialog surface types into account for launcher
74+ items (LP: #1669047)
75+ * Fix the shutdown dialog after recent refactoring in
76+ DBusUnitySessionService (LP: #1676426)
77+
78+ [ Michael Zanetti ]
79+ * drop the grey background behind icons in the drawer (LP: #1675688)
80+
81+ [ Pete Woods ]
82+ * Fix Unity/Platform::isPC, and add tests (LP: #1670657)
83+
84+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 28 Mar 2017 21:50:20 +0000
85+
86+unity8 (8.15+17.04.20170321-0ubuntu1) zesty; urgency=medium
87+
88+ [ Albert Astals Cid ]
89+ * Signal aboutToShow (LP: #1664578)
90+ * Support Panel top level items to be disabled (LP: #1670694)
91+ * Improve Launcher ←→ touch menu interaction (LP: #1667620, #1671069)
92+ * Fix real world submenus (e.g. kate) not getting their first item
93+ selected on open (LP: #1666859)
94+
95+ [ Daniel d'Andrada ]
96+ * Really disable the window decoration when in staged mode (LP:
97+ #1670361)
98+ * Don't let clients resize their surfaces while in staged
99+ (phone/tablet) mode (LP: #1670390)
100+ * TopLevelWindowModel: don't put hidden windows in the model (LP:
101+ #1665286)
102+
103+ [ Lukáš Tinkl ]
104+ * Reset always-show-osk gsetting on startup to default value (false
105+ atm)
106+ * Fix the restored-to position with Miral due to the state changes
107+ being async (LP: #1669819)
108+ * Add a cursor name fallback mapping "grabbing" -> "closedhand" for
109+ Breeze
110+ * Fix unsnapping a maximized window from the panel (LP: #1671721)
111+ * Disable altDrag feature outside windowed mode
112+
113+ [ Michael Terry ]
114+ * Don't lock the screen for guest users or users in the nopasswdlogin
115+ group. (LP: #1644237)
116+ * Support GNOME-style logout DBus API (making the Logout, Reboot, and
117+ Shutdown launcher commands work) (LP: #1673229)
118+
119+ [ Michael Zanetti ]
120+ * Add support for closing apps from the spread with "Q" (LP: #1670327)
121+ * hide "private" launcher quicklist entries when the greeter is locked
122+ (LP: #1667649)
123+ * add surface titles to launcher's quicklist (LP: #1661668)
124+ * properly reset the drawer state when cancelling a horizontal drag
125+ (LP: #1669536)
126+ * fix the focus moving correctly between launcher and drawer (LP:
127+ #1669880)
128+ * unfocus the drawer's textfield when it is moved (LP: #1669839)
129+
130+ [ Pete Woods ]
131+ * Fix up indicators-client after refactoring (LP: #1672797)
132+
133+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 21 Mar 2017 10:58:13 +0000
134+
135+unity8 (8.15+17.04.20170308-0ubuntu1) zesty; urgency=medium
136+
137+ [ Albert Astals Cid ]
138+ * Let's follow the keyboard order
139+ * Enable the license check (LP: #1590044)
140+ * Show a barebones error message if loading the QML doesn't work
141+ * Make sure cursor is back to normal when closing the window (LP:
142+ #1666158)
143+ * Fix small warning when sensitive is undefined
144+ * Remove unused member variable
145+ * Initialize m_msecsSinceReference
146+ * Add warning if registerService fails
147+ * Move menus Component {} out of the repeater
148+ * Add tool to browse menus of a running app
149+
150+ [ Daniel d'Andrada ]
151+ * Drag child windows with Alt+LeftMouseButton (LP: #1664947)
152+
153+ [ Gerry Boland ]
154+ * TopLevelWindowModel: connect to the OSK surface to know when it goes
155+ away so we can clean up after it. (LP: #1670681)
156+
157+ [ Josh Arenson ]
158+ * Initialize sessionMode to single when mock is reset (LP: #1667463)
159+
160+ [ Lukáš Tinkl ]
161+ * Make the menu string "Back" translatable
162+ * Let the OSK be driven by a switch in indicator-keyboard (LP:
163+ #1521518)
164+ * Disable the tutorial when there's no touchscreen (LP: #1661557)
165+ * Shell chrome fixes (LP: #1658117, #1665723, #1665724, #1669010)
166+ * Cancel the drag as soon as we're entering the spread (LP: #1668642)
167+ * Fix being unable to use window control buttons or menus with touch
168+ (LP: #1667604, #1668387)
169+
170+ [ Michael Terry ]
171+ * Set QT_IM_MODULE in the greeter so that the OSK can come up. (LP:
172+ #1670383)
173+ * Simplify our startup handling of Mir environment variables and set
174+ the right socket path in snappy.
175+
176+ [ Michael Zanetti ]
177+ * Cancel the home key activation if something else is pressed along
178+ with Meta (LP: #1670678)
179+ * close the drawer when something is launched from the launcher (LP:
180+ #1660367)
181+ * use a svg instead of a png for the Launcher's BFB (LP: #1668057)
182+ * change the default setting for the launcher autohiding (LP:
183+ #1670655)
184+
185+ [ Nick Dedekind ]
186+ * Split up Shell::test_spreadDisabled to ensure initial state for each
187+ test.
188+
189+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 08 Mar 2017 09:56:46 +0000
190+
191+unity8 (8.15+17.04.20170221-0ubuntu1) zesty; urgency=medium
192+
193+ * Handle ubuntu-app-launch API/ABI break
194+
195+ -- Ken VanDine <ken.vandine@canonical.com> Tue, 21 Feb 2017 13:23:23 +0000
196+
197+unity8 (8.15+17.04.20170216.1-0ubuntu1) zesty; urgency=medium
198+
199+ [ Albert Astals Cid ]
200+ * Make menus items close the menu when clicking on them (LP: #1657082,
201+ #1657399)
202+ * Clicking on an open menu closes it + test
203+ * Make the menus and submenus do not go outside the screen when
204+ popping out
205+ * Auto open submenus on hover (LP: #1657085)
206+ * Make the double click on a menu not be maximize the window below
207+ (LP: #1657079)
208+ * Make the MenuBar InverseMouseArea eat hover events when there's a
209+ popup open (LP: #1657763)
210+ * Make double click on the window decoration maximize (LP: #1657758)
211+ * Eat hover events when the launcher quicklist is open (LP: #1640776)
212+ * Remove TODO now that we require Qt > 5.5
213+ * Serialize two make targets that want to cp to the same target file
214+ (LP: #1660576)
215+ * Remove variable that is always false (LP: #1585910)
216+
217+ [ Daniel d'Andrada ]
218+ * Consolidate launcher API checks
219+
220+ [ Lukáš Tinkl ]
221+ * Fixes for activating minimized windows and restoring fullscreen ones
222+ (LP: #1656808, #1658937, #1658938)
223+
224+ [ Michael Zanetti ]
225+ * move right edge push area up some levels so it can be used on top of
226+ the indicators
227+ * fix minimizing/restoring transitions (LP: #1658936)
228+ * fix some glitches with spread positioning
229+ * fix jumpy animation when closing an item from the spread
230+ * Show the wallpaper while the focused app is moving in staged mode
231+ (LP: #1648251)
232+ * Update the tutorial to mention the app drawer instead of the dash on
233+ long left edge swipe (LP: #1658932)
234+ * prevent hiding the launcher when the mouse hover event is eaten by
235+ the EdgePushArea (LP: #1657045)
236+ * properly invalidate the whole model (LP: #1658190)
237+ * stabilize OrientedShell test (LP: #1658994)
238+
239+ [ Nick Dedekind ]
240+ * Added overflow support to application menus.
241+ * Updated menu colors
242+
243+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 16 Feb 2017 13:49:18 +0000
244+
245+unity8 (8.15+17.04.20170206-0ubuntu1) zesty; urgency=medium
246+
247+ [ Daniel d'Andrada ]
248+ * Initial support for child windows (menus, dialogs, tooltips) (LP:
249+ #1543467, #1591384, #1656727)
250+
251+ -- Albert Astals Cid <albert.astals@canonical.com> Mon, 06 Feb 2017 09:12:23 +0000
252+
253+unity8 (8.15+17.04.20170131.1-0ubuntu1) zesty; urgency=medium
254+
255+ [ Rodney Dawes ]
256+ * Remove dependencies on clickscope.
257+
258+ -- Albert Astals Cid <albert.astals@canonical.com> Tue, 31 Jan 2017 14:40:33 +0000
259+
260+unity8 (8.15+17.04.20170124-0ubuntu1) zesty; urgency=medium
261+
262+ [ Albert Astals Cid ]
263+ * Limit tab-focus travelling on dialogs with a fence
264+ * Restore focus to where it was when our ShellDialogs get unloaded
265+ * Update current session after changing the user
266+ * Add keyboard navigation for Indicators
267+ * a window -> the current window
268+ * There's no spreadDelegate_ anymore
269+
270+ [ Daniel d'Andrada ]
271+ * Simplify DecoratedWindow
272+ * Remove unnecessary warning message
273+
274+ [ Josh Arenson ]
275+ * Add a test for the session chooser icon in the greeter's sessions
276+ list
277+
278+ [ Lukáš Tinkl ]
279+ * Fix keymap not being applied on the shell itself (LP: #1626435)
280+ * Shell dialog improvements (kbd focus, mouse eater)
281+ * Start searching directly as you type, w/o having to first
282+ focus/click the search field.
283+ * Add a test for the real implementation of WindowStateStorage
284+ * Use a four finger gesture to open the drawer, much like in u7
285+
286+ [ Michael Terry ]
287+ * Simplify the lightdm mock to make future greeter improvements easier
288+ to test.
289+ * Add support for guest sessions in unity8-greeter.
290+ * Use a model for PAM prompts, supporting more possible interactions.
291+ * Fix grouping of autopkg output and allow optionally passing
292+ arguments to installed test scripts.
293+ * Add support for LightDM hints for manual logins and hiding normal
294+ users.
295+
296+ [ Michael Zanetti ]
297+ * hint the launcher to indicate a successful size change to the user
298+ (LP: #1646457)
299+ * Improvements for the appdrawer (LP: #1648173)
300+ * Adjust home key to still focus the dash instead of messing with the
301+ drawer
302+ * allow 4 finger simulation with mousetouchadaptor
303+
304+ [ Nick Dedekind ]
305+ * Added Alt+F10 shortcut to open app menus. (LP: #1656896)
306+ * Fixed menu layout width calculations. (LP: #1657050)
307+ * Skip Panel::test_drag_indicator_item_down_shows_menu
308+
309+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 24 Jan 2017 07:46:58 +0000
310+
311+unity8 (8.15+17.04.20170110.4-0ubuntu1) zesty; urgency=medium
312+
313+ [ Albert Astals Cid ]
314+ * Give focus to one of the buttons of the dialog
315+ * tst_WindowResizeArea: Use default values for mouseFlick speed and
316+ iterations (LP: #1651580)
317+ * Require Qt 5.6 & misc fixes
318+
319+ [ Daniel van Vugt ]
320+ * Deprecate usage of Mir's input resampling, instead opting for: (LP:
321+ #1497105, #1591328)
322+
323+ [ Josh Arenson ]
324+ * Allow the scopes list to automatically scroll when a scope is being
325+ dragged past the bounds of the screen. (LP: #1575319)
326+
327+ [ Lukáš Tinkl ]
328+ * Fix touch window controls being unreachable when the overlay is
329+ being displayed (LP: #1648167)
330+ * Fixup paths for window state storage in snappy environment
331+ * Add Unity.Platform mock for our tests (LP: #1655336)
332+
333+ [ Michael Zanetti ]
334+ * PreviewRatingInput: Use displayText instead of text to
335+ enable/disable the Send button (LP: #1595910)
336+ * Add a D-Bus interface to control some debug facilities on the fly
337+ * some launcher workarounds for the snapping
338+
339+ [ Michał Sawicz ]
340+ * Nuke leftover Platform in IndicatorsManager
341+
342+ [ Nick Dedekind ]
343+ * Added registry for application menus
344+
345+ [ Michael Terry, Nick Dedekind ]
346+ * Run the qmluitests.sh autopkg test against the installed package.
347+
348+ [ Michał Sawicz, Nick Dedekind ]
349+ * Application menus
350+
351+ [ Rodney Dawes ]
352+ * Remove the payments widget and dependency on libpay as no longer
353+ needed.
354+
355+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 10 Jan 2017 14:48:42 +0000
356+
357+unity8 (8.15+17.04.20161215-0ubuntu2~1) zesty; urgency=medium
358+
359+ * No change rebuild
360+
361+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Wed, 04 Jan 2017 10:54:32 +0200
362+
363+unity8 (8.15+17.04.20161215-0ubuntu1) zesty; urgency=medium
364+
365+ * Let the model deal with some window management decisions (LP:
366+ #1346633)
367+
368+ -- Daniel d'Andrada <daniel.dandrada@canonical.com> Thu, 15 Dec 2016 16:17:29 +0000
369+
370+unity8 (8.15+17.04.20161207.1-0ubuntu1) zesty; urgency=medium
371+
372+ [ Albert Astals Cid ]
373+ * Add the Wsuggest-override flag to gcc
374+ * Add support for compiler sanitizers via ECM
375+ * Use timeStep as delay time (LP: #1642919)
376+ * Bring back fix for 1517830 (LP: #1517830)
377+ * Fix compile warnings in mocks
378+ * Do not hide panel when launching an application if the mouse is on
379+ the panel (LP: #1591311)
380+
381+ [ Daniel d'Andrada ]
382+ * Fix "make tryApplicationWindow"
383+ * Take save/restore functions out of WindowResizeArea
384+
385+ [ Josh Arenson ]
386+ * Enable the greeter to remember which session the user last logged
387+ into (LP: #1631365)
388+
389+ [ Lukáš Tinkl ]
390+ * Fix the Super key not invoking the dash scope home (LP: #1607427)
391+
392+ [ Michael Zanetti ]
393+ * Add the ApplicationDrawer
394+ * tune right edge push (LP: #1646094)
395+ * improve close button visiblity when hovering with the mouse
396+ * Update virtual touchpad visuals and add a tutorial. (LP: #1585220)
397+
398+ [ Pete Woods ]
399+ * MenuItemFactory: Add subtitle support to SwitchItem widget
400+
401+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 07 Dec 2016 13:49:24 +0000
402+
7403unity8 (8.15+17.04.20161129-0ubuntu1) zesty; urgency=medium
8404
9405 [ Albert Astals Cid ]
@@ -7766,3 +8162,8 @@ qml-phone-shell (0.1) quantal; urgency=low
77668162 * Initial release
77678163
77688164 -- Bill Filler <bill.filler@canonical.com> Wed, 10 Oct 2012 10:19:53 -0400
8165+unity8 (8.15+17.04.20170404.7-0ubuntu2) zesty; urgency=medium
8166+
8167+ [ Michael Zanetti ]
8168+ * Make the default store uri point to gnome software center
8169+
debian/control+39−26
@@ -11,6 +11,7 @@ Build-Depends: cmake,
1111# to g++ so we don't try to run arm g++
1212# on an x86 CPU for example, when cross-compiling.
1313 g++:native,
14+ gdb,
1415 graphviz,
1516 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
1617 libandroid-properties-dev,
@@ -26,19 +27,20 @@ Build-Depends: cmake,
2627 libhardware-dev,
2728 liblightdm-qt5-3-dev,
2829 libpam0g-dev,
29− libpay2-dev,
3030 libpulse-dev,
31− libqmenumodel-dev (>= 0.2.10),
31+ libqmenumodel-dev (>= 0.2.12),
32+ libqtdbusmock1-dev (>= 0.7),
33+ libqtdbustest1-dev,
3234 libqt5svg5-dev,
3335 libqt5xmlpatterns5-dev,
3436 libsystemsettings-dev,
35− libubuntu-app-launch2-dev,
37+ libubuntu-app-launch3-dev,
3638 libubuntu-download-manager-common-dev,
3739 libubuntugestures5-dev (>= 1.3.2030),
3840 libubuntugestures5-private-dev (>= 1.3.2030),
3941 libudev-dev,
4042 libudm-common-dev,
41− libunity-api-dev (>= 7.120),
43+ libunity-api-dev (>= 8.6),
4244 libusermetricsoutput1-dev,
4345# Need those X11 libs touch emulation from mouse events in manual QML tests on a X11 desktop
4446 libx11-dev[!arm64 !armhf],
@@ -48,9 +50,11 @@ Build-Depends: cmake,
4850 pkg-config,
4951 python3-all:any,
5052 python3-setuptools,
53+ qtdbustest-runner,
5154 qml-module-qt-labs-folderlistmodel,
55+ qml-module-qt-labs-settings,
5256 qml-module-qtqml-statemachine,
53− qml-module-qtmultimedia (>= 5.4.1-1ubuntu19~overlay2),
57+ qml-module-qtmultimedia (>= 5.6),
5458 qml-module-qtquick-layouts,
5559 qml-module-qtquick-xmllistmodel,
5660 qml-module-qtquick2,
@@ -59,15 +63,16 @@ Build-Depends: cmake,
5963 qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
6064 qml-module-ubuntu-web,
6165 qt5-default,
62− qtbase5-dev (>= 5.4),
66+ qtbase5-dev (>= 5.6),
6367 qtbase5-dev-tools,
64− qtbase5-private-dev (>= 5.4),
65− qtdeclarative5-dev (>= 5.4),
68+ qtbase5-private-dev (>= 5.6),
69+ qtdeclarative5-dev (>= 5.6),
6670 qtdeclarative5-dev-tools,
67− qtdeclarative5-private-dev (>= 5.4),
71+ qtdeclarative5-private-dev (>= 5.6),
6872 qtdeclarative5-ubuntu-content1,
6973 qtdeclarative5-ubuntu-settings-components (>= 0.11),
7074 ttf-ubuntu-font-family,
75+ xvfb,
7176Standards-Version: 3.9.4
7277Homepage: http://launchpad.net/unity
7378# If you aren't a member of ~unity-team but need to upload
@@ -80,7 +85,7 @@ X-Ubuntu-Use-Langpack: yes
8085
8186Package: indicators-client
8287Architecture: any
83−Depends: qmenumodel-qml (>= 0.2.10),
88+Depends: qmenumodel-qml (>= 0.2.11),
8489 qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
8590 unity8 (= ${binary:Version}),
8691 ${misc:Depends},
@@ -119,9 +124,10 @@ Depends: dmz-cursor-theme,
119124 gsettings-desktop-schemas,
120125 libcap2-bin,
121126 libglib2.0-bin,
122− qmenumodel-qml (>= 0.2.10),
127+ qmenumodel-qml (>= 0.2.11),
123128 qml-module-biometryd,
124129 qml-module-qt-labs-folderlistmodel,
130+ qml-module-qt-labs-settings,
125131 qml-module-qtqml-statemachine,
126132 qml-module-qtquick-xmllistmodel,
127133 qml-module-qtsysteminfo,
@@ -129,7 +135,7 @@ Depends: dmz-cursor-theme,
129135 qtdeclarative5-qtmir-plugin (>= 0.4.8),
130136 qtdeclarative5-ubuntu-telephony0.1,
131137 ubuntu-system-settings (>= 0.4),
132− unity-launcher-impl-10,
138+ unity-launcher-impl-12,
133139 unity8-common (= ${source:Version}),
134140 unity8-private (= ${binary:Version}),
135141 unity8-private | unity-launcher-impl,
@@ -138,7 +144,6 @@ Depends: dmz-cursor-theme,
138144Recommends: indicator-keyboard,
139145 indicator-session,
140146 unity-greeter-session-broadcast,
141− unity-scope-click,
142147Suggests: unity-scope-mediascanner2,
143148Breaks: indicator-network (<< 0.5.1+14.10.20141014),
144149 ubuntu-touch-session (<< 0.107),
@@ -160,11 +165,11 @@ Depends: qml-module-qtquick-layouts,
160165 qttranslations5-l10n,
161166 ubuntu-thumbnailer-impl-0,
162167 ubuntu-wallpapers,
163− unity-application-impl-22,
168+ unity-application-impl-27,
164169 unity-notifications-impl-3,
165170 unity-plugin-scopes | unity-scopes-impl,
166171 unity-scopes-impl-12,
167− unity8-fake-env | unity-application-impl,
172+ unity8-tests | unity-application-impl,
168173 ${misc:Depends},
169174Breaks: unity8 (<< 7.86),
170175Replaces: unity8 (<< 7.86),
@@ -188,29 +193,38 @@ Depends: autopilot-qt5 (>= 1.4),
188193 python3-gi,
189194 qttestability-autopilot (>= 1.4),
190195 ubuntu-ui-toolkit-autopilot (>= 1.3.2030),
191− unity-scope-click,
192196 unity8 (= ${source:Version}),
193− unity8-fake-env (= ${source:Version}),
197+ unity8-tests (= ${source:Version}),
194198 url-dispatcher-tools,
195199 xvfb,
196200 ${misc:Depends},
197201 ${python3:Depends},
198− ${shlibs:Depends},
199202Description: Test package for Unity 8 shell
200203 Autopilot tests for the unity8 package
201204
202−Package: unity8-fake-env
205+Package: unity8-tests
203206Architecture: any
204207Multi-Arch: same
205208Pre-Depends: ${misc:Pre-Depends},
206−Depends: ${misc:Depends},
209+Depends: dbus-test-runner,
210+ parallel,
211+ qtdbustest-runner,
212+ qt5-default,
213+ qtdeclarative5-dev-tools,
214+ unity8 (= ${source:Version}),
215+ xvfb,
216+ ${misc:Depends},
207217 ${shlibs:Depends},
208218Provides: unity-application-impl,
209− unity-application-impl-22,
210−Replaces: unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1)
211−Description: Fake environment for running Unity 8 shell
219+ unity-application-impl-27,
220+ unity8-fake-env,
221+Replaces: unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1),
222+ unity8-fake-env,
223+Conflicts: unity8-fake-env,
224+Description: Scripts and mocks for running Unity 8 shell tests
212225 Provides fake implementations of some QML modules used by Unity 8 shell
213− (e.g Ubuntu.Application) so that you can run it in a sandboxed environment.
226+ (e.g Ubuntu.Application) so that you can run it in a sandboxed environment
227+ and scripts to run its test suite.
214228
215229Package: unity8-private
216230Architecture: any
@@ -219,14 +233,13 @@ Pre-Depends: ${misc:Pre-Depends},
219233Depends: accountsservice-ubuntu-schemas (>= 0.0.7),
220234 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
221235 libhardware2,
222− pay-service,
223236 unity-schemas (>= 7.3.1+14.10.20140915),
224237 qtdeclarative5-gsettings1.0,
225238 qml-module-qtmultimedia,
226239 ${misc:Depends},
227240 ${shlibs:Depends},
228241Provides: unity-launcher-impl,
229− unity-launcher-impl-10,
242+ unity-launcher-impl-12,
230243Description: Unity 8 private libs
231244 The Unity 8 shell is the primary user interface for Ubuntu devices.
232245 .
debian/rules+2−2
@@ -35,9 +35,9 @@ override_dh_installdeb:
3535
3636# use private lib directories
3737override_dh_makeshlibs:
38− dh_makeshlibs -Nunity8-private -Nunity8-fake-env
38+ dh_makeshlibs -Nunity8-private -Nunity8-tests
3939
4040override_dh_shlibdeps:
4141 # Some mock libraries link against liblightdm-qt5-3.so which we want to
4242 # avoid, since we only really link against our mock one, not the system one.
43− dh_shlibdeps -XlibMockLightDM-qml.so -XlibMockAccountsService-qml.so
43+ dh_shlibdeps -XlibMockAccountsService-qml.so -Lunity8-private
debian/shlibs.localnew file+1
@@ -0,0 +1 @@
1+libunity8-private 0 unity8-private
debian/tests/control+2−3
@@ -1,8 +1,7 @@
11Tests: qmluitests.sh
22Restrictions: allow-stderr
3−Depends: @,
4− @builddeps@,
5− xvfb,
3+Depends: dpkg-dev,
4+ unity8-tests,
65
76Tests: autopilot.sh
87Restrictions: allow-stderr,
debian/tests/qmluitests.sh+4−14
@@ -1,21 +1,11 @@
11#!/bin/sh
2+# -*- Mode: sh; indent-tabs-mode: nil; tab-width: 4 -*-
23
34# log all commands and abort on error
45set -xe
56
6−SHELL_QML_PATH=$(pkg-config --variable=plugindir unity-shell-api)
7−UNITY_SOURCE_DIR=$(readlink -f $(dirname $(readlink -f $0))/../..)
7+DEB_HOST_MULTIARCH=$(dpkg-architecture -qDEB_HOST_MULTIARCH)
88
9−dh_auto_configure -- -DCMAKE_INSTALL_LOCALSTATEDIR="/var" \
10− -DARTIFACTS_DIR=${ADT_ARTIFACTS} \
11− -DUNITY_PLUGINPATH=${SHELL_QML_PATH} \
12− -DUNITY_MOCKPATH=${SHELL_QML_PATH}/mocks
13−dh_auto_build --parallel -- -C tests/mocks
14−dh_auto_build --parallel -- -C tests/plugins
15−dh_auto_build --parallel -- -C tests/qmltests
16−dh_auto_build --parallel -- -C tests/uqmlscene
17−dh_auto_build --parallel -- -C tests/utils
9+export ARTIFACTS_DIR="${ADT_ARTIFACTS}"
1810
19−export UNITY_SOURCE_DIR
20−
21−dh_auto_build --parallel -- -k xvfballtests
11+/usr/lib/$DEB_HOST_MULTIARCH/unity8/tests/scripts/xvfballtests.sh
debian/unity8-fake-env.install → debian/unity8-tests.installrenamed+4
@@ -3,4 +3,8 @@ usr/bin/unity-mock-indicator-service
33usr/lib/*/unity8/qml/mocks
44usr/lib/*/unity8/qml/nonmirplugins
55usr/lib/*/unity8/qml/scopefakes
6+usr/lib/*/unity8/qml/utils
7+usr/lib/*/unity8/tests
8+usr/lib/*/unity8/uqmlscene
69usr/share/unity8/mocks
10+usr/share/unity8/tests
debian/unity8-tests.lintian-overridesnew file+1
@@ -0,0 +1 @@
1+unity8-tests: unusual-interpreter usr/lib/*/unity8/tests/scripts/*.sh #!/usr/bin/parallel
debian/unity8.install+1−1
@@ -1,6 +1,5 @@
11debian/usr.bin.unity8-dash etc/apparmor.d
22var/lib/unity8/version
3−data/unity8-dash.conf usr/share/upstart/sessions/
43data/unity8-filewatcher.conf usr/share/upstart/sessions/
54data/unity8.conf usr/share/upstart/sessions/
65data/devices.conf etc/ubuntu/
@@ -9,6 +8,7 @@ usr/bin/unity8
98usr/bin/unity8-dash
109usr/share/applications/unity8-dash.desktop
1110usr/share/applications/unity8.desktop
11+usr/share/unity8/ApplicationMenus
1212usr/share/unity8/Greeter
1313usr/share/unity8/Launcher
1414usr/share/unity8/Panel
include/paths.h.in+26−1
@@ -41,7 +41,10 @@ inline QString installRoot() {
4141}
4242
4343inline bool isRunningInstalled() {
44− return !installRoot().isNull();
44+ // Tests don't use the normal binary, so we want to check binary *and*
45+ // the environment. Installed tests have UNITY_TESTING_DATADIR set.
46+ static bool installed_test_env = !qgetenv("UNITY_TESTING_DATADIR").isEmpty();
47+ return !installRoot().isNull() || installed_test_env;
4548}
4649
4750inline QString buildDirectory() {
@@ -62,6 +65,28 @@ inline QString translationDirectory() {
6265 }
6366}
6467
68+inline QString testDataDir() {
69+ // Can't use isRunningInstalled, since tests don't use the normal unity8
70+ // executable. $UNITY_TESTING_DATADIR is set by installed tests.
71+ QString datadir(qgetenv("UNITY_TESTING_DATADIR"));
72+ if (datadir.isEmpty()) {
73+ return sourceDirectory() + "/tests";
74+ } else {
75+ return datadir + "/tests";
76+ }
77+}
78+
79+inline QString testLibDir() {
80+ // Can't use isRunningInstalled, since tests don't use the normal unity8
81+ // executable. $UNITY_TESTING_DATADIR is set by installed tests.
82+ QString libdir(qgetenv("UNITY_TESTING_LIBDIR"));
83+ if (libdir.isEmpty()) {
84+ return buildDirectory() + "/tests";
85+ } else {
86+ return libdir + "/tests";
87+ }
88+}
89+
6590inline QString qmlDirectory() {
6691 if (isRunningInstalled()) {
6792 return installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/");
plugins/AccountsService/AccountsService.h+1−1
@@ -29,7 +29,6 @@ class QDBusInterface;
2929class AccountsService: public QObject
3030{
3131 Q_OBJECT
32− Q_ENUMS(PasswordDisplayHint)
3332 Q_PROPERTY (QString user
3433 READ user
3534 WRITE setUser
@@ -86,6 +85,7 @@ public:
8685 Keyboard,
8786 Numeric,
8887 };
88+ Q_ENUM(PasswordDisplayHint)
8989
9090 explicit AccountsService(QObject *parent = 0, const QString & user = QString());
9191 ~AccountsService() = default;
plugins/Cursor/CursorImageInfo.cpp+1−2
@@ -108,8 +108,7 @@ int CursorImageInfo::frameDuration() const
108108QUrl CursorImageInfo::imageSource() const
109109{
110110 auto urlString = QString("image://cursor/%1/%2/%3")
111− .arg(m_themeName)
112− .arg(m_cursorName)
111+ .arg(m_themeName, m_cursorName)
113112 .arg(m_cursorHeight);
114113
115114 return QUrl(urlString);
plugins/Cursor/CursorImageProvider.cpp+2
@@ -174,6 +174,8 @@ CursorImageProvider::CursorImageProvider()
174174 m_fallbackNames[QStringLiteral("forbidden")].append(QStringLiteral("not-allowed"));
175175 m_fallbackNames[QStringLiteral("forbidden")].append(QStringLiteral("circle"));
176176
177+ m_fallbackNames[QStringLiteral("grabbing")].append(QStringLiteral("closedhand")); // Breeze
178+
177179 m_fallbackNames[QStringLiteral("hand")].append(QStringLiteral("pointing_hand"));
178180 m_fallbackNames[QStringLiteral("hand")].append(QStringLiteral("pointer"));
179181
plugins/Dash/abstractdashview.cpp+1−1
@@ -23,7 +23,7 @@ AbstractDashView::AbstractDashView()
2323 , m_asyncRequestedIndex(-1)
2424 , m_columnSpacing(0)
2525 , m_rowSpacing(0)
26− , m_buffer(320) // Same value used in qquickitemview.cpp in Qt 5.4
26+ , m_buffer(320) // Same value as QML_VIEW_DEFAULTCACHEBUFFER in qquickitemview.cpp (Qt 5.6)
2727 , m_displayMarginBeginning(0)
2828 , m_displayMarginEnd(0)
2929 , m_needsRelayout(false)
plugins/GlobalShortcut/globalshortcut.cpp+12−4
@@ -63,10 +63,18 @@ void GlobalShortcut::componentComplete()
6363
6464void GlobalShortcut::keyPressEvent(QKeyEvent * event)
6565{
66− Q_UNUSED(event)
67− if (m_active) {
68− Q_EMIT triggered(m_shortcut.toString());
69− }
66+ if (!m_active) return;
67+
68+ event->accept();
69+ Q_EMIT triggered(m_shortcut.toString());
70+}
71+
72+void GlobalShortcut::keyReleaseEvent(QKeyEvent * event)
73+{
74+ if (!m_active) return;
75+
76+ event->accept();
77+ Q_EMIT released(m_shortcut.toString());
7078}
7179
7280void GlobalShortcut::setupFilterOnWindow(QQuickWindow *window)
plugins/GlobalShortcut/globalshortcut.h+5
@@ -55,6 +55,7 @@ public:
5555protected:
5656 void componentComplete() override;
5757 void keyPressEvent(QKeyEvent * event) override;
58+ void keyReleaseEvent(QKeyEvent * event) override;
5859
5960Q_SIGNALS:
6061 void shortcutChanged(const QVariant &shortcut);
@@ -62,6 +63,10 @@ Q_SIGNALS:
6263 * Emitted when a global keypress of @p shortcut is detected
6364 */
6465 void triggered(const QString &shortcut);
66+ /**
67+ * Emitted when a global keypress of @p shortcut is released
68+ */
69+ void released(const QString &shortcut);
6570 void activeChanged(bool active);
6671
6772private Q_SLOTS:
plugins/GlobalShortcut/globalshortcutregistry.cpp+14−4
@@ -73,20 +73,30 @@ bool GlobalShortcutRegistry::eventFilter(QObject *obj, QEvent *event)
7373 Q_ASSERT(m_filteredWindow);
7474 Q_ASSERT(obj == static_cast<QObject*>(m_filteredWindow.data()));
7575
76− if (event->type() == QEvent::KeyPress) {
76+ if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) {
77+
7778 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
79+
80+ // Make a copy of the event so we don't alter it for passing on.
81+ QKeyEvent eCopy(keyEvent->type(),
82+ keyEvent->key(),
83+ keyEvent->modifiers(),
84+ keyEvent->text(),
85+ keyEvent->isAutoRepeat(),
86+ keyEvent->count());
87+ eCopy.ignore();
88+
7889 int seq = keyEvent->key() + keyEvent->modifiers();
7990 if (m_shortcuts.contains(seq)) {
8091 const auto shortcuts = m_shortcuts.value(seq);
8192 Q_FOREACH(const auto &shortcut, shortcuts) {
8293 if (shortcut) {
83− qApp->sendEvent(shortcut, keyEvent);
84− event->accept();
94+ qApp->sendEvent(shortcut, &eCopy);
8595 }
8696 }
8797 }
8898
89− return event->isAccepted();
99+ return eCopy.isAccepted();
90100 }
91101
92102 return QObject::eventFilter(obj, event);
plugins/Greeter/Unity/Launcher/CMakeLists.txt−1
@@ -1,4 +1,3 @@
1−pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=10)
21pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
32
43add_definitions(-DSM_BUSNAME=systemBus)
plugins/Greeter/Unity/Launcher/launcheritem.cpp+13
@@ -76,6 +76,19 @@ void LauncherItem::setIcon(const QString &icon)
7676 }
7777}
7878
79+QStringList LauncherItem::keywords() const
80+{
81+ return m_keywords;
82+}
83+
84+void LauncherItem::setKeywords(const QStringList &keywords)
85+{
86+ if (m_keywords != keywords) {
87+ m_keywords = keywords;
88+ Q_EMIT keywordsChanged(keywords);
89+ }
90+}
91+
7992bool LauncherItem::pinned() const
8093{
8194 return m_pinned;
plugins/Greeter/Unity/Launcher/launcheritem.h+3
@@ -34,6 +34,7 @@ public:
3434 QString appId() const override;
3535 QString name() const override;
3636 QString icon() const override;
37+ QStringList keywords() const override;
3738 bool pinned() const override;
3839 bool running() const override;
3940 bool recent() const override;
@@ -49,6 +50,7 @@ public:
4950private:
5051 void setName(const QString &name);
5152 void setIcon(const QString &icon);
53+ void setKeywords(const QStringList &keywords);
5254 void setPinned(bool pinned);
5355 void setRunning(bool running);
5456 void setRecent(bool recent);
@@ -63,6 +65,7 @@ private:
6365 QString m_appId;
6466 QString m_name;
6567 QString m_icon;
68+ QStringList m_keywords;
6669 bool m_pinned;
6770 bool m_running;
6871 bool m_recent;
plugins/Greeter/Unity/Launcher/quicklistmodel.cpp+2
@@ -65,6 +65,8 @@ QVariant QuickListModel::data(const QModelIndex &index, int role) const
6565 return m_list.at(index.row()).icon();
6666 case RoleClickable:
6767 return m_list.at(index.row()).clickable();
68+ case RoleIsPrivate:
69+ return false; // The greeter plugin would just not add any private entries
6870 }
6971 return QVariant();
7072}
plugins/LightDM/CMakeLists.txt+1−1
@@ -7,7 +7,6 @@ include_directories(
77 ${CMAKE_CURRENT_SOURCE_DIR}
88 ${CMAKE_CURRENT_BINARY_DIR}
99 ${CMAKE_SOURCE_DIR}/plugins/Utils
10− ${CMAKE_BINARY_DIR}/tests/mocks/LightDM/IntegratedLightDM
1110 ${libunity8-private_SOURCE_DIR}
1211 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
1312)
@@ -18,6 +17,7 @@ set(QMLPLUGIN_SRC
1817 DBusGreeterList.cpp
1918 Greeter.cpp
2019 plugin.cpp
20+ PromptsModel.cpp
2121 SessionsModel.cpp
2222 UsersModel.cpp
2323 )
plugins/LightDM/DBusGreeterList.cpp+6−6
@@ -25,7 +25,7 @@ DBusGreeterList::DBusGreeterList(Greeter *greeter, const QString &path)
2525 m_greeter(greeter)
2626{
2727 connect(m_greeter, &Greeter::authenticationUserChanged, this, &DBusGreeterList::authenticationUserChangedHandler);
28− connect(m_greeter, &Greeter::promptlessChanged, this, &DBusGreeterList::promptlessChangedHandler);
28+ connect(m_greeter, &Greeter::isAuthenticatedChanged, this, &DBusGreeterList::authenticatedChangedHandler);
2929}
3030
3131QString DBusGreeterList::GetActiveEntry() const
@@ -40,16 +40,16 @@ void DBusGreeterList::SetActiveEntry(const QString &entry)
4040
4141bool DBusGreeterList::entryIsLocked() const
4242{
43− return !m_greeter->promptless();
43+ return !m_greeter->isAuthenticated();
4444}
4545
46−void DBusGreeterList::authenticationUserChangedHandler(const QString &user)
46+void DBusGreeterList::authenticationUserChangedHandler()
4747{
48− notifyPropertyChanged(QStringLiteral("ActiveEntry"), user);
49− Q_EMIT EntrySelected(user);
48+ notifyPropertyChanged(QStringLiteral("ActiveEntry"), m_greeter->authenticationUser());
49+ Q_EMIT EntrySelected(m_greeter->authenticationUser());
5050}
5151
52−void DBusGreeterList::promptlessChangedHandler()
52+void DBusGreeterList::authenticatedChangedHandler()
5353{
5454 notifyPropertyChanged(QStringLiteral("EntryIsLocked"), entryIsLocked());
5555 Q_EMIT entryIsLockedChanged();
plugins/LightDM/DBusGreeterList.h+2−2
@@ -47,8 +47,8 @@ Q_SIGNALS:
4747 void entryIsLockedChanged();
4848
4949private Q_SLOTS:
50− void authenticationUserChangedHandler(const QString &user);
51− void promptlessChangedHandler();
50+ void authenticationUserChangedHandler();
51+ void authenticatedChangedHandler();
5252
5353private:
5454 Greeter *m_greeter;
plugins/LightDM/FullLightDM/CMakeLists.txt+5−1
@@ -6,10 +6,14 @@ add_definitions(-DFULL_LIGHTDM)
66
77include_directories(
88 ../
9− ${LIBLIGHTDM_INCLUDE_DIRS}
109 ${CMAKE_CURRENT_BINARY_DIR}
1110 )
1211
12+include_directories(
13+ SYSTEM
14+ ${LIBLIGHTDM_INCLUDE_DIRS}
15+ )
16+
1317foreach(source_file ${QMLPLUGIN_SRC})
1418 list(APPEND RELATIVE_QMLPLUGIN_SRC ../${source_file})
1519endforeach()
plugins/LightDM/Greeter.cpp+137−23
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013, 2015 Canonical, Ltd.
2+ * Copyright (C) 2013-2017 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,13 +17,16 @@
1717
1818#include "Greeter.h"
1919#include "GreeterPrivate.h"
20+#include <QCoreApplication>
2021#include <libintl.h>
2122
23+static Greeter *singleton = nullptr;
24+
2225GreeterPrivate::GreeterPrivate(Greeter* parent)
2326 : m_greeter(new QLightDM::Greeter(parent)),
2427 m_active(false),
25− wasPrompted(false),
26− promptless(false),
28+ responded(false),
29+ everResponded(false),
2730 q_ptr(parent)
2831{
2932}
@@ -41,9 +44,32 @@ Greeter::Greeter(QObject* parent)
4144 connect(d->m_greeter, &QLightDM::Greeter::authenticationComplete,
4245 this, &Greeter::authenticationCompleteFilter);
4346
47+ // Don't get stuck waiting for PAM as we shut down.
48+ connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit,
49+ d->m_greeter, &QLightDM::Greeter::cancelAuthentication);
50+
4451 d->m_greeter->connectSync();
4552}
4653
54+Greeter::~Greeter()
55+{
56+ singleton = nullptr;
57+}
58+
59+Greeter *Greeter::instance()
60+{
61+ if (!singleton) {
62+ singleton = new Greeter;
63+ }
64+ return singleton;
65+}
66+
67+PromptsModel *Greeter::promptsModel()
68+{
69+ Q_D(Greeter);
70+ return &d->prompts;
71+}
72+
4773bool Greeter::isActive() const
4874{
4975 Q_D(const Greeter);
@@ -68,7 +94,16 @@ bool Greeter::isAuthenticated() const
6894QString Greeter::authenticationUser() const
6995{
7096 Q_D(const Greeter);
71− return d->m_greeter->authenticationUser();
97+ return d->cachedAuthUser;
98+}
99+
100+void Greeter::checkAuthenticationUser()
101+{
102+ Q_D(Greeter);
103+ if (d->cachedAuthUser != d->m_greeter->authenticationUser()) {
104+ d->cachedAuthUser = d->m_greeter->authenticationUser();
105+ Q_EMIT authenticationUserChanged();
106+ }
72107}
73108
74109QString Greeter::defaultSessionHint() const
@@ -77,35 +112,64 @@ QString Greeter::defaultSessionHint() const
77112 return d->m_greeter->defaultSessionHint();
78113}
79114
80−bool Greeter::promptless() const
115+QString Greeter::selectUser() const
81116{
82117 Q_D(const Greeter);
83− return d->promptless;
118+ if (hasGuestAccount() && d->m_greeter->selectGuestHint()) {
119+ return QStringLiteral("*guest");
120+ } else {
121+ return d->m_greeter->selectUserHint();
122+ }
84123}
85124
86−QString Greeter::selectUser() const
125+bool Greeter::hasGuestAccount() const
126+{
127+ Q_D(const Greeter);
128+ return d->m_greeter->hasGuestAccountHint();
129+}
130+
131+bool Greeter::showManualLoginHint() const
87132{
88133 Q_D(const Greeter);
89− return d->m_greeter->selectUserHint();
134+ return d->m_greeter->showManualLoginHint();
135+}
136+
137+bool Greeter::hideUsersHint() const
138+{
139+ Q_D(const Greeter);
140+ return d->m_greeter->hideUsersHint();
90141}
91142
92143void Greeter::authenticate(const QString &username)
93144{
94145 Q_D(Greeter);
95− d->wasPrompted = false;
96− if (d->promptless) {
97− d->promptless = false;
98− Q_EMIT promptlessChanged();
146+ d->prompts.clear();
147+ d->responded = false;
148+ d->everResponded = false;
149+
150+ if (authenticationUser() == username) {
151+ d->prompts = d->leftovers;
99152 }
153+ d->leftovers.clear();
100154
101− d->m_greeter->authenticate(username);
155+ if (username == QStringLiteral("*guest")) {
156+ d->m_greeter->authenticateAsGuest();
157+ } else if (username == QStringLiteral("*other")) {
158+ d->m_greeter->authenticate(nullptr);
159+ } else {
160+ d->m_greeter->authenticate(username);
161+ }
162+
163+ Q_EMIT authenticationStarted();
102164 Q_EMIT isAuthenticatedChanged();
103− Q_EMIT authenticationUserChanged(username);
165+ checkAuthenticationUser();
104166}
105167
106168void Greeter::respond(const QString &response)
107169{
108170 Q_D(Greeter);
171+ d->responded = true;
172+ d->everResponded = true;
109173 d->m_greeter->respond(response);
110174}
111175
@@ -118,32 +182,82 @@ bool Greeter::startSessionSync(const QString &session)
118182void Greeter::showPromptFilter(const QString &text, QLightDM::Greeter::PromptType type)
119183{
120184 Q_D(Greeter);
121− d->wasPrompted = true;
185+
186+ checkAuthenticationUser(); // may have changed in liblightdm
122187
123188 bool isDefaultPrompt = (text == dgettext("Linux-PAM", "Password: "));
189+ bool isSecret = type == QLightDM::Greeter::PromptTypeSecret;
190+
191+ QString trimmedText;
192+ if (!isDefaultPrompt)
193+ trimmedText = text.trimmed();
124194
125195 // Strip prompt of any colons at the end
126− QString trimmedText = text.trimmed();
127196 if (trimmedText.endsWith(':') || trimmedText.endsWith(QStringLiteral(":"))) {
128197 trimmedText.chop(1);
129198 }
130199
131− Q_EMIT showPrompt(trimmedText, type == QLightDM::Greeter::PromptTypeSecret, isDefaultPrompt);
200+ if (trimmedText == "login") {
201+ // 'login' is provided untranslated by LightDM when asking for a manual
202+ // login username.
203+ trimmedText = gettext("Username");
204+ }
205+
206+ if (d->responded) {
207+ d->prompts.clear();
208+ d->responded = false;
209+ }
210+
211+ d->prompts.append(trimmedText, isSecret ? PromptsModel::Secret : PromptsModel::Question);
132212}
133213
134214void Greeter::showMessageFilter(const QString &text, QLightDM::Greeter::MessageType type)
135215{
136− Q_EMIT showMessage(text, type == QLightDM::Greeter::MessageTypeError);
216+ Q_D(Greeter);
217+
218+ checkAuthenticationUser(); // may have changed in liblightdm
219+
220+ bool isError = type == QLightDM::Greeter::MessageTypeError;
221+
222+ if (d->responded) {
223+ d->prompts.clear();
224+ d->responded = false;
225+ }
226+ d->prompts.append(text, isError? PromptsModel::Error : PromptsModel::Message);
137227}
138228
139229void Greeter::authenticationCompleteFilter()
140230{
141231 Q_D(Greeter);
142− if (!d->wasPrompted) {
143− d->promptless = true;
144− Q_EMIT promptlessChanged();
145− }
146232
147233 Q_EMIT isAuthenticatedChanged();
148− Q_EMIT authenticationComplete();
234+
235+ bool automatic = !d->everResponded;
236+ bool pamHasLeftoverMessages = !d->prompts.hasPrompt() && d->prompts.rowCount() > 0;
237+
238+ if (!isAuthenticated()) {
239+ if (pamHasLeftoverMessages) {
240+ d->leftovers = d->prompts; // Prefer PAM's messages
241+ } else if (automatic) {
242+ d->leftovers.append(gettext("Failed to authenticate"), PromptsModel::Error);
243+ } else {
244+ d->leftovers.append(gettext("Invalid password, please try again"), PromptsModel::Error);
245+ }
246+ } else if (pamHasLeftoverMessages) {
247+ automatic = true; // treat this successful login as automatic, so user sees message
248+ d->leftovers = d->prompts;
249+ }
250+
251+ if (automatic) {
252+ d->prompts = d->leftovers; // OK, we'll just use these now
253+ d->leftovers.clear();
254+ d->prompts.append(isAuthenticated() ? gettext("Log In") : gettext("Retry"),
255+ PromptsModel::Button);
256+ }
257+
258+ if (isAuthenticated()) {
259+ Q_EMIT loginSuccess(automatic);
260+ } else {
261+ Q_EMIT loginError(automatic);
262+ }
149263}
plugins/LightDM/Greeter.h+17−13
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012,2013,2015 Canonical, Ltd.
2+ * Copyright (C) 2012-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
@@ -21,13 +21,13 @@
2121 such edits in the future, and by inserting ourselves here, we have more
2222 control. */
2323
24−#ifndef UNITY_GREETER_H
25−#define UNITY_GREETER_H
24+#pragma once
2625
2726#include <QLightDM/Greeter>
2827#include <QtCore/QObject>
2928
3029class GreeterPrivate;
30+class PromptsModel;
3131
3232class Greeter : public QObject
3333{
@@ -37,18 +37,22 @@ class Greeter : public QObject
3737 Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
3838 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
3939 Q_PROPERTY(QString defaultSession READ defaultSessionHint CONSTANT)
40− Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
4140 Q_PROPERTY(QString selectUser READ selectUser CONSTANT)
4241
4342public:
44− explicit Greeter(QObject* parent=0);
43+ static Greeter *instance();
44+ virtual ~Greeter();
4545
4646 bool isActive() const;
4747 bool isAuthenticated() const;
4848 QString authenticationUser() const;
4949 QString defaultSessionHint() const;
50− bool promptless() const;
5150 QString selectUser() const;
51+ bool hasGuestAccount() const;
52+ bool showManualLoginHint() const;
53+ bool hideUsersHint() const;
54+
55+ PromptsModel *promptsModel();
5256
5357public Q_SLOTS:
5458 void authenticate(const QString &username=QString());
@@ -57,21 +61,22 @@ public Q_SLOTS:
5761 void setIsActive(bool isActive);
5862
5963Q_SIGNALS:
60− void showMessage(const QString &text, bool isError);
61− void showPrompt(const QString &text, bool isSecret, bool isDefaultPrompt);
62− void authenticationComplete();
63− void authenticationUserChanged(const QString &user);
64+ void authenticationUserChanged();
6465 void isActiveChanged();
6566 void isAuthenticatedChanged();
66− void promptlessChanged();
6767 void showGreeter();
6868 void hideGreeter();
69+ void loginError(bool automatic);
70+ void loginSuccess(bool automatic);
71+ void authenticationStarted(); // useful for testing
6972
7073 // This signal is emitted by external agents like indicators, and the UI
7174 // should switch to this user if possible.
7275 void requestAuthenticationUser(const QString &user);
7376
7477protected:
78+ explicit Greeter(QObject* parent=0);
79+
7580 GreeterPrivate * const d_ptr;
7681
7782 Q_DECLARE_PRIVATE(Greeter)
@@ -80,6 +85,5 @@ private Q_SLOTS:
8085 void showMessageFilter(const QString &text, QLightDM::Greeter::MessageType type);
8186 void showPromptFilter(const QString &text, QLightDM::Greeter::PromptType type);
8287 void authenticationCompleteFilter();
88+ void checkAuthenticationUser();
8389};
84−
85−#endif
plugins/LightDM/GreeterPrivate.h+13−8
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2015-2017 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,10 +14,14 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−#ifndef UNITY_GREETER_PRIVATE_H
18−#define UNITY_GREETER_PRIVATE_H
17+#pragma once
1918
20−#include <QLightDM/Greeter>
19+#include "PromptsModel.h"
20+#include <QObject>
21+
22+namespace QLightDM {
23+ class Greeter;
24+}
2125
2226class GreeterPrivate
2327{
@@ -26,8 +30,11 @@ public:
2630
2731 QLightDM::Greeter *m_greeter;
2832 bool m_active;
29− bool wasPrompted;
30− bool promptless;
33+ PromptsModel prompts;
34+ PromptsModel leftovers; // prompts to show during next auth for same user
35+ bool responded;
36+ bool everResponded;
37+ QString cachedAuthUser;
3138
3239protected:
3340 Greeter * const q_ptr;
@@ -35,5 +42,3 @@ protected:
3542private:
3643 Q_DECLARE_PUBLIC(Greeter)
3744};
38−
39−#endif // UNITY_GREETER_PRIVATE_H
plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.cpp+7−4
@@ -49,7 +49,7 @@ QString Greeter::authenticationUser() const
4949
5050bool Greeter::hasGuestAccountHint() const
5151{
52− return true;
52+ return false;
5353}
5454
5555QString Greeter::getHint(const QString &name) const
@@ -70,12 +70,12 @@ bool Greeter::hideUsersHint() const
7070
7171bool Greeter::showManualLoginHint() const
7272{
73− return true;
73+ return false;
7474}
7575
7676bool Greeter::showRemoteLoginHint() const
7777{
78− return true;
78+ return false;
7979}
8080
8181QString Greeter::selectUserHint() const
@@ -146,7 +146,10 @@ void Greeter::authenticateRemote(const QString &session, const QString &username
146146}
147147
148148void Greeter::cancelAuthentication()
149−{}
149+{
150+ Q_D(Greeter);
151+ d->cancelAuthentication();
152+}
150153
151154void Greeter::setLanguage (const QString &language)
152155{
plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.h+2−2
@@ -46,18 +46,18 @@ class Q_DECL_EXPORT Greeter : public QObject
4646 Q_PROPERTY(QString hostname READ hostname CONSTANT)
4747 Q_PROPERTY(bool hasGuestAccount READ hasGuestAccountHint CONSTANT)
4848
49− Q_ENUMS(PromptType MessageType)
50−
5149public:
5250 enum PromptType {
5351 PromptTypeQuestion,
5452 PromptTypeSecret
5553 };
54+ Q_ENUM(PromptType)
5655
5756 enum MessageType {
5857 MessageTypeInfo,
5958 MessageTypeError
6059 };
60+ Q_ENUM(MessageType)
6161
6262 explicit Greeter(QObject* parent=0);
6363 virtual ~Greeter();
plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.cpp+27−22
@@ -206,6 +206,28 @@ public Q_SLOTS:
206206 }
207207 }
208208
209+ void cancelPam()
210+ {
211+ if (pamHandle != nullptr) {
212+ QFuture<int> pamFuture = futureWatcher.future();
213+ pam_handle *handle = pamHandle;
214+ pamHandle = nullptr; // to disable normal finishPam() handling
215+ pamFuture.cancel();
216+
217+ // Note the empty loop, we just want to clear the futures queue.
218+ // Any further prompts from the pam thread will be immediately
219+ // responded to/dismissed in handlePrompt().
220+ while (respond(QString()));
221+
222+ // Now let signal/slot handling happen so the thread can finish
223+ while (!pamFuture.isFinished()) {
224+ QCoreApplication::processEvents();
225+ }
226+
227+ pam_end(handle, PAM_CONV_ERR);
228+ }
229+ }
230+
209231Q_SIGNALS:
210232 void showMessage(pam_handle *handle, QString text, QLightDM::Greeter::MessageType type);
211233 void showPrompt(pam_handle *handle, QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture response);
@@ -247,28 +269,6 @@ private Q_SLOTS:
247269 }
248270
249271private:
250− void cancelPam()
251− {
252− if (pamHandle != nullptr) {
253− QFuture<int> pamFuture = futureWatcher.future();
254− pam_handle *handle = pamHandle;
255− pamHandle = nullptr; // to disable normal finishPam() handling
256− pamFuture.cancel();
257−
258− // Note the empty loop, we just want to clear the futures queue.
259− // Any further prompts from the pam thread will be immediately
260− // responded to/dismissed in handlePrompt().
261− while (respond(QString()));
262−
263− // Now let signal/slot handling happen so the thread can finish
264− while (!pamFuture.isFinished()) {
265− QCoreApplication::processEvents();
266− }
267−
268− pam_end(handle, PAM_CONV_ERR);
269− }
270− }
271−
272272 Greeter *greeter;
273273 GreeterPrivate *greeterPrivate;
274274 pam_handle* pamHandle;
@@ -299,6 +299,11 @@ void GreeterPrivate::handleRespond(const QString &response)
299299 m_impl->respond(response);
300300}
301301
302+void GreeterPrivate::cancelAuthentication()
303+{
304+ m_impl->cancelPam();
305+}
306+
302307}
303308
304309#include "GreeterPrivate.moc"
plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.h+1
@@ -38,6 +38,7 @@ public:
3838
3939 void handleAuthenticate();
4040 void handleRespond(const QString &response);
41+ void cancelAuthentication();
4142
4243protected:
4344 GreeterImpl *m_impl; // if the backend needs more private data
plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.cpp−1
@@ -38,7 +38,6 @@ SessionsModel::SessionsModel(QObject* parent) :
3838 QAbstractListModel(parent),
3939 d_ptr(new SessionsModelPrivate(this))
4040{
41− Q_D(SessionsModel);
4241 m_roleNames = QAbstractListModel::roleNames();
4342 m_roleNames[KeyRole] = "key";
4443 m_roleNames[TypeRole] = "type";
plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.h+2−2
@@ -35,8 +35,6 @@ class Q_DECL_EXPORT SessionsModel : public QAbstractListModel
3535 {
3636 Q_OBJECT
3737
38− Q_ENUMS(SessionModelRoles SessionType)
39−
4038 public:
4139
4240 enum SessionModelRoles {
@@ -46,11 +44,13 @@ class Q_DECL_EXPORT SessionsModel : public QAbstractListModel
4644 IdRole = KeyRole, /** Deprecated */
4745 TypeRole
4846 };
47+ Q_ENUM(SessionModelRoles)
4948
5049 enum SessionType {
5150 LocalSessions,
5251 RemoteSessions
5352 };
53+ Q_ENUM(SessionType)
5454
5555 explicit SessionsModel(QObject* parent=0); /** Deprecated. Loads local sessions*/
5656 explicit SessionsModel(SessionsModel::SessionType, QObject* parent=0);
plugins/LightDM/IntegratedLightDM/liblightdm/UsersModel.h+1−2
@@ -37,8 +37,6 @@ class Q_DECL_EXPORT UsersModel : public QAbstractListModel
3737{
3838 Q_OBJECT
3939
40− Q_ENUMS(UserModelRoles)
41−
4240public:
4341 explicit UsersModel(QObject *parent = 0);
4442 virtual ~UsersModel() = default;
@@ -53,6 +51,7 @@ public:
5351 BackgroundPathRole,
5452 UidRole
5553 };
54+ Q_ENUM(UserModelRoles)
5655
5756 int rowCount(const QModelIndex &parent) const override;
5857 QVariant data(const QModelIndex &index, int role) const override;
plugins/LightDM/PromptsModel.cppnew file+97
@@ -0,0 +1,97 @@
1+/*
2+ * Copyright (C) 2017 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 "PromptsModel.h"
19+
20+PromptsModel::PromptsModel(QObject* parent)
21+ : QAbstractListModel(parent)
22+{
23+ m_roleNames[TypeRole] = "type";
24+ m_roleNames[TextRole] = "text";
25+}
26+
27+PromptsModel& PromptsModel::operator=(const PromptsModel &other)
28+{
29+ beginResetModel();
30+ m_prompts = other.m_prompts;
31+ endResetModel();
32+ Q_EMIT countChanged();
33+ return *this;
34+}
35+
36+int PromptsModel::rowCount(const QModelIndex &parent) const
37+{
38+ if (parent.isValid())
39+ return 0;
40+
41+ return m_prompts.size();
42+}
43+
44+QVariant PromptsModel::data(const QModelIndex &index, int role) const
45+{
46+ if (!index.isValid() || index.column() > 0 || index.row() >= m_prompts.size())
47+ return QVariant();
48+
49+ switch (role) {
50+ case Qt::DisplayRole: // fallthrough
51+ case TextRole: return m_prompts[index.row()].prompt;
52+ case TypeRole: return m_prompts[index.row()].type;
53+ default: return QVariant();
54+ }
55+}
56+
57+QHash<int, QByteArray> PromptsModel::roleNames() const
58+{
59+ return m_roleNames;
60+}
61+
62+void PromptsModel::prepend(const QString &text, PromptType type)
63+{
64+ beginInsertRows(QModelIndex(), 0, 0);
65+ m_prompts.prepend(PromptInfo{text, type});
66+ endInsertRows();
67+
68+ Q_EMIT countChanged();
69+}
70+
71+void PromptsModel::append(const QString &text, PromptType type)
72+{
73+ beginInsertRows(QModelIndex(), m_prompts.size(), m_prompts.size());
74+ m_prompts.append(PromptInfo{text, type});
75+ endInsertRows();
76+
77+ Q_EMIT countChanged();
78+}
79+
80+void PromptsModel::clear()
81+{
82+ beginResetModel();
83+ m_prompts.clear();
84+ endResetModel();
85+
86+ Q_EMIT countChanged();
87+}
88+
89+bool PromptsModel::hasPrompt() const
90+{
91+ Q_FOREACH(const PromptInfo &info, m_prompts) {
92+ if (info.type == PromptType::Secret || info.type == PromptType::Question) {
93+ return true;
94+ }
95+ }
96+ return false;
97+}
plugins/LightDM/PromptsModel.hnew file+70
@@ -0,0 +1,70 @@
1+/*
2+ * Copyright (C) 2017 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+#pragma once
19+
20+#include <QAbstractListModel>
21+
22+class PromptsModel : public QAbstractListModel
23+{
24+ Q_OBJECT
25+
26+ Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
27+
28+public:
29+ enum PromptsModelRoles {
30+ TypeRole = Qt::UserRole,
31+ TextRole,
32+ };
33+ Q_ENUM(PromptsModelRoles)
34+
35+ enum PromptType {
36+ Message,
37+ Error,
38+ Secret,
39+ Question,
40+ Button,
41+ };
42+ Q_ENUM(PromptType)
43+
44+ explicit PromptsModel(QObject* parent=0);
45+
46+ PromptsModel& operator=(const PromptsModel &other);
47+
48+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
49+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
50+ QHash<int, QByteArray> roleNames() const override;
51+
52+ Q_INVOKABLE void prepend(const QString &text, PromptType type);
53+ Q_INVOKABLE void append(const QString &text, PromptType type);
54+
55+ void clear();
56+
57+ bool hasPrompt() const;
58+
59+Q_SIGNALS:
60+ void countChanged();
61+
62+private:
63+ struct PromptInfo {
64+ QString prompt;
65+ PromptType type;
66+ };
67+
68+ QList<PromptInfo> m_prompts;
69+ QHash<int, QByteArray> m_roleNames;
70+};
plugins/LightDM/SessionsModel.cpp+1−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
@@ -128,7 +128,6 @@ SessionsModel::SessionsModel(QObject* parent)
128128 }
129129
130130 setModel(m_model);
131− setSourceModel(m_model);
132131 setSortCaseSensitivity(Qt::CaseInsensitive);
133132 setSortLocaleAware(true);
134133 setSortRole(Qt::DisplayRole);
plugins/LightDM/SessionsModel.h+5−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
55 * it under the terms of the GNU General Public License as published by
@@ -15,8 +15,7 @@
1515 *
1616 */
1717
18−#ifndef UNITY_SESSIONSMODEL_H
19−#define UNITY_SESSIONSMODEL_H
18+#pragma once
2019
2120#include <unitysortfilterproxymodelqml.h>
2221#include <QLightDM/SessionsModel>
@@ -28,10 +27,9 @@ class SessionsModel : public UnitySortFilterProxyModelQML
2827{
2928 Q_OBJECT
3029
31− Q_ENUMS(SessionModelRoles)
32−
3330 Q_PROPERTY(QList<QUrl> iconSearchDirectories READ iconSearchDirectories
3431 WRITE setIconSearchDirectories NOTIFY iconSearchDirectoriesChanged)
32+
3533Q_SIGNALS:
3634 void iconSearchDirectoriesChanged();
3735
@@ -45,6 +43,7 @@ public:
4543 TypeRole = QLightDM::SessionsModel::SessionModelRoles::TypeRole,
4644 IconRole
4745 };
46+ Q_ENUM(SessionModelRoles)
4847
4948 explicit SessionsModel(QObject* parent=nullptr);
5049
@@ -55,6 +54,7 @@ public:
5554 Q_INVOKABLE QUrl iconUrl(const QString sessionName) const;
5655
5756 void setIconSearchDirectories(const QList<QUrl> searchDirectories);
57+
5858private:
5959 QLightDM::SessionsModel* m_model;
6060 QHash<int, QByteArray> m_roleNames;
@@ -64,5 +64,3 @@ private:
6464 QUrl("/usr/share/unity-greeter/")};
6565
6666};
67−
68−#endif // UNITY_SESSIONSMODEL_H
plugins/LightDM/UsersModel.cpp+176−9
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 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
@@ -12,20 +12,22 @@
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− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
17+#include "Greeter.h"
1918#include "UsersModel.h"
19+#include <QIdentityProxyModel>
2020#include <QLightDM/UsersModel>
21−#include <QtCore/QSortFilterProxyModel>
21+
22+#include <libintl.h>
2223
2324// First, we define an internal class that wraps LightDM's UsersModel. This
2425// class will modify some of the data coming from LightDM. For example, we
25−// modify any empty Real Names into just normal Names.
26+// modify any empty Real Names into just normal Names. We also add optional
27+// rows, depending on configuration.
2628// (We can't modify the data directly in UsersModel below because it won't sort
2729// using the modified data.)
28−class MangleModel : public QSortFilterProxyModel
30+class MangleModel : public QIdentityProxyModel
2931{
3032 Q_OBJECT
3133
@@ -33,29 +35,177 @@ public:
3335 explicit MangleModel(QObject* parent=0);
3436
3537 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
38+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
39+ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
40+
41+private:
42+ struct CustomRow {
43+ QString name;
44+ QString realName;
45+ };
46+
47+ int sourceRowCount() const;
48+
49+ void updateGuestRow();
50+ void updateManualRow();
51+ void updateCustomRows();
52+
53+ void addCustomRow(const CustomRow &newRow);
54+ void removeCustomRow(const QString &rowName);
55+
56+ QList<CustomRow> m_customRows;
57+ bool m_updatingCustomRows;
3658};
3759
3860MangleModel::MangleModel(QObject* parent)
39− : QSortFilterProxyModel(parent)
61+ : QIdentityProxyModel(parent)
62+ , m_updatingCustomRows(false)
4063{
4164 setSourceModel(new QLightDM::UsersModel(this));
65+
66+ updateCustomRows();
67+
68+ // Would be nice if there were a rowCountChanged signal in the base class.
69+ // We redo all custom rows on any row count change, because (A) some of
70+ // custom rows (manual login) use row count information and (B) when
71+ // testing, we use a modelReset signal as a way to indicate that a custom
72+ // row has been toggled off or on.
73+ connect(this, &QIdentityProxyModel::modelReset,
74+ this, &MangleModel::updateCustomRows);
75+ connect(this, &QIdentityProxyModel::rowsInserted,
76+ this, &MangleModel::updateCustomRows);
77+ connect(this, &QIdentityProxyModel::rowsRemoved,
78+ this, &MangleModel::updateCustomRows);
4279}
4380
4481QVariant MangleModel::data(const QModelIndex &index, int role) const
4582{
46− QVariant variantData = QSortFilterProxyModel::data(index, role);
83+ QVariant variantData;
84+
85+ if (index.row() >= rowCount())
86+ return QVariant();
87+
88+ bool isCustomRow = index.row() >= sourceRowCount();
89+ if (isCustomRow && index.column() == 0) {
90+ int customIndex = index.row() - sourceRowCount();
91+ if (role == QLightDM::UsersModel::NameRole) {
92+ variantData = m_customRows[customIndex].name;
93+ } else if (role == QLightDM::UsersModel::RealNameRole) {
94+ variantData = m_customRows[customIndex].realName;
95+ } else if (role == QLightDM::UsersModel::LoggedInRole) {
96+ variantData = false;
97+ } else if (role == QLightDM::UsersModel::SessionRole) {
98+ variantData = Greeter::instance()->defaultSessionHint();
99+ }
100+ } else {
101+ variantData = QIdentityProxyModel::data(index, role);
102+ }
47103
48104 // If user's real name is empty, switch to unix name
49105 if (role == QLightDM::UsersModel::RealNameRole && variantData.toString().isEmpty()) {
50− variantData = QSortFilterProxyModel::data(index, QLightDM::UsersModel::NameRole);
106+ variantData = data(index, QLightDM::UsersModel::NameRole);
51107 } else if (role == QLightDM::UsersModel::BackgroundPathRole && variantData.toString().startsWith('#')) {
52108 const QString stringData = "data:image/svg+xml,<svg><rect width='100%' height='100%' fill='" + variantData.toString() + "'/></svg>";
53109 variantData = stringData;
54110 }
55111
112+ // Workaround for liblightdm returning "" when a user has no default session
113+ if (Q_UNLIKELY(role == QLightDM::UsersModel::SessionRole && variantData.toString().isEmpty())) {
114+ variantData = Greeter::instance()->defaultSessionHint();
115+ }
116+
56117 return variantData;
57118}
58119
120+void MangleModel::addCustomRow(const CustomRow &newRow)
121+{
122+ for (int i = 0; i < m_customRows.size(); i++) {
123+ if (m_customRows[i].name == newRow.name) {
124+ return; // we don't have custom rows that change content yet
125+ }
126+ }
127+
128+ beginInsertRows(QModelIndex(), rowCount(), rowCount());
129+ m_customRows << newRow;
130+ endInsertRows();
131+}
132+
133+void MangleModel::removeCustomRow(const QString &rowName)
134+{
135+ for (int i = 0; i < m_customRows.size(); i++) {
136+ if (m_customRows[i].name == rowName) {
137+ int rowNum = sourceRowCount() + i;
138+ beginRemoveRows(QModelIndex(), rowNum, rowNum);
139+ m_customRows.removeAt(i);
140+ endRemoveRows();
141+ break;
142+ }
143+ }
144+}
145+
146+void MangleModel::updateManualRow()
147+{
148+ bool hasAnotherEntry = sourceRowCount() > 0;
149+ for (int i = 0; !hasAnotherEntry && i < m_customRows.size(); i++) {
150+ if (m_customRows[i].name != QStringLiteral("*other")) {
151+ hasAnotherEntry = true;
152+ }
153+ }
154+
155+ // Show manual login if we are asked to OR if no other entry exists
156+ if (Greeter::instance()->showManualLoginHint() || !hasAnotherEntry)
157+ addCustomRow({QStringLiteral("*other"), gettext("Login")});
158+ else
159+ removeCustomRow(QStringLiteral("*other"));
160+}
161+
162+void MangleModel::updateGuestRow()
163+{
164+ if (Greeter::instance()->hasGuestAccount())
165+ addCustomRow({QStringLiteral("*guest"), gettext("Guest Session")});
166+ else
167+ removeCustomRow(QStringLiteral("*guest"));
168+}
169+
170+void MangleModel::updateCustomRows()
171+{
172+ // We update when rowCount changes, but we also insert/remove rows here.
173+ // So guard this function to avoid recursion.
174+ if (m_updatingCustomRows)
175+ return;
176+
177+ m_updatingCustomRows = true;
178+ updateGuestRow();
179+ updateManualRow();
180+ m_updatingCustomRows = false;
181+}
182+
183+int MangleModel::rowCount(const QModelIndex &parent) const
184+{
185+ if (parent.isValid())
186+ return 0;
187+ else
188+ return sourceRowCount() + m_customRows.size();
189+}
190+
191+int MangleModel::sourceRowCount() const
192+{
193+ return Greeter::instance()->hideUsersHint() ? 0 : sourceModel()->rowCount();
194+}
195+
196+QModelIndex MangleModel::index(int row, int column, const QModelIndex &parent) const
197+{
198+ if (row >= rowCount())
199+ return QModelIndex();
200+
201+ bool isCustomRow = row >= sourceRowCount();
202+ if (isCustomRow && !parent.isValid()) {
203+ return createIndex(row, column);
204+ } else {
205+ return QIdentityProxyModel::index(row, column, parent);
206+ }
207+}
208+
59209// **** Now we continue with actual UsersModel class ****
60210
61211UsersModel::UsersModel(QObject* parent)
@@ -68,4 +218,21 @@ UsersModel::UsersModel(QObject* parent)
68218 sort(0);
69219}
70220
221+bool UsersModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
222+{
223+ auto leftName = source_left.data(QLightDM::UsersModel::NameRole);
224+ auto rightName = source_right.data(QLightDM::UsersModel::NameRole);
225+
226+ if (leftName == QStringLiteral("*guest"))
227+ return false;
228+ if (rightName == QStringLiteral("*guest"))
229+ return true;
230+ if (leftName == QStringLiteral("*other"))
231+ return false;
232+ if (rightName == QStringLiteral("*other"))
233+ return true;
234+
235+ return UnitySortFilterProxyModelQML::lessThan(source_left, source_right);
236+}
237+
71238#include "UsersModel.moc"
plugins/LightDM/UsersModel.h+6−8
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012,2013 Canonical, Ltd.
2+ * Copyright (C) 2012-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
@@ -12,19 +12,16 @@
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: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917/* This class is a really tiny filter around QLightDM::UsersModel. There are
2018 some operations that we want to edit a bit for the benefit of Qml.
2119 Specifically, we want to sort users according to realName. */
2220
23−#ifndef UNITY_USERSMODEL_H
24−#define UNITY_USERSMODEL_H
21+#pragma once
2522
2623#include <unitysortfilterproxymodelqml.h>
27−#include <QtCore/QObject>
24+#include <QObject>
2825
2926class UsersModel : public UnitySortFilterProxyModelQML
3027{
@@ -32,6 +29,7 @@ class UsersModel : public UnitySortFilterProxyModelQML
3229
3330public:
3431 explicit UsersModel(QObject* parent=0);
35−};
3632
37−#endif
33+protected:
34+ bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
35+};
plugins/LightDM/plugin.cpp+12−4
@@ -19,6 +19,7 @@
1919#include "DBusGreeter.h"
2020#include "DBusGreeterList.h"
2121#include "Greeter.h"
22+#include "PromptsModel.h"
2223#include "SessionsModel.h"
2324#include "UsersModel.h"
2425#include <libusermetricsoutput/ColorTheme.h>
@@ -32,16 +33,24 @@
3233
3334static QObject *greeter_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
3435{
35− Q_UNUSED(engine)
3636 Q_UNUSED(scriptEngine)
3737
38− Greeter *greeter = new Greeter();
38+ Greeter *greeter = Greeter::instance();
3939 new DBusGreeter(greeter, QStringLiteral("/"));
4040 new DBusGreeterList(greeter, QStringLiteral("/list"));
4141
42+ engine->setObjectOwnership(greeter, QQmlEngine::CppOwnership);
43+
4244 return greeter;
4345}
4446
47+static QObject *prompts_provider(QQmlEngine *engine, QJSEngine *)
48+{
49+ auto model = Greeter::instance()->promptsModel();
50+ engine->setObjectOwnership(model, QQmlEngine::CppOwnership);
51+ return model;
52+}
53+
4554static QObject *sessions_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
4655{
4756 Q_UNUSED(engine)
@@ -78,8 +87,7 @@ void PLUGIN_CLASSNAME::registerTypes(const char *uri)
7887 #error No library defined in LightDM plugin
7988#endif
8089
81− qRegisterMetaType<QLightDM::Greeter::MessageType>("QLightDM::Greeter::MessageType");
82− qRegisterMetaType<QLightDM::Greeter::PromptType>("QLightDM::Greeter::PromptType");
90+ qmlRegisterSingletonType<PromptsModel>(uri, 0, 1, "Prompts", prompts_provider);
8391
8492 qmlRegisterSingletonType<SessionsModel>(uri, 0, 1, "Sessions", sessions_provider);
8593 qmlRegisterUncreatableType<QLightDM::SessionsModel>(uri, 0, 1, "SessionRoles", QStringLiteral("Type is not instantiable"));
plugins/Lights/Lights.h+1−1
@@ -27,7 +27,6 @@ struct light_device_t;
2727class Lights: public QObject
2828{
2929 Q_OBJECT
30− Q_ENUMS(State)
3130 Q_PROPERTY(State state READ state WRITE setState NOTIFY stateChanged)
3231 Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
3332 Q_PROPERTY(int onMillisec READ onMillisec WRITE setOnMillisec NOTIFY onMillisecChanged)
@@ -38,6 +37,7 @@ public:
3837 Off,
3938 On,
4039 };
40+ Q_ENUM(State)
4141
4242 explicit Lights(QObject *parent = 0);
4343 ~Lights();
plugins/Powerd/Powerd.h+2−2
@@ -27,8 +27,6 @@
2727class Powerd: public QObject
2828{
2929 Q_OBJECT
30− Q_ENUMS(Status)
31− Q_ENUMS(DisplayStateChangeReason)
3230 Q_PROPERTY(Status status READ status NOTIFY statusChanged)
3331
3432public:
@@ -41,11 +39,13 @@ public:
4139 SnapDecision = 5, // Display changed state due to snap decision prompt
4240 CallDone = 6, // Display changed state due to voice call end
4341 };
42+ Q_ENUM(DisplayStateChangeReason)
4443
4544 enum Status {
4645 Off,
4746 On,
4847 };
48+ Q_ENUM(Status)
4949
5050 explicit Powerd(QObject *parent = 0);
5151 ~Powerd();
plugins/UInput/uinput.h+1−1
@@ -27,7 +27,6 @@
2727class UInput : public QObject
2828{
2929 Q_OBJECT
30− Q_ENUMS(Button)
3130
3231public:
3332 enum Button {
@@ -35,6 +34,7 @@ public:
3534 ButtonRight,
3635 ButtonMiddle
3736 };
37+ Q_ENUM(Button)
3838
3939 explicit UInput(QObject *parent = nullptr);
4040 ~UInput();
plugins/Ubuntu/CMakeLists.txt−2
@@ -1,4 +1,2 @@
11add_subdirectory(Gestures)
22add_subdirectory(DownloadDaemonListener)
3−add_subdirectory(Payments)
4−add_subdirectory(SystemImage)
plugins/Ubuntu/Gestures/CMakeLists.txt+1−1
@@ -16,7 +16,7 @@ pkg_check_modules(UBUNTUGESTURES REQUIRED UbuntuGestures)
1616
1717add_definitions(-DUBUNTUGESTURESQML_LIBRARY)
1818
19−add_library(UbuntuGesturesQml MODULE ${UbuntuGesturesQml_SOURCES})
19+add_library(UbuntuGesturesQml SHARED ${UbuntuGesturesQml_SOURCES})
2020target_link_libraries(UbuntuGesturesQml ${UBUNTUGESTURES_LIBRARIES})
2121
2222qt5_use_modules(UbuntuGesturesQml Core Quick)
plugins/Ubuntu/Gestures/Direction.h+1−1
@@ -26,7 +26,6 @@
2626 */
2727class UBUNTUGESTURESQML_EXPORT Direction : public QObject {
2828 Q_OBJECT
29− Q_ENUMS(Type)
3029
3130public:
3231 // Make sure it is kept synchronized with SDK UCSwipeArea::Direction
@@ -38,6 +37,7 @@ public:
3837 Horizontal, // Along the X axis, in any direction
3938 Vertical // Along the Y axis, in any direction
4039 };
40+ Q_ENUM(Type)
4141
4242 Q_INVOKABLE static bool isHorizontal(Direction::Type type);
4343 Q_INVOKABLE static bool isVertical(Direction::Type type);
plugins/Ubuntu/Gestures/TouchGestureArea.cpp−5
@@ -735,7 +735,6 @@ void TouchGestureArea::resyncCachedTouchPoints()
735735 bool added = false;
736736 bool ended = false;
737737 bool moved = false;
738− bool wantsDrag = false;
739738
740739 // list of deletes
741740 QMutableHashIterator<int, GestureTouchPoint*> removeIter(m_cachedTouchPoints);
@@ -765,10 +764,6 @@ void TouchGestureArea::resyncCachedTouchPoints()
765764 }
766765 }
767766
768− if (wantsDrag && !dragging()) {
769− setDragging(true);
770− }
771−
772767 if (ended) {
773768 if (m_cachedTouchPoints.isEmpty()) {
774769 if (!dragging()) Q_EMIT clicked();
plugins/Ubuntu/Gestures/TouchGestureArea.h+1−1
@@ -114,7 +114,6 @@ private:
114114class UBUNTUGESTURESQML_EXPORT TouchGestureArea : public QQuickItem
115115{
116116 Q_OBJECT
117− Q_ENUMS(Status)
118117
119118 Q_PROPERTY(int status READ status NOTIFY statusChanged)
120119 Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged)
@@ -137,6 +136,7 @@ public:
137136 Recognized,
138137 Rejected
139138 };
139+ Q_ENUM(Status)
140140 TouchGestureArea(QQuickItem* parent = nullptr);
141141 ~TouchGestureArea();
142142
plugins/Ubuntu/Payments/CMakeLists.txtdeleted−20
@@ -1,20 +0,0 @@
1−include_directories(
2− ${CMAKE_CURRENT_SOURCE_DIR}
3− ${CMAKE_CURRENT_BINARY_DIR}
4−)
5−
6−set(PAYMENTS_SOURCES
7− plugin.cpp
8− Payments.cpp
9−)
10−
11−add_library(Payments MODULE ${PAYMENTS_SOURCES})
12−
13−qt5_use_modules(Payments Qml Quick DBus Core)
14−
15−add_unity8_plugin(Ubuntu.Payments 0.1 Ubuntu/Payments TARGETS Payments)
16−
17−pkg_check_modules(LIBPAY REQUIRED pay-2)
18−add_definitions(${LIBPAY_CFLAGS} ${LIBPAY_CFLAGS_OTHER})
19−
20−target_link_libraries(Payments ${LIBPAY_LDFLAGS})
plugins/Ubuntu/Payments/Payments.cppdeleted−136
@@ -1,136 +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 "Payments.h"
18−
19−#include <QLocale>
20−
21−#include <libpay/pay-package.h>
22−
23−
24−// The observer callback for the package we are watching.
25−static void observer(PayPackage* /* package */, const char* itemid, PayPackageItemStatus status, void* user_data) {
26− // This function is called in libpay's thread, so be careful what you call
27− // Emitting signals should be fine as long as they use Queued or Auto
28− // connections (the default)
29− // http://qt-project.org/doc/qt-5/threads-qobject.html#signals-and-slots-across-threads
30−
31− Payments *self = static_cast<Payments*>(user_data);
32−
33− // If the item ID is different, ignore it.
34− if (itemid != self->storeItemId()) {
35− return;
36− }
37−
38− // FIXME: No error reporting from libpay, but we need to show some
39− // types of errors to the user. https://launchpad.net/bugs/1333403
40− switch (status) {
41− case PAY_PACKAGE_ITEM_STATUS_PURCHASED:
42− Q_EMIT self->purchaseCompleted();
43− break;
44− case PAY_PACKAGE_ITEM_STATUS_PURCHASING:
45− self->setPurchasing(true);
46− break;
47− case PAY_PACKAGE_ITEM_STATUS_NOT_PURCHASED:
48− if (self->purchasing()) {
49− self->setPurchasing(false);
50− Q_EMIT self->purchaseCancelled();
51− }
52− break;
53− default:
54− break;
55− }
56−}
57−
58−Payments::Payments(QObject *parent)
59− : QObject(parent),
60− m_purchasing(false)
61−{
62− m_package = pay_package_new("click-scope");
63− pay_package_item_observer_install(m_package, observer, this);
64−}
65−
66−Payments::~Payments()
67−{
68− pay_package_item_observer_uninstall(m_package, observer, this);
69− pay_package_delete(m_package);
70−}
71−
72−QString Payments::currency() const
73−{
74− return m_currency;
75−}
76−
77−double Payments::price() const
78−{
79− return m_price;
80−}
81−
82−QString Payments::storeItemId() const
83−{
84− return m_store_item_id;
85−}
86−
87−QString Payments::formattedPrice() const
88−{
89− QLocale locale;
90− return locale.toCurrencyString(m_price, m_currency);
91−}
92−
93−bool Payments::purchasing() const
94−{
95− return m_purchasing;
96−}
97−
98−void Payments::setCurrency(const QString &currency)
99−{
100− if(m_currency != currency) {
101− m_currency = currency;
102− Q_EMIT currencyChanged(currency);
103− Q_EMIT formattedPriceChanged(formattedPrice());
104− }
105−}
106−
107−void Payments::setPrice(const double price)
108−{
109− if(m_price != price) {
110− m_price = price;
111− Q_EMIT priceChanged(price);
112− Q_EMIT formattedPriceChanged(formattedPrice());
113− }
114−}
115−
116−void Payments::setStoreItemId(const QString &store_item_id)
117−{
118− if (m_store_item_id != store_item_id) {
119− m_store_item_id = store_item_id;
120− Q_EMIT storeItemIdChanged(m_store_item_id);
121− }
122−
123− if (m_store_item_id.isEmpty()) {
124− return;
125− }
126−}
127−
128−void Payments::setPurchasing(bool is_purchasing)
129−{
130− m_purchasing = is_purchasing;
131−}
132−
133−void Payments::start()
134−{
135− pay_package_item_start_purchase(m_package, m_store_item_id.toLocal8Bit().data());
136−}
plugins/Ubuntu/Payments/Payments.hdeleted−69
@@ -1,69 +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 PAYMENTS_H
18−#define PAYMENTS_H
19−
20−#include <QObject>
21−
22−#include <libpay/pay-package.h>
23−
24−
25−class Payments : public QObject
26−{
27− Q_OBJECT
28− Q_DISABLE_COPY(Payments)
29− Q_PROPERTY(QString currency READ currency WRITE setCurrency NOTIFY currencyChanged)
30− Q_PROPERTY(double price READ price WRITE setPrice NOTIFY priceChanged)
31− Q_PROPERTY(QString storeItemId READ storeItemId WRITE setStoreItemId NOTIFY storeItemIdChanged)
32− Q_PROPERTY(QString formattedPrice READ formattedPrice NOTIFY formattedPriceChanged)
33−
34−public:
35− explicit Payments(QObject *parent = 0);
36− virtual ~Payments();
37−
38− QString currency() const;
39− double price() const;
40− QString storeItemId() const;
41− QString formattedPrice() const;
42− bool purchasing() const;
43−
44− void setCurrency(const QString& currency);
45− void setPrice(const double price);
46− void setStoreItemId(const QString& store_item_id);
47− void setPurchasing(bool is_purchasing);
48− Q_INVOKABLE void start();
49−
50−Q_SIGNALS:
51− void currencyChanged(const QString& currency);
52− void priceChanged(const double price);
53− void storeItemIdChanged(const QString &store_item_id);
54− void formattedPriceChanged(const QString &formatted_price);
55−
56− void purchaseError(const QString &error);
57− void purchaseCompleted();
58− void purchaseCancelled();
59−
60−private:
61− QString m_currency;
62− double m_price;
63− QString m_store_item_id;
64− bool m_purchasing;
65−
66− PayPackage *m_package;
67−};
68−
69−#endif // PAYMENTS_H
plugins/Ubuntu/Payments/qmldirdeleted−3
@@ -1,3 +0,0 @@
1−module Ubuntu.Payments
2−plugin Payments
3−typeinfo Payments.qmltypes
plugins/Ubuntu/SystemImage/CMakeLists.txtdeleted−15
@@ -1,15 +0,0 @@
1−include_directories(
2− ${GLIB_INCLUDE_DIRS}
3−)
4−
5−set(SYSTEMIMAGE_SOURCES
6− plugin.cpp
7− SystemImage.cpp
8−)
9−
10−add_library(SystemImage MODULE ${SYSTEMIMAGE_SOURCES})
11−
12−qt5_use_modules(SystemImage Qml DBus Core)
13−target_link_libraries(SystemImage ${GLIB_LIBRARIES})
14−
15−add_unity8_plugin(Ubuntu.SystemImage 0.1 Ubuntu/SystemImage TARGETS SystemImage)
plugins/Ubuntu/SystemImage/SystemImage.cppdeleted−155
@@ -1,155 +0,0 @@
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 <QDBusConnection>
18−#include <QDBusPendingCall>
19−#include <QDBusReply>
20−#include <QDebug>
21−
22−#include <glib.h>
23−
24−#include "SystemImage.h"
25−
26−#define SYSTEMIMAGE_SERVICE QStringLiteral("com.canonical.SystemImage")
27−#define SYSTEMIMAGE_PATH QStringLiteral("/Service")
28−#define SYSTEMIMAGE_IFACE QStringLiteral("com.canonical.SystemImage")
29−
30−Q_LOGGING_CATEGORY(SYSTEMIMAGEPLUGIN, "unity8.systemimage", QtWarningMsg)
31−
32−#define DEBUG_MSG qCDebug(SYSTEMIMAGEPLUGIN).nospace().noquote() << Q_FUNC_INFO
33−#define WARNING_MSG qCWarning(SYSTEMIMAGEPLUGIN).nospace().noquote() << Q_FUNC_INFO
34−
35−SystemImage::SystemImage(QObject *parent)
36− : QObject(parent)
37−{
38− QDBusConnection::systemBus().connect(SYSTEMIMAGE_SERVICE, SYSTEMIMAGE_PATH, SYSTEMIMAGE_IFACE, QStringLiteral("UpdateAvailableStatus"),
39− this, SLOT(onUpdateAvailableStatus(bool,bool,QString,int,QString,QString)));
40− QDBusConnection::systemBus().connect(SYSTEMIMAGE_SERVICE, SYSTEMIMAGE_PATH, SYSTEMIMAGE_IFACE, QStringLiteral("UpdateDownloaded"),
41− this, SLOT(onUpdateDownloaded()));
42− QDBusConnection::systemBus().connect(SYSTEMIMAGE_SERVICE, SYSTEMIMAGE_PATH, SYSTEMIMAGE_IFACE, QStringLiteral("UpdateFailed"),
43− this, SLOT(onUpdateFailed(int,QString)));
44− QDBusConnection::systemBus().connect(SYSTEMIMAGE_SERVICE, SYSTEMIMAGE_PATH, SYSTEMIMAGE_IFACE, QStringLiteral("Applied"),
45− this, SLOT(onUpdateApplied(bool)));
46− QDBusConnection::systemBus().connect(SYSTEMIMAGE_SERVICE, SYSTEMIMAGE_PATH, SYSTEMIMAGE_IFACE, QStringLiteral("Rebooting"),
47− this, SLOT(onRebooting(bool)));
48−}
49−
50−void SystemImage::checkForUpdate()
51−{
52− DEBUG_MSG << "Checking for update";
53− const QDBusMessage msg = QDBusMessage::createMethodCall(SYSTEMIMAGE_SERVICE, SYSTEMIMAGE_PATH, SYSTEMIMAGE_IFACE,
54− QStringLiteral("CheckForUpdate"));
55− QDBusConnection::systemBus().asyncCall(msg);
56−}
57−
58−void SystemImage::applyUpdate()
59−{
60− DEBUG_MSG << "Applying update";
61− setUpdateApplying(true);
62−
63− const QDBusMessage msg = QDBusMessage::createMethodCall(SYSTEMIMAGE_SERVICE, SYSTEMIMAGE_PATH, SYSTEMIMAGE_IFACE,
64− QStringLiteral("ApplyUpdate"));
65− QDBusConnection::systemBus().asyncCall(msg);
66−}
67−
68−void SystemImage::factoryReset()
69−{
70− const QDBusMessage msg = QDBusMessage::createMethodCall(SYSTEMIMAGE_SERVICE, SYSTEMIMAGE_PATH, SYSTEMIMAGE_IFACE,
71− QStringLiteral("FactoryReset"));
72− QDBusConnection::systemBus().asyncCall(msg);
73−}
74−
75−void SystemImage::onUpdateAvailableStatus(bool is_available, bool downloading, const QString &available_version, int update_size,
76− const QString &last_update_date, const QString &error_reason)
77−{
78− DEBUG_MSG << "A new update is " << (is_available ? "" : "NOT") << "available";
79−
80− if (is_available == m_updateAvailable) {
81− return;
82− }
83−
84− m_updateAvailable = is_available;
85− m_downloading = downloading;
86− m_availableVersion = available_version;
87− m_updateSize = formatSize(update_size);
88− m_lastUpdateDate = last_update_date;
89− m_errorReason = error_reason;
90− Q_EMIT updateAvailableStatus();
91−
92− DEBUG_MSG << "Downloading: " << downloading << ", version: " << available_version << ", last update: " << last_update_date <<
93− ", size: " << m_updateSize;
94−}
95−
96−void SystemImage::onUpdateDownloaded()
97−{
98− DEBUG_MSG << "Update downloaded";
99−
100− m_downloaded = true;
101− Q_EMIT updateDownloadedChanged();
102−}
103−
104−void SystemImage::onUpdateFailed(int /*consecutive_failure_count*/, const QString &last_reason)
105−{
106− WARNING_MSG << "System Update failed: " << last_reason;
107− setUpdateApplying(false);
108−}
109−
110−void SystemImage::onUpdateApplied(bool applied)
111−{
112− DEBUG_MSG << "System Update applied with status: " << applied;
113− setUpdateApplying(false);
114− if (applied) {
115− resetUpdateStatus();
116− Q_EMIT updateAvailableStatus();
117− }
118−}
119−
120−void SystemImage::onRebooting(bool status)
121−{
122− setUpdateApplying(false);
123− DEBUG_MSG << "Rebooting: " << status;
124−}
125−
126−void SystemImage::setUpdateApplying(bool status)
127−{
128− if (status != m_updateApplying) {
129− m_updateApplying = status;
130− Q_EMIT updateApplyingChanged();
131− }
132−}
133−
134−void SystemImage::resetUpdateStatus()
135−{
136− m_updateAvailable = false;
137− m_updateApplying = false;
138− m_downloading = false;
139− m_downloaded = false;
140− m_availableVersion.clear();
141− m_updateSize.clear();
142− m_lastUpdateDate.clear();
143− m_errorReason.clear();
144−}
145−
146−QString SystemImage::formatSize(quint64 size) const
147−{
148− guint64 g_size = size;
149−
150− gchar * formatted_size = g_format_size(g_size);
151− QString q_formatted_size = QString::fromLocal8Bit(formatted_size);
152− g_free(formatted_size);
153−
154− return q_formatted_size;
155−}
plugins/Ubuntu/SystemImage/SystemImage.hdeleted−84
@@ -1,84 +0,0 @@
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 SYSTEMIMAGE_H
18−#define SYSTEMIMAGE_H
19−
20−#include <QObject>
21−#include <QLoggingCategory>
22−
23−Q_DECLARE_LOGGING_CATEGORY(SYSTEMIMAGEPLUGIN)
24−
25−class SystemImage : public QObject
26−{
27− Q_OBJECT
28− Q_DISABLE_COPY(SystemImage)
29−
30− Q_PROPERTY(bool updateAvailable READ updateAvailable NOTIFY updateAvailableStatus)
31− Q_PROPERTY(bool updateDownloading READ updateDownloading NOTIFY updateAvailableStatus)
32− Q_PROPERTY(QString availableVersion READ availableVersion NOTIFY updateAvailableStatus)
33− Q_PROPERTY(QString updateSize READ updateSize NOTIFY updateAvailableStatus)
34− Q_PROPERTY(bool updateApplying READ updateApplying NOTIFY updateApplyingChanged)
35− Q_PROPERTY(bool updateDownloaded READ updateDownloaded NOTIFY updateDownloadedChanged)
36−
37−public:
38− explicit SystemImage(QObject *parent = nullptr);
39− ~SystemImage() = default;
40−
41− bool updateAvailable() const { return m_updateAvailable; }
42− bool updateDownloading() const { return m_downloading; }
43− QString availableVersion() const { return m_availableVersion; }
44− QString updateSize() const { return m_updateSize; }
45− bool updateApplying() const { return m_updateApplying; }
46− bool updateDownloaded() const { return m_downloaded; }
47−
48−public Q_SLOTS:
49− Q_INVOKABLE void checkForUpdate();
50− Q_INVOKABLE void applyUpdate();
51− Q_INVOKABLE void factoryReset();
52−
53−private Q_SLOTS:
54− void onUpdateAvailableStatus(bool is_available, bool updateDownloading, const QString &available_version,
55− int update_size, const QString &last_update_date, const QString &error_reason);
56− void onUpdateDownloaded();
57− void onUpdateFailed(int consecutive_failure_count, const QString & last_reason);
58− void onUpdateApplied(bool applied);
59− void onRebooting(bool status);
60−
61−Q_SIGNALS:
62− void updateAvailableStatus();
63− void updateDownloadedChanged();
64− void updateApplyingChanged();
65−
66−private Q_SLOTS:
67− void setUpdateApplying(bool status);
68−
69−private:
70− void resetUpdateStatus();
71− QString formatSize(quint64 size) const;
72−
73−private:
74− bool m_updateAvailable = false;
75− bool m_updateApplying = false;
76− bool m_downloading = false;
77− bool m_downloaded = false;
78− QString m_availableVersion;
79− QString m_updateSize;
80− QString m_lastUpdateDate;
81− QString m_errorReason;
82−};
83−
84−#endif // SYSTEMIMAGE_H
plugins/Ubuntu/SystemImage/plugin.cppdeleted−28
@@ -1,28 +0,0 @@
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 "plugin.h"
18−#include "SystemImage.h"
19−
20−#include <QtQml>
21−
22−void BackendPlugin::registerTypes(const char *uri)
23−{
24− Q_ASSERT(uri == QLatin1String("Ubuntu.SystemImage"));
25−
26− qmlRegisterSingletonType<SystemImage>(uri, 0, 1, "SystemImage",
27− [](QQmlEngine*, QJSEngine*) -> QObject* { return new SystemImage; });
28−}
plugins/Ubuntu/SystemImage/qmldirdeleted−3
@@ -1,3 +0,0 @@
1−module Ubuntu.SystemImage
2−plugin SystemImage
3−typeinfo SystemImage.qmltypes
plugins/Unity/ApplicationMenu/CMakeLists.txtnew file+19
@@ -0,0 +1,19 @@
1+find_package(Qt5DBus REQUIRED)
2+
3+include_directories(
4+ ${CMAKE_CURRENT_SOURCE_DIR}
5+ ${CMAKE_CURRENT_BINARY_DIR}
6+)
7+
8+set(applicationMenu_SRCS
9+ applicationmenuregistry.cpp
10+ dbusapplicationmenuregistry.cpp
11+ plugin.cpp)
12+
13+qt5_add_dbus_adaptor(applicationMenu_SRCS com.ubuntu.MenuRegistrar.xml dbusapplicationmenuregistry.h DBusApplicationMenuRegistry)
14+
15+add_library(ApplicationMenu-qml MODULE ${applicationMenu_SRCS})
16+
17+qt5_use_modules(ApplicationMenu-qml DBus Qml)
18+
19+add_unity8_plugin(Unity.ApplicationMenu 0.1 Unity/ApplicationMenu TARGETS ApplicationMenu-qml)
plugins/Unity/ApplicationMenu/applicationmenuregistry.cppnew file+141
@@ -0,0 +1,141 @@
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 "applicationmenuregistry.h"
18+
19+#include <QQmlEngine>
20+#include <QDebug>
21+
22+Q_LOGGING_CATEGORY(UNITY_APPMENU, "unity.appmenu", QtDebugMsg)
23+
24+#define DEBUG_MSG qCDebug(UNITY_APPMENU).nospace().noquote() << "ApplicationMenuRegistry::" << __func__
25+#define WARNING_MSG qCWarning(UNITY_APPMENU).nospace().noquote() << "ApplicationMenuRegistry::" << __func__
26+
27+ApplicationMenuRegistry::ApplicationMenuRegistry(QObject *parent)
28+ : QObject(parent)
29+{
30+}
31+
32+ApplicationMenuRegistry::~ApplicationMenuRegistry()
33+{
34+ qDeleteAll(m_appMenus);
35+ m_appMenus.clear();
36+
37+ qDeleteAll(m_surfaceMenus);
38+ m_surfaceMenus.clear();
39+}
40+
41+void ApplicationMenuRegistry::RegisterAppMenu(pid_t processId,
42+ const QDBusObjectPath &menuObjectPath,
43+ const QDBusObjectPath &actionObjectPath,
44+ const QString &service)
45+{
46+ DEBUG_MSG << "(pid=" << processId
47+ << ", menuPath=" << menuObjectPath.path()
48+ << ", actionPath=" << actionObjectPath.path()
49+ << ", service=" << service;
50+
51+ auto i = m_appMenus.find(processId);
52+ while (i != m_appMenus.end() && i.key() == processId) {
53+ if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
54+ WARNING_MSG << "Already have a menu for application (pid= " << processId
55+ << ", service=" << service
56+ << ", menuPath=" << menuObjectPath.path() << ")";
57+ return;
58+ }
59+ ++i;
60+ }
61+
62+ auto menu = new MenuServicePath(service, menuObjectPath, actionObjectPath);
63+ QQmlEngine::setObjectOwnership(menu, QQmlEngine::CppOwnership);
64+
65+ m_appMenus.insert(processId, menu);
66+ Q_EMIT appMenuRegistered(processId);
67+}
68+
69+void ApplicationMenuRegistry::UnregisterAppMenu(pid_t processId, const QDBusObjectPath &menuObjectPath)
70+{
71+ DEBUG_MSG << "(pid=" << processId
72+ << ", menuPath=" << menuObjectPath.path();
73+
74+ auto i = m_appMenus.find(processId);
75+ while (i != m_appMenus.end() && i.key() == processId) {
76+ if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
77+ i.value()->deleteLater();
78+ m_appMenus.erase(i);
79+ Q_EMIT appMenuUnregistered(processId);
80+ break;
81+ }
82+ ++i;
83+ }
84+}
85+
86+void ApplicationMenuRegistry::RegisterSurfaceMenu(const QString &surfaceId,
87+ const QDBusObjectPath &menuObjectPath,
88+ const QDBusObjectPath &actionObjectPath,
89+ const QString &service)
90+{
91+ DEBUG_MSG << "(surfaceId=" << surfaceId
92+ << ", menuPath=" << menuObjectPath.path()
93+ << ", actionPath=" << actionObjectPath.path()
94+ << ", service=" << service;
95+
96+ auto i = m_surfaceMenus.find(surfaceId);
97+ while (i != m_surfaceMenus.end() && i.key() == surfaceId) {
98+ if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
99+ WARNING_MSG << "Already have a menu for surface (surfaceId= " << surfaceId
100+ << ", service=" << service
101+ << ", menuPath=" << menuObjectPath.path() << ")";
102+ return;
103+ }
104+ ++i;
105+ }
106+
107+ auto menu = new MenuServicePath(service, menuObjectPath, actionObjectPath);
108+ QQmlEngine::setObjectOwnership(menu, QQmlEngine::CppOwnership);
109+
110+ m_surfaceMenus.insert(surfaceId, menu);
111+ Q_EMIT surfaceMenuRegistered(surfaceId);
112+}
113+
114+void ApplicationMenuRegistry::UnregisterSurfaceMenu(const QString &surfaceId, const QDBusObjectPath &menuObjectPath)
115+{
116+ DEBUG_MSG << "(surfaceId=" << surfaceId
117+ << ", menuPath=" << menuObjectPath.path();
118+
119+ auto i = m_surfaceMenus.find(surfaceId);
120+ while (i != m_surfaceMenus.end() && i.key() == surfaceId) {
121+ if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
122+ i.value()->deleteLater();
123+ m_surfaceMenus.erase(i);
124+ Q_EMIT surfaceMenuUnregistered(surfaceId);
125+ break;
126+ }
127+ ++i;
128+ }
129+}
130+
131+QList<QObject*> ApplicationMenuRegistry::getMenusForSurface(const QString &surfaceId) const
132+{
133+ QList<QObject*> list;
134+
135+ auto i = m_surfaceMenus.find(surfaceId);
136+ while (i != m_surfaceMenus.constEnd() && i.key() == surfaceId) {
137+ list << i.value();
138+ ++i;
139+ }
140+ return list;
141+}
plugins/Unity/ApplicationMenu/applicationmenuregistry.hnew file+83
@@ -0,0 +1,83 @@
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 APPLICATIONMENUREGISTRY_H
18+#define APPLICATIONMENUREGISTRY_H
19+
20+#include <QObject>
21+#include <QDBusContext>
22+#include <QDBusObjectPath>
23+#include <QtQml>
24+
25+Q_DECLARE_LOGGING_CATEGORY(UNITY_APPMENU)
26+
27+class MenuServicePath : public QObject
28+{
29+ Q_OBJECT
30+ Q_PROPERTY(QByteArray service MEMBER m_service CONSTANT)
31+ Q_PROPERTY(QByteArray menuPath MEMBER m_menuPath CONSTANT)
32+ Q_PROPERTY(QByteArray actionPath MEMBER m_actionPath CONSTANT)
33+public:
34+ explicit MenuServicePath(const QString &service,
35+ const QDBusObjectPath &menuPath,
36+ const QDBusObjectPath &actionPath)
37+ : m_service(service.toUtf8())
38+ , m_menuPath(menuPath.path().toUtf8())
39+ , m_actionPath(actionPath.path().toUtf8())
40+ {}
41+
42+ const QByteArray m_service;
43+ const QByteArray m_menuPath;
44+ const QByteArray m_actionPath;
45+};
46+
47+class ApplicationMenuRegistry : public QObject
48+{
49+ Q_OBJECT
50+public:
51+ virtual ~ApplicationMenuRegistry();
52+
53+ // for qml
54+ Q_INVOKABLE QList<QObject*> getMenusForSurface(const QString &surfaceId) const;
55+
56+ // for dbus
57+ void RegisterAppMenu(pid_t processId,
58+ const QDBusObjectPath &menuObjectPath,
59+ const QDBusObjectPath &actionObjectPath,
60+ const QString &service);
61+ void UnregisterAppMenu(pid_t processId, const QDBusObjectPath &menuObjectPath);
62+
63+ void RegisterSurfaceMenu(const QString &surfaceId,
64+ const QDBusObjectPath &menuObjectPath,
65+ const QDBusObjectPath &actionObjectPath,
66+ const QString &service);
67+ void UnregisterSurfaceMenu(const QString &surfaceId, const QDBusObjectPath &menuObjectPath);
68+
69+Q_SIGNALS:
70+ void appMenuRegistered(uint processId);
71+ void appMenuUnregistered(uint processId);
72+
73+ void surfaceMenuRegistered(const QString& surfaceId);
74+ void surfaceMenuUnregistered(const QString& surfaceId);
75+
76+protected:
77+ explicit ApplicationMenuRegistry(QObject *parent = 0);
78+
79+ QMultiMap<pid_t, MenuServicePath*> m_appMenus;
80+ QMultiMap<QString, MenuServicePath*> m_surfaceMenus;
81+};
82+
83+#endif // APPLICATIONMENUREGISTRY_H
plugins/Unity/ApplicationMenu/com.ubuntu.MenuRegistrar.xmlnew file+83
@@ -0,0 +1,83 @@
1+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
2+<node xmlns:dox="http://www.ayatana.org/dbus/dox.dtd">
3+ <dox:d><![CDATA[
4+ @mainpage
5+
6+ An interface to register menus that are associated with a window in an application. The
7+ main interface is documented here: @ref com::ubuntu::MenuRegistrar.
8+
9+ The actual menus are transported using the gmenumodel protocol
10+ ]]></dox:d>
11+ <interface name="com.ubuntu.MenuRegistrar" xmlns:dox="http://www.ayatana.org/dbus/dox.dtd">
12+ <dox:d>
13+ An interface to register a menu from an application to be displayed in another
14+ window. This manages that association between processes and/or Mir surface IDs and the dbus
15+ address and object that provides the menus using the org.gtk.Menus interface.
16+ </dox:d>
17+ <method name="RegisterAppMenu">
18+ <dox:d><![CDATA[
19+ Associates a gmenumodel with an application
20+
21+ /note this method assumes that the connection from the caller is the DBus connection
22+ to use for the object. Applications that use multiple DBus connections will need to
23+ ensure this method is called with the same connection that implements the object.
24+ ]]></dox:d>
25+ <arg name="pid" type="u" direction="in">
26+ <dox:d>The process ID of the application for which the menu is associated</dox:d>
27+ </arg>
28+ <arg name="menuObjectPath" type="o" direction="in">
29+ <dox:d>The dbus path where the gmenumodel interface for the application menu has been exported</dox:d>
30+ </arg>
31+ <arg name="actionObjectPath" type="o" direction="in">
32+ <dox:d>The dbus path where the gactionmenu interface for the application menu actions has been exported</dox:d>
33+ </arg>
34+ <arg name="service" type="s" direction="in">
35+ <dox:d>The dbus conection name of the client application to be registered (e.g. :1.23 or org.example.service)</dox:d>
36+ </arg>
37+ </method>
38+ <method name="UnregisterAppMenu">
39+ <dox:d>
40+ A method to allow removing an application menu from the database.
41+ </dox:d>
42+ <arg name="pid" type="u" direction="in">
43+ <dox:d>The process id of the application</dox:d>
44+ </arg>
45+ <arg name="menuObjectPath" type="o" direction="in">
46+ <dox:d>The dbus path for the registered application menu to be unregistered</dox:d>
47+ </arg>
48+ </method>
49+
50+ <method name="RegisterSurfaceMenu">
51+ <dox:d><![CDATA[
52+ Associates a gmenumodel with a surface
53+
54+ /note this method assumes that the connection from the caller is the DBus connection
55+ to use for the object. Applications that use multiple DBus connections will need to
56+ ensure this method is called with the same connection that implements the object.
57+ ]]></dox:d>
58+ <arg name="surface" type="s" direction="in">
59+ <dox:d>The surface ID of the surface</dox:d>
60+ </arg>
61+ <arg name="menuObjectPath" type="o" direction="in">
62+ <dox:d>The dbus path where the gmenumodel interface for the surface menu has been exported</dox:d>
63+ </arg>
64+ <arg name="actionObjectPath" type="o" direction="in">
65+ <dox:d>The dbus path where the gactionmenu interface for the surface menu actions has been exported</dox:d>
66+ </arg>
67+ <arg name="service" type="s" direction="in">
68+ <dox:d>The dbus conection name of the client application to be registered (e.g. :1.23 or org.example.service)</dox:d>
69+ </arg>
70+ </method>
71+ <method name="UnregisterSurfaceMenu">
72+ <dox:d>
73+ A method to allow removing a surface menu from the database.
74+ </dox:d>
75+ <arg name="surfaceId" type="s" direction="in">
76+ <dox:d>The surface id of the surface</dox:d>
77+ </arg>
78+ <arg name="menuObjectPath" type="o" direction="in">
79+ <dox:d>The dbus path for the registered surface menu to be unregistered</dox:d>
80+ </arg>
81+ </method>
82+ </interface>
83+</node>
plugins/Unity/ApplicationMenu/dbusapplicationmenuregistry.cppnew file+44
@@ -0,0 +1,44 @@
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 "dbusapplicationmenuregistry.h"
18+#include "menuregistraradaptor.h"
19+
20+DBusApplicationMenuRegistry::DBusApplicationMenuRegistry(QObject *parent)
21+ : ApplicationMenuRegistry(parent)
22+{
23+ new MenuRegistrarAdaptor(this);
24+
25+ QDBusConnection connection = QDBusConnection::sessionBus();
26+ if (!connection.registerObject("/com/ubuntu/MenuRegistrar", this)) {
27+ qCWarning(UNITY_APPMENU) << "Unable to register DBus object /com/ubuntu/MenuRegistrar";
28+ }
29+ if (!connection.registerService("com.ubuntu.MenuRegistrar")) {
30+ qCWarning(UNITY_APPMENU) << "Unable to register DBus service com.ubuntu.MenuRegistrar";
31+ }
32+}
33+
34+DBusApplicationMenuRegistry::~DBusApplicationMenuRegistry()
35+{
36+ QDBusConnection connection = QDBusConnection::sessionBus();
37+ connection.unregisterObject("/com/ubuntu/MenuRegistrar");
38+}
39+
40+ApplicationMenuRegistry *DBusApplicationMenuRegistry::instance()
41+{
42+ static ApplicationMenuRegistry* reg(new DBusApplicationMenuRegistry());
43+ return reg;
44+}
tests/mocks/LightDM/IntegratedLightDM/MockUsersModel.h → plugins/Unity/ApplicationMenu/dbusapplicationmenuregistry.hrenamed+11−16
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 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
@@ -12,28 +12,23 @@
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− *
1615 */
1716
18−#ifndef MOCK_UNITY_USERSMODEL_H
19−#define MOCK_UNITY_USERSMODEL_H
17+#ifndef DBUSAPPLICATIONMENUREGISTRY_H
18+#define DBUSAPPLICATIONMENUREGISTRY_H
2019
21−#include <UsersModel.h>
20+#include "applicationmenuregistry.h"
2221
23−class MockUsersModel : public UsersModel
22+class DBusApplicationMenuRegistry : public ApplicationMenuRegistry,
23+ protected QDBusContext
2424{
2525 Q_OBJECT
26−
27− Q_PROPERTY(QString mockMode READ mockMode WRITE setMockMode NOTIFY mockModeChanged)
28−
2926public:
30− explicit MockUsersModel(QObject* parent=0);
31−
32− QString mockMode() const;
33− void setMockMode(QString mockMode);
27+ ~DBusApplicationMenuRegistry();
28+ static ApplicationMenuRegistry* instance();
3429
35−Q_SIGNALS:
36− void mockModeChanged(QString mode);
30+protected:
31+ explicit DBusApplicationMenuRegistry(QObject *parent = 0);
3732};
3833
39−#endif // MOCK_UNITY_USERSMODEL_H
34+#endif // DBUSAPPLICATIONMENUREGISTRY_H
plugins/Unity/ApplicationMenu/plugin.cppnew file+42
@@ -0,0 +1,42 @@
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 "plugin.h"
18+#include "dbusapplicationmenuregistry.h"
19+
20+#include <QtQml>
21+
22+static QObject *menuRegistry(QQmlEngine *engine, QJSEngine *scriptEngine)
23+{
24+ Q_UNUSED(engine)
25+ Q_UNUSED(scriptEngine)
26+ return DBusApplicationMenuRegistry::instance();
27+}
28+
29+void ApplicationMenuPlugin::registerTypes(const char *uri)
30+{
31+ Q_ASSERT(uri == QLatin1String("Unity.ApplicationMenu"));
32+
33+ qmlRegisterUncreatableType<MenuServicePath>(uri, 0, 1, "MenuServicePath", "You cannot create a MenuServicePath");
34+ qmlRegisterSingletonType<DBusApplicationMenuRegistry>(uri, 0, 1, "ApplicationMenuRegistry", menuRegistry);
35+}
36+
37+void ApplicationMenuPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
38+{
39+ QQmlExtensionPlugin::initializeEngine(engine, uri);
40+
41+ menuRegistry(nullptr, nullptr);
42+}
plugins/Ubuntu/Payments/plugin.h → plugins/Unity/ApplicationMenu/plugin.hrenamed+6−5
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 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,19 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−#ifndef PAYMENTS_PLUGIN_H
18−#define PAYMENTS_PLUGIN_H
17+#ifndef APPLICATIONMENU_PLUGIN_H
18+#define APPLICATIONMENU_PLUGIN_H
1919
2020#include <QQmlExtensionPlugin>
2121
22−class BackendPlugin : public QQmlExtensionPlugin
22+class ApplicationMenuPlugin : public QQmlExtensionPlugin
2323{
2424 Q_OBJECT
2525 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
2626
2727public:
2828 void registerTypes(const char *uri) override;
29+ void initializeEngine(QQmlEngine *engine, const char *uri) override;
2930};
3031
31−#endif // PAYMENTS_PLUGIN_H
32+#endif // APPLICATIONMENU_PLUGIN_H
plugins/Unity/ApplicationMenu/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Unity.ApplicationMenu
2+plugin ApplicationMenu-qml
3+typeinfo ApplicationMenu.qmltypes
plugins/Unity/CMakeLists.txt+1
@@ -1,3 +1,4 @@
1+add_subdirectory(ApplicationMenu)
12add_subdirectory(Connectivity)
23add_subdirectory(Indicators)
34add_subdirectory(Launcher)
plugins/Unity/DashCommunicator/CMakeLists.txt+1
@@ -1,5 +1,6 @@
11include_directories(
22 ${CMAKE_CURRENT_SOURCE_DIR}
3+ ${CMAKE_CURRENT_BINARY_DIR}
34 ${libunity8-private_SOURCE_DIR}
45)
56
plugins/Unity/DashCommunicator/dashconnection.cpp+3
@@ -32,6 +32,7 @@
3232 */
3333class AsyncDBusInterface : public QDBusAbstractInterface
3434{
35+ Q_OBJECT
3536public:
3637 AsyncDBusInterface(const QString &service, const QString &path,
3738 const QString &interface, const QDBusConnection &connection,
@@ -61,3 +62,5 @@ void DashConnection::setCurrentScope(int index, bool animate, bool isSwipe)
6162 dbusInterface()->asyncCall(QStringLiteral("SetCurrentScope"), index, animate, isSwipe);
6263 }
6364}
65+
66+#include "dashconnection.moc"
plugins/Unity/Indicators/CMakeLists.txt+3
@@ -11,6 +11,9 @@ include_directories(
1111include_directories(
1212 SYSTEM
1313 ${GLIB_INCLUDE_DIRS}
14+)
15+include_directories(
16+ SYSTEM
1417 ${GIO_INCLUDE_DIRS}
1518 ${QMENUMODEL_INCLUDE_DIRS}
1619)
plugins/Unity/Indicators/indicators.h+5−5
@@ -27,13 +27,13 @@ class UNITYINDICATORS_EXPORT ActionState : public QObject
2727{
2828 Q_OBJECT
2929public:
30− Q_ENUMS(ActionStates)
3130 enum ActionStates {
3231 Label = 0x00,
3332 IconSource = 0x01,
3433 AccessableName = 0x02,
3534 Visible = 0x03,
3635 };
36+ Q_ENUM(ActionStates)
3737
3838 ActionState(QObject*parent=0):QObject(parent) {}
3939};
@@ -42,11 +42,11 @@ class UNITYINDICATORS_EXPORT NetworkActionState : public QObject
4242{
4343 Q_OBJECT
4444public:
45− Q_ENUMS(NetworkActionStates)
4645 enum NetworkActionStates {
4746 Connection = 0x01,
4847 SignalStrength = 0x02,
4948 };
49+ Q_ENUM(NetworkActionStates)
5050
5151 NetworkActionState(QObject*parent=0):QObject(parent) {}
5252};
@@ -55,13 +55,13 @@ class UNITYINDICATORS_EXPORT NetworkConnection : public QObject
5555{
5656 Q_OBJECT
5757public:
58− Q_ENUMS(NetworkConnectionStates)
5958 enum NetworkConnectionStates {
6059 Initial = 0x00,
6160 Activating = 0x01,
6261 Activated = 0x02,
6362 Deactivating = 0x03,
6463 };
64+ Q_ENUM(NetworkConnectionStates)
6565
6666 NetworkConnection(QObject*parent=0):QObject(parent) {}
6767};
@@ -70,12 +70,12 @@ class UNITYINDICATORS_EXPORT IndicatorsModelRole : public QObject
7070{
7171 Q_OBJECT
7272public:
73− Q_ENUMS(Roles)
7473 enum Roles {
7574 Identifier = 0,
7675 Position,
7776 IndicatorProperties
7877 };
78+ Q_ENUM(Roles)
7979
8080 IndicatorsModelRole(QObject*parent=0):QObject(parent) {}
8181};
@@ -84,7 +84,6 @@ class UNITYINDICATORS_EXPORT FlatMenuProxyModelRole : public QObject
8484{
8585 Q_OBJECT
8686public:
87− Q_ENUMS(Roles)
8887 enum Roles {
8988 Action = Qt::DisplayRole + 1,
9089 Label,
@@ -93,6 +92,7 @@ public:
9392 hasSection,
9493 hasSubMenu
9594 };
95+ Q_ENUM(Roles)
9696
9797 FlatMenuProxyModelRole(QObject*parent=0):QObject(parent) {}
9898};
plugins/Unity/Indicators/indicatorsmanager.h−2
@@ -76,8 +76,6 @@ private:
7676 QSharedPointer<QFileSystemWatcher> m_fsWatcher;
7777 bool m_loaded;
7878 QString m_profile;
79−
80− Platform m_platform;
8179};
8280
8381#endif // INDICATORS_MANAGER_H
plugins/Unity/Indicators/indicatorsmodel.h−1
@@ -32,7 +32,6 @@ class IndicatorsManager;
3232class UNITYINDICATORS_EXPORT IndicatorsModel : public QAbstractListModel
3333{
3434 Q_OBJECT
35− Q_ENUMS(Roles)
3635 Q_PROPERTY(int count READ count NOTIFY countChanged)
3736 Q_PROPERTY(QString profile READ profile WRITE setProfile NOTIFY profileChanged)
3837
plugins/Unity/Indicators/sharedunitymenumodel.cpp+4
@@ -81,12 +81,16 @@ void SharedUnityMenuModel::initialize()
8181 }
8282 } else {
8383 QSharedPointer<UnityMenuModel> model = UnityMenuModelCache::singleton()->model(m_menuObjectPath);
84+
8485 if (model != m_model) {
8586 if (model->busName() != m_busName) model->setBusName(m_busName);
8687 if (model->actions() != m_actions) model->setActions(m_actions);
8788
8889 m_model = model;
8990 Q_EMIT modelChanged();
91+ } else if (m_model) {
92+ if (m_model->busName() != m_busName) m_model->setBusName(m_busName);
93+ if (m_model->actions() != m_actions) m_model->setActions(m_actions);
9094 }
9195 }
9296}
plugins/Unity/InputInfo/qinputinfo.h+2−3
@@ -57,8 +57,6 @@ class QInputDeviceManager;
5757class QInputDevice : public QObject
5858{
5959 Q_OBJECT
60− Q_ENUMS(InputType)
61− Q_FLAGS(InputType InputTypeFlags)
6260 friend class QInputDeviceManagerPrivate;
6361
6462public:
@@ -72,8 +70,9 @@ public:
7270 Keyboard = 16,
7371 Switch = 32
7472 };
75− Q_ENUMS(InputType)
73+ Q_FLAG(InputType)
7674 Q_DECLARE_FLAGS(InputTypeFlags, InputType)
75+ Q_FLAG(InputTypeFlags)
7776
7877 explicit QInputDevice(QObject *parent = 0);
7978 QString name() const;
plugins/Unity/Launcher/CMakeLists.txt+5−1
@@ -1,4 +1,3 @@
1−pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=10)
21pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
32
43add_definitions(-DSM_BUSNAME=systemBus)
@@ -25,13 +24,18 @@ set(QMLLAUNCHERPLUGIN_SRC
2524 dbusinterface.cpp
2625 gsettings.cpp
2726 asadapter.cpp
27+ appdrawermodel.cpp
28+ ualwrapper.cpp
2829 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
2930 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
3031 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
3132 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceListInterface.h
33+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
34+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
3235 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherItemInterface.h
3336 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherModelInterface.h
3437 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/QuickListModelInterface.h
38+ ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/AppDrawerModelInterface.h
3539 )
3640
3741add_library(UnityLauncher-qml MODULE
plugins/Unity/Launcher/appdrawermodel.cppnew file+62
@@ -0,0 +1,62 @@
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 "appdrawermodel.h"
18+#include "ualwrapper.h"
19+
20+#include <QDebug>
21+#include <QDateTime>
22+
23+AppDrawerModel::AppDrawerModel(QObject *parent):
24+ AppDrawerModelInterface(parent)
25+{
26+ Q_FOREACH (const QString &appId, UalWrapper::installedApps()) {
27+ UalWrapper::AppInfo info = UalWrapper::getApplicationInfo(appId);
28+ if (!info.valid) {
29+ qWarning() << "Failed to get app info for app" << appId;
30+ continue;
31+ }
32+ m_list.append(new LauncherItem(appId, info.name, info.icon, this));
33+ m_list.last()->setKeywords(info.keywords);
34+ }
35+ qsrand(QDateTime::currentMSecsSinceEpoch() / 100);
36+}
37+
38+int AppDrawerModel::rowCount(const QModelIndex &parent) const
39+{
40+ Q_UNUSED(parent)
41+ return m_list.count();
42+}
43+
44+QVariant AppDrawerModel::data(const QModelIndex &index, int role) const
45+{
46+ switch (role) {
47+ case RoleAppId:
48+ return m_list.at(index.row())->appId();
49+ case RoleName:
50+ return m_list.at(index.row())->name();
51+ case RoleIcon:
52+ return m_list.at(index.row())->icon();
53+ case RoleKeywords:
54+ return m_list.at(index.row())->keywords();
55+ case RoleUsage:
56+ // FIXME: u-a-l needs to provide API for usage stats.
57+ // don't forget to drop the qsrand() call in the ctor when dropping this.
58+ return qrand();
59+ }
60+
61+ return QVariant();
62+}
plugins/Ubuntu/SystemImage/plugin.h → plugins/Unity/Launcher/appdrawermodel.hrenamed+12−10
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 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,20 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−#ifndef SYSTEMIMAGE_PLUGIN_H
18−#define SYSTEMIMAGE_PLUGIN_H
1917
20−#include <QQmlExtensionPlugin>
18+#include <unity/shell/launcher/AppDrawerModelInterface.h>
2119
22−class BackendPlugin : public QQmlExtensionPlugin
20+#include "launcheritem.h"
21+
22+class AppDrawerModel: public AppDrawerModelInterface
2323{
2424 Q_OBJECT
25− Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
26−
2725public:
28− void registerTypes(const char *uri) override;
29−};
26+ AppDrawerModel(QObject* parent = nullptr);
3027
31−#endif // SYSTEMIMAGE_PLUGIN_H
28+ int rowCount(const QModelIndex &parent) const override;
29+ QVariant data(const QModelIndex &index, int role) const override;
30+
31+private:
32+ QList<LauncherItem*> m_list;
33+};
plugins/Unity/Launcher/launcheritem.cpp+43−6
@@ -35,7 +35,6 @@ 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),
3938 m_quickList(new QuickListModel(this))
4039{
4140 Q_ASSERT(parent != nullptr);
@@ -48,11 +47,13 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
4847 QuickListEntry pinningAction;
4948 pinningAction.setActionId(QStringLiteral("pin_item"));
5049 pinningAction.setText(gettext("Pin shortcut"));
50+ pinningAction.setIsPrivate(true);
5151 m_quickList->appendAction(pinningAction);
5252
5353 m_quitAction.setActionId(QStringLiteral("stop_item"));
5454 m_quitAction.setIcon(QStringLiteral("application-exit"));
5555 m_quitAction.setText(gettext("Quit"));
56+ m_quitAction.setIsPrivate(true);
5657}
5758
5859QString LauncherItem::appId() const
@@ -90,6 +91,19 @@ void LauncherItem::setIcon(const QString &icon)
9091 }
9192}
9293
94+QStringList LauncherItem::keywords() const
95+{
96+ return m_keywords;
97+}
98+
99+void LauncherItem::setKeywords(const QStringList &keywords)
100+{
101+ if (m_keywords != keywords) {
102+ m_keywords = keywords;
103+ Q_EMIT keywordsChanged(keywords);
104+ }
105+}
106+
93107bool LauncherItem::pinned() const
94108{
95109 return m_pinned;
@@ -107,6 +121,7 @@ void LauncherItem::setPinned(bool pinned)
107121 QuickListEntry entry;
108122 entry.setActionId(QStringLiteral("pin_item"));
109123 entry.setText(pinned ? gettext("Unpin shortcut") : gettext("Pin shortcut"));
124+ entry.setIsPrivate(true);
110125 m_quickList->updateAction(entry);
111126}
112127
@@ -208,14 +223,36 @@ void LauncherItem::setAlerting(bool alerting)
208223
209224int LauncherItem::surfaceCount() const
210225{
211− return m_surfaceCount;
226+ return m_surfaces.count();
212227}
213228
214−void LauncherItem::setSurfaceCount(int surfaceCount)
229+void LauncherItem::setSurfaces(const QList<QPair<QString, QString> > &surfaces)
215230{
216− if (m_surfaceCount != surfaceCount) {
217− m_surfaceCount = surfaceCount;
218− Q_EMIT surfaceCountChanged(surfaceCount);
231+ if (m_surfaces != surfaces) {
232+ m_surfaces = surfaces;
233+
234+ QList<QuickListEntry> removedEntries;
235+ for (int i = 0; i < m_quickList->rowCount(); ++i) {
236+ QuickListEntry entry = m_quickList->get(i);
237+ if (entry.actionId().startsWith(QStringLiteral("surface_"))) {
238+ removedEntries.append(entry);
239+ }
240+ }
241+ Q_FOREACH (const QuickListEntry &entry, removedEntries) {
242+ m_quickList->removeAction(entry);
243+ }
244+ for (int i = 0; i < surfaces.count(); ++i) {
245+ QuickListEntry entry;
246+ entry.setActionId(QStringLiteral("surface_") + surfaces.at(i).first);
247+ entry.setText(surfaces.at(i).second);
248+ entry.setIsPrivate(true);
249+ if (i == surfaces.count() - 1) {
250+ entry.setHasSeparator(true);
251+ }
252+ m_quickList->insertAction(entry, i + 1);
253+ }
254+
255+ Q_EMIT surfaceCountChanged(m_surfaces.count());
219256 }
220257}
221258
plugins/Unity/Launcher/launcheritem.h+7−2
@@ -23,6 +23,7 @@
2323#include "quicklistmodel.h"
2424
2525#include <unity/shell/launcher/LauncherItemInterface.h>
26+#include <unity/shell/application/MirSurfaceInterface.h>
2627
2728class QuickListModel;
2829
@@ -37,6 +38,7 @@ public:
3738 QString appId() const override;
3839 QString name() const override;
3940 QString icon() const override;
41+ QStringList keywords() const override;
4042 bool pinned() const override;
4143 bool running() const override;
4244 bool recent() const override;
@@ -52,6 +54,7 @@ public:
5254private:
5355 void setName(const QString &name);
5456 void setIcon(const QString &icon);
57+ void setKeywords(const QStringList &keywords);
5558 void setPinned(bool pinned);
5659 void setRunning(bool running);
5760 void setRecent(bool recent);
@@ -60,12 +63,13 @@ private:
6063 void setCountVisible(bool countVisible);
6164 void setFocused(bool focused);
6265 void setAlerting(bool alerting);
63− void setSurfaceCount(int surfaceCount);
66+ void setSurfaces(const QList<QPair<QString, QString >> &surfaces);
6467
6568private:
6669 QString m_appId;
6770 QString m_name;
6871 QString m_icon;
72+ QStringList m_keywords;
6973 bool m_pinned;
7074 bool m_running;
7175 bool m_recent;
@@ -74,11 +78,12 @@ private:
7478 bool m_countVisible;
7579 bool m_focused;
7680 bool m_alerting;
77− int m_surfaceCount;
81+ QList<QPair<QString, QString> > m_surfaces;
7882 QuickListModel *m_quickList;
7983 QuickListEntry m_quitAction;
8084
8185 friend class LauncherModel;
86+ friend class AppDrawerModel;
8287};
8388
8489#endif // LAUNCHERITEM_H
plugins/Unity/Launcher/launchermodel.cpp+56−52
@@ -19,18 +19,15 @@
1919#include "gsettings.h"
2020#include "dbusinterface.h"
2121#include "asadapter.h"
22+#include "ualwrapper.h"
2223
23−#include <ubuntu-app-launch/appid.h>
24−#include <ubuntu-app-launch/application.h>
25−#include <ubuntu-app-launch/registry.h>
2624#include <unity/shell/application/ApplicationInfoInterface.h>
2725#include <unity/shell/application/MirSurfaceListInterface.h>
26+#include <unity/shell/application/MirSurfaceInterface.h>
2827
2928#include <QDesktopServices>
3029#include <QDebug>
3130
32−namespace ual = ubuntu::app_launch;
33−
3431using namespace unity::shell::application;
3532
3633LauncherModel::LauncherModel(QObject *parent):
@@ -38,8 +35,7 @@ LauncherModel::LauncherModel(QObject *parent):
3835 m_settings(new GSettings(this)),
3936 m_dbusIface(new DBusInterface(this)),
4037 m_asAdapter(new ASAdapter()),
41− m_appManager(nullptr),
42− m_ualRegistry(std::make_shared<ual::Registry>())
38+ m_appManager(nullptr)
4339{
4440 connect(m_dbusIface, &DBusInterface::countChanged, this, &LauncherModel::countChanged);
4541 connect(m_dbusIface, &DBusInterface::countVisibleChanged, this, &LauncherModel::countVisibleChanged);
@@ -159,7 +155,7 @@ void LauncherModel::pin(const QString &appId, int index)
159155 index = m_list.count();
160156 }
161157
162− auto appInfo = getApplicationInfo(appId);
158+ UalWrapper::AppInfo appInfo = UalWrapper::getApplicationInfo(appId);
163159 if (!appInfo.valid) {
164160 qWarning() << "Can't pin application, appId not found:" << appId;
165161 return;
@@ -203,12 +199,26 @@ void LauncherModel::quickListActionInvoked(const QString &appId, int actionIndex
203199 } else {
204200 pin(appId);
205201 }
206− } else if (actionId == QLatin1String("launch_item")) {
202+ } else if (actionId == QStringLiteral("launch_item")) {
207203 QDesktopServices::openUrl(getUrlForAppId(appId));
208− } else if (actionId == QLatin1String("stop_item")) { // Quit
204+ } else if (actionId == QStringLiteral("stop_item")) { // Quit
209205 if (m_appManager) {
210206 m_appManager->stopApplication(appId);
211207 }
208+ } else if (actionId.startsWith(QStringLiteral("surface_"))){
209+ ApplicationInfoInterface *appInfo = m_appManager->findApplication(appId);
210+ if (appInfo) {
211+ for (int i = 0; i < appInfo->surfaceList()->count(); ++i) {
212+ MirSurfaceInterface *iface = appInfo->surfaceList()->get(i);
213+ QString id = actionId;
214+ id.remove(QRegExp("^surface_"));
215+ if (id == iface->persistentId()) {
216+ iface->activate();
217+ }
218+ }
219+ } else {
220+ qWarning() << "App for" << appId << "not found in launcher. Cannot invoke quicklist action";
221+ }
212222 // Nope, we don't know this action, let the backend forward it to the application
213223 } else {
214224 // TODO: forward quicklist action to app, possibly via m_dbusIface
@@ -219,7 +229,6 @@ void LauncherModel::quickListActionInvoked(const QString &appId, int actionIndex
219229void LauncherModel::setUser(const QString &username)
220230{
221231 Q_UNUSED(username)
222− qWarning() << "This backend doesn't support multiple users";
223232}
224233
225234QString LauncherModel::getUrlForAppId(const QString &appId) const
@@ -335,32 +344,6 @@ int LauncherModel::findApplication(const QString &appId)
335344 return -1;
336345}
337346
338−LauncherModel::AppInfo LauncherModel::getApplicationInfo(const QString &appId)
339−{
340− AppInfo info;
341−
342− ual::AppID ualAppId = ual::AppID::find(m_ualRegistry, appId.toStdString());
343− if (ualAppId.empty()) {
344− return info;
345− }
346−
347− std::shared_ptr<ual::Application> ualApp;
348− try
349− {
350− ualApp = ual::Application::create(ualAppId, m_ualRegistry);
351− }
352− catch (std::runtime_error &e)
353− {
354− qWarning() << "Couldn't find application info for" << appId << "-" << e.what();
355− return info;
356− }
357−
358− info.valid = true;
359− info.name = QString::fromStdString(ualApp->info()->name());
360− info.icon = QString::fromStdString(ualApp->info()->iconPath());
361− return info;
362−}
363−
364347void LauncherModel::progressChanged(const QString &appId, int progress)
365348{
366349 const int idx = findApplication(appId);
@@ -408,7 +391,7 @@ void LauncherModel::countVisibleChanged(const QString &appId, bool countVisible)
408391 }
409392 } else {
410393 // Need to create a new LauncherItem and show the highlight
411− auto appInfo = getApplicationInfo(appId);
394+ UalWrapper::AppInfo appInfo = UalWrapper::getApplicationInfo(appId);
412395 if (countVisible && appInfo.valid) {
413396 LauncherItem *item = new LauncherItem(appId,
414397 appInfo.name,
@@ -428,7 +411,7 @@ void LauncherModel::refresh()
428411 // First walk through all the existing items and see if we need to remove something
429412 QList<LauncherItem*> toBeRemoved;
430413 Q_FOREACH (LauncherItem* item, m_list) {
431− auto appInfo = getApplicationInfo(item->appId());
414+ UalWrapper::AppInfo appInfo = UalWrapper::getApplicationInfo(item->appId());
432415 if (!appInfo.valid) {
433416 // Application no longer available => drop it!
434417 toBeRemoved << item;
@@ -480,7 +463,7 @@ void LauncherModel::refresh()
480463 if (itemIndex == -1) {
481464 // Need to add it. Just add it into the addedIndex to keep same ordering as the list
482465 // in the settings.
483− auto appInfo = getApplicationInfo(entry);
466+ UalWrapper::AppInfo appInfo = UalWrapper::getApplicationInfo(entry);
484467 if (!appInfo.valid) {
485468 continue;
486469 }
@@ -549,40 +532,61 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
549532 item->setRecent(true);
550533 Q_EMIT dataChanged(index(itemIndex), index(itemIndex), {RoleRecent});
551534 }
552− if (item->surfaceCount() != app->surfaceCount()) {
553− item->setSurfaceCount(app->surfaceCount());
554− Q_EMIT dataChanged(index(itemIndex), index(itemIndex), {RoleSurfaceCount});
555− }
556−
557535 item->setRunning(true);
558536 } else {
559537 LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString(), this);
560538 item->setRecent(true);
561539 item->setRunning(true);
562540 item->setFocused(app->focused());
563− item->setSurfaceCount(app->surfaceCount());
564541 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
565542 m_list.append(item);
566543 endInsertRows();
567544 }
568− connect(app, &ApplicationInfoInterface::surfaceCountChanged, this, &LauncherModel::applicationSurfaceCountChanged);
545+ connect(app, &ApplicationInfoInterface::surfaceCountChanged, this, &LauncherModel::updateSurfaceList);
569546 m_asAdapter->syncItems(m_list);
570547 Q_EMIT dataChanged(index(itemIndex), index(itemIndex), {RoleRunning});
571548}
572549
573−void LauncherModel::applicationSurfaceCountChanged(int count)
550+void LauncherModel::updateSurfaceList()
574551{
575552 ApplicationInfoInterface *app = static_cast<ApplicationInfoInterface*>(sender());
553+ updateSurfaceListForApp(app);
554+}
555+
556+void LauncherModel::updateSurfaceListForSurface()
557+{
558+ MirSurfaceInterface *iface = static_cast<MirSurfaceInterface*>(sender());
559+ ApplicationInfoInterface* app = m_appManager->findApplication(iface->appId());
560+ if (!app) {
561+ return;
562+ }
563+ updateSurfaceListForApp(app);
564+}
565+
566+void LauncherModel::updateSurfaceListForApp(ApplicationInfoInterface* app)
567+{
576568 int idx = findApplication(app->appId());
577569 if (idx < 0) {
578570 qWarning() << "Received a surface count changed event from an app that's not in the Launcher model";
579571 return;
580572 }
581573 LauncherItem *item = m_list.at(idx);
582− if (item->surfaceCount() != count) {
583− item->setSurfaceCount(count);
584− Q_EMIT dataChanged(index(idx), index(idx), {RoleSurfaceCount});
574+ QList<QPair<QString, QString> > surfaces;
575+ for (int i = 0; i < app->surfaceList()->count(); ++i) {
576+ MirSurfaceInterface* iface = app->surfaceList()->get(i);
577+ if (iface->type() == Mir::NormalType || iface->type() == Mir::DialogType) {
578+ // Avoid duplicate connections, so let's just disconnect first to be sure
579+ disconnect(iface, &MirSurfaceInterface::nameChanged, this, &LauncherModel::updateSurfaceListForSurface);
580+ connect(iface, &MirSurfaceInterface::nameChanged, this, &LauncherModel::updateSurfaceListForSurface);
581+ QString name = iface->name();
582+ if (name.isEmpty()) {
583+ name = app->name();
584+ }
585+ surfaces.append({iface->persistentId(), name});
586+ }
585587 }
588+ item->setSurfaces(surfaces);
589+ Q_EMIT dataChanged(index(idx), index(idx), {RoleSurfaceCount});
586590}
587591
588592void LauncherModel::applicationRemoved(const QModelIndex &parent, int row)
@@ -603,7 +607,7 @@ void LauncherModel::applicationRemoved(const QModelIndex &parent, int row)
603607 return;
604608 }
605609
606− disconnect(app, &ApplicationInfoInterface::surfaceCountChanged, this, &LauncherModel::applicationSurfaceCountChanged);
610+ disconnect(app, &ApplicationInfoInterface::surfaceCountChanged, this, &LauncherModel::updateSurfaceList);
607611
608612 LauncherItem * item = m_list.at(appIndex);
609613
plugins/Unity/Launcher/launchermodel.h+3−15
@@ -27,12 +27,6 @@ class GSettings;
2727class DBusInterface;
2828class ASAdapter;
2929
30−namespace ubuntu {
31− namespace app_launch {
32− class Registry;
33− }
34−}
35−
3630using namespace unity::shell::launcher;
3731using namespace unity::shell::application;
3832
@@ -73,13 +67,6 @@ private:
7367
7468 void unpin(const QString &appId);
7569
76− struct AppInfo {
77− bool valid = false;
78− QString name;
79− QString icon;
80− };
81− AppInfo getApplicationInfo(const QString &appId);
82−
8370private Q_SLOTS:
8471 void countChanged(const QString &appId, int count);
8572 void countVisibleChanged(const QString &appId, bool count);
@@ -88,7 +75,9 @@ private Q_SLOTS:
8875 void applicationAdded(const QModelIndex &parent, int row);
8976 void applicationRemoved(const QModelIndex &parent, int row);
9077 void focusedAppIdChanged();
91− void applicationSurfaceCountChanged(int);
78+ void updateSurfaceList();
79+ void updateSurfaceListForApp(ApplicationInfoInterface *app);
80+ void updateSurfaceListForSurface();
9281
9382private:
9483 QList<LauncherItem*> m_list;
@@ -98,7 +87,6 @@ private:
9887 ASAdapter *m_asAdapter;
9988
10089 ApplicationManagerInterface *m_appManager;
101− std::shared_ptr<ubuntu::app_launch::Registry> m_ualRegistry;
10290
10391 friend class LauncherModelTest;
10492};
plugins/Unity/Launcher/plugin.cpp+2−1
@@ -26,7 +26,7 @@
2626// local
2727#include "launchermodel.h"
2828#include "launcheritem.h"
29−
29+#include "appdrawermodel.h"
3030
3131using namespace unity::shell::launcher;
3232
@@ -46,4 +46,5 @@ void UnityLauncherPlugin::registerTypes(const char *uri)
4646 qmlRegisterSingletonType<LauncherModel>(uri, 0, 1, "LauncherModel", modelProvider);
4747 qmlRegisterUncreatableType<LauncherItem>(uri, 0, 1, "LauncherItem", QStringLiteral("Can't create new Launcher Items in QML. Get them from the LauncherModel."));
4848 qmlRegisterUncreatableType<QuickListModel>(uri, 0, 1, "QuickListModel", QStringLiteral("Can't create a QuickListModel in QML. Get them from the LauncherItems."));
49+ qmlRegisterType<AppDrawerModel>(uri, 0, 1, "AppDrawerModel");
4950}
plugins/Unity/Launcher/quicklistentry.cpp+11
@@ -20,6 +20,7 @@
2020
2121QuickListEntry::QuickListEntry()
2222 : m_hasSeparator(false)
23+ , m_isPrivate(false)
2324{
2425}
2526
@@ -72,3 +73,13 @@ bool QuickListEntry::operator==(const QuickListEntry &other)
7273{
7374 return !other.actionId().isEmpty() && other.actionId() == m_actionId;
7475}
76+
77+bool QuickListEntry::isPrivate() const
78+{
79+ return m_isPrivate;
80+}
81+
82+void QuickListEntry::setIsPrivate(bool isPrivate)
83+{
84+ m_isPrivate = isPrivate;
85+}
plugins/Unity/Launcher/quicklistentry.h+4
@@ -42,11 +42,15 @@ public:
4242
4343 bool operator==(const QuickListEntry & other);
4444
45+ bool isPrivate() const;
46+ void setIsPrivate(bool isPrivate);
47+
4548private:
4649 QString m_actionId;
4750 QString m_text;
4851 QString m_icon;
4952 bool m_hasSeparator;
53+ bool m_isPrivate;
5054};
5155
5256#endif // QUICKLISTENTRY
plugins/Unity/Launcher/quicklistmodel.cpp+9
@@ -37,6 +37,13 @@ void QuickListModel::appendAction(const QuickListEntry &entry)
3737 endInsertRows();
3838}
3939
40+void QuickListModel::insertAction(const QuickListEntry &entry, int index)
41+{
42+ beginInsertRows(QModelIndex(), index, index);
43+ m_list.insert(index, entry);
44+ endInsertRows();
45+}
46+
4047void QuickListModel::updateAction(const QuickListEntry &entry)
4148{
4249 for (int i = 0; i < m_list.count(); ++i) {
@@ -81,6 +88,8 @@ QVariant QuickListModel::data(const QModelIndex &index, int role) const
8188 return m_list.at(index.row()).clickable();
8289 case RoleHasSeparator:
8390 return m_list.at(index.row()).hasSeparator();
91+ case RoleIsPrivate:
92+ return m_list.at(index.row()).isPrivate();
8493 }
8594 return QVariant();
8695}
plugins/Unity/Launcher/quicklistmodel.h+1
@@ -36,6 +36,7 @@ public:
3636 ~QuickListModel();
3737
3838 void appendAction(const QuickListEntry &entry);
39+ void insertAction(const QuickListEntry &entry, int index);
3940
4041 /**
4142 * @brief Update an existing action
plugins/Unity/Launcher/ualwrapper.cppnew file+73
@@ -0,0 +1,73 @@
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 <QDebug>
18+
19+#include "ualwrapper.h"
20+
21+#include <ubuntu-app-launch/registry.h>
22+using namespace ubuntu::app_launch;
23+
24+UalWrapper::UalWrapper(QObject *parent):
25+ QObject(parent)
26+{
27+
28+}
29+
30+QStringList UalWrapper::installedApps()
31+{
32+ QStringList appIds;
33+ try {
34+ for (const std::shared_ptr<Application> &app : Registry::installedApps()) {
35+ if (!app->appId().package.value().empty()) {
36+ appIds << QString::fromStdString(app->appId().package.value() + "_" + app->appId().appname.value());
37+ } else {
38+ appIds << QString::fromStdString(app->appId().appname);
39+ }
40+ }
41+ } catch (const std::runtime_error &e) {
42+ qWarning() << "ubuntu-all-launch threw an exception listing apps:" << e.what();
43+ }
44+
45+ return appIds;
46+}
47+
48+UalWrapper::AppInfo UalWrapper::getApplicationInfo(const QString &appId)
49+{
50+ AppInfo info;
51+
52+ try {
53+ AppID ualAppId = AppID::find(appId.toStdString());
54+ if (ualAppId.empty()) {
55+ qWarning() << "Empty ualAppId result for" << appId;
56+ return info;
57+ }
58+
59+ std::shared_ptr<Application> ualApp;
60+ ualApp = Application::create(ualAppId, Registry::getDefault());
61+
62+ info.name = QString::fromStdString(ualApp->info()->name());
63+ info.icon = QString::fromStdString(ualApp->info()->iconPath());
64+ for (const std::string &keyword : ualApp->info()->keywords().value()) {
65+ info.keywords << QString::fromStdString(keyword);
66+ }
67+ info.valid = true;
68+ } catch (const std::runtime_error &e) {
69+ qWarning() << "ubuntu-app-launch threw an exception getting app info for appId:" << appId << ":" << e.what();
70+ }
71+
72+ return info;
73+}
tests/mocks/LightDM/IntegratedLightDM/plugin.h → plugins/Unity/Launcher/ualwrapper.hrenamed+15−12
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014, 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,19 +14,22 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−#ifndef MOCK_LIGHTDM_PLUGIN_H
18−#define MOCK_LIGHTDM_PLUGIN_H
17+#include <QObject>
1918
20−#include <QtQml/QQmlEngine>
21−#include <QtQml/QQmlExtensionPlugin>
22−
23−class LightDMPlugin : public QQmlExtensionPlugin
19+class UalWrapper: public QObject
2420{
2521 Q_OBJECT
26− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27−
2822public:
29− void registerTypes(const char *uri) override;
30−};
23+ struct AppInfo {
24+ bool valid = false;
25+ QString name;
26+ QString icon;
27+ QStringList keywords;
28+ };
3129
32−#endif
30+ UalWrapper(QObject* parent = nullptr);
31+
32+ static QStringList installedApps();
33+ static AppInfo getApplicationInfo(const QString &appId);
34+
35+};
plugins/Unity/Platform/platform.cpp+16−2
@@ -17,9 +17,11 @@
1717#include "platform.h"
1818
1919#include <QDBusConnection>
20+#include <QSet>
21+#include <QString>
2022
2123Platform::Platform(QObject *parent)
22− : QObject(parent)
24+ : QObject(parent), m_isPC(true), m_isMultiSession(true)
2325{
2426 QMetaObject::invokeMethod(this, "init");
2527}
@@ -31,8 +33,20 @@ void Platform::init()
3133 QDBusInterface seatIface("org.freedesktop.login1", "/org/freedesktop/login1/seat/self", "org.freedesktop.login1.Seat",
3234 QDBusConnection::systemBus(), this);
3335
36+ // From the source at https://cgit.freedesktop.org/systemd/systemd/tree/src/hostname/hostnamed.c#n130
37+ // "vm\0"
38+ // "container\0"
39+ // "desktop\0"
40+ // "laptop\0"
41+ // "server\0"
42+ // "tablet\0"
43+ // "handset\0"
44+ // "watch\0"
45+ // "embedded\0",
3446 m_chassis = iface.property("Chassis").toString();
35− m_isPC = (m_chassis == "desktop" || m_chassis == "laptop" || m_chassis == "server");
47+
48+ // A PC is not a handset, tablet or watch.
49+ m_isPC = !QSet<QString>{"handset", "tablet", "watch"}.contains(m_chassis);
3650 m_isMultiSession = seatIface.property("CanMultiSession").toBool() && seatIface.property("CanGraphical").toBool();
3751}
3852
plugins/Unity/Session/dbusunitysessionservice.cpp+75−4
@@ -18,6 +18,7 @@
1818#include "dbusunitysessionservice.h"
1919
2020// system
21+#include <grp.h>
2122#include <sys/types.h>
2223#include <unistd.h>
2324#include <pwd.h>
@@ -211,6 +212,23 @@ public:
211212 QDBusConnection::SM_BUSNAME().asyncCall(msg);
212213 }
213214
215+ bool isUserInGroup(const QString &user, const QString &groupName) const
216+ {
217+ auto group = getgrnam(groupName.toUtf8().data());
218+
219+ if (group && group->gr_mem)
220+ {
221+ for (int i = 0; group->gr_mem[i]; ++i)
222+ {
223+ if (g_strcmp0(group->gr_mem[i], user.toUtf8().data()) == 0) {
224+ return true;
225+ }
226+ }
227+ }
228+
229+ return false;
230+ }
231+
214232private Q_SLOTS:
215233 void onPropertiesChanged(const QString &iface, const QVariantMap &changedProps, const QStringList &invalidatedProps)
216234 {
@@ -297,7 +315,13 @@ bool DBusUnitySessionService::CanShutdown() const
297315
298316bool DBusUnitySessionService::CanLock() const
299317{
300− return true; // FIXME
318+ auto user = UserName();
319+ if (user.startsWith(QStringLiteral("guest-")) ||
320+ d->isUserInGroup(user, QStringLiteral("nopasswdlogin"))) {
321+ return false;
322+ } else {
323+ return true;
324+ }
301325}
302326
303327QString DBusUnitySessionService::UserName() const
@@ -335,8 +359,10 @@ void DBusUnitySessionService::PromptLock()
335359 // Prompt as in quick. No locking animation needed. Usually used by
336360 // indicator-session in combination with a switch to greeter or other
337361 // user session.
338− Q_EMIT LockRequested();
339− Q_EMIT lockRequested();
362+ if (CanLock()) {
363+ Q_EMIT LockRequested();
364+ Q_EMIT lockRequested();
365+ }
340366}
341367
342368void DBusUnitySessionService::Lock()
@@ -468,11 +494,56 @@ void performAsyncUnityCall(const QString &method)
468494
469495
470496DBusGnomeSessionManagerWrapper::DBusGnomeSessionManagerWrapper()
497+ : UnityDBusObject(QStringLiteral("/org/gnome/SessionManager"), QStringLiteral("org.gnome.SessionManager"))
498+{
499+}
500+
501+void DBusGnomeSessionManagerWrapper::Logout(quint32 mode)
502+{
503+ auto call = QStringLiteral("RequestLogout");
504+
505+ // These modes are documented as bitwise flags, not an enum, even though
506+ // they only ever seem to be used as enums.
507+
508+ if (mode & 1) // without dialog
509+ call = QStringLiteral("Logout");
510+ if (mode & 2) // without dialog, ignoring inhibitors (which we don't have)
511+ call = QStringLiteral("Logout");
512+
513+ performAsyncUnityCall(call);
514+}
515+
516+void DBusGnomeSessionManagerWrapper::Reboot()
517+{
518+ // GNOME's Reboot means with dialog (they use Request differently than us).
519+ performAsyncUnityCall(QStringLiteral("RequestReboot"));
520+}
521+
522+void DBusGnomeSessionManagerWrapper::RequestReboot()
523+{
524+ // GNOME's RequestReboot means no dialog (they use Request differently than us).
525+ performAsyncUnityCall(QStringLiteral("Reboot"));
526+}
527+
528+void DBusGnomeSessionManagerWrapper::RequestShutdown()
529+{
530+ // GNOME's RequestShutdown means no dialog (they use Request differently than us).
531+ performAsyncUnityCall(QStringLiteral("Shutdown"));
532+}
533+
534+void DBusGnomeSessionManagerWrapper::Shutdown()
535+{
536+ // GNOME's Shutdown means with dialog (they use Request differently than us).
537+ performAsyncUnityCall(QStringLiteral("RequestShutdown"));
538+}
539+
540+
541+DBusGnomeSessionManagerDialogWrapper::DBusGnomeSessionManagerDialogWrapper()
471542 : UnityDBusObject(QStringLiteral("/org/gnome/SessionManager/EndSessionDialog"), QStringLiteral("com.canonical.Unity"))
472543{
473544}
474545
475−void DBusGnomeSessionManagerWrapper::Open(const unsigned type, const unsigned arg_1, const unsigned max_wait, const QList<QDBusObjectPath> &inhibitors)
546+void DBusGnomeSessionManagerDialogWrapper::Open(const unsigned type, const unsigned arg_1, const unsigned max_wait, const QList<QDBusObjectPath> &inhibitors)
476547{
477548 Q_UNUSED(arg_1);
478549 Q_UNUSED(max_wait);
plugins/Unity/Session/dbusunitysessionservice.h+18−4
@@ -270,17 +270,31 @@ private:
270270class DBusGnomeSessionManagerWrapper : public UnityDBusObject
271271{
272272 Q_OBJECT
273− Q_CLASSINFO("D-Bus Interface", "org.gnome.SessionManager.EndSessionDialog")
273+ Q_CLASSINFO("D-Bus Interface", "org.gnome.SessionManager")
274274
275275public:
276276 DBusGnomeSessionManagerWrapper();
277277 ~DBusGnomeSessionManagerWrapper() = default;
278278
279279public Q_SLOTS:
280− Q_SCRIPTABLE void Open(const unsigned int type, const unsigned int arg_1, const unsigned int max_wait, const QList<QDBusObjectPath> &inhibitors);
280+ Q_SCRIPTABLE void Logout(quint32 mode);
281+ Q_SCRIPTABLE void Reboot();
282+ Q_SCRIPTABLE void RequestReboot();
283+ Q_SCRIPTABLE void RequestShutdown();
284+ Q_SCRIPTABLE void Shutdown();
285+};
281286
282−private:
283− void performAsyncCall(const QString &method);
287+class DBusGnomeSessionManagerDialogWrapper : public UnityDBusObject
288+{
289+ Q_OBJECT
290+ Q_CLASSINFO("D-Bus Interface", "org.gnome.SessionManager.EndSessionDialog")
291+
292+public:
293+ DBusGnomeSessionManagerDialogWrapper();
294+ ~DBusGnomeSessionManagerDialogWrapper() = default;
295+
296+public Q_SLOTS:
297+ Q_SCRIPTABLE void Open(const unsigned int type, const unsigned int arg_1, const unsigned int max_wait, const QList<QDBusObjectPath> &inhibitors);
284298};
285299
286300class DBusGnomeScreensaverWrapper: public UnityDBusObject
plugins/Unity/Session/plugin.cpp+1
@@ -26,6 +26,7 @@
2626
2727static QObject *dbusunitysessionservice_provider(QQmlEngine */*engine*/, QJSEngine */*jsEngine*/)
2828{
29+ new DBusGnomeSessionManagerDialogWrapper();
2930 new DBusGnomeSessionManagerWrapper();
3031 new DBusGnomeScreensaverWrapper();
3132 new DBusScreensaverWrapper();
plugins/Utils/CMakeLists.txt+7
@@ -15,6 +15,10 @@ set(QMLPLUGIN_SRC
1515 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
1616 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
1717 applicationsfiltermodel.cpp
18+ ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/AppDrawerModelInterface.h
19+ ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherItemInterface.h
20+ ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherModelInterface.h
21+ appdrawerproxymodel.cpp
1822 constants.cpp
1923 WindowInputMonitor.cpp
2024 inputwatcher.cpp
@@ -30,6 +34,9 @@ set(QMLPLUGIN_SRC
3034 deviceconfigparser.cpp
3135 globalfunctions.cpp
3236 URLDispatcher.cpp
37+ tabfocusfence.cpp
38+ expressionfiltermodel.cpp
39+ quicklistproxymodel.cpp
3340 plugin.cpp
3441 )
3542
plugins/Utils/ElapsedTimer.h+1−1
@@ -41,7 +41,7 @@ class ElapsedTimer : public AbstractElapsedTimer {
4141public:
4242 void start() override { m_timer.start(); }
4343 qint64 msecsSinceReference() const override { return m_timer.msecsSinceReference(); }
44− qint64 elapsed() const override { return m_timer.elapsed(); }
44+ qint64 elapsed() const override { return m_timer.isValid() ? m_timer.elapsed() : 0; }
4545private:
4646 QElapsedTimer m_timer;
4747};
plugins/Utils/Timer.cpp+5−2
@@ -37,13 +37,16 @@ void Timer::setInterval(int msecs)
3737void Timer::start()
3838{
3939 m_timer.start();
40− AbstractTimer::start();
4140}
4241
4342void Timer::stop()
4443{
4544 m_timer.stop();
46− AbstractTimer::stop();
45+}
46+
47+bool Timer::isRunning() const
48+{
49+ return m_timer.isActive();
4750}
4851
4952bool Timer::isSingleShot() const
plugins/Utils/Timer.h+5−6
@@ -30,18 +30,16 @@ class AbstractTimer : public QObject
3030{
3131 Q_OBJECT
3232public:
33− AbstractTimer(QObject *parent) : QObject(parent), m_isRunning(false) {}
33+ AbstractTimer(QObject *parent) : QObject(parent) {}
3434 virtual int interval() const = 0;
3535 virtual void setInterval(int msecs) = 0;
36− virtual void start() { m_isRunning = true; }
37− virtual void stop() { m_isRunning = false; }
38− bool isRunning() const { return m_isRunning; }
36+ virtual void start() = 0;
37+ virtual void stop() = 0;
38+ virtual bool isRunning() const = 0;
3939 virtual bool isSingleShot() const = 0;
4040 virtual void setSingleShot(bool value) = 0;
4141Q_SIGNALS:
4242 void timeout();
43−private:
44− bool m_isRunning;
4543};
4644
4745/** A QTimer wrapper */
@@ -55,6 +53,7 @@ public:
5553 void setInterval(int msecs) override;
5654 void start() override;
5755 void stop() override;
56+ bool isRunning() const override;
5857 bool isSingleShot() const override;
5958 void setSingleShot(bool value) override;
6059private:
plugins/Utils/URLDispatcher.cpp+5−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2016 Canonical, Ltd.
2+ * Copyright (C) 2016-2017 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,6 +17,7 @@
1717#include "URLDispatcher.h"
1818
1919#include <QDBusConnection>
20+#include <QDebug>
2021
2122class URLDispatcherInterface : public QObject
2223{
@@ -63,7 +64,9 @@ void URLDispatcher::setActive(bool value)
6364 connection.registerObject(QStringLiteral("/com/canonical/URLDispatcher"),
6465 dispatcher,
6566 QDBusConnection::ExportScriptableContents);
66− connection.registerService(QStringLiteral("com.canonical.URLDispatcher"));
67+ if (!connection.registerService(QStringLiteral("com.canonical.URLDispatcher"))) {
68+ qWarning() << "Unable to register DBus service com.canonical.URLDispatcher";
69+ }
6770 m_dispatcher = dispatcher;
6871 } else {
6972 connection.unregisterService(QStringLiteral("com.canonical.URLDispatcher"));
plugins/Utils/WindowInputMonitor.cpp+3
@@ -73,6 +73,9 @@ void WindowInputMonitor::update(QEvent *event)
7373 && m_windowLastTouchedTimer->elapsed() >= msecsWithoutTouches) {
7474 m_pressedHomeKey = keyEvent->key();
7575 m_activationTimer->start();
76+ } else if (m_pressedHomeKey != 0 && !m_homeKeys.contains(keyEvent->key())) {
77+ // something else came in... cancel activation
78+ m_activationTimer->stop();
7679 }
7780
7881 } else if (event->type() == QEvent::KeyRelease) {
plugins/Utils/appdrawerproxymodel.cppnew file+189
@@ -0,0 +1,189 @@
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 "appdrawerproxymodel.h"
18+
19+#include <unity/shell/launcher/LauncherItemInterface.h>
20+
21+#include <QDebug>
22+
23+AppDrawerProxyModel::AppDrawerProxyModel(QObject *parent):
24+ QSortFilterProxyModel(parent)
25+{
26+ setSortRole(AppDrawerModelInterface::RoleName);
27+ setSortLocaleAware(true);
28+ sort(0);
29+
30+ connect(this, &QAbstractListModel::rowsInserted, this, &AppDrawerProxyModel::countChanged);
31+ connect(this, &QAbstractListModel::rowsRemoved, this, &AppDrawerProxyModel::countChanged);
32+ connect(this, &QAbstractListModel::layoutChanged, this, &AppDrawerProxyModel::countChanged);
33+}
34+
35+QAbstractItemModel *AppDrawerProxyModel::source() const
36+{
37+ return m_source;
38+}
39+
40+void AppDrawerProxyModel::setSource(QAbstractItemModel *source)
41+{
42+ if (m_source != source) {
43+ m_source = source;
44+ setSourceModel(m_source);
45+ setSortRole(m_sortBy == SortByAToZ ? AppDrawerModelInterface::RoleName : AppDrawerModelInterface::RoleUsage);
46+ connect(m_source, &QAbstractItemModel::rowsRemoved, this, &AppDrawerProxyModel::invalidate);
47+ connect(m_source, &QAbstractItemModel::rowsInserted, this, &AppDrawerProxyModel::invalidate);
48+ Q_EMIT sourceChanged();
49+ }
50+}
51+
52+AppDrawerProxyModel::GroupBy AppDrawerProxyModel::group() const
53+{
54+ return m_group;
55+}
56+
57+void AppDrawerProxyModel::setGroup(AppDrawerProxyModel::GroupBy group)
58+{
59+ if (m_group != group) {
60+ m_group = group;
61+ Q_EMIT groupChanged();
62+ invalidateFilter();
63+ }
64+}
65+
66+QString AppDrawerProxyModel::filterLetter() const
67+{
68+ return m_filterLetter;
69+}
70+
71+void AppDrawerProxyModel::setFilterLetter(const QString &filterLetter)
72+{
73+ if (m_filterLetter != filterLetter) {
74+ m_filterLetter = filterLetter;
75+ Q_EMIT filterLetterChanged();
76+ invalidateFilter();
77+ }
78+}
79+
80+QString AppDrawerProxyModel::filterString() const
81+{
82+ return m_filterString;
83+}
84+
85+void AppDrawerProxyModel::setFilterString(const QString &filterString)
86+{
87+ if (m_filterString != filterString) {
88+ m_filterString = filterString;
89+ Q_EMIT filterStringChanged();
90+ invalidateFilter();
91+ }
92+}
93+
94+AppDrawerProxyModel::SortBy AppDrawerProxyModel::sortBy() const
95+{
96+ return m_sortBy;
97+}
98+
99+void AppDrawerProxyModel::setSortBy(AppDrawerProxyModel::SortBy sortBy)
100+{
101+ if (m_sortBy != sortBy) {
102+ m_sortBy = sortBy;
103+ Q_EMIT sortByChanged();
104+ setSortRole(m_sortBy == SortByAToZ ? AppDrawerModelInterface::RoleName : AppDrawerModelInterface::RoleUsage);
105+ sort(0);
106+ }
107+}
108+
109+int AppDrawerProxyModel::count() const
110+{
111+ return rowCount();
112+}
113+
114+QVariant AppDrawerProxyModel::data(const QModelIndex &index, int role) const
115+{
116+ QModelIndex idx = mapToSource(index);
117+ if (role == Qt::UserRole) {
118+ QString name = m_source->data(idx, AppDrawerModelInterface::RoleName).toString();
119+ return name.length() > 0 ? QString(name.at(0)).toUpper() : QChar();
120+ }
121+ return m_source->data(idx, role);
122+}
123+
124+QHash<int, QByteArray> AppDrawerProxyModel::roleNames() const
125+{
126+ if (m_source) {
127+ QHash<int, QByteArray> roles = m_source->roleNames();
128+ roles.insert(Qt::UserRole, "letter");
129+ return roles;
130+ }
131+ return QHash<int, QByteArray>();
132+}
133+
134+bool AppDrawerProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
135+{
136+ Q_UNUSED(source_parent)
137+
138+ if (m_group == GroupByAToZ && source_row > 0) {
139+ QString currentName = m_source->data(m_source->index(source_row, 0), AppDrawerModelInterface::RoleName).toString();
140+ QChar currentLetter = currentName.length() > 0 ? currentName.at(0) : QChar();
141+ QString previousName = m_source->data(m_source->index(source_row - 1,0 ), AppDrawerModelInterface::RoleName).toString();
142+ QChar previousLetter = previousName.length() > 0 ? previousName.at(0) : QChar();
143+ if (currentLetter.toLower() == previousLetter.toLower()) {
144+ return false;
145+ }
146+ } else if(m_group == GroupByAll && source_row > 0) {
147+ return false;
148+ }
149+ if (!m_filterLetter.isEmpty()) {
150+ QString currentName = m_source->data(m_source->index(source_row, 0), AppDrawerModelInterface::RoleName).toString();
151+ QString currentLetter = currentName.length() > 0 ? QString(currentName.at(0)) : QString();
152+ if (currentLetter.toLower() != m_filterLetter.toLower()) {
153+ return false;
154+ }
155+ }
156+ if (!m_filterString.isEmpty()) {
157+ QStringList allWords = m_source->data(m_source->index(source_row, 0), AppDrawerModelInterface::RoleKeywords).toStringList();
158+ allWords.prepend(m_source->data(m_source->index(source_row, 0), AppDrawerModelInterface::RoleName).toString());
159+ bool found = false;
160+ Q_FOREACH (const QString &currentWord, allWords) {
161+ if (currentWord.startsWith(m_filterString, Qt::CaseInsensitive)) {
162+ found = true;
163+ break;
164+ }
165+ }
166+ if (!found) {
167+ return false;
168+ }
169+ }
170+ return true;
171+}
172+
173+QString AppDrawerProxyModel::appId(int index) const
174+{
175+ if (index >= 0 && index < rowCount()) {
176+ QModelIndex sourceIndex = mapToSource(this->index(index, 0));
177+
178+ AppDrawerModelInterface* adm = dynamic_cast<AppDrawerModelInterface*>(m_source);
179+ if (adm) {
180+ return adm->data(sourceIndex, AppDrawerModelInterface::RoleAppId).toString();
181+ }
182+
183+ AppDrawerProxyModel* adpm = qobject_cast<AppDrawerProxyModel*>(m_source);
184+ if (adpm) {
185+ return adpm->appId(sourceIndex.row());
186+ }
187+ }
188+ return QString();
189+}
plugins/Utils/appdrawerproxymodel.hnew file+87
@@ -0,0 +1,87 @@
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 <QSortFilterProxyModel>
18+
19+#include <unity/shell/launcher/AppDrawerModelInterface.h>
20+
21+using namespace unity::shell::launcher;
22+
23+class AppDrawerProxyModel: public QSortFilterProxyModel
24+{
25+ Q_OBJECT
26+ Q_PROPERTY(QAbstractItemModel* source READ source WRITE setSource NOTIFY sourceChanged)
27+ Q_PROPERTY(GroupBy group READ group WRITE setGroup NOTIFY groupChanged)
28+ Q_PROPERTY(QString filterLetter READ filterLetter WRITE setFilterLetter NOTIFY filterLetterChanged)
29+ Q_PROPERTY(QString filterString READ filterString WRITE setFilterString NOTIFY filterStringChanged)
30+ Q_PROPERTY(SortBy sortBy READ sortBy WRITE setSortBy NOTIFY sortByChanged)
31+ Q_PROPERTY(int count READ count NOTIFY countChanged)
32+
33+public:
34+ enum GroupBy {
35+ GroupByNone,
36+ GroupByAll,
37+ GroupByAToZ
38+ };
39+ Q_ENUM(GroupBy)
40+ enum SortBy {
41+ SortByAToZ,
42+ SortByUsage
43+ };
44+ Q_ENUM(SortBy)
45+
46+ AppDrawerProxyModel(QObject* parent = nullptr);
47+
48+ QAbstractItemModel* source() const;
49+ void setSource(QAbstractItemModel* source);
50+
51+ GroupBy group() const;
52+ void setGroup(GroupBy group);
53+
54+ QString filterLetter() const;
55+ void setFilterLetter(const QString &filterLetter);
56+
57+ QString filterString() const;
58+ void setFilterString(const QString &filterString);
59+
60+ SortBy sortBy() const;
61+ void setSortBy(SortBy sortBy);
62+
63+ int count() const;
64+
65+ QVariant data(const QModelIndex &index, int role) const override;
66+ QHash<int, QByteArray> roleNames() const override;
67+
68+ Q_INVOKABLE QString appId(int index) const;
69+
70+protected:
71+ bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
72+
73+Q_SIGNALS:
74+ void sourceChanged();
75+ void groupChanged();
76+ void filterLetterChanged();
77+ void filterStringChanged();
78+ void sortByChanged();
79+ void countChanged();
80+
81+private:
82+ QAbstractItemModel* m_source = nullptr;
83+ GroupBy m_group = GroupByNone;
84+ QString m_filterLetter;
85+ QString m_filterString;
86+ SortBy m_sortBy = SortByAToZ;
87+};
plugins/Utils/easingcurve.h−1
@@ -36,7 +36,6 @@
3636class EasingCurve: public QObject
3737{
3838 Q_OBJECT
39− Q_ENUMS(QEasingCurve::Type)
4039 Q_PROPERTY(QEasingCurve::Type type READ type WRITE setType NOTIFY typeChanged)
4140 Q_PROPERTY(qreal period READ period WRITE setPeriod NOTIFY periodChanged)
4241 Q_PROPERTY(qreal progress READ progress WRITE setProgress NOTIFY progressChanged)
plugins/Utils/expressionfiltermodel.cppnew file+49
@@ -0,0 +1,49 @@
1+/*
2+ * Copyright (C) 2017 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 "expressionfiltermodel.h"
18+
19+ExpressionFilterModel::ExpressionFilterModel(QObject *parent)
20+ : UnitySortFilterProxyModelQML(parent)
21+{
22+}
23+
24+QJSValue ExpressionFilterModel::matchExpression() const
25+{
26+ return m_matchExpression;
27+}
28+
29+void ExpressionFilterModel::setMatchExpression(const QJSValue &value)
30+{
31+ m_matchExpression = value;
32+ invalidateFilter();
33+}
34+
35+bool
36+ExpressionFilterModel::filterAcceptsRow(int sourceRow,
37+ const QModelIndex &sourceParent) const
38+{
39+ if (m_matchExpression.isCallable()) {
40+ QJSValueList args;
41+ args << sourceRow;
42+ QJSValue ret = m_matchExpression.call(args);
43+ if (ret.isBool()) {
44+ return ret.toBool();
45+ }
46+ }
47+
48+ return UnitySortFilterProxyModelQML::filterAcceptsRow(sourceRow, sourceParent);
49+}
plugins/Utils/expressionfiltermodel.hnew file+42
@@ -0,0 +1,42 @@
1+/*
2+ * Copyright (C) 2017 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 EXPRESSIONFILTERMODEL_H
18+#define EXPRESSIONFILTERMODEL_H
19+
20+#include "unitysortfilterproxymodelqml.h"
21+#include <QJSValue>
22+
23+class ExpressionFilterModel : public UnitySortFilterProxyModelQML
24+{
25+ Q_OBJECT
26+ Q_PROPERTY(QJSValue matchExpression READ matchExpression WRITE setMatchExpression NOTIFY matchExpressionChanged)
27+public:
28+ explicit ExpressionFilterModel(QObject *parent = 0);
29+
30+ bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
31+
32+ QJSValue matchExpression() const;
33+ void setMatchExpression(const QJSValue& value);
34+
35+Q_SIGNALS:
36+ void matchExpressionChanged();
37+
38+private:
39+ mutable QJSValue m_matchExpression;
40+};
41+
42+#endif // EXPRESSIONFILTERMODEL_H
plugins/Utils/globalfunctions.cpp+5
@@ -51,3 +51,8 @@ QQuickItem *GlobalFunctions::itemAt(QQuickItem* parent, int x, int y, QJSValue m
5151 }
5252 return nullptr;
5353}
54+
55+bool GlobalFunctions::itemUnderMouse(QQuickItem* item)
56+{
57+ return item && item->isUnderMouse();
58+}
plugins/Utils/globalfunctions.h+2
@@ -37,6 +37,8 @@ public:
3737 int x,
3838 int y,
3939 QJSValue matcher);
40+
41+ static Q_INVOKABLE bool itemUnderMouse(QQuickItem* item);
4042};
4143
4244#endif // GLOBALFUNCTIONS_H
plugins/Utils/plugin.cpp+9−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012-2015 Canonical, Ltd.
2+ * Copyright (C) 2012-2017 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
@@ -39,6 +39,10 @@
3939#include "deviceconfigparser.h"
4040#include "globalfunctions.h"
4141#include "URLDispatcher.h"
42+#include "appdrawerproxymodel.h"
43+#include "tabfocusfence.h"
44+#include "expressionfiltermodel.h"
45+#include "quicklistproxymodel.h"
4246
4347static QObject *createWindowStateStorage(QQmlEngine *engine, QJSEngine *scriptEngine)
4448{
@@ -82,4 +86,8 @@ void UtilsPlugin::registerTypes(const char *uri)
8286 qmlRegisterType<DeviceConfigParser>(uri, 0, 1, "DeviceConfigParser");
8387 qmlRegisterSingletonType<GlobalFunctions>(uri, 0, 1, "Functions", createGlobalFunctions);
8488 qmlRegisterType<URLDispatcher>(uri, 0, 1, "URLDispatcher");
89+ qmlRegisterType<AppDrawerProxyModel>(uri, 0, 1, "AppDrawerProxyModel");
90+ qmlRegisterType<TabFocusFenceItem>(uri, 0, 1, "TabFocusFence");
91+ qmlRegisterType<ExpressionFilterModel>(uri, 0, 1, "ExpressionFilterModel");
92+ qmlRegisterType<QuickListProxyModel>(uri, 0, 1, "QuickListProxyModel");
8593}
plugins/Utils/quicklistproxymodel.cppnew file+72
@@ -0,0 +1,72 @@
1+/*
2+ * Copyright (C) 2017 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 "quicklistproxymodel.h"
18+
19+#include <QDebug>
20+
21+QuickListProxyModel::QuickListProxyModel(QObject *parent):
22+ QSortFilterProxyModel(parent)
23+{
24+ connect(this, &QAbstractListModel::rowsInserted, this, &QuickListProxyModel::countChanged);
25+ connect(this, &QAbstractListModel::rowsRemoved, this, &QuickListProxyModel::countChanged);
26+ connect(this, &QAbstractListModel::layoutChanged, this, &QuickListProxyModel::countChanged);
27+}
28+
29+QAbstractItemModel *QuickListProxyModel::source() const
30+{
31+ return m_source;
32+}
33+
34+bool QuickListProxyModel::privateMode() const
35+{
36+ return m_privateMode;
37+}
38+
39+void QuickListProxyModel::setPrivateMode(bool privateMode)
40+{
41+ if (m_privateMode != privateMode) {
42+ m_privateMode = privateMode;
43+ invalidateFilter();
44+ Q_EMIT privateModeChanged();
45+ }
46+}
47+
48+void QuickListProxyModel::setSource(QAbstractItemModel *source)
49+{
50+ if (m_source != source) {
51+ m_source = source;
52+ setSourceModel(m_source);
53+ connect(m_source, &QAbstractItemModel::rowsRemoved, this, &QuickListProxyModel::invalidate);
54+ connect(m_source, &QAbstractItemModel::rowsInserted, this, &QuickListProxyModel::invalidate);
55+ Q_EMIT sourceChanged();
56+ }
57+}
58+
59+int QuickListProxyModel::count() const
60+{
61+ return rowCount();
62+}
63+
64+bool QuickListProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
65+{
66+ Q_UNUSED(source_parent)
67+
68+ if (m_privateMode) {
69+ return !m_source->data(m_source->index(source_row, 0), QuickListModelInterface::RoleIsPrivate).toBool();
70+ }
71+ return true;
72+}
plugins/Utils/quicklistproxymodel.hnew file+52
@@ -0,0 +1,52 @@
1+/*
2+ * Copyright (C) 2017 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 <QSortFilterProxyModel>
18+
19+#include <unity/shell/launcher/QuickListModelInterface.h>
20+
21+using namespace unity::shell::launcher;
22+
23+class QuickListProxyModel: public QSortFilterProxyModel
24+{
25+ Q_OBJECT
26+ Q_PROPERTY(QAbstractItemModel* source READ source WRITE setSource NOTIFY sourceChanged)
27+ Q_PROPERTY(bool privateMode READ privateMode WRITE setPrivateMode NOTIFY privateModeChanged)
28+ Q_PROPERTY(int count READ count NOTIFY countChanged)
29+
30+public:
31+ QuickListProxyModel(QObject* parent = nullptr);
32+
33+ QAbstractItemModel* source() const;
34+ void setSource(QAbstractItemModel* source);
35+
36+ bool privateMode() const;
37+ void setPrivateMode(bool privateMode);
38+
39+ int count() const;
40+
41+protected:
42+ bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
43+
44+Q_SIGNALS:
45+ void sourceChanged();
46+ void privateModeChanged();
47+ void countChanged();
48+
49+private:
50+ QAbstractItemModel* m_source = nullptr;
51+ bool m_privateMode = false;
52+};
plugins/Utils/tabfocusfence.cppnew file+72
@@ -0,0 +1,72 @@
1+/*
2+ * Copyright 2017 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+*/
16+
17+#include "tabfocusfence.h"
18+
19+#include <private/qquickitem_p.h>
20+
21+TabFocusFenceItem::TabFocusFenceItem(QQuickItem *parent) : QQuickItem(parent)
22+{
23+ QQuickItemPrivate *d = QQuickItemPrivate::get(this);
24+ d->isTabFence = true;
25+ setFlag(ItemIsFocusScope);
26+}
27+
28+bool TabFocusFenceItem::focusNext()
29+{
30+ QQuickItem * current = scopedFocusItem();
31+ if (current) {
32+ QQuickItem * next = current->nextItemInFocusChain(true);
33+ if (next) {
34+ next->setFocus(true, Qt::TabFocusReason);
35+ return true;
36+ }
37+ }
38+ return false;
39+}
40+
41+bool TabFocusFenceItem::focusPrev()
42+{
43+ QQuickItem * current = scopedFocusItem();
44+ if (current) {
45+ QQuickItem * prev = current->nextItemInFocusChain(false);
46+ if (prev) {
47+ prev->setFocus(true, Qt::BacktabFocusReason);
48+ return true;
49+ }
50+ }
51+ return false;
52+}
53+
54+void TabFocusFenceItem::keyPressEvent(QKeyEvent *event)
55+{
56+ // Needed so we eat Tab keys when there's only one item inside the fence
57+ if (event->key() == Qt::Key_Tab) {
58+ event->accept();
59+ } else {
60+ QQuickItem::keyPressEvent(event);
61+ }
62+}
63+
64+void TabFocusFenceItem::keyReleaseEvent(QKeyEvent *event)
65+{
66+ // Needed so we eat Tab keys when there's only one item inside the fence
67+ if (event->key() == Qt::Key_Tab) {
68+ event->accept();
69+ } else {
70+ QQuickItem::keyReleaseEvent(event);
71+ }
72+}
plugins/Utils/tabfocusfence.hnew file+38
@@ -0,0 +1,38 @@
1+/*
2+ * Copyright 2017 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+*/
16+
17+#ifndef TABFOCUSFENCE_H
18+#define TABFOCUSFENCE_H
19+
20+#include <QQuickItem>
21+
22+// An item that restricts focus Tab travelling
23+// to its children
24+class TabFocusFenceItem : public QQuickItem
25+{
26+Q_OBJECT
27+
28+public:
29+ TabFocusFenceItem(QQuickItem *parent = nullptr);
30+
31+ Q_INVOKABLE bool focusNext();
32+ Q_INVOKABLE bool focusPrev();
33+
34+ void keyPressEvent(QKeyEvent *event) override;
35+ void keyReleaseEvent(QKeyEvent *event) override;
36+};
37+
38+#endif
plugins/Utils/unitysortfilterproxymodelqml.h+5
@@ -38,6 +38,11 @@ public:
3838 Q_INVOKABLE int mapRowToSource(int row);
3939 bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
4040
41+ // Make the QSortFilterProxyModel variants also accessible
42+ using QSortFilterProxyModel::data;
43+ using QSortFilterProxyModel::mapFromSource;
44+ using QSortFilterProxyModel::mapToSource;
45+
4146 /* getters */
4247 int totalCount() const;
4348 bool invertMatch() const;
plugins/Utils/windowstatestorage.cpp+37−7
@@ -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
@@ -36,7 +36,7 @@ inline QString sanitiseString(QString string) {
3636WindowStateStorage::WindowStateStorage(QObject *parent):
3737 QObject(parent)
3838{
39− QString dbPath = QDir::homePath() + "/.cache/unity8/";
39+ const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral("/unity8/");
4040 m_db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"));
4141 QDir dir;
4242 dir.mkpath(dbPath);
@@ -65,7 +65,7 @@ void WindowStateStorage::saveState(const QString &windowId, WindowStateStorage::
6565
6666WindowStateStorage::WindowState WindowStateStorage::getState(const QString &windowId, WindowStateStorage::WindowState defaultValue) const
6767{
68− const QString queryString = QStringLiteral("SELECT * FROM state WHERE windowId = '%1';")
68+ const QString queryString = QStringLiteral("SELECT state FROM state WHERE windowId = '%1';")
6969 .arg(sanitiseString(windowId));
7070
7171 QSqlQuery query = getValue(queryString);
@@ -99,7 +99,7 @@ void WindowStateStorage::saveStage(const QString &appId, int stage)
9999
100100int WindowStateStorage::getStage(const QString &appId, int defaultValue) const
101101{
102− const QString queryString = QStringLiteral("SELECT * FROM stage WHERE appId = '%1';")
102+ const QString queryString = QStringLiteral("SELECT stage FROM stage WHERE appId = '%1';")
103103 .arg(sanitiseString(appId));
104104
105105 QSqlQuery query = getValue(queryString);
@@ -133,8 +133,15 @@ QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defa
133133 if (!query.first()) {
134134 return defaultValue;
135135 }
136− return QRect(query.value(QStringLiteral("x")).toInt(), query.value(QStringLiteral("y")).toInt(),
137− query.value(QStringLiteral("width")).toInt(), query.value(QStringLiteral("height")).toInt());
136+
137+ const QRect result(query.value(QStringLiteral("x")).toInt(), query.value(QStringLiteral("y")).toInt(),
138+ query.value(QStringLiteral("width")).toInt(), query.value(QStringLiteral("height")).toInt());
139+
140+ if (result.isValid()) {
141+ return result;
142+ }
143+
144+ return defaultValue;
138145}
139146
140147void WindowStateStorage::initdb()
@@ -165,7 +172,7 @@ void WindowStateStorage::saveValue(const QString &queryString)
165172{
166173 QMutexLocker mutexLocker(&s_mutex);
167174
168− QFuture<void> future = QtConcurrent::run(executeAsyncQuery, queryString);
175+ QFuture<void> future = QtConcurrent::run(&m_threadPool, executeAsyncQuery, queryString);
169176 m_asyncQueries.append(future);
170177
171178 QFutureWatcher<void> *futureWatcher = new QFutureWatcher<void>();
@@ -189,3 +196,26 @@ QSqlQuery WindowStateStorage::getValue(const QString &queryString) const
189196 }
190197 return query;
191198}
199+
200+Mir::State WindowStateStorage::toMirState(WindowState state) const
201+{
202+ // assumes a single state (not an OR of several)
203+ switch (state) {
204+ case WindowStateMaximized: return Mir::MaximizedState;
205+ case WindowStateMinimized: return Mir::MinimizedState;
206+ case WindowStateFullscreen: return Mir::FullscreenState;
207+ case WindowStateMaximizedLeft: return Mir::MaximizedLeftState;
208+ case WindowStateMaximizedRight: return Mir::MaximizedRightState;
209+ case WindowStateMaximizedHorizontally: return Mir::HorizMaximizedState;
210+ case WindowStateMaximizedVertically: return Mir::VertMaximizedState;
211+ case WindowStateMaximizedTopLeft: return Mir::MaximizedTopLeftState;
212+ case WindowStateMaximizedTopRight: return Mir::MaximizedTopRightState;
213+ case WindowStateMaximizedBottomLeft: return Mir::MaximizedBottomLeftState;
214+ case WindowStateMaximizedBottomRight: return Mir::MaximizedBottomRightState;
215+
216+ case WindowStateNormal:
217+ case WindowStateRestored:
218+ default:
219+ return Mir::RestoredState;
220+ }
221+}
plugins/Utils/windowstatestorage.h+10−5
@@ -18,11 +18,14 @@
1818#include <QSqlDatabase>
1919#include <QMutex>
2020#include <QFuture>
21+#include <QThreadPool>
22+
23+// unity-api
24+#include <unity/shell/application/Mir.h>
2125
2226class WindowStateStorage: public QObject
2327{
2428 Q_OBJECT
25− Q_ENUMS(WindowState)
2629public:
2730 enum WindowState {
2831 WindowStateNormal = 1 << 0,
@@ -39,12 +42,11 @@ public:
3942 WindowStateMaximizedBottomRight = 1 << 11,
4043 WindowStateRestored = 1 << 12
4144 };
45+ Q_ENUM(WindowState)
4246 Q_DECLARE_FLAGS(WindowStates, WindowState)
43−#if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0))
4447 Q_FLAG(WindowStates)
45−#endif
4648
47− WindowStateStorage(QObject *parent = 0);
49+ WindowStateStorage(QObject *parent = nullptr);
4850 virtual ~WindowStateStorage();
4951
5052 Q_INVOKABLE void saveState(const QString &windowId, WindowState state);
@@ -56,6 +58,8 @@ public:
5658 Q_INVOKABLE void saveStage(const QString &appId, int stage);
5759 Q_INVOKABLE int getStage(const QString &appId, int defaultValue) const;
5860
61+ Q_INVOKABLE Mir::State toMirState(WindowState state) const;
62+
5963private:
6064 void initdb();
6165
@@ -68,5 +72,6 @@ private:
6872 // NB: This is accessed from threads. Make sure to mutex it.
6973 QSqlDatabase m_db;
7074
71− QList< QFuture<void> > m_asyncQueries;
75+ QList<QFuture<void>> m_asyncQueries;
76+ QThreadPool m_threadPool;
7277};
plugins/WindowManager/AvailableDesktopArea.cppnew file+50
@@ -0,0 +1,50 @@
1+/*
2+ * Copyright (C) 2017 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "AvailableDesktopArea.h"
18+
19+#include <QGuiApplication>
20+#include <QQuickWindow>
21+#include <qpa/qplatformnativeinterface.h>
22+
23+AvailableDesktopArea::AvailableDesktopArea(QQuickItem *parent)
24+ : QQuickItem(parent)
25+{
26+ connect(this, &QQuickItem::xChanged, this, &AvailableDesktopArea::updatePlatformWindowProperty);
27+ connect(this, &QQuickItem::yChanged, this, &AvailableDesktopArea::updatePlatformWindowProperty);
28+ connect(this, &QQuickItem::widthChanged, this, &AvailableDesktopArea::updatePlatformWindowProperty);
29+ connect(this, &QQuickItem::heightChanged, this, &AvailableDesktopArea::updatePlatformWindowProperty);
30+}
31+
32+void AvailableDesktopArea::updatePlatformWindowProperty()
33+{
34+ if (!window()) {
35+ return;
36+ }
37+
38+ QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
39+
40+ QRect rect(x(), y(), width(), height());
41+
42+ nativeInterface->setWindowProperty(window()->handle(), "availableDesktopArea", QVariant(rect));
43+}
44+
45+void AvailableDesktopArea::itemChange(ItemChange change, const ItemChangeData &)
46+{
47+ if (change == ItemSceneChange) {
48+ updatePlatformWindowProperty();
49+ }
50+}
plugins/WindowManager/AvailableDesktopArea.hnew file+38
@@ -0,0 +1,38 @@
1+/*
2+ * Copyright (C) 2017 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef AVAILABLEDESKTOPAREA_H
18+#define AVAILABLEDESKTOPAREA_H
19+
20+#include <QQuickItem>
21+
22+/**
23+ @brief Used to inform qtmir/miral about the available desktop area of shell
24+
25+ So that qtmir/miral can take correct window management decisions.
26+ */
27+class AvailableDesktopArea : public QQuickItem
28+{
29+ Q_OBJECT
30+public:
31+ AvailableDesktopArea(QQuickItem *parent = nullptr);
32+protected:
33+ void itemChange(ItemChange change, const ItemChangeData &value) override;
34+private Q_SLOTS:
35+ void updatePlatformWindowProperty();
36+};
37+
38+#endif // AVAILABLEDESKTOPAREA_H
plugins/WindowManager/CMakeLists.txt+12−1
@@ -1,12 +1,23 @@
11set(WINDOWMANAGER_SRC
2− TopLevelSurfaceList.cpp
2+ AvailableDesktopArea.cpp
3+ TopLevelWindowModel.cpp
4+ Window.cpp
35 WindowManagerPlugin.cpp
6+ WindowMargins.cpp
47 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
58 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
69 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
710 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceListInterface.h
11+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/SurfaceManagerInterface.h
812 )
913
14+add_definitions(-DWINDOWMANAGERQML_LIBRARY)
15+
16+include_directories(
17+ SYSTEM
18+ ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
19+)
20+
1021add_library(windowmanager-qml SHARED ${WINDOWMANAGER_SRC})
1122
1223qt5_use_modules(windowmanager-qml Qml Quick Gui)
plugins/WindowManager/TopLevelSurfaceList.cppdeleted−481
@@ -1,481 +0,0 @@
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::liveChanged, this, [this, surface](bool live){
137− if (!live) {
138− onSurfaceDied(surface);
139− }
140− });
141− connect(surface, &QObject::destroyed, this, [this, surface](){ this->onSurfaceDestroyed(surface); });
142−}
143−
144−void TopLevelSurfaceList::onSurfaceDied(MirSurfaceInterface *surface)
145−{
146− int i = indexOf(surface);
147− if (i == -1) {
148− return;
149− }
150−
151− auto application = m_surfaceList[i].application;
152−
153− // can't be starting if it already has a surface
154− Q_ASSERT(application->state() != ApplicationInfoInterface::Starting);
155−
156− if (application->state() == ApplicationInfoInterface::Running) {
157− m_surfaceList[i].removeOnceSurfaceDestroyed = true;
158− } else {
159− // assume it got killed by the out-of-memory daemon.
160− //
161− // So leave entry in the model and only remove its surface, so shell can display a screenshot
162− // in its place.
163− m_surfaceList[i].removeOnceSurfaceDestroyed = false;
164− }
165−}
166−
167−void TopLevelSurfaceList::onSurfaceDestroyed(MirSurfaceInterface *surface)
168−{
169− int i = indexOf(surface);
170− if (i == -1) {
171− return;
172− }
173−
174− if (m_surfaceList[i].removeOnceSurfaceDestroyed) {
175− removeAt(i);
176− } else {
177− m_surfaceList[i].surface = nullptr;
178− Q_EMIT dataChanged(index(i) /* topLeft */, index(i) /* bottomRight */, QVector<int>() << SurfaceRole);
179− DEBUG_MSG << " Removed surface from entry. After: " << toString();
180− }
181−}
182−
183−void TopLevelSurfaceList::removeAt(int index)
184−{
185− if (m_modelState == IdleState) {
186− beginRemoveRows(QModelIndex(), index, index);
187− m_modelState = RemovingState;
188− } else {
189− Q_ASSERT(m_modelState == ResettingState);
190− // No point in signaling anything if we're resetting the whole model
191− }
192−
193− m_surfaceList.removeAt(index);
194−
195− if (m_modelState == RemovingState) {
196− endRemoveRows();
197− Q_EMIT countChanged();
198− Q_EMIT listChanged();
199− m_modelState = IdleState;
200− }
201−
202− DEBUG_MSG << " after " << toString();
203−}
204−
205−int TopLevelSurfaceList::indexOf(MirSurfaceInterface *surface)
206−{
207− for (int i = 0; i < m_surfaceList.count(); ++i) {
208− if (m_surfaceList.at(i).surface == surface) {
209− return i;
210− }
211− }
212− return -1;
213−}
214−
215−void TopLevelSurfaceList::move(int from, int to)
216−{
217− if (from == to) return;
218− DEBUG_MSG << " from=" << from << " to=" << to;
219−
220− if (from >= 0 && from < m_surfaceList.size() && to >= 0 && to < m_surfaceList.size()) {
221− QModelIndex parent;
222− /* When moving an item down, the destination index needs to be incremented
223− by one, as explained in the documentation:
224− http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html#beginMoveRows */
225−
226− Q_ASSERT(m_modelState == IdleState);
227− m_modelState = MovingState;
228−
229− beginMoveRows(parent, from, from, parent, to + (to > from ? 1 : 0));
230− m_surfaceList.move(from, to);
231− endMoveRows();
232− Q_EMIT listChanged();
233−
234− m_modelState = IdleState;
235−
236− DEBUG_MSG << " after " << toString();
237− }
238−}
239−
240−MirSurfaceInterface *TopLevelSurfaceList::surfaceAt(int index) const
241−{
242− if (index >=0 && index < m_surfaceList.count()) {
243− return m_surfaceList[index].surface;
244− } else {
245− return nullptr;
246− }
247−}
248−
249−ApplicationInfoInterface *TopLevelSurfaceList::applicationAt(int index) const
250−{
251− if (index >=0 && index < m_surfaceList.count()) {
252− return m_surfaceList[index].application;
253− } else {
254− return nullptr;
255− }
256−}
257−
258−int TopLevelSurfaceList::idAt(int index) const
259−{
260− if (index >=0 && index < m_surfaceList.count()) {
261− return m_surfaceList[index].id;
262− } else {
263− return 0;
264− }
265−}
266−
267−int TopLevelSurfaceList::indexForId(int id) const
268−{
269− for (int i = 0; i < m_surfaceList.count(); ++i) {
270− if (m_surfaceList[i].id == id) {
271− return i;
272− }
273− }
274− return -1;
275−}
276−
277−void TopLevelSurfaceList::doRaiseId(int id)
278−{
279− int fromIndex = indexForId(id);
280− if (fromIndex != -1) {
281− move(fromIndex, 0 /* toIndex */);
282− }
283−}
284−
285−void TopLevelSurfaceList::raiseId(int id)
286−{
287− if (m_modelState == IdleState) {
288− DEBUG_MSG << "(id=" << id << ") - do it now.";
289− doRaiseId(id);
290− } else {
291− DEBUG_MSG << "(id=" << id << ") - Model busy (modelState=" << m_modelState << "). Try again in the next event loop.";
292− // The model has just signalled some change. If we have a Repeater responding to this update, it will get nuts
293− // if we perform yet another model change straight away.
294− //
295− // A bad sympton of this problem is a Repeater.itemAt(index) call returning null event though Repeater.count says
296− // the index is definitely within bounds.
297− QMetaObject::invokeMethod(this, "raiseId", Qt::QueuedConnection, Q_ARG(int, id));
298− }
299−}
300−
301−int TopLevelSurfaceList::generateId()
302−{
303− int id = m_nextId;
304− m_nextId = nextFreeId(m_nextId + 1);
305− Q_EMIT nextIdChanged();
306− return id;
307−}
308−
309−int TopLevelSurfaceList::nextFreeId(int candidateId)
310−{
311− if (candidateId > m_maxId) {
312− return nextFreeId(1);
313− } else {
314− if (indexForId(candidateId) == -1) {
315− // it's indeed free
316− return candidateId;
317− } else {
318− return nextFreeId(candidateId + 1);
319− }
320− }
321−}
322−
323−QString TopLevelSurfaceList::toString()
324−{
325− QString str;
326− for (int i = 0; i < m_surfaceList.count(); ++i) {
327− auto item = m_surfaceList.at(i);
328−
329− QString itemStr = QString("(index=%1,appId=%2,surface=0x%3,id=%4)")
330− .arg(i)
331− .arg(item.application->appId())
332− .arg((qintptr)item.surface, 0, 16)
333− .arg(item.id);
334−
335− if (i > 0) {
336− str.append(",");
337− }
338− str.append(itemStr);
339− }
340− return str;
341−}
342−
343−void TopLevelSurfaceList::addApplication(ApplicationInfoInterface *application)
344−{
345− DEBUG_MSG << "(" << application->appId() << ")";
346− Q_ASSERT(!m_applications.contains(application));
347− m_applications.append(application);
348−
349− MirSurfaceListInterface *surfaceList = application->surfaceList();
350−
351− if (application->state() != ApplicationInfoInterface::Stopped) {
352− if (surfaceList->count() == 0) {
353− appendPlaceholder(application);
354− } else {
355− for (int i = 0; i < surfaceList->count(); ++i) {
356− appendSurface(surfaceList->get(i), application);
357− }
358− }
359− }
360−
361− connect(surfaceList, &QAbstractItemModel::rowsInserted, this,
362− [this, application, surfaceList](const QModelIndex & /*parent*/, int first, int last)
363− {
364− for (int i = last; i >= first; --i) {
365− this->appendSurface(surfaceList->get(i), application);
366− }
367− });
368−}
369−
370−void TopLevelSurfaceList::removeApplication(ApplicationInfoInterface *application)
371−{
372− DEBUG_MSG << "(" << application->appId() << ")";
373− Q_ASSERT(m_applications.contains(application));
374−
375− MirSurfaceListInterface *surfaceList = application->surfaceList();
376−
377− disconnect(surfaceList, 0, this, 0);
378−
379− Q_ASSERT(m_modelState == IdleState);
380− m_modelState = RemovingState;
381−
382− int i = 0;
383− while (i < m_surfaceList.count()) {
384− if (m_surfaceList.at(i).application == application) {
385− beginRemoveRows(QModelIndex(), i, i);
386− m_surfaceList.removeAt(i);
387− endRemoveRows();
388− Q_EMIT countChanged();
389− Q_EMIT listChanged();
390− } else {
391− ++i;
392− }
393− }
394−
395− m_modelState = IdleState;
396−
397− DEBUG_MSG << " after " << toString();
398−
399− m_applications.removeAll(application);
400−}
401−
402−QAbstractListModel *TopLevelSurfaceList::applicationsModel() const
403−{
404− return m_applicationsModel;
405−}
406−
407−void TopLevelSurfaceList::setApplicationsModel(QAbstractListModel* value)
408−{
409− if (m_applicationsModel == value) {
410− return;
411− }
412−
413− DEBUG_MSG << "(" << value << ")";
414−
415− Q_ASSERT(m_modelState == IdleState);
416− m_modelState = ResettingState;
417−
418− beginResetModel();
419−
420− if (m_applicationsModel) {
421− m_surfaceList.clear();
422− m_applications.clear();
423− disconnect(m_applicationsModel, 0, this, 0);
424− }
425−
426− m_applicationsModel = value;
427−
428− if (m_applicationsModel) {
429− findApplicationRole();
430−
431− connect(m_applicationsModel, &QAbstractItemModel::rowsInserted,
432− this, [this](const QModelIndex &/*parent*/, int first, int last) {
433− for (int i = first; i <= last; ++i) {
434− auto application = getApplicationFromModelAt(i);
435− addApplication(application);
436− }
437− });
438−
439− connect(m_applicationsModel, &QAbstractItemModel::rowsAboutToBeRemoved,
440− this, [this](const QModelIndex &/*parent*/, int first, int last) {
441− for (int i = first; i <= last; ++i) {
442− auto application = getApplicationFromModelAt(i);
443− removeApplication(application);
444− }
445− });
446−
447− for (int i = 0; i < m_applicationsModel->rowCount(); ++i) {
448− auto application = getApplicationFromModelAt(i);
449− addApplication(application);
450− }
451− }
452−
453− endResetModel();
454− m_modelState = IdleState;
455−}
456−
457−ApplicationInfoInterface *TopLevelSurfaceList::getApplicationFromModelAt(int index)
458−{
459− QModelIndex modelIndex = m_applicationsModel->index(index);
460−
461− QVariant variant = m_applicationsModel->data(modelIndex, m_applicationRole);
462−
463− // variant.value<ApplicationInfoInterface*>() returns null for some reason.
464− return static_cast<ApplicationInfoInterface*>(variant.value<QObject*>());
465−}
466−
467−void TopLevelSurfaceList::findApplicationRole()
468−{
469− QHash<int, QByteArray> namesHash = m_applicationsModel->roleNames();
470−
471− m_applicationRole = -1;
472− for (auto i = namesHash.begin(); i != namesHash.end() && m_applicationRole == -1; ++i) {
473− if (i.value() == "application") {
474− m_applicationRole = i.key();
475− }
476− }
477−
478− if (m_applicationRole == -1) {
479− qFatal("TopLevelSurfaceList: applicationsModel must have a \"application\" role.");
480− }
481−}
plugins/WindowManager/TopLevelSurfaceList.hdeleted−223
@@ -1,223 +0,0 @@
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
plugins/WindowManager/TopLevelWindowModel.cppnew file+721
@@ -0,0 +1,721 @@
1+/*
2+ * Copyright (C) 2016-2017 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "TopLevelWindowModel.h"
18+
19+// unity-api
20+#include <unity/shell/application/ApplicationInfoInterface.h>
21+#include <unity/shell/application/ApplicationManagerInterface.h>
22+#include <unity/shell/application/MirSurfaceInterface.h>
23+#include <unity/shell/application/MirSurfaceListInterface.h>
24+#include <unity/shell/application/SurfaceManagerInterface.h>
25+
26+// Qt
27+#include <QGuiApplication>
28+#include <QDebug>
29+
30+// local
31+#include "Window.h"
32+
33+Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
34+
35+#define DEBUG_MSG qCDebug(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
36+#define INFO_MSG qCInfo(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
37+
38+namespace unityapi = unity::shell::application;
39+
40+TopLevelWindowModel::TopLevelWindowModel()
41+{
42+}
43+
44+void TopLevelWindowModel::setApplicationManager(unityapi::ApplicationManagerInterface* value)
45+{
46+ if (m_applicationManager == value) {
47+ return;
48+ }
49+
50+ DEBUG_MSG << "(" << value << ")";
51+
52+ Q_ASSERT(m_modelState == IdleState);
53+ m_modelState = ResettingState;
54+
55+ beginResetModel();
56+
57+ if (m_applicationManager) {
58+ m_windowModel.clear();
59+ disconnect(m_applicationManager, 0, this, 0);
60+ }
61+
62+ m_applicationManager = value;
63+
64+ if (m_applicationManager) {
65+ connect(m_applicationManager, &QAbstractItemModel::rowsInserted,
66+ this, [this](const QModelIndex &/*parent*/, int first, int last) {
67+ for (int i = first; i <= last; ++i) {
68+ auto application = m_applicationManager->get(i);
69+ addApplication(application);
70+ }
71+ });
72+
73+ connect(m_applicationManager, &QAbstractItemModel::rowsAboutToBeRemoved,
74+ this, [this](const QModelIndex &/*parent*/, int first, int last) {
75+ for (int i = first; i <= last; ++i) {
76+ auto application = m_applicationManager->get(i);
77+ removeApplication(application);
78+ }
79+ });
80+
81+ for (int i = 0; i < m_applicationManager->rowCount(); ++i) {
82+ auto application = m_applicationManager->get(i);
83+ addApplication(application);
84+ }
85+ }
86+
87+ endResetModel();
88+ m_modelState = IdleState;
89+}
90+
91+void TopLevelWindowModel::setSurfaceManager(unityapi::SurfaceManagerInterface *surfaceManager)
92+{
93+ if (surfaceManager == m_surfaceManager) {
94+ return;
95+ }
96+
97+ DEBUG_MSG << "(" << surfaceManager << ")";
98+
99+ if (m_surfaceManager) {
100+ disconnect(m_surfaceManager, 0, this, 0);
101+ }
102+
103+ m_surfaceManager = surfaceManager;
104+
105+ if (m_surfaceManager) {
106+ connect(m_surfaceManager, &unityapi::SurfaceManagerInterface::surfaceCreated, this, &TopLevelWindowModel::onSurfaceCreated);
107+ connect(m_surfaceManager, &unityapi::SurfaceManagerInterface::surfacesRaised, this, &TopLevelWindowModel::onSurfacesRaised);
108+ connect(m_surfaceManager, &unityapi::SurfaceManagerInterface::modificationsStarted, this, &TopLevelWindowModel::onModificationsStarted);
109+ connect(m_surfaceManager, &unityapi::SurfaceManagerInterface::modificationsEnded, this, &TopLevelWindowModel::onModificationsEnded);
110+ }
111+
112+ Q_EMIT surfaceManagerChanged(m_surfaceManager);
113+}
114+
115+void TopLevelWindowModel::addApplication(unityapi::ApplicationInfoInterface *application)
116+{
117+ DEBUG_MSG << "(" << application->appId() << ")";
118+
119+ if (application->state() != unityapi::ApplicationInfoInterface::Stopped && application->surfaceList()->count() == 0) {
120+ prependPlaceholder(application);
121+ }
122+}
123+
124+void TopLevelWindowModel::removeApplication(unityapi::ApplicationInfoInterface *application)
125+{
126+ DEBUG_MSG << "(" << application->appId() << ")";
127+
128+ Q_ASSERT(m_modelState == IdleState);
129+
130+ int i = 0;
131+ while (i < m_windowModel.count()) {
132+ if (m_windowModel.at(i).application == application) {
133+ deleteAt(i);
134+ } else {
135+ ++i;
136+ }
137+ }
138+}
139+
140+void TopLevelWindowModel::prependPlaceholder(unityapi::ApplicationInfoInterface *application)
141+{
142+ INFO_MSG << "(" << application->appId() << ")";
143+
144+ prependSurfaceHelper(nullptr, application);
145+}
146+
147+void TopLevelWindowModel::prependSurface(unityapi::MirSurfaceInterface *surface, unityapi::ApplicationInfoInterface *application)
148+{
149+ Q_ASSERT(surface != nullptr);
150+
151+ connectSurface(surface);
152+
153+ bool filledPlaceholder = false;
154+ for (int i = 0; i < m_windowModel.count() && !filledPlaceholder; ++i) {
155+ ModelEntry &entry = m_windowModel[i];
156+ if (entry.application == application && entry.window->surface() == nullptr) {
157+ entry.window->setSurface(surface);
158+ INFO_MSG << " appId=" << application->appId() << " surface=" << surface
159+ << ", filling out placeholder. after: " << toString();
160+ filledPlaceholder = true;
161+ }
162+ }
163+
164+ if (!filledPlaceholder) {
165+ INFO_MSG << " appId=" << application->appId() << " surface=" << surface << ", adding new row";
166+ prependSurfaceHelper(surface, application);
167+ }
168+}
169+
170+void TopLevelWindowModel::prependSurfaceHelper(unityapi::MirSurfaceInterface *surface, unityapi::ApplicationInfoInterface *application)
171+{
172+
173+ Window *window = createWindow(surface);
174+
175+ connect(window, &Window::stateChanged, this, [=](Mir::State newState) {
176+ if (newState == Mir::HiddenState) {
177+ // Comply, removing it from our model. Just as if it didn't exist anymore.
178+ removeAt(indexForId(window->id()));
179+ } else {
180+ if (indexForId(window->id()) == -1) {
181+ // was probably hidden before. put it back on the list
182+ auto *application = m_applicationManager->findApplicationWithSurface(window->surface());
183+ Q_ASSERT(application);
184+ prependWindow(window, application);
185+ }
186+ }
187+ });
188+
189+ prependWindow(window, application);
190+
191+ if (!surface) {
192+ activateEmptyWindow(window);
193+ }
194+
195+ INFO_MSG << " after " << toString();
196+}
197+
198+void TopLevelWindowModel::prependWindow(Window *window, unityapi::ApplicationInfoInterface *application)
199+{
200+ if (m_modelState == IdleState) {
201+ m_modelState = InsertingState;
202+ beginInsertRows(QModelIndex(), 0 /*first*/, 0 /*last*/);
203+ } else {
204+ Q_ASSERT(m_modelState == ResettingState);
205+ // No point in signaling anything if we're resetting the whole model
206+ }
207+
208+ m_windowModel.prepend(ModelEntry(window, application));
209+
210+ if (m_modelState == InsertingState) {
211+ endInsertRows();
212+ Q_EMIT countChanged();
213+ Q_EMIT listChanged();
214+ m_modelState = IdleState;
215+ }
216+}
217+
218+void TopLevelWindowModel::connectWindow(Window *window)
219+{
220+ connect(window, &Window::focusRequested, this, [this, window]() {
221+ if (!window->surface()) {
222+ activateEmptyWindow(window);
223+ }
224+ });
225+
226+ connect(window, &Window::focusedChanged, this, [this, window](bool focused) {
227+ if (window->surface()) {
228+ // Condense changes to the focused window
229+ // eg: Do focusedWindow=A to focusedWindow=B instead of
230+ // focusedWindow=A to focusedWindow=null to focusedWindow=B
231+ if (focused) {
232+ Q_ASSERT(m_newlyFocusedWindow == nullptr);
233+ m_focusedWindowChanged = true;
234+ m_newlyFocusedWindow = window;
235+ } else if (m_focusedWindow == window) {
236+ m_focusedWindowChanged = true;
237+ } else {
238+ // don't clear the focused window if you were not there in the first place
239+ // happens when a filled window gets replaced with an empty one (no surface) as the focused window.
240+ }
241+ }
242+ });
243+
244+ connect(window, &Window::closeRequested, this, [this, window]() {
245+ if (!window->surface()) {
246+ // do things ourselves as miral doesn't know about this window
247+ int id = window->id();
248+ int index = indexForId(id);
249+ bool focusOther = false;
250+ Q_ASSERT(index >= 0);
251+ if (window->focused()) {
252+ focusOther = true;
253+ }
254+ m_windowModel[index].application->close();
255+ if (focusOther) {
256+ activateTopMostWindowWithoutId(id);
257+ }
258+ }
259+ });
260+
261+ connect(window, &Window::emptyWindowActivated, this, [this, window]() {
262+ activateEmptyWindow(window);
263+ });
264+
265+ connect(window, &Window::liveChanged, this, [this, window](bool isAlive) {
266+ if (!isAlive && window->state() == Mir::HiddenState) {
267+ // Hidden windows are not in the model. So just delete it right away.
268+ delete window;
269+ }
270+ });
271+}
272+
273+void TopLevelWindowModel::activateEmptyWindow(Window *window)
274+{
275+ Q_ASSERT(!window->surface());
276+ DEBUG_MSG << "(" << window << ")";
277+
278+ // miral doesn't know about empty windows (ie, windows that are not backed up by MirSurfaces)
279+ // So we have to activate them ourselves (instead of asking SurfaceManager to do it for us).
280+
281+ window->setFocused(true);
282+ raiseId(window->id());
283+ Window *previousWindow = m_focusedWindow;
284+ setFocusedWindow(window);
285+ if (previousWindow && previousWindow->surface() && previousWindow->surface()->focused()) {
286+ m_surfaceManager->activate(nullptr);
287+ }
288+}
289+
290+void TopLevelWindowModel::connectSurface(unityapi::MirSurfaceInterface *surface)
291+{
292+ connect(surface, &unityapi::MirSurfaceInterface::liveChanged, this, [this, surface](bool live){
293+ if (!live) {
294+ onSurfaceDied(surface);
295+ }
296+ });
297+ connect(surface, &QObject::destroyed, this, [this, surface](){ this->onSurfaceDestroyed(surface); });
298+}
299+
300+void TopLevelWindowModel::onSurfaceDied(unityapi::MirSurfaceInterface *surface)
301+{
302+ if (surface->type() == Mir::InputMethodType) {
303+ removeInputMethodWindow();
304+ return;
305+ }
306+
307+ int i = indexOf(surface);
308+ if (i == -1) {
309+ return;
310+ }
311+
312+ auto application = m_windowModel[i].application;
313+
314+ // can't be starting if it already has a surface
315+ Q_ASSERT(application->state() != unityapi::ApplicationInfoInterface::Starting);
316+
317+ if (application->state() == unityapi::ApplicationInfoInterface::Running) {
318+ m_windowModel[i].removeOnceSurfaceDestroyed = true;
319+ } else {
320+ // assume it got killed by the out-of-memory daemon.
321+ //
322+ // So leave entry in the model and only remove its surface, so shell can display a screenshot
323+ // in its place.
324+ m_windowModel[i].removeOnceSurfaceDestroyed = false;
325+ }
326+}
327+
328+void TopLevelWindowModel::onSurfaceDestroyed(unityapi::MirSurfaceInterface *surface)
329+{
330+ int i = indexOf(surface);
331+ if (i == -1) {
332+ return;
333+ }
334+
335+ if (m_windowModel[i].removeOnceSurfaceDestroyed) {
336+ deleteAt(i);
337+ } else {
338+ auto window = m_windowModel[i].window;
339+ window->setSurface(nullptr);
340+ window->setFocused(false);
341+ INFO_MSG << " Removed surface from entry. After: " << toString();
342+ }
343+}
344+
345+Window *TopLevelWindowModel::createWindow(unityapi::MirSurfaceInterface *surface)
346+{
347+ int id = generateId();
348+ Window *qmlWindow = new Window(id, this);
349+ connectWindow(qmlWindow);
350+ if (surface) {
351+ qmlWindow->setSurface(surface);
352+ }
353+ return qmlWindow;
354+}
355+
356+void TopLevelWindowModel::onSurfaceCreated(unityapi::MirSurfaceInterface *surface)
357+{
358+ DEBUG_MSG << "(" << surface << ")";
359+
360+ if (surface->parentSurface()) {
361+ // Wrap it in a Window so that we keep focusedWindow() up to date.
362+ Window *window = createWindow(surface);
363+ connect(surface, &QObject::destroyed, window, [=](){
364+ window->setSurface(nullptr);
365+ window->deleteLater();
366+ });
367+ } else {
368+ if (surface->type() == Mir::InputMethodType) {
369+ connectSurface(surface);
370+ setInputMethodWindow(createWindow(surface));
371+ } else {
372+ auto *application = m_applicationManager->findApplicationWithSurface(surface);
373+ if (application) {
374+ if (surface->state() == Mir::HiddenState) {
375+ // Ignore it until it's finally shown
376+ connect(surface, &unityapi::MirSurfaceInterface::stateChanged, this, [=](Mir::State newState) {
377+ Q_ASSERT(newState != Mir::HiddenState);
378+ disconnect(surface, &unityapi::MirSurfaceInterface::stateChanged, this, 0);
379+ prependSurface(surface, application);
380+ });
381+ } else {
382+ prependSurface(surface, application);
383+ }
384+ } else {
385+ // Must be a prompt session. No need to do add it as a prompt surface is not top-level.
386+ // It will show up in the ApplicationInfoInterface::promptSurfaceList of some application.
387+ // Still wrap it in a Window though, so that we keep focusedWindow() up to date.
388+ Window *promptWindow = createWindow(surface);
389+ connect(surface, &QObject::destroyed, promptWindow, [=](){
390+ promptWindow->setSurface(nullptr);
391+ promptWindow->deleteLater();
392+ });
393+ }
394+ }
395+ }
396+}
397+
398+void TopLevelWindowModel::deleteAt(int index)
399+{
400+ auto window = m_windowModel[index].window;
401+
402+ removeAt(index);
403+
404+ window->setSurface(nullptr);
405+
406+ delete window;
407+}
408+
409+void TopLevelWindowModel::removeAt(int index)
410+{
411+ if (m_modelState == IdleState) {
412+ beginRemoveRows(QModelIndex(), index, index);
413+ m_modelState = RemovingState;
414+ } else {
415+ Q_ASSERT(m_modelState == ResettingState);
416+ // No point in signaling anything if we're resetting the whole model
417+ }
418+
419+ auto window = m_windowModel[index].window;
420+
421+ if (!window->surface()) {
422+ window->setFocused(false);
423+ }
424+
425+ m_windowModel.removeAt(index);
426+
427+ if (m_modelState == RemovingState) {
428+ endRemoveRows();
429+ Q_EMIT countChanged();
430+ Q_EMIT listChanged();
431+ m_modelState = IdleState;
432+ }
433+
434+ if (m_focusedWindow == window) {
435+ setFocusedWindow(nullptr);
436+ }
437+
438+ INFO_MSG << " after " << toString();
439+}
440+
441+void TopLevelWindowModel::setInputMethodWindow(Window *window)
442+{
443+ if (m_inputMethodWindow) {
444+ qWarning("Multiple Input Method Surfaces created, removing the old one!");
445+ delete m_inputMethodWindow;
446+ }
447+ m_inputMethodWindow = window;
448+ Q_EMIT inputMethodSurfaceChanged(m_inputMethodWindow->surface());
449+}
450+
451+void TopLevelWindowModel::removeInputMethodWindow()
452+{
453+ if (m_inputMethodWindow) {
454+ delete m_inputMethodWindow;
455+ m_inputMethodWindow = nullptr;
456+ Q_EMIT inputMethodSurfaceChanged(nullptr);
457+ }
458+}
459+
460+void TopLevelWindowModel::onSurfacesRaised(const QVector<unityapi::MirSurfaceInterface*> &surfaces)
461+{
462+ DEBUG_MSG << "(" << surfaces << ")";
463+ const int raiseCount = surfaces.size();
464+ for (int i = 0; i < raiseCount; i++) {
465+ int fromIndex = findIndexOf(surfaces[i]);
466+ if (fromIndex != -1) {
467+ move(fromIndex, 0);
468+ }
469+ }
470+}
471+
472+int TopLevelWindowModel::rowCount(const QModelIndex &/*parent*/) const
473+{
474+ return m_windowModel.count();
475+}
476+
477+QVariant TopLevelWindowModel::data(const QModelIndex& index, int role) const
478+{
479+ if (index.row() < 0 || index.row() >= m_windowModel.size())
480+ return QVariant();
481+
482+ if (role == WindowRole) {
483+ Window *window = m_windowModel.at(index.row()).window;
484+ return QVariant::fromValue(window);
485+ } else if (role == ApplicationRole) {
486+ return QVariant::fromValue(m_windowModel.at(index.row()).application);
487+ } else {
488+ return QVariant();
489+ }
490+}
491+
492+int TopLevelWindowModel::findIndexOf(const unityapi::MirSurfaceInterface *surface) const
493+{
494+ for (int i=0; i<m_windowModel.count(); i++) {
495+ if (m_windowModel[i].window->surface() == surface) {
496+ return i;
497+ }
498+ }
499+ return -1;
500+}
501+
502+int TopLevelWindowModel::generateId()
503+{
504+ int id = m_nextId;
505+ m_nextId = nextFreeId(nextId(id), id);
506+ return id;
507+}
508+
509+int TopLevelWindowModel::nextId(int id) const
510+{
511+ if (id == m_maxId) {
512+ return id = 1;
513+ } else {
514+ return id + 1;
515+ }
516+}
517+
518+int TopLevelWindowModel::nextFreeId(int candidateId, const int latestId)
519+{
520+ int firstCandidateId = candidateId;
521+
522+ while (indexForId(candidateId) != -1 || candidateId == latestId) {
523+ candidateId = nextId(candidateId);
524+
525+ if (candidateId == firstCandidateId) {
526+ qFatal("TopLevelWindowModel: run out of window ids.");
527+ }
528+ }
529+
530+ return candidateId;
531+}
532+
533+QString TopLevelWindowModel::toString()
534+{
535+ QString str;
536+ for (int i = 0; i < m_windowModel.count(); ++i) {
537+ auto item = m_windowModel.at(i);
538+
539+ QString itemStr = QString("(index=%1,appId=%2,surface=0x%3,id=%4)")
540+ .arg(QString::number(i),
541+ item.application->appId(),
542+ QString::number((qintptr)item.window->surface(), 16),
543+ QString::number(item.window->id()));
544+
545+ if (i > 0) {
546+ str.append(",");
547+ }
548+ str.append(itemStr);
549+ }
550+ return str;
551+}
552+
553+int TopLevelWindowModel::indexOf(unityapi::MirSurfaceInterface *surface)
554+{
555+ for (int i = 0; i < m_windowModel.count(); ++i) {
556+ if (m_windowModel.at(i).window->surface() == surface) {
557+ return i;
558+ }
559+ }
560+ return -1;
561+}
562+
563+int TopLevelWindowModel::indexForId(int id) const
564+{
565+ for (int i = 0; i < m_windowModel.count(); ++i) {
566+ if (m_windowModel[i].window->id() == id) {
567+ return i;
568+ }
569+ }
570+ return -1;
571+}
572+
573+Window *TopLevelWindowModel::windowAt(int index) const
574+{
575+ if (index >=0 && index < m_windowModel.count()) {
576+ return m_windowModel[index].window;
577+ } else {
578+ return nullptr;
579+ }
580+}
581+
582+unityapi::MirSurfaceInterface *TopLevelWindowModel::surfaceAt(int index) const
583+{
584+ if (index >=0 && index < m_windowModel.count()) {
585+ return m_windowModel[index].window->surface();
586+ } else {
587+ return nullptr;
588+ }
589+}
590+
591+unityapi::ApplicationInfoInterface *TopLevelWindowModel::applicationAt(int index) const
592+{
593+ if (index >=0 && index < m_windowModel.count()) {
594+ return m_windowModel[index].application;
595+ } else {
596+ return nullptr;
597+ }
598+}
599+
600+int TopLevelWindowModel::idAt(int index) const
601+{
602+ if (index >=0 && index < m_windowModel.count()) {
603+ return m_windowModel[index].window->id();
604+ } else {
605+ return 0;
606+ }
607+}
608+
609+void TopLevelWindowModel::raiseId(int id)
610+{
611+ if (m_modelState == IdleState) {
612+ DEBUG_MSG << "(id=" << id << ") - do it now.";
613+ doRaiseId(id);
614+ } else {
615+ DEBUG_MSG << "(id=" << id << ") - Model busy (modelState=" << m_modelState << "). Try again in the next event loop.";
616+ // The model has just signalled some change. If we have a Repeater responding to this update, it will get nuts
617+ // if we perform yet another model change straight away.
618+ //
619+ // A bad sympton of this problem is a Repeater.itemAt(index) call returning null event though Repeater.count says
620+ // the index is definitely within bounds.
621+ QMetaObject::invokeMethod(this, "raiseId", Qt::QueuedConnection, Q_ARG(int, id));
622+ }
623+}
624+
625+void TopLevelWindowModel::doRaiseId(int id)
626+{
627+ int fromIndex = indexForId(id);
628+ // can't raise something that doesn't exist or that it's already on top
629+ if (fromIndex != -1 && fromIndex != 0) {
630+ auto surface = m_windowModel[fromIndex].window->surface();
631+ if (surface) {
632+ m_surfaceManager->raise(surface);
633+ } else {
634+ // move it ourselves. Since there's no mir::scene::Surface/miral::Window, there's nothing
635+ // miral can do about it.
636+ move(fromIndex, 0);
637+ }
638+ }
639+}
640+
641+void TopLevelWindowModel::setFocusedWindow(Window *window)
642+{
643+ if (window != m_focusedWindow) {
644+ INFO_MSG << "(" << window << ")";
645+
646+ Window* previousWindow = m_focusedWindow;
647+
648+ m_focusedWindow = window;
649+ Q_EMIT focusedWindowChanged(m_focusedWindow);
650+
651+ if (previousWindow && previousWindow->focused() && !previousWindow->surface()) {
652+ // do it ourselves. miral doesn't know about this window
653+ previousWindow->setFocused(false);
654+ }
655+ }
656+}
657+
658+unityapi::MirSurfaceInterface* TopLevelWindowModel::inputMethodSurface() const
659+{
660+ return m_inputMethodWindow ? m_inputMethodWindow->surface() : nullptr;
661+}
662+
663+Window* TopLevelWindowModel::focusedWindow() const
664+{
665+ return m_focusedWindow;
666+}
667+
668+void TopLevelWindowModel::move(int from, int to)
669+{
670+ if (from == to) return;
671+ DEBUG_MSG << " from=" << from << " to=" << to;
672+
673+ if (from >= 0 && from < m_windowModel.size() && to >= 0 && to < m_windowModel.size()) {
674+ QModelIndex parent;
675+ /* When moving an item down, the destination index needs to be incremented
676+ by one, as explained in the documentation:
677+ http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html#beginMoveRows */
678+
679+ Q_ASSERT(m_modelState == IdleState);
680+ m_modelState = MovingState;
681+
682+ beginMoveRows(parent, from, from, parent, to + (to > from ? 1 : 0));
683+#if QT_VERSION < QT_VERSION_CHECK(5, 6, 0)
684+ const auto &window = m_windowModel.takeAt(from);
685+ m_windowModel.insert(to, window);
686+#else
687+ m_windowModel.move(from, to);
688+#endif
689+ endMoveRows();
690+
691+ Q_EMIT listChanged();
692+ m_modelState = IdleState;
693+
694+ INFO_MSG << " after " << toString();
695+ }
696+}
697+void TopLevelWindowModel::onModificationsStarted()
698+{
699+}
700+
701+void TopLevelWindowModel::onModificationsEnded()
702+{
703+ if (m_focusedWindowChanged) {
704+ setFocusedWindow(m_newlyFocusedWindow);
705+ }
706+ // reset
707+ m_focusedWindowChanged = false;
708+ m_newlyFocusedWindow = nullptr;
709+}
710+
711+void TopLevelWindowModel::activateTopMostWindowWithoutId(int forbiddenId)
712+{
713+ DEBUG_MSG << "(" << forbiddenId << ")";
714+
715+ for (int i = 0; i < m_windowModel.count(); ++i) {
716+ Window *window = m_windowModel[i].window;
717+ if (window->id() != forbiddenId) {
718+ window->activate();
719+ }
720+ }
721+}
plugins/WindowManager/TopLevelWindowModel.hnew file+266
@@ -0,0 +1,266 @@
1+/*
2+ * Copyright (C) 2016-2017 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef TOPLEVELWINDOWMODEL_H
18+#define TOPLEVELWINDOWMODEL_H
19+
20+#include <QAbstractListModel>
21+#include <QLoggingCategory>
22+
23+#include "WindowManagerGlobal.h"
24+
25+Q_DECLARE_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL)
26+
27+class Window;
28+
29+namespace unity {
30+ namespace shell {
31+ namespace application {
32+ class ApplicationInfoInterface;
33+ class ApplicationManagerInterface;
34+ class MirSurfaceInterface;
35+ class SurfaceManagerInterface;
36+ }
37+ }
38+}
39+
40+/**
41+ * @brief A model of top-level surfaces
42+ *
43+ * It's an abstraction of top-level application windows.
44+ *
45+ * When an entry first appears, it normaly doesn't have a surface yet, meaning that the application is
46+ * still starting up. A shell should then display a splash screen or saved screenshot of the application
47+ * until its surface comes up.
48+ *
49+ * As applications can have multiple surfaces and you can also have entries without surfaces at all,
50+ * the only way to unambiguously refer to an entry in this model is through its id.
51+ */
52+class WINDOWMANAGERQML_EXPORT TopLevelWindowModel : public QAbstractListModel
53+{
54+ Q_OBJECT
55+
56+ /**
57+ * @brief Number of top-level surfaces in this model
58+ *
59+ * This is the same as rowCount, added in order to keep compatibility with QML ListModels.
60+ */
61+ Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
62+
63+ /**
64+ * @brief The input method surface, if any
65+ *
66+ * The surface of a onscreen keyboard (akak "virtual keyboard") would be kept here and not in the model itself.
67+ */
68+ Q_PROPERTY(unity::shell::application::MirSurfaceInterface* inputMethodSurface READ inputMethodSurface NOTIFY inputMethodSurfaceChanged)
69+
70+ /**
71+ * @brief The currently focused window, if any
72+ */
73+ Q_PROPERTY(Window* focusedWindow READ focusedWindow NOTIFY focusedWindowChanged)
74+
75+ Q_PROPERTY(unity::shell::application::SurfaceManagerInterface* surfaceManager
76+ READ surfaceManager
77+ WRITE setSurfaceManager
78+ NOTIFY surfaceManagerChanged)
79+
80+ Q_PROPERTY(unity::shell::application::ApplicationManagerInterface* applicationManager
81+ READ applicationManager
82+ WRITE setApplicationManager
83+ NOTIFY applicationManagerChanged)
84+
85+ /**
86+ The id to be used on the next entry created
87+ Useful for tests
88+ */
89+ Q_PROPERTY(int nextId READ nextId NOTIFY nextIdChanged)
90+
91+public:
92+ /**
93+ * @brief The Roles supported by the model
94+ *
95+ * WindowRole - A Window.
96+ * ApplicationRole - An ApplicationInfoInterface
97+ */
98+ enum Roles {
99+ WindowRole = Qt::UserRole,
100+ ApplicationRole = Qt::UserRole + 1,
101+ };
102+
103+ TopLevelWindowModel();
104+
105+ // From QAbstractItemModel
106+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
107+ QVariant data(const QModelIndex& index, int role) const override;
108+ QHash<int, QByteArray> roleNames() const override {
109+ QHash<int, QByteArray> roleNames { {WindowRole, "window"},
110+ {ApplicationRole, "application"} };
111+ return roleNames;
112+ }
113+
114+ // Own API
115+
116+ unity::shell::application::MirSurfaceInterface* inputMethodSurface() const;
117+ Window* focusedWindow() const;
118+
119+ unity::shell::application::ApplicationManagerInterface *applicationManager() const { return m_applicationManager; }
120+ void setApplicationManager(unity::shell::application::ApplicationManagerInterface*);
121+
122+ unity::shell::application::SurfaceManagerInterface *surfaceManager() const { return m_surfaceManager; }
123+ void setSurfaceManager(unity::shell::application::SurfaceManagerInterface*);
124+
125+ int nextId() const { return m_nextId; }
126+
127+public:
128+ /**
129+ * @brief Returns the surface at the given index
130+ *
131+ * It will be a nullptr if the application is still starting up and thus hasn't yet created
132+ * and drawn into a surface.
133+ *
134+ * Same as windowAt(index).surface()
135+ */
136+ Q_INVOKABLE unity::shell::application::MirSurfaceInterface *surfaceAt(int index) const;
137+
138+ /**
139+ * @brief Returns the window at the given index
140+ *
141+ * Will always be valid
142+ */
143+ Q_INVOKABLE Window *windowAt(int index) const;
144+
145+ /**
146+ * @brief Returns the application at the given index
147+ */
148+ Q_INVOKABLE unity::shell::application::ApplicationInfoInterface *applicationAt(int index) const;
149+
150+ /**
151+ * @brief Returns the unique id of the element at the given index
152+ */
153+ Q_INVOKABLE int idAt(int index) const;
154+
155+ /**
156+ * @brief Returns the index where the row with the given id is located
157+ *
158+ * Returns -1 if there's no row with the given id.
159+ */
160+ Q_INVOKABLE int indexForId(int id) const;
161+
162+ /**
163+ * @brief Raises the row with the given id to the top of the window stack (index == count-1)
164+ */
165+ Q_INVOKABLE void raiseId(int id);
166+
167+Q_SIGNALS:
168+ void countChanged();
169+ void inputMethodSurfaceChanged(unity::shell::application::MirSurfaceInterface* inputMethodSurface);
170+ void focusedWindowChanged(Window *focusedWindow);
171+ void applicationManagerChanged(unity::shell::application::ApplicationManagerInterface*);
172+ void surfaceManagerChanged(unity::shell::application::SurfaceManagerInterface*);
173+
174+ /**
175+ * @brief Emitted when the list changes
176+ *
177+ * Emitted when model gains an element, loses an element or when elements exchange positions.
178+ */
179+ void listChanged();
180+
181+ void nextIdChanged();
182+
183+private Q_SLOTS:
184+ void onSurfaceCreated(unity::shell::application::MirSurfaceInterface *surface);
185+ void onSurfacesRaised(const QVector<unity::shell::application::MirSurfaceInterface*> &surfaces);
186+
187+ void onModificationsStarted();
188+ void onModificationsEnded();
189+
190+private:
191+ void doRaiseId(int id);
192+ int generateId();
193+ int nextFreeId(int candidateId, const int latestId);
194+ int nextId(int id) const;
195+ QString toString();
196+ int indexOf(unity::shell::application::MirSurfaceInterface *surface);
197+
198+ void setInputMethodWindow(Window *window);
199+ void setFocusedWindow(Window *window);
200+ void removeInputMethodWindow();
201+ int findIndexOf(const unity::shell::application::MirSurfaceInterface *surface) const;
202+ void deleteAt(int index);
203+ void removeAt(int index);
204+
205+ void addApplication(unity::shell::application::ApplicationInfoInterface *application);
206+ void removeApplication(unity::shell::application::ApplicationInfoInterface *application);
207+
208+ void prependPlaceholder(unity::shell::application::ApplicationInfoInterface *application);
209+ void prependSurface(unity::shell::application::MirSurfaceInterface *surface,
210+ unity::shell::application::ApplicationInfoInterface *application);
211+ void prependSurfaceHelper(unity::shell::application::MirSurfaceInterface *surface,
212+ unity::shell::application::ApplicationInfoInterface *application);
213+ void prependWindow(Window *window, unity::shell::application::ApplicationInfoInterface *application);
214+
215+ void connectWindow(Window *window);
216+ void connectSurface(unity::shell::application::MirSurfaceInterface *surface);
217+
218+ void onSurfaceDied(unity::shell::application::MirSurfaceInterface *surface);
219+ void onSurfaceDestroyed(unity::shell::application::MirSurfaceInterface *surface);
220+
221+ void move(int from, int to);
222+
223+ void activateEmptyWindow(Window *window);
224+
225+ void activateTopMostWindowWithoutId(int forbiddenId);
226+
227+ Window *createWindow(unity::shell::application::MirSurfaceInterface *surface);
228+
229+ struct ModelEntry {
230+ ModelEntry() {}
231+ ModelEntry(Window *window,
232+ unity::shell::application::ApplicationInfoInterface *application)
233+ : window(window), application(application) {}
234+ Window *window{nullptr};
235+ unity::shell::application::ApplicationInfoInterface *application{nullptr};
236+ bool removeOnceSurfaceDestroyed{false};
237+ };
238+
239+ QVector<ModelEntry> m_windowModel;
240+ Window* m_inputMethodWindow{nullptr};
241+ Window* m_focusedWindow{nullptr};
242+
243+ int m_nextId{1};
244+ // Just something big enough that we don't risk running out of unused id numbers.
245+ // Not sure if QML int type supports something close to std::numeric_limits<int>::max() and
246+ // there's no reason to try out its limits.
247+ static const int m_maxId{1000000};
248+
249+ unity::shell::application::ApplicationManagerInterface* m_applicationManager{nullptr};
250+ unity::shell::application::SurfaceManagerInterface *m_surfaceManager{nullptr};
251+
252+ enum ModelState {
253+ IdleState,
254+ InsertingState,
255+ RemovingState,
256+ MovingState,
257+ ResettingState
258+ };
259+ ModelState m_modelState{IdleState};
260+
261+ // Valid between modificationsStarted and modificationsEnded
262+ bool m_focusedWindowChanged{false};
263+ Window *m_newlyFocusedWindow{nullptr};
264+};
265+
266+#endif // TOPLEVELWINDOWMODEL_H
plugins/WindowManager/Window.cppnew file+268
@@ -0,0 +1,268 @@
1+/*
2+ * Copyright (C) 2016-2017 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 "Window.h"
18+
19+// unity-api
20+#include <unity/shell/application/MirSurfaceInterface.h>
21+
22+#include <QQmlEngine>
23+#include <QTextStream>
24+
25+namespace unityapi = unity::shell::application;
26+
27+Q_LOGGING_CATEGORY(UNITY_WINDOW, "unity.window", QtWarningMsg)
28+
29+#define DEBUG_MSG qCDebug(UNITY_WINDOW).nospace() << qPrintable(toString()) << "::" << __func__
30+
31+Window::Window(int id, QObject *parent)
32+ : QObject(parent)
33+ , m_id(id)
34+{
35+ DEBUG_MSG << "()";
36+ QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
37+}
38+
39+Window::~Window()
40+{
41+ DEBUG_MSG << "()";
42+}
43+
44+QPoint Window::position() const
45+{
46+ return m_position;
47+}
48+
49+QPoint Window::requestedPosition() const
50+{
51+ return m_requestedPosition;
52+}
53+
54+void Window::setRequestedPosition(const QPoint &value)
55+{
56+ m_positionRequested = true;
57+ if (value != m_requestedPosition) {
58+ m_requestedPosition = value;
59+ Q_EMIT requestedPositionChanged(m_requestedPosition);
60+ if (m_surface) {
61+ m_surface->setRequestedPosition(value);
62+ } else {
63+ // fake-miral: always comply
64+ m_position = m_requestedPosition;
65+ Q_EMIT positionChanged(m_position);
66+ }
67+ }
68+}
69+
70+bool Window::allowClientResize() const
71+{
72+ return m_allowClientResize;
73+}
74+
75+void Window::setAllowClientResize(bool value)
76+{
77+ if (value != m_allowClientResize) {
78+ DEBUG_MSG << "("<<value<<")";
79+ m_allowClientResize = value;
80+ if (m_surface) {
81+ m_surface->setAllowClientResize(value);
82+ }
83+ Q_EMIT allowClientResizeChanged(m_allowClientResize);
84+ }
85+}
86+
87+Mir::State Window::state() const
88+{
89+ return m_state;
90+}
91+
92+bool Window::focused() const
93+{
94+ return m_focused;
95+}
96+
97+bool Window::confinesMousePointer() const
98+{
99+ if (m_surface) {
100+ return m_surface->confinesMousePointer();
101+ } else {
102+ return false;
103+ }
104+}
105+
106+int Window::id() const
107+{
108+ return m_id;
109+}
110+
111+unityapi::MirSurfaceInterface* Window::surface() const
112+{
113+ return m_surface;
114+}
115+
116+void Window::requestState(Mir::State state)
117+{
118+ m_stateRequested = true;
119+ if (m_surface) {
120+ m_surface->requestState(state);
121+ } else if (m_state != state) {
122+ m_state = state;
123+ Q_EMIT stateChanged(m_state);
124+ }
125+}
126+
127+void Window::close()
128+{
129+ if (m_surface) {
130+ m_surface->close();
131+ } else {
132+ Q_EMIT closeRequested();
133+ }
134+}
135+
136+void Window::activate()
137+{
138+ DEBUG_MSG << "()";
139+ if (m_surface) {
140+ m_surface->activate();
141+ } else {
142+ Q_EMIT emptyWindowActivated();
143+ }
144+}
145+
146+void Window::setSurface(unityapi::MirSurfaceInterface *surface)
147+{
148+ DEBUG_MSG << "(" << surface << ")";
149+ if (m_surface) {
150+ disconnect(m_surface, 0, this, 0);
151+ }
152+
153+ m_surface = surface;
154+
155+ if (m_surface) {
156+ connect(surface, &unityapi::MirSurfaceInterface::focusRequested, this, [this]() {
157+ Q_EMIT focusRequested();
158+ });
159+
160+ connect(surface, &unityapi::MirSurfaceInterface::closeRequested, this, &Window::closeRequested);
161+
162+ connect(surface, &unityapi::MirSurfaceInterface::positionChanged, this, [this]() {
163+ updatePosition();
164+ });
165+
166+ connect(surface, &unityapi::MirSurfaceInterface::stateChanged, this, [this]() {
167+ updateState();
168+ });
169+
170+ connect(surface, &unityapi::MirSurfaceInterface::focusedChanged, this, [this]() {
171+ updateFocused();
172+ });
173+
174+ connect(surface, &unityapi::MirSurfaceInterface::allowClientResizeChanged, this, [this]() {
175+ if (m_surface->allowClientResize() != m_allowClientResize) {
176+ m_allowClientResize = m_surface->allowClientResize();
177+ Q_EMIT allowClientResizeChanged(m_allowClientResize);
178+ }
179+ });
180+
181+ connect(surface, &unityapi::MirSurfaceInterface::liveChanged, this, &Window::liveChanged);
182+
183+ connect(surface, &QObject::destroyed, this, [this]() {
184+ setSurface(nullptr);
185+ });
186+
187+ // bring it up to speed
188+ if (m_positionRequested) {
189+ m_surface->setRequestedPosition(m_requestedPosition);
190+ }
191+ if (m_stateRequested && m_surface->state() == Mir::RestoredState) {
192+ m_surface->requestState(m_state);
193+ }
194+ m_surface->setAllowClientResize(m_allowClientResize);
195+
196+ // and sync with surface
197+ updatePosition();
198+ updateState();
199+ updateFocused();
200+ }
201+
202+ Q_EMIT surfaceChanged(surface);
203+}
204+
205+void Window::updatePosition()
206+{
207+ if (m_surface->position() != m_position) {
208+ m_position = m_surface->position();
209+ Q_EMIT positionChanged(m_position);
210+ }
211+}
212+
213+void Window::updateState()
214+{
215+ if (m_surface->state() != m_state) {
216+ m_state = m_surface->state();
217+ Q_EMIT stateChanged(m_state);
218+ }
219+}
220+
221+void Window::updateFocused()
222+{
223+ if (m_surface->focused() != m_focused) {
224+ m_focused = m_surface->focused();
225+ Q_EMIT focusedChanged(m_focused);
226+ }
227+}
228+
229+void Window::setFocused(bool value)
230+{
231+ if (value != m_focused) {
232+ DEBUG_MSG << "(" << value << ")";
233+ m_focused = value;
234+ Q_EMIT focusedChanged(m_focused);
235+ // when we have a surface we get focus changes from updateFocused() instead
236+ Q_ASSERT(!m_surface);
237+ }
238+}
239+
240+QString Window::toString() const
241+{
242+ QString result;
243+ {
244+ QTextStream stream(&result);
245+ stream << "Window["<<(void*)this<<", id="<<id()<<", ";
246+ if (surface()) {
247+ stream << "MirSurface["<<(void*)surface()<<",\""<<surface()->name()<<"\"]";
248+ } else {
249+ stream << "null";
250+ }
251+ stream << "]";
252+ }
253+ return result;
254+}
255+
256+QDebug operator<<(QDebug dbg, const Window *window)
257+{
258+ QDebugStateSaver saver(dbg);
259+ dbg.nospace();
260+
261+ if (window) {
262+ dbg << qPrintable(window->toString());
263+ } else {
264+ dbg << (void*)(window);
265+ }
266+
267+ return dbg;
268+}
plugins/WindowManager/Window.hnew file+176
@@ -0,0 +1,176 @@
1+/*
2+ * Copyright (C) 2016-2017 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_WINDOW_H
18+#define UNITY_WINDOW_H
19+
20+#include <QLoggingCategory>
21+#include <QObject>
22+#include <QPoint>
23+
24+// Unity API
25+#include <unity/shell/application/Mir.h>
26+
27+#include "WindowManagerGlobal.h"
28+
29+namespace unity {
30+ namespace shell {
31+ namespace application {
32+ class MirSurfaceInterface;
33+ }
34+ }
35+}
36+
37+Q_DECLARE_LOGGING_CATEGORY(UNITY_WINDOW)
38+
39+/**
40+ @brief A slightly higher concept than MirSurface
41+
42+ A Window exists before its MirSurface gets created (for splashscreen purposes)
43+ and might also hang around after the backing surface is gone (In case the application
44+ was killed to free up memory, as it should still remain in the window list since the user
45+ did not explicitly close it).
46+ */
47+class WINDOWMANAGERQML_EXPORT Window : public QObject
48+{
49+ Q_OBJECT
50+
51+ /**
52+ * @brief Position of the current surface buffer, in pixels.
53+ */
54+ Q_PROPERTY(QPoint position READ position NOTIFY positionChanged)
55+
56+ /**
57+ * @brief Requested position of the current surface buffer, in pixels.
58+ */
59+ Q_PROPERTY(QPoint requestedPosition READ requestedPosition WRITE setRequestedPosition NOTIFY requestedPositionChanged)
60+
61+ /**
62+ * @brief State of the surface
63+ */
64+ Q_PROPERTY(Mir::State state READ state NOTIFY stateChanged)
65+
66+ /**
67+ * @brief Whether the surface is focused
68+ *
69+ * It will be true if this surface is MirFocusControllerInterface::focusedSurface
70+ */
71+ Q_PROPERTY(bool focused READ focused NOTIFY focusedChanged)
72+
73+ /**
74+ * @brief Whether the surface wants to confine the mouse pointer within its boundaries
75+ *
76+ * If true, the surface doesn't want the mouse pointer to leave its boundaries while it's focused.
77+ */
78+ Q_PROPERTY(bool confinesMousePointer READ confinesMousePointer NOTIFY confinesMousePointerChanged)
79+
80+ /**
81+ * @brief A unique identifier for this window.
82+ * Useful for telling windows apart in a list model as they get moved around
83+ */
84+ Q_PROPERTY(int id READ id CONSTANT)
85+
86+ /**
87+ * @brief Surface backing up this window
88+ * It might be null if a surface hasn't been created yet (application is starting up) or if
89+ * the corresponding application has been killed (but can still get restarted to continue from
90+ * where it left)
91+ */
92+ Q_PROPERTY(unity::shell::application::MirSurfaceInterface* surface READ surface NOTIFY surfaceChanged)
93+
94+ /**
95+ * @brief Whether to comply to resize requests coming from the client side
96+ *
97+ * It's true by default
98+ */
99+ Q_PROPERTY(bool allowClientResize READ allowClientResize WRITE setAllowClientResize NOTIFY allowClientResizeChanged)
100+
101+public:
102+ Window(int id, QObject *parent = nullptr);
103+ virtual ~Window();
104+ QPoint position() const;
105+ QPoint requestedPosition() const;
106+ void setRequestedPosition(const QPoint &);
107+ Mir::State state() const;
108+ bool focused() const;
109+ bool confinesMousePointer() const;
110+ int id() const;
111+ unity::shell::application::MirSurfaceInterface* surface() const;
112+
113+ void setSurface(unity::shell::application::MirSurfaceInterface *surface);
114+ void setFocused(bool value);
115+
116+ bool allowClientResize() const;
117+ void setAllowClientResize(bool);
118+
119+ QString toString() const;
120+
121+public Q_SLOTS:
122+ /**
123+ * @brief Requests a change to the specified state
124+ */
125+ void requestState(Mir::State state);
126+
127+ /**
128+ * @brief Sends a close request
129+ *
130+ */
131+ void close();
132+
133+ /**
134+ * @brief Focuses and raises the window
135+ */
136+ void activate();
137+
138+Q_SIGNALS:
139+ void closeRequested();
140+ void emptyWindowActivated();
141+
142+ void positionChanged(QPoint position);
143+ void requestedPositionChanged(QPoint position);
144+ void stateChanged(Mir::State value);
145+ void focusedChanged(bool value);
146+ void confinesMousePointerChanged(bool value);
147+ void surfaceChanged(unity::shell::application::MirSurfaceInterface *surface);
148+ void allowClientResizeChanged(bool value);
149+ void liveChanged(bool value);
150+
151+ /**
152+ * @brief Emitted when focus for this window is requested by an external party
153+ */
154+ void focusRequested();
155+
156+private:
157+ void updatePosition();
158+ void updateState();
159+ void updateFocused();
160+
161+ QPoint m_position;
162+ QPoint m_requestedPosition;
163+ bool m_positionRequested{false};
164+ bool m_focused{false};
165+ int m_id;
166+ Mir::State m_state{Mir::RestoredState};
167+ bool m_stateRequested{false};
168+ unity::shell::application::MirSurfaceInterface *m_surface{nullptr};
169+
170+ bool m_allowClientResize{true};
171+};
172+
173+QDebug operator<<(QDebug dbg, const Window *window);
174+
175+Q_DECLARE_METATYPE(Window*)
176+#endif // UNITY_WINDOW_H
tests/mocks/LightDM/IntegratedLightDM/QLightDM/Greeter → plugins/WindowManager/WindowManagerGlobal.hrenamed+8−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2017 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,4 +14,10 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−#include "../liblightdm/Greeter.h"
17+#include <QtCore/QtGlobal>
18+
19+#if defined(WINDOWMANAGERQML_LIBRARY)
20+# define WINDOWMANAGERQML_EXPORT Q_DECL_EXPORT
21+#else
22+# define WINDOWMANAGERQML_EXPORT Q_DECL_IMPORT
23+#endif
plugins/WindowManager/WindowManagerPlugin.cpp+10−3
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2016 Canonical, Ltd.
2+ * Copyright (C) 2016-2017 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,13 +16,20 @@
1616
1717#include "WindowManagerPlugin.h"
1818
19−#include "TopLevelSurfaceList.h"
19+#include "AvailableDesktopArea.h"
20+#include "TopLevelWindowModel.h"
21+#include "Window.h"
22+#include "WindowMargins.h"
2023
2124#include <QtQml>
2225
2326void WindowManagerPlugin::registerTypes(const char *uri)
2427{
25− qmlRegisterType<TopLevelSurfaceList>(uri, 0, 1, "TopLevelSurfaceList");
28+ qmlRegisterType<AvailableDesktopArea>(uri, 1, 0, "AvailableDesktopArea");
29+ qmlRegisterType<TopLevelWindowModel>(uri, 1, 0, "TopLevelWindowModel");
30+ qmlRegisterType<WindowMargins>(uri, 1, 0, "WindowMargins");
31+
32+ qRegisterMetaType<Window*>("Window*");
2633
2734 qRegisterMetaType<QAbstractListModel*>("QAbstractListModel*");
2835}
plugins/WindowManager/WindowMargins.cppnew file+74
@@ -0,0 +1,74 @@
1+/*
2+ * Copyright (C) 2017 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "WindowMargins.h"
18+
19+#include <QGuiApplication>
20+#include <QQuickWindow>
21+#include <qpa/qplatformnativeinterface.h>
22+
23+void WindowMargins::setNormal(QRectF value)
24+{
25+ if (m_normal == value) {
26+ return;
27+ }
28+
29+ m_normal = value;
30+
31+ if (window()) {
32+ QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
33+ nativeInterface->setWindowProperty(window()->handle(), "normalWindowMargins", QVariant(m_normal.toRect()));
34+ }
35+
36+ Q_EMIT normalChanged();
37+}
38+
39+QRectF WindowMargins::normal() const
40+{
41+ return m_normal;
42+}
43+
44+void WindowMargins::setDialog(QRectF value)
45+{
46+ if (m_dialog == value) {
47+ return;
48+ }
49+
50+ m_dialog = value;
51+
52+ if (window()) {
53+ QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
54+ nativeInterface->setWindowProperty(window()->handle(), "dialogWindowMargins", QVariant(m_dialog.toRect()));
55+ }
56+
57+ Q_EMIT dialogChanged();
58+}
59+
60+QRectF WindowMargins::dialog() const
61+{
62+ return m_dialog;
63+}
64+
65+void WindowMargins::itemChange(ItemChange change, const ItemChangeData &data)
66+{
67+ if (change == ItemSceneChange && data.window != nullptr) {
68+ QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
69+ if (!m_normal.isNull()) {
70+ nativeInterface->setWindowProperty(data.window->handle(), "normalWindowMargins", QVariant(m_normal.toRect()));
71+ nativeInterface->setWindowProperty(data.window->handle(), "dialogWindowMargins", QVariant(m_dialog.toRect()));
72+ }
73+ }
74+}
plugins/WindowManager/WindowMargins.hnew file+59
@@ -0,0 +1,59 @@
1+/*
2+ * Copyright (C) 2017 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef WINDOWMARGINS_H
18+#define WINDOWMARGINS_H
19+
20+#include <QQuickItem>
21+#include <QRectF>
22+
23+/*
24+ * Specifies window margins for different Mir window types
25+ *
26+ * Used to inform MirAL so that it can take window management decisions that match
27+ * the visuals drawn by Unity.
28+ */
29+class WindowMargins : public QQuickItem
30+{
31+ Q_OBJECT
32+
33+ // Margins for windows of normal type
34+ Q_PROPERTY(QRectF normal READ normal WRITE setNormal NOTIFY normalChanged)
35+
36+ // Margins for windows of dialog type
37+ Q_PROPERTY(QRectF dialog READ dialog WRITE setDialog NOTIFY dialogChanged)
38+
39+ // TODO: Add margins for other window types as needed
40+
41+public:
42+ QRectF normal() const;
43+ void setNormal(QRectF value);
44+
45+ QRectF dialog() const;
46+ void setDialog(QRectF value);
47+
48+protected:
49+ void itemChange(ItemChange change, const ItemChangeData &value) override;
50+
51+Q_SIGNALS:
52+ void normalChanged();
53+ void dialogChanged();
54+private:
55+ QRectF m_normal;
56+ QRectF m_dialog;
57+};
58+
59+#endif // WINDOWMARGINS_H
plugins/Wizard/PageList.cpp+5−6
@@ -46,7 +46,9 @@ PageList::PageList(QObject *parent)
4646 QSet<QString> disabledPages;
4747 QStringList dataDirs;
4848
49− if (!isRunningInstalled() && getenv("WIZARD_TESTING") == nullptr) {
49+ if (getenv("WIZARD_TESTING") != nullptr) {
50+ dataDirs = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
51+ } else if (!isRunningInstalled()) {
5052 dataDirs << qmlDirectory();
5153 } else {
5254 dataDirs = shellDataDirs();
@@ -71,11 +73,8 @@ PageList::PageList(QObject *parent)
7173 // If there was a system update installed, skip until the last page to just greet the user
7274 QSettings settings;
7375 if (settings.value(QStringLiteral("Wizard/SkipUntilFinishedPage")).toBool()) {
74− const QString lastPage = m_pages.lastKey();
75− Q_FOREACH(const QString &page, m_pages.keys()) {
76− if (Q_UNLIKELY(page != lastPage)) {
77− m_pages.remove(page);
78− }
76+ while (m_pages.count() > 1) {
77+ m_pages.erase(m_pages.begin());
7978 }
8079
8180 // ... and reset it again for the next run
plugins/Wizard/timezonemodel.h+1−1
@@ -27,7 +27,6 @@ class TimeZoneLocationModel: public QAbstractListModel
2727 Q_PROPERTY(bool listUpdating READ listUpdating NOTIFY listUpdatingChanged)
2828 Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY filterChanged)
2929 Q_PROPERTY(QString country READ country WRITE setCountry NOTIFY countryChanged)
30− Q_ENUMS(Roles)
3130
3231public:
3332 explicit TimeZoneLocationModel(QObject *parent = nullptr);
@@ -42,6 +41,7 @@ public:
4241 LatitudeRole,
4342 LongitudeRole
4443 };
44+ Q_ENUM(Roles)
4545
4646 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
4747 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
po/aa.po+184−137
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+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,86 +15,114 @@ 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-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr "Cuumita "
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr ""
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr ""
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr ""
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr ""
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr "Qagis"
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr ""
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr ""
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr ""
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr "Kat"
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr ""
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr "Eweq"
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr ""
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr "Koflis"
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr "Eweq"
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr "Bayis"
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr "Wadir-ugus"
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr "Wadir-ugussuh digga maay litoo?"
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr "Maleey"
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr "Yeey"
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr "Cayla"
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
90118msgstr "Timmi haytuh digga maay litoo?"
91119
92−#: qml/Components/Dialogs.qml:205
120+#: qml/Components/Dialogs.qml:244
93121msgctxt "Button: Power off the system"
94122msgid "Power off"
95123msgstr "Timmi hayis"
96124
97−#: qml/Components/Dialogs.qml:214
125+#: qml/Components/Dialogs.qml:255
98126msgctxt "Button: Restart the system"
99127msgid "Restart"
100128msgstr "Wadir-qimbis"
@@ -120,7 +148,7 @@ msgid "Alt + PrtScr"
120148msgstr ""
121149
122150#: qml/Components/KeyboardShortcutsOverlay.qml:80
123−msgid "Takes a screenshot of a window."
151+msgid "Takes a screenshot of the current window."
124152msgstr ""
125153
126154#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -139,127 +167,143 @@ msgstr ""
139167msgid "Switches to previous keyboard layout."
140168msgstr ""
141169
142−#: qml/Components/KeyboardShortcutsOverlay.qml:118
170+#: qml/Components/KeyboardShortcutsOverlay.qml:114
171+msgid "Ctrl + Alt + T"
172+msgstr ""
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:119
175+msgid "Starts the Terminal application."
176+msgstr ""
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:131
143179msgid "Launcher"
144180msgstr ""
145181
146−#: qml/Components/KeyboardShortcutsOverlay.qml:125
182+#: qml/Components/KeyboardShortcutsOverlay.qml:138
147183msgid "Super (Hold)"
148184msgstr ""
149185
150−#: qml/Components/KeyboardShortcutsOverlay.qml:130
186+#: qml/Components/KeyboardShortcutsOverlay.qml:143
151187msgid "Opens the launcher, displays shortcuts."
152188msgstr ""
153189
154−#: qml/Components/KeyboardShortcutsOverlay.qml:138
190+#: qml/Components/KeyboardShortcutsOverlay.qml:151
155191msgid "Alt + F1"
156192msgstr ""
157193
158−#: qml/Components/KeyboardShortcutsOverlay.qml:143
194+#: qml/Components/KeyboardShortcutsOverlay.qml:156
159195msgid "Opens launcher keyboard navigation mode."
160196msgstr ""
161197
162−#: qml/Components/KeyboardShortcutsOverlay.qml:151
198+#: qml/Components/KeyboardShortcutsOverlay.qml:164
163199msgid "Super + Tab"
164200msgstr ""
165201
166−#: qml/Components/KeyboardShortcutsOverlay.qml:156
202+#: qml/Components/KeyboardShortcutsOverlay.qml:169
167203msgid "Switches applications via the launcher."
168204msgstr ""
169205
170−#: qml/Components/KeyboardShortcutsOverlay.qml:164
171−msgid "Super + 0 to 9"
206+#: qml/Components/KeyboardShortcutsOverlay.qml:177
207+msgid "Super + 1 to 0"
172208msgstr ""
173209
174−#: qml/Components/KeyboardShortcutsOverlay.qml:169
210+#: qml/Components/KeyboardShortcutsOverlay.qml:182
175211msgid "Same as clicking on a launcher icon."
176212msgstr ""
177213
178−#: qml/Components/KeyboardShortcutsOverlay.qml:181
214+#: qml/Components/KeyboardShortcutsOverlay.qml:190
215+msgid "Super + A"
216+msgstr ""
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:195
219+msgid "Opens the Application Drawer."
220+msgstr ""
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:207
179223msgid "Scopes"
180224msgstr ""
181225
182−#: qml/Components/KeyboardShortcutsOverlay.qml:188
226+#: qml/Components/KeyboardShortcutsOverlay.qml:214
183227msgid "Super (Tap)"
184228msgstr ""
185229
186−#: qml/Components/KeyboardShortcutsOverlay.qml:193
230+#: qml/Components/KeyboardShortcutsOverlay.qml:219
187231msgid "Opens the Scopes home."
188232msgstr ""
189233
190−#: qml/Components/KeyboardShortcutsOverlay.qml:209
234+#: qml/Components/KeyboardShortcutsOverlay.qml:235
191235msgid "Switching"
192236msgstr ""
193237
194−#: qml/Components/KeyboardShortcutsOverlay.qml:216
238+#: qml/Components/KeyboardShortcutsOverlay.qml:242
195239msgid "Alt + Tab"
196240msgstr ""
197241
198−#: qml/Components/KeyboardShortcutsOverlay.qml:221
242+#: qml/Components/KeyboardShortcutsOverlay.qml:247
199243msgid "Switches between applications."
200244msgstr ""
201245
202−#: qml/Components/KeyboardShortcutsOverlay.qml:229
246+#: qml/Components/KeyboardShortcutsOverlay.qml:255
203247msgid "Super + W"
204248msgstr ""
205249
206−#: qml/Components/KeyboardShortcutsOverlay.qml:234
250+#: qml/Components/KeyboardShortcutsOverlay.qml:260
207251msgid "Opens the desktop spread."
208252msgstr ""
209253
210−#: qml/Components/KeyboardShortcutsOverlay.qml:242
254+#: qml/Components/KeyboardShortcutsOverlay.qml:268
211255msgid "Cursor Left or Right"
212256msgstr ""
213257
214−#: qml/Components/KeyboardShortcutsOverlay.qml:247
258+#: qml/Components/KeyboardShortcutsOverlay.qml:273
215259msgid "Moves the focus."
216260msgstr ""
217261
218−#: qml/Components/KeyboardShortcutsOverlay.qml:259
262+#: qml/Components/KeyboardShortcutsOverlay.qml:285
219263msgid "Windows"
220264msgstr ""
221265
222−#: qml/Components/KeyboardShortcutsOverlay.qml:266
266+#: qml/Components/KeyboardShortcutsOverlay.qml:292
223267msgid "Ctrl + Super + D"
224268msgstr ""
225269
226−#: qml/Components/KeyboardShortcutsOverlay.qml:271
270+#: qml/Components/KeyboardShortcutsOverlay.qml:297
227271msgid "Minimizes all windows."
228272msgstr ""
229273
230−#: qml/Components/KeyboardShortcutsOverlay.qml:279
274+#: qml/Components/KeyboardShortcutsOverlay.qml:305
231275msgid "Ctrl + Super + Up"
232276msgstr ""
233277
234−#: qml/Components/KeyboardShortcutsOverlay.qml:284
278+#: qml/Components/KeyboardShortcutsOverlay.qml:310
235279msgid "Maximizes the current window."
236280msgstr ""
237281
238−#: qml/Components/KeyboardShortcutsOverlay.qml:292
282+#: qml/Components/KeyboardShortcutsOverlay.qml:318
239283msgid "Ctrl + Super + Down"
240284msgstr ""
241285
242−#: qml/Components/KeyboardShortcutsOverlay.qml:297
286+#: qml/Components/KeyboardShortcutsOverlay.qml:323
243287msgid "Minimizes or restores the current window."
244288msgstr ""
245289
246−#: qml/Components/KeyboardShortcutsOverlay.qml:305
290+#: qml/Components/KeyboardShortcutsOverlay.qml:331
247291msgid "Ctrl + Super + Left or Right"
248292msgstr ""
249293
250−#: qml/Components/KeyboardShortcutsOverlay.qml:310
294+#: qml/Components/KeyboardShortcutsOverlay.qml:336
251295msgid "Semi-maximizes the current window."
252296msgstr ""
253297
254−#: qml/Components/KeyboardShortcutsOverlay.qml:318
298+#: qml/Components/KeyboardShortcutsOverlay.qml:344
255299msgid "Alt + F4"
256300msgstr ""
257301
258−#: qml/Components/KeyboardShortcutsOverlay.qml:323
302+#: qml/Components/KeyboardShortcutsOverlay.qml:349
259303msgid "Closes the current window."
260304msgstr ""
261305
262−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
306+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
263307msgid "Return to Call"
264308msgstr "Seecol gacis"
265309
@@ -267,7 +311,7 @@ msgstr "Seecol gacis"
267311msgid "Emergency Call"
268312msgstr ""
269313
270−#: qml/Components/Lockscreen.qml:244
314+#: qml/Components/Lockscreen.qml:245
271315msgid "OK"
272316msgstr "Hayya"
273317
@@ -281,29 +325,29 @@ msgstr ""
281325msgid "%1:%2"
282326msgstr ""
283327
284−#: qml/Components/ModeSwitchWarningDialog.qml:32
328+#: qml/Components/ModeSwitchWarningDialog.qml:33
285329msgid "Apps may have unsaved data:"
286330msgstr ""
287331
288−#: qml/Components/ModeSwitchWarningDialog.qml:57
332+#: qml/Components/ModeSwitchWarningDialog.qml:60
289333msgctxt ""
290334"Re-dock means connect the device again to an external screen/mouse/keyboard"
291335msgid "Re-dock, save your work and close these apps to continue."
292336msgstr ""
293337
294−#: qml/Components/ModeSwitchWarningDialog.qml:63
338+#: qml/Components/ModeSwitchWarningDialog.qml:67
295339msgid "Or force close now (unsaved data will be lost)."
296340msgstr ""
297341
298−#: qml/Components/ModeSwitchWarningDialog.qml:75
342+#: qml/Components/ModeSwitchWarningDialog.qml:80
299343msgid "OK, I will reconnect"
300344msgstr ""
301345
302−#: qml/Components/ModeSwitchWarningDialog.qml:76
346+#: qml/Components/ModeSwitchWarningDialog.qml:81
303347msgid "Reconnect now!"
304348msgstr ""
305349
306−#: qml/Components/ModeSwitchWarningDialog.qml:88
350+#: qml/Components/ModeSwitchWarningDialog.qml:94
307351msgid "Close all"
308352msgstr "Inkih alif"
309353
@@ -311,6 +355,28 @@ msgstr "Inkih alif"
311355msgid "Preview Share Item"
312356msgstr ""
313357
358+#: qml/Components/VirtualTouchPad.qml:317
359+msgid ""
360+"Your device is now connected to an external display. Use this screen as a "
361+"touch pad to interact with the pointer."
362+msgstr ""
363+
364+#: qml/Components/VirtualTouchPad.qml:327
365+msgid "Tap left button to click."
366+msgstr ""
367+
368+#: qml/Components/VirtualTouchPad.qml:339
369+msgid "Tap right button to right click."
370+msgstr ""
371+
372+#: qml/Components/VirtualTouchPad.qml:351
373+msgid "Swipe with two fingers to scroll."
374+msgstr ""
375+
376+#: qml/Components/VirtualTouchPad.qml:396
377+msgid "Find more settings in the system settings."
378+msgstr ""
379+
314380#: qml/Dash/DashPageHeader.qml:361
315381msgctxt "Button: Open the Ubuntu Store"
316382msgid "Store"
@@ -342,24 +408,24 @@ msgstr ""
342408msgid "Reset"
343409msgstr ""
344410
345−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
411+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
346412msgid "Show less"
347413msgstr ""
348414
349−#: qml/Dash/GenericScopeView.qml:545
415+#: qml/Dash/GenericScopeView.qml:547
350416msgid "Show all"
351417msgstr ""
352418
353−#: qml/Dash/GenericScopeView.qml:576
419+#: qml/Dash/GenericScopeView.qml:578
354420msgctxt "Label: Hint for dash search line edit"
355421msgid "Search"
356422msgstr "Goranto"
357423
358−#: qml/Dash/PageHeaderExtraPanel.qml:57
424+#: qml/Dash/PageHeaderExtraPanel.qml:67
359425msgid "Recent Searches"
360426msgstr ""
361427
362−#: qml/Dash/PageHeaderExtraPanel.qml:68
428+#: qml/Dash/PageHeaderExtraPanel.qml:78
363429msgid "Clear All"
364430msgstr ""
365431
@@ -396,24 +462,18 @@ msgstr ""
396462msgid "Enable location data"
397463msgstr ""
398464
399−#: qml/Dash/ScopesList.qml:57
465+#: qml/Dash/ScopesList.qml:146
400466msgid "Manage"
401467msgstr ""
402468
403−#: qml/Dash/ScopesList.qml:104
469+#: qml/Dash/ScopesList.qml:187
404470msgid "Home"
405471msgstr "Dabqi"
406472
407−#: qml/Dash/ScopesList.qml:105
473+#: qml/Dash/ScopesList.qml:188
408474msgid "Also installed"
409475msgstr ""
410476
411−#: qml/DisabledScreenNotice.qml:109
412−msgid ""
413−"Your device is now connected to an external display. Use this screen as a "
414−"touch pad to interact with the pointer."
415−msgstr ""
416−
417477#: qml/Greeter/CoverPage.qml:127
418478msgid "Unlock"
419479msgstr ""
@@ -437,32 +497,45 @@ msgid_plural "Please wait %1 minutes and then try again…"
437497msgstr[0] "Maganak %1 minit qambaalaay, kaadu gabbat"
438498msgstr[1] "Maganak %1 minit qambaalaay, kaadu gabbat"
439499
440−#: qml/Greeter/Greeter.qml:596
500+#: qml/Greeter/Greeter.qml:550
441501msgid "Try again"
442502msgstr ""
443503
444−#: qml/Greeter/LoginList.qml:70
504+#: qml/Greeter/Greeter.qml:551
505+msgid "Enter passphrase to unlock"
506+msgstr ""
507+
508+#: qml/Greeter/Greeter.qml:552
509+msgid "Enter passcode to unlock"
510+msgstr ""
511+
512+#: qml/Greeter/NarrowView.qml:228
513+msgid "Emergency"
514+msgstr ""
515+
516+#: qml/Greeter/PromptList.qml:126
445517msgid "Passphrase"
446518msgstr ""
447519
448−#: qml/Greeter/LoginList.qml:71
520+#: qml/Greeter/PromptList.qml:126
449521msgid "Passcode"
450522msgstr ""
451523
452−#: qml/Greeter/LoginList.qml:98
453−msgid "Retry"
454−msgstr "Qagis"
524+#: qml/Greeter/SessionsList.qml:124
525+msgid "Select desktop environment"
526+msgstr ""
455527
456−#: qml/Greeter/LoginList.qml:99
457−msgid "Log In"
528+#: qml/Launcher/Drawer.qml:94
529+msgid "Search…"
458530msgstr ""
459531
460−#: qml/Greeter/NarrowView.qml:252
461−msgid "Emergency"
532+#: qml/Launcher/Drawer.qml:129
533+msgctxt "Apps sorted alphabetically"
534+msgid "A-Z"
462535msgstr ""
463536
464−#: qml/Greeter/SessionsList.qml:122
465−msgid "Select desktop environment"
537+#: qml/Launcher/MoreAppsHeader.qml:55
538+msgid "More apps in the store"
466539msgstr ""
467540
468541#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -477,62 +550,62 @@ msgstr ""
477550msgid "Conference"
478551msgstr "Koboxu"
479552
480−#: qml/Panel/Indicators/MenuItemFactory.qml:847
553+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
481554msgid "Nothing is playing"
482555msgstr ""
483556
484−#: qml/Panel/Indicators/MenuItemFactory.qml:975
557+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
485558#, qt-format
486559msgid "%1 hour"
487560msgid_plural "%1 hours"
488561msgstr[0] "%1 saaqata"
489562msgstr[1] "%1 saaqata"
490563
491−#: qml/Panel/Indicators/MenuItemFactory.qml:979
564+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
492565#, qt-format
493566msgid "%1 minute"
494567msgid_plural "%1 minutes"
495568msgstr[0] "%1 miniti"
496569msgstr[1] "%1 miniti"
497570
498−#: qml/Panel/Indicators/MenuItemFactory.qml:984
571+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
499572#, qt-format
500573msgid "%1 second"
501574msgid_plural "%1 seconds"
502575msgstr[0] "%1 nammayye"
503576msgstr[1] "%1 nammayye"
504577
505−#: qml/Panel/Indicators/MenuItemFactory.qml:987
578+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
506579msgid "0 seconds"
507580msgstr "0 nammayye"
508581
509582#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
510−#: qml/Panel/Indicators/MenuItemFactory.qml:989
583+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
511584#, qt-format
512585msgid "%1 remaining"
513586msgstr "%1 raaqe"
514587
515−#: qml/Panel/Indicators/MenuItemFactory.qml:995
588+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
516589msgid "In queue…"
517590msgstr ""
518591
519−#: qml/Panel/Indicators/MenuItemFactory.qml:999
592+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
520593msgid "Downloading"
521594msgstr "Qulluumah"
522595
523−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
596+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
524597msgid "Paused, tap to resume"
525598msgstr ""
526599
527−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
600+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
528601msgid "Canceled"
529602msgstr "Bayteh"
530603
531−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
604+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
532605msgid "Finished"
533606msgstr "Duudumteh"
534607
535−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
608+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
536609msgid "Failed, tap to retry"
537610msgstr ""
538611
@@ -552,12 +625,16 @@ msgctxt "Button: Call back on phone"
552625msgid "Call back"
553626msgstr ""
554627
628+#: qml/Panel/PanelMenuPage.qml:92
629+msgid "Back"
630+msgstr ""
631+
555632#: qml/Stage/SideStage.qml:76
556633msgid "Drag using 3 fingers any application from one window to the other"
557634msgstr ""
558635
559636#: qml/Tutorial/TutorialLeftLong.qml:49
560−msgid "Long swipe from the left edge to open the Today scope"
637+msgid "Long swipe from the left edge to open the Application Drawer"
561638msgstr ""
562639
563640#: qml/Tutorial/TutorialLeft.qml:47
@@ -586,7 +663,7 @@ msgid "Language"
586663msgstr ""
587664
588665#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
589−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
666+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
590667#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
591668#: qml/Wizard/Pages/70-passwd-type.qml:145
592669#: qml/Wizard/Pages/75-report-check.qml:84
@@ -607,25 +684,24 @@ msgstr ""
607684msgid "Keyboard layout"
608685msgstr ""
609686
610−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
611−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
612−#: qml/Wizard/Pages/sim.qml:101
687+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
688+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
613689msgid "Skip"
614690msgstr "Kaqit"
615691
616−#: qml/Wizard/Pages/30-wifi.qml:31
692+#: qml/Wizard/Pages/30-wifi.qml:30
617693msgid "Connect to Wi‑Fi"
618694msgstr ""
619695
620−#: qml/Wizard/Pages/30-wifi.qml:132
696+#: qml/Wizard/Pages/30-wifi.qml:131
621697msgid "Connected"
622698msgstr ""
623699
624−#: qml/Wizard/Pages/30-wifi.qml:165
700+#: qml/Wizard/Pages/30-wifi.qml:164
625701msgid "Available Wi-Fi networks"
626702msgstr ""
627703
628−#: qml/Wizard/Pages/30-wifi.qml:166
704+#: qml/Wizard/Pages/30-wifi.qml:165
629705msgid "No available Wi-Fi networks"
630706msgstr ""
631707
@@ -712,35 +788,6 @@ msgstr ""
712788msgid "Privacy policy"
713789msgstr ""
714790
715−#: qml/Wizard/Pages/77-system-update.qml:28
716−msgid "Update Device"
717−msgstr ""
718−
719−#: qml/Wizard/Pages/77-system-update.qml:55
720−msgid ""
721−"There is a system update available and ready to install. Afterwards, the "
722−"device will automatically restart."
723−msgstr ""
724−
725−#: qml/Wizard/Pages/77-system-update.qml:76
726−msgctxt "string identifying name of the update"
727−msgid "Ubuntu system"
728−msgstr ""
729−
730−#: qml/Wizard/Pages/77-system-update.qml:83
731−#, qt-format
732−msgctxt "version of the system update"
733−msgid "Version %1"
734−msgstr ""
735−
736−#: qml/Wizard/Pages/77-system-update.qml:102
737−msgid "This could take a few minutes..."
738−msgstr ""
739−
740−#: qml/Wizard/Pages/77-system-update.qml:116
741−msgid "Install and restart now"
742−msgstr ""
743−
744791#: qml/Wizard/Pages/80-finished.qml:89
745792msgid "Welcome to Ubuntu"
746793msgstr ""
po/am.po+223−144
@@ -7,83 +7,111 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-11-16 10:44+0000\n"
11−"PO-Revision-Date: 2016-08-13 14:45+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11+"PO-Revision-Date: 2017-01-26 15:04+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-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr "የ መግቢያ ቃል: "
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr "የ ተጠቃሚ ስም"
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr "ማረጋገጥ አልተቻለም"
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr "እባክዎን እንደገና ይሞክሩ ዋጋ የሌለው የመግቢያ ቃል"
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr "መግቢያ"
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr "እንደገና ይሞክሩ"
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr "መግቢያ"
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr "የ እንግዳ ክፍለ ጊዜ"
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr "አቋራጭ ማጣበቂያ"
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr "ማጥፊያ"
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr "አቋራጭ መለያያ"
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr "መውጫ"
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr "በእርግጥ መውጣት ይፈልጋሉ?"
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr "መቆለፊያ"
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr "መውጫ"
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr "መሰረዣ"
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr "እንደገና ማስነሻ"
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr "በእርግጥ እንደገና ማስነሳት ይፈልጋሉ?"
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr "አይ"
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr "አዎ"
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr "ሐይል"
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
@@ -91,12 +119,12 @@ msgstr ""
91119"በእርግጥ ሐይሉን ማጥፋት\n"
92120"ይፈልጋሉ?"
93121
94−#: qml/Components/Dialogs.qml:205
122+#: qml/Components/Dialogs.qml:244
95123msgctxt "Button: Power off the system"
96124msgid "Power off"
97125msgstr "ሐይል ማጥፊያ"
98126
99−#: qml/Components/Dialogs.qml:214
127+#: qml/Components/Dialogs.qml:255
100128msgctxt "Button: Restart the system"
101129msgid "Restart"
102130msgstr "እንደገና ማስጀመሪያ"
@@ -122,8 +150,8 @@ msgid "Alt + PrtScr"
122150msgstr "Alt + PrtScr"
123151
124152#: qml/Components/KeyboardShortcutsOverlay.qml:80
125−msgid "Takes a screenshot of a window."
126−msgstr "የ መስኮት መመልከቻ ፎቶ ማንሻ"
153+msgid "Takes a screenshot of the current window."
154+msgstr "የ አሁኑን መስኮት ፎቶ ማንሻ"
127155
128156#: qml/Components/KeyboardShortcutsOverlay.qml:88
129157msgid "Super + Space"
@@ -141,127 +169,143 @@ msgstr "Super + Shift + Space"
141169msgid "Switches to previous keyboard layout."
142170msgstr "ወዳለፈው የ ፊደል ገበታ እቅድ መቀየሪያ"
143171
144−#: qml/Components/KeyboardShortcutsOverlay.qml:118
172+#: qml/Components/KeyboardShortcutsOverlay.qml:114
173+msgid "Ctrl + Alt + T"
174+msgstr "Ctrl + Alt + T"
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:119
177+msgid "Starts the Terminal application."
178+msgstr "የ ተርሚናል መተግበሪያ ማስጀመሪያ"
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:131
145181msgid "Launcher"
146182msgstr "ማስነሻ"
147183
148−#: qml/Components/KeyboardShortcutsOverlay.qml:125
184+#: qml/Components/KeyboardShortcutsOverlay.qml:138
149185msgid "Super (Hold)"
150186msgstr "Super (ይጫኑ)"
151187
152−#: qml/Components/KeyboardShortcutsOverlay.qml:130
188+#: qml/Components/KeyboardShortcutsOverlay.qml:143
153189msgid "Opens the launcher, displays shortcuts."
154190msgstr "ማስነሻውን መክፈቻ እና አቋራጮች ማሳያ"
155191
156−#: qml/Components/KeyboardShortcutsOverlay.qml:138
192+#: qml/Components/KeyboardShortcutsOverlay.qml:151
157193msgid "Alt + F1"
158194msgstr "Alt + F1"
159195
160−#: qml/Components/KeyboardShortcutsOverlay.qml:143
196+#: qml/Components/KeyboardShortcutsOverlay.qml:156
161197msgid "Opens launcher keyboard navigation mode."
162198msgstr "መክፈቻ በ ፊደል ገበታ መቃኛ ዘዴ ማስነሻ"
163199
164−#: qml/Components/KeyboardShortcutsOverlay.qml:151
200+#: qml/Components/KeyboardShortcutsOverlay.qml:164
165201msgid "Super + Tab"
166202msgstr "Super + Tab"
167203
168−#: qml/Components/KeyboardShortcutsOverlay.qml:156
204+#: qml/Components/KeyboardShortcutsOverlay.qml:169
169205msgid "Switches applications via the launcher."
170206msgstr "መተግበሪያዎችን በ ማስጀመሪያ መቀየሪያ"
171207
172−#: qml/Components/KeyboardShortcutsOverlay.qml:164
173−msgid "Super + 0 to 9"
174−msgstr "Super + 0 እስከ 9"
208+#: qml/Components/KeyboardShortcutsOverlay.qml:177
209+msgid "Super + 1 to 0"
210+msgstr "Super + 1 ወደ 0"
175211
176−#: qml/Components/KeyboardShortcutsOverlay.qml:169
212+#: qml/Components/KeyboardShortcutsOverlay.qml:182
177213msgid "Same as clicking on a launcher icon."
178214msgstr "ተመሳሳይ በ ማስጀመሪያ ምልክት ላይ እንደ መጫን"
179215
180−#: qml/Components/KeyboardShortcutsOverlay.qml:181
216+#: qml/Components/KeyboardShortcutsOverlay.qml:190
217+msgid "Super + A"
218+msgstr "Super + A"
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:195
221+msgid "Opens the Application Drawer."
222+msgstr "መተግበሪያ መክፈቻ"
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
181225msgid "Scopes"
182226msgstr "ክልል"
183227
184−#: qml/Components/KeyboardShortcutsOverlay.qml:188
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
185229msgid "Super (Tap)"
186230msgstr "Super (Tap)"
187231
188−#: qml/Components/KeyboardShortcutsOverlay.qml:193
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
189233msgid "Opens the Scopes home."
190234msgstr "የ ክልል ቤት መክፈቻ"
191235
192−#: qml/Components/KeyboardShortcutsOverlay.qml:209
236+#: qml/Components/KeyboardShortcutsOverlay.qml:235
193237msgid "Switching"
194238msgstr "በ መቀየር ላይ"
195239
196−#: qml/Components/KeyboardShortcutsOverlay.qml:216
240+#: qml/Components/KeyboardShortcutsOverlay.qml:242
197241msgid "Alt + Tab"
198242msgstr "Alt + Tab"
199243
200−#: qml/Components/KeyboardShortcutsOverlay.qml:221
244+#: qml/Components/KeyboardShortcutsOverlay.qml:247
201245msgid "Switches between applications."
202246msgstr "በ መተግበሪያዎች መካከል መቀያየሪያ"
203247
204−#: qml/Components/KeyboardShortcutsOverlay.qml:229
248+#: qml/Components/KeyboardShortcutsOverlay.qml:255
205249msgid "Super + W"
206250msgstr "Super + W"
207251
208−#: qml/Components/KeyboardShortcutsOverlay.qml:234
252+#: qml/Components/KeyboardShortcutsOverlay.qml:260
209253msgid "Opens the desktop spread."
210254msgstr "የ ዴስክቶፕ ማስፊያ መክፈቻ"
211255
212−#: qml/Components/KeyboardShortcutsOverlay.qml:242
256+#: qml/Components/KeyboardShortcutsOverlay.qml:268
213257msgid "Cursor Left or Right"
214258msgstr "መጠቆሚያ የ ግራ ወይንም የ ቀኝ"
215259
216−#: qml/Components/KeyboardShortcutsOverlay.qml:247
260+#: qml/Components/KeyboardShortcutsOverlay.qml:273
217261msgid "Moves the focus."
218262msgstr "ትኩረት ማንቀሳቀሻ"
219263
220−#: qml/Components/KeyboardShortcutsOverlay.qml:259
264+#: qml/Components/KeyboardShortcutsOverlay.qml:285
221265msgid "Windows"
222266msgstr "መስኮቶች"
223267
224−#: qml/Components/KeyboardShortcutsOverlay.qml:266
268+#: qml/Components/KeyboardShortcutsOverlay.qml:292
225269msgid "Ctrl + Super + D"
226270msgstr "Ctrl + Super + D"
227271
228−#: qml/Components/KeyboardShortcutsOverlay.qml:271
272+#: qml/Components/KeyboardShortcutsOverlay.qml:297
229273msgid "Minimizes all windows."
230274msgstr "ሁሉንም መስኮቶች ማሳነሻ"
231275
232−#: qml/Components/KeyboardShortcutsOverlay.qml:279
276+#: qml/Components/KeyboardShortcutsOverlay.qml:305
233277msgid "Ctrl + Super + Up"
234278msgstr "Ctrl + Super + Up"
235279
236−#: qml/Components/KeyboardShortcutsOverlay.qml:284
280+#: qml/Components/KeyboardShortcutsOverlay.qml:310
237281msgid "Maximizes the current window."
238282msgstr "የ አሁኑን መስኮት ማሳደጊያ"
239283
240−#: qml/Components/KeyboardShortcutsOverlay.qml:292
284+#: qml/Components/KeyboardShortcutsOverlay.qml:318
241285msgid "Ctrl + Super + Down"
242286msgstr "Ctrl + Super + Down"
243287
244−#: qml/Components/KeyboardShortcutsOverlay.qml:297
288+#: qml/Components/KeyboardShortcutsOverlay.qml:323
245289msgid "Minimizes or restores the current window."
246290msgstr "የ አሁኑን መስኮትማሳነሻ ወይንም እንደ ነበር መመለሻ"
247291
248−#: qml/Components/KeyboardShortcutsOverlay.qml:305
292+#: qml/Components/KeyboardShortcutsOverlay.qml:331
249293msgid "Ctrl + Super + Left or Right"
250294msgstr "Ctrl + Super + Left or Right"
251295
252−#: qml/Components/KeyboardShortcutsOverlay.qml:310
296+#: qml/Components/KeyboardShortcutsOverlay.qml:336
253297msgid "Semi-maximizes the current window."
254298msgstr "የ አሁኑን መስኮት በ ንዑስ-ማሳደጊያ"
255299
256−#: qml/Components/KeyboardShortcutsOverlay.qml:318
300+#: qml/Components/KeyboardShortcutsOverlay.qml:344
257301msgid "Alt + F4"
258302msgstr "Alt + F4"
259303
260−#: qml/Components/KeyboardShortcutsOverlay.qml:323
304+#: qml/Components/KeyboardShortcutsOverlay.qml:349
261305msgid "Closes the current window."
262306msgstr "የ አሁኑን መስኮት መዝጊያ"
263307
264−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
265309msgid "Return to Call"
266310msgstr "ወደ ጥሪ መመለሻ"
267311
@@ -269,7 +313,7 @@ msgstr "ወደ ጥሪ መመለሻ"
269313msgid "Emergency Call"
270314msgstr "የ ድንገተኛ ጥሪ"
271315
272−#: qml/Components/Lockscreen.qml:244
316+#: qml/Components/Lockscreen.qml:245
273317msgid "OK"
274318msgstr "እሺ"
275319
@@ -283,29 +327,29 @@ msgstr "%1:%2:%3"
283327msgid "%1:%2"
284328msgstr "%1:%2"
285329
286−#: qml/Components/ModeSwitchWarningDialog.qml:32
330+#: qml/Components/ModeSwitchWarningDialog.qml:33
287331msgid "Apps may have unsaved data:"
288332msgstr "መተግበሪያው ያልተቀመጠ ዳታ ይዟል:"
289333
290−#: qml/Components/ModeSwitchWarningDialog.qml:57
334+#: qml/Components/ModeSwitchWarningDialog.qml:60
291335msgctxt ""
292336"Re-dock means connect the device again to an external screen/mouse/keyboard"
293337msgid "Re-dock, save your work and close these apps to continue."
294338msgstr "እንደገና-ማሳረፊያ: ስራዎትን ያስቀምጡ እና ይዝጉ መተግበሪያው እንዲቀጥል"
295339
296−#: qml/Components/ModeSwitchWarningDialog.qml:63
340+#: qml/Components/ModeSwitchWarningDialog.qml:67
297341msgid "Or force close now (unsaved data will be lost)."
298342msgstr "ወይንም አሁን አስገድዶ ማጥፊያ (ያልተቀመጠ ዳታ ይጠፋል)"
299343
300−#: qml/Components/ModeSwitchWarningDialog.qml:75
344+#: qml/Components/ModeSwitchWarningDialog.qml:80
301345msgid "OK, I will reconnect"
302346msgstr "እሺ: እኔ አሁን እንደገና እገናኛለሁ"
303347
304−#: qml/Components/ModeSwitchWarningDialog.qml:76
348+#: qml/Components/ModeSwitchWarningDialog.qml:81
305349msgid "Reconnect now!"
306350msgstr "አሁን እንደገና መገናኛ!"
307351
308−#: qml/Components/ModeSwitchWarningDialog.qml:88
352+#: qml/Components/ModeSwitchWarningDialog.qml:94
309353msgid "Close all"
310354msgstr "ሁሉንም መዝጊያ"
311355
@@ -313,6 +357,28 @@ msgstr "ሁሉንም መዝጊያ"
313357msgid "Preview Share Item"
314358msgstr "የሚካፈሉትን እቃ ቅድመ እይታ"
315359
360+#: qml/Components/VirtualTouchPad.qml:317
361+msgid ""
362+"Your device is now connected to an external display. Use this screen as a "
363+"touch pad to interact with the pointer."
364+msgstr "የ እርስዎ አካል አሁን ከ ውጪ ማሳያ ጋር ተገናኝቷል: ይህን መመልከቻ እንደ ተችፓድ መጠቀሚያ"
365+
366+#: qml/Components/VirtualTouchPad.qml:327
367+msgid "Tap left button to click."
368+msgstr "መታ ያድርጉ በ ግራ ቁልፍ ላይ ለ መጫን"
369+
370+#: qml/Components/VirtualTouchPad.qml:339
371+msgid "Tap right button to right click."
372+msgstr "መታ ያድርጉ በ ቀኝ ቁልፍ ላይ ለ መጫን"
373+
374+#: qml/Components/VirtualTouchPad.qml:351
375+msgid "Swipe with two fingers to scroll."
376+msgstr "ለ መሽብለል በ ሁለት ጣት ይጥረጉ"
377+
378+#: qml/Components/VirtualTouchPad.qml:396
379+msgid "Find more settings in the system settings."
380+msgstr "ተጨማሪ ማሰናጃዎችን ያግኙ በ ስርአት ማሰናጃ ውስጥ"
381+
316382#: qml/Dash/DashPageHeader.qml:361
317383msgctxt "Button: Open the Ubuntu Store"
318384msgid "Store"
@@ -344,24 +410,24 @@ msgstr "የ እርስዎን ውጤቶች እንደገና ማጣሪያ"
344410msgid "Reset"
345411msgstr "እንደ ነበረ መመለሻ"
346412
347−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
413+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
348414msgid "Show less"
349415msgstr "ትንሽ ማሳያ"
350416
351−#: qml/Dash/GenericScopeView.qml:545
417+#: qml/Dash/GenericScopeView.qml:547
352418msgid "Show all"
353419msgstr "ሁሉንም ማሳያ"
354420
355−#: qml/Dash/GenericScopeView.qml:576
421+#: qml/Dash/GenericScopeView.qml:578
356422msgctxt "Label: Hint for dash search line edit"
357423msgid "Search"
358424msgstr "መፈለጊያ"
359425
360−#: qml/Dash/PageHeaderExtraPanel.qml:57
426+#: qml/Dash/PageHeaderExtraPanel.qml:67
361427msgid "Recent Searches"
362428msgstr "የ ቅርብ ጊዜ ፍለጋዎች"
363429
364−#: qml/Dash/PageHeaderExtraPanel.qml:68
430+#: qml/Dash/PageHeaderExtraPanel.qml:78
365431msgid "Clear All"
366432msgstr "ሁሉንም ማጽጃ"
367433
@@ -398,24 +464,18 @@ msgstr "ይልቀቁ ለማነቃቃት…"
398464msgid "Enable location data"
399465msgstr "የአካባቢ ዳታ ማስቻያ"
400466
401−#: qml/Dash/ScopesList.qml:57
467+#: qml/Dash/ScopesList.qml:146
402468msgid "Manage"
403469msgstr "አስተዳዳሪ"
404470
405−#: qml/Dash/ScopesList.qml:104
471+#: qml/Dash/ScopesList.qml:187
406472msgid "Home"
407473msgstr "ቤት"
408474
409−#: qml/Dash/ScopesList.qml:105
475+#: qml/Dash/ScopesList.qml:188
410476msgid "Also installed"
411477msgstr "እንዲሁም የተገጠሙ"
412478
413−#: qml/DisabledScreenNotice.qml:109
414−msgid ""
415−"Your device is now connected to an external display. Use this screen as a "
416−"touch pad to interact with the pointer."
417−msgstr "የ እርስዎ አካል አሁን ከ ውጪ ማሳያ ጋር ተገናኝቷል: ይህን መመልከቻ እንደ ተችፓድ መጠቀሚያ"
418−
419479#: qml/Greeter/CoverPage.qml:127
420480msgid "Unlock"
421481msgstr "መክፈቻ"
@@ -439,33 +499,46 @@ msgid_plural "Please wait %1 minutes and then try again…"
439499msgstr[0] "እባክዎን ይቆዩ %1 ደቂቃ እና ከዛ እንደ ገና ይምክሩ…"
440500msgstr[1] "እባክዎን ይቆዩ %1 ደቂቃዎች እና ከዛ እንደ ገና ይምክሩ…"
441501
442−#: qml/Greeter/Greeter.qml:596
502+#: qml/Greeter/Greeter.qml:550
443503msgid "Try again"
444504msgstr "እንደገና ይሞክሩ"
445505
446−#: qml/Greeter/LoginList.qml:70
506+#: qml/Greeter/Greeter.qml:551
507+msgid "Enter passphrase to unlock"
508+msgstr "የ ማለፊያ ሀረግ ያስገቡ ለ መክፈት"
509+
510+#: qml/Greeter/Greeter.qml:552
511+msgid "Enter passcode to unlock"
512+msgstr "የ ማለፊያ ኮድ ያስገቡ ለ መክፈት"
513+
514+#: qml/Greeter/NarrowView.qml:228
515+msgid "Emergency"
516+msgstr "ድንገተኛ"
517+
518+#: qml/Greeter/PromptList.qml:126
447519msgid "Passphrase"
448520msgstr "የማለፊያ ሐረግ"
449521
450−#: qml/Greeter/LoginList.qml:71
522+#: qml/Greeter/PromptList.qml:126
451523msgid "Passcode"
452524msgstr "ማለፊያ ኮድ"
453525
454−#: qml/Greeter/LoginList.qml:98
455−msgid "Retry"
456−msgstr "እንደገና ይሞክሩ"
526+#: qml/Greeter/SessionsList.qml:124
527+msgid "Select desktop environment"
528+msgstr "የ ዴስክቶፕ አይነት ይምረጡ"
457529
458−#: qml/Greeter/LoginList.qml:99
459−msgid "Log In"
460−msgstr "መግቢያ"
530+#: qml/Launcher/Drawer.qml:94
531+msgid "Search…"
532+msgstr "መፈለጊያ..."
461533
462−#: qml/Greeter/NarrowView.qml:252
463−msgid "Emergency"
464−msgstr "ድንገተኛ"
534+#: qml/Launcher/Drawer.qml:129
535+msgctxt "Apps sorted alphabetically"
536+msgid "A-Z"
537+msgstr "A-Z"
465538
466−#: qml/Greeter/SessionsList.qml:122
467−msgid "Select desktop environment"
468−msgstr "የ ዴስክቶፕ አይነት ይምረጡ"
539+#: qml/Launcher/MoreAppsHeader.qml:55
540+msgid "More apps in the store"
541+msgstr "ተጨማሪ መተግበሪያ በ ሱቅ ውስጥ"
469542
470543#: qml/Notifications/NotificationMenuItemFactory.qml:124
471544msgid "Show password"
@@ -479,62 +552,62 @@ msgstr "ወደ ጥሪው ለመመለስ መታ ያድርጉ..."
479552msgid "Conference"
480553msgstr "ስብሰባ"
481554
482−#: qml/Panel/Indicators/MenuItemFactory.qml:847
555+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
483556msgid "Nothing is playing"
484557msgstr "ምንም አይጫወትም"
485558
486−#: qml/Panel/Indicators/MenuItemFactory.qml:975
559+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
487560#, qt-format
488561msgid "%1 hour"
489562msgid_plural "%1 hours"
490563msgstr[0] "%1 ሰአት"
491564msgstr[1] "%1 ሰአቶች"
492565
493−#: qml/Panel/Indicators/MenuItemFactory.qml:979
566+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
494567#, qt-format
495568msgid "%1 minute"
496569msgid_plural "%1 minutes"
497570msgstr[0] "%1 ደቂቃ"
498571msgstr[1] "%1 ደቂቃዎች"
499572
500−#: qml/Panel/Indicators/MenuItemFactory.qml:984
573+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
501574#, qt-format
502575msgid "%1 second"
503576msgid_plural "%1 seconds"
504577msgstr[0] "%1 ሰከንድ"
505578msgstr[1] "%1 ሰከንዶች"
506579
507−#: qml/Panel/Indicators/MenuItemFactory.qml:987
580+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
508581msgid "0 seconds"
509582msgstr "0 ሰከንዶች"
510583
511584#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
512−#: qml/Panel/Indicators/MenuItemFactory.qml:989
585+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
513586#, qt-format
514587msgid "%1 remaining"
515588msgstr "%1 የቀረው"
516589
517−#: qml/Panel/Indicators/MenuItemFactory.qml:995
590+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
518591msgid "In queue…"
519592msgstr "ወረፋ በመጠበቅ ላይ…"
520593
521−#: qml/Panel/Indicators/MenuItemFactory.qml:999
594+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
522595msgid "Downloading"
523596msgstr "በማውረድ ላይ"
524597
525−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
598+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
526599msgid "Paused, tap to resume"
527600msgstr "ማስቆሚያ: ለመቀጠል መታ ያድርጉ"
528601
529−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
602+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
530603msgid "Canceled"
531604msgstr "ተሰርዟል"
532605
533−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
606+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
534607msgid "Finished"
535608msgstr "ጨርሷል"
536609
537−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
610+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
538611msgid "Failed, tap to retry"
539612msgstr "አልተቻለም: እንደገና ለመሞከር መታ ያድርጉ"
540613
@@ -554,13 +627,17 @@ msgctxt "Button: Call back on phone"
554627msgid "Call back"
555628msgstr "መልሶ መደወያ"
556629
630+#: qml/Panel/PanelMenuPage.qml:92
631+msgid "Back"
632+msgstr "ወደ ኋላ"
633+
557634#: qml/Stage/SideStage.qml:76
558635msgid "Drag using 3 fingers any application from one window to the other"
559636msgstr "መጎተቻ 3 ጣቶች በ መጠቀም ማንኛውንም መተግበሪያ ከ አንድ መስኮት ወደ ሌላ"
560637
561638#: qml/Tutorial/TutorialLeftLong.qml:49
562−msgid "Long swipe from the left edge to open the Today scope"
563−msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
639+msgid "Long swipe from the left edge to open the Application Drawer"
640+msgstr "በረጅሙ ይጥረጉ ከ ግራ ጠርዝ በኩል መተግበሪያ ለ መክፈት ከ መሳቢያ ውስጥ"
564641
565642#: qml/Tutorial/TutorialLeft.qml:47
566643msgid "Short swipe from the left edge to open the launcher"
@@ -588,7 +665,7 @@ msgid "Language"
588665msgstr "ቋንቋ"
589666
590667#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
591−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
668+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
592669#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
593670#: qml/Wizard/Pages/70-passwd-type.qml:145
594671#: qml/Wizard/Pages/75-report-check.qml:84
@@ -609,25 +686,24 @@ msgstr "የ ፊደል ገበታ ቋንቋ"
609686msgid "Keyboard layout"
610687msgstr "የ ፊደል ገበታ አቀራረብ"
611688
612−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
613−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
614−#: qml/Wizard/Pages/sim.qml:101
689+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
690+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
615691msgid "Skip"
616692msgstr "መዝለያ"
617693
618−#: qml/Wizard/Pages/30-wifi.qml:31
694+#: qml/Wizard/Pages/30-wifi.qml:30
619695msgid "Connect to Wi‑Fi"
620696msgstr "ወደ ዋይ‑ፋይ መገናኛ"
621697
622−#: qml/Wizard/Pages/30-wifi.qml:132
698+#: qml/Wizard/Pages/30-wifi.qml:131
623699msgid "Connected"
624700msgstr "ተገናኝቷል"
625701
626−#: qml/Wizard/Pages/30-wifi.qml:165
702+#: qml/Wizard/Pages/30-wifi.qml:164
627703msgid "Available Wi-Fi networks"
628704msgstr "ዝግጁ የ ዋይ-ፋይ ኔትዎርኮች"
629705
630−#: qml/Wizard/Pages/30-wifi.qml:166
706+#: qml/Wizard/Pages/30-wifi.qml:165
631707msgid "No available Wi-Fi networks"
632708msgstr "ምንም ዝግጁ ዋይ-ፋይ ኔትዎርኮች አልተገኙም"
633709
@@ -714,35 +790,6 @@ msgstr "የ ስርአቱን አፈጻጸም ለማሻሻል የ ግጭት እና
714790msgid "Privacy policy"
715791msgstr "የ ግላዊነት መመሪያ"
716792
717−#: qml/Wizard/Pages/77-system-update.qml:28
718−msgid "Update Device"
719−msgstr "አካሉን ማሻሻያ"
720−
721−#: qml/Wizard/Pages/77-system-update.qml:55
722−msgid ""
723−"There is a system update available and ready to install. Afterwards, the "
724−"device will automatically restart."
725−msgstr "የ ስርአት ማሻሻያ ዝግጁ ነው ለ መግጠም: ከዚያ በኋላ አካሉ ራሱ በራሱ እንደገና ይጀምራል"
726−
727−#: qml/Wizard/Pages/77-system-update.qml:76
728−msgctxt "string identifying name of the update"
729−msgid "Ubuntu system"
730−msgstr "የ ኡቡቱ ስርአት"
731−
732−#: qml/Wizard/Pages/77-system-update.qml:83
733−#, qt-format
734−msgctxt "version of the system update"
735−msgid "Version %1"
736−msgstr "እትም %1"
737−
738−#: qml/Wizard/Pages/77-system-update.qml:102
739−msgid "This could take a few minutes..."
740−msgstr "ይህ ትንሽ ደቂቆች ይወስዳል"
741−
742−#: qml/Wizard/Pages/77-system-update.qml:116
743−msgid "Install and restart now"
744−msgstr "መግጠሚያ እና እንደገና ማስጀመሪያ"
745−
746793#: qml/Wizard/Pages/80-finished.qml:89
747794msgid "Welcome to Ubuntu"
748795msgstr "እንኳን ደህና መጡ ወደ ኡቡንቱ"
@@ -1286,8 +1333,40 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
12861333#~ msgid "Short or long swipe from the right edge to view your open apps"
12871334#~ msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
12881335
1336+#~ msgid "Long swipe from the left edge to open the Today scope"
1337+#~ msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
1338+
12891339#~ msgid "Swipe from the left edge to open the launcher"
12901340#~ msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
12911341
12921342#~ msgid "Hover your mouse on the right edge to view your open apps"
12931343#~ msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
1344+
1345+#~ msgid "Takes a screenshot of a window."
1346+#~ msgstr "የ መስኮት መመልከቻ ፎቶ ማንሻ"
1347+
1348+#~ msgid "Super + 0 to 9"
1349+#~ msgstr "Super + 0 እስከ 9"
1350+
1351+#~ msgid "Install and restart now"
1352+#~ msgstr "መግጠሚያ እና እንደገና ማስጀመሪያ"
1353+
1354+#~ msgid "This could take a few minutes..."
1355+#~ msgstr "ይህ ትንሽ ደቂቆች ይወስዳል"
1356+
1357+#, qt-format
1358+#~ msgctxt "version of the system update"
1359+#~ msgid "Version %1"
1360+#~ msgstr "እትም %1"
1361+
1362+#~ msgctxt "string identifying name of the update"
1363+#~ msgid "Ubuntu system"
1364+#~ msgstr "የ ኡቡቱ ስርአት"
1365+
1366+#~ msgid "Update Device"
1367+#~ msgstr "አካሉን ማሻሻያ"
1368+
1369+#~ msgid ""
1370+#~ "There is a system update available and ready to install. Afterwards, the "
1371+#~ "device will automatically restart."
1372+#~ msgstr "የ ስርአት ማሻሻያ ዝግጁ ነው ለ መግጠም: ከዚያ በኋላ አካሉ ራሱ በራሱ እንደገና ይጀምራል"
po/ar.po+219−166
@@ -7,8 +7,8 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-11-16 10:44+0000\n"
11−"PO-Revision-Date: 2015-07-29 09:41+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11+"PO-Revision-Date: 2017-01-14 05:20+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
1414"MIME-Version: 1.0\n"
@@ -16,75 +16,103 @@ 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-11-23 06:34+0000\n"
20−"X-Generator: Launchpad (build 18269)\n"
19+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
20+"X-Generator: Launchpad (build 18343)\n"
2121
22−#: plugins/LightDM/Greeter.cpp:123
22+#: plugins/LightDM/Greeter.cpp:188
2323msgid "Password: "
2424msgstr "كلمة السر: "
2525
26+#: plugins/LightDM/Greeter.cpp:203
27+msgid "Username"
28+msgstr ""
29+
30+#: plugins/LightDM/Greeter.cpp:242
31+msgid "Failed to authenticate"
32+msgstr ""
33+
34+#: plugins/LightDM/Greeter.cpp:244
35+msgid "Invalid password, please try again"
36+msgstr ""
37+
38+#: plugins/LightDM/Greeter.cpp:254
39+msgid "Log In"
40+msgstr ""
41+
42+#: plugins/LightDM/Greeter.cpp:254
43+msgid "Retry"
44+msgstr "إعادة المحاولة"
45+
46+#: plugins/LightDM/UsersModel.cpp:157
47+msgid "Login"
48+msgstr ""
49+
50+#: plugins/LightDM/UsersModel.cpp:165
51+msgid "Guest Session"
52+msgstr ""
53+
2654#: plugins/Unity/Launcher/launcheritem.cpp:49
27−#: plugins/Unity/Launcher/launcheritem.cpp:108
55+#: plugins/Unity/Launcher/launcheritem.cpp:123
2856msgid "Pin shortcut"
2957msgstr "تثبيت الاختصار"
3058
31−#: plugins/Unity/Launcher/launcheritem.cpp:54
59+#: plugins/Unity/Launcher/launcheritem.cpp:55
3260msgid "Quit"
3361msgstr "خروج"
3462
35−#: plugins/Unity/Launcher/launcheritem.cpp:108
63+#: plugins/Unity/Launcher/launcheritem.cpp:123
3664msgid "Unpin shortcut"
3765msgstr "إزالة تثبيت الاختصار"
3866
39−#: qml/Components/Dialogs.qml:149
67+#: qml/Components/Dialogs.qml:176
4068msgctxt "Title: Lock/Log out dialog"
4169msgid "Log out"
4270msgstr "خروج"
4371
44−#: qml/Components/Dialogs.qml:150
72+#: qml/Components/Dialogs.qml:177
4573msgid "Are you sure you want to log out?"
4674msgstr "هل أنت متأكد من رغبتك في تسجيل الخروج؟"
4775
48−#: qml/Components/Dialogs.qml:152
76+#: qml/Components/Dialogs.qml:180
4977msgctxt "Button: Lock the system"
5078msgid "Lock"
5179msgstr "أوصِد"
5280
53−#: qml/Components/Dialogs.qml:159
81+#: qml/Components/Dialogs.qml:191
5482msgctxt "Button: Log out from the system"
5583msgid "Log Out"
5684msgstr "خروج"
5785
58−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
59−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
6088#: qml/Wizard/Pages/passcode-confirm.qml:32
6189#: qml/Wizard/Pages/passcode-set.qml:32
6290msgid "Cancel"
6391msgstr "إلغاء"
6492
65−#: qml/Components/Dialogs.qml:178
93+#: qml/Components/Dialogs.qml:211
6694msgctxt "Title: Reboot dialog"
6795msgid "Reboot"
6896msgstr "إعادة التشغيل"
6997
70−#: qml/Components/Dialogs.qml:179
98+#: qml/Components/Dialogs.qml:212
7199msgid "Are you sure you want to reboot?"
72100msgstr "هل أنت متأكد من رغبتك في إعادة تشغيل الجهاز؟"
73101
74−#: qml/Components/Dialogs.qml:181
102+#: qml/Components/Dialogs.qml:215
75103msgid "No"
76104msgstr "لا"
77105
78−#: qml/Components/Dialogs.qml:187
106+#: qml/Components/Dialogs.qml:223
79107msgid "Yes"
80108msgstr "نعم"
81109
82−#: qml/Components/Dialogs.qml:202
110+#: qml/Components/Dialogs.qml:239
83111msgctxt "Title: Power off/Restart dialog"
84112msgid "Power"
85113msgstr "الطاقة"
86114
87−#: qml/Components/Dialogs.qml:203
115+#: qml/Components/Dialogs.qml:240
88116msgid ""
89117"Are you sure you would like\n"
90118"to power off?"
@@ -92,177 +120,193 @@ msgstr ""
92120"هل أنت متأكد من رغبتك\n"
93121"في إيقاف التشغيل؟"
94122
95−#: qml/Components/Dialogs.qml:205
123+#: qml/Components/Dialogs.qml:244
96124msgctxt "Button: Power off the system"
97125msgid "Power off"
98126msgstr "إيقاف التشغيل"
99127
100−#: qml/Components/Dialogs.qml:214
128+#: qml/Components/Dialogs.qml:255
101129msgctxt "Button: Restart the system"
102130msgid "Restart"
103131msgstr "إعادة التشغيل"
104132
105133#: qml/Components/KeyboardShortcutsOverlay.qml:41
106134msgid "Keyboard Shortcuts"
107−msgstr ""
135+msgstr "اختصارات لوحة المفاتيح"
108136
109137#: qml/Components/KeyboardShortcutsOverlay.qml:55
110138msgid "Unity 8"
111−msgstr ""
139+msgstr "يونتي 8"
112140
113141#: qml/Components/KeyboardShortcutsOverlay.qml:62
114142msgid "PrtScr"
115−msgstr ""
143+msgstr "PrtScr"
116144
117145#: qml/Components/KeyboardShortcutsOverlay.qml:67
118146msgid "Takes a screenshot."
119−msgstr ""
147+msgstr "أخذ لقطة للشاشة"
120148
121149#: qml/Components/KeyboardShortcutsOverlay.qml:75
122150msgid "Alt + PrtScr"
123−msgstr ""
151+msgstr "Alt + PrtScr"
124152
125153#: qml/Components/KeyboardShortcutsOverlay.qml:80
126−msgid "Takes a screenshot of a window."
154+msgid "Takes a screenshot of the current window."
127155msgstr ""
128156
129157#: qml/Components/KeyboardShortcutsOverlay.qml:88
130158msgid "Super + Space"
131−msgstr ""
159+msgstr "Super + Space"
132160
133161#: qml/Components/KeyboardShortcutsOverlay.qml:93
134162msgid "Switches to next keyboard layout."
135−msgstr ""
163+msgstr "للتحويل إلى مخطط لوحة المفاتيح التالي."
136164
137165#: qml/Components/KeyboardShortcutsOverlay.qml:101
138166msgid "Super + Shift + Space"
139−msgstr ""
167+msgstr "Super + Shift + Space"
140168
141169#: qml/Components/KeyboardShortcutsOverlay.qml:106
142170msgid "Switches to previous keyboard layout."
171+msgstr "للتحويل إلى مخطط لوحة المفاتيح السابق."
172+
173+#: qml/Components/KeyboardShortcutsOverlay.qml:114
174+msgid "Ctrl + Alt + T"
143175msgstr ""
144176
145−#: qml/Components/KeyboardShortcutsOverlay.qml:118
146−msgid "Launcher"
177+#: qml/Components/KeyboardShortcutsOverlay.qml:119
178+msgid "Starts the Terminal application."
147179msgstr ""
148180
149−#: qml/Components/KeyboardShortcutsOverlay.qml:125
181+#: qml/Components/KeyboardShortcutsOverlay.qml:131
182+msgid "Launcher"
183+msgstr "شريط بدء التطبيقات"
184+
185+#: qml/Components/KeyboardShortcutsOverlay.qml:138
150186msgid "Super (Hold)"
151−msgstr ""
187+msgstr "Super (Hold)"
152188
153−#: qml/Components/KeyboardShortcutsOverlay.qml:130
189+#: qml/Components/KeyboardShortcutsOverlay.qml:143
154190msgid "Opens the launcher, displays shortcuts."
155−msgstr ""
191+msgstr "لفتح شريط بدء التطبيقات، وإظهار الاختصارات."
156192
157−#: qml/Components/KeyboardShortcutsOverlay.qml:138
193+#: qml/Components/KeyboardShortcutsOverlay.qml:151
158194msgid "Alt + F1"
159−msgstr ""
195+msgstr "Alt + F1"
160196
161−#: qml/Components/KeyboardShortcutsOverlay.qml:143
197+#: qml/Components/KeyboardShortcutsOverlay.qml:156
162198msgid "Opens launcher keyboard navigation mode."
163199msgstr ""
164200
165−#: qml/Components/KeyboardShortcutsOverlay.qml:151
201+#: qml/Components/KeyboardShortcutsOverlay.qml:164
166202msgid "Super + Tab"
167−msgstr ""
203+msgstr "Super + Tab"
168204
169−#: qml/Components/KeyboardShortcutsOverlay.qml:156
205+#: qml/Components/KeyboardShortcutsOverlay.qml:169
170206msgid "Switches applications via the launcher."
171−msgstr ""
207+msgstr "للتحويل بين التطبيقات عبر شريط بدء التطبيقات."
172208
173−#: qml/Components/KeyboardShortcutsOverlay.qml:164
174−msgid "Super + 0 to 9"
209+#: qml/Components/KeyboardShortcutsOverlay.qml:177
210+msgid "Super + 1 to 0"
175211msgstr ""
176212
177−#: qml/Components/KeyboardShortcutsOverlay.qml:169
213+#: qml/Components/KeyboardShortcutsOverlay.qml:182
178214msgid "Same as clicking on a launcher icon."
215+msgstr "نفس إجراء الضغط على أيقونة في الشريط."
216+
217+#: qml/Components/KeyboardShortcutsOverlay.qml:190
218+msgid "Super + A"
219+msgstr "Super + A"
220+
221+#: qml/Components/KeyboardShortcutsOverlay.qml:195
222+msgid "Opens the Application Drawer."
179223msgstr ""
180224
181−#: qml/Components/KeyboardShortcutsOverlay.qml:181
225+#: qml/Components/KeyboardShortcutsOverlay.qml:207
182226msgid "Scopes"
183227msgstr ""
184228
185−#: qml/Components/KeyboardShortcutsOverlay.qml:188
229+#: qml/Components/KeyboardShortcutsOverlay.qml:214
186230msgid "Super (Tap)"
187231msgstr ""
188232
189−#: qml/Components/KeyboardShortcutsOverlay.qml:193
233+#: qml/Components/KeyboardShortcutsOverlay.qml:219
190234msgid "Opens the Scopes home."
191235msgstr ""
192236
193−#: qml/Components/KeyboardShortcutsOverlay.qml:209
237+#: qml/Components/KeyboardShortcutsOverlay.qml:235
194238msgid "Switching"
195−msgstr ""
239+msgstr "التبديل"
196240
197−#: qml/Components/KeyboardShortcutsOverlay.qml:216
241+#: qml/Components/KeyboardShortcutsOverlay.qml:242
198242msgid "Alt + Tab"
199−msgstr ""
243+msgstr "Alt + Tab"
200244
201−#: qml/Components/KeyboardShortcutsOverlay.qml:221
245+#: qml/Components/KeyboardShortcutsOverlay.qml:247
202246msgid "Switches between applications."
203−msgstr ""
247+msgstr "للتبديل بين التطبيقات المفتوحة."
204248
205−#: qml/Components/KeyboardShortcutsOverlay.qml:229
249+#: qml/Components/KeyboardShortcutsOverlay.qml:255
206250msgid "Super + W"
207251msgstr ""
208252
209−#: qml/Components/KeyboardShortcutsOverlay.qml:234
253+#: qml/Components/KeyboardShortcutsOverlay.qml:260
210254msgid "Opens the desktop spread."
211255msgstr ""
212256
213−#: qml/Components/KeyboardShortcutsOverlay.qml:242
257+#: qml/Components/KeyboardShortcutsOverlay.qml:268
214258msgid "Cursor Left or Right"
215259msgstr ""
216260
217−#: qml/Components/KeyboardShortcutsOverlay.qml:247
261+#: qml/Components/KeyboardShortcutsOverlay.qml:273
218262msgid "Moves the focus."
219−msgstr ""
263+msgstr "لنقل التركيز."
220264
221−#: qml/Components/KeyboardShortcutsOverlay.qml:259
265+#: qml/Components/KeyboardShortcutsOverlay.qml:285
222266msgid "Windows"
223−msgstr ""
267+msgstr "النوافذ"
224268
225−#: qml/Components/KeyboardShortcutsOverlay.qml:266
269+#: qml/Components/KeyboardShortcutsOverlay.qml:292
226270msgid "Ctrl + Super + D"
227−msgstr ""
271+msgstr "Ctrl + Super + D"
228272
229−#: qml/Components/KeyboardShortcutsOverlay.qml:271
273+#: qml/Components/KeyboardShortcutsOverlay.qml:297
230274msgid "Minimizes all windows."
231−msgstr ""
275+msgstr "لتصغير جميع النوافذ."
232276
233−#: qml/Components/KeyboardShortcutsOverlay.qml:279
277+#: qml/Components/KeyboardShortcutsOverlay.qml:305
234278msgid "Ctrl + Super + Up"
235−msgstr ""
279+msgstr "Ctrl + Super + Up"
236280
237−#: qml/Components/KeyboardShortcutsOverlay.qml:284
281+#: qml/Components/KeyboardShortcutsOverlay.qml:310
238282msgid "Maximizes the current window."
239−msgstr ""
283+msgstr "لتكبير النافذة الحالية."
240284
241−#: qml/Components/KeyboardShortcutsOverlay.qml:292
285+#: qml/Components/KeyboardShortcutsOverlay.qml:318
242286msgid "Ctrl + Super + Down"
243−msgstr ""
287+msgstr "Ctrl + Super + Down"
244288
245−#: qml/Components/KeyboardShortcutsOverlay.qml:297
289+#: qml/Components/KeyboardShortcutsOverlay.qml:323
246290msgid "Minimizes or restores the current window."
247−msgstr ""
291+msgstr "لتصغير او استعادة النافذة الحالية."
248292
249−#: qml/Components/KeyboardShortcutsOverlay.qml:305
293+#: qml/Components/KeyboardShortcutsOverlay.qml:331
250294msgid "Ctrl + Super + Left or Right"
251295msgstr ""
252296
253−#: qml/Components/KeyboardShortcutsOverlay.qml:310
297+#: qml/Components/KeyboardShortcutsOverlay.qml:336
254298msgid "Semi-maximizes the current window."
255299msgstr ""
256300
257−#: qml/Components/KeyboardShortcutsOverlay.qml:318
301+#: qml/Components/KeyboardShortcutsOverlay.qml:344
258302msgid "Alt + F4"
259303msgstr ""
260304
261−#: qml/Components/KeyboardShortcutsOverlay.qml:323
305+#: qml/Components/KeyboardShortcutsOverlay.qml:349
262306msgid "Closes the current window."
263307msgstr ""
264308
265−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
309+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
266310msgid "Return to Call"
267311msgstr "العودة إلى المكالمة"
268312
@@ -270,7 +314,7 @@ msgstr "العودة إلى المكالمة"
270314msgid "Emergency Call"
271315msgstr "مكالمة طوارئ"
272316
273−#: qml/Components/Lockscreen.qml:244
317+#: qml/Components/Lockscreen.qml:245
274318msgid "OK"
275319msgstr "موافق"
276320
@@ -284,29 +328,29 @@ msgstr ""
284328msgid "%1:%2"
285329msgstr ""
286330
287−#: qml/Components/ModeSwitchWarningDialog.qml:32
331+#: qml/Components/ModeSwitchWarningDialog.qml:33
288332msgid "Apps may have unsaved data:"
289333msgstr ""
290334
291−#: qml/Components/ModeSwitchWarningDialog.qml:57
335+#: qml/Components/ModeSwitchWarningDialog.qml:60
292336msgctxt ""
293337"Re-dock means connect the device again to an external screen/mouse/keyboard"
294338msgid "Re-dock, save your work and close these apps to continue."
295339msgstr ""
296340
297−#: qml/Components/ModeSwitchWarningDialog.qml:63
341+#: qml/Components/ModeSwitchWarningDialog.qml:67
298342msgid "Or force close now (unsaved data will be lost)."
299−msgstr ""
343+msgstr "أو أغلق إجباريا الآن (ستفقد أي بيانات غير محفوظة)."
300344
301−#: qml/Components/ModeSwitchWarningDialog.qml:75
345+#: qml/Components/ModeSwitchWarningDialog.qml:80
302346msgid "OK, I will reconnect"
303347msgstr ""
304348
305−#: qml/Components/ModeSwitchWarningDialog.qml:76
349+#: qml/Components/ModeSwitchWarningDialog.qml:81
306350msgid "Reconnect now!"
307351msgstr ""
308352
309−#: qml/Components/ModeSwitchWarningDialog.qml:88
353+#: qml/Components/ModeSwitchWarningDialog.qml:94
310354msgid "Close all"
311355msgstr ""
312356
@@ -314,6 +358,28 @@ msgstr ""
314358msgid "Preview Share Item"
315359msgstr ""
316360
361+#: qml/Components/VirtualTouchPad.qml:317
362+msgid ""
363+"Your device is now connected to an external display. Use this screen as a "
364+"touch pad to interact with the pointer."
365+msgstr ""
366+
367+#: qml/Components/VirtualTouchPad.qml:327
368+msgid "Tap left button to click."
369+msgstr "اضغط الزر الأيسر للنقر."
370+
371+#: qml/Components/VirtualTouchPad.qml:339
372+msgid "Tap right button to right click."
373+msgstr "اضغط الزر الأيمن للنقر الأيمن."
374+
375+#: qml/Components/VirtualTouchPad.qml:351
376+msgid "Swipe with two fingers to scroll."
377+msgstr ""
378+
379+#: qml/Components/VirtualTouchPad.qml:396
380+msgid "Find more settings in the system settings."
381+msgstr "اعثر على مزيد من الإعدادات في إعدادات النظام."
382+
317383#: qml/Dash/DashPageHeader.qml:361
318384msgctxt "Button: Open the Ubuntu Store"
319385msgid "Store"
@@ -345,24 +411,24 @@ msgstr ""
345411msgid "Reset"
346412msgstr ""
347413
348−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
414+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
349415msgid "Show less"
350−msgstr ""
416+msgstr "عرض أقل"
351417
352−#: qml/Dash/GenericScopeView.qml:545
418+#: qml/Dash/GenericScopeView.qml:547
353419msgid "Show all"
354−msgstr ""
420+msgstr "عرض الكل"
355421
356−#: qml/Dash/GenericScopeView.qml:576
422+#: qml/Dash/GenericScopeView.qml:578
357423msgctxt "Label: Hint for dash search line edit"
358424msgid "Search"
359425msgstr "بحث"
360426
361−#: qml/Dash/PageHeaderExtraPanel.qml:57
427+#: qml/Dash/PageHeaderExtraPanel.qml:67
362428msgid "Recent Searches"
363429msgstr ""
364430
365−#: qml/Dash/PageHeaderExtraPanel.qml:68
431+#: qml/Dash/PageHeaderExtraPanel.qml:78
366432msgid "Clear All"
367433msgstr ""
368434
@@ -399,24 +465,18 @@ msgstr "حرّر للتحديث..."
399465msgid "Enable location data"
400466msgstr "تفعيل بيانات الموقع"
401467
402−#: qml/Dash/ScopesList.qml:57
468+#: qml/Dash/ScopesList.qml:146
403469msgid "Manage"
404470msgstr "إدارة"
405471
406−#: qml/Dash/ScopesList.qml:104
472+#: qml/Dash/ScopesList.qml:187
407473msgid "Home"
408474msgstr "الرئيسية"
409475
410−#: qml/Dash/ScopesList.qml:105
476+#: qml/Dash/ScopesList.qml:188
411477msgid "Also installed"
412478msgstr "أيضا تم تثبيت"
413479
414−#: qml/DisabledScreenNotice.qml:109
415−msgid ""
416−"Your device is now connected to an external display. Use this screen as a "
417−"touch pad to interact with the pointer."
418−msgstr ""
419−
420480#: qml/Greeter/CoverPage.qml:127
421481msgid "Unlock"
422482msgstr "فك القفل"
@@ -446,32 +506,45 @@ msgstr[3] "برجاء الانتظار %1 دقائق ثم المحاولة مج
446506msgstr[4] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا..."
447507msgstr[5] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا..."
448508
449−#: qml/Greeter/Greeter.qml:596
509+#: qml/Greeter/Greeter.qml:550
450510msgid "Try again"
451511msgstr ""
452512
453−#: qml/Greeter/LoginList.qml:70
513+#: qml/Greeter/Greeter.qml:551
514+msgid "Enter passphrase to unlock"
515+msgstr ""
516+
517+#: qml/Greeter/Greeter.qml:552
518+msgid "Enter passcode to unlock"
519+msgstr ""
520+
521+#: qml/Greeter/NarrowView.qml:228
522+msgid "Emergency"
523+msgstr ""
524+
525+#: qml/Greeter/PromptList.qml:126
454526msgid "Passphrase"
455527msgstr ""
456528
457−#: qml/Greeter/LoginList.qml:71
529+#: qml/Greeter/PromptList.qml:126
458530msgid "Passcode"
459531msgstr ""
460532
461−#: qml/Greeter/LoginList.qml:98
462−msgid "Retry"
463−msgstr "إعادة المحاولة"
533+#: qml/Greeter/SessionsList.qml:124
534+msgid "Select desktop environment"
535+msgstr ""
464536
465−#: qml/Greeter/LoginList.qml:99
466−msgid "Log In"
537+#: qml/Launcher/Drawer.qml:94
538+msgid "Search…"
467539msgstr ""
468540
469−#: qml/Greeter/NarrowView.qml:252
470−msgid "Emergency"
541+#: qml/Launcher/Drawer.qml:129
542+msgctxt "Apps sorted alphabetically"
543+msgid "A-Z"
471544msgstr ""
472545
473−#: qml/Greeter/SessionsList.qml:122
474−msgid "Select desktop environment"
546+#: qml/Launcher/MoreAppsHeader.qml:55
547+msgid "More apps in the store"
475548msgstr ""
476549
477550#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -486,11 +559,11 @@ msgstr "انقر للعودة إلى المكالمة..."
486559msgid "Conference"
487560msgstr "مؤتمر"
488561
489−#: qml/Panel/Indicators/MenuItemFactory.qml:847
562+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
490563msgid "Nothing is playing"
491564msgstr "لا شيء مُشغّل"
492565
493−#: qml/Panel/Indicators/MenuItemFactory.qml:975
566+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
494567#, qt-format
495568msgid "%1 hour"
496569msgid_plural "%1 hours"
@@ -501,7 +574,7 @@ msgstr[3] "%1 ساعات"
501574msgstr[4] "%1 ساعة"
502575msgstr[5] "%1 ساعة"
503576
504−#: qml/Panel/Indicators/MenuItemFactory.qml:979
577+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
505578#, qt-format
506579msgid "%1 minute"
507580msgid_plural "%1 minutes"
@@ -512,7 +585,7 @@ msgstr[3] "%1 دقائق"
512585msgstr[4] "%1 دقيقة"
513586msgstr[5] "%1 دقيقة"
514587
515−#: qml/Panel/Indicators/MenuItemFactory.qml:984
588+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
516589#, qt-format
517590msgid "%1 second"
518591msgid_plural "%1 seconds"
@@ -523,37 +596,37 @@ msgstr[3] "%1 ثوان"
523596msgstr[4] "%1 ثانية"
524597msgstr[5] "%1 ثانية"
525598
526−#: qml/Panel/Indicators/MenuItemFactory.qml:987
599+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
527600msgid "0 seconds"
528601msgstr "أقل من ثانية"
529602
530603#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
531−#: qml/Panel/Indicators/MenuItemFactory.qml:989
604+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
532605#, qt-format
533606msgid "%1 remaining"
534607msgstr "باق %1"
535608
536−#: qml/Panel/Indicators/MenuItemFactory.qml:995
609+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
537610msgid "In queue…"
538611msgstr "في الانتظار..."
539612
540−#: qml/Panel/Indicators/MenuItemFactory.qml:999
613+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
541614msgid "Downloading"
542615msgstr "التنزيل"
543616
544−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
617+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
545618msgid "Paused, tap to resume"
546619msgstr "مُلبث، انقر للاستئناف"
547620
548−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
621+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
549622msgid "Canceled"
550623msgstr "تم إلغائه"
551624
552−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
625+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
553626msgid "Finished"
554627msgstr "انتهى"
555628
556−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
629+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
557630msgid "Failed, tap to retry"
558631msgstr "فشل، انقل لإعادة المحاولة"
559632
@@ -573,12 +646,16 @@ msgctxt "Button: Call back on phone"
573646msgid "Call back"
574647msgstr ""
575648
649+#: qml/Panel/PanelMenuPage.qml:92
650+msgid "Back"
651+msgstr ""
652+
576653#: qml/Stage/SideStage.qml:76
577654msgid "Drag using 3 fingers any application from one window to the other"
578655msgstr ""
579656
580657#: qml/Tutorial/TutorialLeftLong.qml:49
581−msgid "Long swipe from the left edge to open the Today scope"
658+msgid "Long swipe from the left edge to open the Application Drawer"
582659msgstr ""
583660
584661#: qml/Tutorial/TutorialLeft.qml:47
@@ -607,7 +684,7 @@ msgid "Language"
607684msgstr ""
608685
609686#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
610−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
687+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
611688#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
612689#: qml/Wizard/Pages/70-passwd-type.qml:145
613690#: qml/Wizard/Pages/75-report-check.qml:84
@@ -628,25 +705,24 @@ msgstr ""
628705msgid "Keyboard layout"
629706msgstr ""
630707
631−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
632−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
633−#: qml/Wizard/Pages/sim.qml:101
708+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
709+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
634710msgid "Skip"
635711msgstr "تخطي"
636712
637−#: qml/Wizard/Pages/30-wifi.qml:31
713+#: qml/Wizard/Pages/30-wifi.qml:30
638714msgid "Connect to Wi‑Fi"
639715msgstr "اتصل بالواي فاي"
640716
641−#: qml/Wizard/Pages/30-wifi.qml:132
717+#: qml/Wizard/Pages/30-wifi.qml:131
642718msgid "Connected"
643719msgstr ""
644720
645−#: qml/Wizard/Pages/30-wifi.qml:165
721+#: qml/Wizard/Pages/30-wifi.qml:164
646722msgid "Available Wi-Fi networks"
647723msgstr ""
648724
649−#: qml/Wizard/Pages/30-wifi.qml:166
725+#: qml/Wizard/Pages/30-wifi.qml:165
650726msgid "No available Wi-Fi networks"
651727msgstr ""
652728
@@ -733,35 +809,6 @@ msgstr ""
733809msgid "Privacy policy"
734810msgstr ""
735811
736−#: qml/Wizard/Pages/77-system-update.qml:28
737−msgid "Update Device"
738−msgstr ""
739−
740−#: qml/Wizard/Pages/77-system-update.qml:55
741−msgid ""
742−"There is a system update available and ready to install. Afterwards, the "
743−"device will automatically restart."
744−msgstr ""
745−
746−#: qml/Wizard/Pages/77-system-update.qml:76
747−msgctxt "string identifying name of the update"
748−msgid "Ubuntu system"
749−msgstr ""
750−
751−#: qml/Wizard/Pages/77-system-update.qml:83
752−#, qt-format
753−msgctxt "version of the system update"
754−msgid "Version %1"
755−msgstr ""
756−
757−#: qml/Wizard/Pages/77-system-update.qml:102
758−msgid "This could take a few minutes..."
759−msgstr ""
760−
761−#: qml/Wizard/Pages/77-system-update.qml:116
762−msgid "Install and restart now"
763−msgstr ""
764−
765812#: qml/Wizard/Pages/80-finished.qml:89
766813msgid "Welcome to Ubuntu"
767814msgstr ""
@@ -1233,3 +1280,9 @@ msgstr ""
12331280#~ msgstr ""
12341281#~ "إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
12351282#~ "المصنع وسيتم حذف كافة البيانات الشخصية."
1283+
1284+#~ msgid "Takes a screenshot of a window."
1285+#~ msgstr "أخذ لقطة شاشة للنافذة"
1286+
1287+#~ msgid "Super + 0 to 9"
1288+#~ msgstr "Super + 0 to 9"
po/ast.po+228−149
@@ -7,83 +7,111 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-11-16 10:44+0000\n"
11−"PO-Revision-Date: 2016-09-28 13:40+0000\n"
12−"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11+"PO-Revision-Date: 2016-12-16 02:13+0000\n"
12+"Last-Translator: enolp <enolp@softastur.org>\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-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr "Contraseña: "
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr ""
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr ""
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr ""
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr "Aniciar sesión"
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr "Reintentar"
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr ""
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr ""
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr "Anclar atayu"
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr "Colar"
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr "Desanclar atayu"
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr "Zarrar sesión"
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr "¿De xuru que quies zarrar la sesión?"
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr "Bloquiar"
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr "Zarrar sesión"
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr "Encaboxar"
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr "Reaniciu"
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr "¿De xuru que quies reaniciar?"
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr "Non"
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr "Sí"
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr "Apagáu"
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
@@ -91,12 +119,12 @@ msgstr ""
91119"¿De xuru que te prestaría\n"
92120"apagar?"
93121
94−#: qml/Components/Dialogs.qml:205
122+#: qml/Components/Dialogs.qml:244
95123msgctxt "Button: Power off the system"
96124msgid "Power off"
97125msgstr "Apagar"
98126
99−#: qml/Components/Dialogs.qml:214
127+#: qml/Components/Dialogs.qml:255
100128msgctxt "Button: Restart the system"
101129msgid "Restart"
102130msgstr "Reaniciar"
@@ -122,8 +150,8 @@ msgid "Alt + PrtScr"
122150msgstr "Alt + ImprPant"
123151
124152#: qml/Components/KeyboardShortcutsOverlay.qml:80
125−msgid "Takes a screenshot of a window."
126−msgstr "Saca una imaxe d'una ventana."
153+msgid "Takes a screenshot of the current window."
154+msgstr ""
127155
128156#: qml/Components/KeyboardShortcutsOverlay.qml:88
129157msgid "Super + Space"
@@ -141,127 +169,143 @@ msgstr "Super +Mayús + Espaciu"
141169msgid "Switches to previous keyboard layout."
142170msgstr "Salta al diseñu de tecláu anterior."
143171
144−#: qml/Components/KeyboardShortcutsOverlay.qml:118
172+#: qml/Components/KeyboardShortcutsOverlay.qml:114
173+msgid "Ctrl + Alt + T"
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:119
177+msgid "Starts the Terminal application."
178+msgstr ""
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:131
145181msgid "Launcher"
146182msgstr "Llanzador"
147183
148−#: qml/Components/KeyboardShortcutsOverlay.qml:125
184+#: qml/Components/KeyboardShortcutsOverlay.qml:138
149185msgid "Super (Hold)"
150186msgstr "Super (Caltener)"
151187
152−#: qml/Components/KeyboardShortcutsOverlay.qml:130
188+#: qml/Components/KeyboardShortcutsOverlay.qml:143
153189msgid "Opens the launcher, displays shortcuts."
154190msgstr "Abre'l llanzador, amuesa atayos."
155191
156−#: qml/Components/KeyboardShortcutsOverlay.qml:138
192+#: qml/Components/KeyboardShortcutsOverlay.qml:151
157193msgid "Alt + F1"
158194msgstr "Alt + F1"
159195
160−#: qml/Components/KeyboardShortcutsOverlay.qml:143
196+#: qml/Components/KeyboardShortcutsOverlay.qml:156
161197msgid "Opens launcher keyboard navigation mode."
162198msgstr "Abre'l mou de navegación con tecláu del llanzador."
163199
164−#: qml/Components/KeyboardShortcutsOverlay.qml:151
200+#: qml/Components/KeyboardShortcutsOverlay.qml:164
165201msgid "Super + Tab"
166202msgstr "Super + Tab"
167203
168−#: qml/Components/KeyboardShortcutsOverlay.qml:156
204+#: qml/Components/KeyboardShortcutsOverlay.qml:169
169205msgid "Switches applications via the launcher."
170206msgstr "Cambia d'aplicaciones col llanzador."
171207
172−#: qml/Components/KeyboardShortcutsOverlay.qml:164
173−msgid "Super + 0 to 9"
174−msgstr "Super + 0 a 9"
208+#: qml/Components/KeyboardShortcutsOverlay.qml:177
209+msgid "Super + 1 to 0"
210+msgstr ""
175211
176−#: qml/Components/KeyboardShortcutsOverlay.qml:169
212+#: qml/Components/KeyboardShortcutsOverlay.qml:182
177213msgid "Same as clicking on a launcher icon."
178214msgstr "Igual que facer click nel iconu del llanzador."
179215
180−#: qml/Components/KeyboardShortcutsOverlay.qml:181
216+#: qml/Components/KeyboardShortcutsOverlay.qml:190
217+msgid "Super + A"
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:195
221+msgid "Opens the Application Drawer."
222+msgstr "Abre'l caxón d'aplicaciones."
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
181225msgid "Scopes"
182226msgstr "Ámbitos"
183227
184−#: qml/Components/KeyboardShortcutsOverlay.qml:188
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
185229msgid "Super (Tap)"
186230msgstr "Super (Tocar)"
187231
188−#: qml/Components/KeyboardShortcutsOverlay.qml:193
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
189233msgid "Opens the Scopes home."
190234msgstr "Abre'l principiu d'Ámbitos"
191235
192−#: qml/Components/KeyboardShortcutsOverlay.qml:209
236+#: qml/Components/KeyboardShortcutsOverlay.qml:235
193237msgid "Switching"
194238msgstr "Conmutación"
195239
196−#: qml/Components/KeyboardShortcutsOverlay.qml:216
240+#: qml/Components/KeyboardShortcutsOverlay.qml:242
197241msgid "Alt + Tab"
198242msgstr "Alt + Tab"
199243
200−#: qml/Components/KeyboardShortcutsOverlay.qml:221
244+#: qml/Components/KeyboardShortcutsOverlay.qml:247
201245msgid "Switches between applications."
202246msgstr "Conmuta ente aplicaciones."
203247
204−#: qml/Components/KeyboardShortcutsOverlay.qml:229
248+#: qml/Components/KeyboardShortcutsOverlay.qml:255
205249msgid "Super + W"
206250msgstr "Super + W"
207251
208−#: qml/Components/KeyboardShortcutsOverlay.qml:234
252+#: qml/Components/KeyboardShortcutsOverlay.qml:260
209253msgid "Opens the desktop spread."
210254msgstr "Abre esparder l'escritoriu."
211255
212−#: qml/Components/KeyboardShortcutsOverlay.qml:242
256+#: qml/Components/KeyboardShortcutsOverlay.qml:268
213257msgid "Cursor Left or Right"
214258msgstr "Flecha izq. o dre."
215259
216−#: qml/Components/KeyboardShortcutsOverlay.qml:247
260+#: qml/Components/KeyboardShortcutsOverlay.qml:273
217261msgid "Moves the focus."
218262msgstr "Mueve'l focu"
219263
220−#: qml/Components/KeyboardShortcutsOverlay.qml:259
264+#: qml/Components/KeyboardShortcutsOverlay.qml:285
221265msgid "Windows"
222266msgstr "Ventanes"
223267
224−#: qml/Components/KeyboardShortcutsOverlay.qml:266
268+#: qml/Components/KeyboardShortcutsOverlay.qml:292
225269msgid "Ctrl + Super + D"
226270msgstr "Ctrl + Super + D"
227271
228−#: qml/Components/KeyboardShortcutsOverlay.qml:271
272+#: qml/Components/KeyboardShortcutsOverlay.qml:297
229273msgid "Minimizes all windows."
230274msgstr "Amenorga toles ventanes."
231275
232−#: qml/Components/KeyboardShortcutsOverlay.qml:279
276+#: qml/Components/KeyboardShortcutsOverlay.qml:305
233277msgid "Ctrl + Super + Up"
234278msgstr "Ctrl + Super + Arriba"
235279
236−#: qml/Components/KeyboardShortcutsOverlay.qml:284
280+#: qml/Components/KeyboardShortcutsOverlay.qml:310
237281msgid "Maximizes the current window."
238282msgstr "Maximiza la ventana actual."
239283
240−#: qml/Components/KeyboardShortcutsOverlay.qml:292
284+#: qml/Components/KeyboardShortcutsOverlay.qml:318
241285msgid "Ctrl + Super + Down"
242286msgstr "Ctrl + Super + Abaxo"
243287
244−#: qml/Components/KeyboardShortcutsOverlay.qml:297
288+#: qml/Components/KeyboardShortcutsOverlay.qml:323
245289msgid "Minimizes or restores the current window."
246290msgstr "Amenorga o restaura la ventana actual."
247291
248−#: qml/Components/KeyboardShortcutsOverlay.qml:305
292+#: qml/Components/KeyboardShortcutsOverlay.qml:331
249293msgid "Ctrl + Super + Left or Right"
250294msgstr "Ctrl + Super + Izquierda o Drecha"
251295
252−#: qml/Components/KeyboardShortcutsOverlay.qml:310
296+#: qml/Components/KeyboardShortcutsOverlay.qml:336
253297msgid "Semi-maximizes the current window."
254298msgstr "Semi-maximiza la ventana actual."
255299
256−#: qml/Components/KeyboardShortcutsOverlay.qml:318
300+#: qml/Components/KeyboardShortcutsOverlay.qml:344
257301msgid "Alt + F4"
258302msgstr "Alt + F4"
259303
260−#: qml/Components/KeyboardShortcutsOverlay.qml:323
304+#: qml/Components/KeyboardShortcutsOverlay.qml:349
261305msgid "Closes the current window."
262306msgstr "Zarra la ventana actual."
263307
264−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
265309msgid "Return to Call"
266310msgstr "Tornar a la llamada"
267311
@@ -269,7 +313,7 @@ msgstr "Tornar a la llamada"
269313msgid "Emergency Call"
270314msgstr "Llamada d'emerxencia"
271315
272−#: qml/Components/Lockscreen.qml:244
316+#: qml/Components/Lockscreen.qml:245
273317msgid "OK"
274318msgstr "Aceutar"
275319
@@ -283,29 +327,29 @@ msgstr "%1:%2:%3"
283327msgid "%1:%2"
284328msgstr "%1:%2"
285329
286−#: qml/Components/ModeSwitchWarningDialog.qml:32
330+#: qml/Components/ModeSwitchWarningDialog.qml:33
287331msgid "Apps may have unsaved data:"
288332msgstr "Apps que pueden tener datos sin guardar:"
289333
290−#: qml/Components/ModeSwitchWarningDialog.qml:57
334+#: qml/Components/ModeSwitchWarningDialog.qml:60
291335msgctxt ""
292336"Re-dock means connect the device again to an external screen/mouse/keyboard"
293337msgid "Re-dock, save your work and close these apps to continue."
294338msgstr "Reconeuta, guarda'l trabayu y zarra eses apps pa siguir."
295339
296−#: qml/Components/ModeSwitchWarningDialog.qml:63
340+#: qml/Components/ModeSwitchWarningDialog.qml:67
297341msgid "Or force close now (unsaved data will be lost)."
298342msgstr "O fuerza salir agora (perderás tolos datos sin guardar)."
299343
300−#: qml/Components/ModeSwitchWarningDialog.qml:75
344+#: qml/Components/ModeSwitchWarningDialog.qml:80
301345msgid "OK, I will reconnect"
302346msgstr "D'alcuerdu, reconeutaré"
303347
304−#: qml/Components/ModeSwitchWarningDialog.qml:76
348+#: qml/Components/ModeSwitchWarningDialog.qml:81
305349msgid "Reconnect now!"
306350msgstr "Reconeutar agora."
307351
308−#: qml/Components/ModeSwitchWarningDialog.qml:88
352+#: qml/Components/ModeSwitchWarningDialog.qml:94
309353msgid "Close all"
310354msgstr "Zarrar too"
311355
@@ -313,6 +357,30 @@ msgstr "Zarrar too"
313357msgid "Preview Share Item"
314358msgstr "Entever l'elementu compartíu"
315359
360+#: qml/Components/VirtualTouchPad.qml:317
361+msgid ""
362+"Your device is now connected to an external display. Use this screen as a "
363+"touch pad to interact with the pointer."
364+msgstr ""
365+"El preséu agora ta coneutáu con una pantalla esterna. Usa esta pantalla como "
366+"touch pad pa interactuar col punteru."
367+
368+#: qml/Components/VirtualTouchPad.qml:327
369+msgid "Tap left button to click."
370+msgstr "Calca nel botón esquierdu pa facer clic."
371+
372+#: qml/Components/VirtualTouchPad.qml:339
373+msgid "Tap right button to right click."
374+msgstr "Calca nel botón drechu pa facer clic."
375+
376+#: qml/Components/VirtualTouchPad.qml:351
377+msgid "Swipe with two fingers to scroll."
378+msgstr "Esliza con dos deos pa desplazate."
379+
380+#: qml/Components/VirtualTouchPad.qml:396
381+msgid "Find more settings in the system settings."
382+msgstr "Alcuentra más axustes nos Axustes del Sistema."
383+
316384#: qml/Dash/DashPageHeader.qml:361
317385msgctxt "Button: Open the Ubuntu Store"
318386msgid "Store"
@@ -344,24 +412,24 @@ msgstr "Refina los resultaos"
344412msgid "Reset"
345413msgstr "Reafitar"
346414
347−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
415+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
348416msgid "Show less"
349417msgstr "Ver menos"
350418
351−#: qml/Dash/GenericScopeView.qml:545
419+#: qml/Dash/GenericScopeView.qml:547
352420msgid "Show all"
353421msgstr "Ver too"
354422
355−#: qml/Dash/GenericScopeView.qml:576
423+#: qml/Dash/GenericScopeView.qml:578
356424msgctxt "Label: Hint for dash search line edit"
357425msgid "Search"
358426msgstr "Guetar"
359427
360−#: qml/Dash/PageHeaderExtraPanel.qml:57
428+#: qml/Dash/PageHeaderExtraPanel.qml:67
361429msgid "Recent Searches"
362430msgstr "Guetes recién"
363431
364−#: qml/Dash/PageHeaderExtraPanel.qml:68
432+#: qml/Dash/PageHeaderExtraPanel.qml:78
365433msgid "Clear All"
366434msgstr "Llimpiar too"
367435
@@ -398,26 +466,18 @@ msgstr "Sueltar p'anovar..."
398466msgid "Enable location data"
399467msgstr "Habilitar datos d'allugamientu"
400468
401−#: qml/Dash/ScopesList.qml:57
469+#: qml/Dash/ScopesList.qml:146
402470msgid "Manage"
403471msgstr "Xestionar"
404472
405−#: qml/Dash/ScopesList.qml:104
473+#: qml/Dash/ScopesList.qml:187
406474msgid "Home"
407475msgstr "Aniciu"
408476
409−#: qml/Dash/ScopesList.qml:105
477+#: qml/Dash/ScopesList.qml:188
410478msgid "Also installed"
411479msgstr "Tamién instalaos"
412480
413−#: qml/DisabledScreenNotice.qml:109
414−msgid ""
415−"Your device is now connected to an external display. Use this screen as a "
416−"touch pad to interact with the pointer."
417−msgstr ""
418−"El preséu agora ta coneutáu con una pantalla esterna. Usa esta pantalla como "
419−"touch pad pa interactuar col punteru."
420−
421481#: qml/Greeter/CoverPage.qml:127
422482msgid "Unlock"
423483msgstr "Desbloquiar"
@@ -442,33 +502,46 @@ msgid_plural "Please wait %1 minutes and then try again…"
442502msgstr[0] "Por favor, espera %1 minutu y vuelvi a intentalo…"
443503msgstr[1] "Por favor, espera %1 minutos y vuelvi a intentalo…"
444504
445−#: qml/Greeter/Greeter.qml:596
505+#: qml/Greeter/Greeter.qml:550
446506msgid "Try again"
447507msgstr "Tentar otra vuelta"
448508
449−#: qml/Greeter/LoginList.qml:70
509+#: qml/Greeter/Greeter.qml:551
510+msgid "Enter passphrase to unlock"
511+msgstr ""
512+
513+#: qml/Greeter/Greeter.qml:552
514+msgid "Enter passcode to unlock"
515+msgstr ""
516+
517+#: qml/Greeter/NarrowView.qml:228
518+msgid "Emergency"
519+msgstr "Emerxencia"
520+
521+#: qml/Greeter/PromptList.qml:126
450522msgid "Passphrase"
451523msgstr "Fras de pasu"
452524
453−#: qml/Greeter/LoginList.qml:71
525+#: qml/Greeter/PromptList.qml:126
454526msgid "Passcode"
455527msgstr "Códigu de pasu"
456528
457−#: qml/Greeter/LoginList.qml:98
458−msgid "Retry"
459−msgstr "Reintentar"
529+#: qml/Greeter/SessionsList.qml:124
530+msgid "Select desktop environment"
531+msgstr "Esbillar entornu d'escritoriu"
460532
461−#: qml/Greeter/LoginList.qml:99
462−msgid "Log In"
463−msgstr "Aniciar sesión"
533+#: qml/Launcher/Drawer.qml:94
534+msgid "Search…"
535+msgstr "Guetar..."
464536
465−#: qml/Greeter/NarrowView.qml:252
466−msgid "Emergency"
467−msgstr "Emerxencia"
537+#: qml/Launcher/Drawer.qml:129
538+msgctxt "Apps sorted alphabetically"
539+msgid "A-Z"
540+msgstr "A-Z"
468541
469−#: qml/Greeter/SessionsList.qml:122
470−msgid "Select desktop environment"
471−msgstr "Esbillar entornu d'escritoriu"
542+#: qml/Launcher/MoreAppsHeader.qml:55
543+msgid "More apps in the store"
544+msgstr "Más aplicaciones na tienda"
472545
473546#: qml/Notifications/NotificationMenuItemFactory.qml:124
474547msgid "Show password"
@@ -482,62 +555,62 @@ msgstr "Toca pa tornar a la llamada..."
482555msgid "Conference"
483556msgstr "Conferencia"
484557
485−#: qml/Panel/Indicators/MenuItemFactory.qml:847
558+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
486559msgid "Nothing is playing"
487560msgstr "Nun ta reproduciéndose nada"
488561
489−#: qml/Panel/Indicators/MenuItemFactory.qml:975
562+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
490563#, qt-format
491564msgid "%1 hour"
492565msgid_plural "%1 hours"
493566msgstr[0] "%1 hora"
494567msgstr[1] "%1 hores"
495568
496−#: qml/Panel/Indicators/MenuItemFactory.qml:979
569+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
497570#, qt-format
498571msgid "%1 minute"
499572msgid_plural "%1 minutes"
500573msgstr[0] "%1 minutu"
501574msgstr[1] "%1 minutos"
502575
503−#: qml/Panel/Indicators/MenuItemFactory.qml:984
576+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
504577#, qt-format
505578msgid "%1 second"
506579msgid_plural "%1 seconds"
507580msgstr[0] "%1 segundu"
508581msgstr[1] "%1 segundos"
509582
510−#: qml/Panel/Indicators/MenuItemFactory.qml:987
583+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
511584msgid "0 seconds"
512585msgstr "0 segundos"
513586
514587#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
515−#: qml/Panel/Indicators/MenuItemFactory.qml:989
588+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
516589#, qt-format
517590msgid "%1 remaining"
518591msgstr "Queden %1"
519592
520−#: qml/Panel/Indicators/MenuItemFactory.qml:995
593+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
521594msgid "In queue…"
522595msgstr "Na cola..."
523596
524−#: qml/Panel/Indicators/MenuItemFactory.qml:999
597+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
525598msgid "Downloading"
526599msgstr "Baxando"
527600
528−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
601+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
529602msgid "Paused, tap to resume"
530603msgstr "Posáu, toca pa reanudar"
531604
532−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
605+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
533606msgid "Canceled"
534607msgstr "Encaboxáu"
535608
536−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
609+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
537610msgid "Finished"
538611msgstr "Finó"
539612
540−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
613+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
541614msgid "Failed, tap to retry"
542615msgstr "Falló, toca pa reintentar"
543616
@@ -557,13 +630,17 @@ msgctxt "Button: Call back on phone"
557630msgid "Call back"
558631msgstr "Devolver llamada"
559632
633+#: qml/Panel/PanelMenuPage.qml:92
634+msgid "Back"
635+msgstr ""
636+
560637#: qml/Stage/SideStage.qml:76
561638msgid "Drag using 3 fingers any application from one window to the other"
562639msgstr "Abasnar cualquier aplicación d'una ventana a otra usando 3 deos"
563640
564641#: qml/Tutorial/TutorialLeftLong.qml:49
565−msgid "Long swipe from the left edge to open the Today scope"
566−msgstr "Eslizamientu llargu dende'l berbesu izquierdu pa ver el scope Güei"
642+msgid "Long swipe from the left edge to open the Application Drawer"
643+msgstr ""
567644
568645#: qml/Tutorial/TutorialLeft.qml:47
569646msgid "Short swipe from the left edge to open the launcher"
@@ -593,7 +670,7 @@ msgid "Language"
593670msgstr "Llingua"
594671
595672#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
596−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
673+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
597674#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
598675#: qml/Wizard/Pages/70-passwd-type.qml:145
599676#: qml/Wizard/Pages/75-report-check.qml:84
@@ -614,25 +691,24 @@ msgstr "Llingua del tecláu"
614691msgid "Keyboard layout"
615692msgstr "Distribución del tecláu"
616693
617−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
618−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
619−#: qml/Wizard/Pages/sim.qml:101
694+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
695+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
620696msgid "Skip"
621697msgstr "Saltar"
622698
623−#: qml/Wizard/Pages/30-wifi.qml:31
699+#: qml/Wizard/Pages/30-wifi.qml:30
624700msgid "Connect to Wi‑Fi"
625701msgstr "Coneutase al WiFi"
626702
627−#: qml/Wizard/Pages/30-wifi.qml:132
703+#: qml/Wizard/Pages/30-wifi.qml:131
628704msgid "Connected"
629705msgstr "Coneutáu"
630706
631−#: qml/Wizard/Pages/30-wifi.qml:165
707+#: qml/Wizard/Pages/30-wifi.qml:164
632708msgid "Available Wi-Fi networks"
633709msgstr "Redes Wi-Fi disponibles"
634710
635−#: qml/Wizard/Pages/30-wifi.qml:166
711+#: qml/Wizard/Pages/30-wifi.qml:165
636712msgid "No available Wi-Fi networks"
637713msgstr "Nun hai redes Wi-Fi disponibles"
638714
@@ -723,37 +799,6 @@ msgstr ""
723799msgid "Privacy policy"
724800msgstr "Política d'intimidá"
725801
726−#: qml/Wizard/Pages/77-system-update.qml:28
727−msgid "Update Device"
728−msgstr "Anovar preséu"
729−
730−#: qml/Wizard/Pages/77-system-update.qml:55
731−msgid ""
732−"There is a system update available and ready to install. Afterwards, the "
733−"device will automatically restart."
734−msgstr ""
735−"Hai un anovamientu del sistema disponible y preparáu pa instalar. Darréu, el "
736−"preséu reaniciará de mou automáticu."
737−
738−#: qml/Wizard/Pages/77-system-update.qml:76
739−msgctxt "string identifying name of the update"
740−msgid "Ubuntu system"
741−msgstr "Sistema Ubuntu"
742−
743−#: qml/Wizard/Pages/77-system-update.qml:83
744−#, qt-format
745−msgctxt "version of the system update"
746−msgid "Version %1"
747−msgstr "Versión %1"
748−
749−#: qml/Wizard/Pages/77-system-update.qml:102
750−msgid "This could take a few minutes..."
751−msgstr "Esto podría tardar dellos minutos..."
752−
753−#: qml/Wizard/Pages/77-system-update.qml:116
754−msgid "Install and restart now"
755−msgstr "Instalar y reaniciar agora"
756−
757802#: qml/Wizard/Pages/80-finished.qml:89
758803msgid "Welcome to Ubuntu"
759804msgstr "Bienveníu/a a Ubuntu"
@@ -1311,3 +1356,37 @@ msgstr "Contraseña feble enforma"
13111356
13121357#~ msgid "Swipe up to create a message"
13131358#~ msgstr "Eslizar pa crear un mensaxe"
1359+
1360+#~ msgid "Long swipe from the left edge to open the Today scope"
1361+#~ msgstr "Eslizamientu llargu dende'l berbesu izquierdu pa ver el scope Güei"
1362+
1363+#~ msgid "Takes a screenshot of a window."
1364+#~ msgstr "Saca una imaxe d'una ventana."
1365+
1366+#~ msgid "Super + 0 to 9"
1367+#~ msgstr "Super + 0 a 9"
1368+
1369+#~ msgid "Install and restart now"
1370+#~ msgstr "Instalar y reaniciar agora"
1371+
1372+#~ msgid "This could take a few minutes..."
1373+#~ msgstr "Esto podría tardar dellos minutos..."
1374+
1375+#, qt-format
1376+#~ msgctxt "version of the system update"
1377+#~ msgid "Version %1"
1378+#~ msgstr "Versión %1"
1379+
1380+#~ msgctxt "string identifying name of the update"
1381+#~ msgid "Ubuntu system"
1382+#~ msgstr "Sistema Ubuntu"
1383+
1384+#~ msgid "Update Device"
1385+#~ msgstr "Anovar preséu"
1386+
1387+#~ msgid ""
1388+#~ "There is a system update available and ready to install. Afterwards, the "
1389+#~ "device will automatically restart."
1390+#~ msgstr ""
1391+#~ "Hai un anovamientu del sistema disponible y preparáu pa instalar. Darréu, el "
1392+#~ "preséu reaniciará de mou automáticu."
po/az.po+183−136
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+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,86 +15,114 @@ 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-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr "Şifrә: "
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr ""
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr ""
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr ""
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr ""
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr ""
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr ""
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr ""
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr "Pin qısayolu"
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr ""
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr "Açma qısayolu"
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr ""
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr "Çıxmaq istәdiyinizdәn әminsiniz?"
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr ""
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr ""
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr "İmtina"
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr ""
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr "Yenidәn başlatmaq istәdiyinizә әminsiniz?"
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr "Yox"
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr "Hə"
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr ""
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
90118msgstr ""
91119
92−#: qml/Components/Dialogs.qml:205
120+#: qml/Components/Dialogs.qml:244
93121msgctxt "Button: Power off the system"
94122msgid "Power off"
95123msgstr ""
96124
97−#: qml/Components/Dialogs.qml:214
125+#: qml/Components/Dialogs.qml:255
98126msgctxt "Button: Restart the system"
99127msgid "Restart"
100128msgstr ""
@@ -120,7 +148,7 @@ msgid "Alt + PrtScr"
120148msgstr ""
121149
122150#: qml/Components/KeyboardShortcutsOverlay.qml:80
123−msgid "Takes a screenshot of a window."
151+msgid "Takes a screenshot of the current window."
124152msgstr ""
125153
126154#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -139,127 +167,143 @@ msgstr ""
139167msgid "Switches to previous keyboard layout."
140168msgstr ""
141169
142−#: qml/Components/KeyboardShortcutsOverlay.qml:118
170+#: qml/Components/KeyboardShortcutsOverlay.qml:114
171+msgid "Ctrl + Alt + T"
172+msgstr ""
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:119
175+msgid "Starts the Terminal application."
176+msgstr ""
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:131
143179msgid "Launcher"
144180msgstr ""
145181
146−#: qml/Components/KeyboardShortcutsOverlay.qml:125
182+#: qml/Components/KeyboardShortcutsOverlay.qml:138
147183msgid "Super (Hold)"
148184msgstr ""
149185
150−#: qml/Components/KeyboardShortcutsOverlay.qml:130
186+#: qml/Components/KeyboardShortcutsOverlay.qml:143
151187msgid "Opens the launcher, displays shortcuts."
152188msgstr ""
153189
154−#: qml/Components/KeyboardShortcutsOverlay.qml:138
190+#: qml/Components/KeyboardShortcutsOverlay.qml:151
155191msgid "Alt + F1"
156192msgstr ""
157193
158−#: qml/Components/KeyboardShortcutsOverlay.qml:143
194+#: qml/Components/KeyboardShortcutsOverlay.qml:156
159195msgid "Opens launcher keyboard navigation mode."
160196msgstr ""
161197
162−#: qml/Components/KeyboardShortcutsOverlay.qml:151
198+#: qml/Components/KeyboardShortcutsOverlay.qml:164
163199msgid "Super + Tab"
164200msgstr ""
165201
166−#: qml/Components/KeyboardShortcutsOverlay.qml:156
202+#: qml/Components/KeyboardShortcutsOverlay.qml:169
167203msgid "Switches applications via the launcher."
168204msgstr ""
169205
170−#: qml/Components/KeyboardShortcutsOverlay.qml:164
171−msgid "Super + 0 to 9"
206+#: qml/Components/KeyboardShortcutsOverlay.qml:177
207+msgid "Super + 1 to 0"
172208msgstr ""
173209
174−#: qml/Components/KeyboardShortcutsOverlay.qml:169
210+#: qml/Components/KeyboardShortcutsOverlay.qml:182
175211msgid "Same as clicking on a launcher icon."
176212msgstr ""
177213
178−#: qml/Components/KeyboardShortcutsOverlay.qml:181
214+#: qml/Components/KeyboardShortcutsOverlay.qml:190
215+msgid "Super + A"
216+msgstr ""
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:195
219+msgid "Opens the Application Drawer."
220+msgstr ""
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:207
179223msgid "Scopes"
180224msgstr ""
181225
182−#: qml/Components/KeyboardShortcutsOverlay.qml:188
226+#: qml/Components/KeyboardShortcutsOverlay.qml:214
183227msgid "Super (Tap)"
184228msgstr ""
185229
186−#: qml/Components/KeyboardShortcutsOverlay.qml:193
230+#: qml/Components/KeyboardShortcutsOverlay.qml:219
187231msgid "Opens the Scopes home."
188232msgstr ""
189233
190−#: qml/Components/KeyboardShortcutsOverlay.qml:209
234+#: qml/Components/KeyboardShortcutsOverlay.qml:235
191235msgid "Switching"
192236msgstr ""
193237
194−#: qml/Components/KeyboardShortcutsOverlay.qml:216
238+#: qml/Components/KeyboardShortcutsOverlay.qml:242
195239msgid "Alt + Tab"
196240msgstr ""
197241
198−#: qml/Components/KeyboardShortcutsOverlay.qml:221
242+#: qml/Components/KeyboardShortcutsOverlay.qml:247
199243msgid "Switches between applications."
200244msgstr ""
201245
202−#: qml/Components/KeyboardShortcutsOverlay.qml:229
246+#: qml/Components/KeyboardShortcutsOverlay.qml:255
203247msgid "Super + W"
204248msgstr ""
205249
206−#: qml/Components/KeyboardShortcutsOverlay.qml:234
250+#: qml/Components/KeyboardShortcutsOverlay.qml:260
207251msgid "Opens the desktop spread."
208252msgstr ""
209253
210−#: qml/Components/KeyboardShortcutsOverlay.qml:242
254+#: qml/Components/KeyboardShortcutsOverlay.qml:268
211255msgid "Cursor Left or Right"
212256msgstr ""
213257
214−#: qml/Components/KeyboardShortcutsOverlay.qml:247
258+#: qml/Components/KeyboardShortcutsOverlay.qml:273
215259msgid "Moves the focus."
216260msgstr ""
217261
218−#: qml/Components/KeyboardShortcutsOverlay.qml:259
262+#: qml/Components/KeyboardShortcutsOverlay.qml:285
219263msgid "Windows"
220264msgstr ""
221265
222−#: qml/Components/KeyboardShortcutsOverlay.qml:266
266+#: qml/Components/KeyboardShortcutsOverlay.qml:292
223267msgid "Ctrl + Super + D"
224268msgstr ""
225269
226−#: qml/Components/KeyboardShortcutsOverlay.qml:271
270+#: qml/Components/KeyboardShortcutsOverlay.qml:297
227271msgid "Minimizes all windows."
228272msgstr ""
229273
230−#: qml/Components/KeyboardShortcutsOverlay.qml:279
274+#: qml/Components/KeyboardShortcutsOverlay.qml:305
231275msgid "Ctrl + Super + Up"
232276msgstr ""
233277
234−#: qml/Components/KeyboardShortcutsOverlay.qml:284
278+#: qml/Components/KeyboardShortcutsOverlay.qml:310
235279msgid "Maximizes the current window."
236280msgstr ""
237281
238−#: qml/Components/KeyboardShortcutsOverlay.qml:292
282+#: qml/Components/KeyboardShortcutsOverlay.qml:318
239283msgid "Ctrl + Super + Down"
240284msgstr ""
241285
242−#: qml/Components/KeyboardShortcutsOverlay.qml:297
286+#: qml/Components/KeyboardShortcutsOverlay.qml:323
243287msgid "Minimizes or restores the current window."
244288msgstr ""
245289
246−#: qml/Components/KeyboardShortcutsOverlay.qml:305
290+#: qml/Components/KeyboardShortcutsOverlay.qml:331
247291msgid "Ctrl + Super + Left or Right"
248292msgstr ""
249293
250−#: qml/Components/KeyboardShortcutsOverlay.qml:310
294+#: qml/Components/KeyboardShortcutsOverlay.qml:336
251295msgid "Semi-maximizes the current window."
252296msgstr ""
253297
254−#: qml/Components/KeyboardShortcutsOverlay.qml:318
298+#: qml/Components/KeyboardShortcutsOverlay.qml:344
255299msgid "Alt + F4"
256300msgstr ""
257301
258−#: qml/Components/KeyboardShortcutsOverlay.qml:323
302+#: qml/Components/KeyboardShortcutsOverlay.qml:349
259303msgid "Closes the current window."
260304msgstr ""
261305
262−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
306+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
263307msgid "Return to Call"
264308msgstr ""
265309
@@ -267,7 +311,7 @@ msgstr ""
267311msgid "Emergency Call"
268312msgstr "Zərurət zəngi"
269313
270−#: qml/Components/Lockscreen.qml:244
314+#: qml/Components/Lockscreen.qml:245
271315msgid "OK"
272316msgstr "Oldu"
273317
@@ -281,29 +325,29 @@ msgstr ""
281325msgid "%1:%2"
282326msgstr ""
283327
284−#: qml/Components/ModeSwitchWarningDialog.qml:32
328+#: qml/Components/ModeSwitchWarningDialog.qml:33
285329msgid "Apps may have unsaved data:"
286330msgstr ""
287331
288−#: qml/Components/ModeSwitchWarningDialog.qml:57
332+#: qml/Components/ModeSwitchWarningDialog.qml:60
289333msgctxt ""
290334"Re-dock means connect the device again to an external screen/mouse/keyboard"
291335msgid "Re-dock, save your work and close these apps to continue."
292336msgstr ""
293337
294−#: qml/Components/ModeSwitchWarningDialog.qml:63
338+#: qml/Components/ModeSwitchWarningDialog.qml:67
295339msgid "Or force close now (unsaved data will be lost)."
296340msgstr ""
297341
298−#: qml/Components/ModeSwitchWarningDialog.qml:75
342+#: qml/Components/ModeSwitchWarningDialog.qml:80
299343msgid "OK, I will reconnect"
300344msgstr ""
301345
302−#: qml/Components/ModeSwitchWarningDialog.qml:76
346+#: qml/Components/ModeSwitchWarningDialog.qml:81
303347msgid "Reconnect now!"
304348msgstr ""
305349
306−#: qml/Components/ModeSwitchWarningDialog.qml:88
350+#: qml/Components/ModeSwitchWarningDialog.qml:94
307351msgid "Close all"
308352msgstr ""
309353
@@ -311,6 +355,28 @@ msgstr ""
311355msgid "Preview Share Item"
312356msgstr ""
313357
358+#: qml/Components/VirtualTouchPad.qml:317
359+msgid ""
360+"Your device is now connected to an external display. Use this screen as a "
361+"touch pad to interact with the pointer."
362+msgstr ""
363+
364+#: qml/Components/VirtualTouchPad.qml:327
365+msgid "Tap left button to click."
366+msgstr ""
367+
368+#: qml/Components/VirtualTouchPad.qml:339
369+msgid "Tap right button to right click."
370+msgstr ""
371+
372+#: qml/Components/VirtualTouchPad.qml:351
373+msgid "Swipe with two fingers to scroll."
374+msgstr ""
375+
376+#: qml/Components/VirtualTouchPad.qml:396
377+msgid "Find more settings in the system settings."
378+msgstr ""
379+
314380#: qml/Dash/DashPageHeader.qml:361
315381msgctxt "Button: Open the Ubuntu Store"
316382msgid "Store"
@@ -342,24 +408,24 @@ msgstr ""
342408msgid "Reset"
343409msgstr ""
344410
345−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
411+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
346412msgid "Show less"
347413msgstr ""
348414
349−#: qml/Dash/GenericScopeView.qml:545
415+#: qml/Dash/GenericScopeView.qml:547
350416msgid "Show all"
351417msgstr ""
352418
353−#: qml/Dash/GenericScopeView.qml:576
419+#: qml/Dash/GenericScopeView.qml:578
354420msgctxt "Label: Hint for dash search line edit"
355421msgid "Search"
356422msgstr ""
357423
358−#: qml/Dash/PageHeaderExtraPanel.qml:57
424+#: qml/Dash/PageHeaderExtraPanel.qml:67
359425msgid "Recent Searches"
360426msgstr ""
361427
362−#: qml/Dash/PageHeaderExtraPanel.qml:68
428+#: qml/Dash/PageHeaderExtraPanel.qml:78
363429msgid "Clear All"
364430msgstr ""
365431
@@ -396,24 +462,18 @@ msgstr ""
396462msgid "Enable location data"
397463msgstr ""
398464
399−#: qml/Dash/ScopesList.qml:57
465+#: qml/Dash/ScopesList.qml:146
400466msgid "Manage"
401467msgstr ""
402468
403−#: qml/Dash/ScopesList.qml:104
469+#: qml/Dash/ScopesList.qml:187
404470msgid "Home"
405471msgstr ""
406472
407−#: qml/Dash/ScopesList.qml:105
473+#: qml/Dash/ScopesList.qml:188
408474msgid "Also installed"
409475msgstr ""
410476
411−#: qml/DisabledScreenNotice.qml:109
412−msgid ""
413−"Your device is now connected to an external display. Use this screen as a "
414−"touch pad to interact with the pointer."
415−msgstr ""
416−
417477#: qml/Greeter/CoverPage.qml:127
418478msgid "Unlock"
419479msgstr ""
@@ -437,32 +497,45 @@ msgid_plural "Please wait %1 minutes and then try again…"
437497msgstr[0] ""
438498msgstr[1] ""
439499
440−#: qml/Greeter/Greeter.qml:596
500+#: qml/Greeter/Greeter.qml:550
441501msgid "Try again"
442502msgstr ""
443503
444−#: qml/Greeter/LoginList.qml:70
504+#: qml/Greeter/Greeter.qml:551
505+msgid "Enter passphrase to unlock"
506+msgstr ""
507+
508+#: qml/Greeter/Greeter.qml:552
509+msgid "Enter passcode to unlock"
510+msgstr ""
511+
512+#: qml/Greeter/NarrowView.qml:228
513+msgid "Emergency"
514+msgstr ""
515+
516+#: qml/Greeter/PromptList.qml:126
445517msgid "Passphrase"
446518msgstr ""
447519
448−#: qml/Greeter/LoginList.qml:71
520+#: qml/Greeter/PromptList.qml:126
449521msgid "Passcode"
450522msgstr ""
451523
452−#: qml/Greeter/LoginList.qml:98
453−msgid "Retry"
524+#: qml/Greeter/SessionsList.qml:124
525+msgid "Select desktop environment"
454526msgstr ""
455527
456−#: qml/Greeter/LoginList.qml:99
457−msgid "Log In"
528+#: qml/Launcher/Drawer.qml:94
529+msgid "Search…"
458530msgstr ""
459531
460−#: qml/Greeter/NarrowView.qml:252
461−msgid "Emergency"
532+#: qml/Launcher/Drawer.qml:129
533+msgctxt "Apps sorted alphabetically"
534+msgid "A-Z"
462535msgstr ""
463536
464−#: qml/Greeter/SessionsList.qml:122
465−msgid "Select desktop environment"
537+#: qml/Launcher/MoreAppsHeader.qml:55
538+msgid "More apps in the store"
466539msgstr ""
467540
468541#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -477,62 +550,62 @@ msgstr "Zəngə qayıtmaq üçün toxunun..."
477550msgid "Conference"
478551msgstr "Konfrans"
479552
480−#: qml/Panel/Indicators/MenuItemFactory.qml:847
553+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
481554msgid "Nothing is playing"
482555msgstr ""
483556
484−#: qml/Panel/Indicators/MenuItemFactory.qml:975
557+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
485558#, qt-format
486559msgid "%1 hour"
487560msgid_plural "%1 hours"
488561msgstr[0] ""
489562msgstr[1] ""
490563
491−#: qml/Panel/Indicators/MenuItemFactory.qml:979
564+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
492565#, qt-format
493566msgid "%1 minute"
494567msgid_plural "%1 minutes"
495568msgstr[0] ""
496569msgstr[1] ""
497570
498−#: qml/Panel/Indicators/MenuItemFactory.qml:984
571+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
499572#, qt-format
500573msgid "%1 second"
501574msgid_plural "%1 seconds"
502575msgstr[0] ""
503576msgstr[1] ""
504577
505−#: qml/Panel/Indicators/MenuItemFactory.qml:987
578+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
506579msgid "0 seconds"
507580msgstr ""
508581
509582#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
510−#: qml/Panel/Indicators/MenuItemFactory.qml:989
583+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
511584#, qt-format
512585msgid "%1 remaining"
513586msgstr ""
514587
515−#: qml/Panel/Indicators/MenuItemFactory.qml:995
588+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
516589msgid "In queue…"
517590msgstr "Növbədədir..."
518591
519−#: qml/Panel/Indicators/MenuItemFactory.qml:999
592+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
520593msgid "Downloading"
521594msgstr "Endirilir"
522595
523−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
596+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
524597msgid "Paused, tap to resume"
525598msgstr "Dayandırıldı. Davam etmək üçün toxunun"
526599
527−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
600+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
528601msgid "Canceled"
529602msgstr "İmtina edildi"
530603
531−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
604+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
532605msgid "Finished"
533606msgstr "Bitdi"
534607
535−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
608+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
536609msgid "Failed, tap to retry"
537610msgstr "Alınmadı. Yenidәn cәhd etmək üçün toxunun"
538611
@@ -552,12 +625,16 @@ msgctxt "Button: Call back on phone"
552625msgid "Call back"
553626msgstr ""
554627
628+#: qml/Panel/PanelMenuPage.qml:92
629+msgid "Back"
630+msgstr ""
631+
555632#: qml/Stage/SideStage.qml:76
556633msgid "Drag using 3 fingers any application from one window to the other"
557634msgstr ""
558635
559636#: qml/Tutorial/TutorialLeftLong.qml:49
560−msgid "Long swipe from the left edge to open the Today scope"
637+msgid "Long swipe from the left edge to open the Application Drawer"
561638msgstr ""
562639
563640#: qml/Tutorial/TutorialLeft.qml:47
@@ -586,7 +663,7 @@ msgid "Language"
586663msgstr ""
587664
588665#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
589−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
666+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
590667#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
591668#: qml/Wizard/Pages/70-passwd-type.qml:145
592669#: qml/Wizard/Pages/75-report-check.qml:84
@@ -607,25 +684,24 @@ msgstr ""
607684msgid "Keyboard layout"
608685msgstr ""
609686
610−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
611−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
612−#: qml/Wizard/Pages/sim.qml:101
687+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
688+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
613689msgid "Skip"
614690msgstr ""
615691
616−#: qml/Wizard/Pages/30-wifi.qml:31
692+#: qml/Wizard/Pages/30-wifi.qml:30
617693msgid "Connect to Wi‑Fi"
618694msgstr ""
619695
620−#: qml/Wizard/Pages/30-wifi.qml:132
696+#: qml/Wizard/Pages/30-wifi.qml:131
621697msgid "Connected"
622698msgstr ""
623699
624−#: qml/Wizard/Pages/30-wifi.qml:165
700+#: qml/Wizard/Pages/30-wifi.qml:164
625701msgid "Available Wi-Fi networks"
626702msgstr ""
627703
628−#: qml/Wizard/Pages/30-wifi.qml:166
704+#: qml/Wizard/Pages/30-wifi.qml:165
629705msgid "No available Wi-Fi networks"
630706msgstr ""
631707
@@ -712,35 +788,6 @@ msgstr ""
712788msgid "Privacy policy"
713789msgstr ""
714790
715−#: qml/Wizard/Pages/77-system-update.qml:28
716−msgid "Update Device"
717−msgstr ""
718−
719−#: qml/Wizard/Pages/77-system-update.qml:55
720−msgid ""
721−"There is a system update available and ready to install. Afterwards, the "
722−"device will automatically restart."
723−msgstr ""
724−
725−#: qml/Wizard/Pages/77-system-update.qml:76
726−msgctxt "string identifying name of the update"
727−msgid "Ubuntu system"
728−msgstr ""
729−
730−#: qml/Wizard/Pages/77-system-update.qml:83
731−#, qt-format
732−msgctxt "version of the system update"
733−msgid "Version %1"
734−msgstr ""
735−
736−#: qml/Wizard/Pages/77-system-update.qml:102
737−msgid "This could take a few minutes..."
738−msgstr ""
739−
740−#: qml/Wizard/Pages/77-system-update.qml:116
741−msgid "Install and restart now"
742−msgstr ""
743−
744791#: qml/Wizard/Pages/80-finished.qml:89
745792msgid "Welcome to Ubuntu"
746793msgstr ""
po/be.po+184−137
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+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,75 +16,103 @@ 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-11-23 06:34+0000\n"
20−"X-Generator: Launchpad (build 18269)\n"
19+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
20+"X-Generator: Launchpad (build 18343)\n"
2121
22−#: plugins/LightDM/Greeter.cpp:123
22+#: plugins/LightDM/Greeter.cpp:188
2323msgid "Password: "
2424msgstr "Пароль: "
2525
26+#: plugins/LightDM/Greeter.cpp:203
27+msgid "Username"
28+msgstr ""
29+
30+#: plugins/LightDM/Greeter.cpp:242
31+msgid "Failed to authenticate"
32+msgstr ""
33+
34+#: plugins/LightDM/Greeter.cpp:244
35+msgid "Invalid password, please try again"
36+msgstr ""
37+
38+#: plugins/LightDM/Greeter.cpp:254
39+msgid "Log In"
40+msgstr ""
41+
42+#: plugins/LightDM/Greeter.cpp:254
43+msgid "Retry"
44+msgstr "Паспрабаваць зноў"
45+
46+#: plugins/LightDM/UsersModel.cpp:157
47+msgid "Login"
48+msgstr ""
49+
50+#: plugins/LightDM/UsersModel.cpp:165
51+msgid "Guest Session"
52+msgstr ""
53+
2654#: plugins/Unity/Launcher/launcheritem.cpp:49
27−#: plugins/Unity/Launcher/launcheritem.cpp:108
55+#: plugins/Unity/Launcher/launcheritem.cpp:123
2856msgid "Pin shortcut"
2957msgstr "Замацаваць кнопку"
3058
31−#: plugins/Unity/Launcher/launcheritem.cpp:54
59+#: plugins/Unity/Launcher/launcheritem.cpp:55
3260msgid "Quit"
3361msgstr "Выйсці"
3462
35−#: plugins/Unity/Launcher/launcheritem.cpp:108
63+#: plugins/Unity/Launcher/launcheritem.cpp:123
3664msgid "Unpin shortcut"
3765msgstr "Адмацаваць кнопку"
3866
39−#: qml/Components/Dialogs.qml:149
67+#: qml/Components/Dialogs.qml:176
4068msgctxt "Title: Lock/Log out dialog"
4169msgid "Log out"
4270msgstr "Выйсці"
4371
44−#: qml/Components/Dialogs.qml:150
72+#: qml/Components/Dialogs.qml:177
4573msgid "Are you sure you want to log out?"
4674msgstr "Вы ўпэўненыя, што хочаце выйсці?"
4775
48−#: qml/Components/Dialogs.qml:152
76+#: qml/Components/Dialogs.qml:180
4977msgctxt "Button: Lock the system"
5078msgid "Lock"
5179msgstr "Заблакаваць"
5280
53−#: qml/Components/Dialogs.qml:159
81+#: qml/Components/Dialogs.qml:191
5482msgctxt "Button: Log out from the system"
5583msgid "Log Out"
5684msgstr "Выйсці"
5785
58−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
59−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
6088#: qml/Wizard/Pages/passcode-confirm.qml:32
6189#: qml/Wizard/Pages/passcode-set.qml:32
6290msgid "Cancel"
6391msgstr "Скасаваць"
6492
65−#: qml/Components/Dialogs.qml:178
93+#: qml/Components/Dialogs.qml:211
6694msgctxt "Title: Reboot dialog"
6795msgid "Reboot"
6896msgstr "Перазагрузіць"
6997
70−#: qml/Components/Dialogs.qml:179
98+#: qml/Components/Dialogs.qml:212
7199msgid "Are you sure you want to reboot?"
72100msgstr "Вы ўпэўнены, што жадаеце перазагрузіць?"
73101
74−#: qml/Components/Dialogs.qml:181
102+#: qml/Components/Dialogs.qml:215
75103msgid "No"
76104msgstr "Не"
77105
78−#: qml/Components/Dialogs.qml:187
106+#: qml/Components/Dialogs.qml:223
79107msgid "Yes"
80108msgstr "Так"
81109
82−#: qml/Components/Dialogs.qml:202
110+#: qml/Components/Dialogs.qml:239
83111msgctxt "Title: Power off/Restart dialog"
84112msgid "Power"
85113msgstr "Сілкаванне"
86114
87−#: qml/Components/Dialogs.qml:203
115+#: qml/Components/Dialogs.qml:240
88116msgid ""
89117"Are you sure you would like\n"
90118"to power off?"
@@ -92,12 +120,12 @@ msgstr ""
92120"Вы ўпэўнены, што хочаце\n"
93121"выключыць камп'ютэр?"
94122
95−#: qml/Components/Dialogs.qml:205
123+#: qml/Components/Dialogs.qml:244
96124msgctxt "Button: Power off the system"
97125msgid "Power off"
98126msgstr "Выключыць"
99127
100−#: qml/Components/Dialogs.qml:214
128+#: qml/Components/Dialogs.qml:255
101129msgctxt "Button: Restart the system"
102130msgid "Restart"
103131msgstr "Перазапуск"
@@ -123,7 +151,7 @@ msgid "Alt + PrtScr"
123151msgstr ""
124152
125153#: qml/Components/KeyboardShortcutsOverlay.qml:80
126−msgid "Takes a screenshot of a window."
154+msgid "Takes a screenshot of the current window."
127155msgstr ""
128156
129157#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -142,127 +170,143 @@ msgstr ""
142170msgid "Switches to previous keyboard layout."
143171msgstr ""
144172
145−#: qml/Components/KeyboardShortcutsOverlay.qml:118
173+#: qml/Components/KeyboardShortcutsOverlay.qml:114
174+msgid "Ctrl + Alt + T"
175+msgstr ""
176+
177+#: qml/Components/KeyboardShortcutsOverlay.qml:119
178+msgid "Starts the Terminal application."
179+msgstr ""
180+
181+#: qml/Components/KeyboardShortcutsOverlay.qml:131
146182msgid "Launcher"
147183msgstr ""
148184
149−#: qml/Components/KeyboardShortcutsOverlay.qml:125
185+#: qml/Components/KeyboardShortcutsOverlay.qml:138
150186msgid "Super (Hold)"
151187msgstr ""
152188
153−#: qml/Components/KeyboardShortcutsOverlay.qml:130
189+#: qml/Components/KeyboardShortcutsOverlay.qml:143
154190msgid "Opens the launcher, displays shortcuts."
155191msgstr ""
156192
157−#: qml/Components/KeyboardShortcutsOverlay.qml:138
193+#: qml/Components/KeyboardShortcutsOverlay.qml:151
158194msgid "Alt + F1"
159195msgstr ""
160196
161−#: qml/Components/KeyboardShortcutsOverlay.qml:143
197+#: qml/Components/KeyboardShortcutsOverlay.qml:156
162198msgid "Opens launcher keyboard navigation mode."
163199msgstr ""
164200
165−#: qml/Components/KeyboardShortcutsOverlay.qml:151
201+#: qml/Components/KeyboardShortcutsOverlay.qml:164
166202msgid "Super + Tab"
167203msgstr ""
168204
169−#: qml/Components/KeyboardShortcutsOverlay.qml:156
205+#: qml/Components/KeyboardShortcutsOverlay.qml:169
170206msgid "Switches applications via the launcher."
171207msgstr ""
172208
173−#: qml/Components/KeyboardShortcutsOverlay.qml:164
174−msgid "Super + 0 to 9"
209+#: qml/Components/KeyboardShortcutsOverlay.qml:177
210+msgid "Super + 1 to 0"
175211msgstr ""
176212
177−#: qml/Components/KeyboardShortcutsOverlay.qml:169
213+#: qml/Components/KeyboardShortcutsOverlay.qml:182
178214msgid "Same as clicking on a launcher icon."
179215msgstr ""
180216
181−#: qml/Components/KeyboardShortcutsOverlay.qml:181
217+#: qml/Components/KeyboardShortcutsOverlay.qml:190
218+msgid "Super + A"
219+msgstr ""
220+
221+#: qml/Components/KeyboardShortcutsOverlay.qml:195
222+msgid "Opens the Application Drawer."
223+msgstr ""
224+
225+#: qml/Components/KeyboardShortcutsOverlay.qml:207
182226msgid "Scopes"
183227msgstr ""
184228
185−#: qml/Components/KeyboardShortcutsOverlay.qml:188
229+#: qml/Components/KeyboardShortcutsOverlay.qml:214
186230msgid "Super (Tap)"
187231msgstr ""
188232
189−#: qml/Components/KeyboardShortcutsOverlay.qml:193
233+#: qml/Components/KeyboardShortcutsOverlay.qml:219
190234msgid "Opens the Scopes home."
191235msgstr ""
192236
193−#: qml/Components/KeyboardShortcutsOverlay.qml:209
237+#: qml/Components/KeyboardShortcutsOverlay.qml:235
194238msgid "Switching"
195239msgstr ""
196240
197−#: qml/Components/KeyboardShortcutsOverlay.qml:216
241+#: qml/Components/KeyboardShortcutsOverlay.qml:242
198242msgid "Alt + Tab"
199243msgstr ""
200244
201−#: qml/Components/KeyboardShortcutsOverlay.qml:221
245+#: qml/Components/KeyboardShortcutsOverlay.qml:247
202246msgid "Switches between applications."
203247msgstr ""
204248
205−#: qml/Components/KeyboardShortcutsOverlay.qml:229
249+#: qml/Components/KeyboardShortcutsOverlay.qml:255
206250msgid "Super + W"
207251msgstr ""
208252
209−#: qml/Components/KeyboardShortcutsOverlay.qml:234
253+#: qml/Components/KeyboardShortcutsOverlay.qml:260
210254msgid "Opens the desktop spread."
211255msgstr ""
212256
213−#: qml/Components/KeyboardShortcutsOverlay.qml:242
257+#: qml/Components/KeyboardShortcutsOverlay.qml:268
214258msgid "Cursor Left or Right"
215259msgstr ""
216260
217−#: qml/Components/KeyboardShortcutsOverlay.qml:247
261+#: qml/Components/KeyboardShortcutsOverlay.qml:273
218262msgid "Moves the focus."
219263msgstr ""
220264
221−#: qml/Components/KeyboardShortcutsOverlay.qml:259
265+#: qml/Components/KeyboardShortcutsOverlay.qml:285
222266msgid "Windows"
223267msgstr ""
224268
225−#: qml/Components/KeyboardShortcutsOverlay.qml:266
269+#: qml/Components/KeyboardShortcutsOverlay.qml:292
226270msgid "Ctrl + Super + D"
227271msgstr ""
228272
229−#: qml/Components/KeyboardShortcutsOverlay.qml:271
273+#: qml/Components/KeyboardShortcutsOverlay.qml:297
230274msgid "Minimizes all windows."
231275msgstr ""
232276
233−#: qml/Components/KeyboardShortcutsOverlay.qml:279
277+#: qml/Components/KeyboardShortcutsOverlay.qml:305
234278msgid "Ctrl + Super + Up"
235279msgstr ""
236280
237−#: qml/Components/KeyboardShortcutsOverlay.qml:284
281+#: qml/Components/KeyboardShortcutsOverlay.qml:310
238282msgid "Maximizes the current window."
239283msgstr ""
240284
241−#: qml/Components/KeyboardShortcutsOverlay.qml:292
285+#: qml/Components/KeyboardShortcutsOverlay.qml:318
242286msgid "Ctrl + Super + Down"
243287msgstr ""
244288
245−#: qml/Components/KeyboardShortcutsOverlay.qml:297
289+#: qml/Components/KeyboardShortcutsOverlay.qml:323
246290msgid "Minimizes or restores the current window."
247291msgstr ""
248292
249−#: qml/Components/KeyboardShortcutsOverlay.qml:305
293+#: qml/Components/KeyboardShortcutsOverlay.qml:331
250294msgid "Ctrl + Super + Left or Right"
251295msgstr ""
252296
253−#: qml/Components/KeyboardShortcutsOverlay.qml:310
297+#: qml/Components/KeyboardShortcutsOverlay.qml:336
254298msgid "Semi-maximizes the current window."
255299msgstr ""
256300
257−#: qml/Components/KeyboardShortcutsOverlay.qml:318
301+#: qml/Components/KeyboardShortcutsOverlay.qml:344
258302msgid "Alt + F4"
259303msgstr ""
260304
261−#: qml/Components/KeyboardShortcutsOverlay.qml:323
305+#: qml/Components/KeyboardShortcutsOverlay.qml:349
262306msgid "Closes the current window."
263307msgstr ""
264308
265−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
309+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
266310msgid "Return to Call"
267311msgstr "Вярнуцца да выкліку"
268312
@@ -270,7 +314,7 @@ msgstr "Вярнуцца да выкліку"
270314msgid "Emergency Call"
271315msgstr "Терміновы выклік"
272316
273−#: qml/Components/Lockscreen.qml:244
317+#: qml/Components/Lockscreen.qml:245
274318msgid "OK"
275319msgstr "Добра"
276320
@@ -284,29 +328,29 @@ msgstr ""
284328msgid "%1:%2"
285329msgstr ""
286330
287−#: qml/Components/ModeSwitchWarningDialog.qml:32
331+#: qml/Components/ModeSwitchWarningDialog.qml:33
288332msgid "Apps may have unsaved data:"
289333msgstr "Прылады могуць мець незахованыя дадзеныя:"
290334
291−#: qml/Components/ModeSwitchWarningDialog.qml:57
335+#: qml/Components/ModeSwitchWarningDialog.qml:60
292336msgctxt ""
293337"Re-dock means connect the device again to an external screen/mouse/keyboard"
294338msgid "Re-dock, save your work and close these apps to continue."
295339msgstr ""
296340
297−#: qml/Components/ModeSwitchWarningDialog.qml:63
341+#: qml/Components/ModeSwitchWarningDialog.qml:67
298342msgid "Or force close now (unsaved data will be lost)."
299343msgstr "Прымусіць зачыніць (незахаваныя дадзеныя будуць страчаны)."
300344
301−#: qml/Components/ModeSwitchWarningDialog.qml:75
345+#: qml/Components/ModeSwitchWarningDialog.qml:80
302346msgid "OK, I will reconnect"
303347msgstr "Добра, буду перападлучацца"
304348
305−#: qml/Components/ModeSwitchWarningDialog.qml:76
349+#: qml/Components/ModeSwitchWarningDialog.qml:81
306350msgid "Reconnect now!"
307351msgstr "Перападлучыцца зараз!"
308352
309−#: qml/Components/ModeSwitchWarningDialog.qml:88
353+#: qml/Components/ModeSwitchWarningDialog.qml:94
310354msgid "Close all"
311355msgstr "Зачыніць усё"
312356
@@ -314,6 +358,28 @@ msgstr "Зачыніць усё"
314358msgid "Preview Share Item"
315359msgstr "Праглядзець элемент"
316360
361+#: qml/Components/VirtualTouchPad.qml:317
362+msgid ""
363+"Your device is now connected to an external display. Use this screen as a "
364+"touch pad to interact with the pointer."
365+msgstr ""
366+
367+#: qml/Components/VirtualTouchPad.qml:327
368+msgid "Tap left button to click."
369+msgstr ""
370+
371+#: qml/Components/VirtualTouchPad.qml:339
372+msgid "Tap right button to right click."
373+msgstr ""
374+
375+#: qml/Components/VirtualTouchPad.qml:351
376+msgid "Swipe with two fingers to scroll."
377+msgstr ""
378+
379+#: qml/Components/VirtualTouchPad.qml:396
380+msgid "Find more settings in the system settings."
381+msgstr ""
382+
317383#: qml/Dash/DashPageHeader.qml:361
318384msgctxt "Button: Open the Ubuntu Store"
319385msgid "Store"
@@ -345,24 +411,24 @@ msgstr ""
345411msgid "Reset"
346412msgstr ""
347413
348−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
414+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
349415msgid "Show less"
350416msgstr ""
351417
352−#: qml/Dash/GenericScopeView.qml:545
418+#: qml/Dash/GenericScopeView.qml:547
353419msgid "Show all"
354420msgstr ""
355421
356−#: qml/Dash/GenericScopeView.qml:576
422+#: qml/Dash/GenericScopeView.qml:578
357423msgctxt "Label: Hint for dash search line edit"
358424msgid "Search"
359425msgstr "Пошук"
360426
361−#: qml/Dash/PageHeaderExtraPanel.qml:57
427+#: qml/Dash/PageHeaderExtraPanel.qml:67
362428msgid "Recent Searches"
363429msgstr ""
364430
365−#: qml/Dash/PageHeaderExtraPanel.qml:68
431+#: qml/Dash/PageHeaderExtraPanel.qml:78
366432msgid "Clear All"
367433msgstr ""
368434
@@ -399,24 +465,18 @@ msgstr "Адпусціце для абнаўлення..."
399465msgid "Enable location data"
400466msgstr "Уключыць дадзеныя аб месцазнаходжанні"
401467
402−#: qml/Dash/ScopesList.qml:57
468+#: qml/Dash/ScopesList.qml:146
403469msgid "Manage"
404470msgstr "Кіраванне"
405471
406−#: qml/Dash/ScopesList.qml:104
472+#: qml/Dash/ScopesList.qml:187
407473msgid "Home"
408474msgstr "Хатняя папка"
409475
410−#: qml/Dash/ScopesList.qml:105
476+#: qml/Dash/ScopesList.qml:188
411477msgid "Also installed"
412478msgstr "Таксама ўсталявана"
413479
414−#: qml/DisabledScreenNotice.qml:109
415−msgid ""
416−"Your device is now connected to an external display. Use this screen as a "
417−"touch pad to interact with the pointer."
418−msgstr ""
419−
420480#: qml/Greeter/CoverPage.qml:127
421481msgid "Unlock"
422482msgstr "Разблакаваць"
@@ -444,32 +504,45 @@ msgstr[0] "Пачакайце %1 хвіліну і паўтарыце спроб
444504msgstr[1] "Пачакайце %1 хвіліны і паўтарыце спробу…"
445505msgstr[2] "Пачакайце %1 хвілін і паўтарыце спробу…"
446506
447−#: qml/Greeter/Greeter.qml:596
507+#: qml/Greeter/Greeter.qml:550
448508msgid "Try again"
449509msgstr ""
450510
451−#: qml/Greeter/LoginList.qml:70
511+#: qml/Greeter/Greeter.qml:551
512+msgid "Enter passphrase to unlock"
513+msgstr ""
514+
515+#: qml/Greeter/Greeter.qml:552
516+msgid "Enter passcode to unlock"
517+msgstr ""
518+
519+#: qml/Greeter/NarrowView.qml:228
520+msgid "Emergency"
521+msgstr ""
522+
523+#: qml/Greeter/PromptList.qml:126
452524msgid "Passphrase"
453525msgstr ""
454526
455−#: qml/Greeter/LoginList.qml:71
527+#: qml/Greeter/PromptList.qml:126
456528msgid "Passcode"
457529msgstr ""
458530
459−#: qml/Greeter/LoginList.qml:98
460−msgid "Retry"
461−msgstr "Паспрабаваць зноў"
531+#: qml/Greeter/SessionsList.qml:124
532+msgid "Select desktop environment"
533+msgstr ""
462534
463−#: qml/Greeter/LoginList.qml:99
464−msgid "Log In"
535+#: qml/Launcher/Drawer.qml:94
536+msgid "Search…"
465537msgstr ""
466538
467−#: qml/Greeter/NarrowView.qml:252
468−msgid "Emergency"
539+#: qml/Launcher/Drawer.qml:129
540+msgctxt "Apps sorted alphabetically"
541+msgid "A-Z"
469542msgstr ""
470543
471−#: qml/Greeter/SessionsList.qml:122
472−msgid "Select desktop environment"
544+#: qml/Launcher/MoreAppsHeader.qml:55
545+msgid "More apps in the store"
473546msgstr ""
474547
475548#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -484,11 +557,11 @@ msgstr "Націсніце, каб вярнуцца да выкліку..."
484557msgid "Conference"
485558msgstr "Канферэнцыя"
486559
487−#: qml/Panel/Indicators/MenuItemFactory.qml:847
560+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
488561msgid "Nothing is playing"
489562msgstr "Нічога не грае"
490563
491−#: qml/Panel/Indicators/MenuItemFactory.qml:975
564+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
492565#, qt-format
493566msgid "%1 hour"
494567msgid_plural "%1 hours"
@@ -496,7 +569,7 @@ msgstr[0] "%1 гадзіна"
496569msgstr[1] "%1 гадзіны"
497570msgstr[2] "%1 гадзінаў"
498571
499−#: qml/Panel/Indicators/MenuItemFactory.qml:979
572+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
500573#, qt-format
501574msgid "%1 minute"
502575msgid_plural "%1 minutes"
@@ -504,7 +577,7 @@ msgstr[0] "%1 хвіліна"
504577msgstr[1] "%1 хвіліны"
505578msgstr[2] "%1 хвілінаў"
506579
507−#: qml/Panel/Indicators/MenuItemFactory.qml:984
580+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
508581#, qt-format
509582msgid "%1 second"
510583msgid_plural "%1 seconds"
@@ -512,37 +585,37 @@ msgstr[0] "%1 секунда"
512585msgstr[1] "%1 секунды"
513586msgstr[2] "%1 секундаў"
514587
515−#: qml/Panel/Indicators/MenuItemFactory.qml:987
588+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
516589msgid "0 seconds"
517590msgstr "0 секунд"
518591
519592#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
520−#: qml/Panel/Indicators/MenuItemFactory.qml:989
593+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
521594#, qt-format
522595msgid "%1 remaining"
523596msgstr "%1 засталося"
524597
525−#: qml/Panel/Indicators/MenuItemFactory.qml:995
598+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
526599msgid "In queue…"
527600msgstr "У чарзе..."
528601
529−#: qml/Panel/Indicators/MenuItemFactory.qml:999
602+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
530603msgid "Downloading"
531604msgstr "Запампоўка"
532605
533−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
606+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
534607msgid "Paused, tap to resume"
535608msgstr "Прыпынена, націсніце для працягу"
536609
537−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
610+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
538611msgid "Canceled"
539612msgstr "Скасавана"
540613
541−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
614+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
542615msgid "Finished"
543616msgstr "Скончана"
544617
545−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
618+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
546619msgid "Failed, tap to retry"
547620msgstr "Не атрымалася, націсніце, каб паўтарыць спробу"
548621
@@ -562,12 +635,16 @@ msgctxt "Button: Call back on phone"
562635msgid "Call back"
563636msgstr "Патэлефанаваць"
564637
638+#: qml/Panel/PanelMenuPage.qml:92
639+msgid "Back"
640+msgstr ""
641+
565642#: qml/Stage/SideStage.qml:76
566643msgid "Drag using 3 fingers any application from one window to the other"
567644msgstr ""
568645
569646#: qml/Tutorial/TutorialLeftLong.qml:49
570−msgid "Long swipe from the left edge to open the Today scope"
647+msgid "Long swipe from the left edge to open the Application Drawer"
571648msgstr ""
572649
573650#: qml/Tutorial/TutorialLeft.qml:47
@@ -596,7 +673,7 @@ msgid "Language"
596673msgstr ""
597674
598675#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
599−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
676+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
600677#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
601678#: qml/Wizard/Pages/70-passwd-type.qml:145
602679#: qml/Wizard/Pages/75-report-check.qml:84
@@ -617,25 +694,24 @@ msgstr ""
617694msgid "Keyboard layout"
618695msgstr ""
619696
620−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
621−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
622−#: qml/Wizard/Pages/sim.qml:101
697+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
698+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
623699msgid "Skip"
624700msgstr "Прапусціць"
625701
626−#: qml/Wizard/Pages/30-wifi.qml:31
702+#: qml/Wizard/Pages/30-wifi.qml:30
627703msgid "Connect to Wi‑Fi"
628704msgstr "Злучыцца з Wi-Fi"
629705
630−#: qml/Wizard/Pages/30-wifi.qml:132
706+#: qml/Wizard/Pages/30-wifi.qml:131
631707msgid "Connected"
632708msgstr ""
633709
634−#: qml/Wizard/Pages/30-wifi.qml:165
710+#: qml/Wizard/Pages/30-wifi.qml:164
635711msgid "Available Wi-Fi networks"
636712msgstr ""
637713
638−#: qml/Wizard/Pages/30-wifi.qml:166
714+#: qml/Wizard/Pages/30-wifi.qml:165
639715msgid "No available Wi-Fi networks"
640716msgstr ""
641717
@@ -722,35 +798,6 @@ msgstr ""
722798msgid "Privacy policy"
723799msgstr ""
724800
725−#: qml/Wizard/Pages/77-system-update.qml:28
726−msgid "Update Device"
727−msgstr ""
728−
729−#: qml/Wizard/Pages/77-system-update.qml:55
730−msgid ""
731−"There is a system update available and ready to install. Afterwards, the "
732−"device will automatically restart."
733−msgstr ""
734−
735−#: qml/Wizard/Pages/77-system-update.qml:76
736−msgctxt "string identifying name of the update"
737−msgid "Ubuntu system"
738−msgstr ""
739−
740−#: qml/Wizard/Pages/77-system-update.qml:83
741−#, qt-format
742−msgctxt "version of the system update"
743−msgid "Version %1"
744−msgstr ""
745−
746−#: qml/Wizard/Pages/77-system-update.qml:102
747−msgid "This could take a few minutes..."
748−msgstr ""
749−
750−#: qml/Wizard/Pages/77-system-update.qml:116
751−msgid "Install and restart now"
752−msgstr ""
753−
754801#: qml/Wizard/Pages/80-finished.qml:89
755802msgid "Welcome to Ubuntu"
756803msgstr ""
po/bg.po+183−136
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+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,75 +15,103 @@ 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-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr ""
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr ""
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr ""
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr ""
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr ""
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr ""
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr ""
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr ""
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr ""
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr ""
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr ""
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr ""
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr ""
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr ""
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr ""
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr ""
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr ""
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr ""
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr ""
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr ""
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr ""
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
@@ -91,12 +119,12 @@ msgstr ""
91119"Искате ли да \n"
92120"изключите захранването на устройството?"
93121
94−#: qml/Components/Dialogs.qml:205
122+#: qml/Components/Dialogs.qml:244
95123msgctxt "Button: Power off the system"
96124msgid "Power off"
97125msgstr ""
98126
99−#: qml/Components/Dialogs.qml:214
127+#: qml/Components/Dialogs.qml:255
100128msgctxt "Button: Restart the system"
101129msgid "Restart"
102130msgstr ""
@@ -122,7 +150,7 @@ msgid "Alt + PrtScr"
122150msgstr ""
123151
124152#: qml/Components/KeyboardShortcutsOverlay.qml:80
125−msgid "Takes a screenshot of a window."
153+msgid "Takes a screenshot of the current window."
126154msgstr ""
127155
128156#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -141,127 +169,143 @@ msgstr ""
141169msgid "Switches to previous keyboard layout."
142170msgstr ""
143171
144−#: qml/Components/KeyboardShortcutsOverlay.qml:118
172+#: qml/Components/KeyboardShortcutsOverlay.qml:114
173+msgid "Ctrl + Alt + T"
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:119
177+msgid "Starts the Terminal application."
178+msgstr ""
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:131
145181msgid "Launcher"
146182msgstr ""
147183
148−#: qml/Components/KeyboardShortcutsOverlay.qml:125
184+#: qml/Components/KeyboardShortcutsOverlay.qml:138
149185msgid "Super (Hold)"
150186msgstr ""
151187
152−#: qml/Components/KeyboardShortcutsOverlay.qml:130
188+#: qml/Components/KeyboardShortcutsOverlay.qml:143
153189msgid "Opens the launcher, displays shortcuts."
154190msgstr ""
155191
156−#: qml/Components/KeyboardShortcutsOverlay.qml:138
192+#: qml/Components/KeyboardShortcutsOverlay.qml:151
157193msgid "Alt + F1"
158194msgstr ""
159195
160−#: qml/Components/KeyboardShortcutsOverlay.qml:143
196+#: qml/Components/KeyboardShortcutsOverlay.qml:156
161197msgid "Opens launcher keyboard navigation mode."
162198msgstr ""
163199
164−#: qml/Components/KeyboardShortcutsOverlay.qml:151
200+#: qml/Components/KeyboardShortcutsOverlay.qml:164
165201msgid "Super + Tab"
166202msgstr ""
167203
168−#: qml/Components/KeyboardShortcutsOverlay.qml:156
204+#: qml/Components/KeyboardShortcutsOverlay.qml:169
169205msgid "Switches applications via the launcher."
170206msgstr ""
171207
172−#: qml/Components/KeyboardShortcutsOverlay.qml:164
173−msgid "Super + 0 to 9"
208+#: qml/Components/KeyboardShortcutsOverlay.qml:177
209+msgid "Super + 1 to 0"
174210msgstr ""
175211
176−#: qml/Components/KeyboardShortcutsOverlay.qml:169
212+#: qml/Components/KeyboardShortcutsOverlay.qml:182
177213msgid "Same as clicking on a launcher icon."
178214msgstr ""
179215
180−#: qml/Components/KeyboardShortcutsOverlay.qml:181
216+#: qml/Components/KeyboardShortcutsOverlay.qml:190
217+msgid "Super + A"
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:195
221+msgid "Opens the Application Drawer."
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
181225msgid "Scopes"
182226msgstr ""
183227
184−#: qml/Components/KeyboardShortcutsOverlay.qml:188
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
185229msgid "Super (Tap)"
186230msgstr ""
187231
188−#: qml/Components/KeyboardShortcutsOverlay.qml:193
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
189233msgid "Opens the Scopes home."
190234msgstr ""
191235
192−#: qml/Components/KeyboardShortcutsOverlay.qml:209
236+#: qml/Components/KeyboardShortcutsOverlay.qml:235
193237msgid "Switching"
194238msgstr ""
195239
196−#: qml/Components/KeyboardShortcutsOverlay.qml:216
240+#: qml/Components/KeyboardShortcutsOverlay.qml:242
197241msgid "Alt + Tab"
198242msgstr ""
199243
200−#: qml/Components/KeyboardShortcutsOverlay.qml:221
244+#: qml/Components/KeyboardShortcutsOverlay.qml:247
201245msgid "Switches between applications."
202246msgstr ""
203247
204−#: qml/Components/KeyboardShortcutsOverlay.qml:229
248+#: qml/Components/KeyboardShortcutsOverlay.qml:255
205249msgid "Super + W"
206250msgstr ""
207251
208−#: qml/Components/KeyboardShortcutsOverlay.qml:234
252+#: qml/Components/KeyboardShortcutsOverlay.qml:260
209253msgid "Opens the desktop spread."
210254msgstr ""
211255
212−#: qml/Components/KeyboardShortcutsOverlay.qml:242
256+#: qml/Components/KeyboardShortcutsOverlay.qml:268
213257msgid "Cursor Left or Right"
214258msgstr ""
215259
216−#: qml/Components/KeyboardShortcutsOverlay.qml:247
260+#: qml/Components/KeyboardShortcutsOverlay.qml:273
217261msgid "Moves the focus."
218262msgstr ""
219263
220−#: qml/Components/KeyboardShortcutsOverlay.qml:259
264+#: qml/Components/KeyboardShortcutsOverlay.qml:285
221265msgid "Windows"
222266msgstr ""
223267
224−#: qml/Components/KeyboardShortcutsOverlay.qml:266
268+#: qml/Components/KeyboardShortcutsOverlay.qml:292
225269msgid "Ctrl + Super + D"
226270msgstr ""
227271
228−#: qml/Components/KeyboardShortcutsOverlay.qml:271
272+#: qml/Components/KeyboardShortcutsOverlay.qml:297
229273msgid "Minimizes all windows."
230274msgstr ""
231275
232−#: qml/Components/KeyboardShortcutsOverlay.qml:279
276+#: qml/Components/KeyboardShortcutsOverlay.qml:305
233277msgid "Ctrl + Super + Up"
234278msgstr ""
235279
236−#: qml/Components/KeyboardShortcutsOverlay.qml:284
280+#: qml/Components/KeyboardShortcutsOverlay.qml:310
237281msgid "Maximizes the current window."
238282msgstr ""
239283
240−#: qml/Components/KeyboardShortcutsOverlay.qml:292
284+#: qml/Components/KeyboardShortcutsOverlay.qml:318
241285msgid "Ctrl + Super + Down"
242286msgstr ""
243287
244−#: qml/Components/KeyboardShortcutsOverlay.qml:297
288+#: qml/Components/KeyboardShortcutsOverlay.qml:323
245289msgid "Minimizes or restores the current window."
246290msgstr ""
247291
248−#: qml/Components/KeyboardShortcutsOverlay.qml:305
292+#: qml/Components/KeyboardShortcutsOverlay.qml:331
249293msgid "Ctrl + Super + Left or Right"
250294msgstr ""
251295
252−#: qml/Components/KeyboardShortcutsOverlay.qml:310
296+#: qml/Components/KeyboardShortcutsOverlay.qml:336
253297msgid "Semi-maximizes the current window."
254298msgstr ""
255299
256−#: qml/Components/KeyboardShortcutsOverlay.qml:318
300+#: qml/Components/KeyboardShortcutsOverlay.qml:344
257301msgid "Alt + F4"
258302msgstr ""
259303
260−#: qml/Components/KeyboardShortcutsOverlay.qml:323
304+#: qml/Components/KeyboardShortcutsOverlay.qml:349
261305msgid "Closes the current window."
262306msgstr ""
263307
264−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
265309msgid "Return to Call"
266310msgstr ""
267311
@@ -269,7 +313,7 @@ msgstr ""
269313msgid "Emergency Call"
270314msgstr "Спешно повикване"
271315
272−#: qml/Components/Lockscreen.qml:244
316+#: qml/Components/Lockscreen.qml:245
273317msgid "OK"
274318msgstr ""
275319
@@ -283,29 +327,29 @@ msgstr ""
283327msgid "%1:%2"
284328msgstr ""
285329
286−#: qml/Components/ModeSwitchWarningDialog.qml:32
330+#: qml/Components/ModeSwitchWarningDialog.qml:33
287331msgid "Apps may have unsaved data:"
288332msgstr ""
289333
290−#: qml/Components/ModeSwitchWarningDialog.qml:57
334+#: qml/Components/ModeSwitchWarningDialog.qml:60
291335msgctxt ""
292336"Re-dock means connect the device again to an external screen/mouse/keyboard"
293337msgid "Re-dock, save your work and close these apps to continue."
294338msgstr ""
295339
296−#: qml/Components/ModeSwitchWarningDialog.qml:63
340+#: qml/Components/ModeSwitchWarningDialog.qml:67
297341msgid "Or force close now (unsaved data will be lost)."
298342msgstr ""
299343
300−#: qml/Components/ModeSwitchWarningDialog.qml:75
344+#: qml/Components/ModeSwitchWarningDialog.qml:80
301345msgid "OK, I will reconnect"
302346msgstr ""
303347
304−#: qml/Components/ModeSwitchWarningDialog.qml:76
348+#: qml/Components/ModeSwitchWarningDialog.qml:81
305349msgid "Reconnect now!"
306350msgstr ""
307351
308−#: qml/Components/ModeSwitchWarningDialog.qml:88
352+#: qml/Components/ModeSwitchWarningDialog.qml:94
309353msgid "Close all"
310354msgstr ""
311355
@@ -313,6 +357,28 @@ msgstr ""
313357msgid "Preview Share Item"
314358msgstr ""
315359
360+#: qml/Components/VirtualTouchPad.qml:317
361+msgid ""
362+"Your device is now connected to an external display. Use this screen as a "
363+"touch pad to interact with the pointer."
364+msgstr ""
365+
366+#: qml/Components/VirtualTouchPad.qml:327
367+msgid "Tap left button to click."
368+msgstr ""
369+
370+#: qml/Components/VirtualTouchPad.qml:339
371+msgid "Tap right button to right click."
372+msgstr ""
373+
374+#: qml/Components/VirtualTouchPad.qml:351
375+msgid "Swipe with two fingers to scroll."
376+msgstr ""
377+
378+#: qml/Components/VirtualTouchPad.qml:396
379+msgid "Find more settings in the system settings."
380+msgstr ""
381+
316382#: qml/Dash/DashPageHeader.qml:361
317383msgctxt "Button: Open the Ubuntu Store"
318384msgid "Store"
@@ -344,24 +410,24 @@ msgstr ""
344410msgid "Reset"
345411msgstr ""
346412
347−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
413+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
348414msgid "Show less"
349415msgstr ""
350416
351−#: qml/Dash/GenericScopeView.qml:545
417+#: qml/Dash/GenericScopeView.qml:547
352418msgid "Show all"
353419msgstr ""
354420
355−#: qml/Dash/GenericScopeView.qml:576
421+#: qml/Dash/GenericScopeView.qml:578
356422msgctxt "Label: Hint for dash search line edit"
357423msgid "Search"
358424msgstr ""
359425
360−#: qml/Dash/PageHeaderExtraPanel.qml:57
426+#: qml/Dash/PageHeaderExtraPanel.qml:67
361427msgid "Recent Searches"
362428msgstr ""
363429
364−#: qml/Dash/PageHeaderExtraPanel.qml:68
430+#: qml/Dash/PageHeaderExtraPanel.qml:78
365431msgid "Clear All"
366432msgstr ""
367433
@@ -398,24 +464,18 @@ msgstr ""
398464msgid "Enable location data"
399465msgstr ""
400466
401−#: qml/Dash/ScopesList.qml:57
467+#: qml/Dash/ScopesList.qml:146
402468msgid "Manage"
403469msgstr ""
404470
405−#: qml/Dash/ScopesList.qml:104
471+#: qml/Dash/ScopesList.qml:187
406472msgid "Home"
407473msgstr ""
408474
409−#: qml/Dash/ScopesList.qml:105
475+#: qml/Dash/ScopesList.qml:188
410476msgid "Also installed"
411477msgstr ""
412478
413−#: qml/DisabledScreenNotice.qml:109
414−msgid ""
415−"Your device is now connected to an external display. Use this screen as a "
416−"touch pad to interact with the pointer."
417−msgstr ""
418−
419479#: qml/Greeter/CoverPage.qml:127
420480msgid "Unlock"
421481msgstr ""
@@ -439,32 +499,45 @@ msgid_plural "Please wait %1 minutes and then try again…"
439499msgstr[0] ""
440500msgstr[1] ""
441501
442−#: qml/Greeter/Greeter.qml:596
502+#: qml/Greeter/Greeter.qml:550
443503msgid "Try again"
444504msgstr ""
445505
446−#: qml/Greeter/LoginList.qml:70
506+#: qml/Greeter/Greeter.qml:551
507+msgid "Enter passphrase to unlock"
508+msgstr ""
509+
510+#: qml/Greeter/Greeter.qml:552
511+msgid "Enter passcode to unlock"
512+msgstr ""
513+
514+#: qml/Greeter/NarrowView.qml:228
515+msgid "Emergency"
516+msgstr ""
517+
518+#: qml/Greeter/PromptList.qml:126
447519msgid "Passphrase"
448520msgstr ""
449521
450−#: qml/Greeter/LoginList.qml:71
522+#: qml/Greeter/PromptList.qml:126
451523msgid "Passcode"
452524msgstr ""
453525
454−#: qml/Greeter/LoginList.qml:98
455−msgid "Retry"
526+#: qml/Greeter/SessionsList.qml:124
527+msgid "Select desktop environment"
456528msgstr ""
457529
458−#: qml/Greeter/LoginList.qml:99
459−msgid "Log In"
530+#: qml/Launcher/Drawer.qml:94
531+msgid "Search…"
460532msgstr ""
461533
462−#: qml/Greeter/NarrowView.qml:252
463−msgid "Emergency"
534+#: qml/Launcher/Drawer.qml:129
535+msgctxt "Apps sorted alphabetically"
536+msgid "A-Z"
464537msgstr ""
465538
466−#: qml/Greeter/SessionsList.qml:122
467−msgid "Select desktop environment"
539+#: qml/Launcher/MoreAppsHeader.qml:55
540+msgid "More apps in the store"
468541msgstr ""
469542
470543#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -479,62 +552,62 @@ msgstr ""
479552msgid "Conference"
480553msgstr ""
481554
482−#: qml/Panel/Indicators/MenuItemFactory.qml:847
555+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
483556msgid "Nothing is playing"
484557msgstr ""
485558
486−#: qml/Panel/Indicators/MenuItemFactory.qml:975
559+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
487560#, qt-format
488561msgid "%1 hour"
489562msgid_plural "%1 hours"
490563msgstr[0] ""
491564msgstr[1] ""
492565
493−#: qml/Panel/Indicators/MenuItemFactory.qml:979
566+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
494567#, qt-format
495568msgid "%1 minute"
496569msgid_plural "%1 minutes"
497570msgstr[0] ""
498571msgstr[1] ""
499572
500−#: qml/Panel/Indicators/MenuItemFactory.qml:984
573+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
501574#, qt-format
502575msgid "%1 second"
503576msgid_plural "%1 seconds"
504577msgstr[0] ""
505578msgstr[1] ""
506579
507−#: qml/Panel/Indicators/MenuItemFactory.qml:987
580+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
508581msgid "0 seconds"
509582msgstr ""
510583
511584#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
512−#: qml/Panel/Indicators/MenuItemFactory.qml:989
585+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
513586#, qt-format
514587msgid "%1 remaining"
515588msgstr ""
516589
517−#: qml/Panel/Indicators/MenuItemFactory.qml:995
590+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
518591msgid "In queue…"
519592msgstr ""
520593
521−#: qml/Panel/Indicators/MenuItemFactory.qml:999
594+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
522595msgid "Downloading"
523596msgstr ""
524597
525−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
598+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
526599msgid "Paused, tap to resume"
527600msgstr ""
528601
529−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
602+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
530603msgid "Canceled"
531604msgstr ""
532605
533−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
606+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
534607msgid "Finished"
535608msgstr ""
536609
537−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
610+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
538611msgid "Failed, tap to retry"
539612msgstr ""
540613
@@ -554,12 +627,16 @@ msgctxt "Button: Call back on phone"
554627msgid "Call back"
555628msgstr ""
556629
630+#: qml/Panel/PanelMenuPage.qml:92
631+msgid "Back"
632+msgstr ""
633+
557634#: qml/Stage/SideStage.qml:76
558635msgid "Drag using 3 fingers any application from one window to the other"
559636msgstr ""
560637
561638#: qml/Tutorial/TutorialLeftLong.qml:49
562−msgid "Long swipe from the left edge to open the Today scope"
639+msgid "Long swipe from the left edge to open the Application Drawer"
563640msgstr ""
564641
565642#: qml/Tutorial/TutorialLeft.qml:47
@@ -588,7 +665,7 @@ msgid "Language"
588665msgstr ""
589666
590667#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
591−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
668+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
592669#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
593670#: qml/Wizard/Pages/70-passwd-type.qml:145
594671#: qml/Wizard/Pages/75-report-check.qml:84
@@ -609,25 +686,24 @@ msgstr ""
609686msgid "Keyboard layout"
610687msgstr ""
611688
612−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
613−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
614−#: qml/Wizard/Pages/sim.qml:101
689+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
690+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
615691msgid "Skip"
616692msgstr ""
617693
618−#: qml/Wizard/Pages/30-wifi.qml:31
694+#: qml/Wizard/Pages/30-wifi.qml:30
619695msgid "Connect to Wi‑Fi"
620696msgstr ""
621697
622−#: qml/Wizard/Pages/30-wifi.qml:132
698+#: qml/Wizard/Pages/30-wifi.qml:131
623699msgid "Connected"
624700msgstr ""
625701
626−#: qml/Wizard/Pages/30-wifi.qml:165
702+#: qml/Wizard/Pages/30-wifi.qml:164
627703msgid "Available Wi-Fi networks"
628704msgstr ""
629705
630−#: qml/Wizard/Pages/30-wifi.qml:166
706+#: qml/Wizard/Pages/30-wifi.qml:165
631707msgid "No available Wi-Fi networks"
632708msgstr ""
633709
@@ -714,35 +790,6 @@ msgstr ""
714790msgid "Privacy policy"
715791msgstr ""
716792
717−#: qml/Wizard/Pages/77-system-update.qml:28
718−msgid "Update Device"
719−msgstr ""
720−
721−#: qml/Wizard/Pages/77-system-update.qml:55
722−msgid ""
723−"There is a system update available and ready to install. Afterwards, the "
724−"device will automatically restart."
725−msgstr ""
726−
727−#: qml/Wizard/Pages/77-system-update.qml:76
728−msgctxt "string identifying name of the update"
729−msgid "Ubuntu system"
730−msgstr ""
731−
732−#: qml/Wizard/Pages/77-system-update.qml:83
733−#, qt-format
734−msgctxt "version of the system update"
735−msgid "Version %1"
736−msgstr ""
737−
738−#: qml/Wizard/Pages/77-system-update.qml:102
739−msgid "This could take a few minutes..."
740−msgstr ""
741−
742−#: qml/Wizard/Pages/77-system-update.qml:116
743−msgid "Install and restart now"
744−msgstr ""
745−
746793#: qml/Wizard/Pages/80-finished.qml:89
747794msgid "Welcome to Ubuntu"
748795msgstr ""
po/bn.po+183−136
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+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,75 +15,103 @@ 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-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr "পাসওয়ার্ড: "
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr ""
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr ""
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr ""
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr ""
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr ""
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr ""
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr ""
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr "পিন"
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr ""
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr "আনপিন"
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr ""
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr "আপনি কি লগ আউট করতে চান?"
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr "লক করুন"
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr ""
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr "বাতিল"
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr "পুনরায় চালু"
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr "আপনি কি পুনরায় চালু করতে চান?"
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr "না"
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr "হ্যাঁ"
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr ""
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
@@ -91,12 +119,12 @@ msgstr ""
91119"আপনি নিশ্চিত যে আপনি\n"
92120"বন্ধ করতে চান?"
93121
94−#: qml/Components/Dialogs.qml:205
122+#: qml/Components/Dialogs.qml:244
95123msgctxt "Button: Power off the system"
96124msgid "Power off"
97125msgstr "বন্ধ করুন"
98126
99−#: qml/Components/Dialogs.qml:214
127+#: qml/Components/Dialogs.qml:255
100128msgctxt "Button: Restart the system"
101129msgid "Restart"
102130msgstr "পুনরায় চালু"
@@ -122,7 +150,7 @@ msgid "Alt + PrtScr"
122150msgstr ""
123151
124152#: qml/Components/KeyboardShortcutsOverlay.qml:80
125−msgid "Takes a screenshot of a window."
153+msgid "Takes a screenshot of the current window."
126154msgstr ""
127155
128156#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -141,127 +169,143 @@ msgstr ""
141169msgid "Switches to previous keyboard layout."
142170msgstr ""
143171
144−#: qml/Components/KeyboardShortcutsOverlay.qml:118
172+#: qml/Components/KeyboardShortcutsOverlay.qml:114
173+msgid "Ctrl + Alt + T"
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:119
177+msgid "Starts the Terminal application."
178+msgstr ""
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:131
145181msgid "Launcher"
146182msgstr ""
147183
148−#: qml/Components/KeyboardShortcutsOverlay.qml:125
184+#: qml/Components/KeyboardShortcutsOverlay.qml:138
149185msgid "Super (Hold)"
150186msgstr ""
151187
152−#: qml/Components/KeyboardShortcutsOverlay.qml:130
188+#: qml/Components/KeyboardShortcutsOverlay.qml:143
153189msgid "Opens the launcher, displays shortcuts."
154190msgstr ""
155191
156−#: qml/Components/KeyboardShortcutsOverlay.qml:138
192+#: qml/Components/KeyboardShortcutsOverlay.qml:151
157193msgid "Alt + F1"
158194msgstr ""
159195
160−#: qml/Components/KeyboardShortcutsOverlay.qml:143
196+#: qml/Components/KeyboardShortcutsOverlay.qml:156
161197msgid "Opens launcher keyboard navigation mode."
162198msgstr ""
163199
164−#: qml/Components/KeyboardShortcutsOverlay.qml:151
200+#: qml/Components/KeyboardShortcutsOverlay.qml:164
165201msgid "Super + Tab"
166202msgstr ""
167203
168−#: qml/Components/KeyboardShortcutsOverlay.qml:156
204+#: qml/Components/KeyboardShortcutsOverlay.qml:169
169205msgid "Switches applications via the launcher."
170206msgstr ""
171207
172−#: qml/Components/KeyboardShortcutsOverlay.qml:164
173−msgid "Super + 0 to 9"
208+#: qml/Components/KeyboardShortcutsOverlay.qml:177
209+msgid "Super + 1 to 0"
174210msgstr ""
175211
176−#: qml/Components/KeyboardShortcutsOverlay.qml:169
212+#: qml/Components/KeyboardShortcutsOverlay.qml:182
177213msgid "Same as clicking on a launcher icon."
178214msgstr ""
179215
180−#: qml/Components/KeyboardShortcutsOverlay.qml:181
216+#: qml/Components/KeyboardShortcutsOverlay.qml:190
217+msgid "Super + A"
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:195
221+msgid "Opens the Application Drawer."
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
181225msgid "Scopes"
182226msgstr ""
183227
184−#: qml/Components/KeyboardShortcutsOverlay.qml:188
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
185229msgid "Super (Tap)"
186230msgstr ""
187231
188−#: qml/Components/KeyboardShortcutsOverlay.qml:193
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
189233msgid "Opens the Scopes home."
190234msgstr ""
191235
192−#: qml/Components/KeyboardShortcutsOverlay.qml:209
236+#: qml/Components/KeyboardShortcutsOverlay.qml:235
193237msgid "Switching"
194238msgstr ""
195239
196−#: qml/Components/KeyboardShortcutsOverlay.qml:216
240+#: qml/Components/KeyboardShortcutsOverlay.qml:242
197241msgid "Alt + Tab"
198242msgstr ""
199243
200−#: qml/Components/KeyboardShortcutsOverlay.qml:221
244+#: qml/Components/KeyboardShortcutsOverlay.qml:247
201245msgid "Switches between applications."
202246msgstr ""
203247
204−#: qml/Components/KeyboardShortcutsOverlay.qml:229
248+#: qml/Components/KeyboardShortcutsOverlay.qml:255
205249msgid "Super + W"
206250msgstr ""
207251
208−#: qml/Components/KeyboardShortcutsOverlay.qml:234
252+#: qml/Components/KeyboardShortcutsOverlay.qml:260
209253msgid "Opens the desktop spread."
210254msgstr ""
211255
212−#: qml/Components/KeyboardShortcutsOverlay.qml:242
256+#: qml/Components/KeyboardShortcutsOverlay.qml:268
213257msgid "Cursor Left or Right"
214258msgstr ""
215259
216−#: qml/Components/KeyboardShortcutsOverlay.qml:247
260+#: qml/Components/KeyboardShortcutsOverlay.qml:273
217261msgid "Moves the focus."
218262msgstr ""
219263
220−#: qml/Components/KeyboardShortcutsOverlay.qml:259
264+#: qml/Components/KeyboardShortcutsOverlay.qml:285
221265msgid "Windows"
222266msgstr ""
223267
224−#: qml/Components/KeyboardShortcutsOverlay.qml:266
268+#: qml/Components/KeyboardShortcutsOverlay.qml:292
225269msgid "Ctrl + Super + D"
226270msgstr ""
227271
228−#: qml/Components/KeyboardShortcutsOverlay.qml:271
272+#: qml/Components/KeyboardShortcutsOverlay.qml:297
229273msgid "Minimizes all windows."
230274msgstr ""
231275
232−#: qml/Components/KeyboardShortcutsOverlay.qml:279
276+#: qml/Components/KeyboardShortcutsOverlay.qml:305
233277msgid "Ctrl + Super + Up"
234278msgstr ""
235279
236−#: qml/Components/KeyboardShortcutsOverlay.qml:284
280+#: qml/Components/KeyboardShortcutsOverlay.qml:310
237281msgid "Maximizes the current window."
238282msgstr ""
239283
240−#: qml/Components/KeyboardShortcutsOverlay.qml:292
284+#: qml/Components/KeyboardShortcutsOverlay.qml:318
241285msgid "Ctrl + Super + Down"
242286msgstr ""
243287
244−#: qml/Components/KeyboardShortcutsOverlay.qml:297
288+#: qml/Components/KeyboardShortcutsOverlay.qml:323
245289msgid "Minimizes or restores the current window."
246290msgstr ""
247291
248−#: qml/Components/KeyboardShortcutsOverlay.qml:305
292+#: qml/Components/KeyboardShortcutsOverlay.qml:331
249293msgid "Ctrl + Super + Left or Right"
250294msgstr ""
251295
252−#: qml/Components/KeyboardShortcutsOverlay.qml:310
296+#: qml/Components/KeyboardShortcutsOverlay.qml:336
253297msgid "Semi-maximizes the current window."
254298msgstr ""
255299
256−#: qml/Components/KeyboardShortcutsOverlay.qml:318
300+#: qml/Components/KeyboardShortcutsOverlay.qml:344
257301msgid "Alt + F4"
258302msgstr ""
259303
260−#: qml/Components/KeyboardShortcutsOverlay.qml:323
304+#: qml/Components/KeyboardShortcutsOverlay.qml:349
261305msgid "Closes the current window."
262306msgstr ""
263307
264−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
265309msgid "Return to Call"
266310msgstr "কল এ ফিরে যান"
267311
@@ -269,7 +313,7 @@ msgstr "কল এ ফিরে যান"
269313msgid "Emergency Call"
270314msgstr "জরুরী কল"
271315
272−#: qml/Components/Lockscreen.qml:244
316+#: qml/Components/Lockscreen.qml:245
273317msgid "OK"
274318msgstr "ঠিক আছে"
275319
@@ -283,29 +327,29 @@ msgstr ""
283327msgid "%1:%2"
284328msgstr ""
285329
286−#: qml/Components/ModeSwitchWarningDialog.qml:32
330+#: qml/Components/ModeSwitchWarningDialog.qml:33
287331msgid "Apps may have unsaved data:"
288332msgstr ""
289333
290−#: qml/Components/ModeSwitchWarningDialog.qml:57
334+#: qml/Components/ModeSwitchWarningDialog.qml:60
291335msgctxt ""
292336"Re-dock means connect the device again to an external screen/mouse/keyboard"
293337msgid "Re-dock, save your work and close these apps to continue."
294338msgstr ""
295339
296−#: qml/Components/ModeSwitchWarningDialog.qml:63
340+#: qml/Components/ModeSwitchWarningDialog.qml:67
297341msgid "Or force close now (unsaved data will be lost)."
298342msgstr ""
299343
300−#: qml/Components/ModeSwitchWarningDialog.qml:75
344+#: qml/Components/ModeSwitchWarningDialog.qml:80
301345msgid "OK, I will reconnect"
302346msgstr ""
303347
304−#: qml/Components/ModeSwitchWarningDialog.qml:76
348+#: qml/Components/ModeSwitchWarningDialog.qml:81
305349msgid "Reconnect now!"
306350msgstr ""
307351
308−#: qml/Components/ModeSwitchWarningDialog.qml:88
352+#: qml/Components/ModeSwitchWarningDialog.qml:94
309353msgid "Close all"
310354msgstr ""
311355
@@ -313,6 +357,28 @@ msgstr ""
313357msgid "Preview Share Item"
314358msgstr ""
315359
360+#: qml/Components/VirtualTouchPad.qml:317
361+msgid ""
362+"Your device is now connected to an external display. Use this screen as a "
363+"touch pad to interact with the pointer."
364+msgstr ""
365+
366+#: qml/Components/VirtualTouchPad.qml:327
367+msgid "Tap left button to click."
368+msgstr ""
369+
370+#: qml/Components/VirtualTouchPad.qml:339
371+msgid "Tap right button to right click."
372+msgstr ""
373+
374+#: qml/Components/VirtualTouchPad.qml:351
375+msgid "Swipe with two fingers to scroll."
376+msgstr ""
377+
378+#: qml/Components/VirtualTouchPad.qml:396
379+msgid "Find more settings in the system settings."
380+msgstr ""
381+
316382#: qml/Dash/DashPageHeader.qml:361
317383msgctxt "Button: Open the Ubuntu Store"
318384msgid "Store"
@@ -344,24 +410,24 @@ msgstr ""
344410msgid "Reset"
345411msgstr ""
346412
347−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
413+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
348414msgid "Show less"
349415msgstr ""
350416
351−#: qml/Dash/GenericScopeView.qml:545
417+#: qml/Dash/GenericScopeView.qml:547
352418msgid "Show all"
353419msgstr ""
354420
355−#: qml/Dash/GenericScopeView.qml:576
421+#: qml/Dash/GenericScopeView.qml:578
356422msgctxt "Label: Hint for dash search line edit"
357423msgid "Search"
358424msgstr "খুঁজুন"
359425
360−#: qml/Dash/PageHeaderExtraPanel.qml:57
426+#: qml/Dash/PageHeaderExtraPanel.qml:67
361427msgid "Recent Searches"
362428msgstr ""
363429
364−#: qml/Dash/PageHeaderExtraPanel.qml:68
430+#: qml/Dash/PageHeaderExtraPanel.qml:78
365431msgid "Clear All"
366432msgstr ""
367433
@@ -398,24 +464,18 @@ msgstr "রিফ্রেশ করার জন্য ছেড়ে দিন"
398464msgid "Enable location data"
399465msgstr "অবস্থান নির্ণয় চালু করুন"
400466
401−#: qml/Dash/ScopesList.qml:57
467+#: qml/Dash/ScopesList.qml:146
402468msgid "Manage"
403469msgstr "ব্যবস্থাপনা"
404470
405−#: qml/Dash/ScopesList.qml:104
471+#: qml/Dash/ScopesList.qml:187
406472msgid "Home"
407473msgstr ""
408474
409−#: qml/Dash/ScopesList.qml:105
475+#: qml/Dash/ScopesList.qml:188
410476msgid "Also installed"
411477msgstr "আরও ইন্সটল করা রয়েছে..."
412478
413−#: qml/DisabledScreenNotice.qml:109
414−msgid ""
415−"Your device is now connected to an external display. Use this screen as a "
416−"touch pad to interact with the pointer."
417−msgstr ""
418−
419479#: qml/Greeter/CoverPage.qml:127
420480msgid "Unlock"
421481msgstr "লক খুলুন"
@@ -439,32 +499,45 @@ msgid_plural "Please wait %1 minutes and then try again…"
439499msgstr[0] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন..."
440500msgstr[1] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন..."
441501
442−#: qml/Greeter/Greeter.qml:596
502+#: qml/Greeter/Greeter.qml:550
443503msgid "Try again"
444504msgstr ""
445505
446−#: qml/Greeter/LoginList.qml:70
506+#: qml/Greeter/Greeter.qml:551
507+msgid "Enter passphrase to unlock"
508+msgstr ""
509+
510+#: qml/Greeter/Greeter.qml:552
511+msgid "Enter passcode to unlock"
512+msgstr ""
513+
514+#: qml/Greeter/NarrowView.qml:228
515+msgid "Emergency"
516+msgstr ""
517+
518+#: qml/Greeter/PromptList.qml:126
447519msgid "Passphrase"
448520msgstr ""
449521
450−#: qml/Greeter/LoginList.qml:71
522+#: qml/Greeter/PromptList.qml:126
451523msgid "Passcode"
452524msgstr ""
453525
454−#: qml/Greeter/LoginList.qml:98
455−msgid "Retry"
526+#: qml/Greeter/SessionsList.qml:124
527+msgid "Select desktop environment"
456528msgstr ""
457529
458−#: qml/Greeter/LoginList.qml:99
459−msgid "Log In"
530+#: qml/Launcher/Drawer.qml:94
531+msgid "Search…"
460532msgstr ""
461533
462−#: qml/Greeter/NarrowView.qml:252
463−msgid "Emergency"
534+#: qml/Launcher/Drawer.qml:129
535+msgctxt "Apps sorted alphabetically"
536+msgid "A-Z"
464537msgstr ""
465538
466−#: qml/Greeter/SessionsList.qml:122
467−msgid "Select desktop environment"
539+#: qml/Launcher/MoreAppsHeader.qml:55
540+msgid "More apps in the store"
468541msgstr ""
469542
470543#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -479,62 +552,62 @@ msgstr "কলে ফিরে যেতে চাপ দিন..."
479552msgid "Conference"
480553msgstr "কনফারেন্স"
481554
482−#: qml/Panel/Indicators/MenuItemFactory.qml:847
555+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
483556msgid "Nothing is playing"
484557msgstr "কোন কিছু বাজছে না।"
485558
486−#: qml/Panel/Indicators/MenuItemFactory.qml:975
559+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
487560#, qt-format
488561msgid "%1 hour"
489562msgid_plural "%1 hours"
490563msgstr[0] "%1 ঘণ্টা"
491564msgstr[1] "%1 ঘণ্টা"
492565
493−#: qml/Panel/Indicators/MenuItemFactory.qml:979
566+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
494567#, qt-format
495568msgid "%1 minute"
496569msgid_plural "%1 minutes"
497570msgstr[0] "%1 মিনিট"
498571msgstr[1] "%1 মিনিট"
499572
500−#: qml/Panel/Indicators/MenuItemFactory.qml:984
573+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
501574#, qt-format
502575msgid "%1 second"
503576msgid_plural "%1 seconds"
504577msgstr[0] "%1 সেকেন্ড"
505578msgstr[1] "%1 সেকেন্ড"
506579
507−#: qml/Panel/Indicators/MenuItemFactory.qml:987
580+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
508581msgid "0 seconds"
509582msgstr "0 সেকেন্ড"
510583
511584#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
512−#: qml/Panel/Indicators/MenuItemFactory.qml:989
585+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
513586#, qt-format
514587msgid "%1 remaining"
515588msgstr "%1 বাকি"
516589
517−#: qml/Panel/Indicators/MenuItemFactory.qml:995
590+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
518591msgid "In queue…"
519592msgstr "অপেক্ষায় রয়েছে..."
520593
521−#: qml/Panel/Indicators/MenuItemFactory.qml:999
594+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
522595msgid "Downloading"
523596msgstr "ডাউনলোড হচ্ছে"
524597
525−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
598+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
526599msgid "Paused, tap to resume"
527600msgstr "থামানো, শুরু করতে চাপ দিন"
528601
529−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
602+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
530603msgid "Canceled"
531604msgstr "বাতিল হয়েছে"
532605
533−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
606+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
534607msgid "Finished"
535608msgstr "শেষ"
536609
537−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
610+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
538611msgid "Failed, tap to retry"
539612msgstr "ব্যার্থ হয়েছে, পুনরায় চেষ্টা করতে চাপ দিন"
540613
@@ -554,12 +627,16 @@ msgctxt "Button: Call back on phone"
554627msgid "Call back"
555628msgstr "কল ব্যাক"
556629
630+#: qml/Panel/PanelMenuPage.qml:92
631+msgid "Back"
632+msgstr ""
633+
557634#: qml/Stage/SideStage.qml:76
558635msgid "Drag using 3 fingers any application from one window to the other"
559636msgstr ""
560637
561638#: qml/Tutorial/TutorialLeftLong.qml:49
562−msgid "Long swipe from the left edge to open the Today scope"
639+msgid "Long swipe from the left edge to open the Application Drawer"
563640msgstr ""
564641
565642#: qml/Tutorial/TutorialLeft.qml:47
@@ -588,7 +665,7 @@ msgid "Language"
588665msgstr ""
589666
590667#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
591−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
668+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
592669#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
593670#: qml/Wizard/Pages/70-passwd-type.qml:145
594671#: qml/Wizard/Pages/75-report-check.qml:84
@@ -609,25 +686,24 @@ msgstr ""
609686msgid "Keyboard layout"
610687msgstr ""
611688
612−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
613−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
614−#: qml/Wizard/Pages/sim.qml:101
689+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
690+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
615691msgid "Skip"
616692msgstr "এড়িয়ে যান"
617693
618−#: qml/Wizard/Pages/30-wifi.qml:31
694+#: qml/Wizard/Pages/30-wifi.qml:30
619695msgid "Connect to Wi‑Fi"
620696msgstr ""
621697
622−#: qml/Wizard/Pages/30-wifi.qml:132
698+#: qml/Wizard/Pages/30-wifi.qml:131
623699msgid "Connected"
624700msgstr ""
625701
626−#: qml/Wizard/Pages/30-wifi.qml:165
702+#: qml/Wizard/Pages/30-wifi.qml:164
627703msgid "Available Wi-Fi networks"
628704msgstr ""
629705
630−#: qml/Wizard/Pages/30-wifi.qml:166
706+#: qml/Wizard/Pages/30-wifi.qml:165
631707msgid "No available Wi-Fi networks"
632708msgstr ""
633709
@@ -714,35 +790,6 @@ msgstr ""
714790msgid "Privacy policy"
715791msgstr ""
716792
717−#: qml/Wizard/Pages/77-system-update.qml:28
718−msgid "Update Device"
719−msgstr ""
720−
721−#: qml/Wizard/Pages/77-system-update.qml:55
722−msgid ""
723−"There is a system update available and ready to install. Afterwards, the "
724−"device will automatically restart."
725−msgstr ""
726−
727−#: qml/Wizard/Pages/77-system-update.qml:76
728−msgctxt "string identifying name of the update"
729−msgid "Ubuntu system"
730−msgstr ""
731−
732−#: qml/Wizard/Pages/77-system-update.qml:83
733−#, qt-format
734−msgctxt "version of the system update"
735−msgid "Version %1"
736−msgstr ""
737−
738−#: qml/Wizard/Pages/77-system-update.qml:102
739−msgid "This could take a few minutes..."
740−msgstr ""
741−
742−#: qml/Wizard/Pages/77-system-update.qml:116
743−msgid "Install and restart now"
744−msgstr ""
745−
746793#: qml/Wizard/Pages/80-finished.qml:89
747794msgid "Welcome to Ubuntu"
748795msgstr ""
po/br.po+236−152
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
1111"PO-Revision-Date: 2016-08-29 11:37+0000\n"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
@@ -15,75 +15,103 @@ 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-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr "Ger-tremen : "
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr ""
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr ""
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr ""
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr "Kevreañ"
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr "Esaeañ en-dro"
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr ""
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr ""
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr "Spilhennañ ar verradenn"
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr "Mont kuit"
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr "Dispilhennañ ar verradenn"
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr "Digevreañ"
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr "Ha sur oc'h e fell deoc'h digevreañ ?"
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr "Prennañ"
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr "Digevreañ"
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr "Nullañ"
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr "Adloc'hañ"
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr "Ha sur oc'h e fell deoc'h adloc'hañ ?"
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr "N'on ket"
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr "Ya"
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr "Enaouiñ"
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
@@ -91,12 +119,12 @@ msgstr ""
91119"Ha sur oc'h e fell deoc'h\n"
92120"troc'hañ an tredan ?"
93121
94−#: qml/Components/Dialogs.qml:205
122+#: qml/Components/Dialogs.qml:244
95123msgctxt "Button: Power off the system"
96124msgid "Power off"
97125msgstr "Lazhañ"
98126
99−#: qml/Components/Dialogs.qml:214
127+#: qml/Components/Dialogs.qml:255
100128msgctxt "Button: Restart the system"
101129msgid "Restart"
102130msgstr "Adloc'hañ"
@@ -122,8 +150,8 @@ msgid "Alt + PrtScr"
122150msgstr ""
123151
124152#: qml/Components/KeyboardShortcutsOverlay.qml:80
125−msgid "Takes a screenshot of a window."
126−msgstr "Tapout ur skeudenn eus ur prenestr"
153+msgid "Takes a screenshot of the current window."
154+msgstr ""
127155
128156#: qml/Components/KeyboardShortcutsOverlay.qml:88
129157msgid "Super + Space"
@@ -131,7 +159,7 @@ msgstr ""
131159
132160#: qml/Components/KeyboardShortcutsOverlay.qml:93
133161msgid "Switches to next keyboard layout."
134−msgstr ""
162+msgstr "Mont d'ar fichadur klavir war-lerc'h"
135163
136164#: qml/Components/KeyboardShortcutsOverlay.qml:101
137165msgid "Super + Shift + Space"
@@ -139,129 +167,145 @@ msgstr ""
139167
140168#: qml/Components/KeyboardShortcutsOverlay.qml:106
141169msgid "Switches to previous keyboard layout."
170+msgstr "Mont d'ar fichadur klavier kent"
171+
172+#: qml/Components/KeyboardShortcutsOverlay.qml:114
173+msgid "Ctrl + Alt + T"
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:119
177+msgid "Starts the Terminal application."
142178msgstr ""
143179
144−#: qml/Components/KeyboardShortcutsOverlay.qml:118
180+#: qml/Components/KeyboardShortcutsOverlay.qml:131
145181msgid "Launcher"
146182msgstr "Lañser"
147183
148−#: qml/Components/KeyboardShortcutsOverlay.qml:125
184+#: qml/Components/KeyboardShortcutsOverlay.qml:138
149185msgid "Super (Hold)"
150186msgstr ""
151187
152−#: qml/Components/KeyboardShortcutsOverlay.qml:130
188+#: qml/Components/KeyboardShortcutsOverlay.qml:143
153189msgid "Opens the launcher, displays shortcuts."
154190msgstr "Digeriñ al lañser, diskouez ar berradurioù"
155191
156−#: qml/Components/KeyboardShortcutsOverlay.qml:138
192+#: qml/Components/KeyboardShortcutsOverlay.qml:151
157193msgid "Alt + F1"
158194msgstr "Erl + F1"
159195
160−#: qml/Components/KeyboardShortcutsOverlay.qml:143
196+#: qml/Components/KeyboardShortcutsOverlay.qml:156
161197msgid "Opens launcher keyboard navigation mode."
162−msgstr ""
198+msgstr "Digeriñ ar mod merdeiñ gant lañser ar c'hlavier"
163199
164−#: qml/Components/KeyboardShortcutsOverlay.qml:151
200+#: qml/Components/KeyboardShortcutsOverlay.qml:164
165201msgid "Super + Tab"
166202msgstr ""
167203
168−#: qml/Components/KeyboardShortcutsOverlay.qml:156
204+#: qml/Components/KeyboardShortcutsOverlay.qml:169
169205msgid "Switches applications via the launcher."
170−msgstr ""
206+msgstr "Mont d'un arload all dre al lañser."
171207
172−#: qml/Components/KeyboardShortcutsOverlay.qml:164
173−msgid "Super + 0 to 9"
208+#: qml/Components/KeyboardShortcutsOverlay.qml:177
209+msgid "Super + 1 to 0"
174210msgstr ""
175211
176−#: qml/Components/KeyboardShortcutsOverlay.qml:169
212+#: qml/Components/KeyboardShortcutsOverlay.qml:182
177213msgid "Same as clicking on a launcher icon."
178214msgstr "Ar memes tra ha klikañ war un arlun lañser"
179215
180−#: qml/Components/KeyboardShortcutsOverlay.qml:181
216+#: qml/Components/KeyboardShortcutsOverlay.qml:190
217+msgid "Super + A"
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:195
221+msgid "Opens the Application Drawer."
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
181225msgid "Scopes"
182226msgstr "Kefluskerioù enklask"
183227
184−#: qml/Components/KeyboardShortcutsOverlay.qml:188
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
185229msgid "Super (Tap)"
186230msgstr ""
187231
188−#: qml/Components/KeyboardShortcutsOverlay.qml:193
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
189233msgid "Opens the Scopes home."
190234msgstr "Digeriñ pajenn degemer ar c'hefluskerioù enklask."
191235
192−#: qml/Components/KeyboardShortcutsOverlay.qml:209
236+#: qml/Components/KeyboardShortcutsOverlay.qml:235
193237msgid "Switching"
194238msgstr "Cheñch"
195239
196−#: qml/Components/KeyboardShortcutsOverlay.qml:216
240+#: qml/Components/KeyboardShortcutsOverlay.qml:242
197241msgid "Alt + Tab"
198242msgstr "Erl + Taolenn"
199243
200−#: qml/Components/KeyboardShortcutsOverlay.qml:221
244+#: qml/Components/KeyboardShortcutsOverlay.qml:247
201245msgid "Switches between applications."
202−msgstr ""
246+msgstr "Mont da arloadoù all."
203247
204−#: qml/Components/KeyboardShortcutsOverlay.qml:229
248+#: qml/Components/KeyboardShortcutsOverlay.qml:255
205249msgid "Super + W"
206250msgstr ""
207251
208−#: qml/Components/KeyboardShortcutsOverlay.qml:234
252+#: qml/Components/KeyboardShortcutsOverlay.qml:260
209253msgid "Opens the desktop spread."
210−msgstr ""
254+msgstr "Digeriñ ar burev astennet"
211255
212−#: qml/Components/KeyboardShortcutsOverlay.qml:242
256+#: qml/Components/KeyboardShortcutsOverlay.qml:268
213257msgid "Cursor Left or Right"
214−msgstr ""
258+msgstr "Reti kleiz pe dehoù"
215259
216−#: qml/Components/KeyboardShortcutsOverlay.qml:247
260+#: qml/Components/KeyboardShortcutsOverlay.qml:273
217261msgid "Moves the focus."
218−msgstr ""
262+msgstr "Cheñch an dibab."
219263
220−#: qml/Components/KeyboardShortcutsOverlay.qml:259
264+#: qml/Components/KeyboardShortcutsOverlay.qml:285
221265msgid "Windows"
222266msgstr "Windows"
223267
224−#: qml/Components/KeyboardShortcutsOverlay.qml:266
268+#: qml/Components/KeyboardShortcutsOverlay.qml:292
225269msgid "Ctrl + Super + D"
226270msgstr ""
227271
228−#: qml/Components/KeyboardShortcutsOverlay.qml:271
272+#: qml/Components/KeyboardShortcutsOverlay.qml:297
229273msgid "Minimizes all windows."
230274msgstr "Bihanaat an holl brenestroù."
231275
232−#: qml/Components/KeyboardShortcutsOverlay.qml:279
276+#: qml/Components/KeyboardShortcutsOverlay.qml:305
233277msgid "Ctrl + Super + Up"
234278msgstr ""
235279
236−#: qml/Components/KeyboardShortcutsOverlay.qml:284
280+#: qml/Components/KeyboardShortcutsOverlay.qml:310
237281msgid "Maximizes the current window."
238282msgstr ""
239283
240−#: qml/Components/KeyboardShortcutsOverlay.qml:292
284+#: qml/Components/KeyboardShortcutsOverlay.qml:318
241285msgid "Ctrl + Super + Down"
242286msgstr ""
243287
244−#: qml/Components/KeyboardShortcutsOverlay.qml:297
288+#: qml/Components/KeyboardShortcutsOverlay.qml:323
245289msgid "Minimizes or restores the current window."
246290msgstr ""
247291
248−#: qml/Components/KeyboardShortcutsOverlay.qml:305
292+#: qml/Components/KeyboardShortcutsOverlay.qml:331
249293msgid "Ctrl + Super + Left or Right"
250294msgstr ""
251295
252−#: qml/Components/KeyboardShortcutsOverlay.qml:310
296+#: qml/Components/KeyboardShortcutsOverlay.qml:336
253297msgid "Semi-maximizes the current window."
254298msgstr ""
255299
256−#: qml/Components/KeyboardShortcutsOverlay.qml:318
300+#: qml/Components/KeyboardShortcutsOverlay.qml:344
257301msgid "Alt + F4"
258302msgstr "Erl + F4"
259303
260−#: qml/Components/KeyboardShortcutsOverlay.qml:323
304+#: qml/Components/KeyboardShortcutsOverlay.qml:349
261305msgid "Closes the current window."
262−msgstr ""
306+msgstr "Serriñ ar prenestr a vremañ"
263307
264−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
265309msgid "Return to Call"
266310msgstr "Distreiñ d'ar bellgomzadenn"
267311
@@ -269,7 +313,7 @@ msgstr "Distreiñ d'ar bellgomzadenn"
269313msgid "Emergency Call"
270314msgstr "Pellgomzadenn vallus"
271315
272−#: qml/Components/Lockscreen.qml:244
316+#: qml/Components/Lockscreen.qml:245
273317msgid "OK"
274318msgstr "Mat eo"
275319
@@ -283,11 +327,11 @@ msgstr "%1:%2:%3"
283327msgid "%1:%2"
284328msgstr "%1:%2"
285329
286−#: qml/Components/ModeSwitchWarningDialog.qml:32
330+#: qml/Components/ModeSwitchWarningDialog.qml:33
287331msgid "Apps may have unsaved data:"
288332msgstr "Roadennoù ha n'int ket enrollet a c'hall bezañ gant an arloadoù :"
289333
290−#: qml/Components/ModeSwitchWarningDialog.qml:57
334+#: qml/Components/ModeSwitchWarningDialog.qml:60
291335msgctxt ""
292336"Re-dock means connect the device again to an external screen/mouse/keyboard"
293337msgid "Re-dock, save your work and close these apps to continue."
@@ -295,20 +339,20 @@ msgstr ""
295339"Adkevreit ouzh ar savlec'h degemer, enrollot ho labour ha serrit an arloadoù-"
296340"mañ evit kenderc'hel."
297341
298−#: qml/Components/ModeSwitchWarningDialog.qml:63
342+#: qml/Components/ModeSwitchWarningDialog.qml:67
299343msgid "Or force close now (unsaved data will be lost)."
300344msgstr ""
301345"Pe rediañ da serriñ bremañ (kollet e vo ar roadennoù n'int ket bet enrollet)."
302346
303−#: qml/Components/ModeSwitchWarningDialog.qml:75
347+#: qml/Components/ModeSwitchWarningDialog.qml:80
304348msgid "OK, I will reconnect"
305349msgstr "Mat eo, ez an da adkevreañ"
306350
307−#: qml/Components/ModeSwitchWarningDialog.qml:76
351+#: qml/Components/ModeSwitchWarningDialog.qml:81
308352msgid "Reconnect now!"
309353msgstr "Adkevreañ bremañ !"
310354
311−#: qml/Components/ModeSwitchWarningDialog.qml:88
355+#: qml/Components/ModeSwitchWarningDialog.qml:94
312356msgid "Close all"
313357msgstr "Serriñ pep tra"
314358
@@ -316,6 +360,30 @@ msgstr "Serriñ pep tra"
316360msgid "Preview Share Item"
317361msgstr "Rakwelet an elfenn lodet"
318362
363+#: qml/Components/VirtualTouchPad.qml:317
364+msgid ""
365+"Your device is now connected to an external display. Use this screen as a "
366+"touch pad to interact with the pointer."
367+msgstr ""
368+"Kevreet eo ho penveg ouzh ur skramm diavaez bremañ. Implijit ar skramm-mañ "
369+"da bavez-touch evit ober gant ar reti."
370+
371+#: qml/Components/VirtualTouchPad.qml:327
372+msgid "Tap left button to click."
373+msgstr ""
374+
375+#: qml/Components/VirtualTouchPad.qml:339
376+msgid "Tap right button to right click."
377+msgstr ""
378+
379+#: qml/Components/VirtualTouchPad.qml:351
380+msgid "Swipe with two fingers to scroll."
381+msgstr ""
382+
383+#: qml/Components/VirtualTouchPad.qml:396
384+msgid "Find more settings in the system settings."
385+msgstr ""
386+
319387#: qml/Dash/DashPageHeader.qml:361
320388msgctxt "Button: Open the Ubuntu Store"
321389msgid "Store"
@@ -347,24 +415,24 @@ msgstr "Purañ ho tisoc'hoù"
347415msgid "Reset"
348416msgstr "Adderaouekaat"
349417
350−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
418+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
351419msgid "Show less"
352420msgstr "Diskouez nebeutoc'h"
353421
354−#: qml/Dash/GenericScopeView.qml:545
422+#: qml/Dash/GenericScopeView.qml:547
355423msgid "Show all"
356424msgstr "Diskouez pep tra"
357425
358−#: qml/Dash/GenericScopeView.qml:576
426+#: qml/Dash/GenericScopeView.qml:578
359427msgctxt "Label: Hint for dash search line edit"
360428msgid "Search"
361429msgstr "Klask"
362430
363−#: qml/Dash/PageHeaderExtraPanel.qml:57
431+#: qml/Dash/PageHeaderExtraPanel.qml:67
364432msgid "Recent Searches"
365433msgstr "Enklaskoù graet nevez zo"
366434
367−#: qml/Dash/PageHeaderExtraPanel.qml:68
435+#: qml/Dash/PageHeaderExtraPanel.qml:78
368436msgid "Clear All"
369437msgstr "Diverkañ pep tra"
370438
@@ -401,24 +469,18 @@ msgstr "Lezel da vont evit freskaat..."
401469msgid "Enable location data"
402470msgstr "Gweredekaat ar roadennoù lec'hiañ"
403471
404−#: qml/Dash/ScopesList.qml:57
472+#: qml/Dash/ScopesList.qml:146
405473msgid "Manage"
406474msgstr "Merañ"
407475
408−#: qml/Dash/ScopesList.qml:104
476+#: qml/Dash/ScopesList.qml:187
409477msgid "Home"
410478msgstr "Er gêr"
411479
412−#: qml/Dash/ScopesList.qml:105
480+#: qml/Dash/ScopesList.qml:188
413481msgid "Also installed"
414482msgstr "Staliet ivez"
415483
416−#: qml/DisabledScreenNotice.qml:109
417−msgid ""
418−"Your device is now connected to an external display. Use this screen as a "
419−"touch pad to interact with the pointer."
420−msgstr ""
421−
422484#: qml/Greeter/CoverPage.qml:127
423485msgid "Unlock"
424486msgstr "Dibrennañ"
@@ -446,32 +508,45 @@ msgid_plural "Please wait %1 minutes and then try again…"
446508msgstr[0] "Gortozit %1 vunutenn, mar plij, hag esaeit en-dro..."
447509msgstr[1] "Gortozit %1 a vunutoù, mar plij, hag esaeit en-dro..."
448510
449−#: qml/Greeter/Greeter.qml:596
511+#: qml/Greeter/Greeter.qml:550
450512msgid "Try again"
451513msgstr "Esaeañ adarre"
452514
453−#: qml/Greeter/LoginList.qml:70
515+#: qml/Greeter/Greeter.qml:551
516+msgid "Enter passphrase to unlock"
517+msgstr ""
518+
519+#: qml/Greeter/Greeter.qml:552
520+msgid "Enter passcode to unlock"
521+msgstr ""
522+
523+#: qml/Greeter/NarrowView.qml:228
524+msgid "Emergency"
525+msgstr "Mall"
526+
527+#: qml/Greeter/PromptList.qml:126
454528msgid "Passphrase"
455529msgstr "Lavarenn-dremen"
456530
457−#: qml/Greeter/LoginList.qml:71
531+#: qml/Greeter/PromptList.qml:126
458532msgid "Passcode"
459533msgstr "Kod-tremen"
460534
461−#: qml/Greeter/LoginList.qml:98
462−msgid "Retry"
463−msgstr "Esaeañ en-dro"
535+#: qml/Greeter/SessionsList.qml:124
536+msgid "Select desktop environment"
537+msgstr "Diuzañ endro ar burev"
464538
465−#: qml/Greeter/LoginList.qml:99
466−msgid "Log In"
467−msgstr "Kevreañ"
539+#: qml/Launcher/Drawer.qml:94
540+msgid "Search…"
541+msgstr ""
468542
469−#: qml/Greeter/NarrowView.qml:252
470−msgid "Emergency"
543+#: qml/Launcher/Drawer.qml:129
544+msgctxt "Apps sorted alphabetically"
545+msgid "A-Z"
471546msgstr ""
472547
473−#: qml/Greeter/SessionsList.qml:122
474−msgid "Select desktop environment"
548+#: qml/Launcher/MoreAppsHeader.qml:55
549+msgid "More apps in the store"
475550msgstr ""
476551
477552#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -486,62 +561,62 @@ msgstr "Touchit evit distreiñ d'ar bellgomzadenn..."
486561msgid "Conference"
487562msgstr "Kendiviz"
488563
489−#: qml/Panel/Indicators/MenuItemFactory.qml:847
564+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
490565msgid "Nothing is playing"
491566msgstr "Ne lenner netra bremañ"
492567
493−#: qml/Panel/Indicators/MenuItemFactory.qml:975
568+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
494569#, qt-format
495570msgid "%1 hour"
496571msgid_plural "%1 hours"
497572msgstr[0] "%1 eur"
498573msgstr[1] "%1 eur"
499574
500−#: qml/Panel/Indicators/MenuItemFactory.qml:979
575+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
501576#, qt-format
502577msgid "%1 minute"
503578msgid_plural "%1 minutes"
504579msgstr[0] "%1 vunutenn"
505580msgstr[1] "%1 vunutenn"
506581
507−#: qml/Panel/Indicators/MenuItemFactory.qml:984
582+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
508583#, qt-format
509584msgid "%1 second"
510585msgid_plural "%1 seconds"
511586msgstr[0] "%1 eilenn"
512587msgstr[1] "%1 eilenn"
513588
514−#: qml/Panel/Indicators/MenuItemFactory.qml:987
589+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
515590msgid "0 seconds"
516591msgstr "0 eilenn"
517592
518593#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
519−#: qml/Panel/Indicators/MenuItemFactory.qml:989
594+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
520595#, qt-format
521596msgid "%1 remaining"
522597msgstr "%1 o chom"
523598
524−#: qml/Panel/Indicators/MenuItemFactory.qml:995
599+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
525600msgid "In queue…"
526601msgstr "El lostennad..."
527602
528−#: qml/Panel/Indicators/MenuItemFactory.qml:999
603+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
529604msgid "Downloading"
530605msgstr "O pellgargañ"
531606
532−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
607+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
533608msgid "Paused, tap to resume"
534609msgstr "Ehanet, touchit evit adkregiñ"
535610
536−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
611+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
537612msgid "Canceled"
538613msgstr "Nullet"
539614
540−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
615+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
541616msgid "Finished"
542617msgstr "Echu"
543618
544−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
619+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
545620msgid "Failed, tap to retry"
546621msgstr "C'hwitet, touchit evit adkregiñ"
547622
@@ -561,17 +636,21 @@ msgctxt "Button: Call back on phone"
561636msgid "Call back"
562637msgstr "Gervel en-dro"
563638
639+#: qml/Panel/PanelMenuPage.qml:92
640+msgid "Back"
641+msgstr ""
642+
564643#: qml/Stage/SideStage.qml:76
565644msgid "Drag using 3 fingers any application from one window to the other"
566−msgstr ""
645+msgstr "Riklit forzh peseurt arload gant tri biz eus an eil prenestr d'egile"
567646
568647#: qml/Tutorial/TutorialLeftLong.qml:49
569−msgid "Long swipe from the left edge to open the Today scope"
648+msgid "Long swipe from the left edge to open the Application Drawer"
570649msgstr ""
571650
572651#: qml/Tutorial/TutorialLeft.qml:47
573652msgid "Short swipe from the left edge to open the launcher"
574−msgstr ""
653+msgstr "Rikladenn verr adalek ar bord kleiz evit digeriñ al lañser"
575654
576655#: qml/Tutorial/TutorialRight.qml:55
577656msgid "Push your mouse against the right edge to view your open apps"
@@ -580,11 +659,12 @@ msgstr ""
580659
581660#: qml/Tutorial/TutorialRight.qml:56
582661msgid "Swipe from the right edge to view your open apps"
583−msgstr ""
662+msgstr "Riklañ adalek ar bord dehoù evit gwelet hoc'h arloadoù digor"
584663
585664#: qml/Tutorial/TutorialTop.qml:53
586665msgid "Swipe from the top edge to access notifications and quick settings"
587666msgstr ""
667+"Riklañ adalek an nec'h evit gwelet ar c'hemennoù hag an arventennoù prim"
588668
589669#: qml/Wizard/Page.qml:54
590670msgctxt "Button: Go back one page in the Wizard"
@@ -596,7 +676,7 @@ msgid "Language"
596676msgstr "Yezh"
597677
598678#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
599−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
679+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
600680#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
601681#: qml/Wizard/Pages/70-passwd-type.qml:145
602682#: qml/Wizard/Pages/75-report-check.qml:84
@@ -617,25 +697,24 @@ msgstr "Yezh ar c'hlavier"
617697msgid "Keyboard layout"
618698msgstr "Aozadur ar c'hlavier"
619699
620−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
621−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
622−#: qml/Wizard/Pages/sim.qml:101
700+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
701+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
623702msgid "Skip"
624703msgstr "Tremen hebiou"
625704
626−#: qml/Wizard/Pages/30-wifi.qml:31
705+#: qml/Wizard/Pages/30-wifi.qml:30
627706msgid "Connect to Wi‑Fi"
628707msgstr "Kevreañ ouzh ar Wi-Fi"
629708
630−#: qml/Wizard/Pages/30-wifi.qml:132
709+#: qml/Wizard/Pages/30-wifi.qml:131
631710msgid "Connected"
632711msgstr "Kevreet"
633712
634−#: qml/Wizard/Pages/30-wifi.qml:165
713+#: qml/Wizard/Pages/30-wifi.qml:164
635714msgid "Available Wi-Fi networks"
636715msgstr "Rouedadoù Wi-Fi da gaout"
637716
638−#: qml/Wizard/Pages/30-wifi.qml:166
717+#: qml/Wizard/Pages/30-wifi.qml:165
639718msgid "No available Wi-Fi networks"
640719msgstr "N'eus ket rouedadoù Wi-Fi da gaout"
641720
@@ -716,41 +795,12 @@ msgstr "Sikourit ac'hanomp da wellaat"
716795
717796#: qml/Wizard/Pages/75-report-check.qml:59
718797msgid "Improve system performance by sending us crashes and error reports."
719−msgstr ""
798+msgstr "Gwellait ar reizhiad en ur gas deomp an danevelloù fazi."
720799
721800#: qml/Wizard/Pages/75-report-check.qml:60
722801msgid "Privacy policy"
723802msgstr "Reolennoù buhez prevez"
724803
725−#: qml/Wizard/Pages/77-system-update.qml:28
726−msgid "Update Device"
727−msgstr "Hizivaat ar benveg"
728−
729−#: qml/Wizard/Pages/77-system-update.qml:55
730−msgid ""
731−"There is a system update available and ready to install. Afterwards, the "
732−"device will automatically restart."
733−msgstr ""
734−
735−#: qml/Wizard/Pages/77-system-update.qml:76
736−msgctxt "string identifying name of the update"
737−msgid "Ubuntu system"
738−msgstr "Reizhiad Ubuntu"
739−
740−#: qml/Wizard/Pages/77-system-update.qml:83
741−#, qt-format
742−msgctxt "version of the system update"
743−msgid "Version %1"
744−msgstr "Stumm %1"
745−
746−#: qml/Wizard/Pages/77-system-update.qml:102
747−msgid "This could take a few minutes..."
748−msgstr "Gallout a ra padout un nebeud munutennoù..."
749−
750−#: qml/Wizard/Pages/77-system-update.qml:116
751−msgid "Install and restart now"
752−msgstr "Staliañ hag adloc'hañ bremañ"
753−
754804#: qml/Wizard/Pages/80-finished.qml:89
755805msgid "Welcome to Ubuntu"
756806msgstr "Donemat en Ubuntu"
@@ -769,7 +819,7 @@ msgstr "Penndivizoù implij"
769819
770820#: qml/Wizard/Pages/here-terms.qml:69
771821msgid "Your device uses positioning technologies provided by HERE."
772−msgstr ""
822+msgstr "Ho penveg a implij teknologiezhoù lec'hiañ pourchaset gant HERE."
773823
774824#: qml/Wizard/Pages/here-terms.qml:81
775825msgid ""
@@ -783,6 +833,8 @@ msgid ""
783833"The information collected is used to analyze the service and to improve the "
784834"use of service, but not to identify you personally."
785835msgstr ""
836+"Implijet e vez an titouroù dastumet evit dielfennañ ar servij ha gwellaat an "
837+"implij anezhañ, ha neket evit anavezout ac'hanoc'h."
786838
787839#: qml/Wizard/Pages/here-terms.qml:106
788840#, qt-format
@@ -1284,3 +1336,35 @@ msgstr "Ger-tremen diasur-kenañ"
12841336
12851337#~ msgid "Swipe up to create a message"
12861338#~ msgstr "Riklit d'an nec'h evit krouiñ ur gemennadenn"
1339+
1340+#~ msgid "Takes a screenshot of a window."
1341+#~ msgstr "Tapout ur skeudenn eus ur prenestr"
1342+
1343+#~ msgid "This could take a few minutes..."
1344+#~ msgstr "Gallout a ra padout un nebeud munutennoù..."
1345+
1346+#, qt-format
1347+#~ msgctxt "version of the system update"
1348+#~ msgid "Version %1"
1349+#~ msgstr "Stumm %1"
1350+
1351+#~ msgctxt "string identifying name of the update"
1352+#~ msgid "Ubuntu system"
1353+#~ msgstr "Reizhiad Ubuntu"
1354+
1355+#~ msgid "Update Device"
1356+#~ msgstr "Hizivaat ar benveg"
1357+
1358+#~ msgid "Install and restart now"
1359+#~ msgstr "Staliañ hag adloc'hañ bremañ"
1360+
1361+#~ msgid ""
1362+#~ "There is a system update available and ready to install. Afterwards, the "
1363+#~ "device will automatically restart."
1364+#~ msgstr ""
1365+#~ "Un hizivadenn eus ar reizhiad zo da gaout. Prest eo da vezañ staliet. Goude-"
1366+#~ "se e adloc'ho ho penveg e-unan."
1367+
1368+#~ msgid "Long swipe from the left edge to open the Today scope"
1369+#~ msgstr ""
1370+#~ "Rikladenn hir adalek ar bord kleiz evit digeriñ ar c'heflusker enklask Hiziv"
po/bs.po+184−137
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+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,75 +16,103 @@ 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-11-23 06:34+0000\n"
20−"X-Generator: Launchpad (build 18269)\n"
19+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
20+"X-Generator: Launchpad (build 18343)\n"
2121
22−#: plugins/LightDM/Greeter.cpp:123
22+#: plugins/LightDM/Greeter.cpp:188
2323msgid "Password: "
2424msgstr "Šifra: "
2525
26+#: plugins/LightDM/Greeter.cpp:203
27+msgid "Username"
28+msgstr ""
29+
30+#: plugins/LightDM/Greeter.cpp:242
31+msgid "Failed to authenticate"
32+msgstr ""
33+
34+#: plugins/LightDM/Greeter.cpp:244
35+msgid "Invalid password, please try again"
36+msgstr ""
37+
38+#: plugins/LightDM/Greeter.cpp:254
39+msgid "Log In"
40+msgstr ""
41+
42+#: plugins/LightDM/Greeter.cpp:254
43+msgid "Retry"
44+msgstr "Ponovi"
45+
46+#: plugins/LightDM/UsersModel.cpp:157
47+msgid "Login"
48+msgstr ""
49+
50+#: plugins/LightDM/UsersModel.cpp:165
51+msgid "Guest Session"
52+msgstr ""
53+
2654#: plugins/Unity/Launcher/launcheritem.cpp:49
27−#: plugins/Unity/Launcher/launcheritem.cpp:108
55+#: plugins/Unity/Launcher/launcheritem.cpp:123
2856msgid "Pin shortcut"
2957msgstr "Prikačite prečicu"
3058
31−#: plugins/Unity/Launcher/launcheritem.cpp:54
59+#: plugins/Unity/Launcher/launcheritem.cpp:55
3260msgid "Quit"
3361msgstr "Napusti"
3462
35−#: plugins/Unity/Launcher/launcheritem.cpp:108
63+#: plugins/Unity/Launcher/launcheritem.cpp:123
3664msgid "Unpin shortcut"
3765msgstr "Otkačite prečicu"
3866
39−#: qml/Components/Dialogs.qml:149
67+#: qml/Components/Dialogs.qml:176
4068msgctxt "Title: Lock/Log out dialog"
4169msgid "Log out"
4270msgstr "Odjavite se"
4371
44−#: qml/Components/Dialogs.qml:150
72+#: qml/Components/Dialogs.qml:177
4573msgid "Are you sure you want to log out?"
4674msgstr "Da li ste sigurni da se želite odjaviti?"
4775
48−#: qml/Components/Dialogs.qml:152
76+#: qml/Components/Dialogs.qml:180
4977msgctxt "Button: Lock the system"
5078msgid "Lock"
5179msgstr "Zaključaj"
5280
53−#: qml/Components/Dialogs.qml:159
81+#: qml/Components/Dialogs.qml:191
5482msgctxt "Button: Log out from the system"
5583msgid "Log Out"
5684msgstr "Odjavi se"
5785
58−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
59−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
6088#: qml/Wizard/Pages/passcode-confirm.qml:32
6189#: qml/Wizard/Pages/passcode-set.qml:32
6290msgid "Cancel"
6391msgstr "Otkaži"
6492
65−#: qml/Components/Dialogs.qml:178
93+#: qml/Components/Dialogs.qml:211
6694msgctxt "Title: Reboot dialog"
6795msgid "Reboot"
6896msgstr "Ponovo pokreni"
6997
70−#: qml/Components/Dialogs.qml:179
98+#: qml/Components/Dialogs.qml:212
7199msgid "Are you sure you want to reboot?"
72100msgstr "Da li ste sigurni da želite ponovo pokrenuti?"
73101
74−#: qml/Components/Dialogs.qml:181
102+#: qml/Components/Dialogs.qml:215
75103msgid "No"
76104msgstr "Ne"
77105
78−#: qml/Components/Dialogs.qml:187
106+#: qml/Components/Dialogs.qml:223
79107msgid "Yes"
80108msgstr "Da"
81109
82−#: qml/Components/Dialogs.qml:202
110+#: qml/Components/Dialogs.qml:239
83111msgctxt "Title: Power off/Restart dialog"
84112msgid "Power"
85113msgstr "Napajanje"
86114
87−#: qml/Components/Dialogs.qml:203
115+#: qml/Components/Dialogs.qml:240
88116msgid ""
89117"Are you sure you would like\n"
90118"to power off?"
@@ -92,12 +120,12 @@ msgstr ""
92120"Da li ste sigurni da želite\n"
93121"isključiti?"
94122
95−#: qml/Components/Dialogs.qml:205
123+#: qml/Components/Dialogs.qml:244
96124msgctxt "Button: Power off the system"
97125msgid "Power off"
98126msgstr "Isključi"
99127
100−#: qml/Components/Dialogs.qml:214
128+#: qml/Components/Dialogs.qml:255
101129msgctxt "Button: Restart the system"
102130msgid "Restart"
103131msgstr "Restartuj"
@@ -123,7 +151,7 @@ msgid "Alt + PrtScr"
123151msgstr ""
124152
125153#: qml/Components/KeyboardShortcutsOverlay.qml:80
126−msgid "Takes a screenshot of a window."
154+msgid "Takes a screenshot of the current window."
127155msgstr ""
128156
129157#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -142,127 +170,143 @@ msgstr ""
142170msgid "Switches to previous keyboard layout."
143171msgstr ""
144172
145−#: qml/Components/KeyboardShortcutsOverlay.qml:118
173+#: qml/Components/KeyboardShortcutsOverlay.qml:114
174+msgid "Ctrl + Alt + T"
175+msgstr ""
176+
177+#: qml/Components/KeyboardShortcutsOverlay.qml:119
178+msgid "Starts the Terminal application."
179+msgstr ""
180+
181+#: qml/Components/KeyboardShortcutsOverlay.qml:131
146182msgid "Launcher"
147183msgstr ""
148184
149−#: qml/Components/KeyboardShortcutsOverlay.qml:125
185+#: qml/Components/KeyboardShortcutsOverlay.qml:138
150186msgid "Super (Hold)"
151187msgstr ""
152188
153−#: qml/Components/KeyboardShortcutsOverlay.qml:130
189+#: qml/Components/KeyboardShortcutsOverlay.qml:143
154190msgid "Opens the launcher, displays shortcuts."
155191msgstr ""
156192
157−#: qml/Components/KeyboardShortcutsOverlay.qml:138
193+#: qml/Components/KeyboardShortcutsOverlay.qml:151
158194msgid "Alt + F1"
159195msgstr ""
160196
161−#: qml/Components/KeyboardShortcutsOverlay.qml:143
197+#: qml/Components/KeyboardShortcutsOverlay.qml:156
162198msgid "Opens launcher keyboard navigation mode."
163199msgstr ""
164200
165−#: qml/Components/KeyboardShortcutsOverlay.qml:151
201+#: qml/Components/KeyboardShortcutsOverlay.qml:164
166202msgid "Super + Tab"
167203msgstr ""
168204
169−#: qml/Components/KeyboardShortcutsOverlay.qml:156
205+#: qml/Components/KeyboardShortcutsOverlay.qml:169
170206msgid "Switches applications via the launcher."
171207msgstr ""
172208
173−#: qml/Components/KeyboardShortcutsOverlay.qml:164
174−msgid "Super + 0 to 9"
209+#: qml/Components/KeyboardShortcutsOverlay.qml:177
210+msgid "Super + 1 to 0"
175211msgstr ""
176212
177−#: qml/Components/KeyboardShortcutsOverlay.qml:169
213+#: qml/Components/KeyboardShortcutsOverlay.qml:182
178214msgid "Same as clicking on a launcher icon."
179215msgstr ""
180216
181−#: qml/Components/KeyboardShortcutsOverlay.qml:181
217+#: qml/Components/KeyboardShortcutsOverlay.qml:190
218+msgid "Super + A"
219+msgstr ""
220+
221+#: qml/Components/KeyboardShortcutsOverlay.qml:195
222+msgid "Opens the Application Drawer."
223+msgstr ""
224+
225+#: qml/Components/KeyboardShortcutsOverlay.qml:207
182226msgid "Scopes"
183227msgstr ""
184228
185−#: qml/Components/KeyboardShortcutsOverlay.qml:188
229+#: qml/Components/KeyboardShortcutsOverlay.qml:214
186230msgid "Super (Tap)"
187231msgstr ""
188232
189−#: qml/Components/KeyboardShortcutsOverlay.qml:193
233+#: qml/Components/KeyboardShortcutsOverlay.qml:219
190234msgid "Opens the Scopes home."
191235msgstr ""
192236
193−#: qml/Components/KeyboardShortcutsOverlay.qml:209
237+#: qml/Components/KeyboardShortcutsOverlay.qml:235
194238msgid "Switching"
195239msgstr ""
196240
197−#: qml/Components/KeyboardShortcutsOverlay.qml:216
241+#: qml/Components/KeyboardShortcutsOverlay.qml:242
198242msgid "Alt + Tab"
199243msgstr ""
200244
201−#: qml/Components/KeyboardShortcutsOverlay.qml:221
245+#: qml/Components/KeyboardShortcutsOverlay.qml:247
202246msgid "Switches between applications."
203247msgstr ""
204248
205−#: qml/Components/KeyboardShortcutsOverlay.qml:229
249+#: qml/Components/KeyboardShortcutsOverlay.qml:255
206250msgid "Super + W"
207251msgstr ""
208252
209−#: qml/Components/KeyboardShortcutsOverlay.qml:234
253+#: qml/Components/KeyboardShortcutsOverlay.qml:260
210254msgid "Opens the desktop spread."
211255msgstr ""
212256
213−#: qml/Components/KeyboardShortcutsOverlay.qml:242
257+#: qml/Components/KeyboardShortcutsOverlay.qml:268
214258msgid "Cursor Left or Right"
215259msgstr ""
216260
217−#: qml/Components/KeyboardShortcutsOverlay.qml:247
261+#: qml/Components/KeyboardShortcutsOverlay.qml:273
218262msgid "Moves the focus."
219263msgstr ""
220264
221−#: qml/Components/KeyboardShortcutsOverlay.qml:259
265+#: qml/Components/KeyboardShortcutsOverlay.qml:285
222266msgid "Windows"
223267msgstr ""
224268
225−#: qml/Components/KeyboardShortcutsOverlay.qml:266
269+#: qml/Components/KeyboardShortcutsOverlay.qml:292
226270msgid "Ctrl + Super + D"
227271msgstr ""
228272
229−#: qml/Components/KeyboardShortcutsOverlay.qml:271
273+#: qml/Components/KeyboardShortcutsOverlay.qml:297
230274msgid "Minimizes all windows."
231275msgstr ""
232276
233−#: qml/Components/KeyboardShortcutsOverlay.qml:279
277+#: qml/Components/KeyboardShortcutsOverlay.qml:305
234278msgid "Ctrl + Super + Up"
235279msgstr ""
236280
237−#: qml/Components/KeyboardShortcutsOverlay.qml:284
281+#: qml/Components/KeyboardShortcutsOverlay.qml:310
238282msgid "Maximizes the current window."
239283msgstr ""
240284
241−#: qml/Components/KeyboardShortcutsOverlay.qml:292
285+#: qml/Components/KeyboardShortcutsOverlay.qml:318
242286msgid "Ctrl + Super + Down"
243287msgstr ""
244288
245−#: qml/Components/KeyboardShortcutsOverlay.qml:297
289+#: qml/Components/KeyboardShortcutsOverlay.qml:323
246290msgid "Minimizes or restores the current window."
247291msgstr ""
248292
249−#: qml/Components/KeyboardShortcutsOverlay.qml:305
293+#: qml/Components/KeyboardShortcutsOverlay.qml:331
250294msgid "Ctrl + Super + Left or Right"
251295msgstr ""
252296
253−#: qml/Components/KeyboardShortcutsOverlay.qml:310
297+#: qml/Components/KeyboardShortcutsOverlay.qml:336
254298msgid "Semi-maximizes the current window."
255299msgstr ""
256300
257−#: qml/Components/KeyboardShortcutsOverlay.qml:318
301+#: qml/Components/KeyboardShortcutsOverlay.qml:344
258302msgid "Alt + F4"
259303msgstr ""
260304
261−#: qml/Components/KeyboardShortcutsOverlay.qml:323
305+#: qml/Components/KeyboardShortcutsOverlay.qml:349
262306msgid "Closes the current window."
263307msgstr ""
264308
265−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
309+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
266310msgid "Return to Call"
267311msgstr "Povratak na Poziv"
268312
@@ -270,7 +314,7 @@ msgstr "Povratak na Poziv"
270314msgid "Emergency Call"
271315msgstr "Hitan Poziv"
272316
273−#: qml/Components/Lockscreen.qml:244
317+#: qml/Components/Lockscreen.qml:245
274318msgid "OK"
275319msgstr "U redu"
276320
@@ -284,31 +328,31 @@ msgstr ""
284328msgid "%1:%2"
285329msgstr ""
286330
287−#: qml/Components/ModeSwitchWarningDialog.qml:32
331+#: qml/Components/ModeSwitchWarningDialog.qml:33
288332msgid "Apps may have unsaved data:"
289333msgstr "Aplikacije možda imaju podataka koji nisu sačuvani:"
290334
291−#: qml/Components/ModeSwitchWarningDialog.qml:57
335+#: qml/Components/ModeSwitchWarningDialog.qml:60
292336msgctxt ""
293337"Re-dock means connect the device again to an external screen/mouse/keyboard"
294338msgid "Re-dock, save your work and close these apps to continue."
295339msgstr ""
296340
297−#: qml/Components/ModeSwitchWarningDialog.qml:63
341+#: qml/Components/ModeSwitchWarningDialog.qml:67
298342msgid "Or force close now (unsaved data will be lost)."
299343msgstr ""
300344"Ili zatvori aplikaciju na silu (podaci koji nisu sačuvani će biti "
301345"izgubljeni)."
302346
303−#: qml/Components/ModeSwitchWarningDialog.qml:75
347+#: qml/Components/ModeSwitchWarningDialog.qml:80
304348msgid "OK, I will reconnect"
305349msgstr "Uredu, ponovno ću se povezati"
306350
307−#: qml/Components/ModeSwitchWarningDialog.qml:76
351+#: qml/Components/ModeSwitchWarningDialog.qml:81
308352msgid "Reconnect now!"
309353msgstr "Ponovo poveži sada"
310354
311−#: qml/Components/ModeSwitchWarningDialog.qml:88
355+#: qml/Components/ModeSwitchWarningDialog.qml:94
312356msgid "Close all"
313357msgstr "Zatvori sve"
314358
@@ -316,6 +360,28 @@ msgstr "Zatvori sve"
316360msgid "Preview Share Item"
317361msgstr "Pogledaj stavku koja se dijeli"
318362
363+#: qml/Components/VirtualTouchPad.qml:317
364+msgid ""
365+"Your device is now connected to an external display. Use this screen as a "
366+"touch pad to interact with the pointer."
367+msgstr ""
368+
369+#: qml/Components/VirtualTouchPad.qml:327
370+msgid "Tap left button to click."
371+msgstr ""
372+
373+#: qml/Components/VirtualTouchPad.qml:339
374+msgid "Tap right button to right click."
375+msgstr ""
376+
377+#: qml/Components/VirtualTouchPad.qml:351
378+msgid "Swipe with two fingers to scroll."
379+msgstr ""
380+
381+#: qml/Components/VirtualTouchPad.qml:396
382+msgid "Find more settings in the system settings."
383+msgstr ""
384+
319385#: qml/Dash/DashPageHeader.qml:361
320386msgctxt "Button: Open the Ubuntu Store"
321387msgid "Store"
@@ -347,24 +413,24 @@ msgstr ""
347413msgid "Reset"
348414msgstr ""
349415
350−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
416+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
351417msgid "Show less"
352418msgstr ""
353419
354−#: qml/Dash/GenericScopeView.qml:545
420+#: qml/Dash/GenericScopeView.qml:547
355421msgid "Show all"
356422msgstr ""
357423
358−#: qml/Dash/GenericScopeView.qml:576
424+#: qml/Dash/GenericScopeView.qml:578
359425msgctxt "Label: Hint for dash search line edit"
360426msgid "Search"
361427msgstr "Pretraži"
362428
363−#: qml/Dash/PageHeaderExtraPanel.qml:57
429+#: qml/Dash/PageHeaderExtraPanel.qml:67
364430msgid "Recent Searches"
365431msgstr ""
366432
367−#: qml/Dash/PageHeaderExtraPanel.qml:68
433+#: qml/Dash/PageHeaderExtraPanel.qml:78
368434msgid "Clear All"
369435msgstr ""
370436
@@ -401,24 +467,18 @@ msgstr "Pustiti za osvježavanje..."
401467msgid "Enable location data"
402468msgstr "Omogućiti podatke o lokaciji"
403469
404−#: qml/Dash/ScopesList.qml:57
470+#: qml/Dash/ScopesList.qml:146
405471msgid "Manage"
406472msgstr "Upravljanje"
407473
408−#: qml/Dash/ScopesList.qml:104
474+#: qml/Dash/ScopesList.qml:187
409475msgid "Home"
410476msgstr "Početna"
411477
412−#: qml/Dash/ScopesList.qml:105
478+#: qml/Dash/ScopesList.qml:188
413479msgid "Also installed"
414480msgstr "Također instalirano"
415481
416−#: qml/DisabledScreenNotice.qml:109
417−msgid ""
418−"Your device is now connected to an external display. Use this screen as a "
419−"touch pad to interact with the pointer."
420−msgstr ""
421−
422482#: qml/Greeter/CoverPage.qml:127
423483msgid "Unlock"
424484msgstr "Otključaj"
@@ -443,32 +503,45 @@ msgstr[0] "Molim pričekajte %1 minutu i onda pokušajte ponovo..."
443503msgstr[1] "Molim pričekajte %1 minute i onda pokušajte ponovo..."
444504msgstr[2] "Molim pričekajte %1 minuta i onda pokušajte ponovo"
445505
446−#: qml/Greeter/Greeter.qml:596
506+#: qml/Greeter/Greeter.qml:550
447507msgid "Try again"
448508msgstr ""
449509
450−#: qml/Greeter/LoginList.qml:70
510+#: qml/Greeter/Greeter.qml:551
511+msgid "Enter passphrase to unlock"
512+msgstr ""
513+
514+#: qml/Greeter/Greeter.qml:552
515+msgid "Enter passcode to unlock"
516+msgstr ""
517+
518+#: qml/Greeter/NarrowView.qml:228
519+msgid "Emergency"
520+msgstr ""
521+
522+#: qml/Greeter/PromptList.qml:126
451523msgid "Passphrase"
452524msgstr ""
453525
454−#: qml/Greeter/LoginList.qml:71
526+#: qml/Greeter/PromptList.qml:126
455527msgid "Passcode"
456528msgstr ""
457529
458−#: qml/Greeter/LoginList.qml:98
459−msgid "Retry"
460−msgstr "Ponovi"
530+#: qml/Greeter/SessionsList.qml:124
531+msgid "Select desktop environment"
532+msgstr ""
461533
462−#: qml/Greeter/LoginList.qml:99
463−msgid "Log In"
534+#: qml/Launcher/Drawer.qml:94
535+msgid "Search…"
464536msgstr ""
465537
466−#: qml/Greeter/NarrowView.qml:252
467−msgid "Emergency"
538+#: qml/Launcher/Drawer.qml:129
539+msgctxt "Apps sorted alphabetically"
540+msgid "A-Z"
468541msgstr ""
469542
470−#: qml/Greeter/SessionsList.qml:122
471−msgid "Select desktop environment"
543+#: qml/Launcher/MoreAppsHeader.qml:55
544+msgid "More apps in the store"
472545msgstr ""
473546
474547#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -483,11 +556,11 @@ msgstr "Kucnite da uzvratite poziv..."
483556msgid "Conference"
484557msgstr "Savjetovanje"
485558
486−#: qml/Panel/Indicators/MenuItemFactory.qml:847
559+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
487560msgid "Nothing is playing"
488561msgstr "Ništa nije pokrenuto"
489562
490−#: qml/Panel/Indicators/MenuItemFactory.qml:975
563+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
491564#, qt-format
492565msgid "%1 hour"
493566msgid_plural "%1 hours"
@@ -495,7 +568,7 @@ msgstr[0] "%1 sat"
495568msgstr[1] "%1 sata"
496569msgstr[2] "%1 sati"
497570
498−#: qml/Panel/Indicators/MenuItemFactory.qml:979
571+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
499572#, qt-format
500573msgid "%1 minute"
501574msgid_plural "%1 minutes"
@@ -503,7 +576,7 @@ msgstr[0] "%1 minut"
503576msgstr[1] "%1 minuta"
504577msgstr[2] "%1 minuta"
505578
506−#: qml/Panel/Indicators/MenuItemFactory.qml:984
579+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
507580#, qt-format
508581msgid "%1 second"
509582msgid_plural "%1 seconds"
@@ -511,37 +584,37 @@ msgstr[0] "%1 sekunda"
511584msgstr[1] "%1 sekunde"
512585msgstr[2] "%1 sekundi"
513586
514−#: qml/Panel/Indicators/MenuItemFactory.qml:987
587+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
515588msgid "0 seconds"
516589msgstr "0 sekundi"
517590
518591#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
519−#: qml/Panel/Indicators/MenuItemFactory.qml:989
592+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
520593#, qt-format
521594msgid "%1 remaining"
522595msgstr "%1 preostalo"
523596
524−#: qml/Panel/Indicators/MenuItemFactory.qml:995
597+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
525598msgid "In queue…"
526599msgstr "U red..."
527600
528−#: qml/Panel/Indicators/MenuItemFactory.qml:999
601+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
529602msgid "Downloading"
530603msgstr "Preuzimanje"
531604
532−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
605+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
533606msgid "Paused, tap to resume"
534607msgstr "Pauzirano, kucnuti za nastavak"
535608
536−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
609+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
537610msgid "Canceled"
538611msgstr "Otkazano"
539612
540−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
613+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
541614msgid "Finished"
542615msgstr "Završeno"
543616
544−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
617+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
545618msgid "Failed, tap to retry"
546619msgstr "Neuspjelo, kucnuti za ponavljanje"
547620
@@ -561,12 +634,16 @@ msgctxt "Button: Call back on phone"
561634msgid "Call back"
562635msgstr "Uzvrati poziv"
563636
637+#: qml/Panel/PanelMenuPage.qml:92
638+msgid "Back"
639+msgstr ""
640+
564641#: qml/Stage/SideStage.qml:76
565642msgid "Drag using 3 fingers any application from one window to the other"
566643msgstr ""
567644
568645#: qml/Tutorial/TutorialLeftLong.qml:49
569−msgid "Long swipe from the left edge to open the Today scope"
646+msgid "Long swipe from the left edge to open the Application Drawer"
570647msgstr ""
571648
572649#: qml/Tutorial/TutorialLeft.qml:47
@@ -595,7 +672,7 @@ msgid "Language"
595672msgstr ""
596673
597674#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
598−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
675+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
599676#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
600677#: qml/Wizard/Pages/70-passwd-type.qml:145
601678#: qml/Wizard/Pages/75-report-check.qml:84
@@ -616,25 +693,24 @@ msgstr ""
616693msgid "Keyboard layout"
617694msgstr ""
618695
619−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
620−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
621−#: qml/Wizard/Pages/sim.qml:101
696+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
697+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
622698msgid "Skip"
623699msgstr "Preskočite"
624700
625−#: qml/Wizard/Pages/30-wifi.qml:31
701+#: qml/Wizard/Pages/30-wifi.qml:30
626702msgid "Connect to Wi‑Fi"
627703msgstr "Povezati na Wi-Fi"
628704
629−#: qml/Wizard/Pages/30-wifi.qml:132
705+#: qml/Wizard/Pages/30-wifi.qml:131
630706msgid "Connected"
631707msgstr ""
632708
633−#: qml/Wizard/Pages/30-wifi.qml:165
709+#: qml/Wizard/Pages/30-wifi.qml:164
634710msgid "Available Wi-Fi networks"
635711msgstr ""
636712
637−#: qml/Wizard/Pages/30-wifi.qml:166
713+#: qml/Wizard/Pages/30-wifi.qml:165
638714msgid "No available Wi-Fi networks"
639715msgstr ""
640716
@@ -721,35 +797,6 @@ msgstr ""
721797msgid "Privacy policy"
722798msgstr ""
723799
724−#: qml/Wizard/Pages/77-system-update.qml:28
725−msgid "Update Device"
726−msgstr ""
727−
728−#: qml/Wizard/Pages/77-system-update.qml:55
729−msgid ""
730−"There is a system update available and ready to install. Afterwards, the "
731−"device will automatically restart."
732−msgstr ""
733−
734−#: qml/Wizard/Pages/77-system-update.qml:76
735−msgctxt "string identifying name of the update"
736−msgid "Ubuntu system"
737−msgstr ""
738−
739−#: qml/Wizard/Pages/77-system-update.qml:83
740−#, qt-format
741−msgctxt "version of the system update"
742−msgid "Version %1"
743−msgstr ""
744−
745−#: qml/Wizard/Pages/77-system-update.qml:102
746−msgid "This could take a few minutes..."
747−msgstr ""
748−
749−#: qml/Wizard/Pages/77-system-update.qml:116
750−msgid "Install and restart now"
751−msgstr ""
752−
753800#: qml/Wizard/Pages/80-finished.qml:89
754801msgid "Welcome to Ubuntu"
755802msgstr ""
po/ca.po+227−147
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
1111"PO-Revision-Date: 2016-11-11 06:30+0000\n"
1212"Last-Translator: Walter Garcia-Fontes <walter.garcia@upf.edu>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
@@ -15,75 +15,103 @@ 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-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr "Contrasenya: "
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr "Nom d'usuari"
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr "Ha fallat l'autenticació"
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr "La contrasenya no és vàlida, torneu-ho a provar"
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr "Inici de sessió"
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr "Torna-ho a provar"
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr "Inicia la sessió"
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr "Sessió de convidat"
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr "Enganxa la drecera"
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr "Surt"
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr "Desenganxa la drecera"
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr "Surt"
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr "Segur que voleu sortir?"
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr "Bloca"
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr "Surt"
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr "Cancel·la"
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr "Reinicia"
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr "Segur que voleu reiniciar?"
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr "No"
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr "Sí"
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr "Energia"
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
@@ -91,12 +119,12 @@ msgstr ""
91119"Segur que voleu\n"
92120"apagar?"
93121
94−#: qml/Components/Dialogs.qml:205
122+#: qml/Components/Dialogs.qml:244
95123msgctxt "Button: Power off the system"
96124msgid "Power off"
97125msgstr "Apaga"
98126
99−#: qml/Components/Dialogs.qml:214
127+#: qml/Components/Dialogs.qml:255
100128msgctxt "Button: Restart the system"
101129msgid "Restart"
102130msgstr "Reinicia"
@@ -122,8 +150,8 @@ msgid "Alt + PrtScr"
122150msgstr "Alt + ImprPant"
123151
124152#: qml/Components/KeyboardShortcutsOverlay.qml:80
125−msgid "Takes a screenshot of a window."
126−msgstr "Crea una captura de pantalla d'una finestra"
153+msgid "Takes a screenshot of the current window."
154+msgstr "Feu una captura de pantalla de la finestra actual."
127155
128156#: qml/Components/KeyboardShortcutsOverlay.qml:88
129157msgid "Super + Space"
@@ -141,127 +169,143 @@ msgstr "Super + Maj + Espai"
141169msgid "Switches to previous keyboard layout."
142170msgstr "Canvia a la disposició prèvia de teclat."
143171
144−#: qml/Components/KeyboardShortcutsOverlay.qml:118
172+#: qml/Components/KeyboardShortcutsOverlay.qml:114
173+msgid "Ctrl + Alt + T"
174+msgstr "Ctrl + Alt + T"
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:119
177+msgid "Starts the Terminal application."
178+msgstr "Inicia l'aplicació Terminal"
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:131
145181msgid "Launcher"
146182msgstr "Llançador"
147183
148−#: qml/Components/KeyboardShortcutsOverlay.qml:125
184+#: qml/Components/KeyboardShortcutsOverlay.qml:138
149185msgid "Super (Hold)"
150186msgstr "Super (Mantingut)"
151187
152−#: qml/Components/KeyboardShortcutsOverlay.qml:130
188+#: qml/Components/KeyboardShortcutsOverlay.qml:143
153189msgid "Opens the launcher, displays shortcuts."
154190msgstr "Obre el llançador, mostre les dreceres."
155191
156−#: qml/Components/KeyboardShortcutsOverlay.qml:138
192+#: qml/Components/KeyboardShortcutsOverlay.qml:151
157193msgid "Alt + F1"
158194msgstr "Alt + F1"
159195
160−#: qml/Components/KeyboardShortcutsOverlay.qml:143
196+#: qml/Components/KeyboardShortcutsOverlay.qml:156
161197msgid "Opens launcher keyboard navigation mode."
162198msgstr "Obre el mode de navegació de teclat del llançador."
163199
164−#: qml/Components/KeyboardShortcutsOverlay.qml:151
200+#: qml/Components/KeyboardShortcutsOverlay.qml:164
165201msgid "Super + Tab"
166202msgstr "Super + Tab"
167203
168−#: qml/Components/KeyboardShortcutsOverlay.qml:156
204+#: qml/Components/KeyboardShortcutsOverlay.qml:169
169205msgid "Switches applications via the launcher."
170206msgstr "Commuta les aplicacions mitjançant el llançador."
171207
172−#: qml/Components/KeyboardShortcutsOverlay.qml:164
173−msgid "Super + 0 to 9"
174−msgstr "Super + 0 a 9"
208+#: qml/Components/KeyboardShortcutsOverlay.qml:177
209+msgid "Super + 1 to 0"
210+msgstr "Súper +1 a 0"
175211
176−#: qml/Components/KeyboardShortcutsOverlay.qml:169
212+#: qml/Components/KeyboardShortcutsOverlay.qml:182
177213msgid "Same as clicking on a launcher icon."
178214msgstr "El mateix que clicar sobre una icona del llançador."
179215
180−#: qml/Components/KeyboardShortcutsOverlay.qml:181
216+#: qml/Components/KeyboardShortcutsOverlay.qml:190
217+msgid "Super + A"
218+msgstr "Súper + A"
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:195
221+msgid "Opens the Application Drawer."
222+msgstr "Obre el calaix d'aplicacions."
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
181225msgid "Scopes"
182226msgstr "Lents"
183227
184−#: qml/Components/KeyboardShortcutsOverlay.qml:188
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
185229msgid "Super (Tap)"
186230msgstr "Super (Toc)"
187231
188−#: qml/Components/KeyboardShortcutsOverlay.qml:193
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
189233msgid "Opens the Scopes home."
190234msgstr "Obre la pàgina d'inici dels lents."
191235
192−#: qml/Components/KeyboardShortcutsOverlay.qml:209
236+#: qml/Components/KeyboardShortcutsOverlay.qml:235
193237msgid "Switching"
194238msgstr "Commutació"
195239
196−#: qml/Components/KeyboardShortcutsOverlay.qml:216
240+#: qml/Components/KeyboardShortcutsOverlay.qml:242
197241msgid "Alt + Tab"
198242msgstr "Alt + Tab"
199243
200−#: qml/Components/KeyboardShortcutsOverlay.qml:221
244+#: qml/Components/KeyboardShortcutsOverlay.qml:247
201245msgid "Switches between applications."
202246msgstr "Commuta entre aplicacions."
203247
204−#: qml/Components/KeyboardShortcutsOverlay.qml:229
248+#: qml/Components/KeyboardShortcutsOverlay.qml:255
205249msgid "Super + W"
206250msgstr "Super + W"
207251
208−#: qml/Components/KeyboardShortcutsOverlay.qml:234
252+#: qml/Components/KeyboardShortcutsOverlay.qml:260
209253msgid "Opens the desktop spread."
210254msgstr "Obre la distribució de l'escriptori."
211255
212−#: qml/Components/KeyboardShortcutsOverlay.qml:242
256+#: qml/Components/KeyboardShortcutsOverlay.qml:268
213257msgid "Cursor Left or Right"
214258msgstr "Cursor dreta o esquerra"
215259
216−#: qml/Components/KeyboardShortcutsOverlay.qml:247
260+#: qml/Components/KeyboardShortcutsOverlay.qml:273
217261msgid "Moves the focus."
218262msgstr "Mou el focus"
219263
220−#: qml/Components/KeyboardShortcutsOverlay.qml:259
264+#: qml/Components/KeyboardShortcutsOverlay.qml:285
221265msgid "Windows"
222266msgstr "Finestres"
223267
224−#: qml/Components/KeyboardShortcutsOverlay.qml:266
268+#: qml/Components/KeyboardShortcutsOverlay.qml:292
225269msgid "Ctrl + Super + D"
226270msgstr "Ctrl + Super + D"
227271
228−#: qml/Components/KeyboardShortcutsOverlay.qml:271
272+#: qml/Components/KeyboardShortcutsOverlay.qml:297
229273msgid "Minimizes all windows."
230274msgstr "Minimitza totes les finestres."
231275
232−#: qml/Components/KeyboardShortcutsOverlay.qml:279
276+#: qml/Components/KeyboardShortcutsOverlay.qml:305
233277msgid "Ctrl + Super + Up"
234278msgstr "Ctrl + Super + Amunt"
235279
236−#: qml/Components/KeyboardShortcutsOverlay.qml:284
280+#: qml/Components/KeyboardShortcutsOverlay.qml:310
237281msgid "Maximizes the current window."
238282msgstr "Maximitza la finestra actual."
239283
240−#: qml/Components/KeyboardShortcutsOverlay.qml:292
284+#: qml/Components/KeyboardShortcutsOverlay.qml:318
241285msgid "Ctrl + Super + Down"
242286msgstr "Ctrl + Super + Avall"
243287
244−#: qml/Components/KeyboardShortcutsOverlay.qml:297
288+#: qml/Components/KeyboardShortcutsOverlay.qml:323
245289msgid "Minimizes or restores the current window."
246290msgstr "Minimitza o restaura la finestra actual."
247291
248−#: qml/Components/KeyboardShortcutsOverlay.qml:305
292+#: qml/Components/KeyboardShortcutsOverlay.qml:331
249293msgid "Ctrl + Super + Left or Right"
250294msgstr "Ctrl + Super + Esquerra o Dreta"
251295
252−#: qml/Components/KeyboardShortcutsOverlay.qml:310
296+#: qml/Components/KeyboardShortcutsOverlay.qml:336
253297msgid "Semi-maximizes the current window."
254298msgstr "Semi-maximitza la finestra actual."
255299
256−#: qml/Components/KeyboardShortcutsOverlay.qml:318
300+#: qml/Components/KeyboardShortcutsOverlay.qml:344
257301msgid "Alt + F4"
258302msgstr "Alt + F4"
259303
260−#: qml/Components/KeyboardShortcutsOverlay.qml:323
304+#: qml/Components/KeyboardShortcutsOverlay.qml:349
261305msgid "Closes the current window."
262306msgstr "Tanca la finestra actual."
263307
264−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
265309msgid "Return to Call"
266310msgstr "Torna a la trucada"
267311
@@ -269,7 +313,7 @@ msgstr "Torna a la trucada"
269313msgid "Emergency Call"
270314msgstr "Trucada d'emergència"
271315
272−#: qml/Components/Lockscreen.qml:244
316+#: qml/Components/Lockscreen.qml:245
273317msgid "OK"
274318msgstr "D'acord"
275319
@@ -283,11 +327,11 @@ msgstr "%1:%2:%3"
283327msgid "%1:%2"
284328msgstr "%1:%2"
285329
286−#: qml/Components/ModeSwitchWarningDialog.qml:32
330+#: qml/Components/ModeSwitchWarningDialog.qml:33
287331msgid "Apps may have unsaved data:"
288332msgstr "Pot ser que aquestes aplicacions no hagin desat les dades:"
289333
290−#: qml/Components/ModeSwitchWarningDialog.qml:57
334+#: qml/Components/ModeSwitchWarningDialog.qml:60
291335msgctxt ""
292336"Re-dock means connect the device again to an external screen/mouse/keyboard"
293337msgid "Re-dock, save your work and close these apps to continue."
@@ -295,19 +339,19 @@ msgstr ""
295339"Torneu a acoblar, deseu la vostra feina i tanqueu aquestes aplicacions abans "
296340"de continuar."
297341
298−#: qml/Components/ModeSwitchWarningDialog.qml:63
342+#: qml/Components/ModeSwitchWarningDialog.qml:67
299343msgid "Or force close now (unsaved data will be lost)."
300344msgstr "O força el tancament (les dades no desades es perdran)."
301345
302−#: qml/Components/ModeSwitchWarningDialog.qml:75
346+#: qml/Components/ModeSwitchWarningDialog.qml:80
303347msgid "OK, I will reconnect"
304348msgstr "D'acord, tornaré a connectar"
305349
306−#: qml/Components/ModeSwitchWarningDialog.qml:76
350+#: qml/Components/ModeSwitchWarningDialog.qml:81
307351msgid "Reconnect now!"
308352msgstr "Torna a connectar"
309353
310−#: qml/Components/ModeSwitchWarningDialog.qml:88
354+#: qml/Components/ModeSwitchWarningDialog.qml:94
311355msgid "Close all"
312356msgstr "Tanca-ho tot"
313357
@@ -315,6 +359,30 @@ msgstr "Tanca-ho tot"
315359msgid "Preview Share Item"
316360msgstr "Previsualitzeu l'element a compartir"
317361
362+#: qml/Components/VirtualTouchPad.qml:317
363+msgid ""
364+"Your device is now connected to an external display. Use this screen as a "
365+"touch pad to interact with the pointer."
366+msgstr ""
367+"El vostre dispositiu està ara connectat a un monitor extern. Useu aquesta "
368+"pantalla com a ratolí tàctil per interaccionar amb el cursor."
369+
370+#: qml/Components/VirtualTouchPad.qml:327
371+msgid "Tap left button to click."
372+msgstr "Feu un toc al botó esquerre per clicar."
373+
374+#: qml/Components/VirtualTouchPad.qml:339
375+msgid "Tap right button to right click."
376+msgstr "Feu un toc al botó dret per clicar amb el botó dret."
377+
378+#: qml/Components/VirtualTouchPad.qml:351
379+msgid "Swipe with two fingers to scroll."
380+msgstr "Llisqueu amb dos dites per fer un desplaçament."
381+
382+#: qml/Components/VirtualTouchPad.qml:396
383+msgid "Find more settings in the system settings."
384+msgstr "Trobeu més configuracions als paràmetres del sistema."
385+
318386#: qml/Dash/DashPageHeader.qml:361
319387msgctxt "Button: Open the Ubuntu Store"
320388msgid "Store"
@@ -346,24 +414,24 @@ msgstr "Refineu els resultats"
346414msgid "Reset"
347415msgstr "Restableix"
348416
349−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
417+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
350418msgid "Show less"
351419msgstr "Mostra menys"
352420
353−#: qml/Dash/GenericScopeView.qml:545
421+#: qml/Dash/GenericScopeView.qml:547
354422msgid "Show all"
355423msgstr "Mostra-ho tot"
356424
357−#: qml/Dash/GenericScopeView.qml:576
425+#: qml/Dash/GenericScopeView.qml:578
358426msgctxt "Label: Hint for dash search line edit"
359427msgid "Search"
360428msgstr "Cerca"
361429
362−#: qml/Dash/PageHeaderExtraPanel.qml:57
430+#: qml/Dash/PageHeaderExtraPanel.qml:67
363431msgid "Recent Searches"
364432msgstr "Cerques recents"
365433
366−#: qml/Dash/PageHeaderExtraPanel.qml:68
434+#: qml/Dash/PageHeaderExtraPanel.qml:78
367435msgid "Clear All"
368436msgstr "Neteja-ho tot"
369437
@@ -400,26 +468,18 @@ msgstr "Deixeu anar per actualitzar..."
400468msgid "Enable location data"
401469msgstr "Habilita les dades d'ubicació"
402470
403−#: qml/Dash/ScopesList.qml:57
471+#: qml/Dash/ScopesList.qml:146
404472msgid "Manage"
405473msgstr "Gestiona"
406474
407−#: qml/Dash/ScopesList.qml:104
475+#: qml/Dash/ScopesList.qml:187
408476msgid "Home"
409477msgstr "Inici"
410478
411−#: qml/Dash/ScopesList.qml:105
479+#: qml/Dash/ScopesList.qml:188
412480msgid "Also installed"
413481msgstr "També instal·lat"
414482
415−#: qml/DisabledScreenNotice.qml:109
416−msgid ""
417−"Your device is now connected to an external display. Use this screen as a "
418−"touch pad to interact with the pointer."
419−msgstr ""
420−"El vostre dispositiu està ara connectat a un monitor extern. Useu aquesta "
421−"pantalla com a ratolí tàctil per interaccionar amb el cursor."
422−
423483#: qml/Greeter/CoverPage.qml:127
424484msgid "Unlock"
425485msgstr "Desbloca"
@@ -447,33 +507,46 @@ msgid_plural "Please wait %1 minutes and then try again…"
447507msgstr[0] "Espereu %1 minut i torneu-ho a intentar..."
448508msgstr[1] "Espereu %1 minuts i torneu-ho a intentar..."
449509
450−#: qml/Greeter/Greeter.qml:596
510+#: qml/Greeter/Greeter.qml:550
451511msgid "Try again"
452512msgstr "Torna-ho a provar"
453513
454−#: qml/Greeter/LoginList.qml:70
514+#: qml/Greeter/Greeter.qml:551
515+msgid "Enter passphrase to unlock"
516+msgstr "Introduïu la contrasenya per desbloquejar"
517+
518+#: qml/Greeter/Greeter.qml:552
519+msgid "Enter passcode to unlock"
520+msgstr "Entreu el codi per desbloquejar"
521+
522+#: qml/Greeter/NarrowView.qml:228
523+msgid "Emergency"
524+msgstr "Emergència"
525+
526+#: qml/Greeter/PromptList.qml:126
455527msgid "Passphrase"
456528msgstr "Contrasenya"
457529
458−#: qml/Greeter/LoginList.qml:71
530+#: qml/Greeter/PromptList.qml:126
459531msgid "Passcode"
460532msgstr "Codi d'accés"
461533
462−#: qml/Greeter/LoginList.qml:98
463−msgid "Retry"
464−msgstr "Torna-ho a provar"
534+#: qml/Greeter/SessionsList.qml:124
535+msgid "Select desktop environment"
536+msgstr "Seleccioneu l'entorn d'escriptori"
465537
466−#: qml/Greeter/LoginList.qml:99
467−msgid "Log In"
468−msgstr "Inici de sessió"
538+#: qml/Launcher/Drawer.qml:94
539+msgid "Search…"
540+msgstr "Cerca…"
469541
470−#: qml/Greeter/NarrowView.qml:252
471−msgid "Emergency"
472−msgstr "Emergència"
542+#: qml/Launcher/Drawer.qml:129
543+msgctxt "Apps sorted alphabetically"
544+msgid "A-Z"
545+msgstr "A-Z"
473546
474−#: qml/Greeter/SessionsList.qml:122
475−msgid "Select desktop environment"
476−msgstr "Seleccioneu l'entorn d'escriptori"
547+#: qml/Launcher/MoreAppsHeader.qml:55
548+msgid "More apps in the store"
549+msgstr "Més aplicacions a la botiga"
477550
478551#: qml/Notifications/NotificationMenuItemFactory.qml:124
479552msgid "Show password"
@@ -487,62 +560,62 @@ msgstr "Feu un toc per tornar a la trucada..."
487560msgid "Conference"
488561msgstr "Conferència"
489562
490−#: qml/Panel/Indicators/MenuItemFactory.qml:847
563+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
491564msgid "Nothing is playing"
492565msgstr "No s'està reproduint res"
493566
494−#: qml/Panel/Indicators/MenuItemFactory.qml:975
567+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
495568#, qt-format
496569msgid "%1 hour"
497570msgid_plural "%1 hours"
498571msgstr[0] "%1 hora"
499572msgstr[1] "%1 hores"
500573
501−#: qml/Panel/Indicators/MenuItemFactory.qml:979
574+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
502575#, qt-format
503576msgid "%1 minute"
504577msgid_plural "%1 minutes"
505578msgstr[0] "%1 minut"
506579msgstr[1] "%1 minuts"
507580
508−#: qml/Panel/Indicators/MenuItemFactory.qml:984
581+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
509582#, qt-format
510583msgid "%1 second"
511584msgid_plural "%1 seconds"
512585msgstr[0] "%1 segon"
513586msgstr[1] "%1 segons"
514587
515−#: qml/Panel/Indicators/MenuItemFactory.qml:987
588+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
516589msgid "0 seconds"
517590msgstr "0 segons"
518591
519592#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
520−#: qml/Panel/Indicators/MenuItemFactory.qml:989
593+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
521594#, qt-format
522595msgid "%1 remaining"
523596msgstr "Resta %1"
524597
525−#: qml/Panel/Indicators/MenuItemFactory.qml:995
598+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
526599msgid "In queue…"
527600msgstr "A la cua..."
528601
529−#: qml/Panel/Indicators/MenuItemFactory.qml:999
602+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
530603msgid "Downloading"
531604msgstr "S'està baixant"
532605
533−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
606+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
534607msgid "Paused, tap to resume"
535608msgstr "En pausa, feu un toc per continuar"
536609
537−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
610+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
538611msgid "Canceled"
539612msgstr "S'ha cancel·lat"
540613
541−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
614+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
542615msgid "Finished"
543616msgstr "S'ha finalitzat"
544617
545−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
618+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
546619msgid "Failed, tap to retry"
547620msgstr "Ha fallat, feu un toc per tornar-ho a intentar"
548621
@@ -562,15 +635,19 @@ msgctxt "Button: Call back on phone"
562635msgid "Call back"
563636msgstr "Retorna la trucada"
564637
638+#: qml/Panel/PanelMenuPage.qml:92
639+msgid "Back"
640+msgstr "Enrere"
641+
565642#: qml/Stage/SideStage.qml:76
566643msgid "Drag using 3 fingers any application from one window to the other"
567644msgstr ""
568645"Arrossegueu usant 3 dits qualsevol aplicació d'una finestra a una altra"
569646
570647#: qml/Tutorial/TutorialLeftLong.qml:49
571−msgid "Long swipe from the left edge to open the Today scope"
648+msgid "Long swipe from the left edge to open the Application Drawer"
572649msgstr ""
573−"Feu una lliscada llarga des de la vora esquerra per obrir l'àmbit Avui"
650+"Llisqueu llarg des de la vora esquerra per obrir al Calaix d'aplicacions"
574651
575652#: qml/Tutorial/TutorialLeft.qml:47
576653msgid "Short swipe from the left edge to open the launcher"
@@ -604,7 +681,7 @@ msgid "Language"
604681msgstr "Llengua"
605682
606683#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
607−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
684+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
608685#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
609686#: qml/Wizard/Pages/70-passwd-type.qml:145
610687#: qml/Wizard/Pages/75-report-check.qml:84
@@ -625,25 +702,24 @@ msgstr "Llengua del teclat"
625702msgid "Keyboard layout"
626703msgstr "Disposició del teclat"
627704
628−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
629−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
630−#: qml/Wizard/Pages/sim.qml:101
705+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
706+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
631707msgid "Skip"
632708msgstr "Omet"
633709
634−#: qml/Wizard/Pages/30-wifi.qml:31
710+#: qml/Wizard/Pages/30-wifi.qml:30
635711msgid "Connect to Wi‑Fi"
636712msgstr "Connecta't a la Wi-Fi"
637713
638−#: qml/Wizard/Pages/30-wifi.qml:132
714+#: qml/Wizard/Pages/30-wifi.qml:131
639715msgid "Connected"
640716msgstr "Connectat"
641717
642−#: qml/Wizard/Pages/30-wifi.qml:165
718+#: qml/Wizard/Pages/30-wifi.qml:164
643719msgid "Available Wi-Fi networks"
644720msgstr "Xarxes Wi-Fi disponibles"
645721
646−#: qml/Wizard/Pages/30-wifi.qml:166
722+#: qml/Wizard/Pages/30-wifi.qml:165
647723msgid "No available Wi-Fi networks"
648724msgstr "No hi ha xarxes Wi-Fi disponibles"
649725
@@ -733,37 +809,6 @@ msgstr ""
733809msgid "Privacy policy"
734810msgstr "Política de privacitat"
735811
736−#: qml/Wizard/Pages/77-system-update.qml:28
737−msgid "Update Device"
738−msgstr "Actualitza el dispositiu"
739−
740−#: qml/Wizard/Pages/77-system-update.qml:55
741−msgid ""
742−"There is a system update available and ready to install. Afterwards, the "
743−"device will automatically restart."
744−msgstr ""
745−"Hi ha una actualització del sistema disponible i llesta per instal·lar. "
746−"Després, el dispositiu es reiniciarà automàticament."
747−
748−#: qml/Wizard/Pages/77-system-update.qml:76
749−msgctxt "string identifying name of the update"
750−msgid "Ubuntu system"
751−msgstr "Sistema de l'Ubuntu"
752−
753−#: qml/Wizard/Pages/77-system-update.qml:83
754−#, qt-format
755−msgctxt "version of the system update"
756−msgid "Version %1"
757−msgstr "Versió %1"
758−
759−#: qml/Wizard/Pages/77-system-update.qml:102
760−msgid "This could take a few minutes..."
761−msgstr "Això pot trigar uns pocs minuts..."
762−
763−#: qml/Wizard/Pages/77-system-update.qml:116
764−msgid "Install and restart now"
765−msgstr "Instal·la i reinicia ara"
766−
767812#: qml/Wizard/Pages/80-finished.qml:89
768813msgid "Welcome to Ubuntu"
769814msgstr "Us donem la benvinguda a l'Ubuntu"
@@ -1333,5 +1378,40 @@ msgstr "La contrasenya és molt dèbil"
13331378#~ msgid "Swipe up to manage the app"
13341379#~ msgstr "Llisqueu cap amunt per gestionar l'aplicació"
13351380
1381+#~ msgid "Long swipe from the left edge to open the Today scope"
1382+#~ msgstr ""
1383+#~ "Feu una lliscada llarga des de la vora esquerra per obrir l'àmbit Avui"
1384+
13361385#~ msgid "Swipe up to add a contact"
13371386#~ msgstr "Llisqueu per afegir un contacte"
1387+
1388+#~ msgid "Takes a screenshot of a window."
1389+#~ msgstr "Crea una captura de pantalla d'una finestra"
1390+
1391+#~ msgid "Super + 0 to 9"
1392+#~ msgstr "Super + 0 a 9"
1393+
1394+#~ msgctxt "string identifying name of the update"
1395+#~ msgid "Ubuntu system"
1396+#~ msgstr "Sistema de l'Ubuntu"
1397+
1398+#~ msgid "Update Device"
1399+#~ msgstr "Actualitza el dispositiu"
1400+
1401+#~ msgid "Install and restart now"
1402+#~ msgstr "Instal·la i reinicia ara"
1403+
1404+#~ msgid "This could take a few minutes..."
1405+#~ msgstr "Això pot trigar uns pocs minuts..."
1406+
1407+#, qt-format
1408+#~ msgctxt "version of the system update"
1409+#~ msgid "Version %1"
1410+#~ msgstr "Versió %1"
1411+
1412+#~ msgid ""
1413+#~ "There is a system update available and ready to install. Afterwards, the "
1414+#~ "device will automatically restart."
1415+#~ msgstr ""
1416+#~ "Hi ha una actualització del sistema disponible i llesta per instal·lar. "
1417+#~ "Després, el dispositiu es reiniciarà automàticament."
po/ca@valencia.po+183−136
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
1111"PO-Revision-Date: 2015-02-22 15:22+0000\n"
1212"Last-Translator: David Planella <david.planella@gmail.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
@@ -15,75 +15,103 @@ 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-11-23 06:36+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:31+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr "Contrasenya: "
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr ""
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr ""
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr ""
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr ""
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr ""
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr ""
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr ""
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr "Apega la drecera"
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr ""
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr "Desenganxa la drecera"
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr ""
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr "Segur que voleu eixir?"
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr ""
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr ""
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr "Cancel·la"
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr ""
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr "Segur que voleu reiniciar?"
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr "No"
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr "Sí"
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr ""
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
@@ -91,12 +119,12 @@ msgstr ""
91119"Segur que voleu\n"
92120"apagar?"
93121
94−#: qml/Components/Dialogs.qml:205
122+#: qml/Components/Dialogs.qml:244
95123msgctxt "Button: Power off the system"
96124msgid "Power off"
97125msgstr ""
98126
99−#: qml/Components/Dialogs.qml:214
127+#: qml/Components/Dialogs.qml:255
100128msgctxt "Button: Restart the system"
101129msgid "Restart"
102130msgstr ""
@@ -122,7 +150,7 @@ msgid "Alt + PrtScr"
122150msgstr ""
123151
124152#: qml/Components/KeyboardShortcutsOverlay.qml:80
125−msgid "Takes a screenshot of a window."
153+msgid "Takes a screenshot of the current window."
126154msgstr ""
127155
128156#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -141,127 +169,143 @@ msgstr ""
141169msgid "Switches to previous keyboard layout."
142170msgstr ""
143171
144−#: qml/Components/KeyboardShortcutsOverlay.qml:118
172+#: qml/Components/KeyboardShortcutsOverlay.qml:114
173+msgid "Ctrl + Alt + T"
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:119
177+msgid "Starts the Terminal application."
178+msgstr ""
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:131
145181msgid "Launcher"
146182msgstr ""
147183
148−#: qml/Components/KeyboardShortcutsOverlay.qml:125
184+#: qml/Components/KeyboardShortcutsOverlay.qml:138
149185msgid "Super (Hold)"
150186msgstr ""
151187
152−#: qml/Components/KeyboardShortcutsOverlay.qml:130
188+#: qml/Components/KeyboardShortcutsOverlay.qml:143
153189msgid "Opens the launcher, displays shortcuts."
154190msgstr ""
155191
156−#: qml/Components/KeyboardShortcutsOverlay.qml:138
192+#: qml/Components/KeyboardShortcutsOverlay.qml:151
157193msgid "Alt + F1"
158194msgstr ""
159195
160−#: qml/Components/KeyboardShortcutsOverlay.qml:143
196+#: qml/Components/KeyboardShortcutsOverlay.qml:156
161197msgid "Opens launcher keyboard navigation mode."
162198msgstr ""
163199
164−#: qml/Components/KeyboardShortcutsOverlay.qml:151
200+#: qml/Components/KeyboardShortcutsOverlay.qml:164
165201msgid "Super + Tab"
166202msgstr ""
167203
168−#: qml/Components/KeyboardShortcutsOverlay.qml:156
204+#: qml/Components/KeyboardShortcutsOverlay.qml:169
169205msgid "Switches applications via the launcher."
170206msgstr ""
171207
172−#: qml/Components/KeyboardShortcutsOverlay.qml:164
173−msgid "Super + 0 to 9"
208+#: qml/Components/KeyboardShortcutsOverlay.qml:177
209+msgid "Super + 1 to 0"
174210msgstr ""
175211
176−#: qml/Components/KeyboardShortcutsOverlay.qml:169
212+#: qml/Components/KeyboardShortcutsOverlay.qml:182
177213msgid "Same as clicking on a launcher icon."
178214msgstr ""
179215
180−#: qml/Components/KeyboardShortcutsOverlay.qml:181
216+#: qml/Components/KeyboardShortcutsOverlay.qml:190
217+msgid "Super + A"
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:195
221+msgid "Opens the Application Drawer."
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
181225msgid "Scopes"
182226msgstr ""
183227
184−#: qml/Components/KeyboardShortcutsOverlay.qml:188
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
185229msgid "Super (Tap)"
186230msgstr ""
187231
188−#: qml/Components/KeyboardShortcutsOverlay.qml:193
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
189233msgid "Opens the Scopes home."
190234msgstr ""
191235
192−#: qml/Components/KeyboardShortcutsOverlay.qml:209
236+#: qml/Components/KeyboardShortcutsOverlay.qml:235
193237msgid "Switching"
194238msgstr ""
195239
196−#: qml/Components/KeyboardShortcutsOverlay.qml:216
240+#: qml/Components/KeyboardShortcutsOverlay.qml:242
197241msgid "Alt + Tab"
198242msgstr ""
199243
200−#: qml/Components/KeyboardShortcutsOverlay.qml:221
244+#: qml/Components/KeyboardShortcutsOverlay.qml:247
201245msgid "Switches between applications."
202246msgstr ""
203247
204−#: qml/Components/KeyboardShortcutsOverlay.qml:229
248+#: qml/Components/KeyboardShortcutsOverlay.qml:255
205249msgid "Super + W"
206250msgstr ""
207251
208−#: qml/Components/KeyboardShortcutsOverlay.qml:234
252+#: qml/Components/KeyboardShortcutsOverlay.qml:260
209253msgid "Opens the desktop spread."
210254msgstr ""
211255
212−#: qml/Components/KeyboardShortcutsOverlay.qml:242
256+#: qml/Components/KeyboardShortcutsOverlay.qml:268
213257msgid "Cursor Left or Right"
214258msgstr ""
215259
216−#: qml/Components/KeyboardShortcutsOverlay.qml:247
260+#: qml/Components/KeyboardShortcutsOverlay.qml:273
217261msgid "Moves the focus."
218262msgstr ""
219263
220−#: qml/Components/KeyboardShortcutsOverlay.qml:259
264+#: qml/Components/KeyboardShortcutsOverlay.qml:285
221265msgid "Windows"
222266msgstr ""
223267
224−#: qml/Components/KeyboardShortcutsOverlay.qml:266
268+#: qml/Components/KeyboardShortcutsOverlay.qml:292
225269msgid "Ctrl + Super + D"
226270msgstr ""
227271
228−#: qml/Components/KeyboardShortcutsOverlay.qml:271
272+#: qml/Components/KeyboardShortcutsOverlay.qml:297
229273msgid "Minimizes all windows."
230274msgstr ""
231275
232−#: qml/Components/KeyboardShortcutsOverlay.qml:279
276+#: qml/Components/KeyboardShortcutsOverlay.qml:305
233277msgid "Ctrl + Super + Up"
234278msgstr ""
235279
236−#: qml/Components/KeyboardShortcutsOverlay.qml:284
280+#: qml/Components/KeyboardShortcutsOverlay.qml:310
237281msgid "Maximizes the current window."
238282msgstr ""
239283
240−#: qml/Components/KeyboardShortcutsOverlay.qml:292
284+#: qml/Components/KeyboardShortcutsOverlay.qml:318
241285msgid "Ctrl + Super + Down"
242286msgstr ""
243287
244−#: qml/Components/KeyboardShortcutsOverlay.qml:297
288+#: qml/Components/KeyboardShortcutsOverlay.qml:323
245289msgid "Minimizes or restores the current window."
246290msgstr ""
247291
248−#: qml/Components/KeyboardShortcutsOverlay.qml:305
292+#: qml/Components/KeyboardShortcutsOverlay.qml:331
249293msgid "Ctrl + Super + Left or Right"
250294msgstr ""
251295
252−#: qml/Components/KeyboardShortcutsOverlay.qml:310
296+#: qml/Components/KeyboardShortcutsOverlay.qml:336
253297msgid "Semi-maximizes the current window."
254298msgstr ""
255299
256−#: qml/Components/KeyboardShortcutsOverlay.qml:318
300+#: qml/Components/KeyboardShortcutsOverlay.qml:344
257301msgid "Alt + F4"
258302msgstr ""
259303
260−#: qml/Components/KeyboardShortcutsOverlay.qml:323
304+#: qml/Components/KeyboardShortcutsOverlay.qml:349
261305msgid "Closes the current window."
262306msgstr ""
263307
264−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
265309msgid "Return to Call"
266310msgstr "Torna a la cridada"
267311
@@ -269,7 +313,7 @@ msgstr "Torna a la cridada"
269313msgid "Emergency Call"
270314msgstr "Cridada d'emergència"
271315
272−#: qml/Components/Lockscreen.qml:244
316+#: qml/Components/Lockscreen.qml:245
273317msgid "OK"
274318msgstr "D'acord"
275319
@@ -283,29 +327,29 @@ msgstr ""
283327msgid "%1:%2"
284328msgstr ""
285329
286−#: qml/Components/ModeSwitchWarningDialog.qml:32
330+#: qml/Components/ModeSwitchWarningDialog.qml:33
287331msgid "Apps may have unsaved data:"
288332msgstr ""
289333
290−#: qml/Components/ModeSwitchWarningDialog.qml:57
334+#: qml/Components/ModeSwitchWarningDialog.qml:60
291335msgctxt ""
292336"Re-dock means connect the device again to an external screen/mouse/keyboard"
293337msgid "Re-dock, save your work and close these apps to continue."
294338msgstr ""
295339
296−#: qml/Components/ModeSwitchWarningDialog.qml:63
340+#: qml/Components/ModeSwitchWarningDialog.qml:67
297341msgid "Or force close now (unsaved data will be lost)."
298342msgstr ""
299343
300−#: qml/Components/ModeSwitchWarningDialog.qml:75
344+#: qml/Components/ModeSwitchWarningDialog.qml:80
301345msgid "OK, I will reconnect"
302346msgstr ""
303347
304−#: qml/Components/ModeSwitchWarningDialog.qml:76
348+#: qml/Components/ModeSwitchWarningDialog.qml:81
305349msgid "Reconnect now!"
306350msgstr ""
307351
308−#: qml/Components/ModeSwitchWarningDialog.qml:88
352+#: qml/Components/ModeSwitchWarningDialog.qml:94
309353msgid "Close all"
310354msgstr ""
311355
@@ -313,6 +357,28 @@ msgstr ""
313357msgid "Preview Share Item"
314358msgstr ""
315359
360+#: qml/Components/VirtualTouchPad.qml:317
361+msgid ""
362+"Your device is now connected to an external display. Use this screen as a "
363+"touch pad to interact with the pointer."
364+msgstr ""
365+
366+#: qml/Components/VirtualTouchPad.qml:327
367+msgid "Tap left button to click."
368+msgstr ""
369+
370+#: qml/Components/VirtualTouchPad.qml:339
371+msgid "Tap right button to right click."
372+msgstr ""
373+
374+#: qml/Components/VirtualTouchPad.qml:351
375+msgid "Swipe with two fingers to scroll."
376+msgstr ""
377+
378+#: qml/Components/VirtualTouchPad.qml:396
379+msgid "Find more settings in the system settings."
380+msgstr ""
381+
316382#: qml/Dash/DashPageHeader.qml:361
317383msgctxt "Button: Open the Ubuntu Store"
318384msgid "Store"
@@ -344,24 +410,24 @@ msgstr ""
344410msgid "Reset"
345411msgstr ""
346412
347−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
413+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
348414msgid "Show less"
349415msgstr ""
350416
351−#: qml/Dash/GenericScopeView.qml:545
417+#: qml/Dash/GenericScopeView.qml:547
352418msgid "Show all"
353419msgstr ""
354420
355−#: qml/Dash/GenericScopeView.qml:576
421+#: qml/Dash/GenericScopeView.qml:578
356422msgctxt "Label: Hint for dash search line edit"
357423msgid "Search"
358424msgstr ""
359425
360−#: qml/Dash/PageHeaderExtraPanel.qml:57
426+#: qml/Dash/PageHeaderExtraPanel.qml:67
361427msgid "Recent Searches"
362428msgstr ""
363429
364−#: qml/Dash/PageHeaderExtraPanel.qml:68
430+#: qml/Dash/PageHeaderExtraPanel.qml:78
365431msgid "Clear All"
366432msgstr ""
367433
@@ -398,24 +464,18 @@ msgstr "Deixeu anar per actualitzar..."
398464msgid "Enable location data"
399465msgstr "Habilita les dades d'ubicació"
400466
401−#: qml/Dash/ScopesList.qml:57
467+#: qml/Dash/ScopesList.qml:146
402468msgid "Manage"
403469msgstr "Gestiona"
404470
405−#: qml/Dash/ScopesList.qml:104
471+#: qml/Dash/ScopesList.qml:187
406472msgid "Home"
407473msgstr "Inici"
408474
409−#: qml/Dash/ScopesList.qml:105
475+#: qml/Dash/ScopesList.qml:188
410476msgid "Also installed"
411477msgstr "També instal·lat"
412478
413−#: qml/DisabledScreenNotice.qml:109
414−msgid ""
415−"Your device is now connected to an external display. Use this screen as a "
416−"touch pad to interact with the pointer."
417−msgstr ""
418−
419479#: qml/Greeter/CoverPage.qml:127
420480msgid "Unlock"
421481msgstr "Desbloca"
@@ -443,32 +503,45 @@ msgid_plural "Please wait %1 minutes and then try again…"
443503msgstr[0] "Espereu %1 minut i torneu-ho a intentar..."
444504msgstr[1] "Espereu %1 minuts i torneu-ho a intentar..."
445505
446−#: qml/Greeter/Greeter.qml:596
506+#: qml/Greeter/Greeter.qml:550
447507msgid "Try again"
448508msgstr ""
449509
450−#: qml/Greeter/LoginList.qml:70
510+#: qml/Greeter/Greeter.qml:551
511+msgid "Enter passphrase to unlock"
512+msgstr ""
513+
514+#: qml/Greeter/Greeter.qml:552
515+msgid "Enter passcode to unlock"
516+msgstr ""
517+
518+#: qml/Greeter/NarrowView.qml:228
519+msgid "Emergency"
520+msgstr ""
521+
522+#: qml/Greeter/PromptList.qml:126
451523msgid "Passphrase"
452524msgstr ""
453525
454−#: qml/Greeter/LoginList.qml:71
526+#: qml/Greeter/PromptList.qml:126
455527msgid "Passcode"
456528msgstr ""
457529
458−#: qml/Greeter/LoginList.qml:98
459−msgid "Retry"
530+#: qml/Greeter/SessionsList.qml:124
531+msgid "Select desktop environment"
460532msgstr ""
461533
462−#: qml/Greeter/LoginList.qml:99
463−msgid "Log In"
534+#: qml/Launcher/Drawer.qml:94
535+msgid "Search…"
464536msgstr ""
465537
466−#: qml/Greeter/NarrowView.qml:252
467−msgid "Emergency"
538+#: qml/Launcher/Drawer.qml:129
539+msgctxt "Apps sorted alphabetically"
540+msgid "A-Z"
468541msgstr ""
469542
470−#: qml/Greeter/SessionsList.qml:122
471−msgid "Select desktop environment"
543+#: qml/Launcher/MoreAppsHeader.qml:55
544+msgid "More apps in the store"
472545msgstr ""
473546
474547#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -483,62 +556,62 @@ msgstr "Feu un toc per tornar a la cridada..."
483556msgid "Conference"
484557msgstr "Conferència"
485558
486−#: qml/Panel/Indicators/MenuItemFactory.qml:847
559+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
487560msgid "Nothing is playing"
488561msgstr "No s'està reproduint res"
489562
490−#: qml/Panel/Indicators/MenuItemFactory.qml:975
563+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
491564#, qt-format
492565msgid "%1 hour"
493566msgid_plural "%1 hours"
494567msgstr[0] ""
495568msgstr[1] ""
496569
497−#: qml/Panel/Indicators/MenuItemFactory.qml:979
570+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
498571#, qt-format
499572msgid "%1 minute"
500573msgid_plural "%1 minutes"
501574msgstr[0] ""
502575msgstr[1] ""
503576
504−#: qml/Panel/Indicators/MenuItemFactory.qml:984
577+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
505578#, qt-format
506579msgid "%1 second"
507580msgid_plural "%1 seconds"
508581msgstr[0] ""
509582msgstr[1] ""
510583
511−#: qml/Panel/Indicators/MenuItemFactory.qml:987
584+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
512585msgid "0 seconds"
513586msgstr ""
514587
515588#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
516−#: qml/Panel/Indicators/MenuItemFactory.qml:989
589+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
517590#, qt-format
518591msgid "%1 remaining"
519592msgstr ""
520593
521−#: qml/Panel/Indicators/MenuItemFactory.qml:995
594+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
522595msgid "In queue…"
523596msgstr "A la cua..."
524597
525−#: qml/Panel/Indicators/MenuItemFactory.qml:999
598+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
526599msgid "Downloading"
527600msgstr "S'està baixant"
528601
529−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
602+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
530603msgid "Paused, tap to resume"
531604msgstr "En pausa, feu un toc per continuar"
532605
533−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
606+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
534607msgid "Canceled"
535608msgstr "S'ha cancel·lat"
536609
537−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
610+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
538611msgid "Finished"
539612msgstr "S'ha finalitzat"
540613
541−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
614+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
542615msgid "Failed, tap to retry"
543616msgstr "Ha fallat, feu un toc per tornar-ho a intentar"
544617
@@ -558,12 +631,16 @@ msgctxt "Button: Call back on phone"
558631msgid "Call back"
559632msgstr ""
560633
634+#: qml/Panel/PanelMenuPage.qml:92
635+msgid "Back"
636+msgstr ""
637+
561638#: qml/Stage/SideStage.qml:76
562639msgid "Drag using 3 fingers any application from one window to the other"
563640msgstr ""
564641
565642#: qml/Tutorial/TutorialLeftLong.qml:49
566−msgid "Long swipe from the left edge to open the Today scope"
643+msgid "Long swipe from the left edge to open the Application Drawer"
567644msgstr ""
568645
569646#: qml/Tutorial/TutorialLeft.qml:47
@@ -592,7 +669,7 @@ msgid "Language"
592669msgstr ""
593670
594671#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
595−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
672+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
596673#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
597674#: qml/Wizard/Pages/70-passwd-type.qml:145
598675#: qml/Wizard/Pages/75-report-check.qml:84
@@ -613,25 +690,24 @@ msgstr ""
613690msgid "Keyboard layout"
614691msgstr ""
615692
616−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
617−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
618−#: qml/Wizard/Pages/sim.qml:101
693+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
694+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
619695msgid "Skip"
620696msgstr "Omet"
621697
622−#: qml/Wizard/Pages/30-wifi.qml:31
698+#: qml/Wizard/Pages/30-wifi.qml:30
623699msgid "Connect to Wi‑Fi"
624700msgstr "Connecta't a la Wi-Fi"
625701
626−#: qml/Wizard/Pages/30-wifi.qml:132
702+#: qml/Wizard/Pages/30-wifi.qml:131
627703msgid "Connected"
628704msgstr ""
629705
630−#: qml/Wizard/Pages/30-wifi.qml:165
706+#: qml/Wizard/Pages/30-wifi.qml:164
631707msgid "Available Wi-Fi networks"
632708msgstr ""
633709
634−#: qml/Wizard/Pages/30-wifi.qml:166
710+#: qml/Wizard/Pages/30-wifi.qml:165
635711msgid "No available Wi-Fi networks"
636712msgstr ""
637713
@@ -718,35 +794,6 @@ msgstr ""
718794msgid "Privacy policy"
719795msgstr ""
720796
721−#: qml/Wizard/Pages/77-system-update.qml:28
722−msgid "Update Device"
723−msgstr ""
724−
725−#: qml/Wizard/Pages/77-system-update.qml:55
726−msgid ""
727−"There is a system update available and ready to install. Afterwards, the "
728−"device will automatically restart."
729−msgstr ""
730−
731−#: qml/Wizard/Pages/77-system-update.qml:76
732−msgctxt "string identifying name of the update"
733−msgid "Ubuntu system"
734−msgstr ""
735−
736−#: qml/Wizard/Pages/77-system-update.qml:83
737−#, qt-format
738−msgctxt "version of the system update"
739−msgid "Version %1"
740−msgstr ""
741−
742−#: qml/Wizard/Pages/77-system-update.qml:102
743−msgid "This could take a few minutes..."
744−msgstr ""
745−
746−#: qml/Wizard/Pages/77-system-update.qml:116
747−msgid "Install and restart now"
748−msgstr ""
749−
750797#: qml/Wizard/Pages/80-finished.qml:89
751798msgid "Welcome to Ubuntu"
752799msgstr ""
po/ce.po+183−136
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
1111"PO-Revision-Date: 2015-02-15 04:01+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Chechen <ce@li.org>\n"
@@ -15,86 +15,114 @@ 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-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr ""
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr ""
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr ""
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr ""
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr ""
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr ""
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr ""
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr ""
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr ""
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr ""
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr ""
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr ""
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr ""
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr ""
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr ""
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr ""
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr ""
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr ""
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr ""
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr ""
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr ""
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
90118msgstr ""
91119
92−#: qml/Components/Dialogs.qml:205
120+#: qml/Components/Dialogs.qml:244
93121msgctxt "Button: Power off the system"
94122msgid "Power off"
95123msgstr ""
96124
97−#: qml/Components/Dialogs.qml:214
125+#: qml/Components/Dialogs.qml:255
98126msgctxt "Button: Restart the system"
99127msgid "Restart"
100128msgstr ""
@@ -120,7 +148,7 @@ msgid "Alt + PrtScr"
120148msgstr ""
121149
122150#: qml/Components/KeyboardShortcutsOverlay.qml:80
123−msgid "Takes a screenshot of a window."
151+msgid "Takes a screenshot of the current window."
124152msgstr ""
125153
126154#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -139,127 +167,143 @@ msgstr ""
139167msgid "Switches to previous keyboard layout."
140168msgstr ""
141169
142−#: qml/Components/KeyboardShortcutsOverlay.qml:118
170+#: qml/Components/KeyboardShortcutsOverlay.qml:114
171+msgid "Ctrl + Alt + T"
172+msgstr ""
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:119
175+msgid "Starts the Terminal application."
176+msgstr ""
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:131
143179msgid "Launcher"
144180msgstr ""
145181
146−#: qml/Components/KeyboardShortcutsOverlay.qml:125
182+#: qml/Components/KeyboardShortcutsOverlay.qml:138
147183msgid "Super (Hold)"
148184msgstr ""
149185
150−#: qml/Components/KeyboardShortcutsOverlay.qml:130
186+#: qml/Components/KeyboardShortcutsOverlay.qml:143
151187msgid "Opens the launcher, displays shortcuts."
152188msgstr ""
153189
154−#: qml/Components/KeyboardShortcutsOverlay.qml:138
190+#: qml/Components/KeyboardShortcutsOverlay.qml:151
155191msgid "Alt + F1"
156192msgstr ""
157193
158−#: qml/Components/KeyboardShortcutsOverlay.qml:143
194+#: qml/Components/KeyboardShortcutsOverlay.qml:156
159195msgid "Opens launcher keyboard navigation mode."
160196msgstr ""
161197
162−#: qml/Components/KeyboardShortcutsOverlay.qml:151
198+#: qml/Components/KeyboardShortcutsOverlay.qml:164
163199msgid "Super + Tab"
164200msgstr ""
165201
166−#: qml/Components/KeyboardShortcutsOverlay.qml:156
202+#: qml/Components/KeyboardShortcutsOverlay.qml:169
167203msgid "Switches applications via the launcher."
168204msgstr ""
169205
170−#: qml/Components/KeyboardShortcutsOverlay.qml:164
171−msgid "Super + 0 to 9"
206+#: qml/Components/KeyboardShortcutsOverlay.qml:177
207+msgid "Super + 1 to 0"
172208msgstr ""
173209
174−#: qml/Components/KeyboardShortcutsOverlay.qml:169
210+#: qml/Components/KeyboardShortcutsOverlay.qml:182
175211msgid "Same as clicking on a launcher icon."
176212msgstr ""
177213
178−#: qml/Components/KeyboardShortcutsOverlay.qml:181
214+#: qml/Components/KeyboardShortcutsOverlay.qml:190
215+msgid "Super + A"
216+msgstr ""
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:195
219+msgid "Opens the Application Drawer."
220+msgstr ""
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:207
179223msgid "Scopes"
180224msgstr ""
181225
182−#: qml/Components/KeyboardShortcutsOverlay.qml:188
226+#: qml/Components/KeyboardShortcutsOverlay.qml:214
183227msgid "Super (Tap)"
184228msgstr ""
185229
186−#: qml/Components/KeyboardShortcutsOverlay.qml:193
230+#: qml/Components/KeyboardShortcutsOverlay.qml:219
187231msgid "Opens the Scopes home."
188232msgstr ""
189233
190−#: qml/Components/KeyboardShortcutsOverlay.qml:209
234+#: qml/Components/KeyboardShortcutsOverlay.qml:235
191235msgid "Switching"
192236msgstr ""
193237
194−#: qml/Components/KeyboardShortcutsOverlay.qml:216
238+#: qml/Components/KeyboardShortcutsOverlay.qml:242
195239msgid "Alt + Tab"
196240msgstr ""
197241
198−#: qml/Components/KeyboardShortcutsOverlay.qml:221
242+#: qml/Components/KeyboardShortcutsOverlay.qml:247
199243msgid "Switches between applications."
200244msgstr ""
201245
202−#: qml/Components/KeyboardShortcutsOverlay.qml:229
246+#: qml/Components/KeyboardShortcutsOverlay.qml:255
203247msgid "Super + W"
204248msgstr ""
205249
206−#: qml/Components/KeyboardShortcutsOverlay.qml:234
250+#: qml/Components/KeyboardShortcutsOverlay.qml:260
207251msgid "Opens the desktop spread."
208252msgstr ""
209253
210−#: qml/Components/KeyboardShortcutsOverlay.qml:242
254+#: qml/Components/KeyboardShortcutsOverlay.qml:268
211255msgid "Cursor Left or Right"
212256msgstr ""
213257
214−#: qml/Components/KeyboardShortcutsOverlay.qml:247
258+#: qml/Components/KeyboardShortcutsOverlay.qml:273
215259msgid "Moves the focus."
216260msgstr ""
217261
218−#: qml/Components/KeyboardShortcutsOverlay.qml:259
262+#: qml/Components/KeyboardShortcutsOverlay.qml:285
219263msgid "Windows"
220264msgstr ""
221265
222−#: qml/Components/KeyboardShortcutsOverlay.qml:266
266+#: qml/Components/KeyboardShortcutsOverlay.qml:292
223267msgid "Ctrl + Super + D"
224268msgstr ""
225269
226−#: qml/Components/KeyboardShortcutsOverlay.qml:271
270+#: qml/Components/KeyboardShortcutsOverlay.qml:297
227271msgid "Minimizes all windows."
228272msgstr ""
229273
230−#: qml/Components/KeyboardShortcutsOverlay.qml:279
274+#: qml/Components/KeyboardShortcutsOverlay.qml:305
231275msgid "Ctrl + Super + Up"
232276msgstr ""
233277
234−#: qml/Components/KeyboardShortcutsOverlay.qml:284
278+#: qml/Components/KeyboardShortcutsOverlay.qml:310
235279msgid "Maximizes the current window."
236280msgstr ""
237281
238−#: qml/Components/KeyboardShortcutsOverlay.qml:292
282+#: qml/Components/KeyboardShortcutsOverlay.qml:318
239283msgid "Ctrl + Super + Down"
240284msgstr ""
241285
242−#: qml/Components/KeyboardShortcutsOverlay.qml:297
286+#: qml/Components/KeyboardShortcutsOverlay.qml:323
243287msgid "Minimizes or restores the current window."
244288msgstr ""
245289
246−#: qml/Components/KeyboardShortcutsOverlay.qml:305
290+#: qml/Components/KeyboardShortcutsOverlay.qml:331
247291msgid "Ctrl + Super + Left or Right"
248292msgstr ""
249293
250−#: qml/Components/KeyboardShortcutsOverlay.qml:310
294+#: qml/Components/KeyboardShortcutsOverlay.qml:336
251295msgid "Semi-maximizes the current window."
252296msgstr ""
253297
254−#: qml/Components/KeyboardShortcutsOverlay.qml:318
298+#: qml/Components/KeyboardShortcutsOverlay.qml:344
255299msgid "Alt + F4"
256300msgstr ""
257301
258−#: qml/Components/KeyboardShortcutsOverlay.qml:323
302+#: qml/Components/KeyboardShortcutsOverlay.qml:349
259303msgid "Closes the current window."
260304msgstr ""
261305
262−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
306+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
263307msgid "Return to Call"
264308msgstr ""
265309
@@ -267,7 +311,7 @@ msgstr ""
267311msgid "Emergency Call"
268312msgstr ""
269313
270−#: qml/Components/Lockscreen.qml:244
314+#: qml/Components/Lockscreen.qml:245
271315msgid "OK"
272316msgstr ""
273317
@@ -281,29 +325,29 @@ msgstr ""
281325msgid "%1:%2"
282326msgstr ""
283327
284−#: qml/Components/ModeSwitchWarningDialog.qml:32
328+#: qml/Components/ModeSwitchWarningDialog.qml:33
285329msgid "Apps may have unsaved data:"
286330msgstr ""
287331
288−#: qml/Components/ModeSwitchWarningDialog.qml:57
332+#: qml/Components/ModeSwitchWarningDialog.qml:60
289333msgctxt ""
290334"Re-dock means connect the device again to an external screen/mouse/keyboard"
291335msgid "Re-dock, save your work and close these apps to continue."
292336msgstr ""
293337
294−#: qml/Components/ModeSwitchWarningDialog.qml:63
338+#: qml/Components/ModeSwitchWarningDialog.qml:67
295339msgid "Or force close now (unsaved data will be lost)."
296340msgstr ""
297341
298−#: qml/Components/ModeSwitchWarningDialog.qml:75
342+#: qml/Components/ModeSwitchWarningDialog.qml:80
299343msgid "OK, I will reconnect"
300344msgstr ""
301345
302−#: qml/Components/ModeSwitchWarningDialog.qml:76
346+#: qml/Components/ModeSwitchWarningDialog.qml:81
303347msgid "Reconnect now!"
304348msgstr ""
305349
306−#: qml/Components/ModeSwitchWarningDialog.qml:88
350+#: qml/Components/ModeSwitchWarningDialog.qml:94
307351msgid "Close all"
308352msgstr ""
309353
@@ -311,6 +355,28 @@ msgstr ""
311355msgid "Preview Share Item"
312356msgstr ""
313357
358+#: qml/Components/VirtualTouchPad.qml:317
359+msgid ""
360+"Your device is now connected to an external display. Use this screen as a "
361+"touch pad to interact with the pointer."
362+msgstr ""
363+
364+#: qml/Components/VirtualTouchPad.qml:327
365+msgid "Tap left button to click."
366+msgstr ""
367+
368+#: qml/Components/VirtualTouchPad.qml:339
369+msgid "Tap right button to right click."
370+msgstr ""
371+
372+#: qml/Components/VirtualTouchPad.qml:351
373+msgid "Swipe with two fingers to scroll."
374+msgstr ""
375+
376+#: qml/Components/VirtualTouchPad.qml:396
377+msgid "Find more settings in the system settings."
378+msgstr ""
379+
314380#: qml/Dash/DashPageHeader.qml:361
315381msgctxt "Button: Open the Ubuntu Store"
316382msgid "Store"
@@ -342,24 +408,24 @@ msgstr ""
342408msgid "Reset"
343409msgstr ""
344410
345−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
411+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
346412msgid "Show less"
347413msgstr ""
348414
349−#: qml/Dash/GenericScopeView.qml:545
415+#: qml/Dash/GenericScopeView.qml:547
350416msgid "Show all"
351417msgstr ""
352418
353−#: qml/Dash/GenericScopeView.qml:576
419+#: qml/Dash/GenericScopeView.qml:578
354420msgctxt "Label: Hint for dash search line edit"
355421msgid "Search"
356422msgstr ""
357423
358−#: qml/Dash/PageHeaderExtraPanel.qml:57
424+#: qml/Dash/PageHeaderExtraPanel.qml:67
359425msgid "Recent Searches"
360426msgstr ""
361427
362−#: qml/Dash/PageHeaderExtraPanel.qml:68
428+#: qml/Dash/PageHeaderExtraPanel.qml:78
363429msgid "Clear All"
364430msgstr ""
365431
@@ -396,24 +462,18 @@ msgstr ""
396462msgid "Enable location data"
397463msgstr ""
398464
399−#: qml/Dash/ScopesList.qml:57
465+#: qml/Dash/ScopesList.qml:146
400466msgid "Manage"
401467msgstr ""
402468
403−#: qml/Dash/ScopesList.qml:104
469+#: qml/Dash/ScopesList.qml:187
404470msgid "Home"
405471msgstr ""
406472
407−#: qml/Dash/ScopesList.qml:105
473+#: qml/Dash/ScopesList.qml:188
408474msgid "Also installed"
409475msgstr ""
410476
411−#: qml/DisabledScreenNotice.qml:109
412−msgid ""
413−"Your device is now connected to an external display. Use this screen as a "
414−"touch pad to interact with the pointer."
415−msgstr ""
416−
417477#: qml/Greeter/CoverPage.qml:127
418478msgid "Unlock"
419479msgstr ""
@@ -437,32 +497,45 @@ msgid_plural "Please wait %1 minutes and then try again…"
437497msgstr[0] ""
438498msgstr[1] ""
439499
440−#: qml/Greeter/Greeter.qml:596
500+#: qml/Greeter/Greeter.qml:550
441501msgid "Try again"
442502msgstr ""
443503
444−#: qml/Greeter/LoginList.qml:70
504+#: qml/Greeter/Greeter.qml:551
505+msgid "Enter passphrase to unlock"
506+msgstr ""
507+
508+#: qml/Greeter/Greeter.qml:552
509+msgid "Enter passcode to unlock"
510+msgstr ""
511+
512+#: qml/Greeter/NarrowView.qml:228
513+msgid "Emergency"
514+msgstr ""
515+
516+#: qml/Greeter/PromptList.qml:126
445517msgid "Passphrase"
446518msgstr ""
447519
448−#: qml/Greeter/LoginList.qml:71
520+#: qml/Greeter/PromptList.qml:126
449521msgid "Passcode"
450522msgstr ""
451523
452−#: qml/Greeter/LoginList.qml:98
453−msgid "Retry"
524+#: qml/Greeter/SessionsList.qml:124
525+msgid "Select desktop environment"
454526msgstr ""
455527
456−#: qml/Greeter/LoginList.qml:99
457−msgid "Log In"
528+#: qml/Launcher/Drawer.qml:94
529+msgid "Search…"
458530msgstr ""
459531
460−#: qml/Greeter/NarrowView.qml:252
461−msgid "Emergency"
532+#: qml/Launcher/Drawer.qml:129
533+msgctxt "Apps sorted alphabetically"
534+msgid "A-Z"
462535msgstr ""
463536
464−#: qml/Greeter/SessionsList.qml:122
465−msgid "Select desktop environment"
537+#: qml/Launcher/MoreAppsHeader.qml:55
538+msgid "More apps in the store"
466539msgstr ""
467540
468541#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -477,62 +550,62 @@ msgstr ""
477550msgid "Conference"
478551msgstr ""
479552
480−#: qml/Panel/Indicators/MenuItemFactory.qml:847
553+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
481554msgid "Nothing is playing"
482555msgstr ""
483556
484−#: qml/Panel/Indicators/MenuItemFactory.qml:975
557+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
485558#, qt-format
486559msgid "%1 hour"
487560msgid_plural "%1 hours"
488561msgstr[0] ""
489562msgstr[1] ""
490563
491−#: qml/Panel/Indicators/MenuItemFactory.qml:979
564+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
492565#, qt-format
493566msgid "%1 minute"
494567msgid_plural "%1 minutes"
495568msgstr[0] ""
496569msgstr[1] ""
497570
498−#: qml/Panel/Indicators/MenuItemFactory.qml:984
571+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
499572#, qt-format
500573msgid "%1 second"
501574msgid_plural "%1 seconds"
502575msgstr[0] ""
503576msgstr[1] ""
504577
505−#: qml/Panel/Indicators/MenuItemFactory.qml:987
578+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
506579msgid "0 seconds"
507580msgstr ""
508581
509582#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
510−#: qml/Panel/Indicators/MenuItemFactory.qml:989
583+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
511584#, qt-format
512585msgid "%1 remaining"
513586msgstr ""
514587
515−#: qml/Panel/Indicators/MenuItemFactory.qml:995
588+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
516589msgid "In queue…"
517590msgstr ""
518591
519−#: qml/Panel/Indicators/MenuItemFactory.qml:999
592+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
520593msgid "Downloading"
521594msgstr ""
522595
523−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
596+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
524597msgid "Paused, tap to resume"
525598msgstr ""
526599
527−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
600+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
528601msgid "Canceled"
529602msgstr ""
530603
531−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
604+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
532605msgid "Finished"
533606msgstr ""
534607
535−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
608+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
536609msgid "Failed, tap to retry"
537610msgstr ""
538611
@@ -552,12 +625,16 @@ msgctxt "Button: Call back on phone"
552625msgid "Call back"
553626msgstr ""
554627
628+#: qml/Panel/PanelMenuPage.qml:92
629+msgid "Back"
630+msgstr ""
631+
555632#: qml/Stage/SideStage.qml:76
556633msgid "Drag using 3 fingers any application from one window to the other"
557634msgstr ""
558635
559636#: qml/Tutorial/TutorialLeftLong.qml:49
560−msgid "Long swipe from the left edge to open the Today scope"
637+msgid "Long swipe from the left edge to open the Application Drawer"
561638msgstr ""
562639
563640#: qml/Tutorial/TutorialLeft.qml:47
@@ -586,7 +663,7 @@ msgid "Language"
586663msgstr ""
587664
588665#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
589−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
666+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
590667#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
591668#: qml/Wizard/Pages/70-passwd-type.qml:145
592669#: qml/Wizard/Pages/75-report-check.qml:84
@@ -607,25 +684,24 @@ msgstr ""
607684msgid "Keyboard layout"
608685msgstr ""
609686
610−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
611−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
612−#: qml/Wizard/Pages/sim.qml:101
687+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
688+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
613689msgid "Skip"
614690msgstr ""
615691
616−#: qml/Wizard/Pages/30-wifi.qml:31
692+#: qml/Wizard/Pages/30-wifi.qml:30
617693msgid "Connect to Wi‑Fi"
618694msgstr ""
619695
620−#: qml/Wizard/Pages/30-wifi.qml:132
696+#: qml/Wizard/Pages/30-wifi.qml:131
621697msgid "Connected"
622698msgstr ""
623699
624−#: qml/Wizard/Pages/30-wifi.qml:165
700+#: qml/Wizard/Pages/30-wifi.qml:164
625701msgid "Available Wi-Fi networks"
626702msgstr ""
627703
628−#: qml/Wizard/Pages/30-wifi.qml:166
704+#: qml/Wizard/Pages/30-wifi.qml:165
629705msgid "No available Wi-Fi networks"
630706msgstr ""
631707
@@ -712,35 +788,6 @@ msgstr ""
712788msgid "Privacy policy"
713789msgstr ""
714790
715−#: qml/Wizard/Pages/77-system-update.qml:28
716−msgid "Update Device"
717−msgstr ""
718−
719−#: qml/Wizard/Pages/77-system-update.qml:55
720−msgid ""
721−"There is a system update available and ready to install. Afterwards, the "
722−"device will automatically restart."
723−msgstr ""
724−
725−#: qml/Wizard/Pages/77-system-update.qml:76
726−msgctxt "string identifying name of the update"
727−msgid "Ubuntu system"
728−msgstr ""
729−
730−#: qml/Wizard/Pages/77-system-update.qml:83
731−#, qt-format
732−msgctxt "version of the system update"
733−msgid "Version %1"
734−msgstr ""
735−
736−#: qml/Wizard/Pages/77-system-update.qml:102
737−msgid "This could take a few minutes..."
738−msgstr ""
739−
740−#: qml/Wizard/Pages/77-system-update.qml:116
741−msgid "Install and restart now"
742−msgstr ""
743−
744791#: qml/Wizard/Pages/80-finished.qml:89
745792msgid "Welcome to Ubuntu"
746793msgstr ""
po/ckb.po+183−136
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
1111"PO-Revision-Date: 2014-01-21 11:05+0000\n"
1212"Last-Translator: Aras <aras.noori@gmail.com>\n"
1313"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
@@ -15,86 +15,114 @@ 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-11-23 06:36+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:31+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr ""
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr ""
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr ""
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr ""
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr ""
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr ""
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr ""
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr ""
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr ""
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr ""
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr ""
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr ""
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr ""
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr ""
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr ""
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr ""
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr ""
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr ""
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr ""
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr ""
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr ""
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
90118msgstr ""
91119
92−#: qml/Components/Dialogs.qml:205
120+#: qml/Components/Dialogs.qml:244
93121msgctxt "Button: Power off the system"
94122msgid "Power off"
95123msgstr ""
96124
97−#: qml/Components/Dialogs.qml:214
125+#: qml/Components/Dialogs.qml:255
98126msgctxt "Button: Restart the system"
99127msgid "Restart"
100128msgstr ""
@@ -120,7 +148,7 @@ msgid "Alt + PrtScr"
120148msgstr ""
121149
122150#: qml/Components/KeyboardShortcutsOverlay.qml:80
123−msgid "Takes a screenshot of a window."
151+msgid "Takes a screenshot of the current window."
124152msgstr ""
125153
126154#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -139,127 +167,143 @@ msgstr ""
139167msgid "Switches to previous keyboard layout."
140168msgstr ""
141169
142−#: qml/Components/KeyboardShortcutsOverlay.qml:118
170+#: qml/Components/KeyboardShortcutsOverlay.qml:114
171+msgid "Ctrl + Alt + T"
172+msgstr ""
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:119
175+msgid "Starts the Terminal application."
176+msgstr ""
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:131
143179msgid "Launcher"
144180msgstr ""
145181
146−#: qml/Components/KeyboardShortcutsOverlay.qml:125
182+#: qml/Components/KeyboardShortcutsOverlay.qml:138
147183msgid "Super (Hold)"
148184msgstr ""
149185
150−#: qml/Components/KeyboardShortcutsOverlay.qml:130
186+#: qml/Components/KeyboardShortcutsOverlay.qml:143
151187msgid "Opens the launcher, displays shortcuts."
152188msgstr ""
153189
154−#: qml/Components/KeyboardShortcutsOverlay.qml:138
190+#: qml/Components/KeyboardShortcutsOverlay.qml:151
155191msgid "Alt + F1"
156192msgstr ""
157193
158−#: qml/Components/KeyboardShortcutsOverlay.qml:143
194+#: qml/Components/KeyboardShortcutsOverlay.qml:156
159195msgid "Opens launcher keyboard navigation mode."
160196msgstr ""
161197
162−#: qml/Components/KeyboardShortcutsOverlay.qml:151
198+#: qml/Components/KeyboardShortcutsOverlay.qml:164
163199msgid "Super + Tab"
164200msgstr ""
165201
166−#: qml/Components/KeyboardShortcutsOverlay.qml:156
202+#: qml/Components/KeyboardShortcutsOverlay.qml:169
167203msgid "Switches applications via the launcher."
168204msgstr ""
169205
170−#: qml/Components/KeyboardShortcutsOverlay.qml:164
171−msgid "Super + 0 to 9"
206+#: qml/Components/KeyboardShortcutsOverlay.qml:177
207+msgid "Super + 1 to 0"
172208msgstr ""
173209
174−#: qml/Components/KeyboardShortcutsOverlay.qml:169
210+#: qml/Components/KeyboardShortcutsOverlay.qml:182
175211msgid "Same as clicking on a launcher icon."
176212msgstr ""
177213
178−#: qml/Components/KeyboardShortcutsOverlay.qml:181
214+#: qml/Components/KeyboardShortcutsOverlay.qml:190
215+msgid "Super + A"
216+msgstr ""
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:195
219+msgid "Opens the Application Drawer."
220+msgstr ""
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:207
179223msgid "Scopes"
180224msgstr ""
181225
182−#: qml/Components/KeyboardShortcutsOverlay.qml:188
226+#: qml/Components/KeyboardShortcutsOverlay.qml:214
183227msgid "Super (Tap)"
184228msgstr ""
185229
186−#: qml/Components/KeyboardShortcutsOverlay.qml:193
230+#: qml/Components/KeyboardShortcutsOverlay.qml:219
187231msgid "Opens the Scopes home."
188232msgstr ""
189233
190−#: qml/Components/KeyboardShortcutsOverlay.qml:209
234+#: qml/Components/KeyboardShortcutsOverlay.qml:235
191235msgid "Switching"
192236msgstr ""
193237
194−#: qml/Components/KeyboardShortcutsOverlay.qml:216
238+#: qml/Components/KeyboardShortcutsOverlay.qml:242
195239msgid "Alt + Tab"
196240msgstr ""
197241
198−#: qml/Components/KeyboardShortcutsOverlay.qml:221
242+#: qml/Components/KeyboardShortcutsOverlay.qml:247
199243msgid "Switches between applications."
200244msgstr ""
201245
202−#: qml/Components/KeyboardShortcutsOverlay.qml:229
246+#: qml/Components/KeyboardShortcutsOverlay.qml:255
203247msgid "Super + W"
204248msgstr ""
205249
206−#: qml/Components/KeyboardShortcutsOverlay.qml:234
250+#: qml/Components/KeyboardShortcutsOverlay.qml:260
207251msgid "Opens the desktop spread."
208252msgstr ""
209253
210−#: qml/Components/KeyboardShortcutsOverlay.qml:242
254+#: qml/Components/KeyboardShortcutsOverlay.qml:268
211255msgid "Cursor Left or Right"
212256msgstr ""
213257
214−#: qml/Components/KeyboardShortcutsOverlay.qml:247
258+#: qml/Components/KeyboardShortcutsOverlay.qml:273
215259msgid "Moves the focus."
216260msgstr ""
217261
218−#: qml/Components/KeyboardShortcutsOverlay.qml:259
262+#: qml/Components/KeyboardShortcutsOverlay.qml:285
219263msgid "Windows"
220264msgstr ""
221265
222−#: qml/Components/KeyboardShortcutsOverlay.qml:266
266+#: qml/Components/KeyboardShortcutsOverlay.qml:292
223267msgid "Ctrl + Super + D"
224268msgstr ""
225269
226−#: qml/Components/KeyboardShortcutsOverlay.qml:271
270+#: qml/Components/KeyboardShortcutsOverlay.qml:297
227271msgid "Minimizes all windows."
228272msgstr ""
229273
230−#: qml/Components/KeyboardShortcutsOverlay.qml:279
274+#: qml/Components/KeyboardShortcutsOverlay.qml:305
231275msgid "Ctrl + Super + Up"
232276msgstr ""
233277
234−#: qml/Components/KeyboardShortcutsOverlay.qml:284
278+#: qml/Components/KeyboardShortcutsOverlay.qml:310
235279msgid "Maximizes the current window."
236280msgstr ""
237281
238−#: qml/Components/KeyboardShortcutsOverlay.qml:292
282+#: qml/Components/KeyboardShortcutsOverlay.qml:318
239283msgid "Ctrl + Super + Down"
240284msgstr ""
241285
242−#: qml/Components/KeyboardShortcutsOverlay.qml:297
286+#: qml/Components/KeyboardShortcutsOverlay.qml:323
243287msgid "Minimizes or restores the current window."
244288msgstr ""
245289
246−#: qml/Components/KeyboardShortcutsOverlay.qml:305
290+#: qml/Components/KeyboardShortcutsOverlay.qml:331
247291msgid "Ctrl + Super + Left or Right"
248292msgstr ""
249293
250−#: qml/Components/KeyboardShortcutsOverlay.qml:310
294+#: qml/Components/KeyboardShortcutsOverlay.qml:336
251295msgid "Semi-maximizes the current window."
252296msgstr ""
253297
254−#: qml/Components/KeyboardShortcutsOverlay.qml:318
298+#: qml/Components/KeyboardShortcutsOverlay.qml:344
255299msgid "Alt + F4"
256300msgstr ""
257301
258−#: qml/Components/KeyboardShortcutsOverlay.qml:323
302+#: qml/Components/KeyboardShortcutsOverlay.qml:349
259303msgid "Closes the current window."
260304msgstr ""
261305
262−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
306+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
263307msgid "Return to Call"
264308msgstr ""
265309
@@ -267,7 +311,7 @@ msgstr ""
267311msgid "Emergency Call"
268312msgstr "هێڵی فریاگوزاری"
269313
270−#: qml/Components/Lockscreen.qml:244
314+#: qml/Components/Lockscreen.qml:245
271315msgid "OK"
272316msgstr ""
273317
@@ -281,29 +325,29 @@ msgstr ""
281325msgid "%1:%2"
282326msgstr ""
283327
284−#: qml/Components/ModeSwitchWarningDialog.qml:32
328+#: qml/Components/ModeSwitchWarningDialog.qml:33
285329msgid "Apps may have unsaved data:"
286330msgstr ""
287331
288−#: qml/Components/ModeSwitchWarningDialog.qml:57
332+#: qml/Components/ModeSwitchWarningDialog.qml:60
289333msgctxt ""
290334"Re-dock means connect the device again to an external screen/mouse/keyboard"
291335msgid "Re-dock, save your work and close these apps to continue."
292336msgstr ""
293337
294−#: qml/Components/ModeSwitchWarningDialog.qml:63
338+#: qml/Components/ModeSwitchWarningDialog.qml:67
295339msgid "Or force close now (unsaved data will be lost)."
296340msgstr ""
297341
298−#: qml/Components/ModeSwitchWarningDialog.qml:75
342+#: qml/Components/ModeSwitchWarningDialog.qml:80
299343msgid "OK, I will reconnect"
300344msgstr ""
301345
302−#: qml/Components/ModeSwitchWarningDialog.qml:76
346+#: qml/Components/ModeSwitchWarningDialog.qml:81
303347msgid "Reconnect now!"
304348msgstr ""
305349
306−#: qml/Components/ModeSwitchWarningDialog.qml:88
350+#: qml/Components/ModeSwitchWarningDialog.qml:94
307351msgid "Close all"
308352msgstr ""
309353
@@ -311,6 +355,28 @@ msgstr ""
311355msgid "Preview Share Item"
312356msgstr ""
313357
358+#: qml/Components/VirtualTouchPad.qml:317
359+msgid ""
360+"Your device is now connected to an external display. Use this screen as a "
361+"touch pad to interact with the pointer."
362+msgstr ""
363+
364+#: qml/Components/VirtualTouchPad.qml:327
365+msgid "Tap left button to click."
366+msgstr ""
367+
368+#: qml/Components/VirtualTouchPad.qml:339
369+msgid "Tap right button to right click."
370+msgstr ""
371+
372+#: qml/Components/VirtualTouchPad.qml:351
373+msgid "Swipe with two fingers to scroll."
374+msgstr ""
375+
376+#: qml/Components/VirtualTouchPad.qml:396
377+msgid "Find more settings in the system settings."
378+msgstr ""
379+
314380#: qml/Dash/DashPageHeader.qml:361
315381msgctxt "Button: Open the Ubuntu Store"
316382msgid "Store"
@@ -342,24 +408,24 @@ msgstr ""
342408msgid "Reset"
343409msgstr ""
344410
345−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
411+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
346412msgid "Show less"
347413msgstr ""
348414
349−#: qml/Dash/GenericScopeView.qml:545
415+#: qml/Dash/GenericScopeView.qml:547
350416msgid "Show all"
351417msgstr ""
352418
353−#: qml/Dash/GenericScopeView.qml:576
419+#: qml/Dash/GenericScopeView.qml:578
354420msgctxt "Label: Hint for dash search line edit"
355421msgid "Search"
356422msgstr ""
357423
358−#: qml/Dash/PageHeaderExtraPanel.qml:57
424+#: qml/Dash/PageHeaderExtraPanel.qml:67
359425msgid "Recent Searches"
360426msgstr ""
361427
362−#: qml/Dash/PageHeaderExtraPanel.qml:68
428+#: qml/Dash/PageHeaderExtraPanel.qml:78
363429msgid "Clear All"
364430msgstr ""
365431
@@ -396,24 +462,18 @@ msgstr ""
396462msgid "Enable location data"
397463msgstr ""
398464
399−#: qml/Dash/ScopesList.qml:57
465+#: qml/Dash/ScopesList.qml:146
400466msgid "Manage"
401467msgstr ""
402468
403−#: qml/Dash/ScopesList.qml:104
469+#: qml/Dash/ScopesList.qml:187
404470msgid "Home"
405471msgstr ""
406472
407−#: qml/Dash/ScopesList.qml:105
473+#: qml/Dash/ScopesList.qml:188
408474msgid "Also installed"
409475msgstr ""
410476
411−#: qml/DisabledScreenNotice.qml:109
412−msgid ""
413−"Your device is now connected to an external display. Use this screen as a "
414−"touch pad to interact with the pointer."
415−msgstr ""
416−
417477#: qml/Greeter/CoverPage.qml:127
418478msgid "Unlock"
419479msgstr ""
@@ -437,32 +497,45 @@ msgid_plural "Please wait %1 minutes and then try again…"
437497msgstr[0] ""
438498msgstr[1] ""
439499
440−#: qml/Greeter/Greeter.qml:596
500+#: qml/Greeter/Greeter.qml:550
441501msgid "Try again"
442502msgstr ""
443503
444−#: qml/Greeter/LoginList.qml:70
504+#: qml/Greeter/Greeter.qml:551
505+msgid "Enter passphrase to unlock"
506+msgstr ""
507+
508+#: qml/Greeter/Greeter.qml:552
509+msgid "Enter passcode to unlock"
510+msgstr ""
511+
512+#: qml/Greeter/NarrowView.qml:228
513+msgid "Emergency"
514+msgstr ""
515+
516+#: qml/Greeter/PromptList.qml:126
445517msgid "Passphrase"
446518msgstr ""
447519
448−#: qml/Greeter/LoginList.qml:71
520+#: qml/Greeter/PromptList.qml:126
449521msgid "Passcode"
450522msgstr ""
451523
452−#: qml/Greeter/LoginList.qml:98
453−msgid "Retry"
524+#: qml/Greeter/SessionsList.qml:124
525+msgid "Select desktop environment"
454526msgstr ""
455527
456−#: qml/Greeter/LoginList.qml:99
457−msgid "Log In"
528+#: qml/Launcher/Drawer.qml:94
529+msgid "Search…"
458530msgstr ""
459531
460−#: qml/Greeter/NarrowView.qml:252
461−msgid "Emergency"
532+#: qml/Launcher/Drawer.qml:129
533+msgctxt "Apps sorted alphabetically"
534+msgid "A-Z"
462535msgstr ""
463536
464−#: qml/Greeter/SessionsList.qml:122
465−msgid "Select desktop environment"
537+#: qml/Launcher/MoreAppsHeader.qml:55
538+msgid "More apps in the store"
466539msgstr ""
467540
468541#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -477,62 +550,62 @@ msgstr ""
477550msgid "Conference"
478551msgstr ""
479552
480−#: qml/Panel/Indicators/MenuItemFactory.qml:847
553+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
481554msgid "Nothing is playing"
482555msgstr ""
483556
484−#: qml/Panel/Indicators/MenuItemFactory.qml:975
557+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
485558#, qt-format
486559msgid "%1 hour"
487560msgid_plural "%1 hours"
488561msgstr[0] ""
489562msgstr[1] ""
490563
491−#: qml/Panel/Indicators/MenuItemFactory.qml:979
564+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
492565#, qt-format
493566msgid "%1 minute"
494567msgid_plural "%1 minutes"
495568msgstr[0] ""
496569msgstr[1] ""
497570
498−#: qml/Panel/Indicators/MenuItemFactory.qml:984
571+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
499572#, qt-format
500573msgid "%1 second"
501574msgid_plural "%1 seconds"
502575msgstr[0] ""
503576msgstr[1] ""
504577
505−#: qml/Panel/Indicators/MenuItemFactory.qml:987
578+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
506579msgid "0 seconds"
507580msgstr ""
508581
509582#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
510−#: qml/Panel/Indicators/MenuItemFactory.qml:989
583+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
511584#, qt-format
512585msgid "%1 remaining"
513586msgstr ""
514587
515−#: qml/Panel/Indicators/MenuItemFactory.qml:995
588+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
516589msgid "In queue…"
517590msgstr ""
518591
519−#: qml/Panel/Indicators/MenuItemFactory.qml:999
592+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
520593msgid "Downloading"
521594msgstr ""
522595
523−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
596+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
524597msgid "Paused, tap to resume"
525598msgstr ""
526599
527−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
600+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
528601msgid "Canceled"
529602msgstr ""
530603
531−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
604+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
532605msgid "Finished"
533606msgstr ""
534607
535−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
608+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
536609msgid "Failed, tap to retry"
537610msgstr ""
538611
@@ -552,12 +625,16 @@ msgctxt "Button: Call back on phone"
552625msgid "Call back"
553626msgstr ""
554627
628+#: qml/Panel/PanelMenuPage.qml:92
629+msgid "Back"
630+msgstr ""
631+
555632#: qml/Stage/SideStage.qml:76
556633msgid "Drag using 3 fingers any application from one window to the other"
557634msgstr ""
558635
559636#: qml/Tutorial/TutorialLeftLong.qml:49
560−msgid "Long swipe from the left edge to open the Today scope"
637+msgid "Long swipe from the left edge to open the Application Drawer"
561638msgstr ""
562639
563640#: qml/Tutorial/TutorialLeft.qml:47
@@ -586,7 +663,7 @@ msgid "Language"
586663msgstr ""
587664
588665#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
589−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
666+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
590667#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
591668#: qml/Wizard/Pages/70-passwd-type.qml:145
592669#: qml/Wizard/Pages/75-report-check.qml:84
@@ -607,25 +684,24 @@ msgstr ""
607684msgid "Keyboard layout"
608685msgstr ""
609686
610−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
611−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
612−#: qml/Wizard/Pages/sim.qml:101
687+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
688+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
613689msgid "Skip"
614690msgstr ""
615691
616−#: qml/Wizard/Pages/30-wifi.qml:31
692+#: qml/Wizard/Pages/30-wifi.qml:30
617693msgid "Connect to Wi‑Fi"
618694msgstr ""
619695
620−#: qml/Wizard/Pages/30-wifi.qml:132
696+#: qml/Wizard/Pages/30-wifi.qml:131
621697msgid "Connected"
622698msgstr ""
623699
624−#: qml/Wizard/Pages/30-wifi.qml:165
700+#: qml/Wizard/Pages/30-wifi.qml:164
625701msgid "Available Wi-Fi networks"
626702msgstr ""
627703
628−#: qml/Wizard/Pages/30-wifi.qml:166
704+#: qml/Wizard/Pages/30-wifi.qml:165
629705msgid "No available Wi-Fi networks"
630706msgstr ""
631707
@@ -712,35 +788,6 @@ msgstr ""
712788msgid "Privacy policy"
713789msgstr ""
714790
715−#: qml/Wizard/Pages/77-system-update.qml:28
716−msgid "Update Device"
717−msgstr ""
718−
719−#: qml/Wizard/Pages/77-system-update.qml:55
720−msgid ""
721−"There is a system update available and ready to install. Afterwards, the "
722−"device will automatically restart."
723−msgstr ""
724−
725−#: qml/Wizard/Pages/77-system-update.qml:76
726−msgctxt "string identifying name of the update"
727−msgid "Ubuntu system"
728−msgstr ""
729−
730−#: qml/Wizard/Pages/77-system-update.qml:83
731−#, qt-format
732−msgctxt "version of the system update"
733−msgid "Version %1"
734−msgstr ""
735−
736−#: qml/Wizard/Pages/77-system-update.qml:102
737−msgid "This could take a few minutes..."
738−msgstr ""
739−
740−#: qml/Wizard/Pages/77-system-update.qml:116
741−msgid "Install and restart now"
742−msgstr ""
743−
744791#: qml/Wizard/Pages/80-finished.qml:89
745792msgid "Welcome to Ubuntu"
746793msgstr ""
po/co.po+190−140
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
1111"PO-Revision-Date: 2016-05-24 10:40+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Corsican <co@li.org>\n"
@@ -15,75 +15,103 @@ 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-11-23 06:34+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020
21−#: plugins/LightDM/Greeter.cpp:123
21+#: plugins/LightDM/Greeter.cpp:188
2222msgid "Password: "
2323msgstr "Parolla d'ordine: "
2424
25+#: plugins/LightDM/Greeter.cpp:203
26+msgid "Username"
27+msgstr ""
28+
29+#: plugins/LightDM/Greeter.cpp:242
30+msgid "Failed to authenticate"
31+msgstr ""
32+
33+#: plugins/LightDM/Greeter.cpp:244
34+msgid "Invalid password, please try again"
35+msgstr ""
36+
37+#: plugins/LightDM/Greeter.cpp:254
38+msgid "Log In"
39+msgstr ""
40+
41+#: plugins/LightDM/Greeter.cpp:254
42+msgid "Retry"
43+msgstr "Turnà à pruvà"
44+
45+#: plugins/LightDM/UsersModel.cpp:157
46+msgid "Login"
47+msgstr ""
48+
49+#: plugins/LightDM/UsersModel.cpp:165
50+msgid "Guest Session"
51+msgstr ""
52+
2553#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:108
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
2755msgid "Pin shortcut"
2856msgstr "Fissà l'accurtatoghju"
2957
30−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
3159msgid "Quit"
3260msgstr "Abbandunà"
3361
34−#: plugins/Unity/Launcher/launcheritem.cpp:108
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
3563msgid "Unpin shortcut"
3664msgstr "Toglie l'accurtatoghju"
3765
38−#: qml/Components/Dialogs.qml:149
66+#: qml/Components/Dialogs.qml:176
3967msgctxt "Title: Lock/Log out dialog"
4068msgid "Log out"
4169msgstr "Escì"
4270
43−#: qml/Components/Dialogs.qml:150
71+#: qml/Components/Dialogs.qml:177
4472msgid "Are you sure you want to log out?"
4573msgstr "Site sicuri di vulè escì?"
4674
47−#: qml/Components/Dialogs.qml:152
75+#: qml/Components/Dialogs.qml:180
4876msgctxt "Button: Lock the system"
4977msgid "Lock"
5078msgstr "Bluccà"
5179
52−#: qml/Components/Dialogs.qml:159
80+#: qml/Components/Dialogs.qml:191
5381msgctxt "Button: Log out from the system"
5482msgid "Log Out"
5583msgstr "Escì"
5684
57−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
58−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
5987#: qml/Wizard/Pages/passcode-confirm.qml:32
6088#: qml/Wizard/Pages/passcode-set.qml:32
6189msgid "Cancel"
6290msgstr "Annullà"
6391
64−#: qml/Components/Dialogs.qml:178
92+#: qml/Components/Dialogs.qml:211
6593msgctxt "Title: Reboot dialog"
6694msgid "Reboot"
6795msgstr "Turnà ad avvià"
6896
69−#: qml/Components/Dialogs.qml:179
97+#: qml/Components/Dialogs.qml:212
7098msgid "Are you sure you want to reboot?"
7199msgstr "Site sicuri di vulè turnà ad avvià?"
72100
73−#: qml/Components/Dialogs.qml:181
101+#: qml/Components/Dialogs.qml:215
74102msgid "No"
75103msgstr "Nò"
76104
77−#: qml/Components/Dialogs.qml:187
105+#: qml/Components/Dialogs.qml:223
78106msgid "Yes"
79107msgstr "Iè"
80108
81−#: qml/Components/Dialogs.qml:202
109+#: qml/Components/Dialogs.qml:239
82110msgctxt "Title: Power off/Restart dialog"
83111msgid "Power"
84112msgstr "Alimentazione"
85113
86−#: qml/Components/Dialogs.qml:203
114+#: qml/Components/Dialogs.qml:240
87115msgid ""
88116"Are you sure you would like\n"
89117"to power off?"
@@ -91,12 +119,12 @@ msgstr ""
91119"Site sicuri di vulè\n"
92120"spenghje?"
93121
94−#: qml/Components/Dialogs.qml:205
122+#: qml/Components/Dialogs.qml:244
95123msgctxt "Button: Power off the system"
96124msgid "Power off"
97125msgstr "Spenghje"
98126
99−#: qml/Components/Dialogs.qml:214
127+#: qml/Components/Dialogs.qml:255
100128msgctxt "Button: Restart the system"
101129msgid "Restart"
102130msgstr "Turnà ad avvià"
@@ -122,7 +150,7 @@ msgid "Alt + PrtScr"
122150msgstr ""
123151
124152#: qml/Components/KeyboardShortcutsOverlay.qml:80
125−msgid "Takes a screenshot of a window."
153+msgid "Takes a screenshot of the current window."
126154msgstr ""
127155
128156#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -141,127 +169,143 @@ msgstr ""
141169msgid "Switches to previous keyboard layout."
142170msgstr ""
143171
144−#: qml/Components/KeyboardShortcutsOverlay.qml:118
172+#: qml/Components/KeyboardShortcutsOverlay.qml:114
173+msgid "Ctrl + Alt + T"
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:119
177+msgid "Starts the Terminal application."
178+msgstr ""
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:131
145181msgid "Launcher"
146182msgstr ""
147183
148−#: qml/Components/KeyboardShortcutsOverlay.qml:125
184+#: qml/Components/KeyboardShortcutsOverlay.qml:138
149185msgid "Super (Hold)"
150186msgstr ""
151187
152−#: qml/Components/KeyboardShortcutsOverlay.qml:130
188+#: qml/Components/KeyboardShortcutsOverlay.qml:143
153189msgid "Opens the launcher, displays shortcuts."
154190msgstr ""
155191
156−#: qml/Components/KeyboardShortcutsOverlay.qml:138
192+#: qml/Components/KeyboardShortcutsOverlay.qml:151
157193msgid "Alt + F1"
158194msgstr ""
159195
160−#: qml/Components/KeyboardShortcutsOverlay.qml:143
196+#: qml/Components/KeyboardShortcutsOverlay.qml:156
161197msgid "Opens launcher keyboard navigation mode."
162198msgstr ""
163199
164−#: qml/Components/KeyboardShortcutsOverlay.qml:151
200+#: qml/Components/KeyboardShortcutsOverlay.qml:164
165201msgid "Super + Tab"
166202msgstr ""
167203
168−#: qml/Components/KeyboardShortcutsOverlay.qml:156
204+#: qml/Components/KeyboardShortcutsOverlay.qml:169
169205msgid "Switches applications via the launcher."
170206msgstr ""
171207
172−#: qml/Components/KeyboardShortcutsOverlay.qml:164
173−msgid "Super + 0 to 9"
208+#: qml/Components/KeyboardShortcutsOverlay.qml:177
209+msgid "Super + 1 to 0"
174210msgstr ""
175211
176−#: qml/Components/KeyboardShortcutsOverlay.qml:169
212+#: qml/Components/KeyboardShortcutsOverlay.qml:182
177213msgid "Same as clicking on a launcher icon."
178214msgstr ""
179215
180−#: qml/Components/KeyboardShortcutsOverlay.qml:181
216+#: qml/Components/KeyboardShortcutsOverlay.qml:190
217+msgid "Super + A"
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:195
221+msgid "Opens the Application Drawer."
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
181225msgid "Scopes"
182226msgstr ""
183227
184−#: qml/Components/KeyboardShortcutsOverlay.qml:188
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
185229msgid "Super (Tap)"
186230msgstr ""
187231
188−#: qml/Components/KeyboardShortcutsOverlay.qml:193
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
189233msgid "Opens the Scopes home."
190234msgstr ""
191235
192−#: qml/Components/KeyboardShortcutsOverlay.qml:209
236+#: qml/Components/KeyboardShortcutsOverlay.qml:235
193237msgid "Switching"
194238msgstr ""
195239
196−#: qml/Components/KeyboardShortcutsOverlay.qml:216
240+#: qml/Components/KeyboardShortcutsOverlay.qml:242
197241msgid "Alt + Tab"
198242msgstr ""
199243
200−#: qml/Components/KeyboardShortcutsOverlay.qml:221
244+#: qml/Components/KeyboardShortcutsOverlay.qml:247
201245msgid "Switches between applications."
202246msgstr ""
203247
204−#: qml/Components/KeyboardShortcutsOverlay.qml:229
248+#: qml/Components/KeyboardShortcutsOverlay.qml:255
205249msgid "Super + W"
206250msgstr ""
207251
208−#: qml/Components/KeyboardShortcutsOverlay.qml:234
252+#: qml/Components/KeyboardShortcutsOverlay.qml:260
209253msgid "Opens the desktop spread."
210254msgstr ""
211255
212−#: qml/Components/KeyboardShortcutsOverlay.qml:242
256+#: qml/Components/KeyboardShortcutsOverlay.qml:268
213257msgid "Cursor Left or Right"
214258msgstr ""
215259
216−#: qml/Components/KeyboardShortcutsOverlay.qml:247
260+#: qml/Components/KeyboardShortcutsOverlay.qml:273
217261msgid "Moves the focus."
218262msgstr ""
219263
220−#: qml/Components/KeyboardShortcutsOverlay.qml:259
264+#: qml/Components/KeyboardShortcutsOverlay.qml:285
221265msgid "Windows"
222266msgstr ""
223267
224−#: qml/Components/KeyboardShortcutsOverlay.qml:266
268+#: qml/Components/KeyboardShortcutsOverlay.qml:292
225269msgid "Ctrl + Super + D"
226270msgstr ""
227271
228−#: qml/Components/KeyboardShortcutsOverlay.qml:271
272+#: qml/Components/KeyboardShortcutsOverlay.qml:297
229273msgid "Minimizes all windows."
230274msgstr ""
231275
232−#: qml/Components/KeyboardShortcutsOverlay.qml:279
276+#: qml/Components/KeyboardShortcutsOverlay.qml:305
233277msgid "Ctrl + Super + Up"
234278msgstr ""
235279
236−#: qml/Components/KeyboardShortcutsOverlay.qml:284
280+#: qml/Components/KeyboardShortcutsOverlay.qml:310
237281msgid "Maximizes the current window."
238282msgstr ""
239283
240−#: qml/Components/KeyboardShortcutsOverlay.qml:292
284+#: qml/Components/KeyboardShortcutsOverlay.qml:318
241285msgid "Ctrl + Super + Down"
242286msgstr ""
243287
244−#: qml/Components/KeyboardShortcutsOverlay.qml:297
288+#: qml/Components/KeyboardShortcutsOverlay.qml:323
245289msgid "Minimizes or restores the current window."
246290msgstr ""
247291
248−#: qml/Components/KeyboardShortcutsOverlay.qml:305
292+#: qml/Components/KeyboardShortcutsOverlay.qml:331
249293msgid "Ctrl + Super + Left or Right"
250294msgstr ""
251295
252−#: qml/Components/KeyboardShortcutsOverlay.qml:310
296+#: qml/Components/KeyboardShortcutsOverlay.qml:336
253297msgid "Semi-maximizes the current window."
254298msgstr ""
255299
256−#: qml/Components/KeyboardShortcutsOverlay.qml:318
300+#: qml/Components/KeyboardShortcutsOverlay.qml:344
257301msgid "Alt + F4"
258302msgstr ""
259303
260−#: qml/Components/KeyboardShortcutsOverlay.qml:323
304+#: qml/Components/KeyboardShortcutsOverlay.qml:349
261305msgid "Closes the current window."
262306msgstr ""
263307
264−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
265309msgid "Return to Call"
266310msgstr "Turnà à a Chjamata"
267311
@@ -269,7 +313,7 @@ msgstr "Turnà à a Chjamata"
269313msgid "Emergency Call"
270314msgstr "Chjamata d'emergenza"
271315
272−#: qml/Components/Lockscreen.qml:244
316+#: qml/Components/Lockscreen.qml:245
273317msgid "OK"
274318msgstr "OK"
275319
@@ -283,11 +327,11 @@ msgstr ""
283327msgid "%1:%2"
284328msgstr ""
285329
286−#: qml/Components/ModeSwitchWarningDialog.qml:32
330+#: qml/Components/ModeSwitchWarningDialog.qml:33
287331msgid "Apps may have unsaved data:"
288332msgstr "E app puderebbenu avè dati micca salvati:"
289333
290−#: qml/Components/ModeSwitchWarningDialog.qml:57
334+#: qml/Components/ModeSwitchWarningDialog.qml:60
291335msgctxt ""
292336"Re-dock means connect the device again to an external screen/mouse/keyboard"
293337msgid "Re-dock, save your work and close these apps to continue."
@@ -295,19 +339,19 @@ msgstr ""
295339"Turnà à cullegà, salvà u travagliu fattu è chjode sse applicazioni per "
296340"continuà."
297341
298−#: qml/Components/ModeSwitchWarningDialog.qml:63
342+#: qml/Components/ModeSwitchWarningDialog.qml:67
299343msgid "Or force close now (unsaved data will be lost)."
300344msgstr "O furzà a chjusura avà (i dati micca salvati seranu perduti)."
301345
302−#: qml/Components/ModeSwitchWarningDialog.qml:75
346+#: qml/Components/ModeSwitchWarningDialog.qml:80
303347msgid "OK, I will reconnect"
304348msgstr "OK, sto cunnettendumi..."
305349
306−#: qml/Components/ModeSwitchWarningDialog.qml:76
350+#: qml/Components/ModeSwitchWarningDialog.qml:81
307351msgid "Reconnect now!"
308352msgstr "Turnà à cunnettesi avà!"
309353
310−#: qml/Components/ModeSwitchWarningDialog.qml:88
354+#: qml/Components/ModeSwitchWarningDialog.qml:94
311355msgid "Close all"
312356msgstr "Chjode tuttu"
313357
@@ -315,6 +359,30 @@ msgstr "Chjode tuttu"
315359msgid "Preview Share Item"
316360msgstr "Anteprima elementi da sparte"
317361
362+#: qml/Components/VirtualTouchPad.qml:317
363+msgid ""
364+"Your device is now connected to an external display. Use this screen as a "
365+"touch pad to interact with the pointer."
366+msgstr ""
367+"U vostru dispusitivu avà hè cunnessu à unu screnu esternu. Usà u screnu di "
368+"ssu dispusitivu cum'è un tappettu tattile per guvernà u puntatore."
369+
370+#: qml/Components/VirtualTouchPad.qml:327
371+msgid "Tap left button to click."
372+msgstr ""
373+
374+#: qml/Components/VirtualTouchPad.qml:339
375+msgid "Tap right button to right click."
376+msgstr ""
377+
378+#: qml/Components/VirtualTouchPad.qml:351
379+msgid "Swipe with two fingers to scroll."
380+msgstr ""
381+
382+#: qml/Components/VirtualTouchPad.qml:396
383+msgid "Find more settings in the system settings."
384+msgstr ""
385+
318386#: qml/Dash/DashPageHeader.qml:361
319387msgctxt "Button: Open the Ubuntu Store"
320388msgid "Store"
@@ -346,24 +414,24 @@ msgstr "Raffinà i risultati"
346414msgid "Reset"
347415msgstr "Re-inizializzà"
348416
349−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
417+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
350418msgid "Show less"
351419msgstr ""
352420
353−#: qml/Dash/GenericScopeView.qml:545
421+#: qml/Dash/GenericScopeView.qml:547
354422msgid "Show all"
355423msgstr ""
356424
357−#: qml/Dash/GenericScopeView.qml:576
425+#: qml/Dash/GenericScopeView.qml:578
358426msgctxt "Label: Hint for dash search line edit"
359427msgid "Search"
360428msgstr "Circà"
361429
362−#: qml/Dash/PageHeaderExtraPanel.qml:57
430+#: qml/Dash/PageHeaderExtraPanel.qml:67
363431msgid "Recent Searches"
364432msgstr "Ricerche recente"
365433
366−#: qml/Dash/PageHeaderExtraPanel.qml:68
434+#: qml/Dash/PageHeaderExtraPanel.qml:78
367435msgid "Clear All"
368436msgstr "Squassà tuttu"
369437
@@ -400,26 +468,18 @@ msgstr "Lascià andà per rinnuvà..."
400468msgid "Enable location data"
401469msgstr "Abilità i dati nant'à u locu"
402470
403−#: qml/Dash/ScopesList.qml:57
471+#: qml/Dash/ScopesList.qml:146
404472msgid "Manage"
405473msgstr "Gestì"
406474
407−#: qml/Dash/ScopesList.qml:104
475+#: qml/Dash/ScopesList.qml:187
408476msgid "Home"
409477msgstr "Accolta"
410478
411−#: qml/Dash/ScopesList.qml:105
479+#: qml/Dash/ScopesList.qml:188
412480msgid "Also installed"
413481msgstr "Anu dinù installatu..."
414482
415−#: qml/DisabledScreenNotice.qml:109
416−msgid ""
417−"Your device is now connected to an external display. Use this screen as a "
418−"touch pad to interact with the pointer."
419−msgstr ""
420−"U vostru dispusitivu avà hè cunnessu à unu screnu esternu. Usà u screnu di "
421−"ssu dispusitivu cum'è un tappettu tattile per guvernà u puntatore."
422−
423483#: qml/Greeter/CoverPage.qml:127
424484msgid "Unlock"
425485msgstr "Sbluccà"
@@ -447,32 +507,45 @@ msgid_plural "Please wait %1 minutes and then try again…"
447507msgstr[0] "Aspettà %1 minutu è po turnà à pruvà…"
448508msgstr[1] "Aspettà %1 minuti è po turnà à pruvà…"
449509
450−#: qml/Greeter/Greeter.qml:596
510+#: qml/Greeter/Greeter.qml:550
451511msgid "Try again"
452512msgstr ""
453513
454−#: qml/Greeter/LoginList.qml:70
514+#: qml/Greeter/Greeter.qml:551
515+msgid "Enter passphrase to unlock"
516+msgstr ""
517+
518+#: qml/Greeter/Greeter.qml:552
519+msgid "Enter passcode to unlock"
520+msgstr ""
521+
522+#: qml/Greeter/NarrowView.qml:228
523+msgid "Emergency"
524+msgstr ""
525+
526+#: qml/Greeter/PromptList.qml:126
455527msgid "Passphrase"
456528msgstr ""
457529
458−#: qml/Greeter/LoginList.qml:71
530+#: qml/Greeter/PromptList.qml:126
459531msgid "Passcode"
460532msgstr ""
461533
462−#: qml/Greeter/LoginList.qml:98
463−msgid "Retry"
464−msgstr "Turnà à pruvà"
534+#: qml/Greeter/SessionsList.qml:124
535+msgid "Select desktop environment"
536+msgstr ""
465537
466−#: qml/Greeter/LoginList.qml:99
467−msgid "Log In"
538+#: qml/Launcher/Drawer.qml:94
539+msgid "Search…"
468540msgstr ""
469541
470−#: qml/Greeter/NarrowView.qml:252
471−msgid "Emergency"
542+#: qml/Launcher/Drawer.qml:129
543+msgctxt "Apps sorted alphabetically"
544+msgid "A-Z"
472545msgstr ""
473546
474−#: qml/Greeter/SessionsList.qml:122
475−msgid "Select desktop environment"
547+#: qml/Launcher/MoreAppsHeader.qml:55
548+msgid "More apps in the store"
476549msgstr ""
477550
478551#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -487,62 +560,62 @@ msgstr "Tuccà per riturnà à a chjamata..."
487560msgid "Conference"
488561msgstr "Cunferenza"
489562
490−#: qml/Panel/Indicators/MenuItemFactory.qml:847
563+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
491564msgid "Nothing is playing"
492565msgstr "Nunda in ripruduzione..."
493566
494−#: qml/Panel/Indicators/MenuItemFactory.qml:975
567+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
495568#, qt-format
496569msgid "%1 hour"
497570msgid_plural "%1 hours"
498571msgstr[0] "%1 ora"
499572msgstr[1] "%1 ore"
500573
501−#: qml/Panel/Indicators/MenuItemFactory.qml:979
574+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
502575#, qt-format
503576msgid "%1 minute"
504577msgid_plural "%1 minutes"
505578msgstr[0] "%1 minutu"
506579msgstr[1] "%1 minuti"
507580
508−#: qml/Panel/Indicators/MenuItemFactory.qml:984
581+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
509582#, qt-format
510583msgid "%1 second"
511584msgid_plural "%1 seconds"
512585msgstr[0] "%1 seconda"
513586msgstr[1] "%1 seconde"
514587
515−#: qml/Panel/Indicators/MenuItemFactory.qml:987
588+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
516589msgid "0 seconds"
517590msgstr "0 seconde"
518591
519592#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
520−#: qml/Panel/Indicators/MenuItemFactory.qml:989
593+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
521594#, qt-format
522595msgid "%1 remaining"
523596msgstr "%1 rimanente"
524597
525−#: qml/Panel/Indicators/MenuItemFactory.qml:995
598+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
526599msgid "In queue…"
527600msgstr "In coda..."
528601
529−#: qml/Panel/Indicators/MenuItemFactory.qml:999
602+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
530603msgid "Downloading"
531604msgstr "Scaricamentu..."
532605
533−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
606+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
534607msgid "Paused, tap to resume"
535608msgstr "In sosta, tuccà pè riprende"
536609
537−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
610+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
538611msgid "Canceled"
539612msgstr "Annullatu"
540613
541−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
614+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
542615msgid "Finished"
543616msgstr "Cumpletu"
544617
545−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
618+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
546619msgid "Failed, tap to retry"
547620msgstr "Fallatu, tocca per turnà à pruvà"
548621
@@ -562,14 +635,18 @@ msgctxt "Button: Call back on phone"
562635msgid "Call back"
563636msgstr "Richjamà"
564637
638+#: qml/Panel/PanelMenuPage.qml:92
639+msgid "Back"
640+msgstr ""
641+
565642#: qml/Stage/SideStage.qml:76
566643msgid "Drag using 3 fingers any application from one window to the other"
567644msgstr ""
568645"Trascinà cù 3 dite qualichissia applicazione da una finestra à un'antra"
569646
570647#: qml/Tutorial/TutorialLeftLong.qml:49
571−msgid "Long swipe from the left edge to open the Today scope"
572−msgstr "Scorre longu da mancina versu diritta per aprì u pannellu Oghje"
648+msgid "Long swipe from the left edge to open the Application Drawer"
649+msgstr ""
573650
574651#: qml/Tutorial/TutorialLeft.qml:47
575652msgid "Short swipe from the left edge to open the launcher"
@@ -597,7 +674,7 @@ msgid "Language"
597674msgstr "Lingua"
598675
599676#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
600−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
677+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
601678#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
602679#: qml/Wizard/Pages/70-passwd-type.qml:145
603680#: qml/Wizard/Pages/75-report-check.qml:84
@@ -618,25 +695,24 @@ msgstr ""
618695msgid "Keyboard layout"
619696msgstr ""
620697
621−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
622−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
623−#: qml/Wizard/Pages/sim.qml:101
698+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
699+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
624700msgid "Skip"
625701msgstr "Ignurà"
626702
627−#: qml/Wizard/Pages/30-wifi.qml:31
703+#: qml/Wizard/Pages/30-wifi.qml:30
628704msgid "Connect to Wi‑Fi"
629705msgstr "Cunnettesi à u Wi-Fi"
630706
631−#: qml/Wizard/Pages/30-wifi.qml:132
707+#: qml/Wizard/Pages/30-wifi.qml:131
632708msgid "Connected"
633709msgstr "Cunnessu"
634710
635−#: qml/Wizard/Pages/30-wifi.qml:165
711+#: qml/Wizard/Pages/30-wifi.qml:164
636712msgid "Available Wi-Fi networks"
637713msgstr "Rete Wi-Fi dispunibili"
638714
639−#: qml/Wizard/Pages/30-wifi.qml:166
715+#: qml/Wizard/Pages/30-wifi.qml:165
640716msgid "No available Wi-Fi networks"
641717msgstr "Nisuna reta Wi-Fi hè dispunibile"
642718
@@ -727,35 +803,6 @@ msgstr ""
727803msgid "Privacy policy"
728804msgstr "Pulitica di Riservatezza"
729805
730−#: qml/Wizard/Pages/77-system-update.qml:28
731−msgid "Update Device"
732−msgstr ""
733−
734−#: qml/Wizard/Pages/77-system-update.qml:55
735−msgid ""
736−"There is a system update available and ready to install. Afterwards, the "
737−"device will automatically restart."
738−msgstr ""
739−
740−#: qml/Wizard/Pages/77-system-update.qml:76
741−msgctxt "string identifying name of the update"
742−msgid "Ubuntu system"
743−msgstr ""
744−
745−#: qml/Wizard/Pages/77-system-update.qml:83
746−#, qt-format
747−msgctxt "version of the system update"
748−msgid "Version %1"
749−msgstr ""
750−
751−#: qml/Wizard/Pages/77-system-update.qml:102
752−msgid "This could take a few minutes..."
753−msgstr ""
754−
755−#: qml/Wizard/Pages/77-system-update.qml:116
756−msgid "Install and restart now"
757−msgstr ""
758−
759806#: qml/Wizard/Pages/80-finished.qml:89
760807msgid "Welcome to Ubuntu"
761808msgstr "Benvenuti in Ubuntu"
@@ -954,6 +1001,9 @@ msgstr "Parolla d'ordine moltu debule"
9541001#~ msgid "Swipe up to create a message"
9551002#~ msgstr "Scorre versu l'altu per creà un messaggiu"
9561003
1004+#~ msgid "Long swipe from the left edge to open the Today scope"
1005+#~ msgstr "Scorre longu da mancina versu diritta per aprì u pannellu Oghje"
1006+
9571007#~ msgid "Short or long swipe from the right edge to view your open apps"
9581008#~ msgstr ""
9591009#~ "Scorre cortu o longu da diritta versu mancina per vede e applicazioni aperte"
po/cs.po+184−137
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
1111"PO-Revision-Date: 2015-07-07 10:44+0000\n"
1212"Last-Translator: Vojtěch Daněk <vdanek@outlook.com>\n"
1313"Language-Team: Czech <cs@li.org>\n"
@@ -15,76 +15,104 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2016-11-23 06:35+0000\n"
19−"X-Generator: Launchpad (build 18269)\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
2020"Language: cs\n"
2121
22−#: plugins/LightDM/Greeter.cpp:123
22+#: plugins/LightDM/Greeter.cpp:188
2323msgid "Password: "
2424msgstr "Heslo: "
2525
26+#: plugins/LightDM/Greeter.cpp:203
27+msgid "Username"
28+msgstr ""
29+
30+#: plugins/LightDM/Greeter.cpp:242
31+msgid "Failed to authenticate"
32+msgstr ""
33+
34+#: plugins/LightDM/Greeter.cpp:244
35+msgid "Invalid password, please try again"
36+msgstr ""
37+
38+#: plugins/LightDM/Greeter.cpp:254
39+msgid "Log In"
40+msgstr ""
41+
42+#: plugins/LightDM/Greeter.cpp:254
43+msgid "Retry"
44+msgstr "Znovu"
45+
46+#: plugins/LightDM/UsersModel.cpp:157
47+msgid "Login"
48+msgstr ""
49+
50+#: plugins/LightDM/UsersModel.cpp:165
51+msgid "Guest Session"
52+msgstr ""
53+
2654#: plugins/Unity/Launcher/launcheritem.cpp:49
27−#: plugins/Unity/Launcher/launcheritem.cpp:108
55+#: plugins/Unity/Launcher/launcheritem.cpp:123
2856msgid "Pin shortcut"
2957msgstr "Připíchnout zkratku"
3058
31−#: plugins/Unity/Launcher/launcheritem.cpp:54
59+#: plugins/Unity/Launcher/launcheritem.cpp:55
3260msgid "Quit"
3361msgstr ""
3462
35−#: plugins/Unity/Launcher/launcheritem.cpp:108
63+#: plugins/Unity/Launcher/launcheritem.cpp:123
3664msgid "Unpin shortcut"
3765msgstr "Odpíchnout zkratku"
3866
39−#: qml/Components/Dialogs.qml:149
67+#: qml/Components/Dialogs.qml:176
4068msgctxt "Title: Lock/Log out dialog"
4169msgid "Log out"
4270msgstr "Odhlásit se"
4371
44−#: qml/Components/Dialogs.qml:150
72+#: qml/Components/Dialogs.qml:177
4573msgid "Are you sure you want to log out?"
4674msgstr "Jste si jistí, že se chcete odhlásit?"
4775
48−#: qml/Components/Dialogs.qml:152
76+#: qml/Components/Dialogs.qml:180
4977msgctxt "Button: Lock the system"
5078msgid "Lock"
5179msgstr "Uzamknout"
5280
53−#: qml/Components/Dialogs.qml:159
81+#: qml/Components/Dialogs.qml:191
5482msgctxt "Button: Log out from the system"
5583msgid "Log Out"
5684msgstr "Odhlásit"
5785
58−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
59−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
6088#: qml/Wizard/Pages/passcode-confirm.qml:32
6189#: qml/Wizard/Pages/passcode-set.qml:32
6290msgid "Cancel"
6391msgstr "Zrušit"
6492
65−#: qml/Components/Dialogs.qml:178
93+#: qml/Components/Dialogs.qml:211
6694msgctxt "Title: Reboot dialog"
6795msgid "Reboot"
6896msgstr "Restartovat"
6997
70−#: qml/Components/Dialogs.qml:179
98+#: qml/Components/Dialogs.qml:212
7199msgid "Are you sure you want to reboot?"
72100msgstr "Jste si jistí, že chcete zařízení restartovat?"
73101
74−#: qml/Components/Dialogs.qml:181
102+#: qml/Components/Dialogs.qml:215
75103msgid "No"
76104msgstr "Ne"
77105
78−#: qml/Components/Dialogs.qml:187
106+#: qml/Components/Dialogs.qml:223
79107msgid "Yes"
80108msgstr "Ano"
81109
82−#: qml/Components/Dialogs.qml:202
110+#: qml/Components/Dialogs.qml:239
83111msgctxt "Title: Power off/Restart dialog"
84112msgid "Power"
85113msgstr "Vypnutí"
86114
87−#: qml/Components/Dialogs.qml:203
115+#: qml/Components/Dialogs.qml:240
88116msgid ""
89117"Are you sure you would like\n"
90118"to power off?"
@@ -92,12 +120,12 @@ msgstr ""
92120"Jste si jistí, že chcete\n"
93121"telefon vypnout?"
94122
95−#: qml/Components/Dialogs.qml:205
123+#: qml/Components/Dialogs.qml:244
96124msgctxt "Button: Power off the system"
97125msgid "Power off"
98126msgstr "Vypnutí"
99127
100−#: qml/Components/Dialogs.qml:214
128+#: qml/Components/Dialogs.qml:255
101129msgctxt "Button: Restart the system"
102130msgid "Restart"
103131msgstr "Reboot"
@@ -123,7 +151,7 @@ msgid "Alt + PrtScr"
123151msgstr ""
124152
125153#: qml/Components/KeyboardShortcutsOverlay.qml:80
126−msgid "Takes a screenshot of a window."
154+msgid "Takes a screenshot of the current window."
127155msgstr ""
128156
129157#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -142,127 +170,143 @@ msgstr ""
142170msgid "Switches to previous keyboard layout."
143171msgstr ""
144172
145−#: qml/Components/KeyboardShortcutsOverlay.qml:118
173+#: qml/Components/KeyboardShortcutsOverlay.qml:114
174+msgid "Ctrl + Alt + T"
175+msgstr ""
176+
177+#: qml/Components/KeyboardShortcutsOverlay.qml:119
178+msgid "Starts the Terminal application."
179+msgstr ""
180+
181+#: qml/Components/KeyboardShortcutsOverlay.qml:131
146182msgid "Launcher"
147183msgstr ""
148184
149−#: qml/Components/KeyboardShortcutsOverlay.qml:125
185+#: qml/Components/KeyboardShortcutsOverlay.qml:138
150186msgid "Super (Hold)"
151187msgstr ""
152188
153−#: qml/Components/KeyboardShortcutsOverlay.qml:130
189+#: qml/Components/KeyboardShortcutsOverlay.qml:143
154190msgid "Opens the launcher, displays shortcuts."
155191msgstr ""
156192
157−#: qml/Components/KeyboardShortcutsOverlay.qml:138
193+#: qml/Components/KeyboardShortcutsOverlay.qml:151
158194msgid "Alt + F1"
159195msgstr ""
160196
161−#: qml/Components/KeyboardShortcutsOverlay.qml:143
197+#: qml/Components/KeyboardShortcutsOverlay.qml:156
162198msgid "Opens launcher keyboard navigation mode."
163199msgstr ""
164200
165−#: qml/Components/KeyboardShortcutsOverlay.qml:151
201+#: qml/Components/KeyboardShortcutsOverlay.qml:164
166202msgid "Super + Tab"
167203msgstr ""
168204
169−#: qml/Components/KeyboardShortcutsOverlay.qml:156
205+#: qml/Components/KeyboardShortcutsOverlay.qml:169
170206msgid "Switches applications via the launcher."
171207msgstr ""
172208
173−#: qml/Components/KeyboardShortcutsOverlay.qml:164
174−msgid "Super + 0 to 9"
209+#: qml/Components/KeyboardShortcutsOverlay.qml:177
210+msgid "Super + 1 to 0"
175211msgstr ""
176212
177−#: qml/Components/KeyboardShortcutsOverlay.qml:169
213+#: qml/Components/KeyboardShortcutsOverlay.qml:182
178214msgid "Same as clicking on a launcher icon."
179215msgstr ""
180216
181−#: qml/Components/KeyboardShortcutsOverlay.qml:181
217+#: qml/Components/KeyboardShortcutsOverlay.qml:190
218+msgid "Super + A"
219+msgstr ""
220+
221+#: qml/Components/KeyboardShortcutsOverlay.qml:195
222+msgid "Opens the Application Drawer."
223+msgstr ""
224+
225+#: qml/Components/KeyboardShortcutsOverlay.qml:207
182226msgid "Scopes"
183227msgstr ""
184228
185−#: qml/Components/KeyboardShortcutsOverlay.qml:188
229+#: qml/Components/KeyboardShortcutsOverlay.qml:214
186230msgid "Super (Tap)"
187231msgstr ""
188232
189−#: qml/Components/KeyboardShortcutsOverlay.qml:193
233+#: qml/Components/KeyboardShortcutsOverlay.qml:219
190234msgid "Opens the Scopes home."
191235msgstr ""
192236
193−#: qml/Components/KeyboardShortcutsOverlay.qml:209
237+#: qml/Components/KeyboardShortcutsOverlay.qml:235
194238msgid "Switching"
195239msgstr ""
196240
197−#: qml/Components/KeyboardShortcutsOverlay.qml:216
241+#: qml/Components/KeyboardShortcutsOverlay.qml:242
198242msgid "Alt + Tab"
199243msgstr ""
200244
201−#: qml/Components/KeyboardShortcutsOverlay.qml:221
245+#: qml/Components/KeyboardShortcutsOverlay.qml:247
202246msgid "Switches between applications."
203247msgstr ""
204248
205−#: qml/Components/KeyboardShortcutsOverlay.qml:229
249+#: qml/Components/KeyboardShortcutsOverlay.qml:255
206250msgid "Super + W"
207251msgstr ""
208252
209−#: qml/Components/KeyboardShortcutsOverlay.qml:234
253+#: qml/Components/KeyboardShortcutsOverlay.qml:260
210254msgid "Opens the desktop spread."
211255msgstr ""
212256
213−#: qml/Components/KeyboardShortcutsOverlay.qml:242
257+#: qml/Components/KeyboardShortcutsOverlay.qml:268
214258msgid "Cursor Left or Right"
215259msgstr ""
216260
217−#: qml/Components/KeyboardShortcutsOverlay.qml:247
261+#: qml/Components/KeyboardShortcutsOverlay.qml:273
218262msgid "Moves the focus."
219263msgstr ""
220264
221−#: qml/Components/KeyboardShortcutsOverlay.qml:259
265+#: qml/Components/KeyboardShortcutsOverlay.qml:285
222266msgid "Windows"
223267msgstr ""
224268
225−#: qml/Components/KeyboardShortcutsOverlay.qml:266
269+#: qml/Components/KeyboardShortcutsOverlay.qml:292
226270msgid "Ctrl + Super + D"
227271msgstr ""
228272
229−#: qml/Components/KeyboardShortcutsOverlay.qml:271
273+#: qml/Components/KeyboardShortcutsOverlay.qml:297
230274msgid "Minimizes all windows."
231275msgstr ""
232276
233−#: qml/Components/KeyboardShortcutsOverlay.qml:279
277+#: qml/Components/KeyboardShortcutsOverlay.qml:305
234278msgid "Ctrl + Super + Up"
235279msgstr ""
236280
237−#: qml/Components/KeyboardShortcutsOverlay.qml:284
281+#: qml/Components/KeyboardShortcutsOverlay.qml:310
238282msgid "Maximizes the current window."
239283msgstr ""
240284
241−#: qml/Components/KeyboardShortcutsOverlay.qml:292
285+#: qml/Components/KeyboardShortcutsOverlay.qml:318
242286msgid "Ctrl + Super + Down"
243287msgstr ""
244288
245−#: qml/Components/KeyboardShortcutsOverlay.qml:297
289+#: qml/Components/KeyboardShortcutsOverlay.qml:323
246290msgid "Minimizes or restores the current window."
247291msgstr ""
248292
249−#: qml/Components/KeyboardShortcutsOverlay.qml:305
293+#: qml/Components/KeyboardShortcutsOverlay.qml:331
250294msgid "Ctrl + Super + Left or Right"
251295msgstr ""
252296
253−#: qml/Components/KeyboardShortcutsOverlay.qml:310
297+#: qml/Components/KeyboardShortcutsOverlay.qml:336
254298msgid "Semi-maximizes the current window."
255299msgstr ""
256300
257−#: qml/Components/KeyboardShortcutsOverlay.qml:318
301+#: qml/Components/KeyboardShortcutsOverlay.qml:344
258302msgid "Alt + F4"
259303msgstr ""
260304
261−#: qml/Components/KeyboardShortcutsOverlay.qml:323
305+#: qml/Components/KeyboardShortcutsOverlay.qml:349
262306msgid "Closes the current window."
263307msgstr ""
264308
265−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
309+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
266310msgid "Return to Call"
267311msgstr "Vrátit se k hovoru"
268312
@@ -270,7 +314,7 @@ msgstr "Vrátit se k hovoru"
270314msgid "Emergency Call"
271315msgstr "Tísňové volání"
272316
273−#: qml/Components/Lockscreen.qml:244
317+#: qml/Components/Lockscreen.qml:245
274318msgid "OK"
275319msgstr "OK"
276320
@@ -284,29 +328,29 @@ msgstr ""
284328msgid "%1:%2"
285329msgstr ""
286330
287−#: qml/Components/ModeSwitchWarningDialog.qml:32
331+#: qml/Components/ModeSwitchWarningDialog.qml:33
288332msgid "Apps may have unsaved data:"
289333msgstr ""
290334
291−#: qml/Components/ModeSwitchWarningDialog.qml:57
335+#: qml/Components/ModeSwitchWarningDialog.qml:60
292336msgctxt ""
293337"Re-dock means connect the device again to an external screen/mouse/keyboard"
294338msgid "Re-dock, save your work and close these apps to continue."
295339msgstr ""
296340
297−#: qml/Components/ModeSwitchWarningDialog.qml:63
341+#: qml/Components/ModeSwitchWarningDialog.qml:67
298342msgid "Or force close now (unsaved data will be lost)."
299343msgstr ""
300344
301−#: qml/Components/ModeSwitchWarningDialog.qml:75
345+#: qml/Components/ModeSwitchWarningDialog.qml:80
302346msgid "OK, I will reconnect"
303347msgstr ""
304348
305−#: qml/Components/ModeSwitchWarningDialog.qml:76
349+#: qml/Components/ModeSwitchWarningDialog.qml:81
306350msgid "Reconnect now!"
307351msgstr ""
308352
309−#: qml/Components/ModeSwitchWarningDialog.qml:88
353+#: qml/Components/ModeSwitchWarningDialog.qml:94
310354msgid "Close all"
311355msgstr ""
312356
@@ -314,6 +358,28 @@ msgstr ""
314358msgid "Preview Share Item"
315359msgstr ""
316360
361+#: qml/Components/VirtualTouchPad.qml:317
362+msgid ""
363+"Your device is now connected to an external display. Use this screen as a "
364+"touch pad to interact with the pointer."
365+msgstr ""
366+
367+#: qml/Components/VirtualTouchPad.qml:327
368+msgid "Tap left button to click."
369+msgstr ""
370+
371+#: qml/Components/VirtualTouchPad.qml:339
372+msgid "Tap right button to right click."
373+msgstr ""
374+
375+#: qml/Components/VirtualTouchPad.qml:351
376+msgid "Swipe with two fingers to scroll."
377+msgstr ""
378+
379+#: qml/Components/VirtualTouchPad.qml:396
380+msgid "Find more settings in the system settings."
381+msgstr ""
382+
317383#: qml/Dash/DashPageHeader.qml:361
318384msgctxt "Button: Open the Ubuntu Store"
319385msgid "Store"
@@ -345,24 +411,24 @@ msgstr ""
345411msgid "Reset"
346412msgstr ""
347413
348−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
414+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
349415msgid "Show less"
350416msgstr ""
351417
352−#: qml/Dash/GenericScopeView.qml:545
418+#: qml/Dash/GenericScopeView.qml:547
353419msgid "Show all"
354420msgstr ""
355421
356−#: qml/Dash/GenericScopeView.qml:576
422+#: qml/Dash/GenericScopeView.qml:578
357423msgctxt "Label: Hint for dash search line edit"
358424msgid "Search"
359425msgstr "Hledat"
360426
361−#: qml/Dash/PageHeaderExtraPanel.qml:57
427+#: qml/Dash/PageHeaderExtraPanel.qml:67
362428msgid "Recent Searches"
363429msgstr ""
364430
365−#: qml/Dash/PageHeaderExtraPanel.qml:68
431+#: qml/Dash/PageHeaderExtraPanel.qml:78
366432msgid "Clear All"
367433msgstr ""
368434
@@ -399,24 +465,18 @@ msgstr "Pusťte pro obnovení..."
399465msgid "Enable location data"
400466msgstr "Povolit údaje umístění"
401467
402−#: qml/Dash/ScopesList.qml:57
468+#: qml/Dash/ScopesList.qml:146
403469msgid "Manage"
404470msgstr "Spravovat"
405471
406−#: qml/Dash/ScopesList.qml:104
472+#: qml/Dash/ScopesList.qml:187
407473msgid "Home"
408474msgstr "Domů"
409475
410−#: qml/Dash/ScopesList.qml:105
476+#: qml/Dash/ScopesList.qml:188
411477msgid "Also installed"
412478msgstr "Také nainstalováno"
413479
414−#: qml/DisabledScreenNotice.qml:109
415−msgid ""
416−"Your device is now connected to an external display. Use this screen as a "
417−"touch pad to interact with the pointer."
418−msgstr ""
419−
420480#: qml/Greeter/CoverPage.qml:127
421481msgid "Unlock"
422482msgstr "Odemknout"
@@ -443,32 +503,45 @@ msgstr[0] "Počkejte, prosím, %1 minut a poté to zkuste znovu..."
443503msgstr[1] "Počkejte, prosím, %1 minuty a poté to zkuste znovu..."
444504msgstr[2] "Počkejte, prosím, %1 minut a poté to zkuste znovu..."
445505
446−#: qml/Greeter/Greeter.qml:596
506+#: qml/Greeter/Greeter.qml:550
447507msgid "Try again"
448508msgstr ""
449509
450−#: qml/Greeter/LoginList.qml:70
510+#: qml/Greeter/Greeter.qml:551
511+msgid "Enter passphrase to unlock"
512+msgstr ""
513+
514+#: qml/Greeter/Greeter.qml:552
515+msgid "Enter passcode to unlock"
516+msgstr ""
517+
518+#: qml/Greeter/NarrowView.qml:228
519+msgid "Emergency"
520+msgstr ""
521+
522+#: qml/Greeter/PromptList.qml:126
451523msgid "Passphrase"
452524msgstr ""
453525
454−#: qml/Greeter/LoginList.qml:71
526+#: qml/Greeter/PromptList.qml:126
455527msgid "Passcode"
456528msgstr ""
457529
458−#: qml/Greeter/LoginList.qml:98
459−msgid "Retry"
460−msgstr "Znovu"
530+#: qml/Greeter/SessionsList.qml:124
531+msgid "Select desktop environment"
532+msgstr ""
461533
462−#: qml/Greeter/LoginList.qml:99
463−msgid "Log In"
534+#: qml/Launcher/Drawer.qml:94
535+msgid "Search…"
464536msgstr ""
465537
466−#: qml/Greeter/NarrowView.qml:252
467−msgid "Emergency"
538+#: qml/Launcher/Drawer.qml:129
539+msgctxt "Apps sorted alphabetically"
540+msgid "A-Z"
468541msgstr ""
469542
470−#: qml/Greeter/SessionsList.qml:122
471−msgid "Select desktop environment"
543+#: qml/Launcher/MoreAppsHeader.qml:55
544+msgid "More apps in the store"
472545msgstr ""
473546
474547#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -483,11 +556,11 @@ msgstr "Klepnutím se vrátíte k hovoru..."
483556msgid "Conference"
484557msgstr "Konferenční hovor"
485558
486−#: qml/Panel/Indicators/MenuItemFactory.qml:847
559+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
487560msgid "Nothing is playing"
488561msgstr "Nic se nepřehrává"
489562
490−#: qml/Panel/Indicators/MenuItemFactory.qml:975
563+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
491564#, qt-format
492565msgid "%1 hour"
493566msgid_plural "%1 hours"
@@ -495,7 +568,7 @@ msgstr[0] "%1 hodina"
495568msgstr[1] "%1 hodiny"
496569msgstr[2] "%1 hodin"
497570
498−#: qml/Panel/Indicators/MenuItemFactory.qml:979
571+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
499572#, qt-format
500573msgid "%1 minute"
501574msgid_plural "%1 minutes"
@@ -503,7 +576,7 @@ msgstr[0] "%1 minuta"
503576msgstr[1] "%1 minuty"
504577msgstr[2] "%1 minut"
505578
506−#: qml/Panel/Indicators/MenuItemFactory.qml:984
579+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
507580#, qt-format
508581msgid "%1 second"
509582msgid_plural "%1 seconds"
@@ -511,37 +584,37 @@ msgstr[0] "%1 sekunda"
511584msgstr[1] "%1 sekundy"
512585msgstr[2] "%1 sekund"
513586
514−#: qml/Panel/Indicators/MenuItemFactory.qml:987
587+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
515588msgid "0 seconds"
516589msgstr "0 sekund"
517590
518591#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
519−#: qml/Panel/Indicators/MenuItemFactory.qml:989
592+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
520593#, qt-format
521594msgid "%1 remaining"
522595msgstr "Zbývá %1"
523596
524−#: qml/Panel/Indicators/MenuItemFactory.qml:995
597+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
525598msgid "In queue…"
526599msgstr "Ve frontě..."
527600
528−#: qml/Panel/Indicators/MenuItemFactory.qml:999
601+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
529602msgid "Downloading"
530603msgstr "Stahování"
531604
532−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
605+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
533606msgid "Paused, tap to resume"
534607msgstr "Pauza, pro pokračování klepněte"
535608
536−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
609+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
537610msgid "Canceled"
538611msgstr "Zrušeno"
539612
540−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
613+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
541614msgid "Finished"
542615msgstr "Dokončeno"
543616
544−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
617+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
545618msgid "Failed, tap to retry"
546619msgstr "Nezdařilo se, opakujte klepnutím"
547620
@@ -561,12 +634,16 @@ msgctxt "Button: Call back on phone"
561634msgid "Call back"
562635msgstr ""
563636
637+#: qml/Panel/PanelMenuPage.qml:92
638+msgid "Back"
639+msgstr ""
640+
564641#: qml/Stage/SideStage.qml:76
565642msgid "Drag using 3 fingers any application from one window to the other"
566643msgstr ""
567644
568645#: qml/Tutorial/TutorialLeftLong.qml:49
569−msgid "Long swipe from the left edge to open the Today scope"
646+msgid "Long swipe from the left edge to open the Application Drawer"
570647msgstr ""
571648
572649#: qml/Tutorial/TutorialLeft.qml:47
@@ -595,7 +672,7 @@ msgid "Language"
595672msgstr ""
596673
597674#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
598−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
675+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
599676#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
600677#: qml/Wizard/Pages/70-passwd-type.qml:145
601678#: qml/Wizard/Pages/75-report-check.qml:84
@@ -616,25 +693,24 @@ msgstr ""
616693msgid "Keyboard layout"
617694msgstr ""
618695
619−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
620−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
621−#: qml/Wizard/Pages/sim.qml:101
696+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
697+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
622698msgid "Skip"
623699msgstr "Přeskočit"
624700
625−#: qml/Wizard/Pages/30-wifi.qml:31
701+#: qml/Wizard/Pages/30-wifi.qml:30
626702msgid "Connect to Wi‑Fi"
627703msgstr "Připojte se k Wi-Fi"
628704
629−#: qml/Wizard/Pages/30-wifi.qml:132
705+#: qml/Wizard/Pages/30-wifi.qml:131
630706msgid "Connected"
631707msgstr ""
632708
633−#: qml/Wizard/Pages/30-wifi.qml:165
709+#: qml/Wizard/Pages/30-wifi.qml:164
634710msgid "Available Wi-Fi networks"
635711msgstr ""
636712
637−#: qml/Wizard/Pages/30-wifi.qml:166
713+#: qml/Wizard/Pages/30-wifi.qml:165
638714msgid "No available Wi-Fi networks"
639715msgstr ""
640716
@@ -721,35 +797,6 @@ msgstr ""
721797msgid "Privacy policy"
722798msgstr ""
723799
724−#: qml/Wizard/Pages/77-system-update.qml:28
725−msgid "Update Device"
726−msgstr ""
727−
728−#: qml/Wizard/Pages/77-system-update.qml:55
729−msgid ""
730−"There is a system update available and ready to install. Afterwards, the "
731−"device will automatically restart."
732−msgstr ""
733−
734−#: qml/Wizard/Pages/77-system-update.qml:76
735−msgctxt "string identifying name of the update"
736−msgid "Ubuntu system"
737−msgstr ""
738−
739−#: qml/Wizard/Pages/77-system-update.qml:83
740−#, qt-format
741−msgctxt "version of the system update"
742−msgid "Version %1"
743−msgstr ""
744−
745−#: qml/Wizard/Pages/77-system-update.qml:102
746−msgid "This could take a few minutes..."
747−msgstr ""
748−
749−#: qml/Wizard/Pages/77-system-update.qml:116
750−msgid "Install and restart now"
751−msgstr ""
752−
753800#: qml/Wizard/Pages/80-finished.qml:89
754801msgid "Welcome to Ubuntu"
755802msgstr ""
po/cy.po+184−137
@@ -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-11-16 10:44+0000\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
1111"PO-Revision-Date: 2015-07-31 13:21+0000\n"
1212"Last-Translator: Owen Llywelyn <owen.llywelyn@gmail.com>\n"
1313"Language-Team: Welsh <cy@li.org>\n"
@@ -16,75 +16,103 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
1818"2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-11-23 06:36+0000\n"
20−"X-Generator: Launchpad (build 18269)\n"
19+"X-Launchpad-Export-Date: 2017-04-07 06:31+0000\n"
20+"X-Generator: Launchpad (build 18343)\n"
2121
22−#: plugins/LightDM/Greeter.cpp:123
22+#: plugins/LightDM/Greeter.cpp:188
2323msgid "Password: "
2424msgstr "Cyfrinair: "
2525
26+#: plugins/LightDM/Greeter.cpp:203
27+msgid "Username"
28+msgstr ""
29+
30+#: plugins/LightDM/Greeter.cpp:242
31+msgid "Failed to authenticate"
32+msgstr ""
33+
34+#: plugins/LightDM/Greeter.cpp:244
35+msgid "Invalid password, please try again"
36+msgstr ""
37+
38+#: plugins/LightDM/Greeter.cpp:254
39+msgid "Log In"
40+msgstr ""
41+
42+#: plugins/LightDM/Greeter.cpp:254
43+msgid "Retry"
44+msgstr "Ailgynnig"
45+
46+#: plugins/LightDM/UsersModel.cpp:157
47+msgid "Login"
48+msgstr ""
49+
50+#: plugins/LightDM/UsersModel.cpp:165
51+msgid "Guest Session"
52+msgstr ""
53+
2654#: plugins/Unity/Launcher/launcheritem.cpp:49
27−#: plugins/Unity/Launcher/launcheritem.cpp:108
55+#: plugins/Unity/Launcher/launcheritem.cpp:123
2856msgid "Pin shortcut"
2957msgstr "Pinio llwybr byr"
3058
31−#: plugins/Unity/Launcher/launcheritem.cpp:54
59+#: plugins/Unity/Launcher/launcheritem.cpp:55
3260msgid "Quit"
3361msgstr ""
3462
35−#: plugins/Unity/Launcher/launcheritem.cpp:108
63+#: plugins/Unity/Launcher/launcheritem.cpp:123
3664msgid "Unpin shortcut"
3765msgstr "Dadbinio llwybr byr"
3866
39−#: qml/Components/Dialogs.qml:149
67+#: qml/Components/Dialogs.qml:176
4068msgctxt "Title: Lock/Log out dialog"
4169msgid "Log out"
4270msgstr "Allgofnodi"
4371
44−#: qml/Components/Dialogs.qml:150
72+#: qml/Components/Dialogs.qml:177
4573msgid "Are you sure you want to log out?"
4674msgstr "Ydych chi'n sicr eich bod am allgofnodi?"
4775
48−#: qml/Components/Dialogs.qml:152
76+#: qml/Components/Dialogs.qml:180
4977msgctxt "Button: Lock the system"
5078msgid "Lock"
5179msgstr "Cloi"
5280
53−#: qml/Components/Dialogs.qml:159
81+#: qml/Components/Dialogs.qml:191
5482msgctxt "Button: Log out from the system"
5583msgid "Log Out"
5684msgstr "Allgofnodi"
5785
58−#: qml/Components/Dialogs.qml:166 qml/Components/Dialogs.qml:222
59−#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:232
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
6088#: qml/Wizard/Pages/passcode-confirm.qml:32
6189#: qml/Wizard/Pages/passcode-set.qml:32
6290msgid "Cancel"
6391msgstr "Diddymu"
6492
65−#: qml/Components/Dialogs.qml:178
93+#: qml/Components/Dialogs.qml:211
6694msgctxt "Title: Reboot dialog"
6795msgid "Reboot"
6896msgstr "Ailgychwyn"
6997
70−#: qml/Components/Dialogs.qml:179
98+#: qml/Components/Dialogs.qml:212
7199msgid "Are you sure you want to reboot?"
72100msgstr "Ydych chi'n sicr eich bod am ailgychwyn?"
73101
74−#: qml/Components/Dialogs.qml:181
102+#: qml/Components/Dialogs.qml:215
75103msgid "No"
76104msgstr "Na"
77105
78−#: qml/Components/Dialogs.qml:187
106+#: qml/Components/Dialogs.qml:223
79107msgid "Yes"
80108msgstr "Ydw"
81109
82−#: qml/Components/Dialogs.qml:202
110+#: qml/Components/Dialogs.qml:239
83111msgctxt "Title: Power off/Restart dialog"
84112msgid "Power"
85113msgstr "Pŵer"
86114
87−#: qml/Components/Dialogs.qml:203
115+#: qml/Components/Dialogs.qml:240
88116msgid ""
89117"Are you sure you would like\n"
90118"to power off?"
@@ -92,12 +120,12 @@ msgstr ""
92120"Ydych chi'n sicr eich bod am\n"
93121"ddiffodd y pŵer?"
94122
95−#: qml/Components/Dialogs.qml:205
123+#: qml/Components/Dialogs.qml:244
96124msgctxt "Button: Power off the system"
97125msgid "Power off"
98126msgstr "Diffodd y pŵer"
99127
100−#: qml/Components/Dialogs.qml:214
128+#: qml/Components/Dialogs.qml:255
101129msgctxt "Button: Restart the system"
102130msgid "Restart"
103131msgstr "Ailgychwyn"
@@ -123,7 +151,7 @@ msgid "Alt + PrtScr"
123151msgstr ""
124152
125153#: qml/Components/KeyboardShortcutsOverlay.qml:80
126−msgid "Takes a screenshot of a window."
154+msgid "Takes a screenshot of the current window."
127155msgstr ""
128156
129157#: qml/Components/KeyboardShortcutsOverlay.qml:88
@@ -142,127 +170,143 @@ msgstr ""
142170msgid "Switches to previous keyboard layout."
143171msgstr ""
144172
145−#: qml/Components/KeyboardShortcutsOverlay.qml:118
173+#: qml/Components/KeyboardShortcutsOverlay.qml:114
174+msgid "Ctrl + Alt + T"
175+msgstr ""
176+
177+#: qml/Components/KeyboardShortcutsOverlay.qml:119
178+msgid "Starts the Terminal application."
179+msgstr ""
180+
181+#: qml/Components/KeyboardShortcutsOverlay.qml:131
146182msgid "Launcher"
147183msgstr ""
148184
149−#: qml/Components/KeyboardShortcutsOverlay.qml:125
185+#: qml/Components/KeyboardShortcutsOverlay.qml:138
150186msgid "Super (Hold)"
151187msgstr ""
152188
153−#: qml/Components/KeyboardShortcutsOverlay.qml:130
189+#: qml/Components/KeyboardShortcutsOverlay.qml:143
154190msgid "Opens the launcher, displays shortcuts."
155191msgstr ""
156192
157−#: qml/Components/KeyboardShortcutsOverlay.qml:138
193+#: qml/Components/KeyboardShortcutsOverlay.qml:151
158194msgid "Alt + F1"
159195msgstr ""
160196
161−#: qml/Components/KeyboardShortcutsOverlay.qml:143
197+#: qml/Components/KeyboardShortcutsOverlay.qml:156
162198msgid "Opens launcher keyboard navigation mode."
163199msgstr ""
164200
165−#: qml/Components/KeyboardShortcutsOverlay.qml:151
201+#: qml/Components/KeyboardShortcutsOverlay.qml:164
166202msgid "Super + Tab"
167203msgstr ""
168204
169−#: qml/Components/KeyboardShortcutsOverlay.qml:156
205+#: qml/Components/KeyboardShortcutsOverlay.qml:169
170206msgid "Switches applications via the launcher."
171207msgstr ""
172208
173−#: qml/Components/KeyboardShortcutsOverlay.qml:164
174−msgid "Super + 0 to 9"
209+#: qml/Components/KeyboardShortcutsOverlay.qml:177
210+msgid "Super + 1 to 0"
175211msgstr ""
176212
177−#: qml/Components/KeyboardShortcutsOverlay.qml:169
213+#: qml/Components/KeyboardShortcutsOverlay.qml:182
178214msgid "Same as clicking on a launcher icon."
179215msgstr ""
180216
181−#: qml/Components/KeyboardShortcutsOverlay.qml:181
217+#: qml/Components/KeyboardShortcutsOverlay.qml:190
218+msgid "Super + A"
219+msgstr ""
220+
221+#: qml/Components/KeyboardShortcutsOverlay.qml:195
222+msgid "Opens the Application Drawer."
223+msgstr ""
224+
225+#: qml/Components/KeyboardShortcutsOverlay.qml:207
182226msgid "Scopes"
183227msgstr ""
184228
185−#: qml/Components/KeyboardShortcutsOverlay.qml:188
229+#: qml/Components/KeyboardShortcutsOverlay.qml:214
186230msgid "Super (Tap)"
187231msgstr ""
188232
189−#: qml/Components/KeyboardShortcutsOverlay.qml:193
233+#: qml/Components/KeyboardShortcutsOverlay.qml:219
190234msgid "Opens the Scopes home."
191235msgstr ""
192236
193−#: qml/Components/KeyboardShortcutsOverlay.qml:209
237+#: qml/Components/KeyboardShortcutsOverlay.qml:235
194238msgid "Switching"
195239msgstr ""
196240
197−#: qml/Components/KeyboardShortcutsOverlay.qml:216
241+#: qml/Components/KeyboardShortcutsOverlay.qml:242
198242msgid "Alt + Tab"
199243msgstr ""
200244
201−#: qml/Components/KeyboardShortcutsOverlay.qml:221
245+#: qml/Components/KeyboardShortcutsOverlay.qml:247
202246msgid "Switches between applications."
203247msgstr ""
204248
205−#: qml/Components/KeyboardShortcutsOverlay.qml:229
249+#: qml/Components/KeyboardShortcutsOverlay.qml:255
206250msgid "Super + W"
207251msgstr ""
208252
209−#: qml/Components/KeyboardShortcutsOverlay.qml:234
253+#: qml/Components/KeyboardShortcutsOverlay.qml:260
210254msgid "Opens the desktop spread."
211255msgstr ""
212256
213−#: qml/Components/KeyboardShortcutsOverlay.qml:242
257+#: qml/Components/KeyboardShortcutsOverlay.qml:268
214258msgid "Cursor Left or Right"
215259msgstr ""
216260
217−#: qml/Components/KeyboardShortcutsOverlay.qml:247
261+#: qml/Components/KeyboardShortcutsOverlay.qml:273
218262msgid "Moves the focus."
219263msgstr ""
220264
221−#: qml/Components/KeyboardShortcutsOverlay.qml:259
265+#: qml/Components/KeyboardShortcutsOverlay.qml:285
222266msgid "Windows"
223267msgstr ""
224268
225−#: qml/Components/KeyboardShortcutsOverlay.qml:266
269+#: qml/Components/KeyboardShortcutsOverlay.qml:292
226270msgid "Ctrl + Super + D"
227271msgstr ""
228272
229−#: qml/Components/KeyboardShortcutsOverlay.qml:271
273+#: qml/Components/KeyboardShortcutsOverlay.qml:297
230274msgid "Minimizes all windows."
231275msgstr ""
232276
233−#: qml/Components/KeyboardShortcutsOverlay.qml:279
277+#: qml/Components/KeyboardShortcutsOverlay.qml:305
234278msgid "Ctrl + Super + Up"
235279msgstr ""
236280
237−#: qml/Components/KeyboardShortcutsOverlay.qml:284
281+#: qml/Components/KeyboardShortcutsOverlay.qml:310
238282msgid "Maximizes the current window."
239283msgstr ""
240284
241−#: qml/Components/KeyboardShortcutsOverlay.qml:292
285+#: qml/Components/KeyboardShortcutsOverlay.qml:318
242286msgid "Ctrl + Super + Down"
243287msgstr ""
244288
245−#: qml/Components/KeyboardShortcutsOverlay.qml:297
289+#: qml/Components/KeyboardShortcutsOverlay.qml:323
246290msgid "Minimizes or restores the current window."
247291msgstr ""
248292
249−#: qml/Components/KeyboardShortcutsOverlay.qml:305
293+#: qml/Components/KeyboardShortcutsOverlay.qml:331
250294msgid "Ctrl + Super + Left or Right"
251295msgstr ""
252296
253−#: qml/Components/KeyboardShortcutsOverlay.qml:310
297+#: qml/Components/KeyboardShortcutsOverlay.qml:336
254298msgid "Semi-maximizes the current window."
255299msgstr ""
256300
257−#: qml/Components/KeyboardShortcutsOverlay.qml:318
301+#: qml/Components/KeyboardShortcutsOverlay.qml:344
258302msgid "Alt + F4"
259303msgstr ""
260304
261−#: qml/Components/KeyboardShortcutsOverlay.qml:323
305+#: qml/Components/KeyboardShortcutsOverlay.qml:349
262306msgid "Closes the current window."
263307msgstr ""
264308
265−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
309+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
266310msgid "Return to Call"
267311msgstr "Nôl i'r alwad"
268312
@@ -270,7 +314,7 @@ msgstr "Nôl i'r alwad"
270314msgid "Emergency Call"
271315msgstr "Galwad Frys"
272316
273−#: qml/Components/Lockscreen.qml:244
317+#: qml/Components/Lockscreen.qml:245
274318msgid "OK"
275319msgstr "Iawn"
276320
@@ -284,29 +328,29 @@ msgstr ""
284328msgid "%1:%2"
285329msgstr ""
286330
287−#: qml/Components/ModeSwitchWarningDialog.qml:32
331+#: qml/Components/ModeSwitchWarningDialog.qml:33
288332msgid "Apps may have unsaved data:"
289333msgstr ""
290334
291−#: qml/Components/ModeSwitchWarningDialog.qml:57
335+#: qml/Components/ModeSwitchWarningDialog.qml:60
292336msgctxt ""
293337"Re-dock means connect the device again to an external screen/mouse/keyboard"
294338msgid "Re-dock, save your work and close these apps to continue."
295339msgstr ""
296340
297−#: qml/Components/ModeSwitchWarningDialog.qml:63
341+#: qml/Components/ModeSwitchWarningDialog.qml:67
298342msgid "Or force close now (unsaved data will be lost)."
299343msgstr ""
300344
301−#: qml/Components/ModeSwitchWarningDialog.qml:75
345+#: qml/Components/ModeSwitchWarningDialog.qml:80
302346msgid "OK, I will reconnect"
303347msgstr ""
304348
305−#: qml/Components/ModeSwitchWarningDialog.qml:76
349+#: qml/Components/ModeSwitchWarningDialog.qml:81
306350msgid "Reconnect now!"
307351msgstr ""
308352
309−#: qml/Components/ModeSwitchWarningDialog.qml:88
353+#: qml/Components/ModeSwitchWarningDialog.qml:94
310354msgid "Close all"
311355msgstr ""
312356
@@ -314,6 +358,28 @@ msgstr ""
314358msgid "Preview Share Item"
315359msgstr ""
316360
361+#: qml/Components/VirtualTouchPad.qml:317
362+msgid ""
363+"Your device is now connected to an external display. Use this screen as a "
364+"touch pad to interact with the pointer."
365+msgstr ""
366+
367+#: qml/Components/VirtualTouchPad.qml:327
368+msgid "Tap left button to click."
369+msgstr ""
370+
371+#: qml/Components/VirtualTouchPad.qml:339
372+msgid "Tap right button to right click."
373+msgstr ""
374+
375+#: qml/Components/VirtualTouchPad.qml:351
376+msgid "Swipe with two fingers to scroll."
377+msgstr ""
378+
379+#: qml/Components/VirtualTouchPad.qml:396
380+msgid "Find more settings in the system settings."
381+msgstr ""
382+
317383#: qml/Dash/DashPageHeader.qml:361
318384msgctxt "Button: Open the Ubuntu Store"
319385msgid "Store"
@@ -345,24 +411,24 @@ msgstr ""
345411msgid "Reset"
346412msgstr ""
347413
348−#: qml/Dash/GenericScopeView.qml:545 qml/Dash/GenericScopeView.qml:716
414+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
349415msgid "Show less"
350416msgstr ""
351417
352−#: qml/Dash/GenericScopeView.qml:545
418+#: qml/Dash/GenericScopeView.qml:547
353419msgid "Show all"
354420msgstr ""
355421
356−#: qml/Dash/GenericScopeView.qml:576
422+#: qml/Dash/GenericScopeView.qml:578
357423msgctxt "Label: Hint for dash search line edit"
358424msgid "Search"
359425msgstr "Chwilio"
360426
361−#: qml/Dash/PageHeaderExtraPanel.qml:57
427+#: qml/Dash/PageHeaderExtraPanel.qml:67
362428msgid "Recent Searches"
363429msgstr ""
364430
365−#: qml/Dash/PageHeaderExtraPanel.qml:68
431+#: qml/Dash/PageHeaderExtraPanel.qml:78
366432msgid "Clear All"
367433msgstr ""
368434
@@ -399,24 +465,18 @@ msgstr "Rhyddhewch i adnewyddu..."
399465msgid "Enable location data"
400466msgstr "Galluogi data lleoliad"
401467
402−#: qml/Dash/ScopesList.qml:57
468+#: qml/Dash/ScopesList.qml:146
403469msgid "Manage"
404470msgstr "Rheoli"
405471
406−#: qml/Dash/ScopesList.qml:104
472+#: qml/Dash/ScopesList.qml:187
407473msgid "Home"
408474msgstr "Cartref"
409475
410−#: qml/Dash/ScopesList.qml:105
476+#: qml/Dash/ScopesList.qml:188
411477msgid "Also installed"
412478msgstr "Hefyd wedi gosod"
413479
414−#: qml/DisabledScreenNotice.qml:109
415−msgid ""
416−"Your device is now connected to an external display. Use this screen as a "
417−"touch pad to interact with the pointer."
418−msgstr ""
419−
420480#: qml/Greeter/CoverPage.qml:127
421481msgid "Unlock"
422482msgstr "Datgloi"
@@ -444,32 +504,45 @@ msgstr[1] "Arhoswch am %1 munud cyn cynnig eto..."
444504msgstr[2] "Arhoswch am %1 munud cyn cynnig eto..."
445505msgstr[3] "Arhoswch am %1 munud cyn cynnig eto..."
446506
447−#: qml/Greeter/Greeter.qml:596
507+#: qml/Greeter/Greeter.qml:550
448508msgid "Try again"
449509msgstr ""
450510
451−#: qml/Greeter/LoginList.qml:70
511+#: qml/Greeter/Greeter.qml:551
512+msgid "Enter passphrase to unlock"
513+msgstr ""
514+
515+#: qml/Greeter/Greeter.qml:552
516+msgid "Enter passcode to unlock"
517+msgstr ""
518+
519+#: qml/Greeter/NarrowView.qml:228
520+msgid "Emergency"
521+msgstr ""
522+
523+#: qml/Greeter/PromptList.qml:126
452524msgid "Passphrase"
453525msgstr ""
454526
455−#: qml/Greeter/LoginList.qml:71
527+#: qml/Greeter/PromptList.qml:126
456528msgid "Passcode"
457529msgstr ""
458530
459−#: qml/Greeter/LoginList.qml:98
460−msgid "Retry"
461−msgstr "Ailgynnig"
531+#: qml/Greeter/SessionsList.qml:124
532+msgid "Select desktop environment"
533+msgstr ""
462534
463−#: qml/Greeter/LoginList.qml:99
464−msgid "Log In"
535+#: qml/Launcher/Drawer.qml:94
536+msgid "Search…"
465537msgstr ""
466538
467−#: qml/Greeter/NarrowView.qml:252
468−msgid "Emergency"
539+#: qml/Launcher/Drawer.qml:129
540+msgctxt "Apps sorted alphabetically"
541+msgid "A-Z"
469542msgstr ""
470543
471−#: qml/Greeter/SessionsList.qml:122
472−msgid "Select desktop environment"
544+#: qml/Launcher/MoreAppsHeader.qml:55
545+msgid "More apps in the store"
473546msgstr ""
474547
475548#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -484,11 +557,11 @@ msgstr "Tapiwch i ffonio nôl"
484557msgid "Conference"
485558msgstr "Cydalwad"
486559
487−#: qml/Panel/Indicators/MenuItemFactory.qml:847
560+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
488561msgid "Nothing is playing"
489562msgstr "Dim byd yn chwarae"
490563
491−#: qml/Panel/Indicators/MenuItemFactory.qml:975
564+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
492565#, qt-format
493566msgid "%1 hour"
494567msgid_plural "%1 hours"
@@ -497,7 +570,7 @@ msgstr[1] "%1 awr"
497570msgstr[2] "%1 awr"
498571msgstr[3] "%1 awr"
499572
500−#: qml/Panel/Indicators/MenuItemFactory.qml:979
573+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
501574#, qt-format
502575msgid "%1 minute"
503576msgid_plural "%1 minutes"
@@ -506,7 +579,7 @@ msgstr[1] "%1 munud"
506579msgstr[2] "%1 munud"
507580msgstr[3] "%1 munud"
508581
509−#: qml/Panel/Indicators/MenuItemFactory.qml:984
582+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
510583#, qt-format
511584msgid "%1 second"
512585msgid_plural "%1 seconds"
@@ -515,37 +588,37 @@ msgstr[1] "%1 eiliad"
515588msgstr[2] "%1 eiliad"
516589msgstr[3] "%1 eiliad"
517590
518−#: qml/Panel/Indicators/MenuItemFactory.qml:987
591+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
519592msgid "0 seconds"
520593msgstr "0 eiliad"
521594
522595#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
523−#: qml/Panel/Indicators/MenuItemFactory.qml:989
596+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
524597#, qt-format
525598msgid "%1 remaining"
526599msgstr "%1 yn weddill"
527600
528−#: qml/Panel/Indicators/MenuItemFactory.qml:995
601+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
529602msgid "In queue…"
530603msgstr "Mewn ciw..."
531604
532−#: qml/Panel/Indicators/MenuItemFactory.qml:999
605+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
533606msgid "Downloading"
534607msgstr "Yn llwytho i lawr"
535608
536−#: qml/Panel/Indicators/MenuItemFactory.qml:1001
609+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
537610msgid "Paused, tap to resume"
538611msgstr "Seibiwyd, tapiwch i ailafael ynddi"
539612
540−#: qml/Panel/Indicators/MenuItemFactory.qml:1003
613+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
541614msgid "Canceled"
542615msgstr "Diddymwyd"
543616
544−#: qml/Panel/Indicators/MenuItemFactory.qml:1005
617+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
545618msgid "Finished"
546619msgstr "Wedi gorffen"
547620
548−#: qml/Panel/Indicators/MenuItemFactory.qml:1007
621+#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
549622msgid "Failed, tap to retry"
550623msgstr "Methwyd, tapiwch i geisio eto"
551624
@@ -565,12 +638,16 @@ msgctxt "Button: Call back on phone"
565638msgid "Call back"
566639msgstr ""
567640
641+#: qml/Panel/PanelMenuPage.qml:92
642+msgid "Back"
643+msgstr ""
644+
568645#: qml/Stage/SideStage.qml:76
569646msgid "Drag using 3 fingers any application from one window to the other"
570647msgstr ""
571648
572649#: qml/Tutorial/TutorialLeftLong.qml:49
573−msgid "Long swipe from the left edge to open the Today scope"
650+msgid "Long swipe from the left edge to open the Application Drawer"
574651msgstr ""
575652
576653#: qml/Tutorial/TutorialLeft.qml:47
@@ -599,7 +676,7 @@ msgid "Language"
599676msgstr ""
600677
601678#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
602−#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
679+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
603680#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
604681#: qml/Wizard/Pages/70-passwd-type.qml:145
605682#: qml/Wizard/Pages/75-report-check.qml:84
@@ -620,25 +697,24 @@ msgstr ""
620697msgid "Keyboard layout"
621698msgstr ""
622699
623−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
624−#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
625−#: qml/Wizard/Pages/sim.qml:101
700+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
701+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
626702msgid "Skip"
627703msgstr "Neidio"
628704
629−#: qml/Wizard/Pages/30-wifi.qml:31
705+#: qml/Wizard/Pages/30-wifi.qml:30
630706msgid "Connect to Wi‑Fi"
631707msgstr "Cysylltu â diwifr"
632708
633−#: qml/Wizard/Pages/30-wifi.qml:132
709+#: qml/Wizard/Pages/30-wifi.qml:131
634710msgid "Connected"
635711msgstr ""
636712
637−#: qml/Wizard/Pages/30-wifi.qml:165
713+#: qml/Wizard/Pages/30-wifi.qml:164
638714msgid "Available Wi-Fi networks"
639715msgstr ""
640716
641−#: qml/Wizard/Pages/30-wifi.qml:166
717+#: qml/Wizard/Pages/30-wifi.qml:165
642718msgid "No available Wi-Fi networks"
643719msgstr ""
644720
@@ -725,35 +801,6 @@ msgstr ""
725801msgid "Privacy policy"
726802msgstr ""
727803
728−#: qml/Wizard/Pages/77-system-update.qml:28
729−msgid "Update Device"
730−msgstr ""
731−
732−#: qml/Wizard/Pages/77-system-update.qml:55
733−msgid ""
734−"There is a system update available and ready to install. Afterwards, the "
735−"device will automatically restart."
736−msgstr ""
737−
738−#: qml/Wizard/Pages/77-system-update.qml:76
739−msgctxt "string identifying name of the update"
740−msgid "Ubuntu system"
741−msgstr ""
742−
743−#: qml/Wizard/Pages/77-system-update.qml:83
744−#, qt-format
745−msgctxt "version of the system update"
746−msgid "Version %1"
747−msgstr ""
748−
749−#: qml/Wizard/Pages/77-system-update.qml:102
750−msgid "This could take a few minutes..."
751−msgstr ""
752−
753−#: qml/Wizard/Pages/77-system-update.qml:116
754−msgid "Install and restart now"
755−msgstr ""
756−
757804#: qml/Wizard/Pages/80-finished.qml:89
758805msgid "Welcome to Ubuntu"
759806msgstr ""
po/da.po+184−137

This diff is too big to show here.

po/de.po+229−150

This diff is too big to show here.

po/el.po+253−168

This diff is too big to show here.

po/en_AU.po+190−140

This diff is too big to show here.

po/en_GB.po+226−147

This diff is too big to show here.

po/eo.po+184−137

This diff is too big to show here.

po/es.po+232−151

This diff is too big to show here.

po/et.ponew file+942

This diff is too big to show here.

po/eu.po+184−137

This diff is too big to show here.

po/fa.po+226−147

This diff is too big to show here.

po/fi.po+226−147

This diff is too big to show here.

po/fo.po+184−137

This diff is too big to show here.

po/fr.po+231−150

This diff is too big to show here.

po/ga.po+184−137

This diff is too big to show here.

po/gd.po+228−149

This diff is too big to show here.

po/gl.po+231−151

This diff is too big to show here.

po/gv.po+183−136

This diff is too big to show here.

po/he.po+184−137

This diff is too big to show here.

po/hi.po+183−136

This diff is too big to show here.

po/hr.po+226−147

This diff is too big to show here.

po/hu.po+226−147

This diff is too big to show here.

po/hy.po+183−136

This diff is too big to show here.

po/ia.po+226−147

This diff is too big to show here.

po/id.po+183−136

This diff is too big to show here.

po/is.po+183−136

This diff is too big to show here.

po/it.po+230−149

This diff is too big to show here.

po/ja.po+183−136

This diff is too big to show here.

po/km.po+184−137

This diff is too big to show here.

po/kn.po+183−136

This diff is too big to show here.

po/ko.po+184−137

This diff is too big to show here.

po/ku.po+211−164

This diff is too big to show here.

po/ky.po+183−136

This diff is too big to show here.

po/lo.po+183−136

This diff is too big to show here.

po/lt.po+183−136

This diff is too big to show here.

po/lv.po+184−137

This diff is too big to show here.

po/ml.po+183−136

This diff is too big to show here.

po/mr.po+183−136

This diff is too big to show here.

po/ms.po+274−191

This diff is too big to show here.

po/my.po+184−137

This diff is too big to show here.

po/nb.po+227−148

This diff is too big to show here.

po/ne.po+184−137

This diff is too big to show here.

po/nl.po+226−147

This diff is too big to show here.

po/nn.po+183−136

This diff is too big to show here.

po/oc.po+220−146

This diff is too big to show here.

po/or.po+183−136

This diff is too big to show here.

po/pa.po+184−137

This diff is too big to show here.

po/pl.po+225−146

This diff is too big to show here.

po/pt.po+227−147

This diff is too big to show here.

po/pt_BR.po+184−137

This diff is too big to show here.

po/ro.po+184−137

This diff is too big to show here.

po/ru.po+222−146

This diff is too big to show here.

po/shn.po+183−136

This diff is too big to show here.

po/si.po+183−136

This diff is too big to show here.

po/sk.po+226−147

This diff is too big to show here.

po/sl.po+216−145

This diff is too big to show here.

po/sq.po+184−137

This diff is too big to show here.

po/sr.po+224−145

This diff is too big to show here.

po/sv.po+226−147

This diff is too big to show here.

po/sw.po+184−137

This diff is too big to show here.

po/ta.po+200−151

This diff is too big to show here.

po/te.po+183−136

This diff is too big to show here.

po/th.po+200−151

This diff is too big to show here.

po/tr.po+226−147

This diff is too big to show here.

po/ug.po+189−139

This diff is too big to show here.

po/uk.po+227−148

This diff is too big to show here.

po/unity8.pot+176−129

This diff is too big to show here.

po/update-unity-pot+17

This diff is too big to show here.

po/ur.po+183−136

This diff is too big to show here.

po/uz.po+183−136

This diff is too big to show here.

po/vi.po+183−136

This diff is too big to show here.

po/wo.po+184−137

This diff is too big to show here.

po/xh.po+183−136

This diff is too big to show here.

po/zh_CN.po+197−141

This diff is too big to show here.

po/zh_HK.po+183−136

This diff is too big to show here.

po/zh_TW.po+207−147

This diff is too big to show here.

qml/ApplicationMenus/ApplicationMenuItemFactory.qmlnew file+135

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/QLightDM/SessionsModel → qml/ApplicationMenus/ApplicationMenusLimits.qmlrenamed+9−2

This diff is too big to show here.

qml/ApplicationMenus/MenuBar.qmlnew file+513

This diff is too big to show here.

qml/ApplicationMenus/MenuItem.qmlnew file+146

This diff is too big to show here.

qml/ApplicationMenus/MenuNavigator.qmlnew file+101

This diff is too big to show here.

qml/ApplicationMenus/MenuPopup.qmlnew file+510

This diff is too big to show here.

qml/ApplicationMenus/RegisteredApplicationMenuModel.qmlnew file+56

This diff is too big to show here.

qml/ApplicationMenus/qmldirnew file+1

This diff is too big to show here.

qml/CMakeLists.txt+1

This diff is too big to show here.

qml/Components/Dialogs.qml+49−7

This diff is too big to show here.

qml/Components/DragHandle.qml+1

This diff is too big to show here.

qml/Components/EdgeBarrier.qml+1

This diff is too big to show here.

qml/Components/EdgeBarrierController.qml+1

This diff is too big to show here.

qml/Components/InputMethod.qml+5−4

This diff is too big to show here.

qml/Components/KeyboardShortcutsOverlay.qml+28−2

This diff is too big to show here.

qml/Components/KeymapSwitcher.qml+19−8

This diff is too big to show here.

qml/Components/Lockscreen.qml+3−1

This diff is too big to show here.

qml/Components/ModeSwitchWarningDialog.qml+8−2

This diff is too big to show here.

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

This diff is too big to show here.

qml/Components/ScrollCalculator.qml+21−2

This diff is too big to show here.

qml/Components/ShellDialog.qml+21−3

This diff is too big to show here.

qml/Components/VirtualTouchPad.qml+269−1

This diff is too big to show here.

qml/Components/WindowControlButtons.qml+2

This diff is too big to show here.

qml/Dash/CardGrid.qml+2−3

This diff is too big to show here.

qml/Dash/CardTool.qml+2−26

This diff is too big to show here.

qml/Dash/GenericScopeView.qml+1−1

This diff is too big to show here.

qml/Dash/Previews/PreviewAudioPlayback.qml+1

This diff is too big to show here.

qml/Dash/Previews/PreviewPayments.qmldeleted−81

This diff is too big to show here.

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

This diff is too big to show here.

qml/Dash/Previews/PreviewWidgetFactory.qml−1

This diff is too big to show here.

qml/Dash/ScopesList.qml+120−39

This diff is too big to show here.

qml/Dash/ScopesListCategory.qml+4−1

This diff is too big to show here.

qml/DisabledScreenNotice.qml+3−55

This diff is too big to show here.

qml/Greeter/Circle.qml+1−1

This diff is too big to show here.

qml/Greeter/FullLightDMImpl.qml+1

This diff is too big to show here.

qml/Greeter/Greeter.qml+29−74

This diff is too big to show here.

qml/Greeter/GreeterPrompt.qml+61−41

This diff is too big to show here.

qml/Greeter/IntegratedLightDMImpl.qml+1

This diff is too big to show here.

qml/Greeter/LightDMService.qml+4−4

This diff is too big to show here.

qml/Greeter/LoginList.qml+44−113

This diff is too big to show here.

qml/Greeter/NarrowView.qml+11−35

This diff is too big to show here.

qml/Greeter/PromptList.qmlnew file+148

This diff is too big to show here.

qml/Greeter/SessionsList.qml+34−17

This diff is too big to show here.

qml/Greeter/WideView.qml+19−25

This diff is too big to show here.

qml/Launcher/BackgroundBlur.qmlnew file+81

This diff is too big to show here.

qml/Launcher/Drawer.qmlnew file+438

This diff is too big to show here.

qml/Launcher/DrawerGridView.qmlnew file+49

This diff is too big to show here.

tests/mocks/Ubuntu/Payments/plugin.cpp → qml/Launcher/DrawerListView.qmlrenamed+19−9

This diff is too big to show here.

qml/Launcher/Launcher.qml+214−48

This diff is too big to show here.

qml/Launcher/LauncherDelegate.qml+8−9

This diff is too big to show here.

qml/Launcher/LauncherPanel.qml+77−28

This diff is too big to show here.

qml/Launcher/MoreAppsHeader.qmlnew file+69

This diff is too big to show here.

qml/Launcher/graphics/home.svgnew file+243

This diff is too big to show here.

qml/Launcher/graphics/home@18.pngdeleted

Binary file not shown.

qml/Launcher/graphics/launcher-app-focus-ring.svgdeleted−12

This diff is too big to show here.

qml/OrientedShell.qml+16−7

This diff is too big to show here.

plugins/Ubuntu/Payments/plugin.cpp → qml/Panel/FakePanelMenu.qmlrenamed+8−10

This diff is too big to show here.

qml/Panel/IndicatorPage.qmldeleted−188

This diff is too big to show here.

qml/Panel/IndicatorItem.qml → qml/Panel/Indicators/IndicatorItem.qmlrenamed+2−1

This diff is too big to show here.

qml/Panel/Indicators/MenuItemFactory.qml → qml/Panel/Indicators/IndicatorMenuItemFactory.qmlrenamed+29−11

This diff is too big to show here.

qml/Panel/Indicators/client/IndicatorRepresentation.qml+18−5

This diff is too big to show here.

qml/Panel/MenuContent.qml+9−12

This diff is too big to show here.

qml/Panel/Panel.qml+330−91

This diff is too big to show here.

qml/Panel/IndicatorsBar.qml → qml/Panel/PanelBar.qmlrenamed+85−36

This diff is too big to show here.

qml/Panel/IndicatorItemRow.qml → qml/Panel/PanelItemRow.qmlrenamed+61−104

This diff is too big to show here.

qml/Panel/IndicatorsMenu.qml → qml/Panel/PanelMenu.qmlrenamed+71−33

This diff is too big to show here.

qml/Panel/PanelMenuPage.qmlnew file+226

This diff is too big to show here.

qml/Rotation/RotationStates.qml+2−2

This diff is too big to show here.

qml/Shell.qml+150−64

This diff is too big to show here.

qml/Stage/ApplicationWindow.qml+1

This diff is too big to show here.

qml/Stage/ChildWindow.qmlnew file+203

This diff is too big to show here.

qml/Stage/ChildWindowRepeater.qmlnew file+39

This diff is too big to show here.

qml/Stage/ChildWindowTree.qmlnew file+138

This diff is too big to show here.

qml/Stage/DecoratedWindow.qml+97−44

This diff is too big to show here.

qml/Stage/FakeMaximizeDelegate.qml+7−7

This diff is too big to show here.

qml/Stage/MoveHandler.qml+39−26

This diff is too big to show here.

qml/Stage/Spread/Spread.qml+11

This diff is too big to show here.

qml/Stage/Spread/WindowedRightEdgeMaths.qml+19−4

This diff is too big to show here.

qml/Stage/Stage.qml+444−285

This diff is too big to show here.

qml/Stage/StageMaths.qml+18−7

This diff is too big to show here.

qml/Stage/StagedFullscreenPolicy.qml+7−13

This diff is too big to show here.

qml/Stage/TopLevelSurfaceRepeater.qmldeleted−67

This diff is too big to show here.

qml/Stage/WindowControlsOverlay.qml+23−26

This diff is too big to show here.

qml/Stage/WindowDecoration.qml+84−19

This diff is too big to show here.

qml/Stage/WindowInfoItem.qml+16

This diff is too big to show here.

qml/Stage/WindowResizeArea.qml+15−70

This diff is too big to show here.

qml/Stage/WindowStateSaver.qmlnew file+64

This diff is too big to show here.

qml/Stage/WindowedFullscreenPolicy.qml+4−12

This diff is too big to show here.

qml/Tutorial/TutorialContent.qml+1−2

This diff is too big to show here.

qml/Tutorial/TutorialLeftLong.qml+2−2

This diff is too big to show here.

qml/Wizard/Pages/30-wifi.qml−4

This diff is too big to show here.

qml/Wizard/Pages/77-system-update.qmldeleted−156

This diff is too big to show here.

src/CMakeLists.txt+11−3

This diff is too big to show here.

src/DebuggingController.cppnew file+92

This diff is too big to show here.

src/DebuggingController.hnew file+57

This diff is too big to show here.

src/MouseTouchAdaptor.cpp+28−1

This diff is too big to show here.

src/MouseTouchAdaptor.h+1

This diff is too big to show here.

src/Panel/CMakeLists.txtdeleted−3

This diff is too big to show here.

src/Panel/Indicators/CMakeLists.txtdeleted−1

This diff is too big to show here.

src/ShellApplication.cpp+8−1

This diff is too big to show here.

src/ShellView.cpp+22

This diff is too big to show here.

src/libunity8-private/abstractdbusservicemonitor.h+1−1

This diff is too big to show here.

src/main.cpp+2−2

This diff is too big to show here.

tests/CMakeLists.txt+21−9

This diff is too big to show here.

tests/autopilot/unity8/dash.py+1−17

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/shell/tests/__init__.py+1−1

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_helpers.py−49

This diff is too big to show here.

tests/copyright/check_copyright.sh+33−4

This diff is too big to show here.

tests/graphics/screenshots/gallery@12.pngnew file

Binary file not shown.

tests/mocks/AccountsService/AccountsService.cpp+2−3

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.h+4−7

This diff is too big to show here.

tests/mocks/AccountsService/CMakeLists.txt+3−3

This diff is too big to show here.

tests/mocks/Biometryd/MockOperation.h−1

This diff is too big to show here.

tests/mocks/CMakeLists.txt+15−15

This diff is too big to show here.

tests/mocks/Cursor/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.cpp+14

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.h+7

This diff is too big to show here.

tests/mocks/LightDM/CMakeLists.txtdeleted−1

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/CMakeLists.txtdeleted−51

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/MockGreeter.cppdeleted−51

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/MockGreeter.hdeleted−42

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/MockSessionsModel.cppdeleted−66

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/MockSessionsModel.hdeleted−44

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/MockUsersModel.cppdeleted−44

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/CMakeLists.txtdeleted−20

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.cppdeleted−201

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModel.cppdeleted−123

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/plugin.cppdeleted−79

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/qmldirdeleted−2

This diff is too big to show here.

tests/mocks/LightDMController/CMakeLists.txtnew file+15

This diff is too big to show here.

tests/mocks/Ubuntu/SystemImage/plugin.cpp → tests/mocks/LightDMController/plugin.cpprenamed+11−10

This diff is too big to show here.

tests/mocks/Ubuntu/Payments/plugin.h → tests/mocks/LightDMController/plugin.hrenamed+4−6

This diff is too big to show here.

tests/mocks/LightDMController/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Lights/Lights.h+1−1

This diff is too big to show here.

tests/mocks/Powerd/Powerd.h+2−2

This diff is too big to show here.

tests/mocks/QMenuModel/dbus-enums.h+2−3

This diff is too big to show here.

tests/mocks/QMenuModel/unitymenumodel.cpp+78−13

This diff is too big to show here.

tests/mocks/QMenuModel/unitymenumodel.h+12−1

This diff is too big to show here.

tests/mocks/QtMultimedia/mediaplayer.cpp+2−2

This diff is too big to show here.

tests/mocks/QtMultimedia/mediaplayer.h+6−6

This diff is too big to show here.

tests/mocks/QtMultimedia/videooutput.h+1−1

This diff is too big to show here.

tests/mocks/UInput/mockuinput.h+1−1

This diff is too big to show here.

tests/mocks/Ubuntu/CMakeLists.txt−2

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/networking-status.h+2−3

This diff is too big to show here.

tests/mocks/Ubuntu/Payments/CMakeLists.txtdeleted−10

This diff is too big to show here.

tests/mocks/Ubuntu/Payments/MockPayments.cppdeleted−95

This diff is too big to show here.

tests/mocks/Ubuntu/Payments/MockPayments.hdeleted−62

This diff is too big to show here.

tests/mocks/Ubuntu/Payments/qmldirdeleted−3

This diff is too big to show here.

tests/mocks/Ubuntu/SystemImage/CMakeLists.txtdeleted−10

This diff is too big to show here.

tests/mocks/Ubuntu/SystemImage/MockSystemImage.cppdeleted−50

This diff is too big to show here.

tests/mocks/Ubuntu/SystemImage/MockSystemImage.hdeleted−56

This diff is too big to show here.

tests/mocks/Ubuntu/SystemImage/qmldirdeleted−3

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.h+1−1

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.cpp+58−27

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.h+6−3

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationManager.cpp+100−63

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationManager.h+32−10

This diff is too big to show here.

tests/mocks/Unity/Application/CMakeLists.txt+2−2

This diff is too big to show here.

tests/mocks/Unity/Application/MirMock.cpp+13

This diff is too big to show here.

tests/mocks/Unity/Application/MirMock.h+4

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurface.cpp+121−82

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurface.h+44−27

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceItem.cpp+24−9

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceListModel.cpp+17−39

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceListModel.h+7−15

This diff is too big to show here.

tests/mocks/Unity/Application/SurfaceManager.cpp+186−31

This diff is too big to show here.

tests/mocks/Unity/Application/SurfaceManager.h+32−10

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/Application/plugin.cpp+3−33

This diff is too big to show here.

tests/mocks/Unity/Application/resources/Kate.qmlnew file+49

This diff is too big to show here.

tests/mocks/Unity/Application/resources/KateDialog.qmlnew file+48

This diff is too big to show here.

tests/mocks/Unity/Application/resources/KateMenu.qmlnew file+41

This diff is too big to show here.

tests/mocks/Unity/Application/resources/surfaces.qrc+3

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/CMakeLists.txtnew file+18

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.cppnew file+47

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.hnew file+41

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/plugin.cppnew file+42

This diff is too big to show here.

tests/mocks/Ubuntu/SystemImage/plugin.h → tests/mocks/Unity/ApplicationMenu/plugin.hrenamed+6−5

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/qmldirnew file+3

This diff is too big to show here.

tests/mocks/Unity/CMakeLists.txt+11

This diff is too big to show here.

tests/mocks/Unity/Indicators/CMakeLists.txt+4

This diff is too big to show here.

tests/mocks/Unity/Indicators/fakeindicatorsmodel.h−1

This diff is too big to show here.

tests/mocks/Unity/Indicators/fakeindicatorsmodeldata.js+20−4

This diff is too big to show here.

tests/mocks/Unity/InputInfo/qinputdeviceinfo_mock.cpp+6−2

This diff is too big to show here.

tests/mocks/Unity/Launcher/CMakeLists.txt+4−2

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockAppDrawerModel.cppnew file+74

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockAppDrawerModel.hnew file+32

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

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/Launcher/MockQuickListModel.cpp+3−1

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockQuickListModel.h+2

This diff is too big to show here.

tests/mocks/Unity/Launcher/plugin.cpp+4

This diff is too big to show here.

tests/mocks/Unity/Notifications/MockActionModel.h+1−1

This diff is too big to show here.

tests/mocks/Unity/Notifications/MockNotification.h+2−1

This diff is too big to show here.

tests/mocks/Unity/Platform/CMakeLists.txtnew file+1

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/QLightDM/UsersModel → tests/mocks/Unity/Platform/MockPlatform.qmlrenamed+10−2

This diff is too big to show here.

tests/mocks/Unity/Platform/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Unity/Screens/screens.cpp+1−1

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/fake_previewwidgetmodel.h+1−1

This diff is too big to show here.

tests/mocks/Unity/fake_scope.cpp+2−2

This diff is too big to show here.

tests/mocks/Unity/fake_scopes.cpp+8−2

This diff is too big to show here.

tests/mocks/Unity/fake_scopesoverview.h+2

This diff is too big to show here.

tests/mocks/Utils/CMakeLists.txt+8

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Utils/windowstatestorage.cpp+23

This diff is too big to show here.

tests/mocks/Utils/windowstatestorage.h+6−3

This diff is too big to show here.

tests/mocks/liblightdm/CMakeLists.txtnew file+18

This diff is too big to show here.

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

The content is the same.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.h → tests/mocks/liblightdm/GreeterPrivate.hrenamed

The content is the same.

tests/mocks/liblightdm/MockController.cppnew file+192

This diff is too big to show here.

tests/mocks/liblightdm/MockController.hnew file+106

This diff is too big to show here.

tests/mocks/liblightdm/MockGreeter.cppnew file+316

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.h → tests/mocks/liblightdm/MockGreeter.hrenamed+10−23

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModel.cpp → tests/mocks/liblightdm/MockSessionsModel.cpprenamed+39−42

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModel.h → tests/mocks/liblightdm/MockSessionsModel.hrenamed+11−19

This diff is too big to show here.

tests/mocks/liblightdm/MockUsersModel.cppnew file+220

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModel.h → tests/mocks/liblightdm/MockUsersModel.hrenamed+9−18

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.h → tests/mocks/liblightdm/SessionsModelPrivate.hrenamed

The content is the same.

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

This diff is too big to show here.

tests/mocks/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.h → tests/mocks/liblightdm/UsersModelPrivate.hrenamed

The content is the same.

tests/mocks/libusermetrics/CMakeLists.txt+1

This diff is too big to show here.

tests/mocks/libusermetrics/ColorTheme.cpp+4

This diff is too big to show here.

tests/mocks/libusermetrics/UserMetrics.cpp+5

This diff is too big to show here.

tests/plugins/AccountsService/CMakeLists.txt+6

This diff is too big to show here.

tests/plugins/CMakeLists.txt+1

This diff is too big to show here.

tests/plugins/Dash/CMakeLists.txt+26−1

This diff is too big to show here.

tests/plugins/Dash/cardcreatortest.cpp+7−2

This diff is too big to show here.

tests/plugins/Dash/horizontaljournaltest.cpp+5−2

This diff is too big to show here.

tests/plugins/Dash/horizontaljournaltry.cpp+3−1

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadersectiontest.cpp+3−1

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertest.cpp+3−1

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/organicgridtry.cpp+3−1

This diff is too big to show here.

tests/plugins/Dash/verticaljournaltest.cpp+5−2

This diff is too big to show here.

tests/plugins/Dash/verticaljournaltry.cpp+3−1

This diff is too big to show here.

tests/plugins/GlobalShortcut/CMakeLists.txt+11−5

This diff is too big to show here.

tests/plugins/GlobalShortcut/GlobalShortcutTest.cpp+3−2

This diff is too big to show here.

tests/plugins/Greeter/Unity/Launcher/CMakeLists.txt+5−22

This diff is too big to show here.

tests/plugins/Greeter/Unity/Launcher/launchermodelastest.cpp+4−1

This diff is too big to show here.

tests/plugins/ImageCache/CMakeLists.txt+10

This diff is too big to show here.

tests/plugins/ImageCache/test.cpp+4−2

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/CMakeLists.txt+53−9

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/dbus.cpp+9−12

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/greeter.qml+2−7

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/promptsmodel.cppnew file+175

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/sessionsmodel.cpp+15−13

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/usersmodel.cpp+100−16

This diff is too big to show here.

tests/plugins/SessionBroadcast/CMakeLists.txt+6

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/CMakeLists.txt+8−4

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Unity/CMakeLists.txt+1

This diff is too big to show here.

tests/plugins/Unity/Indicators/CMakeLists.txt+11−1

This diff is too big to show here.

tests/plugins/Unity/Indicators/IndicatorsManagerTest.cpp+1−1

This diff is too big to show here.

tests/plugins/Unity/Indicators/IndicatorsModelTest.cpp+1−1

This diff is too big to show here.

tests/plugins/Unity/Launcher/CMakeLists.txt+13−4

This diff is too big to show here.

tests/plugins/Unity/Launcher/launchermodeltest.cpp+112−11

This diff is too big to show here.

tests/plugins/Unity/Platform/CMakeLists.txtnew file+30

This diff is too big to show here.

tests/plugins/Unity/Platform/platformtest.cppnew file+142

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Unity/Session/LogindServer.cpp+10

This diff is too big to show here.

tests/plugins/Unity/Session/LogindServer.h+5

This diff is too big to show here.

tests/plugins/Unity/Session/interfaces.xml+12

This diff is too big to show here.

tests/plugins/Unity/Session/preload.cnew file+43

This diff is too big to show here.

tests/plugins/Unity/Session/sessionbackendtest.cpp+130−11

This diff is too big to show here.

tests/plugins/Utils/CMakeLists.txt+11−1

This diff is too big to show here.

tests/plugins/Utils/DeviceConfigParserTest.cpp+4−1

This diff is too big to show here.

tests/plugins/Utils/WindowInputMonitorTest.cpp+107−10

This diff is too big to show here.

tests/plugins/Utils/WindowStateStorageTest.cppnew file+73

This diff is too big to show here.

tests/plugins/WindowManager/CMakeLists.txtnew file+34

This diff is too big to show here.

tests/plugins/WindowManager/UnityApplicationMocks.hnew file+210

This diff is too big to show here.

tests/plugins/WindowManager/tst_TopLevelWindowModel.cppnew file+130

This diff is too big to show here.

tests/plugins/Wizard/CMakeLists.txt+6

This diff is too big to show here.

tests/qmltests/ApplicationMenuDataLoader.qmlnew file+99

This diff is too big to show here.

tests/qmltests/ApplicationMenus/tst_MenuBar.qmlnew file+409

This diff is too big to show here.

tests/qmltests/ApplicationMenus/tst_MenuPopup.qmlnew file+360

This diff is too big to show here.

tests/qmltests/CMakeLists.txt+28−7

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle.cpp+4−2

This diff is too big to show here.

tests/qmltests/Components/tst_EdgeDragEvaluator.cpp+4−2

This diff is too big to show here.

tests/qmltests/Components/tst_VirtualTouchPad.qml+55−1

This diff is too big to show here.

tests/qmltests/Components/tst_ZoomableImage.qml+1−1

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_Preview.qml+63

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewExpandable.qml−5

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+13−13

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewPayments.qmldeleted−203

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+5−5

This diff is too big to show here.

tests/qmltests/Dash/tst_Dash.qml+9−54

This diff is too big to show here.

tests/qmltests/Dash/tst_DashContent.qml+4−4

This diff is too big to show here.

tests/qmltests/Dash/tst_DashShell.qml+9−70

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericScopeView.qml+6−22

This diff is too big to show here.

tests/qmltests/Greeter/TestView.qml+7−21

This diff is too big to show here.

tests/qmltests/Greeter/tst_Greeter.qml+62−117

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Greeter/tst_NarrowView.qml+20−43

This diff is too big to show here.

tests/qmltests/Greeter/tst_WideView.qml+145−122

This diff is too big to show here.

tests/qmltests/Launcher/tst_Drawer.qmlnew file+385

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Notifications/tst_Notifications.qml+11−11

This diff is too big to show here.

tests/qmltests/Notifications/tst_SwipeToAct.qml+5−5

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorItem.qml → tests/qmltests/Panel/Indicators/tst_IndicatorItem.qmlrenamed+1−1

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml → tests/qmltests/Panel/Indicators/tst_IndicatorMenuItemFactory.qmlrenamed+8−3

This diff is too big to show here.

tests/qmltests/Panel/IndicatorTest.qml → tests/qmltests/Panel/PanelTest.qmlrenamed−5

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Panel/tst_MenuContent.qml+14−2

This diff is too big to show here.

tests/qmltests/Panel/tst_Panel.qml+469−103

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorsBar.qml → tests/qmltests/Panel/tst_PanelBar.qmlrenamed+24−33

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorItemRow.qml → tests/qmltests/Panel/tst_PanelItemRow.qmlrenamed+36−32

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorsMenu.qml → tests/qmltests/Panel/tst_PanelMenu.qmlrenamed+32−14

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorPage.qml → tests/qmltests/Panel/tst_PanelMenuPage.qmlrenamed+53−47

This diff is too big to show here.

tests/qmltests/Stage/ApplicationCheckBox.qml+2−2

This diff is too big to show here.

tests/qmltests/Stage/tst_ApplicationWindow.qml+12−30

This diff is too big to show here.

tests/qmltests/Stage/tst_DecoratedWindow.qml+40−5

This diff is too big to show here.

tests/qmltests/Stage/tst_DesktopStage.qml+395−137

This diff is too big to show here.

tests/qmltests/Stage/tst_PhoneStage.qml+32−43

This diff is too big to show here.

tests/qmltests/Stage/tst_SurfaceContainer.qml+4

This diff is too big to show here.

tests/qmltests/Stage/tst_TabletStage.qml+60−11

This diff is too big to show here.

tests/qmltests/Stage/tst_WindowDecoration.qmlnew file+244

This diff is too big to show here.

tests/qmltests/Stage/tst_WindowResizeArea.qml+18−75

This diff is too big to show here.

tests/qmltests/Tutorial/tst_Tutorial.qml+36−13

This diff is too big to show here.

tests/qmltests/Wizard/tst_Wizard.qml−6

This diff is too big to show here.

tests/qmltests/tst_DisabledScreenNotice.qml+23−9

This diff is too big to show here.

tests/qmltests/tst_OrientedShell.qml+115−25

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+843−368

This diff is too big to show here.

tests/qmltests/tst_ShellWithPin.qml+37−122

This diff is too big to show here.

tests/scripts/alert-launcher-icon.sh+16

This diff is too big to show here.

tests/scripts/get-progress.sh+16

This diff is too big to show here.

tests/scripts/list-launcher-icons.sh+16

This diff is too big to show here.

tests/scripts/set-count-visible.sh+16

This diff is too big to show here.

tests/scripts/set-count.sh+16

This diff is too big to show here.

tests/scripts/set-progress.sh+16

This diff is too big to show here.

tests/uqmlscene/CMakeLists.txt+14−2

This diff is too big to show here.

tests/uqmlscene/main.cpp+7−3

This diff is too big to show here.

tests/utils/modules/Unity/Test/CMakeLists.txt+4−2

This diff is too big to show here.

tests/utils/modules/Unity/Test/StageTestCase.qmlnew file+68

This diff is too big to show here.

tests/utils/modules/Unity/Test/UnityTestCase.qml+8−18

This diff is too big to show here.

tests/utils/modules/Unity/Test/qmldir+2−1

This diff is too big to show here.

tests/utils/modules/Unity/Test/testutil.cpp+1−1

This diff is too big to show here.

tools/CMakeLists.txt+3−12

This diff is too big to show here.

src/Panel/Indicators/client/CMakeLists.txt → tools/indicatorsclient/CMakeLists.txtrenamed

The content is the same.

src/Panel/Indicators/client/indicatorsclient.cpp → tools/indicatorsclient/indicatorsclient.cpprenamed

The content is the same.

src/Panel/Indicators/client/indicatorsclient.h → tools/indicatorsclient/indicatorsclient.hrenamed

The content is the same.

src/Panel/Indicators/client/main.cpp → tools/indicatorsclient/main.cpprenamed

The content is the same.

tools/menutool/CMakeLists.txtnew file+5

This diff is too big to show here.

tools/menutool/READMEnew file+11

This diff is too big to show here.

tools/menutool/menutool.cppnew file+62

This diff is too big to show here.

tools/menutool/menutool.qmlnew file+118

This diff is too big to show here.

tools/scopetool/CMakeLists.txtnew file+12

This diff is too big to show here.

tools/registry-tracker.cpp → tools/scopetool/registry-tracker.cpprenamed

The content is the same.

tools/registry-tracker.h → tools/scopetool/registry-tracker.hrenamed

The content is the same.

tools/scopetool.cpp → tools/scopetool/scopetool.cpprenamed

The content is the same.

tools/unlock-device+16

This diff is too big to show here.