on xenial help sign in
merge
0650b49Larry Price
CMakeLists.txt+14−2
@@ -57,12 +57,24 @@ find_package(Qt5DBus 5.4 REQUIRED)
57find_package(Qt5Concurrent 5.4 REQUIRED)
57find_package(Qt5Concurrent 5.4 REQUIRED)
58find_package(Qt5Sql 5.4 REQUIRED)
58find_package(Qt5Sql 5.4 REQUIRED)
59
59
60−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=14)
60+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=19)
61pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
61pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
62pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
62pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
63pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
63pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
64pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
64pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
65
65
66+pkg_check_modules(UBUNTUGESTURES REQUIRED UbuntuGestures)
67+
68+### Check UbuntuGestures private headers. No pkg-config (.pc) file is provided for them
69+find_path(UBUNTUGESTUREPRIV
70+ NAMES UbuntuGestures/private/damper_p.h UbuntuGestures/private/ucswipearea_p.h UbuntuGestures/private/ucswipearea_p_p.h
71+ PATHS ${UBUNTUGESTURES_INCLUDEDIR}/UbuntuGestures/${UBUNTUGESTURES_VERSION}
72+ NO_DEFAULT_PATH)
73+if (${UBUNTUGESTUREPRIV} STREQUAL UBUNTUGESTUREPRIV-NOTFOUND)
74+ message(FATAL_ERROR "UbuntuGestures private headers not found.")
75+endif()
76+# end of UbuntuGesture private headers check
77+
66# Standard install paths
78# Standard install paths
67include(GNUInstallDirs)
79include(GNUInstallDirs)
68
80
@@ -116,6 +128,7 @@ set(SHELL_APP unity8)
116set(DASH_APP unity8-dash)
128set(DASH_APP unity8-dash)
117set(SCOPE_TOOL unity-scope-tool)
129set(SCOPE_TOOL unity-scope-tool)
118set(INDICATORS_CLIENT_APP indicators-client)
130set(INDICATORS_CLIENT_APP indicators-client)
131+set(GREETER_APP unity8-greeter)
119set(MOCK_INDICATOR_SERVICE_APP unity-mock-indicator-service)
132set(MOCK_INDICATOR_SERVICE_APP unity-mock-indicator-service)
120
133
121include_directories(
134include_directories(
@@ -144,7 +157,6 @@ endif()
144
157
145# add subdirectories to build
158# add subdirectories to build
146add_subdirectory(include)
159add_subdirectory(include)
147−add_subdirectory(libs)
148add_subdirectory(src)
160add_subdirectory(src)
149add_subdirectory(tools)
161add_subdirectory(tools)
150add_subdirectory(qml)
162add_subdirectory(qml)
build.sh+2−2
@@ -46,11 +46,11 @@ install_dependencies() {
46 qmenumodel-qml \
46 qmenumodel-qml \
47 qml-module-qtquick-layouts \
47 qml-module-qtquick-layouts \
48 qml-module-qtquick-xmllistmodel \
48 qml-module-qtquick-xmllistmodel \
49+ qml-module-ubuntu-components \
50+ qml-module-ubuntu-thumbnailer0.1 \
49 qtdeclarative5-gsettings1.0 \
51 qtdeclarative5-gsettings1.0 \
50− qtdeclarative5-ubuntu-ui-toolkit-plugin \
51 qtdeclarative5-ubuntu-settings-components \
52 qtdeclarative5-ubuntu-settings-components \
52 qtdeclarative5-ubuntu-telephony0.1 \
53 qtdeclarative5-ubuntu-telephony0.1 \
53− qtdeclarative5-ubuntu-thumbnailer0.1 \
54 qtdeclarative5-unity-notifications-plugin \
54 qtdeclarative5-unity-notifications-plugin \
55 qml-module-ubuntu-connectivity \
55 qml-module-ubuntu-connectivity \
56 ubuntu-mobile-icons \
56 ubuntu-mobile-icons \
data/51-unity8-greeter.confnew file+2
@@ -0,0 +1,2 @@
1+[Seat:*]
2+greeter-session=unity8-greeter
data/CMakeLists.txt+11
@@ -2,6 +2,7 @@
2configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
2configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
3configure_file(${DASH_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${DASH_APP}.desktop @ONLY)
3configure_file(${DASH_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${DASH_APP}.desktop @ONLY)
4configure_file(${INDICATORS_CLIENT_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop @ONLY)
4configure_file(${INDICATORS_CLIENT_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop @ONLY)
5+configure_file(${GREETER_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${GREETER_APP}.desktop @ONLY)
5
6
6# install desktop files
7# install desktop files
7install(FILES
8install(FILES
@@ -11,6 +12,16 @@ install(FILES
11 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
12 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
12 )
13 )
13
14
15+install(FILES
16+ ${CMAKE_CURRENT_BINARY_DIR}/${GREETER_APP}.desktop
17+ DESTINATION ${CMAKE_INSTALL_DATADIR}/lightdm/greeters
18+ )
19+
20+install(FILES
21+ 51-unity8-greeter.conf
22+ DESTINATION ${CMAKE_INSTALL_DATADIR}/lightdm/lightdm.conf.d
23+ )
24+
14# install dash icon
25# install dash icon
15install(FILES
26install(FILES
16 ${CMAKE_CURRENT_SOURCE_DIR}/${DASH_APP}.png
27 ${CMAKE_CURRENT_SOURCE_DIR}/${DASH_APP}.png
data/com.canonical.Unity8.gschema.xml+5
@@ -27,6 +27,11 @@
27 <summary>Maximum push needed to overcome edge barrier</summary>
27 <summary>Maximum push needed to overcome edge barrier</summary>
28 <description>How much you have to push (in grid units) the mouse against an edge barrier when sensibility is 1.</description>
28 <description>How much you have to push (in grid units) the mouse against an edge barrier when sensibility is 1.</description>
29 </key>
29 </key>
30+ <key type="u" name="edge-drag-width">
31+ <default>2</default>
32+ <summary>The width of the edge drag areas</summary>
33+ <description>How big (in grid units) the edge-drag sensitive area should be.</description>
34+ </key>
30 <key type="b" name="autohide-launcher">
35 <key type="b" name="autohide-launcher">
31 <default>true</default>
36 <default>true</default>
32 <summary>Autohide the launcher</summary>
37 <summary>Autohide the launcher</summary>
data/devices.confnew file+30
@@ -0,0 +1,30 @@
1+# This file can hold multiple device configs. Devices are separated by sections.
2+#
3+# SupportedOrientations holds a list of all enabled orientations. A standard
4+# phone will usually have Portrait,Landcape,InvertedLandscape in order to
5+# disable upside down usage.
6+#
7+# PrimaryOrientation gives the orientation the device will start up with
8+# when there is no orientations sensor input available (yet) or lock to
9+# when an application specifies to be locked to PrimaryOrientation.
10+#
11+# The other Orientation settings can be used to re-map the orientations.
12+# A device might be used with different orientations than how the screen
13+# is physically mounted on the hardware.
14+#
15+# Category can be phone, tablet, or desktop. This option determines
16+# whether the side stage is shown (tablet) or not (phone). Using
17+# desktop will load the shell in windowed mode. Note that the user
18+# can override/change this by connecting input hardware or change
19+# user settings.
20+#
21+# Any options not listed will default to the values of the example below.
22+
23+# [devicename]
24+# SupportedOrientations=Portrait,InvertedPortrait,Landscape,InvertedLandscape
25+# PrimaryOrientation=PrimaryOrienation
26+# PortraitOrientation=Portrait
27+# InvertedPortraitOrientation=InvertedPortrait
28+# LandscapeOrientation=Landscape
29+# InvertedLandscapeOrientation=InvertedLandscape
30+# Category=phone
data/unity8-dash.desktop.in−1
@@ -7,4 +7,3 @@ Terminal=false
7Icon=@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/Dash/unity8-dash.png
7Icon=@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/Dash/unity8-dash.png
8NoDisplay=true
8NoDisplay=true
9X-Ubuntu-Touch=true
9X-Ubuntu-Touch=true
10−X-Ubuntu-Supported-Orientations=primary
data/unity8-dash.png

Binary file not shown.

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

Binary file not shown.

plugins/Dash/horizontaljournal.cpp+1−4
@@ -26,12 +26,9 @@
26#include "horizontaljournal.h"
26#include "horizontaljournal.h"
27
27
28#include <qqmlengine.h>
28#include <qqmlengine.h>
29−#pragma GCC diagnostic push
30−#pragma GCC diagnostic ignored "-pedantic"
31−#include <private/qqmldelegatemodel_p.h>
32#include <qqmlinfo.h>
29#include <qqmlinfo.h>
30+#include <private/qqmldelegatemodel_p.h>
33#include <private/qquickitem_p.h>
31#include <private/qquickitem_p.h>
34−#pragma GCC diagnostic pop
35
32
36HorizontalJournal::HorizontalJournal()
33HorizontalJournal::HorizontalJournal()
37 : m_firstVisibleIndex(-1)
34 : m_firstVisibleIndex(-1)
plugins/Dash/listviewwithpageheader.cpp+56−36
@@ -95,13 +95,11 @@
95#include <QDebug>
95#include <QDebug>
96#include <qqmlinfo.h>
96#include <qqmlinfo.h>
97#include <qqmlengine.h>
97#include <qqmlengine.h>
98−#pragma GCC diagnostic push
98+#include <private/qqmlcontext_p.h>
99−#pragma GCC diagnostic ignored "-pedantic"
100#include <private/qqmldelegatemodel_p.h>
99#include <private/qqmldelegatemodel_p.h>
101#include <private/qqmlglobal_p.h>
100#include <private/qqmlglobal_p.h>
102#include <private/qquickitem_p.h>
101#include <private/qquickitem_p.h>
103#include <private/qquickanimation_p.h>
102#include <private/qquickanimation_p.h>
104−#pragma GCC diagnostic pop
105// #include <private/qquickrectangle_p.h>
103// #include <private/qquickrectangle_p.h>
106
104
107qreal ListViewWithPageHeader::ListItem::height() const
105qreal ListViewWithPageHeader::ListItem::height() const
@@ -168,7 +166,7 @@ ListViewWithPageHeader::ListViewWithPageHeader()
168 m_contentYAnimation->setDuration(200);
166 m_contentYAnimation->setDuration(200);
169 m_contentYAnimation->setTargetObject(this);
167 m_contentYAnimation->setTargetObject(this);
170
168
171− connect(this, &ListViewWithPageHeader::contentWidthChanged, this, &ListViewWithPageHeader::onContentWidthChanged);
169+ connect(contentItem(), &QQuickItem::widthChanged, this, &ListViewWithPageHeader::onContentWidthChanged);
172 connect(this, &ListViewWithPageHeader::contentHeightChanged, this, &ListViewWithPageHeader::onContentHeightChanged);
170 connect(this, &ListViewWithPageHeader::contentHeightChanged, this, &ListViewWithPageHeader::onContentHeightChanged);
173 connect(this, &ListViewWithPageHeader::heightChanged, this, &ListViewWithPageHeader::onHeightChanged);
171 connect(this, &ListViewWithPageHeader::heightChanged, this, &ListViewWithPageHeader::onHeightChanged);
174 connect(m_contentYAnimation, &QQuickNumberAnimation::runningChanged, this, &ListViewWithPageHeader::contentYAnimationRunningChanged);
172 connect(m_contentYAnimation, &QQuickNumberAnimation::runningChanged, this, &ListViewWithPageHeader::contentYAnimationRunningChanged);
@@ -255,6 +253,7 @@ void ListViewWithPageHeader::setHeader(QQuickItem *headerItem)
255 oldHeaderHeight = m_headerItem->height();
253 oldHeaderHeight = m_headerItem->height();
256 oldHeaderY = m_headerItem->y();
254 oldHeaderY = m_headerItem->y();
257 m_headerItem->setParentItem(nullptr);
255 m_headerItem->setParentItem(nullptr);
256+ QQuickItemPrivate::get(m_headerItem)->removeItemChangeListener(this, QQuickItemPrivate::ImplicitHeight);
258 }
257 }
259 m_headerItem = headerItem;
258 m_headerItem = headerItem;
260 if (m_headerItem) {
259 if (m_headerItem) {
@@ -285,10 +284,12 @@ void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
285
284
286 m_sectionDelegate = delegate;
285 m_sectionDelegate = delegate;
287
286
288− m_topSectionItem = getSectionItem(QString());
287+ m_topSectionItem = getSectionItem(QString(), false /*watchGeometry*/);
288+ if (m_topSectionItem) {
289− m_topSectionItem->setZ(3);
289+ m_topSectionItem->setZ(3);
290− QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
290+ QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
291− connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
291+ connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
292+ }
292
293
293 // TODO create sections for existing items
294 // TODO create sections for existing items
294
295
@@ -514,6 +515,11 @@ qreal ListViewWithPageHeader::minYExtent() const
514 return m_minYExtent;
515 return m_minYExtent;
515}
516}
516
517
518+qreal ListViewWithPageHeader::maxYExtent() const
519+{
520+ return height() - contentHeight();
521+}
522+
517void ListViewWithPageHeader::componentComplete()
523void ListViewWithPageHeader::componentComplete()
518{
524{
519 if (m_delegateModel)
525 if (m_delegateModel)
@@ -694,14 +700,18 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
694 if (flags & QQmlDelegateModel::Destroyed) {
700 if (flags & QQmlDelegateModel::Destroyed) {
695 item->setParentItem(nullptr);
701 item->setParentItem(nullptr);
696 }
702 }
703+ if (listItem->sectionItem()) {
697− listItem->sectionItem()->deleteLater();
704+ listItem->sectionItem()->deleteLater();
705+ }
698 delete listItem;
706 delete listItem;
699}
707}
700
708
701void ListViewWithPageHeader::releaseItem(ListItem *listItem)
709void ListViewWithPageHeader::releaseItem(ListItem *listItem)
702{
710{
703− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
711+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
712+ if (listItem->sectionItem()) {
704− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
713+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
714+ }
705 m_itemsToRelease << listItem;
715 m_itemsToRelease << listItem;
706}
716}
707
717
@@ -744,14 +754,12 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
744 return getSectionItem(section);
754 return getSectionItem(section);
745}
755}
746
756
747−QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
757+QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText, bool watchGeometry)
748{
758{
749 QQuickItem *sectionItem = nullptr;
759 QQuickItem *sectionItem = nullptr;
750
760
751 QQmlContext *creationContext = m_sectionDelegate->creationContext();
761 QQmlContext *creationContext = m_sectionDelegate->creationContext();
752 QQmlContext *context = new QQmlContext(creationContext ? creationContext : qmlContext(this));
762 QQmlContext *context = new QQmlContext(creationContext ? creationContext : qmlContext(this));
753− context->setContextProperty(QStringLiteral("section"), sectionText);
754− context->setContextProperty(QStringLiteral("delegateIndex"), -1);
755 QObject *nobj = m_sectionDelegate->beginCreate(context);
763 QObject *nobj = m_sectionDelegate->beginCreate(context);
756 if (nobj) {
764 if (nobj) {
757 QQml_setParent_noEvent(context, nobj);
765 QQml_setParent_noEvent(context, nobj);
@@ -759,6 +767,8 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
759 if (!sectionItem) {
767 if (!sectionItem) {
760 delete nobj;
768 delete nobj;
761 } else {
769 } else {
770+ sectionItem->setProperty("text", sectionText);
771+ sectionItem->setProperty("delegateIndex", -1);
762 sectionItem->setZ(2);
772 sectionItem->setZ(2);
763 QQml_setParent_noEvent(sectionItem, m_clipItem);
773 QQml_setParent_noEvent(sectionItem, m_clipItem);
764 sectionItem->setParentItem(m_clipItem);
774 sectionItem->setParentItem(m_clipItem);
@@ -768,7 +778,9 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
768 }
778 }
769 m_sectionDelegate->completeCreate();
779 m_sectionDelegate->completeCreate();
770
780
771− // TODO attach to sectionItem so we can accomodate to it changing its height
781+ if (watchGeometry && sectionItem) {
782+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
783+ }
772
784
773 return sectionItem;
785 return sectionItem;
774}
786}
@@ -792,8 +804,7 @@ void ListViewWithPageHeader::updateSectionItem(int modelIndex)
792 if (!item->sectionItem()) {
804 if (!item->sectionItem()) {
793 item->setSectionItem(getSectionItem(sectionText));
805 item->setSectionItem(getSectionItem(sectionText));
794 } else {
806 } else {
795− QQmlContext *context = QQmlEngine::contextForObject(item->sectionItem())->parentContext();
807+ item->sectionItem()->setProperty("text", sectionText);
796− context->setContextProperty(QStringLiteral("section"), sectionText);
797 }
808 }
798 } else {
809 } else {
799 if (item->sectionItem()) {
810 if (item->sectionItem()) {
@@ -914,8 +925,7 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
914 polish();
925 polish();
915 }
926 }
916 if (listItem->sectionItem()) {
927 if (listItem->sectionItem()) {
917− QQmlContext *context = QQmlEngine::contextForObject(listItem->sectionItem())->parentContext();
918− context->setContextProperty(QStringLiteral("delegateIndex"), modelIndex);
928+ listItem->sectionItem()->setProperty("delegateIndex", modelIndex);
919 }
929 }
920 adjustMinYExtent();
930 adjustMinYExtent();
921 m_contentHeightDirty = true;
931 m_contentHeightDirty = true;
@@ -939,9 +949,10 @@ void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
939 return;
949 return;
940
950
941 item->setParentItem(m_clipItem);
951 item->setParentItem(m_clipItem);
952+ // FIXME Why do we need the refreshExpressions call?
942 QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
953 QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
943− context->setContextProperty(QStringLiteral("ListViewWithPageHeader"), this);
954+ QQmlContextPrivate::get(context)->data->refreshExpressions();
944− context->setContextProperty(QStringLiteral("heightToClip"), QVariant::fromValue<int>(0));
955+ item->setProperty("heightToClip", QVariant::fromValue<int>(0));
945 if (modelIndex == m_asyncRequestedIndex) {
956 if (modelIndex == m_asyncRequestedIndex) {
946 createItem(modelIndex, false);
957 createItem(modelIndex, false);
947 refill();
958 refill();
@@ -1107,8 +1118,7 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
1107 for (int i = 0; i < m_visibleItems.count(); ++i) {
1118 for (int i = 0; i < m_visibleItems.count(); ++i) {
1108 ListItem *item = m_visibleItems[i];
1119 ListItem *item = m_visibleItems[i];
1109 if (item->sectionItem()) {
1120 if (item->sectionItem()) {
1110− QQmlContext *context = QQmlEngine::contextForObject(item->sectionItem())->parentContext();
1111− context->setContextProperty(QStringLiteral("delegateIndex"), m_firstVisibleIndex + i);
1121+ item->sectionItem()->setProperty("delegateIndex", m_firstVisibleIndex + i);
1112 }
1122 }
1113 }
1123 }
1114
1124
@@ -1126,15 +1136,23 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
1126 }
1136 }
1127}
1137}
1128
1138
1129−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1139+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
1130{
1140{
1131 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1141 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1132 if (heightDiff != 0) {
1142 if (heightDiff != 0) {
1133− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1143+ if (!m_visibleItems.isEmpty()) {
1134 ListItem *firstItem = m_visibleItems.first();
1144 ListItem *firstItem = m_visibleItems.first();
1145+ const auto prevFirstItemY = firstItem->y();
1146+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1135− firstItem->setY(firstItem->y() - heightDiff);
1147+ firstItem->setY(firstItem->y() - heightDiff);
1148+ } else if (item == firstItem->sectionItem()) {
1149+ firstItem->setY(firstItem->y() + heightDiff);
1150+ }
1151+
1152+ if (firstItem->y() != prevFirstItemY) {
1136− adjustMinYExtent();
1153+ adjustMinYExtent();
1137− layout();
1154+ layout();
1155+ }
1138 }
1156 }
1139 refill();
1157 refill();
1140 adjustMinYExtent();
1158 adjustMinYExtent();
@@ -1186,7 +1204,7 @@ void ListViewWithPageHeader::headerHeightChanged(qreal newHeaderHeight, qreal ol
1186
1204
1187void ListViewWithPageHeader::adjustMinYExtent()
1205void ListViewWithPageHeader::adjustMinYExtent()
1188{
1206{
1189− if (m_visibleItems.isEmpty() || contentHeight() < height()) {
1207+ if (m_visibleItems.isEmpty() || (contentHeight() + m_minYExtent < height())) {
1190 m_minYExtent = 0;
1208 m_minYExtent = 0;
1191 } else {
1209 } else {
1192 qreal nonCreatedHeight = 0;
1210 qreal nonCreatedHeight = 0;
@@ -1270,8 +1288,7 @@ void ListViewWithPageHeader::layout()
1270 } else {
1288 } else {
1271 // Update the top sticky section header
1289 // Update the top sticky section header
1272 const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
1290 const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
1273− QQmlContext *context = QQmlEngine::contextForObject(m_topSectionItem)->parentContext();
1291+ m_topSectionItem->setProperty("text", section);
1274− context->setContextProperty(QStringLiteral("section"), section);
1275
1292
1276 QQuickItemPrivate::get(m_topSectionItem)->setCulled(false);
1293 QQuickItemPrivate::get(m_topSectionItem)->setCulled(false);
1277 m_topSectionItem->setY(topSectionStickPos);
1294 m_topSectionItem->setY(topSectionStickPos);
@@ -1283,19 +1300,18 @@ void ListViewWithPageHeader::layout()
1283 break;
1300 break;
1284 delegateIndex--;
1301 delegateIndex--;
1285 }
1302 }
1286− context->setContextProperty(QStringLiteral("delegateIndex"), delegateIndex);
1303+ m_topSectionItem->setProperty("delegateIndex", delegateIndex);
1287 if (item->sectionItem()) {
1304 if (item->sectionItem()) {
1288 QQuickItemPrivate::get(item->sectionItem())->setCulled(true);
1305 QQuickItemPrivate::get(item->sectionItem())->setCulled(true);
1289 }
1306 }
1290 }
1307 }
1291 }
1308 }
1292 }
1309 }
1293− QQmlContext *context = QQmlEngine::contextForObject(item->m_item)->parentContext();
1294 const qreal clipFrom = visibleFrom + (!item->sectionItem() && m_topSectionItem && !QQuickItemPrivate::get(m_topSectionItem)->culled ? m_topSectionItem->height() : 0);
1310 const qreal clipFrom = visibleFrom + (!item->sectionItem() && m_topSectionItem && !QQuickItemPrivate::get(m_topSectionItem)->culled ? m_topSectionItem->height() : 0);
1295 if (!cull && pos < clipFrom) {
1311 if (!cull && pos < clipFrom) {
1296− context->setContextProperty(QStringLiteral("heightToClip"), clipFrom - pos);
1312+ item->m_item->setProperty("heightToClip", clipFrom - pos);
1297 } else {
1313 } else {
1298− context->setContextProperty(QStringLiteral("heightToClip"), QVariant::fromValue<int>(0));
1314+ item->m_item->setProperty("heightToClip", QVariant::fromValue<int>(0));
1299 }
1315 }
1300// qDebug() << "ListViewWithPageHeader::layout" << item->m_item;
1316// qDebug() << "ListViewWithPageHeader::layout" << item->m_item;
1301 pos += item->height();
1317 pos += item->height();
@@ -1318,6 +1334,10 @@ void ListViewWithPageHeader::layout()
1318 }
1334 }
1319 }
1335 }
1320 }
1336 }
1337+ if (m_headerItem) {
1338+ const bool cullHeader = m_headerItem->y() + m_headerItem->height() < contentY();
1339+ QQuickItemPrivate::get(m_headerItem)->setCulled(cullHeader);
1340+ }
1321 m_inLayout = false;
1341 m_inLayout = false;
1322}
1342}
1323
1343
@@ -1368,7 +1388,7 @@ void ListViewWithPageHeader::updatePolish()
1368
1388
1369 m_contentHeightDirty = false;
1389 m_contentHeightDirty = false;
1370 adjustMinYExtent();
1390 adjustMinYExtent();
1371− if (contentHeight < height()) {
1391+ if (contentHeight + m_minYExtent < height()) {
1372 // need this since in the previous call to adjustMinYExtent contentHeight is not set yet
1392 // need this since in the previous call to adjustMinYExtent contentHeight is not set yet
1373 m_minYExtent = 0;
1393 m_minYExtent = 0;
1374 }
1394 }
plugins/Dash/listviewwithpageheader.h+2−1
@@ -115,6 +115,7 @@ protected:
115 void componentComplete() override;
115 void componentComplete() override;
116 void viewportMoved(Qt::Orientations orient) override;
116 void viewportMoved(Qt::Orientations orient) override;
117 qreal minYExtent() const override;
117 qreal minYExtent() const override;
118+ qreal maxYExtent() const override;
118 void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
119 void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
119 void itemImplicitHeightChanged(QQuickItem *item) override;
120 void itemImplicitHeightChanged(QQuickItem *item) override;
120 void updatePolish() override;
121 void updatePolish() override;
@@ -166,7 +167,7 @@ private:
166 void reallyReleaseItem(ListItem *item);
167 void reallyReleaseItem(ListItem *item);
167 void updateWatchedRoles();
168 void updateWatchedRoles();
168 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169− QQuickItem *getSectionItem(const QString &sectionText);
170+ QQuickItem *getSectionItem(const QString &sectionText, bool watchGeometry = true);
170 void updateSectionItem(int modelIndex);
171 void updateSectionItem(int modelIndex);
171 void initializeValuesForEmptyList();
172 void initializeValuesForEmptyList();
172
173
plugins/Dash/organicgrid.cpp+3−4
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014, 2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -16,10 +16,9 @@
16
16
17#include "organicgrid.h"
17#include "organicgrid.h"
18
18
19−#pragma GCC diagnostic push
19+#include <math.h>
20−#pragma GCC diagnostic ignored "-pedantic"
20+
21#include <private/qquickitem_p.h>
21#include <private/qquickitem_p.h>
22−#pragma GCC diagnostic pop
23
22
24OrganicGrid::OrganicGrid()
23OrganicGrid::OrganicGrid()
25 : m_firstVisibleIndex(-1)
24 : m_firstVisibleIndex(-1)
plugins/Dash/qmldir+1
@@ -5,6 +5,7 @@ singleton CardCreatorCache 0.1 CardCreatorCache.qml
5singleton DashAudioPlayer 0.1 DashAudioPlayer.qml
5singleton DashAudioPlayer 0.1 DashAudioPlayer.qml
6ScopeStyle 0.1 ScopeStyle.qml
6ScopeStyle 0.1 ScopeStyle.qml
7CardAttributes 0.1 CardAttributes.qml
7CardAttributes 0.1 CardAttributes.qml
8+CardSocialActions 0.1 CardSocialActions.qml
8CroppedImageMinimumSourceSize 0.1 CroppedImageMinimumSourceSize.qml
9CroppedImageMinimumSourceSize 0.1 CroppedImageMinimumSourceSize.qml
9AudioProgressBar 0.1 AudioProgressBar.qml
10AudioProgressBar 0.1 AudioProgressBar.qml
10CardAudioProgress 0.1 CardAudioProgress.qml
11CardAudioProgress 0.1 CardAudioProgress.qml
plugins/Dash/verticaljournal.cpp+3−4
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -27,10 +27,9 @@
27 */
27 */
28#include "verticaljournal.h"
28#include "verticaljournal.h"
29
29
30−#pragma GCC diagnostic push
30+#include <math.h>
31−#pragma GCC diagnostic ignored "-pedantic"
31+
32#include <private/qquickitem_p.h>
32#include <private/qquickitem_p.h>
33−#pragma GCC diagnostic pop
34
33
35VerticalJournal::VerticalJournal()
34VerticalJournal::VerticalJournal()
36 : m_columnWidth(0)
35 : m_columnWidth(0)
plugins/GlobalShortcut/GlobalShortcut.qmltypesdeleted−31
@@ -1,31 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable GlobalShortcut 1.0 plugins'
8−
9−Module {
10− Component {
11− name: "GlobalShortcut"
12− defaultProperty: "data"
13− prototype: "QQuickItem"
14− exports: ["GlobalShortcut/GlobalShortcut 1.0"]
15− exportMetaObjectRevisions: [0]
16− Property { name: "shortcut"; type: "QVariant" }
17− Property { name: "active"; type: "bool" }
18− Signal {
19− name: "shortcutChanged"
20− Parameter { name: "shortcut"; type: "QVariant" }
21− }
22− Signal {
23− name: "triggered"
24− Parameter { name: "shortcut"; type: "string" }
25− }
26− Signal {
27− name: "activeChanged"
28− Parameter { name: "active"; type: "bool" }
29− }
30− }
31−}
plugins/Greeter/Unity/Launcher/CMakeLists.txt+1−1
@@ -1,4 +1,4 @@
1−pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=7)
1+pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=9)
2pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
2pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
3
3
4add_definitions(-DSM_BUSNAME=systemBus)
4add_definitions(-DSM_BUSNAME=systemBus)
plugins/Greeter/Unity/Launcher/Launcher.qmltypesdeleted−182
@@ -1,182 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Launcher 0.1 plugins/Greeter'
8−
9−Module {
10− Component {
11− name: "LauncherItem"
12− prototype: "unity::shell::launcher::LauncherItemInterface"
13− exports: ["Unity.Launcher/LauncherItem 0.1"]
14− isCreatable: false
15− exportMetaObjectRevisions: [0]
16− }
17− Component {
18− name: "LauncherModel"
19− prototype: "unity::shell::launcher::LauncherModelInterface"
20− exports: ["Unity.Launcher/LauncherModel 0.1"]
21− isCreatable: false
22− isSingleton: true
23− exportMetaObjectRevisions: [0]
24− Method {
25− name: "requestRemove"
26− Parameter { name: "appId"; type: "string" }
27− }
28− Method { name: "refresh" }
29− Method {
30− name: "get"
31− type: "unity::shell::launcher::LauncherItemInterface*"
32− Parameter { name: "index"; type: "int" }
33− }
34− Method {
35− name: "move"
36− Parameter { name: "oldIndex"; type: "int" }
37− Parameter { name: "newIndex"; type: "int" }
38− }
39− Method {
40− name: "pin"
41− Parameter { name: "appId"; type: "string" }
42− Parameter { name: "index"; type: "int" }
43− }
44− Method {
45− name: "pin"
46− Parameter { name: "appId"; type: "string" }
47− }
48− Method {
49− name: "quickListActionInvoked"
50− Parameter { name: "appId"; type: "string" }
51− Parameter { name: "actionIndex"; type: "int" }
52− }
53− Method {
54− name: "setUser"
55− Parameter { name: "username"; type: "string" }
56− }
57− Method {
58− name: "getUrlForAppId"
59− type: "string"
60− Parameter { name: "appId"; type: "string" }
61− }
62− }
63− Component {
64− name: "QuickListModel"
65− prototype: "unity::shell::launcher::QuickListModelInterface"
66− exports: ["Unity.Launcher/QuickListModel 0.1"]
67− isCreatable: false
68− exportMetaObjectRevisions: [0]
69− }
70− Component {
71− name: "unity::shell::launcher::LauncherItemInterface"
72− prototype: "QObject"
73− exports: ["Unity.Launcher/LauncherItemInterface 0.1"]
74− isCreatable: false
75− exportMetaObjectRevisions: [0]
76− Property { name: "appId"; type: "string"; isReadonly: true }
77− Property { name: "name"; type: "string"; isReadonly: true }
78− Property { name: "icon"; type: "string"; isReadonly: true }
79− Property { name: "pinned"; type: "bool"; isReadonly: true }
80− Property { name: "running"; type: "bool"; isReadonly: true }
81− Property { name: "recent"; type: "bool"; isReadonly: true }
82− Property { name: "progress"; type: "int"; isReadonly: true }
83− Property { name: "count"; type: "int"; isReadonly: true }
84− Property { name: "countVisible"; type: "bool"; isReadonly: true }
85− Property { name: "focused"; type: "bool"; isReadonly: true }
86− Property {
87− name: "quickList"
88− type: "unity::shell::launcher::QuickListModelInterface"
89− isReadonly: true
90− isPointer: true
91− }
92− Signal {
93− name: "nameChanged"
94− Parameter { name: "name"; type: "string" }
95− }
96− Signal {
97− name: "iconChanged"
98− Parameter { name: "icon"; type: "string" }
99− }
100− Signal {
101− name: "pinnedChanged"
102− Parameter { name: "pinned"; type: "bool" }
103− }
104− Signal {
105− name: "runningChanged"
106− Parameter { name: "running"; type: "bool" }
107− }
108− Signal {
109− name: "recentChanged"
110− Parameter { name: "running"; type: "bool" }
111− }
112− Signal {
113− name: "progressChanged"
114− Parameter { name: "progress"; type: "int" }
115− }
116− Signal {
117− name: "countChanged"
118− Parameter { name: "count"; type: "int" }
119− }
120− Signal {
121− name: "countVisibleChanged"
122− Parameter { name: "countVisible"; type: "bool" }
123− }
124− Signal {
125− name: "focusedChanged"
126− Parameter { name: "focused"; type: "bool" }
127− }
128− }
129− Component {
130− name: "unity::shell::launcher::LauncherModelInterface"
131− prototype: "QAbstractListModel"
132− exports: ["Unity.Launcher/LauncherModelInterface 0.1"]
133− isCreatable: false
134− exportMetaObjectRevisions: [0]
135− Property {
136− name: "applicationManager"
137− type: "unity::shell::application::ApplicationManagerInterface"
138− isPointer: true
139− }
140− Property { name: "onlyPinned"; type: "bool" }
141− Signal { name: "hint" }
142− Method {
143− name: "move"
144− Parameter { name: "oldIndex"; type: "int" }
145− Parameter { name: "newIndex"; type: "int" }
146− }
147− Method {
148− name: "get"
149− type: "unity::shell::launcher::LauncherItemInterface*"
150− Parameter { name: "index"; type: "int" }
151− }
152− Method {
153− name: "pin"
154− Parameter { name: "appId"; type: "string" }
155− Parameter { name: "index"; type: "int" }
156− }
157− Method {
158− name: "pin"
159− Parameter { name: "appId"; type: "string" }
160− }
161− Method {
162− name: "requestRemove"
163− Parameter { name: "appId"; type: "string" }
164− }
165− Method {
166− name: "quickListActionInvoked"
167− Parameter { name: "appId"; type: "string" }
168− Parameter { name: "actionIndex"; type: "int" }
169− }
170− Method {
171− name: "setUser"
172− Parameter { name: "username"; type: "string" }
173− }
174− }
175− Component {
176− name: "unity::shell::launcher::QuickListModelInterface"
177− prototype: "QAbstractListModel"
178− exports: ["Unity.Launcher/QuickListInterface 0.1"]
179− isCreatable: false
180− exportMetaObjectRevisions: [0]
181− }
182−}
plugins/Greeter/Unity/Launcher/launcheritem.cpp+14
@@ -32,6 +32,7 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
32 m_countVisible(false),
32 m_countVisible(false),
33 m_focused(false),
33 m_focused(false),
34 m_alerting(false),
34 m_alerting(false),
35+ m_surfaceCount(0),
35 m_quickList(new QuickListModel(this))
36 m_quickList(new QuickListModel(this))
36{
37{
37 QuickListEntry nameAction;
38 QuickListEntry nameAction;
@@ -179,6 +180,19 @@ void LauncherItem::setAlerting(bool alerting)
179 }
180 }
180}
181}
181
182
183+int LauncherItem::surfaceCount() const
184+{
185+ return m_surfaceCount;
186+}
187+
188+void LauncherItem::setSurfaceCount(int surfaceCount)
189+{
190+ if (m_surfaceCount != surfaceCount) {
191+ m_surfaceCount = surfaceCount;
192+ Q_EMIT surfaceCountChanged(surfaceCount);
193+ }
194+}
195+
182unity::shell::launcher::QuickListModelInterface *LauncherItem::quickList() const
196unity::shell::launcher::QuickListModelInterface *LauncherItem::quickList() const
183{
197{
184 return m_quickList;
198 return m_quickList;
plugins/Greeter/Unity/Launcher/launcheritem.h+3−1
@@ -42,6 +42,7 @@ public:
42 bool countVisible() const override;
42 bool countVisible() const override;
43 bool focused() const override;
43 bool focused() const override;
44 bool alerting() const override;
44 bool alerting() const override;
45+ int surfaceCount() const override;
45
46
46 unity::shell::launcher::QuickListModelInterface *quickList() const override;
47 unity::shell::launcher::QuickListModelInterface *quickList() const override;
47
48
@@ -56,7 +57,7 @@ private:
56 void setCountVisible(bool countVisible);
57 void setCountVisible(bool countVisible);
57 void setFocused(bool focused);
58 void setFocused(bool focused);
58 void setAlerting(bool alerting);
59 void setAlerting(bool alerting);
59−
60+ void setSurfaceCount(int surfaceCount);
60
61
61private:
62private:
62 QString m_appId;
63 QString m_appId;
@@ -70,6 +71,7 @@ private:
70 bool m_countVisible;
71 bool m_countVisible;
71 bool m_focused;
72 bool m_focused;
72 bool m_alerting;
73 bool m_alerting;
74+ int m_surfaceCount;
73 QuickListModel *m_quickList;
75 QuickListModel *m_quickList;
74
76
75 friend class LauncherModel;
77 friend class LauncherModel;
plugins/Greeter/Unity/Launcher/launchermodelas.cpp+2−7
@@ -69,18 +69,13 @@ QVariant LauncherModel::data(const QModelIndex &index, int role) const
69 return item->focused();
69 return item->focused();
70 case RoleRunning:
70 case RoleRunning:
71 return item->running();
71 return item->running();
72+ case RoleSurfaceCount:
73+ return item->surfaceCount();
72 }
74 }
73
75
74 return QVariant();
76 return QVariant();
75}
77}
76
78
77−void LauncherModel::setAlerting(const QString &appId, bool alerting)
78−{
79− Q_UNUSED(appId)
80− Q_UNUSED(alerting)
81− qWarning() << "This is a read only implementation. Cannot set alert-state of items.";
82−}
83−
84unity::shell::launcher::LauncherItemInterface *LauncherModel::get(int index) const
79unity::shell::launcher::LauncherItemInterface *LauncherModel::get(int index) const
85{
80{
86 if (index < 0 || index >= m_list.count()) {
81 if (index < 0 || index >= m_list.count()) {
plugins/Greeter/Unity/Launcher/launchermodelas.h−1
@@ -41,7 +41,6 @@ public:
41
41
42 QVariant data(const QModelIndex &index, int role) const override;
42 QVariant data(const QModelIndex &index, int role) const override;
43
43
44− Q_INVOKABLE void setAlerting(const QString &appId, bool alerting) override;
45 Q_INVOKABLE unity::shell::launcher::LauncherItemInterface* get(int index) const override;
44 Q_INVOKABLE unity::shell::launcher::LauncherItemInterface* get(int index) const override;
46 Q_INVOKABLE void move(int oldIndex, int newIndex) override;
45 Q_INVOKABLE void move(int oldIndex, int newIndex) override;
47 Q_INVOKABLE void pin(const QString &appId, int index = -1) override;
46 Q_INVOKABLE void pin(const QString &appId, int index = -1) override;
plugins/IntegratedLightDM/CMakeLists.txtdeleted−40
@@ -1,40 +0,0 @@
1−pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
2−# TODO: Once we split out a separate greeter process, uncomment these lines
3−#pkg_check_modules(LIBLIGHTDM REQUIRED liblightdm-qt5-2)
4−
5−add_subdirectory(liblightdm)
6−
7−include_directories(
8− ${CMAKE_CURRENT_SOURCE_DIR}
9− ${CMAKE_CURRENT_BINARY_DIR}
10− ${CMAKE_SOURCE_DIR}/plugins/Utils
11− ${CMAKE_SOURCE_DIR}/tests/mocks/IntegratedLightDM
12− #${LIBLIGHTDM_INCLUDE_DIRS}
13− ${libunity8-private_SOURCE_DIR}
14− ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
15−)
16−
17−set(QMLPLUGIN_SRC
18− ../Utils/unitysortfilterproxymodelqml.cpp # FIXME evaluate a more generic approach for using other plugins
19− DBusGreeter.cpp
20− DBusGreeterList.cpp
21− Greeter.cpp
22− plugin.cpp
23− UsersModel.cpp
24− )
25−
26−add_library(IntegratedLightDM-qml MODULE
27− ${QMLPLUGIN_SRC}
28− )
29−
30−target_link_libraries(IntegratedLightDM-qml
31− integratedLightDM
32− unity8-private
33−# TODO: Once we split out a separate greeter process, uncomment these lines
34−# ${LIBLIGHTDM_LDFLAGS}
35− ${LIBUSERMETRICSOUTPUT_LDFLAGS}
36− )
37−
38−qt5_use_modules(IntegratedLightDM-qml DBus Gui Qml)
39−
40−add_unity8_plugin(IntegratedLightDM 0.1 IntegratedLightDM TARGETS IntegratedLightDM-qml)
plugins/LightDM/CMakeLists.txtnew file+26
@@ -0,0 +1,26 @@
1+pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
2+
3+find_package(Qt5Core REQUIRED)
4+find_package(Qt5Quick REQUIRED)
5+
6+include_directories(
7+ ${CMAKE_CURRENT_SOURCE_DIR}
8+ ${CMAKE_CURRENT_BINARY_DIR}
9+ ${CMAKE_SOURCE_DIR}/plugins/Utils
10+ ${CMAKE_BINARY_DIR}/tests/mocks/LightDM/IntegratedLightDM
11+ ${libunity8-private_SOURCE_DIR}
12+ ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
13+)
14+
15+set(QMLPLUGIN_SRC
16+ ../Utils/unitysortfilterproxymodelqml.cpp
17+ DBusGreeter.cpp
18+ DBusGreeterList.cpp
19+ Greeter.cpp
20+ plugin.cpp
21+ SessionsModel.cpp
22+ UsersModel.cpp
23+ )
24+
25+add_subdirectory(FullLightDM)
26+add_subdirectory(IntegratedLightDM)
plugins/IntegratedLightDM/DBusGreeter.cpp → plugins/LightDM/DBusGreeter.cpprenamed+5−4
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014, 2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -24,7 +24,8 @@ DBusGreeter::DBusGreeter(Greeter *greeter, const QString &path)
24 : UnityDBusObject(path, QStringLiteral("com.canonical.UnityGreeter"), true, greeter),
24 : UnityDBusObject(path, QStringLiteral("com.canonical.UnityGreeter"), true, greeter),
25 m_greeter(greeter)
25 m_greeter(greeter)
26{
26{
27− connect(m_greeter, &Greeter::isActiveChanged, this, &DBusGreeter::isActiveChangedHandler);
27+ connect(m_greeter, &Greeter::isActiveChanged,
28+ this, &DBusGreeter::isActiveChangedHandler);
28}
29}
29
30
30bool DBusGreeter::isActive() const
31bool DBusGreeter::isActive() const
@@ -34,12 +35,12 @@ bool DBusGreeter::isActive() const
34
35
35void DBusGreeter::ShowGreeter()
36void DBusGreeter::ShowGreeter()
36{
37{
37− return Q_EMIT m_greeter->showGreeter();
38+ Q_EMIT m_greeter->showGreeter();
38}
39}
39
40
40void DBusGreeter::HideGreeter()
41void DBusGreeter::HideGreeter()
41{
42{
42− return Q_EMIT m_greeter->hideGreeter();
43+ Q_EMIT m_greeter->hideGreeter();
43}
44}
44
45
45void DBusGreeter::isActiveChangedHandler()
46void DBusGreeter::isActiveChangedHandler()
plugins/IntegratedLightDM/DBusGreeter.h → plugins/LightDM/DBusGreeter.hrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

plugins/LightDM/FullLightDM/CMakeLists.txtnew file+28
@@ -0,0 +1,28 @@
1+pkg_check_modules(LIBLIGHTDM REQUIRED liblightdm-qt5-3)
2+
3+set(PLUGIN_CLASSNAME "FullLightDM")
4+
5+add_definitions(-DFULL_LIGHTDM)
6+
7+include_directories(
8+ ../
9+ ${LIBLIGHTDM_INCLUDE_DIRS}
10+ ${CMAKE_CURRENT_BINARY_DIR}
11+ )
12+
13+foreach(source_file ${QMLPLUGIN_SRC})
14+ list(APPEND RELATIVE_QMLPLUGIN_SRC ../${source_file})
15+endforeach()
16+
17+add_library(FullLightDM-qml MODULE
18+ ${RELATIVE_QMLPLUGIN_SRC}
19+ )
20+
21+target_link_libraries(FullLightDM-qml
22+ unity8-private
23+ ${LIBLIGHTDM_LDFLAGS}
24+ ${LIBUSERMETRICSOUTPUT_LDFLAGS}
25+ )
26+
27+qt5_use_modules(FullLightDM-qml DBus Gui Qml)
28+add_unity8_plugin(FullLightDM 0.1 LightDM/FullLightDM TARGETS FullLightDM-qml)
plugins/LightDM/FullLightDM/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module LightDM.FullLightDM
2+plugin FullLightDM-qml
3+typeinfo FullLightDM.qmltypes
plugins/IntegratedLightDM/Greeter.cpp → plugins/LightDM/Greeter.cpprenamed+13−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -13,7 +13,6 @@
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
15 *
16− * Author: Michael Terry <michael.terry@canonical.com>
17 */
16 */
18
17
19#include "Greeter.h"
18#include "Greeter.h"
@@ -72,12 +71,24 @@ QString Greeter::authenticationUser() const
72 return d->m_greeter->authenticationUser();
71 return d->m_greeter->authenticationUser();
73}
72}
74
73
74+QString Greeter::defaultSessionHint() const
75+{
76+ Q_D(const Greeter);
77+ return d->m_greeter->defaultSessionHint();
78+}
79+
75bool Greeter::promptless() const
80bool Greeter::promptless() const
76{
81{
77 Q_D(const Greeter);
82 Q_D(const Greeter);
78 return d->promptless;
83 return d->promptless;
79}
84}
80
85
86+QString Greeter::selectUser() const
87+{
88+ Q_D(const Greeter);
89+ return d->m_greeter->selectUserHint();
90+}
91+
81void Greeter::authenticate(const QString &username)
92void Greeter::authenticate(const QString &username)
82{
93{
83 Q_D(Greeter);
94 Q_D(Greeter);
plugins/IntegratedLightDM/Greeter.h → plugins/LightDM/Greeter.hrenamed+5−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2012,2013 Canonical, Ltd.
2+ * Copyright (C) 2012,2013,2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -13,7 +13,6 @@
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
15 *
16− * Authors: Michael Terry <michael.terry@canonical.com>
17 */
16 */
18
17
19/* This class is a really tiny filter around QLightDM::Greeter. There are some
18/* This class is a really tiny filter around QLightDM::Greeter. There are some
@@ -37,7 +36,9 @@ class Greeter : public QObject
37 Q_PROPERTY(bool active READ isActive WRITE setIsActive NOTIFY isActiveChanged)
36 Q_PROPERTY(bool active READ isActive WRITE setIsActive NOTIFY isActiveChanged)
38 Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
37 Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
39 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
38 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
39+ Q_PROPERTY(QString defaultSession READ defaultSessionHint CONSTANT)
40 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
40 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
41+ Q_PROPERTY(QString selectUser READ selectUser CONSTANT)
41
42
42public:
43public:
43 explicit Greeter(QObject* parent=0);
44 explicit Greeter(QObject* parent=0);
@@ -45,7 +46,9 @@ public:
45 bool isActive() const;
46 bool isActive() const;
46 bool isAuthenticated() const;
47 bool isAuthenticated() const;
47 QString authenticationUser() const;
48 QString authenticationUser() const;
49+ QString defaultSessionHint() const;
48 bool promptless() const;
50 bool promptless() const;
51+ QString selectUser() const;
49
52
50public Q_SLOTS:
53public Q_SLOTS:
51 void authenticate(const QString &username=QString());
54 void authenticate(const QString &username=QString());
plugins/IntegratedLightDM/GreeterPrivate.h → plugins/LightDM/GreeterPrivate.hrenamed

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

The content is the same.

plugins/IntegratedLightDM/plugin.cpp → plugins/LightDM/plugin.cpprenamed+26−4
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2012,2013, 2015 Canonical, Ltd.
2+ * Copyright (C) 2012,2013,2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -19,9 +19,11 @@
19#include "DBusGreeter.h"
19#include "DBusGreeter.h"
20#include "DBusGreeterList.h"
20#include "DBusGreeterList.h"
21#include "Greeter.h"
21#include "Greeter.h"
22+#include "SessionsModel.h"
22#include "UsersModel.h"
23#include "UsersModel.h"
23#include <libusermetricsoutput/ColorTheme.h>
24#include <libusermetricsoutput/ColorTheme.h>
24#include <libusermetricsoutput/UserMetrics.h>
25#include <libusermetricsoutput/UserMetrics.h>
26+#include <QLightDM/SessionsModel>
25#include <QLightDM/UsersModel>
27#include <QLightDM/UsersModel>
26
28
27#include <QAbstractItemModel>
29#include <QAbstractItemModel>
@@ -40,6 +42,13 @@ static QObject *greeter_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
40 return greeter;
42 return greeter;
41}
43}
42
44
45+static QObject *sessions_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
46+{
47+ Q_UNUSED(engine)
48+ Q_UNUSED(scriptEngine)
49+ return new SessionsModel();
50+}
51+
43static QObject *users_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
52static QObject *users_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
44{
53{
45 Q_UNUSED(engine)
54 Q_UNUSED(engine)
@@ -54,16 +63,29 @@ static QObject *infographic_provider(QQmlEngine *engine, QJSEngine *scriptEngine
54 return UserMetricsOutput::UserMetrics::getInstance();
63 return UserMetricsOutput::UserMetrics::getInstance();
55}
64}
56
65
57−void IntegratedLightDMPlugin::registerTypes(const char *uri)
66+void PLUGIN_CLASSNAME::registerTypes(const char *uri)
58{
67{
59 qmlRegisterType<QAbstractItemModel>();
68 qmlRegisterType<QAbstractItemModel>();
60 qmlRegisterType<UserMetricsOutput::ColorTheme>();
69 qmlRegisterType<UserMetricsOutput::ColorTheme>();
61
70
71+#if defined INTEGRATED_LIGHTDM
62− Q_ASSERT(uri == QLatin1String("IntegratedLightDM"));
72+ Q_ASSERT(uri == QLatin1String("LightDM.IntegratedLightDM"));
73+ qmlRegisterSingletonType<Greeter>(uri, 0, 1, "Greeter", greeter_provider);
74+#elif defined FULL_LIGHTDM
75+ Q_ASSERT(uri == QLatin1String("LightDM.FullLightDM"));
76+ qmlRegisterSingletonType<QLightDM::Greeter>(uri, 0, 1, "Greeter", greeter_provider);
77+#else
78+ #error No library defined in LightDM plugin
79+#endif
80+
63 qRegisterMetaType<QLightDM::Greeter::MessageType>("QLightDM::Greeter::MessageType");
81 qRegisterMetaType<QLightDM::Greeter::MessageType>("QLightDM::Greeter::MessageType");
64 qRegisterMetaType<QLightDM::Greeter::PromptType>("QLightDM::Greeter::PromptType");
82 qRegisterMetaType<QLightDM::Greeter::PromptType>("QLightDM::Greeter::PromptType");
65− qmlRegisterSingletonType<Greeter>(uri, 0, 1, "Greeter", greeter_provider);
83+
84+ qmlRegisterSingletonType<SessionsModel>(uri, 0, 1, "Sessions", sessions_provider);
85+ qmlRegisterUncreatableType<SessionsModel>(uri, 0, 1, "SessionRoles", QStringLiteral("Type is not instantiable"));
86+
66 qmlRegisterSingletonType<UsersModel>(uri, 0, 1, "Users", users_provider);
87 qmlRegisterSingletonType<UsersModel>(uri, 0, 1, "Users", users_provider);
67 qmlRegisterUncreatableType<QLightDM::UsersModel>(uri, 0, 1, "UserRoles", QStringLiteral("Type is not instantiable"));
88 qmlRegisterUncreatableType<QLightDM::UsersModel>(uri, 0, 1, "UserRoles", QStringLiteral("Type is not instantiable"));
89+
68 qmlRegisterSingletonType<UserMetricsOutput::UserMetrics>(uri, 0, 1, "Infographic", infographic_provider);
90 qmlRegisterSingletonType<UserMetricsOutput::UserMetrics>(uri, 0, 1, "Infographic", infographic_provider);
69}
91}
plugins/IntegratedLightDM/plugin.h → plugins/LightDM/plugin.hrenamed+5−5
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2012,2013, 2015 Canonical, Ltd.
2+ * Copyright (C) 2012,2013,2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -15,13 +15,13 @@
15 *
15 *
16 */
16 */
17
17
18−#ifndef INTEGRATED_LIGHTDM_PLUGIN_H
18+#ifndef LIGHTDM_PLUGIN_H
19−#define INTEGRATED_LIGHTDM_PLUGIN_H
19+#define LIGHTDM_PLUGIN_H
20
20
21#include <QtQml/QQmlEngine>
21#include <QtQml/QQmlEngine>
22#include <QtQml/QQmlExtensionPlugin>
22#include <QtQml/QQmlExtensionPlugin>
23
23
24−class IntegratedLightDMPlugin : public QQmlExtensionPlugin
24+class PLUGIN_CLASSNAME : public QQmlExtensionPlugin
25{
25{
26 Q_OBJECT
26 Q_OBJECT
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
@@ -30,4 +30,4 @@ public:
30 void registerTypes(const char *uri) override;
30 void registerTypes(const char *uri) override;
31};
31};
32
32
33−#endif /* INTEGRATED_LIGHTDM_PLUGIN_H */
33+#endif /* LIGHTDM_PLUGIN_H */
plugins/IntegratedLightDM/qmldir → plugins/LightDM/qmldirrenamed

The content is the same.

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

The content is the same.

plugins/ScreenshotDirectory/ScreenshotDirectory.cppnew file+64
@@ -0,0 +1,64 @@
1+/*
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "ScreenshotDirectory.h"
18+
19+#include <QDir>
20+#include <QDateTime>
21+#include <QStandardPaths>
22+#include <QTemporaryDir>
23+
24+#include <QDebug>
25+
26+ScreenshotDirectory::ScreenshotDirectory(QObject *parent)
27+ : QObject(parent)
28+{
29+ QDir screenshotsDir;
30+ if (qEnvironmentVariableIsSet("UNITY_TESTING")) {
31+ QTemporaryDir tDir;
32+ tDir.setAutoRemove(false);
33+ screenshotsDir = tDir.path();
34+ } else {
35+ screenshotsDir = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
36+ }
37+ screenshotsDir.mkpath(QStringLiteral("Screenshots"));
38+ screenshotsDir.cd(QStringLiteral("Screenshots"));
39+ if (screenshotsDir.exists()) {
40+ m_fileNamePrefix = screenshotsDir.absolutePath();
41+ m_fileNamePrefix.append("/screenshot");
42+ } else {
43+ qWarning() << "ScreenshotDirectory: failed to create directory at:" << screenshotsDir.absolutePath();
44+ }
45+}
46+
47+QString ScreenshotDirectory::makeFileName() const
48+{
49+ if (m_fileNamePrefix.isEmpty()) {
50+ return QString();
51+ }
52+
53+ QString fileName(m_fileNamePrefix);
54+ fileName.append(QDateTime::currentDateTime().toString(QStringLiteral("yyyyMMdd_hhmmsszzz")));
55+ fileName.append(".");
56+ fileName.append(format());
57+ return fileName;
58+}
59+
60+QString ScreenshotDirectory::format() const
61+{
62+ //TODO: This should be configurable (perhaps through gsettings?)
63+ return QStringLiteral("png");
64+}
plugins/ScreenshotDirectory/ScreenshotDirectory.hnew file+39
@@ -0,0 +1,39 @@
1+/*
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef SCREENSHOTDIRECTORY_H
18+#define SCREENSHOTDIRECTORY_H
19+
20+#include <QObject>
21+#include <QString>
22+
23+class ScreenshotDirectory: public QObject
24+{
25+ Q_OBJECT
26+
27+public:
28+ explicit ScreenshotDirectory(QObject *parent = 0);
29+ ~ScreenshotDirectory() = default;
30+
31+public Q_SLOTS:
32+ QString makeFileName() const;
33+
34+private:
35+ QString format() const;
36+ QString m_fileNamePrefix;
37+};
38+
39+#endif // SCREENSHOTDIRECTORY_H
plugins/ScreenGrabber/plugin.cpp → plugins/ScreenshotDirectory/plugin.cpprenamed+5−7
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014,2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -12,17 +12,15 @@
12 *
12 *
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Alberto Aguirre <alberto.aguirre@canonical.com>
17 */
15 */
18
16
19#include "plugin.h"
17#include "plugin.h"
20−#include "screengrabber.h"
18+#include "ScreenshotDirectory.h"
21
19
22#include <QtQml/qqml.h>
20#include <QtQml/qqml.h>
23
21
24−void ScreenGrabberPlugin::registerTypes(const char *uri)
22+void ScreenshotDirectoryPlugin::registerTypes(const char *uri)
25{
23{
26− Q_ASSERT(uri == QLatin1String("ScreenGrabber"));
24+ Q_ASSERT(uri == QLatin1String("ScreenshotDirectory"));
27− qmlRegisterType<ScreenGrabber>(uri, 0, 1, "ScreenGrabber");
25+ qmlRegisterType<ScreenshotDirectory>(uri, 0, 1, "ScreenshotDirectory");
28}
26}
plugins/ScreenGrabber/plugin.h → plugins/ScreenshotDirectory/plugin.hrenamed+5−7
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014,2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -12,16 +12,14 @@
12 *
12 *
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Alberto Aguirre <alberto.aguirre@canonical.com>
17 */
15 */
18
16
19−#ifndef SCREENGRABBER_PLUGIN_H
17+#ifndef SCREENSHOTDIRECTORY_PLUGIN_H
20−#define SCREENGRABBER_PLUGIN_H
18+#define SCREENSHOTDIRECTORY_PLUGIN_H
21
19
22#include <QtQml/QQmlExtensionPlugin>
20#include <QtQml/QQmlExtensionPlugin>
23
21
24−class ScreenGrabberPlugin : public QQmlExtensionPlugin
22+class ScreenshotDirectoryPlugin : public QQmlExtensionPlugin
25{
23{
26 Q_OBJECT
24 Q_OBJECT
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
@@ -30,4 +28,4 @@ public:
30 void registerTypes(const char *uri) override;
28 void registerTypes(const char *uri) override;
31};
29};
32
30
33−#endif // SCREENGRABBER_PLUGIN_H
31+#endif // SCREENSHOTDIRECTORY_PLUGIN_H
plugins/ScreenshotDirectory/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module ScreenshotDirectory
2+plugin ScreenshotDirectory-qml
plugins/SessionBroadcast/CMakeLists.txt+5
@@ -1,3 +1,4 @@
1+include_directories(${GLIB_INCLUDE_DIRS})
1add_definitions(-DSM_BUSNAME=systemBus)
2add_definitions(-DSM_BUSNAME=systemBus)
2
3
3add_library(SessionBroadcast-qml MODULE
4add_library(SessionBroadcast-qml MODULE
@@ -7,4 +8,8 @@ add_library(SessionBroadcast-qml MODULE
7
8
8qt5_use_modules(SessionBroadcast-qml DBus Qml)
9qt5_use_modules(SessionBroadcast-qml DBus Qml)
9
10
11+target_link_libraries(SessionBroadcast-qml
12+ ${GLIB_LIBRARIES}
13+ )
14+
10add_unity8_plugin(SessionBroadcast 0.1 SessionBroadcast TARGETS SessionBroadcast-qml)
15add_unity8_plugin(SessionBroadcast 0.1 SessionBroadcast TARGETS SessionBroadcast-qml)
plugins/SessionBroadcast/SessionBroadcast.cpp+5−1
@@ -19,9 +19,13 @@
19#include "SessionBroadcast.h"
19#include "SessionBroadcast.h"
20#include <QDBusConnection>
20#include <QDBusConnection>
21
21
22+#include <glib.h>
23+
22SessionBroadcast::SessionBroadcast(QObject* parent)
24SessionBroadcast::SessionBroadcast(QObject* parent)
23 : QObject(parent)
25 : QObject(parent)
24{
26{
27+ m_username = QString::fromUtf8(g_get_user_name());
28+
25 auto connection = QDBusConnection::SM_BUSNAME();
29 auto connection = QDBusConnection::SM_BUSNAME();
26
30
27 connection.connect(QStringLiteral("com.canonical.Unity.Greeter.Broadcast"),
31 connection.connect(QStringLiteral("com.canonical.Unity.Greeter.Broadcast"),
@@ -35,7 +39,7 @@ SessionBroadcast::SessionBroadcast(QObject* parent)
35void SessionBroadcast::onShowHome(const QString &username)
39void SessionBroadcast::onShowHome(const QString &username)
36{
40{
37 // Only listen to requests meant for us
41 // Only listen to requests meant for us
38− if (username == qgetenv("USER")) {
42+ if (username == m_username) {
39 Q_EMIT showHome();
43 Q_EMIT showHome();
40 }
44 }
41}
45}
plugins/SessionBroadcast/SessionBroadcast.h+3
@@ -36,6 +36,9 @@ Q_SIGNALS:
36
36
37private Q_SLOTS:
37private Q_SLOTS:
38 void onShowHome(const QString &username);
38 void onShowHome(const QString &username);
39+
40+private:
41+ QString m_username;
39};
42};
40
43
41#endif
44#endif
plugins/SessionBroadcast/SessionBroadcast.qmltypesdeleted−19
@@ -1,19 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable SessionBroadcast 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "SessionBroadcast"
12− prototype: "QObject"
13− exports: ["SessionBroadcast/SessionBroadcast 0.1"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Signal { name: "showHome" }
18− }
19−}
plugins/UInput/UInput.qmltypesdeleted−44
@@ -1,44 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable UInput 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "UInput"
12− prototype: "QObject"
13− exports: ["UInput/UInput 0.1"]
14− exportMetaObjectRevisions: [0]
15− Enum {
16− name: "Button"
17− values: {
18− "ButtonLeft": 0,
19− "ButtonRight": 1,
20− "ButtonMiddle": 2
21− }
22− }
23− Method { name: "createMouse" }
24− Method { name: "removeMouse" }
25− Method {
26− name: "moveMouse"
27− Parameter { name: "dx"; type: "int" }
28− Parameter { name: "dy"; type: "int" }
29− }
30− Method {
31− name: "pressMouse"
32− Parameter { name: "button"; type: "Button" }
33− }
34− Method {
35− name: "releaseMouse"
36− Parameter { name: "button"; type: "Button" }
37− }
38− Method {
39− name: "scrollMouse"
40− Parameter { name: "dh"; type: "int" }
41− Parameter { name: "dv"; type: "int" }
42− }
43− }
44−}
plugins/Ubuntu/DownloadDaemonListener/CMakeLists.txt−1
@@ -1,7 +1,6 @@
1include_directories(
1include_directories(
2 ${CMAKE_CURRENT_SOURCE_DIR}
2 ${CMAKE_CURRENT_SOURCE_DIR}
3 ${CMAKE_CURRENT_BINARY_DIR}
3 ${CMAKE_CURRENT_BINARY_DIR}
4− ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
5)
4)
6
5
7set(DOWNLOADDAEMONLISTENER_SOURCES
6set(DOWNLOADDAEMONLISTENER_SOURCES
plugins/Ubuntu/DownloadDaemonListener/DownloadDaemonListener.qmltypesdeleted−60
@@ -1,60 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Ubuntu.DownloadDaemonListener 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "DownloadTracker"
12− prototype: "QObject"
13− exports: ["Ubuntu.DownloadDaemonListener/DownloadTracker 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "service"; type: "string" }
16− Property { name: "dbusPath"; type: "string" }
17− Property { name: "serviceReady"; type: "bool"; isReadonly: true }
18− Signal {
19− name: "serviceChanged"
20− Parameter { name: "service"; type: "string" }
21− }
22− Signal {
23− name: "dbusPathChanged"
24− Parameter { name: "dbusPath"; type: "string" }
25− }
26− Signal {
27− name: "serviceReadyChanged"
28− Parameter { name: "serviceReady"; type: "bool" }
29− }
30− Signal {
31− name: "canceled"
32− Parameter { name: "success"; type: "bool" }
33− }
34− Signal {
35− name: "error"
36− Parameter { name: "error"; type: "string" }
37− }
38− Signal {
39− name: "finished"
40− Parameter { name: "path"; type: "string" }
41− }
42− Signal {
43− name: "paused"
44− Parameter { name: "success"; type: "bool" }
45− }
46− Signal {
47− name: "progress"
48− Parameter { name: "received"; type: "qulonglong" }
49− Parameter { name: "total"; type: "qulonglong" }
50− }
51− Signal {
52− name: "resumed"
53− Parameter { name: "success"; type: "bool" }
54− }
55− Signal {
56− name: "started"
57− Parameter { name: "success"; type: "bool" }
58− }
59− }
60−}
plugins/Ubuntu/Gestures/AxisVelocityCalculator.h+1−1
@@ -24,7 +24,7 @@
24#include "UbuntuGesturesQmlGlobal.h"
24#include "UbuntuGesturesQmlGlobal.h"
25#include <stdint.h>
25#include <stdint.h>
26#include <QtCore/QObject>
26#include <QtCore/QObject>
27−#include "TimeSource.h"
27+#include <TimeSource>
28
28
29/*
29/*
30 Estimates the current velocity of a finger based on recent movement along an axis
30 Estimates the current velocity of a finger based on recent movement along an axis
plugins/Ubuntu/Gestures/CMakeLists.txt+9−5
@@ -4,27 +4,30 @@ remove_definitions(-DQT_NO_KEYWORDS)
4set(UbuntuGesturesQml_SOURCES
4set(UbuntuGesturesQml_SOURCES
5 plugin.cpp
5 plugin.cpp
6 AxisVelocityCalculator.cpp
6 AxisVelocityCalculator.cpp
7− Damper.cpp
8 Direction.cpp
7 Direction.cpp
9− DirectionalDragArea.cpp
8+ MouseEventGenerator.cpp
10− FloatingFlickable.cpp
11 PressedOutsideNotifier.cpp
9 PressedOutsideNotifier.cpp
12 TouchDispatcher.cpp
10 TouchDispatcher.cpp
13 TouchGate.cpp
11 TouchGate.cpp
14 TouchGestureArea.cpp
12 TouchGestureArea.cpp
15)
13)
16
14
15+pkg_check_modules(UBUNTUGESTURES REQUIRED UbuntuGestures)
16+
17add_definitions(-DUBUNTUGESTURESQML_LIBRARY)
17add_definitions(-DUBUNTUGESTURESQML_LIBRARY)
18
18
19add_library(UbuntuGesturesQml MODULE ${UbuntuGesturesQml_SOURCES})
19add_library(UbuntuGesturesQml MODULE ${UbuntuGesturesQml_SOURCES})
20−target_link_libraries(UbuntuGesturesQml UbuntuGestures)
20+target_link_libraries(UbuntuGesturesQml ${UBUNTUGESTURES_LIBRARIES})
21
21
22qt5_use_modules(UbuntuGesturesQml Core Quick)
22qt5_use_modules(UbuntuGesturesQml Core Quick)
23
23
24# So that Foo.cpp can #include "Foo.moc"
24# So that Foo.cpp can #include "Foo.moc"
25include_directories(${CMAKE_CURRENT_BINARY_DIR})
25include_directories(${CMAKE_CURRENT_BINARY_DIR})
26
26
27−include_directories(${CMAKE_SOURCE_DIR}/libs/UbuntuGestures)
27+include_directories(
28+ SYSTEM
29+ ${UBUNTUGESTURES_INCLUDE_DIRS}
30+)
28
31
29# There's no cmake var for v8 include path :-/ so create one
32# There's no cmake var for v8 include path :-/ so create one
30LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
33LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
@@ -32,6 +35,7 @@ SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/QtV8/${Qt5Core_VERSION_STRING}/QtV8)
32
35
33# DANGER! DANGER! Using Qt's private API!
36# DANGER! DANGER! Using Qt's private API!
34include_directories(
37include_directories(
38+ SYSTEM
35 ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
39 ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
36 ${Qt5Quick_INCLUDE_DIRS}
40 ${Qt5Quick_INCLUDE_DIRS}
37 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
41 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
plugins/Ubuntu/Gestures/Damper.hdeleted−89
@@ -1,89 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef UBUNTU_GESTURES_DAMPER_H
18−#define UBUNTU_GESTURES_DAMPER_H
19−
20−#include <QtCore/QPointF>
21−
22−/*
23− Decreases the oscillations of a value along an axis.
24− */
25−template <class Type> class Damper {
26−public:
27− Damper() : m_value(0), m_maxDelta(0) { }
28−
29− // Maximum delta between the raw value and its dampened counterpart.
30− void setMaxDelta(Type maxDelta) {
31− if (maxDelta < 0) qFatal("Damper::maxDelta must be a positive number.");
32− m_maxDelta = maxDelta;
33− }
34− Type maxDelta() const { return m_maxDelta; }
35−
36− void reset(Type value) {
37− m_value = value;
38− }
39−
40− Type update(Type value) {
41− Type delta = value - m_value;
42− if (delta > 0 && delta > m_maxDelta) {
43− m_value += delta - m_maxDelta;
44− } else if (delta < 0 && delta < -m_maxDelta) {
45− m_value += delta + m_maxDelta;
46− }
47−
48− return m_value;
49− }
50−
51− Type value() const { return m_value; }
52−
53−private:
54− Type m_value;
55− Type m_maxDelta;
56−};
57−
58−/*
59− A point that has its movement dampened.
60− */
61−class DampedPointF {
62−public:
63− void setMaxDelta(qreal maxDelta) {
64− m_x.setMaxDelta(maxDelta);
65− m_y.setMaxDelta(maxDelta);
66− }
67−
68− qreal maxDelta() const { return m_x.maxDelta(); }
69−
70− void reset(const QPointF point) {
71− m_x.reset(point.x());
72− m_y.reset(point.y());
73− }
74−
75− void update(const QPointF point) {
76− m_x.update(point.x());
77− m_y.update(point.y());
78− }
79−
80− qreal x() const { return m_x.value(); }
81− qreal y() const { return m_y.value(); }
82−private:
83− Damper<qreal> m_x;
84− Damper<qreal> m_y;
85−};
86−
87−QDebug operator<<(QDebug dbg, const DampedPointF &p);
88−
89−#endif // UBUNTU_GESTURES_DAMPER_H
plugins/Ubuntu/Gestures/Direction.h+1
@@ -29,6 +29,7 @@ class UBUNTUGESTURESQML_EXPORT Direction : public QObject {
29 Q_ENUMS(Type)
29 Q_ENUMS(Type)
30
30
31public:
31public:
32+ // Make sure it is kept synchronized with SDK UCSwipeArea::Direction
32 enum Type {
33 enum Type {
33 Rightwards, // Along the positive direction of the X axis
34 Rightwards, // Along the positive direction of the X axis
34 Leftwards, // Along the negative direction of the X axis
35 Leftwards, // Along the negative direction of the X axis
plugins/Ubuntu/Gestures/DirectionalDragArea.cppdeleted−932
@@ -1,932 +0,0 @@
1−/*
2− * Copyright (C) 2013-2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#define ACTIVETOUCHESINFO_DEBUG 0
18−#define DIRECTIONALDRAGAREA_DEBUG 0
19−
20−#include "DirectionalDragArea.h"
21−
22−#include <QQuickWindow>
23−#include <QtCore/qmath.h>
24−#include <QScreen>
25−#include <QDebug>
26−
27−#pragma GCC diagnostic push
28−#pragma GCC diagnostic ignored "-pedantic"
29−#include <private/qquickwindow_p.h>
30−#pragma GCC diagnostic pop
31−
32−// local
33−#include "TouchOwnershipEvent.h"
34−#include "TouchRegistry.h"
35−#include "UnownedTouchEvent.h"
36−
37−#include "DirectionalDragArea_p.h"
38−
39−using namespace UbuntuGestures;
40−
41−#if DIRECTIONALDRAGAREA_DEBUG
42−#define ddaDebug(params) qDebug().nospace() << "[DDA(" << qPrintable(objectName()) << ")] " << params
43−#include "DebugHelpers.h"
44−
45−namespace {
46−const char *statusToString(DirectionalDragAreaPrivate::Status status)
47−{
48− if (status == DirectionalDragAreaPrivate::WaitingForTouch) {
49− return "WaitingForTouch";
50− } else if (status == DirectionalDragAreaPrivate::Undecided) {
51− return "Undecided";
52− } else {
53− return "Recognized";
54− }
55−}
56−
57−} // namespace {
58−#else // DIRECTIONALDRAGAREA_DEBUG
59−#define ddaDebug(params) ((void)0)
60−#endif // DIRECTIONALDRAGAREA_DEBUG
61−
62−DirectionalDragArea::DirectionalDragArea(QQuickItem *parent)
63− : QQuickItem(parent)
64− , d(new DirectionalDragAreaPrivate(this))
65−{
66− d->setRecognitionTimer(new Timer(this));
67− d->recognitionTimer->setInterval(d->maxTime);
68− d->recognitionTimer->setSingleShot(true);
69−
70− connect(this, &QQuickItem::enabledChanged, d, &DirectionalDragAreaPrivate::giveUpIfDisabledOrInvisible);
71− connect(this, &QQuickItem::visibleChanged, d, &DirectionalDragAreaPrivate::giveUpIfDisabledOrInvisible);
72−}
73−
74−Direction::Type DirectionalDragArea::direction() const
75−{
76− return d->direction;
77−}
78−
79−void DirectionalDragArea::setDirection(Direction::Type direction)
80−{
81− if (direction != d->direction) {
82− d->direction = direction;
83− Q_EMIT directionChanged(d->direction);
84− }
85−}
86−
87−void DirectionalDragAreaPrivate::setDistanceThreshold(qreal value)
88−{
89− if (distanceThreshold != value) {
90− distanceThreshold = value;
91− distanceThresholdSquared = distanceThreshold * distanceThreshold;
92− }
93−}
94−
95−void DirectionalDragAreaPrivate::setMaxTime(int value)
96−{
97− if (maxTime != value) {
98− maxTime = value;
99− recognitionTimer->setInterval(maxTime);
100− }
101−}
102−
103−void DirectionalDragAreaPrivate::setRecognitionTimer(UbuntuGestures::AbstractTimer *timer)
104−{
105− int interval = 0;
106− bool timerWasRunning = false;
107− bool wasSingleShot = false;
108−
109− // can be null when called from the constructor
110− if (recognitionTimer) {
111− interval = recognitionTimer->interval();
112− timerWasRunning = recognitionTimer->isRunning();
113− if (recognitionTimer->parent() == this) {
114− delete recognitionTimer;
115− }
116− }
117−
118− recognitionTimer = timer;
119− timer->setInterval(interval);
120− timer->setSingleShot(wasSingleShot);
121− connect(timer, &UbuntuGestures::AbstractTimer::timeout,
122− this, &DirectionalDragAreaPrivate::rejectGesture);
123− if (timerWasRunning) {
124− recognitionTimer->start();
125− }
126−}
127−
128−void DirectionalDragAreaPrivate::setTimeSource(const SharedTimeSource &timeSource)
129−{
130− this->timeSource = timeSource;
131− activeTouches.m_timeSource = timeSource;
132−}
133−
134−qreal DirectionalDragArea::distance() const
135−{
136− if (Direction::isHorizontal(d->direction)) {
137− return d->publicPos.x() - d->startPos.x();
138− } else {
139− return d->publicPos.y() - d->startPos.y();
140− }
141−}
142−
143−void DirectionalDragAreaPrivate::updateSceneDistance()
144−{
145− QPointF totalMovement = publicScenePos - startScenePos;
146− sceneDistance = projectOntoDirectionVector(totalMovement);
147−}
148−
149−qreal DirectionalDragArea::sceneDistance() const
150−{
151− return d->sceneDistance;
152−}
153−
154−qreal DirectionalDragArea::touchX() const
155−{
156− return d->publicPos.x();
157−}
158−
159−qreal DirectionalDragArea::touchY() const
160−{
161− return d->publicPos.y();
162−}
163−
164−qreal DirectionalDragArea::touchSceneX() const
165−{
166− return d->publicScenePos.x();
167−}
168−
169−qreal DirectionalDragArea::touchSceneY() const
170−{
171− return d->publicScenePos.y();
172−}
173−
174−bool DirectionalDragArea::dragging() const
175−{
176− return d->status == DirectionalDragAreaPrivate::Recognized;
177−}
178−
179−bool DirectionalDragArea::pressed() const
180−{
181− return d->status != DirectionalDragAreaPrivate::WaitingForTouch;
182−}
183−
184−bool DirectionalDragArea::immediateRecognition() const
185−{
186− return d->immediateRecognition;
187−}
188−
189−void DirectionalDragArea::setImmediateRecognition(bool enabled)
190−{
191− if (d->immediateRecognition != enabled) {
192− d->immediateRecognition = enabled;
193− Q_EMIT immediateRecognitionChanged(enabled);
194− }
195−}
196−
197−bool DirectionalDragArea::monitorOnly() const
198−{
199− return d->monitorOnly;
200−}
201−
202−void DirectionalDragArea::setMonitorOnly(bool monitorOnly)
203−{
204− if (d->monitorOnly != monitorOnly) {
205− d->monitorOnly = monitorOnly;
206−
207− if (monitorOnly && d->status == DirectionalDragAreaPrivate::Undecided) {
208− TouchRegistry::instance()->removeCandidateOwnerForTouch(d->touchId, this);
209− // We still wanna know when it ends for keeping the composition time window up-to-date
210− TouchRegistry::instance()->addTouchWatcher(d->touchId, this);
211− }
212−
213− Q_EMIT monitorOnlyChanged(monitorOnly);
214− }
215−}
216−
217−void DirectionalDragArea::removeTimeConstraints()
218−{
219− d->setMaxTime(60 * 60 * 1000);
220− d->compositionTime = 0;
221− ddaDebug("removed time constraints");
222−}
223−
224−bool DirectionalDragArea::event(QEvent *event)
225−{
226− if (event->type() == TouchOwnershipEvent::touchOwnershipEventType()) {
227− d->touchOwnershipEvent(static_cast<TouchOwnershipEvent *>(event));
228− return true;
229− } else if (event->type() == UnownedTouchEvent::unownedTouchEventType()) {
230− d->unownedTouchEvent(static_cast<UnownedTouchEvent *>(event));
231− return true;
232− } else {
233− return QQuickItem::event(event);
234− }
235−}
236−
237−void DirectionalDragAreaPrivate::touchOwnershipEvent(TouchOwnershipEvent *event)
238−{
239− if (event->gained()) {
240− QVector<int> ids;
241− ids.append(event->touchId());
242− ddaDebug("grabbing touch");
243− q->grabTouchPoints(ids);
244−
245− // Work around for Qt bug. If we grab a touch that is being used for mouse pointer
246− // emulation it will cause the emulation logic to go nuts.
247− // Thus we have to also grab the mouse in this case.
248− //
249− // The fix for this bug has landed in Qt 5.4 (https://codereview.qt-project.org/96887)
250− // TODO: Remove this workaround once we start using Qt 5.4
251− if (q->window()) {
252− QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(q->window());
253− if (windowPrivate->touchMouseId == event->touchId() && q->window()->mouseGrabberItem()) {
254− ddaDebug("removing mouse grabber");
255− q->window()->mouseGrabberItem()->ungrabMouse();
256− }
257− }
258− } else {
259− // We still wanna know when it ends for keeping the composition time window up-to-date
260− TouchRegistry::instance()->addTouchWatcher(touchId, q);
261−
262− setStatus(WaitingForTouch);
263− }
264−}
265−
266−void DirectionalDragAreaPrivate::unownedTouchEvent(UnownedTouchEvent *unownedTouchEvent)
267−{
268− QTouchEvent *event = unownedTouchEvent->touchEvent();
269−
270− Q_ASSERT(!event->touchPointStates().testFlag(Qt::TouchPointPressed));
271−
272− ddaDebug("Unowned " << timeSource->msecsSinceReference() << " " << qPrintable(touchEventToString(event)));
273−
274− switch (status) {
275− case WaitingForTouch:
276− // do nothing
277− break;
278− case Undecided:
279− Q_ASSERT(q->isEnabled() && q->isVisible());
280− unownedTouchEvent_undecided(unownedTouchEvent);
281− break;
282− default: // Recognized:
283− if (monitorOnly) {
284− // Treat unowned event as if we owned it, but we are really just watching it
285− touchEvent_recognized(event);
286− }
287− break;
288− }
289−
290− activeTouches.update(event);
291−}
292−
293−void DirectionalDragAreaPrivate::unownedTouchEvent_undecided(UnownedTouchEvent *unownedTouchEvent)
294−{
295− const QTouchEvent::TouchPoint *touchPoint = fetchTargetTouchPoint(unownedTouchEvent->touchEvent());
296− if (!touchPoint) {
297− qCritical() << "DirectionalDragArea[status=Undecided]: touch " << touchId
298− << "missing from UnownedTouchEvent without first reaching state Qt::TouchPointReleased. "
299− "Considering it as released.";
300−
301− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
302− setStatus(WaitingForTouch);
303− return;
304− }
305−
306− const QPointF &touchScenePos = touchPoint->scenePos();
307−
308− if (touchPoint->state() == Qt::TouchPointReleased) {
309− // touch has ended before recognition concluded
310− ddaDebug("Touch has ended before recognition concluded");
311− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
312− setStatus(WaitingForTouch);
313− return;
314− }
315−
316− previousDampedScenePos.setX(dampedScenePos.x());
317− previousDampedScenePos.setY(dampedScenePos.y());
318− dampedScenePos.update(touchScenePos);
319−
320− if (!movingInRightDirection()) {
321− ddaDebug("Rejecting gesture because touch point is moving in the wrong direction.");
322− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
323− // We still wanna know when it ends for keeping the composition time window up-to-date
324− TouchRegistry::instance()->addTouchWatcher(touchId, q);
325− setStatus(WaitingForTouch);
326− return;
327− }
328−
329− if (isWithinTouchCompositionWindow()) {
330− // There's still time for some new touch to appear and ruin our party as it would be combined
331− // with our touchId one and therefore deny the possibility of a single-finger gesture.
332− ddaDebug("Sill within composition window. Let's wait more.");
333− return;
334− }
335−
336− if (movedFarEnoughAlongGestureAxis()) {
337− if (!monitorOnly) {
338− TouchRegistry::instance()->requestTouchOwnership(touchId, q);
339− }
340− setStatus(Recognized);
341− setPublicPos(touchPoint->pos());
342− setPublicScenePos(touchScenePos);
343− } else if (isPastMaxDistance()) {
344− ddaDebug("Rejecting gesture because it went farther than maxDistance without getting recognized.");
345− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
346− // We still wanna know when it ends for keeping the composition time window up-to-date
347− TouchRegistry::instance()->addTouchWatcher(touchId, q);
348− setStatus(WaitingForTouch);
349− } else {
350− ddaDebug("Didn't move far enough yet. Let's wait more.");
351− }
352−}
353−
354−void DirectionalDragArea::touchEvent(QTouchEvent *event)
355−{
356− // TODO: Consider when more than one touch starts in the same event (although it's not possible
357− // with Mir's android-input). Have to track them all. Consider it a plus/bonus.
358−
359− ddaDebug(d->timeSource->msecsSinceReference() << " " << qPrintable(touchEventToString(event)));
360−
361− if (!isEnabled() || !isVisible()) {
362− QQuickItem::touchEvent(event);
363− return;
364− }
365−
366− switch (d->status) {
367− case DirectionalDragAreaPrivate::WaitingForTouch:
368− d->touchEvent_absent(event);
369− break;
370− case DirectionalDragAreaPrivate::Undecided:
371− d->touchEvent_undecided(event);
372− break;
373− default: // Recognized:
374− d->touchEvent_recognized(event);
375− break;
376− }
377−
378− d->activeTouches.update(event);
379−}
380−
381−void DirectionalDragAreaPrivate::touchEvent_absent(QTouchEvent *event)
382−{
383− // TODO: accept/reject is for the whole event, not per touch id. See how that affects us.
384−
385− if (!event->touchPointStates().testFlag(Qt::TouchPointPressed)) {
386− // Nothing to see here. No touch starting in this event.
387− return;
388− }
389−
390− // to be proven wrong, if that's the case
391− bool allGood = true;
392−
393− if (isWithinTouchCompositionWindow()) {
394− // too close to the last touch start. So we consider them as starting roughly at the same time.
395− // Can't be a single-touch gesture.
396− ddaDebug("A new touch point came in but we're still within time composition window. Ignoring it.");
397− allGood = false;
398− }
399−
400− const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
401−
402− const QTouchEvent::TouchPoint *newTouchPoint = nullptr;
403− for (int i = 0; i < touchPoints.count() && allGood; ++i) {
404− const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
405− if (touchPoint.state() == Qt::TouchPointPressed) {
406− if (newTouchPoint) {
407− // more than one touch starting in this QTouchEvent. Can't be a single-touch gesture
408− allGood = false;
409− } else {
410− // that's our candidate
411− newTouchPoint = &touchPoint;
412− }
413− }
414− }
415−
416− if (allGood) {
417− allGood = sanityCheckRecognitionProperties();
418− if (!allGood) {
419− qWarning("DirectionalDragArea: recognition properties are wrongly set. Gesture recognition"
420− " is impossible");
421− }
422− }
423−
424− if (allGood) {
425− Q_ASSERT(newTouchPoint);
426−
427− startPos = newTouchPoint->pos();
428− startScenePos = newTouchPoint->scenePos();
429− touchId = newTouchPoint->id();
430− dampedScenePos.reset(startScenePos);
431− setPublicPos(startPos);
432−
433− setPublicScenePos(startScenePos);
434− updateSceneDirectionVector();
435−
436− if (recognitionIsDisabled()) {
437− // Behave like a dumb TouchArea
438− ddaDebug("Gesture recognition is disabled. Requesting touch ownership immediately.");
439− setStatus(Recognized);
440− if (monitorOnly) {
441− watchPressedTouchPoints(touchPoints);
442− event->ignore();
443− } else {
444− TouchRegistry::instance()->requestTouchOwnership(touchId, q);
445− event->accept();
446− }
447− } else {
448− // just monitor the touch points for now.
449− if (monitorOnly) {
450− watchPressedTouchPoints(touchPoints);
451− } else {
452− TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, q);
453− }
454−
455− setStatus(Undecided);
456− // Let the item below have it. We will monitor it and grab it later if a gesture
457− // gets recognized.
458− event->ignore();
459− }
460− } else {
461− watchPressedTouchPoints(touchPoints);
462− event->ignore();
463− }
464−}
465−
466−void DirectionalDragAreaPrivate::touchEvent_undecided(QTouchEvent *event)
467−{
468− Q_ASSERT(fetchTargetTouchPoint(event) == nullptr);
469−
470− // We're not interested in new touch points. We already have our candidate (touchId).
471− // But we do want to know when those new touches end for keeping the composition time
472− // window up-to-date
473− event->ignore();
474− watchPressedTouchPoints(event->touchPoints());
475−
476− if (event->touchPointStates().testFlag(Qt::TouchPointPressed) && isWithinTouchCompositionWindow()) {
477− // multi-finger drags are not accepted
478− ddaDebug("Multi-finger drags are not accepted");
479−
480− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
481− // We still wanna know when it ends for keeping the composition time window up-to-date
482− TouchRegistry::instance()->addTouchWatcher(touchId, q);
483−
484− setStatus(WaitingForTouch);
485− }
486−}
487−
488−void DirectionalDragAreaPrivate::touchEvent_recognized(QTouchEvent *event)
489−{
490− const QTouchEvent::TouchPoint *touchPoint = fetchTargetTouchPoint(event);
491−
492− if (!touchPoint) {
493− qCritical() << "DirectionalDragArea[status=Recognized]: touch " << touchId
494− << "missing from QTouchEvent without first reaching state Qt::TouchPointReleased. "
495− "Considering it as released.";
496− setStatus(WaitingForTouch);
497− } else {
498− setPublicPos(touchPoint->pos());
499− setPublicScenePos(touchPoint->scenePos());
500−
501− if (touchPoint->state() == Qt::TouchPointReleased) {
502− setStatus(WaitingForTouch);
503− }
504− }
505−}
506−
507−void DirectionalDragAreaPrivate::watchPressedTouchPoints(const QList<QTouchEvent::TouchPoint> &touchPoints)
508−{
509− for (int i = 0; i < touchPoints.count(); ++i) {
510− const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
511− if (touchPoint.state() == Qt::TouchPointPressed) {
512− TouchRegistry::instance()->addTouchWatcher(touchPoint.id(), q);
513− }
514− }
515−}
516−
517−bool DirectionalDragAreaPrivate::recognitionIsDisabled() const
518−{
519− return immediateRecognition || (distanceThreshold <= 0 && compositionTime <= 0);
520−}
521−
522−bool DirectionalDragAreaPrivate::sanityCheckRecognitionProperties()
523−{
524− return recognitionIsDisabled()
525− || (distanceThreshold < maxDistance && compositionTime < maxTime);
526−}
527−
528−const QTouchEvent::TouchPoint *DirectionalDragAreaPrivate::fetchTargetTouchPoint(QTouchEvent *event)
529−{
530− const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
531− const QTouchEvent::TouchPoint *touchPoint = 0;
532− for (int i = 0; i < touchPoints.size(); ++i) {
533− if (touchPoints.at(i).id() == touchId) {
534− touchPoint = &touchPoints.at(i);
535− break;
536− }
537− }
538− return touchPoint;
539−}
540−
541−bool DirectionalDragAreaPrivate::movingInRightDirection() const
542−{
543− if (direction == Direction::Horizontal || direction == Direction::Vertical) {
544− return true;
545− } else {
546− QPointF movementVector(dampedScenePos.x() - previousDampedScenePos.x(),
547− dampedScenePos.y() - previousDampedScenePos.y());
548−
549− qreal scalarProjection = projectOntoDirectionVector(movementVector);
550−
551− return scalarProjection >= 0.;
552− }
553−}
554−
555−bool DirectionalDragAreaPrivate::movedFarEnoughAlongGestureAxis() const
556−{
557− if (distanceThreshold <= 0.) {
558− // distance threshold check is disabled
559− return true;
560− } else {
561− QPointF totalMovement(dampedScenePos.x() - startScenePos.x(),
562− dampedScenePos.y() - startScenePos.y());
563−
564− qreal scalarProjection = projectOntoDirectionVector(totalMovement);
565−
566− ddaDebug(" movedFarEnoughAlongGestureAxis: scalarProjection=" << scalarProjection
567− << ", distanceThreshold=" << distanceThreshold);
568−
569− if (direction == Direction::Horizontal || direction == Direction::Vertical) {
570− return qAbs(scalarProjection) > distanceThreshold;
571− } else {
572− return scalarProjection > distanceThreshold;
573− }
574− }
575−}
576−
577−bool DirectionalDragAreaPrivate::isPastMaxDistance() const
578−{
579− QPointF totalMovement(dampedScenePos.x() - startScenePos.x(),
580− dampedScenePos.y() - startScenePos.y());
581−
582− qreal squaredDistance = totalMovement.x()*totalMovement.x() + totalMovement.y()*totalMovement.y();
583− return squaredDistance > maxDistance*maxDistance;
584−}
585−
586−void DirectionalDragAreaPrivate::giveUpIfDisabledOrInvisible()
587−{
588− if (!q->isEnabled() || !q->isVisible()) {
589− if (status == Undecided) {
590− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
591− // We still wanna know when it ends for keeping the composition time window up-to-date
592− TouchRegistry::instance()->addTouchWatcher(touchId, q);
593− }
594−
595− if (status != WaitingForTouch) {
596− ddaDebug("Resetting status because got disabled or made invisible");
597− setStatus(WaitingForTouch);
598− }
599− }
600−}
601−
602−void DirectionalDragAreaPrivate::rejectGesture()
603−{
604− if (status == Undecided) {
605− ddaDebug("Rejecting gesture because it's taking too long to drag beyond the threshold.");
606−
607− TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, q);
608− // We still wanna know when it ends for keeping the composition time window up-to-date
609− TouchRegistry::instance()->addTouchWatcher(touchId, q);
610−
611− setStatus(WaitingForTouch);
612− }
613−}
614−
615−void DirectionalDragAreaPrivate::setStatus(Status newStatus)
616−{
617− if (newStatus == status)
618− return;
619−
620− Status oldStatus = status;
621−
622− if (oldStatus == Undecided) {
623− recognitionTimer->stop();
624− }
625−
626− status = newStatus;
627− Q_EMIT statusChanged(status);
628−
629− ddaDebug(statusToString(oldStatus) << " -> " << statusToString(newStatus));
630−
631− switch (newStatus) {
632− case WaitingForTouch:
633− if (oldStatus == Recognized) {
634− Q_EMIT q->draggingChanged(false);
635− }
636− Q_EMIT q->pressedChanged(false);
637− break;
638− case Undecided:
639− recognitionTimer->start();
640− Q_EMIT q->pressedChanged(true);
641− break;
642− case Recognized:
643− if (oldStatus == WaitingForTouch) { // for immediate recognition
644− Q_EMIT q->pressedChanged(true);
645− }
646− Q_EMIT q->draggingChanged(true);
647− break;
648− default:
649− // no-op
650− break;
651− }
652−}
653−
654−void DirectionalDragAreaPrivate::setPublicPos(const QPointF point)
655−{
656− bool xChanged = publicPos.x() != point.x();
657− bool yChanged = publicPos.y() != point.y();
658−
659− // Public position should not get updated while the gesture is still being recognized
660− // (ie, Undecided status).
661− Q_ASSERT(status == WaitingForTouch || status == Recognized);
662−
663− if (status == Recognized && !recognitionIsDisabled()) {
664− // When the gesture finally gets recognized, the finger will likely be
665− // reasonably far from the edge. If we made the contentX immediately
666− // follow the finger position it would be visually unpleasant as it
667− // would appear right next to the user's finger out of nowhere (ie,
668− // it would jump). Instead, we make contentX go towards the user's
669− // finger in several steps. ie., in an animated way.
670− QPointF delta = point - publicPos;
671− // the trick is not to go all the way (1.0) as it would cause a sudden jump
672− publicPos.rx() += 0.4 * delta.x();
673− publicPos.ry() += 0.4 * delta.y();
674− } else {
675− // no smoothing when initializing or if gesture recognition was immediate as there will
676− // be no jump.
677− publicPos = point;
678− }
679−
680− if (xChanged) {
681− Q_EMIT q->touchXChanged(publicPos.x());
682− if (Direction::isHorizontal(direction))
683− Q_EMIT q->distanceChanged(q->distance());
684− }
685−
686− if (yChanged) {
687− Q_EMIT q->touchYChanged(publicPos.y());
688− if (Direction::isVertical(direction))
689− Q_EMIT q->distanceChanged(q->distance());
690− }
691−}
692−
693−void DirectionalDragAreaPrivate::setPublicScenePos(const QPointF point)
694−{
695− bool xChanged = publicScenePos.x() != point.x();
696− bool yChanged = publicScenePos.y() != point.y();
697−
698− if (!xChanged && !yChanged)
699− return;
700−
701− // Public position should not get updated while the gesture is still being recognized
702− // (ie, Undecided status).
703− Q_ASSERT(status == WaitingForTouch || status == Recognized);
704−
705− qreal oldSceneDistance = sceneDistance;
706−
707− if (status == Recognized && !recognitionIsDisabled()) {
708− // When the gesture finally gets recognized, the finger will likely be
709− // reasonably far from the edge. If we made the contentX immediately
710− // follow the finger position it would be visually unpleasant as it
711− // would appear right next to the user's finger out of nowhere (ie,
712− // it would jump). Instead, we make contentX go towards the user's
713− // finger in several steps. ie., in an animated way.
714− QPointF delta = point - publicScenePos;
715− // the trick is not to go all the way (1.0) as it would cause a sudden jump
716− publicScenePos.rx() += 0.4 * delta.x();
717− publicScenePos.ry() += 0.4 * delta.y();
718− } else {
719− // no smoothing when initializing or if gesture recognition was immediate as there will
720− // be no jump.
721− publicScenePos = point;
722− }
723−
724− updateSceneDistance();
725−
726− if (oldSceneDistance != sceneDistance) {
727− Q_EMIT q->sceneDistanceChanged(sceneDistance);
728− }
729−
730− if (xChanged) {
731− Q_EMIT q->touchSceneXChanged(publicScenePos.x());
732− }
733−
734− if (yChanged) {
735− Q_EMIT q->touchSceneYChanged(publicScenePos.y());
736− }
737−}
738−
739−bool DirectionalDragAreaPrivate::isWithinTouchCompositionWindow()
740−{
741− return
742− compositionTime > 0 &&
743− !activeTouches.isEmpty() &&
744− timeSource->msecsSinceReference() <=
745− activeTouches.mostRecentStartTime() + (qint64)compositionTime;
746−}
747−
748−void DirectionalDragArea::itemChange(ItemChange change, const ItemChangeData &value)
749−{
750− if (change == QQuickItem::ItemSceneChange) {
751− if (value.window != nullptr) {
752− value.window->installEventFilter(TouchRegistry::instance());
753−
754− // TODO: Handle window->screen() changes (ie window changing screens)
755−
756− qreal pixelsPerInch = value.window->screen()->physicalDotsPerInch();
757− if (pixelsPerInch < 0) {
758− // It can return garbage when run in a XVFB server (Virtual Framebuffer 'fake' X server)
759− pixelsPerInch = 72;
760− }
761−
762− d->setPixelsPerMm(pixelsPerInch / 25.4);
763− }
764− }
765−}
766−
767−void DirectionalDragAreaPrivate::setPixelsPerMm(qreal pixelsPerMm)
768−{
769− dampedScenePos.setMaxDelta(1. * pixelsPerMm);
770− setDistanceThreshold(4. * pixelsPerMm);
771− maxDistance = 10. * pixelsPerMm;
772−}
773−
774−//************************** ActiveTouchesInfo **************************
775−
776−ActiveTouchesInfo::ActiveTouchesInfo(const SharedTimeSource &timeSource)
777− : m_timeSource(timeSource)
778−{
779−}
780−
781−void ActiveTouchesInfo::update(QTouchEvent *event)
782−{
783− if (!(event->touchPointStates() & (Qt::TouchPointPressed | Qt::TouchPointReleased))) {
784− // nothing to update
785− #if ACTIVETOUCHESINFO_DEBUG
786− qDebug("[DDA::ActiveTouchesInfo] Nothing to Update");
787− #endif
788− return;
789− }
790−
791− const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
792− for (int i = 0; i < touchPoints.count(); ++i) {
793− const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
794− if (touchPoint.state() == Qt::TouchPointPressed) {
795− addTouchPoint(touchPoint.id());
796− } else if (touchPoint.state() == Qt::TouchPointReleased) {
797− removeTouchPoint(touchPoint.id());
798− }
799− }
800−}
801−
802−#if ACTIVETOUCHESINFO_DEBUG
803−QString ActiveTouchesInfo::toString()
804−{
805− QString string = "(";
806−
807− {
808− QTextStream stream(&string);
809− m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
810− stream << "(id=" << touchInfo->id << ",startTime=" << touchInfo->startTime << ")";
811− return true;
812− });
813− }
814−
815− string.append(")");
816−
817− return string;
818−}
819−#endif // ACTIVETOUCHESINFO_DEBUG
820−
821−void ActiveTouchesInfo::addTouchPoint(int touchId)
822−{
823− ActiveTouchInfo &activeTouchInfo = m_touchInfoPool.getEmptySlot();
824− activeTouchInfo.id = touchId;
825− activeTouchInfo.startTime = m_timeSource->msecsSinceReference();
826−
827− #if ACTIVETOUCHESINFO_DEBUG
828− qDebug() << "[DDA::ActiveTouchesInfo]" << qPrintable(toString());
829− #endif
830−}
831−
832−qint64 ActiveTouchesInfo::touchStartTime(int touchId)
833−{
834− qint64 result = -1;
835−
836− m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
837− if (touchId == touchInfo->id) {
838− result = touchInfo->startTime;
839− return false;
840− } else {
841− return true;
842− }
843− });
844−
845− Q_ASSERT(result != -1);
846− return result;
847−}
848−
849−void ActiveTouchesInfo::removeTouchPoint(int touchId)
850−{
851− m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
852− if (touchId == touchInfo->id) {
853− m_touchInfoPool.freeSlot(touchInfo);
854− return false;
855− } else {
856− return true;
857− }
858− });
859−
860− #if ACTIVETOUCHESINFO_DEBUG
861− qDebug() << "[DDA::ActiveTouchesInfo]" << qPrintable(toString());
862− #endif
863−}
864−
865−qint64 ActiveTouchesInfo::mostRecentStartTime()
866−{
867− Q_ASSERT(!m_touchInfoPool.isEmpty());
868−
869− qint64 highestStartTime = -1;
870−
871− m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &activeTouchInfo) {
872− if (activeTouchInfo->startTime > highestStartTime) {
873− highestStartTime = activeTouchInfo->startTime;
874− }
875− return true;
876− });
877−
878− return highestStartTime;
879−}
880−
881−void DirectionalDragAreaPrivate::updateSceneDirectionVector()
882−{
883− QPointF localOrigin(0., 0.);
884− QPointF localDirection;
885− switch (direction) {
886− case Direction::Upwards:
887− localDirection.rx() = 0.;
888− localDirection.ry() = -1.;
889− break;
890− case Direction::Downwards:
891− case Direction::Vertical:
892− localDirection.rx() = 0.;
893− localDirection.ry() = 1;
894− break;
895− case Direction::Leftwards:
896− localDirection.rx() = -1.;
897− localDirection.ry() = 0.;
898− break;
899− default: // Direction::Rightwards || Direction.Horizontal
900− localDirection.rx() = 1.;
901− localDirection.ry() = 0.;
902− break;
903− }
904− QPointF sceneOrigin = q->mapToScene(localOrigin);
905− QPointF sceneDirection = q->mapToScene(localDirection);
906− sceneDirectionVector = sceneDirection - sceneOrigin;
907−}
908−
909−qreal DirectionalDragAreaPrivate::projectOntoDirectionVector(const QPointF sceneVector) const
910−{
911− // same as dot product as sceneDirectionVector is a unit vector
912− return sceneVector.x() * sceneDirectionVector.x() +
913− sceneVector.y() * sceneDirectionVector.y();
914−}
915−
916−DirectionalDragAreaPrivate::DirectionalDragAreaPrivate(DirectionalDragArea *q)
917− : q(q)
918− , status(WaitingForTouch)
919− , sceneDistance(0)
920− , touchId(-1)
921− , direction(Direction::Rightwards)
922− , distanceThreshold(0)
923− , distanceThresholdSquared(0.)
924− , maxTime(400)
925− , compositionTime(60)
926− , immediateRecognition(false)
927− , recognitionTimer(nullptr)
928− , timeSource(new RealTimeSource)
929− , activeTouches(timeSource)
930− , monitorOnly(false)
931−{
932−}
plugins/Ubuntu/Gestures/DirectionalDragArea.hdeleted−143
@@ -1,143 +0,0 @@
1−/*
2− * Copyright (C) 2013,2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef DIRECTIONAL_DRAG_AREA_H
18−#define DIRECTIONAL_DRAG_AREA_H
19−
20−#include <QtQuick/QQuickItem>
21−#include "UbuntuGesturesQmlGlobal.h"
22−#include "Damper.h"
23−#include "Direction.h"
24−
25−// lib UbuntuGestures
26−#include <Pool.h>
27−#include <Timer.h>
28−
29−class TouchOwnershipEvent;
30−class UnownedTouchEvent;
31−class DirectionalDragAreaPrivate;
32−
33−/*
34− An area that detects axis-aligned single-finger drag gestures
35−
36− If a drag deviates too much from the components' direction recognition will
37− fail. It will also fail if the drag or flick is too short. E.g. a noisy or
38− fidgety click
39−
40− See doc/DirectionalDragArea.svg
41− */
42−class UBUNTUGESTURESQML_EXPORT DirectionalDragArea : public QQuickItem {
43− Q_OBJECT
44−
45− // The direction in which the gesture should move in order to be recognized.
46− Q_PROPERTY(Direction::Type direction READ direction WRITE setDirection NOTIFY directionChanged)
47−
48− // The distance travelled by the finger along the axis specified by
49− // DirectionalDragArea's direction.
50− Q_PROPERTY(qreal distance READ distance NOTIFY distanceChanged)
51−
52− // The distance travelled by the finger along the axis specified by
53− // DirectionalDragArea's direction in scene coordinates
54− Q_PROPERTY(qreal sceneDistance READ sceneDistance NOTIFY sceneDistanceChanged)
55−
56− // Position of the touch point performing the drag relative to this item.
57− Q_PROPERTY(qreal touchX READ touchX NOTIFY touchXChanged)
58− Q_PROPERTY(qreal touchY READ touchY NOTIFY touchYChanged)
59−
60− // Position of the touch point performing the drag, in scene's coordinate system
61− Q_PROPERTY(qreal touchSceneX READ touchSceneX NOTIFY touchSceneXChanged)
62− Q_PROPERTY(qreal touchSceneY READ touchSceneY NOTIFY touchSceneYChanged)
63−
64− // Whether a drag gesture is taking place
65− Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged)
66−
67− // Whether the drag area is pressed.
68− Q_PROPERTY(bool pressed READ pressed NOTIFY pressedChanged)
69−
70− // Whether a gesture should be Recognized as soon a touch lands on the area.
71− // With this property enabled it will work pretty much like a MultiPointTouchArea,
72− // just with a different API.
73− //
74− // It's false by default. In most cases you will not want that enabled.
75− Q_PROPERTY(bool immediateRecognition
76− READ immediateRecognition
77− WRITE setImmediateRecognition
78− NOTIFY immediateRecognitionChanged)
79−
80− // Whether we are merely monitoring touch events (in which case, we don't
81− // claim ownership of the touch).
82− Q_PROPERTY(bool monitorOnly READ monitorOnly WRITE setMonitorOnly NOTIFY monitorOnlyChanged)
83−
84− Q_ENUMS(Direction)
85−public:
86− DirectionalDragArea(QQuickItem *parent = 0);
87−
88− Direction::Type direction() const;
89− void setDirection(Direction::Type);
90−
91− qreal distance() const;
92− qreal sceneDistance() const;
93−
94− qreal touchX() const;
95− qreal touchY() const;
96−
97− qreal touchSceneX() const;
98− qreal touchSceneY() const;
99−
100− bool dragging() const;
101−
102− bool pressed() const;
103−
104− bool immediateRecognition() const;
105− void setImmediateRecognition(bool enabled);
106−
107− bool monitorOnly() const;
108− void setMonitorOnly(bool monitorOnly);
109−
110− bool event(QEvent *e) override;
111−
112− /*
113− In qmltests, sequences of touch events are sent all at once, unlike in "real life".
114− Also qmltests might run really slowly, e.g. when run from inside virtual machines.
115− Thus to remove a variable that qmltests cannot really control, namely time, this
116− function removes all constraints that are sensible to elapsed time.
117−
118− This effectively makes the DirectionalDragArea easier to fool.
119− */
120− Q_INVOKABLE void removeTimeConstraints();
121−
122−Q_SIGNALS:
123− void directionChanged(Direction::Type direction);
124− void draggingChanged(bool value);
125− void pressedChanged(bool value);
126− void distanceChanged(qreal value);
127− void sceneDistanceChanged(qreal value);
128− void touchXChanged(qreal value);
129− void touchYChanged(qreal value);
130− void touchSceneXChanged(qreal value);
131− void touchSceneYChanged(qreal value);
132− void immediateRecognitionChanged(bool value);
133− void monitorOnlyChanged(bool value);
134−
135−protected:
136− void touchEvent(QTouchEvent *event) override;
137− void itemChange(ItemChange change, const ItemChangeData &value) override;
138−
139−public: // so tests can access it
140− DirectionalDragAreaPrivate *d;
141−};
142−
143−#endif // DIRECTIONAL_DRAG_AREA_H
plugins/Ubuntu/Gestures/DirectionalDragArea_p.hdeleted−169
@@ -1,169 +0,0 @@
1−/*
2− * Copyright (C) 2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef DIRECTIONAL_DRAG_AREA_PRIV_H
18−#define DIRECTIONAL_DRAG_AREA_PRIV_H
19−
20−// Information about an active touch point
21−struct UBUNTUGESTURESQML_EXPORT ActiveTouchInfo {
22− ActiveTouchInfo() : id(-1), startTime(-1) {}
23− bool isValid() const { return id != -1; }
24− void reset() { id = -1; }
25− int id;
26− qint64 startTime;
27−};
28−class UBUNTUGESTURESQML_EXPORT ActiveTouchesInfo {
29−public:
30− ActiveTouchesInfo(const UbuntuGestures::SharedTimeSource &timeSource);
31− void update(QTouchEvent *event);
32− qint64 touchStartTime(int id);
33− bool isEmpty() const { return m_touchInfoPool.isEmpty(); }
34− qint64 mostRecentStartTime();
35− UbuntuGestures::SharedTimeSource m_timeSource;
36−private:
37− void addTouchPoint(int touchId);
38− void removeTouchPoint(int touchId);
39− #if ACTIVETOUCHESINFO_DEBUG
40− QString toString();
41− #endif
42−
43− Pool<ActiveTouchInfo> m_touchInfoPool;
44−};
45−
46−class UBUNTUGESTURESQML_EXPORT DirectionalDragAreaPrivate : public QObject {
47− Q_OBJECT
48−
49− Q_ENUMS(Status)
50−public:
51− DirectionalDragAreaPrivate(DirectionalDragArea *q);
52−
53−public Q_SLOTS:
54− void giveUpIfDisabledOrInvisible();
55− void rejectGesture();
56−
57−public:
58− // Describes the state of the directional drag gesture.
59− enum Status {
60− // Waiting for a new touch point to land on this area. No gesture is being processed
61− // or tracked.
62− WaitingForTouch,
63−
64− // A touch point has landed on this area but it's not know yet whether it is
65− // performing a drag in the correct direction.
66− // If it's decided that the touch point is not performing a directional drag gesture,
67− // it will be rejected/ignored and status will return to WaitingForTouch.
68− Undecided, //Recognizing,
69−
70− // There's a touch point in this area and it performed a drag in the correct
71− // direction.
72− //
73− // Once recognized, the gesture state will move back to WaitingForTouch only once
74− // that touch point ends. The gesture will remain in the Recognized state even if
75− // the touch point starts moving in other directions or halts.
76− Recognized,
77− };
78−
79− void touchEvent_absent(QTouchEvent *event);
80− void touchEvent_undecided(QTouchEvent *event);
81− void touchEvent_recognized(QTouchEvent *event);
82− bool movingInRightDirection() const;
83− bool movedFarEnoughAlongGestureAxis() const;
84− bool isPastMaxDistance() const;
85− const QTouchEvent::TouchPoint *fetchTargetTouchPoint(QTouchEvent *event);
86− void setStatus(Status newStatus);
87− void setPublicPos(const QPointF point);
88− void setPublicScenePos(const QPointF point);
89− bool isWithinTouchCompositionWindow();
90− void updateSceneDirectionVector();
91− // returns the scalar projection between the given vector (in scene coordinates)
92− // and m_sceneDirectionVector
93− qreal projectOntoDirectionVector(const QPointF sceneVector) const;
94− void touchOwnershipEvent(TouchOwnershipEvent *event);
95− void unownedTouchEvent(UnownedTouchEvent *event);
96− void unownedTouchEvent_undecided(UnownedTouchEvent *unownedTouchEvent);
97− void watchPressedTouchPoints(const QList<QTouchEvent::TouchPoint> &touchPoints);
98− bool recognitionIsDisabled() const;
99− bool sanityCheckRecognitionProperties();
100− void updateSceneDistance();
101− void setMaxTime(int value);
102− void setDistanceThreshold(qreal value);
103− void setPixelsPerMm(qreal pixelsPerMm);
104− QString objectName() const { return q->objectName(); }
105−
106− // Replaces the existing Timer with the given one.
107− //
108− // Useful for providing a fake timer when testing.
109− void setRecognitionTimer(UbuntuGestures::AbstractTimer *timer);
110−
111− // Useful for testing, where a fake time source can be supplied
112− void setTimeSource(const UbuntuGestures::SharedTimeSource &timeSource);
113−
114− DirectionalDragArea *q;
115−
116− // The current status of the directional drag gesture area.
117− Status status;
118−
119− QPointF startPos;
120− QPointF startScenePos;
121− qreal sceneDistance;
122− int touchId;
123−
124− // The touch position exposed in the public API.
125− // It only starts to move once the gesture gets recognized.
126− QPointF publicPos;
127− QPointF publicScenePos;
128−
129− // A movement damper is used in some of the gesture recognition calculations
130− // to get rid of noise or small oscillations in the touch position.
131− DampedPointF dampedScenePos;
132− QPointF previousDampedScenePos;
133−
134− // Unit vector in scene coordinates describing the direction of the gesture recognition
135− QPointF sceneDirectionVector;
136−
137− Direction::Type direction;
138−
139− // How far a touch point has to move from its initial position along the gesture axis in order
140− // for it to be recognized as a directional drag.
141− qreal distanceThreshold;
142− qreal distanceThresholdSquared; // it's pow(distanceThreshold, 2)
143−
144− // Maximum time (in milliseconds) the gesture can take to go beyond the distance threshold
145− int maxTime;
146−
147− // Maximum distance the gesture can go without crossing the axis-aligned distance threshold
148− qreal maxDistance;
149−
150− // Maximum time (in milliseconds) after the start of a given touch point where
151− // subsequent touch starts are grouped with the first one into an N-touches gesture
152− // (e.g. a two-fingers tap or drag).
153− int compositionTime;
154−
155− bool immediateRecognition;
156−
157− UbuntuGestures::AbstractTimer *recognitionTimer;
158−
159− UbuntuGestures::SharedTimeSource timeSource;
160−
161− ActiveTouchesInfo activeTouches;
162−
163− bool monitorOnly;
164−
165−Q_SIGNALS:
166− void statusChanged(Status value);
167−};
168−
169−#endif // DIRECTIONAL_DRAG_AREA_PRIV_H
plugins/Ubuntu/Gestures/FloatingFlickable.cppdeleted−150
@@ -1,150 +0,0 @@
1−/*
2− * Copyright (C) 2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "FloatingFlickable.h"
18−
19−#include <private/qquickflickable_p.h>
20−#include "DirectionalDragArea.h"
21−
22−#include <QDebug>
23−
24−FloatingFlickable::FloatingFlickable(QQuickItem *parent)
25− : QQuickItem(parent)
26− , m_mousePressed(false)
27−{
28− m_dragArea = new DirectionalDragArea(this);
29− m_dragArea->setWidth(width());
30− m_dragArea->setHeight(height());
31− m_dragArea->setDirection(Direction::Horizontal);
32− connect(m_dragArea, &DirectionalDragArea::touchXChanged,
33− this, &FloatingFlickable::onDragAreaTouchPosChanged);
34− connect(m_dragArea, &DirectionalDragArea::touchYChanged,
35− this, &FloatingFlickable::onDragAreaTouchPosChanged);
36− connect(m_dragArea, &DirectionalDragArea::draggingChanged,
37− this, &FloatingFlickable::onDragAreaDraggingChanged);
38− connect(m_dragArea, &DirectionalDragArea::directionChanged, this, &FloatingFlickable::directionChanged);
39−
40− m_flickable = new QQuickFlickable(this);
41− m_flickable->setEnabled(false);
42− m_flickable->setWidth(width());
43− m_flickable->setHeight(height());
44− connect(m_flickable, &QQuickFlickable::contentWidthChanged, this, &FloatingFlickable::contentWidthChanged);
45− connect(m_flickable, &QQuickFlickable::contentHeightChanged, this, &FloatingFlickable::contentHeightChanged);
46− connect(m_flickable, &QQuickFlickable::contentXChanged, this, &FloatingFlickable::contentXChanged);
47− connect(m_flickable, &QQuickFlickable::contentYChanged, this, &FloatingFlickable::contentYChanged);
48−
49− connect(this, &QQuickItem::widthChanged, this, &FloatingFlickable::updateChildrenWidth);
50− connect(this, &QQuickItem::heightChanged, this, &FloatingFlickable::updateChildrenHeight);
51−}
52−
53−qreal FloatingFlickable::contentWidth() const
54−{
55− return m_flickable->contentWidth();
56−}
57−
58−void FloatingFlickable::setContentWidth(qreal contentWidth)
59−{
60− m_flickable->setContentWidth(contentWidth);
61−}
62−
63−qreal FloatingFlickable::contentHeight() const
64−{
65− return m_flickable->contentHeight();
66−}
67−
68−void FloatingFlickable::setContentHeight(qreal contentHeight)
69−{
70− m_flickable->setContentHeight(contentHeight);
71−}
72−
73−qreal FloatingFlickable::contentX() const
74−{
75− return m_flickable->contentX();
76−}
77−
78−void FloatingFlickable::setContentX(qreal contentX)
79−{
80− m_flickable->setContentX(contentX);
81−}
82−
83−qreal FloatingFlickable::contentY() const
84−{
85− return m_flickable->contentY();
86−}
87−
88−void FloatingFlickable::setContentY(qreal contentY)
89−{
90− m_flickable->setContentY(contentY);
91−}
92−
93−Direction::Type FloatingFlickable::direction() const
94−{
95− return m_dragArea->direction();
96−}
97−
98−void FloatingFlickable::setDirection(Direction::Type direction)
99−{
100− m_dragArea->setDirection(direction);
101− if (Direction::isHorizontal(direction)) {
102− m_flickable->setFlickableDirection(QQuickFlickable::HorizontalFlick);
103− } else {
104− m_flickable->setFlickableDirection(QQuickFlickable::VerticalFlick);
105− }
106−}
107−
108−void FloatingFlickable::updateChildrenWidth()
109−{
110− m_dragArea->setWidth(width());
111− m_flickable->setWidth(width());
112−}
113−
114−void FloatingFlickable::updateChildrenHeight()
115−{
116− m_dragArea->setHeight(height());
117− m_flickable->setHeight(height());
118−}
119−
120−void FloatingFlickable::onDragAreaTouchPosChanged(qreal)
121−{
122− if (m_mousePressed) {
123− QMouseEvent mouseEvent(QEvent::MouseMove,
124− QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
125− Qt::NoButton, Qt::LeftButton, Qt::NoModifier);
126−
127− QCoreApplication::sendEvent(m_flickable, &mouseEvent);
128−
129− }
130−}
131−
132−void FloatingFlickable::onDragAreaDraggingChanged(bool dragging)
133−{
134− if (dragging && !m_mousePressed) {
135− QMouseEvent mouseEvent(QEvent::MouseButtonPress,
136− QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
137− Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
138−
139− QCoreApplication::sendEvent(m_flickable, &mouseEvent);
140− m_mousePressed = true;
141−
142− } else if (!dragging && m_mousePressed) {
143− QMouseEvent mouseEvent(QEvent::MouseButtonRelease,
144− QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
145− Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
146−
147− QCoreApplication::sendEvent(m_flickable, &mouseEvent);
148− m_mousePressed = false;
149− }
150−}
plugins/Ubuntu/Gestures/FloatingFlickable.hdeleted−86
@@ -1,86 +0,0 @@
1−/*
2− * Copyright (C) 2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef FLOATING_FLICKABLE_H
18−#define FLOATING_FLICKABLE_H
19−
20−#include <QQuickItem>
21−#include "UbuntuGesturesQmlGlobal.h"
22−#include "Direction.h"
23−
24−class DirectionalDragArea;
25−class QQuickFlickable;
26−
27−/*
28− A Flickable that can be put in front of the item to be flicked and
29− still have the item-to-be-flicked receive input events that are not flicks.
30−
31− Ie, it's a Flickable that, input-wise, is transparent to non-flick gestures.
32−
33− With a regular Flickable you would have to make the item-to-be-flicked a child
34− of Flicakble to achieve the same result. FloatingFlickable has no such requirement
35− or limitation.
36− */
37−class UBUNTUGESTURESQML_EXPORT FloatingFlickable : public QQuickItem {
38− Q_OBJECT
39−
40− Q_PROPERTY(qreal contentWidth READ contentWidth WRITE setContentWidth NOTIFY contentWidthChanged)
41− Q_PROPERTY(qreal contentHeight READ contentHeight WRITE setContentHeight NOTIFY contentHeightChanged)
42− Q_PROPERTY(qreal contentX READ contentX WRITE setContentX NOTIFY contentXChanged)
43− Q_PROPERTY(qreal contentY READ contentY WRITE setContentY NOTIFY contentYChanged)
44−
45− Q_PROPERTY(Direction::Type direction READ direction WRITE setDirection NOTIFY directionChanged)
46−
47−Q_SIGNALS:
48− void contentWidthChanged();
49− void contentHeightChanged();
50− void contentXChanged();
51− void contentYChanged();
52− void directionChanged();
53−
54−public:
55− FloatingFlickable(QQuickItem *parent = nullptr);
56−
57− qreal contentWidth() const;
58− void setContentWidth(qreal contentWidth);
59−
60− qreal contentHeight() const;
61− void setContentHeight(qreal contentHeight);
62−
63− qreal contentX() const;
64− void setContentX(qreal contentX);
65−
66− qreal contentY() const;
67− void setContentY(qreal contentY);
68−
69− Direction::Type direction() const;
70− void setDirection(Direction::Type);
71−
72−private Q_SLOTS:
73− void updateChildrenWidth();
74− void updateChildrenHeight();
75− void onDragAreaTouchPosChanged(qreal);
76− void onDragAreaDraggingChanged(bool value);
77−
78−private:
79− DirectionalDragArea *m_dragArea;
80− QQuickFlickable *m_flickable;
81− bool m_mousePressed;
82−
83− friend class tst_FloatingFlickable;
84−};
85−
86−#endif // FLOATING_FLICKABLE_H
plugins/Ubuntu/Gestures/Gestures.qmltypesdeleted−209
@@ -1,209 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Ubuntu.Gestures 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "AxisVelocityCalculator"
12− prototype: "QObject"
13− exports: ["Ubuntu.Gestures/AxisVelocityCalculator 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "trackedPosition"; type: "double" }
16− Signal {
17− name: "trackedPositionChanged"
18− Parameter { name: "value"; type: "double" }
19− }
20− Method { name: "calculate"; type: "double" }
21− Method { name: "reset" }
22− }
23− Component {
24− name: "Direction"
25− prototype: "QObject"
26− exports: ["Ubuntu.Gestures/Direction 0.1"]
27− isCreatable: false
28− isSingleton: true
29− exportMetaObjectRevisions: [0]
30− Enum {
31− name: "Type"
32− values: {
33− "Rightwards": 0,
34− "Leftwards": 1,
35− "Downwards": 2,
36− "Upwards": 3,
37− "Horizontal": 4,
38− "Vertical": 5
39− }
40− }
41− Method {
42− name: "isHorizontal"
43− type: "bool"
44− Parameter { name: "type"; type: "Direction::Type" }
45− }
46− Method {
47− name: "isVertical"
48− type: "bool"
49− Parameter { name: "type"; type: "Direction::Type" }
50− }
51− Method {
52− name: "isPositive"
53− type: "bool"
54− Parameter { name: "type"; type: "Direction::Type" }
55− }
56− }
57− Component {
58− name: "DirectionalDragArea"
59− defaultProperty: "data"
60− prototype: "QQuickItem"
61− exports: ["Ubuntu.Gestures/DirectionalDragArea 0.1"]
62− exportMetaObjectRevisions: [0]
63− Property { name: "direction"; type: "Direction::Type" }
64− Property { name: "distance"; type: "double"; isReadonly: true }
65− Property { name: "sceneDistance"; type: "double"; isReadonly: true }
66− Property { name: "touchX"; type: "double"; isReadonly: true }
67− Property { name: "touchY"; type: "double"; isReadonly: true }
68− Property { name: "touchSceneX"; type: "double"; isReadonly: true }
69− Property { name: "touchSceneY"; type: "double"; isReadonly: true }
70− Property { name: "dragging"; type: "bool"; isReadonly: true }
71− Property { name: "pressed"; type: "bool"; isReadonly: true }
72− Property { name: "immediateRecognition"; type: "bool" }
73− Signal {
74− name: "directionChanged"
75− Parameter { name: "direction"; type: "Direction::Type" }
76− }
77− Signal {
78− name: "draggingChanged"
79− Parameter { name: "value"; type: "bool" }
80− }
81− Signal {
82− name: "pressedChanged"
83− Parameter { name: "value"; type: "bool" }
84− }
85− Signal {
86− name: "distanceChanged"
87− Parameter { name: "value"; type: "double" }
88− }
89− Signal {
90− name: "sceneDistanceChanged"
91− Parameter { name: "value"; type: "double" }
92− }
93− Signal {
94− name: "touchXChanged"
95− Parameter { name: "value"; type: "double" }
96− }
97− Signal {
98− name: "touchYChanged"
99− Parameter { name: "value"; type: "double" }
100− }
101− Signal {
102− name: "touchSceneXChanged"
103− Parameter { name: "value"; type: "double" }
104− }
105− Signal {
106− name: "touchSceneYChanged"
107− Parameter { name: "value"; type: "double" }
108− }
109− Signal {
110− name: "immediateRecognitionChanged"
111− Parameter { name: "value"; type: "bool" }
112− }
113− Method { name: "removeTimeConstraints" }
114− }
115− Component {
116− name: "FloatingFlickable"
117− defaultProperty: "data"
118− prototype: "QQuickItem"
119− exports: ["Ubuntu.Gestures/FloatingFlickable 0.1"]
120− exportMetaObjectRevisions: [0]
121− Property { name: "contentWidth"; type: "double" }
122− Property { name: "contentHeight"; type: "double" }
123− Property { name: "contentX"; type: "double" }
124− Property { name: "contentY"; type: "double" }
125− Property { name: "direction"; type: "Direction::Type" }
126− }
127− Component {
128− name: "GestureTouchPoint"
129− prototype: "QObject"
130− exports: ["Ubuntu.Gestures/GestureTouchPoint 0.1"]
131− isCreatable: false
132− exportMetaObjectRevisions: [0]
133− Property { name: "pointId"; type: "int"; isReadonly: true }
134− Property { name: "pressed"; type: "bool"; isReadonly: true }
135− Property { name: "x"; type: "double"; isReadonly: true }
136− Property { name: "y"; type: "double"; isReadonly: true }
137− Property { name: "dragging"; type: "bool"; isReadonly: true }
138− }
139− Component {
140− name: "PressedOutsideNotifier"
141− defaultProperty: "data"
142− prototype: "QQuickItem"
143− exports: ["Ubuntu.Gestures/PressedOutsideNotifier 0.1"]
144− exportMetaObjectRevisions: [0]
145− Signal { name: "pressedOutside" }
146− }
147− Component {
148− name: "TouchGate"
149− defaultProperty: "data"
150− prototype: "QQuickItem"
151− exports: ["Ubuntu.Gestures/TouchGate 0.1"]
152− exportMetaObjectRevisions: [0]
153− Property { name: "targetItem"; type: "QQuickItem"; isPointer: true }
154− Signal {
155− name: "targetItemChanged"
156− Parameter { name: "item"; type: "QQuickItem"; isPointer: true }
157− }
158− }
159− Component {
160− name: "TouchGestureArea"
161− defaultProperty: "data"
162− prototype: "QQuickItem"
163− exports: ["Ubuntu.Gestures/TouchGestureArea 0.1"]
164− exportMetaObjectRevisions: [0]
165− Enum {
166− name: "Status"
167− values: {
168− "WaitingForTouch": 0,
169− "Undecided": 1,
170− "Recognized": 2,
171− "Rejected": 3
172− }
173− }
174− Property { name: "touchPoints"; type: "GestureTouchPoint"; isList: true; isReadonly: true }
175− Property { name: "dragging"; type: "bool"; isReadonly: true }
176− Property { name: "minimumTouchPoints"; type: "int" }
177− Property { name: "maximumTouchPoints"; type: "int" }
178− Signal {
179− name: "statusChanged"
180− Parameter { name: "status"; type: "Status" }
181− }
182− Signal { name: "touchPointsUpdated" }
183− Signal {
184− name: "draggingChanged"
185− Parameter { name: "dragging"; type: "bool" }
186− }
187− Signal {
188− name: "minimumTouchPointsChanged"
189− Parameter { name: "value"; type: "bool" }
190− }
191− Signal {
192− name: "maximumTouchPointsChanged"
193− Parameter { name: "value"; type: "bool" }
194− }
195− Signal {
196− name: "pressed"
197− Parameter { name: "points"; type: "QList<QObject*>" }
198− }
199− Signal {
200− name: "released"
201− Parameter { name: "points"; type: "QList<QObject*>" }
202− }
203− Signal {
204− name: "updated"
205− Parameter { name: "points"; type: "QList<QObject*>" }
206− }
207− Signal { name: "clicked" }
208− }
209−}
plugins/Ubuntu/Gestures/MouseEventGenerator.cppnew file+64
@@ -0,0 +1,64 @@
1+/*
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "MouseEventGenerator.h"
18+
19+#include <QCoreApplication>
20+#include <QMouseEvent>
21+#include <QQuickItem>
22+
23+MouseEventGenerator::MouseEventGenerator(QObject *parent)
24+ : QObject(parent)
25+{
26+}
27+
28+void MouseEventGenerator::move(const QPointF position)
29+{
30+ if (!m_mousePressed || !m_targetItem) {
31+ return;
32+ }
33+
34+ QMouseEvent mouseEvent(QEvent::MouseMove,
35+ QPointF(position.x(), position.y()), Qt::NoButton, Qt::LeftButton, Qt::NoModifier);
36+
37+ QCoreApplication::sendEvent(m_targetItem, &mouseEvent);
38+}
39+
40+void MouseEventGenerator::press(const QPointF position)
41+{
42+ if (m_mousePressed || !m_targetItem) {
43+ return;
44+ }
45+
46+ QMouseEvent mouseEvent(QEvent::MouseButtonPress,
47+ QPointF(position.x(), position.y()), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
48+
49+ QCoreApplication::sendEvent(m_targetItem, &mouseEvent);
50+ m_mousePressed = true;
51+}
52+
53+void MouseEventGenerator::release(const QPointF position)
54+{
55+ if (!m_mousePressed || !m_targetItem) {
56+ return;
57+ }
58+
59+ QMouseEvent mouseEvent(QEvent::MouseButtonRelease,
60+ QPointF(position.x(), position.y()), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
61+
62+ QCoreApplication::sendEvent(m_targetItem, &mouseEvent);
63+ m_mousePressed = false;
64+}
plugins/Ubuntu/Gestures/MouseEventGenerator.hnew file+48
@@ -0,0 +1,48 @@
1+/*
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef MOUSEEVENTGENERATOR_H
18+#define MOUSEEVENTGENERATOR_H
19+
20+#include <QObject>
21+#include <QPointF>
22+
23+#include "UbuntuGesturesQmlGlobal.h"
24+
25+class QQuickItem;
26+
27+class UBUNTUGESTURESQML_EXPORT MouseEventGenerator : public QObject {
28+ Q_OBJECT
29+ Q_PROPERTY(QQuickItem* targetItem MEMBER m_targetItem NOTIFY targetItemChanged)
30+
31+public:
32+ MouseEventGenerator(QObject *parent = nullptr);
33+
34+ Q_INVOKABLE void move(const QPointF position);
35+ Q_INVOKABLE void press(const QPointF position);
36+ Q_INVOKABLE void release(const QPointF position);
37+
38+Q_SIGNALS:
39+ void targetItemChanged(QQuickItem *);
40+
41+private:
42+ bool m_mousePressed {false};
43+ QQuickItem *m_targetItem {nullptr};
44+
45+ friend class tst_FloatingFlickable;
46+};
47+
48+#endif // MOUSEEVENTGENERATOR_H
plugins/Ubuntu/Gestures/PressedOutsideNotifier.h+1−1
@@ -23,7 +23,7 @@
23#include <QPointer>
23#include <QPointer>
24#include <QTimer>
24#include <QTimer>
25
25
26−#include "UbuntuGesturesGlobal.h"
26+#include <ubuntugesturesglobal.h>
27
27
28/*
28/*
29 Notifies when a point, mouse or touch, is pressed outside its area.
29 Notifies when a point, mouse or touch, is pressed outside its area.
plugins/Ubuntu/Gestures/TouchDispatcher.cpp+1−5
@@ -19,11 +19,7 @@
19#include <QGuiApplication>
19#include <QGuiApplication>
20#include <QScopedPointer>
20#include <QScopedPointer>
21#include <QStyleHints>
21#include <QStyleHints>
22−
23−#pragma GCC diagnostic push
24−#pragma GCC diagnostic ignored "-pedantic"
25#include <private/qquickitem_p.h>
22#include <private/qquickitem_p.h>
26−#pragma GCC diagnostic pop
27
23
28#define TOUCHDISPATCHER_DEBUG 0
24#define TOUCHDISPATCHER_DEBUG 0
29
25
@@ -225,7 +221,7 @@ void TouchDispatcher::dispatchAsMouse(
225 QEvent::Type eventType;
221 QEvent::Type eventType;
226 if (touchMouse->state() == Qt::TouchPointPressed) {
222 if (touchMouse->state() == Qt::TouchPointPressed) {
227 eventType = QEvent::MouseButtonPress;
223 eventType = QEvent::MouseButtonPress;
228− } if (touchMouse->state() == Qt::TouchPointReleased) {
224+ } else if (touchMouse->state() == Qt::TouchPointReleased) {
229 eventType = QEvent::MouseButtonRelease;
225 eventType = QEvent::MouseButtonRelease;
230 m_touchMouseId = -1;
226 m_touchMouseId = -1;
231 } else {
227 } else {
plugins/Ubuntu/Gestures/TouchGate.cpp+2−2
@@ -20,8 +20,8 @@
20#include <QDebug>
20#include <QDebug>
21#include <QQuickWindow>
21#include <QQuickWindow>
22
22
23−#include <TouchOwnershipEvent.h>
23+#include <TouchOwnershipEvent>
24−#include <TouchRegistry.h>
24+#include <TouchRegistry>
25
25
26#if TOUCHGATE_DEBUG
26#if TOUCHGATE_DEBUG
27#define ugDebug(params) qDebug().nospace() << "[TouchGate(" << (void*)this << ")] " << params
27#define ugDebug(params) qDebug().nospace() << "[TouchGate(" << (void*)this << ")] " << params
plugins/Ubuntu/Gestures/TouchGestureArea.cpp+16−15
@@ -16,10 +16,11 @@
16
16
17#include "TouchGestureArea.h"
17#include "TouchGestureArea.h"
18
18
19−// local
20−#include "TouchOwnershipEvent.h"
19+#include <UbuntuGestures/TouchOwnershipEvent>
20+#include <UbuntuGestures/TouchRegistry>
21+#include <UbuntuGestures/UnownedTouchEvent>
21−#include "TouchRegistry.h"
22+// #include "TouchRegistry.h"
22−#include "UnownedTouchEvent.h"
23+// #include "UnownedTouchEvent.h"
23
24
24#include <QGuiApplication>
25#include <QGuiApplication>
25#include <QStyleHints>
26#include <QStyleHints>
@@ -374,7 +375,7 @@ void TouchGestureArea::unownedTouchEvent_waitingForMoreTouches(QTouchEvent *even
374 }
375 }
375 }
376 }
376
377
377− if (m_candidateTouches.count() == 0) {
378+ if (m_candidateTouches.isEmpty()) {
378 setInternalStatus(InternalStatus::WaitingForTouch);
379 setInternalStatus(InternalStatus::WaitingForTouch);
379 }
380 }
380}
381}
@@ -438,7 +439,7 @@ void TouchGestureArea::unownedTouchEvent_rejected(QTouchEvent *event)
438 }
439 }
439 }
440 }
440
441
441− if (m_watchedTouches.count() == 0) {
442+ if (m_watchedTouches.isEmpty()) {
442 setInternalStatus(InternalStatus::WaitingForTouch);
443 setInternalStatus(InternalStatus::WaitingForTouch);
443 }
444 }
444}
445}
@@ -526,7 +527,7 @@ void TouchGestureArea::updateTouchPoints(QTouchEvent *touchEvent)
526 if (updateable) {
527 if (updateable) {
527 if (!dragging() && m_status == InternalStatus::Recognized) {
528 if (!dragging() && m_status == InternalStatus::Recognized) {
528 bool allWantDrag = !m_liveTouchPoints.isEmpty();
529 bool allWantDrag = !m_liveTouchPoints.isEmpty();
529− Q_FOREACH(auto point, m_liveTouchPoints) {
530+ Q_FOREACH(const auto &point, m_liveTouchPoints) {
530 allWantDrag &= point->dragging();
531 allWantDrag &= point->dragging();
531 }
532 }
532 // only dragging if all points are dragging.
533 // only dragging if all points are dragging.
@@ -588,13 +589,15 @@ void TouchGestureArea::setInternalStatus(uint newStatus)
588 resyncCachedTouchPoints();
589 resyncCachedTouchPoints();
589 break;
590 break;
590 case InternalStatus::WaitingForMoreTouches:
591 case InternalStatus::WaitingForMoreTouches:
591− m_recognitionTimer->start(m_recognitionPeriod);
592+ m_recognitionTimer->setInterval(m_recognitionPeriod);
593+ m_recognitionTimer->start();
592 break;
594 break;
593 case InternalStatus::Recognized:
595 case InternalStatus::Recognized:
594 resyncCachedTouchPoints();
596 resyncCachedTouchPoints();
595 break;
597 break;
596 case InternalStatus::WaitingForRejection:
598 case InternalStatus::WaitingForRejection:
597− m_recognitionTimer->start(m_releaseRejectPeriod);
599+ m_recognitionTimer->setInterval(m_releaseRejectPeriod);
600+ m_recognitionTimer->start();
598 break;
601 break;
599 case InternalStatus::Rejected:
602 case InternalStatus::Rejected:
600 resyncCachedTouchPoints();
603 resyncCachedTouchPoints();
@@ -643,11 +646,9 @@ bool TouchGestureArea::dragging() const
643QQmlListProperty<GestureTouchPoint> TouchGestureArea::touchPoints()
646QQmlListProperty<GestureTouchPoint> TouchGestureArea::touchPoints()
644{
647{
645 return QQmlListProperty<GestureTouchPoint>(this,
648 return QQmlListProperty<GestureTouchPoint>(this,
646− 0,
647− nullptr,
649+ nullptr,
648− TouchGestureArea::touchPoint_count,
650+ TouchGestureArea::touchPoint_count,
649− TouchGestureArea::touchPoint_at,
651+ TouchGestureArea::touchPoint_at);
650− 0);
651}
652}
652
653
653int TouchGestureArea::minimumTouchPoints() const
654int TouchGestureArea::minimumTouchPoints() const
@@ -718,7 +719,7 @@ void TouchGestureArea::rejectGesture()
718 }
719 }
719 m_candidateTouches.clear();
720 m_candidateTouches.clear();
720
721
721− if (m_watchedTouches.count() == 0) {
722+ if (m_watchedTouches.isEmpty()) {
722 setInternalStatus(InternalStatus::WaitingForTouch);
723 setInternalStatus(InternalStatus::WaitingForTouch);
723 } else {
724 } else {
724 setInternalStatus(InternalStatus::Rejected);
725 setInternalStatus(InternalStatus::Rejected);
plugins/Ubuntu/Gestures/TouchGestureArea.h+9−10
@@ -21,8 +21,7 @@
21
21
22#include <QQuickItem>
22#include <QQuickItem>
23
23
24−// lib UbuntuGestures
25−#include <Timer.h>
24+#include <UbuntuGestures/Timer>
26
25
27class TouchOwnershipEvent;
26class TouchOwnershipEvent;
28class UnownedTouchEvent;
27class UnownedTouchEvent;
@@ -106,8 +105,8 @@ private:
106/*
105/*
107 An area that detects multi-finger gestures.
106 An area that detects multi-finger gestures.
108
107
109− We can use this to detect gestures contstrained by a minimim and/or maximum number of touch points.
108+ We can use this to detect gestures constrained by a minimum and/or maximum number of touch points.
110− This components uses the touch registry to apply for ownership of touch points.
109+ This component uses the touch registry to apply for ownership of touch points.
111 This way we can use the component in conjuntion with the directional drag area to compete for ownwership
110 This way we can use the component in conjuntion with the directional drag area to compete for ownwership
112 or gestures; unlike the MultiPointTouchArea.
111 or gestures; unlike the MultiPointTouchArea.
113 */
112 */
@@ -137,7 +136,7 @@ public:
137 Recognized,
136 Recognized,
138 Rejected
137 Rejected
139 };
138 };
140− TouchGestureArea(QQuickItem* parent = NULL);
139+ TouchGestureArea(QQuickItem* parent = nullptr);
141 ~TouchGestureArea();
140 ~TouchGestureArea();
142
141
143 bool event(QEvent *e) override;
142 bool event(QEvent *e) override;
@@ -165,10 +164,10 @@ Q_SIGNALS:
165
164
166 void touchPointsUpdated();
165 void touchPointsUpdated();
167 void draggingChanged(bool dragging);
166 void draggingChanged(bool dragging);
168− void minimumTouchPointsChanged(bool value);
167+ void minimumTouchPointsChanged(int value);
169− void maximumTouchPointsChanged(bool value);
168+ void maximumTouchPointsChanged(int value);
170− void recognitionPeriodChanged(bool value);
169+ void recognitionPeriodChanged(int value);
171− void releaseRejectPeriodChanged(bool value);
170+ void releaseRejectPeriodChanged(int value);
172
171
173 void pressed(const QList<QObject*>& points);
172 void pressed(const QList<QObject*>& points);
174 void released(const QList<QObject*>& points);
173 void released(const QList<QObject*>& points);
@@ -176,7 +175,7 @@ Q_SIGNALS:
176 void clicked();
175 void clicked();
177
176
178protected:
177protected:
179− void itemChange(ItemChange change, const ItemChangeData &value);
178+ void itemChange(ItemChange change, const ItemChangeData &value) override;
180
179
181private Q_SLOTS:
180private Q_SLOTS:
182 void rejectGesture();
181 void rejectGesture();
plugins/Ubuntu/Gestures/plugin.cpp+3−5
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013,2015 Canonical, Ltd.
2+ * Copyright (C) 2013,2015,2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -17,8 +17,7 @@
17#include "plugin.h"
17#include "plugin.h"
18#include "AxisVelocityCalculator.h"
18#include "AxisVelocityCalculator.h"
19#include "Direction.h"
19#include "Direction.h"
20−#include "DirectionalDragArea.h"
20+#include "MouseEventGenerator.h"
21−#include "FloatingFlickable.h"
22#include "PressedOutsideNotifier.h"
21#include "PressedOutsideNotifier.h"
23#include "TouchGate.h"
22#include "TouchGate.h"
24#include "TouchGestureArea.h"
23#include "TouchGestureArea.h"
@@ -34,9 +33,8 @@ static QObject* directionSingleton(QQmlEngine* engine, QJSEngine* scriptEngine)
34void UbuntuGesturesQmlPlugin::registerTypes(const char *uri)
33void UbuntuGesturesQmlPlugin::registerTypes(const char *uri)
35{
34{
36 qmlRegisterSingletonType<Direction>(uri, 0, 1, "Direction", directionSingleton);
35 qmlRegisterSingletonType<Direction>(uri, 0, 1, "Direction", directionSingleton);
37− qmlRegisterType<DirectionalDragArea>(uri, 0, 1, "DirectionalDragArea");
38 qmlRegisterType<AxisVelocityCalculator>(uri, 0, 1, "AxisVelocityCalculator");
36 qmlRegisterType<AxisVelocityCalculator>(uri, 0, 1, "AxisVelocityCalculator");
39− qmlRegisterType<FloatingFlickable>(uri, 0, 1, "FloatingFlickable");
37+ qmlRegisterType<MouseEventGenerator>(uri, 0, 1, "MouseEventGenerator");
40 qmlRegisterType<PressedOutsideNotifier>(uri, 0, 1, "PressedOutsideNotifier");
38 qmlRegisterType<PressedOutsideNotifier>(uri, 0, 1, "PressedOutsideNotifier");
41 qmlRegisterType<TouchGate>(uri, 0, 1, "TouchGate");
39 qmlRegisterType<TouchGate>(uri, 0, 1, "TouchGate");
42 qmlRegisterType<TouchGestureArea>(uri, 0, 1, "TouchGestureArea");
40 qmlRegisterType<TouchGestureArea>(uri, 0, 1, "TouchGestureArea");
plugins/Ubuntu/Payments/Payments.qmltypesdeleted−43
@@ -1,43 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Ubuntu.Payments 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "Payments"
12− prototype: "QObject"
13− exports: ["Ubuntu.Payments/Payments 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "currency"; type: "string" }
16− Property { name: "price"; type: "double" }
17− Property { name: "storeItemId"; type: "string" }
18− Property { name: "formattedPrice"; type: "string"; isReadonly: true }
19− Signal {
20− name: "currencyChanged"
21− Parameter { name: "currency"; type: "string" }
22− }
23− Signal {
24− name: "priceChanged"
25− Parameter { name: "price"; type: "double" }
26− }
27− Signal {
28− name: "storeItemIdChanged"
29− Parameter { name: "store_item_id"; type: "string" }
30− }
31− Signal {
32− name: "formattedPriceChanged"
33− Parameter { name: "formatted_price"; type: "string" }
34− }
35− Signal {
36− name: "purchaseError"
37− Parameter { name: "error"; type: "string" }
38− }
39− Signal { name: "purchaseCompleted" }
40− Signal { name: "purchaseCancelled" }
41− Method { name: "start" }
42− }
43−}
plugins/Ubuntu/SystemImage/SystemImage.qmltypesdeleted−19
@@ -1,19 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Ubuntu.SystemImage 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "SystemImage"
12− prototype: "QObject"
13− exports: ["Ubuntu.SystemImage/SystemImage 0.1"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Method { name: "factoryReset" }
18− }
19−}
plugins/Unity/Connectivity/Connectivity.qmltypesdeleted−19
@@ -1,19 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Connectivity 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "Connectivity"
12− prototype: "QObject"
13− exports: ["Unity.Connectivity/Connectivity 0.1"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Method { name: "unlockAllModems" }
18− }
19−}
plugins/Unity/DashCommunicator/DashCommunicator.qmltypesdeleted−47
@@ -1,47 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.DashCommunicator 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "DashCommunicator"
12− prototype: "QThread"
13− exports: ["Unity.DashCommunicator/DashCommunicator 0.1"]
14− exportMetaObjectRevisions: [0]
15− Method {
16− name: "setCurrentScope"
17− Parameter { name: "index"; type: "int" }
18− Parameter { name: "animate"; type: "bool" }
19− Parameter { name: "isSwipe"; type: "bool" }
20− }
21− }
22− Component {
23− name: "DashCommunicatorService"
24− prototype: "QObject"
25− exports: ["Unity.DashCommunicator/DashCommunicatorService 0.1"]
26− exportMetaObjectRevisions: [0]
27− Signal {
28− name: "setCurrentScopeRequested"
29− Parameter { name: "index"; type: "int" }
30− Parameter { name: "animate"; type: "bool" }
31− Parameter { name: "isSwipe"; type: "bool" }
32− }
33− }
34− Component {
35− name: "QThread"
36− prototype: "QObject"
37− Signal { name: "started" }
38− Signal { name: "finished" }
39− Method {
40− name: "start"
41− Parameter { type: "Priority" }
42− }
43− Method { name: "start" }
44− Method { name: "terminate" }
45− Method { name: "quit" }
46− }
47−}
plugins/Unity/Indicators/CMakeLists.txt+4
@@ -6,6 +6,10 @@ find_package(Qt5Quick REQUIRED)
6include_directories(
6include_directories(
7 ${CMAKE_CURRENT_SOURCE_DIR}
7 ${CMAKE_CURRENT_SOURCE_DIR}
8 ${CMAKE_CURRENT_BINARY_DIR}
8 ${CMAKE_CURRENT_BINARY_DIR}
9+)
10+
11+include_directories(
12+ SYSTEM
9 ${GLIB_INCLUDE_DIRS}
13 ${GLIB_INCLUDE_DIRS}
10 ${GIO_INCLUDE_DIRS}
14 ${GIO_INCLUDE_DIRS}
11 ${QMENUMODEL_INCLUDE_DIRS}
15 ${QMENUMODEL_INCLUDE_DIRS}
plugins/Unity/Indicators/Indicators.qmltypesdeleted−264
@@ -1,264 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Indicators 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "ActionRootState"
12− prototype: "RootStateObject"
13− exports: ["Unity.Indicators/ActionRootState 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "actionGroup"; type: "QDBusActionGroup"; isPointer: true }
16− Property { name: "actionName"; type: "string" }
17− }
18− Component {
19− name: "ActionState"
20− prototype: "QObject"
21− exports: ["Unity.Indicators/ActionState 0.1"]
22− isCreatable: false
23− exportMetaObjectRevisions: [0]
24− Enum {
25− name: "ActionStates"
26− values: {
27− "Label": 0,
28− "IconSource": 1,
29− "AccessableName": 2,
30− "Visible": 3
31− }
32− }
33− }
34− Component {
35− name: "FlatMenuProxyModelRole"
36− prototype: "QObject"
37− exports: ["Unity.Indicators/FlatMenuProxyModelRole 0.1"]
38− isCreatable: false
39− exportMetaObjectRevisions: [0]
40− Enum {
41− name: "Roles"
42− values: {
43− "Action": 1,
44− "Label": 2,
45− "Extra": 3,
46− "Depth": 4,
47− "hasSection": 5,
48− "hasSubMenu": 6
49− }
50− }
51− }
52− Component {
53− name: "IndicatorsManager"
54− prototype: "QObject"
55− exports: ["Unity.Indicators/IndicatorsManager 0.1"]
56− exportMetaObjectRevisions: [0]
57− Property { name: "loaded"; type: "bool"; isReadonly: true }
58− Property { name: "profile"; type: "string" }
59− Signal {
60− name: "loadedChanged"
61− Parameter { type: "bool" }
62− }
63− Signal {
64− name: "profileChanged"
65− Parameter { type: "string" }
66− }
67− Signal {
68− name: "indicatorLoaded"
69− Parameter { name: "indicator_name"; type: "string" }
70− }
71− Signal {
72− name: "indicatorAboutToBeUnloaded"
73− Parameter { name: "indicator_name"; type: "string" }
74− }
75− Method { name: "load" }
76− Method { name: "unload" }
77− }
78− Component {
79− name: "IndicatorsModel"
80− prototype: "QAbstractListModel"
81− exports: ["Unity.Indicators/IndicatorsModel 0.1"]
82− exportMetaObjectRevisions: [0]
83− Property { name: "count"; type: "int"; isReadonly: true }
84− Property { name: "profile"; type: "string" }
85− Signal {
86− name: "indicatorDataChanged"
87− Parameter { name: "data"; type: "QVariant" }
88− }
89− Method { name: "load" }
90− Method { name: "unload" }
91− Method {
92− name: "data"
93− type: "QVariant"
94− Parameter { name: "row"; type: "int" }
95− Parameter { name: "role"; type: "int" }
96− }
97− }
98− Component {
99− name: "IndicatorsModelRole"
100− prototype: "QObject"
101− exports: ["Unity.Indicators/IndicatorsModelRole 0.1"]
102− isCreatable: false
103− exportMetaObjectRevisions: [0]
104− Enum {
105− name: "Roles"
106− values: {
107− "Identifier": 0,
108− "Position": 1,
109− "IndicatorProperties": 2
110− }
111− }
112− }
113− Component {
114− name: "MenuContentActivator"
115− prototype: "QObject"
116− exports: ["Unity.Indicators/MenuContentActivator 0.1"]
117− exportMetaObjectRevisions: [0]
118− Property { name: "baseIndex"; type: "int" }
119− Property { name: "running"; type: "bool" }
120− Property { name: "count"; type: "int" }
121− Property { name: "content"; type: "MenuContentState"; isList: true; isReadonly: true }
122− Signal {
123− name: "baseIndexChanged"
124− Parameter { name: "baseIndex"; type: "int" }
125− }
126− Signal {
127− name: "deltaChanged"
128− Parameter { name: "delta"; type: "int" }
129− }
130− Signal {
131− name: "runningChanged"
132− Parameter { name: "running"; type: "bool" }
133− }
134− Signal {
135− name: "countChanged"
136− Parameter { name: "count"; type: "int" }
137− }
138− Method { name: "restart" }
139− Method { name: "stop" }
140− Method { name: "clear" }
141− Method {
142− name: "isMenuContentActive"
143− type: "bool"
144− Parameter { name: "index"; type: "int" }
145− }
146− }
147− Component {
148− name: "MenuContentState"
149− prototype: "QObject"
150− exports: ["Unity.Indicators/MenuContentState 0.1"]
151− isCreatable: false
152− exportMetaObjectRevisions: [0]
153− Property { name: "active"; type: "bool"; isReadonly: true }
154− }
155− Component {
156− name: "ModelActionRootState"
157− prototype: "RootStateObject"
158− exports: ["Unity.Indicators/ModelActionRootState 0.1"]
159− exportMetaObjectRevisions: [0]
160− Property { name: "menu"; type: "UnityMenuModel"; isPointer: true }
161− Signal { name: "indexChanged" }
162− }
163− Component {
164− name: "ModelPrinter"
165− prototype: "QObject"
166− exports: ["Unity.Indicators/ModelPrinter 0.1"]
167− exportMetaObjectRevisions: [0]
168− Property { name: "model"; type: "UnityMenuModel"; isPointer: true }
169− Property { name: "text"; type: "string"; isReadonly: true }
170− Method { name: "text"; type: "string" }
171− }
172− Component {
173− name: "NetworkActionState"
174− prototype: "QObject"
175− exports: ["Unity.Indicators/NetworkActionState 0.1"]
176− isCreatable: false
177− exportMetaObjectRevisions: [0]
178− Enum {
179− name: "NetworkActionStates"
180− values: {
181− "Connection": 1,
182− "SignalStrength": 2
183− }
184− }
185− }
186− Component {
187− name: "NetworkConnection"
188− prototype: "QObject"
189− exports: ["Unity.Indicators/NetworkConnection 0.1"]
190− isCreatable: false
191− exportMetaObjectRevisions: [0]
192− Enum {
193− name: "NetworkConnectionStates"
194− values: {
195− "Initial": 0,
196− "Activating": 1,
197− "Activated": 2,
198− "Deactivating": 3
199− }
200− }
201− }
202− Component {
203− name: "RootStateObject"
204− prototype: "QObject"
205− Property { name: "valid"; type: "bool"; isReadonly: true }
206− Property { name: "title"; type: "string"; isReadonly: true }
207− Property { name: "leftLabel"; type: "string"; isReadonly: true }
208− Property { name: "rightLabel"; type: "string"; isReadonly: true }
209− Property { name: "icons"; type: "QStringList"; isReadonly: true }
210− Property { name: "accessibleName"; type: "string"; isReadonly: true }
211− Property { name: "indicatorVisible"; type: "bool"; isReadonly: true }
212− Signal { name: "updated" }
213− }
214− Component {
215− name: "SharedUnityMenuModel"
216− prototype: "QObject"
217− exports: ["Unity.Indicators/SharedUnityMenuModel 0.1"]
218− exportMetaObjectRevisions: [0]
219− Property { name: "busName"; type: "QByteArray" }
220− Property { name: "menuObjectPath"; type: "QByteArray" }
221− Property { name: "actions"; type: "QVariantMap" }
222− Property { name: "model"; type: "UnityMenuModel"; isReadonly: true; isPointer: true }
223− }
224− Component {
225− name: "UnityMenuModelCache"
226− prototype: "QObject"
227− exports: ["Unity.Indicators/UnityMenuModelCache 0.1"]
228− isCreatable: false
229− isSingleton: true
230− exportMetaObjectRevisions: [0]
231− Method {
232− name: "contains"
233− type: "bool"
234− Parameter { name: "path"; type: "QByteArray" }
235− }
236− }
237− Component {
238− name: "UnityMenuModelStack"
239− prototype: "QObject"
240− exports: ["Unity.Indicators/UnityMenuModelStack 0.1"]
241− exportMetaObjectRevisions: [0]
242− Property { name: "head"; type: "UnityMenuModel"; isPointer: true }
243− Property { name: "tail"; type: "UnityMenuModel"; isReadonly: true; isPointer: true }
244− Property { name: "count"; type: "int"; isReadonly: true }
245− Signal {
246− name: "headChanged"
247− Parameter { name: "head"; type: "UnityMenuModel"; isPointer: true }
248− }
249− Signal {
250− name: "tailChanged"
251− Parameter { name: "tail"; type: "UnityMenuModel"; isPointer: true }
252− }
253− Signal {
254− name: "countChanged"
255− Parameter { name: "count"; type: "int" }
256− }
257− Method {
258− name: "push"
259− Parameter { name: "model"; type: "UnityMenuModel"; isPointer: true }
260− Parameter { name: "menuIndex"; type: "int" }
261− }
262− Method { name: "pop"; type: "UnityMenuModel*" }
263− }
264−}
plugins/Unity/Indicators/indicatorsmanager.cpp+1−1
@@ -291,7 +291,7 @@ Indicator::Ptr IndicatorsManager::indicator(const QString& indicator_name)
291 // The rest of the indicators respect their default profile (which is "phone", even on desktop PCs)
291 // The rest of the indicators respect their default profile (which is "phone", even on desktop PCs)
292 if ((new_indicator->identifier() == QStringLiteral("indicator-session"))
292 if ((new_indicator->identifier() == QStringLiteral("indicator-session"))
293 || (new_indicator->identifier() == QStringLiteral("indicator-power") && m_platform.isPC())) {
293 || (new_indicator->identifier() == QStringLiteral("indicator-power") && m_platform.isPC())) {
294− new_indicator->setProfile(QStringLiteral("desktop"));
294+ new_indicator->setProfile(m_profile.replace(QStringLiteral("phone"), QStringLiteral("desktop")));
295 } else {
295 } else {
296 new_indicator->setProfile(m_profile);
296 new_indicator->setProfile(m_profile);
297 }
297 }
plugins/Unity/InputInfo/InputInfo.qmltypesdeleted−71
@@ -1,71 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.InputInfo 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "QDeclarativeInputDeviceModel"
12− prototype: "QAbstractListModel"
13− exports: ["Unity.InputInfo/InputDeviceModel 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "deviceFilter"; type: "QInputDevice::InputType" }
16− Property { name: "count"; type: "int"; isReadonly: true }
17− Signal {
18− name: "deviceAdded"
19− Parameter { name: "devicePath"; type: "string" }
20− }
21− Signal {
22− name: "deviceRemoved"
23− Parameter { name: "devicePath"; type: "string" }
24− }
25− Signal {
26− name: "deviceFilterChanged"
27− Parameter { name: "filter"; type: "QInputDevice::InputType" }
28− }
29− Method { name: "updateDeviceList" }
30− Method {
31− name: "indexOf"
32− type: "int"
33− Parameter { name: "devicePath"; type: "string" }
34− }
35− Method {
36− name: "get"
37− type: "QInputDevice*"
38− Parameter { name: "index"; type: "int" }
39− }
40− }
41− Component {
42− name: "QInputDevice"
43− prototype: "QObject"
44− exports: ["Unity.InputInfo/InputInfo 0.1"]
45− exportMetaObjectRevisions: [0]
46− Enum {
47− name: "InputType"
48− values: {
49− "Unknown": 0,
50− "Button": 1,
51− "Mouse": 2,
52− "TouchPad": 4,
53− "TouchScreen": 8,
54− "Keyboard": 16,
55− "Switch": 32
56− }
57− }
58− Enum {
59− name: "InputTypeFlags"
60− values: {
61− "Unknown": 0,
62− "Button": 1,
63− "Mouse": 2,
64− "TouchPad": 4,
65− "TouchScreen": 8,
66− "Keyboard": 16,
67− "Switch": 32
68− }
69− }
70− }
71−}
plugins/Unity/InputInfo/linux/qinputdeviceinfo_linux.cpp+7−2
@@ -44,6 +44,7 @@
44#include <libudev.h>
44#include <libudev.h>
45#include <libevdev/libevdev.h>
45#include <libevdev/libevdev.h>
46#include <fcntl.h>
46#include <fcntl.h>
47+#include <unistd.h>
47#include <QDebug>
48#include <QDebug>
48#include <QSocketNotifier>
49#include <QSocketNotifier>
49#include <QTimer>
50#include <QTimer>
@@ -52,6 +53,7 @@
52QInputDeviceManagerPrivate::QInputDeviceManagerPrivate(QObject *parent) :
53QInputDeviceManagerPrivate::QInputDeviceManagerPrivate(QObject *parent) :
53 QObject(parent),
54 QObject(parent),
54 currentFilter(QInputDevice::Unknown),
55 currentFilter(QInputDevice::Unknown),
56+ udevMonitor(0),
55 udevice(0)
57 udevice(0)
56{
58{
57 QTimer::singleShot(250,this,SLOT(init()));
59 QTimer::singleShot(250,this,SLOT(init()));
@@ -83,9 +85,9 @@ void QInputDeviceManagerPrivate::init()
83 udev_enumerate_add_match_subsystem(enumerate, subsystem.toLatin1());
85 udev_enumerate_add_match_subsystem(enumerate, subsystem.toLatin1());
84
86
85 udev_monitor_enable_receiving(udevMonitor);
87 udev_monitor_enable_receiving(udevMonitor);
86− notifierFd = udev_monitor_get_fd(udevMonitor);
88+ int notifierFd = udev_monitor_get_fd(udevMonitor);
87
89
88− notifier = new QSocketNotifier(notifierFd, QSocketNotifier::Read, this);
90+ QSocketNotifier *notifier = new QSocketNotifier(notifierFd, QSocketNotifier::Read, this);
89 connect(notifier, SIGNAL(activated(int)), this, SLOT(onUDevChanges()));
91 connect(notifier, SIGNAL(activated(int)), this, SLOT(onUDevChanges()));
90
92
91 udev_enumerate_scan_devices(enumerate);
93 udev_enumerate_scan_devices(enumerate);
@@ -168,6 +170,7 @@ QInputDevice *QInputDeviceManagerPrivate::addDevice(struct udev_device *udev)
168 rc = libevdev_new_from_fd(fd, &dev);
170 rc = libevdev_new_from_fd(fd, &dev);
169 if (rc < 0) {
171 if (rc < 0) {
170 qWarning() << "Failed to init libevdev ("<< strerror(-rc) << ")";
172 qWarning() << "Failed to init libevdev ("<< strerror(-rc) << ")";
173+ close(fd);
171 return Q_NULLPTR;
174 return Q_NULLPTR;
172 }
175 }
173
176
@@ -195,6 +198,8 @@ QInputDevice *QInputDeviceManagerPrivate::addDevice(struct udev_device *udev)
195 }
198 }
196 }
199 }
197
200
201+ libevdev_free(dev);
202+ close(fd);
198 return inputDevice;
203 return inputDevice;
199}
204}
200
205
plugins/Unity/InputInfo/linux/qinputdeviceinfo_linux_p.h−2
@@ -83,8 +83,6 @@ private:
83
83
84 QInputDevice *addDevice(const QString &path);
84 QInputDevice *addDevice(const QString &path);
85 void removeDevice(const QString &path);
85 void removeDevice(const QString &path);
86− QSocketNotifier *notifier;
87− int notifierFd;
88 struct udev_monitor *udevMonitor;
86 struct udev_monitor *udevMonitor;
89 QInputDevice::InputTypeFlags getInputTypeFlags(struct udev_device *);
87 QInputDevice::InputTypeFlags getInputTypeFlags(struct udev_device *);
90 struct udev *udevice;
88 struct udev *udevice;
plugins/Unity/InputInfo/plugin.h+1−1
@@ -24,7 +24,7 @@ class InputInfoPlugin : public QQmlExtensionPlugin
24 Q_OBJECT
24 Q_OBJECT
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26public:
26public:
27− void registerTypes(const char *uri);
27+ void registerTypes(const char *uri) override;
28};
28};
29
29
30#endif // INPUTINFO_PLUGIN_H
30#endif // INPUTINFO_PLUGIN_H
plugins/Unity/InputInfo/qdeclarativeinputdevicemodel_p.h+3−3
@@ -69,8 +69,8 @@ public:
69 explicit QDeclarativeInputDeviceModel(QObject *parent = 0);
69 explicit QDeclarativeInputDeviceModel(QObject *parent = 0);
70 virtual ~QDeclarativeInputDeviceModel();
70 virtual ~QDeclarativeInputDeviceModel();
71
71
72− QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
72+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
73− int rowCount(const QModelIndex &parent = QModelIndex()) const;
73+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
74
74
75 void setDeviceFilter(QInputDevice::InputType filter);
75 void setDeviceFilter(QInputDevice::InputType filter);
76 QInputDevice::InputType deviceFilter();
76 QInputDevice::InputType deviceFilter();
@@ -78,7 +78,7 @@ public:
78 Q_INVOKABLE int indexOf(const QString &devicePath) const;
78 Q_INVOKABLE int indexOf(const QString &devicePath) const;
79
79
80 Q_INVOKABLE QInputDevice *get(int index) const;
80 Q_INVOKABLE QInputDevice *get(int index) const;
81− QHash<int, QByteArray> roleNames() const;
81+ QHash<int, QByteArray> roleNames() const override;
82
82
83Q_SIGNALS:
83Q_SIGNALS:
84 void deviceAdded(const QString &devicePath);
84 void deviceAdded(const QString &devicePath);
plugins/Unity/Launcher/CMakeLists.txt+5−1
@@ -1,4 +1,4 @@
1−pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=7)
1+pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=9)
2pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
2pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
3
3
4add_definitions(-DSM_BUSNAME=systemBus)
4add_definitions(-DSM_BUSNAME=systemBus)
@@ -7,6 +7,7 @@ include_directories(
7 ${CMAKE_CURRENT_SOURCE_DIR}
7 ${CMAKE_CURRENT_SOURCE_DIR}
8 ${CMAKE_SOURCE_DIR}/plugins/AccountsService
8 ${CMAKE_SOURCE_DIR}/plugins/AccountsService
9 ${GSETTINGS_QT_INCLUDE_DIRS}
9 ${GSETTINGS_QT_INCLUDE_DIRS}
10+ ${GLIB_INCLUDE_DIRS}
10 ${libunity8-private_SOURCE_DIR}
11 ${libunity8-private_SOURCE_DIR}
11)
12)
12
13
@@ -22,6 +23,8 @@ set(QMLLAUNCHERPLUGIN_SRC
22 asadapter.cpp
23 asadapter.cpp
23 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
24 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
24 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
25 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
26+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
27+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceListInterface.h
25 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherItemInterface.h
28 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherItemInterface.h
26 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherModelInterface.h
29 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherModelInterface.h
27 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/QuickListModelInterface.h
30 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/QuickListModelInterface.h
@@ -34,6 +37,7 @@ add_library(UnityLauncher-qml MODULE
34target_link_libraries(UnityLauncher-qml
37target_link_libraries(UnityLauncher-qml
35 unity8-private
38 unity8-private
36 ${GSETTINGS_QT_LDFLAGS}
39 ${GSETTINGS_QT_LDFLAGS}
40+ ${GLIB_LIBRARIES}
37 )
41 )
38
42
39qt5_use_modules(UnityLauncher-qml DBus Qml Gui)
43qt5_use_modules(UnityLauncher-qml DBus Qml Gui)
plugins/Unity/Launcher/Launcher.qmltypesdeleted−182
@@ -1,182 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Launcher 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "LauncherItem"
12− prototype: "unity::shell::launcher::LauncherItemInterface"
13− exports: ["Unity.Launcher/LauncherItem 0.1"]
14− isCreatable: false
15− exportMetaObjectRevisions: [0]
16− }
17− Component {
18− name: "LauncherModel"
19− prototype: "unity::shell::launcher::LauncherModelInterface"
20− exports: ["Unity.Launcher/LauncherModel 0.1"]
21− isCreatable: false
22− isSingleton: true
23− exportMetaObjectRevisions: [0]
24− Method {
25− name: "requestRemove"
26− Parameter { name: "appId"; type: "string" }
27− }
28− Method { name: "refresh" }
29− Method {
30− name: "get"
31− type: "unity::shell::launcher::LauncherItemInterface*"
32− Parameter { name: "index"; type: "int" }
33− }
34− Method {
35− name: "move"
36− Parameter { name: "oldIndex"; type: "int" }
37− Parameter { name: "newIndex"; type: "int" }
38− }
39− Method {
40− name: "pin"
41− Parameter { name: "appId"; type: "string" }
42− Parameter { name: "index"; type: "int" }
43− }
44− Method {
45− name: "pin"
46− Parameter { name: "appId"; type: "string" }
47− }
48− Method {
49− name: "quickListActionInvoked"
50− Parameter { name: "appId"; type: "string" }
51− Parameter { name: "actionIndex"; type: "int" }
52− }
53− Method {
54− name: "setUser"
55− Parameter { name: "username"; type: "string" }
56− }
57− Method {
58− name: "getUrlForAppId"
59− type: "string"
60− Parameter { name: "appId"; type: "string" }
61− }
62− }
63− Component {
64− name: "QuickListModel"
65− prototype: "unity::shell::launcher::QuickListModelInterface"
66− exports: ["Unity.Launcher/QuickListModel 0.1"]
67− isCreatable: false
68− exportMetaObjectRevisions: [0]
69− }
70− Component {
71− name: "unity::shell::launcher::LauncherItemInterface"
72− prototype: "QObject"
73− exports: ["Unity.Launcher/LauncherItemInterface 0.1"]
74− isCreatable: false
75− exportMetaObjectRevisions: [0]
76− Property { name: "appId"; type: "string"; isReadonly: true }
77− Property { name: "name"; type: "string"; isReadonly: true }
78− Property { name: "icon"; type: "string"; isReadonly: true }
79− Property { name: "pinned"; type: "bool"; isReadonly: true }
80− Property { name: "running"; type: "bool"; isReadonly: true }
81− Property { name: "recent"; type: "bool"; isReadonly: true }
82− Property { name: "progress"; type: "int"; isReadonly: true }
83− Property { name: "count"; type: "int"; isReadonly: true }
84− Property { name: "countVisible"; type: "bool"; isReadonly: true }
85− Property { name: "focused"; type: "bool"; isReadonly: true }
86− Property {
87− name: "quickList"
88− type: "unity::shell::launcher::QuickListModelInterface"
89− isReadonly: true
90− isPointer: true
91− }
92− Signal {
93− name: "nameChanged"
94− Parameter { name: "name"; type: "string" }
95− }
96− Signal {
97− name: "iconChanged"
98− Parameter { name: "icon"; type: "string" }
99− }
100− Signal {
101− name: "pinnedChanged"
102− Parameter { name: "pinned"; type: "bool" }
103− }
104− Signal {
105− name: "runningChanged"
106− Parameter { name: "running"; type: "bool" }
107− }
108− Signal {
109− name: "recentChanged"
110− Parameter { name: "running"; type: "bool" }
111− }
112− Signal {
113− name: "progressChanged"
114− Parameter { name: "progress"; type: "int" }
115− }
116− Signal {
117− name: "countChanged"
118− Parameter { name: "count"; type: "int" }
119− }
120− Signal {
121− name: "countVisibleChanged"
122− Parameter { name: "countVisible"; type: "bool" }
123− }
124− Signal {
125− name: "focusedChanged"
126− Parameter { name: "focused"; type: "bool" }
127− }
128− }
129− Component {
130− name: "unity::shell::launcher::LauncherModelInterface"
131− prototype: "QAbstractListModel"
132− exports: ["Unity.Launcher/LauncherModelInterface 0.1"]
133− isCreatable: false
134− exportMetaObjectRevisions: [0]
135− Property {
136− name: "applicationManager"
137− type: "unity::shell::application::ApplicationManagerInterface"
138− isPointer: true
139− }
140− Property { name: "onlyPinned"; type: "bool" }
141− Signal { name: "hint" }
142− Method {
143− name: "move"
144− Parameter { name: "oldIndex"; type: "int" }
145− Parameter { name: "newIndex"; type: "int" }
146− }
147− Method {
148− name: "get"
149− type: "unity::shell::launcher::LauncherItemInterface*"
150− Parameter { name: "index"; type: "int" }
151− }
152− Method {
153− name: "pin"
154− Parameter { name: "appId"; type: "string" }
155− Parameter { name: "index"; type: "int" }
156− }
157− Method {
158− name: "pin"
159− Parameter { name: "appId"; type: "string" }
160− }
161− Method {
162− name: "requestRemove"
163− Parameter { name: "appId"; type: "string" }
164− }
165− Method {
166− name: "quickListActionInvoked"
167− Parameter { name: "appId"; type: "string" }
168− Parameter { name: "actionIndex"; type: "int" }
169− }
170− Method {
171− name: "setUser"
172− Parameter { name: "username"; type: "string" }
173− }
174− }
175− Component {
176− name: "unity::shell::launcher::QuickListModelInterface"
177− prototype: "QAbstractListModel"
178− exports: ["Unity.Launcher/QuickListInterface 0.1"]
179− isCreatable: false
180− exportMetaObjectRevisions: [0]
181− }
182−}
plugins/Unity/Launcher/asadapter.cpp+6−2
@@ -18,14 +18,18 @@
18#include "launcheritem.h"
18#include "launcheritem.h"
19#include "AccountsServiceDBusAdaptor.h"
19#include "AccountsServiceDBusAdaptor.h"
20
20
21+#include <glib.h>
22+
21#include <QDebug>
23#include <QDebug>
22
24
23ASAdapter::ASAdapter()
25ASAdapter::ASAdapter()
24{
26{
25 m_accounts = new AccountsServiceDBusAdaptor();
27 m_accounts = new AccountsServiceDBusAdaptor();
26− m_user = qgetenv("USER");
28+
29+ m_user = QString::fromUtf8(g_get_user_name());
30+
27 if (m_user.isEmpty()) {
31 if (m_user.isEmpty()) {
28− qWarning() << "$USER not valid. Account Service integration will not work.";
32+ qWarning() << "username not valid. Account Service integration will not work.";
29 }
33 }
30}
34}
31
35
plugins/Unity/Launcher/launcheritem.cpp+14−9
@@ -35,6 +35,7 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
35 m_countVisible(false),
35 m_countVisible(false),
36 m_focused(false),
36 m_focused(false),
37 m_alerting(false),
37 m_alerting(false),
38+ m_surfaceCount(0),
38 m_quickList(new QuickListModel(this))
39 m_quickList(new QuickListModel(this))
39{
40{
40 Q_ASSERT(parent != nullptr);
41 Q_ASSERT(parent != nullptr);
@@ -162,9 +163,6 @@ void LauncherItem::setCount(int count)
162 if (m_count != count) {
163 if (m_count != count) {
163 m_count = count;
164 m_count = count;
164 Q_EMIT countChanged(count);
165 Q_EMIT countChanged(count);
165− if (m_countVisible) {
166− setAlerting(true);
167− }
168 }
166 }
169}
167}
170
168
@@ -178,9 +176,6 @@ void LauncherItem::setCountVisible(bool countVisible)
178 if (m_countVisible != countVisible) {
176 if (m_countVisible != countVisible) {
179 m_countVisible = countVisible;
177 m_countVisible = countVisible;
180 Q_EMIT countVisibleChanged(countVisible);
178 Q_EMIT countVisibleChanged(countVisible);
181− if (countVisible) {
182− setAlerting(true);
183− }
184 }
179 }
185}
180}
186
181
@@ -193,9 +188,6 @@ void LauncherItem::setFocused(bool focused)
193{
188{
194 if (m_focused != focused) {
189 if (m_focused != focused) {
195 m_focused = focused;
190 m_focused = focused;
196− if (focused) {
197− setAlerting(false);
198− }
199 Q_EMIT focusedChanged(focused);
191 Q_EMIT focusedChanged(focused);
200 }
192 }
201}
193}
@@ -213,6 +205,19 @@ void LauncherItem::setAlerting(bool alerting)
213 }
205 }
214}
206}
215
207
208+int LauncherItem::surfaceCount() const
209+{
210+ return m_surfaceCount;
211+}
212+
213+void LauncherItem::setSurfaceCount(int surfaceCount)
214+{
215+ if (m_surfaceCount != surfaceCount) {
216+ m_surfaceCount = surfaceCount;
217+ Q_EMIT surfaceCountChanged(surfaceCount);
218+ }
219+}
220+
216unity::shell::launcher::QuickListModelInterface *LauncherItem::quickList() const
221unity::shell::launcher::QuickListModelInterface *LauncherItem::quickList() const
217{
222{
218 return m_quickList;
223 return m_quickList;
plugins/Unity/Launcher/launcheritem.h+3
@@ -45,6 +45,7 @@ public:
45 bool countVisible() const override;
45 bool countVisible() const override;
46 bool focused() const override;
46 bool focused() const override;
47 bool alerting() const override;
47 bool alerting() const override;
48+ int surfaceCount() const override;
48
49
49 unity::shell::launcher::QuickListModelInterface *quickList() const override;
50 unity::shell::launcher::QuickListModelInterface *quickList() const override;
50
51
@@ -59,6 +60,7 @@ private:
59 void setCountVisible(bool countVisible);
60 void setCountVisible(bool countVisible);
60 void setFocused(bool focused);
61 void setFocused(bool focused);
61 void setAlerting(bool alerting);
62 void setAlerting(bool alerting);
63+ void setSurfaceCount(int surfaceCount);
62
64
63private:
65private:
64 QString m_appId;
66 QString m_appId;
@@ -72,6 +74,7 @@ private:
72 bool m_countVisible;
74 bool m_countVisible;
73 bool m_focused;
75 bool m_focused;
74 bool m_alerting;
76 bool m_alerting;
77+ int m_surfaceCount;
75 QuickListModel *m_quickList;
78 QuickListModel *m_quickList;
76 QuickListEntry m_quitAction;
79 QuickListEntry m_quitAction;
77
80
plugins/Unity/Launcher/launchermodel.cpp+58−26
@@ -25,6 +25,7 @@
25#include "asadapter.h"
25#include "asadapter.h"
26
26
27#include <unity/shell/application/ApplicationInfoInterface.h>
27#include <unity/shell/application/ApplicationInfoInterface.h>
28+#include <unity/shell/application/MirSurfaceListInterface.h>
28
29
29#include <QDesktopServices>
30#include <QDesktopServices>
30#include <QDebug>
31#include <QDebug>
@@ -88,6 +89,8 @@ QVariant LauncherModel::data(const QModelIndex &index, int role) const
88 return item->alerting();
89 return item->alerting();
89 case RoleRunning:
90 case RoleRunning:
90 return item->running();
91 return item->running();
92+ case RoleSurfaceCount:
93+ return item->surfaceCount();
91 default:
94 default:
92 qWarning() << Q_FUNC_INFO << "missing role, implement me";
95 qWarning() << Q_FUNC_INFO << "missing role, implement me";
93 return QVariant();
96 return QVariant();
@@ -96,18 +99,6 @@ QVariant LauncherModel::data(const QModelIndex &index, int role) const
96 return QVariant();
99 return QVariant();
97}
100}
98
101
99−void LauncherModel::setAlerting(const QString &appId, bool alerting) {
100− int index = findApplication(appId);
101− if (index >= 0) {
102− QModelIndex modelIndex = this->index(index);
103− LauncherItem *item = m_list.at(index);
104− if (!item->focused()) {
105− item->setAlerting(alerting);
106− Q_EMIT dataChanged(modelIndex, modelIndex, {RoleAlerting});
107− }
108− }
109−}
110−
111unity::shell::launcher::LauncherItemInterface *LauncherModel::get(int index) const
102unity::shell::launcher::LauncherItemInterface *LauncherModel::get(int index) const
112{
103{
113 if (index < 0 || index >= m_list.count()) {
104 if (index < 0 || index >= m_list.count()) {
@@ -358,11 +349,13 @@ void LauncherModel::countChanged(const QString &appId, int count)
358 if (idx >= 0) {
349 if (idx >= 0) {
359 LauncherItem *item = m_list.at(idx);
350 LauncherItem *item = m_list.at(idx);
360 item->setCount(count);
351 item->setCount(count);
352+ QVector<int> changedRoles = {RoleCount};
361− if (item->countVisible()) {
353+ if (item->countVisible() && !item->alerting() && !item->focused()) {
354+ changedRoles << RoleAlerting;
362− setAlerting(item->appId(), true);
355+ item->setAlerting(true);
363 }
356 }
364 m_asAdapter->syncItems(m_list);
357 m_asAdapter->syncItems(m_list);
365− Q_EMIT dataChanged(index(idx), index(idx), {RoleCount});
358+ Q_EMIT dataChanged(index(idx), index(idx), changedRoles);
366 }
359 }
367}
360}
368
361
@@ -372,10 +365,12 @@ void LauncherModel::countVisibleChanged(const QString &appId, bool countVisible)
372 if (idx >= 0) {
365 if (idx >= 0) {
373 LauncherItem *item = m_list.at(idx);
366 LauncherItem *item = m_list.at(idx);
374 item->setCountVisible(countVisible);
367 item->setCountVisible(countVisible);
368+ QVector<int> changedRoles = {RoleCountVisible};
375− if (countVisible) {
369+ if (countVisible && !item->alerting() && !item->focused()) {
370+ changedRoles << RoleAlerting;
376− setAlerting(item->appId(), true);
371+ item->setAlerting(true);
377 }
372 }
378− Q_EMIT dataChanged(index(idx), index(idx), {RoleCountVisible});
373+ Q_EMIT dataChanged(index(idx), index(idx), changedRoles);
379
374
380 // If countVisible goes to false, and the item is neither pinned nor recent we can drop it
375 // If countVisible goes to false, and the item is neither pinned nor recent we can drop it
381 if (!countVisible && !item->pinned() && !item->recent()) {
376 if (!countVisible && !item->pinned() && !item->recent()) {
@@ -498,8 +493,10 @@ void LauncherModel::alert(const QString &appId)
498 int idx = findApplication(appId);
493 int idx = findApplication(appId);
499 if (idx >= 0) {
494 if (idx >= 0) {
500 LauncherItem *item = m_list.at(idx);
495 LauncherItem *item = m_list.at(idx);
496+ if (!item->focused() && !item->alerting()) {
501− setAlerting(item->appId(), true);
497+ item->setAlerting(true);
502− Q_EMIT dataChanged(index(idx), index(idx), {RoleAlerting});
498+ Q_EMIT dataChanged(index(idx), index(idx), {RoleAlerting});
499+ }
503 }
500 }
504}
501}
505
502
@@ -525,28 +522,50 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
525 item->setRecent(true);
522 item->setRecent(true);
526 Q_EMIT dataChanged(index(itemIndex), index(itemIndex), {RoleRecent});
523 Q_EMIT dataChanged(index(itemIndex), index(itemIndex), {RoleRecent});
527 }
524 }
525+ if (item->surfaceCount() != app->surfaceCount()) {
526+ item->setSurfaceCount(app->surfaceCount());
527+ Q_EMIT dataChanged(index(itemIndex), index(itemIndex), {RoleSurfaceCount});
528+ }
529+
528 item->setRunning(true);
530 item->setRunning(true);
529 } else {
531 } else {
530 LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString(), this);
532 LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString(), this);
531 item->setRecent(true);
533 item->setRecent(true);
532 item->setRunning(true);
534 item->setRunning(true);
533 item->setFocused(app->focused());
535 item->setFocused(app->focused());
534−
536+ item->setSurfaceCount(app->surfaceCount());
535 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
537 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
536 m_list.append(item);
538 m_list.append(item);
537 endInsertRows();
539 endInsertRows();
538 }
540 }
541+ connect(app, &ApplicationInfoInterface::surfaceCountChanged, this, &LauncherModel::applicationSurfaceCountChanged);
539 m_asAdapter->syncItems(m_list);
542 m_asAdapter->syncItems(m_list);
540 Q_EMIT dataChanged(index(itemIndex), index(itemIndex), {RoleRunning});
543 Q_EMIT dataChanged(index(itemIndex), index(itemIndex), {RoleRunning});
541}
544}
542
545
546+void LauncherModel::applicationSurfaceCountChanged(int count)
547+{
548+ ApplicationInfoInterface *app = static_cast<ApplicationInfoInterface*>(sender());
549+ int idx = findApplication(app->appId());
550+ if (idx < 0) {
551+ qWarning() << "Received a surface count changed event from an app that's not in the Launcher model";
552+ return;
553+ }
554+ LauncherItem *item = m_list.at(idx);
555+ if (item->surfaceCount() != count) {
556+ item->setSurfaceCount(count);
557+ Q_EMIT dataChanged(index(idx), index(idx), {RoleSurfaceCount});
558+ }
559+}
560+
543void LauncherModel::applicationRemoved(const QModelIndex &parent, int row)
561void LauncherModel::applicationRemoved(const QModelIndex &parent, int row)
544{
562{
545 Q_UNUSED(parent)
563 Q_UNUSED(parent)
546
564
565+ ApplicationInfoInterface *app = m_appManager->get(row);
547 int appIndex = -1;
566 int appIndex = -1;
548 for (int i = 0; i < m_list.count(); ++i) {
567 for (int i = 0; i < m_list.count(); ++i) {
549− if (m_list.at(i)->appId() == m_appManager->get(row)->appId()) {
568+ if (m_list.at(i)->appId() == app->appId()) {
550 appIndex = i;
569 appIndex = i;
551 break;
570 break;
552 }
571 }
@@ -557,17 +576,24 @@ void LauncherModel::applicationRemoved(const QModelIndex &parent, int row)
557 return;
576 return;
558 }
577 }
559
578
579+ disconnect(app, &ApplicationInfoInterface::surfaceCountChanged, this, &LauncherModel::applicationSurfaceCountChanged);
580+
560 LauncherItem * item = m_list.at(appIndex);
581 LauncherItem * item = m_list.at(appIndex);
561− item->setRunning(false);
562
582
563 if (!item->pinned()) {
583 if (!item->pinned()) {
564 beginRemoveRows(QModelIndex(), appIndex, appIndex);
584 beginRemoveRows(QModelIndex(), appIndex, appIndex);
565 m_list.takeAt(appIndex)->deleteLater();
585 m_list.takeAt(appIndex)->deleteLater();
566 endRemoveRows();
586 endRemoveRows();
567 m_asAdapter->syncItems(m_list);
587 m_asAdapter->syncItems(m_list);
588+ } else {
589+ QVector<int> changedRoles = {RoleRunning};
590+ item->setRunning(false);
591+ if (item->focused()) {
592+ changedRoles << RoleFocused;
593+ item->setFocused(false);
594+ }
568− Q_EMIT dataChanged(index(appIndex), index(appIndex), {RolePinned});
595+ Q_EMIT dataChanged(index(appIndex), index(appIndex), changedRoles);
569 }
596 }
570− Q_EMIT dataChanged(index(appIndex), index(appIndex), {RoleRunning});
571}
597}
572
598
573void LauncherModel::focusedAppIdChanged()
599void LauncherModel::focusedAppIdChanged()
@@ -576,8 +602,14 @@ void LauncherModel::focusedAppIdChanged()
576 for (int i = 0; i < m_list.count(); ++i) {
602 for (int i = 0; i < m_list.count(); ++i) {
577 LauncherItem *item = m_list.at(i);
603 LauncherItem *item = m_list.at(i);
578 if (!item->focused() && item->appId() == appId) {
604 if (!item->focused() && item->appId() == appId) {
605+ QVector<int> changedRoles;
606+ changedRoles << RoleFocused;
579 item->setFocused(true);
607 item->setFocused(true);
580− Q_EMIT dataChanged(index(i), index(i), {RoleFocused});
608+ if (item->alerting()) {
609+ changedRoles << RoleAlerting;
610+ item->setAlerting(false);
611+ }
612+ Q_EMIT dataChanged(index(i), index(i), changedRoles);
581 } else if (item->focused() && item->appId() != appId) {
613 } else if (item->focused() && item->appId() != appId) {
582 item->setFocused(false);
614 item->setFocused(false);
583 Q_EMIT dataChanged(index(i), index(i), {RoleFocused});
615 Q_EMIT dataChanged(index(i), index(i), {RoleFocused});
plugins/Unity/Launcher/launchermodel.h+1−1
@@ -45,7 +45,6 @@ public:
45
45
46 QVariant data(const QModelIndex &index, int role) const override;
46 QVariant data(const QModelIndex &index, int role) const override;
47
47
48− Q_INVOKABLE void setAlerting(const QString &appId, bool alerting) override;
49 Q_INVOKABLE unity::shell::launcher::LauncherItemInterface* get(int index) const override;
48 Q_INVOKABLE unity::shell::launcher::LauncherItemInterface* get(int index) const override;
50 Q_INVOKABLE void move(int oldIndex, int newIndex) override;
49 Q_INVOKABLE void move(int oldIndex, int newIndex) override;
51 Q_INVOKABLE void pin(const QString &appId, int index = -1) override;
50 Q_INVOKABLE void pin(const QString &appId, int index = -1) override;
@@ -79,6 +78,7 @@ private Q_SLOTS:
79 void applicationAdded(const QModelIndex &parent, int row);
78 void applicationAdded(const QModelIndex &parent, int row);
80 void applicationRemoved(const QModelIndex &parent, int row);
79 void applicationRemoved(const QModelIndex &parent, int row);
81 void focusedAppIdChanged();
80 void focusedAppIdChanged();
81+ void applicationSurfaceCountChanged(int);
82
82
83private:
83private:
84 QList<LauncherItem*> m_list;
84 QList<LauncherItem*> m_list;
plugins/Unity/Platform/Platform.qmltypesdeleted−20
@@ -1,20 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Platform 1.0 plugins'
8−
9−Module {
10− Component {
11− name: "Platform"
12− prototype: "QObject"
13− exports: ["Unity.Platform/Platform 1.0"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Property { name: "chassis"; type: "string"; isReadonly: true }
18− Property { name: "isPC"; type: "bool"; isReadonly: true }
19− }
20−}
plugins/Unity/Session/CMakeLists.txt+4
@@ -2,9 +2,12 @@ include_directories(
2 ${CMAKE_CURRENT_SOURCE_DIR}
2 ${CMAKE_CURRENT_SOURCE_DIR}
3 ${CMAKE_CURRENT_BINARY_DIR}
3 ${CMAKE_CURRENT_BINARY_DIR}
4 ${GIO_INCLUDE_DIRS}
4 ${GIO_INCLUDE_DIRS}
5+ ${GLIB_INCLUDE_DIRS}
5 ${libunity8-private_SOURCE_DIR}
6 ${libunity8-private_SOURCE_DIR}
6)
7)
7
8
9+add_definitions(-DSM_BUSNAME=systemBus)
10+
8set(QMLSESSIONPLUGIN_SRC
11set(QMLSESSIONPLUGIN_SRC
9 plugin.cpp
12 plugin.cpp
10 dbusunitysessionservice.cpp
13 dbusunitysessionservice.cpp
@@ -19,6 +22,7 @@ qt5_use_modules(UnitySession-qml DBus Qml)
19target_link_libraries(UnitySession-qml
22target_link_libraries(UnitySession-qml
20 unity8-private
23 unity8-private
21 ${GIO_LDFLAGS}
24 ${GIO_LDFLAGS}
25+ ${GLIB_LIBRARIES}
22 )
26 )
23
27
24# export the qmldir and qmltypes files
28# export the qmldir and qmltypes files
plugins/Unity/Session/Session.qmltypesdeleted−85
@@ -1,85 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Unity.Session 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "DBusUnitySessionService"
12− prototype: "UnityDBusObject"
13− exports: ["Unity.Session/DBusUnitySessionService 0.1"]
14− isCreatable: false
15− isSingleton: true
16− exportMetaObjectRevisions: [0]
17− Signal {
18− name: "LogoutRequested"
19− Parameter { name: "have_inhibitors"; type: "bool" }
20− }
21− Signal {
22− name: "logoutRequested"
23− Parameter { name: "have_inhibitors"; type: "bool" }
24− }
25− Signal {
26− name: "RebootRequested"
27− Parameter { name: "have_inhibitors"; type: "bool" }
28− }
29− Signal {
30− name: "rebootRequested"
31− Parameter { name: "have_inhibitors"; type: "bool" }
32− }
33− Signal {
34− name: "ShutdownRequested"
35− Parameter { name: "have_inhibitors"; type: "bool" }
36− }
37− Signal {
38− name: "shutdownRequested"
39− Parameter { name: "have_inhibitors"; type: "bool" }
40− }
41− Signal { name: "LogoutReady" }
42− Signal { name: "logoutReady" }
43− Signal { name: "LockRequested" }
44− Signal { name: "lockRequested" }
45− Signal { name: "Locked" }
46− Signal { name: "Unlocked" }
47− Method { name: "Logout" }
48− Method { name: "Reboot" }
49− Method { name: "Shutdown" }
50− Method { name: "Suspend" }
51− Method { name: "Hibernate" }
52− Method { name: "HybridSleep" }
53− Method { name: "RequestLogout" }
54− Method { name: "RequestReboot" }
55− Method { name: "RequestShutdown" }
56− Method { name: "EndSession" }
57− Method { name: "CanHibernate"; type: "bool" }
58− Method { name: "CanSuspend"; type: "bool" }
59− Method { name: "CanHybridSleep"; type: "bool" }
60− Method { name: "CanReboot"; type: "bool" }
61− Method { name: "CanShutdown"; type: "bool" }
62− Method { name: "CanLock"; type: "bool" }
63− Method { name: "UserName"; type: "string" }
64− Method { name: "RealName"; type: "string" }
65− Method { name: "HostName"; type: "string" }
66− Method { name: "PromptLock" }
67− Method { name: "Lock" }
68− Method { name: "IsLocked"; type: "bool" }
69− Method { name: "logout" }
70− Method { name: "reboot" }
71− Method { name: "shutdown" }
72− Method { name: "endSession" }
73− }
74− Component {
75− name: "OrientationLock"
76− prototype: "QObject"
77− exports: ["Unity.Session/OrientationLock 0.1"]
78− isCreatable: false
79− isSingleton: true
80− exportMetaObjectRevisions: [0]
81− Property { name: "enabled"; type: "bool"; isReadonly: true }
82− Property { name: "savedOrientation"; type: "Qt::ScreenOrientation" }
83− }
84− Component { name: "UnityDBusObject"; prototype: "QObject" }
85−}
plugins/Unity/Session/dbusunitysessionservice.cpp+61−24
@@ -30,6 +30,9 @@
30#include <QDateTime>
30#include <QDateTime>
31#include <QDBusUnixFileDescriptor>
31#include <QDBusUnixFileDescriptor>
32
32
33+// Glib
34+#include <glib.h>
35+
33#define LOGIN1_SERVICE QStringLiteral("org.freedesktop.login1")
36#define LOGIN1_SERVICE QStringLiteral("org.freedesktop.login1")
34#define LOGIN1_PATH QStringLiteral("/org/freedesktop/login1")
37#define LOGIN1_PATH QStringLiteral("/org/freedesktop/login1")
35#define LOGIN1_IFACE QStringLiteral("org.freedesktop.login1.Manager")
38#define LOGIN1_IFACE QStringLiteral("org.freedesktop.login1.Manager")
@@ -61,19 +64,19 @@ public:
61 QStringLiteral("GetSessionByPID"));
64 QStringLiteral("GetSessionByPID"));
62 msg << (quint32) getpid();
65 msg << (quint32) getpid();
63
66
64− QDBusReply<QDBusObjectPath> reply = QDBusConnection::systemBus().call(msg);
67+ QDBusReply<QDBusObjectPath> reply = QDBusConnection::SM_BUSNAME().call(msg);
65 if (reply.isValid()) {
68 if (reply.isValid()) {
66 logindSessionPath = reply.value().path();
69 logindSessionPath = reply.value().path();
67
70
68 // start watching the Active property
71 // start watching the Active property
69− QDBusConnection::systemBus().connect(LOGIN1_SERVICE, logindSessionPath, QStringLiteral("org.freedesktop.DBus.Properties"), QStringLiteral("PropertiesChanged"),
72+ QDBusConnection::SM_BUSNAME().connect(LOGIN1_SERVICE, logindSessionPath, QStringLiteral("org.freedesktop.DBus.Properties"), QStringLiteral("PropertiesChanged"),
70− this, SLOT(onPropertiesChanged(QString,QVariantMap,QStringList)));
73+ this, SLOT(onPropertiesChanged(QString,QVariantMap,QStringList)));
71
74
72 setupSystemdInhibition();
75 setupSystemdInhibition();
73
76
74 // re-enable the inhibition upon resume from sleep
77 // re-enable the inhibition upon resume from sleep
75− QDBusConnection::systemBus().connect(LOGIN1_SERVICE, LOGIN1_PATH, LOGIN1_IFACE, QStringLiteral("PrepareForSleep"),
78+ QDBusConnection::SM_BUSNAME().connect(LOGIN1_SERVICE, LOGIN1_PATH, LOGIN1_IFACE, QStringLiteral("PrepareForSleep"),
76− this, SLOT(onResuming(bool)));
79+ this, SLOT(onResuming(bool)));
77 } else {
80 } else {
78 qWarning() << "Failed to get logind session path" << reply.error().message();
81 qWarning() << "Failed to get logind session path" << reply.error().message();
79 }
82 }
@@ -93,7 +96,7 @@ public:
93 msg << "Unity8 handles power events"; // why
96 msg << "Unity8 handles power events"; // why
94 msg << "block"; // mode
97 msg << "block"; // mode
95
98
96− QDBusPendingCall pendingCall = QDBusConnection::systemBus().asyncCall(msg);
99+ QDBusPendingCall pendingCall = QDBusConnection::SM_BUSNAME().asyncCall(msg);
97 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall, this);
100 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall, this);
98 connect(watcher, &QDBusPendingCallWatcher::finished,
101 connect(watcher, &QDBusPendingCallWatcher::finished,
99 this, [this](QDBusPendingCallWatcher* watcher) {
102 this, [this](QDBusPendingCallWatcher* watcher) {
@@ -111,7 +114,7 @@ public:
111 bool checkLogin1Call(const QString &method) const
114 bool checkLogin1Call(const QString &method) const
112 {
115 {
113 QDBusMessage msg = QDBusMessage::createMethodCall(LOGIN1_SERVICE, LOGIN1_PATH, LOGIN1_IFACE, method);
116 QDBusMessage msg = QDBusMessage::createMethodCall(LOGIN1_SERVICE, LOGIN1_PATH, LOGIN1_IFACE, method);
114− QDBusReply<QString> reply = QDBusConnection::systemBus().call(msg);
117+ QDBusReply<QString> reply = QDBusConnection::SM_BUSNAME().call(msg);
115 return reply.isValid() && (reply == QStringLiteral("yes") || reply == QStringLiteral("challenge"));
118 return reply.isValid() && (reply == QStringLiteral("yes") || reply == QStringLiteral("challenge"));
116 }
119 }
117
120
@@ -122,7 +125,7 @@ public:
122 LOGIN1_IFACE,
125 LOGIN1_IFACE,
123 method);
126 method);
124 msg.setArguments(args);
127 msg.setArguments(args);
125− QDBusConnection::systemBus().asyncCall(msg);
128+ QDBusConnection::SM_BUSNAME().asyncCall(msg);
126 }
129 }
127
130
128 void setActive(bool active)
131 void setActive(bool active)
@@ -154,7 +157,7 @@ public:
154 msg << LOGIN1_SESSION_IFACE;
157 msg << LOGIN1_SESSION_IFACE;
155 msg << ACTIVE_KEY;
158 msg << ACTIVE_KEY;
156
159
157− QDBusPendingCall pendingCall = QDBusConnection::systemBus().asyncCall(msg);
160+ QDBusPendingCall pendingCall = QDBusConnection::SM_BUSNAME().asyncCall(msg);
158 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall, this);
161 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall, this);
159 connect(watcher, &QDBusPendingCallWatcher::finished,
162 connect(watcher, &QDBusPendingCallWatcher::finished,
160 this, [this](QDBusPendingCallWatcher* watcher) {
163 this, [this](QDBusPendingCallWatcher* watcher) {
@@ -188,7 +191,7 @@ public:
188 msg << LOGIN1_SESSION_IFACE;
191 msg << LOGIN1_SESSION_IFACE;
189 msg << IDLE_SINCE_KEY;
192 msg << IDLE_SINCE_KEY;
190
193
191− QDBusReply<QVariant> reply = QDBusConnection::systemBus().call(msg);
194+ QDBusReply<QVariant> reply = QDBusConnection::SM_BUSNAME().call(msg);
192 if (reply.isValid()) {
195 if (reply.isValid()) {
193 return reply.value().value<quint64>();
196 return reply.value().value<quint64>();
194 } else {
197 } else {
@@ -205,7 +208,7 @@ public:
205 LOGIN1_SESSION_IFACE,
208 LOGIN1_SESSION_IFACE,
206 QStringLiteral("SetIdleHint"));
209 QStringLiteral("SetIdleHint"));
207 msg << idle;
210 msg << idle;
208− QDBusConnection::systemBus().asyncCall(msg);
211+ QDBusConnection::SM_BUSNAME().asyncCall(msg);
209 }
212 }
210
213
211private Q_SLOTS:
214private Q_SLOTS:
@@ -224,11 +227,14 @@ private Q_SLOTS:
224 {
227 {
225 if (!active) {
228 if (!active) {
226 setupSystemdInhibition();
229 setupSystemdInhibition();
230+ } else {
231+ Q_EMIT prepareForSleep();
227 }
232 }
228 }
233 }
229
234
230Q_SIGNALS:
235Q_SIGNALS:
231 void screensaverActiveChanged(bool active);
236 void screensaverActiveChanged(bool active);
237+ void prepareForSleep();
232};
238};
233
239
234Q_GLOBAL_STATIC(DBusUnitySessionServicePrivate, d)
240Q_GLOBAL_STATIC(DBusUnitySessionServicePrivate, d)
@@ -237,11 +243,12 @@ DBusUnitySessionService::DBusUnitySessionService()
237 : UnityDBusObject(QStringLiteral("/com/canonical/Unity/Session"), QStringLiteral("com.canonical.Unity"))
243 : UnityDBusObject(QStringLiteral("/com/canonical/Unity/Session"), QStringLiteral("com.canonical.Unity"))
238{
244{
239 if (!d->logindSessionPath.isEmpty()) {
245 if (!d->logindSessionPath.isEmpty()) {
240− // connect our Lock() slot to the logind's session Lock() signal
246+ // connect our PromptLock() slot to the logind's session Lock() signal
241− QDBusConnection::systemBus().connect(LOGIN1_SERVICE, d->logindSessionPath, LOGIN1_SESSION_IFACE, QStringLiteral("Lock"), this, SLOT(Lock()));
247+ QDBusConnection::SM_BUSNAME().connect(LOGIN1_SERVICE, d->logindSessionPath, LOGIN1_SESSION_IFACE, QStringLiteral("Lock"), this, SLOT(PromptLock()));
242 // ... and our Unlocked() signal to the logind's session Unlock() signal
248 // ... and our Unlocked() signal to the logind's session Unlock() signal
243 // (lightdm handles the unlocking by calling logind's Unlock method which in turn emits this signal we connect to)
249 // (lightdm handles the unlocking by calling logind's Unlock method which in turn emits this signal we connect to)
244− QDBusConnection::systemBus().connect(LOGIN1_SERVICE, d->logindSessionPath, LOGIN1_SESSION_IFACE, QStringLiteral("Unlock"), this, SIGNAL(Unlocked()));
250+ QDBusConnection::SM_BUSNAME().connect(LOGIN1_SERVICE, d->logindSessionPath, LOGIN1_SESSION_IFACE, QStringLiteral("Unlock"), this, SLOT(doUnlock()));
251+ connect(d, &DBusUnitySessionServicePrivate::prepareForSleep, this, &DBusUnitySessionService::PromptLock);
245 } else {
252 } else {
246 qWarning() << "Failed to connect to logind's session Lock/Unlock signals";
253 qWarning() << "Failed to connect to logind's session Lock/Unlock signals";
247 }
254 }
@@ -295,12 +302,7 @@ bool DBusUnitySessionService::CanLock() const
295
302
296QString DBusUnitySessionService::UserName() const
303QString DBusUnitySessionService::UserName() const
297{
304{
298− struct passwd *p = getpwuid(geteuid());
299− if (p) {
300− return QString::fromUtf8(p->pw_name);
305+ return QString::fromUtf8(g_get_user_name());
301− }
302−
303− return QString();
304}
306}
305
307
306QString DBusUnitySessionService::RealName() const
308QString DBusUnitySessionService::RealName() const
@@ -330,15 +332,41 @@ QString DBusUnitySessionService::HostName() const
330
332
331void DBusUnitySessionService::PromptLock()
333void DBusUnitySessionService::PromptLock()
332{
334{
335+ // Prompt as in quick. No locking animation needed. Usually used by
336+ // indicator-session in combination with a switch to greeter or other
337+ // user session.
333 Q_EMIT LockRequested();
338 Q_EMIT LockRequested();
334 Q_EMIT lockRequested();
339 Q_EMIT lockRequested();
335}
340}
336
341
337void DBusUnitySessionService::Lock()
342void DBusUnitySessionService::Lock()
338{
343{
339− // signal u8 to show the lockscreen/greeter
344+ // Normal lock (with animation, as compared to PromptLock above). Usually
345+ // used by indicator-session to lock the session in place.
346+ //
347+ // FIXME: We also -- as a bit of a hack around indicator-session not fully
348+ // supporting a phone profile -- switch to greeter here. The unity7 flow is
349+ // that the user chooses "Lock/Switch" from the indicator, and then can go
350+ // to greeter by selecting "Switch" again from the indicator, which is now
351+ // exposed by the desktop_lockscreen profile. But since in unity8, we try
352+ // to expose most things all the time, we don't use the separate lockscreen
353+ // profile. Instead, we just go directly to the greeter the first time
354+ // a user presses "Lock/Switch". This isn't what this DBus call is
355+ // supposed to do, but we can live with it for now.
356+ //
357+ // Here's a bug about indicator-session growing a converged Touch profile:
358+ // https://launchpad.net/bugs/1557716
359+ //
360+ // We only do this here in the animated-lock call because that's the only
361+ // time the indicator locks without also asking the display manager to
362+ // switch sessions on us. And since we are switching screens, we also
363+ // don't bother respecting the animate request, simply doing a PromptLock.
340 PromptLock();
364 PromptLock();
365+ switchToGreeter();
366+}
341
367
368+void DBusUnitySessionService::switchToGreeter()
369+{
342 // lock the session using the org.freedesktop.DisplayManager system DBUS service
370 // lock the session using the org.freedesktop.DisplayManager system DBUS service
343 const QString sessionPath = QString::fromLocal8Bit(qgetenv("XDG_SESSION_PATH"));
371 const QString sessionPath = QString::fromLocal8Bit(qgetenv("XDG_SESSION_PATH"));
344 QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.freedesktop.DisplayManager"),
372 QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.freedesktop.DisplayManager"),
@@ -346,7 +374,7 @@ void DBusUnitySessionService::Lock()
346 QStringLiteral("org.freedesktop.DisplayManager.Session"),
374 QStringLiteral("org.freedesktop.DisplayManager.Session"),
347 QStringLiteral("Lock"));
375 QStringLiteral("Lock"));
348
376
349− QDBusPendingCall pendingCall = QDBusConnection::systemBus().asyncCall(msg);
377+ QDBusPendingCall pendingCall = QDBusConnection::SM_BUSNAME().asyncCall(msg);
350 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall, this);
378 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall, this);
351 connect(watcher, &QDBusPendingCallWatcher::finished,
379 connect(watcher, &QDBusPendingCallWatcher::finished,
352 this, [this](QDBusPendingCallWatcher* watcher) {
380 this, [this](QDBusPendingCallWatcher* watcher) {
@@ -363,6 +391,12 @@ void DBusUnitySessionService::Lock()
363 });
391 });
364}
392}
365
393
394+void DBusUnitySessionService::doUnlock()
395+{
396+ Q_EMIT Unlocked();
397+ Q_EMIT unlocked();
398+}
399+
366bool DBusUnitySessionService::IsLocked() const
400bool DBusUnitySessionService::IsLocked() const
367{
401{
368 return !d->isSessionActive;
402 return !d->isSessionActive;
@@ -392,16 +426,19 @@ void DBusUnitySessionService::Shutdown()
392
426
393void DBusUnitySessionService::Suspend()
427void DBusUnitySessionService::Suspend()
394{
428{
429+ PromptLock();
395 d->makeLogin1Call(QStringLiteral("Suspend"), {false});
430 d->makeLogin1Call(QStringLiteral("Suspend"), {false});
396}
431}
397
432
398void DBusUnitySessionService::Hibernate()
433void DBusUnitySessionService::Hibernate()
399{
434{
435+ PromptLock();
400 d->makeLogin1Call(QStringLiteral("Hibernate"), {false});
436 d->makeLogin1Call(QStringLiteral("Hibernate"), {false});
401}
437}
402
438
403void DBusUnitySessionService::HybridSleep()
439void DBusUnitySessionService::HybridSleep()
404{
440{
441+ PromptLock();
405 d->makeLogin1Call(QStringLiteral("HybridSleep"), {false});
442 d->makeLogin1Call(QStringLiteral("HybridSleep"), {false});
406}
443}
407
444
@@ -481,7 +518,7 @@ void DBusGnomeScreensaverWrapper::SetActive(bool lock)
481
518
482void DBusGnomeScreensaverWrapper::Lock()
519void DBusGnomeScreensaverWrapper::Lock()
483{
520{
484− performAsyncUnityCall(QStringLiteral("Lock"));
521+ performAsyncUnityCall(QStringLiteral("PromptLock"));
485}
522}
486
523
487quint32 DBusGnomeScreensaverWrapper::GetActiveTime() const
524quint32 DBusGnomeScreensaverWrapper::GetActiveTime() const
@@ -518,7 +555,7 @@ bool DBusScreensaverWrapper::SetActive(bool lock)
518
555
519void DBusScreensaverWrapper::Lock()
556void DBusScreensaverWrapper::Lock()
520{
557{
521− performAsyncUnityCall(QStringLiteral("Lock"));
558+ performAsyncUnityCall(QStringLiteral("PromptLock"));
522}
559}
523
560
524quint32 DBusScreensaverWrapper::GetActiveTime() const
561quint32 DBusScreensaverWrapper::GetActiveTime() const
plugins/Unity/Session/dbusunitysessionservice.h+7
@@ -106,6 +106,7 @@ Q_SIGNALS:
106 * Emitted after the session has been unlocked.
106 * Emitted after the session has been unlocked.
107 */
107 */
108 Q_SCRIPTABLE void Unlocked();
108 Q_SCRIPTABLE void Unlocked();
109+ void unlocked();
109
110
110public Q_SLOTS:
111public Q_SLOTS:
111 /**
112 /**
@@ -258,6 +259,12 @@ public Q_SLOTS:
258 * @return whether the session is currently locked
259 * @return whether the session is currently locked
259 */
260 */
260 Q_SCRIPTABLE bool IsLocked() const;
261 Q_SCRIPTABLE bool IsLocked() const;
262+
263+private Q_SLOTS:
264+ void doUnlock();
265+
266+private:
267+ void switchToGreeter();
261};
268};
262
269
263class DBusGnomeSessionManagerWrapper : public UnityDBusObject
270class DBusGnomeSessionManagerWrapper : public UnityDBusObject
plugins/Utils/CMakeLists.txt+5−1
@@ -1,6 +1,10 @@
1include_directories(
1include_directories(
2 ${CMAKE_CURRENT_SOURCE_DIR}
2 ${CMAKE_CURRENT_SOURCE_DIR}
3 ${CMAKE_CURRENT_BINARY_DIR}
3 ${CMAKE_CURRENT_BINARY_DIR}
4+)
5+
6+include_directories(
7+ SYSTEM
4 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
8 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
5 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
9 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
6 ${GIO_INCLUDE_DIRS}
10 ${GIO_INCLUDE_DIRS}
@@ -9,6 +13,7 @@ include_directories(
9set(QMLPLUGIN_SRC
13set(QMLPLUGIN_SRC
10 activefocuslogger.cpp
14 activefocuslogger.cpp
11 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
15 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
16+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
12 applicationsfiltermodel.cpp
17 applicationsfiltermodel.cpp
13 constants.cpp
18 constants.cpp
14 WindowInputMonitor.cpp
19 WindowInputMonitor.cpp
@@ -18,7 +23,6 @@ set(QMLPLUGIN_SRC
18 Timer.cpp
23 Timer.cpp
19 unitymenumodelpaths.cpp
24 unitymenumodelpaths.cpp
20 windowinputfilter.cpp
25 windowinputfilter.cpp
21− windowscreenshotprovider.cpp
22 easingcurve.cpp
26 easingcurve.cpp
23 windowstatestorage.cpp
27 windowstatestorage.cpp
24 timezoneFormatter.cpp
28 timezoneFormatter.cpp
plugins/Utils/Utils.qmltypesdeleted−175
@@ -1,175 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Utils 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "EasingCurve"
12− prototype: "QObject"
13− exports: ["Utils/EasingCurve 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "type"; type: "QEasingCurve::Type" }
16− Property { name: "period"; type: "double" }
17− Property { name: "progress"; type: "double" }
18− Property { name: "value"; type: "double"; isReadonly: true }
19− }
20− Component {
21− name: "QAbstractProxyModel"
22− prototype: "QAbstractItemModel"
23− Property { name: "sourceModel"; type: "QAbstractItemModel"; isPointer: true }
24− }
25− Component { name: "QIdentityProxyModel"; prototype: "QAbstractProxyModel" }
26− Component {
27− name: "QLimitProxyModelQML"
28− prototype: "QIdentityProxyModel"
29− exports: ["Utils/LimitProxyModel 0.1"]
30− exportMetaObjectRevisions: [0]
31− Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
32− Property { name: "limit"; type: "int" }
33− Property { name: "count"; type: "int"; isReadonly: true }
34− Signal { name: "totalCountChanged" }
35− }
36− Component {
37− name: "QSortFilterProxyModel"
38− prototype: "QAbstractProxyModel"
39− Property { name: "filterRegExp"; type: "QRegExp" }
40− Property { name: "filterKeyColumn"; type: "int" }
41− Property { name: "dynamicSortFilter"; type: "bool" }
42− Property { name: "filterCaseSensitivity"; type: "Qt::CaseSensitivity" }
43− Property { name: "sortCaseSensitivity"; type: "Qt::CaseSensitivity" }
44− Property { name: "isSortLocaleAware"; type: "bool" }
45− Property { name: "sortRole"; type: "int" }
46− Property { name: "filterRole"; type: "int" }
47− Method {
48− name: "setFilterRegExp"
49− Parameter { name: "pattern"; type: "string" }
50− }
51− Method {
52− name: "setFilterWildcard"
53− Parameter { name: "pattern"; type: "string" }
54− }
55− Method {
56− name: "setFilterFixedString"
57− Parameter { name: "pattern"; type: "string" }
58− }
59− Method { name: "clear" }
60− Method { name: "invalidate" }
61− }
62− Component {
63− name: "RelativeTimeFormatter"
64− prototype: "TimeFormatter"
65− exports: ["Utils/RelativeTimeFormatter 0.1"]
66− exportMetaObjectRevisions: [0]
67− }
68− Component {
69− name: "TimeFormatter"
70− prototype: "QObject"
71− exports: ["Utils/GDateTimeFormatter 0.1", "Utils/TimeFormatter 0.1"]
72− exportMetaObjectRevisions: [0, 0]
73− Property { name: "format"; type: "string" }
74− Property { name: "timeString"; type: "string"; isReadonly: true }
75− Property { name: "time"; type: "qlonglong" }
76− Signal {
77− name: "formatChanged"
78− Parameter { name: "format"; type: "string" }
79− }
80− Signal {
81− name: "timeStringChanged"
82− Parameter { name: "timeString"; type: "string" }
83− }
84− Signal {
85− name: "timeChanged"
86− Parameter { name: "time"; type: "qlonglong" }
87− }
88− }
89− Component {
90− name: "UnityMenuModelPaths"
91− prototype: "QObject"
92− exports: ["Utils/UnityMenuModelPaths 0.1"]
93− exportMetaObjectRevisions: [0]
94− Property { name: "source"; type: "QVariant" }
95− Property { name: "busName"; type: "QByteArray"; isReadonly: true }
96− Property { name: "actions"; type: "QVariantMap"; isReadonly: true }
97− Property { name: "menuObjectPath"; type: "QByteArray"; isReadonly: true }
98− Property { name: "busNameHint"; type: "QByteArray" }
99− Property { name: "actionsHint"; type: "QByteArray" }
100− Property { name: "menuObjectPathHint"; type: "QByteArray" }
101− }
102− Component {
103− name: "UnitySortFilterProxyModelQML"
104− prototype: "QSortFilterProxyModel"
105− exports: ["Utils/UnitySortFilterProxyModel 0.1"]
106− exportMetaObjectRevisions: [0]
107− Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
108− Property { name: "totalCount"; type: "int"; isReadonly: true }
109− Property { name: "count"; type: "int"; isReadonly: true }
110− Property { name: "invertMatch"; type: "bool" }
111− Signal {
112− name: "invertMatchChanged"
113− Parameter { type: "bool" }
114− }
115− Method {
116− name: "get"
117− type: "QVariantMap"
118− Parameter { name: "row"; type: "int" }
119− }
120− Method {
121− name: "data"
122− type: "QVariant"
123− Parameter { name: "row"; type: "int" }
124− Parameter { name: "role"; type: "int" }
125− }
126− Method { name: "count"; type: "int" }
127− Method {
128− name: "findFirst"
129− type: "int"
130− Parameter { name: "role"; type: "int" }
131− Parameter { name: "value"; type: "QVariant" }
132− }
133− Method {
134− name: "mapRowToSource"
135− type: "int"
136− Parameter { name: "row"; type: "int" }
137− }
138− Method {
139− name: "mapFromSource"
140− type: "int"
141− Parameter { name: "row"; type: "int" }
142− }
143− Method {
144− name: "mapToSource"
145− type: "int"
146− Parameter { name: "row"; type: "int" }
147− }
148− }
149− Component {
150− name: "WindowInputFilter"
151− defaultProperty: "data"
152− prototype: "QQuickItem"
153− exports: ["Utils/WindowInputFilter 0.1"]
154− exportMetaObjectRevisions: [0]
155− }
156− Component {
157− name: "WindowStateStorage"
158− prototype: "QObject"
159− exports: ["Utils/WindowStateStorage 0.1"]
160− isCreatable: false
161− isSingleton: true
162− exportMetaObjectRevisions: [0]
163− Method {
164− name: "saveGeometry"
165− Parameter { name: "windowId"; type: "string" }
166− Parameter { name: "rect"; type: "QRect" }
167− }
168− Method {
169− name: "getGeometry"
170− type: "QRect"
171− Parameter { name: "windowId"; type: "string" }
172− Parameter { name: "defaultValue"; type: "QRect" }
173− }
174− }
175−}
plugins/Utils/WindowInputMonitor.cpp+8−8
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -30,7 +30,6 @@ WindowInputMonitor::WindowInputMonitor(UnityUtil::AbstractTimer *timer,
30 QQuickItem *parent)
30 QQuickItem *parent)
31 : QQuickItem(parent)
31 : QQuickItem(parent)
32 , m_windowBeingTouched(false)
32 , m_windowBeingTouched(false)
33− , m_homeKeyPressed(false)
34 , m_windowLastTouchedTimer(elapsedTimer)
33 , m_windowLastTouchedTimer(elapsedTimer)
35 , m_activationTimer(timer)
34 , m_activationTimer(timer)
36{
35{
@@ -42,6 +41,7 @@ WindowInputMonitor::WindowInputMonitor(UnityUtil::AbstractTimer *timer,
42 connect(m_activationTimer, &UnityUtil::AbstractTimer::timeout,
41 connect(m_activationTimer, &UnityUtil::AbstractTimer::timeout,
43 this, &WindowInputMonitor::emitActivatedIfNoTouchesAround);
42 this, &WindowInputMonitor::emitActivatedIfNoTouchesAround);
44 m_activationTimer->setInterval(msecsWithoutTouches);
43 m_activationTimer->setInterval(msecsWithoutTouches);
44+ m_activationTimer->setSingleShot(true);
45}
45}
46
46
47WindowInputMonitor::~WindowInputMonitor()
47WindowInputMonitor::~WindowInputMonitor()
@@ -67,19 +67,19 @@ void WindowInputMonitor::update(QEvent *event)
67 if (event->type() == QEvent::KeyPress) {
67 if (event->type() == QEvent::KeyPress) {
68 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
68 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
69
69
70− m_homeKeyPressed = true;
70+ if (m_pressedHomeKey == 0 && m_homeKeys.contains(keyEvent->key()) && !keyEvent->isAutoRepeat()
71−
71+ && !m_activationTimer->isRunning()
72− if (keyEvent->key() == Qt::Key_Super_L && !keyEvent->isAutoRepeat()
73 && !m_windowBeingTouched
72 && !m_windowBeingTouched
74 && m_windowLastTouchedTimer->elapsed() >= msecsWithoutTouches) {
73 && m_windowLastTouchedTimer->elapsed() >= msecsWithoutTouches) {
74+ m_pressedHomeKey = keyEvent->key();
75 m_activationTimer->start();
75 m_activationTimer->start();
76 }
76 }
77
77
78 } else if (event->type() == QEvent::KeyRelease) {
78 } else if (event->type() == QEvent::KeyRelease) {
79 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
79 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
80
80
81− if (keyEvent->key() == Qt::Key_Super_L) {
81+ if (keyEvent->key() == m_pressedHomeKey) {
82− m_homeKeyPressed = false;
82+ m_pressedHomeKey = 0;
83 }
83 }
84
84
85 } else if (event->type() == QEvent::TouchBegin) {
85 } else if (event->type() == QEvent::TouchBegin) {
@@ -116,7 +116,7 @@ void WindowInputMonitor::setupFilterOnWindow(QQuickWindow *window)
116
116
117void WindowInputMonitor::emitActivatedIfNoTouchesAround()
117void WindowInputMonitor::emitActivatedIfNoTouchesAround()
118{
118{
119− if (!m_homeKeyPressed && !m_windowBeingTouched &&
119+ if (m_pressedHomeKey == 0 && !m_windowBeingTouched &&
120 (m_windowLastTouchedTimer->elapsed() > msecsWithoutTouches)) {
120 (m_windowLastTouchedTimer->elapsed() > msecsWithoutTouches)) {
121 Q_EMIT homeKeyActivated();
121 Q_EMIT homeKeyActivated();
122 }
122 }
plugins/Utils/WindowInputMonitor.h+8−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -18,6 +18,7 @@
18#define UNITY_WINDOWINPUTMONITOR_H
18#define UNITY_WINDOWINPUTMONITOR_H
19
19
20#include <QQuickItem>
20#include <QQuickItem>
21+#include <QList>
21#include <QPointer>
22#include <QPointer>
22
23
23#include "Timer.h"
24#include "Timer.h"
@@ -83,9 +84,14 @@ private Q_SLOTS:
83private:
84private:
84 QPointer<QQuickWindow> m_filteredWindow;
85 QPointer<QQuickWindow> m_filteredWindow;
85 bool m_windowBeingTouched;
86 bool m_windowBeingTouched;
86− bool m_homeKeyPressed;
87 UnityUtil::AbstractElapsedTimer *m_windowLastTouchedTimer;
87 UnityUtil::AbstractElapsedTimer *m_windowLastTouchedTimer;
88 UnityUtil::AbstractTimer *m_activationTimer;
88 UnityUtil::AbstractTimer *m_activationTimer;
89+
90+ // Qt::Keys that are mapped to our "home" key.
91+ QList<int> m_homeKeys{Qt::Key_Super_L, Qt::Key_HomePage};
92+ // Which Qt::Key from m_homeKeys is currently pressed.
93+ // 0 if none
94+ int m_pressedHomeKey{0};
89};
95};
90
96
91#endif // UNITY_WINDOWINPUTMONITOR_H
97#endif // UNITY_WINDOWINPUTMONITOR_H
plugins/Utils/deviceconfigparser.cpp+8
@@ -23,6 +23,7 @@
23
23
24DeviceConfigParser::DeviceConfigParser(QObject *parent): QObject(parent)
24DeviceConfigParser::DeviceConfigParser(QObject *parent): QObject(parent)
25{
25{
26+ // Local files have highest priority
26 QString path;
27 QString path;
27 Q_FOREACH (const QString &standardPath, QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation)) {
28 Q_FOREACH (const QString &standardPath, QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation)) {
28 if (QFileInfo(standardPath + "/devices.conf").exists()) {
29 if (QFileInfo(standardPath + "/devices.conf").exists()) {
@@ -31,9 +32,16 @@ DeviceConfigParser::DeviceConfigParser(QObject *parent): QObject(parent)
31 }
32 }
32 }
33 }
33
34
35+ // Check if there is an override in the device tarball (/system/etc/)
36+ if (path.isEmpty() && QFileInfo::exists("/system/etc/ubuntu/devices.conf")) {
37+ path = "/system/etc/ubuntu/devices.conf";
38+ }
39+
40+ // No higher priority files found. Use standard of /etc/
34 if (path.isEmpty()) {
41 if (path.isEmpty()) {
35 path = "/etc/ubuntu/devices.conf";
42 path = "/etc/ubuntu/devices.conf";
36 }
43 }
44+
37 qDebug() << "Using" << path << "as device configuration file";
45 qDebug() << "Using" << path << "as device configuration file";
38 m_config = new QSettings(path, QSettings::IniFormat, this);
46 m_config = new QSettings(path, QSettings::IniFormat, this);
39}
47}
plugins/Utils/deviceconfigparser.h+1
@@ -25,6 +25,7 @@ class DeviceConfigParser: public QObject
25 Q_OBJECT
25 Q_OBJECT
26 Q_PROPERTY(QString name READ name WRITE setName NOTIFY changed)
26 Q_PROPERTY(QString name READ name WRITE setName NOTIFY changed)
27
27
28+ // NOTE: When changing this properties, also update the examples in docs and data
28 Q_PROPERTY(Qt::ScreenOrientation primaryOrientation READ primaryOrientation NOTIFY changed)
29 Q_PROPERTY(Qt::ScreenOrientation primaryOrientation READ primaryOrientation NOTIFY changed)
29 Q_PROPERTY(Qt::ScreenOrientations supportedOrientations READ supportedOrientations NOTIFY changed)
30 Q_PROPERTY(Qt::ScreenOrientations supportedOrientations READ supportedOrientations NOTIFY changed)
30 Q_PROPERTY(Qt::ScreenOrientation landscapeOrientation READ landscapeOrientation NOTIFY changed)
31 Q_PROPERTY(Qt::ScreenOrientation landscapeOrientation READ landscapeOrientation NOTIFY changed)
plugins/Utils/globalfunctions.cpp+1−4
@@ -16,11 +16,8 @@
16
16
17#include "globalfunctions.h"
17#include "globalfunctions.h"
18
18
19−#pragma GCC diagnostic push
20−#pragma GCC diagnostic ignored "-pedantic"
21−#include <private/qquickitem_p.h>
22−#pragma GCC diagnostic pop
23#include <QQmlEngine>
19#include <QQmlEngine>
20+#include <private/qquickitem_p.h>
24
21
25GlobalFunctions::GlobalFunctions(QObject *parent)
22GlobalFunctions::GlobalFunctions(QObject *parent)
26 : QObject(parent)
23 : QObject(parent)
plugins/Utils/plugin.cpp−8
@@ -31,7 +31,6 @@
31#include "unitysortfilterproxymodelqml.h"
31#include "unitysortfilterproxymodelqml.h"
32#include "unitymenumodelpaths.h"
32#include "unitymenumodelpaths.h"
33#include "windowinputfilter.h"
33#include "windowinputfilter.h"
34−#include "windowscreenshotprovider.h"
35#include "windowstatestorage.h"
34#include "windowstatestorage.h"
36#include "constants.h"
35#include "constants.h"
37#include "timezoneFormatter.h"
36#include "timezoneFormatter.h"
@@ -82,10 +81,3 @@ void UtilsPlugin::registerTypes(const char *uri)
82 qmlRegisterType<DeviceConfigParser>(uri, 0, 1, "DeviceConfigParser");
81 qmlRegisterType<DeviceConfigParser>(uri, 0, 1, "DeviceConfigParser");
83 qmlRegisterSingletonType<GlobalFunctions>(uri, 0, 1, "Functions", createGlobalFunctions);
82 qmlRegisterSingletonType<GlobalFunctions>(uri, 0, 1, "Functions", createGlobalFunctions);
84}
83}
85−
86−void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
87−{
88− QQmlExtensionPlugin::initializeEngine(engine, uri);
89−
90− engine->addImageProvider(QStringLiteral("window"), new WindowScreenshotProvider);
91−}
plugins/Utils/plugin.h−1
@@ -29,7 +29,6 @@ class UtilsPlugin : public QQmlExtensionPlugin
29
29
30public:
30public:
31 void registerTypes(const char *uri) override;
31 void registerTypes(const char *uri) override;
32− void initializeEngine(QQmlEngine *engine, const char *uri) override;
33};
32};
34
33
35#endif
34#endif
plugins/Utils/windowscreenshotprovider.cppdeleted−59
@@ -1,59 +0,0 @@
1−/*
2− * Copyright (C) 2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "windowscreenshotprovider.h"
18−
19−#include <QGuiApplication>
20−#include <QQuickWindow>
21−
22−WindowScreenshotProvider::WindowScreenshotProvider()
23− : QQuickImageProvider(QQmlImageProviderBase::Image, 0)
24−{
25−}
26−
27−// A very simple implementation where we assume that there's only one window and that it's a
28−// QQuickWindow. Thus the id parameter is irrelevant.
29−//
30−// Idea: Make the id contain the objectName of the QQuickWindow once we care about a multi-display
31−// compositor?
32−// Strictly speaking that could be the actual QWindow::winId(), but that's mostly a
33−// meaningless arbitrary number.
34−QImage WindowScreenshotProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
35−{
36− Q_UNUSED(id);
37− Q_UNUSED(requestedSize);
38−
39− QWindowList windows = QGuiApplication::topLevelWindows();
40−
41− if (windows.count() != 1) {
42− size->rwidth() = 0;
43− size->rheight() = 0;
44− return QImage();
45− }
46−
47− QQuickWindow *quickWindow = qobject_cast<QQuickWindow *>(windows[0]);
48−
49− if (!quickWindow) {
50− size->rwidth() = 0;
51− size->rheight() = 0;
52− return QImage();
53− }
54−
55− QImage image = quickWindow->grabWindow();
56− size->rwidth() = image.width();
57− size->rheight() = image.height();
58− return image;
59−}
plugins/Utils/windowstatestorage.cpp+2−2
@@ -95,7 +95,7 @@ void WindowStateStorage::saveStage(const QString &appId, int stage)
95 saveValue(queryString);
95 saveValue(queryString);
96}
96}
97
97
98−int WindowStateStorage::getStage(const QString &appId) const
98+int WindowStateStorage::getStage(const QString &appId, int defaultValue) const
99{
99{
100 const QString queryString = QStringLiteral("SELECT * FROM stage WHERE appId = '%1';")
100 const QString queryString = QStringLiteral("SELECT * FROM stage WHERE appId = '%1';")
101 .arg(sanitiseString(appId));
101 .arg(sanitiseString(appId));
@@ -103,7 +103,7 @@ int WindowStateStorage::getStage(const QString &appId) const
103 QSqlQuery query = getValue(queryString);
103 QSqlQuery query = getValue(queryString);
104
104
105 if (!query.first()) {
105 if (!query.first()) {
106− return unity::shell::application::ApplicationInfoInterface::MainStage;
106+ return defaultValue;
107 }
107 }
108 return query.value("stage").toInt();
108 return query.value("stage").toInt();
109}
109}
plugins/Utils/windowstatestorage.h+14−4
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2015 Canonical Ltd.
2+ * Copyright 2015-2016 Canonical Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU Lesser General Public License as published by
@@ -25,9 +25,19 @@ class WindowStateStorage: public QObject
25 Q_ENUMS(WindowState)
25 Q_ENUMS(WindowState)
26public:
26public:
27 enum WindowState {
27 enum WindowState {
28− WindowStateNormal,
28+ WindowStateNormal = 1 << 0,
29− WindowStateMaximized
29+ WindowStateMaximized = 1 << 1,
30+ WindowStateMinimized = 1 << 2,
31+ WindowStateFullscreen = 1 << 3,
32+ WindowStateMaximizedLeft = 1 << 4,
33+ WindowStateMaximizedRight = 1 << 5,
34+ WindowStateMaximizedHorizontally = 1 << 6,
35+ WindowStateMaximizedVertically = 1 << 7
30 };
36 };
37+ Q_DECLARE_FLAGS(WindowStates, WindowState)
38+#if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0))
39+ Q_FLAG(WindowStates)
40+#endif
31
41
32 WindowStateStorage(QObject *parent = 0);
42 WindowStateStorage(QObject *parent = 0);
33 virtual ~WindowStateStorage();
43 virtual ~WindowStateStorage();
@@ -39,7 +49,7 @@ public:
39 Q_INVOKABLE QRect getGeometry(const QString &windowId, const QRect defaultValue) const;
49 Q_INVOKABLE QRect getGeometry(const QString &windowId, const QRect defaultValue) const;
40
50
41 Q_INVOKABLE void saveStage(const QString &appId, int stage);
51 Q_INVOKABLE void saveStage(const QString &appId, int stage);
42− Q_INVOKABLE int getStage(const QString &appId) const;
52+ Q_INVOKABLE int getStage(const QString &appId, int defaultValue) const;
43
53
44private:
54private:
45 void initdb();
55 void initdb();
plugins/WindowManager/CMakeLists.txtnew file+14
@@ -0,0 +1,14 @@
1+set(WINDOWMANAGER_SRC
2+ TopLevelSurfaceList.cpp
3+ WindowManagerPlugin.cpp
4+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
5+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
6+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
7+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceListInterface.h
8+ )
9+
10+add_library(windowmanager-qml SHARED ${WINDOWMANAGER_SRC})
11+
12+qt5_use_modules(windowmanager-qml Qml Quick Gui)
13+
14+add_unity8_plugin(WindowManager 0.1 WindowManager TARGETS windowmanager-qml)
plugins/WindowManager/TopLevelSurfaceList.cppnew file+486
@@ -0,0 +1,486 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "TopLevelSurfaceList.h"
18+
19+// unity-api
20+#include <unity/shell/application/ApplicationInfoInterface.h>
21+#include <unity/shell/application/MirSurfaceInterface.h>
22+#include <unity/shell/application/MirSurfaceListInterface.h>
23+
24+#include <QMetaObject>
25+
26+Q_LOGGING_CATEGORY(UNITY_TOPSURFACELIST, "unity.topsurfacelist", QtDebugMsg)
27+
28+#define DEBUG_MSG qCDebug(UNITY_TOPSURFACELIST).nospace().noquote() << __func__
29+
30+using namespace unity::shell::application;
31+
32+TopLevelSurfaceList::TopLevelSurfaceList(QObject *parent) :
33+ QAbstractListModel(parent)
34+{
35+ DEBUG_MSG << "()";
36+}
37+
38+TopLevelSurfaceList::~TopLevelSurfaceList()
39+{
40+ DEBUG_MSG << "()";
41+}
42+
43+int TopLevelSurfaceList::rowCount(const QModelIndex &parent) const
44+{
45+ return !parent.isValid() ? m_surfaceList.size() : 0;
46+}
47+
48+QVariant TopLevelSurfaceList::data(const QModelIndex& index, int role) const
49+{
50+ if (index.row() < 0 || index.row() >= m_surfaceList.size())
51+ return QVariant();
52+
53+ if (role == SurfaceRole) {
54+ MirSurfaceInterface *surface = m_surfaceList.at(index.row()).surface;
55+ return QVariant::fromValue(surface);
56+ } else if (role == ApplicationRole) {
57+ return QVariant::fromValue(m_surfaceList.at(index.row()).application);
58+ } else if (role == IdRole) {
59+ return QVariant::fromValue(m_surfaceList.at(index.row()).id);
60+ } else {
61+ return QVariant();
62+ }
63+}
64+
65+void TopLevelSurfaceList::raise(MirSurfaceInterface *surface)
66+{
67+ if (!surface)
68+ return;
69+
70+ DEBUG_MSG << "(MirSurface[" << (void*)surface << "])";
71+
72+ int i = indexOf(surface);
73+ if (i != -1) {
74+ raiseId(m_surfaceList.at(i).id);
75+ }
76+}
77+
78+void TopLevelSurfaceList::appendPlaceholder(ApplicationInfoInterface *application)
79+{
80+ DEBUG_MSG << "(" << application->appId() << ")";
81+
82+ appendSurfaceHelper(nullptr, application);
83+}
84+
85+void TopLevelSurfaceList::appendSurface(MirSurfaceInterface *surface, ApplicationInfoInterface *application)
86+{
87+ Q_ASSERT(surface != nullptr);
88+
89+ bool filledPlaceholder = false;
90+ for (int i = 0; i < m_surfaceList.count() && !filledPlaceholder; ++i) {
91+ ModelEntry &entry = m_surfaceList[i];
92+ if (entry.application == application && entry.surface == nullptr) {
93+ entry.surface = surface;
94+ connectSurface(surface);
95+ DEBUG_MSG << " appId=" << application->appId() << " surface=" << surface
96+ << ", filling out placeholder. after: " << toString();
97+ Q_EMIT dataChanged(index(i) /* topLeft */, index(i) /* bottomRight */, QVector<int>() << SurfaceRole);
98+ filledPlaceholder = true;
99+ }
100+ }
101+
102+ if (!filledPlaceholder) {
103+ DEBUG_MSG << " appId=" << application->appId() << " surface=" << surface << ", adding new row";
104+ appendSurfaceHelper(surface, application);
105+ }
106+}
107+
108+void TopLevelSurfaceList::appendSurfaceHelper(MirSurfaceInterface *surface, ApplicationInfoInterface *application)
109+{
110+ if (m_modelState == IdleState) {
111+ m_modelState = InsertingState;
112+ beginInsertRows(QModelIndex(), m_surfaceList.size() /*first*/, m_surfaceList.size() /*last*/);
113+ } else {
114+ Q_ASSERT(m_modelState == ResettingState);
115+ // No point in signaling anything if we're resetting the whole model
116+ }
117+
118+ int id = generateId();
119+ m_surfaceList.append(ModelEntry(surface, application, id));
120+ if (surface) {
121+ connectSurface(surface);
122+ }
123+
124+ if (m_modelState == InsertingState) {
125+ endInsertRows();
126+ Q_EMIT countChanged();
127+ Q_EMIT listChanged();
128+ m_modelState = IdleState;
129+ }
130+
131+ DEBUG_MSG << " after " << toString();
132+}
133+
134+void TopLevelSurfaceList::connectSurface(MirSurfaceInterface *surface)
135+{
136+ connect(surface, &MirSurfaceInterface::focusedChanged, this, [this, surface](bool focused){
137+ if (focused) {
138+ this->raise(surface);
139+ }
140+ });
141+ connect(surface, &MirSurfaceInterface::liveChanged, this, [this, surface](bool live){
142+ if (!live) {
143+ onSurfaceDied(surface);
144+ }
145+ });
146+ connect(surface, &QObject::destroyed, this, [this, surface](){ this->onSurfaceDestroyed(surface); });
147+}
148+
149+void TopLevelSurfaceList::onSurfaceDied(MirSurfaceInterface *surface)
150+{
151+ int i = indexOf(surface);
152+ if (i == -1) {
153+ return;
154+ }
155+
156+ auto application = m_surfaceList[i].application;
157+
158+ // can't be starting if it already has a surface
159+ Q_ASSERT(application->state() != ApplicationInfoInterface::Starting);
160+
161+ if (application->state() == ApplicationInfoInterface::Running) {
162+ m_surfaceList[i].removeOnceSurfaceDestroyed = true;
163+ } else {
164+ // assume it got killed by the out-of-memory daemon.
165+ //
166+ // So leave entry in the model and only remove its surface, so shell can display a screenshot
167+ // in its place.
168+ m_surfaceList[i].removeOnceSurfaceDestroyed = false;
169+ }
170+}
171+
172+void TopLevelSurfaceList::onSurfaceDestroyed(MirSurfaceInterface *surface)
173+{
174+ int i = indexOf(surface);
175+ if (i == -1) {
176+ return;
177+ }
178+
179+ if (m_surfaceList[i].removeOnceSurfaceDestroyed) {
180+ removeAt(i);
181+ } else {
182+ m_surfaceList[i].surface = nullptr;
183+ Q_EMIT dataChanged(index(i) /* topLeft */, index(i) /* bottomRight */, QVector<int>() << SurfaceRole);
184+ DEBUG_MSG << " Removed surface from entry. After: " << toString();
185+ }
186+}
187+
188+void TopLevelSurfaceList::removeAt(int index)
189+{
190+ if (m_modelState == IdleState) {
191+ beginRemoveRows(QModelIndex(), index, index);
192+ m_modelState = RemovingState;
193+ } else {
194+ Q_ASSERT(m_modelState == ResettingState);
195+ // No point in signaling anything if we're resetting the whole model
196+ }
197+
198+ m_surfaceList.removeAt(index);
199+
200+ if (m_modelState == RemovingState) {
201+ endRemoveRows();
202+ Q_EMIT countChanged();
203+ Q_EMIT listChanged();
204+ m_modelState = IdleState;
205+ }
206+
207+ DEBUG_MSG << " after " << toString();
208+}
209+
210+int TopLevelSurfaceList::indexOf(MirSurfaceInterface *surface)
211+{
212+ for (int i = 0; i < m_surfaceList.count(); ++i) {
213+ if (m_surfaceList.at(i).surface == surface) {
214+ return i;
215+ }
216+ }
217+ return -1;
218+}
219+
220+void TopLevelSurfaceList::move(int from, int to)
221+{
222+ if (from == to) return;
223+ DEBUG_MSG << " from=" << from << " to=" << to;
224+
225+ if (from >= 0 && from < m_surfaceList.size() && to >= 0 && to < m_surfaceList.size()) {
226+ QModelIndex parent;
227+ /* When moving an item down, the destination index needs to be incremented
228+ by one, as explained in the documentation:
229+ http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html#beginMoveRows */
230+
231+ Q_ASSERT(m_modelState == IdleState);
232+ m_modelState = MovingState;
233+
234+ beginMoveRows(parent, from, from, parent, to + (to > from ? 1 : 0));
235+ m_surfaceList.move(from, to);
236+ endMoveRows();
237+ Q_EMIT listChanged();
238+
239+ m_modelState = IdleState;
240+
241+ DEBUG_MSG << " after " << toString();
242+ }
243+}
244+
245+MirSurfaceInterface *TopLevelSurfaceList::surfaceAt(int index) const
246+{
247+ if (index >=0 && index < m_surfaceList.count()) {
248+ return m_surfaceList[index].surface;
249+ } else {
250+ return nullptr;
251+ }
252+}
253+
254+ApplicationInfoInterface *TopLevelSurfaceList::applicationAt(int index) const
255+{
256+ if (index >=0 && index < m_surfaceList.count()) {
257+ return m_surfaceList[index].application;
258+ } else {
259+ return nullptr;
260+ }
261+}
262+
263+int TopLevelSurfaceList::idAt(int index) const
264+{
265+ if (index >=0 && index < m_surfaceList.count()) {
266+ return m_surfaceList[index].id;
267+ } else {
268+ return 0;
269+ }
270+}
271+
272+int TopLevelSurfaceList::indexForId(int id) const
273+{
274+ for (int i = 0; i < m_surfaceList.count(); ++i) {
275+ if (m_surfaceList[i].id == id) {
276+ return i;
277+ }
278+ }
279+ return -1;
280+}
281+
282+void TopLevelSurfaceList::doRaiseId(int id)
283+{
284+ int fromIndex = indexForId(id);
285+ if (fromIndex != -1) {
286+ move(fromIndex, 0 /* toIndex */);
287+ }
288+}
289+
290+void TopLevelSurfaceList::raiseId(int id)
291+{
292+ if (m_modelState == IdleState) {
293+ DEBUG_MSG << "(id=" << id << ") - do it now.";
294+ doRaiseId(id);
295+ } else {
296+ DEBUG_MSG << "(id=" << id << ") - Model busy (modelState=" << m_modelState << "). Try again in the next event loop.";
297+ // The model has just signalled some change. If we have a Repeater responding to this update, it will get nuts
298+ // if we perform yet another model change straight away.
299+ //
300+ // A bad sympton of this problem is a Repeater.itemAt(index) call returning null event though Repeater.count says
301+ // the index is definitely within bounds.
302+ QMetaObject::invokeMethod(this, "raiseId", Qt::QueuedConnection, Q_ARG(int, id));
303+ }
304+}
305+
306+int TopLevelSurfaceList::generateId()
307+{
308+ int id = m_nextId;
309+ m_nextId = nextFreeId(m_nextId + 1);
310+ Q_EMIT nextIdChanged();
311+ return id;
312+}
313+
314+int TopLevelSurfaceList::nextFreeId(int candidateId)
315+{
316+ if (candidateId > m_maxId) {
317+ return nextFreeId(1);
318+ } else {
319+ if (indexForId(candidateId) == -1) {
320+ // it's indeed free
321+ return candidateId;
322+ } else {
323+ return nextFreeId(candidateId + 1);
324+ }
325+ }
326+}
327+
328+QString TopLevelSurfaceList::toString()
329+{
330+ QString str;
331+ for (int i = 0; i < m_surfaceList.count(); ++i) {
332+ auto item = m_surfaceList.at(i);
333+
334+ QString itemStr = QString("(index=%1,appId=%2,surface=0x%3,id=%4)")
335+ .arg(i)
336+ .arg(item.application->appId())
337+ .arg((qintptr)item.surface, 0, 16)
338+ .arg(item.id);
339+
340+ if (i > 0) {
341+ str.append(",");
342+ }
343+ str.append(itemStr);
344+ }
345+ return str;
346+}
347+
348+void TopLevelSurfaceList::addApplication(ApplicationInfoInterface *application)
349+{
350+ DEBUG_MSG << "(" << application->appId() << ")";
351+ Q_ASSERT(!m_applications.contains(application));
352+ m_applications.append(application);
353+
354+ MirSurfaceListInterface *surfaceList = application->surfaceList();
355+
356+ if (application->state() != ApplicationInfoInterface::Stopped) {
357+ if (surfaceList->count() == 0) {
358+ appendPlaceholder(application);
359+ } else {
360+ for (int i = 0; i < surfaceList->count(); ++i) {
361+ appendSurface(surfaceList->get(i), application);
362+ }
363+ }
364+ }
365+
366+ connect(surfaceList, &QAbstractItemModel::rowsInserted, this,
367+ [this, application, surfaceList](const QModelIndex & /*parent*/, int first, int last)
368+ {
369+ for (int i = last; i >= first; --i) {
370+ this->appendSurface(surfaceList->get(i), application);
371+ }
372+ });
373+}
374+
375+void TopLevelSurfaceList::removeApplication(ApplicationInfoInterface *application)
376+{
377+ DEBUG_MSG << "(" << application->appId() << ")";
378+ Q_ASSERT(m_applications.contains(application));
379+
380+ MirSurfaceListInterface *surfaceList = application->surfaceList();
381+
382+ disconnect(surfaceList, 0, this, 0);
383+
384+ Q_ASSERT(m_modelState == IdleState);
385+ m_modelState = RemovingState;
386+
387+ int i = 0;
388+ while (i < m_surfaceList.count()) {
389+ if (m_surfaceList.at(i).application == application) {
390+ beginRemoveRows(QModelIndex(), i, i);
391+ m_surfaceList.removeAt(i);
392+ endRemoveRows();
393+ Q_EMIT countChanged();
394+ Q_EMIT listChanged();
395+ } else {
396+ ++i;
397+ }
398+ }
399+
400+ m_modelState = IdleState;
401+
402+ DEBUG_MSG << " after " << toString();
403+
404+ m_applications.removeAll(application);
405+}
406+
407+QAbstractListModel *TopLevelSurfaceList::applicationsModel() const
408+{
409+ return m_applicationsModel;
410+}
411+
412+void TopLevelSurfaceList::setApplicationsModel(QAbstractListModel* value)
413+{
414+ if (m_applicationsModel == value) {
415+ return;
416+ }
417+
418+ DEBUG_MSG << "(" << value << ")";
419+
420+ Q_ASSERT(m_modelState == IdleState);
421+ m_modelState = ResettingState;
422+
423+ beginResetModel();
424+
425+ if (m_applicationsModel) {
426+ m_surfaceList.clear();
427+ m_applications.clear();
428+ disconnect(m_applicationsModel, 0, this, 0);
429+ }
430+
431+ m_applicationsModel = value;
432+
433+ if (m_applicationsModel) {
434+ findApplicationRole();
435+
436+ connect(m_applicationsModel, &QAbstractItemModel::rowsInserted,
437+ this, [this](const QModelIndex &/*parent*/, int first, int last) {
438+ for (int i = first; i <= last; ++i) {
439+ auto application = getApplicationFromModelAt(i);
440+ addApplication(application);
441+ }
442+ });
443+
444+ connect(m_applicationsModel, &QAbstractItemModel::rowsAboutToBeRemoved,
445+ this, [this](const QModelIndex &/*parent*/, int first, int last) {
446+ for (int i = first; i <= last; ++i) {
447+ auto application = getApplicationFromModelAt(i);
448+ removeApplication(application);
449+ }
450+ });
451+
452+ for (int i = 0; i < m_applicationsModel->rowCount(); ++i) {
453+ auto application = getApplicationFromModelAt(i);
454+ addApplication(application);
455+ }
456+ }
457+
458+ endResetModel();
459+ m_modelState = IdleState;
460+}
461+
462+ApplicationInfoInterface *TopLevelSurfaceList::getApplicationFromModelAt(int index)
463+{
464+ QModelIndex modelIndex = m_applicationsModel->index(index);
465+
466+ QVariant variant = m_applicationsModel->data(modelIndex, m_applicationRole);
467+
468+ // variant.value<ApplicationInfoInterface*>() returns null for some reason.
469+ return static_cast<ApplicationInfoInterface*>(variant.value<QObject*>());
470+}
471+
472+void TopLevelSurfaceList::findApplicationRole()
473+{
474+ QHash<int, QByteArray> namesHash = m_applicationsModel->roleNames();
475+
476+ m_applicationRole = -1;
477+ for (auto i = namesHash.begin(); i != namesHash.end() && m_applicationRole == -1; ++i) {
478+ if (i.value() == "application") {
479+ m_applicationRole = i.key();
480+ }
481+ }
482+
483+ if (m_applicationRole == -1) {
484+ qFatal("TopLevelSurfaceList: applicationsModel must have a \"application\" role.");
485+ }
486+}
plugins/WindowManager/TopLevelSurfaceList.hnew file+223
@@ -0,0 +1,223 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef TOPLEVELSURFACELIST_H
18+#define TOPLEVELSURFACELIST_H
19+
20+#include <QAbstractListModel>
21+#include <QList>
22+#include <QLoggingCategory>
23+
24+Q_DECLARE_LOGGING_CATEGORY(UNITY_TOPSURFACELIST)
25+
26+namespace unity {
27+ namespace shell {
28+ namespace application {
29+ class ApplicationInfoInterface;
30+ class MirSurfaceInterface;
31+ }
32+ }
33+}
34+
35+/**
36+ * @brief A model of top-level surfaces
37+ *
38+ * It's an abstraction of top-level application windows.
39+ *
40+ * When an entry first appears, it normaly doesn't have a surface yet, meaning that the application is
41+ * still starting up. A shell should then display a splash screen or saved screenshot of the application
42+ * until its surface comes up.
43+ *
44+ * As applications can have multiple surfaces and you can also have entries without surfaces at all,
45+ * the only way to unambiguously refer to an entry in this model is through its id.
46+ */
47+class TopLevelSurfaceList : public QAbstractListModel
48+{
49+
50+ Q_OBJECT
51+
52+ /**
53+ * @brief A list model of applications.
54+ *
55+ * It's expected to have a role called "application" which returns a ApplicationInfoInterface
56+ */
57+ Q_PROPERTY(QAbstractListModel* applicationsModel READ applicationsModel
58+ WRITE setApplicationsModel
59+ NOTIFY applicationsModelChanged)
60+
61+ /**
62+ * @brief Number of top-level surfaces in this model
63+ *
64+ * This is the same as rowCount, added in order to keep compatibility with QML ListModels.
65+ */
66+ Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
67+
68+ /**
69+ The id to be used on the next entry created
70+ Useful for tests
71+ */
72+ Q_PROPERTY(int nextId READ nextId NOTIFY nextIdChanged)
73+public:
74+
75+ /**
76+ * @brief The Roles supported by the model
77+ *
78+ * SurfaceRole - A MirSurfaceInterface. It will be null if the application is still starting up
79+ * ApplicationRole - An ApplicationInfoInterface
80+ * IdRole - A unique identifier for this entry. Useful to unambiguosly track elements as they move around in the list
81+ */
82+ enum Roles {
83+ SurfaceRole = Qt::UserRole,
84+ ApplicationRole = Qt::UserRole + 1,
85+ IdRole = Qt::UserRole + 2,
86+ };
87+
88+ explicit TopLevelSurfaceList(QObject *parent = nullptr);
89+ virtual ~TopLevelSurfaceList();
90+
91+ // QAbstractItemModel methods
92+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
93+ QVariant data(const QModelIndex& index, int role) const override;
94+ QHash<int, QByteArray> roleNames() const override {
95+ QHash<int, QByteArray> roleNames { {SurfaceRole, "surface"},
96+ {ApplicationRole, "application"},
97+ {IdRole, "id"} };
98+ return roleNames;
99+ }
100+
101+ int nextId() const { return m_nextId; }
102+
103+ QAbstractListModel *applicationsModel() const;
104+ void setApplicationsModel(QAbstractListModel*);
105+
106+public Q_SLOTS:
107+ /**
108+ * @brief Returns the surface at the given index
109+ *
110+ * It will be a nullptr if the application is still starting up and thus hasn't yet created
111+ * and drawn into a surface.
112+ */
113+ unity::shell::application::MirSurfaceInterface *surfaceAt(int index) const;
114+
115+ /**
116+ * @brief Returns the application at the given index
117+ */
118+ unity::shell::application::ApplicationInfoInterface *applicationAt(int index) const;
119+
120+ /**
121+ * @brief Returns the unique id of the element at the given index
122+ */
123+ int idAt(int index) const;
124+
125+ /**
126+ * @brief Returns the index where the row with the given id is located
127+ *
128+ * Returns -1 if there's no row with the given id.
129+ */
130+ int indexForId(int id) const;
131+
132+ /**
133+ * @brief Raises the row with the given id to index 0
134+ */
135+ void raiseId(int id);
136+
137+ void doRaiseId(int id);
138+
139+Q_SIGNALS:
140+ void countChanged();
141+
142+ /**
143+ * @brief Emitted when the list changes
144+ *
145+ * Emitted when model gains an element, loses an element or when elements exchange positions.
146+ */
147+ void listChanged();
148+
149+ void nextIdChanged();
150+
151+ void applicationsModelChanged();
152+
153+private:
154+ void addApplication(unity::shell::application::ApplicationInfoInterface *application);
155+ void removeApplication(unity::shell::application::ApplicationInfoInterface *application);
156+
157+ int indexOf(unity::shell::application::MirSurfaceInterface *surface);
158+ void raise(unity::shell::application::MirSurfaceInterface *surface);
159+ void move(int from, int to);
160+ void appendSurfaceHelper(unity::shell::application::MirSurfaceInterface *surface,
161+ unity::shell::application::ApplicationInfoInterface *application);
162+ void connectSurface(unity::shell::application::MirSurfaceInterface *surface);
163+ int generateId();
164+ int nextFreeId(int candidateId);
165+ QString toString();
166+ void onSurfaceDestroyed(unity::shell::application::MirSurfaceInterface *surface);
167+ void onSurfaceDied(unity::shell::application::MirSurfaceInterface *surface);
168+ void removeAt(int index);
169+ void findApplicationRole();
170+
171+ unity::shell::application::ApplicationInfoInterface *getApplicationFromModelAt(int index);
172+
173+ /*
174+ Placeholder for a future surface from a starting or running application.
175+ Enables shell to give immediate feedback to the user by showing, eg,
176+ a splash screen.
177+
178+ It's a model row containing a null surface and the given application.
179+ */
180+ void appendPlaceholder(unity::shell::application::ApplicationInfoInterface *application);
181+
182+ /*
183+ Adds a model row with the given surface and application
184+
185+ Alternatively, if a placeholder exists for the given application it's
186+ filled with the given surface instead.
187+ */
188+ void appendSurface(unity::shell::application::MirSurfaceInterface *surface,
189+ unity::shell::application::ApplicationInfoInterface *application);
190+
191+ struct ModelEntry {
192+ ModelEntry(unity::shell::application::MirSurfaceInterface *surface, unity::shell::application::ApplicationInfoInterface *application, int id)
193+ : surface(surface), application(application), id(id) {}
194+ unity::shell::application::MirSurfaceInterface *surface;
195+ unity::shell::application::ApplicationInfoInterface *application;
196+ int id;
197+ bool removeOnceSurfaceDestroyed{false};
198+ };
199+
200+ QList<ModelEntry> m_surfaceList;
201+ int m_nextId{1};
202+ static const int m_maxId{1000000};
203+
204+ // applications that are being monitored
205+ QList<unity::shell::application::ApplicationInfoInterface *> m_applications;
206+
207+ QAbstractListModel* m_applicationsModel{nullptr};
208+ int m_applicationRole{-1};
209+
210+ enum ModelState {
211+ IdleState,
212+ InsertingState,
213+ RemovingState,
214+ MovingState,
215+ ResettingState
216+ };
217+ ModelState m_modelState{IdleState};
218+};
219+
220+Q_DECLARE_METATYPE(TopLevelSurfaceList*)
221+Q_DECLARE_METATYPE(QAbstractListModel*)
222+
223+#endif // TOPLEVELSURFACELIST_H
tests/plugins/ScreenGrabber/grabber.qml → plugins/WindowManager/WindowManagerPlugin.cpprenamed+9−12
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2015 Canonical Ltd.
2+ * Copyright (C) 2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -14,18 +14,15 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−import QtQuick 2.4
17+#include "WindowManagerPlugin.h"
18−import ScreenGrabber 0.1
19
18
20−Rectangle {
19+#include "TopLevelSurfaceList.h"
21− property var grabber: screenGrabber
22
20
23− width: 101 // width intentionally bigger than height to test rotation
21+#include <QtQml>
24− height: 100
25− color: "green"
26
22
27− ScreenGrabber {
23+void WindowManagerPlugin::registerTypes(const char *uri)
28− id: screenGrabber
24+{
29− objectName: "screenGrabber"
25+ qmlRegisterType<TopLevelSurfaceList>(uri, 0, 1, "TopLevelSurfaceList");
30− }
26+
27+ qRegisterMetaType<QAbstractListModel*>("QAbstractListModel*");
31}
28}
plugins/WindowManager/WindowManagerPlugin.hnew file+32
@@ -0,0 +1,32 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef WINDOWMANAGER_PLUGIN_H
18+#define WINDOWMANAGER_PLUGIN_H
19+
20+#include <QtQml/QQmlEngine>
21+#include <QtQml/QQmlExtensionPlugin>
22+
23+class WindowManagerPlugin : public QQmlExtensionPlugin
24+{
25+ Q_OBJECT
26+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27+
28+public:
29+ void registerTypes(const char *uri) override;
30+};
31+
32+#endif // WINDOWMANAGER_PLUGIN_H
plugins/WindowManager/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module WindowManager
2+plugin windowmanager-qml
plugins/Wizard/Wizard.qmltypesdeleted−33
@@ -1,33 +0,0 @@
1−import QtQuick.tooling 1.1
2−
3−// This file describes the plugin-supplied types contained in the library.
4−// It is used for QML tooling purposes only.
5−//
6−// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Wizard 0.1 plugins'
8−
9−Module {
10− Component {
11− name: "PageList"
12− prototype: "QObject"
13− exports: ["Wizard/PageList 0.1"]
14− exportMetaObjectRevisions: [0]
15− Property { name: "index"; type: "int"; isReadonly: true }
16− Property { name: "numPages"; type: "int"; isReadonly: true }
17− Method { name: "prev"; type: "string" }
18− Method { name: "next"; type: "string" }
19− }
20− Component {
21− name: "System"
22− prototype: "QObject"
23− exports: ["Wizard/System 0.1"]
24− isCreatable: false
25− isSingleton: true
26− exportMetaObjectRevisions: [0]
27− Property { name: "wizardEnabled"; type: "bool" }
28− Method {
29− name: "updateSessionLanguage"
30− Parameter { name: "locale"; type: "string" }
31− }
32− }
33−}
po/aa.po+287−125
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11"PO-Revision-Date: 2016-02-12 10:18+0000\n"
11"PO-Revision-Date: 2016-02-12 10:18+0000\n"
12"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
12"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
13"Language-Team: Afar <aa@li.org>\n"
13"Language-Team: Afar <aa@li.org>\n"
@@ -15,39 +15,39 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 18147)\n"
20
20
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
22msgid "Password: "
22msgid "Password: "
23msgstr "Cuumita "
23msgstr "Cuumita "
24
24
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
27msgid "Pin shortcut"
27msgid "Pin shortcut"
28msgstr ""
28msgstr ""
29
29
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
31msgid "Quit"
31msgid "Quit"
32msgstr "Kat"
32msgstr "Kat"
33
33
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
35msgid "Unpin shortcut"
35msgid "Unpin shortcut"
36msgstr ""
36msgstr ""
37
37
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
39msgid "Device Locked"
39msgid "Device Locked"
40msgstr ""
40msgstr ""
41
41
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
43msgid "You have been locked out due to too many failed passphrase attempts."
43msgid "You have been locked out due to too many failed passphrase attempts."
44msgstr ""
44msgstr ""
45
45
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
47msgid "You have been locked out due to too many failed passcode attempts."
47msgid "You have been locked out due to too many failed passcode attempts."
48msgstr ""
48msgstr ""
49
49
50−#: qml/Components/DelayedLockscreen.qml:74
50+#: qml/Components/DelayedLockscreen.qml:75
51#, qt-format
51#, qt-format
52msgid "Please wait %1 minute and then try again…"
52msgid "Please wait %1 minute and then try again…"
53msgid_plural "Please wait %1 minutes and then try again…"
53msgid_plural "Please wait %1 minutes and then try again…"
@@ -73,8 +73,8 @@ msgctxt "Button: Log out from the system"
73msgid "Log Out"
73msgid "Log Out"
74msgstr "Eweq"
74msgstr "Eweq"
75
75
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
77+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
79msgid "Cancel"
79msgid "Cancel"
80msgstr "Bayis"
80msgstr "Bayis"
@@ -92,43 +92,213 @@ msgstr "Wadir-ugussuh digga maay litoo?"
92msgid "No"
92msgid "No"
93msgstr "Maleey"
93msgstr "Maleey"
94
94
95−#: qml/Components/Dialogs.qml:183
95+#: qml/Components/Dialogs.qml:182
96msgid "Yes"
96msgid "Yes"
97msgstr "Yeey"
97msgstr "Yeey"
98
98
99−#: qml/Components/Dialogs.qml:198
99+#: qml/Components/Dialogs.qml:197
100msgctxt "Title: Power off/Restart dialog"
100msgctxt "Title: Power off/Restart dialog"
101msgid "Power"
101msgid "Power"
102msgstr "Cayla"
102msgstr "Cayla"
103
103
104−#: qml/Components/Dialogs.qml:199
104+#: qml/Components/Dialogs.qml:198
105msgid ""
105msgid ""
106"Are you sure you would like\n"
106"Are you sure you would like\n"
107"to power off?"
107"to power off?"
108msgstr "Timmi haytuh digga maay litoo?"
108msgstr "Timmi haytuh digga maay litoo?"
109
109
110−#: qml/Components/Dialogs.qml:201
110+#: qml/Components/Dialogs.qml:200
111msgctxt "Button: Power off the system"
111msgctxt "Button: Power off the system"
112msgid "Power off"
112msgid "Power off"
113msgstr "Timmi hayis"
113msgstr "Timmi hayis"
114
114
115−#: qml/Components/Dialogs.qml:210
115+#: qml/Components/Dialogs.qml:209
116msgctxt "Button: Restart the system"
116msgctxt "Button: Restart the system"
117msgid "Restart"
117msgid "Restart"
118msgstr "Wadir-qimbis"
118msgstr "Wadir-qimbis"
119
119
120+#: qml/Components/KeyboardShortcutsOverlay.qml:41
121+msgid "Keyboard Shortcuts"
122+msgstr ""
123+
124+#: qml/Components/KeyboardShortcutsOverlay.qml:55
125+msgid "Unity 8"
126+msgstr ""
127+
128+#: qml/Components/KeyboardShortcutsOverlay.qml:62
129+msgid "PrtScr"
130+msgstr ""
131+
132+#: qml/Components/KeyboardShortcutsOverlay.qml:67
133+msgid "Takes a screenshot."
134+msgstr ""
135+
136+#: qml/Components/KeyboardShortcutsOverlay.qml:75
137+msgid "Alt + PrtScr"
138+msgstr ""
139+
140+#: qml/Components/KeyboardShortcutsOverlay.qml:80
141+msgid "Takes a screenshot of a window."
142+msgstr ""
143+
144+#: qml/Components/KeyboardShortcutsOverlay.qml:88
145+msgid "Super + Space"
146+msgstr ""
147+
148+#: qml/Components/KeyboardShortcutsOverlay.qml:93
149+msgid "Switches to next keyboard layout."
150+msgstr ""
151+
152+#: qml/Components/KeyboardShortcutsOverlay.qml:101
153+msgid "Super + Shift + Space"
154+msgstr ""
155+
156+#: qml/Components/KeyboardShortcutsOverlay.qml:106
157+msgid "Switches to previous keyboard layout."
158+msgstr ""
159+
160+#: qml/Components/KeyboardShortcutsOverlay.qml:118
161+msgid "Launcher"
162+msgstr ""
163+
164+#: qml/Components/KeyboardShortcutsOverlay.qml:125
165+msgid "Super (Hold)"
166+msgstr ""
167+
168+#: qml/Components/KeyboardShortcutsOverlay.qml:130
169+msgid "Opens the launcher, displays shortcuts."
170+msgstr ""
171+
172+#: qml/Components/KeyboardShortcutsOverlay.qml:138
173+msgid "Alt + F1"
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:143
177+msgid "Opens launcher keyboard navigation mode."
178+msgstr ""
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:151
181+msgid "Super + Tab"
182+msgstr ""
183+
184+#: qml/Components/KeyboardShortcutsOverlay.qml:156
185+msgid "Switches applications via the launcher."
186+msgstr ""
187+
188+#: qml/Components/KeyboardShortcutsOverlay.qml:164
189+msgid "Super + 0 to 9"
190+msgstr ""
191+
192+#: qml/Components/KeyboardShortcutsOverlay.qml:169
193+msgid "Same as clicking on a launcher icon."
194+msgstr ""
195+
196+#: qml/Components/KeyboardShortcutsOverlay.qml:181
197+msgid "Scopes"
198+msgstr ""
199+
200+#: qml/Components/KeyboardShortcutsOverlay.qml:188
201+msgid "Super (Tap)"
202+msgstr ""
203+
204+#: qml/Components/KeyboardShortcutsOverlay.qml:193
205+msgid "Opens the Scopes home."
206+msgstr ""
207+
208+#: qml/Components/KeyboardShortcutsOverlay.qml:209
209+msgid "Switching"
210+msgstr ""
211+
212+#: qml/Components/KeyboardShortcutsOverlay.qml:216
213+msgid "Alt + Tab"
214+msgstr ""
215+
216+#: qml/Components/KeyboardShortcutsOverlay.qml:221
217+msgid "Switches between applications."
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:229
221+msgid "Super + W"
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:234
225+msgid "Opens the desktop spread."
226+msgstr ""
227+
228+#: qml/Components/KeyboardShortcutsOverlay.qml:242
229+msgid "Cursor Left or Right"
230+msgstr ""
231+
232+#: qml/Components/KeyboardShortcutsOverlay.qml:247
233+msgid "Moves the focus."
234+msgstr ""
235+
236+#: qml/Components/KeyboardShortcutsOverlay.qml:259
237+msgid "Windows"
238+msgstr ""
239+
240+#: qml/Components/KeyboardShortcutsOverlay.qml:266
241+msgid "Ctrl + Super + D"
242+msgstr ""
243+
244+#: qml/Components/KeyboardShortcutsOverlay.qml:271
245+msgid "Minimizes all windows."
246+msgstr ""
247+
248+#: qml/Components/KeyboardShortcutsOverlay.qml:279
249+msgid "Ctrl + Super + Up"
250+msgstr ""
251+
252+#: qml/Components/KeyboardShortcutsOverlay.qml:284
253+msgid "Maximizes the current window."
254+msgstr ""
255+
256+#: qml/Components/KeyboardShortcutsOverlay.qml:292
257+msgid "Ctrl + Super + Down"
258+msgstr ""
259+
260+#: qml/Components/KeyboardShortcutsOverlay.qml:297
261+msgid "Minimizes or restores the current window."
262+msgstr ""
263+
264+#: qml/Components/KeyboardShortcutsOverlay.qml:305
265+msgid "Ctrl + Super + Left or Right"
266+msgstr ""
267+
268+#: qml/Components/KeyboardShortcutsOverlay.qml:310
269+msgid "Semi-maximizes the current window."
270+msgstr ""
271+
272+#: qml/Components/KeyboardShortcutsOverlay.qml:318
273+msgid "Alt + F4"
274+msgstr ""
275+
276+#: qml/Components/KeyboardShortcutsOverlay.qml:323
277+msgid "Closes the current window."
278+msgstr ""
279+
120−#: qml/Components/Lockscreen.qml:231
280+#: qml/Components/Lockscreen.qml:239
121msgid "Return to Call"
281msgid "Return to Call"
122msgstr "Seecol gacis"
282msgstr "Seecol gacis"
123
283
124−#: qml/Components/Lockscreen.qml:231
284+#: qml/Components/Lockscreen.qml:239
125msgid "Emergency Call"
285msgid "Emergency Call"
126msgstr ""
286msgstr ""
127
287
128−#: qml/Components/Lockscreen.qml:263
288+#: qml/Components/Lockscreen.qml:271
129msgid "OK"
289msgid "OK"
130msgstr "Hayya"
290msgstr "Hayya"
131
291
292+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
293+#, qt-format
294+msgid "%1:%2:%3"
295+msgstr ""
296+
297+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
298+#, qt-format
299+msgid "%1:%2"
300+msgstr ""
301+
132#: qml/Components/ModeSwitchWarningDialog.qml:32
302#: qml/Components/ModeSwitchWarningDialog.qml:32
133msgid "Apps may have unsaved data:"
303msgid "Apps may have unsaved data:"
134msgstr ""
304msgstr ""
@@ -155,26 +325,30 @@ msgstr ""
155msgid "Close all"
325msgid "Close all"
156msgstr "Inkih alif"
326msgstr "Inkih alif"
157
327
328+#: qml/Components/SharingPicker.qml:54
329+msgid "Preview Share Item"
330+msgstr ""
331+
158−#: qml/Dash/DashPageHeader.qml:337
332+#: qml/Dash/DashPageHeader.qml:333
159msgctxt "Button: Open the Ubuntu Store"
333msgctxt "Button: Open the Ubuntu Store"
160msgid "Store"
334msgid "Store"
161msgstr ""
335msgstr ""
162
336
163−#: qml/Dash/DashPageHeader.qml:344
337+#: qml/Dash/DashPageHeader.qml:340
164msgctxt "Button: Start a search in the current dash scope"
338msgctxt "Button: Start a search in the current dash scope"
165msgid "Search"
339msgid "Search"
166msgstr "Goranto"
340msgstr "Goranto"
167
341
168−#: qml/Dash/DashPageHeader.qml:354
342+#: qml/Dash/DashPageHeader.qml:350
169msgctxt "Button: Show the current dash scope settings"
343msgctxt "Button: Show the current dash scope settings"
170msgid "Settings"
344msgid "Settings"
171msgstr "Massosu"
345msgstr "Massosu"
172
346
173−#: qml/Dash/DashPageHeader.qml:361
347+#: qml/Dash/DashPageHeader.qml:357
174msgid "Remove from Favorites"
348msgid "Remove from Favorites"
175msgstr ""
349msgstr ""
176
350
177−#: qml/Dash/DashPageHeader.qml:361
351+#: qml/Dash/DashPageHeader.qml:357
178msgid "Add to Favorites"
352msgid "Add to Favorites"
179msgstr ""
353msgstr ""
180
354
@@ -186,24 +360,24 @@ msgstr ""
186msgid "Reset"
360msgid "Reset"
187msgstr ""
361msgstr ""
188
362
189−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
363+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
190−msgid "See less"
364+msgid "Show less"
191msgstr ""
365msgstr ""
192
366
193−#: qml/Dash/GenericScopeView.qml:570
367+#: qml/Dash/GenericScopeView.qml:580
194−msgid "See all"
368+msgid "Show all"
195msgstr ""
369msgstr ""
196
370
197−#: qml/Dash/GenericScopeView.qml:627
371+#: qml/Dash/GenericScopeView.qml:637
198msgctxt "Label: Hint for dash search line edit"
372msgctxt "Label: Hint for dash search line edit"
199msgid "Search"
373msgid "Search"
200msgstr "Goranto"
374msgstr "Goranto"
201
375
202−#: qml/Dash/PageHeaderExtraPanel.qml:55
376+#: qml/Dash/PageHeaderExtraPanel.qml:56
203msgid "Recent Searches"
377msgid "Recent Searches"
204msgstr ""
378msgstr ""
205
379
206−#: qml/Dash/PageHeaderExtraPanel.qml:66
380+#: qml/Dash/PageHeaderExtraPanel.qml:67
207msgid "Clear All"
381msgid "Clear All"
208msgstr ""
382msgstr ""
209
383
@@ -216,22 +390,18 @@ msgid "Less..."
216msgstr ""
390msgstr ""
217
391
218#: qml/Dash/Previews/PreviewCommentInput.qml:68
392#: qml/Dash/Previews/PreviewCommentInput.qml:68
219−#: qml/Dash/Previews/PreviewRatingInput.qml:174
393+#: qml/Dash/Previews/PreviewRatingInput.qml:175
220msgid "Send"
394msgid "Send"
221msgstr "Rub"
395msgstr "Rub"
222
396
223−#: qml/Dash/Previews/PreviewRatingInput.qml:84
397+#: qml/Dash/Previews/PreviewRatingInput.qml:82
224msgid "Rate this"
398msgid "Rate this"
225msgstr ""
399msgstr ""
226
400
227−#: qml/Dash/Previews/PreviewRatingInput.qml:129
401+#: qml/Dash/Previews/PreviewRatingInput.qml:157
228msgid "Add a review"
402msgid "Add a review"
229msgstr ""
403msgstr ""
230
404
231−#: qml/Dash/Previews/PreviewSharing.qml:66
232−msgid "Preview Share Item"
233−msgstr ""
234−
235#: qml/Dash/PullToRefreshScopeStyle.qml:55
405#: qml/Dash/PullToRefreshScopeStyle.qml:55
236msgid "Pull to refresh…"
406msgid "Pull to refresh…"
237msgstr ""
407msgstr ""
@@ -244,92 +414,104 @@ msgstr ""
244msgid "Enable location data"
414msgid "Enable location data"
245msgstr ""
415msgstr ""
246
416
247−#: qml/Dash/ScopesList.qml:67
417+#: qml/Dash/ScopesList.qml:55
248msgid "Manage"
418msgid "Manage"
249msgstr ""
419msgstr ""
250
420
251−#: qml/Dash/ScopesList.qml:113
421+#: qml/Dash/ScopesList.qml:102
252msgid "Home"
422msgid "Home"
253msgstr "Dabqi"
423msgstr "Dabqi"
254
424
255−#: qml/Dash/ScopesList.qml:114
425+#: qml/Dash/ScopesList.qml:103
256msgid "Also installed"
426msgid "Also installed"
257msgstr ""
427msgstr ""
258
428
259−#: qml/DisabledScreenNotice.qml:104
429+#: qml/DisabledScreenNotice.qml:109
260msgid ""
430msgid ""
261"Your device is now connected to an external display. Use this screen as a "
431"Your device is now connected to an external display. Use this screen as a "
262"touch pad to interact with the pointer."
432"touch pad to interact with the pointer."
263msgstr ""
433msgstr ""
264
434
265−#: qml/Greeter/CoverPage.qml:118
435+#: qml/Greeter/CoverPage.qml:127
266msgid "Unlock"
436msgid "Unlock"
267msgstr ""
437msgstr ""
268
438
439+#: qml/Greeter/Greeter.qml:555
440+msgid "Try again"
441+msgstr ""
442+
269−#: qml/Greeter/LoginList.qml:239
443+#: qml/Greeter/LoginList.qml:63
444+msgid "Passphrase"
445+msgstr ""
446+
447+#: qml/Greeter/LoginList.qml:64
448+msgid "Passcode"
449+msgstr ""
450+
451+#: qml/Greeter/LoginList.qml:87
270msgid "Retry"
452msgid "Retry"
271msgstr "Qagis"
453msgstr "Qagis"
272
454
273−#: qml/Greeter/LoginList.qml:240
455+#: qml/Greeter/LoginList.qml:88
274−msgid "Tap to unlock"
456+msgid "Log In"
275msgstr ""
457msgstr ""
276
458
277−#: qml/Greeter/NarrowView.qml:54
459+#: qml/Greeter/NarrowView.qml:55
278msgid "Sorry, incorrect passphrase."
460msgid "Sorry, incorrect passphrase."
279msgstr ""
461msgstr ""
280
462
281−#: qml/Greeter/NarrowView.qml:55
463+#: qml/Greeter/NarrowView.qml:56
282msgid "Sorry, incorrect passcode."
464msgid "Sorry, incorrect passcode."
283msgstr ""
465msgstr ""
284
466
285−#: qml/Greeter/NarrowView.qml:56
467+#: qml/Greeter/NarrowView.qml:57
286msgid "This will be your last attempt."
468msgid "This will be your last attempt."
287msgstr ""
469msgstr ""
288
470
289−#: qml/Greeter/NarrowView.qml:58
471+#: qml/Greeter/NarrowView.qml:59
290msgid ""
472msgid ""
291"If passphrase is entered incorrectly, your phone will conduct a factory "
473"If passphrase is entered incorrectly, your phone will conduct a factory "
292"reset and all personal data will be deleted."
474"reset and all personal data will be deleted."
293msgstr ""
475msgstr ""
294
476
295−#: qml/Greeter/NarrowView.qml:59
477+#: qml/Greeter/NarrowView.qml:60
296msgid ""
478msgid ""
297"If passcode is entered incorrectly, your phone will conduct a factory reset "
479"If passcode is entered incorrectly, your phone will conduct a factory reset "
298"and all personal data will be deleted."
480"and all personal data will be deleted."
299msgstr ""
481msgstr ""
300
482
301−#: qml/Greeter/NarrowView.qml:116
483+#: qml/Greeter/NarrowView.qml:129
302#, qt-format
484#, qt-format
303msgid "Enter %1"
485msgid "Enter %1"
304msgstr "%1 culus"
486msgstr "%1 culus"
305
487
306−#: qml/Greeter/NarrowView.qml:117
488+#: qml/Greeter/NarrowView.qml:130
307msgid "Enter passphrase"
489msgid "Enter passphrase"
308msgstr "Tatur-maxco culus"
490msgstr "Tatur-maxco culus"
309
491
310−#: qml/Greeter/NarrowView.qml:118
492+#: qml/Greeter/NarrowView.qml:131
311msgid "Enter passcode"
493msgid "Enter passcode"
312msgstr "Tatur-mudenta culus"
494msgstr "Tatur-mudenta culus"
313
495
314−#: qml/Greeter/NarrowView.qml:119
496+#: qml/Greeter/NarrowView.qml:135
315#, qt-format
497#, qt-format
316msgid "Sorry, incorrect %1"
498msgid "Sorry, incorrect %1"
317msgstr ""
499msgstr ""
318
500
319−#: qml/Greeter/NarrowView.qml:120
501+#: qml/Greeter/NarrowView.qml:136
320msgid "Sorry, incorrect passphrase"
502msgid "Sorry, incorrect passphrase"
321msgstr ""
503msgstr ""
322
504
323−#: qml/Greeter/NarrowView.qml:121
505+#: qml/Greeter/NarrowView.qml:137
324msgctxt "passphrase"
506msgctxt "passphrase"
325msgid "Please re-enter"
507msgid "Please re-enter"
326msgstr ""
508msgstr ""
327
509
328−#: qml/Greeter/NarrowView.qml:122
510+#: qml/Greeter/NarrowView.qml:138
329msgid "Sorry, incorrect passcode"
511msgid "Sorry, incorrect passcode"
330msgstr ""
512msgstr ""
331
513
332−#: qml/Notifications/NotificationMenuItemFactory.qml:129
514+#: qml/Notifications/NotificationMenuItemFactory.qml:124
333msgid "Show password"
515msgid "Show password"
334msgstr "Cuumita uybulluy"
516msgstr "Cuumita uybulluy"
335
517
@@ -341,77 +523,77 @@ msgstr ""
341msgid "Conference"
523msgid "Conference"
342msgstr "Koboxu"
524msgstr "Koboxu"
343
525
344−#: qml/Panel/Indicators/MenuItemFactory.qml:761
526+#: qml/Panel/Indicators/MenuItemFactory.qml:762
345msgid "Nothing is playing"
527msgid "Nothing is playing"
346msgstr ""
528msgstr ""
347
529
348−#: qml/Panel/Indicators/MenuItemFactory.qml:890
530+#: qml/Panel/Indicators/MenuItemFactory.qml:891
349#, qt-format
531#, qt-format
350msgid "%1 hour"
532msgid "%1 hour"
351msgid_plural "%1 hours"
533msgid_plural "%1 hours"
352msgstr[0] "%1 saaqata"
534msgstr[0] "%1 saaqata"
353msgstr[1] "%1 saaqata"
535msgstr[1] "%1 saaqata"
354
536
355−#: qml/Panel/Indicators/MenuItemFactory.qml:894
537+#: qml/Panel/Indicators/MenuItemFactory.qml:895
356#, qt-format
538#, qt-format
357msgid "%1 minute"
539msgid "%1 minute"
358msgid_plural "%1 minutes"
540msgid_plural "%1 minutes"
359msgstr[0] "%1 miniti"
541msgstr[0] "%1 miniti"
360msgstr[1] "%1 miniti"
542msgstr[1] "%1 miniti"
361
543
362−#: qml/Panel/Indicators/MenuItemFactory.qml:899
544+#: qml/Panel/Indicators/MenuItemFactory.qml:900
363#, qt-format
545#, qt-format
364msgid "%1 second"
546msgid "%1 second"
365msgid_plural "%1 seconds"
547msgid_plural "%1 seconds"
366msgstr[0] "%1 nammayye"
548msgstr[0] "%1 nammayye"
367msgstr[1] "%1 nammayye"
549msgstr[1] "%1 nammayye"
368
550
369−#: qml/Panel/Indicators/MenuItemFactory.qml:902
551+#: qml/Panel/Indicators/MenuItemFactory.qml:903
370msgid "0 seconds"
552msgid "0 seconds"
371msgstr "0 nammayye"
553msgstr "0 nammayye"
372
554
373#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
555#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
374−#: qml/Panel/Indicators/MenuItemFactory.qml:904
556+#: qml/Panel/Indicators/MenuItemFactory.qml:905
375#, qt-format
557#, qt-format
376msgid "%1 remaining"
558msgid "%1 remaining"
377msgstr "%1 raaqe"
559msgstr "%1 raaqe"
378
560
379−#: qml/Panel/Indicators/MenuItemFactory.qml:910
561+#: qml/Panel/Indicators/MenuItemFactory.qml:911
380msgid "In queue…"
562msgid "In queue…"
381msgstr ""
563msgstr ""
382
564
383−#: qml/Panel/Indicators/MenuItemFactory.qml:914
565+#: qml/Panel/Indicators/MenuItemFactory.qml:915
384msgid "Downloading"
566msgid "Downloading"
385msgstr "Qulluumah"
567msgstr "Qulluumah"
386
568
387−#: qml/Panel/Indicators/MenuItemFactory.qml:916
569+#: qml/Panel/Indicators/MenuItemFactory.qml:917
388msgid "Paused, tap to resume"
570msgid "Paused, tap to resume"
389msgstr ""
571msgstr ""
390
572
391−#: qml/Panel/Indicators/MenuItemFactory.qml:918
573+#: qml/Panel/Indicators/MenuItemFactory.qml:919
392msgid "Canceled"
574msgid "Canceled"
393msgstr "Bayteh"
575msgstr "Bayteh"
394
576
395−#: qml/Panel/Indicators/MenuItemFactory.qml:920
577+#: qml/Panel/Indicators/MenuItemFactory.qml:921
396msgid "Finished"
578msgid "Finished"
397msgstr "Duudumteh"
579msgstr "Duudumteh"
398
580
399−#: qml/Panel/Indicators/MenuItemFactory.qml:922
581+#: qml/Panel/Indicators/MenuItemFactory.qml:923
400msgid "Failed, tap to retry"
582msgid "Failed, tap to retry"
401msgstr ""
583msgstr ""
402
584
403−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
585+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
404−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
586+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
405msgctxt "Button: Send a reply message"
587msgctxt "Button: Send a reply message"
406msgid "Send"
588msgid "Send"
407msgstr "Rub"
589msgstr "Rub"
408
590
409−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
591+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
410msgctxt "Label: Hint in message indicator line edit"
592msgctxt "Label: Hint in message indicator line edit"
411msgid "Reply"
593msgid "Reply"
412msgstr ""
594msgstr ""
413
595
414−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
596+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
415msgctxt "Button: Call back on phone"
597msgctxt "Button: Call back on phone"
416msgid "Call back"
598msgid "Call back"
417msgstr ""
599msgstr ""
@@ -420,48 +602,24 @@ msgstr ""
420msgid "Drag using 3 fingers any application from one window to the other"
602msgid "Drag using 3 fingers any application from one window to the other"
421msgstr ""
603msgstr ""
422
604
423−#: qml/Tutorial/TutorialBottom.qml:78
424−msgid "Swipe up to add a contact"
425−msgstr ""
426−
427−#: qml/Tutorial/TutorialBottom.qml:80
428−msgid "Swipe up for favorite calculations"
429−msgstr ""
430−
431−#: qml/Tutorial/TutorialBottom.qml:82
432−msgid "Swipe up for recent calls"
433−msgstr ""
434−
435−#: qml/Tutorial/TutorialBottom.qml:84
436−msgid "Swipe up to create a message"
437−msgstr ""
438−
439−#: qml/Tutorial/TutorialBottom.qml:85
440−msgid "Swipe up to manage the app"
441−msgstr ""
442−
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447−#: qml/Tutorial/TutorialLeftLong.qml:47
605+#: qml/Tutorial/TutorialLeftLong.qml:49
448msgid "Long swipe from the left edge to open the Today scope"
606msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
607msgstr ""
450
608
451−#: qml/Tutorial/TutorialRight.qml:54
609+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
610+msgid "Short swipe from the left edge to open the launcher"
453msgstr ""
611msgstr ""
454
612
455#: qml/Tutorial/TutorialRight.qml:55
613#: qml/Tutorial/TutorialRight.qml:55
456−msgid "Short or long swipe from the right edge to view your open apps"
614+msgid "Push your mouse against the right edge to view your open apps"
457msgstr ""
615msgstr ""
458
616
459−#: qml/Tutorial/TutorialTop.qml:53
617+#: qml/Tutorial/TutorialRight.qml:56
460−msgid "Swipe from the top right edge to open the notification bar"
618+msgid "Swipe from the right edge to view your open apps"
461msgstr ""
619msgstr ""
462
620
463−#: qml/Tutorial/TutorialTop.qml:54
621+#: qml/Tutorial/TutorialTop.qml:53
464−msgid "Swipe from the top edge to open the notification bar"
622+msgid "Swipe from the top edge to access notifications and quick settings"
465msgstr ""
623msgstr ""
466
624
467#: qml/Wizard/Page.qml:54
625#: qml/Wizard/Page.qml:54
@@ -473,11 +631,11 @@ msgstr "Derre"
473msgid "Language"
631msgid "Language"
474msgstr ""
632msgstr ""
475
633
476−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
634+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
477−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
635+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
478#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
636#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
479#: qml/Wizard/Pages/75-report-check.qml:84
637#: qml/Wizard/Pages/75-report-check.qml:84
480−#: qml/Wizard/Pages/passcode-desktop.qml:124
638+#: qml/Wizard/Pages/passcode-desktop.qml:141
481#: qml/Wizard/Pages/password-set.qml:141
639#: qml/Wizard/Pages/password-set.qml:141
482msgid "Next"
640msgid "Next"
483msgstr ""
641msgstr ""
@@ -539,7 +697,7 @@ msgstr ""
539msgid "Time Zone"
697msgid "Time Zone"
540msgstr ""
698msgstr ""
541
699
542−#: qml/Wizard/Pages/50-timezone.qml:178
700+#: qml/Wizard/Pages/50-timezone.qml:181
543msgid "Enter your city"
701msgid "Enter your city"
544msgstr ""
702msgstr ""
545
703
@@ -629,7 +787,7 @@ msgid "Service Terms"
629msgstr ""
787msgstr ""
630
788
631#: qml/Wizard/Pages/passcode-confirm.qml:43
789#: qml/Wizard/Pages/passcode-confirm.qml:43
632−#: qml/Wizard/Pages/passcode-desktop.qml:80
790+#: qml/Wizard/Pages/passcode-desktop.qml:96
633msgid "Confirm passcode"
791msgid "Confirm passcode"
634msgstr ""
792msgstr ""
635
793
@@ -646,24 +804,24 @@ msgstr ""
646msgid "Lock Screen Passcode"
804msgid "Lock Screen Passcode"
647msgstr ""
805msgstr ""
648
806
649−#: qml/Wizard/Pages/passcode-desktop.qml:56
807+#: qml/Wizard/Pages/passcode-desktop.qml:60
650msgid "Enter 4 numbers to setup your passcode"
808msgid "Enter 4 numbers to setup your passcode"
651msgstr ""
809msgstr ""
652
810
653−#: qml/Wizard/Pages/passcode-desktop.qml:65
811+#: qml/Wizard/Pages/passcode-desktop.qml:76
654#: qml/Wizard/Pages/passcode-set.qml:54
812#: qml/Wizard/Pages/passcode-set.qml:54
655msgid "Choose passcode"
813msgid "Choose passcode"
656msgstr ""
814msgstr ""
657
815
658−#: qml/Wizard/Pages/passcode-desktop.qml:105
816+#: qml/Wizard/Pages/passcode-desktop.qml:126
659msgid "Passcode too short"
817msgid "Passcode too short"
660msgstr ""
818msgstr ""
661
819
662−#: qml/Wizard/Pages/passcode-desktop.qml:107
820+#: qml/Wizard/Pages/passcode-desktop.qml:128
663msgid "Passcodes match"
821msgid "Passcodes match"
664msgstr ""
822msgstr ""
665
823
666−#: qml/Wizard/Pages/passcode-desktop.qml:109
824+#: qml/Wizard/Pages/passcode-desktop.qml:130
667msgid "Passcodes do not match"
825msgid "Passcodes do not match"
668msgstr ""
826msgstr ""
669
827
@@ -712,26 +870,30 @@ msgid "To proceed with no SIM tap Skip."
712msgstr ""
870msgstr ""
713
871
714#: qml/Wizard/PasswordMeter.qml:87
872#: qml/Wizard/PasswordMeter.qml:87
715−msgid "Passwords match"
873+msgid "Password too short"
716msgstr ""
874msgstr ""
717
875
718#: qml/Wizard/PasswordMeter.qml:89
876#: qml/Wizard/PasswordMeter.qml:89
877+msgid "Passwords match"
878+msgstr ""
879+
880+#: qml/Wizard/PasswordMeter.qml:91
719msgid "Passwords do not match"
881msgid "Passwords do not match"
720msgstr ""
882msgstr ""
721
883
722−#: qml/Wizard/PasswordMeter.qml:93
884+#: qml/Wizard/PasswordMeter.qml:95
723msgid "Strong password"
885msgid "Strong password"
724msgstr ""
886msgstr ""
725
887
726−#: qml/Wizard/PasswordMeter.qml:95
888+#: qml/Wizard/PasswordMeter.qml:97
727msgid "Fair password"
889msgid "Fair password"
728msgstr ""
890msgstr ""
729
891
730−#: qml/Wizard/PasswordMeter.qml:97
892+#: qml/Wizard/PasswordMeter.qml:99
731msgid "Weak password"
893msgid "Weak password"
732msgstr ""
894msgstr ""
733
895
734−#: qml/Wizard/PasswordMeter.qml:99
896+#: qml/Wizard/PasswordMeter.qml:101
735msgid "Very weak password"
897msgid "Very weak password"
736msgstr ""
898msgstr ""
737
899
po/am.po+331−139
@@ -7,47 +7,47 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11−"PO-Revision-Date: 2016-03-24 19:07+0000\n"
11+"PO-Revision-Date: 2016-07-05 02:15+0000\n"
12"Last-Translator: samson <Unknown>\n"
12"Last-Translator: samson <Unknown>\n"
13"Language-Team: Amharic <am@li.org>\n"
13"Language-Team: Amharic <am@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-25 05:54+0000\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
19+"X-Generator: Launchpad (build 18147)\n"
20
20
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
22msgid "Password: "
22msgid "Password: "
23msgstr "የ መግቢያ ቃል: "
23msgstr "የ መግቢያ ቃል: "
24
24
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
27msgid "Pin shortcut"
27msgid "Pin shortcut"
28msgstr "አቋራጭ ማጣበቂያ"
28msgstr "አቋራጭ ማጣበቂያ"
29
29
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
31msgid "Quit"
31msgid "Quit"
32msgstr "ማጥፊያ"
32msgstr "ማጥፊያ"
33
33
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
35msgid "Unpin shortcut"
35msgid "Unpin shortcut"
36msgstr "አቋራጭ መለያያ"
36msgstr "አቋራጭ መለያያ"
37
37
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
39msgid "Device Locked"
39msgid "Device Locked"
40msgstr "አካሉ ተቆልፏል"
40msgstr "አካሉ ተቆልፏል"
41
41
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
43msgid "You have been locked out due to too many failed passphrase attempts."
43msgid "You have been locked out due to too many failed passphrase attempts."
44msgstr "ብዙ ጊዜ የተሳሳተ የ ማለፊያ ሀረግ ለማስገባት በ መሞከር ምክንያት ስልኩ ተቆልፏል"
44msgstr "ብዙ ጊዜ የተሳሳተ የ ማለፊያ ሀረግ ለማስገባት በ መሞከር ምክንያት ስልኩ ተቆልፏል"
45
45
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
47msgid "You have been locked out due to too many failed passcode attempts."
47msgid "You have been locked out due to too many failed passcode attempts."
48msgstr "ብዙ ጊዜ የተሳሳተ የ ማለፊያ ኮድ ለማስገባት በ መሞከር ምክንያት ስልኩ ተቆልፏል"
48msgstr "ብዙ ጊዜ የተሳሳተ የ ማለፊያ ኮድ ለማስገባት በ መሞከር ምክንያት ስልኩ ተቆልፏል"
49
49
50−#: qml/Components/DelayedLockscreen.qml:74
50+#: qml/Components/DelayedLockscreen.qml:75
51#, qt-format
51#, qt-format
52msgid "Please wait %1 minute and then try again…"
52msgid "Please wait %1 minute and then try again…"
53msgid_plural "Please wait %1 minutes and then try again…"
53msgid_plural "Please wait %1 minutes and then try again…"
@@ -73,8 +73,8 @@ msgctxt "Button: Log out from the system"
73msgid "Log Out"
73msgid "Log Out"
74msgstr "መውጫ"
74msgstr "መውጫ"
75
75
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
77+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
79msgid "Cancel"
79msgid "Cancel"
80msgstr "መሰረዣ"
80msgstr "መሰረዣ"
@@ -92,16 +92,16 @@ msgstr "በእርግጥ እንደገና ማስነሳት ይፈልጋሉ?"
92msgid "No"
92msgid "No"
93msgstr "አይ"
93msgstr "አይ"
94
94
95−#: qml/Components/Dialogs.qml:183
95+#: qml/Components/Dialogs.qml:182
96msgid "Yes"
96msgid "Yes"
97msgstr "አዎ"
97msgstr "አዎ"
98
98
99−#: qml/Components/Dialogs.qml:198
99+#: qml/Components/Dialogs.qml:197
100msgctxt "Title: Power off/Restart dialog"
100msgctxt "Title: Power off/Restart dialog"
101msgid "Power"
101msgid "Power"
102msgstr "ሐይል"
102msgstr "ሐይል"
103
103
104−#: qml/Components/Dialogs.qml:199
104+#: qml/Components/Dialogs.qml:198
105msgid ""
105msgid ""
106"Are you sure you would like\n"
106"Are you sure you would like\n"
107"to power off?"
107"to power off?"
@@ -109,28 +109,198 @@ msgstr ""
109"በእርግጥ ሐይሉን ማጥፋት\n"
109"በእርግጥ ሐይሉን ማጥፋት\n"
110"ይፈልጋሉ?"
110"ይፈልጋሉ?"
111
111
112−#: qml/Components/Dialogs.qml:201
112+#: qml/Components/Dialogs.qml:200
113msgctxt "Button: Power off the system"
113msgctxt "Button: Power off the system"
114msgid "Power off"
114msgid "Power off"
115msgstr "ሐይል ማጥፊያ"
115msgstr "ሐይል ማጥፊያ"
116
116
117−#: qml/Components/Dialogs.qml:210
117+#: qml/Components/Dialogs.qml:209
118msgctxt "Button: Restart the system"
118msgctxt "Button: Restart the system"
119msgid "Restart"
119msgid "Restart"
120msgstr "እንደገና ማስጀመሪያ"
120msgstr "እንደገና ማስጀመሪያ"
121
121
122+#: qml/Components/KeyboardShortcutsOverlay.qml:41
123+msgid "Keyboard Shortcuts"
124+msgstr "የ ፊደል ገበታ አቋራጮች"
125+
126+#: qml/Components/KeyboardShortcutsOverlay.qml:55
127+msgid "Unity 8"
128+msgstr "Unity 8"
129+
130+#: qml/Components/KeyboardShortcutsOverlay.qml:62
131+msgid "PrtScr"
132+msgstr "PrtScr"
133+
134+#: qml/Components/KeyboardShortcutsOverlay.qml:67
135+msgid "Takes a screenshot."
136+msgstr "መመልከቻ ፎቶ ማንሻ"
137+
138+#: qml/Components/KeyboardShortcutsOverlay.qml:75
139+msgid "Alt + PrtScr"
140+msgstr "Alt + PrtScr"
141+
142+#: qml/Components/KeyboardShortcutsOverlay.qml:80
143+msgid "Takes a screenshot of a window."
144+msgstr "የ መስኮት መመልከቻ ፎቶ ማንሻ"
145+
146+#: qml/Components/KeyboardShortcutsOverlay.qml:88
147+msgid "Super + Space"
148+msgstr "Super + Space"
149+
150+#: qml/Components/KeyboardShortcutsOverlay.qml:93
151+msgid "Switches to next keyboard layout."
152+msgstr "የሚቀጥለው የ ፊደል ገበታ እቅድ መቀየሪያ"
153+
154+#: qml/Components/KeyboardShortcutsOverlay.qml:101
155+msgid "Super + Shift + Space"
156+msgstr "Super + Shift + Space"
157+
158+#: qml/Components/KeyboardShortcutsOverlay.qml:106
159+msgid "Switches to previous keyboard layout."
160+msgstr "ወዳለፈው የ ፊደል ገበታ እቅድ መቀየሪያ"
161+
162+#: qml/Components/KeyboardShortcutsOverlay.qml:118
163+msgid "Launcher"
164+msgstr "ማስነሻ"
165+
166+#: qml/Components/KeyboardShortcutsOverlay.qml:125
167+msgid "Super (Hold)"
168+msgstr "Super (ይጫኑ)"
169+
170+#: qml/Components/KeyboardShortcutsOverlay.qml:130
171+msgid "Opens the launcher, displays shortcuts."
172+msgstr "ማስነሻውን መክፈቻ እና አቋራጮች ማሳያ"
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:138
175+msgid "Alt + F1"
176+msgstr "Alt + F1"
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:143
179+msgid "Opens launcher keyboard navigation mode."
180+msgstr "መክፈቻ በ ፊደል ገበታ መቃኛ ዘዴ ማስነሻ"
181+
182+#: qml/Components/KeyboardShortcutsOverlay.qml:151
183+msgid "Super + Tab"
184+msgstr "Super + Tab"
185+
186+#: qml/Components/KeyboardShortcutsOverlay.qml:156
187+msgid "Switches applications via the launcher."
188+msgstr "መተግበሪያዎችን በ ማስጀመሪያ መቀየሪያ"
189+
190+#: qml/Components/KeyboardShortcutsOverlay.qml:164
191+msgid "Super + 0 to 9"
192+msgstr "Super + 0 እስከ 9"
193+
194+#: qml/Components/KeyboardShortcutsOverlay.qml:169
195+msgid "Same as clicking on a launcher icon."
196+msgstr "ተመሳሳይ በ ማስጀመሪያ ምልክት ላይ እንደ መጫን"
197+
198+#: qml/Components/KeyboardShortcutsOverlay.qml:181
199+msgid "Scopes"
200+msgstr "ክልል"
201+
202+#: qml/Components/KeyboardShortcutsOverlay.qml:188
203+msgid "Super (Tap)"
204+msgstr "Super (Tap)"
205+
206+#: qml/Components/KeyboardShortcutsOverlay.qml:193
207+msgid "Opens the Scopes home."
208+msgstr "የ ክልል ቤት መክፈቻ"
209+
210+#: qml/Components/KeyboardShortcutsOverlay.qml:209
211+msgid "Switching"
212+msgstr "በ መቀየር ላይ"
213+
214+#: qml/Components/KeyboardShortcutsOverlay.qml:216
215+msgid "Alt + Tab"
216+msgstr "Alt + Tab"
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:221
219+msgid "Switches between applications."
220+msgstr "በ መተግበሪያዎች መካከል መቀያየሪያ"
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:229
223+msgid "Super + W"
224+msgstr "Super + W"
225+
226+#: qml/Components/KeyboardShortcutsOverlay.qml:234
227+msgid "Opens the desktop spread."
228+msgstr "የ ዴስክቶፕ ማስፊያ መክፈቻ"
229+
230+#: qml/Components/KeyboardShortcutsOverlay.qml:242
231+msgid "Cursor Left or Right"
232+msgstr "መጠቆሚያ የ ግራ ወይንም የ ቀኝ"
233+
234+#: qml/Components/KeyboardShortcutsOverlay.qml:247
235+msgid "Moves the focus."
236+msgstr "ትኩረት ማንቀሳቀሻ"
237+
238+#: qml/Components/KeyboardShortcutsOverlay.qml:259
239+msgid "Windows"
240+msgstr "መስኮቶች"
241+
242+#: qml/Components/KeyboardShortcutsOverlay.qml:266
243+msgid "Ctrl + Super + D"
244+msgstr "Ctrl + Super + D"
245+
246+#: qml/Components/KeyboardShortcutsOverlay.qml:271
247+msgid "Minimizes all windows."
248+msgstr "ሁሉንም መስኮቶች ማሳነሻ"
249+
250+#: qml/Components/KeyboardShortcutsOverlay.qml:279
251+msgid "Ctrl + Super + Up"
252+msgstr "Ctrl + Super + Up"
253+
254+#: qml/Components/KeyboardShortcutsOverlay.qml:284
255+msgid "Maximizes the current window."
256+msgstr "የ አሁኑን መስኮት ማሳደጊያ"
257+
258+#: qml/Components/KeyboardShortcutsOverlay.qml:292
259+msgid "Ctrl + Super + Down"
260+msgstr "Ctrl + Super + Down"
261+
262+#: qml/Components/KeyboardShortcutsOverlay.qml:297
263+msgid "Minimizes or restores the current window."
264+msgstr "የ አሁኑን መስኮትማሳነሻ ወይንም እንደ ነበር መመለሻ"
265+
266+#: qml/Components/KeyboardShortcutsOverlay.qml:305
267+msgid "Ctrl + Super + Left or Right"
268+msgstr "Ctrl + Super + Left or Right"
269+
270+#: qml/Components/KeyboardShortcutsOverlay.qml:310
271+msgid "Semi-maximizes the current window."
272+msgstr "የ አሁኑን መስኮት በ ንዑስ-ማሳደጊያ"
273+
274+#: qml/Components/KeyboardShortcutsOverlay.qml:318
275+msgid "Alt + F4"
276+msgstr "Alt + F4"
277+
278+#: qml/Components/KeyboardShortcutsOverlay.qml:323
279+msgid "Closes the current window."
280+msgstr "የ አሁኑን መስኮት መዝጊያ"
281+
122−#: qml/Components/Lockscreen.qml:231
282+#: qml/Components/Lockscreen.qml:239
123msgid "Return to Call"
283msgid "Return to Call"
124msgstr "ወደ ጥሪ መመለሻ"
284msgstr "ወደ ጥሪ መመለሻ"
125
285
126−#: qml/Components/Lockscreen.qml:231
286+#: qml/Components/Lockscreen.qml:239
127msgid "Emergency Call"
287msgid "Emergency Call"
128msgstr "የ ድንገተኛ ጥሪ"
288msgstr "የ ድንገተኛ ጥሪ"
129
289
130−#: qml/Components/Lockscreen.qml:263
290+#: qml/Components/Lockscreen.qml:271
131msgid "OK"
291msgid "OK"
132msgstr "እሺ"
292msgstr "እሺ"
133
293
294+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
295+#, qt-format
296+msgid "%1:%2:%3"
297+msgstr "%1:%2:%3"
298+
299+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
300+#, qt-format
301+msgid "%1:%2"
302+msgstr "%1:%2"
303+
134#: qml/Components/ModeSwitchWarningDialog.qml:32
304#: qml/Components/ModeSwitchWarningDialog.qml:32
135msgid "Apps may have unsaved data:"
305msgid "Apps may have unsaved data:"
136msgstr "መተግበሪያው ያልተቀመጠ ዳታ ይዟል:"
306msgstr "መተግበሪያው ያልተቀመጠ ዳታ ይዟል:"
@@ -157,26 +327,30 @@ msgstr "አሁን እንደገና መገናኛ!"
157msgid "Close all"
327msgid "Close all"
158msgstr "ሁሉንም መዝጊያ"
328msgstr "ሁሉንም መዝጊያ"
159
329
330+#: qml/Components/SharingPicker.qml:54
331+msgid "Preview Share Item"
332+msgstr "የሚካፈሉትን እቃ ቅድመ እይታ"
333+
160−#: qml/Dash/DashPageHeader.qml:337
334+#: qml/Dash/DashPageHeader.qml:333
161msgctxt "Button: Open the Ubuntu Store"
335msgctxt "Button: Open the Ubuntu Store"
162msgid "Store"
336msgid "Store"
163msgstr "ማስቀመጫ"
337msgstr "ማስቀመጫ"
164
338
165−#: qml/Dash/DashPageHeader.qml:344
339+#: qml/Dash/DashPageHeader.qml:340
166msgctxt "Button: Start a search in the current dash scope"
340msgctxt "Button: Start a search in the current dash scope"
167msgid "Search"
341msgid "Search"
168msgstr "መፈለጊያ"
342msgstr "መፈለጊያ"
169
343
170−#: qml/Dash/DashPageHeader.qml:354
344+#: qml/Dash/DashPageHeader.qml:350
171msgctxt "Button: Show the current dash scope settings"
345msgctxt "Button: Show the current dash scope settings"
172msgid "Settings"
346msgid "Settings"
173msgstr "ማሰናጃዎች"
347msgstr "ማሰናጃዎች"
174
348
175−#: qml/Dash/DashPageHeader.qml:361
349+#: qml/Dash/DashPageHeader.qml:357
176msgid "Remove from Favorites"
350msgid "Remove from Favorites"
177msgstr "ከምወዳቸው ማስወገጃ"
351msgstr "ከምወዳቸው ማስወገጃ"
178
352
179−#: qml/Dash/DashPageHeader.qml:361
353+#: qml/Dash/DashPageHeader.qml:357
180msgid "Add to Favorites"
354msgid "Add to Favorites"
181msgstr "ወደምወዳቸው መጨመሪያ"
355msgstr "ወደምወዳቸው መጨመሪያ"
182
356
@@ -188,24 +362,24 @@ msgstr "የ እርስዎን ውጤቶች እንደገና ማጣሪያ"
188msgid "Reset"
362msgid "Reset"
189msgstr "እንደ ነበረ መመለሻ"
363msgstr "እንደ ነበረ መመለሻ"
190
364
191−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
365+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
192−msgid "See less"
366+msgid "Show less"
193−msgstr "አነስተኛ መመልከቻ"
367+msgstr "ትንሽ ማሳያ"
194
368
195−#: qml/Dash/GenericScopeView.qml:570
369+#: qml/Dash/GenericScopeView.qml:580
196−msgid "See all"
370+msgid "Show all"
197−msgstr "ሁሉንም መመልከቻ"
371+msgstr "ሁሉንም ማሳያ"
198
372
199−#: qml/Dash/GenericScopeView.qml:627
373+#: qml/Dash/GenericScopeView.qml:637
200msgctxt "Label: Hint for dash search line edit"
374msgctxt "Label: Hint for dash search line edit"
201msgid "Search"
375msgid "Search"
202msgstr "መፈለጊያ"
376msgstr "መፈለጊያ"
203
377
204−#: qml/Dash/PageHeaderExtraPanel.qml:55
378+#: qml/Dash/PageHeaderExtraPanel.qml:56
205msgid "Recent Searches"
379msgid "Recent Searches"
206msgstr "የ ቅርብ ጊዜ ፍለጋዎች"
380msgstr "የ ቅርብ ጊዜ ፍለጋዎች"
207
381
208−#: qml/Dash/PageHeaderExtraPanel.qml:66
382+#: qml/Dash/PageHeaderExtraPanel.qml:67
209msgid "Clear All"
383msgid "Clear All"
210msgstr "ሁሉንም ማጽጃ"
384msgstr "ሁሉንም ማጽጃ"
211
385
@@ -218,22 +392,18 @@ msgid "Less..."
218msgstr "አነስተኛ..."
392msgstr "አነስተኛ..."
219
393
220#: qml/Dash/Previews/PreviewCommentInput.qml:68
394#: qml/Dash/Previews/PreviewCommentInput.qml:68
221−#: qml/Dash/Previews/PreviewRatingInput.qml:174
395+#: qml/Dash/Previews/PreviewRatingInput.qml:175
222msgid "Send"
396msgid "Send"
223msgstr "መላኪያ"
397msgstr "መላኪያ"
224
398
225−#: qml/Dash/Previews/PreviewRatingInput.qml:84
399+#: qml/Dash/Previews/PreviewRatingInput.qml:82
226msgid "Rate this"
400msgid "Rate this"
227msgstr "ለዚህ ደረጃ ይስጡ"
401msgstr "ለዚህ ደረጃ ይስጡ"
228
402
229−#: qml/Dash/Previews/PreviewRatingInput.qml:129
403+#: qml/Dash/Previews/PreviewRatingInput.qml:157
230msgid "Add a review"
404msgid "Add a review"
231msgstr "ግምገማ መጨመሪያ"
405msgstr "ግምገማ መጨመሪያ"
232
406
233−#: qml/Dash/Previews/PreviewSharing.qml:66
234−msgid "Preview Share Item"
235−msgstr "የሚካፈሉትን እቃ ቅድመ እይታ"
236−
237#: qml/Dash/PullToRefreshScopeStyle.qml:55
407#: qml/Dash/PullToRefreshScopeStyle.qml:55
238msgid "Pull to refresh…"
408msgid "Pull to refresh…"
239msgstr "ይሳቡ ለማነቃቃት…"
409msgstr "ይሳቡ ለማነቃቃት…"
@@ -246,49 +416,61 @@ msgstr "ይልቀቁ ለማነቃቃት…"
246msgid "Enable location data"
416msgid "Enable location data"
247msgstr "የአካባቢ ዳታ ማስቻያ"
417msgstr "የአካባቢ ዳታ ማስቻያ"
248
418
249−#: qml/Dash/ScopesList.qml:67
419+#: qml/Dash/ScopesList.qml:55
250msgid "Manage"
420msgid "Manage"
251msgstr "አስተዳዳሪ"
421msgstr "አስተዳዳሪ"
252
422
253−#: qml/Dash/ScopesList.qml:113
423+#: qml/Dash/ScopesList.qml:102
254msgid "Home"
424msgid "Home"
255msgstr "ቤት"
425msgstr "ቤት"
256
426
257−#: qml/Dash/ScopesList.qml:114
427+#: qml/Dash/ScopesList.qml:103
258msgid "Also installed"
428msgid "Also installed"
259msgstr "እንዲሁም የተገጠሙ"
429msgstr "እንዲሁም የተገጠሙ"
260
430
261−#: qml/DisabledScreenNotice.qml:104
431+#: qml/DisabledScreenNotice.qml:109
262msgid ""
432msgid ""
263"Your device is now connected to an external display. Use this screen as a "
433"Your device is now connected to an external display. Use this screen as a "
264"touch pad to interact with the pointer."
434"touch pad to interact with the pointer."
265msgstr "የ እርስዎ አካል አሁን ከ ውጪ ማሳያ ጋር ተገናኝቷል: ይህን መመልከቻ እንደ ተችፓድ መጠቀሚያ"
435msgstr "የ እርስዎ አካል አሁን ከ ውጪ ማሳያ ጋር ተገናኝቷል: ይህን መመልከቻ እንደ ተችፓድ መጠቀሚያ"
266
436
267−#: qml/Greeter/CoverPage.qml:118
437+#: qml/Greeter/CoverPage.qml:127
268msgid "Unlock"
438msgid "Unlock"
269msgstr "መክፈቻ"
439msgstr "መክፈቻ"
270
440
441+#: qml/Greeter/Greeter.qml:555
442+msgid "Try again"
443+msgstr "እንደገና ይሞክሩ"
444+
445+#: qml/Greeter/LoginList.qml:63
446+msgid "Passphrase"
447+msgstr ""
448+
271−#: qml/Greeter/LoginList.qml:239
449+#: qml/Greeter/LoginList.qml:64
450+msgid "Passcode"
451+msgstr ""
452+
453+#: qml/Greeter/LoginList.qml:87
272msgid "Retry"
454msgid "Retry"
273msgstr "እንደገና ይሞክሩ"
455msgstr "እንደገና ይሞክሩ"
274
456
275−#: qml/Greeter/LoginList.qml:240
457+#: qml/Greeter/LoginList.qml:88
276−msgid "Tap to unlock"
458+msgid "Log In"
277−msgstr "ለመክፈት መታ ያድርጉ"
459+msgstr "መግቢያ"
278
460
279−#: qml/Greeter/NarrowView.qml:54
461+#: qml/Greeter/NarrowView.qml:55
280msgid "Sorry, incorrect passphrase."
462msgid "Sorry, incorrect passphrase."
281msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
463msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
282
464
283−#: qml/Greeter/NarrowView.qml:55
465+#: qml/Greeter/NarrowView.qml:56
284msgid "Sorry, incorrect passcode."
466msgid "Sorry, incorrect passcode."
285msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
467msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
286
468
287−#: qml/Greeter/NarrowView.qml:56
469+#: qml/Greeter/NarrowView.qml:57
288msgid "This will be your last attempt."
470msgid "This will be your last attempt."
289msgstr "ይህ የመጨረሻ ሙከራዎ ነው"
471msgstr "ይህ የመጨረሻ ሙከራዎ ነው"
290
472
291−#: qml/Greeter/NarrowView.qml:58
473+#: qml/Greeter/NarrowView.qml:59
292msgid ""
474msgid ""
293"If passphrase is entered incorrectly, your phone will conduct a factory "
475"If passphrase is entered incorrectly, your phone will conduct a factory "
294"reset and all personal data will be deleted."
476"reset and all personal data will be deleted."
@@ -296,7 +478,7 @@ msgstr ""
296"የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
478"የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
297"ይጠፋል"
479"ይጠፋል"
298
480
299−#: qml/Greeter/NarrowView.qml:59
481+#: qml/Greeter/NarrowView.qml:60
300msgid ""
482msgid ""
301"If passcode is entered incorrectly, your phone will conduct a factory reset "
483"If passcode is entered incorrectly, your phone will conduct a factory reset "
302"and all personal data will be deleted."
484"and all personal data will be deleted."
@@ -304,38 +486,38 @@ msgstr ""
304"የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
486"የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
305"ይጠፋል"
487"ይጠፋል"
306
488
307−#: qml/Greeter/NarrowView.qml:116
489+#: qml/Greeter/NarrowView.qml:129
308#, qt-format
490#, qt-format
309msgid "Enter %1"
491msgid "Enter %1"
310msgstr "ማስገቢያ %1"
492msgstr "ማስገቢያ %1"
311
493
312−#: qml/Greeter/NarrowView.qml:117
494+#: qml/Greeter/NarrowView.qml:130
313msgid "Enter passphrase"
495msgid "Enter passphrase"
314msgstr "የ ማለፊያ ሀረግ ያስገቡ"
496msgstr "የ ማለፊያ ሀረግ ያስገቡ"
315
497
316−#: qml/Greeter/NarrowView.qml:118
498+#: qml/Greeter/NarrowView.qml:131
317msgid "Enter passcode"
499msgid "Enter passcode"
318msgstr "የ ማለፊያ ኮድ ያስገቡ"
500msgstr "የ ማለፊያ ኮድ ያስገቡ"
319
501
320−#: qml/Greeter/NarrowView.qml:119
502+#: qml/Greeter/NarrowView.qml:135
321#, qt-format
503#, qt-format
322msgid "Sorry, incorrect %1"
504msgid "Sorry, incorrect %1"
323msgstr "አዝናለሁ: የተሳሳተ%1"
505msgstr "አዝናለሁ: የተሳሳተ%1"
324
506
325−#: qml/Greeter/NarrowView.qml:120
507+#: qml/Greeter/NarrowView.qml:136
326msgid "Sorry, incorrect passphrase"
508msgid "Sorry, incorrect passphrase"
327msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
509msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
328
510
329−#: qml/Greeter/NarrowView.qml:121
511+#: qml/Greeter/NarrowView.qml:137
330msgctxt "passphrase"
512msgctxt "passphrase"
331msgid "Please re-enter"
513msgid "Please re-enter"
332msgstr "እባክዎን እንደገና-ያስገቡ"
514msgstr "እባክዎን እንደገና-ያስገቡ"
333
515
334−#: qml/Greeter/NarrowView.qml:122
516+#: qml/Greeter/NarrowView.qml:138
335msgid "Sorry, incorrect passcode"
517msgid "Sorry, incorrect passcode"
336msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
518msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
337
519
338−#: qml/Notifications/NotificationMenuItemFactory.qml:129
520+#: qml/Notifications/NotificationMenuItemFactory.qml:124
339msgid "Show password"
521msgid "Show password"
340msgstr "የመግቢያ ቃል ማሳያ"
522msgstr "የመግቢያ ቃል ማሳያ"
341
523
@@ -347,77 +529,77 @@ msgstr "ወደ ጥሪው ለመመለስ መታ ያድርጉ..."
347msgid "Conference"
529msgid "Conference"
348msgstr "ስብሰባ"
530msgstr "ስብሰባ"
349
531
350−#: qml/Panel/Indicators/MenuItemFactory.qml:761
532+#: qml/Panel/Indicators/MenuItemFactory.qml:762
351msgid "Nothing is playing"
533msgid "Nothing is playing"
352msgstr "ምንም አይጫወትም"
534msgstr "ምንም አይጫወትም"
353
535
354−#: qml/Panel/Indicators/MenuItemFactory.qml:890
536+#: qml/Panel/Indicators/MenuItemFactory.qml:891
355#, qt-format
537#, qt-format
356msgid "%1 hour"
538msgid "%1 hour"
357msgid_plural "%1 hours"
539msgid_plural "%1 hours"
358msgstr[0] "%1 ሰአት"
540msgstr[0] "%1 ሰአት"
359msgstr[1] "%1 ሰአቶች"
541msgstr[1] "%1 ሰአቶች"
360
542
361−#: qml/Panel/Indicators/MenuItemFactory.qml:894
543+#: qml/Panel/Indicators/MenuItemFactory.qml:895
362#, qt-format
544#, qt-format
363msgid "%1 minute"
545msgid "%1 minute"
364msgid_plural "%1 minutes"
546msgid_plural "%1 minutes"
365msgstr[0] "%1 ደቂቃ"
547msgstr[0] "%1 ደቂቃ"
366msgstr[1] "%1 ደቂቃዎች"
548msgstr[1] "%1 ደቂቃዎች"
367
549
368−#: qml/Panel/Indicators/MenuItemFactory.qml:899
550+#: qml/Panel/Indicators/MenuItemFactory.qml:900
369#, qt-format
551#, qt-format
370msgid "%1 second"
552msgid "%1 second"
371msgid_plural "%1 seconds"
553msgid_plural "%1 seconds"
372msgstr[0] "%1 ሰከንድ"
554msgstr[0] "%1 ሰከንድ"
373msgstr[1] "%1 ሰከንዶች"
555msgstr[1] "%1 ሰከንዶች"
374
556
375−#: qml/Panel/Indicators/MenuItemFactory.qml:902
557+#: qml/Panel/Indicators/MenuItemFactory.qml:903
376msgid "0 seconds"
558msgid "0 seconds"
377msgstr "0 ሰከንዶች"
559msgstr "0 ሰከንዶች"
378
560
379#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
561#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
380−#: qml/Panel/Indicators/MenuItemFactory.qml:904
562+#: qml/Panel/Indicators/MenuItemFactory.qml:905
381#, qt-format
563#, qt-format
382msgid "%1 remaining"
564msgid "%1 remaining"
383msgstr "%1 የቀረው"
565msgstr "%1 የቀረው"
384
566
385−#: qml/Panel/Indicators/MenuItemFactory.qml:910
567+#: qml/Panel/Indicators/MenuItemFactory.qml:911
386msgid "In queue…"
568msgid "In queue…"
387msgstr "ወረፋ በመጠበቅ ላይ…"
569msgstr "ወረፋ በመጠበቅ ላይ…"
388
570
389−#: qml/Panel/Indicators/MenuItemFactory.qml:914
571+#: qml/Panel/Indicators/MenuItemFactory.qml:915
390msgid "Downloading"
572msgid "Downloading"
391msgstr "በማውረድ ላይ"
573msgstr "በማውረድ ላይ"
392
574
393−#: qml/Panel/Indicators/MenuItemFactory.qml:916
575+#: qml/Panel/Indicators/MenuItemFactory.qml:917
394msgid "Paused, tap to resume"
576msgid "Paused, tap to resume"
395msgstr "ማስቆሚያ: ለመቀጠል መታ ያድርጉ"
577msgstr "ማስቆሚያ: ለመቀጠል መታ ያድርጉ"
396
578
397−#: qml/Panel/Indicators/MenuItemFactory.qml:918
579+#: qml/Panel/Indicators/MenuItemFactory.qml:919
398msgid "Canceled"
580msgid "Canceled"
399msgstr "ተሰርዟል"
581msgstr "ተሰርዟል"
400
582
401−#: qml/Panel/Indicators/MenuItemFactory.qml:920
583+#: qml/Panel/Indicators/MenuItemFactory.qml:921
402msgid "Finished"
584msgid "Finished"
403msgstr "ጨርሷል"
585msgstr "ጨርሷል"
404
586
405−#: qml/Panel/Indicators/MenuItemFactory.qml:922
587+#: qml/Panel/Indicators/MenuItemFactory.qml:923
406msgid "Failed, tap to retry"
588msgid "Failed, tap to retry"
407msgstr "አልተቻለም: እንደገና ለመሞከር መታ ያድርጉ"
589msgstr "አልተቻለም: እንደገና ለመሞከር መታ ያድርጉ"
408
590
409−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
591+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
410−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
592+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
411msgctxt "Button: Send a reply message"
593msgctxt "Button: Send a reply message"
412msgid "Send"
594msgid "Send"
413msgstr "መላኪያ"
595msgstr "መላኪያ"
414
596
415−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
597+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
416msgctxt "Label: Hint in message indicator line edit"
598msgctxt "Label: Hint in message indicator line edit"
417msgid "Reply"
599msgid "Reply"
418msgstr "መመለሻ"
600msgstr "መመለሻ"
419
601
420−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
602+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
421msgctxt "Button: Call back on phone"
603msgctxt "Button: Call back on phone"
422msgid "Call back"
604msgid "Call back"
423msgstr "መልሶ መደወያ"
605msgstr "መልሶ መደወያ"
@@ -426,49 +608,25 @@ msgstr "መልሶ መደወያ"
426msgid "Drag using 3 fingers any application from one window to the other"
608msgid "Drag using 3 fingers any application from one window to the other"
427msgstr "መጎተቻ 3 ጣቶች በ መጠቀም ማንኛውንም መተግበሪያ ከ አንድ መስኮት ወደ ሌላ"
609msgstr "መጎተቻ 3 ጣቶች በ መጠቀም ማንኛውንም መተግበሪያ ከ አንድ መስኮት ወደ ሌላ"
428
610
429−#: qml/Tutorial/TutorialBottom.qml:78
430−msgid "Swipe up to add a contact"
431−msgstr "ወደ ላይ ይጥረጉ ግንኙነት ለ መጨመር"
432−
433−#: qml/Tutorial/TutorialBottom.qml:80
434−msgid "Swipe up for favorite calculations"
435−msgstr "ወደ ላይ ይጥረጉ የሚወዱትን ለማስላት"
436−
437−#: qml/Tutorial/TutorialBottom.qml:82
438−msgid "Swipe up for recent calls"
439−msgstr "ወደ ላይ ይጥረጉ ለ ቅርብ ጊዜ ጥሪዎች"
440−
441−#: qml/Tutorial/TutorialBottom.qml:84
442−msgid "Swipe up to create a message"
443−msgstr "ወደ ላይ ይጥረጉ መልእክት ለ መፍጠር"
444−
445−#: qml/Tutorial/TutorialBottom.qml:85
446−msgid "Swipe up to manage the app"
447−msgstr "ወደ ላይ ይጥረጉ መተግበሪያ ለማስተዳደር"
448−
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
452−
453−#: qml/Tutorial/TutorialLeftLong.qml:47
611+#: qml/Tutorial/TutorialLeftLong.qml:49
454msgid "Long swipe from the left edge to open the Today scope"
612msgid "Long swipe from the left edge to open the Today scope"
455msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
613msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
456
614
457−#: qml/Tutorial/TutorialRight.qml:54
615+#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Hover your mouse on the right edge to view your open apps"
616+msgid "Short swipe from the left edge to open the launcher"
459−msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
617+msgstr "በ አጭሩ ይጥረጉ ከ ግራ ጠርዝ በኩል ማስጀመሪያውን ለ መክፈት"
460
618
461#: qml/Tutorial/TutorialRight.qml:55
619#: qml/Tutorial/TutorialRight.qml:55
462−msgid "Short or long swipe from the right edge to view your open apps"
620+msgid "Push your mouse against the right edge to view your open apps"
463−msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
621+msgstr "የ እርስዎን አይጥ መጠቆሚያ ወደ ቀኝ ጠርዝ በኩል ያስጠጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
464
622
465−#: qml/Tutorial/TutorialTop.qml:53
623+#: qml/Tutorial/TutorialRight.qml:56
466−msgid "Swipe from the top right edge to open the notification bar"
624+msgid "Swipe from the right edge to view your open apps"
467−msgstr "ከ ላይ ቀኝ ጠርዝ በኩል ይጥረጉ የ ማስታወቂያ መደርደሪያ ለ መክፈት"
625+msgstr "ከ ቀኝ በኩል ይጥረጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
468
626
469−#: qml/Tutorial/TutorialTop.qml:54
627+#: qml/Tutorial/TutorialTop.qml:53
470−msgid "Swipe from the top edge to open the notification bar"
628+msgid "Swipe from the top edge to access notifications and quick settings"
471−msgstr "ከ ላይ ጠርዝ በኩል ይጥረጉ የ ማስታወቂያ መደርደሪያ ለ መክፈት"
629+msgstr "ከ ላይ ጠረዝ በኩል ይጥረጉ ማስታወቂያዎች እና በፍጥነት ማሰናጃዎች ጋር ለ መድረስ"
472
630
473#: qml/Wizard/Page.qml:54
631#: qml/Wizard/Page.qml:54
474msgctxt "Button: Go back one page in the Wizard"
632msgctxt "Button: Go back one page in the Wizard"
@@ -479,11 +637,11 @@ msgstr "ወደ ኋላ"
479msgid "Language"
637msgid "Language"
480msgstr "ቋንቋ"
638msgstr "ቋንቋ"
481
639
482−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
640+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
483−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
641+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
484#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
642#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
485#: qml/Wizard/Pages/75-report-check.qml:84
643#: qml/Wizard/Pages/75-report-check.qml:84
486−#: qml/Wizard/Pages/passcode-desktop.qml:124
644+#: qml/Wizard/Pages/passcode-desktop.qml:141
487#: qml/Wizard/Pages/password-set.qml:141
645#: qml/Wizard/Pages/password-set.qml:141
488msgid "Next"
646msgid "Next"
489msgstr "ይቀጥሉ"
647msgstr "ይቀጥሉ"
@@ -545,7 +703,7 @@ msgstr "እርስዎ በኋላ በ ስርአት ማሰናጃ ውስጥ መቀየ
545msgid "Time Zone"
703msgid "Time Zone"
546msgstr "የ ሰአት ክልል"
704msgstr "የ ሰአት ክልል"
547
705
548−#: qml/Wizard/Pages/50-timezone.qml:178
706+#: qml/Wizard/Pages/50-timezone.qml:181
549msgid "Enter your city"
707msgid "Enter your city"
550msgstr "የ እርስዎን ከተማ ያስገቡ"
708msgstr "የ እርስዎን ከተማ ያስገቡ"
551
709
@@ -637,7 +795,7 @@ msgid "Service Terms"
637msgstr "የ ግልጋሎት ስምምነቶች"
795msgstr "የ ግልጋሎት ስምምነቶች"
638
796
639#: qml/Wizard/Pages/passcode-confirm.qml:43
797#: qml/Wizard/Pages/passcode-confirm.qml:43
640−#: qml/Wizard/Pages/passcode-desktop.qml:80
798+#: qml/Wizard/Pages/passcode-desktop.qml:96
641msgid "Confirm passcode"
799msgid "Confirm passcode"
642msgstr "የማለፊያ ኮድ ማረጋገጫ"
800msgstr "የማለፊያ ኮድ ማረጋገጫ"
643
801
@@ -654,24 +812,24 @@ msgstr "እባክዎን እንደገና-ያስገቡ"
654msgid "Lock Screen Passcode"
812msgid "Lock Screen Passcode"
655msgstr "የ መመልከቻው መቆለፊያ የ ማለፊያ ኮድ"
813msgstr "የ መመልከቻው መቆለፊያ የ ማለፊያ ኮድ"
656
814
657−#: qml/Wizard/Pages/passcode-desktop.qml:56
815+#: qml/Wizard/Pages/passcode-desktop.qml:60
658msgid "Enter 4 numbers to setup your passcode"
816msgid "Enter 4 numbers to setup your passcode"
659msgstr "ያስገቡ 4 ቁጥሮች የ እርስዎን የ ማለፊያ ኮድ ለማሰናዳት"
817msgstr "ያስገቡ 4 ቁጥሮች የ እርስዎን የ ማለፊያ ኮድ ለማሰናዳት"
660
818
661−#: qml/Wizard/Pages/passcode-desktop.qml:65
819+#: qml/Wizard/Pages/passcode-desktop.qml:76
662#: qml/Wizard/Pages/passcode-set.qml:54
820#: qml/Wizard/Pages/passcode-set.qml:54
663msgid "Choose passcode"
821msgid "Choose passcode"
664msgstr "የ ማለፊያ ኮድ ይምረጡ"
822msgstr "የ ማለፊያ ኮድ ይምረጡ"
665
823
666−#: qml/Wizard/Pages/passcode-desktop.qml:105
824+#: qml/Wizard/Pages/passcode-desktop.qml:126
667msgid "Passcode too short"
825msgid "Passcode too short"
668msgstr "የ ማለፊያ ኮዱ በጣም አጭር ነው"
826msgstr "የ ማለፊያ ኮዱ በጣም አጭር ነው"
669
827
670−#: qml/Wizard/Pages/passcode-desktop.qml:107
828+#: qml/Wizard/Pages/passcode-desktop.qml:128
671msgid "Passcodes match"
829msgid "Passcodes match"
672msgstr "የ ማለፊያ ኮዶቹ ተመሳሳይ ናቸው"
830msgstr "የ ማለፊያ ኮዶቹ ተመሳሳይ ናቸው"
673
831
674−#: qml/Wizard/Pages/passcode-desktop.qml:109
832+#: qml/Wizard/Pages/passcode-desktop.qml:130
675msgid "Passcodes do not match"
833msgid "Passcodes do not match"
676msgstr "የ ማለፊያ ኮዶቹ አይመሳሰሉም"
834msgstr "የ ማለፊያ ኮዶቹ አይመሳሰሉም"
677
835
@@ -720,26 +878,30 @@ msgid "To proceed with no SIM tap Skip."
720msgstr "ያለ ሲም ለ መቀጠል መዝለያውን መታ ያድርጉ"
878msgstr "ያለ ሲም ለ መቀጠል መዝለያውን መታ ያድርጉ"
721
879
722#: qml/Wizard/PasswordMeter.qml:87
880#: qml/Wizard/PasswordMeter.qml:87
881+msgid "Password too short"
882+msgstr "የ መግቢያ ቃል በጣም አጭር ነው"
883+
884+#: qml/Wizard/PasswordMeter.qml:89
723msgid "Passwords match"
885msgid "Passwords match"
724msgstr "የ መግቢያ ቃሎቹ ተመሳሳይ ናቸው"
886msgstr "የ መግቢያ ቃሎቹ ተመሳሳይ ናቸው"
725
887
726−#: qml/Wizard/PasswordMeter.qml:89
888+#: qml/Wizard/PasswordMeter.qml:91
727msgid "Passwords do not match"
889msgid "Passwords do not match"
728msgstr "የ መግቢያ ቃሎቹ ተመሳሳይ አይደሉም"
890msgstr "የ መግቢያ ቃሎቹ ተመሳሳይ አይደሉም"
729
891
730−#: qml/Wizard/PasswordMeter.qml:93
892+#: qml/Wizard/PasswordMeter.qml:95
731msgid "Strong password"
893msgid "Strong password"
732msgstr "ጠንካራ የ መግቢያ ቃል"
894msgstr "ጠንካራ የ መግቢያ ቃል"
733
895
734−#: qml/Wizard/PasswordMeter.qml:95
896+#: qml/Wizard/PasswordMeter.qml:97
735msgid "Fair password"
897msgid "Fair password"
736msgstr "ደህና የ መግቢያ ቃል"
898msgstr "ደህና የ መግቢያ ቃል"
737
899
738−#: qml/Wizard/PasswordMeter.qml:97
900+#: qml/Wizard/PasswordMeter.qml:99
739msgid "Weak password"
901msgid "Weak password"
740msgstr "ደካማ የ መግቢያ ቃል"
902msgstr "ደካማ የ መግቢያ ቃል"
741
903
742−#: qml/Wizard/PasswordMeter.qml:99
904+#: qml/Wizard/PasswordMeter.qml:101
743msgid "Very weak password"
905msgid "Very weak password"
744msgstr "በጣም ደካማ የ መግቢያ ቃል"
906msgstr "በጣም ደካማ የ መግቢያ ቃል"
745
907
@@ -773,6 +935,12 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
773#~ msgid "Search"
935#~ msgid "Search"
774#~ msgstr "መፈለጊያ"
936#~ msgstr "መፈለጊያ"
775
937
938+#~ msgid "See less"
939+#~ msgstr "አነስተኛ መመልከቻ"
940+
941+#~ msgid "See all"
942+#~ msgstr "ሁሉንም መመልከቻ"
943+
776#~ msgid "Skip intro"
944#~ msgid "Skip intro"
777#~ msgstr "መግቢያውን መዝለያ"
945#~ msgstr "መግቢያውን መዝለያ"
778
946
@@ -982,6 +1150,9 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
982#~ msgid "View all your running tasks."
1150#~ msgid "View all your running tasks."
983#~ msgstr "እርስዎ የሚያስኬዱትን ተግባሮች በሙሉ መመልከቻ"
1151#~ msgstr "እርስዎ የሚያስኬዱትን ተግባሮች በሙሉ መመልከቻ"
984
1152
1153+#~ msgid "Tap to unlock"
1154+#~ msgstr "ለመክፈት መታ ያድርጉ"
1155+
985#~ msgctxt "Button: Shut down the system"
1156#~ msgctxt "Button: Shut down the system"
986#~ msgid "Shut down"
1157#~ msgid "Shut down"
987#~ msgstr "ማጥፊያ"
1158#~ msgstr "ማጥፊያ"
@@ -1051,11 +1222,32 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1051#~ msgid "Call back"
1222#~ msgid "Call back"
1052#~ msgstr "መልሶ መደወያ"
1223#~ msgstr "መልሶ መደወያ"
1053
1224
1054−#~ msgid "Welcome to your Ubuntu device."
1225+#~ msgid "Swipe up for recent calls"
1055−#~ msgstr "እንኳን ድህና መጡ ወደ ኡቡንቱ"
1226+#~ msgstr "ወደ ላይ ይጥረጉ ለ ቅርብ ጊዜ ጥሪዎች"
1227+
1228+#~ msgid "Swipe up for favorite calculations"
1229+#~ msgstr "ወደ ላይ ይጥረጉ የሚወዱትን ለማስላት"
1230+
1231+#~ msgid "Swipe up to manage the app"
1232+#~ msgstr "ወደ ላይ ይጥረጉ መተግበሪያ ለማስተዳደር"
1233+
1234+#~ msgid "Swipe up to create a message"
1235+#~ msgstr "ወደ ላይ ይጥረጉ መልእክት ለ መፍጠር"
1236+
1237+#~ msgid "Swipe up to add a contact"
1238+#~ msgstr "ወደ ላይ ይጥረጉ ግንኙነት ለ መጨመር"
1239+
1240+#~ msgid "Swipe from the top right edge to open the notification bar"
1241+#~ msgstr "ከ ላይ ቀኝ ጠርዝ በኩል ይጥረጉ የ ማስታወቂያ መደርደሪያ ለ መክፈት"
1242+
1243+#~ msgid "Swipe from the top edge to open the notification bar"
1244+#~ msgstr "ከ ላይ ጠርዝ በኩል ይጥረጉ የ ማስታወቂያ መደርደሪያ ለ መክፈት"
1245+
1246+#~ msgid "Short or long swipe from the right edge to view your open apps"
1247+#~ msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
1056
1248
1057−#~ msgid "Please select how you’d like to unlock your device."
1249+#~ msgid "Swipe from the left edge to open the launcher"
1058−#~ msgstr "እባክዎን የ እርስዎን አካል እንዴት እንደሚከፈት ይምረጡ"
1250+#~ msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
1059
1251
1060−#~ msgid "Your device is now ready to use."
1252+#~ msgid "Hover your mouse on the right edge to view your open apps"
1061−#~ msgstr "የ እርስዎ አካል አሁን ዝግጁ ነው"
1253+#~ msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
po/ar.po+299−128
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11"PO-Revision-Date: 2015-07-29 09:41+0000\n"
11"PO-Revision-Date: 2015-07-29 09:41+0000\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
13"Language-Team: Arabic <ar@li.org>\n"
13"Language-Team: Arabic <ar@li.org>\n"
@@ -16,41 +16,41 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
17"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
18"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
18"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 18147)\n"
21
21
22−#: plugins/IntegratedLightDM/Greeter.cpp:112
22+#: plugins/LightDM/Greeter.cpp:123
23msgid "Password: "
23msgid "Password: "
24msgstr "كلمة السر: "
24msgstr "كلمة السر: "
25
25
26−#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:49
27−#: plugins/Unity/Launcher/launcheritem.cpp:107
27+#: plugins/Unity/Launcher/launcheritem.cpp:108
28msgid "Pin shortcut"
28msgid "Pin shortcut"
29msgstr "تثبيت الاختصار"
29msgstr "تثبيت الاختصار"
30
30
31−#: plugins/Unity/Launcher/launcheritem.cpp:53
31+#: plugins/Unity/Launcher/launcheritem.cpp:54
32msgid "Quit"
32msgid "Quit"
33msgstr "خروج"
33msgstr "خروج"
34
34
35−#: plugins/Unity/Launcher/launcheritem.cpp:107
35+#: plugins/Unity/Launcher/launcheritem.cpp:108
36msgid "Unpin shortcut"
36msgid "Unpin shortcut"
37msgstr "إزالة تثبيت الاختصار"
37msgstr "إزالة تثبيت الاختصار"
38
38
39−#: qml/Components/DelayedLockscreen.qml:49
39+#: qml/Components/DelayedLockscreen.qml:50
40msgid "Device Locked"
40msgid "Device Locked"
41msgstr "الجهاز موصد"
41msgstr "الجهاز موصد"
42
42
43−#: qml/Components/DelayedLockscreen.qml:64
43+#: qml/Components/DelayedLockscreen.qml:65
44msgid "You have been locked out due to too many failed passphrase attempts."
44msgid "You have been locked out due to too many failed passphrase attempts."
45msgstr ""
45msgstr ""
46"لقد تم تأمين الجهاز ضد الفتح بسبب المحاولات العديدة الفاشلة للعبارة السرّية."
46"لقد تم تأمين الجهاز ضد الفتح بسبب المحاولات العديدة الفاشلة للعبارة السرّية."
47
47
48−#: qml/Components/DelayedLockscreen.qml:65
48+#: qml/Components/DelayedLockscreen.qml:66
49msgid "You have been locked out due to too many failed passcode attempts."
49msgid "You have been locked out due to too many failed passcode attempts."
50msgstr ""
50msgstr ""
51"لقد تم تأمين الجهاز ضد الفتح بسبب المحاولات العديدة الفاشلة للرمز السرّي."
51"لقد تم تأمين الجهاز ضد الفتح بسبب المحاولات العديدة الفاشلة للرمز السرّي."
52
52
53−#: qml/Components/DelayedLockscreen.qml:74
53+#: qml/Components/DelayedLockscreen.qml:75
54#, qt-format
54#, qt-format
55msgid "Please wait %1 minute and then try again…"
55msgid "Please wait %1 minute and then try again…"
56msgid_plural "Please wait %1 minutes and then try again…"
56msgid_plural "Please wait %1 minutes and then try again…"
@@ -80,8 +80,8 @@ msgctxt "Button: Log out from the system"
80msgid "Log Out"
80msgid "Log Out"
81msgstr "خروج"
81msgstr "خروج"
82
82
83−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
83+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
84−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
84+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
85#: qml/Wizard/Pages/passcode-set.qml:32
85#: qml/Wizard/Pages/passcode-set.qml:32
86msgid "Cancel"
86msgid "Cancel"
87msgstr "إلغاء"
87msgstr "إلغاء"
@@ -99,16 +99,16 @@ msgstr "هل أنت متأكد من رغبتك في إعادة تشغيل الج
99msgid "No"
99msgid "No"
100msgstr "لا"
100msgstr "لا"
101
101
102−#: qml/Components/Dialogs.qml:183
102+#: qml/Components/Dialogs.qml:182
103msgid "Yes"
103msgid "Yes"
104msgstr "نعم"
104msgstr "نعم"
105
105
106−#: qml/Components/Dialogs.qml:198
106+#: qml/Components/Dialogs.qml:197
107msgctxt "Title: Power off/Restart dialog"
107msgctxt "Title: Power off/Restart dialog"
108msgid "Power"
108msgid "Power"
109msgstr "الطاقة"
109msgstr "الطاقة"
110
110
111−#: qml/Components/Dialogs.qml:199
111+#: qml/Components/Dialogs.qml:198
112msgid ""
112msgid ""
113"Are you sure you would like\n"
113"Are you sure you would like\n"
114"to power off?"
114"to power off?"
@@ -116,28 +116,198 @@ msgstr ""
116"هل أنت متأكد من رغبتك\n"
116"هل أنت متأكد من رغبتك\n"
117"في إيقاف التشغيل؟"
117"في إيقاف التشغيل؟"
118
118
119−#: qml/Components/Dialogs.qml:201
119+#: qml/Components/Dialogs.qml:200
120msgctxt "Button: Power off the system"
120msgctxt "Button: Power off the system"
121msgid "Power off"
121msgid "Power off"
122msgstr "إيقاف التشغيل"
122msgstr "إيقاف التشغيل"
123
123
124−#: qml/Components/Dialogs.qml:210
124+#: qml/Components/Dialogs.qml:209
125msgctxt "Button: Restart the system"
125msgctxt "Button: Restart the system"
126msgid "Restart"
126msgid "Restart"
127msgstr "إعادة التشغيل"
127msgstr "إعادة التشغيل"
128
128
129+#: qml/Components/KeyboardShortcutsOverlay.qml:41
130+msgid "Keyboard Shortcuts"
131+msgstr ""
132+
133+#: qml/Components/KeyboardShortcutsOverlay.qml:55
134+msgid "Unity 8"
135+msgstr ""
136+
137+#: qml/Components/KeyboardShortcutsOverlay.qml:62
138+msgid "PrtScr"
139+msgstr ""
140+
141+#: qml/Components/KeyboardShortcutsOverlay.qml:67
142+msgid "Takes a screenshot."
143+msgstr ""
144+
145+#: qml/Components/KeyboardShortcutsOverlay.qml:75
146+msgid "Alt + PrtScr"
147+msgstr ""
148+
149+#: qml/Components/KeyboardShortcutsOverlay.qml:80
150+msgid "Takes a screenshot of a window."
151+msgstr ""
152+
153+#: qml/Components/KeyboardShortcutsOverlay.qml:88
154+msgid "Super + Space"
155+msgstr ""
156+
157+#: qml/Components/KeyboardShortcutsOverlay.qml:93
158+msgid "Switches to next keyboard layout."
159+msgstr ""
160+
161+#: qml/Components/KeyboardShortcutsOverlay.qml:101
162+msgid "Super + Shift + Space"
163+msgstr ""
164+
165+#: qml/Components/KeyboardShortcutsOverlay.qml:106
166+msgid "Switches to previous keyboard layout."
167+msgstr ""
168+
169+#: qml/Components/KeyboardShortcutsOverlay.qml:118
170+msgid "Launcher"
171+msgstr ""
172+
173+#: qml/Components/KeyboardShortcutsOverlay.qml:125
174+msgid "Super (Hold)"
175+msgstr ""
176+
177+#: qml/Components/KeyboardShortcutsOverlay.qml:130
178+msgid "Opens the launcher, displays shortcuts."
179+msgstr ""
180+
181+#: qml/Components/KeyboardShortcutsOverlay.qml:138
182+msgid "Alt + F1"
183+msgstr ""
184+
185+#: qml/Components/KeyboardShortcutsOverlay.qml:143
186+msgid "Opens launcher keyboard navigation mode."
187+msgstr ""
188+
189+#: qml/Components/KeyboardShortcutsOverlay.qml:151
190+msgid "Super + Tab"
191+msgstr ""
192+
193+#: qml/Components/KeyboardShortcutsOverlay.qml:156
194+msgid "Switches applications via the launcher."
195+msgstr ""
196+
197+#: qml/Components/KeyboardShortcutsOverlay.qml:164
198+msgid "Super + 0 to 9"
199+msgstr ""
200+
201+#: qml/Components/KeyboardShortcutsOverlay.qml:169
202+msgid "Same as clicking on a launcher icon."
203+msgstr ""
204+
205+#: qml/Components/KeyboardShortcutsOverlay.qml:181
206+msgid "Scopes"
207+msgstr ""
208+
209+#: qml/Components/KeyboardShortcutsOverlay.qml:188
210+msgid "Super (Tap)"
211+msgstr ""
212+
213+#: qml/Components/KeyboardShortcutsOverlay.qml:193
214+msgid "Opens the Scopes home."
215+msgstr ""
216+
217+#: qml/Components/KeyboardShortcutsOverlay.qml:209
218+msgid "Switching"
219+msgstr ""
220+
221+#: qml/Components/KeyboardShortcutsOverlay.qml:216
222+msgid "Alt + Tab"
223+msgstr ""
224+
225+#: qml/Components/KeyboardShortcutsOverlay.qml:221
226+msgid "Switches between applications."
227+msgstr ""
228+
229+#: qml/Components/KeyboardShortcutsOverlay.qml:229
230+msgid "Super + W"
231+msgstr ""
232+
233+#: qml/Components/KeyboardShortcutsOverlay.qml:234
234+msgid "Opens the desktop spread."
235+msgstr ""
236+
237+#: qml/Components/KeyboardShortcutsOverlay.qml:242
238+msgid "Cursor Left or Right"
239+msgstr ""
240+
241+#: qml/Components/KeyboardShortcutsOverlay.qml:247
242+msgid "Moves the focus."
243+msgstr ""
244+
245+#: qml/Components/KeyboardShortcutsOverlay.qml:259
246+msgid "Windows"
247+msgstr ""
248+
249+#: qml/Components/KeyboardShortcutsOverlay.qml:266
250+msgid "Ctrl + Super + D"
251+msgstr ""
252+
253+#: qml/Components/KeyboardShortcutsOverlay.qml:271
254+msgid "Minimizes all windows."
255+msgstr ""
256+
257+#: qml/Components/KeyboardShortcutsOverlay.qml:279
258+msgid "Ctrl + Super + Up"
259+msgstr ""
260+
261+#: qml/Components/KeyboardShortcutsOverlay.qml:284
262+msgid "Maximizes the current window."
263+msgstr ""
264+
265+#: qml/Components/KeyboardShortcutsOverlay.qml:292
266+msgid "Ctrl + Super + Down"
267+msgstr ""
268+
269+#: qml/Components/KeyboardShortcutsOverlay.qml:297
270+msgid "Minimizes or restores the current window."
271+msgstr ""
272+
273+#: qml/Components/KeyboardShortcutsOverlay.qml:305
274+msgid "Ctrl + Super + Left or Right"
275+msgstr ""
276+
277+#: qml/Components/KeyboardShortcutsOverlay.qml:310
278+msgid "Semi-maximizes the current window."
279+msgstr ""
280+
281+#: qml/Components/KeyboardShortcutsOverlay.qml:318
282+msgid "Alt + F4"
283+msgstr ""
284+
285+#: qml/Components/KeyboardShortcutsOverlay.qml:323
286+msgid "Closes the current window."
287+msgstr ""
288+
129−#: qml/Components/Lockscreen.qml:231
289+#: qml/Components/Lockscreen.qml:239
130msgid "Return to Call"
290msgid "Return to Call"
131msgstr "العودة إلى المكالمة"
291msgstr "العودة إلى المكالمة"
132
292
133−#: qml/Components/Lockscreen.qml:231
293+#: qml/Components/Lockscreen.qml:239
134msgid "Emergency Call"
294msgid "Emergency Call"
135msgstr "مكالمة طوارئ"
295msgstr "مكالمة طوارئ"
136
296
137−#: qml/Components/Lockscreen.qml:263
297+#: qml/Components/Lockscreen.qml:271
138msgid "OK"
298msgid "OK"
139msgstr "موافق"
299msgstr "موافق"
140
300
301+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
302+#, qt-format
303+msgid "%1:%2:%3"
304+msgstr ""
305+
306+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
307+#, qt-format
308+msgid "%1:%2"
309+msgstr ""
310+
141#: qml/Components/ModeSwitchWarningDialog.qml:32
311#: qml/Components/ModeSwitchWarningDialog.qml:32
142msgid "Apps may have unsaved data:"
312msgid "Apps may have unsaved data:"
143msgstr ""
313msgstr ""
@@ -164,26 +334,30 @@ msgstr ""
164msgid "Close all"
334msgid "Close all"
165msgstr ""
335msgstr ""
166
336
337+#: qml/Components/SharingPicker.qml:54
338+msgid "Preview Share Item"
339+msgstr ""
340+
167−#: qml/Dash/DashPageHeader.qml:337
341+#: qml/Dash/DashPageHeader.qml:333
168msgctxt "Button: Open the Ubuntu Store"
342msgctxt "Button: Open the Ubuntu Store"
169msgid "Store"
343msgid "Store"
170msgstr "المتجر"
344msgstr "المتجر"
171
345
172−#: qml/Dash/DashPageHeader.qml:344
346+#: qml/Dash/DashPageHeader.qml:340
173msgctxt "Button: Start a search in the current dash scope"
347msgctxt "Button: Start a search in the current dash scope"
174msgid "Search"
348msgid "Search"
175msgstr "بحث"
349msgstr "بحث"
176
350
177−#: qml/Dash/DashPageHeader.qml:354
351+#: qml/Dash/DashPageHeader.qml:350
178msgctxt "Button: Show the current dash scope settings"
352msgctxt "Button: Show the current dash scope settings"
179msgid "Settings"
353msgid "Settings"
180msgstr "الإعدادات"
354msgstr "الإعدادات"
181
355
182−#: qml/Dash/DashPageHeader.qml:361
356+#: qml/Dash/DashPageHeader.qml:357
183msgid "Remove from Favorites"
357msgid "Remove from Favorites"
184msgstr "حذف من المفضلات"
358msgstr "حذف من المفضلات"
185
359
186−#: qml/Dash/DashPageHeader.qml:361
360+#: qml/Dash/DashPageHeader.qml:357
187msgid "Add to Favorites"
361msgid "Add to Favorites"
188msgstr "إضافة إلى المفضلات"
362msgstr "إضافة إلى المفضلات"
189
363
@@ -195,24 +369,24 @@ msgstr ""
195msgid "Reset"
369msgid "Reset"
196msgstr ""
370msgstr ""
197
371
198−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
372+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
199−msgid "See less"
373+msgid "Show less"
200−msgstr "شاهد أقل"
374+msgstr ""
201
375
202−#: qml/Dash/GenericScopeView.qml:570
376+#: qml/Dash/GenericScopeView.qml:580
203−msgid "See all"
377+msgid "Show all"
204−msgstr "عرض الكل"
378+msgstr ""
205
379
206−#: qml/Dash/GenericScopeView.qml:627
380+#: qml/Dash/GenericScopeView.qml:637
207msgctxt "Label: Hint for dash search line edit"
381msgctxt "Label: Hint for dash search line edit"
208msgid "Search"
382msgid "Search"
209msgstr "بحث"
383msgstr "بحث"
210
384
211−#: qml/Dash/PageHeaderExtraPanel.qml:55
385+#: qml/Dash/PageHeaderExtraPanel.qml:56
212msgid "Recent Searches"
386msgid "Recent Searches"
213msgstr ""
387msgstr ""
214
388
215−#: qml/Dash/PageHeaderExtraPanel.qml:66
389+#: qml/Dash/PageHeaderExtraPanel.qml:67
216msgid "Clear All"
390msgid "Clear All"
217msgstr ""
391msgstr ""
218
392
@@ -225,22 +399,18 @@ msgid "Less..."
225msgstr "أقل..."
399msgstr "أقل..."
226
400
227#: qml/Dash/Previews/PreviewCommentInput.qml:68
401#: qml/Dash/Previews/PreviewCommentInput.qml:68
228−#: qml/Dash/Previews/PreviewRatingInput.qml:174
402+#: qml/Dash/Previews/PreviewRatingInput.qml:175
229msgid "Send"
403msgid "Send"
230msgstr "أرسل"
404msgstr "أرسل"
231
405
232−#: qml/Dash/Previews/PreviewRatingInput.qml:84
406+#: qml/Dash/Previews/PreviewRatingInput.qml:82
233msgid "Rate this"
407msgid "Rate this"
234msgstr "قيّم ذلك"
408msgstr "قيّم ذلك"
235
409
236−#: qml/Dash/Previews/PreviewRatingInput.qml:129
410+#: qml/Dash/Previews/PreviewRatingInput.qml:157
237msgid "Add a review"
411msgid "Add a review"
238msgstr "أضف تعليق"
412msgstr "أضف تعليق"
239
413
240−#: qml/Dash/Previews/PreviewSharing.qml:66
241−msgid "Preview Share Item"
242−msgstr ""
243−
244#: qml/Dash/PullToRefreshScopeStyle.qml:55
414#: qml/Dash/PullToRefreshScopeStyle.qml:55
245msgid "Pull to refresh…"
415msgid "Pull to refresh…"
246msgstr "اسحب للتحديث..."
416msgstr "اسحب للتحديث..."
@@ -253,49 +423,61 @@ msgstr "حرّر للتحديث..."
253msgid "Enable location data"
423msgid "Enable location data"
254msgstr "تفعيل بيانات الموقع"
424msgstr "تفعيل بيانات الموقع"
255
425
256−#: qml/Dash/ScopesList.qml:67
426+#: qml/Dash/ScopesList.qml:55
257msgid "Manage"
427msgid "Manage"
258msgstr "إدارة"
428msgstr "إدارة"
259
429
260−#: qml/Dash/ScopesList.qml:113
430+#: qml/Dash/ScopesList.qml:102
261msgid "Home"
431msgid "Home"
262msgstr "الرئيسية"
432msgstr "الرئيسية"
263
433
264−#: qml/Dash/ScopesList.qml:114
434+#: qml/Dash/ScopesList.qml:103
265msgid "Also installed"
435msgid "Also installed"
266msgstr "أيضا تم تثبيت"
436msgstr "أيضا تم تثبيت"
267
437
268−#: qml/DisabledScreenNotice.qml:104
438+#: qml/DisabledScreenNotice.qml:109
269msgid ""
439msgid ""
270"Your device is now connected to an external display. Use this screen as a "
440"Your device is now connected to an external display. Use this screen as a "
271"touch pad to interact with the pointer."
441"touch pad to interact with the pointer."
272msgstr ""
442msgstr ""
273
443
274−#: qml/Greeter/CoverPage.qml:118
444+#: qml/Greeter/CoverPage.qml:127
275msgid "Unlock"
445msgid "Unlock"
276msgstr "فك القفل"
446msgstr "فك القفل"
277
447
448+#: qml/Greeter/Greeter.qml:555
449+msgid "Try again"
450+msgstr ""
451+
278−#: qml/Greeter/LoginList.qml:239
452+#: qml/Greeter/LoginList.qml:63
453+msgid "Passphrase"
454+msgstr ""
455+
456+#: qml/Greeter/LoginList.qml:64
457+msgid "Passcode"
458+msgstr ""
459+
460+#: qml/Greeter/LoginList.qml:87
279msgid "Retry"
461msgid "Retry"
280msgstr "إعادة المحاولة"
462msgstr "إعادة المحاولة"
281
463
282−#: qml/Greeter/LoginList.qml:240
464+#: qml/Greeter/LoginList.qml:88
283−msgid "Tap to unlock"
465+msgid "Log In"
284−msgstr "انقر لفك القفل"
466+msgstr ""
285
467
286−#: qml/Greeter/NarrowView.qml:54
468+#: qml/Greeter/NarrowView.qml:55
287msgid "Sorry, incorrect passphrase."
469msgid "Sorry, incorrect passphrase."
288msgstr "عذرًا، عبارة سرّية خاطئة."
470msgstr "عذرًا، عبارة سرّية خاطئة."
289
471
290−#: qml/Greeter/NarrowView.qml:55
472+#: qml/Greeter/NarrowView.qml:56
291msgid "Sorry, incorrect passcode."
473msgid "Sorry, incorrect passcode."
292msgstr "عذرًا، رمز سرّي خاطيء."
474msgstr "عذرًا، رمز سرّي خاطيء."
293
475
294−#: qml/Greeter/NarrowView.qml:56
476+#: qml/Greeter/NarrowView.qml:57
295msgid "This will be your last attempt."
477msgid "This will be your last attempt."
296msgstr "هذه ستكون المحاولة الأخيرة لك."
478msgstr "هذه ستكون المحاولة الأخيرة لك."
297
479
298−#: qml/Greeter/NarrowView.qml:58
480+#: qml/Greeter/NarrowView.qml:59
299msgid ""
481msgid ""
300"If passphrase is entered incorrectly, your phone will conduct a factory "
482"If passphrase is entered incorrectly, your phone will conduct a factory "
301"reset and all personal data will be deleted."
483"reset and all personal data will be deleted."
@@ -303,7 +485,7 @@ msgstr ""
303"إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
485"إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
304"المصنع وسيتم حذف كافة البيانات الشخصية."
486"المصنع وسيتم حذف كافة البيانات الشخصية."
305
487
306−#: qml/Greeter/NarrowView.qml:59
488+#: qml/Greeter/NarrowView.qml:60
307msgid ""
489msgid ""
308"If passcode is entered incorrectly, your phone will conduct a factory reset "
490"If passcode is entered incorrectly, your phone will conduct a factory reset "
309"and all personal data will be deleted."
491"and all personal data will be deleted."
@@ -311,38 +493,38 @@ msgstr ""
311"إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
493"إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
312"المصنع وسيتم حذف كافة البيانات الشخصية."
494"المصنع وسيتم حذف كافة البيانات الشخصية."
313
495
314−#: qml/Greeter/NarrowView.qml:116
496+#: qml/Greeter/NarrowView.qml:129
315#, qt-format
497#, qt-format
316msgid "Enter %1"
498msgid "Enter %1"
317msgstr "أدخِل %1"
499msgstr "أدخِل %1"
318
500
319−#: qml/Greeter/NarrowView.qml:117
501+#: qml/Greeter/NarrowView.qml:130
320msgid "Enter passphrase"
502msgid "Enter passphrase"
321msgstr "أدخِل العبارة السرية"
503msgstr "أدخِل العبارة السرية"
322
504
323−#: qml/Greeter/NarrowView.qml:118
505+#: qml/Greeter/NarrowView.qml:131
324msgid "Enter passcode"
506msgid "Enter passcode"
325msgstr "أدخِل الرمز السرّي"
507msgstr "أدخِل الرمز السرّي"
326
508
327−#: qml/Greeter/NarrowView.qml:119
509+#: qml/Greeter/NarrowView.qml:135
328#, qt-format
510#, qt-format
329msgid "Sorry, incorrect %1"
511msgid "Sorry, incorrect %1"
330msgstr "نأسف، %1 غير صحيحية"
512msgstr "نأسف، %1 غير صحيحية"
331
513
332−#: qml/Greeter/NarrowView.qml:120
514+#: qml/Greeter/NarrowView.qml:136
333msgid "Sorry, incorrect passphrase"
515msgid "Sorry, incorrect passphrase"
334msgstr "نأسف، عبارة السّر غير صحيحية"
516msgstr "نأسف، عبارة السّر غير صحيحية"
335
517
336−#: qml/Greeter/NarrowView.qml:121
518+#: qml/Greeter/NarrowView.qml:137
337msgctxt "passphrase"
519msgctxt "passphrase"
338msgid "Please re-enter"
520msgid "Please re-enter"
339msgstr "برجاء إعادة إدخالها"
521msgstr "برجاء إعادة إدخالها"
340
522
341−#: qml/Greeter/NarrowView.qml:122
523+#: qml/Greeter/NarrowView.qml:138
342msgid "Sorry, incorrect passcode"
524msgid "Sorry, incorrect passcode"
343msgstr "نأسف، الرمز السري غير صحيح"
525msgstr "نأسف، الرمز السري غير صحيح"
344
526
345−#: qml/Notifications/NotificationMenuItemFactory.qml:129
527+#: qml/Notifications/NotificationMenuItemFactory.qml:124
346msgid "Show password"
528msgid "Show password"
347msgstr "عرض كلمة السر"
529msgstr "عرض كلمة السر"
348
530
@@ -354,11 +536,11 @@ msgstr "انقر للعودة إلى المكالمة..."
354msgid "Conference"
536msgid "Conference"
355msgstr "مؤتمر"
537msgstr "مؤتمر"
356
538
357−#: qml/Panel/Indicators/MenuItemFactory.qml:761
539+#: qml/Panel/Indicators/MenuItemFactory.qml:762
358msgid "Nothing is playing"
540msgid "Nothing is playing"
359msgstr "لا شيء مُشغّل"
541msgstr "لا شيء مُشغّل"
360
542
361−#: qml/Panel/Indicators/MenuItemFactory.qml:890
543+#: qml/Panel/Indicators/MenuItemFactory.qml:891
362#, qt-format
544#, qt-format
363msgid "%1 hour"
545msgid "%1 hour"
364msgid_plural "%1 hours"
546msgid_plural "%1 hours"
@@ -369,7 +551,7 @@ msgstr[3] "%1 ساعات"
369msgstr[4] "%1 ساعة"
551msgstr[4] "%1 ساعة"
370msgstr[5] "%1 ساعة"
552msgstr[5] "%1 ساعة"
371
553
372−#: qml/Panel/Indicators/MenuItemFactory.qml:894
554+#: qml/Panel/Indicators/MenuItemFactory.qml:895
373#, qt-format
555#, qt-format
374msgid "%1 minute"
556msgid "%1 minute"
375msgid_plural "%1 minutes"
557msgid_plural "%1 minutes"
@@ -380,7 +562,7 @@ msgstr[3] "%1 دقائق"
380msgstr[4] "%1 دقيقة"
562msgstr[4] "%1 دقيقة"
381msgstr[5] "%1 دقيقة"
563msgstr[5] "%1 دقيقة"
382
564
383−#: qml/Panel/Indicators/MenuItemFactory.qml:899
565+#: qml/Panel/Indicators/MenuItemFactory.qml:900
384#, qt-format
566#, qt-format
385msgid "%1 second"
567msgid "%1 second"
386msgid_plural "%1 seconds"
568msgid_plural "%1 seconds"
@@ -391,52 +573,52 @@ msgstr[3] "%1 ثوان"
391msgstr[4] "%1 ثانية"
573msgstr[4] "%1 ثانية"
392msgstr[5] "%1 ثانية"
574msgstr[5] "%1 ثانية"
393
575
394−#: qml/Panel/Indicators/MenuItemFactory.qml:902
576+#: qml/Panel/Indicators/MenuItemFactory.qml:903
395msgid "0 seconds"
577msgid "0 seconds"
396msgstr "أقل من ثانية"
578msgstr "أقل من ثانية"
397
579
398#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
580#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
399−#: qml/Panel/Indicators/MenuItemFactory.qml:904
581+#: qml/Panel/Indicators/MenuItemFactory.qml:905
400#, qt-format
582#, qt-format
401msgid "%1 remaining"
583msgid "%1 remaining"
402msgstr "باق %1"
584msgstr "باق %1"
403
585
404−#: qml/Panel/Indicators/MenuItemFactory.qml:910
586+#: qml/Panel/Indicators/MenuItemFactory.qml:911
405msgid "In queue…"
587msgid "In queue…"
406msgstr "في الانتظار..."
588msgstr "في الانتظار..."
407
589
408−#: qml/Panel/Indicators/MenuItemFactory.qml:914
590+#: qml/Panel/Indicators/MenuItemFactory.qml:915
409msgid "Downloading"
591msgid "Downloading"
410msgstr "التنزيل"
592msgstr "التنزيل"
411
593
412−#: qml/Panel/Indicators/MenuItemFactory.qml:916
594+#: qml/Panel/Indicators/MenuItemFactory.qml:917
413msgid "Paused, tap to resume"
595msgid "Paused, tap to resume"
414msgstr "مُلبث، انقر للاستئناف"
596msgstr "مُلبث، انقر للاستئناف"
415
597
416−#: qml/Panel/Indicators/MenuItemFactory.qml:918
598+#: qml/Panel/Indicators/MenuItemFactory.qml:919
417msgid "Canceled"
599msgid "Canceled"
418msgstr "تم إلغائه"
600msgstr "تم إلغائه"
419
601
420−#: qml/Panel/Indicators/MenuItemFactory.qml:920
602+#: qml/Panel/Indicators/MenuItemFactory.qml:921
421msgid "Finished"
603msgid "Finished"
422msgstr "انتهى"
604msgstr "انتهى"
423
605
424−#: qml/Panel/Indicators/MenuItemFactory.qml:922
606+#: qml/Panel/Indicators/MenuItemFactory.qml:923
425msgid "Failed, tap to retry"
607msgid "Failed, tap to retry"
426msgstr "فشل، انقل لإعادة المحاولة"
608msgstr "فشل، انقل لإعادة المحاولة"
427
609
428−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
610+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
429−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
611+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
430msgctxt "Button: Send a reply message"
612msgctxt "Button: Send a reply message"
431msgid "Send"
613msgid "Send"
432msgstr ""
614msgstr ""
433
615
434−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
616+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
435msgctxt "Label: Hint in message indicator line edit"
617msgctxt "Label: Hint in message indicator line edit"
436msgid "Reply"
618msgid "Reply"
437msgstr "رد"
619msgstr "رد"
438
620
439−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
621+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
440msgctxt "Button: Call back on phone"
622msgctxt "Button: Call back on phone"
441msgid "Call back"
623msgid "Call back"
442msgstr ""
624msgstr ""
@@ -445,48 +627,24 @@ msgstr ""
445msgid "Drag using 3 fingers any application from one window to the other"
627msgid "Drag using 3 fingers any application from one window to the other"
446msgstr ""
628msgstr ""
447
629
448−#: qml/Tutorial/TutorialBottom.qml:78
449−msgid "Swipe up to add a contact"
450−msgstr ""
451−
452−#: qml/Tutorial/TutorialBottom.qml:80
453−msgid "Swipe up for favorite calculations"
454−msgstr ""
455−
456−#: qml/Tutorial/TutorialBottom.qml:82
457−msgid "Swipe up for recent calls"
458−msgstr ""
459−
460−#: qml/Tutorial/TutorialBottom.qml:84
461−msgid "Swipe up to create a message"
462−msgstr ""
463−
464−#: qml/Tutorial/TutorialBottom.qml:85
465−msgid "Swipe up to manage the app"
466−msgstr ""
467−
468−#: qml/Tutorial/TutorialLeft.qml:47
469−msgid "Swipe from the left edge to open the launcher"
470−msgstr ""
471−
472−#: qml/Tutorial/TutorialLeftLong.qml:47
630+#: qml/Tutorial/TutorialLeftLong.qml:49
473msgid "Long swipe from the left edge to open the Today scope"
631msgid "Long swipe from the left edge to open the Today scope"
474msgstr ""
632msgstr ""
475
633
476−#: qml/Tutorial/TutorialRight.qml:54
634+#: qml/Tutorial/TutorialLeft.qml:47
477−msgid "Hover your mouse on the right edge to view your open apps"
635+msgid "Short swipe from the left edge to open the launcher"
478msgstr ""
636msgstr ""
479
637
480#: qml/Tutorial/TutorialRight.qml:55
638#: qml/Tutorial/TutorialRight.qml:55
481−msgid "Short or long swipe from the right edge to view your open apps"
639+msgid "Push your mouse against the right edge to view your open apps"
482msgstr ""
640msgstr ""
483
641
484−#: qml/Tutorial/TutorialTop.qml:53
642+#: qml/Tutorial/TutorialRight.qml:56
485−msgid "Swipe from the top right edge to open the notification bar"
643+msgid "Swipe from the right edge to view your open apps"
486msgstr ""
644msgstr ""
487
645
488−#: qml/Tutorial/TutorialTop.qml:54
646+#: qml/Tutorial/TutorialTop.qml:53
489−msgid "Swipe from the top edge to open the notification bar"
647+msgid "Swipe from the top edge to access notifications and quick settings"
490msgstr ""
648msgstr ""
491
649
492#: qml/Wizard/Page.qml:54
650#: qml/Wizard/Page.qml:54
@@ -498,11 +656,11 @@ msgstr "عودة"
498msgid "Language"
656msgid "Language"
499msgstr ""
657msgstr ""
500
658
501−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
659+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
502−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
660+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
503#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
661#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
504#: qml/Wizard/Pages/75-report-check.qml:84
662#: qml/Wizard/Pages/75-report-check.qml:84
505−#: qml/Wizard/Pages/passcode-desktop.qml:124
663+#: qml/Wizard/Pages/passcode-desktop.qml:141
506#: qml/Wizard/Pages/password-set.qml:141
664#: qml/Wizard/Pages/password-set.qml:141
507msgid "Next"
665msgid "Next"
508msgstr ""
666msgstr ""
@@ -564,7 +722,7 @@ msgstr ""
564msgid "Time Zone"
722msgid "Time Zone"
565msgstr ""
723msgstr ""
566
724
567−#: qml/Wizard/Pages/50-timezone.qml:178
725+#: qml/Wizard/Pages/50-timezone.qml:181
568msgid "Enter your city"
726msgid "Enter your city"
569msgstr ""
727msgstr ""
570
728
@@ -654,7 +812,7 @@ msgid "Service Terms"
654msgstr ""
812msgstr ""
655
813
656#: qml/Wizard/Pages/passcode-confirm.qml:43
814#: qml/Wizard/Pages/passcode-confirm.qml:43
657−#: qml/Wizard/Pages/passcode-desktop.qml:80
815+#: qml/Wizard/Pages/passcode-desktop.qml:96
658msgid "Confirm passcode"
816msgid "Confirm passcode"
659msgstr "تأكيد الرمز السري"
817msgstr "تأكيد الرمز السري"
660
818
@@ -671,24 +829,24 @@ msgstr ""
671msgid "Lock Screen Passcode"
829msgid "Lock Screen Passcode"
672msgstr ""
830msgstr ""
673
831
674−#: qml/Wizard/Pages/passcode-desktop.qml:56
832+#: qml/Wizard/Pages/passcode-desktop.qml:60
675msgid "Enter 4 numbers to setup your passcode"
833msgid "Enter 4 numbers to setup your passcode"
676msgstr ""
834msgstr ""
677
835
678−#: qml/Wizard/Pages/passcode-desktop.qml:65
836+#: qml/Wizard/Pages/passcode-desktop.qml:76
679#: qml/Wizard/Pages/passcode-set.qml:54
837#: qml/Wizard/Pages/passcode-set.qml:54
680msgid "Choose passcode"
838msgid "Choose passcode"
681msgstr ""
839msgstr ""
682
840
683−#: qml/Wizard/Pages/passcode-desktop.qml:105
841+#: qml/Wizard/Pages/passcode-desktop.qml:126
684msgid "Passcode too short"
842msgid "Passcode too short"
685msgstr ""
843msgstr ""
686
844
687−#: qml/Wizard/Pages/passcode-desktop.qml:107
845+#: qml/Wizard/Pages/passcode-desktop.qml:128
688msgid "Passcodes match"
846msgid "Passcodes match"
689msgstr ""
847msgstr ""
690
848
691−#: qml/Wizard/Pages/passcode-desktop.qml:109
849+#: qml/Wizard/Pages/passcode-desktop.qml:130
692msgid "Passcodes do not match"
850msgid "Passcodes do not match"
693msgstr ""
851msgstr ""
694
852
@@ -737,26 +895,30 @@ msgid "To proceed with no SIM tap Skip."
737msgstr ""
895msgstr ""
738
896
739#: qml/Wizard/PasswordMeter.qml:87
897#: qml/Wizard/PasswordMeter.qml:87
740−msgid "Passwords match"
898+msgid "Password too short"
741msgstr ""
899msgstr ""
742
900
743#: qml/Wizard/PasswordMeter.qml:89
901#: qml/Wizard/PasswordMeter.qml:89
902+msgid "Passwords match"
903+msgstr ""
904+
905+#: qml/Wizard/PasswordMeter.qml:91
744msgid "Passwords do not match"
906msgid "Passwords do not match"
745msgstr ""
907msgstr ""
746
908
747−#: qml/Wizard/PasswordMeter.qml:93
909+#: qml/Wizard/PasswordMeter.qml:95
748msgid "Strong password"
910msgid "Strong password"
749msgstr ""
911msgstr ""
750
912
751−#: qml/Wizard/PasswordMeter.qml:95
913+#: qml/Wizard/PasswordMeter.qml:97
752msgid "Fair password"
914msgid "Fair password"
753msgstr ""
915msgstr ""
754
916
755−#: qml/Wizard/PasswordMeter.qml:97
917+#: qml/Wizard/PasswordMeter.qml:99
756msgid "Weak password"
918msgid "Weak password"
757msgstr ""
919msgstr ""
758
920
759−#: qml/Wizard/PasswordMeter.qml:99
921+#: qml/Wizard/PasswordMeter.qml:101
760msgid "Very weak password"
922msgid "Very weak password"
761msgstr ""
923msgstr ""
762
924
@@ -809,6 +971,9 @@ msgstr ""
809#~ msgid "Well done"
971#~ msgid "Well done"
810#~ msgstr "أحسنت!"
972#~ msgstr "أحسنت!"
811
973
974+#~ msgid "See less"
975+#~ msgstr "شاهد أقل"
976+
812#~ msgid ""
977#~ msgid ""
813#~ "You have now mastered the edge gestures and can start using the "
978#~ "You have now mastered the edge gestures and can start using the "
814#~ "phone<br><br>Tap on the screen to start"
979#~ "phone<br><br>Tap on the screen to start"
@@ -861,6 +1026,12 @@ msgstr ""
861#~ msgid "Reboot"
1026#~ msgid "Reboot"
862#~ msgstr "إعادة التشغيل"
1027#~ msgstr "إعادة التشغيل"
863
1028
1029+#~ msgid "See all"
1030+#~ msgstr "عرض الكل"
1031+
1032+#~ msgid "Tap to unlock"
1033+#~ msgstr "انقر لفك القفل"
1034+
864#~ msgid "Please re-enter"
1035#~ msgid "Please re-enter"
865#~ msgstr "برجاء إعادة إدخالها"
1036#~ msgstr "برجاء إعادة إدخالها"
866
1037
po/ast.po+369−172
@@ -7,48 +7,48 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11−"PO-Revision-Date: 2016-03-12 00:17+0000\n"
11+"PO-Revision-Date: 2016-05-16 14:07+0000\n"
12−"Last-Translator: enolp <enolp@softastur.org>\n"
12+"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
13"Language-Team: Asturian <ast@li.org>\n"
13"Language-Team: Asturian <ast@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 18147)\n"
20
20
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
22msgid "Password: "
22msgid "Password: "
23msgstr "Contraseña: "
23msgstr "Contraseña: "
24
24
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
27msgid "Pin shortcut"
27msgid "Pin shortcut"
28msgstr "Anclar atayu"
28msgstr "Anclar atayu"
29
29
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
31msgid "Quit"
31msgid "Quit"
32msgstr "Colar"
32msgstr "Colar"
33
33
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
35msgid "Unpin shortcut"
35msgid "Unpin shortcut"
36msgstr "Desanclar atayu"
36msgstr "Desanclar atayu"
37
37
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
39msgid "Device Locked"
39msgid "Device Locked"
40msgstr "Preséu bloquiáu"
40msgstr "Preséu bloquiáu"
41
41
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
43msgid "You have been locked out due to too many failed passphrase attempts."
43msgid "You have been locked out due to too many failed passphrase attempts."
44msgstr "Quedasti bloquiáu polos escesivos intentos fallíos de fras de pasu."
44msgstr "Quedasti bloquiáu polos escesivos intentos fallíos de fras de pasu."
45
45
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
47msgid "You have been locked out due to too many failed passcode attempts."
47msgid "You have been locked out due to too many failed passcode attempts."
48msgstr ""
48msgstr ""
49"Quedasti bloquiáu polos escesivos intentos fallíos de códigu de pasu."
49"Quedasti bloquiáu polos escesivos intentos fallíos de códigu de pasu."
50
50
51−#: qml/Components/DelayedLockscreen.qml:74
51+#: qml/Components/DelayedLockscreen.qml:75
52#, qt-format
52#, qt-format
53msgid "Please wait %1 minute and then try again…"
53msgid "Please wait %1 minute and then try again…"
54msgid_plural "Please wait %1 minutes and then try again…"
54msgid_plural "Please wait %1 minutes and then try again…"
@@ -74,8 +74,8 @@ msgctxt "Button: Log out from the system"
74msgid "Log Out"
74msgid "Log Out"
75msgstr "Zarrar sesión"
75msgstr "Zarrar sesión"
76
76
77−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
77+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
78−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
78+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
79#: qml/Wizard/Pages/passcode-set.qml:32
79#: qml/Wizard/Pages/passcode-set.qml:32
80msgid "Cancel"
80msgid "Cancel"
81msgstr "Encaboxar"
81msgstr "Encaboxar"
@@ -93,16 +93,16 @@ msgstr "¿De xuru que quies reaniciar?"
93msgid "No"
93msgid "No"
94msgstr "Non"
94msgstr "Non"
95
95
96−#: qml/Components/Dialogs.qml:183
96+#: qml/Components/Dialogs.qml:182
97msgid "Yes"
97msgid "Yes"
98msgstr "Sí"
98msgstr "Sí"
99
99
100−#: qml/Components/Dialogs.qml:198
100+#: qml/Components/Dialogs.qml:197
101msgctxt "Title: Power off/Restart dialog"
101msgctxt "Title: Power off/Restart dialog"
102msgid "Power"
102msgid "Power"
103msgstr "Apagáu"
103msgstr "Apagáu"
104
104
105−#: qml/Components/Dialogs.qml:199
105+#: qml/Components/Dialogs.qml:198
106msgid ""
106msgid ""
107"Are you sure you would like\n"
107"Are you sure you would like\n"
108"to power off?"
108"to power off?"
@@ -110,28 +110,198 @@ msgstr ""
110"¿De xuru que te prestaría\n"
110"¿De xuru que te prestaría\n"
111"apagar?"
111"apagar?"
112
112
113−#: qml/Components/Dialogs.qml:201
113+#: qml/Components/Dialogs.qml:200
114msgctxt "Button: Power off the system"
114msgctxt "Button: Power off the system"
115msgid "Power off"
115msgid "Power off"
116msgstr "Apagar"
116msgstr "Apagar"
117
117
118−#: qml/Components/Dialogs.qml:210
118+#: qml/Components/Dialogs.qml:209
119msgctxt "Button: Restart the system"
119msgctxt "Button: Restart the system"
120msgid "Restart"
120msgid "Restart"
121msgstr "Reaniciar"
121msgstr "Reaniciar"
122
122
123+#: qml/Components/KeyboardShortcutsOverlay.qml:41
124+msgid "Keyboard Shortcuts"
125+msgstr ""
126+
127+#: qml/Components/KeyboardShortcutsOverlay.qml:55
128+msgid "Unity 8"
129+msgstr ""
130+
131+#: qml/Components/KeyboardShortcutsOverlay.qml:62
132+msgid "PrtScr"
133+msgstr ""
134+
135+#: qml/Components/KeyboardShortcutsOverlay.qml:67
136+msgid "Takes a screenshot."
137+msgstr ""
138+
139+#: qml/Components/KeyboardShortcutsOverlay.qml:75
140+msgid "Alt + PrtScr"
141+msgstr ""
142+
143+#: qml/Components/KeyboardShortcutsOverlay.qml:80
144+msgid "Takes a screenshot of a window."
145+msgstr ""
146+
147+#: qml/Components/KeyboardShortcutsOverlay.qml:88
148+msgid "Super + Space"
149+msgstr ""
150+
151+#: qml/Components/KeyboardShortcutsOverlay.qml:93
152+msgid "Switches to next keyboard layout."
153+msgstr ""
154+
155+#: qml/Components/KeyboardShortcutsOverlay.qml:101
156+msgid "Super + Shift + Space"
157+msgstr ""
158+
159+#: qml/Components/KeyboardShortcutsOverlay.qml:106
160+msgid "Switches to previous keyboard layout."
161+msgstr ""
162+
163+#: qml/Components/KeyboardShortcutsOverlay.qml:118
164+msgid "Launcher"
165+msgstr ""
166+
167+#: qml/Components/KeyboardShortcutsOverlay.qml:125
168+msgid "Super (Hold)"
169+msgstr ""
170+
171+#: qml/Components/KeyboardShortcutsOverlay.qml:130
172+msgid "Opens the launcher, displays shortcuts."
173+msgstr ""
174+
175+#: qml/Components/KeyboardShortcutsOverlay.qml:138
176+msgid "Alt + F1"
177+msgstr ""
178+
179+#: qml/Components/KeyboardShortcutsOverlay.qml:143
180+msgid "Opens launcher keyboard navigation mode."
181+msgstr ""
182+
183+#: qml/Components/KeyboardShortcutsOverlay.qml:151
184+msgid "Super + Tab"
185+msgstr ""
186+
187+#: qml/Components/KeyboardShortcutsOverlay.qml:156
188+msgid "Switches applications via the launcher."
189+msgstr ""
190+
191+#: qml/Components/KeyboardShortcutsOverlay.qml:164
192+msgid "Super + 0 to 9"
193+msgstr ""
194+
195+#: qml/Components/KeyboardShortcutsOverlay.qml:169
196+msgid "Same as clicking on a launcher icon."
197+msgstr ""
198+
199+#: qml/Components/KeyboardShortcutsOverlay.qml:181
200+msgid "Scopes"
201+msgstr ""
202+
203+#: qml/Components/KeyboardShortcutsOverlay.qml:188
204+msgid "Super (Tap)"
205+msgstr ""
206+
207+#: qml/Components/KeyboardShortcutsOverlay.qml:193
208+msgid "Opens the Scopes home."
209+msgstr ""
210+
211+#: qml/Components/KeyboardShortcutsOverlay.qml:209
212+msgid "Switching"
213+msgstr ""
214+
215+#: qml/Components/KeyboardShortcutsOverlay.qml:216
216+msgid "Alt + Tab"
217+msgstr ""
218+
219+#: qml/Components/KeyboardShortcutsOverlay.qml:221
220+msgid "Switches between applications."
221+msgstr ""
222+
223+#: qml/Components/KeyboardShortcutsOverlay.qml:229
224+msgid "Super + W"
225+msgstr ""
226+
227+#: qml/Components/KeyboardShortcutsOverlay.qml:234
228+msgid "Opens the desktop spread."
229+msgstr ""
230+
231+#: qml/Components/KeyboardShortcutsOverlay.qml:242
232+msgid "Cursor Left or Right"
233+msgstr ""
234+
235+#: qml/Components/KeyboardShortcutsOverlay.qml:247
236+msgid "Moves the focus."
237+msgstr ""
238+
239+#: qml/Components/KeyboardShortcutsOverlay.qml:259
240+msgid "Windows"
241+msgstr ""
242+
243+#: qml/Components/KeyboardShortcutsOverlay.qml:266
244+msgid "Ctrl + Super + D"
245+msgstr ""
246+
247+#: qml/Components/KeyboardShortcutsOverlay.qml:271
248+msgid "Minimizes all windows."
249+msgstr ""
250+
251+#: qml/Components/KeyboardShortcutsOverlay.qml:279
252+msgid "Ctrl + Super + Up"
253+msgstr ""
254+
255+#: qml/Components/KeyboardShortcutsOverlay.qml:284
256+msgid "Maximizes the current window."
257+msgstr ""
258+
259+#: qml/Components/KeyboardShortcutsOverlay.qml:292
260+msgid "Ctrl + Super + Down"
261+msgstr ""
262+
263+#: qml/Components/KeyboardShortcutsOverlay.qml:297
264+msgid "Minimizes or restores the current window."
265+msgstr ""
266+
267+#: qml/Components/KeyboardShortcutsOverlay.qml:305
268+msgid "Ctrl + Super + Left or Right"
269+msgstr ""
270+
271+#: qml/Components/KeyboardShortcutsOverlay.qml:310
272+msgid "Semi-maximizes the current window."
273+msgstr ""
274+
275+#: qml/Components/KeyboardShortcutsOverlay.qml:318
276+msgid "Alt + F4"
277+msgstr ""
278+
279+#: qml/Components/KeyboardShortcutsOverlay.qml:323
280+msgid "Closes the current window."
281+msgstr ""
282+
123−#: qml/Components/Lockscreen.qml:231
283+#: qml/Components/Lockscreen.qml:239
124msgid "Return to Call"
284msgid "Return to Call"
125msgstr "Tornar a la llamada"
285msgstr "Tornar a la llamada"
126
286
127−#: qml/Components/Lockscreen.qml:231
287+#: qml/Components/Lockscreen.qml:239
128msgid "Emergency Call"
288msgid "Emergency Call"
129msgstr "Llamada d'emerxencia"
289msgstr "Llamada d'emerxencia"
130
290
131−#: qml/Components/Lockscreen.qml:263
291+#: qml/Components/Lockscreen.qml:271
132msgid "OK"
292msgid "OK"
133msgstr "Aceutar"
293msgstr "Aceutar"
134
294
295+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
296+#, qt-format
297+msgid "%1:%2:%3"
298+msgstr ""
299+
300+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
301+#, qt-format
302+msgid "%1:%2"
303+msgstr ""
304+
135#: qml/Components/ModeSwitchWarningDialog.qml:32
305#: qml/Components/ModeSwitchWarningDialog.qml:32
136msgid "Apps may have unsaved data:"
306msgid "Apps may have unsaved data:"
137msgstr "Apps que pueden tener datos sin guardar:"
307msgstr "Apps que pueden tener datos sin guardar:"
@@ -140,7 +310,7 @@ msgstr "Apps que pueden tener datos sin guardar:"
140msgctxt ""
310msgctxt ""
141"Re-dock means connect the device again to an external screen/mouse/keyboard"
311"Re-dock means connect the device again to an external screen/mouse/keyboard"
142msgid "Re-dock, save your work and close these apps to continue."
312msgid "Re-dock, save your work and close these apps to continue."
143−msgstr ""
313+msgstr "Reconeuta, guarda'l trabayu y zarra eses apps pa siguir."
144
314
145#: qml/Components/ModeSwitchWarningDialog.qml:63
315#: qml/Components/ModeSwitchWarningDialog.qml:63
146msgid "Or force close now (unsaved data will be lost)."
316msgid "Or force close now (unsaved data will be lost)."
@@ -158,57 +328,61 @@ msgstr "Reconeutar agora."
158msgid "Close all"
328msgid "Close all"
159msgstr "Zarrar too"
329msgstr "Zarrar too"
160
330
331+#: qml/Components/SharingPicker.qml:54
332+msgid "Preview Share Item"
333+msgstr "Entever l'elementu compartíu"
334+
161−#: qml/Dash/DashPageHeader.qml:337
335+#: qml/Dash/DashPageHeader.qml:333
162msgctxt "Button: Open the Ubuntu Store"
336msgctxt "Button: Open the Ubuntu Store"
163msgid "Store"
337msgid "Store"
164msgstr "Tienda"
338msgstr "Tienda"
165
339
166−#: qml/Dash/DashPageHeader.qml:344
340+#: qml/Dash/DashPageHeader.qml:340
167msgctxt "Button: Start a search in the current dash scope"
341msgctxt "Button: Start a search in the current dash scope"
168msgid "Search"
342msgid "Search"
169msgstr "Guetar"
343msgstr "Guetar"
170
344
171−#: qml/Dash/DashPageHeader.qml:354
345+#: qml/Dash/DashPageHeader.qml:350
172msgctxt "Button: Show the current dash scope settings"
346msgctxt "Button: Show the current dash scope settings"
173msgid "Settings"
347msgid "Settings"
174msgstr "Axustes"
348msgstr "Axustes"
175
349
176−#: qml/Dash/DashPageHeader.qml:361
350+#: qml/Dash/DashPageHeader.qml:357
177msgid "Remove from Favorites"
351msgid "Remove from Favorites"
178msgstr "Desaniciar de favoritos"
352msgstr "Desaniciar de favoritos"
179
353
180−#: qml/Dash/DashPageHeader.qml:361
354+#: qml/Dash/DashPageHeader.qml:357
181msgid "Add to Favorites"
355msgid "Add to Favorites"
182msgstr "Amestar a favoritos"
356msgstr "Amestar a favoritos"
183
357
184#: qml/Dash/FiltersPopover.qml:60
358#: qml/Dash/FiltersPopover.qml:60
185msgid "Refine your results"
359msgid "Refine your results"
186−msgstr ""
360+msgstr "Refina los resultaos"
187
361
188#: qml/Dash/FiltersPopover.qml:69
362#: qml/Dash/FiltersPopover.qml:69
189msgid "Reset"
363msgid "Reset"
190−msgstr ""
364+msgstr "Reafitar"
191
365
192−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
366+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
193−msgid "See less"
367+msgid "Show less"
194msgstr "Ver menos"
368msgstr "Ver menos"
195
369
196−#: qml/Dash/GenericScopeView.qml:570
370+#: qml/Dash/GenericScopeView.qml:580
197−msgid "See all"
371+msgid "Show all"
198msgstr "Ver too"
372msgstr "Ver too"
199
373
200−#: qml/Dash/GenericScopeView.qml:627
374+#: qml/Dash/GenericScopeView.qml:637
201msgctxt "Label: Hint for dash search line edit"
375msgctxt "Label: Hint for dash search line edit"
202msgid "Search"
376msgid "Search"
203msgstr "Guetar"
377msgstr "Guetar"
204
378
205−#: qml/Dash/PageHeaderExtraPanel.qml:55
379+#: qml/Dash/PageHeaderExtraPanel.qml:56
206msgid "Recent Searches"
380msgid "Recent Searches"
207−msgstr ""
381+msgstr "Guetes recién"
208
382
209−#: qml/Dash/PageHeaderExtraPanel.qml:66
383+#: qml/Dash/PageHeaderExtraPanel.qml:67
210msgid "Clear All"
384msgid "Clear All"
211−msgstr ""
385+msgstr "Llimpiar too"
212
386
213#: qml/Dash/Previews/PreviewActionCombo.qml:35
387#: qml/Dash/Previews/PreviewActionCombo.qml:35
214msgid "More..."
388msgid "More..."
@@ -219,22 +393,18 @@ msgid "Less..."
219msgstr "Menos…"
393msgstr "Menos…"
220
394
221#: qml/Dash/Previews/PreviewCommentInput.qml:68
395#: qml/Dash/Previews/PreviewCommentInput.qml:68
222−#: qml/Dash/Previews/PreviewRatingInput.qml:174
396+#: qml/Dash/Previews/PreviewRatingInput.qml:175
223msgid "Send"
397msgid "Send"
224msgstr "Unviar"
398msgstr "Unviar"
225
399
226−#: qml/Dash/Previews/PreviewRatingInput.qml:84
400+#: qml/Dash/Previews/PreviewRatingInput.qml:82
227msgid "Rate this"
401msgid "Rate this"
228msgstr "Valorar esto"
402msgstr "Valorar esto"
229
403
230−#: qml/Dash/Previews/PreviewRatingInput.qml:129
404+#: qml/Dash/Previews/PreviewRatingInput.qml:157
231msgid "Add a review"
405msgid "Add a review"
232msgstr "Amestar una reseña"
406msgstr "Amestar una reseña"
233
407
234−#: qml/Dash/Previews/PreviewSharing.qml:66
235−msgid "Preview Share Item"
236−msgstr "Entever l'elementu compartíu"
237−
238#: qml/Dash/PullToRefreshScopeStyle.qml:55
408#: qml/Dash/PullToRefreshScopeStyle.qml:55
239msgid "Pull to refresh…"
409msgid "Pull to refresh…"
240msgstr "Tira p'anovar..."
410msgstr "Tira p'anovar..."
@@ -247,49 +417,63 @@ msgstr "Sueltar p'anovar..."
247msgid "Enable location data"
417msgid "Enable location data"
248msgstr "Habilitar datos d'allugamientu"
418msgstr "Habilitar datos d'allugamientu"
249
419
250−#: qml/Dash/ScopesList.qml:67
420+#: qml/Dash/ScopesList.qml:55
251msgid "Manage"
421msgid "Manage"
252msgstr "Xestionar"
422msgstr "Xestionar"
253
423
254−#: qml/Dash/ScopesList.qml:113
424+#: qml/Dash/ScopesList.qml:102
255msgid "Home"
425msgid "Home"
256msgstr "Aniciu"
426msgstr "Aniciu"
257
427
258−#: qml/Dash/ScopesList.qml:114
428+#: qml/Dash/ScopesList.qml:103
259msgid "Also installed"
429msgid "Also installed"
260msgstr "Tamién instalaos"
430msgstr "Tamién instalaos"
261
431
262−#: qml/DisabledScreenNotice.qml:104
432+#: qml/DisabledScreenNotice.qml:109
263msgid ""
433msgid ""
264"Your device is now connected to an external display. Use this screen as a "
434"Your device is now connected to an external display. Use this screen as a "
265"touch pad to interact with the pointer."
435"touch pad to interact with the pointer."
266msgstr ""
436msgstr ""
437+"El preséu agora ta coneutáu con una pantalla esterna. Usa esta pantalla como "
438+"touch pad pa interactuar col punteru."
267
439
268−#: qml/Greeter/CoverPage.qml:118
440+#: qml/Greeter/CoverPage.qml:127
269msgid "Unlock"
441msgid "Unlock"
270msgstr "Desbloquiar"
442msgstr "Desbloquiar"
271
443
444+#: qml/Greeter/Greeter.qml:555
445+msgid "Try again"
446+msgstr ""
447+
272−#: qml/Greeter/LoginList.qml:239
448+#: qml/Greeter/LoginList.qml:63
449+msgid "Passphrase"
450+msgstr ""
451+
452+#: qml/Greeter/LoginList.qml:64
453+msgid "Passcode"
454+msgstr ""
455+
456+#: qml/Greeter/LoginList.qml:87
273msgid "Retry"
457msgid "Retry"
274msgstr "Reintentar"
458msgstr "Reintentar"
275
459
276−#: qml/Greeter/LoginList.qml:240
460+#: qml/Greeter/LoginList.qml:88
277−msgid "Tap to unlock"
461+msgid "Log In"
278−msgstr "Calca pa desbloquiar"
462+msgstr ""
279
463
280−#: qml/Greeter/NarrowView.qml:54
464+#: qml/Greeter/NarrowView.qml:55
281msgid "Sorry, incorrect passphrase."
465msgid "Sorry, incorrect passphrase."
282msgstr "Perdón, fras de pasu incorreuta"
466msgstr "Perdón, fras de pasu incorreuta"
283
467
284−#: qml/Greeter/NarrowView.qml:55
468+#: qml/Greeter/NarrowView.qml:56
285msgid "Sorry, incorrect passcode."
469msgid "Sorry, incorrect passcode."
286msgstr "Perdón, códigu de pasu incorreutu."
470msgstr "Perdón, códigu de pasu incorreutu."
287
471
288−#: qml/Greeter/NarrowView.qml:56
472+#: qml/Greeter/NarrowView.qml:57
289msgid "This will be your last attempt."
473msgid "This will be your last attempt."
290msgstr "Esti sedra'l to caberu intentu"
474msgstr "Esti sedra'l to caberu intentu"
291
475
292−#: qml/Greeter/NarrowView.qml:58
476+#: qml/Greeter/NarrowView.qml:59
293msgid ""
477msgid ""
294"If passphrase is entered incorrectly, your phone will conduct a factory "
478"If passphrase is entered incorrectly, your phone will conduct a factory "
295"reset and all personal data will be deleted."
479"reset and all personal data will be deleted."
@@ -297,7 +481,7 @@ msgstr ""
297"Si s'inxerta la fras de pasu incorreutamente, el to teléfonu va reafitase y "
481"Si s'inxerta la fras de pasu incorreutamente, el to teléfonu va reafitase y "
298"van desaniciase tolos datos personales."
482"van desaniciase tolos datos personales."
299
483
300−#: qml/Greeter/NarrowView.qml:59
484+#: qml/Greeter/NarrowView.qml:60
301msgid ""
485msgid ""
302"If passcode is entered incorrectly, your phone will conduct a factory reset "
486"If passcode is entered incorrectly, your phone will conduct a factory reset "
303"and all personal data will be deleted."
487"and all personal data will be deleted."
@@ -305,38 +489,38 @@ msgstr ""
305"Si s'inxerta'l códigu de pasu incorreutamente, el to teléfonu va reafitase y "
489"Si s'inxerta'l códigu de pasu incorreutamente, el to teléfonu va reafitase y "
306"van desaniciase tolos datos personales."
490"van desaniciase tolos datos personales."
307
491
308−#: qml/Greeter/NarrowView.qml:116
492+#: qml/Greeter/NarrowView.qml:129
309#, qt-format
493#, qt-format
310msgid "Enter %1"
494msgid "Enter %1"
311msgstr "Introduz %1"
495msgstr "Introduz %1"
312
496
313−#: qml/Greeter/NarrowView.qml:117
497+#: qml/Greeter/NarrowView.qml:130
314msgid "Enter passphrase"
498msgid "Enter passphrase"
315msgstr "Introduz la fras de pasu"
499msgstr "Introduz la fras de pasu"
316
500
317−#: qml/Greeter/NarrowView.qml:118
501+#: qml/Greeter/NarrowView.qml:131
318msgid "Enter passcode"
502msgid "Enter passcode"
319msgstr "Introduz el códigu de pasu"
503msgstr "Introduz el códigu de pasu"
320
504
321−#: qml/Greeter/NarrowView.qml:119
505+#: qml/Greeter/NarrowView.qml:135
322#, qt-format
506#, qt-format
323msgid "Sorry, incorrect %1"
507msgid "Sorry, incorrect %1"
324msgstr "Sentímoslo, %1 incorreutu"
508msgstr "Sentímoslo, %1 incorreutu"
325
509
326−#: qml/Greeter/NarrowView.qml:120
510+#: qml/Greeter/NarrowView.qml:136
327msgid "Sorry, incorrect passphrase"
511msgid "Sorry, incorrect passphrase"
328msgstr "Sentímoslo, contraseña incorreuta"
512msgstr "Sentímoslo, contraseña incorreuta"
329
513
330−#: qml/Greeter/NarrowView.qml:121
514+#: qml/Greeter/NarrowView.qml:137
331msgctxt "passphrase"
515msgctxt "passphrase"
332msgid "Please re-enter"
516msgid "Please re-enter"
333msgstr "Vuelve a escribila"
517msgstr "Vuelve a escribila"
334
518
335−#: qml/Greeter/NarrowView.qml:122
519+#: qml/Greeter/NarrowView.qml:138
336msgid "Sorry, incorrect passcode"
520msgid "Sorry, incorrect passcode"
337msgstr "Sentímoslo, códigu de pasu incorreutu"
521msgstr "Sentímoslo, códigu de pasu incorreutu"
338
522
339−#: qml/Notifications/NotificationMenuItemFactory.qml:129
523+#: qml/Notifications/NotificationMenuItemFactory.qml:124
340msgid "Show password"
524msgid "Show password"
341msgstr "Amosar contraseña"
525msgstr "Amosar contraseña"
342
526
@@ -348,127 +532,103 @@ msgstr "Toca pa tornar a la llamada..."
348msgid "Conference"
532msgid "Conference"
349msgstr "Conferencia"
533msgstr "Conferencia"
350
534
351−#: qml/Panel/Indicators/MenuItemFactory.qml:761
535+#: qml/Panel/Indicators/MenuItemFactory.qml:762
352msgid "Nothing is playing"
536msgid "Nothing is playing"
353msgstr "Nun ta reproduciéndose nada"
537msgstr "Nun ta reproduciéndose nada"
354
538
355−#: qml/Panel/Indicators/MenuItemFactory.qml:890
539+#: qml/Panel/Indicators/MenuItemFactory.qml:891
356#, qt-format
540#, qt-format
357msgid "%1 hour"
541msgid "%1 hour"
358msgid_plural "%1 hours"
542msgid_plural "%1 hours"
359msgstr[0] "%1 hora"
543msgstr[0] "%1 hora"
360msgstr[1] "%1 hores"
544msgstr[1] "%1 hores"
361
545
362−#: qml/Panel/Indicators/MenuItemFactory.qml:894
546+#: qml/Panel/Indicators/MenuItemFactory.qml:895
363#, qt-format
547#, qt-format
364msgid "%1 minute"
548msgid "%1 minute"
365msgid_plural "%1 minutes"
549msgid_plural "%1 minutes"
366msgstr[0] "%1 minutu"
550msgstr[0] "%1 minutu"
367msgstr[1] "%1 minutos"
551msgstr[1] "%1 minutos"
368
552
369−#: qml/Panel/Indicators/MenuItemFactory.qml:899
553+#: qml/Panel/Indicators/MenuItemFactory.qml:900
370#, qt-format
554#, qt-format
371msgid "%1 second"
555msgid "%1 second"
372msgid_plural "%1 seconds"
556msgid_plural "%1 seconds"
373msgstr[0] "%1 segundu"
557msgstr[0] "%1 segundu"
374msgstr[1] "%1 segundos"
558msgstr[1] "%1 segundos"
375
559
376−#: qml/Panel/Indicators/MenuItemFactory.qml:902
560+#: qml/Panel/Indicators/MenuItemFactory.qml:903
377msgid "0 seconds"
561msgid "0 seconds"
378msgstr "0 segundos"
562msgstr "0 segundos"
379
563
380#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
564#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
381−#: qml/Panel/Indicators/MenuItemFactory.qml:904
565+#: qml/Panel/Indicators/MenuItemFactory.qml:905
382#, qt-format
566#, qt-format
383msgid "%1 remaining"
567msgid "%1 remaining"
384msgstr "Queden %1"
568msgstr "Queden %1"
385
569
386−#: qml/Panel/Indicators/MenuItemFactory.qml:910
570+#: qml/Panel/Indicators/MenuItemFactory.qml:911
387msgid "In queue…"
571msgid "In queue…"
388msgstr "Na cola..."
572msgstr "Na cola..."
389
573
390−#: qml/Panel/Indicators/MenuItemFactory.qml:914
574+#: qml/Panel/Indicators/MenuItemFactory.qml:915
391msgid "Downloading"
575msgid "Downloading"
392msgstr "Baxando"
576msgstr "Baxando"
393
577
394−#: qml/Panel/Indicators/MenuItemFactory.qml:916
578+#: qml/Panel/Indicators/MenuItemFactory.qml:917
395msgid "Paused, tap to resume"
579msgid "Paused, tap to resume"
396msgstr "Posáu, toca pa reanudar"
580msgstr "Posáu, toca pa reanudar"
397
581
398−#: qml/Panel/Indicators/MenuItemFactory.qml:918
582+#: qml/Panel/Indicators/MenuItemFactory.qml:919
399msgid "Canceled"
583msgid "Canceled"
400msgstr "Encaboxáu"
584msgstr "Encaboxáu"
401
585
402−#: qml/Panel/Indicators/MenuItemFactory.qml:920
586+#: qml/Panel/Indicators/MenuItemFactory.qml:921
403msgid "Finished"
587msgid "Finished"
404msgstr "Finó"
588msgstr "Finó"
405
589
406−#: qml/Panel/Indicators/MenuItemFactory.qml:922
590+#: qml/Panel/Indicators/MenuItemFactory.qml:923
407msgid "Failed, tap to retry"
591msgid "Failed, tap to retry"
408msgstr "Falló, toca pa reintentar"
592msgstr "Falló, toca pa reintentar"
409
593
410−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
594+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
411−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
595+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
412msgctxt "Button: Send a reply message"
596msgctxt "Button: Send a reply message"
413msgid "Send"
597msgid "Send"
414msgstr "Unviar"
598msgstr "Unviar"
415
599
416−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
600+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
417msgctxt "Label: Hint in message indicator line edit"
601msgctxt "Label: Hint in message indicator line edit"
418msgid "Reply"
602msgid "Reply"
419msgstr "Responder"
603msgstr "Responder"
420
604
421−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
605+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
422msgctxt "Button: Call back on phone"
606msgctxt "Button: Call back on phone"
423msgid "Call back"
607msgid "Call back"
424msgstr "Devolver llamada"
608msgstr "Devolver llamada"
425
609
426#: qml/Stages/SideStage.qml:76
610#: qml/Stages/SideStage.qml:76
427msgid "Drag using 3 fingers any application from one window to the other"
611msgid "Drag using 3 fingers any application from one window to the other"
428−msgstr ""
612+msgstr "Abasnar cualquier aplicación d'una ventana a otra usando 3 deos"
429
613
430−#: qml/Tutorial/TutorialBottom.qml:78
431−msgid "Swipe up to add a contact"
432−msgstr ""
433−
434−#: qml/Tutorial/TutorialBottom.qml:80
435−msgid "Swipe up for favorite calculations"
436−msgstr ""
437−
438−#: qml/Tutorial/TutorialBottom.qml:82
439−msgid "Swipe up for recent calls"
440−msgstr ""
441−
442−#: qml/Tutorial/TutorialBottom.qml:84
443−msgid "Swipe up to create a message"
444−msgstr ""
445−
446−#: qml/Tutorial/TutorialBottom.qml:85
447−msgid "Swipe up to manage the app"
448−msgstr ""
449−
450−#: qml/Tutorial/TutorialLeft.qml:47
451−msgid "Swipe from the left edge to open the launcher"
452−msgstr ""
453−
454−#: qml/Tutorial/TutorialLeftLong.qml:47
614+#: qml/Tutorial/TutorialLeftLong.qml:49
455msgid "Long swipe from the left edge to open the Today scope"
615msgid "Long swipe from the left edge to open the Today scope"
456−msgstr ""
616+msgstr "Eslizamientu llargu dende'l berbesu izquierdu pa ver el scope Güei"
457
617
458−#: qml/Tutorial/TutorialRight.qml:54
618+#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Hover your mouse on the right edge to view your open apps"
619+msgid "Short swipe from the left edge to open the launcher"
460msgstr ""
620msgstr ""
461
621
462#: qml/Tutorial/TutorialRight.qml:55
622#: qml/Tutorial/TutorialRight.qml:55
463−msgid "Short or long swipe from the right edge to view your open apps"
623+msgid "Push your mouse against the right edge to view your open apps"
464−msgstr ""
624+msgstr "Emburria'l mur escontra'l berbesu drechu pa ver les apps abiertes"
465
625
466−#: qml/Tutorial/TutorialTop.qml:53
626+#: qml/Tutorial/TutorialRight.qml:56
467−msgid "Swipe from the top right edge to open the notification bar"
627+msgid "Swipe from the right edge to view your open apps"
468msgstr ""
628msgstr ""
469
629
470−#: qml/Tutorial/TutorialTop.qml:54
630+#: qml/Tutorial/TutorialTop.qml:53
471−msgid "Swipe from the top edge to open the notification bar"
631+msgid "Swipe from the top edge to access notifications and quick settings"
472msgstr ""
632msgstr ""
473
633
474#: qml/Wizard/Page.qml:54
634#: qml/Wizard/Page.qml:54
@@ -478,16 +638,16 @@ msgstr "Atrás"
478
638
479#: qml/Wizard/Pages/10-welcome.qml:27
639#: qml/Wizard/Pages/10-welcome.qml:27
480msgid "Language"
640msgid "Language"
481−msgstr ""
641+msgstr "Llingua"
482
642
483−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
643+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
484−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
644+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
485#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
645#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
486#: qml/Wizard/Pages/75-report-check.qml:84
646#: qml/Wizard/Pages/75-report-check.qml:84
487−#: qml/Wizard/Pages/passcode-desktop.qml:124
647+#: qml/Wizard/Pages/passcode-desktop.qml:141
488#: qml/Wizard/Pages/password-set.qml:141
648#: qml/Wizard/Pages/password-set.qml:141
489msgid "Next"
649msgid "Next"
490−msgstr ""
650+msgstr "Siguiente"
491
651
492#: qml/Wizard/Pages/30-wifi.qml:29
652#: qml/Wizard/Pages/30-wifi.qml:29
493msgid "Connect to Wi‑Fi"
653msgid "Connect to Wi‑Fi"
@@ -495,15 +655,15 @@ msgstr "Coneutase al WiFi"
495
655
496#: qml/Wizard/Pages/30-wifi.qml:130
656#: qml/Wizard/Pages/30-wifi.qml:130
497msgid "Connected"
657msgid "Connected"
498−msgstr ""
658+msgstr "Coneutáu"
499
659
500#: qml/Wizard/Pages/30-wifi.qml:163
660#: qml/Wizard/Pages/30-wifi.qml:163
501msgid "Available Wi-Fi networks"
661msgid "Available Wi-Fi networks"
502−msgstr ""
662+msgstr "Redes Wi-Fi disponibles"
503
663
504#: qml/Wizard/Pages/30-wifi.qml:164
664#: qml/Wizard/Pages/30-wifi.qml:164
505msgid "No available Wi-Fi networks"
665msgid "No available Wi-Fi networks"
506−msgstr ""
666+msgstr "Nun hai redes Wi-Fi disponibles"
507
667
508#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
668#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
509#: qml/Wizard/Pages/sim.qml:101
669#: qml/Wizard/Pages/sim.qml:101
@@ -512,98 +672,102 @@ msgstr "Saltar"
512
672
513#: qml/Wizard/Pages/40-location.qml:27
673#: qml/Wizard/Pages/40-location.qml:27
514msgid "Location Services"
674msgid "Location Services"
515−msgstr ""
675+msgstr "Servicios d'allugamientu"
516
676
517#: qml/Wizard/Pages/40-location.qml:83
677#: qml/Wizard/Pages/40-location.qml:83
518msgid ""
678msgid ""
519"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
679"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
520"(recommended)"
680"(recommended)"
521msgstr ""
681msgstr ""
682+"Usar GPS, puntos Wi-Fi y redes móviles de mou anónimu pa detectar "
683+"l'allugamientu (recomendao)"
522
684
523#: qml/Wizard/Pages/40-location.qml:105
685#: qml/Wizard/Pages/40-location.qml:105
524#, qt-format
686#, qt-format
525msgid "By selecting this option you agree to the Nokia HERE %1."
687msgid "By selecting this option you agree to the Nokia HERE %1."
526−msgstr ""
688+msgstr "Seleicionando esta opción aceutes los %1 de Nokia HERE."
527
689
528#: qml/Wizard/Pages/40-location.qml:106
690#: qml/Wizard/Pages/40-location.qml:106
529msgctxt "part of: Nokia HERE terms and conditions"
691msgctxt "part of: Nokia HERE terms and conditions"
530msgid "terms and conditions"
692msgid "terms and conditions"
531−msgstr ""
693+msgstr "términos y condiciones"
532
694
533#: qml/Wizard/Pages/40-location.qml:160
695#: qml/Wizard/Pages/40-location.qml:160
534msgid "GPS only"
696msgid "GPS only"
535−msgstr ""
697+msgstr "Sólo GPS"
536
698
537#: qml/Wizard/Pages/40-location.qml:214
699#: qml/Wizard/Pages/40-location.qml:214
538msgid "Don't use my location"
700msgid "Don't use my location"
539−msgstr ""
701+msgstr "Nun usar l'allugamientu"
540
702
541#: qml/Wizard/Pages/40-location.qml:260
703#: qml/Wizard/Pages/40-location.qml:260
542msgid "You can change it later in System Settings."
704msgid "You can change it later in System Settings."
543−msgstr ""
705+msgstr "Pues camudalo sero na Configuración del Sistema."
544
706
545#: qml/Wizard/Pages/50-timezone.qml:29
707#: qml/Wizard/Pages/50-timezone.qml:29
546msgid "Time Zone"
708msgid "Time Zone"
547−msgstr ""
709+msgstr "Estaya horaria"
548
710
549−#: qml/Wizard/Pages/50-timezone.qml:178
711+#: qml/Wizard/Pages/50-timezone.qml:181
550msgid "Enter your city"
712msgid "Enter your city"
551−msgstr ""
713+msgstr "Escribe la ciudá"
552
714
553#: qml/Wizard/Pages/60-account.qml:24
715#: qml/Wizard/Pages/60-account.qml:24
554msgid "Personalize Your Device"
716msgid "Personalize Your Device"
555−msgstr ""
717+msgstr "Personaliza'l preséu"
556
718
557#: qml/Wizard/Pages/60-account.qml:48
719#: qml/Wizard/Pages/60-account.qml:48
558msgid "Preferred Name"
720msgid "Preferred Name"
559−msgstr ""
721+msgstr "Nome preferíu"
560
722
561#: qml/Wizard/Pages/70-passwd-type.qml:39
723#: qml/Wizard/Pages/70-passwd-type.qml:39
562msgid "Lock Screen"
724msgid "Lock Screen"
563−msgstr ""
725+msgstr "Bloquiar pantalla"
564
726
565#: qml/Wizard/Pages/70-passwd-type.qml:101
727#: qml/Wizard/Pages/70-passwd-type.qml:101
566msgctxt "Label: Type of security method"
728msgctxt "Label: Type of security method"
567msgid "Create new password"
729msgid "Create new password"
568−msgstr ""
730+msgstr "Crear contraseña nueva"
569
731
570#: qml/Wizard/Pages/70-passwd-type.qml:103
732#: qml/Wizard/Pages/70-passwd-type.qml:103
571msgctxt "Label: Type of security method"
733msgctxt "Label: Type of security method"
572msgid "Create passcode (numbers only)"
734msgid "Create passcode (numbers only)"
573−msgstr ""
735+msgstr "Crear códigu d'accesu (sólo númberos)"
574
736
575#: qml/Wizard/Pages/70-passwd-type.qml:105
737#: qml/Wizard/Pages/70-passwd-type.qml:105
576msgctxt "Label: Type of security method"
738msgctxt "Label: Type of security method"
577msgid "No lock code"
739msgid "No lock code"
578−msgstr ""
740+msgstr "Ensin códigu de bloquéu"
579
741
580#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
742#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
581msgid "Privacy Policy"
743msgid "Privacy Policy"
582−msgstr ""
744+msgstr "Política d'intimidá"
583
745
584#: qml/Wizard/Pages/75-report-check.qml:26
746#: qml/Wizard/Pages/75-report-check.qml:26
585msgid "Help Us Improve"
747msgid "Help Us Improve"
586−msgstr ""
748+msgstr "Ayúdanos a meyorar"
587
749
588#: qml/Wizard/Pages/75-report-check.qml:59
750#: qml/Wizard/Pages/75-report-check.qml:59
589msgid "Improve system performance by sending us crashes and error reports."
751msgid "Improve system performance by sending us crashes and error reports."
590msgstr ""
752msgstr ""
753+"Ameyora'l rindimientu del sistema unviándonos los informes d'errores y "
754+"cuelgues."
591
755
592#: qml/Wizard/Pages/75-report-check.qml:60
756#: qml/Wizard/Pages/75-report-check.qml:60
593msgid "Privacy policy"
757msgid "Privacy policy"
594−msgstr ""
758+msgstr "Política d'intimidá"
595
759
596#: qml/Wizard/Pages/80-finished.qml:89
760#: qml/Wizard/Pages/80-finished.qml:89
597msgid "Welcome to Ubuntu"
761msgid "Welcome to Ubuntu"
598−msgstr ""
762+msgstr "Bienveníu/a a Ubuntu"
599
763
600#: qml/Wizard/Pages/80-finished.qml:104
764#: qml/Wizard/Pages/80-finished.qml:104
601msgid "You are ready to use your device now"
765msgid "You are ready to use your device now"
602−msgstr ""
766+msgstr "Ya tas preparáu pa usar el preséu"
603
767
604#: qml/Wizard/Pages/80-finished.qml:124
768#: qml/Wizard/Pages/80-finished.qml:124
605msgid "Get Started"
769msgid "Get Started"
606−msgstr ""
770+msgstr "Primeros pasos"
607
771
608#: qml/Wizard/Pages/here-terms.qml:25
772#: qml/Wizard/Pages/here-terms.qml:25
609msgid "Terms & Conditions"
773msgid "Terms & Conditions"
@@ -636,7 +800,7 @@ msgid "Service Terms"
636msgstr ""
800msgstr ""
637
801
638#: qml/Wizard/Pages/passcode-confirm.qml:43
802#: qml/Wizard/Pages/passcode-confirm.qml:43
639−#: qml/Wizard/Pages/passcode-desktop.qml:80
803+#: qml/Wizard/Pages/passcode-desktop.qml:96
640msgid "Confirm passcode"
804msgid "Confirm passcode"
641msgstr "Confirmar códigu de pasu"
805msgstr "Confirmar códigu de pasu"
642
806
@@ -653,24 +817,24 @@ msgstr ""
653msgid "Lock Screen Passcode"
817msgid "Lock Screen Passcode"
654msgstr ""
818msgstr ""
655
819
656−#: qml/Wizard/Pages/passcode-desktop.qml:56
820+#: qml/Wizard/Pages/passcode-desktop.qml:60
657msgid "Enter 4 numbers to setup your passcode"
821msgid "Enter 4 numbers to setup your passcode"
658msgstr ""
822msgstr ""
659
823
660−#: qml/Wizard/Pages/passcode-desktop.qml:65
824+#: qml/Wizard/Pages/passcode-desktop.qml:76
661#: qml/Wizard/Pages/passcode-set.qml:54
825#: qml/Wizard/Pages/passcode-set.qml:54
662msgid "Choose passcode"
826msgid "Choose passcode"
663msgstr ""
827msgstr ""
664
828
665−#: qml/Wizard/Pages/passcode-desktop.qml:105
829+#: qml/Wizard/Pages/passcode-desktop.qml:126
666msgid "Passcode too short"
830msgid "Passcode too short"
667msgstr ""
831msgstr ""
668
832
669−#: qml/Wizard/Pages/passcode-desktop.qml:107
833+#: qml/Wizard/Pages/passcode-desktop.qml:128
670msgid "Passcodes match"
834msgid "Passcodes match"
671msgstr ""
835msgstr ""
672
836
673−#: qml/Wizard/Pages/passcode-desktop.qml:109
837+#: qml/Wizard/Pages/passcode-desktop.qml:130
674msgid "Passcodes do not match"
838msgid "Passcodes do not match"
675msgstr ""
839msgstr ""
676
840
@@ -692,7 +856,7 @@ msgstr ""
692
856
693#: qml/Wizard/Pages/password-set.qml:103
857#: qml/Wizard/Pages/password-set.qml:103
694msgid "Confirm password"
858msgid "Confirm password"
695−msgstr ""
859+msgstr "Confirmar contraseña"
696
860
697#: qml/Wizard/Pages/sim.qml:27
861#: qml/Wizard/Pages/sim.qml:27
698msgid "No SIM card installed"
862msgid "No SIM card installed"
@@ -719,28 +883,32 @@ msgid "To proceed with no SIM tap Skip."
719msgstr ""
883msgstr ""
720
884
721#: qml/Wizard/PasswordMeter.qml:87
885#: qml/Wizard/PasswordMeter.qml:87
722−msgid "Passwords match"
886+msgid "Password too short"
723msgstr ""
887msgstr ""
724
888
725#: qml/Wizard/PasswordMeter.qml:89
889#: qml/Wizard/PasswordMeter.qml:89
726−msgid "Passwords do not match"
890+msgid "Passwords match"
727msgstr ""
891msgstr ""
728
892
729−#: qml/Wizard/PasswordMeter.qml:93
893+#: qml/Wizard/PasswordMeter.qml:91
730−msgid "Strong password"
894+msgid "Passwords do not match"
731msgstr ""
895msgstr ""
732
896
733#: qml/Wizard/PasswordMeter.qml:95
897#: qml/Wizard/PasswordMeter.qml:95
734−msgid "Fair password"
898+msgid "Strong password"
735−msgstr ""
899+msgstr "Contraseña fuerte"
736
900
737#: qml/Wizard/PasswordMeter.qml:97
901#: qml/Wizard/PasswordMeter.qml:97
738−msgid "Weak password"
902+msgid "Fair password"
739−msgstr ""
903+msgstr "Contraseña aceutable"
740
904
741#: qml/Wizard/PasswordMeter.qml:99
905#: qml/Wizard/PasswordMeter.qml:99
906+msgid "Weak password"
907+msgstr "Contraseña feble"
908+
909+#: qml/Wizard/PasswordMeter.qml:101
742msgid "Very weak password"
910msgid "Very weak password"
743−msgstr ""
911+msgstr "Contraseña feble enforma"
744
912
745#~ msgid "Skip intro"
913#~ msgid "Skip intro"
746#~ msgstr "Omitir la intro"
914#~ msgstr "Omitir la intro"
@@ -792,6 +960,9 @@ msgstr ""
792#~ msgid "Search"
960#~ msgid "Search"
793#~ msgstr "Guetar"
961#~ msgstr "Guetar"
794
962
963+#~ msgid "See less"
964+#~ msgstr "Ver menos"
965+
795#~ msgid ""
966#~ msgid ""
796#~ "You have now mastered the edge gestures and can start using the "
967#~ "You have now mastered the edge gestures and can start using the "
797#~ "phone<br><br>Tap on the screen to start"
968#~ "phone<br><br>Tap on the screen to start"
@@ -799,6 +970,9 @@ msgstr ""
799#~ "Agora yá domines los xestos de los berbesos y pues entamar a usar el "
970#~ "Agora yá domines los xestos de los berbesos y pues entamar a usar el "
800#~ "teléfonu<br><br>Toca la pantalla pa comenzar"
971#~ "teléfonu<br><br>Toca la pantalla pa comenzar"
801
972
973+#~ msgid "See all"
974+#~ msgstr "Ver too"
975+
802#~ msgid "Power"
976#~ msgid "Power"
803#~ msgstr "Enerxía"
977#~ msgstr "Enerxía"
804
978
@@ -900,6 +1074,9 @@ msgstr ""
900#~ msgid "Reboot"
1074#~ msgid "Reboot"
901#~ msgstr "Reaniciar"
1075#~ msgstr "Reaniciar"
902
1076
1077+#~ msgid "Tap to unlock"
1078+#~ msgstr "Calca pa desbloquiar"
1079+
903#~ msgid "These are the shortcuts to favorite apps"
1080#~ msgid "These are the shortcuts to favorite apps"
904#~ msgstr "Estos son los atayos a les aplicaciones favorites"
1081#~ msgstr "Estos son los atayos a les aplicaciones favorites"
905
1082
@@ -1057,11 +1234,31 @@ msgstr ""
1057#~ msgid "Call back"
1234#~ msgid "Call back"
1058#~ msgstr "Devolver llamada"
1235#~ msgstr "Devolver llamada"
1059
1236
1060−#~ msgid "Your device is now ready to use."
1237+#~ msgid "Swipe up for recent calls"
1061−#~ msgstr "Agora'l to preséu ta preparáu pa usase."
1238+#~ msgstr "Eslizar pa llamaes recién"
1239+
1240+#~ msgid "Swipe up for favorite calculations"
1241+#~ msgstr "Eslizar pa los cálculos favoritos"
1242+
1243+#~ msgid "Swipe up to add a contact"
1244+#~ msgstr "Eslizar p'amestar un contactu"
1245+
1246+#~ msgid "Swipe from the left edge to open the launcher"
1247+#~ msgstr "Eslizar dende'l berbesu izquierdu p'abrir el llanzador"
1248+
1249+#~ msgid "Swipe from the top right edge to open the notification bar"
1250+#~ msgstr ""
1251+#~ "Esliza dende'l berbesu superior drechu p'abrir la barra de notificaciones"
1252+
1253+#~ msgid "Swipe from the top edge to open the notification bar"
1254+#~ msgstr "Esliza dende'l berbesu superior p'abrir la barra de notificaciones"
1255+
1256+#~ msgid "Short or long swipe from the right edge to view your open apps"
1257+#~ msgstr ""
1258+#~ "Eslizamientu curtiu o llargu dende'l berbesu drechu pa ver les apps abiertes"
1062
1259
1063−#~ msgid "Welcome to your Ubuntu device."
1260+#~ msgid "Swipe up to manage the app"
1064−#~ msgstr "Bienllegáu/ada al to preséu d'Ubuntu."
1261+#~ msgstr "Eslizar p'alministrar la app"
1065
1262
1066−#~ msgid "Please select how you’d like to unlock your device."
1263+#~ msgid "Swipe up to create a message"
1067−#~ msgstr "Esbilla cómo te prestaría desbloquiar el to preséu, por favor."
1264+#~ msgstr "Eslizar pa crear un mensaxe"
po/az.po+295−127
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,39 +15,39 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 18147)\n"
20
20
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
22msgid "Password: "
22msgid "Password: "
23msgstr "Şifrә: "
23msgstr "Şifrә: "
24
24
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
27msgid "Pin shortcut"
27msgid "Pin shortcut"
28msgstr "Pin qısayolu"
28msgstr "Pin qısayolu"
29
29
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
31msgid "Quit"
31msgid "Quit"
32msgstr ""
32msgstr ""
33
33
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
35msgid "Unpin shortcut"
35msgid "Unpin shortcut"
36msgstr "Açma qısayolu"
36msgstr "Açma qısayolu"
37
37
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
39msgid "Device Locked"
39msgid "Device Locked"
40msgstr ""
40msgstr ""
41
41
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
43msgid "You have been locked out due to too many failed passphrase attempts."
43msgid "You have been locked out due to too many failed passphrase attempts."
44msgstr ""
44msgstr ""
45
45
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
47msgid "You have been locked out due to too many failed passcode attempts."
47msgid "You have been locked out due to too many failed passcode attempts."
48msgstr ""
48msgstr ""
49
49
50−#: qml/Components/DelayedLockscreen.qml:74
50+#: qml/Components/DelayedLockscreen.qml:75
51#, qt-format
51#, qt-format
52msgid "Please wait %1 minute and then try again…"
52msgid "Please wait %1 minute and then try again…"
53msgid_plural "Please wait %1 minutes and then try again…"
53msgid_plural "Please wait %1 minutes and then try again…"
@@ -73,8 +73,8 @@ msgctxt "Button: Log out from the system"
73msgid "Log Out"
73msgid "Log Out"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
77+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
79msgid "Cancel"
79msgid "Cancel"
80msgstr "İmtina"
80msgstr "İmtina"
@@ -92,43 +92,213 @@ msgstr "Yenidәn başlatmaq istәdiyinizә әminsiniz?"
92msgid "No"
92msgid "No"
93msgstr "Yox"
93msgstr "Yox"
94
94
95−#: qml/Components/Dialogs.qml:183
95+#: qml/Components/Dialogs.qml:182
96msgid "Yes"
96msgid "Yes"
97msgstr "Hə"
97msgstr "Hə"
98
98
99−#: qml/Components/Dialogs.qml:198
99+#: qml/Components/Dialogs.qml:197
100msgctxt "Title: Power off/Restart dialog"
100msgctxt "Title: Power off/Restart dialog"
101msgid "Power"
101msgid "Power"
102msgstr ""
102msgstr ""
103
103
104−#: qml/Components/Dialogs.qml:199
104+#: qml/Components/Dialogs.qml:198
105msgid ""
105msgid ""
106"Are you sure you would like\n"
106"Are you sure you would like\n"
107"to power off?"
107"to power off?"
108msgstr ""
108msgstr ""
109
109
110−#: qml/Components/Dialogs.qml:201
110+#: qml/Components/Dialogs.qml:200
111msgctxt "Button: Power off the system"
111msgctxt "Button: Power off the system"
112msgid "Power off"
112msgid "Power off"
113msgstr ""
113msgstr ""
114
114
115−#: qml/Components/Dialogs.qml:210
115+#: qml/Components/Dialogs.qml:209
116msgctxt "Button: Restart the system"
116msgctxt "Button: Restart the system"
117msgid "Restart"
117msgid "Restart"
118msgstr ""
118msgstr ""
119
119
120+#: qml/Components/KeyboardShortcutsOverlay.qml:41
121+msgid "Keyboard Shortcuts"
122+msgstr ""
123+
124+#: qml/Components/KeyboardShortcutsOverlay.qml:55
125+msgid "Unity 8"
126+msgstr ""
127+
128+#: qml/Components/KeyboardShortcutsOverlay.qml:62
129+msgid "PrtScr"
130+msgstr ""
131+
132+#: qml/Components/KeyboardShortcutsOverlay.qml:67
133+msgid "Takes a screenshot."
134+msgstr ""
135+
136+#: qml/Components/KeyboardShortcutsOverlay.qml:75
137+msgid "Alt + PrtScr"
138+msgstr ""
139+
140+#: qml/Components/KeyboardShortcutsOverlay.qml:80
141+msgid "Takes a screenshot of a window."
142+msgstr ""
143+
144+#: qml/Components/KeyboardShortcutsOverlay.qml:88
145+msgid "Super + Space"
146+msgstr ""
147+
148+#: qml/Components/KeyboardShortcutsOverlay.qml:93
149+msgid "Switches to next keyboard layout."
150+msgstr ""
151+
152+#: qml/Components/KeyboardShortcutsOverlay.qml:101
153+msgid "Super + Shift + Space"
154+msgstr ""
155+
156+#: qml/Components/KeyboardShortcutsOverlay.qml:106
157+msgid "Switches to previous keyboard layout."
158+msgstr ""
159+
160+#: qml/Components/KeyboardShortcutsOverlay.qml:118
161+msgid "Launcher"
162+msgstr ""
163+
164+#: qml/Components/KeyboardShortcutsOverlay.qml:125
165+msgid "Super (Hold)"
166+msgstr ""
167+
168+#: qml/Components/KeyboardShortcutsOverlay.qml:130
169+msgid "Opens the launcher, displays shortcuts."
170+msgstr ""
171+
172+#: qml/Components/KeyboardShortcutsOverlay.qml:138
173+msgid "Alt + F1"
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:143
177+msgid "Opens launcher keyboard navigation mode."
178+msgstr ""
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:151
181+msgid "Super + Tab"
182+msgstr ""
183+
184+#: qml/Components/KeyboardShortcutsOverlay.qml:156
185+msgid "Switches applications via the launcher."
186+msgstr ""
187+
188+#: qml/Components/KeyboardShortcutsOverlay.qml:164
189+msgid "Super + 0 to 9"
190+msgstr ""
191+
192+#: qml/Components/KeyboardShortcutsOverlay.qml:169
193+msgid "Same as clicking on a launcher icon."
194+msgstr ""
195+
196+#: qml/Components/KeyboardShortcutsOverlay.qml:181
197+msgid "Scopes"
198+msgstr ""
199+
200+#: qml/Components/KeyboardShortcutsOverlay.qml:188
201+msgid "Super (Tap)"
202+msgstr ""
203+
204+#: qml/Components/KeyboardShortcutsOverlay.qml:193
205+msgid "Opens the Scopes home."
206+msgstr ""
207+
208+#: qml/Components/KeyboardShortcutsOverlay.qml:209
209+msgid "Switching"
210+msgstr ""
211+
212+#: qml/Components/KeyboardShortcutsOverlay.qml:216
213+msgid "Alt + Tab"
214+msgstr ""
215+
216+#: qml/Components/KeyboardShortcutsOverlay.qml:221
217+msgid "Switches between applications."
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:229
221+msgid "Super + W"
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:234
225+msgid "Opens the desktop spread."
226+msgstr ""
227+
228+#: qml/Components/KeyboardShortcutsOverlay.qml:242
229+msgid "Cursor Left or Right"
230+msgstr ""
231+
232+#: qml/Components/KeyboardShortcutsOverlay.qml:247
233+msgid "Moves the focus."
234+msgstr ""
235+
236+#: qml/Components/KeyboardShortcutsOverlay.qml:259
237+msgid "Windows"
238+msgstr ""
239+
240+#: qml/Components/KeyboardShortcutsOverlay.qml:266
241+msgid "Ctrl + Super + D"
242+msgstr ""
243+
244+#: qml/Components/KeyboardShortcutsOverlay.qml:271
245+msgid "Minimizes all windows."
246+msgstr ""
247+
248+#: qml/Components/KeyboardShortcutsOverlay.qml:279
249+msgid "Ctrl + Super + Up"
250+msgstr ""
251+
252+#: qml/Components/KeyboardShortcutsOverlay.qml:284
253+msgid "Maximizes the current window."
254+msgstr ""
255+
256+#: qml/Components/KeyboardShortcutsOverlay.qml:292
257+msgid "Ctrl + Super + Down"
258+msgstr ""
259+
260+#: qml/Components/KeyboardShortcutsOverlay.qml:297
261+msgid "Minimizes or restores the current window."
262+msgstr ""
263+
264+#: qml/Components/KeyboardShortcutsOverlay.qml:305
265+msgid "Ctrl + Super + Left or Right"
266+msgstr ""
267+
268+#: qml/Components/KeyboardShortcutsOverlay.qml:310
269+msgid "Semi-maximizes the current window."
270+msgstr ""
271+
272+#: qml/Components/KeyboardShortcutsOverlay.qml:318
273+msgid "Alt + F4"
274+msgstr ""
275+
276+#: qml/Components/KeyboardShortcutsOverlay.qml:323
277+msgid "Closes the current window."
278+msgstr ""
279+
120−#: qml/Components/Lockscreen.qml:231
280+#: qml/Components/Lockscreen.qml:239
121msgid "Return to Call"
281msgid "Return to Call"
122msgstr ""
282msgstr ""
123
283
124−#: qml/Components/Lockscreen.qml:231
284+#: qml/Components/Lockscreen.qml:239
125msgid "Emergency Call"
285msgid "Emergency Call"
126msgstr "Zərurət zəngi"
286msgstr "Zərurət zəngi"
127
287
128−#: qml/Components/Lockscreen.qml:263
288+#: qml/Components/Lockscreen.qml:271
129msgid "OK"
289msgid "OK"
130msgstr "Oldu"
290msgstr "Oldu"
131
291
292+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
293+#, qt-format
294+msgid "%1:%2:%3"
295+msgstr ""
296+
297+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
298+#, qt-format
299+msgid "%1:%2"
300+msgstr ""
301+
132#: qml/Components/ModeSwitchWarningDialog.qml:32
302#: qml/Components/ModeSwitchWarningDialog.qml:32
133msgid "Apps may have unsaved data:"
303msgid "Apps may have unsaved data:"
134msgstr ""
304msgstr ""
@@ -155,26 +325,30 @@ msgstr ""
155msgid "Close all"
325msgid "Close all"
156msgstr ""
326msgstr ""
157
327
328+#: qml/Components/SharingPicker.qml:54
329+msgid "Preview Share Item"
330+msgstr ""
331+
158−#: qml/Dash/DashPageHeader.qml:337
332+#: qml/Dash/DashPageHeader.qml:333
159msgctxt "Button: Open the Ubuntu Store"
333msgctxt "Button: Open the Ubuntu Store"
160msgid "Store"
334msgid "Store"
161msgstr ""
335msgstr ""
162
336
163−#: qml/Dash/DashPageHeader.qml:344
337+#: qml/Dash/DashPageHeader.qml:340
164msgctxt "Button: Start a search in the current dash scope"
338msgctxt "Button: Start a search in the current dash scope"
165msgid "Search"
339msgid "Search"
166msgstr ""
340msgstr ""
167
341
168−#: qml/Dash/DashPageHeader.qml:354
342+#: qml/Dash/DashPageHeader.qml:350
169msgctxt "Button: Show the current dash scope settings"
343msgctxt "Button: Show the current dash scope settings"
170msgid "Settings"
344msgid "Settings"
171msgstr ""
345msgstr ""
172
346
173−#: qml/Dash/DashPageHeader.qml:361
347+#: qml/Dash/DashPageHeader.qml:357
174msgid "Remove from Favorites"
348msgid "Remove from Favorites"
175msgstr "Seçilmişlәrdәn çıxart"
349msgstr "Seçilmişlәrdәn çıxart"
176
350
177−#: qml/Dash/DashPageHeader.qml:361
351+#: qml/Dash/DashPageHeader.qml:357
178msgid "Add to Favorites"
352msgid "Add to Favorites"
179msgstr "Seçilmişlәrә әlavә et"
353msgstr "Seçilmişlәrә әlavә et"
180
354
@@ -186,24 +360,24 @@ msgstr ""
186msgid "Reset"
360msgid "Reset"
187msgstr ""
361msgstr ""
188
362
189−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
363+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
190−msgid "See less"
364+msgid "Show less"
191−msgstr "Daha azını gör"
365+msgstr ""
192
366
193−#: qml/Dash/GenericScopeView.qml:570
367+#: qml/Dash/GenericScopeView.qml:580
194−msgid "See all"
368+msgid "Show all"
195−msgstr "Hamısını gör"
369+msgstr ""
196
370
197−#: qml/Dash/GenericScopeView.qml:627
371+#: qml/Dash/GenericScopeView.qml:637
198msgctxt "Label: Hint for dash search line edit"
372msgctxt "Label: Hint for dash search line edit"
199msgid "Search"
373msgid "Search"
200msgstr ""
374msgstr ""
201
375
202−#: qml/Dash/PageHeaderExtraPanel.qml:55
376+#: qml/Dash/PageHeaderExtraPanel.qml:56
203msgid "Recent Searches"
377msgid "Recent Searches"
204msgstr ""
378msgstr ""
205
379
206−#: qml/Dash/PageHeaderExtraPanel.qml:66
380+#: qml/Dash/PageHeaderExtraPanel.qml:67
207msgid "Clear All"
381msgid "Clear All"
208msgstr ""
382msgstr ""
209
383
@@ -216,22 +390,18 @@ msgid "Less..."
216msgstr "Az..."
390msgstr "Az..."
217
391
218#: qml/Dash/Previews/PreviewCommentInput.qml:68
392#: qml/Dash/Previews/PreviewCommentInput.qml:68
219−#: qml/Dash/Previews/PreviewRatingInput.qml:174
393+#: qml/Dash/Previews/PreviewRatingInput.qml:175
220msgid "Send"
394msgid "Send"
221msgstr "Göndər"
395msgstr "Göndər"
222
396
223−#: qml/Dash/Previews/PreviewRatingInput.qml:84
397+#: qml/Dash/Previews/PreviewRatingInput.qml:82
224msgid "Rate this"
398msgid "Rate this"
225msgstr "Qiymәtlәndir"
399msgstr "Qiymәtlәndir"
226
400
227−#: qml/Dash/Previews/PreviewRatingInput.qml:129
401+#: qml/Dash/Previews/PreviewRatingInput.qml:157
228msgid "Add a review"
402msgid "Add a review"
229msgstr "Rəy yaz"
403msgstr "Rəy yaz"
230
404
231−#: qml/Dash/Previews/PreviewSharing.qml:66
232−msgid "Preview Share Item"
233−msgstr ""
234−
235#: qml/Dash/PullToRefreshScopeStyle.qml:55
405#: qml/Dash/PullToRefreshScopeStyle.qml:55
236msgid "Pull to refresh…"
406msgid "Pull to refresh…"
237msgstr ""
407msgstr ""
@@ -244,49 +414,61 @@ msgstr ""
244msgid "Enable location data"
414msgid "Enable location data"
245msgstr ""
415msgstr ""
246
416
247−#: qml/Dash/ScopesList.qml:67
417+#: qml/Dash/ScopesList.qml:55
248msgid "Manage"
418msgid "Manage"
249msgstr ""
419msgstr ""
250
420
251−#: qml/Dash/ScopesList.qml:113
421+#: qml/Dash/ScopesList.qml:102
252msgid "Home"
422msgid "Home"
253msgstr ""
423msgstr ""
254
424
255−#: qml/Dash/ScopesList.qml:114
425+#: qml/Dash/ScopesList.qml:103
256msgid "Also installed"
426msgid "Also installed"
257msgstr ""
427msgstr ""
258
428
259−#: qml/DisabledScreenNotice.qml:104
429+#: qml/DisabledScreenNotice.qml:109
260msgid ""
430msgid ""
261"Your device is now connected to an external display. Use this screen as a "
431"Your device is now connected to an external display. Use this screen as a "
262"touch pad to interact with the pointer."
432"touch pad to interact with the pointer."
263msgstr ""
433msgstr ""
264
434
265−#: qml/Greeter/CoverPage.qml:118
435+#: qml/Greeter/CoverPage.qml:127
266msgid "Unlock"
436msgid "Unlock"
267msgstr ""
437msgstr ""
268
438
439+#: qml/Greeter/Greeter.qml:555
440+msgid "Try again"
441+msgstr ""
442+
269−#: qml/Greeter/LoginList.qml:239
443+#: qml/Greeter/LoginList.qml:63
444+msgid "Passphrase"
445+msgstr ""
446+
447+#: qml/Greeter/LoginList.qml:64
448+msgid "Passcode"
449+msgstr ""
450+
451+#: qml/Greeter/LoginList.qml:87
270msgid "Retry"
452msgid "Retry"
271msgstr ""
453msgstr ""
272
454
273−#: qml/Greeter/LoginList.qml:240
455+#: qml/Greeter/LoginList.qml:88
274−msgid "Tap to unlock"
456+msgid "Log In"
275msgstr ""
457msgstr ""
276
458
277−#: qml/Greeter/NarrowView.qml:54
459+#: qml/Greeter/NarrowView.qml:55
278msgid "Sorry, incorrect passphrase."
460msgid "Sorry, incorrect passphrase."
279msgstr "Bağışlayın, açar söz yanlışdır."
461msgstr "Bağışlayın, açar söz yanlışdır."
280
462
281−#: qml/Greeter/NarrowView.qml:55
463+#: qml/Greeter/NarrowView.qml:56
282msgid "Sorry, incorrect passcode."
464msgid "Sorry, incorrect passcode."
283msgstr "Təəssüf ki, açar kod yanlışdır."
465msgstr "Təəssüf ki, açar kod yanlışdır."
284
466
285−#: qml/Greeter/NarrowView.qml:56
467+#: qml/Greeter/NarrowView.qml:57
286msgid "This will be your last attempt."
468msgid "This will be your last attempt."
287msgstr "Bu sizin son cəhdiniz olacaq."
469msgstr "Bu sizin son cəhdiniz olacaq."
288
470
289−#: qml/Greeter/NarrowView.qml:58
471+#: qml/Greeter/NarrowView.qml:59
290msgid ""
472msgid ""
291"If passphrase is entered incorrectly, your phone will conduct a factory "
473"If passphrase is entered incorrectly, your phone will conduct a factory "
292"reset and all personal data will be deleted."
474"reset and all personal data will be deleted."
@@ -294,7 +476,7 @@ msgstr ""
294"Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
476"Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
295"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
477"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
296
478
297−#: qml/Greeter/NarrowView.qml:59
479+#: qml/Greeter/NarrowView.qml:60
298msgid ""
480msgid ""
299"If passcode is entered incorrectly, your phone will conduct a factory reset "
481"If passcode is entered incorrectly, your phone will conduct a factory reset "
300"and all personal data will be deleted."
482"and all personal data will be deleted."
@@ -302,38 +484,38 @@ msgstr ""
302"Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
484"Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
303"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
485"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
304
486
305−#: qml/Greeter/NarrowView.qml:116
487+#: qml/Greeter/NarrowView.qml:129
306#, qt-format
488#, qt-format
307msgid "Enter %1"
489msgid "Enter %1"
308msgstr ""
490msgstr ""
309
491
310−#: qml/Greeter/NarrowView.qml:117
492+#: qml/Greeter/NarrowView.qml:130
311msgid "Enter passphrase"
493msgid "Enter passphrase"
312msgstr ""
494msgstr ""
313
495
314−#: qml/Greeter/NarrowView.qml:118
496+#: qml/Greeter/NarrowView.qml:131
315msgid "Enter passcode"
497msgid "Enter passcode"
316msgstr ""
498msgstr ""
317
499
318−#: qml/Greeter/NarrowView.qml:119
500+#: qml/Greeter/NarrowView.qml:135
319#, qt-format
501#, qt-format
320msgid "Sorry, incorrect %1"
502msgid "Sorry, incorrect %1"
321msgstr "Bağışlayın, %1 yanlışdır"
503msgstr "Bağışlayın, %1 yanlışdır"
322
504
323−#: qml/Greeter/NarrowView.qml:120
505+#: qml/Greeter/NarrowView.qml:136
324msgid "Sorry, incorrect passphrase"
506msgid "Sorry, incorrect passphrase"
325msgstr "Bağışlayın, açar söz yanlışdır"
507msgstr "Bağışlayın, açar söz yanlışdır"
326
508
327−#: qml/Greeter/NarrowView.qml:121
509+#: qml/Greeter/NarrowView.qml:137
328msgctxt "passphrase"
510msgctxt "passphrase"
329msgid "Please re-enter"
511msgid "Please re-enter"
330msgstr ""
512msgstr ""
331
513
332−#: qml/Greeter/NarrowView.qml:122
514+#: qml/Greeter/NarrowView.qml:138
333msgid "Sorry, incorrect passcode"
515msgid "Sorry, incorrect passcode"
334msgstr ""
516msgstr ""
335
517
336−#: qml/Notifications/NotificationMenuItemFactory.qml:129
518+#: qml/Notifications/NotificationMenuItemFactory.qml:124
337msgid "Show password"
519msgid "Show password"
338msgstr "Şifrәni göstәr"
520msgstr "Şifrәni göstәr"
339
521
@@ -345,77 +527,77 @@ msgstr "Zəngə qayıtmaq üçün toxunun..."
345msgid "Conference"
527msgid "Conference"
346msgstr "Konfrans"
528msgstr "Konfrans"
347
529
348−#: qml/Panel/Indicators/MenuItemFactory.qml:761
530+#: qml/Panel/Indicators/MenuItemFactory.qml:762
349msgid "Nothing is playing"
531msgid "Nothing is playing"
350msgstr ""
532msgstr ""
351
533
352−#: qml/Panel/Indicators/MenuItemFactory.qml:890
534+#: qml/Panel/Indicators/MenuItemFactory.qml:891
353#, qt-format
535#, qt-format
354msgid "%1 hour"
536msgid "%1 hour"
355msgid_plural "%1 hours"
537msgid_plural "%1 hours"
356msgstr[0] ""
538msgstr[0] ""
357msgstr[1] ""
539msgstr[1] ""
358
540
359−#: qml/Panel/Indicators/MenuItemFactory.qml:894
541+#: qml/Panel/Indicators/MenuItemFactory.qml:895
360#, qt-format
542#, qt-format
361msgid "%1 minute"
543msgid "%1 minute"
362msgid_plural "%1 minutes"
544msgid_plural "%1 minutes"
363msgstr[0] ""
545msgstr[0] ""
364msgstr[1] ""
546msgstr[1] ""
365
547
366−#: qml/Panel/Indicators/MenuItemFactory.qml:899
548+#: qml/Panel/Indicators/MenuItemFactory.qml:900
367#, qt-format
549#, qt-format
368msgid "%1 second"
550msgid "%1 second"
369msgid_plural "%1 seconds"
551msgid_plural "%1 seconds"
370msgstr[0] ""
552msgstr[0] ""
371msgstr[1] ""
553msgstr[1] ""
372
554
373−#: qml/Panel/Indicators/MenuItemFactory.qml:902
555+#: qml/Panel/Indicators/MenuItemFactory.qml:903
374msgid "0 seconds"
556msgid "0 seconds"
375msgstr ""
557msgstr ""
376
558
377#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
559#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
378−#: qml/Panel/Indicators/MenuItemFactory.qml:904
560+#: qml/Panel/Indicators/MenuItemFactory.qml:905
379#, qt-format
561#, qt-format
380msgid "%1 remaining"
562msgid "%1 remaining"
381msgstr ""
563msgstr ""
382
564
383−#: qml/Panel/Indicators/MenuItemFactory.qml:910
565+#: qml/Panel/Indicators/MenuItemFactory.qml:911
384msgid "In queue…"
566msgid "In queue…"
385msgstr "Növbədədir..."
567msgstr "Növbədədir..."
386
568
387−#: qml/Panel/Indicators/MenuItemFactory.qml:914
569+#: qml/Panel/Indicators/MenuItemFactory.qml:915
388msgid "Downloading"
570msgid "Downloading"
389msgstr "Endirilir"
571msgstr "Endirilir"
390
572
391−#: qml/Panel/Indicators/MenuItemFactory.qml:916
573+#: qml/Panel/Indicators/MenuItemFactory.qml:917
392msgid "Paused, tap to resume"
574msgid "Paused, tap to resume"
393msgstr "Dayandırıldı. Davam etmək üçün toxunun"
575msgstr "Dayandırıldı. Davam etmək üçün toxunun"
394
576
395−#: qml/Panel/Indicators/MenuItemFactory.qml:918
577+#: qml/Panel/Indicators/MenuItemFactory.qml:919
396msgid "Canceled"
578msgid "Canceled"
397msgstr "İmtina edildi"
579msgstr "İmtina edildi"
398
580
399−#: qml/Panel/Indicators/MenuItemFactory.qml:920
581+#: qml/Panel/Indicators/MenuItemFactory.qml:921
400msgid "Finished"
582msgid "Finished"
401msgstr "Bitdi"
583msgstr "Bitdi"
402
584
403−#: qml/Panel/Indicators/MenuItemFactory.qml:922
585+#: qml/Panel/Indicators/MenuItemFactory.qml:923
404msgid "Failed, tap to retry"
586msgid "Failed, tap to retry"
405msgstr "Alınmadı. Yenidәn cәhd etmək üçün toxunun"
587msgstr "Alınmadı. Yenidәn cәhd etmək üçün toxunun"
406
588
407−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
589+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
408−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
590+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
409msgctxt "Button: Send a reply message"
591msgctxt "Button: Send a reply message"
410msgid "Send"
592msgid "Send"
411msgstr ""
593msgstr ""
412
594
413−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
595+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
414msgctxt "Label: Hint in message indicator line edit"
596msgctxt "Label: Hint in message indicator line edit"
415msgid "Reply"
597msgid "Reply"
416msgstr ""
598msgstr ""
417
599
418−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
600+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
419msgctxt "Button: Call back on phone"
601msgctxt "Button: Call back on phone"
420msgid "Call back"
602msgid "Call back"
421msgstr ""
603msgstr ""
@@ -424,48 +606,24 @@ msgstr ""
424msgid "Drag using 3 fingers any application from one window to the other"
606msgid "Drag using 3 fingers any application from one window to the other"
425msgstr ""
607msgstr ""
426
608
427−#: qml/Tutorial/TutorialBottom.qml:78
428−msgid "Swipe up to add a contact"
429−msgstr ""
430−
431−#: qml/Tutorial/TutorialBottom.qml:80
432−msgid "Swipe up for favorite calculations"
433−msgstr ""
434−
435−#: qml/Tutorial/TutorialBottom.qml:82
436−msgid "Swipe up for recent calls"
437−msgstr ""
438−
439−#: qml/Tutorial/TutorialBottom.qml:84
440−msgid "Swipe up to create a message"
441−msgstr ""
442−
443−#: qml/Tutorial/TutorialBottom.qml:85
444−msgid "Swipe up to manage the app"
445−msgstr ""
446−
447−#: qml/Tutorial/TutorialLeft.qml:47
448−msgid "Swipe from the left edge to open the launcher"
449−msgstr ""
450−
451−#: qml/Tutorial/TutorialLeftLong.qml:47
609+#: qml/Tutorial/TutorialLeftLong.qml:49
452msgid "Long swipe from the left edge to open the Today scope"
610msgid "Long swipe from the left edge to open the Today scope"
453msgstr ""
611msgstr ""
454
612
455−#: qml/Tutorial/TutorialRight.qml:54
613+#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Hover your mouse on the right edge to view your open apps"
614+msgid "Short swipe from the left edge to open the launcher"
457msgstr ""
615msgstr ""
458
616
459#: qml/Tutorial/TutorialRight.qml:55
617#: qml/Tutorial/TutorialRight.qml:55
460−msgid "Short or long swipe from the right edge to view your open apps"
618+msgid "Push your mouse against the right edge to view your open apps"
461msgstr ""
619msgstr ""
462
620
463−#: qml/Tutorial/TutorialTop.qml:53
621+#: qml/Tutorial/TutorialRight.qml:56
464−msgid "Swipe from the top right edge to open the notification bar"
622+msgid "Swipe from the right edge to view your open apps"
465msgstr ""
623msgstr ""
466
624
467−#: qml/Tutorial/TutorialTop.qml:54
625+#: qml/Tutorial/TutorialTop.qml:53
468−msgid "Swipe from the top edge to open the notification bar"
626+msgid "Swipe from the top edge to access notifications and quick settings"
469msgstr ""
627msgstr ""
470
628
471#: qml/Wizard/Page.qml:54
629#: qml/Wizard/Page.qml:54
@@ -477,11 +635,11 @@ msgstr ""
477msgid "Language"
635msgid "Language"
478msgstr ""
636msgstr ""
479
637
480−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
638+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
481−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
639+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
482#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
640#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
483#: qml/Wizard/Pages/75-report-check.qml:84
641#: qml/Wizard/Pages/75-report-check.qml:84
484−#: qml/Wizard/Pages/passcode-desktop.qml:124
642+#: qml/Wizard/Pages/passcode-desktop.qml:141
485#: qml/Wizard/Pages/password-set.qml:141
643#: qml/Wizard/Pages/password-set.qml:141
486msgid "Next"
644msgid "Next"
487msgstr ""
645msgstr ""
@@ -543,7 +701,7 @@ msgstr ""
543msgid "Time Zone"
701msgid "Time Zone"
544msgstr ""
702msgstr ""
545
703
546−#: qml/Wizard/Pages/50-timezone.qml:178
704+#: qml/Wizard/Pages/50-timezone.qml:181
547msgid "Enter your city"
705msgid "Enter your city"
548msgstr ""
706msgstr ""
549
707
@@ -633,7 +791,7 @@ msgid "Service Terms"
633msgstr ""
791msgstr ""
634
792
635#: qml/Wizard/Pages/passcode-confirm.qml:43
793#: qml/Wizard/Pages/passcode-confirm.qml:43
636−#: qml/Wizard/Pages/passcode-desktop.qml:80
794+#: qml/Wizard/Pages/passcode-desktop.qml:96
637msgid "Confirm passcode"
795msgid "Confirm passcode"
638msgstr ""
796msgstr ""
639
797
@@ -650,24 +808,24 @@ msgstr ""
650msgid "Lock Screen Passcode"
808msgid "Lock Screen Passcode"
651msgstr ""
809msgstr ""
652
810
653−#: qml/Wizard/Pages/passcode-desktop.qml:56
811+#: qml/Wizard/Pages/passcode-desktop.qml:60
654msgid "Enter 4 numbers to setup your passcode"
812msgid "Enter 4 numbers to setup your passcode"
655msgstr ""
813msgstr ""
656
814
657−#: qml/Wizard/Pages/passcode-desktop.qml:65
815+#: qml/Wizard/Pages/passcode-desktop.qml:76
658#: qml/Wizard/Pages/passcode-set.qml:54
816#: qml/Wizard/Pages/passcode-set.qml:54
659msgid "Choose passcode"
817msgid "Choose passcode"
660msgstr ""
818msgstr ""
661
819
662−#: qml/Wizard/Pages/passcode-desktop.qml:105
820+#: qml/Wizard/Pages/passcode-desktop.qml:126
663msgid "Passcode too short"
821msgid "Passcode too short"
664msgstr ""
822msgstr ""
665
823
666−#: qml/Wizard/Pages/passcode-desktop.qml:107
824+#: qml/Wizard/Pages/passcode-desktop.qml:128
667msgid "Passcodes match"
825msgid "Passcodes match"
668msgstr ""
826msgstr ""
669
827
670−#: qml/Wizard/Pages/passcode-desktop.qml:109
828+#: qml/Wizard/Pages/passcode-desktop.qml:130
671msgid "Passcodes do not match"
829msgid "Passcodes do not match"
672msgstr ""
830msgstr ""
673
831
@@ -716,26 +874,30 @@ msgid "To proceed with no SIM tap Skip."
716msgstr ""
874msgstr ""
717
875
718#: qml/Wizard/PasswordMeter.qml:87
876#: qml/Wizard/PasswordMeter.qml:87
719−msgid "Passwords match"
877+msgid "Password too short"
720msgstr ""
878msgstr ""
721
879
722#: qml/Wizard/PasswordMeter.qml:89
880#: qml/Wizard/PasswordMeter.qml:89
881+msgid "Passwords match"
882+msgstr ""
883+
884+#: qml/Wizard/PasswordMeter.qml:91
723msgid "Passwords do not match"
885msgid "Passwords do not match"
724msgstr ""
886msgstr ""
725
887
726−#: qml/Wizard/PasswordMeter.qml:93
888+#: qml/Wizard/PasswordMeter.qml:95
727msgid "Strong password"
889msgid "Strong password"
728msgstr ""
890msgstr ""
729
891
730−#: qml/Wizard/PasswordMeter.qml:95
892+#: qml/Wizard/PasswordMeter.qml:97
731msgid "Fair password"
893msgid "Fair password"
732msgstr ""
894msgstr ""
733
895
734−#: qml/Wizard/PasswordMeter.qml:97
896+#: qml/Wizard/PasswordMeter.qml:99
735msgid "Weak password"
897msgid "Weak password"
736msgstr ""
898msgstr ""
737
899
738−#: qml/Wizard/PasswordMeter.qml:99
900+#: qml/Wizard/PasswordMeter.qml:101
739msgid "Very weak password"
901msgid "Very weak password"
740msgstr ""
902msgstr ""
741
903
@@ -776,6 +938,9 @@ msgstr ""
776#~ msgid "Power off"
938#~ msgid "Power off"
777#~ msgstr "Söndür"
939#~ msgstr "Söndür"
778
940
941+#~ msgid "See all"
942+#~ msgstr "Hamısını gör"
943+
779#~ msgid "All"
944#~ msgid "All"
780#~ msgstr "Hamısı"
945#~ msgstr "Hamısı"
781
946
@@ -825,5 +990,8 @@ msgstr ""
825#~ msgid "Settings"
990#~ msgid "Settings"
826#~ msgstr "Tənzimləmələr"
991#~ msgstr "Tənzimləmələr"
827
992
993+#~ msgid "See less"
994+#~ msgstr "Daha azını gör"
995+
828#~ msgid "Type or say a command"
996#~ msgid "Type or say a command"
829#~ msgstr "Bir әmr söyləyin və ya yazın"
997#~ msgstr "Bir әmr söyləyin və ya yazın"
po/be.po+299−128
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11"PO-Revision-Date: 2015-12-13 13:12+0000\n"
11"PO-Revision-Date: 2015-12-13 13:12+0000\n"
12"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
12"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
13"Language-Team: Belarusian <be@li.org>\n"
13"Language-Team: Belarusian <be@li.org>\n"
@@ -16,42 +16,42 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 18147)\n"
21
21
22−#: plugins/IntegratedLightDM/Greeter.cpp:112
22+#: plugins/LightDM/Greeter.cpp:123
23msgid "Password: "
23msgid "Password: "
24msgstr "Пароль: "
24msgstr "Пароль: "
25
25
26−#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:49
27−#: plugins/Unity/Launcher/launcheritem.cpp:107
27+#: plugins/Unity/Launcher/launcheritem.cpp:108
28msgid "Pin shortcut"
28msgid "Pin shortcut"
29msgstr "Замацаваць кнопку"
29msgstr "Замацаваць кнопку"
30
30
31−#: plugins/Unity/Launcher/launcheritem.cpp:53
31+#: plugins/Unity/Launcher/launcheritem.cpp:54
32msgid "Quit"
32msgid "Quit"
33msgstr "Выйсці"
33msgstr "Выйсці"
34
34
35−#: plugins/Unity/Launcher/launcheritem.cpp:107
35+#: plugins/Unity/Launcher/launcheritem.cpp:108
36msgid "Unpin shortcut"
36msgid "Unpin shortcut"
37msgstr "Адмацаваць кнопку"
37msgstr "Адмацаваць кнопку"
38
38
39−#: qml/Components/DelayedLockscreen.qml:49
39+#: qml/Components/DelayedLockscreen.qml:50
40msgid "Device Locked"
40msgid "Device Locked"
41msgstr "Прылада заблакаваная"
41msgstr "Прылада заблакаваная"
42
42
43−#: qml/Components/DelayedLockscreen.qml:64
43+#: qml/Components/DelayedLockscreen.qml:65
44msgid "You have been locked out due to too many failed passphrase attempts."
44msgid "You have been locked out due to too many failed passphrase attempts."
45msgstr ""
45msgstr ""
46"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў."
46"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў."
47
47
48−#: qml/Components/DelayedLockscreen.qml:65
48+#: qml/Components/DelayedLockscreen.qml:66
49msgid "You have been locked out due to too many failed passcode attempts."
49msgid "You have been locked out due to too many failed passcode attempts."
50msgstr ""
50msgstr ""
51"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў уводу "
51"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў уводу "
52"кода доступу."
52"кода доступу."
53
53
54−#: qml/Components/DelayedLockscreen.qml:74
54+#: qml/Components/DelayedLockscreen.qml:75
55#, qt-format
55#, qt-format
56msgid "Please wait %1 minute and then try again…"
56msgid "Please wait %1 minute and then try again…"
57msgid_plural "Please wait %1 minutes and then try again…"
57msgid_plural "Please wait %1 minutes and then try again…"
@@ -78,8 +78,8 @@ msgctxt "Button: Log out from the system"
78msgid "Log Out"
78msgid "Log Out"
79msgstr "Выйсці"
79msgstr "Выйсці"
80
80
81−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
81+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
82−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
82+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
83#: qml/Wizard/Pages/passcode-set.qml:32
83#: qml/Wizard/Pages/passcode-set.qml:32
84msgid "Cancel"
84msgid "Cancel"
85msgstr "Скасаваць"
85msgstr "Скасаваць"
@@ -97,16 +97,16 @@ msgstr "Вы ўпэўнены, што жадаеце перазагрузіць?
97msgid "No"
97msgid "No"
98msgstr "Не"
98msgstr "Не"
99
99
100−#: qml/Components/Dialogs.qml:183
100+#: qml/Components/Dialogs.qml:182
101msgid "Yes"
101msgid "Yes"
102msgstr "Так"
102msgstr "Так"
103
103
104−#: qml/Components/Dialogs.qml:198
104+#: qml/Components/Dialogs.qml:197
105msgctxt "Title: Power off/Restart dialog"
105msgctxt "Title: Power off/Restart dialog"
106msgid "Power"
106msgid "Power"
107msgstr "Сілкаванне"
107msgstr "Сілкаванне"
108
108
109−#: qml/Components/Dialogs.qml:199
109+#: qml/Components/Dialogs.qml:198
110msgid ""
110msgid ""
111"Are you sure you would like\n"
111"Are you sure you would like\n"
112"to power off?"
112"to power off?"
@@ -114,28 +114,198 @@ msgstr ""
114"Вы ўпэўнены, што хочаце\n"
114"Вы ўпэўнены, што хочаце\n"
115"выключыць камп'ютэр?"
115"выключыць камп'ютэр?"
116
116
117−#: qml/Components/Dialogs.qml:201
117+#: qml/Components/Dialogs.qml:200
118msgctxt "Button: Power off the system"
118msgctxt "Button: Power off the system"
119msgid "Power off"
119msgid "Power off"
120msgstr "Выключыць"
120msgstr "Выключыць"
121
121
122−#: qml/Components/Dialogs.qml:210
122+#: qml/Components/Dialogs.qml:209
123msgctxt "Button: Restart the system"
123msgctxt "Button: Restart the system"
124msgid "Restart"
124msgid "Restart"
125msgstr "Перазапуск"
125msgstr "Перазапуск"
126
126
127+#: qml/Components/KeyboardShortcutsOverlay.qml:41
128+msgid "Keyboard Shortcuts"
129+msgstr ""
130+
131+#: qml/Components/KeyboardShortcutsOverlay.qml:55
132+msgid "Unity 8"
133+msgstr ""
134+
135+#: qml/Components/KeyboardShortcutsOverlay.qml:62
136+msgid "PrtScr"
137+msgstr ""
138+
139+#: qml/Components/KeyboardShortcutsOverlay.qml:67
140+msgid "Takes a screenshot."
141+msgstr ""
142+
143+#: qml/Components/KeyboardShortcutsOverlay.qml:75
144+msgid "Alt + PrtScr"
145+msgstr ""
146+
147+#: qml/Components/KeyboardShortcutsOverlay.qml:80
148+msgid "Takes a screenshot of a window."
149+msgstr ""
150+
151+#: qml/Components/KeyboardShortcutsOverlay.qml:88
152+msgid "Super + Space"
153+msgstr ""
154+
155+#: qml/Components/KeyboardShortcutsOverlay.qml:93
156+msgid "Switches to next keyboard layout."
157+msgstr ""
158+
159+#: qml/Components/KeyboardShortcutsOverlay.qml:101
160+msgid "Super + Shift + Space"
161+msgstr ""
162+
163+#: qml/Components/KeyboardShortcutsOverlay.qml:106
164+msgid "Switches to previous keyboard layout."
165+msgstr ""
166+
167+#: qml/Components/KeyboardShortcutsOverlay.qml:118
168+msgid "Launcher"
169+msgstr ""
170+
171+#: qml/Components/KeyboardShortcutsOverlay.qml:125
172+msgid "Super (Hold)"
173+msgstr ""
174+
175+#: qml/Components/KeyboardShortcutsOverlay.qml:130
176+msgid "Opens the launcher, displays shortcuts."
177+msgstr ""
178+
179+#: qml/Components/KeyboardShortcutsOverlay.qml:138
180+msgid "Alt + F1"
181+msgstr ""
182+
183+#: qml/Components/KeyboardShortcutsOverlay.qml:143
184+msgid "Opens launcher keyboard navigation mode."
185+msgstr ""
186+
187+#: qml/Components/KeyboardShortcutsOverlay.qml:151
188+msgid "Super + Tab"
189+msgstr ""
190+
191+#: qml/Components/KeyboardShortcutsOverlay.qml:156
192+msgid "Switches applications via the launcher."
193+msgstr ""
194+
195+#: qml/Components/KeyboardShortcutsOverlay.qml:164
196+msgid "Super + 0 to 9"
197+msgstr ""
198+
199+#: qml/Components/KeyboardShortcutsOverlay.qml:169
200+msgid "Same as clicking on a launcher icon."
201+msgstr ""
202+
203+#: qml/Components/KeyboardShortcutsOverlay.qml:181
204+msgid "Scopes"
205+msgstr ""
206+
207+#: qml/Components/KeyboardShortcutsOverlay.qml:188
208+msgid "Super (Tap)"
209+msgstr ""
210+
211+#: qml/Components/KeyboardShortcutsOverlay.qml:193
212+msgid "Opens the Scopes home."
213+msgstr ""
214+
215+#: qml/Components/KeyboardShortcutsOverlay.qml:209
216+msgid "Switching"
217+msgstr ""
218+
219+#: qml/Components/KeyboardShortcutsOverlay.qml:216
220+msgid "Alt + Tab"
221+msgstr ""
222+
223+#: qml/Components/KeyboardShortcutsOverlay.qml:221
224+msgid "Switches between applications."
225+msgstr ""
226+
227+#: qml/Components/KeyboardShortcutsOverlay.qml:229
228+msgid "Super + W"
229+msgstr ""
230+
231+#: qml/Components/KeyboardShortcutsOverlay.qml:234
232+msgid "Opens the desktop spread."
233+msgstr ""
234+
235+#: qml/Components/KeyboardShortcutsOverlay.qml:242
236+msgid "Cursor Left or Right"
237+msgstr ""
238+
239+#: qml/Components/KeyboardShortcutsOverlay.qml:247
240+msgid "Moves the focus."
241+msgstr ""
242+
243+#: qml/Components/KeyboardShortcutsOverlay.qml:259
244+msgid "Windows"
245+msgstr ""
246+
247+#: qml/Components/KeyboardShortcutsOverlay.qml:266
248+msgid "Ctrl + Super + D"
249+msgstr ""
250+
251+#: qml/Components/KeyboardShortcutsOverlay.qml:271
252+msgid "Minimizes all windows."
253+msgstr ""
254+
255+#: qml/Components/KeyboardShortcutsOverlay.qml:279
256+msgid "Ctrl + Super + Up"
257+msgstr ""
258+
259+#: qml/Components/KeyboardShortcutsOverlay.qml:284
260+msgid "Maximizes the current window."
261+msgstr ""
262+
263+#: qml/Components/KeyboardShortcutsOverlay.qml:292
264+msgid "Ctrl + Super + Down"
265+msgstr ""
266+
267+#: qml/Components/KeyboardShortcutsOverlay.qml:297
268+msgid "Minimizes or restores the current window."
269+msgstr ""
270+
271+#: qml/Components/KeyboardShortcutsOverlay.qml:305
272+msgid "Ctrl + Super + Left or Right"
273+msgstr ""
274+
275+#: qml/Components/KeyboardShortcutsOverlay.qml:310
276+msgid "Semi-maximizes the current window."
277+msgstr ""
278+
279+#: qml/Components/KeyboardShortcutsOverlay.qml:318
280+msgid "Alt + F4"
281+msgstr ""
282+
283+#: qml/Components/KeyboardShortcutsOverlay.qml:323
284+msgid "Closes the current window."
285+msgstr ""
286+
127−#: qml/Components/Lockscreen.qml:231
287+#: qml/Components/Lockscreen.qml:239
128msgid "Return to Call"
288msgid "Return to Call"
129msgstr "Вярнуцца да выкліку"
289msgstr "Вярнуцца да выкліку"
130
290
131−#: qml/Components/Lockscreen.qml:231
291+#: qml/Components/Lockscreen.qml:239
132msgid "Emergency Call"
292msgid "Emergency Call"
133msgstr "Терміновы выклік"
293msgstr "Терміновы выклік"
134
294
135−#: qml/Components/Lockscreen.qml:263
295+#: qml/Components/Lockscreen.qml:271
136msgid "OK"
296msgid "OK"
137msgstr "Добра"
297msgstr "Добра"
138
298
299+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
300+#, qt-format
301+msgid "%1:%2:%3"
302+msgstr ""
303+
304+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
305+#, qt-format
306+msgid "%1:%2"
307+msgstr ""
308+
139#: qml/Components/ModeSwitchWarningDialog.qml:32
309#: qml/Components/ModeSwitchWarningDialog.qml:32
140msgid "Apps may have unsaved data:"
310msgid "Apps may have unsaved data:"
141msgstr "Прылады могуць мець незахованыя дадзеныя:"
311msgstr "Прылады могуць мець незахованыя дадзеныя:"
@@ -162,26 +332,30 @@ msgstr "Перападлучыцца зараз!"
162msgid "Close all"
332msgid "Close all"
163msgstr "Зачыніць усё"
333msgstr "Зачыніць усё"
164
334
335+#: qml/Components/SharingPicker.qml:54
336+msgid "Preview Share Item"
337+msgstr "Праглядзець элемент"
338+
165−#: qml/Dash/DashPageHeader.qml:337
339+#: qml/Dash/DashPageHeader.qml:333
166msgctxt "Button: Open the Ubuntu Store"
340msgctxt "Button: Open the Ubuntu Store"
167msgid "Store"
341msgid "Store"
168msgstr "Крама"
342msgstr "Крама"
169
343
170−#: qml/Dash/DashPageHeader.qml:344
344+#: qml/Dash/DashPageHeader.qml:340
171msgctxt "Button: Start a search in the current dash scope"
345msgctxt "Button: Start a search in the current dash scope"
172msgid "Search"
346msgid "Search"
173msgstr "Пошук"
347msgstr "Пошук"
174
348
175−#: qml/Dash/DashPageHeader.qml:354
349+#: qml/Dash/DashPageHeader.qml:350
176msgctxt "Button: Show the current dash scope settings"
350msgctxt "Button: Show the current dash scope settings"
177msgid "Settings"
351msgid "Settings"
178msgstr "Налады"
352msgstr "Налады"
179
353
180−#: qml/Dash/DashPageHeader.qml:361
354+#: qml/Dash/DashPageHeader.qml:357
181msgid "Remove from Favorites"
355msgid "Remove from Favorites"
182msgstr "Выдаліць з абранага"
356msgstr "Выдаліць з абранага"
183
357
184−#: qml/Dash/DashPageHeader.qml:361
358+#: qml/Dash/DashPageHeader.qml:357
185msgid "Add to Favorites"
359msgid "Add to Favorites"
186msgstr "Дадаць да абранага"
360msgstr "Дадаць да абранага"
187
361
@@ -193,24 +367,24 @@ msgstr ""
193msgid "Reset"
367msgid "Reset"
194msgstr ""
368msgstr ""
195
369
196−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
370+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
197−msgid "See less"
371+msgid "Show less"
198−msgstr "Карацей"
372+msgstr ""
199
373
200−#: qml/Dash/GenericScopeView.qml:570
374+#: qml/Dash/GenericScopeView.qml:580
201−msgid "See all"
375+msgid "Show all"
202−msgstr "Больш падрабязна"
376+msgstr ""
203
377
204−#: qml/Dash/GenericScopeView.qml:627
378+#: qml/Dash/GenericScopeView.qml:637
205msgctxt "Label: Hint for dash search line edit"
379msgctxt "Label: Hint for dash search line edit"
206msgid "Search"
380msgid "Search"
207msgstr "Пошук"
381msgstr "Пошук"
208
382
209−#: qml/Dash/PageHeaderExtraPanel.qml:55
383+#: qml/Dash/PageHeaderExtraPanel.qml:56
210msgid "Recent Searches"
384msgid "Recent Searches"
211msgstr ""
385msgstr ""
212
386
213−#: qml/Dash/PageHeaderExtraPanel.qml:66
387+#: qml/Dash/PageHeaderExtraPanel.qml:67
214msgid "Clear All"
388msgid "Clear All"
215msgstr ""
389msgstr ""
216
390
@@ -223,22 +397,18 @@ msgid "Less..."
223msgstr "Менш..."
397msgstr "Менш..."
224
398
225#: qml/Dash/Previews/PreviewCommentInput.qml:68
399#: qml/Dash/Previews/PreviewCommentInput.qml:68
226−#: qml/Dash/Previews/PreviewRatingInput.qml:174
400+#: qml/Dash/Previews/PreviewRatingInput.qml:175
227msgid "Send"
401msgid "Send"
228msgstr "Адправіць"
402msgstr "Адправіць"
229
403
230−#: qml/Dash/Previews/PreviewRatingInput.qml:84
404+#: qml/Dash/Previews/PreviewRatingInput.qml:82
231msgid "Rate this"
405msgid "Rate this"
232msgstr "Ацаніць"
406msgstr "Ацаніць"
233
407
234−#: qml/Dash/Previews/PreviewRatingInput.qml:129
408+#: qml/Dash/Previews/PreviewRatingInput.qml:157
235msgid "Add a review"
409msgid "Add a review"
236msgstr "Дадаць рэцэнзію"
410msgstr "Дадаць рэцэнзію"
237
411
238−#: qml/Dash/Previews/PreviewSharing.qml:66
239−msgid "Preview Share Item"
240−msgstr "Праглядзець элемент"
241−
242#: qml/Dash/PullToRefreshScopeStyle.qml:55
412#: qml/Dash/PullToRefreshScopeStyle.qml:55
243msgid "Pull to refresh…"
413msgid "Pull to refresh…"
244msgstr "Пацягніце для абнаўлення..."
414msgstr "Пацягніце для абнаўлення..."
@@ -251,49 +421,61 @@ msgstr "Адпусціце для абнаўлення..."
251msgid "Enable location data"
421msgid "Enable location data"
252msgstr "Уключыць дадзеныя аб месцазнаходжанні"
422msgstr "Уключыць дадзеныя аб месцазнаходжанні"
253
423
254−#: qml/Dash/ScopesList.qml:67
424+#: qml/Dash/ScopesList.qml:55
255msgid "Manage"
425msgid "Manage"
256msgstr "Кіраванне"
426msgstr "Кіраванне"
257
427
258−#: qml/Dash/ScopesList.qml:113
428+#: qml/Dash/ScopesList.qml:102
259msgid "Home"
429msgid "Home"
260msgstr "Хатняя папка"
430msgstr "Хатняя папка"
261
431
262−#: qml/Dash/ScopesList.qml:114
432+#: qml/Dash/ScopesList.qml:103
263msgid "Also installed"
433msgid "Also installed"
264msgstr "Таксама ўсталявана"
434msgstr "Таксама ўсталявана"
265
435
266−#: qml/DisabledScreenNotice.qml:104
436+#: qml/DisabledScreenNotice.qml:109
267msgid ""
437msgid ""
268"Your device is now connected to an external display. Use this screen as a "
438"Your device is now connected to an external display. Use this screen as a "
269"touch pad to interact with the pointer."
439"touch pad to interact with the pointer."
270msgstr ""
440msgstr ""
271
441
272−#: qml/Greeter/CoverPage.qml:118
442+#: qml/Greeter/CoverPage.qml:127
273msgid "Unlock"
443msgid "Unlock"
274msgstr "Разблакаваць"
444msgstr "Разблакаваць"
275
445
446+#: qml/Greeter/Greeter.qml:555
447+msgid "Try again"
448+msgstr ""
449+
276−#: qml/Greeter/LoginList.qml:239
450+#: qml/Greeter/LoginList.qml:63
451+msgid "Passphrase"
452+msgstr ""
453+
454+#: qml/Greeter/LoginList.qml:64
455+msgid "Passcode"
456+msgstr ""
457+
458+#: qml/Greeter/LoginList.qml:87
277msgid "Retry"
459msgid "Retry"
278msgstr "Паспрабаваць зноў"
460msgstr "Паспрабаваць зноў"
279
461
280−#: qml/Greeter/LoginList.qml:240
462+#: qml/Greeter/LoginList.qml:88
281−msgid "Tap to unlock"
463+msgid "Log In"
282−msgstr "Націсніце, каб разблакаваць"
464+msgstr ""
283
465
284−#: qml/Greeter/NarrowView.qml:54
466+#: qml/Greeter/NarrowView.qml:55
285msgid "Sorry, incorrect passphrase."
467msgid "Sorry, incorrect passphrase."
286msgstr "Даруйце, няслушны пароль."
468msgstr "Даруйце, няслушны пароль."
287
469
288−#: qml/Greeter/NarrowView.qml:55
470+#: qml/Greeter/NarrowView.qml:56
289msgid "Sorry, incorrect passcode."
471msgid "Sorry, incorrect passcode."
290msgstr "Даруйце, няслушны код."
472msgstr "Даруйце, няслушны код."
291
473
292−#: qml/Greeter/NarrowView.qml:56
474+#: qml/Greeter/NarrowView.qml:57
293msgid "This will be your last attempt."
475msgid "This will be your last attempt."
294msgstr "Апошняя спроба."
476msgstr "Апошняя спроба."
295
477
296−#: qml/Greeter/NarrowView.qml:58
478+#: qml/Greeter/NarrowView.qml:59
297msgid ""
479msgid ""
298"If passphrase is entered incorrectly, your phone will conduct a factory "
480"If passphrase is entered incorrectly, your phone will conduct a factory "
299"reset and all personal data will be deleted."
481"reset and all personal data will be deleted."
@@ -301,7 +483,7 @@ msgstr ""
301"Калі ўведзены пароль неправільны, Ваш тэлефон зробіць агульны скід налад і "
483"Калі ўведзены пароль неправільны, Ваш тэлефон зробіць агульны скід налад і "
302"ўсе асабістыя дадзеныя будуць выдалены."
484"ўсе асабістыя дадзеныя будуць выдалены."
303
485
304−#: qml/Greeter/NarrowView.qml:59
486+#: qml/Greeter/NarrowView.qml:60
305msgid ""
487msgid ""
306"If passcode is entered incorrectly, your phone will conduct a factory reset "
488"If passcode is entered incorrectly, your phone will conduct a factory reset "
307"and all personal data will be deleted."
489"and all personal data will be deleted."
@@ -309,38 +491,38 @@ msgstr ""
309"Калі ўведзены код неправільны, Ваш тэлефон зробіць агульны скід налад і ўсе "
491"Калі ўведзены код неправільны, Ваш тэлефон зробіць агульны скід налад і ўсе "
310"асабістыя дадзеныя будуць выдалены."
492"асабістыя дадзеныя будуць выдалены."
311
493
312−#: qml/Greeter/NarrowView.qml:116
494+#: qml/Greeter/NarrowView.qml:129
313#, qt-format
495#, qt-format
314msgid "Enter %1"
496msgid "Enter %1"
315msgstr "Увядзіце %1"
497msgstr "Увядзіце %1"
316
498
317−#: qml/Greeter/NarrowView.qml:117
499+#: qml/Greeter/NarrowView.qml:130
318msgid "Enter passphrase"
500msgid "Enter passphrase"
319msgstr "Увядзіце пароль"
501msgstr "Увядзіце пароль"
320
502
321−#: qml/Greeter/NarrowView.qml:118
503+#: qml/Greeter/NarrowView.qml:131
322msgid "Enter passcode"
504msgid "Enter passcode"
323msgstr "Увядзіце код"
505msgstr "Увядзіце код"
324
506
325−#: qml/Greeter/NarrowView.qml:119
507+#: qml/Greeter/NarrowView.qml:135
326#, qt-format
508#, qt-format
327msgid "Sorry, incorrect %1"
509msgid "Sorry, incorrect %1"
328msgstr "Даруйце, некарэктны %1"
510msgstr "Даруйце, некарэктны %1"
329
511
330−#: qml/Greeter/NarrowView.qml:120
512+#: qml/Greeter/NarrowView.qml:136
331msgid "Sorry, incorrect passphrase"
513msgid "Sorry, incorrect passphrase"
332msgstr "Даруйце, някарэктны пароль"
514msgstr "Даруйце, някарэктны пароль"
333
515
334−#: qml/Greeter/NarrowView.qml:121
516+#: qml/Greeter/NarrowView.qml:137
335msgctxt "passphrase"
517msgctxt "passphrase"
336msgid "Please re-enter"
518msgid "Please re-enter"
337msgstr "Калі ласка, паўтарыце ўвод"
519msgstr "Калі ласка, паўтарыце ўвод"
338
520
339−#: qml/Greeter/NarrowView.qml:122
521+#: qml/Greeter/NarrowView.qml:138
340msgid "Sorry, incorrect passcode"
522msgid "Sorry, incorrect passcode"
341msgstr "Даруйце, некарэктны код"
523msgstr "Даруйце, некарэктны код"
342
524
343−#: qml/Notifications/NotificationMenuItemFactory.qml:129
525+#: qml/Notifications/NotificationMenuItemFactory.qml:124
344msgid "Show password"
526msgid "Show password"
345msgstr "Паказаць пароль"
527msgstr "Паказаць пароль"
346
528
@@ -352,11 +534,11 @@ msgstr "Націсніце, каб вярнуцца да выкліку..."
352msgid "Conference"
534msgid "Conference"
353msgstr "Канферэнцыя"
535msgstr "Канферэнцыя"
354
536
355−#: qml/Panel/Indicators/MenuItemFactory.qml:761
537+#: qml/Panel/Indicators/MenuItemFactory.qml:762
356msgid "Nothing is playing"
538msgid "Nothing is playing"
357msgstr "Нічога не грае"
539msgstr "Нічога не грае"
358
540
359−#: qml/Panel/Indicators/MenuItemFactory.qml:890
541+#: qml/Panel/Indicators/MenuItemFactory.qml:891
360#, qt-format
542#, qt-format
361msgid "%1 hour"
543msgid "%1 hour"
362msgid_plural "%1 hours"
544msgid_plural "%1 hours"
@@ -364,7 +546,7 @@ msgstr[0] "%1 гадзіна"
364msgstr[1] "%1 гадзіны"
546msgstr[1] "%1 гадзіны"
365msgstr[2] "%1 гадзінаў"
547msgstr[2] "%1 гадзінаў"
366
548
367−#: qml/Panel/Indicators/MenuItemFactory.qml:894
549+#: qml/Panel/Indicators/MenuItemFactory.qml:895
368#, qt-format
550#, qt-format
369msgid "%1 minute"
551msgid "%1 minute"
370msgid_plural "%1 minutes"
552msgid_plural "%1 minutes"
@@ -372,7 +554,7 @@ msgstr[0] "%1 хвіліна"
372msgstr[1] "%1 хвіліны"
554msgstr[1] "%1 хвіліны"
373msgstr[2] "%1 хвілінаў"
555msgstr[2] "%1 хвілінаў"
374
556
375−#: qml/Panel/Indicators/MenuItemFactory.qml:899
557+#: qml/Panel/Indicators/MenuItemFactory.qml:900
376#, qt-format
558#, qt-format
377msgid "%1 second"
559msgid "%1 second"
378msgid_plural "%1 seconds"
560msgid_plural "%1 seconds"
@@ -380,52 +562,52 @@ msgstr[0] "%1 секунда"
380msgstr[1] "%1 секунды"
562msgstr[1] "%1 секунды"
381msgstr[2] "%1 секундаў"
563msgstr[2] "%1 секундаў"
382
564
383−#: qml/Panel/Indicators/MenuItemFactory.qml:902
565+#: qml/Panel/Indicators/MenuItemFactory.qml:903
384msgid "0 seconds"
566msgid "0 seconds"
385msgstr "0 секунд"
567msgstr "0 секунд"
386
568
387#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
569#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
388−#: qml/Panel/Indicators/MenuItemFactory.qml:904
570+#: qml/Panel/Indicators/MenuItemFactory.qml:905
389#, qt-format
571#, qt-format
390msgid "%1 remaining"
572msgid "%1 remaining"
391msgstr "%1 засталося"
573msgstr "%1 засталося"
392
574
393−#: qml/Panel/Indicators/MenuItemFactory.qml:910
575+#: qml/Panel/Indicators/MenuItemFactory.qml:911
394msgid "In queue…"
576msgid "In queue…"
395msgstr "У чарзе..."
577msgstr "У чарзе..."
396
578
397−#: qml/Panel/Indicators/MenuItemFactory.qml:914
579+#: qml/Panel/Indicators/MenuItemFactory.qml:915
398msgid "Downloading"
580msgid "Downloading"
399msgstr "Запампоўка"
581msgstr "Запампоўка"
400
582
401−#: qml/Panel/Indicators/MenuItemFactory.qml:916
583+#: qml/Panel/Indicators/MenuItemFactory.qml:917
402msgid "Paused, tap to resume"
584msgid "Paused, tap to resume"
403msgstr "Прыпынена, націсніце для працягу"
585msgstr "Прыпынена, націсніце для працягу"
404
586
405−#: qml/Panel/Indicators/MenuItemFactory.qml:918
587+#: qml/Panel/Indicators/MenuItemFactory.qml:919
406msgid "Canceled"
588msgid "Canceled"
407msgstr "Скасавана"
589msgstr "Скасавана"
408
590
409−#: qml/Panel/Indicators/MenuItemFactory.qml:920
591+#: qml/Panel/Indicators/MenuItemFactory.qml:921
410msgid "Finished"
592msgid "Finished"
411msgstr "Скончана"
593msgstr "Скончана"
412
594
413−#: qml/Panel/Indicators/MenuItemFactory.qml:922
595+#: qml/Panel/Indicators/MenuItemFactory.qml:923
414msgid "Failed, tap to retry"
596msgid "Failed, tap to retry"
415msgstr "Не атрымалася, націсніце, каб паўтарыць спробу"
597msgstr "Не атрымалася, націсніце, каб паўтарыць спробу"
416
598
417−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
599+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
418−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
600+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
419msgctxt "Button: Send a reply message"
601msgctxt "Button: Send a reply message"
420msgid "Send"
602msgid "Send"
421msgstr "Даслаць"
603msgstr "Даслаць"
422
604
423−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
605+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
424msgctxt "Label: Hint in message indicator line edit"
606msgctxt "Label: Hint in message indicator line edit"
425msgid "Reply"
607msgid "Reply"
426msgstr "Адказаць"
608msgstr "Адказаць"
427
609
428−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
610+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
429msgctxt "Button: Call back on phone"
611msgctxt "Button: Call back on phone"
430msgid "Call back"
612msgid "Call back"
431msgstr "Патэлефанаваць"
613msgstr "Патэлефанаваць"
@@ -434,48 +616,24 @@ msgstr "Патэлефанаваць"
434msgid "Drag using 3 fingers any application from one window to the other"
616msgid "Drag using 3 fingers any application from one window to the other"
435msgstr ""
617msgstr ""
436
618
437−#: qml/Tutorial/TutorialBottom.qml:78
438−msgid "Swipe up to add a contact"
439−msgstr ""
440−
441−#: qml/Tutorial/TutorialBottom.qml:80
442−msgid "Swipe up for favorite calculations"
443−msgstr ""
444−
445−#: qml/Tutorial/TutorialBottom.qml:82
446−msgid "Swipe up for recent calls"
447−msgstr ""
448−
449−#: qml/Tutorial/TutorialBottom.qml:84
450−msgid "Swipe up to create a message"
451−msgstr ""
452−
453−#: qml/Tutorial/TutorialBottom.qml:85
454−msgid "Swipe up to manage the app"
455−msgstr ""
456−
457−#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Swipe from the left edge to open the launcher"
459−msgstr ""
460−
461−#: qml/Tutorial/TutorialLeftLong.qml:47
619+#: qml/Tutorial/TutorialLeftLong.qml:49
462msgid "Long swipe from the left edge to open the Today scope"
620msgid "Long swipe from the left edge to open the Today scope"
463msgstr ""
621msgstr ""
464
622
465−#: qml/Tutorial/TutorialRight.qml:54
623+#: qml/Tutorial/TutorialLeft.qml:47
466−msgid "Hover your mouse on the right edge to view your open apps"
624+msgid "Short swipe from the left edge to open the launcher"
467msgstr ""
625msgstr ""
468
626
469#: qml/Tutorial/TutorialRight.qml:55
627#: qml/Tutorial/TutorialRight.qml:55
470−msgid "Short or long swipe from the right edge to view your open apps"
628+msgid "Push your mouse against the right edge to view your open apps"
471msgstr ""
629msgstr ""
472
630
473−#: qml/Tutorial/TutorialTop.qml:53
631+#: qml/Tutorial/TutorialRight.qml:56
474−msgid "Swipe from the top right edge to open the notification bar"
632+msgid "Swipe from the right edge to view your open apps"
475msgstr ""
633msgstr ""
476
634
477−#: qml/Tutorial/TutorialTop.qml:54
635+#: qml/Tutorial/TutorialTop.qml:53
478−msgid "Swipe from the top edge to open the notification bar"
636+msgid "Swipe from the top edge to access notifications and quick settings"
479msgstr ""
637msgstr ""
480
638
481#: qml/Wizard/Page.qml:54
639#: qml/Wizard/Page.qml:54
@@ -487,11 +645,11 @@ msgstr "Вярнуцца"
487msgid "Language"
645msgid "Language"
488msgstr ""
646msgstr ""
489
647
490−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
648+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
491−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
649+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
492#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
650#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
493#: qml/Wizard/Pages/75-report-check.qml:84
651#: qml/Wizard/Pages/75-report-check.qml:84
494−#: qml/Wizard/Pages/passcode-desktop.qml:124
652+#: qml/Wizard/Pages/passcode-desktop.qml:141
495#: qml/Wizard/Pages/password-set.qml:141
653#: qml/Wizard/Pages/password-set.qml:141
496msgid "Next"
654msgid "Next"
497msgstr ""
655msgstr ""
@@ -553,7 +711,7 @@ msgstr ""
553msgid "Time Zone"
711msgid "Time Zone"
554msgstr ""
712msgstr ""
555
713
556−#: qml/Wizard/Pages/50-timezone.qml:178
714+#: qml/Wizard/Pages/50-timezone.qml:181
557msgid "Enter your city"
715msgid "Enter your city"
558msgstr ""
716msgstr ""
559
717
@@ -643,7 +801,7 @@ msgid "Service Terms"
643msgstr ""
801msgstr ""
644
802
645#: qml/Wizard/Pages/passcode-confirm.qml:43
803#: qml/Wizard/Pages/passcode-confirm.qml:43
646−#: qml/Wizard/Pages/passcode-desktop.qml:80
804+#: qml/Wizard/Pages/passcode-desktop.qml:96
647msgid "Confirm passcode"
805msgid "Confirm passcode"
648msgstr "Пацвердзіце код-пароль"
806msgstr "Пацвердзіце код-пароль"
649
807
@@ -660,24 +818,24 @@ msgstr ""
660msgid "Lock Screen Passcode"
818msgid "Lock Screen Passcode"
661msgstr ""
819msgstr ""
662
820
663−#: qml/Wizard/Pages/passcode-desktop.qml:56
821+#: qml/Wizard/Pages/passcode-desktop.qml:60
664msgid "Enter 4 numbers to setup your passcode"
822msgid "Enter 4 numbers to setup your passcode"
665msgstr ""
823msgstr ""
666
824
667−#: qml/Wizard/Pages/passcode-desktop.qml:65
825+#: qml/Wizard/Pages/passcode-desktop.qml:76
668#: qml/Wizard/Pages/passcode-set.qml:54
826#: qml/Wizard/Pages/passcode-set.qml:54
669msgid "Choose passcode"
827msgid "Choose passcode"
670msgstr ""
828msgstr ""
671
829
672−#: qml/Wizard/Pages/passcode-desktop.qml:105
830+#: qml/Wizard/Pages/passcode-desktop.qml:126
673msgid "Passcode too short"
831msgid "Passcode too short"
674msgstr ""
832msgstr ""
675
833
676−#: qml/Wizard/Pages/passcode-desktop.qml:107
834+#: qml/Wizard/Pages/passcode-desktop.qml:128
677msgid "Passcodes match"
835msgid "Passcodes match"
678msgstr ""
836msgstr ""
679
837
680−#: qml/Wizard/Pages/passcode-desktop.qml:109
838+#: qml/Wizard/Pages/passcode-desktop.qml:130
681msgid "Passcodes do not match"
839msgid "Passcodes do not match"
682msgstr ""
840msgstr ""
683
841
@@ -726,26 +884,30 @@ msgid "To proceed with no SIM tap Skip."
726msgstr ""
884msgstr ""
727
885
728#: qml/Wizard/PasswordMeter.qml:87
886#: qml/Wizard/PasswordMeter.qml:87
729−msgid "Passwords match"
887+msgid "Password too short"
730msgstr ""
888msgstr ""
731
889
732#: qml/Wizard/PasswordMeter.qml:89
890#: qml/Wizard/PasswordMeter.qml:89
891+msgid "Passwords match"
892+msgstr ""
893+
894+#: qml/Wizard/PasswordMeter.qml:91
733msgid "Passwords do not match"
895msgid "Passwords do not match"
734msgstr ""
896msgstr ""
735
897
736−#: qml/Wizard/PasswordMeter.qml:93
898+#: qml/Wizard/PasswordMeter.qml:95
737msgid "Strong password"
899msgid "Strong password"
738msgstr ""
900msgstr ""
739
901
740−#: qml/Wizard/PasswordMeter.qml:95
902+#: qml/Wizard/PasswordMeter.qml:97
741msgid "Fair password"
903msgid "Fair password"
742msgstr ""
904msgstr ""
743
905
744−#: qml/Wizard/PasswordMeter.qml:97
906+#: qml/Wizard/PasswordMeter.qml:99
745msgid "Weak password"
907msgid "Weak password"
746msgstr ""
908msgstr ""
747
909
748−#: qml/Wizard/PasswordMeter.qml:99
910+#: qml/Wizard/PasswordMeter.qml:101
749msgid "Very weak password"
911msgid "Very weak password"
750msgstr ""
912msgstr ""
751
913
@@ -817,6 +979,12 @@ msgstr ""
817#~ msgid "Skip intro"
979#~ msgid "Skip intro"
818#~ msgstr "Прапусціць уводзіны"
980#~ msgstr "Прапусціць уводзіны"
819
981
982+#~ msgid "See all"
983+#~ msgstr "Больш падрабязна"
984+
985+#~ msgid "See less"
986+#~ msgstr "Карацей"
987+
820#~ msgid "Store"
988#~ msgid "Store"
821#~ msgstr "Крама"
989#~ msgstr "Крама"
822
990
@@ -951,6 +1119,9 @@ msgstr ""
951#~ msgid "Reboot"
1119#~ msgid "Reboot"
952#~ msgstr "Перазагрузіць"
1120#~ msgstr "Перазагрузіць"
953
1121
1122+#~ msgid "Tap to unlock"
1123+#~ msgstr "Націсніце, каб разблакаваць"
1124+
954#~ msgid "Swipe up from the bottom edge."
1125#~ msgid "Swipe up from the bottom edge."
955#~ msgstr "Правесці уверх ад ніжняга краю."
1126#~ msgstr "Правесці уверх ад ніжняга краю."
956
1127
po/bg.po+287−125
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11"PO-Revision-Date: 2015-04-12 14:43+0000\n"
11"PO-Revision-Date: 2015-04-12 14:43+0000\n"
12"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
12"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
@@ -15,39 +15,39 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 18147)\n"
20
20
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
22msgid "Password: "
22msgid "Password: "
23msgstr ""
23msgstr ""
24
24
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
27msgid "Pin shortcut"
27msgid "Pin shortcut"
28msgstr ""
28msgstr ""
29
29
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
31msgid "Quit"
31msgid "Quit"
32msgstr ""
32msgstr ""
33
33
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
35msgid "Unpin shortcut"
35msgid "Unpin shortcut"
36msgstr ""
36msgstr ""
37
37
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
39msgid "Device Locked"
39msgid "Device Locked"
40msgstr ""
40msgstr ""
41
41
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
43msgid "You have been locked out due to too many failed passphrase attempts."
43msgid "You have been locked out due to too many failed passphrase attempts."
44msgstr ""
44msgstr ""
45
45
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
47msgid "You have been locked out due to too many failed passcode attempts."
47msgid "You have been locked out due to too many failed passcode attempts."
48msgstr ""
48msgstr ""
49
49
50−#: qml/Components/DelayedLockscreen.qml:74
50+#: qml/Components/DelayedLockscreen.qml:75
51#, qt-format
51#, qt-format
52msgid "Please wait %1 minute and then try again…"
52msgid "Please wait %1 minute and then try again…"
53msgid_plural "Please wait %1 minutes and then try again…"
53msgid_plural "Please wait %1 minutes and then try again…"
@@ -73,8 +73,8 @@ msgctxt "Button: Log out from the system"
73msgid "Log Out"
73msgid "Log Out"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
77+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
79msgid "Cancel"
79msgid "Cancel"
80msgstr ""
80msgstr ""
@@ -92,16 +92,16 @@ msgstr ""
92msgid "No"
92msgid "No"
93msgstr ""
93msgstr ""
94
94
95−#: qml/Components/Dialogs.qml:183
95+#: qml/Components/Dialogs.qml:182
96msgid "Yes"
96msgid "Yes"
97msgstr ""
97msgstr ""
98
98
99−#: qml/Components/Dialogs.qml:198
99+#: qml/Components/Dialogs.qml:197
100msgctxt "Title: Power off/Restart dialog"
100msgctxt "Title: Power off/Restart dialog"
101msgid "Power"
101msgid "Power"
102msgstr ""
102msgstr ""
103
103
104−#: qml/Components/Dialogs.qml:199
104+#: qml/Components/Dialogs.qml:198
105msgid ""
105msgid ""
106"Are you sure you would like\n"
106"Are you sure you would like\n"
107"to power off?"
107"to power off?"
@@ -109,28 +109,198 @@ msgstr ""
109"Искате ли да \n"
109"Искате ли да \n"
110"изключите захранването на устройството?"
110"изключите захранването на устройството?"
111
111
112−#: qml/Components/Dialogs.qml:201
112+#: qml/Components/Dialogs.qml:200
113msgctxt "Button: Power off the system"
113msgctxt "Button: Power off the system"
114msgid "Power off"
114msgid "Power off"
115msgstr ""
115msgstr ""
116
116
117−#: qml/Components/Dialogs.qml:210
117+#: qml/Components/Dialogs.qml:209
118msgctxt "Button: Restart the system"
118msgctxt "Button: Restart the system"
119msgid "Restart"
119msgid "Restart"
120msgstr ""
120msgstr ""
121
121
122+#: qml/Components/KeyboardShortcutsOverlay.qml:41
123+msgid "Keyboard Shortcuts"
124+msgstr ""
125+
126+#: qml/Components/KeyboardShortcutsOverlay.qml:55
127+msgid "Unity 8"
128+msgstr ""
129+
130+#: qml/Components/KeyboardShortcutsOverlay.qml:62
131+msgid "PrtScr"
132+msgstr ""
133+
134+#: qml/Components/KeyboardShortcutsOverlay.qml:67
135+msgid "Takes a screenshot."
136+msgstr ""
137+
138+#: qml/Components/KeyboardShortcutsOverlay.qml:75
139+msgid "Alt + PrtScr"
140+msgstr ""
141+
142+#: qml/Components/KeyboardShortcutsOverlay.qml:80
143+msgid "Takes a screenshot of a window."
144+msgstr ""
145+
146+#: qml/Components/KeyboardShortcutsOverlay.qml:88
147+msgid "Super + Space"
148+msgstr ""
149+
150+#: qml/Components/KeyboardShortcutsOverlay.qml:93
151+msgid "Switches to next keyboard layout."
152+msgstr ""
153+
154+#: qml/Components/KeyboardShortcutsOverlay.qml:101
155+msgid "Super + Shift + Space"
156+msgstr ""
157+
158+#: qml/Components/KeyboardShortcutsOverlay.qml:106
159+msgid "Switches to previous keyboard layout."
160+msgstr ""
161+
162+#: qml/Components/KeyboardShortcutsOverlay.qml:118
163+msgid "Launcher"
164+msgstr ""
165+
166+#: qml/Components/KeyboardShortcutsOverlay.qml:125
167+msgid "Super (Hold)"
168+msgstr ""
169+
170+#: qml/Components/KeyboardShortcutsOverlay.qml:130
171+msgid "Opens the launcher, displays shortcuts."
172+msgstr ""
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:138
175+msgid "Alt + F1"
176+msgstr ""
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:143
179+msgid "Opens launcher keyboard navigation mode."
180+msgstr ""
181+
182+#: qml/Components/KeyboardShortcutsOverlay.qml:151
183+msgid "Super + Tab"
184+msgstr ""
185+
186+#: qml/Components/KeyboardShortcutsOverlay.qml:156
187+msgid "Switches applications via the launcher."
188+msgstr ""
189+
190+#: qml/Components/KeyboardShortcutsOverlay.qml:164
191+msgid "Super + 0 to 9"
192+msgstr ""
193+
194+#: qml/Components/KeyboardShortcutsOverlay.qml:169
195+msgid "Same as clicking on a launcher icon."
196+msgstr ""
197+
198+#: qml/Components/KeyboardShortcutsOverlay.qml:181
199+msgid "Scopes"
200+msgstr ""
201+
202+#: qml/Components/KeyboardShortcutsOverlay.qml:188
203+msgid "Super (Tap)"
204+msgstr ""
205+
206+#: qml/Components/KeyboardShortcutsOverlay.qml:193
207+msgid "Opens the Scopes home."
208+msgstr ""
209+
210+#: qml/Components/KeyboardShortcutsOverlay.qml:209
211+msgid "Switching"
212+msgstr ""
213+
214+#: qml/Components/KeyboardShortcutsOverlay.qml:216
215+msgid "Alt + Tab"
216+msgstr ""
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:221
219+msgid "Switches between applications."
220+msgstr ""
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:229
223+msgid "Super + W"
224+msgstr ""
225+
226+#: qml/Components/KeyboardShortcutsOverlay.qml:234
227+msgid "Opens the desktop spread."
228+msgstr ""
229+
230+#: qml/Components/KeyboardShortcutsOverlay.qml:242
231+msgid "Cursor Left or Right"
232+msgstr ""
233+
234+#: qml/Components/KeyboardShortcutsOverlay.qml:247
235+msgid "Moves the focus."
236+msgstr ""
237+
238+#: qml/Components/KeyboardShortcutsOverlay.qml:259
239+msgid "Windows"
240+msgstr ""
241+
242+#: qml/Components/KeyboardShortcutsOverlay.qml:266
243+msgid "Ctrl + Super + D"
244+msgstr ""
245+
246+#: qml/Components/KeyboardShortcutsOverlay.qml:271
247+msgid "Minimizes all windows."
248+msgstr ""
249+
250+#: qml/Components/KeyboardShortcutsOverlay.qml:279
251+msgid "Ctrl + Super + Up"
252+msgstr ""
253+
254+#: qml/Components/KeyboardShortcutsOverlay.qml:284
255+msgid "Maximizes the current window."
256+msgstr ""
257+
258+#: qml/Components/KeyboardShortcutsOverlay.qml:292
259+msgid "Ctrl + Super + Down"
260+msgstr ""
261+
262+#: qml/Components/KeyboardShortcutsOverlay.qml:297
263+msgid "Minimizes or restores the current window."
264+msgstr ""
265+
266+#: qml/Components/KeyboardShortcutsOverlay.qml:305
267+msgid "Ctrl + Super + Left or Right"
268+msgstr ""
269+
270+#: qml/Components/KeyboardShortcutsOverlay.qml:310
271+msgid "Semi-maximizes the current window."
272+msgstr ""
273+
274+#: qml/Components/KeyboardShortcutsOverlay.qml:318
275+msgid "Alt + F4"
276+msgstr ""
277+
278+#: qml/Components/KeyboardShortcutsOverlay.qml:323
279+msgid "Closes the current window."
280+msgstr ""
281+
122−#: qml/Components/Lockscreen.qml:231
282+#: qml/Components/Lockscreen.qml:239
123msgid "Return to Call"
283msgid "Return to Call"
124msgstr ""
284msgstr ""
125
285
126−#: qml/Components/Lockscreen.qml:231
286+#: qml/Components/Lockscreen.qml:239
127msgid "Emergency Call"
287msgid "Emergency Call"
128msgstr "Спешно повикване"
288msgstr "Спешно повикване"
129
289
130−#: qml/Components/Lockscreen.qml:263
290+#: qml/Components/Lockscreen.qml:271
131msgid "OK"
291msgid "OK"
132msgstr ""
292msgstr ""
133
293
294+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
295+#, qt-format
296+msgid "%1:%2:%3"
297+msgstr ""
298+
299+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
300+#, qt-format
301+msgid "%1:%2"
302+msgstr ""
303+
134#: qml/Components/ModeSwitchWarningDialog.qml:32
304#: qml/Components/ModeSwitchWarningDialog.qml:32
135msgid "Apps may have unsaved data:"
305msgid "Apps may have unsaved data:"
136msgstr ""
306msgstr ""
@@ -157,26 +327,30 @@ msgstr ""
157msgid "Close all"
327msgid "Close all"
158msgstr ""
328msgstr ""
159
329
330+#: qml/Components/SharingPicker.qml:54
331+msgid "Preview Share Item"
332+msgstr ""
333+
160−#: qml/Dash/DashPageHeader.qml:337
334+#: qml/Dash/DashPageHeader.qml:333
161msgctxt "Button: Open the Ubuntu Store"
335msgctxt "Button: Open the Ubuntu Store"
162msgid "Store"
336msgid "Store"
163msgstr ""
337msgstr ""
164
338
165−#: qml/Dash/DashPageHeader.qml:344
339+#: qml/Dash/DashPageHeader.qml:340
166msgctxt "Button: Start a search in the current dash scope"
340msgctxt "Button: Start a search in the current dash scope"
167msgid "Search"
341msgid "Search"
168msgstr ""
342msgstr ""
169
343
170−#: qml/Dash/DashPageHeader.qml:354
344+#: qml/Dash/DashPageHeader.qml:350
171msgctxt "Button: Show the current dash scope settings"
345msgctxt "Button: Show the current dash scope settings"
172msgid "Settings"
346msgid "Settings"
173msgstr ""
347msgstr ""
174
348
175−#: qml/Dash/DashPageHeader.qml:361
349+#: qml/Dash/DashPageHeader.qml:357
176msgid "Remove from Favorites"
350msgid "Remove from Favorites"
177msgstr ""
351msgstr ""
178
352
179−#: qml/Dash/DashPageHeader.qml:361
353+#: qml/Dash/DashPageHeader.qml:357
180msgid "Add to Favorites"
354msgid "Add to Favorites"
181msgstr ""
355msgstr ""
182
356
@@ -188,24 +362,24 @@ msgstr ""
188msgid "Reset"
362msgid "Reset"
189msgstr ""
363msgstr ""
190
364
191−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
365+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
192−msgid "See less"
366+msgid "Show less"
193msgstr ""
367msgstr ""
194
368
195−#: qml/Dash/GenericScopeView.qml:570
369+#: qml/Dash/GenericScopeView.qml:580
196−msgid "See all"
370+msgid "Show all"
197msgstr ""
371msgstr ""
198
372
199−#: qml/Dash/GenericScopeView.qml:627
373+#: qml/Dash/GenericScopeView.qml:637
200msgctxt "Label: Hint for dash search line edit"
374msgctxt "Label: Hint for dash search line edit"
201msgid "Search"
375msgid "Search"
202msgstr ""
376msgstr ""
203
377
204−#: qml/Dash/PageHeaderExtraPanel.qml:55
378+#: qml/Dash/PageHeaderExtraPanel.qml:56
205msgid "Recent Searches"
379msgid "Recent Searches"
206msgstr ""
380msgstr ""
207
381
208−#: qml/Dash/PageHeaderExtraPanel.qml:66
382+#: qml/Dash/PageHeaderExtraPanel.qml:67
209msgid "Clear All"
383msgid "Clear All"
210msgstr ""
384msgstr ""
211
385
@@ -218,22 +392,18 @@ msgid "Less..."
218msgstr "По-малко..."
392msgstr "По-малко..."
219
393
220#: qml/Dash/Previews/PreviewCommentInput.qml:68
394#: qml/Dash/Previews/PreviewCommentInput.qml:68
221−#: qml/Dash/Previews/PreviewRatingInput.qml:174
395+#: qml/Dash/Previews/PreviewRatingInput.qml:175
222msgid "Send"
396msgid "Send"
223msgstr "Изпрати"
397msgstr "Изпрати"
224
398
225−#: qml/Dash/Previews/PreviewRatingInput.qml:84
399+#: qml/Dash/Previews/PreviewRatingInput.qml:82
226msgid "Rate this"
400msgid "Rate this"
227msgstr "Оценете това"
401msgstr "Оценете това"
228
402
229−#: qml/Dash/Previews/PreviewRatingInput.qml:129
403+#: qml/Dash/Previews/PreviewRatingInput.qml:157
230msgid "Add a review"
404msgid "Add a review"
231msgstr "Добави отзив"
405msgstr "Добави отзив"
232
406
233−#: qml/Dash/Previews/PreviewSharing.qml:66
234−msgid "Preview Share Item"
235−msgstr ""
236−
237#: qml/Dash/PullToRefreshScopeStyle.qml:55
407#: qml/Dash/PullToRefreshScopeStyle.qml:55
238msgid "Pull to refresh…"
408msgid "Pull to refresh…"
239msgstr ""
409msgstr ""
@@ -246,92 +416,104 @@ msgstr ""
246msgid "Enable location data"
416msgid "Enable location data"
247msgstr ""
417msgstr ""
248
418
249−#: qml/Dash/ScopesList.qml:67
419+#: qml/Dash/ScopesList.qml:55
250msgid "Manage"
420msgid "Manage"
251msgstr ""
421msgstr ""
252
422
253−#: qml/Dash/ScopesList.qml:113
423+#: qml/Dash/ScopesList.qml:102
254msgid "Home"
424msgid "Home"
255msgstr ""
425msgstr ""
256
426
257−#: qml/Dash/ScopesList.qml:114
427+#: qml/Dash/ScopesList.qml:103
258msgid "Also installed"
428msgid "Also installed"
259msgstr ""
429msgstr ""
260
430
261−#: qml/DisabledScreenNotice.qml:104
431+#: qml/DisabledScreenNotice.qml:109
262msgid ""
432msgid ""
263"Your device is now connected to an external display. Use this screen as a "
433"Your device is now connected to an external display. Use this screen as a "
264"touch pad to interact with the pointer."
434"touch pad to interact with the pointer."
265msgstr ""
435msgstr ""
266
436
267−#: qml/Greeter/CoverPage.qml:118
437+#: qml/Greeter/CoverPage.qml:127
268msgid "Unlock"
438msgid "Unlock"
269msgstr ""
439msgstr ""
270
440
441+#: qml/Greeter/Greeter.qml:555
442+msgid "Try again"
443+msgstr ""
444+
271−#: qml/Greeter/LoginList.qml:239
445+#: qml/Greeter/LoginList.qml:63
446+msgid "Passphrase"
447+msgstr ""
448+
449+#: qml/Greeter/LoginList.qml:64
450+msgid "Passcode"
451+msgstr ""
452+
453+#: qml/Greeter/LoginList.qml:87
272msgid "Retry"
454msgid "Retry"
273msgstr ""
455msgstr ""
274
456
275−#: qml/Greeter/LoginList.qml:240
457+#: qml/Greeter/LoginList.qml:88
276−msgid "Tap to unlock"
458+msgid "Log In"
277msgstr ""
459msgstr ""
278
460
279−#: qml/Greeter/NarrowView.qml:54
461+#: qml/Greeter/NarrowView.qml:55
280msgid "Sorry, incorrect passphrase."
462msgid "Sorry, incorrect passphrase."
281msgstr ""
463msgstr ""
282
464
283−#: qml/Greeter/NarrowView.qml:55
465+#: qml/Greeter/NarrowView.qml:56
284msgid "Sorry, incorrect passcode."
466msgid "Sorry, incorrect passcode."
285msgstr ""
467msgstr ""
286
468
287−#: qml/Greeter/NarrowView.qml:56
469+#: qml/Greeter/NarrowView.qml:57
288msgid "This will be your last attempt."
470msgid "This will be your last attempt."
289msgstr ""
471msgstr ""
290
472
291−#: qml/Greeter/NarrowView.qml:58
473+#: qml/Greeter/NarrowView.qml:59
292msgid ""
474msgid ""
293"If passphrase is entered incorrectly, your phone will conduct a factory "
475"If passphrase is entered incorrectly, your phone will conduct a factory "
294"reset and all personal data will be deleted."
476"reset and all personal data will be deleted."
295msgstr ""
477msgstr ""
296
478
297−#: qml/Greeter/NarrowView.qml:59
479+#: qml/Greeter/NarrowView.qml:60
298msgid ""
480msgid ""
299"If passcode is entered incorrectly, your phone will conduct a factory reset "
481"If passcode is entered incorrectly, your phone will conduct a factory reset "
300"and all personal data will be deleted."
482"and all personal data will be deleted."
301msgstr ""
483msgstr ""
302
484
303−#: qml/Greeter/NarrowView.qml:116
485+#: qml/Greeter/NarrowView.qml:129
304#, qt-format
486#, qt-format
305msgid "Enter %1"
487msgid "Enter %1"
306msgstr ""
488msgstr ""
307
489
308−#: qml/Greeter/NarrowView.qml:117
490+#: qml/Greeter/NarrowView.qml:130
309msgid "Enter passphrase"
491msgid "Enter passphrase"
310msgstr ""
492msgstr ""
311
493
312−#: qml/Greeter/NarrowView.qml:118
494+#: qml/Greeter/NarrowView.qml:131
313msgid "Enter passcode"
495msgid "Enter passcode"
314msgstr ""
496msgstr ""
315
497
316−#: qml/Greeter/NarrowView.qml:119
498+#: qml/Greeter/NarrowView.qml:135
317#, qt-format
499#, qt-format
318msgid "Sorry, incorrect %1"
500msgid "Sorry, incorrect %1"
319msgstr ""
501msgstr ""
320
502
321−#: qml/Greeter/NarrowView.qml:120
503+#: qml/Greeter/NarrowView.qml:136
322msgid "Sorry, incorrect passphrase"
504msgid "Sorry, incorrect passphrase"
323msgstr ""
505msgstr ""
324
506
325−#: qml/Greeter/NarrowView.qml:121
507+#: qml/Greeter/NarrowView.qml:137
326msgctxt "passphrase"
508msgctxt "passphrase"
327msgid "Please re-enter"
509msgid "Please re-enter"
328msgstr ""
510msgstr ""
329
511
330−#: qml/Greeter/NarrowView.qml:122
512+#: qml/Greeter/NarrowView.qml:138
331msgid "Sorry, incorrect passcode"
513msgid "Sorry, incorrect passcode"
332msgstr ""
514msgstr ""
333
515
334−#: qml/Notifications/NotificationMenuItemFactory.qml:129
516+#: qml/Notifications/NotificationMenuItemFactory.qml:124
335msgid "Show password"
517msgid "Show password"
336msgstr "Покажи паролата"
518msgstr "Покажи паролата"
337
519
@@ -343,77 +525,77 @@ msgstr ""
343msgid "Conference"
525msgid "Conference"
344msgstr ""
526msgstr ""
345
527
346−#: qml/Panel/Indicators/MenuItemFactory.qml:761
528+#: qml/Panel/Indicators/MenuItemFactory.qml:762
347msgid "Nothing is playing"
529msgid "Nothing is playing"
348msgstr ""
530msgstr ""
349
531
350−#: qml/Panel/Indicators/MenuItemFactory.qml:890
532+#: qml/Panel/Indicators/MenuItemFactory.qml:891
351#, qt-format
533#, qt-format
352msgid "%1 hour"
534msgid "%1 hour"
353msgid_plural "%1 hours"
535msgid_plural "%1 hours"
354msgstr[0] ""
536msgstr[0] ""
355msgstr[1] ""
537msgstr[1] ""
356
538
357−#: qml/Panel/Indicators/MenuItemFactory.qml:894
539+#: qml/Panel/Indicators/MenuItemFactory.qml:895
358#, qt-format
540#, qt-format
359msgid "%1 minute"
541msgid "%1 minute"
360msgid_plural "%1 minutes"
542msgid_plural "%1 minutes"
361msgstr[0] ""
543msgstr[0] ""
362msgstr[1] ""
544msgstr[1] ""
363
545
364−#: qml/Panel/Indicators/MenuItemFactory.qml:899
546+#: qml/Panel/Indicators/MenuItemFactory.qml:900
365#, qt-format
547#, qt-format
366msgid "%1 second"
548msgid "%1 second"
367msgid_plural "%1 seconds"
549msgid_plural "%1 seconds"
368msgstr[0] ""
550msgstr[0] ""
369msgstr[1] ""
551msgstr[1] ""
370
552
371−#: qml/Panel/Indicators/MenuItemFactory.qml:902
553+#: qml/Panel/Indicators/MenuItemFactory.qml:903
372msgid "0 seconds"
554msgid "0 seconds"
373msgstr ""
555msgstr ""
374
556
375#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
557#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
376−#: qml/Panel/Indicators/MenuItemFactory.qml:904
558+#: qml/Panel/Indicators/MenuItemFactory.qml:905
377#, qt-format
559#, qt-format
378msgid "%1 remaining"
560msgid "%1 remaining"
379msgstr ""
561msgstr ""
380
562
381−#: qml/Panel/Indicators/MenuItemFactory.qml:910
563+#: qml/Panel/Indicators/MenuItemFactory.qml:911
382msgid "In queue…"
564msgid "In queue…"
383msgstr ""
565msgstr ""
384
566
385−#: qml/Panel/Indicators/MenuItemFactory.qml:914
567+#: qml/Panel/Indicators/MenuItemFactory.qml:915
386msgid "Downloading"
568msgid "Downloading"
387msgstr ""
569msgstr ""
388
570
389−#: qml/Panel/Indicators/MenuItemFactory.qml:916
571+#: qml/Panel/Indicators/MenuItemFactory.qml:917
390msgid "Paused, tap to resume"
572msgid "Paused, tap to resume"
391msgstr ""
573msgstr ""
392
574
393−#: qml/Panel/Indicators/MenuItemFactory.qml:918
575+#: qml/Panel/Indicators/MenuItemFactory.qml:919
394msgid "Canceled"
576msgid "Canceled"
395msgstr ""
577msgstr ""
396
578
397−#: qml/Panel/Indicators/MenuItemFactory.qml:920
579+#: qml/Panel/Indicators/MenuItemFactory.qml:921
398msgid "Finished"
580msgid "Finished"
399msgstr ""
581msgstr ""
400
582
401−#: qml/Panel/Indicators/MenuItemFactory.qml:922
583+#: qml/Panel/Indicators/MenuItemFactory.qml:923
402msgid "Failed, tap to retry"
584msgid "Failed, tap to retry"
403msgstr ""
585msgstr ""
404
586
405−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
587+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
406−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
588+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
407msgctxt "Button: Send a reply message"
589msgctxt "Button: Send a reply message"
408msgid "Send"
590msgid "Send"
409msgstr ""
591msgstr ""
410
592
411−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
593+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
412msgctxt "Label: Hint in message indicator line edit"
594msgctxt "Label: Hint in message indicator line edit"
413msgid "Reply"
595msgid "Reply"
414msgstr ""
596msgstr ""
415
597
416−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
598+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
417msgctxt "Button: Call back on phone"
599msgctxt "Button: Call back on phone"
418msgid "Call back"
600msgid "Call back"
419msgstr ""
601msgstr ""
@@ -422,48 +604,24 @@ msgstr ""
422msgid "Drag using 3 fingers any application from one window to the other"
604msgid "Drag using 3 fingers any application from one window to the other"
423msgstr ""
605msgstr ""
424
606
425−#: qml/Tutorial/TutorialBottom.qml:78
426−msgid "Swipe up to add a contact"
427−msgstr ""
428−
429−#: qml/Tutorial/TutorialBottom.qml:80
430−msgid "Swipe up for favorite calculations"
431−msgstr ""
432−
433−#: qml/Tutorial/TutorialBottom.qml:82
434−msgid "Swipe up for recent calls"
435−msgstr ""
436−
437−#: qml/Tutorial/TutorialBottom.qml:84
438−msgid "Swipe up to create a message"
439−msgstr ""
440−
441−#: qml/Tutorial/TutorialBottom.qml:85
442−msgid "Swipe up to manage the app"
443−msgstr ""
444−
445−#: qml/Tutorial/TutorialLeft.qml:47
446−msgid "Swipe from the left edge to open the launcher"
447−msgstr ""
448−
449−#: qml/Tutorial/TutorialLeftLong.qml:47
607+#: qml/Tutorial/TutorialLeftLong.qml:49
450msgid "Long swipe from the left edge to open the Today scope"
608msgid "Long swipe from the left edge to open the Today scope"
451msgstr ""
609msgstr ""
452
610
453−#: qml/Tutorial/TutorialRight.qml:54
611+#: qml/Tutorial/TutorialLeft.qml:47
454−msgid "Hover your mouse on the right edge to view your open apps"
612+msgid "Short swipe from the left edge to open the launcher"
455msgstr ""
613msgstr ""
456
614
457#: qml/Tutorial/TutorialRight.qml:55
615#: qml/Tutorial/TutorialRight.qml:55
458−msgid "Short or long swipe from the right edge to view your open apps"
616+msgid "Push your mouse against the right edge to view your open apps"
459msgstr ""
617msgstr ""
460
618
461−#: qml/Tutorial/TutorialTop.qml:53
619+#: qml/Tutorial/TutorialRight.qml:56
462−msgid "Swipe from the top right edge to open the notification bar"
620+msgid "Swipe from the right edge to view your open apps"
463msgstr ""
621msgstr ""
464
622
465−#: qml/Tutorial/TutorialTop.qml:54
623+#: qml/Tutorial/TutorialTop.qml:53
466−msgid "Swipe from the top edge to open the notification bar"
624+msgid "Swipe from the top edge to access notifications and quick settings"
467msgstr ""
625msgstr ""
468
626
469#: qml/Wizard/Page.qml:54
627#: qml/Wizard/Page.qml:54
@@ -475,11 +633,11 @@ msgstr ""
475msgid "Language"
633msgid "Language"
476msgstr ""
634msgstr ""
477
635
478−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
636+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
479−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
637+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
480#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
638#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
481#: qml/Wizard/Pages/75-report-check.qml:84
639#: qml/Wizard/Pages/75-report-check.qml:84
482−#: qml/Wizard/Pages/passcode-desktop.qml:124
640+#: qml/Wizard/Pages/passcode-desktop.qml:141
483#: qml/Wizard/Pages/password-set.qml:141
641#: qml/Wizard/Pages/password-set.qml:141
484msgid "Next"
642msgid "Next"
485msgstr ""
643msgstr ""
@@ -541,7 +699,7 @@ msgstr ""
541msgid "Time Zone"
699msgid "Time Zone"
542msgstr ""
700msgstr ""
543
701
544−#: qml/Wizard/Pages/50-timezone.qml:178
702+#: qml/Wizard/Pages/50-timezone.qml:181
545msgid "Enter your city"
703msgid "Enter your city"
546msgstr ""
704msgstr ""
547
705
@@ -631,7 +789,7 @@ msgid "Service Terms"
631msgstr ""
789msgstr ""
632
790
633#: qml/Wizard/Pages/passcode-confirm.qml:43
791#: qml/Wizard/Pages/passcode-confirm.qml:43
634−#: qml/Wizard/Pages/passcode-desktop.qml:80
792+#: qml/Wizard/Pages/passcode-desktop.qml:96
635msgid "Confirm passcode"
793msgid "Confirm passcode"
636msgstr ""
794msgstr ""
637
795
@@ -648,24 +806,24 @@ msgstr ""
648msgid "Lock Screen Passcode"
806msgid "Lock Screen Passcode"
649msgstr ""
807msgstr ""
650
808
651−#: qml/Wizard/Pages/passcode-desktop.qml:56
809+#: qml/Wizard/Pages/passcode-desktop.qml:60
652msgid "Enter 4 numbers to setup your passcode"
810msgid "Enter 4 numbers to setup your passcode"
653msgstr ""
811msgstr ""
654
812
655−#: qml/Wizard/Pages/passcode-desktop.qml:65
813+#: qml/Wizard/Pages/passcode-desktop.qml:76
656#: qml/Wizard/Pages/passcode-set.qml:54
814#: qml/Wizard/Pages/passcode-set.qml:54
657msgid "Choose passcode"
815msgid "Choose passcode"
658msgstr ""
816msgstr ""
659
817
660−#: qml/Wizard/Pages/passcode-desktop.qml:105
818+#: qml/Wizard/Pages/passcode-desktop.qml:126
661msgid "Passcode too short"
819msgid "Passcode too short"
662msgstr ""
820msgstr ""
663
821
664−#: qml/Wizard/Pages/passcode-desktop.qml:107
822+#: qml/Wizard/Pages/passcode-desktop.qml:128
665msgid "Passcodes match"
823msgid "Passcodes match"
666msgstr ""
824msgstr ""
667
825
668−#: qml/Wizard/Pages/passcode-desktop.qml:109
826+#: qml/Wizard/Pages/passcode-desktop.qml:130
669msgid "Passcodes do not match"
827msgid "Passcodes do not match"
670msgstr ""
828msgstr ""
671
829
@@ -714,26 +872,30 @@ msgid "To proceed with no SIM tap Skip."
714msgstr ""
872msgstr ""
715
873
716#: qml/Wizard/PasswordMeter.qml:87
874#: qml/Wizard/PasswordMeter.qml:87
717−msgid "Passwords match"
875+msgid "Password too short"
718msgstr ""
876msgstr ""
719
877
720#: qml/Wizard/PasswordMeter.qml:89
878#: qml/Wizard/PasswordMeter.qml:89
879+msgid "Passwords match"
880+msgstr ""
881+
882+#: qml/Wizard/PasswordMeter.qml:91
721msgid "Passwords do not match"
883msgid "Passwords do not match"
722msgstr ""
884msgstr ""
723
885
724−#: qml/Wizard/PasswordMeter.qml:93
886+#: qml/Wizard/PasswordMeter.qml:95
725msgid "Strong password"
887msgid "Strong password"
726msgstr ""
888msgstr ""
727
889
728−#: qml/Wizard/PasswordMeter.qml:95
890+#: qml/Wizard/PasswordMeter.qml:97
729msgid "Fair password"
891msgid "Fair password"
730msgstr ""
892msgstr ""
731
893
732−#: qml/Wizard/PasswordMeter.qml:97
894+#: qml/Wizard/PasswordMeter.qml:99
733msgid "Weak password"
895msgid "Weak password"
734msgstr ""
896msgstr ""
735
897
736−#: qml/Wizard/PasswordMeter.qml:99
898+#: qml/Wizard/PasswordMeter.qml:101
737msgid "Very weak password"
899msgid "Very weak password"
738msgstr ""
900msgstr ""
739
901
po/bn.po+299−128
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11"PO-Revision-Date: 2015-11-27 19:38+0000\n"
11"PO-Revision-Date: 2015-11-27 19:38+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Bengali <bn@li.org>\n"
13"Language-Team: Bengali <bn@li.org>\n"
@@ -15,39 +15,39 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 18147)\n"
20
20
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
22msgid "Password: "
22msgid "Password: "
23msgstr "পাসওয়ার্ড: "
23msgstr "পাসওয়ার্ড: "
24
24
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
27msgid "Pin shortcut"
27msgid "Pin shortcut"
28msgstr "পিন"
28msgstr "পিন"
29
29
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
31msgid "Quit"
31msgid "Quit"
32msgstr ""
32msgstr ""
33
33
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
35msgid "Unpin shortcut"
35msgid "Unpin shortcut"
36msgstr "আনপিন"
36msgstr "আনপিন"
37
37
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
39msgid "Device Locked"
39msgid "Device Locked"
40msgstr "ডিভাইসটি লক করা"
40msgstr "ডিভাইসটি লক করা"
41
41
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
43msgid "You have been locked out due to too many failed passphrase attempts."
43msgid "You have been locked out due to too many failed passphrase attempts."
44msgstr "অধিকবার পাসফ্রেজ ভুল দেওয়ার কারনে আপনার আইডি লক করা হয়েছে"
44msgstr "অধিকবার পাসফ্রেজ ভুল দেওয়ার কারনে আপনার আইডি লক করা হয়েছে"
45
45
46−#: qml/Components/DelayedLockscreen.qml:65
46+#: qml/Components/DelayedLockscreen.qml:66
47msgid "You have been locked out due to too many failed passcode attempts."
47msgid "You have been locked out due to too many failed passcode attempts."
48msgstr "অধিকবার পাসকোড ভুল করার কারনে আপনার আইডি লক করা হয়েছে"
48msgstr "অধিকবার পাসকোড ভুল করার কারনে আপনার আইডি লক করা হয়েছে"
49
49
50−#: qml/Components/DelayedLockscreen.qml:74
50+#: qml/Components/DelayedLockscreen.qml:75
51#, qt-format
51#, qt-format
52msgid "Please wait %1 minute and then try again…"
52msgid "Please wait %1 minute and then try again…"
53msgid_plural "Please wait %1 minutes and then try again…"
53msgid_plural "Please wait %1 minutes and then try again…"
@@ -73,8 +73,8 @@ msgctxt "Button: Log out from the system"
73msgid "Log Out"
73msgid "Log Out"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
77+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
79msgid "Cancel"
79msgid "Cancel"
80msgstr "বাতিল"
80msgstr "বাতিল"
@@ -92,16 +92,16 @@ msgstr "আপনি কি পুনরায় চালু করতে চা
92msgid "No"
92msgid "No"
93msgstr "না"
93msgstr "না"
94
94
95−#: qml/Components/Dialogs.qml:183
95+#: qml/Components/Dialogs.qml:182
96msgid "Yes"
96msgid "Yes"
97msgstr "হ্যাঁ"
97msgstr "হ্যাঁ"
98
98
99−#: qml/Components/Dialogs.qml:198
99+#: qml/Components/Dialogs.qml:197
100msgctxt "Title: Power off/Restart dialog"
100msgctxt "Title: Power off/Restart dialog"
101msgid "Power"
101msgid "Power"
102msgstr ""
102msgstr ""
103
103
104−#: qml/Components/Dialogs.qml:199
104+#: qml/Components/Dialogs.qml:198
105msgid ""
105msgid ""
106"Are you sure you would like\n"
106"Are you sure you would like\n"
107"to power off?"
107"to power off?"
@@ -109,28 +109,198 @@ msgstr ""
109"আপনি নিশ্চিত যে আপনি\n"
109"আপনি নিশ্চিত যে আপনি\n"
110"বন্ধ করতে চান?"
110"বন্ধ করতে চান?"
111
111
112−#: qml/Components/Dialogs.qml:201
112+#: qml/Components/Dialogs.qml:200
113msgctxt "Button: Power off the system"
113msgctxt "Button: Power off the system"
114msgid "Power off"
114msgid "Power off"
115msgstr "বন্ধ করুন"
115msgstr "বন্ধ করুন"
116
116
117−#: qml/Components/Dialogs.qml:210
117+#: qml/Components/Dialogs.qml:209
118msgctxt "Button: Restart the system"
118msgctxt "Button: Restart the system"
119msgid "Restart"
119msgid "Restart"
120msgstr "পুনরায় চালু"
120msgstr "পুনরায় চালু"
121
121
122+#: qml/Components/KeyboardShortcutsOverlay.qml:41
123+msgid "Keyboard Shortcuts"
124+msgstr ""
125+
126+#: qml/Components/KeyboardShortcutsOverlay.qml:55
127+msgid "Unity 8"
128+msgstr ""
129+
130+#: qml/Components/KeyboardShortcutsOverlay.qml:62
131+msgid "PrtScr"
132+msgstr ""
133+
134+#: qml/Components/KeyboardShortcutsOverlay.qml:67
135+msgid "Takes a screenshot."
136+msgstr ""
137+
138+#: qml/Components/KeyboardShortcutsOverlay.qml:75
139+msgid "Alt + PrtScr"
140+msgstr ""
141+
142+#: qml/Components/KeyboardShortcutsOverlay.qml:80
143+msgid "Takes a screenshot of a window."
144+msgstr ""
145+
146+#: qml/Components/KeyboardShortcutsOverlay.qml:88
147+msgid "Super + Space"
148+msgstr ""
149+
150+#: qml/Components/KeyboardShortcutsOverlay.qml:93
151+msgid "Switches to next keyboard layout."
152+msgstr ""
153+
154+#: qml/Components/KeyboardShortcutsOverlay.qml:101
155+msgid "Super + Shift + Space"
156+msgstr ""
157+
158+#: qml/Components/KeyboardShortcutsOverlay.qml:106
159+msgid "Switches to previous keyboard layout."
160+msgstr ""
161+
162+#: qml/Components/KeyboardShortcutsOverlay.qml:118
163+msgid "Launcher"
164+msgstr ""
165+
166+#: qml/Components/KeyboardShortcutsOverlay.qml:125
167+msgid "Super (Hold)"
168+msgstr ""
169+
170+#: qml/Components/KeyboardShortcutsOverlay.qml:130
171+msgid "Opens the launcher, displays shortcuts."
172+msgstr ""
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:138
175+msgid "Alt + F1"
176+msgstr ""
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:143
179+msgid "Opens launcher keyboard navigation mode."
180+msgstr ""
181+
182+#: qml/Components/KeyboardShortcutsOverlay.qml:151
183+msgid "Super + Tab"
184+msgstr ""
185+
186+#: qml/Components/KeyboardShortcutsOverlay.qml:156
187+msgid "Switches applications via the launcher."
188+msgstr ""
189+
190+#: qml/Components/KeyboardShortcutsOverlay.qml:164
191+msgid "Super + 0 to 9"
192+msgstr ""
193+
194+#: qml/Components/KeyboardShortcutsOverlay.qml:169
195+msgid "Same as clicking on a launcher icon."
196+msgstr ""
197+
198+#: qml/Components/KeyboardShortcutsOverlay.qml:181
199+msgid "Scopes"
200+msgstr ""
201+
202+#: qml/Components/KeyboardShortcutsOverlay.qml:188
203+msgid "Super (Tap)"
204+msgstr ""
205+
206+#: qml/Components/KeyboardShortcutsOverlay.qml:193
207+msgid "Opens the Scopes home."
208+msgstr ""
209+
210+#: qml/Components/KeyboardShortcutsOverlay.qml:209
211+msgid "Switching"
212+msgstr ""
213+
214+#: qml/Components/KeyboardShortcutsOverlay.qml:216
215+msgid "Alt + Tab"
216+msgstr ""
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:221
219+msgid "Switches between applications."
220+msgstr ""
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:229
223+msgid "Super + W"
224+msgstr ""
225+
226+#: qml/Components/KeyboardShortcutsOverlay.qml:234
227+msgid "Opens the desktop spread."
228+msgstr ""
229+
230+#: qml/Components/KeyboardShortcutsOverlay.qml:242
231+msgid "Cursor Left or Right"
232+msgstr ""
233+
234+#: qml/Components/KeyboardShortcutsOverlay.qml:247
235+msgid "Moves the focus."
236+msgstr ""
237+
238+#: qml/Components/KeyboardShortcutsOverlay.qml:259
239+msgid "Windows"
240+msgstr ""
241+
242+#: qml/Components/KeyboardShortcutsOverlay.qml:266
243+msgid "Ctrl + Super + D"
244+msgstr ""
245+
246+#: qml/Components/KeyboardShortcutsOverlay.qml:271
247+msgid "Minimizes all windows."
248+msgstr ""
249+
250+#: qml/Components/KeyboardShortcutsOverlay.qml:279
251+msgid "Ctrl + Super + Up"
252+msgstr ""
253+
254+#: qml/Components/KeyboardShortcutsOverlay.qml:284
255+msgid "Maximizes the current window."
256+msgstr ""
257+
258+#: qml/Components/KeyboardShortcutsOverlay.qml:292
259+msgid "Ctrl + Super + Down"
260+msgstr ""
261+
262+#: qml/Components/KeyboardShortcutsOverlay.qml:297
263+msgid "Minimizes or restores the current window."
264+msgstr ""
265+
266+#: qml/Components/KeyboardShortcutsOverlay.qml:305
267+msgid "Ctrl + Super + Left or Right"
268+msgstr ""
269+
270+#: qml/Components/KeyboardShortcutsOverlay.qml:310
271+msgid "Semi-maximizes the current window."
272+msgstr ""
273+
274+#: qml/Components/KeyboardShortcutsOverlay.qml:318
275+msgid "Alt + F4"
276+msgstr ""
277+
278+#: qml/Components/KeyboardShortcutsOverlay.qml:323
279+msgid "Closes the current window."
280+msgstr ""
281+
122−#: qml/Components/Lockscreen.qml:231
282+#: qml/Components/Lockscreen.qml:239
123msgid "Return to Call"
283msgid "Return to Call"
124msgstr "কল এ ফিরে যান"
284msgstr "কল এ ফিরে যান"
125
285
126−#: qml/Components/Lockscreen.qml:231
286+#: qml/Components/Lockscreen.qml:239
127msgid "Emergency Call"
287msgid "Emergency Call"
128msgstr "জরুরী কল"
288msgstr "জরুরী কল"
129
289
130−#: qml/Components/Lockscreen.qml:263
290+#: qml/Components/Lockscreen.qml:271
131msgid "OK"
291msgid "OK"
132msgstr "ঠিক আছে"
292msgstr "ঠিক আছে"
133
293
294+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
295+#, qt-format
296+msgid "%1:%2:%3"
297+msgstr ""
298+
299+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
300+#, qt-format
301+msgid "%1:%2"
302+msgstr ""
303+
134#: qml/Components/ModeSwitchWarningDialog.qml:32
304#: qml/Components/ModeSwitchWarningDialog.qml:32
135msgid "Apps may have unsaved data:"
305msgid "Apps may have unsaved data:"
136msgstr ""
306msgstr ""
@@ -157,26 +327,30 @@ msgstr ""
157msgid "Close all"
327msgid "Close all"
158msgstr ""
328msgstr ""
159
329
330+#: qml/Components/SharingPicker.qml:54
331+msgid "Preview Share Item"
332+msgstr ""
333+
160−#: qml/Dash/DashPageHeader.qml:337
334+#: qml/Dash/DashPageHeader.qml:333
161msgctxt "Button: Open the Ubuntu Store"
335msgctxt "Button: Open the Ubuntu Store"
162msgid "Store"
336msgid "Store"
163msgstr "স্টোর"
337msgstr "স্টোর"
164
338
165−#: qml/Dash/DashPageHeader.qml:344
339+#: qml/Dash/DashPageHeader.qml:340
166msgctxt "Button: Start a search in the current dash scope"
340msgctxt "Button: Start a search in the current dash scope"
167msgid "Search"
341msgid "Search"
168msgstr "খুঁজুন"
342msgstr "খুঁজুন"
169
343
170−#: qml/Dash/DashPageHeader.qml:354
344+#: qml/Dash/DashPageHeader.qml:350
171msgctxt "Button: Show the current dash scope settings"
345msgctxt "Button: Show the current dash scope settings"
172msgid "Settings"
346msgid "Settings"
173msgstr "সেটিংস"
347msgstr "সেটিংস"
174
348
175−#: qml/Dash/DashPageHeader.qml:361
349+#: qml/Dash/DashPageHeader.qml:357
176msgid "Remove from Favorites"
350msgid "Remove from Favorites"
177msgstr "পছন্দ থেকে মুছে ফেলুন"
351msgstr "পছন্দ থেকে মুছে ফেলুন"
178
352
179−#: qml/Dash/DashPageHeader.qml:361
353+#: qml/Dash/DashPageHeader.qml:357
180msgid "Add to Favorites"
354msgid "Add to Favorites"
181msgstr "পছন্দতে যোগ করুন"
355msgstr "পছন্দতে যোগ করুন"
182
356
@@ -188,24 +362,24 @@ msgstr ""
188msgid "Reset"
362msgid "Reset"
189msgstr ""
363msgstr ""
190
364
191−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
365+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
192−msgid "See less"
366+msgid "Show less"
193−msgstr "কম দেখুন"
367+msgstr ""
194
368
195−#: qml/Dash/GenericScopeView.qml:570
369+#: qml/Dash/GenericScopeView.qml:580
196−msgid "See all"
370+msgid "Show all"
197−msgstr "সব দেখুন"
371+msgstr ""
198
372
199−#: qml/Dash/GenericScopeView.qml:627
373+#: qml/Dash/GenericScopeView.qml:637
200msgctxt "Label: Hint for dash search line edit"
374msgctxt "Label: Hint for dash search line edit"
201msgid "Search"
375msgid "Search"
202msgstr "খুঁজুন"
376msgstr "খুঁজুন"
203
377
204−#: qml/Dash/PageHeaderExtraPanel.qml:55
378+#: qml/Dash/PageHeaderExtraPanel.qml:56
205msgid "Recent Searches"
379msgid "Recent Searches"
206msgstr ""
380msgstr ""
207
381
208−#: qml/Dash/PageHeaderExtraPanel.qml:66
382+#: qml/Dash/PageHeaderExtraPanel.qml:67
209msgid "Clear All"
383msgid "Clear All"
210msgstr ""
384msgstr ""
211
385
@@ -218,22 +392,18 @@ msgid "Less..."
218msgstr "কম..."
392msgstr "কম..."
219
393
220#: qml/Dash/Previews/PreviewCommentInput.qml:68
394#: qml/Dash/Previews/PreviewCommentInput.qml:68
221−#: qml/Dash/Previews/PreviewRatingInput.qml:174
395+#: qml/Dash/Previews/PreviewRatingInput.qml:175
222msgid "Send"
396msgid "Send"
223msgstr "পাঠান"
397msgstr "পাঠান"
224
398
225−#: qml/Dash/Previews/PreviewRatingInput.qml:84
399+#: qml/Dash/Previews/PreviewRatingInput.qml:82
226msgid "Rate this"
400msgid "Rate this"
227msgstr "রেটিং দিন"
401msgstr "রেটিং দিন"
228
402
229−#: qml/Dash/Previews/PreviewRatingInput.qml:129
403+#: qml/Dash/Previews/PreviewRatingInput.qml:157
230msgid "Add a review"
404msgid "Add a review"
231msgstr "আপনার মতামত দিন"
405msgstr "আপনার মতামত দিন"
232
406
233−#: qml/Dash/Previews/PreviewSharing.qml:66
234−msgid "Preview Share Item"
235−msgstr ""
236−
237#: qml/Dash/PullToRefreshScopeStyle.qml:55
407#: qml/Dash/PullToRefreshScopeStyle.qml:55
238msgid "Pull to refresh…"
408msgid "Pull to refresh…"
239msgstr "রিফ্রেশ করার জন্য টানুন"
409msgstr "রিফ্রেশ করার জন্য টানুন"
@@ -246,93 +416,105 @@ msgstr "রিফ্রেশ করার জন্য ছেড়ে দিন"
246msgid "Enable location data"
416msgid "Enable location data"
247msgstr "অবস্থান নির্ণয় চালু করুন"
417msgstr "অবস্থান নির্ণয় চালু করুন"
248
418
249−#: qml/Dash/ScopesList.qml:67
419+#: qml/Dash/ScopesList.qml:55
250msgid "Manage"
420msgid "Manage"
251msgstr "ব্যবস্থাপনা"
421msgstr "ব্যবস্থাপনা"
252
422
253−#: qml/Dash/ScopesList.qml:113
423+#: qml/Dash/ScopesList.qml:102
254msgid "Home"
424msgid "Home"
255msgstr ""
425msgstr ""
256
426
257−#: qml/Dash/ScopesList.qml:114
427+#: qml/Dash/ScopesList.qml:103
258msgid "Also installed"
428msgid "Also installed"
259msgstr "আরও ইন্সটল করা রয়েছে..."
429msgstr "আরও ইন্সটল করা রয়েছে..."
260
430
261−#: qml/DisabledScreenNotice.qml:104
431+#: qml/DisabledScreenNotice.qml:109
262msgid ""
432msgid ""
263"Your device is now connected to an external display. Use this screen as a "
433"Your device is now connected to an external display. Use this screen as a "
264"touch pad to interact with the pointer."
434"touch pad to interact with the pointer."
265msgstr ""
435msgstr ""
266
436
267−#: qml/Greeter/CoverPage.qml:118
437+#: qml/Greeter/CoverPage.qml:127
268msgid "Unlock"
438msgid "Unlock"
269msgstr "লক খুলুন"
439msgstr "লক খুলুন"
270
440
441+#: qml/Greeter/Greeter.qml:555
442+msgid "Try again"
443+msgstr ""
444+
271−#: qml/Greeter/LoginList.qml:239
445+#: qml/Greeter/LoginList.qml:63
446+msgid "Passphrase"
447+msgstr ""
448+
449+#: qml/Greeter/LoginList.qml:64
450+msgid "Passcode"
451+msgstr ""
452+
453+#: qml/Greeter/LoginList.qml:87
272msgid "Retry"
454msgid "Retry"
273msgstr ""
455msgstr ""
274
456
275−#: qml/Greeter/LoginList.qml:240
457+#: qml/Greeter/LoginList.qml:88
276−msgid "Tap to unlock"
458+msgid "Log In"
277−msgstr "লক খোলার জন্য চাপ দিন"
459+msgstr ""
278
460
279−#: qml/Greeter/NarrowView.qml:54
461+#: qml/Greeter/NarrowView.qml:55
280msgid "Sorry, incorrect passphrase."
462msgid "Sorry, incorrect passphrase."
281msgstr "দুঃখিত, পাসওয়ার্ডটি ভুল হয়েছে।"
463msgstr "দুঃখিত, পাসওয়ার্ডটি ভুল হয়েছে।"
282
464
283−#: qml/Greeter/NarrowView.qml:55
465+#: qml/Greeter/NarrowView.qml:56
284msgid "Sorry, incorrect passcode."
466msgid "Sorry, incorrect passcode."
285msgstr "দুঃখিত, পাসকোডটি ভুল হয়েছে।"
467msgstr "দুঃখিত, পাসকোডটি ভুল হয়েছে।"
286
468
287−#: qml/Greeter/NarrowView.qml:56
469+#: qml/Greeter/NarrowView.qml:57
288msgid "This will be your last attempt."
470msgid "This will be your last attempt."
289msgstr "এটিই আপনার সর্বশেষ সুযোগ।"
471msgstr "এটিই আপনার সর্বশেষ সুযোগ।"
290
472
291−#: qml/Greeter/NarrowView.qml:58
473+#: qml/Greeter/NarrowView.qml:59
292msgid ""
474msgid ""
293"If passphrase is entered incorrectly, your phone will conduct a factory "
475"If passphrase is entered incorrectly, your phone will conduct a factory "
294"reset and all personal data will be deleted."
476"reset and all personal data will be deleted."
295msgstr ""
477msgstr ""
296"ভুল পাসওয়ার্ড প্রদান করলে, আপনার ফোনটিতে থাকা সকল ব্যক্তিগত তথ্য মুছে যাবে।"
478"ভুল পাসওয়ার্ড প্রদান করলে, আপনার ফোনটিতে থাকা সকল ব্যক্তিগত তথ্য মুছে যাবে।"
297
479
298−#: qml/Greeter/NarrowView.qml:59
480+#: qml/Greeter/NarrowView.qml:60
299msgid ""
481msgid ""
300"If passcode is entered incorrectly, your phone will conduct a factory reset "
482"If passcode is entered incorrectly, your phone will conduct a factory reset "
301"and all personal data will be deleted."
483"and all personal data will be deleted."
302msgstr "ভুল পাসকোড প্রদান করলে, আপনার ফোনটির সকল ব্যক্তিগত তথ্য মুছে যাবে।"
484msgstr "ভুল পাসকোড প্রদান করলে, আপনার ফোনটির সকল ব্যক্তিগত তথ্য মুছে যাবে।"
303
485
304−#: qml/Greeter/NarrowView.qml:116
486+#: qml/Greeter/NarrowView.qml:129
305#, qt-format
487#, qt-format
306msgid "Enter %1"
488msgid "Enter %1"
307msgstr "%1 লিখুন"
489msgstr "%1 লিখুন"
308
490
309−#: qml/Greeter/NarrowView.qml:117
491+#: qml/Greeter/NarrowView.qml:130
310msgid "Enter passphrase"
492msgid "Enter passphrase"
311msgstr "পাসওয়ার্ড লিখুন"
493msgstr "পাসওয়ার্ড লিখুন"
312
494
313−#: qml/Greeter/NarrowView.qml:118
495+#: qml/Greeter/NarrowView.qml:131
314msgid "Enter passcode"
496msgid "Enter passcode"
315msgstr "পাসকোড লিখুন"
497msgstr "পাসকোড লিখুন"
316
498
317−#: qml/Greeter/NarrowView.qml:119
499+#: qml/Greeter/NarrowView.qml:135
318#, qt-format
500#, qt-format
319msgid "Sorry, incorrect %1"
501msgid "Sorry, incorrect %1"
320msgstr "দুঃখিত, %1 ভুল হয়েছে"
502msgstr "দুঃখিত, %1 ভুল হয়েছে"
321
503
322−#: qml/Greeter/NarrowView.qml:120
504+#: qml/Greeter/NarrowView.qml:136
323msgid "Sorry, incorrect passphrase"
505msgid "Sorry, incorrect passphrase"
324msgstr "দুঃখিত, পাসওয়ার্ড ভুল হয়েছে"
506msgstr "দুঃখিত, পাসওয়ার্ড ভুল হয়েছে"
325
507
326−#: qml/Greeter/NarrowView.qml:121
508+#: qml/Greeter/NarrowView.qml:137
327msgctxt "passphrase"
509msgctxt "passphrase"
328msgid "Please re-enter"
510msgid "Please re-enter"
329msgstr "অনুগ্রহ করে আবার লিখুন"
511msgstr "অনুগ্রহ করে আবার লিখুন"
330
512
331−#: qml/Greeter/NarrowView.qml:122
513+#: qml/Greeter/NarrowView.qml:138
332msgid "Sorry, incorrect passcode"
514msgid "Sorry, incorrect passcode"
333msgstr "দুঃখিত, পাসকোড ভুল হয়েছে"
515msgstr "দুঃখিত, পাসকোড ভুল হয়েছে"
334
516
335−#: qml/Notifications/NotificationMenuItemFactory.qml:129
517+#: qml/Notifications/NotificationMenuItemFactory.qml:124
336msgid "Show password"
518msgid "Show password"
337msgstr "পাসওয়ার্ড দেখান"
519msgstr "পাসওয়ার্ড দেখান"
338
520
@@ -344,77 +526,77 @@ msgstr "কলে ফিরে যেতে চাপ দিন..."
344msgid "Conference"
526msgid "Conference"
345msgstr "কনফারেন্স"
527msgstr "কনফারেন্স"
346
528
347−#: qml/Panel/Indicators/MenuItemFactory.qml:761
529+#: qml/Panel/Indicators/MenuItemFactory.qml:762
348msgid "Nothing is playing"
530msgid "Nothing is playing"
349msgstr "কোন কিছু বাজছে না।"
531msgstr "কোন কিছু বাজছে না।"
350
532
351−#: qml/Panel/Indicators/MenuItemFactory.qml:890
533+#: qml/Panel/Indicators/MenuItemFactory.qml:891
352#, qt-format
534#, qt-format
353msgid "%1 hour"
535msgid "%1 hour"
354msgid_plural "%1 hours"
536msgid_plural "%1 hours"
355msgstr[0] "%1 ঘণ্টা"
537msgstr[0] "%1 ঘণ্টা"
356msgstr[1] "%1 ঘণ্টা"
538msgstr[1] "%1 ঘণ্টা"
357
539
358−#: qml/Panel/Indicators/MenuItemFactory.qml:894
540+#: qml/Panel/Indicators/MenuItemFactory.qml:895
359#, qt-format
541#, qt-format
360msgid "%1 minute"
542msgid "%1 minute"
361msgid_plural "%1 minutes"
543msgid_plural "%1 minutes"
362msgstr[0] "%1 মিনিট"
544msgstr[0] "%1 মিনিট"
363msgstr[1] "%1 মিনিট"
545msgstr[1] "%1 মিনিট"
364
546
365−#: qml/Panel/Indicators/MenuItemFactory.qml:899
547+#: qml/Panel/Indicators/MenuItemFactory.qml:900
366#, qt-format
548#, qt-format
367msgid "%1 second"
549msgid "%1 second"
368msgid_plural "%1 seconds"
550msgid_plural "%1 seconds"
369msgstr[0] "%1 সেকেন্ড"
551msgstr[0] "%1 সেকেন্ড"
370msgstr[1] "%1 সেকেন্ড"
552msgstr[1] "%1 সেকেন্ড"
371
553
372−#: qml/Panel/Indicators/MenuItemFactory.qml:902
554+#: qml/Panel/Indicators/MenuItemFactory.qml:903
373msgid "0 seconds"
555msgid "0 seconds"
374msgstr "0 সেকেন্ড"
556msgstr "0 সেকেন্ড"
375
557
376#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
558#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
377−#: qml/Panel/Indicators/MenuItemFactory.qml:904
559+#: qml/Panel/Indicators/MenuItemFactory.qml:905
378#, qt-format
560#, qt-format
379msgid "%1 remaining"
561msgid "%1 remaining"
380msgstr "%1 বাকি"
562msgstr "%1 বাকি"
381
563
382−#: qml/Panel/Indicators/MenuItemFactory.qml:910
564+#: qml/Panel/Indicators/MenuItemFactory.qml:911
383msgid "In queue…"
565msgid "In queue…"
384msgstr "অপেক্ষায় রয়েছে..."
566msgstr "অপেক্ষায় রয়েছে..."
385
567
386−#: qml/Panel/Indicators/MenuItemFactory.qml:914
568+#: qml/Panel/Indicators/MenuItemFactory.qml:915
387msgid "Downloading"
569msgid "Downloading"
388msgstr "ডাউনলোড হচ্ছে"
570msgstr "ডাউনলোড হচ্ছে"
389
571
390−#: qml/Panel/Indicators/MenuItemFactory.qml:916
572+#: qml/Panel/Indicators/MenuItemFactory.qml:917
391msgid "Paused, tap to resume"
573msgid "Paused, tap to resume"
392msgstr "থামানো, শুরু করতে চাপ দিন"
574msgstr "থামানো, শুরু করতে চাপ দিন"
393
575
394−#: qml/Panel/Indicators/MenuItemFactory.qml:918
576+#: qml/Panel/Indicators/MenuItemFactory.qml:919
395msgid "Canceled"
577msgid "Canceled"
396msgstr "বাতিল হয়েছে"
578msgstr "বাতিল হয়েছে"
397
579
398−#: qml/Panel/Indicators/MenuItemFactory.qml:920
580+#: qml/Panel/Indicators/MenuItemFactory.qml:921
399msgid "Finished"
581msgid "Finished"
400msgstr "শেষ"
582msgstr "শেষ"
401
583
402−#: qml/Panel/Indicators/MenuItemFactory.qml:922
584+#: qml/Panel/Indicators/MenuItemFactory.qml:923
403msgid "Failed, tap to retry"
585msgid "Failed, tap to retry"
404msgstr "ব্যার্থ হয়েছে, পুনরায় চেষ্টা করতে চাপ দিন"
586msgstr "ব্যার্থ হয়েছে, পুনরায় চেষ্টা করতে চাপ দিন"
405
587
406−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
588+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
407−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
589+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
408msgctxt "Button: Send a reply message"
590msgctxt "Button: Send a reply message"
409msgid "Send"
591msgid "Send"
410msgstr ""
592msgstr ""
411
593
412−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
594+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
413msgctxt "Label: Hint in message indicator line edit"
595msgctxt "Label: Hint in message indicator line edit"
414msgid "Reply"
596msgid "Reply"
415msgstr "উত্তর দিন"
597msgstr "উত্তর দিন"
416
598
417−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
599+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
418msgctxt "Button: Call back on phone"
600msgctxt "Button: Call back on phone"
419msgid "Call back"
601msgid "Call back"
420msgstr "কল ব্যাক"
602msgstr "কল ব্যাক"
@@ -423,48 +605,24 @@ msgstr "কল ব্যাক"
423msgid "Drag using 3 fingers any application from one window to the other"
605msgid "Drag using 3 fingers any application from one window to the other"
424msgstr ""
606msgstr ""
425
607
426−#: qml/Tutorial/TutorialBottom.qml:78
427−msgid "Swipe up to add a contact"
428−msgstr ""
429−
430−#: qml/Tutorial/TutorialBottom.qml:80
431−msgid "Swipe up for favorite calculations"
432−msgstr ""
433−
434−#: qml/Tutorial/TutorialBottom.qml:82
435−msgid "Swipe up for recent calls"
436−msgstr ""
437−
438−#: qml/Tutorial/TutorialBottom.qml:84
439−msgid "Swipe up to create a message"
440−msgstr ""
441−
442−#: qml/Tutorial/TutorialBottom.qml:85
443−msgid "Swipe up to manage the app"
444−msgstr ""
445−
446−#: qml/Tutorial/TutorialLeft.qml:47
447−msgid "Swipe from the left edge to open the launcher"
448−msgstr ""
449−
450−#: qml/Tutorial/TutorialLeftLong.qml:47
608+#: qml/Tutorial/TutorialLeftLong.qml:49
451msgid "Long swipe from the left edge to open the Today scope"
609msgid "Long swipe from the left edge to open the Today scope"
452msgstr ""
610msgstr ""
453
611
454−#: qml/Tutorial/TutorialRight.qml:54
612+#: qml/Tutorial/TutorialLeft.qml:47
455−msgid "Hover your mouse on the right edge to view your open apps"
613+msgid "Short swipe from the left edge to open the launcher"
456msgstr ""
614msgstr ""
457
615
458#: qml/Tutorial/TutorialRight.qml:55
616#: qml/Tutorial/TutorialRight.qml:55
459−msgid "Short or long swipe from the right edge to view your open apps"
617+msgid "Push your mouse against the right edge to view your open apps"
460msgstr ""
618msgstr ""
461
619
462−#: qml/Tutorial/TutorialTop.qml:53
620+#: qml/Tutorial/TutorialRight.qml:56
463−msgid "Swipe from the top right edge to open the notification bar"
621+msgid "Swipe from the right edge to view your open apps"
464msgstr ""
622msgstr ""
465
623
466−#: qml/Tutorial/TutorialTop.qml:54
624+#: qml/Tutorial/TutorialTop.qml:53
467−msgid "Swipe from the top edge to open the notification bar"
625+msgid "Swipe from the top edge to access notifications and quick settings"
468msgstr ""
626msgstr ""
469
627
470#: qml/Wizard/Page.qml:54
628#: qml/Wizard/Page.qml:54
@@ -476,11 +634,11 @@ msgstr ""
476msgid "Language"
634msgid "Language"
477msgstr ""
635msgstr ""
478
636
479−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
637+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
480−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
638+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
481#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
639#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
482#: qml/Wizard/Pages/75-report-check.qml:84
640#: qml/Wizard/Pages/75-report-check.qml:84
483−#: qml/Wizard/Pages/passcode-desktop.qml:124
641+#: qml/Wizard/Pages/passcode-desktop.qml:141
484#: qml/Wizard/Pages/password-set.qml:141
642#: qml/Wizard/Pages/password-set.qml:141
485msgid "Next"
643msgid "Next"
486msgstr ""
644msgstr ""
@@ -542,7 +700,7 @@ msgstr ""
542msgid "Time Zone"
700msgid "Time Zone"
543msgstr ""
701msgstr ""
544
702
545−#: qml/Wizard/Pages/50-timezone.qml:178
703+#: qml/Wizard/Pages/50-timezone.qml:181
546msgid "Enter your city"
704msgid "Enter your city"
547msgstr ""
705msgstr ""
548
706
@@ -632,7 +790,7 @@ msgid "Service Terms"
632msgstr ""
790msgstr ""
633
791
634#: qml/Wizard/Pages/passcode-confirm.qml:43
792#: qml/Wizard/Pages/passcode-confirm.qml:43
635−#: qml/Wizard/Pages/passcode-desktop.qml:80
793+#: qml/Wizard/Pages/passcode-desktop.qml:96
636msgid "Confirm passcode"
794msgid "Confirm passcode"
637msgstr ""
795msgstr ""
638
796
@@ -649,24 +807,24 @@ msgstr ""
649msgid "Lock Screen Passcode"
807msgid "Lock Screen Passcode"
650msgstr ""
808msgstr ""
651
809
652−#: qml/Wizard/Pages/passcode-desktop.qml:56
810+#: qml/Wizard/Pages/passcode-desktop.qml:60
653msgid "Enter 4 numbers to setup your passcode"
811msgid "Enter 4 numbers to setup your passcode"
654msgstr ""
812msgstr ""
655
813
656−#: qml/Wizard/Pages/passcode-desktop.qml:65
814+#: qml/Wizard/Pages/passcode-desktop.qml:76
657#: qml/Wizard/Pages/passcode-set.qml:54
815#: qml/Wizard/Pages/passcode-set.qml:54
658msgid "Choose passcode"
816msgid "Choose passcode"
659msgstr ""
817msgstr ""
660
818
661−#: qml/Wizard/Pages/passcode-desktop.qml:105
819+#: qml/Wizard/Pages/passcode-desktop.qml:126
662msgid "Passcode too short"
820msgid "Passcode too short"
663msgstr ""
821msgstr ""
664
822
665−#: qml/Wizard/Pages/passcode-desktop.qml:107
823+#: qml/Wizard/Pages/passcode-desktop.qml:128
666msgid "Passcodes match"
824msgid "Passcodes match"
667msgstr ""
825msgstr ""
668
826
669−#: qml/Wizard/Pages/passcode-desktop.qml:109
827+#: qml/Wizard/Pages/passcode-desktop.qml:130
670msgid "Passcodes do not match"
828msgid "Passcodes do not match"
671msgstr ""
829msgstr ""
672
830
@@ -715,26 +873,30 @@ msgid "To proceed with no SIM tap Skip."
715msgstr ""
873msgstr ""
716
874
717#: qml/Wizard/PasswordMeter.qml:87
875#: qml/Wizard/PasswordMeter.qml:87
718−msgid "Passwords match"
876+msgid "Password too short"
719msgstr ""
877msgstr ""
720
878
721#: qml/Wizard/PasswordMeter.qml:89
879#: qml/Wizard/PasswordMeter.qml:89
880+msgid "Passwords match"
881+msgstr ""
882+
883+#: qml/Wizard/PasswordMeter.qml:91
722msgid "Passwords do not match"
884msgid "Passwords do not match"
723msgstr ""
885msgstr ""
724
886
725−#: qml/Wizard/PasswordMeter.qml:93
887+#: qml/Wizard/PasswordMeter.qml:95
726msgid "Strong password"
888msgid "Strong password"
727msgstr ""
889msgstr ""
728
890
729−#: qml/Wizard/PasswordMeter.qml:95
891+#: qml/Wizard/PasswordMeter.qml:97
730msgid "Fair password"
892msgid "Fair password"
731msgstr ""
893msgstr ""
732
894
733−#: qml/Wizard/PasswordMeter.qml:97
895+#: qml/Wizard/PasswordMeter.qml:99
734msgid "Weak password"
896msgid "Weak password"
735msgstr ""
897msgstr ""
736
898
737−#: qml/Wizard/PasswordMeter.qml:99
899+#: qml/Wizard/PasswordMeter.qml:101
738msgid "Very weak password"
900msgid "Very weak password"
739msgstr ""
901msgstr ""
740
902
@@ -742,6 +904,12 @@ msgstr ""
742#~ msgid "Reboot"
904#~ msgid "Reboot"
743#~ msgstr "পুনরায় চালু করুন"
905#~ msgstr "পুনরায় চালু করুন"
744
906
907+#~ msgid "See all"
908+#~ msgstr "সব দেখুন"
909+
910+#~ msgid "See less"
911+#~ msgstr "কম দেখুন"
912+
745#~ msgid "This action does different things for different apps"
913#~ msgid "This action does different things for different apps"
746#~ msgstr "এই কাজটি বিভিন্ন অ্যাপের জন্য ভিন্ন ভিন্ন ভাবে কাজ করে।"
914#~ msgstr "এই কাজটি বিভিন্ন অ্যাপের জন্য ভিন্ন ভিন্ন ভাবে কাজ করে।"
747
915
@@ -854,6 +1022,9 @@ msgstr ""
854#~ msgid "Shut down"
1022#~ msgid "Shut down"
855#~ msgstr "বন্ধ করুন"
1023#~ msgstr "বন্ধ করুন"
856
1024
1025+#~ msgid "Tap to unlock"
1026+#~ msgstr "লক খোলার জন্য চাপ দিন"
1027+
857#~ msgid "Let’s get started."
1028#~ msgid "Let’s get started."
858#~ msgstr "আসুন শুরু করা যাক।"
1029#~ msgstr "আসুন শুরু করা যাক।"
859
1030
po/br.po+353−183
@@ -7,51 +7,51 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11−"PO-Revision-Date: 2016-02-22 12:29+0000\n"
11+"PO-Revision-Date: 2016-04-27 12:20+0000\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
13"Language-Team: Breton <br@li.org>\n"
13"Language-Team: Breton <br@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 18147)\n"
20
20
21−#: plugins/IntegratedLightDM/Greeter.cpp:112
21+#: plugins/LightDM/Greeter.cpp:123
22msgid "Password: "
22msgid "Password: "
23msgstr "Ger-tremen : "
23msgstr "Ger-tremen : "
24
24
25−#: plugins/Unity/Launcher/launcheritem.cpp:48
25+#: plugins/Unity/Launcher/launcheritem.cpp:49
26−#: plugins/Unity/Launcher/launcheritem.cpp:107
26+#: plugins/Unity/Launcher/launcheritem.cpp:108
27msgid "Pin shortcut"
27msgid "Pin shortcut"
28msgstr "Spilhennañ ar verradenn"
28msgstr "Spilhennañ ar verradenn"
29
29
30−#: plugins/Unity/Launcher/launcheritem.cpp:53
30+#: plugins/Unity/Launcher/launcheritem.cpp:54
31msgid "Quit"
31msgid "Quit"
32msgstr "Mont kuit"
32msgstr "Mont kuit"
33
33
34−#: plugins/Unity/Launcher/launcheritem.cpp:107
34+#: plugins/Unity/Launcher/launcheritem.cpp:108
35msgid "Unpin shortcut"
35msgid "Unpin shortcut"
36msgstr "Dispilhennañ ar verradenn"
36msgstr "Dispilhennañ ar verradenn"
37
37
38−#: qml/Components/DelayedLockscreen.qml:49
38+#: qml/Components/DelayedLockscreen.qml:50
39msgid "Device Locked"
39msgid "Device Locked"
40msgstr "Benveg prennet"
40msgstr "Benveg prennet"
41
41
42−#: qml/Components/DelayedLockscreen.qml:64
42+#: qml/Components/DelayedLockscreen.qml:65
43msgid "You have been locked out due to too many failed passphrase attempts."
43msgid "You have been locked out due to too many failed passphrase attempts."
44msgstr ""
44msgstr ""
45"Prennet eo bet ho penveg abalamour da re a daolioù-esae c'hwitet evit merkañ "
45"Prennet eo bet ho penveg abalamour da re a daolioù-esae c'hwitet evit merkañ "
46"ho frazenn-dremen."
46"ho frazenn-dremen."
47
47
48−#: qml/Components/DelayedLockscreen.qml:65
48+#: qml/Components/DelayedLockscreen.qml:66
49msgid "You have been locked out due to too many failed passcode attempts."
49msgid "You have been locked out due to too many failed passcode attempts."
50msgstr ""
50msgstr ""
51"Prennet eo bet ho penveg abalamour da re a daolioù-esae evit merkañ ho kod-"
51"Prennet eo bet ho penveg abalamour da re a daolioù-esae evit merkañ ho kod-"
52"tremen."
52"tremen."
53
53
54−#: qml/Components/DelayedLockscreen.qml:74
54+#: qml/Components/DelayedLockscreen.qml:75
55#, qt-format
55#, qt-format
56msgid "Please wait %1 minute and then try again…"
56msgid "Please wait %1 minute and then try again…"
57msgid_plural "Please wait %1 minutes and then try again…"
57msgid_plural "Please wait %1 minutes and then try again…"
@@ -77,8 +77,8 @@ msgctxt "Button: Log out from the system"
77msgid "Log Out"
77msgid "Log Out"
78msgstr "Digevreañ"
78msgstr "Digevreañ"
79
79
80−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
80+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
81−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
81+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
82#: qml/Wizard/Pages/passcode-set.qml:32
82#: qml/Wizard/Pages/passcode-set.qml:32
83msgid "Cancel"
83msgid "Cancel"
84msgstr "Nullañ"
84msgstr "Nullañ"
@@ -96,16 +96,16 @@ msgstr "Ha sur oc'h e fell deoc'h adloc'hañ ?"
96msgid "No"
96msgid "No"
97msgstr "N'on ket"
97msgstr "N'on ket"
98
98
99−#: qml/Components/Dialogs.qml:183
99+#: qml/Components/Dialogs.qml:182
100msgid "Yes"
100msgid "Yes"
101msgstr "Ya"
101msgstr "Ya"
102
102
103−#: qml/Components/Dialogs.qml:198
103+#: qml/Components/Dialogs.qml:197
104msgctxt "Title: Power off/Restart dialog"
104msgctxt "Title: Power off/Restart dialog"
105msgid "Power"
105msgid "Power"
106msgstr "Enaouiñ"
106msgstr "Enaouiñ"
107
107
108−#: qml/Components/Dialogs.qml:199
108+#: qml/Components/Dialogs.qml:198
109msgid ""
109msgid ""
110"Are you sure you would like\n"
110"Are you sure you would like\n"
111"to power off?"
111"to power off?"
@@ -113,28 +113,198 @@ msgstr ""
113"Ha sur oc'h e fell deoc'h\n"
113"Ha sur oc'h e fell deoc'h\n"
114"troc'hañ an tredan ?"
114"troc'hañ an tredan ?"
115
115
116−#: qml/Components/Dialogs.qml:201
116+#: qml/Components/Dialogs.qml:200
117msgctxt "Button: Power off the system"
117msgctxt "Button: Power off the system"
118msgid "Power off"
118msgid "Power off"
119msgstr "Lazhañ"
119msgstr "Lazhañ"
120
120
121−#: qml/Components/Dialogs.qml:210
121+#: qml/Components/Dialogs.qml:209
122msgctxt "Button: Restart the system"
122msgctxt "Button: Restart the system"
123msgid "Restart"
123msgid "Restart"
124msgstr "Adloc'hañ"
124msgstr "Adloc'hañ"
125
125
126+#: qml/Components/KeyboardShortcutsOverlay.qml:41
127+msgid "Keyboard Shortcuts"
128+msgstr ""
129+
130+#: qml/Components/KeyboardShortcutsOverlay.qml:55
131+msgid "Unity 8"
132+msgstr ""
133+
134+#: qml/Components/KeyboardShortcutsOverlay.qml:62
135+msgid "PrtScr"
136+msgstr ""
137+
138+#: qml/Components/KeyboardShortcutsOverlay.qml:67
139+msgid "Takes a screenshot."
140+msgstr ""
141+
142+#: qml/Components/KeyboardShortcutsOverlay.qml:75
143+msgid "Alt + PrtScr"
144+msgstr ""
145+
146+#: qml/Components/KeyboardShortcutsOverlay.qml:80
147+msgid "Takes a screenshot of a window."
148+msgstr ""
149+
150+#: qml/Components/KeyboardShortcutsOverlay.qml:88
151+msgid "Super + Space"
152+msgstr ""
153+
154+#: qml/Components/KeyboardShortcutsOverlay.qml:93
155+msgid "Switches to next keyboard layout."
156+msgstr ""
157+
158+#: qml/Components/KeyboardShortcutsOverlay.qml:101
159+msgid "Super + Shift + Space"
160+msgstr ""
161+
162+#: qml/Components/KeyboardShortcutsOverlay.qml:106
163+msgid "Switches to previous keyboard layout."
164+msgstr ""
165+
166+#: qml/Components/KeyboardShortcutsOverlay.qml:118
167+msgid "Launcher"
168+msgstr ""
169+
170+#: qml/Components/KeyboardShortcutsOverlay.qml:125
171+msgid "Super (Hold)"
172+msgstr ""
173+
174+#: qml/Components/KeyboardShortcutsOverlay.qml:130
175+msgid "Opens the launcher, displays shortcuts."
176+msgstr ""
177+
178+#: qml/Components/KeyboardShortcutsOverlay.qml:138
179+msgid "Alt + F1"
180+msgstr ""
181+
182+#: qml/Components/KeyboardShortcutsOverlay.qml:143
183+msgid "Opens launcher keyboard navigation mode."
184+msgstr ""
185+
186+#: qml/Components/KeyboardShortcutsOverlay.qml:151
187+msgid "Super + Tab"
188+msgstr ""
189+
190+#: qml/Components/KeyboardShortcutsOverlay.qml:156
191+msgid "Switches applications via the launcher."
192+msgstr ""
193+
194+#: qml/Components/KeyboardShortcutsOverlay.qml:164
195+msgid "Super + 0 to 9"
196+msgstr ""
197+
198+#: qml/Components/KeyboardShortcutsOverlay.qml:169
199+msgid "Same as clicking on a launcher icon."
200+msgstr ""
201+
202+#: qml/Components/KeyboardShortcutsOverlay.qml:181
203+msgid "Scopes"
204+msgstr ""
205+
206+#: qml/Components/KeyboardShortcutsOverlay.qml:188
207+msgid "Super (Tap)"
208+msgstr ""
209+
210+#: qml/Components/KeyboardShortcutsOverlay.qml:193
211+msgid "Opens the Scopes home."
212+msgstr ""
213+
214+#: qml/Components/KeyboardShortcutsOverlay.qml:209
215+msgid "Switching"
216+msgstr ""
217+
218+#: qml/Components/KeyboardShortcutsOverlay.qml:216
219+msgid "Alt + Tab"
220+msgstr ""
221+
222+#: qml/Components/KeyboardShortcutsOverlay.qml:221
223+msgid "Switches between applications."
224+msgstr ""
225+
226+#: qml/Components/KeyboardShortcutsOverlay.qml:229
227+msgid "Super + W"
228+msgstr ""
229+
230+#: qml/Components/KeyboardShortcutsOverlay.qml:234
231+msgid "Opens the desktop spread."
232+msgstr ""
233+
234+#: qml/Components/KeyboardShortcutsOverlay.qml:242
235+msgid "Cursor Left or Right"
236+msgstr ""
237+
238+#: qml/Components/KeyboardShortcutsOverlay.qml:247
239+msgid "Moves the focus."
240+msgstr ""
241+
242+#: qml/Components/KeyboardShortcutsOverlay.qml:259
243+msgid "Windows"
244+msgstr ""
245+
246+#: qml/Components/KeyboardShortcutsOverlay.qml:266
247+msgid "Ctrl + Super + D"
248+msgstr ""
249+
250+#: qml/Components/KeyboardShortcutsOverlay.qml:271
251+msgid "Minimizes all windows."
252+msgstr ""
253+
254+#: qml/Components/KeyboardShortcutsOverlay.qml:279
255+msgid "Ctrl + Super + Up"
256+msgstr ""
257+
258+#: qml/Components/KeyboardShortcutsOverlay.qml:284
259+msgid "Maximizes the current window."
260+msgstr ""
261+
262+#: qml/Components/KeyboardShortcutsOverlay.qml:292
263+msgid "Ctrl + Super + Down"
264+msgstr ""
265+
266+#: qml/Components/KeyboardShortcutsOverlay.qml:297
267+msgid "Minimizes or restores the current window."
268+msgstr ""
269+
270+#: qml/Components/KeyboardShortcutsOverlay.qml:305
271+msgid "Ctrl + Super + Left or Right"
272+msgstr ""
273+
274+#: qml/Components/KeyboardShortcutsOverlay.qml:310
275+msgid "Semi-maximizes the current window."
276+msgstr ""
277+
278+#: qml/Components/KeyboardShortcutsOverlay.qml:318
279+msgid "Alt + F4"
280+msgstr ""
281+
282+#: qml/Components/KeyboardShortcutsOverlay.qml:323
283+msgid "Closes the current window."
284+msgstr ""
285+
126−#: qml/Components/Lockscreen.qml:231
286+#: qml/Components/Lockscreen.qml:239
127msgid "Return to Call"
287msgid "Return to Call"
128msgstr "Distreiñ d'ar bellgomzadenn"
288msgstr "Distreiñ d'ar bellgomzadenn"
129
289
130−#: qml/Components/Lockscreen.qml:231
290+#: qml/Components/Lockscreen.qml:239
131msgid "Emergency Call"
291msgid "Emergency Call"
132msgstr "Pellgomzadenn vallus"
292msgstr "Pellgomzadenn vallus"
133
293
134−#: qml/Components/Lockscreen.qml:263
294+#: qml/Components/Lockscreen.qml:271
135msgid "OK"
295msgid "OK"
136msgstr "Mat eo"
296msgstr "Mat eo"
137
297
298+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
299+#, qt-format
300+msgid "%1:%2:%3"
301+msgstr ""
302+
303+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
304+#, qt-format
305+msgid "%1:%2"
306+msgstr ""
307+
138#: qml/Components/ModeSwitchWarningDialog.qml:32
308#: qml/Components/ModeSwitchWarningDialog.qml:32
139msgid "Apps may have unsaved data:"
309msgid "Apps may have unsaved data:"
140msgstr "Roadennoù ha n'int ket enrollet a c'hall bezañ gant an arloadoù :"
310msgstr "Roadennoù ha n'int ket enrollet a c'hall bezañ gant an arloadoù :"
@@ -144,6 +314,8 @@ msgctxt ""
144"Re-dock means connect the device again to an external screen/mouse/keyboard"
314"Re-dock means connect the device again to an external screen/mouse/keyboard"
145msgid "Re-dock, save your work and close these apps to continue."
315msgid "Re-dock, save your work and close these apps to continue."
146msgstr ""
316msgstr ""
317+"Adkevreit ouzh ar savlec'h degemer, enrollot ho labour ha serrit an arloadoù-"
318+"mañ evit kenderc'hel."
147
319
148#: qml/Components/ModeSwitchWarningDialog.qml:63
320#: qml/Components/ModeSwitchWarningDialog.qml:63
149msgid "Or force close now (unsaved data will be lost)."
321msgid "Or force close now (unsaved data will be lost)."
@@ -162,57 +334,61 @@ msgstr "Adkevreañ bremañ !"
162msgid "Close all"
334msgid "Close all"
163msgstr "Serriñ pep tra"
335msgstr "Serriñ pep tra"
164
336
337+#: qml/Components/SharingPicker.qml:54
338+msgid "Preview Share Item"
339+msgstr "Rakwelet an elfenn lodet"
340+
165−#: qml/Dash/DashPageHeader.qml:337
341+#: qml/Dash/DashPageHeader.qml:333
166msgctxt "Button: Open the Ubuntu Store"
342msgctxt "Button: Open the Ubuntu Store"
167msgid "Store"
343msgid "Store"
168msgstr "Stal"
344msgstr "Stal"
169
345
170−#: qml/Dash/DashPageHeader.qml:344
346+#: qml/Dash/DashPageHeader.qml:340
171msgctxt "Button: Start a search in the current dash scope"
347msgctxt "Button: Start a search in the current dash scope"
172msgid "Search"
348msgid "Search"
173msgstr "Klask"
349msgstr "Klask"
174
350
175−#: qml/Dash/DashPageHeader.qml:354
351+#: qml/Dash/DashPageHeader.qml:350
176msgctxt "Button: Show the current dash scope settings"
352msgctxt "Button: Show the current dash scope settings"
177msgid "Settings"
353msgid "Settings"
178msgstr "Arventennoù"
354msgstr "Arventennoù"
179
355
180−#: qml/Dash/DashPageHeader.qml:361
356+#: qml/Dash/DashPageHeader.qml:357
181msgid "Remove from Favorites"
357msgid "Remove from Favorites"
182msgstr "Lemel eus ar sinedoù"
358msgstr "Lemel eus ar sinedoù"
183
359
184−#: qml/Dash/DashPageHeader.qml:361
360+#: qml/Dash/DashPageHeader.qml:357
185msgid "Add to Favorites"
361msgid "Add to Favorites"
186msgstr "Ouzhpennañ d'ar sinedoù"
362msgstr "Ouzhpennañ d'ar sinedoù"
187
363
188#: qml/Dash/FiltersPopover.qml:60
364#: qml/Dash/FiltersPopover.qml:60
189msgid "Refine your results"
365msgid "Refine your results"
190−msgstr ""
366+msgstr "Purañ ho tisoc'hoù"
191
367
192#: qml/Dash/FiltersPopover.qml:69
368#: qml/Dash/FiltersPopover.qml:69
193msgid "Reset"
369msgid "Reset"
194−msgstr ""
370+msgstr "Adderaouekaat"
195
371
196−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
372+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
197−msgid "See less"
373+msgid "Show less"
198−msgstr "Gwelet nebeutoc'h"
374+msgstr ""
199
375
200−#: qml/Dash/GenericScopeView.qml:570
376+#: qml/Dash/GenericScopeView.qml:580
201−msgid "See all"
377+msgid "Show all"
202−msgstr "Gwelet pep tra"
378+msgstr ""
203
379
204−#: qml/Dash/GenericScopeView.qml:627
380+#: qml/Dash/GenericScopeView.qml:637
205msgctxt "Label: Hint for dash search line edit"
381msgctxt "Label: Hint for dash search line edit"
206msgid "Search"
382msgid "Search"
207msgstr "Klask"
383msgstr "Klask"
208
384
209−#: qml/Dash/PageHeaderExtraPanel.qml:55
385+#: qml/Dash/PageHeaderExtraPanel.qml:56
210msgid "Recent Searches"
386msgid "Recent Searches"
211−msgstr ""
387+msgstr "Enklaskoù graet nevez zo"
212
388
213−#: qml/Dash/PageHeaderExtraPanel.qml:66
389+#: qml/Dash/PageHeaderExtraPanel.qml:67
214msgid "Clear All"
390msgid "Clear All"
215−msgstr ""
391+msgstr "Diverkañ pep tra"
216
392
217#: qml/Dash/Previews/PreviewActionCombo.qml:35
393#: qml/Dash/Previews/PreviewActionCombo.qml:35
218msgid "More..."
394msgid "More..."
@@ -223,22 +399,18 @@ msgid "Less..."
223msgstr "Nebeutoc'h..."
399msgstr "Nebeutoc'h..."
224
400
225#: qml/Dash/Previews/PreviewCommentInput.qml:68
401#: qml/Dash/Previews/PreviewCommentInput.qml:68
226−#: qml/Dash/Previews/PreviewRatingInput.qml:174
402+#: qml/Dash/Previews/PreviewRatingInput.qml:175
227msgid "Send"
403msgid "Send"
228msgstr "Kas"
404msgstr "Kas"
229
405
230−#: qml/Dash/Previews/PreviewRatingInput.qml:84
406+#: qml/Dash/Previews/PreviewRatingInput.qml:82
231msgid "Rate this"
407msgid "Rate this"
232msgstr "Priziit an dra-mañ"
408msgstr "Priziit an dra-mañ"
233
409
234−#: qml/Dash/Previews/PreviewRatingInput.qml:129
410+#: qml/Dash/Previews/PreviewRatingInput.qml:157
235msgid "Add a review"
411msgid "Add a review"
236msgstr "Ouzhpennañ un ali"
412msgstr "Ouzhpennañ un ali"
237
413
238−#: qml/Dash/Previews/PreviewSharing.qml:66
239−msgid "Preview Share Item"
240−msgstr "Rakwelet an elfenn lodet"
241−
242#: qml/Dash/PullToRefreshScopeStyle.qml:55
414#: qml/Dash/PullToRefreshScopeStyle.qml:55
243msgid "Pull to refresh…"
415msgid "Pull to refresh…"
244msgstr "Tennañ evit freskaat..."
416msgstr "Tennañ evit freskaat..."
@@ -251,49 +423,61 @@ msgstr "Lezel da vont evit freskaat..."
251msgid "Enable location data"
423msgid "Enable location data"
252msgstr "Gweredekaat ar roadennoù lec'hiañ"
424msgstr "Gweredekaat ar roadennoù lec'hiañ"
253
425
254−#: qml/Dash/ScopesList.qml:67
426+#: qml/Dash/ScopesList.qml:55
255msgid "Manage"
427msgid "Manage"
256msgstr "Merañ"
428msgstr "Merañ"
257
429
258−#: qml/Dash/ScopesList.qml:113
430+#: qml/Dash/ScopesList.qml:102
259msgid "Home"
431msgid "Home"
260msgstr "Er gêr"
432msgstr "Er gêr"
261
433
262−#: qml/Dash/ScopesList.qml:114
434+#: qml/Dash/ScopesList.qml:103
263msgid "Also installed"
435msgid "Also installed"
264msgstr "Staliet ivez"
436msgstr "Staliet ivez"
265
437
266−#: qml/DisabledScreenNotice.qml:104
438+#: qml/DisabledScreenNotice.qml:109
267msgid ""
439msgid ""
268"Your device is now connected to an external display. Use this screen as a "
440"Your device is now connected to an external display. Use this screen as a "
269"touch pad to interact with the pointer."
441"touch pad to interact with the pointer."
270msgstr ""
442msgstr ""
271
443
272−#: qml/Greeter/CoverPage.qml:118
444+#: qml/Greeter/CoverPage.qml:127
273msgid "Unlock"
445msgid "Unlock"
274msgstr "Dibrennañ"
446msgstr "Dibrennañ"
275
447
448+#: qml/Greeter/Greeter.qml:555
449+msgid "Try again"
450+msgstr ""
451+
276−#: qml/Greeter/LoginList.qml:239
452+#: qml/Greeter/LoginList.qml:63
453+msgid "Passphrase"
454+msgstr ""
455+
456+#: qml/Greeter/LoginList.qml:64
457+msgid "Passcode"
458+msgstr ""
459+
460+#: qml/Greeter/LoginList.qml:87
277msgid "Retry"
461msgid "Retry"
278msgstr "Esaeañ en-dro"
462msgstr "Esaeañ en-dro"
279
463
280−#: qml/Greeter/LoginList.qml:240
464+#: qml/Greeter/LoginList.qml:88
281−msgid "Tap to unlock"
465+msgid "Log In"
282−msgstr "Pouezañ evit dibrennañ"
466+msgstr ""
283
467
284−#: qml/Greeter/NarrowView.qml:54
468+#: qml/Greeter/NarrowView.qml:55
285msgid "Sorry, incorrect passphrase."
469msgid "Sorry, incorrect passphrase."
286msgstr "Siwazh, frazenn-dremen direizh"
470msgstr "Siwazh, frazenn-dremen direizh"
287
471
288−#: qml/Greeter/NarrowView.qml:55
472+#: qml/Greeter/NarrowView.qml:56
289msgid "Sorry, incorrect passcode."
473msgid "Sorry, incorrect passcode."
290msgstr "Siwazh, kod-tremen direizh"
474msgstr "Siwazh, kod-tremen direizh"
291
475
292−#: qml/Greeter/NarrowView.qml:56
476+#: qml/Greeter/NarrowView.qml:57
293msgid "This will be your last attempt."
477msgid "This will be your last attempt."
294msgstr "Ho taol-esae diwezhañ e vo."
478msgstr "Ho taol-esae diwezhañ e vo."
295
479
296−#: qml/Greeter/NarrowView.qml:58
480+#: qml/Greeter/NarrowView.qml:59
297msgid ""
481msgid ""
298"If passphrase is entered incorrectly, your phone will conduct a factory "
482"If passphrase is entered incorrectly, your phone will conduct a factory "
299"reset and all personal data will be deleted."
483"reset and all personal data will be deleted."
@@ -301,7 +485,7 @@ msgstr ""
301"Ma vez ebarzhet ur frazenn-dremen direizh, e vo adderaouekaet ho pellgomzer "
485"Ma vez ebarzhet ur frazenn-dremen direizh, e vo adderaouekaet ho pellgomzer "
302"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel"
486"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel"
303
487
304−#: qml/Greeter/NarrowView.qml:59
488+#: qml/Greeter/NarrowView.qml:60
305msgid ""
489msgid ""
306"If passcode is entered incorrectly, your phone will conduct a factory reset "
490"If passcode is entered incorrectly, your phone will conduct a factory reset "
307"and all personal data will be deleted."
491"and all personal data will be deleted."
@@ -309,38 +493,38 @@ msgstr ""
309"Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
493"Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
310"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
494"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
311
495
312−#: qml/Greeter/NarrowView.qml:116
496+#: qml/Greeter/NarrowView.qml:129
313#, qt-format
497#, qt-format
314msgid "Enter %1"
498msgid "Enter %1"
315msgstr "Merkañ %1"
499msgstr "Merkañ %1"
316
500
317−#: qml/Greeter/NarrowView.qml:117
501+#: qml/Greeter/NarrowView.qml:130
318msgid "Enter passphrase"
502msgid "Enter passphrase"
319msgstr "Merkañ ar frazenn-dremen"
503msgstr "Merkañ ar frazenn-dremen"
320
504
321−#: qml/Greeter/NarrowView.qml:118
505+#: qml/Greeter/NarrowView.qml:131
322msgid "Enter passcode"
506msgid "Enter passcode"
323msgstr "Merkañ ar c'hod-tremen"
507msgstr "Merkañ ar c'hod-tremen"
324
508
325−#: qml/Greeter/NarrowView.qml:119
509+#: qml/Greeter/NarrowView.qml:135
326#, qt-format
510#, qt-format
327msgid "Sorry, incorrect %1"
511msgid "Sorry, incorrect %1"
328msgstr "Siwazh, %1 direizh"
512msgstr "Siwazh, %1 direizh"
329
513
330−#: qml/Greeter/NarrowView.qml:120
514+#: qml/Greeter/NarrowView.qml:136
331msgid "Sorry, incorrect passphrase"
515msgid "Sorry, incorrect passphrase"
332msgstr "Siwazh, frazenn-dremen direizh"
516msgstr "Siwazh, frazenn-dremen direizh"
333
517
334−#: qml/Greeter/NarrowView.qml:121
518+#: qml/Greeter/NarrowView.qml:137
335msgctxt "passphrase"
519msgctxt "passphrase"
336msgid "Please re-enter"
520msgid "Please re-enter"
337msgstr "Adverkañ, mar plij"
521msgstr "Adverkañ, mar plij"
338
522
339−#: qml/Greeter/NarrowView.qml:122
523+#: qml/Greeter/NarrowView.qml:138
340msgid "Sorry, incorrect passcode"
524msgid "Sorry, incorrect passcode"
341msgstr "Digarezit, kod-tremen direizh"
525msgstr "Digarezit, kod-tremen direizh"
342
526
343−#: qml/Notifications/NotificationMenuItemFactory.qml:129
527+#: qml/Notifications/NotificationMenuItemFactory.qml:124
344msgid "Show password"
528msgid "Show password"
345msgstr "Diskouez ar ger-tremen"
529msgstr "Diskouez ar ger-tremen"
346
530
@@ -352,77 +536,77 @@ msgstr "Touchit evit distreiñ d'ar bellgomzadenn..."
352msgid "Conference"
536msgid "Conference"
353msgstr "Kendiviz"
537msgstr "Kendiviz"
354
538
355−#: qml/Panel/Indicators/MenuItemFactory.qml:761
539+#: qml/Panel/Indicators/MenuItemFactory.qml:762
356msgid "Nothing is playing"
540msgid "Nothing is playing"
357msgstr "Ne lenner netra bremañ"
541msgstr "Ne lenner netra bremañ"
358
542
359−#: qml/Panel/Indicators/MenuItemFactory.qml:890
543+#: qml/Panel/Indicators/MenuItemFactory.qml:891
360#, qt-format
544#, qt-format
361msgid "%1 hour"
545msgid "%1 hour"
362msgid_plural "%1 hours"
546msgid_plural "%1 hours"
363msgstr[0] "%1 eur"
547msgstr[0] "%1 eur"
364msgstr[1] "%1 eur"
548msgstr[1] "%1 eur"
365
549
366−#: qml/Panel/Indicators/MenuItemFactory.qml:894
550+#: qml/Panel/Indicators/MenuItemFactory.qml:895
367#, qt-format
551#, qt-format
368msgid "%1 minute"
552msgid "%1 minute"
369msgid_plural "%1 minutes"
553msgid_plural "%1 minutes"
370msgstr[0] "%1 vunutenn"
554msgstr[0] "%1 vunutenn"
371msgstr[1] "%1 vunutenn"
555msgstr[1] "%1 vunutenn"
372
556
373−#: qml/Panel/Indicators/MenuItemFactory.qml:899
557+#: qml/Panel/Indicators/MenuItemFactory.qml:900
374#, qt-format
558#, qt-format
375msgid "%1 second"
559msgid "%1 second"
376msgid_plural "%1 seconds"
560msgid_plural "%1 seconds"
377msgstr[0] "%1 eilenn"
561msgstr[0] "%1 eilenn"
378msgstr[1] "%1 eilenn"
562msgstr[1] "%1 eilenn"
379
563
380−#: qml/Panel/Indicators/MenuItemFactory.qml:902
564+#: qml/Panel/Indicators/MenuItemFactory.qml:903
381msgid "0 seconds"
565msgid "0 seconds"
382msgstr "0 eilenn"
566msgstr "0 eilenn"
383
567
384#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
568#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
385−#: qml/Panel/Indicators/MenuItemFactory.qml:904
569+#: qml/Panel/Indicators/MenuItemFactory.qml:905
386#, qt-format
570#, qt-format
387msgid "%1 remaining"
571msgid "%1 remaining"
388msgstr "%1 o chom"
572msgstr "%1 o chom"
389
573
390−#: qml/Panel/Indicators/MenuItemFactory.qml:910
574+#: qml/Panel/Indicators/MenuItemFactory.qml:911
391msgid "In queue…"
575msgid "In queue…"
392msgstr "El lostennad..."
576msgstr "El lostennad..."
393
577
394−#: qml/Panel/Indicators/MenuItemFactory.qml:914
578+#: qml/Panel/Indicators/MenuItemFactory.qml:915
395msgid "Downloading"
579msgid "Downloading"
396msgstr "O pellgargañ"
580msgstr "O pellgargañ"
397
581
398−#: qml/Panel/Indicators/MenuItemFactory.qml:916
582+#: qml/Panel/Indicators/MenuItemFactory.qml:917
399msgid "Paused, tap to resume"
583msgid "Paused, tap to resume"
400msgstr "Ehanet, touchit evit adkregiñ"
584msgstr "Ehanet, touchit evit adkregiñ"
401
585
402−#: qml/Panel/Indicators/MenuItemFactory.qml:918
586+#: qml/Panel/Indicators/MenuItemFactory.qml:919
403msgid "Canceled"
587msgid "Canceled"
404msgstr "Nullet"
588msgstr "Nullet"
405
589
406−#: qml/Panel/Indicators/MenuItemFactory.qml:920
590+#: qml/Panel/Indicators/MenuItemFactory.qml:921
407msgid "Finished"
591msgid "Finished"
408msgstr "Echu"
592msgstr "Echu"
409
593
410−#: qml/Panel/Indicators/MenuItemFactory.qml:922
594+#: qml/Panel/Indicators/MenuItemFactory.qml:923
411msgid "Failed, tap to retry"
595msgid "Failed, tap to retry"
412msgstr "C'hwitet, touchit evit adkregiñ"
596msgstr "C'hwitet, touchit evit adkregiñ"
413
597
414−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
598+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
415−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
599+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
416msgctxt "Button: Send a reply message"
600msgctxt "Button: Send a reply message"
417msgid "Send"
601msgid "Send"
418msgstr "Kas"
602msgstr "Kas"
419
603
420−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
604+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
421msgctxt "Label: Hint in message indicator line edit"
605msgctxt "Label: Hint in message indicator line edit"
422msgid "Reply"
606msgid "Reply"
423msgstr "Respont"
607msgstr "Respont"
424
608
425−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
609+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
426msgctxt "Button: Call back on phone"
610msgctxt "Button: Call back on phone"
427msgid "Call back"
611msgid "Call back"
428msgstr "Gervel en-dro"
612msgstr "Gervel en-dro"
@@ -431,48 +615,24 @@ msgstr "Gervel en-dro"
431msgid "Drag using 3 fingers any application from one window to the other"
615msgid "Drag using 3 fingers any application from one window to the other"
432msgstr ""
616msgstr ""
433
617
434−#: qml/Tutorial/TutorialBottom.qml:78
435−msgid "Swipe up to add a contact"
436−msgstr ""
437−
438−#: qml/Tutorial/TutorialBottom.qml:80
439−msgid "Swipe up for favorite calculations"
440−msgstr ""
441−
442−#: qml/Tutorial/TutorialBottom.qml:82
443−msgid "Swipe up for recent calls"
444−msgstr ""
445−
446−#: qml/Tutorial/TutorialBottom.qml:84
447−msgid "Swipe up to create a message"
448−msgstr ""
449−
450−#: qml/Tutorial/TutorialBottom.qml:85
451−msgid "Swipe up to manage the app"
452−msgstr ""
453−
454−#: qml/Tutorial/TutorialLeft.qml:47
455−msgid "Swipe from the left edge to open the launcher"
456−msgstr ""
457−
458−#: qml/Tutorial/TutorialLeftLong.qml:47
618+#: qml/Tutorial/TutorialLeftLong.qml:49
459msgid "Long swipe from the left edge to open the Today scope"
619msgid "Long swipe from the left edge to open the Today scope"
460msgstr ""
620msgstr ""
461
621
462−#: qml/Tutorial/TutorialRight.qml:54
622+#: qml/Tutorial/TutorialLeft.qml:47
463−msgid "Hover your mouse on the right edge to view your open apps"
623+msgid "Short swipe from the left edge to open the launcher"
464msgstr ""
624msgstr ""
465
625
466#: qml/Tutorial/TutorialRight.qml:55
626#: qml/Tutorial/TutorialRight.qml:55
467−msgid "Short or long swipe from the right edge to view your open apps"
627+msgid "Push your mouse against the right edge to view your open apps"
468msgstr ""
628msgstr ""
469
629
470−#: qml/Tutorial/TutorialTop.qml:53
630+#: qml/Tutorial/TutorialRight.qml:56
471−msgid "Swipe from the top right edge to open the notification bar"
631+msgid "Swipe from the right edge to view your open apps"
472msgstr ""
632msgstr ""
473
633
474−#: qml/Tutorial/TutorialTop.qml:54
634+#: qml/Tutorial/TutorialTop.qml:53
475−msgid "Swipe from the top edge to open the notification bar"
635+msgid "Swipe from the top edge to access notifications and quick settings"
476msgstr ""
636msgstr ""
477
637
478#: qml/Wizard/Page.qml:54
638#: qml/Wizard/Page.qml:54
@@ -482,16 +642,16 @@ msgstr "Distreiñ"
482
642
483#: qml/Wizard/Pages/10-welcome.qml:27
643#: qml/Wizard/Pages/10-welcome.qml:27
484msgid "Language"
644msgid "Language"
485−msgstr ""
645+msgstr "Yezh"
486
646
487−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
647+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
488−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
648+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
489#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
649#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
490#: qml/Wizard/Pages/75-report-check.qml:84
650#: qml/Wizard/Pages/75-report-check.qml:84
491−#: qml/Wizard/Pages/passcode-desktop.qml:124
651+#: qml/Wizard/Pages/passcode-desktop.qml:141
492#: qml/Wizard/Pages/password-set.qml:141
652#: qml/Wizard/Pages/password-set.qml:141
493msgid "Next"
653msgid "Next"
494−msgstr ""
654+msgstr "War-lerc'h"
495
655
496#: qml/Wizard/Pages/30-wifi.qml:29
656#: qml/Wizard/Pages/30-wifi.qml:29
497msgid "Connect to Wi‑Fi"
657msgid "Connect to Wi‑Fi"
@@ -499,15 +659,15 @@ msgstr "Kevreañ ouzh ar Wi-Fi"
499
659
500#: qml/Wizard/Pages/30-wifi.qml:130
660#: qml/Wizard/Pages/30-wifi.qml:130
501msgid "Connected"
661msgid "Connected"
502−msgstr ""
662+msgstr "Kevreet"
503
663
504#: qml/Wizard/Pages/30-wifi.qml:163
664#: qml/Wizard/Pages/30-wifi.qml:163
505msgid "Available Wi-Fi networks"
665msgid "Available Wi-Fi networks"
506−msgstr ""
666+msgstr "Rouedadoù Wi-Fi da gaout"
507
667
508#: qml/Wizard/Pages/30-wifi.qml:164
668#: qml/Wizard/Pages/30-wifi.qml:164
509msgid "No available Wi-Fi networks"
669msgid "No available Wi-Fi networks"
510−msgstr ""
670+msgstr "N'eus ket rouedadoù Wi-Fi da gaout"
511
671
512#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
672#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
513#: qml/Wizard/Pages/sim.qml:101
673#: qml/Wizard/Pages/sim.qml:101
@@ -516,7 +676,7 @@ msgstr "Tremen hebiou"
516
676
517#: qml/Wizard/Pages/40-location.qml:27
677#: qml/Wizard/Pages/40-location.qml:27
518msgid "Location Services"
678msgid "Location Services"
519−msgstr ""
679+msgstr "Servijoù lec'hiañ"
520
680
521#: qml/Wizard/Pages/40-location.qml:83
681#: qml/Wizard/Pages/40-location.qml:83
522msgid ""
682msgid ""
@@ -532,15 +692,15 @@ msgstr ""
532#: qml/Wizard/Pages/40-location.qml:106
692#: qml/Wizard/Pages/40-location.qml:106
533msgctxt "part of: Nokia HERE terms and conditions"
693msgctxt "part of: Nokia HERE terms and conditions"
534msgid "terms and conditions"
694msgid "terms and conditions"
535−msgstr ""
695+msgstr "penndivizoù implij"
536
696
537#: qml/Wizard/Pages/40-location.qml:160
697#: qml/Wizard/Pages/40-location.qml:160
538msgid "GPS only"
698msgid "GPS only"
539−msgstr ""
699+msgstr "GPS hepken"
540
700
541#: qml/Wizard/Pages/40-location.qml:214
701#: qml/Wizard/Pages/40-location.qml:214
542msgid "Don't use my location"
702msgid "Don't use my location"
543−msgstr ""
703+msgstr "Arabat implijout ma lec'h"
544
704
545#: qml/Wizard/Pages/40-location.qml:260
705#: qml/Wizard/Pages/40-location.qml:260
546msgid "You can change it later in System Settings."
706msgid "You can change it later in System Settings."
@@ -548,15 +708,15 @@ msgstr ""
548
708
549#: qml/Wizard/Pages/50-timezone.qml:29
709#: qml/Wizard/Pages/50-timezone.qml:29
550msgid "Time Zone"
710msgid "Time Zone"
551−msgstr ""
711+msgstr "Gwerzhid-eur"
552
712
553−#: qml/Wizard/Pages/50-timezone.qml:178
713+#: qml/Wizard/Pages/50-timezone.qml:181
554msgid "Enter your city"
714msgid "Enter your city"
555−msgstr ""
715+msgstr "Skrivit ho kêr"
556
716
557#: qml/Wizard/Pages/60-account.qml:24
717#: qml/Wizard/Pages/60-account.qml:24
558msgid "Personalize Your Device"
718msgid "Personalize Your Device"
559−msgstr ""
719+msgstr "Personelaat ho penveg"
560
720
561#: qml/Wizard/Pages/60-account.qml:48
721#: qml/Wizard/Pages/60-account.qml:48
562msgid "Preferred Name"
722msgid "Preferred Name"
@@ -564,30 +724,30 @@ msgstr ""
564
724
565#: qml/Wizard/Pages/70-passwd-type.qml:39
725#: qml/Wizard/Pages/70-passwd-type.qml:39
566msgid "Lock Screen"
726msgid "Lock Screen"
567−msgstr ""
727+msgstr "Prennañ ar skramm"
568
728
569#: qml/Wizard/Pages/70-passwd-type.qml:101
729#: qml/Wizard/Pages/70-passwd-type.qml:101
570msgctxt "Label: Type of security method"
730msgctxt "Label: Type of security method"
571msgid "Create new password"
731msgid "Create new password"
572−msgstr ""
732+msgstr "Krouiñ ur ger-tremen nevez"
573
733
574#: qml/Wizard/Pages/70-passwd-type.qml:103
734#: qml/Wizard/Pages/70-passwd-type.qml:103
575msgctxt "Label: Type of security method"
735msgctxt "Label: Type of security method"
576msgid "Create passcode (numbers only)"
736msgid "Create passcode (numbers only)"
577−msgstr ""
737+msgstr "Krouiñ ur c'hod (difroù hepken)"
578
738
579#: qml/Wizard/Pages/70-passwd-type.qml:105
739#: qml/Wizard/Pages/70-passwd-type.qml:105
580msgctxt "Label: Type of security method"
740msgctxt "Label: Type of security method"
581msgid "No lock code"
741msgid "No lock code"
582−msgstr ""
742+msgstr "N'eus kod prennañ ebet"
583
743
584#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
744#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
585msgid "Privacy Policy"
745msgid "Privacy Policy"
586−msgstr ""
746+msgstr "Reolennoù prevezded"
587
747
588#: qml/Wizard/Pages/75-report-check.qml:26
748#: qml/Wizard/Pages/75-report-check.qml:26
589msgid "Help Us Improve"
749msgid "Help Us Improve"
590−msgstr ""
750+msgstr "Sikourit ac'hanomp da wellaat"
591
751
592#: qml/Wizard/Pages/75-report-check.qml:59
752#: qml/Wizard/Pages/75-report-check.qml:59
593msgid "Improve system performance by sending us crashes and error reports."
753msgid "Improve system performance by sending us crashes and error reports."
@@ -595,19 +755,19 @@ msgstr ""
595
755
596#: qml/Wizard/Pages/75-report-check.qml:60
756#: qml/Wizard/Pages/75-report-check.qml:60
597msgid "Privacy policy"
757msgid "Privacy policy"
598−msgstr ""
758+msgstr "Reolennoù buhez prevez"
599
759
600#: qml/Wizard/Pages/80-finished.qml:89
760#: qml/Wizard/Pages/80-finished.qml:89
601msgid "Welcome to Ubuntu"
761msgid "Welcome to Ubuntu"
602−msgstr ""
762+msgstr "Donemat en Ubuntu"
603
763
604#: qml/Wizard/Pages/80-finished.qml:104
764#: qml/Wizard/Pages/80-finished.qml:104
605msgid "You are ready to use your device now"
765msgid "You are ready to use your device now"
606−msgstr ""
766+msgstr "Bremañ oc'h prest da implijout ho penveg"
607
767
608#: qml/Wizard/Pages/80-finished.qml:124
768#: qml/Wizard/Pages/80-finished.qml:124
609msgid "Get Started"
769msgid "Get Started"
610−msgstr ""
770+msgstr "Kregiñ ganti"
611
771
612#: qml/Wizard/Pages/here-terms.qml:25
772#: qml/Wizard/Pages/here-terms.qml:25
613msgid "Terms & Conditions"
773msgid "Terms & Conditions"
@@ -637,74 +797,74 @@ msgstr ""
637
797
638#: qml/Wizard/Pages/here-terms.qml:107
798#: qml/Wizard/Pages/here-terms.qml:107
639msgid "Service Terms"
799msgid "Service Terms"
640−msgstr ""
800+msgstr "Divizoù servij"
641
801
642#: qml/Wizard/Pages/passcode-confirm.qml:43
802#: qml/Wizard/Pages/passcode-confirm.qml:43
643−#: qml/Wizard/Pages/passcode-desktop.qml:80
803+#: qml/Wizard/Pages/passcode-desktop.qml:96
644msgid "Confirm passcode"
804msgid "Confirm passcode"
645msgstr "Kadarnaat ar c'hod-tremen"
805msgstr "Kadarnaat ar c'hod-tremen"
646
806
647#: qml/Wizard/Pages/passcode-confirm.qml:45
807#: qml/Wizard/Pages/passcode-confirm.qml:45
648msgid "Incorrect passcode."
808msgid "Incorrect passcode."
649−msgstr ""
809+msgstr "Kod direizh"
650
810
651#: qml/Wizard/Pages/passcode-confirm.qml:45
811#: qml/Wizard/Pages/passcode-confirm.qml:45
652msgctxt "Enter the passcode again"
812msgctxt "Enter the passcode again"
653msgid "Please re-enter."
813msgid "Please re-enter."
654−msgstr ""
814+msgstr "Skrivit adarre, mar plij."
655
815
656#: qml/Wizard/Pages/passcode-desktop.qml:30
816#: qml/Wizard/Pages/passcode-desktop.qml:30
657msgid "Lock Screen Passcode"
817msgid "Lock Screen Passcode"
658−msgstr ""
818+msgstr "Kod da brennañ ar skramm"
659
819
660−#: qml/Wizard/Pages/passcode-desktop.qml:56
820+#: qml/Wizard/Pages/passcode-desktop.qml:60
661msgid "Enter 4 numbers to setup your passcode"
821msgid "Enter 4 numbers to setup your passcode"
662−msgstr ""
822+msgstr "Skrivit 4 sifr evit lakaat ho kod"
663
823
664−#: qml/Wizard/Pages/passcode-desktop.qml:65
824+#: qml/Wizard/Pages/passcode-desktop.qml:76
665#: qml/Wizard/Pages/passcode-set.qml:54
825#: qml/Wizard/Pages/passcode-set.qml:54
666msgid "Choose passcode"
826msgid "Choose passcode"
667−msgstr ""
827+msgstr "Choaz ur c'hod"
668
828
669−#: qml/Wizard/Pages/passcode-desktop.qml:105
829+#: qml/Wizard/Pages/passcode-desktop.qml:126
670msgid "Passcode too short"
830msgid "Passcode too short"
671−msgstr ""
831+msgstr "Kod re verr"
672
832
673−#: qml/Wizard/Pages/passcode-desktop.qml:107
833+#: qml/Wizard/Pages/passcode-desktop.qml:128
674msgid "Passcodes match"
834msgid "Passcodes match"
675−msgstr ""
835+msgstr "klotañ a ra ar c'hodoù an eil gant egile"
676
836
677−#: qml/Wizard/Pages/passcode-desktop.qml:109
837+#: qml/Wizard/Pages/passcode-desktop.qml:130
678msgid "Passcodes do not match"
838msgid "Passcodes do not match"
679−msgstr ""
839+msgstr "Ne glot ket ar c'hodoù an eil gant egile"
680
840
681#: qml/Wizard/Pages/passcode-set.qml:62
841#: qml/Wizard/Pages/passcode-set.qml:62
682msgid "Passcode must be 4 characters long"
842msgid "Passcode must be 4 characters long"
683−msgstr ""
843+msgstr "4 arouezenn a rank bezañ ar c'hod"
684
844
685#: qml/Wizard/Pages/password-set.qml:30
845#: qml/Wizard/Pages/password-set.qml:30
686msgid "Lock Screen Password"
846msgid "Lock Screen Password"
687−msgstr ""
847+msgstr "Ger-tremen da brennañ ar skramm"
688
848
689#: qml/Wizard/Pages/password-set.qml:61
849#: qml/Wizard/Pages/password-set.qml:61
690msgid "Enter at least 8 characters"
850msgid "Enter at least 8 characters"
691−msgstr ""
851+msgstr "Skrivit 8 arouezenn da vihanañ"
692
852
693#: qml/Wizard/Pages/password-set.qml:73
853#: qml/Wizard/Pages/password-set.qml:73
694msgid "Choose password"
854msgid "Choose password"
695−msgstr ""
855+msgstr "Choaz ur ger-tremen"
696
856
697#: qml/Wizard/Pages/password-set.qml:103
857#: qml/Wizard/Pages/password-set.qml:103
698msgid "Confirm password"
858msgid "Confirm password"
699−msgstr ""
859+msgstr "Kadarnaat ar ger-tremen"
700
860
701#: qml/Wizard/Pages/sim.qml:27
861#: qml/Wizard/Pages/sim.qml:27
702msgid "No SIM card installed"
862msgid "No SIM card installed"
703−msgstr ""
863+msgstr "N'eus kartenn SIM ebet"
704
864
705#: qml/Wizard/Pages/sim.qml:54
865#: qml/Wizard/Pages/sim.qml:54
706msgid "SIM card added"
866msgid "SIM card added"
707−msgstr ""
867+msgstr "Lakaet ez eus bet ur gartenn SIM"
708
868
709#: qml/Wizard/Pages/sim.qml:55
869#: qml/Wizard/Pages/sim.qml:55
710msgid "You must restart the device to access the mobile network."
870msgid "You must restart the device to access the mobile network."
@@ -723,28 +883,32 @@ msgid "To proceed with no SIM tap Skip."
723msgstr ""
883msgstr ""
724
884
725#: qml/Wizard/PasswordMeter.qml:87
885#: qml/Wizard/PasswordMeter.qml:87
726−msgid "Passwords match"
886+msgid "Password too short"
727msgstr ""
887msgstr ""
728
888
729#: qml/Wizard/PasswordMeter.qml:89
889#: qml/Wizard/PasswordMeter.qml:89
890+msgid "Passwords match"
891+msgstr "Klotañ a ra ar gerioù-tremen an eil gant egile"
892+
893+#: qml/Wizard/PasswordMeter.qml:91
730msgid "Passwords do not match"
894msgid "Passwords do not match"
731−msgstr ""
895+msgstr "Ne glot ket ar gerioù-tremen"
732
896
733−#: qml/Wizard/PasswordMeter.qml:93
897+#: qml/Wizard/PasswordMeter.qml:95
734msgid "Strong password"
898msgid "Strong password"
735−msgstr ""
899+msgstr "Ger-tremen sur"
736
900
737−#: qml/Wizard/PasswordMeter.qml:95
901+#: qml/Wizard/PasswordMeter.qml:97
738msgid "Fair password"
902msgid "Fair password"
739−msgstr ""
903+msgstr "Ger-tremen reizh"
740
904
741−#: qml/Wizard/PasswordMeter.qml:97
905+#: qml/Wizard/PasswordMeter.qml:99
742msgid "Weak password"
906msgid "Weak password"
743−msgstr ""
907+msgstr "Ger-tremen diasur"
744
908
745−#: qml/Wizard/PasswordMeter.qml:99
909+#: qml/Wizard/PasswordMeter.qml:101
746msgid "Very weak password"
910msgid "Very weak password"
747−msgstr ""
911+msgstr "Ger-tremen diasur-kenañ"
748
912
749#~ msgid "Close"
913#~ msgid "Close"
750#~ msgstr "Serriñ"
914#~ msgstr "Serriñ"
@@ -761,6 +925,9 @@ msgstr ""
761#~ msgid "Right edge"
925#~ msgid "Right edge"
762#~ msgstr "Bord dehoù"
926#~ msgstr "Bord dehoù"
763
927
928+#~ msgid "See less"
929+#~ msgstr "Gwelet nebeutoc'h"
930+
764#~ msgid ""
931#~ msgid ""
765#~ "You have now mastered the edge gestures and can start using the "
932#~ "You have now mastered the edge gestures and can start using the "
766#~ "phone<br><br>Tap on the screen to start"
933#~ "phone<br><br>Tap on the screen to start"
@@ -806,6 +973,9 @@ msgstr ""
806#~ msgid "Type or say a command"
973#~ msgid "Type or say a command"
807#~ msgstr "Skrivit pe lavarit un urzhiad"
974#~ msgstr "Skrivit pe lavarit un urzhiad"
808
975
976+#~ msgid "See all"
977+#~ msgstr "Gwelet pep tra"
978+
809#~ msgid "Store"
979#~ msgid "Store"
810#~ msgstr "Enrollañ"
980#~ msgstr "Enrollañ"
811
981
@@ -957,6 +1127,9 @@ msgstr ""
957#~ msgid "%1 〉"
1127#~ msgid "%1 〉"
958#~ msgstr "%1 〉"
1128#~ msgstr "%1 〉"
959
1129
1130+#~ msgid "Tap to unlock"
1131+#~ msgstr "Pouezañ evit dibrennañ"
1132+
960#~ msgid "This action does different things for different apps"
1133#~ msgid "This action does different things for different apps"
961#~ msgstr "An ober-mañ a ra meur a dra evit meur a arload"
1134#~ msgstr "An ober-mañ a ra meur a dra evit meur a arload"
962
1135
@@ -1065,11 +1238,8 @@ msgstr ""
1065#~ msgid "Call back"
1238#~ msgid "Call back"
1066#~ msgstr "Gervel en-dro"
1239#~ msgstr "Gervel en-dro"
1067
1240
1068−#~ msgid "Welcome to your Ubuntu device."
1241+#~ msgid "Swipe up to add a contact"
1069−#~ msgstr "Donemat en ho penveg Ubuntu"
1242+#~ msgstr "Riklit d'an nec'h evit ouzhpennañ un darempred"
1070−
1071−#~ msgid "Please select how you’d like to unlock your device."
1072−#~ msgstr "Diuzit penaos e fell deoc'h dibrennañ ho penveg, mar plij."
1073
1243
1074−#~ msgid "Your device is now ready to use."
1244+#~ msgid "Swipe up to create a message"
1075−#~ msgstr "Prest eo ho penveg da vezañ implijet bremañ."
1245+#~ msgstr "Riklit d'an nec'h evit krouiñ ur gemennadenn"
po/bs.po+299−128
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-07-14 07:09+0000\n"
11"PO-Revision-Date: 2015-12-01 20:06+0000\n"
11"PO-Revision-Date: 2015-12-01 20:06+0000\n"
12"Last-Translator: Kenan Gutić <Unknown>\n"
12"Last-Translator: Kenan Gutić <Unknown>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
@@ -16,39 +16,39 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19+"X-Launchpad-Export-Date: 2016-07-22 05:53+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 18147)\n"
21
21
22−#: plugins/IntegratedLightDM/Greeter.cpp:112
22+#: plugins/LightDM/Greeter.cpp:123
23msgid "Password: "
23msgid "Password: "
24msgstr "Šifra: "
24msgstr "Šifra: "
25
25
26−#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:49
27−#: plugins/Unity/Launcher/launcheritem.cpp:107
27+#: plugins/Unity/Launcher/launcheritem.cpp:108
28msgid "Pin shortcut"
28msgid "Pin shortcut"
29msgstr "Prikačite prečicu"
29msgstr "Prikačite prečicu"
30
30
31−#: plugins/Unity/Launcher/launcheritem.cpp:53
31+#: plugins/Unity/Launcher/launcheritem.cpp:54
32msgid "Quit"
32msgid "Quit"
33msgstr "Napusti"
33msgstr "Napusti"
34
34
35−#: plugins/Unity/Launcher/launcheritem.cpp:107
35+#: plugins/Unity/Launcher/launcheritem.cpp:108
36msgid "Unpin shortcut"
36msgid "Unpin shortcut"
37msgstr "Otkačite prečicu"
37msgstr "Otkačite prečicu"
38
38
39−#: qml/Components/DelayedLockscreen.qml:49
39+#: qml/Components/DelayedLockscreen.qml:50
40msgid "Device Locked"
40msgid "Device Locked"
41msgstr "Uređaj zaključan"
41msgstr "Uređaj zaključan"
42
42
43−#: qml/Components/DelayedLockscreen.qml:64
43+#: qml/Components/DelayedLockscreen.qml:65
44msgid "You have been locked out due to too many failed passphrase attempts."
44msgid "You have been locked out due to too many failed passphrase attempts."
45msgstr "Izbačeni ste zbog previše neuspjelih pokušaja unosa pristupne fraze."
45msgstr "Izbačeni ste zbog previše neuspjelih pokušaja unosa pristupne fraze."
46
46
47−#: qml/Components/DelayedLockscreen.qml:65
47+#: qml/Components/DelayedLockscreen.qml:66
48msgid "You have been locked out due to too many failed passcode attempts."
48msgid "You have been locked out due to too many failed passcode attempts."
49msgstr "Izbačeni ste zbog previše neuspjelih pokušaja unosa pristupnog koda."
49msgstr "Izbačeni ste zbog previše neuspjelih pokušaja unosa pristupnog koda."
50
50
51−#: qml/Components/DelayedLockscreen.qml:74
51+#: qml/Components/DelayedLockscreen.qml:75
52#, qt-format
52#, qt-format
53msgid "Please wait %1 minute and then try again…"
53msgid "Please wait %1 minute and then try again…"
54msgid_plural "Please wait %1 minutes and then try again…"
54msgid_plural "Please wait %1 minutes and then try again…"
@@ -75,8 +75,8 @@ msgctxt "Button: Log out from the system"
75msgid "Log Out"
75msgid "Log Out"
76msgstr "Odjavi se"
76msgstr "Odjavi se"
77
77
78−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
78+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
79−#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
79+#: qml/Dash/DashPageHeader.qml:295 qml/Wizard/Pages/passcode-confirm.qml:32
80#: qml/Wizard/Pages/passcode-set.qml:32
80#: qml/Wizard/Pages/passcode-set.qml:32
81msgid "Cancel"
81msgid "Cancel"
82msgstr "Otkaži"
82msgstr "Otkaži"
@@ -94,16 +94,16 @@ msgstr "Da li ste sigurni da želite ponovo pokrenuti?"
94msgid "No"
94msgid "No"
95msgstr "Ne"
95msgstr "Ne"
96
96
97−#: qml/Components/Dialogs.qml:183
97+#: qml/Components/Dialogs.qml:182
98msgid "Yes"
98msgid "Yes"
99msgstr "Da"
99msgstr "Da"
100
100
101−#: qml/Components/Dialogs.qml:198
101+#: qml/Components/Dialogs.qml:197
102msgctxt "Title: Power off/Restart dialog"
102msgctxt "Title: Power off/Restart dialog"
103msgid "Power"
103msgid "Power"
104msgstr "Napajanje"
104msgstr "Napajanje"
105
105
106−#: qml/Components/Dialogs.qml:199
106+#: qml/Components/Dialogs.qml:198
107msgid ""
107msgid ""
108"Are you sure you would like\n"
108"Are you sure you would like\n"
109"to power off?"
109"to power off?"
@@ -111,28 +111,198 @@ msgstr ""
111"Da li ste sigurni da želite\n"
111"Da li ste sigurni da želite\n"
112"isključiti?"
112"isključiti?"
113
113
114−#: qml/Components/Dialogs.qml:201
114+#: qml/Components/Dialogs.qml:200
115msgctxt "Button: Power off the system"
115msgctxt "Button: Power off the system"
116msgid "Power off"
116msgid "Power off"
117msgstr "Isključi"
117msgstr "Isključi"
118
118
119−#: qml/Components/Dialogs.qml:210
119+#: qml/Components/Dialogs.qml:209
120msgctxt "Button: Restart the system"
120msgctxt "Button: Restart the system"
121msgid "Restart"
121msgid "Restart"
122msgstr "Restartuj"
122msgstr "Restartuj"
123
123
124+#: qml/Components/KeyboardShortcutsOverlay.qml:41
125+msgid "Keyboard Shortcuts"
126+msgstr ""
127+
128+#: qml/Components/KeyboardShortcutsOverlay.qml:55
129+msgid "Unity 8"
130+msgstr ""
131+
132+#: qml/Components/KeyboardShortcutsOverlay.qml:62
133+msgid "PrtScr"
134+msgstr ""
135+
136+#: qml/Components/KeyboardShortcutsOverlay.qml:67
137+msgid "Takes a screenshot."
138+msgstr ""
139+
140+#: qml/Components/KeyboardShortcutsOverlay.qml:75
141+msgid "Alt + PrtScr"
142+msgstr ""
143+
144+#: qml/Components/KeyboardShortcutsOverlay.qml:80
145+msgid "Takes a screenshot of a window."
146+msgstr ""
147+
148+#: qml/Components/KeyboardShortcutsOverlay.qml:88
149+msgid "Super + Space"
150+msgstr ""
151+
152+#: qml/Components/KeyboardShortcutsOverlay.qml:93
153+msgid "Switches to next keyboard layout."
154+msgstr ""
155+
156+#: qml/Components/KeyboardShortcutsOverlay.qml:101
157+msgid "Super + Shift + Space"
158+msgstr ""
159+
160+#: qml/Components/KeyboardShortcutsOverlay.qml:106
161+msgid "Switches to previous keyboard layout."
162+msgstr ""
163+
164+#: qml/Components/KeyboardShortcutsOverlay.qml:118
165+msgid "Launcher"
166+msgstr ""
167+
168+#: qml/Components/KeyboardShortcutsOverlay.qml:125
169+msgid "Super (Hold)"
170+msgstr ""
171+
172+#: qml/Components/KeyboardShortcutsOverlay.qml:130
173+msgid "Opens the launcher, displays shortcuts."
174+msgstr ""
175+
176+#: qml/Components/KeyboardShortcutsOverlay.qml:138
177+msgid "Alt + F1"
178+msgstr ""
179+
180+#: qml/Components/KeyboardShortcutsOverlay.qml:143
181+msgid "Opens launcher keyboard navigation mode."
182+msgstr ""
183+
184+#: qml/Components/KeyboardShortcutsOverlay.qml:151
185+msgid "Super + Tab"
186+msgstr ""
187+
188+#: qml/Components/KeyboardShortcutsOverlay.qml:156
189+msgid "Switches applications via the launcher."
190+msgstr ""
191+
192+#: qml/Components/KeyboardShortcutsOverlay.qml:164
193+msgid "Super + 0 to 9"
194+msgstr ""
195+
196+#: qml/Components/KeyboardShortcutsOverlay.qml:169
197+msgid "Same as clicking on a launcher icon."
198+msgstr ""
199+
200+#: qml/Components/KeyboardShortcutsOverlay.qml:181
201+msgid "Scopes"
202+msgstr ""
203+
204+#: qml/Components/KeyboardShortcutsOverlay.qml:188
205+msgid "Super (Tap)"
206+msgstr ""
207+
208+#: qml/Components/KeyboardShortcutsOverlay.qml:193
209+msgid "Opens the Scopes home."
210+msgstr ""
211+
212+#: qml/Components/KeyboardShortcutsOverlay.qml:209
213+msgid "Switching"
214+msgstr ""
215+
216+#: qml/Components/KeyboardShortcutsOverlay.qml:216
217+msgid "Alt + Tab"
218+msgstr ""
219+
220+#: qml/Components/KeyboardShortcutsOverlay.qml:221
221+msgid "Switches between applications."
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:229
225+msgid "Super + W"
226+msgstr ""
227+
228+#: qml/Components/KeyboardShortcutsOverlay.qml:234
229+msgid "Opens the desktop spread."
230+msgstr ""
231+
232+#: qml/Components/KeyboardShortcutsOverlay.qml:242
233+msgid "Cursor Left or Right"
234+msgstr ""
235+
236+#: qml/Components/KeyboardShortcutsOverlay.qml:247
237+msgid "Moves the focus."
238+msgstr ""
239+
240+#: qml/Components/KeyboardShortcutsOverlay.qml:259
241+msgid "Windows"
242+msgstr ""
243+
244+#: qml/Components/KeyboardShortcutsOverlay.qml:266
245+msgid "Ctrl + Super + D"
246+msgstr ""
247+
248+#: qml/Components/KeyboardShortcutsOverlay.qml:271
249+msgid "Minimizes all windows."
250+msgstr ""
251+
252+#: qml/Components/KeyboardShortcutsOverlay.qml:279
253+msgid "Ctrl + Super + Up"
254+msgstr ""
255+
256+#: qml/Components/KeyboardShortcutsOverlay.qml:284
257+msgid "Maximizes the current window."
258+msgstr ""
259+
260+#: qml/Components/KeyboardShortcutsOverlay.qml:292
261+msgid "Ctrl + Super + Down"
262+msgstr ""
263+
264+#: qml/Components/KeyboardShortcutsOverlay.qml:297
265+msgid "Minimizes or restores the current window."
266+msgstr ""
267+
268+#: qml/Components/KeyboardShortcutsOverlay.qml:305
269+msgid "Ctrl + Super + Left or Right"
270+msgstr ""
271+
272+#: qml/Components/KeyboardShortcutsOverlay.qml:310
273+msgid "Semi-maximizes the current window."
274+msgstr ""
275+
276+#: qml/Components/KeyboardShortcutsOverlay.qml:318
277+msgid "Alt + F4"
278+msgstr ""
279+
280+#: qml/Components/KeyboardShortcutsOverlay.qml:323
281+msgid "Closes the current window."
282+msgstr ""
283+
124−#: qml/Components/Lockscreen.qml:231
284+#: qml/Components/Lockscreen.qml:239
125msgid "Return to Call"
285msgid "Return to Call"
126msgstr "Povratak na Poziv"
286msgstr "Povratak na Poziv"
127
287
128−#: qml/Components/Lockscreen.qml:231
288+#: qml/Components/Lockscreen.qml:239
129msgid "Emergency Call"
289msgid "Emergency Call"
130msgstr "Hitan Poziv"
290msgstr "Hitan Poziv"
131
291
132−#: qml/Components/Lockscreen.qml:263
292+#: qml/Components/Lockscreen.qml:271
133msgid "OK"
293msgid "OK"
134msgstr "U redu"
294msgstr "U redu"
135
295
296+#: qml/Components/MediaServices/VideoPlayerControls.qml:44
297+#, qt-format
298+msgid "%1:%2:%3"
299+msgstr ""
300+
301+#: qml/Components/MediaServices/VideoPlayerControls.qml:49
302+#, qt-format
303+msgid "%1:%2"
304+msgstr ""
305+
136#: qml/Components/ModeSwitchWarningDialog.qml:32
306#: qml/Components/ModeSwitchWarningDialog.qml:32
137msgid "Apps may have unsaved data:"
307msgid "Apps may have unsaved data:"
138msgstr "Aplikacije možda imaju podataka koji nisu sačuvani:"
308msgstr "Aplikacije možda imaju podataka koji nisu sačuvani:"
@@ -161,26 +331,30 @@ msgstr "Ponovo poveži sada"
161msgid "Close all"
331msgid "Close all"
162msgstr "Zatvori sve"
332msgstr "Zatvori sve"
163
333
334+#: qml/Components/SharingPicker.qml:54
335+msgid "Preview Share Item"
336+msgstr "Pogledaj stavku koja se dijeli"
337+
164−#: qml/Dash/DashPageHeader.qml:337
338+#: qml/Dash/DashPageHeader.qml:333
165msgctxt "Button: Open the Ubuntu Store"
339msgctxt "Button: Open the Ubuntu Store"
166msgid "Store"
340msgid "Store"
167msgstr "Trgovina"
341msgstr "Trgovina"
168
342
169−#: qml/Dash/DashPageHeader.qml:344
343+#: qml/Dash/DashPageHeader.qml:340
170msgctxt "Button: Start a search in the current dash scope"
344msgctxt "Button: Start a search in the current dash scope"
171msgid "Search"
345msgid "Search"
172msgstr "Pretraživanje"
346msgstr "Pretraživanje"
173
347
174−#: qml/Dash/DashPageHeader.qml:354
348+#: qml/Dash/DashPageHeader.qml:350
175msgctxt "Button: Show the current dash scope settings"
349msgctxt "Button: Show the current dash scope settings"
176msgid "Settings"
350msgid "Settings"
177msgstr "Podešavanja"
351msgstr "Podešavanja"
178
352
179−#: qml/Dash/DashPageHeader.qml:361
353+#: qml/Dash/DashPageHeader.qml:357
180msgid "Remove from Favorites"
354msgid "Remove from Favorites"
181msgstr "Ukloni iz Omiljenih"
355msgstr "Ukloni iz Omiljenih"
182
356
183−#: qml/Dash/DashPageHeader.qml:361
357+#: qml/Dash/DashPageHeader.qml:357
184msgid "Add to Favorites"
358msgid "Add to Favorites"
185msgstr "Dodaj u Omiljene"
359msgstr "Dodaj u Omiljene"
186
360
@@ -192,24 +366,24 @@ msgstr ""
192msgid "Reset"
366msgid "Reset"
193msgstr ""
367msgstr ""
194
368
195−#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
369+#: qml/Dash/GenericScopeView.qml:580 qml/Dash/GenericScopeView.qml:775
196−msgid "See less"
370+msgid "Show less"
197−msgstr "Pogledati manje"
371+msgstr ""
198
372
199−#: qml/Dash/GenericScopeView.qml:570
373+#: qml/Dash/GenericScopeView.qml:580
200−msgid "See all"
374+msgid "Show all"
201−msgstr "Pogledati sve"
375+msgstr ""
202
376
203−#: qml/Dash/GenericScopeView.qml:627
377+#: qml/Dash/GenericScopeView.qml:637
204msgctxt "Label: Hint for dash search line edit"
378msgctxt "Label: Hint for dash search line edit"
205msgid "Search"
379msgid "Search"
206msgstr "Pretraži"
380msgstr "Pretraži"
207
381
208−#: qml/Dash/PageHeaderExtraPanel.qml:55
382+#: qml/Dash/PageHeaderExtraPanel.qml:56
209msgid "Recent Searches"
383msgid "Recent Searches"
210msgstr ""
384msgstr ""
211
385
212−#: qml/Dash/PageHeaderExtraPanel.qml:66
386+#: qml/Dash/PageHeaderExtraPanel.qml:67
213msgid "Clear All"
387msgid "Clear All"
214msgstr ""
388msgstr ""
215
389
@@ -222,22 +396,18 @@ msgid "Less..."
222msgstr "Manje..."
396msgstr "Manje..."
223
397
224#: qml/Dash/Previews/PreviewCommentInput.qml:68
398#: qml/Dash/Previews/PreviewCommentInput.qml:68
225−#: qml/Dash/Previews/PreviewRatingInput.qml:174
399+#: qml/Dash/Previews/PreviewRatingInput.qml:175
226msgid "Send"
400msgid "Send"
227msgstr "Pošalji"
401msgstr "Pošalji"
228
402
229−#: qml/Dash/Previews/PreviewRatingInput.qml:84
403+#: qml/Dash/Previews/PreviewRatingInput.qml:82
230msgid "Rate this"
404msgid "Rate this"
231msgstr "Ocijeni ovo"
405msgstr "Ocijeni ovo"
232
406
233−#: qml/Dash/Previews/PreviewRatingInput.qml:129
407+#: qml/Dash/Previews/PreviewRatingInput.qml:157
234msgid "Add a review"
408msgid "Add a review"
235msgstr "Dodaj recenziju"
409msgstr "Dodaj recenziju"
236
410
237−#: qml/Dash/Previews/PreviewSharing.qml:66
238−msgid "Preview Share Item"
239−msgstr "Pogledaj stavku koja se dijeli"
240−
241#: qml/Dash/PullToRefreshScopeStyle.qml:55
411#: qml/Dash/PullToRefreshScopeStyle.qml:55
242msgid "Pull to refresh…"
412msgid "Pull to refresh…"
243msgstr "Povući za osvježavanje..."
413msgstr "Povući za osvježavanje..."
@@ -250,49 +420,61 @@ msgstr "Pustiti za osvježavanje..."
250msgid "Enable location data"
420msgid "Enable location data"
251msgstr "Omogućiti podatke o lokaciji"
421msgstr "Omogućiti podatke o lokaciji"
252
422
253−#: qml/Dash/ScopesList.qml:67
423+#: qml/Dash/ScopesList.qml:55
254msgid "Manage"
424msgid "Manage"
255msgstr "Upravljanje"
425msgstr "Upravljanje"
256
426
257−#: qml/Dash/ScopesList.qml:113
427+#: qml/Dash/ScopesList.qml:102
258msgid "Home"
428msgid "Home"
259msgstr "Početna"
429msgstr "Početna"
260
430
261−#: qml/Dash/ScopesList.qml:114
431+#: qml/Dash/ScopesList.qml:103
262msgid "Also installed"
432msgid "Also installed"
263msgstr "Također instalirano"
433msgstr "Također instalirano"
264
434
265−#: qml/DisabledScreenNotice.qml:104
435+#: qml/DisabledScreenNotice.qml:109
266msgid ""
436msgid ""
267"Your device is now connected to an external display. Use this screen as a "
437"Your device is now connected to an external display. Use this screen as a "
268"touch pad to interact with the pointer."
438"touch pad to interact with the pointer."
269msgstr ""
439msgstr ""
270
440
271−#: qml/Greeter/CoverPage.qml:118
441+#: qml/Greeter/CoverPage.qml:127
272msgid "Unlock"
442msgid "Unlock"
273msgstr "Otključaj"
443msgstr "Otključaj"
274
444
445+#: qml/Greeter/Greeter.qml:555
446+msgid "Try again"
447+msgstr ""
448+
275−#: qml/Greeter/LoginList.qml:239
449+#: qml/Greeter/LoginList.qml:63
450+msgid "Passphrase"
451+msgstr ""
452+
453+#: qml/Greeter/LoginList.qml:64
454+msgid "Passcode"
455+msgstr ""
456+
457+#: qml/Greeter/LoginList.qml:87
276msgid "Retry"
458msgid "Retry"
277msgstr "Ponovi"
459msgstr "Ponovi"
278
460
279−#: qml/Greeter/LoginList.qml:240
461+#: qml/Greeter/LoginList.qml:88
280−msgid "Tap to unlock"
462+msgid "Log In"
281−msgstr "Kucnite za otključavanje"
463+msgstr ""
282
464
283−#: qml/Greeter/NarrowView.qml:54
465+#: qml/Greeter/NarrowView.qml:55
284msgid "Sorry, incorrect passphrase."
466msgid "Sorry, incorrect passphrase."
285msgstr "Izvinite, pogrešna pristupna fraza."
467msgstr "Izvinite, pogrešna pristupna fraza."
286
468
287−#: qml/Greeter/NarrowView.qml:55
469+#: qml/Greeter/NarrowView.qml:56
288msgid "Sorry, incorrect passcode."
470msgid "Sorry, incorrect passcode."
289msgstr "Izvinite, pogrešan pristupni kod."
471msgstr "Izvinite, pogrešan pristupni kod."
290
472
291−#: qml/Greeter/NarrowView.qml:56
473+#: qml/Greeter/NarrowView.qml:57
292msgid "This will be your last attempt."
474msgid "This will be your last attempt."
293msgstr "Ovo će biti vaš posljednji pokušaj."
475msgstr "Ovo će biti vaš posljednji pokušaj."
294
476
295−#: qml/Greeter/NarrowView.qml:58
477+#: qml/Greeter/NarrowView.qml:59
296msgid ""
478msgid ""
297"If passphrase is entered incorrectly, your phone will conduct a factory "
479"If passphrase is entered incorrectly, your phone will conduct a factory "
298"reset and all personal data will be deleted."
480"reset and all personal data will be deleted."
@@ -300,7 +482,7 @@ msgstr ""
300"Ako je pristupna fraza unesena pogrešno, vaš telefon će sprovesti reset na "
482"Ako je pristupna fraza unesena pogrešno, vaš telefon će sprovesti reset na "
301"fabričke postavke i svi osobni podaci će biti izbrisani."
483"fabričke postavke i svi osobni podaci će biti izbrisani."
302
484
303−#: qml/Greeter/NarrowView.qml:59
485+#: qml/Greeter/NarrowView.qml:60
304msgid ""
486msgid ""
305"If passcode is entered incorrectly, your phone will conduct a factory reset "
487"If passcode is entered incorrectly, your phone will conduct a factory reset "
306"and all personal data will be deleted."
488"and all personal data will be deleted."
@@ -308,38 +490,38 @@ msgstr ""
308"Ako je pristupni kod unesen netačno, vaš telefon će sprovesti reset na "
490"Ako je pristupni kod unesen netačno, vaš telefon će sprovesti reset na "
309"fabričke postavke i svi osobni podaci će biti izbrisani."
491"fabričke postavke i svi osobni podaci će biti izbrisani."
310
492
311−#: qml/Greeter/NarrowView.qml:116
493+#: qml/Greeter/NarrowView.qml:129
312#, qt-format
494#, qt-format
313msgid "Enter %1"
495msgid "Enter %1"
314msgstr "Unesite %1"
496msgstr "Unesite %1"
315
497
316−#: qml/Greeter/NarrowView.qml:117
498+#: qml/Greeter/NarrowView.qml:130
317msgid "Enter passphrase"
499msgid "Enter passphrase"
318msgstr "Unesite propusnu frazu"
500msgstr "Unesite propusnu frazu"
319
501
320−#: qml/Greeter/NarrowView.qml:118
502+#: qml/Greeter/NarrowView.qml:131
321msgid "Enter passcode"
503msgid "Enter passcode"
322msgstr "Unesite pristupni kod"
504msgstr "Unesite pristupni kod"
323
505
324−#: qml/Greeter/NarrowView.qml:119
506+#: qml/Greeter/NarrowView.qml:135
325#, qt-format
507#, qt-format
326msgid "Sorry, incorrect %1"
508msgid "Sorry, incorrect %1"
327msgstr "Izvinite, netačno %1"
509msgstr "Izvinite, netačno %1"
328
510
329−#: qml/Greeter/NarrowView.qml:120
511+#: qml/Greeter/NarrowView.qml:136
330msgid "Sorry, incorrect passphrase"
512msgid "Sorry, incorrect passphrase"
331msgstr "Izvinite, netačna propusna fraza"
513msgstr "Izvinite, netačna propusna fraza"
332
514
333−#: qml/Greeter/NarrowView.qml:121
515+#: qml/Greeter/NarrowView.qml:137
334msgctxt "passphrase"
516msgctxt "passphrase"
335msgid "Please re-enter"
517msgid "Please re-enter"
336msgstr "Molim ponovo unesite"
518msgstr "Molim ponovo unesite"
337
519
338−#: qml/Greeter/NarrowView.qml:122
520+#: qml/Greeter/NarrowView.qml:138
339msgid "Sorry, incorrect passcode"
521msgid "Sorry, incorrect passcode"
340msgstr "Izvinite, netačan pristupni kod"
522msgstr "Izvinite, netačan pristupni kod"
341
523
342−#: qml/Notifications/NotificationMenuItemFactory.qml:129
524+#: qml/Notifications/NotificationMenuItemFactory.qml:124
343msgid "Show password"
525msgid "Show password"
344msgstr "Prikaži šifru"
526msgstr "Prikaži šifru"
345
527
@@ -351,11 +533,11 @@ msgstr "Kucnite da uzvratite poziv..."
351msgid "Conference"
533msgid "Conference"
352msgstr "Savjetovanje"
534msgstr "Savjetovanje"
353
535
354−#: qml/Panel/Indicators/MenuItemFactory.qml:761
536+#: qml/Panel/Indicators/MenuItemFactory.qml:762
355msgid "Nothing is playing"
537msgid "Nothing is playing"
356msgstr "Ništa nije pokrenuto"
538msgstr "Ništa nije pokrenuto"
357
539
358−#: qml/Panel/Indicators/MenuItemFactory.qml:890
540+#: qml/Panel/Indicators/MenuItemFactory.qml:891
359#, qt-format
541#, qt-format
360msgid "%1 hour"
542msgid "%1 hour"
361msgid_plural "%1 hours"
543msgid_plural "%1 hours"
@@ -363,7 +545,7 @@ msgstr[0] "%1 sat"
363msgstr[1] "%1 sata"
545msgstr[1] "%1 sata"
364msgstr[2] "%1 sati"
546msgstr[2] "%1 sati"
365
547
366−#: qml/Panel/Indicators/MenuItemFactory.qml:894
548+#: qml/Panel/Indicators/MenuItemFactory.qml:895
367#, qt-format
549#, qt-format
368msgid "%1 minute"
550msgid "%1 minute"
369msgid_plural "%1 minutes"
551msgid_plural "%1 minutes"
@@ -371,7 +553,7 @@ msgstr[0] "%1 minut"
371msgstr[1] "%1 minuta"
553msgstr[1] "%1 minuta"
372msgstr[2] "%1 minuta"
554msgstr[2] "%1 minuta"
373
555
374−#: qml/Panel/Indicators/MenuItemFactory.qml:899
556+#: qml/Panel/Indicators/MenuItemFactory.qml:900
375#, qt-format
557#, qt-format
376msgid "%1 second"
558msgid "%1 second"
377msgid_plural "%1 seconds"
559msgid_plural "%1 seconds"
@@ -379,52 +561,52 @@ msgstr[0] "%1 sekunda"
379msgstr[1] "%1 sekunde"
561msgstr[1] "%1 sekunde"
380msgstr[2] "%1 sekundi"
562msgstr[2] "%1 sekundi"
381
563
382−#: qml/Panel/Indicators/MenuItemFactory.qml:902
564+#: qml/Panel/Indicators/MenuItemFactory.qml:903
383msgid "0 seconds"
565msgid "0 seconds"
384msgstr "0 sekundi"
566msgstr "0 sekundi"
385
567
386#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
568#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
387−#: qml/Panel/Indicators/MenuItemFactory.qml:904
569+#: qml/Panel/Indicators/MenuItemFactory.qml:905
388#, qt-format
570#, qt-format
389msgid "%1 remaining"
571msgid "%1 remaining"
390msgstr "%1 preostalo"
572msgstr "%1 preostalo"
391
573
392−#: qml/Panel/Indicators/MenuItemFactory.qml:910
574+#: qml/Panel/Indicators/MenuItemFactory.qml:911
393msgid "In queue…"
575msgid "In queue…"
394msgstr "U red..."
576msgstr "U red..."
395
577
396−#: qml/Panel/Indicators/MenuItemFactory.qml:914
578+#: qml/Panel/Indicators/MenuItemFactory.qml:915
397msgid "Downloading"
579msgid "Downloading"
398msgstr "Preuzimanje"
580msgstr "Preuzimanje"
399
581
400−#: qml/Panel/Indicators/MenuItemFactory.qml:916
582+#: qml/Panel/Indicators/MenuItemFactory.qml:917
401msgid "Paused, tap to resume"
583msgid "Paused, tap to resume"
402msgstr "Pauzirano, kucnuti za nastavak"
584msgstr "Pauzirano, kucnuti za nastavak"
403
585
404−#: qml/Panel/Indicators/MenuItemFactory.qml:918
586+#: qml/Panel/Indicators/MenuItemFactory.qml:919
405msgid "Canceled"
587msgid "Canceled"
406msgstr "Otkazano"
588msgstr "Otkazano"
407
589
408−#: qml/Panel/Indicators/MenuItemFactory.qml:920
590+#: qml/Panel/Indicators/MenuItemFactory.qml:921
409msgid "Finished"
591msgid "Finished"
410msgstr "Završeno"
592msgstr "Završeno"
411
593
412−#: qml/Panel/Indicators/MenuItemFactory.qml:922
594+#: qml/Panel/Indicators/MenuItemFactory.qml:923
413msgid "Failed, tap to retry"
595msgid "Failed, tap to retry"
414msgstr "Neuspjelo, kucnuti za ponavljanje"
596msgstr "Neuspjelo, kucnuti za ponavljanje"
415
597
416−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
598+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
417−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
599+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
418msgctxt "Button: Send a reply message"
600msgctxt "Button: Send a reply message"
419msgid "Send"
601msgid "Send"
420msgstr "Pošalji"
602msgstr "Pošalji"
421
603
422−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
604+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
423msgctxt "Label: Hint in message indicator line edit"
605msgctxt "Label: Hint in message indicator line edit"
424msgid "Reply"
606msgid "Reply"
425msgstr "Odgovorite"
607msgstr "Odgovorite"
426
608
427−#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
609+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
428msgctxt "Button: Call back on phone"
610msgctxt "Button: Call back on phone"
429msgid "Call back"
611msgid "Call back"
430msgstr "Uzvrati poziv"
612msgstr "Uzvrati poziv"
@@ -433,48 +615,24 @@ msgstr "Uzvrati poziv"
433msgid "Drag using 3 fingers any application from one window to the other"
615msgid "Drag using 3 fingers any application from one window to the other"
434msgstr ""
616msgstr ""
435
617
436−#: qml/Tutorial/TutorialBottom.qml:78
437−msgid "Swipe up to add a contact"
438−msgstr ""
439−
440−#: qml/Tutorial/TutorialBottom.qml:80
441−msgid "Swipe up for favorite calculations"
442−msgstr ""
443−
444−#: qml/Tutorial/TutorialBottom.qml:82
445−msgid "Swipe up for recent calls"
446−msgstr ""
447−
448−#: qml/Tutorial/TutorialBottom.qml:84
449−msgid "Swipe up to create a message"
450−msgstr ""
451−
452−#: qml/Tutorial/TutorialBottom.qml:85
453−msgid "Swipe up to manage the app"
454−msgstr ""
455−
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
459−
460−#: qml/Tutorial/TutorialLeftLong.qml:47
618+#: qml/Tutorial/TutorialLeftLong.qml:49
461msgid "Long swipe from the left edge to open the Today scope"
619msgid "Long swipe from the left edge to open the Today scope"
462msgstr ""
620msgstr ""
463
621
464−#: qml/Tutorial/TutorialRight.qml:54
622+#: qml/Tutorial/TutorialLeft.qml:47
465−msgid "Hover your mouse on the right edge to view your open apps"
623+msgid "Short swipe from the left edge to open the launcher"
466msgstr ""
624msgstr ""
467
625
468#: qml/Tutorial/TutorialRight.qml:55
626#: qml/Tutorial/TutorialRight.qml:55
469−msgid "Short or long swipe from the right edge to view your open apps"
627+msgid "Push your mouse against the right edge to view your open apps"
470msgstr ""
628msgstr ""
471
629
472−#: qml/Tutorial/TutorialTop.qml:53
630+#: qml/Tutorial/TutorialRight.qml:56
473−msgid "Swipe from the top right edge to open the notification bar"
631+msgid "Swipe from the right edge to view your open apps"
474msgstr ""
632msgstr ""
475
633
476−#: qml/Tutorial/TutorialTop.qml:54
634+#: qml/Tutorial/TutorialTop.qml:53
477−msgid "Swipe from the top edge to open the notification bar"
635+msgid "Swipe from the top edge to access notifications and quick settings"
478msgstr ""
636msgstr ""
479
637
480#: qml/Wizard/Page.qml:54
638#: qml/Wizard/Page.qml:54
@@ -486,11 +644,11 @@ msgstr "Nazad"
486msgid "Language"
644msgid "Language"
487msgstr ""
645msgstr ""
488
646
489−#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
647+#: qml/Wizard/Pages/10-welcome.qml:171 qml/Wizard/Pages/30-wifi.qml:206
490−#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
648+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:270
491#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
649#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
492#: qml/Wizard/Pages/75-report-check.qml:84
650#: qml/Wizard/Pages/75-report-check.qml:84
493−#: qml/Wizard/Pages/passcode-desktop.qml:124
651+#: qml/Wizard/Pages/passcode-desktop.qml:141
494#: qml/Wizard/Pages/password-set.qml:141
652#: qml/Wizard/Pages/password-set.qml:141
495msgid "Next"
653msgid "Next"
496msgstr ""
654msgstr ""
@@ -552,7 +710,7 @@ msgstr ""
552msgid "Time Zone"
710msgid "Time Zone"
553msgstr ""
711msgstr ""
554
712
555−#: qml/Wizard/Pages/50-timezone.qml:178
713+#: qml/Wizard/Pages/50-timezone.qml:181
556msgid "Enter your city"
714msgid "Enter your city"
557msgstr ""
715msgstr ""
558
716
@@ -642,7 +800,7 @@ msgid "Service Terms"
642msgstr ""
800msgstr ""
643
801
644#: qml/Wizard/Pages/passcode-confirm.qml:43
802#: qml/Wizard/Pages/passcode-confirm.qml:43
645−#: qml/Wizard/Pages/passcode-desktop.qml:80
803+#: qml/Wizard/Pages/passcode-desktop.qml:96
646msgid "Confirm passcode"
804msgid "Confirm passcode"
647msgstr "Potvrdi pristupni kod"
805msgstr "Potvrdi pristupni kod"
648
806
@@ -659,24 +817,24 @@ msgstr ""
659msgid "Lock Screen Passcode"
817msgid "Lock Screen Passcode"
660msgstr ""
818msgstr ""
661
819
662−#: qml/Wizard/Pages/passcode-desktop.qml:56
820+#: qml/Wizard/Pages/passcode-desktop.qml:60
663msgid "Enter 4 numbers to setup your passcode"
821msgid "Enter 4 numbers to setup your passcode"
664msgstr ""
822msgstr ""
665
823
666−#: qml/Wizard/Pages/passcode-desktop.qml:65
824+#: qml/Wizard/Pages/passcode-desktop.qml:76
667#: qml/Wizard/Pages/passcode-set.qml:54
825#: qml/Wizard/Pages/passcode-set.qml:54
668msgid "Choose passcode"
826msgid "Choose passcode"
669msgstr ""
827msgstr ""
670
828
671−#: qml/Wizard/Pages/passcode-desktop.qml:105
829+#: qml/Wizard/Pages/passcode-desktop.qml:126
672msgid "Passcode too short"
830msgid "Passcode too short"
673msgstr ""
831msgstr ""
674
832
675−#: qml/Wizard/Pages/passcode-desktop.qml:107
833+#: qml/Wizard/Pages/passcode-desktop.qml:128
676msgid "Passcodes match"
834msgid "Passcodes match"
677msgstr ""
835msgstr ""
678
836
679−#: qml/Wizard/Pages/passcode-desktop.qml:109
837+#: qml/Wizard/Pages/passcode-desktop.qml:130
680msgid "Passcodes do not match"
838msgid "Passcodes do not match"
681msgstr ""
839msgstr ""
682
840
@@ -725,26 +883,30 @@ msgid "To proceed with no SIM tap Skip."
725msgstr ""
883msgstr ""
726
884
727#: qml/Wizard/PasswordMeter.qml:87
885#: qml/Wizard/PasswordMeter.qml:87
728−msgid "Passwords match"
886+msgid "Password too short"
729msgstr ""
887msgstr ""
730
888
731#: qml/Wizard/PasswordMeter.qml:89
889#: qml/Wizard/PasswordMeter.qml:89
890+msgid "Passwords match"
891+msgstr ""
892+
893+#: qml/Wizard/PasswordMeter.qml:91
732msgid "Passwords do not match"
894msgid "Passwords do not match"
733msgstr ""
895msgstr ""
734
896
735−#: qml/Wizard/PasswordMeter.qml:93
897+#: qml/Wizard/PasswordMeter.qml:95
736msgid "Strong password"
898msgid "Strong password"
737msgstr ""
899msgstr ""
738
900
739−#: qml/Wizard/PasswordMeter.qml:95
901+#: qml/Wizard/PasswordMeter.qml:97
740msgid "Fair password"
902msgid "Fair password"
741msgstr ""
903msgstr ""
742
904
743−#: qml/Wizard/PasswordMeter.qml:97
905+#: qml/Wizard/PasswordMeter.qml:99
744msgid "Weak password"
906msgid "Weak password"
745msgstr ""
907msgstr ""
746
908
747−#: qml/Wizard/PasswordMeter.qml:99
909+#: qml/Wizard/PasswordMeter.qml:101
748msgid "Very weak password"
910msgid "Very weak password"
749msgstr ""
911msgstr ""
750
912
@@ -767,6 +929,15 @@ msgstr ""
767#~ msgid "Shut down"
929#~ msgid "Shut down"
768#~ msgstr "Gašenje sistema"
930#~ msgstr "Gašenje sistema"
769
931
932+#~ msgid "See all"
933+#~ msgstr "Pogledati sve"
934+
935+#~ msgid "See less"
936+#~ msgstr "Pogledati manje"
937+
938+#~ msgid "Tap to unlock"
939+#~ msgstr "Kucnite za otključavanje"
940+
770#~ msgid "Please re-enter"
941#~ msgid "Please re-enter"
771#~ msgstr "Molimo ponovo unesite"
942#~ msgstr "Molimo ponovo unesite"
772
943
po/ca.po+402−182

This diff is too big to show here.

po/ca@valencia.po+295−127

This diff is too big to show here.

po/ce.po+287−125

This diff is too big to show here.

po/ckb.po+287−125

This diff is too big to show here.

po/co.ponew file+964

This diff is too big to show here.

po/cs.po+299−128

This diff is too big to show here.

po/cy.po+299−128

This diff is too big to show here.

po/da.po+299−128

This diff is too big to show here.

po/de.po+406−192

This diff is too big to show here.

po/el.po+368−184

This diff is too big to show here.

po/en_AU.po+333−132

This diff is too big to show here.

po/en_GB.po+335−134

This diff is too big to show here.

po/eo.po+287−125

This diff is too big to show here.

po/es.po+341−137

This diff is too big to show here.

po/eu.po+299−128

This diff is too big to show here.

po/fa.po+335−133

This diff is too big to show here.

po/fi.po+399−193

This diff is too big to show here.

po/fo.po+371−205

This diff is too big to show here.

po/fr.po+352−146

This diff is too big to show here.

po/ga.po+299−128

This diff is too big to show here.

po/gd.po+339−136

This diff is too big to show here.

po/gl.po+399−194

This diff is too big to show here.

po/gv.po+295−127

This diff is too big to show here.

po/he.po+299−128

This diff is too big to show here.

po/hi.po+287−125

This diff is too big to show here.

po/hr.po+460−190

This diff is too big to show here.

po/hu.po+333−139

This diff is too big to show here.

po/hy.po+291−126

This diff is too big to show here.

po/ia.po+400−192

This diff is too big to show here.

po/id.po+295−127

This diff is too big to show here.

po/is.po+295−127

This diff is too big to show here.

po/it.po+334−133

This diff is too big to show here.

po/ja.po+295−127

This diff is too big to show here.

po/km.po+315−150

This diff is too big to show here.

po/kn.po+287−125

This diff is too big to show here.

po/ko.po+299−137

This diff is too big to show here.

po/ku.po+295−127

This diff is too big to show here.

po/ky.po+287−125

This diff is too big to show here.

po/lo.po+287−125

This diff is too big to show here.

po/lt.po+287−125

This diff is too big to show here.

po/lv.po+299−128

This diff is too big to show here.

po/ml.po+287−125

This diff is too big to show here.

po/mr.po+287−125

This diff is too big to show here.

po/ms.po+410−186

This diff is too big to show here.

po/my.po+287−125

This diff is too big to show here.

po/nb.po+333−132

This diff is too big to show here.

po/ne.po+287−125

This diff is too big to show here.

po/nl.po+329−139

This diff is too big to show here.

po/nn.po+287−125

This diff is too big to show here.

po/oc.po+638−215

This diff is too big to show here.

po/or.po+287−125

This diff is too big to show here.

po/pa.po+299−128

This diff is too big to show here.

po/pl.po+387−169

This diff is too big to show here.

po/pt.po+405−202

This diff is too big to show here.

po/pt_BR.po+312−141

This diff is too big to show here.

po/ro.po+299−128

This diff is too big to show here.

po/ru.po+383−182

This diff is too big to show here.

po/shn.po+287−125

This diff is too big to show here.

po/si.po+287−125

This diff is too big to show here.

po/sk.po+379−133

This diff is too big to show here.

po/sl.po+398−183

This diff is too big to show here.

po/sq.po+325−153

This diff is too big to show here.

po/sr.po+335−142

This diff is too big to show here.

po/sv.po+334−132

This diff is too big to show here.

po/sw.po+299−128

This diff is too big to show here.

po/ta.po+287−125

This diff is too big to show here.

po/te.po+287−125

This diff is too big to show here.

po/th.po+287−125

This diff is too big to show here.

po/tr.po+299−128

This diff is too big to show here.

po/ug.po+319−148

This diff is too big to show here.

po/uk.po+334−133

This diff is too big to show here.

po/unity8.pot+286−124

This diff is too big to show here.

po/ur.po+287−125

This diff is too big to show here.

po/uz.po+287−125

This diff is too big to show here.

po/vi.po+287−125

This diff is too big to show here.

po/wo.po+299−128

This diff is too big to show here.

po/xh.po+287−125

This diff is too big to show here.

po/zh_CN.po+397−205

This diff is too big to show here.

po/zh_HK.po+295−127

This diff is too big to show here.

po/zh_TW.po+329−167

This diff is too big to show here.

qml/Components/DelayedLockscreen.qml+1

This diff is too big to show here.

qml/Components/Dialogs.qml+10−13

This diff is too big to show here.

qml/Components/DragHandle.qml+43−25

This diff is too big to show here.

qml/Components/FadingLabel.qmlnew file+42

This diff is too big to show here.

qml/Components/FloatingFlickable.qmlnew file+59

This diff is too big to show here.

qml/Components/InputMethod.qml+10−46

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

qml/Components/KeyboardShortcutsOverlay.qmlnew file+334

This diff is too big to show here.

qml/Components/KeymapSwitcher.qmlnew file+65

This diff is too big to show here.

qml/Components/LazyImage.qml+3−1

This diff is too big to show here.

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

Binary file not shown.

qml/Components/Lockscreen.qml+8

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

qml/Components/ModeSwitchWarningDialog.qml+1−1

This diff is too big to show here.

qml/Components/NotificationAudio.qml+11−10

This diff is too big to show here.

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

This diff is too big to show here.

qml/Components/PassphraseLockscreen.qml+4

This diff is too big to show here.

qml/Components/PhysicalKeysMapper.qml+2−22

This diff is too big to show here.

qml/Components/PinLockscreen.qml+6−1

This diff is too big to show here.

qml/Components/PinPadButton.qml+17−2

This diff is too big to show here.

qml/Components/Rating.qml+1

This diff is too big to show here.

qml/Components/RatingStyle.qml+3

This diff is too big to show here.

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

This diff is too big to show here.

qml/Components/UbuntuShapeForItem.qml+1

This diff is too big to show here.

qml/Components/VirtualTouchPad.qml+1−1

This diff is too big to show here.

qml/Components/WindowControlButtons.qml+48−39

This diff is too big to show here.

qml/Components/graphics/close@20.png

Binary file not shown.

qml/Components/graphics/icon_star_empty@20.png

Binary file not shown.

qml/Components/graphics/icon_star_full@20.png

Binary file not shown.

qml/Components/graphics/icon_star_half@20.png

Binary file not shown.

qml/Components/graphics/icon_star_off@20.png

Binary file not shown.

qml/Components/graphics/icon_star_on@20.png

Binary file not shown.

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

Binary file not shown.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

qml/Dash/CardCarousel.qml+1−1

This diff is too big to show here.

qml/Dash/CardGrid.qml+1−2

This diff is too big to show here.

qml/Dash/CardHorizontalList.qml+1

This diff is too big to show here.

qml/Dash/CardTool.qml+31−10

This diff is too big to show here.

qml/Dash/CardVerticalJournal.qml+1

This diff is too big to show here.

qml/Dash/Dash.qml+11−11

This diff is too big to show here.

qml/Dash/DashApplication.qml+15−7

This diff is too big to show here.

qml/Dash/DashCategoryBase.qml+3−11

This diff is too big to show here.

qml/Dash/DashPageHeader.qml+31−36

This diff is too big to show here.

qml/Dash/DashRenderer.qml+6

This diff is too big to show here.

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

This diff is too big to show here.

qml/Dash/Filters/FilterOptionSelector.qml+4

This diff is too big to show here.

qml/Dash/Filters/FilterWidget.qml+3

This diff is too big to show here.

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

This diff is too big to show here.

qml/Dash/GenericScopeView.qml+31−11

This diff is too big to show here.

qml/Dash/PageHeaderExtraPanel.qml+34−10

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

qml/Dash/Previews/PreviewIconActions.qml+15

This diff is too big to show here.

qml/Dash/Previews/PreviewImageGallery.qml+3

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

qml/Dash/Previews/PreviewWidget.qml+3

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

qml/Dash/ScopesList.qml+2−13

This diff is too big to show here.

qml/Dash/graphics/dash_divider_top_darkgrad@27.png

Binary file not shown.

qml/Dash/graphics/dash_divider_top_lightgrad@27.png

Binary file not shown.

qml/Dash/graphics/header_handlearrow2@27.png

Binary file not shown.

qml/Dash/graphics/header_handlearrow@27.png

Binary file not shown.

qml/Dash/graphics/icon_clear@20.png

Binary file not shown.

qml/Dash/graphics/icon_search_active@20.png

Binary file not shown.

qml/Dash/graphics/icon_search_inactive@20.png

Binary file not shown.

qml/Dash/graphics/navigation_shadow@18.png

Binary file not shown.

qml/Dash/graphics/navigation_shadow_light@18.png

Binary file not shown.

qml/Dash/graphics/overview_hint@27.png

Binary file not shown.

qml/Dash/graphics/pagination_dot_off@30.png

Binary file not shown.

qml/Dash/graphics/pagination_dot_on@30.png

Binary file not shown.

qml/Dash/graphics/paper.png

Binary file not shown.

qml/Dash/graphics/pixel.png

Binary file not shown.

qml/Dash/graphics/play_button@18.png

Binary file not shown.

qml/Dash/graphics/play_button_active@18.png

Binary file not shown.

qml/Dash/graphics/play_button_active_big@20.png

Binary file not shown.

qml/Dash/graphics/play_button_big@20.png

Binary file not shown.

qml/Dash/graphics/tabbarchevron@27.png

Binary file not shown.

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

Binary file not shown.

qml/Dash/graphics/tooltip_arrow@27.png

Binary file not shown.

qml/DisabledScreenNotice.qml+11−4

This diff is too big to show here.

qml/Greeter/CoverPage.qml+23−1

This diff is too big to show here.

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

This diff is too big to show here.

qml/Greeter/Greeter.qml+189−72

This diff is too big to show here.

qml/Greeter/GreeterPrompt.qmlnew file+197

This diff is too big to show here.

qml/Greeter/IntegratedLightDMImpl.qml+1−1

This diff is too big to show here.

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

This diff is too big to show here.

qml/Greeter/LoginList.qml+77−81

This diff is too big to show here.

qml/Greeter/NarrowView.qml+20−3

This diff is too big to show here.

qml/Greeter/WideView.qml+11−4

This diff is too big to show here.

qml/Greeter/graphics/dot_empty.png

Binary file not shown.

qml/Greeter/graphics/dot_filled.png

Binary file not shown.

qml/Greeter/graphics/dot_pointer.png

Binary file not shown.

qml/Greeter/graphics/icon_arrow.png

Binary file not shown.

qml/Greeter/graphics/infographic_circle_back.png

Binary file not shown.

qml/Greeter/qmldirnew file+1

This diff is too big to show here.

qml/Launcher/Launcher.qml+17−25

This diff is too big to show here.

qml/Launcher/LauncherDelegate.qml+13−19

This diff is too big to show here.

qml/Launcher/LauncherPanel.qml+31−14

This diff is too big to show here.

qml/Launcher/graphics/divider-line.png

Binary file not shown.

qml/Launcher/graphics/focused_app_arrow@30.png

Binary file not shown.

qml/Launcher/graphics/home@18.png

Binary file not shown.

qml/Launcher/graphics/quicklist_tooltip@30.png

Binary file not shown.

qml/Notifications/Notification.qml+160−119

This diff is too big to show here.

qml/Notifications/NotificationButton.qmlnew file+72

This diff is too big to show here.

qml/Notifications/NotificationMenuItemFactory.qml+8−10

This diff is too big to show here.

qml/Notifications/Notifications.qml+23−14

This diff is too big to show here.

qml/Notifications/OptionToggle.qml+12−10

This diff is too big to show here.

qml/Notifications/ShapedIcon.qml+1

This diff is too big to show here.

qml/Notifications/SwipeToAct.qml+16−20

This diff is too big to show here.

qml/Notifications/grip-large.svgdeleted−150

This diff is too big to show here.

qml/OrientedShell.qml+34−19

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

qml/Panel/IndicatorsMenu.qml+40−24

This diff is too big to show here.

qml/Panel/Panel.qml+29−24

This diff is too big to show here.

qml/Panel/graphics/rectangular_dropshadow@30.png

Binary file not shown.

qml/Rotation/HalfLoopRotationAnimation.qml+2−1

This diff is too big to show here.

qml/Rotation/ImmediateRotationAction.qml+11−22

This diff is too big to show here.

qml/Rotation/NinetyRotationAnimation.qml+14−16

This diff is too big to show here.

qml/Rotation/RotationStates.qml+25−5

This diff is too big to show here.

qml/Rotation/UpdateShellTransformations.qmlnew file+42

This diff is too big to show here.

qml/Shell.qml+164−136

This diff is too big to show here.

qml/Stages/AbstractStage.qml+12−4

This diff is too big to show here.

qml/Stages/Animations/BaseSessionAnimation.qmldeleted−96

This diff is too big to show here.

qml/Stages/Animations/SwipeFromBottomAnimation.qmldeleted−53

This diff is too big to show here.

qml/Stages/ApplicationWindow.qml+156−74

This diff is too big to show here.

qml/Stages/DecoratedWindow.qml+57−26

This diff is too big to show here.

qml/Stages/DesktopSpread.qml+25−19

This diff is too big to show here.

qml/Stages/DesktopSpreadDelegate.qml+5−4

This diff is too big to show here.

qml/Stages/DesktopStage.qml+299−150

This diff is too big to show here.

qml/Stages/OrientationChangeAnimation.qml+30−6

This diff is too big to show here.

qml/Stages/PhoneStage.qml+158−95

This diff is too big to show here.

qml/Stages/PromptSurfaceAnimations.qmlnew file+81

This diff is too big to show here.

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

This diff is too big to show here.

qml/Stages/SessionContainer.qmldeleted−180

This diff is too big to show here.

qml/Stages/SideStage.qml+1−2

This diff is too big to show here.

qml/Stages/Splash.qml+6−17

This diff is too big to show here.

qml/Stages/SpreadDelegate.qml+12−16

This diff is too big to show here.

qml/Stages/StagedFullscreenPolicy.qml+12−14

This diff is too big to show here.

qml/Stages/SurfaceContainer.qml+45−57

This diff is too big to show here.

qml/Stages/TabletSideStageTouchGesture.qml+3

This diff is too big to show here.

qml/Stages/TabletStage.qml+317−245

This diff is too big to show here.

qml/Stages/TopLevelSurfaceRepeater.qmlnew file+52

This diff is too big to show here.

qml/Stages/TransformedSpreadDelegate.qml+4−4

This diff is too big to show here.

qml/Stages/TransformedTabletSpreadDelegate.qml+29−23

This diff is too big to show here.

qml/Stages/WindowControlsOverlay.qmlnew file+219

This diff is too big to show here.

qml/Stages/WindowDecoration.qml+42−15

This diff is too big to show here.

qml/Stages/WindowResizeArea.qml+40−20

This diff is too big to show here.

qml/Stages/WindowedFullscreenPolicy.qml+5−7

This diff is too big to show here.

qml/Stages/graphics/PageHeaderBaseDividerBottom@18.png

Binary file not shown.

qml/Stages/graphics/PageHeaderBaseDividerLight@18.png

Binary file not shown.

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

Binary file not shown.

qml/Stages/graphics/arrows.pngnew file

Binary file not shown.

qml/Stages/graphics/dropshadow2gu@30.png

Binary file not shown.

qml/Stages/graphics/sidestage_handle@20.png

Binary file not shown.

qml/Tutorial/InactivityTimer.qml+26−10

This diff is too big to show here.

qml/Tutorial/Tutorial.qml+7−6

This diff is too big to show here.

qml/Tutorial/TutorialBottom.qmldeleted−124

This diff is too big to show here.

qml/Tutorial/TutorialContent.qml+51−134

This diff is too big to show here.

qml/Tutorial/TutorialLeft.qml+2−2

This diff is too big to show here.

qml/Tutorial/TutorialLeftLong.qml+3−1

This diff is too big to show here.

qml/Tutorial/TutorialPage.qml+2−2

This diff is too big to show here.

qml/Tutorial/TutorialRight.qml+2−2

This diff is too big to show here.

qml/Tutorial/TutorialTop.qml+2−3

This diff is too big to show here.

qml/Tutorial/graphics/background1.png

Binary file not shown.

qml/Tutorial/graphics/background2.png

Binary file not shown.

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

This diff is too big to show here.

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

This diff is too big to show here.

qml/Wizard/Pages/data/Desktop_header_bkg.png

Binary file not shown.

qml/Wizard/Pages/data/Desktop_splash_screen_bkg.png

Binary file not shown.

qml/Wizard/Pages/data/Phone_header_bkg.png

Binary file not shown.

qml/Wizard/Pages/data/Phone_splash_screen_bkg.png

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

This diff is too big to show here.

qml/Wizard/PasswordMeter.qml+3−1

This diff is too big to show here.

qml/Wizard/Wizard.qml+6−2

This diff is too big to show here.

qml/graphics/dropshadow_left@20.png

Binary file not shown.

qml/graphics/dropshadow_right@20.png

Binary file not shown.

src/CMakeLists.txt+2−4

This diff is too big to show here.

src/Dash/CMakeLists.txt+1

This diff is too big to show here.

src/Dash/main.cpp+34−21

This diff is too big to show here.

src/SecondaryWindow.cpp+9

This diff is too big to show here.

src/ShellApplication.cpp+17−1

This diff is too big to show here.

src/ShellView.cpp+6−2

This diff is too big to show here.

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

This diff is too big to show here.

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

The content is the same.

src/main.cpp+13

This diff is too big to show here.

src/qmldebuggerutils.hnew file+33

This diff is too big to show here.

tests/CMakeLists.txt+7−2

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

No changes to the content.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/data/unity/backgrounds/blue.png

Binary file not shown.

tests/data/unity/backgrounds/red.png

Binary file not shown.

tests/graphics/applicationIcons/browser@18.png

Binary file not shown.

tests/graphics/applicationIcons/calendar@18.png

Binary file not shown.

tests/graphics/applicationIcons/camera@18.png

Binary file not shown.

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

Binary file not shown.

tests/graphics/applicationIcons/dash.png

Binary file not shown.

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

Binary file not shown.

tests/graphics/applicationIcons/evernote@18.png

Binary file not shown.

tests/graphics/applicationIcons/facebook@18.png

Binary file not shown.

tests/graphics/applicationIcons/gallery@18.png

Binary file not shown.

tests/graphics/applicationIcons/gmail@18.png

Binary file not shown.

tests/graphics/applicationIcons/libreoffice@18.png

Binary file not shown.

tests/graphics/applicationIcons/map@18.png

Binary file not shown.

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

Binary file not shown.

tests/graphics/applicationIcons/notepad@18.png

Binary file not shown.

tests/graphics/applicationIcons/pinterest@18.png

Binary file not shown.

tests/graphics/applicationIcons/soundcloud@18.png

Binary file not shown.

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

Binary file not shown.

tests/graphics/applicationIcons/twitter@18.png

Binary file not shown.

tests/graphics/applicationIcons/weather@18.png

Binary file not shown.

tests/graphics/applicationIcons/wikipedia@18.png

Binary file not shown.

tests/graphics/applicationIcons/youtube@18.png

Binary file not shown.

tests/graphics/avatars/amanda@12.png

Binary file not shown.

tests/graphics/avatars/anna_olsson@12.png

Binary file not shown.

tests/graphics/avatars/funky@12.png

Binary file not shown.

tests/graphics/clock@18.png

Binary file not shown.

tests/libs/CMakeLists.txtdeleted−1

This diff is too big to show here.

tests/libs/UbuntuGestures/CMakeLists.txtdeleted−16

This diff is too big to show here.

tests/libs/UbuntuGestures/tst_TouchRegistry.cppdeleted−974

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.cpp+24

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.h+16

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.qmltypesdeleted−41

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Biometryd/qmldirnew file+3

This diff is too big to show here.

tests/mocks/CMakeLists.txt+2−1

This diff is too big to show here.

tests/mocks/Cursor/qmldir+1−1

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/IntegratedLightDM/qmldirdeleted−3

This diff is too big to show here.

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

This diff is too big to show here.

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

The content is the same.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

The content is the same.

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

The content is the same.

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

The content is the same.

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

This diff is too big to show here.

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

The content is the same.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

The content is the same.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Lights/Lights.qmltypesdeleted−45

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Powerd/Powerd.qmltypesdeleted−39

This diff is too big to show here.

tests/mocks/QMenuModel/QMenuModel.qmltypesdeleted−111

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/QtMultimedia/QtMultimedia.qmltypesdeleted−62

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/QtMultimedia/audio.cppdeleted−119

This diff is too big to show here.

tests/mocks/QtMultimedia/audio.hdeleted−92

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/Unity.qmltypesdeleted−469

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectorfilter.cpp+5

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectorfilter.h+2

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectoroptions.cpp+13

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectoroptions.h+2

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/fake_resultsmodel.cpp+2

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/fake_scopes.cpp+12

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Utils/Utils.qmltypesdeleted−178

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Wizard/Wizard.qmltypesdeleted−37

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/CMakeLists.txt+3−3

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/CMakeLists.txt+4

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

The content is the same.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

The content is the same.

tests/plugins/ScreenGrabber/CMakeLists.txtdeleted−14

This diff is too big to show here.

tests/plugins/ScreenGrabber/ScreenGrabberTest.cppdeleted−77

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/CMakeLists.txt+4−2

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

The content is the same.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Components/tst_LazyImage/portrait.png

Binary file not shown.

tests/qmltests/Components/tst_LazyImage/square.png

Binary file not shown.

tests/qmltests/Components/tst_LazyImage/wide.png

Binary file not shown.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

Binary file not shown.

tests/qmltests/Dash/artwork/background.png

Binary file not shown.

tests/qmltests/Dash/artwork/checkers.png

Binary file not shown.

tests/qmltests/Dash/artwork/emblem.png

Binary file not shown.

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

Binary file not shown.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Dash/tst_DashPageHeader.qml−24

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Stages/RecursingChildSessionControl.qmldeleted−145

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Stages/tst_SessionContainer.qmldeleted−331

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/UnityLogo.png

Binary file not shown.

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

This diff is too big to show here.

tests/qmltests/tst_OrientedShell.qml+176−119

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+361−202

This diff is too big to show here.

tests/qmltests/tst_ShellWithPin.qml+18−20

This diff is too big to show here.

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

This diff is too big to show here.

tests/uqmlscene/main.cpp−1

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tools/CMakeLists.txt+1−1

This diff is too big to show here.

tools/scopetool.cpp+1−1

This diff is too big to show here.