diff options
author | Ben Murdoch <benm@google.com> | 2014-04-24 10:50:13 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2014-04-24 10:50:13 +0100 |
commit | 0529e5d033099cbfc42635f6f6183833b09dff6e (patch) | |
tree | badea60062e611382d8a37e3b0bfda8d69760c2b /ui | |
parent | 8346740f6fb555ccbb9b4148ab63402ae8f6e4ca (diff) | |
download | chromium_org-0529e5d033099cbfc42635f6f6183833b09dff6e.tar.gz |
Merge from Chromium at DEPS revision 265802
This commit was generated by merge_to_master.py.
Change-Id: I6fac2dbbce472b18ca943b6e6f247835b0bd6281
Diffstat (limited to 'ui')
599 files changed, 10691 insertions, 6023 deletions
diff --git a/ui/accessibility/accessibility.target.darwin-arm.mk b/ui/accessibility/accessibility.target.darwin-arm.mk index 1c1e01fdc5..f9a1b0c155 100644 --- a/ui/accessibility/accessibility.target.darwin-arm.mk +++ b/ui/accessibility/accessibility.target.darwin-arm.mk @@ -99,12 +99,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -220,12 +223,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/accessibility.target.darwin-mips.mk b/ui/accessibility/accessibility.target.darwin-mips.mk index 9e8d30c7ed..f791285ab4 100644 --- a/ui/accessibility/accessibility.target.darwin-mips.mk +++ b/ui/accessibility/accessibility.target.darwin-mips.mk @@ -98,12 +98,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -218,12 +221,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/accessibility.target.darwin-x86.mk b/ui/accessibility/accessibility.target.darwin-x86.mk index fc3ac1ba94..a39a23acc3 100644 --- a/ui/accessibility/accessibility.target.darwin-x86.mk +++ b/ui/accessibility/accessibility.target.darwin-x86.mk @@ -100,12 +100,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -221,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/accessibility.target.darwin-x86_64.mk b/ui/accessibility/accessibility.target.darwin-x86_64.mk index 43ddd79291..4644939bf9 100644 --- a/ui/accessibility/accessibility.target.darwin-x86_64.mk +++ b/ui/accessibility/accessibility.target.darwin-x86_64.mk @@ -100,12 +100,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -221,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/accessibility.target.linux-arm.mk b/ui/accessibility/accessibility.target.linux-arm.mk index 1c1e01fdc5..f9a1b0c155 100644 --- a/ui/accessibility/accessibility.target.linux-arm.mk +++ b/ui/accessibility/accessibility.target.linux-arm.mk @@ -99,12 +99,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -220,12 +223,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/accessibility.target.linux-mips.mk b/ui/accessibility/accessibility.target.linux-mips.mk index 9e8d30c7ed..f791285ab4 100644 --- a/ui/accessibility/accessibility.target.linux-mips.mk +++ b/ui/accessibility/accessibility.target.linux-mips.mk @@ -98,12 +98,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -218,12 +221,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/accessibility.target.linux-x86.mk b/ui/accessibility/accessibility.target.linux-x86.mk index fc3ac1ba94..a39a23acc3 100644 --- a/ui/accessibility/accessibility.target.linux-x86.mk +++ b/ui/accessibility/accessibility.target.linux-x86.mk @@ -100,12 +100,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -221,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/accessibility.target.linux-x86_64.mk b/ui/accessibility/accessibility.target.linux-x86_64.mk index 43ddd79291..4644939bf9 100644 --- a/ui/accessibility/accessibility.target.linux-x86_64.mk +++ b/ui/accessibility/accessibility.target.linux-x86_64.mk @@ -100,12 +100,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -221,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/ax_gen.target.darwin-arm.mk b/ui/accessibility/ax_gen.target.darwin-arm.mk index 427222e1b2..96328b1789 100644 --- a/ui/accessibility/ax_gen.target.darwin-arm.mk +++ b/ui/accessibility/ax_gen.target.darwin-arm.mk @@ -266,7 +266,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/ax_gen.target.darwin-mips.mk b/ui/accessibility/ax_gen.target.darwin-mips.mk index 77c4db8253..82a261f9ed 100644 --- a/ui/accessibility/ax_gen.target.darwin-mips.mk +++ b/ui/accessibility/ax_gen.target.darwin-mips.mk @@ -262,7 +262,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/ax_gen.target.darwin-x86.mk b/ui/accessibility/ax_gen.target.darwin-x86.mk index 549c6394e6..083a186f40 100644 --- a/ui/accessibility/ax_gen.target.darwin-x86.mk +++ b/ui/accessibility/ax_gen.target.darwin-x86.mk @@ -264,7 +264,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/ax_gen.target.darwin-x86_64.mk b/ui/accessibility/ax_gen.target.darwin-x86_64.mk index 6b6f0c5437..4870072e31 100644 --- a/ui/accessibility/ax_gen.target.darwin-x86_64.mk +++ b/ui/accessibility/ax_gen.target.darwin-x86_64.mk @@ -264,7 +264,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/ax_gen.target.linux-arm.mk b/ui/accessibility/ax_gen.target.linux-arm.mk index 427222e1b2..96328b1789 100644 --- a/ui/accessibility/ax_gen.target.linux-arm.mk +++ b/ui/accessibility/ax_gen.target.linux-arm.mk @@ -266,7 +266,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/ax_gen.target.linux-mips.mk b/ui/accessibility/ax_gen.target.linux-mips.mk index 77c4db8253..82a261f9ed 100644 --- a/ui/accessibility/ax_gen.target.linux-mips.mk +++ b/ui/accessibility/ax_gen.target.linux-mips.mk @@ -262,7 +262,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/ax_gen.target.linux-x86.mk b/ui/accessibility/ax_gen.target.linux-x86.mk index 549c6394e6..083a186f40 100644 --- a/ui/accessibility/ax_gen.target.linux-x86.mk +++ b/ui/accessibility/ax_gen.target.linux-x86.mk @@ -264,7 +264,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/ax_gen.target.linux-x86_64.mk b/ui/accessibility/ax_gen.target.linux-x86_64.mk index 6b6f0c5437..4870072e31 100644 --- a/ui/accessibility/ax_gen.target.linux-x86_64.mk +++ b/ui/accessibility/ax_gen.target.linux-x86_64.mk @@ -264,7 +264,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/accessibility/ax_node.cc b/ui/accessibility/ax_node.cc index 8adb940905..587f7375d7 100644 --- a/ui/accessibility/ax_node.cc +++ b/ui/accessibility/ax_node.cc @@ -19,6 +19,10 @@ void AXNode::SetData(const AXNodeData& src) { data_ = src; } +void AXNode::SetLocation(const gfx::Rect& new_location) { + data_.location = new_location; +} + void AXNode::SetIndexInParent(int index_in_parent) { index_in_parent_ = index_in_parent; } @@ -31,4 +35,13 @@ void AXNode::Destroy() { delete this; } +bool AXNode::IsDescendantOf(AXNode* ancestor) { + if (this == ancestor) + return true; + else if (parent()) + return parent()->IsDescendantOf(ancestor); + + return false; +} + } // namespace ui diff --git a/ui/accessibility/ax_node.h b/ui/accessibility/ax_node.h index b7e31257b9..5da73401c5 100644 --- a/ui/accessibility/ax_node.h +++ b/ui/accessibility/ax_node.h @@ -24,27 +24,36 @@ class AX_EXPORT AXNode { int child_count() const { return static_cast<int>(children_.size()); } const AXNodeData& data() const { return data_; } const std::vector<AXNode*>& children() const { return children_; } + int index_in_parent() const { return index_in_parent_; } // Get the child at the given index. AXNode* ChildAtIndex(int index) const { return children_[index]; } // Set the node's accessibility data. This may be done during initial // initialization or later when the node data changes. - virtual void SetData(const AXNodeData& src); + void SetData(const AXNodeData& src); + + // Update this node's location. This is separate from SetData just because + // changing only the location is common and should be more efficient than + // re-copying all of the data. + void SetLocation(const gfx::Rect& new_location); // Set the index in parent, for example if siblings were inserted or deleted. void SetIndexInParent(int index_in_parent); // Swap the internal children vector with |children|. This instance // now owns all of the passed children. - virtual void SwapChildren(std::vector<AXNode*>& children); + void SwapChildren(std::vector<AXNode*>& children); // This is called when the AXTree no longer includes this node in the // tree. Reference counting is used on some platforms because the // operating system may hold onto a reference to an AXNode // object even after we're through with it, so this may decrement the // reference count and clear out the object's data. - virtual void Destroy(); + void Destroy(); + + // Return true if this object is equal to or a descendant of |ancestor|. + bool IsDescendantOf(AXNode* ancestor); private: int index_in_parent_; diff --git a/ui/accessibility/ax_node_data.cc b/ui/accessibility/ax_node_data.cc index d287ac906d..78987ef6e1 100644 --- a/ui/accessibility/ax_node_data.cc +++ b/ui/accessibility/ax_node_data.cc @@ -6,7 +6,6 @@ #include <set> -#include "base/containers/hash_tables.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc index 17112742a4..c0ec9ac8c4 100644 --- a/ui/accessibility/ax_tree.cc +++ b/ui/accessibility/ax_tree.cc @@ -15,9 +15,7 @@ namespace ui { namespace { std::string TreeToStringHelper(AXNode* node, int indent) { - std::string result; - for (int i = 0; i < indent; i++) - result += " "; + std::string result = std::string(2 * indent, ' '); result += node->data().ToString() + "\n"; for (int i = 0; i < node->child_count(); ++i) result += TreeToStringHelper(node->ChildAtIndex(i), indent + 1); @@ -47,7 +45,7 @@ AXTreeDelegate::~AXTreeDelegate() { AXTree::AXTree() : delegate_(NULL), root_(NULL) { AXNodeData root; - root.id = 0; + root.id = -1; root.role = AX_ROLE_ROOT_WEB_AREA; AXTreeUpdate initial_state; @@ -119,10 +117,10 @@ bool AXTree::Unserialize(const AXTreeUpdate& update) { for (size_t i = 0; i < update.nodes.size(); ++i) { AXNode* node = GetFromId(update.nodes[i].id); if (update_state.new_nodes.find(node) != update_state.new_nodes.end()) { - delegate_->OnNodeCreated(node); + delegate_->OnNodeCreationFinished(node); update_state.new_nodes.erase(node); } else { - delegate_->OnNodeChanged(node); + delegate_->OnNodeChangeFinished(node); } } if (root_->id() != old_root_id) @@ -136,8 +134,13 @@ std::string AXTree::ToString() const { return TreeToStringHelper(root_, 0); } -AXNode* AXTree::CreateNode(AXNode* parent, int32 id, int32 index_in_parent) { - return new AXNode(parent, id, index_in_parent); +AXNode* AXTree::CreateNode( + AXNode* parent, int32 id, int32 index_in_parent) { + AXNode* new_node = new AXNode(parent, id, index_in_parent); + id_map_[new_node->id()] = new_node; + if (delegate_) + delegate_->OnNodeCreated(new_node); + return new_node; } bool AXTree::UpdateNode( @@ -150,25 +153,31 @@ bool AXTree::UpdateNode( // of the tree is being swapped, or we're out of sync with the source // and this is a serious error. AXNode* node = GetFromId(src.id); + AXNode* new_node = NULL; if (node) { update_state->pending_nodes.erase(node); + node->SetData(src); + if (delegate_) + delegate_->OnNodeChanged(node); } else { if (src.role != AX_ROLE_ROOT_WEB_AREA) { error_ = base::StringPrintf( "%d is not in the tree and not the new root", src.id); return false; } - node = CreateAndInitializeNode(NULL, src.id, 0); + new_node = CreateNode(NULL, src.id, 0); + node = new_node; update_state->new_nodes.insert(node); + node->SetData(src); } - // Set the node's data. - node->SetData(src); - // First, delete nodes that used to be children of this node but aren't // anymore. - if (!DeleteOldChildren(node, src.child_ids)) + if (!DeleteOldChildren(node, src.child_ids)) { + if (new_node) + DestroyNodeAndSubtree(new_node); return false; + } // Now build a new children vector, reusing nodes when possible, // and swap it in. @@ -188,13 +197,6 @@ bool AXTree::UpdateNode( return success; } -AXNode* AXTree::CreateAndInitializeNode( - AXNode* parent, int32 id, int32 index_in_parent) { - AXNode* node = CreateNode(parent, id, index_in_parent); - id_map_[node->id()] = node; - return node; -} - void AXTree::DestroyNodeAndSubtree(AXNode* node) { id_map_.erase(node->id()); for (int i = 0; i < node->child_count(); ++i) @@ -253,7 +255,7 @@ bool AXTree::CreateNewChildVector(AXNode* node, } child->SetIndexInParent(index_in_parent); } else { - child = CreateAndInitializeNode(node, child_id, index_in_parent); + child = CreateNode(node, child_id, index_in_parent); update_state->pending_nodes.insert(child); update_state->new_nodes.insert(child); } diff --git a/ui/accessibility/ax_tree.h b/ui/accessibility/ax_tree.h index 6a4134cb2a..b4baac460c 100644 --- a/ui/accessibility/ax_tree.h +++ b/ui/accessibility/ax_tree.h @@ -17,6 +17,20 @@ class AXNode; struct AXTreeUpdateState; // Used when you want to be notified when changes happen to the tree. +// +// Some of the notifications are called in the middle of an update operation. +// Be careful, as the tree may be in an inconsistent state at this time; +// don't walk the parents and children at this time: +// OnNodeWillBeDeleted +// OnNodeCreated +// OnNodeChanged +// +// Other notifications are called at the end of an atomic update operation. +// From these, it's safe to walk the tree and do any initialization that +// assumes the tree is in a consistent state. +// OnNodeCreationFinished +// OnNodeChangeFinished +// OnRootChanged class AX_EXPORT AXTreeDelegate { public: AXTreeDelegate(); @@ -27,16 +41,23 @@ class AX_EXPORT AXTreeDelegate { // in the middle of an update, the tree may be in an invalid state! virtual void OnNodeWillBeDeleted(AXNode* node) = 0; - // Called after a new node is created. It's guaranteed to be called - // after it's been fully initialized, so you can rely on its data and - // links to parents and children being valid. This will be called on - // parents before it's called on their children. + // Called immediately after a new node is created. The tree may be in + // the middle of an update, don't walk the parents and children now. virtual void OnNodeCreated(AXNode* node) = 0; - // Called when a node changes its data or children. + // Called when a node changes its data or children. The tree may be in + // the middle of an update, don't walk the parents and children now. virtual void OnNodeChanged(AXNode* node) = 0; - // Called when the root node changes. + // Called for each new node at the end of an update operation, + // when the tree is in a consistent state. + virtual void OnNodeCreationFinished(AXNode* node) = 0; + + // Called for each existing node that changed at the end of an update + // operation, when the tree is in a consistent state. + virtual void OnNodeChangeFinished(AXNode* node) = 0; + + // Called at the end of an update operation when the root node changes. virtual void OnRootChanged(AXNode* new_root) = 0; }; @@ -76,10 +97,6 @@ class AX_EXPORT AXTree { void OnRootChanged(); - // Convenience function to create a node and call Initialize on it. - AXNode* CreateAndInitializeNode( - AXNode* parent, int32 id, int32 index_in_parent); - // Call Destroy() on |node|, and delete it from the id map, and then // call recursively on all nodes in its subtree. void DestroyNodeAndSubtree(AXNode* node); diff --git a/ui/accessibility/ax_tree_unittest.cc b/ui/accessibility/ax_tree_unittest.cc index f4c609ed36..9d734f883f 100644 --- a/ui/accessibility/ax_tree_unittest.cc +++ b/ui/accessibility/ax_tree_unittest.cc @@ -28,18 +28,31 @@ class FakeAXTreeDelegate : public AXTreeDelegate { changed_ids_.push_back(node->id()); } + virtual void OnNodeCreationFinished(AXNode* node) OVERRIDE { + creation_finished_ids_.push_back(node->id()); + } + + virtual void OnNodeChangeFinished(AXNode* node) OVERRIDE { + change_finished_ids_.push_back(node->id()); + } + virtual void OnRootChanged(AXNode* new_root) OVERRIDE { new_root_ids_.push_back(new_root->id()); } const std::vector<int32>& deleted_ids() { return deleted_ids_; } const std::vector<int32>& created_ids() { return created_ids_; } + const std::vector<int32>& creation_finished_ids() { + return creation_finished_ids_; + } const std::vector<int32>& new_root_ids() { return new_root_ids_; } private: std::vector<int32> deleted_ids_; std::vector<int32> created_ids_; + std::vector<int32> creation_finished_ids_; std::vector<int32> changed_ids_; + std::vector<int32> change_finished_ids_; std::vector<int32> new_root_ids_; }; @@ -103,6 +116,44 @@ TEST(AXTreeTest, SerializeSimpleAXTree) { dst_tree.ToString()); } +TEST(AXTreeTest, SerializeAXTreeUpdate) { + AXNodeData list; + list.id = 3; + list.role = AX_ROLE_LIST; + list.state = 0; + list.child_ids.push_back(4); + list.child_ids.push_back(5); + list.child_ids.push_back(6); + + AXNodeData list_item_2; + list_item_2.id = 5; + list_item_2.role = AX_ROLE_LIST_ITEM; + list_item_2.state = 0; + + AXNodeData list_item_3; + list_item_3.id = 6; + list_item_3.role = AX_ROLE_LIST_ITEM; + list_item_3.state = 0; + + AXNodeData button; + button.id = 7; + button.role = AX_ROLE_BUTTON; + button.state = 0; + + AXTreeUpdate update; + update.nodes.push_back(list); + update.nodes.push_back(list_item_2); + update.nodes.push_back(list_item_3); + update.nodes.push_back(button); + + EXPECT_EQ( + "id=3 list (0, 0)-(0, 0) child_ids=4,5,6\n" + " id=5 list_item (0, 0)-(0, 0)\n" + " id=6 list_item (0, 0)-(0, 0)\n" + "id=7 button (0, 0)-(0, 0)\n", + update.ToString()); +} + TEST(AXTreeTest, DeleteUnknownSubtreeFails) { AXNodeData root; root.id = 1; @@ -234,6 +285,10 @@ TEST(AXTreeTest, TreeDelegateIsCalled) { EXPECT_EQ(2, fake_delegate.created_ids()[0]); EXPECT_EQ(3, fake_delegate.created_ids()[1]); + ASSERT_EQ(2U, fake_delegate.creation_finished_ids().size()); + EXPECT_EQ(2, fake_delegate.creation_finished_ids()[0]); + EXPECT_EQ(3, fake_delegate.creation_finished_ids()[1]); + ASSERT_EQ(1U, fake_delegate.new_root_ids().size()); EXPECT_EQ(2, fake_delegate.new_root_ids()[0]); diff --git a/ui/accessibility/ax_tree_update.cc b/ui/accessibility/ax_tree_update.cc index dc785d9e06..8e9d019349 100644 --- a/ui/accessibility/ax_tree_update.cc +++ b/ui/accessibility/ax_tree_update.cc @@ -4,6 +4,9 @@ #include "ui/accessibility/ax_tree_update.h" +#include "base/containers/hash_tables.h" +#include "base/strings/string_number_conversions.h" + namespace ui { AXTreeUpdate::AXTreeUpdate() : node_id_to_clear(0) { @@ -12,4 +15,28 @@ AXTreeUpdate::AXTreeUpdate() : node_id_to_clear(0) { AXTreeUpdate::~AXTreeUpdate() { } +std::string AXTreeUpdate::ToString() const { + std::string result; + if (node_id_to_clear != 0) { + result += "AXTreeUpdate: clear node " + + base::IntToString(node_id_to_clear) + "\n"; + } + + // The challenge here is that we want to indent the nodes being updated + // so that parent/child relationships are clear, but we don't have access + // to the rest of the tree for context, so we have to try to show the + // relative indentation of child nodes in this update relative to their + // parents. + base::hash_map<int32, int> id_to_indentation; + for (size_t i = 0; i < nodes.size(); ++i) { + int indent = id_to_indentation[nodes[i].id]; + result += std::string(2 * indent, ' '); + result += nodes[i].ToString() + "\n"; + for (size_t j = 0; j < nodes[i].child_ids.size(); ++j) + id_to_indentation[nodes[i].child_ids[j]] = indent + 1; + } + + return result; +} + } // namespace ui diff --git a/ui/accessibility/ax_tree_update.h b/ui/accessibility/ax_tree_update.h index 0280efe644..314a78f823 100644 --- a/ui/accessibility/ax_tree_update.h +++ b/ui/accessibility/ax_tree_update.h @@ -50,6 +50,9 @@ struct AX_EXPORT AXTreeUpdate { // A vector of nodes to update, according to the rules above. std::vector<AXNodeData> nodes; + // Return a multi-line indented string representation, for logging. + std::string ToString() const; + // TODO(dmazzoni): location changes }; diff --git a/ui/android/java/res/drawable-hdpi/dropdown_popup_background_down.9.png b/ui/android/java/res/drawable-hdpi/dropdown_popup_background_down.9.png Binary files differnew file mode 100644 index 0000000000..62478fcf66 --- /dev/null +++ b/ui/android/java/res/drawable-hdpi/dropdown_popup_background_down.9.png diff --git a/ui/android/java/res/drawable-hdpi/dropdown_popup_background_up.9.png b/ui/android/java/res/drawable-hdpi/dropdown_popup_background_up.9.png Binary files differnew file mode 100644 index 0000000000..290f526067 --- /dev/null +++ b/ui/android/java/res/drawable-hdpi/dropdown_popup_background_up.9.png diff --git a/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_down.9.png b/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_down.9.png Binary files differnew file mode 100644 index 0000000000..ab4d02cd38 --- /dev/null +++ b/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_down.9.png diff --git a/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_up.9.png b/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_up.9.png Binary files differnew file mode 100644 index 0000000000..cf3f9e6526 --- /dev/null +++ b/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_up.9.png diff --git a/ui/android/java/res/drawable/dropdown_popup_background_down.9.png b/ui/android/java/res/drawable/dropdown_popup_background_down.9.png Binary files differnew file mode 100644 index 0000000000..0fb3b87b8f --- /dev/null +++ b/ui/android/java/res/drawable/dropdown_popup_background_down.9.png diff --git a/ui/android/java/res/drawable/dropdown_popup_background_up.9.png b/ui/android/java/res/drawable/dropdown_popup_background_up.9.png Binary files differnew file mode 100644 index 0000000000..4ab1786471 --- /dev/null +++ b/ui/android/java/res/drawable/dropdown_popup_background_up.9.png diff --git a/ui/android/java/src/org/chromium/ui/UiUtils.java b/ui/android/java/src/org/chromium/ui/UiUtils.java index 6e6bf54784..e46e6fec40 100644 --- a/ui/android/java/src/org/chromium/ui/UiUtils.java +++ b/ui/android/java/src/org/chromium/ui/UiUtils.java @@ -30,6 +30,31 @@ public class UiUtils { /** The minimum size of the bottom margin below the app to detect a keyboard. */ private static final float KEYBOARD_DETECT_BOTTOM_THRESHOLD_DP = 100; + /** A delegate that allows disabling keyboard visibility detection. */ + private static KeyboardShowingDelegate sKeyboardShowingDelegate; + + /** + * A delegate that can be implemented to override whether or not keyboard detection will be + * used. + */ + public interface KeyboardShowingDelegate { + /** + * Will be called to determine whether or not to detect if the keyboard is visible. + * @param context A {@link Context} instance. + * @param view A {@link View}. + * @return Whether or not the keyboard check should be disabled. + */ + boolean disableKeyboardCheck(Context context, View view); + } + + /** + * Allows setting a delegate to override the default software keyboard visibility detection. + * @param delegate A {@link KeyboardShowingDelegate} instance. + */ + public static void setKeyboardShowingDelegate(KeyboardShowingDelegate delegate) { + sKeyboardShowingDelegate = delegate; + } + /** * Shows the software keyboard if necessary. * @param view The currently focused {@link View}, which would receive soft keyboard input. @@ -54,7 +79,19 @@ public class UiUtils { return imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } + /** + * Detects whether or not the keyboard is showing. This is a best guess as there is no + * standardized/foolproof way to do this. + * @param context A {@link Context} instance. + * @param view A {@link View}. + * @return Whether or not the software keyboard is visible and taking up screen space. + */ public static boolean isKeyboardShowing(Context context, View view) { + if (sKeyboardShowingDelegate != null + && sKeyboardShowingDelegate.disableKeyboardCheck(context, view)) { + return false; + } + View rootView = view.getRootView(); if (rootView == null) return false; Rect appRect = new Rect(); diff --git a/ui/android/java/src/org/chromium/ui/autofill/OWNERS b/ui/android/java/src/org/chromium/ui/autofill/OWNERS new file mode 100644 index 0000000000..812e8d9572 --- /dev/null +++ b/ui/android/java/src/org/chromium/ui/autofill/OWNERS @@ -0,0 +1 @@ +aurimas@chromium.org diff --git a/ui/android/java/src/org/chromium/ui/gfx/DeviceDisplayInfo.java b/ui/android/java/src/org/chromium/ui/gfx/DeviceDisplayInfo.java index 5f7e1c5882..81c49935a5 100644 --- a/ui/android/java/src/org/chromium/ui/gfx/DeviceDisplayInfo.java +++ b/ui/android/java/src/org/chromium/ui/gfx/DeviceDisplayInfo.java @@ -10,6 +10,7 @@ import android.graphics.Point; import android.os.Build; import android.util.DisplayMetrics; import android.view.Display; +import android.view.Surface; import android.view.WindowManager; import org.chromium.base.CalledByNative; @@ -154,6 +155,30 @@ public class DeviceDisplayInfo { } /** + * @return the screen's rotation angle from its 'natural' orientation. + * Expected values are one of { 0, 90, 180, 270 }. + * See http://developer.android.com/reference/android/view/Display.html#getRotation() + * for more information about Display.getRotation() behavior. + */ + @CalledByNative + private int getRotationDegrees() { + switch (getDisplay().getRotation()) { + case Surface.ROTATION_0: + return 0; + case Surface.ROTATION_90: + return 90; + case Surface.ROTATION_180: + return 180; + case Surface.ROTATION_270: + return 270; + } + + // This should not happen. + assert false; + return 0; + } + + /** * Inform the native implementation to update its cached representation of * the DeviceDisplayInfo values. */ @@ -162,7 +187,7 @@ public class DeviceDisplayInfo { getDisplayHeight(), getDisplayWidth(), getPhysicalDisplayHeight(), getPhysicalDisplayWidth(), getBitsPerPixel(), getBitsPerComponent(), - getDIPScale(), getSmallestDIPWidth()); + getDIPScale(), getSmallestDIPWidth(), getRotationDegrees()); } private Display getDisplay() { @@ -184,6 +209,6 @@ public class DeviceDisplayInfo { int displayHeight, int displayWidth, int physicalDisplayHeight, int physicalDisplayWidth, int bitsPerPixel, int bitsPerComponent, double dipScale, - int smallestDIPWidth); + int smallestDIPWidth, int rotationDegrees); } diff --git a/ui/android/java/src/org/chromium/ui/gfx/ViewConfigurationHelper.java b/ui/android/java/src/org/chromium/ui/gfx/ViewConfigurationHelper.java index ae007b4d3d..e8fc5b996d 100644 --- a/ui/android/java/src/org/chromium/ui/gfx/ViewConfigurationHelper.java +++ b/ui/android/java/src/org/chromium/ui/gfx/ViewConfigurationHelper.java @@ -8,6 +8,7 @@ import android.content.ComponentCallbacks; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; +import android.util.TypedValue; import android.view.ViewConfiguration; import org.chromium.base.CalledByNative; @@ -21,6 +22,12 @@ import org.chromium.ui.R; */ @JNINamespace("gfx") public class ViewConfigurationHelper { + + // Fallback constants when resource lookup fails, see + // ui/android/java/res/values/dimens.xml. + private static final float MIN_SCALING_SPAN_MM = 27.0f; + private static final float MIN_SCALING_TOUCH_MAJOR_DIP = 48.0f; + private final Context mAppContext; private ViewConfiguration mViewConfiguration; @@ -104,8 +111,13 @@ public class ViewConfigurationHelper { int id = res.getIdentifier("config_minScalingSpan", "dimen", "android"); // Fall back to a sensible default if the internal identifier does not exist. if (id == 0) id = R.dimen.config_min_scaling_span; - return res.getDimensionPixelSize(id); - + try { + return res.getDimensionPixelSize(id); + } catch (Resources.NotFoundException e) { + assert false : "MinScalingSpan resource lookup failed."; + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, MIN_SCALING_SPAN_MM, + res.getDisplayMetrics()); + } } @CalledByNative @@ -114,7 +126,13 @@ public class ViewConfigurationHelper { int id = res.getIdentifier("config_minScalingTouchMajor", "dimen", "android"); // Fall back to a sensible default if the internal identifier does not exist. if (id == 0) id = R.dimen.config_min_scaling_touch_major; - return res.getDimensionPixelSize(id); + try { + return res.getDimensionPixelSize(id); + } catch (Resources.NotFoundException e) { + assert false : "MinScalingTouchMajor resource lookup failed."; + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, + MIN_SCALING_TOUCH_MAJOR_DIP, res.getDisplayMetrics()); + } } @CalledByNative diff --git a/ui/app_list/app_list.gyp b/ui/app_list/app_list.gyp index 182d9c656c..13ba5e730b 100644 --- a/ui/app_list/app_list.gyp +++ b/ui/app_list/app_list.gyp @@ -151,7 +151,7 @@ '../events/events.gyp:events', '../views/controls/webview/webview.gyp:webview', '../views/views.gyp:views', - '../wm/wm.gyp:wm_core', + '../wm/wm.gyp:wm', ], }, { # toolkit_views==0 'sources/': [ diff --git a/ui/app_list/app_list_switches.cc b/ui/app_list/app_list_switches.cc index be0e02156f..406519e700 100644 --- a/ui/app_list/app_list_switches.cc +++ b/ui/app_list/app_list_switches.cc @@ -29,7 +29,7 @@ const char kEnableExperimentalAppListPosition[] = const char kEnableSyncAppList[] = "enable-sync-app-list"; bool IsAppListSyncEnabled() { -#if defined(OS_CHROMEOS) +#if defined(TOOLKIT_VIEWS) return !CommandLine::ForCurrentProcess()->HasSwitch(kDisableSyncAppList); #else return CommandLine::ForCurrentProcess()->HasSwitch(kEnableSyncAppList); diff --git a/ui/app_list/views/app_list_item_view.cc b/ui/app_list/views/app_list_item_view.cc index 3ce3e9c6e4..9ab2a5b7d6 100644 --- a/ui/app_list/views/app_list_item_view.cc +++ b/ui/app_list/views/app_list_item_view.cc @@ -147,7 +147,6 @@ void AppListItemView::SetUIState(UIState state) { ui_state_ = state; -#if defined(USE_AURA) switch (ui_state_) { case UI_STATE_NORMAL: title_->SetVisible(!item_->is_installing()); @@ -176,10 +175,9 @@ void AppListItemView::SetUIState(UIState state) { case UI_STATE_DROPPING_IN_FOLDER: break; } +#endif // !OS_WIN SchedulePaint(); -#endif // !OS_WIN -#endif // USE_AURA } void AppListItemView::SetTouchDragging(bool touch_dragging) { diff --git a/ui/app_list/views/apps_grid_view.cc b/ui/app_list/views/apps_grid_view.cc index d5d7078118..470632df05 100644 --- a/ui/app_list/views/apps_grid_view.cc +++ b/ui/app_list/views/apps_grid_view.cc @@ -232,8 +232,7 @@ class SynchronousDrag : public ui::DragSourceWin { SetupExchangeData(&data); // Hide the dragged view because the OS is going to create its own. - const gfx::Size drag_view_size = drag_view_->size(); - drag_view_->SetSize(gfx::Size(0, 0)); + drag_view_->SetVisible(false); // Blocks until the drag is finished. Calls into the ui::DragSourceWin // methods. @@ -243,8 +242,8 @@ class SynchronousDrag : public ui::DragSourceWin { // If |drag_view_| is NULL the drag was ended by some reentrant code. if (drag_view_) { - // Restore the dragged view to its original size. - drag_view_->SetSize(drag_view_size); + // Make the drag view visible again. + drag_view_->SetVisible(true); drag_view_->OnSyncDragEnd(); grid_view_->EndDrag(canceled_ || !IsCursorWithinGridView()); diff --git a/ui/aura/aura.gyp b/ui/aura/aura.gyp index 26be1c3768..a9dae30a79 100644 --- a/ui/aura/aura.gyp +++ b/ui/aura/aura.gyp @@ -143,13 +143,13 @@ '../../skia/skia.gyp:skia', '../../testing/gtest.gyp:gtest', '../base/ui_base.gyp:ui_base', + '../base/ui_base.gyp:ui_base_test_support', '../compositor/compositor.gyp:compositor_test_support', '../events/events.gyp:events', '../events/events.gyp:events_base', '../events/events.gyp:events_test_support', '../gfx/gfx.gyp:gfx', '../gfx/gfx.gyp:gfx_geometry', - '../ui_unittests.gyp:ui_test_support', 'aura', ], 'include_dirs': [ @@ -257,6 +257,7 @@ '../../skia/skia.gyp:skia', '../../testing/gtest.gyp:gtest', '../base/ui_base.gyp:ui_base', + '../base/ui_base.gyp:ui_base_test_support', '../compositor/compositor.gyp:compositor', '../compositor/compositor.gyp:compositor_test_support', '../events/events.gyp:events', @@ -264,7 +265,6 @@ '../gfx/gfx.gyp:gfx', '../gfx/gfx.gyp:gfx_geometry', '../gl/gl.gyp:gl', - '../ui_unittests.gyp:ui_test_support', 'aura_test_support', 'aura', ], diff --git a/ui/aura/demo/demo_main.cc b/ui/aura/demo/demo_main.cc index 21d1dda54f..23262fa791 100644 --- a/ui/aura/demo/demo_main.cc +++ b/ui/aura/demo/demo_main.cc @@ -27,6 +27,10 @@ #include "ui/gfx/x/x11_connection.h" #endif +#if defined(OS_WIN) +#include "ui/gfx/win/dpi.h" +#endif + namespace { // Trivial WindowDelegate implementation that draws a colored background. @@ -112,6 +116,10 @@ int DemoMain() { gfx::GLSurface::InitializeOneOff(); +#if defined(OS_WIN) + gfx::InitDeviceScaleFactor(1.0f); +#endif + // The ContextFactory must exist before any Compositors are created. scoped_ptr<ui::InProcessContextFactory> context_factory( new ui::InProcessContextFactory()); diff --git a/ui/aura/env.cc b/ui/aura/env.cc index 7e25c4c5b2..f701695738 100644 --- a/ui/aura/env.cc +++ b/ui/aura/env.cc @@ -4,14 +4,11 @@ #include "ui/aura/env.h" -#include "base/command_line.h" -#include "base/message_loop/message_pump_dispatcher.h" #include "ui/aura/env_observer.h" #include "ui/aura/input_state_lookup.h" -#include "ui/aura/window.h" #include "ui/compositor/compositor.h" -#include "ui/compositor/compositor_switches.h" #include "ui/events/event_target_iterator.h" +#include "ui/events/platform/platform_event_source.h" namespace aura { @@ -72,6 +69,9 @@ bool Env::IsMouseButtonDown() const { void Env::Init() { ui::Compositor::Initialize(); + + if (!ui::PlatformEventSource::GetInstance()) + event_source_ = ui::PlatformEventSource::CreateDefault(); } void Env::NotifyWindowInitialized(Window* window) { diff --git a/ui/aura/env.h b/ui/aura/env.h index 68576ec51a..1d6c19de3f 100644 --- a/ui/aura/env.h +++ b/ui/aura/env.h @@ -12,6 +12,9 @@ #include "ui/events/event_target.h" #include "ui/gfx/point.h" +namespace ui { +class PlatformEventSource; +} namespace aura { namespace test { @@ -36,6 +39,7 @@ class AURA_EXPORT Env : public ui::EventTarget { void AddObserver(EnvObserver* observer); void RemoveObserver(EnvObserver* observer); + const int mouse_button_flags() const { return mouse_button_flags_; } void set_mouse_button_flags(int mouse_button_flags) { mouse_button_flags_ = mouse_button_flags; } @@ -85,6 +89,7 @@ class AURA_EXPORT Env : public ui::EventTarget { bool is_touch_down_; scoped_ptr<InputStateLookup> input_state_lookup_; + scoped_ptr<ui::PlatformEventSource> event_source_; DISALLOW_COPY_AND_ASSIGN(Env); }; diff --git a/ui/aura/gestures/gesture_recognizer_unittest.cc b/ui/aura/gestures/gesture_recognizer_unittest.cc index 212db84102..e87cffafa4 100644 --- a/ui/aura/gestures/gesture_recognizer_unittest.cc +++ b/ui/aura/gestures/gesture_recognizer_unittest.cc @@ -242,12 +242,8 @@ class GestureEventConsumeDelegate : public TestWindowDelegate { scroll_update_ = true; scroll_x_ += gesture->details().scroll_x(); scroll_y_ += gesture->details().scroll_y(); - scroll_velocity_x_ = gesture->details().velocity_x(); - scroll_velocity_y_ = gesture->details().velocity_y(); scroll_x_ordinal_ += gesture->details().scroll_x_ordinal(); scroll_y_ordinal_ += gesture->details().scroll_y_ordinal(); - scroll_velocity_x_ordinal_ = gesture->details().velocity_x_ordinal(); - scroll_velocity_y_ordinal_ = gesture->details().velocity_y_ordinal(); break; case ui::ET_GESTURE_SCROLL_END: EXPECT_TRUE(velocity_x_ == 0 && velocity_y_ == 0); @@ -1123,14 +1119,8 @@ TEST_F(GestureRecognizerTest, GestureEventScrollPrediction) { tes.SendScrollEvent(event_processor(), 130, 230, kTouchId, delegate.get()); EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE); - EXPECT_GT(delegate->scroll_velocity_x(), 0); - EXPECT_GT(delegate->scroll_velocity_y(), 0); total_scroll.set_x(total_scroll.x() + delegate->scroll_x()); total_scroll.set_y(total_scroll.y() + delegate->scroll_y()); - EXPECT_EQ((int)(29 + delegate->scroll_velocity_x() * prediction_interval), - (int)(total_scroll.x())); - EXPECT_EQ((int)(29 + delegate->scroll_velocity_y() * prediction_interval), - (int)(total_scroll.y())); // Move some more to generate a few more scroll updates. tes.LeapForward(30); @@ -1138,20 +1128,12 @@ TEST_F(GestureRecognizerTest, GestureEventScrollPrediction) { EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE); total_scroll.set_x(total_scroll.x() + delegate->scroll_x()); total_scroll.set_y(total_scroll.y() + delegate->scroll_y()); - EXPECT_EQ((int)(9 + delegate->scroll_velocity_x() * prediction_interval), - (int)(total_scroll.x())); - EXPECT_EQ((int)(10 + delegate->scroll_velocity_y() * prediction_interval), - (int)(total_scroll.y())); tes.LeapForward(30); tes.SendScrollEvent(event_processor(), 140, 215, kTouchId, delegate.get()); EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE); total_scroll.set_x(total_scroll.x() + delegate->scroll_x()); total_scroll.set_y(total_scroll.y() + delegate->scroll_y()); - EXPECT_EQ((int)(39 + delegate->scroll_velocity_x() * prediction_interval), - (int)(total_scroll.x())); - EXPECT_EQ((int)(14 + delegate->scroll_velocity_y() * prediction_interval), - (int)(total_scroll.y())); // Release the touch. This should end the scroll. delegate->Reset(); @@ -1252,10 +1234,6 @@ TEST_F(GestureRecognizerTest, GestureEventHorizontalRailFling) { 100, 10, kTouchId, 1, ui::GestureConfiguration::points_buffered_for_velocity(), delegate.get()); - // The y-velocity during the scroll should be 0 since this is in a horizontal - // rail scroll. - EXPECT_GT(delegate->scroll_velocity_x(), 0); - EXPECT_EQ(0, delegate->scroll_velocity_y()); delegate->Reset(); ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201), @@ -1297,7 +1275,6 @@ TEST_F(GestureRecognizerTest, GestureEventVerticalRailFling) { EXPECT_EQ(0, delegate->scroll_x()); EXPECT_EQ(1, delegate->scroll_x_ordinal()); EXPECT_EQ(0, delegate->scroll_velocity_x()); - EXPECT_GT(delegate->scroll_velocity_x_ordinal(), 0); // Get a high y velocity, while still staying on the rail tes.SendScrollEvents(event_processor(), 1, 6, @@ -1305,7 +1282,6 @@ TEST_F(GestureRecognizerTest, GestureEventVerticalRailFling) { ui::GestureConfiguration::points_buffered_for_velocity(), delegate.get()); EXPECT_EQ(0, delegate->scroll_velocity_x()); - EXPECT_GT(delegate->scroll_velocity_y(), 0); delegate->Reset(); ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 206), @@ -1587,10 +1563,6 @@ TEST_F(GestureRecognizerTest, GestureEventHorizontalRailScroll) { 6, 100, kTouchId, 1, ui::GestureConfiguration::points_buffered_for_velocity(), delegate.get()); - // Since the scroll is not longer railing, the velocity should be set for both - // axis. - EXPECT_GT(delegate->scroll_velocity_x(), 0); - EXPECT_GT(delegate->scroll_velocity_y(), 0); tes.SendScrollEvent(event_processor(), 5, 0, kTouchId, delegate.get()); tes.SendScrollEvent(event_processor(), 10, 5, kTouchId, delegate.get()); @@ -1641,8 +1613,6 @@ TEST_F(GestureRecognizerTest, GestureEventVerticalRailScroll) { 100, 1, kTouchId, 1, ui::GestureConfiguration::points_buffered_for_velocity(), delegate.get()); - EXPECT_GT(delegate->scroll_velocity_x(), 0); - EXPECT_GT(delegate->scroll_velocity_y(), 0); tes.SendScrollEvent(event_processor(), 0, 5, kTouchId, delegate.get()); tes.SendScrollEvent(event_processor(), 5, 10, kTouchId, delegate.get()); @@ -2857,19 +2827,23 @@ TEST_F(GestureRecognizerTest, MultiFingerSwipe) { aura::test::EventGenerator generator(root_window(), window.get()); for (int count = 2; count <= kTouchPoints; ++count) { - generator.GestureMultiFingerScroll(count, points, 15, kSteps, 0, -150); + generator.GestureMultiFingerScroll( + count, points, 1000, kSteps, 0, -11 * kSteps); EXPECT_TRUE(delegate->swipe_up()); delegate->Reset(); - generator.GestureMultiFingerScroll(count, points, 15, kSteps, 0, 150); + generator.GestureMultiFingerScroll( + count, points, 1000, kSteps, 0, 11 * kSteps); EXPECT_TRUE(delegate->swipe_down()); delegate->Reset(); - generator.GestureMultiFingerScroll(count, points, 15, kSteps, -150, 0); + generator.GestureMultiFingerScroll( + count, points, 1000, kSteps, -11 * kSteps, 0); EXPECT_TRUE(delegate->swipe_left()); delegate->Reset(); - generator.GestureMultiFingerScroll(count, points, 15, kSteps, 150, 0); + generator.GestureMultiFingerScroll( + count, points, 1000, kSteps, 11 * kSteps, 0); EXPECT_TRUE(delegate->swipe_right()); delegate->Reset(); } diff --git a/ui/aura/test/aura_test_base.cc b/ui/aura/test/aura_test_base.cc index ec7eb95404..b6aecf9da7 100644 --- a/ui/aura/test/aura_test_base.cc +++ b/ui/aura/test/aura_test_base.cc @@ -69,6 +69,7 @@ void AuraTestBase::SetUp() { ui::GestureConfiguration::set_fling_acceleration_curve_coefficients( 3, 0.8f); ui::GestureConfiguration::set_fling_velocity_cap(15000.0f); + ui::GestureConfiguration::set_min_swipe_speed(10); // The ContextFactory must exist before any Compositors are created. bool enable_pixel_output = false; diff --git a/ui/aura/window.cc b/ui/aura/window.cc index 2c9aab82d8..87874f80a8 100644 --- a/ui/aura/window.cc +++ b/ui/aura/window.cc @@ -517,13 +517,14 @@ void Window::AddChild(Window* child) { gfx::Vector2d offset; aura::Window* ancestor_with_layer = GetAncestorWithLayer(&offset); + + child->parent_ = this; + if (ancestor_with_layer) { offset += child->bounds().OffsetFromOrigin(); child->ReparentLayers(ancestor_with_layer->layer(), offset); } - child->parent_ = this; - children_.push_back(child); if (layout_manager_) layout_manager_->OnWindowAddedToLayout(child); @@ -635,14 +636,6 @@ gfx::NativeCursor Window::GetCursor(const gfx::Point& point) const { return delegate_ ? delegate_->GetCursor(point) : gfx::kNullCursor; } -void Window::SetEventFilter(ui::EventHandler* event_filter) { - if (event_filter_) - RemovePreTargetHandler(event_filter_.get()); - event_filter_.reset(event_filter); - if (event_filter) - AddPreTargetHandler(event_filter); -} - void Window::AddObserver(WindowObserver* observer) { observers_.AddObserver(observer); } diff --git a/ui/aura/window.h b/ui/aura/window.h index 6fbea3609b..4455cd68fa 100644 --- a/ui/aura/window.h +++ b/ui/aura/window.h @@ -147,7 +147,7 @@ class AURA_EXPORT Window : public ui::LayerDelegate, // |aura::client::ScreenPositionClient| interface. gfx::Rect GetBoundsInScreen() const; - virtual void SetTransform(const gfx::Transform& transform); + void SetTransform(const gfx::Transform& transform); // Assigns a LayoutManager to size and place child windows. // The Window takes ownership of the LayoutManager. @@ -220,12 +220,6 @@ class AURA_EXPORT Window : public ui::LayerDelegate, // Returns the cursor for the specified point, in window coordinates. gfx::NativeCursor GetCursor(const gfx::Point& point) const; - // Sets an 'event filter' for the window. An 'event filter' for a Window is - // a pre-target event handler, where the window owns the handler. A window - // can have only one such event filter. Setting a new filter removes and - // destroys any previously installed filter. - void SetEventFilter(ui::EventHandler* event_filter); - // Add/remove observer. void AddObserver(WindowObserver* observer); void RemoveObserver(WindowObserver* observer); @@ -518,7 +512,6 @@ class AURA_EXPORT Window : public ui::LayerDelegate, // Whether layer is initialized as non-opaque. bool transparent_; - scoped_ptr<ui::EventHandler> event_filter_; scoped_ptr<LayoutManager> layout_manager_; scoped_ptr<ui::EventTargeter> targeter_; diff --git a/ui/aura/window_event_dispatcher.cc b/ui/aura/window_event_dispatcher.cc index c566d1b58e..823c8e85fa 100644 --- a/ui/aura/window_event_dispatcher.cc +++ b/ui/aura/window_event_dispatcher.cc @@ -121,7 +121,7 @@ void WindowEventDispatcher::RepostEvent(const ui::LocatedEvent& event) { void WindowEventDispatcher::OnMouseEventsEnableStateChanged(bool enabled) { // Send entered / exited so that visual state can be updated to match // mouse events state. - PostSynthesizeMouseMove(); + PostSynthesizeMouseMove(ui::EF_NONE); // TODO(mazda): Add code to disable mouse events when |enabled| == false. } @@ -379,7 +379,7 @@ void WindowEventDispatcher::UpdateCapture(Window* old_capture, mouse_moved_handler_ = new_capture; } else { // Make sure mouse_moved_handler gets updated. - DispatchDetails details = SynthesizeMouseMoveEvent(); + DispatchDetails details = SynthesizeMouseMoveEvent(ui::EF_NONE); if (details.dispatcher_destroyed) return; } @@ -562,7 +562,7 @@ void WindowEventDispatcher::OnWindowVisibilityChanged(Window* window, return; if (window->ContainsPointInRoot(GetLastMouseLocationInRoot())) - PostSynthesizeMouseMove(); + PostSynthesizeMouseMove(ui::EF_NONE); // Hiding the window releases capture which can implicitly destroy the window // so the window may no longer be valid after this call. @@ -594,7 +594,7 @@ void WindowEventDispatcher::OnWindowBoundsChanged(Window* window, synthesize_mouse_move_ = false; } - if (window->IsVisible()) { + if (window->IsVisible() && !window->ignore_events()) { gfx::Rect old_bounds_in_root = old_bounds, new_bounds_in_root = new_bounds; Window::ConvertRectToTarget(window->parent(), host_->window(), &old_bounds_in_root); @@ -603,7 +603,7 @@ void WindowEventDispatcher::OnWindowBoundsChanged(Window* window, gfx::Point last_mouse_location = GetLastMouseLocationInRoot(); if (old_bounds_in_root.Contains(last_mouse_location) != new_bounds_in_root.Contains(last_mouse_location)) { - PostSynthesizeMouseMove(); + PostSynthesizeMouseMove(Env::GetInstance()->mouse_button_flags()); } } } @@ -669,7 +669,7 @@ ui::EventDispatchDetails WindowEventDispatcher::DispatchHeldEvents() { return dispatch_details; } -void WindowEventDispatcher::PostSynthesizeMouseMove() { +void WindowEventDispatcher::PostSynthesizeMouseMove(int mouse_button_flags) { if (synthesize_mouse_move_) return; synthesize_mouse_move_ = true; @@ -677,18 +677,20 @@ void WindowEventDispatcher::PostSynthesizeMouseMove() { FROM_HERE, base::Bind(base::IgnoreResult( &WindowEventDispatcher::SynthesizeMouseMoveEvent), - held_event_factory_.GetWeakPtr())); + held_event_factory_.GetWeakPtr(), + mouse_button_flags)); } void WindowEventDispatcher::SynthesizeMouseMoveAfterChangeToWindow( Window* window) { if (window->IsVisible() && window->ContainsPointInRoot(GetLastMouseLocationInRoot())) { - PostSynthesizeMouseMove(); + PostSynthesizeMouseMove(ui::EF_NONE); } } -ui::EventDispatchDetails WindowEventDispatcher::SynthesizeMouseMoveEvent() { +ui::EventDispatchDetails WindowEventDispatcher::SynthesizeMouseMoveEvent( + int mouse_button_flags) { DispatchDetails details; if (!synthesize_mouse_move_) return details; @@ -698,11 +700,12 @@ ui::EventDispatchDetails WindowEventDispatcher::SynthesizeMouseMoveEvent() { return details; gfx::Point host_mouse_location = root_mouse_location; host_->ConvertPointToHost(&host_mouse_location); - ui::MouseEvent event(ui::ET_MOUSE_MOVED, - host_mouse_location, - host_mouse_location, - ui::EF_IS_SYNTHESIZED, - 0); + ui::MouseEvent event( + mouse_button_flags ? ui::ET_MOUSE_DRAGGED : ui::ET_MOUSE_MOVED, + host_mouse_location, + host_mouse_location, + ui::EF_IS_SYNTHESIZED | mouse_button_flags, + 0); return OnEventFromSource(&event); } diff --git a/ui/aura/window_event_dispatcher.h b/ui/aura/window_event_dispatcher.h index 6b476b7651..aeae27c606 100644 --- a/ui/aura/window_event_dispatcher.h +++ b/ui/aura/window_event_dispatcher.h @@ -216,11 +216,12 @@ class AURA_EXPORT WindowEventDispatcher : public ui::EventProcessor, // Posts a task to send synthesized mouse move event if there is no a pending // task. - void PostSynthesizeMouseMove(); + void PostSynthesizeMouseMove(int mouse_button_flags); // Creates and dispatches synthesized mouse move event using the // current mouse location. - ui::EventDispatchDetails SynthesizeMouseMoveEvent() WARN_UNUSED_RESULT; + ui::EventDispatchDetails SynthesizeMouseMoveEvent(int mouse_button_flags) + WARN_UNUSED_RESULT; // Calls SynthesizeMouseMove() if |window| is currently visible and contains // the mouse cursor. diff --git a/ui/aura/window_event_dispatcher_unittest.cc b/ui/aura/window_event_dispatcher_unittest.cc index d0985b4398..a7b6d03101 100644 --- a/ui/aura/window_event_dispatcher_unittest.cc +++ b/ui/aura/window_event_dispatcher_unittest.cc @@ -289,10 +289,10 @@ TEST_F(WindowEventDispatcherTest, CanProcessEventsWithinSubtree) { TestEventClient client(root_window()); test::TestWindowDelegate d; - ui::test::TestEventHandler* nonlock_ef = new ui::test::TestEventHandler; - ui::test::TestEventHandler* lock_ef = new ui::test::TestEventHandler; - client.GetNonLockWindow()->SetEventFilter(nonlock_ef); - client.GetLockWindow()->SetEventFilter(lock_ef); + ui::test::TestEventHandler nonlock_ef; + ui::test::TestEventHandler lock_ef; + client.GetNonLockWindow()->AddPreTargetHandler(&nonlock_ef); + client.GetLockWindow()->AddPreTargetHandler(&lock_ef); Window* w1 = test::CreateTestWindowWithBounds(gfx::Rect(10, 10, 20, 20), client.GetNonLockWindow()); @@ -328,12 +328,12 @@ TEST_F(WindowEventDispatcherTest, CanProcessEventsWithinSubtree) { // i.e. never sent to the non-lock container's event filter. test::EventGenerator generator(root_window(), w1); generator.ClickLeftButton(); - EXPECT_EQ(0, nonlock_ef->num_mouse_events()); + EXPECT_EQ(0, nonlock_ef.num_mouse_events()); // Events sent to a window in the lock container will be processed. test::EventGenerator generator3(root_window(), w3.get()); generator3.PressLeftButton(); - EXPECT_EQ(1, lock_ef->num_mouse_events()); + EXPECT_EQ(1, lock_ef.num_mouse_events()); } // Prevent w3 from being deleted by the hierarchy since its delegate is owned @@ -342,18 +342,18 @@ TEST_F(WindowEventDispatcherTest, CanProcessEventsWithinSubtree) { } TEST_F(WindowEventDispatcherTest, IgnoreUnknownKeys) { - ui::test::TestEventHandler* filter = new ConsumeKeyHandler; - root_window()->SetEventFilter(filter); // passes ownership + ConsumeKeyHandler handler; + root_window()->AddPreTargetHandler(&handler); ui::KeyEvent unknown_event(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN, 0, false); DispatchEventUsingWindowDispatcher(&unknown_event); EXPECT_FALSE(unknown_event.handled()); - EXPECT_EQ(0, filter->num_key_events()); + EXPECT_EQ(0, handler.num_key_events()); ui::KeyEvent known_event(ui::ET_KEY_PRESSED, ui::VKEY_A, 0, false); DispatchEventUsingWindowDispatcher(&known_event); EXPECT_TRUE(known_event.handled()); - EXPECT_EQ(1, filter->num_key_events()); + EXPECT_EQ(1, handler.num_key_events()); } TEST_F(WindowEventDispatcherTest, NoDelegateWindowReceivesKeyEvents) { @@ -374,28 +374,28 @@ TEST_F(WindowEventDispatcherTest, NoDelegateWindowReceivesKeyEvents) { // Tests that touch-events that are beyond the bounds of the root-window do get // propagated to the event filters correctly with the root as the target. TEST_F(WindowEventDispatcherTest, TouchEventsOutsideBounds) { - ui::test::TestEventHandler* filter = new ui::test::TestEventHandler; - root_window()->SetEventFilter(filter); // passes ownership + ui::test::TestEventHandler handler; + root_window()->AddPreTargetHandler(&handler); gfx::Point position = root_window()->bounds().origin(); position.Offset(-10, -10); ui::TouchEvent press(ui::ET_TOUCH_PRESSED, position, 0, base::TimeDelta()); DispatchEventUsingWindowDispatcher(&press); - EXPECT_EQ(1, filter->num_touch_events()); + EXPECT_EQ(1, handler.num_touch_events()); position = root_window()->bounds().origin(); position.Offset(root_window()->bounds().width() + 10, root_window()->bounds().height() + 10); ui::TouchEvent release(ui::ET_TOUCH_RELEASED, position, 0, base::TimeDelta()); DispatchEventUsingWindowDispatcher(&release); - EXPECT_EQ(2, filter->num_touch_events()); + EXPECT_EQ(2, handler.num_touch_events()); } // Tests that scroll events are dispatched correctly. TEST_F(WindowEventDispatcherTest, ScrollEventDispatch) { base::TimeDelta now = ui::EventTimeForNow(); - ui::test::TestEventHandler* filter = new ui::test::TestEventHandler; - root_window()->SetEventFilter(filter); + ui::test::TestEventHandler handler; + root_window()->AddPreTargetHandler(&handler); test::TestWindowDelegate delegate; scoped_ptr<Window> w1(CreateNormalWindow(1, root_window(), &delegate)); @@ -410,7 +410,7 @@ TEST_F(WindowEventDispatcherTest, ScrollEventDispatch) { 0, -10, 2); DispatchEventUsingWindowDispatcher(&scroll1); - EXPECT_EQ(1, filter->num_scroll_events()); + EXPECT_EQ(1, handler.num_scroll_events()); // Scroll event on a window should be dispatched properly. ui::ScrollEvent scroll2(ui::ET_SCROLL, @@ -421,7 +421,8 @@ TEST_F(WindowEventDispatcherTest, ScrollEventDispatch) { -10, 0, 2); DispatchEventUsingWindowDispatcher(&scroll2); - EXPECT_EQ(2, filter->num_scroll_events()); + EXPECT_EQ(2, handler.num_scroll_events()); + root_window()->RemovePreTargetHandler(&handler); } namespace { @@ -431,6 +432,7 @@ class EventFilterRecorder : public ui::EventHandler { public: typedef std::vector<ui::EventType> Events; typedef std::vector<gfx::Point> EventLocations; + typedef std::vector<int> EventFlags; EventFilterRecorder() : wait_until_event_(ui::ET_UNKNOWN) { @@ -441,6 +443,7 @@ class EventFilterRecorder : public ui::EventHandler { const EventLocations& mouse_locations() const { return mouse_locations_; } gfx::Point mouse_location(int i) const { return mouse_locations_[i]; } const EventLocations& touch_locations() const { return touch_locations_; } + const EventFlags& mouse_event_flags() const { return mouse_event_flags_; } void WaitUntilReceivedEvent(ui::EventType type) { wait_until_event_ = type; @@ -458,6 +461,7 @@ class EventFilterRecorder : public ui::EventHandler { events_.clear(); mouse_locations_.clear(); touch_locations_.clear(); + mouse_event_flags_.clear(); } // ui::EventHandler overrides: @@ -472,6 +476,7 @@ class EventFilterRecorder : public ui::EventHandler { virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { mouse_locations_.push_back(event->location()); + mouse_event_flags_.push_back(event->flags()); } virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE { @@ -485,6 +490,7 @@ class EventFilterRecorder : public ui::EventHandler { Events events_; EventLocations mouse_locations_; EventLocations touch_locations_; + EventFlags mouse_event_flags_; DISALLOW_COPY_AND_ASSIGN(EventFilterRecorder); }; @@ -585,10 +591,10 @@ TEST_F(WindowEventDispatcherTest, RepostTargetsCaptureWindow) { // over |window| and verify |window| gets it (|window| gets it because it has // capture). EXPECT_FALSE(Env::GetInstance()->IsMouseButtonDown()); + EventFilterRecorder recorder; scoped_ptr<Window> window(CreateNormalWindow(1, root_window(), NULL)); window->SetBounds(gfx::Rect(20, 20, 40, 30)); - EventFilterRecorder* recorder = new EventFilterRecorder; - window->SetEventFilter(recorder); // Takes ownership. + window->AddPreTargetHandler(&recorder); window->SetCapture(); const ui::MouseEvent press_event( ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), @@ -596,13 +602,13 @@ TEST_F(WindowEventDispatcherTest, RepostTargetsCaptureWindow) { host()->dispatcher()->RepostEvent(press_event); RunAllPendingInMessageLoop(); // Necessitated by RepostEvent(). // Mouse moves/enters may be generated. We only care about a pressed. - EXPECT_TRUE(EventTypesToString(recorder->events()).find("MOUSE_PRESSED") != - std::string::npos) << EventTypesToString(recorder->events()); + EXPECT_TRUE(EventTypesToString(recorder.events()).find("MOUSE_PRESSED") != + std::string::npos) << EventTypesToString(recorder.events()); } TEST_F(WindowEventDispatcherTest, MouseMovesHeld) { - EventFilterRecorder* filter = new EventFilterRecorder; - root_window()->SetEventFilter(filter); // passes ownership + EventFilterRecorder recorder; + root_window()->AddPreTargetHandler(&recorder); test::TestWindowDelegate delegate; scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( @@ -612,7 +618,7 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) { gfx::Point(0, 0), 0, 0); DispatchEventUsingWindowDispatcher(&mouse_move_event); // Discard MOUSE_ENTER. - filter->Reset(); + recorder.Reset(); host()->dispatcher()->HoldPointerMoves(); @@ -620,7 +626,7 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) { ui::MouseEvent mouse_dragged_event(ui::ET_MOUSE_DRAGGED, gfx::Point(0, 0), gfx::Point(0, 0), 0, 0); DispatchEventUsingWindowDispatcher(&mouse_dragged_event); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); // Check that we do dispatch the held MOUSE_DRAGGED event before another type // of event. @@ -628,28 +634,28 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) { gfx::Point(0, 0), 0, 0); DispatchEventUsingWindowDispatcher(&mouse_pressed_event); EXPECT_EQ("MOUSE_DRAGGED MOUSE_PRESSED", - EventTypesToString(filter->events())); - filter->Reset(); + EventTypesToString(recorder.events())); + recorder.Reset(); // Check that we coalesce held MOUSE_DRAGGED events. ui::MouseEvent mouse_dragged_event2(ui::ET_MOUSE_DRAGGED, gfx::Point(10, 10), gfx::Point(10, 10), 0, 0); DispatchEventUsingWindowDispatcher(&mouse_dragged_event); DispatchEventUsingWindowDispatcher(&mouse_dragged_event2); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); DispatchEventUsingWindowDispatcher(&mouse_pressed_event); EXPECT_EQ("MOUSE_DRAGGED MOUSE_PRESSED", - EventTypesToString(filter->events())); - filter->Reset(); + EventTypesToString(recorder.events())); + recorder.Reset(); // Check that on ReleasePointerMoves, held events are not dispatched // immediately, but posted instead. DispatchEventUsingWindowDispatcher(&mouse_dragged_event); host()->dispatcher()->ReleasePointerMoves(); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); RunAllPendingInMessageLoop(); - EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(filter->events())); - filter->Reset(); + EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(recorder.events())); + recorder.Reset(); // However if another message comes in before the dispatch of the posted // event, check that the posted event is dispatched before this new event. @@ -658,10 +664,10 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) { host()->dispatcher()->ReleasePointerMoves(); DispatchEventUsingWindowDispatcher(&mouse_pressed_event); EXPECT_EQ("MOUSE_DRAGGED MOUSE_PRESSED", - EventTypesToString(filter->events())); - filter->Reset(); + EventTypesToString(recorder.events())); + recorder.Reset(); RunAllPendingInMessageLoop(); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); // Check that if the other message is another MOUSE_DRAGGED, we still coalesce // them. @@ -669,10 +675,10 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) { DispatchEventUsingWindowDispatcher(&mouse_dragged_event); host()->dispatcher()->ReleasePointerMoves(); DispatchEventUsingWindowDispatcher(&mouse_dragged_event2); - EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(filter->events())); - filter->Reset(); + EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(recorder.events())); + recorder.Reset(); RunAllPendingInMessageLoop(); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); // Check that synthetic mouse move event has a right location when issued // while holding pointer moves. @@ -684,17 +690,18 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) { window->SetBounds(gfx::Rect(15, 15, 80, 80)); DispatchEventUsingWindowDispatcher(&mouse_dragged_event3); RunAllPendingInMessageLoop(); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); host()->dispatcher()->ReleasePointerMoves(); RunAllPendingInMessageLoop(); - EXPECT_EQ("MOUSE_MOVED", EventTypesToString(filter->events())); - EXPECT_EQ(gfx::Point(13, 13), filter->mouse_location(0)); - filter->Reset(); + EXPECT_EQ("MOUSE_MOVED", EventTypesToString(recorder.events())); + EXPECT_EQ(gfx::Point(13, 13), recorder.mouse_location(0)); + recorder.Reset(); + root_window()->RemovePreTargetHandler(&recorder); } TEST_F(WindowEventDispatcherTest, TouchMovesHeld) { - EventFilterRecorder* filter = new EventFilterRecorder; - root_window()->SetEventFilter(filter); // passes ownership + EventFilterRecorder recorder; + root_window()->AddPreTargetHandler(&recorder); test::TestWindowDelegate delegate; scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( @@ -707,8 +714,8 @@ TEST_F(WindowEventDispatcherTest, TouchMovesHeld) { ui::TouchEvent touch_pressed_event(ui::ET_TOUCH_PRESSED, touch_location, 0, base::TimeDelta()); DispatchEventUsingWindowDispatcher(&touch_pressed_event); - filter->WaitUntilReceivedEvent(ui::ET_GESTURE_SHOW_PRESS); - filter->Reset(); + recorder.WaitUntilReceivedEvent(ui::ET_GESTURE_SHOW_PRESS); + recorder.Reset(); host()->dispatcher()->HoldPointerMoves(); @@ -716,32 +723,32 @@ TEST_F(WindowEventDispatcherTest, TouchMovesHeld) { ui::TouchEvent touch_moved_event(ui::ET_TOUCH_MOVED, touch_location, 0, base::TimeDelta()); DispatchEventUsingWindowDispatcher(&touch_moved_event); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); // Check that on ReleasePointerMoves, held events are not dispatched // immediately, but posted instead. DispatchEventUsingWindowDispatcher(&touch_moved_event); host()->dispatcher()->ReleasePointerMoves(); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); RunAllPendingInMessageLoop(); - EXPECT_EQ("TOUCH_MOVED", EventTypesToString(filter->events())); - filter->Reset(); + EXPECT_EQ("TOUCH_MOVED", EventTypesToString(recorder.events())); + recorder.Reset(); // If another touch event occurs then the held touch should be dispatched // immediately before it. ui::TouchEvent touch_released_event(ui::ET_TOUCH_RELEASED, touch_location, 0, base::TimeDelta()); - filter->Reset(); + recorder.Reset(); host()->dispatcher()->HoldPointerMoves(); DispatchEventUsingWindowDispatcher(&touch_moved_event); DispatchEventUsingWindowDispatcher(&touch_released_event); EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_TAP_CANCEL GESTURE_END", - EventTypesToString(filter->events())); - filter->Reset(); + EventTypesToString(recorder.events())); + recorder.Reset(); host()->dispatcher()->ReleasePointerMoves(); RunAllPendingInMessageLoop(); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); } class HoldPointerOnScrollHandler : public ui::test::TestEventHandler { @@ -777,10 +784,10 @@ class HoldPointerOnScrollHandler : public ui::test::TestEventHandler { // Tests that touch-move events don't contribute to an in-progress scroll // gesture if touch-move events are being held by the dispatcher. TEST_F(WindowEventDispatcherTest, TouchMovesHeldOnScroll) { - EventFilterRecorder* filter = new EventFilterRecorder; - root_window()->SetEventFilter(filter); + EventFilterRecorder recorder; + root_window()->AddPreTargetHandler(&recorder); test::TestWindowDelegate delegate; - HoldPointerOnScrollHandler handler(host()->dispatcher(), filter); + HoldPointerOnScrollHandler handler(host()->dispatcher(), &recorder); scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( &delegate, 1, gfx::Rect(50, 50, 100, 100), root_window())); window->AddPreTargetHandler(&handler); @@ -795,21 +802,21 @@ TEST_F(WindowEventDispatcherTest, TouchMovesHeldOnScroll) { // touch-release), the held touch-move event will have been dispatched first, // along with the subsequent events (i.e. touch-release, scroll-end, and // gesture-end). - const EventFilterRecorder::Events& events = filter->events(); + const EventFilterRecorder::Events& events = recorder.events(); EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_SCROLL_END GESTURE_END", EventTypesToString(events)); - ASSERT_EQ(2u, filter->touch_locations().size()); + ASSERT_EQ(2u, recorder.touch_locations().size()); EXPECT_EQ(gfx::Point(-40, 10).ToString(), - filter->touch_locations()[0].ToString()); + recorder.touch_locations()[0].ToString()); EXPECT_EQ(gfx::Point(-40, 10).ToString(), - filter->touch_locations()[1].ToString()); + recorder.touch_locations()[1].ToString()); } // Tests that synthetic mouse events are ignored when mouse // events are disabled. TEST_F(WindowEventDispatcherTest, DispatchSyntheticMouseEvents) { - EventFilterRecorder* filter = new EventFilterRecorder; - root_window()->SetEventFilter(filter); // passes ownership + EventFilterRecorder recorder; + root_window()->AddPreTargetHandler(&recorder); test::TestWindowDelegate delegate; scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( @@ -823,27 +830,113 @@ TEST_F(WindowEventDispatcherTest, DispatchSyntheticMouseEvents) { ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, gfx::Point(10, 10), gfx::Point(10, 10), 0, 0); DispatchEventUsingWindowDispatcher(&mouse1); - EXPECT_FALSE(filter->events().empty()); - filter->Reset(); + EXPECT_FALSE(recorder.events().empty()); + recorder.Reset(); // Dispatch a synthetic mouse event when mouse events are enabled. ui::MouseEvent mouse2(ui::ET_MOUSE_MOVED, gfx::Point(10, 10), gfx::Point(10, 10), ui::EF_IS_SYNTHESIZED, 0); DispatchEventUsingWindowDispatcher(&mouse2); - EXPECT_FALSE(filter->events().empty()); - filter->Reset(); + EXPECT_FALSE(recorder.events().empty()); + recorder.Reset(); // Dispatch a synthetic mouse event when mouse events are disabled. cursor_client.DisableMouseEvents(); DispatchEventUsingWindowDispatcher(&mouse2); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); + root_window()->RemovePreTargetHandler(&recorder); +} + +// Tests synthetic mouse events generated when window bounds changes such that +// the cursor previously outside the window becomes inside, or vice versa. +// - Synthesize MOVED events when the mouse button is up; +// - Synthesize DRAGGED events with correct flags when mouse button is down; +// - Do not synthesize events if the window ignores events or is invisible. +TEST_F(WindowEventDispatcherTest, SynthesizeMouseEventsOnWindowBoundsChanged) { + test::TestWindowDelegate delegate; + scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( + &delegate, 1234, gfx::Rect(5, 5, 100, 100), root_window())); + window->Show(); + window->SetCapture(); + + EventFilterRecorder recorder; + window->AddPreTargetHandler(&recorder); + + // Dispatch a non-synthetic mouse event to place cursor inside window bounds. + ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(10, 10), + gfx::Point(10, 10), 0, 0); + DispatchEventUsingWindowDispatcher(&mouse); + EXPECT_FALSE(recorder.events().empty()); + recorder.Reset(); + + // Update the window bounds so that cursor is now outside the window. + // This should trigger a synthetic MOVED event. + gfx::Rect bounds1(20, 20, 100, 100); + window->SetBounds(bounds1); + RunAllPendingInMessageLoop(); + ASSERT_FALSE(recorder.events().empty()); + ASSERT_FALSE(recorder.mouse_event_flags().empty()); + EXPECT_EQ(ui::ET_MOUSE_MOVED, recorder.events().back()); + EXPECT_EQ(ui::EF_IS_SYNTHESIZED, recorder.mouse_event_flags().back()); + recorder.Reset(); + + // Hold down the LEFT mouse button. + Env::GetInstance()->set_mouse_button_flags(ui::EF_LEFT_MOUSE_BUTTON); + + // Update the window bounds so that cursor is back inside the window. + // This should trigger a synthetic DRAGGED event with the left button flag. + gfx::Rect bounds2(5, 5, 100, 100); + window->SetBounds(bounds2); + RunAllPendingInMessageLoop(); + ASSERT_FALSE(recorder.events().empty()); + ASSERT_FALSE(recorder.mouse_event_flags().empty()); + EXPECT_EQ(ui::ET_MOUSE_DRAGGED, recorder.events().back()); + EXPECT_EQ(ui::EF_IS_SYNTHESIZED | ui::EF_LEFT_MOUSE_BUTTON, + recorder.mouse_event_flags().back()); + recorder.Reset(); + + // Hold down the RIGHT mouse button. + Env::GetInstance()->set_mouse_button_flags(ui::EF_RIGHT_MOUSE_BUTTON); + + // Update the window bounds so that cursor is outside the window. + // This should trigger a synthetic DRAGGED event with the right button flag. + window->SetBounds(bounds1); + RunAllPendingInMessageLoop(); + ASSERT_FALSE(recorder.events().empty()); + ASSERT_FALSE(recorder.mouse_event_flags().empty()); + EXPECT_EQ(ui::ET_MOUSE_DRAGGED, recorder.events().back()); + EXPECT_EQ(ui::EF_IS_SYNTHESIZED | ui::EF_RIGHT_MOUSE_BUTTON, + recorder.mouse_event_flags().back()); + recorder.Reset(); + + // Release mouse button and set window to ignore events. + Env::GetInstance()->set_mouse_button_flags(0); + window->set_ignore_events(true); + + // Update the window bounds so that cursor is back inside the window. + // This should not trigger a synthetic event. + window->SetBounds(bounds2); + RunAllPendingInMessageLoop(); + EXPECT_TRUE(recorder.events().empty()); + recorder.Reset(); + + // Set window to accept events but invisible. + window->set_ignore_events(false); + window->Hide(); + recorder.Reset(); + + // Update the window bounds so that cursor is outside the window. + // This should not trigger a synthetic event. + window->SetBounds(bounds1); + RunAllPendingInMessageLoop(); + EXPECT_TRUE(recorder.events().empty()); } // Tests that a mouse exit is dispatched to the last known cursor location // when the cursor becomes invisible. TEST_F(WindowEventDispatcherTest, DispatchMouseExitWhenCursorHidden) { - EventFilterRecorder* filter = new EventFilterRecorder; - root_window()->SetEventFilter(filter); // passes ownership + EventFilterRecorder recorder; + root_window()->AddPreTargetHandler(&recorder); test::TestWindowDelegate delegate; gfx::Point window_origin(7, 18); @@ -856,30 +949,31 @@ TEST_F(WindowEventDispatcherTest, DispatchMouseExitWhenCursorHidden) { gfx::Point mouse_location(gfx::Point(15, 25)); ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, mouse_location, mouse_location, 0, 0); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); DispatchEventUsingWindowDispatcher(&mouse1); - EXPECT_FALSE(filter->events().empty()); - filter->Reset(); + EXPECT_FALSE(recorder.events().empty()); + recorder.Reset(); // Hide the cursor and verify a mouse exit was dispatched. host()->OnCursorVisibilityChanged(false); - EXPECT_FALSE(filter->events().empty()); - EXPECT_EQ("MOUSE_EXITED", EventTypesToString(filter->events())); + EXPECT_FALSE(recorder.events().empty()); + EXPECT_EQ("MOUSE_EXITED", EventTypesToString(recorder.events())); // Verify the mouse exit was dispatched at the correct location // (in the correct coordinate space). int translated_x = mouse_location.x() - window_origin.x(); int translated_y = mouse_location.y() - window_origin.y(); gfx::Point translated_point(translated_x, translated_y); - EXPECT_EQ(filter->mouse_location(0).ToString(), translated_point.ToString()); + EXPECT_EQ(recorder.mouse_location(0).ToString(), translated_point.ToString()); + root_window()->RemovePreTargetHandler(&recorder); } // Tests that a synthetic mouse exit is dispatched to the last known cursor // location after mouse events are disabled on the cursor client. TEST_F(WindowEventDispatcherTest, DispatchSyntheticMouseExitAfterMouseEventsDisabled) { - EventFilterRecorder* filter = new EventFilterRecorder; - root_window()->SetEventFilter(filter); // passes ownership + EventFilterRecorder recorder; + root_window()->AddPreTargetHandler(&recorder); test::TestWindowDelegate delegate; gfx::Point window_origin(7, 18); @@ -892,10 +986,10 @@ TEST_F(WindowEventDispatcherTest, gfx::Point mouse_location(gfx::Point(15, 25)); ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, mouse_location, mouse_location, 0, 0); - EXPECT_TRUE(filter->events().empty()); + EXPECT_TRUE(recorder.events().empty()); DispatchEventUsingWindowDispatcher(&mouse1); - EXPECT_FALSE(filter->events().empty()); - filter->Reset(); + EXPECT_FALSE(recorder.events().empty()); + recorder.Reset(); test::TestCursorClient cursor_client(root_window()); cursor_client.DisableMouseEvents(); @@ -905,17 +999,18 @@ TEST_F(WindowEventDispatcherTest, gfx::Point(150, 150), ui::EF_IS_SYNTHESIZED, 0); DispatchEventUsingWindowDispatcher(&mouse2); - EXPECT_FALSE(filter->events().empty()); + EXPECT_FALSE(recorder.events().empty()); // We get the mouse exited event twice in our filter. Once during the // predispatch phase and during the actual dispatch. - EXPECT_EQ("MOUSE_EXITED MOUSE_EXITED", EventTypesToString(filter->events())); + EXPECT_EQ("MOUSE_EXITED MOUSE_EXITED", EventTypesToString(recorder.events())); // Verify the mouse exit was dispatched at the correct location // (in the correct coordinate space). int translated_x = mouse_exit_location.x() - window_origin.x(); int translated_y = mouse_exit_location.y() - window_origin.y(); gfx::Point translated_point(translated_x, translated_y); - EXPECT_EQ(filter->mouse_location(0).ToString(), translated_point.ToString()); + EXPECT_EQ(recorder.mouse_location(0).ToString(), translated_point.ToString()); + root_window()->RemovePreTargetHandler(&recorder); } class DeletingEventFilter : public ui::EventHandler { @@ -989,8 +1084,8 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringDispatch) { DeletingWindowDelegate d11; Window* w11 = CreateNormalWindow(11, w1.get(), &d11); WindowTracker tracker; - DeletingEventFilter* w1_filter = new DeletingEventFilter; - w1->SetEventFilter(w1_filter); + DeletingEventFilter w1_filter; + w1->AddPreTargetHandler(&w1_filter); client::GetFocusClient(w1.get())->FocusWindow(w11); test::EventGenerator generator(root_window(), w11); @@ -1005,7 +1100,7 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringDispatch) { generator.ReleaseLeftButton(); // Delegate deletes w11. This will prevent the post-handle step from applying. - w1_filter->Reset(false); + w1_filter.Reset(false); d11.Reset(w11, true); generator.PressKey(ui::VKEY_A, 0); EXPECT_FALSE(tracker.Contains(w11)); @@ -1014,7 +1109,7 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringDispatch) { // Pre-handle step deletes w11. This will prevent the delegate and the post- // handle steps from applying. w11 = CreateNormalWindow(11, w1.get(), &d11); - w1_filter->Reset(true); + w1_filter.Reset(true); d11.Reset(w11, false); generator.PressLeftButton(); EXPECT_FALSE(tracker.Contains(w11)); @@ -1124,8 +1219,8 @@ TEST_F(WindowEventDispatcherTest, GestureEndDeliveredAfterNestedGestures) { // Tests whether we can repost the Tap down gesture event. TEST_F(WindowEventDispatcherTest, RepostTapdownGestureTest) { - EventFilterRecorder* filter = new EventFilterRecorder; - root_window()->SetEventFilter(filter); // passes ownership + EventFilterRecorder recorder; + root_window()->AddPreTargetHandler(&recorder); test::TestWindowDelegate delegate; scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( @@ -1144,9 +1239,10 @@ TEST_F(WindowEventDispatcherTest, RepostTapdownGestureTest) { host()->dispatcher()->RepostEvent(event); RunAllPendingInMessageLoop(); // TODO(rbyers): Currently disabled - crbug.com/170987 - EXPECT_FALSE(EventTypesToString(filter->events()).find("GESTURE_TAP_DOWN") != + EXPECT_FALSE(EventTypesToString(recorder.events()).find("GESTURE_TAP_DOWN") != std::string::npos); - filter->Reset(); + recorder.Reset(); + root_window()->RemovePreTargetHandler(&recorder); } // This class inherits from the EventFilterRecorder class which provides a @@ -1227,9 +1323,9 @@ TEST_F(WindowEventDispatcherTest, GestureRepostEventOrder) { scoped_ptr<aura::Window> repost_source(CreateTestWindowWithDelegate( &delegate, 1, gfx::Rect(0, 0, 50, 50), root_window())); - RepostGestureEventRecorder* repost_event_recorder = - new RepostGestureEventRecorder(repost_source.get(), repost_target.get()); - root_window()->SetEventFilter(repost_event_recorder); // passes ownership + RepostGestureEventRecorder repost_event_recorder(repost_source.get(), + repost_target.get()); + root_window()->AddPreTargetHandler(&repost_event_recorder); // Generate a tap down gesture for the repost_source. This will be reposted // to repost_target. @@ -1246,8 +1342,8 @@ TEST_F(WindowEventDispatcherTest, GestureRepostEventOrder) { RunAllPendingInMessageLoop(); int tap_down_count = 0; - for (size_t i = 0; i < repost_event_recorder->events().size(); ++i) { - if (repost_event_recorder->events()[i] == ui::ET_GESTURE_TAP_DOWN) + for (size_t i = 0; i < repost_event_recorder.events().size(); ++i) { + if (repost_event_recorder.events()[i] == ui::ET_GESTURE_TAP_DOWN) ++tap_down_count; } @@ -1257,7 +1353,8 @@ TEST_F(WindowEventDispatcherTest, GestureRepostEventOrder) { EXPECT_EQ(1, tap_down_count); EXPECT_EQ(kExpectedTargetEvents, - EventTypesToString(repost_event_recorder->events())); + EventTypesToString(repost_event_recorder.events())); + root_window()->RemovePreTargetHandler(&repost_event_recorder); } class OnMouseExitDeletingEventFilter : public EventFilterRecorder { @@ -1291,9 +1388,8 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringMouseMovedDispatch) { // Create window 1 and set its event filter. Window 1 will take ownership of // the event filter. scoped_ptr<Window> w1(CreateNormalWindow(1, root_window(), NULL)); - OnMouseExitDeletingEventFilter* w1_filter = - new OnMouseExitDeletingEventFilter(); - w1->SetEventFilter(w1_filter); + OnMouseExitDeletingEventFilter w1_filter; + w1->AddPreTargetHandler(&w1_filter); w1->SetBounds(gfx::Rect(20, 20, 60, 60)); EXPECT_EQ(NULL, host()->dispatcher()->mouse_moved_handler()); @@ -1311,7 +1407,7 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringMouseMovedDispatch) { // Set window 2 as the window that is to be deleted when a mouse-exited event // happens on window 1. - w1_filter->set_window_to_delete(w2); + w1_filter.set_window_to_delete(w2); // Move mosue over window 2. This should generate a mouse-exited event for // window 1 resulting in deletion of window 2. The original mouse-moved event @@ -1322,7 +1418,7 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringMouseMovedDispatch) { // Check events received by window 1. EXPECT_EQ("MOUSE_ENTERED MOUSE_MOVED MOUSE_EXITED", - EventTypesToString(w1_filter->events())); + EventTypesToString(w1_filter.events())); } namespace { @@ -1485,8 +1581,8 @@ TEST_F(WindowEventDispatcherTest, DeleteHostFromHeldMouseEvent) { } TEST_F(WindowEventDispatcherTest, WindowHideCancelsActiveTouches) { - EventFilterRecorder* filter = new EventFilterRecorder; - root_window()->SetEventFilter(filter); // passes ownership + EventFilterRecorder recorder; + root_window()->AddPreTargetHandler(&recorder); test::TestWindowDelegate delegate; scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( @@ -1497,17 +1593,18 @@ TEST_F(WindowEventDispatcherTest, WindowHideCancelsActiveTouches) { DispatchEventUsingWindowDispatcher(&press); EXPECT_EQ("TOUCH_PRESSED GESTURE_BEGIN GESTURE_TAP_DOWN", - EventTypesToString(filter->GetAndResetEvents())); + EventTypesToString(recorder.GetAndResetEvents())); window->Hide(); EXPECT_EQ("TOUCH_CANCELLED GESTURE_TAP_CANCEL GESTURE_END", - EventTypesToString(filter->events())); + EventTypesToString(recorder.events())); + root_window()->RemovePreTargetHandler(&recorder); } TEST_F(WindowEventDispatcherTest, WindowHideCancelsActiveGestures) { - EventFilterRecorder* filter = new EventFilterRecorder; - root_window()->SetEventFilter(filter); // passes ownership + EventFilterRecorder recorder; + root_window()->AddPreTargetHandler(&recorder); test::TestWindowDelegate delegate; scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( @@ -1527,29 +1624,30 @@ TEST_F(WindowEventDispatcherTest, WindowHideCancelsActiveGestures) { EXPECT_EQ("TOUCH_PRESSED GESTURE_BEGIN GESTURE_TAP_DOWN TOUCH_MOVED " "GESTURE_TAP_CANCEL GESTURE_SCROLL_BEGIN GESTURE_SCROLL_UPDATE " "TOUCH_PRESSED GESTURE_BEGIN GESTURE_PINCH_BEGIN", - EventTypesToString(filter->GetAndResetEvents())); + EventTypesToString(recorder.GetAndResetEvents())); window->Hide(); EXPECT_EQ("TOUCH_CANCELLED GESTURE_PINCH_END GESTURE_END TOUCH_CANCELLED " "GESTURE_SCROLL_END GESTURE_END", - EventTypesToString(filter->events())); + EventTypesToString(recorder.events())); + root_window()->RemovePreTargetHandler(&recorder); } // Places two windows side by side. Presses down on one window, and starts a // scroll. Sets capture on the other window and ensures that the "ending" events // aren't sent to the window which gained capture. TEST_F(WindowEventDispatcherTest, EndingEventDoesntRetarget) { + EventFilterRecorder recorder1; + EventFilterRecorder recorder2; scoped_ptr<Window> window1(CreateNormalWindow(1, root_window(), NULL)); window1->SetBounds(gfx::Rect(0, 0, 40, 40)); scoped_ptr<Window> window2(CreateNormalWindow(2, root_window(), NULL)); window2->SetBounds(gfx::Rect(40, 0, 40, 40)); - EventFilterRecorder* filter1 = new EventFilterRecorder(); - window1->SetEventFilter(filter1); // passes ownership - EventFilterRecorder* filter2 = new EventFilterRecorder(); - window2->SetEventFilter(filter2); // passes ownership + window1->AddPreTargetHandler(&recorder1); + window2->AddPreTargetHandler(&recorder2); gfx::Point position = window1->bounds().origin(); ui::TouchEvent press(ui::ET_TOUCH_PRESSED, position, 0, base::TimeDelta()); @@ -1564,9 +1662,9 @@ TEST_F(WindowEventDispatcherTest, EndingEventDoesntRetarget) { EXPECT_EQ("TOUCH_PRESSED GESTURE_BEGIN GESTURE_TAP_DOWN TOUCH_MOVED " "GESTURE_TAP_CANCEL GESTURE_SCROLL_BEGIN GESTURE_SCROLL_UPDATE " "TOUCH_CANCELLED GESTURE_SCROLL_END GESTURE_END", - EventTypesToString(filter1->events())); + EventTypesToString(recorder1.events())); - EXPECT_TRUE(filter2->events().empty()); + EXPECT_TRUE(recorder2.events().empty()); } namespace { @@ -1763,10 +1861,10 @@ TEST_F(WindowEventDispatcherTestInHighDPI, EventLocationTransform) { } TEST_F(WindowEventDispatcherTestInHighDPI, TouchMovesHeldOnScroll) { - EventFilterRecorder* filter = new EventFilterRecorder; - root_window()->SetEventFilter(filter); + EventFilterRecorder recorder; + root_window()->AddPreTargetHandler(&recorder); test::TestWindowDelegate delegate; - HoldPointerOnScrollHandler handler(host()->dispatcher(), filter); + HoldPointerOnScrollHandler handler(host()->dispatcher(), &recorder); scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( &delegate, 1, gfx::Rect(50, 50, 100, 100), root_window())); window->AddPreTargetHandler(&handler); @@ -1781,14 +1879,14 @@ TEST_F(WindowEventDispatcherTestInHighDPI, TouchMovesHeldOnScroll) { // touch-release), the held touch-move event will have been dispatched first, // along with the subsequent events (i.e. touch-release, scroll-end, and // gesture-end). - const EventFilterRecorder::Events& events = filter->events(); + const EventFilterRecorder::Events& events = recorder.events(); EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_SCROLL_END GESTURE_END", EventTypesToString(events)); - ASSERT_EQ(2u, filter->touch_locations().size()); + ASSERT_EQ(2u, recorder.touch_locations().size()); EXPECT_EQ(gfx::Point(-40, 10).ToString(), - filter->touch_locations()[0].ToString()); + recorder.touch_locations()[0].ToString()); EXPECT_EQ(gfx::Point(-40, 10).ToString(), - filter->touch_locations()[1].ToString()); + recorder.touch_locations()[1].ToString()); } class SelfDestructDelegate : public test::TestWindowDelegate { diff --git a/ui/aura/window_tree_host.cc b/ui/aura/window_tree_host.cc index a88d9a0102..8b1ad4e1a0 100644 --- a/ui/aura/window_tree_host.cc +++ b/ui/aura/window_tree_host.cc @@ -109,7 +109,7 @@ gfx::Transform WindowTreeHost::GetInverseRootTransform() const { void WindowTreeHost::UpdateRootWindowSize(const gfx::Size& host_size) { gfx::Rect bounds(host_size); gfx::RectF new_bounds(ui::ConvertRectToDIP(window()->layer(), bounds)); - GetRootTransform().TransformRect(&new_bounds); + window()->layer()->transform().TransformRect(&new_bounds); window()->SetBounds(gfx::Rect(gfx::ToFlooredSize(new_bounds.size()))); } diff --git a/ui/aura/window_tree_host_x11.cc b/ui/aura/window_tree_host_x11.cc index 22b0bfeed2..6fa75e7a52 100644 --- a/ui/aura/window_tree_host_x11.cc +++ b/ui/aura/window_tree_host_x11.cc @@ -298,6 +298,7 @@ uint32_t WindowTreeHostX11::DispatchEvent(const ui::PlatformEvent& event) { False, SubstructureRedirectMask | SubstructureNotifyMask, &reply_event); + XFlush(xdisplay_); } break; } @@ -488,6 +489,7 @@ void WindowTreeHostX11::PostNativeEvent( break; } XSendEvent(xdisplay_, xwindow_, False, 0, &xevent); + XFlush(xdisplay_); } void WindowTreeHostX11::OnDeviceScaleFactorChanged( diff --git a/ui/aura/window_unittest.cc b/ui/aura/window_unittest.cc index be2257c253..bdd4f73dd6 100644 --- a/ui/aura/window_unittest.cc +++ b/ui/aura/window_unittest.cc @@ -1947,8 +1947,8 @@ TEST_F(WindowTest, AcquireThenRecreateLayer) { scoped_ptr<Window> w( CreateTestWindow(SK_ColorWHITE, 1, gfx::Rect(0, 0, 100, 100), root_window())); - scoped_ptr<ui::Layer>acquired_layer(w->AcquireLayer()); - scoped_ptr<ui::Layer>doubly_acquired_layer(w->RecreateLayer()); + scoped_ptr<ui::Layer> acquired_layer(w->AcquireLayer()); + scoped_ptr<ui::Layer> doubly_acquired_layer(w->RecreateLayer()); EXPECT_EQ(NULL, doubly_acquired_layer.get()); // Destroy window before layer gets destroyed. @@ -2206,6 +2206,57 @@ TEST_F(WindowTest, RootWindowAttachment) { EXPECT_EQ(2, observer.removed_count()); } +class BoundsChangedWindowObserver : public WindowObserver { + public: + BoundsChangedWindowObserver() : root_set_(false) {} + + virtual void OnWindowBoundsChanged(Window* window, + const gfx::Rect& old_bounds, + const gfx::Rect& new_bounds) OVERRIDE { + root_set_ = window->GetRootWindow() != NULL; + } + + bool root_set() const { return root_set_; } + + private: + bool root_set_; + + DISALLOW_COPY_AND_ASSIGN(BoundsChangedWindowObserver); +}; + +TEST_F(WindowTest, RootWindowSetWhenReparenting) { + Window parent1(NULL); + parent1.Init(aura::WINDOW_LAYER_NOT_DRAWN); + Window parent2(NULL); + parent2.Init(aura::WINDOW_LAYER_NOT_DRAWN); + ParentWindow(&parent1); + ParentWindow(&parent2); + parent1.SetBounds(gfx::Rect(10, 10, 300, 300)); + parent2.SetBounds(gfx::Rect(20, 20, 300, 300)); + + Window child(NULL); + child.Init(aura::WINDOW_LAYER_NOT_DRAWN); + child.SetBounds(gfx::Rect(5, 5, 100, 100)); + parent1.AddChild(&child); + + // We need animations to start in order to observe the bounds changes. + ui::ScopedAnimationDurationScaleMode animation_duration_mode( + ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); + ui::ScopedLayerAnimationSettings settings1(child.layer()->GetAnimator()); + settings1.SetTransitionDuration(base::TimeDelta::FromMilliseconds(100)); + child.SetBounds(gfx::Rect(35, 35, 100, 100)); + + BoundsChangedWindowObserver observer; + child.AddObserver(&observer); + + // Reparenting the |child| will cause it to get moved. During this move + // the window should still have root window set. + parent2.AddChild(&child); + EXPECT_TRUE(observer.root_set()); + + // TODO(varkha): Check that the target bounds didn't change after reparenting. +} + TEST_F(WindowTest, OwnedByParentFalse) { // By default, a window is owned by its parent. If this is set to false, the // window will not be destroyed when its parent is. diff --git a/ui/base/android/view_android.cc b/ui/base/android/view_android.cc index ffb510f672..30e4316440 100644 --- a/ui/base/android/view_android.cc +++ b/ui/base/android/view_android.cc @@ -5,7 +5,7 @@ #include "ui/base/android/view_android.h" #include "base/android/jni_android.h" -#include "base/android/jni_helper.h" +#include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "jni/ViewAndroid_jni.h" #include "ui/base/android/window_android.h" diff --git a/ui/base/android/view_android.h b/ui/base/android/view_android.h index fbaabc72d4..0205fdf141 100644 --- a/ui/base/android/view_android.h +++ b/ui/base/android/view_android.h @@ -6,7 +6,7 @@ #define UI_BASE_ANDROID_VIEW_ANDROID_H_ #include <jni.h> -#include "base/android/jni_helper.h" +#include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "ui/base/ui_base_export.h" diff --git a/ui/base/android/window_android.cc b/ui/base/android/window_android.cc index 75389c9d55..b7a7e133c0 100644 --- a/ui/base/android/window_android.cc +++ b/ui/base/android/window_android.cc @@ -6,7 +6,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_array.h" -#include "base/android/jni_helper.h" +#include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "jni/WindowAndroid_jni.h" #include "ui/base/android/window_android_compositor.h" diff --git a/ui/base/android/window_android.h b/ui/base/android/window_android.h index 2563679397..842bc4c886 100644 --- a/ui/base/android/window_android.h +++ b/ui/base/android/window_android.h @@ -7,7 +7,7 @@ #include <jni.h> #include <vector> -#include "base/android/jni_helper.h" +#include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "base/observer_list.h" #include "ui/base/ui_base_export.h" diff --git a/ui/base/cursor/cursor_loader.h b/ui/base/cursor/cursor_loader.h index 8526e29d3e..d4a0c3d2da 100644 --- a/ui/base/cursor/cursor_loader.h +++ b/ui/base/cursor/cursor_loader.h @@ -16,17 +16,15 @@ namespace ui { class UI_BASE_EXPORT CursorLoader { public: - CursorLoader() : scale_(1.f) {} + CursorLoader() : scale_(1.f), rotation_(gfx::Display::ROTATE_0) {} virtual ~CursorLoader() {} - // Returns the display the loader loads images for. - const gfx::Display& display() const { - return display_; + gfx::Display::Rotation rotation() const { + return rotation_; } - // Sets the display the loader loads images for. - void set_display(const gfx::Display& display) { - display_ = display; + void set_rotation(gfx::Display::Rotation rotation) { + rotation_ = rotation; } // Returns the current scale of the mouse cursor icon. @@ -64,12 +62,12 @@ class UI_BASE_EXPORT CursorLoader { static CursorLoader* Create(); private: - // The display the loader loads images for. - gfx::Display display_; - // The current scale of the mouse cursor icon. float scale_; + // The current rotation of the mouse cursor icon. + gfx::Display::Rotation rotation_; + DISALLOW_COPY_AND_ASSIGN(CursorLoader); }; diff --git a/ui/base/cursor/cursor_loader_ozone.cc b/ui/base/cursor/cursor_loader_ozone.cc index 19dddf51d9..b56648fd43 100644 --- a/ui/base/cursor/cursor_loader_ozone.cc +++ b/ui/base/cursor/cursor_loader_ozone.cc @@ -21,7 +21,7 @@ void CursorLoaderOzone::LoadImageCursor(int id, const gfx::ImageSkia* image = ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id); const gfx::ImageSkiaRep& image_rep = - image->GetRepresentation(display().device_scale_factor()); + image->GetRepresentation(scale()); SkBitmap bitmap = image_rep.sk_bitmap(); cursors_[id] = CursorFactoryOzone::GetInstance()->CreateImageCursor(bitmap, hot); diff --git a/ui/base/cursor/cursor_loader_x11.cc b/ui/base/cursor/cursor_loader_x11.cc index 0161da29b2..9c2f609bf8 100644 --- a/ui/base/cursor/cursor_loader_x11.cc +++ b/ui/base/cursor/cursor_loader_x11.cc @@ -159,12 +159,11 @@ void CursorLoaderX11::LoadImageCursor(int id, const gfx::Point& hot) { const gfx::ImageSkia* image = ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id); - const gfx::ImageSkiaRep& image_rep = image->GetRepresentation( - display().device_scale_factor()); + const gfx::ImageSkiaRep& image_rep = image->GetRepresentation(scale()); SkBitmap bitmap = image_rep.sk_bitmap(); gfx::Point hotpoint = hot; ScaleAndRotateCursorBitmapAndHotpoint( - scale(), display().rotation(), &bitmap, &hotpoint); + scale(), rotation(), &bitmap, &hotpoint); XcursorImage* x_image = SkBitmapToXcursorImage(&bitmap, hotpoint); cursors_[id] = CreateReffedCustomXCursor(x_image); @@ -177,8 +176,7 @@ void CursorLoaderX11::LoadAnimatedCursor(int id, int frame_delay_ms) { const gfx::ImageSkia* image = ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id); - const gfx::ImageSkiaRep& image_rep = image->GetRepresentation( - display().device_scale_factor()); + const gfx::ImageSkiaRep& image_rep = image->GetRepresentation(scale()); SkBitmap bitmap = image_rep.sk_bitmap(); int frame_width = bitmap.height(); int frame_height = frame_width; @@ -233,8 +231,7 @@ void CursorLoaderX11::SetPlatformCursor(gfx::NativeCursor* cursor) { xcursor = invisible_cursor_.get(); else if (*cursor == kCursorCustom) xcursor = cursor->platform(); - else if (display().device_scale_factor() == 1.0f && - display().rotation() == gfx::Display::ROTATE_0) { + else if (scale() == 1.0f && rotation() == gfx::Display::ROTATE_0) { xcursor = GetXCursor(CursorShapeFromNative(*cursor)); } else { xcursor = ImageCursorFromNative(kCursorPointer); diff --git a/ui/base/dragdrop/os_exchange_data_provider_aurax11.h b/ui/base/dragdrop/os_exchange_data_provider_aurax11.h index 54ca445ffc..702cc7e11e 100644 --- a/ui/base/dragdrop/os_exchange_data_provider_aurax11.h +++ b/ui/base/dragdrop/os_exchange_data_provider_aurax11.h @@ -13,7 +13,6 @@ #include <map> #include "base/files/file_path.h" -#include "base/message_loop/message_pump_dispatcher.h" #include "base/pickle.h" #include "ui/base/dragdrop/os_exchange_data.h" #include "ui/base/x/selection_owner.h" diff --git a/ui/base/dragdrop/os_exchange_data_provider_win.cc b/ui/base/dragdrop/os_exchange_data_provider_win.cc index afc7ddbe3b..ab06c32f0f 100644 --- a/ui/base/dragdrop/os_exchange_data_provider_win.cc +++ b/ui/base/dragdrop/os_exchange_data_provider_win.cc @@ -64,7 +64,7 @@ static STGMEDIUM* GetStorageForFileDescriptor(const base::FilePath& path); // some sort of sequential data (why not just use an array?). See comments // throughout. // -class FormatEtcEnumerator : public IEnumFORMATETC { +class FormatEtcEnumerator FINAL : public IEnumFORMATETC { public: FormatEtcEnumerator(DataObjectImpl::StoredData::const_iterator begin, DataObjectImpl::StoredData::const_iterator end); @@ -897,7 +897,7 @@ template <typename T> static STGMEDIUM* GetStorageForString(const std::basic_string<T>& data) { return GetStorageForBytes( data.c_str(), - (data.size() + 1) * sizeof(std::basic_string<T>::value_type)); + (data.size() + 1) * sizeof(typename std::basic_string<T>::value_type)); } static void GetInternetShortcutFileContents(const GURL& url, diff --git a/ui/base/gtk/OWNERS b/ui/base/gtk/OWNERS deleted file mode 100644 index 0573e6b64c..0000000000 --- a/ui/base/gtk/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -erg@chromium.org -estade@chromium.org diff --git a/ui/base/gtk/gtk_signal.h b/ui/base/gtk/gtk_signal.h deleted file mode 100644 index ca6fa2308d..0000000000 --- a/ui/base/gtk/gtk_signal.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_BASE_GTK_GTK_SIGNAL_H_ -#define UI_BASE_GTK_GTK_SIGNAL_H_ - -#include "ui/base/glib/glib_signal.h" - -typedef struct _GtkWidget GtkWidget; - -// These macros handle the common case where the sender object will be a -// GtkWidget*. -#define CHROMEGTK_CALLBACK_0(CLASS, RETURN, METHOD) \ - CHROMEG_CALLBACK_0(CLASS, RETURN, METHOD, GtkWidget*); - -#define CHROMEGTK_CALLBACK_1(CLASS, RETURN, METHOD, ARG1) \ - CHROMEG_CALLBACK_1(CLASS, RETURN, METHOD, GtkWidget*, ARG1); - -#define CHROMEGTK_CALLBACK_2(CLASS, RETURN, METHOD, ARG1, ARG2) \ - CHROMEG_CALLBACK_2(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2); - -#define CHROMEGTK_CALLBACK_3(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3) \ - CHROMEG_CALLBACK_3(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3); - -#define CHROMEGTK_CALLBACK_4(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4) \ - CHROMEG_CALLBACK_4(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, \ - ARG4); - -#define CHROMEGTK_CALLBACK_5(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4, \ - ARG5) \ - CHROMEG_CALLBACK_5(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, \ - ARG4, ARG5); - -#define CHROMEGTK_CALLBACK_6(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4, \ - ARG5, ARG6) \ - CHROMEG_CALLBACK_6(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, \ - ARG4, ARG5, ARG6); - -#define CHROMEGTK_VIRTUAL_CALLBACK_0(CLASS, RETURN, METHOD) \ - CHROMEG_VIRTUAL_CALLBACK_0(CLASS, RETURN, METHOD, GtkWidget*); - -#define CHROMEGTK_VIRTUAL_CALLBACK_1(CLASS, RETURN, METHOD, ARG1) \ - CHROMEG_VIRTUAL_CALLBACK_1(CLASS, RETURN, METHOD, GtkWidget*, ARG1); - -#define CHROMEGTK_VIRTUAL_CALLBACK_2(CLASS, RETURN, METHOD, ARG1, ARG2) \ - CHROMEG_VIRTUAL_CALLBACK_2(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2); - -#define CHROMEGTK_VIRTUAL_CALLBACK_3(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3) \ - CHROMEG_VIRTUAL_CALLBACK_3(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \ - ARG3); - -#define CHROMEGTK_VIRTUAL_CALLBACK_4(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, \ - ARG4) \ - CHROMEG_VIRTUAL_CALLBACK_4(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \ - ARG3, ARG4); - -#define CHROMEGTK_VIRTUAL_CALLBACK_5(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, \ - ARG4, ARG5) \ - CHROMEG_VIRTUAL_CALLBACK_5(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \ - ARG3, ARG4, ARG5); - -#define CHROMEGTK_VIRTUAL_CALLBACK_6(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, \ - ARG4, ARG5, ARG6) \ - CHROMEG_VIRTUAL_CALLBACK_6(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \ - ARG3, ARG4, ARG5, ARG6); - -#endif // UI_BASE_GTK_GTK_SIGNAL_H_ diff --git a/ui/base/gtk/gtk_signal_registrar.cc b/ui/base/gtk/gtk_signal_registrar.cc deleted file mode 100644 index 82527e8258..0000000000 --- a/ui/base/gtk/gtk_signal_registrar.cc +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/base/gtk/gtk_signal_registrar.h" - -#include <glib-object.h> - -#include "base/logging.h" -#include "ui/base/gtk/g_object_destructor_filo.h" - -namespace ui { - -GtkSignalRegistrar::GtkSignalRegistrar() { -} - -GtkSignalRegistrar::~GtkSignalRegistrar() { - for (HandlerMap::iterator list_iter = handler_lists_.begin(); - list_iter != handler_lists_.end(); ++list_iter) { - GObject* object = list_iter->first; - GObjectDestructorFILO::GetInstance()->Disconnect( - object, WeakNotifyThunk, this); - - HandlerList& handlers = list_iter->second; - for (HandlerList::iterator ids_iter = handlers.begin(); - ids_iter != handlers.end(); ++ids_iter) { - g_signal_handler_disconnect(object, *ids_iter); - } - } -} - -glong GtkSignalRegistrar::Connect(gpointer instance, - const gchar* detailed_signal, - GCallback signal_handler, - gpointer data) { - return ConnectInternal(instance, detailed_signal, signal_handler, data, - false); -} - -glong GtkSignalRegistrar::ConnectAfter(gpointer instance, - const gchar* detailed_signal, - GCallback signal_handler, - gpointer data) { - return ConnectInternal(instance, detailed_signal, signal_handler, data, true); -} - -glong GtkSignalRegistrar::ConnectInternal(gpointer instance, - const gchar* detailed_signal, - GCallback signal_handler, - gpointer data, - bool after) { - GObject* object = G_OBJECT(instance); - - HandlerMap::iterator iter = handler_lists_.find(object); - if (iter == handler_lists_.end()) { - GObjectDestructorFILO::GetInstance()->Connect( - object, WeakNotifyThunk, this); - handler_lists_[object] = HandlerList(); - iter = handler_lists_.find(object); - } - - glong handler_id = after ? - g_signal_connect_after(instance, detailed_signal, signal_handler, data) : - g_signal_connect(instance, detailed_signal, signal_handler, data); - iter->second.push_back(handler_id); - - return handler_id; -} - -void GtkSignalRegistrar::WeakNotify(GObject* where_the_object_was) { - HandlerMap::iterator iter = handler_lists_.find(where_the_object_was); - if (iter == handler_lists_.end()) { - NOTREACHED(); - return; - } - // The signal handlers will be disconnected automatically. Just erase the - // handler id list. - handler_lists_.erase(iter); -} - -void GtkSignalRegistrar::DisconnectAll(gpointer instance) { - GObject* object = G_OBJECT(instance); - HandlerMap::iterator iter = handler_lists_.find(object); - if (iter == handler_lists_.end()) - return; - - GObjectDestructorFILO::GetInstance()->Disconnect( - object, WeakNotifyThunk, this); - HandlerList& handlers = iter->second; - for (HandlerList::iterator ids_iter = handlers.begin(); - ids_iter != handlers.end(); ++ids_iter) { - g_signal_handler_disconnect(object, *ids_iter); - } - - handler_lists_.erase(iter); -} - -} // namespace ui diff --git a/ui/base/gtk/gtk_signal_registrar.h b/ui/base/gtk/gtk_signal_registrar.h deleted file mode 100644 index 37b8710db9..0000000000 --- a/ui/base/gtk/gtk_signal_registrar.h +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_BASE_GTK_GTK_SIGNAL_REGISTRAR_H_ -#define UI_BASE_GTK_GTK_SIGNAL_REGISTRAR_H_ - -#include <glib.h> -#include <map> -#include <vector> - -#include "base/basictypes.h" -#include "ui/base/ui_base_export.h" - -typedef void (*GCallback) (void); -typedef struct _GObject GObject; -typedef struct _GtkWidget GtkWidget; - -namespace ui { - -// A class that ensures that callbacks don't run on stale owner objects. Similar -// in spirit to NotificationRegistrar. Use as follows: -// -// class ChromeObject { -// public: -// ChromeObject() { -// ... -// -// signals_.Connect(widget, "event", CallbackThunk, this); -// } -// -// ... -// -// private: -// GtkSignalRegistrar signals_; -// }; -// -// When |signals_| goes down, it will disconnect the handlers connected via -// Connect. -class UI_BASE_EXPORT GtkSignalRegistrar { - public: - GtkSignalRegistrar(); - ~GtkSignalRegistrar(); - - // Connect before the default handler. Returns the handler id. - glong Connect(gpointer instance, const gchar* detailed_signal, - GCallback signal_handler, gpointer data); - // Connect after the default handler. Returns the handler id. - glong ConnectAfter(gpointer instance, const gchar* detailed_signal, - GCallback signal_handler, gpointer data); - - // Disconnects all signal handlers connected to |instance|. - void DisconnectAll(gpointer instance); - - private: - typedef std::vector<glong> HandlerList; - typedef std::map<GObject*, HandlerList> HandlerMap; - - static void WeakNotifyThunk(gpointer data, GObject* where_the_object_was) { - reinterpret_cast<GtkSignalRegistrar*>(data)->WeakNotify( - where_the_object_was); - } - void WeakNotify(GObject* where_the_object_was); - - glong ConnectInternal(gpointer instance, const gchar* detailed_signal, - GCallback signal_handler, gpointer data, bool after); - - HandlerMap handler_lists_; - - DISALLOW_COPY_AND_ASSIGN(GtkSignalRegistrar); -}; - -} // namespace ui - -#endif // UI_BASE_GTK_GTK_SIGNAL_REGISTRAR_H_ diff --git a/ui/base/ime/chromeos/ime_bridge.cc b/ui/base/ime/chromeos/ime_bridge.cc index 6d07e6eb3d..49d0f73df3 100644 --- a/ui/base/ime/chromeos/ime_bridge.cc +++ b/ui/base/ime/chromeos/ime_bridge.cc @@ -18,7 +18,8 @@ class IMEBridgeImpl : public IMEBridge { IMEBridgeImpl() : input_context_handler_(NULL), engine_handler_(NULL), - candidate_window_handler_(NULL) { + candidate_window_handler_(NULL), + current_text_input_(ui::TEXT_INPUT_TYPE_NONE) { } virtual ~IMEBridgeImpl() { @@ -59,10 +60,21 @@ class IMEBridgeImpl : public IMEBridge { candidate_window_handler_ = handler; } + // IMEBridge override. + virtual void SetCurrentTextInputType(ui::TextInputType input_type) OVERRIDE { + current_text_input_ = input_type; + } + + // IMEBridge override. + virtual ui::TextInputType GetCurrentTextInputType() const OVERRIDE { + return current_text_input_; + } + private: IMEInputContextHandlerInterface* input_context_handler_; IMEEngineHandlerInterface* engine_handler_; IMECandidateWindowHandlerInterface* candidate_window_handler_; + ui::TextInputType current_text_input_; DISALLOW_COPY_AND_ASSIGN(IMEBridgeImpl); }; diff --git a/ui/base/ime/chromeos/ime_bridge.h b/ui/base/ime/chromeos/ime_bridge.h index 3c6ed0aa40..2464f3ff89 100644 --- a/ui/base/ime/chromeos/ime_bridge.h +++ b/ui/base/ime/chromeos/ime_bridge.h @@ -173,6 +173,12 @@ class UI_BASE_EXPORT IMEBridge { virtual void SetCandidateWindowHandler( IMECandidateWindowHandlerInterface* handler) = 0; + // Updates current text input type. + virtual void SetCurrentTextInputType(ui::TextInputType input_type) = 0; + + // Returns the current text input type. + virtual ui::TextInputType GetCurrentTextInputType() const = 0; + protected: IMEBridge(); diff --git a/ui/base/ime/ime.gypi b/ui/base/ime/ime.gypi index 77329468cc..f3b08bbf96 100644 --- a/ui/base/ime/ime.gypi +++ b/ui/base/ime/ime.gypi @@ -114,5 +114,10 @@ 'chromeos/character_composer.h', ], }], + ['OS=="android"', { + 'dependencies!' : [ + '<(DEPTH)/ui/events/events.gyp:events', + ], + }] ], } diff --git a/ui/base/ime/input_method_chromeos.cc b/ui/base/ime/input_method_chromeos.cc index bd5666e994..5e1f2ece98 100644 --- a/ui/base/ime/input_method_chromeos.cc +++ b/ui/base/ime/input_method_chromeos.cc @@ -292,11 +292,12 @@ void InputMethodChromeOS::UpdateContextFocusState() { if (candidate_window) candidate_window->FocusStateChanged(IsInputFieldFocused()); + const TextInputType current_text_input_type = GetTextInputType(); + chromeos::IMEBridge::Get()->SetCurrentTextInputType(current_text_input_type); + if (!GetEngine()) return; - const TextInputType current_text_input_type = GetTextInputType(); - // When focus is not changed, a text input type change causes a focus // blink. The focus in to or out from password field should also notify // engine. diff --git a/ui/base/ime/win/tsf_input_scope.cc b/ui/base/ime/win/tsf_input_scope.cc index ccfda53a85..f40f928a5f 100644 --- a/ui/base/ime/win/tsf_input_scope.cc +++ b/ui/base/ime/win/tsf_input_scope.cc @@ -29,7 +29,7 @@ void AppendNonTrivialInputScope(std::vector<InputScope>* input_scopes, input_scopes->push_back(input_scope); } -class TSFInputScope : public ITfInputScope { +class TSFInputScope FINAL : public ITfInputScope { public: explicit TSFInputScope(const std::vector<InputScope>& input_scopes) : input_scopes_(input_scopes), diff --git a/ui/base/l10n/formatter.cc b/ui/base/l10n/formatter.cc index 2131ff2913..14f49ae3c9 100644 --- a/ui/base/l10n/formatter.cc +++ b/ui/base/l10n/formatter.cc @@ -23,28 +23,28 @@ struct Pluralities { }; static const Pluralities IDS_ELAPSED_SHORT_SEC = { - { IDS_TIME_ELAPSED_SECS_DEFAULT, IDS_TIME_ELAPSED_SEC_SINGULAR, + { IDS_TIME_ELAPSED_SECS_DEFAULT, IDS_TIME_ELAPSED_SECS_SINGULAR, IDS_TIME_ELAPSED_SECS_ZERO, IDS_TIME_ELAPSED_SECS_TWO, IDS_TIME_ELAPSED_SECS_FEW, IDS_TIME_ELAPSED_SECS_MANY }, "one{# sec ago}", " other{# secs ago}" }; static const Pluralities IDS_ELAPSED_SHORT_MIN = { - { IDS_TIME_ELAPSED_MINS_DEFAULT, IDS_TIME_ELAPSED_MIN_SINGULAR, + { IDS_TIME_ELAPSED_MINS_DEFAULT, IDS_TIME_ELAPSED_MINS_SINGULAR, IDS_TIME_ELAPSED_MINS_ZERO, IDS_TIME_ELAPSED_MINS_TWO, IDS_TIME_ELAPSED_MINS_FEW, IDS_TIME_ELAPSED_MINS_MANY }, "one{# min ago}", " other{# mins ago}" }; static const Pluralities IDS_ELAPSED_HOUR = { - { IDS_TIME_ELAPSED_HOURS_DEFAULT, IDS_TIME_ELAPSED_HOUR_SINGULAR, + { IDS_TIME_ELAPSED_HOURS_DEFAULT, IDS_TIME_ELAPSED_HOURS_SINGULAR, IDS_TIME_ELAPSED_HOURS_ZERO, IDS_TIME_ELAPSED_HOURS_TWO, IDS_TIME_ELAPSED_HOURS_FEW, IDS_TIME_ELAPSED_HOURS_MANY }, "one{# hour ago}", " other{# hours ago}" }; static const Pluralities IDS_ELAPSED_DAY = { - { IDS_TIME_ELAPSED_DAYS_DEFAULT, IDS_TIME_ELAPSED_DAY_SINGULAR, + { IDS_TIME_ELAPSED_DAYS_DEFAULT, IDS_TIME_ELAPSED_DAYS_SINGULAR, IDS_TIME_ELAPSED_DAYS_ZERO, IDS_TIME_ELAPSED_DAYS_TWO, IDS_TIME_ELAPSED_DAYS_FEW, IDS_TIME_ELAPSED_DAYS_MANY }, "one{# day ago}", @@ -52,14 +52,14 @@ static const Pluralities IDS_ELAPSED_DAY = { }; static const Pluralities IDS_REMAINING_SHORT_SEC = { - { IDS_TIME_REMAINING_SECS_DEFAULT, IDS_TIME_REMAINING_SEC_SINGULAR, + { IDS_TIME_REMAINING_SECS_DEFAULT, IDS_TIME_REMAINING_SECS_SINGULAR, IDS_TIME_REMAINING_SECS_ZERO, IDS_TIME_REMAINING_SECS_TWO, IDS_TIME_REMAINING_SECS_FEW, IDS_TIME_REMAINING_SECS_MANY }, "one{# sec left}", " other{# secs left}" }; static const Pluralities IDS_REMAINING_SHORT_MIN = { - { IDS_TIME_REMAINING_MINS_DEFAULT, IDS_TIME_REMAINING_MIN_SINGULAR, + { IDS_TIME_REMAINING_MINS_DEFAULT, IDS_TIME_REMAINING_MINS_SINGULAR, IDS_TIME_REMAINING_MINS_ZERO, IDS_TIME_REMAINING_MINS_TWO, IDS_TIME_REMAINING_MINS_FEW, IDS_TIME_REMAINING_MINS_MANY }, "one{# min left}", @@ -67,28 +67,28 @@ static const Pluralities IDS_REMAINING_SHORT_MIN = { }; static const Pluralities IDS_REMAINING_LONG_SEC = { - { IDS_TIME_REMAINING_LONG_SECS_DEFAULT, IDS_TIME_REMAINING_LONG_SEC_SINGULAR, + { IDS_TIME_REMAINING_LONG_SECS_DEFAULT, IDS_TIME_REMAINING_LONG_SECS_SINGULAR, IDS_TIME_REMAINING_LONG_SECS_ZERO, IDS_TIME_REMAINING_LONG_SECS_TWO, IDS_TIME_REMAINING_LONG_SECS_FEW, IDS_TIME_REMAINING_LONG_SECS_MANY }, "one{# second left}", " other{# seconds left}" }; static const Pluralities IDS_REMAINING_LONG_MIN = { - { IDS_TIME_REMAINING_LONG_MINS_DEFAULT, IDS_TIME_REMAINING_LONG_MIN_SINGULAR, + { IDS_TIME_REMAINING_LONG_MINS_DEFAULT, IDS_TIME_REMAINING_LONG_MINS_SINGULAR, IDS_TIME_REMAINING_LONG_MINS_ZERO, IDS_TIME_REMAINING_LONG_MINS_TWO, IDS_TIME_REMAINING_LONG_MINS_FEW, IDS_TIME_REMAINING_LONG_MINS_MANY }, "one{# minute left}", " other{# minutes left}" }; static const Pluralities IDS_REMAINING_HOUR = { - { IDS_TIME_REMAINING_HOURS_DEFAULT, IDS_TIME_REMAINING_HOUR_SINGULAR, + { IDS_TIME_REMAINING_HOURS_DEFAULT, IDS_TIME_REMAINING_HOURS_SINGULAR, IDS_TIME_REMAINING_HOURS_ZERO, IDS_TIME_REMAINING_HOURS_TWO, IDS_TIME_REMAINING_HOURS_FEW, IDS_TIME_REMAINING_HOURS_MANY }, "one{# hour left}", " other{# hours left}" }; static const Pluralities IDS_REMAINING_DAY = { - { IDS_TIME_REMAINING_DAYS_DEFAULT, IDS_TIME_REMAINING_DAY_SINGULAR, + { IDS_TIME_REMAINING_DAYS_DEFAULT, IDS_TIME_REMAINING_DAYS_SINGULAR, IDS_TIME_REMAINING_DAYS_ZERO, IDS_TIME_REMAINING_DAYS_TWO, IDS_TIME_REMAINING_DAYS_FEW, IDS_TIME_REMAINING_DAYS_MANY }, "one{# day left}", @@ -96,82 +96,82 @@ static const Pluralities IDS_REMAINING_DAY = { }; static const Pluralities IDS_DURATION_SHORT_SEC = { - { IDS_TIME_SECS_DEFAULT, IDS_TIME_SEC_SINGULAR, IDS_TIME_SECS_ZERO, + { IDS_TIME_SECS_DEFAULT, IDS_TIME_SECS_SINGULAR, IDS_TIME_SECS_ZERO, IDS_TIME_SECS_TWO, IDS_TIME_SECS_FEW, IDS_TIME_SECS_MANY }, "one{# sec}", " other{# secs}" }; static const Pluralities IDS_DURATION_SHORT_MIN = { - { IDS_TIME_MINS_DEFAULT, IDS_TIME_MIN_SINGULAR, IDS_TIME_MINS_ZERO, + { IDS_TIME_MINS_DEFAULT, IDS_TIME_MINS_SINGULAR, IDS_TIME_MINS_ZERO, IDS_TIME_MINS_TWO, IDS_TIME_MINS_FEW, IDS_TIME_MINS_MANY }, "one{# min}", " other{# mins}" }; static const Pluralities IDS_LONG_SEC = { - { IDS_TIME_LONG_SECS_DEFAULT, IDS_TIME_LONG_SEC_SINGULAR, + { IDS_TIME_LONG_SECS_DEFAULT, IDS_TIME_LONG_SECS_SINGULAR, IDS_TIME_LONG_SECS_ZERO, IDS_TIME_LONG_SECS_TWO, IDS_TIME_LONG_SECS_FEW, IDS_TIME_LONG_SECS_MANY }, "one{# second}", " other{# seconds}" }; static const Pluralities IDS_LONG_MIN = { - { IDS_TIME_LONG_MINS_DEFAULT, IDS_TIME_LONG_MIN_SINGULAR, + { IDS_TIME_LONG_MINS_DEFAULT, IDS_TIME_LONG_MINS_SINGULAR, IDS_TIME_LONG_MINS_ZERO, IDS_TIME_LONG_MINS_TWO, IDS_TIME_LONG_MINS_FEW, IDS_TIME_LONG_MINS_MANY }, "one{# minute}", " other{# minutes}" }; static const Pluralities IDS_DURATION_HOUR = { - { IDS_TIME_HOURS_DEFAULT, IDS_TIME_HOUR_SINGULAR, IDS_TIME_HOURS_ZERO, + { IDS_TIME_HOURS_DEFAULT, IDS_TIME_HOURS_SINGULAR, IDS_TIME_HOURS_ZERO, IDS_TIME_HOURS_TWO, IDS_TIME_HOURS_FEW, IDS_TIME_HOURS_MANY }, "one{# hour}", " other{# hours}" }; static const Pluralities IDS_DURATION_DAY = { - { IDS_TIME_DAYS_DEFAULT, IDS_TIME_DAY_SINGULAR, IDS_TIME_DAYS_ZERO, + { IDS_TIME_DAYS_DEFAULT, IDS_TIME_DAYS_SINGULAR, IDS_TIME_DAYS_ZERO, IDS_TIME_DAYS_TWO, IDS_TIME_DAYS_FEW, IDS_TIME_DAYS_MANY }, "one{# day}", " other{# days}" }; static const Pluralities IDS_LONG_MIN_1ST = { - { IDS_TIME_LONG_MINS_1ST_DEFAULT, IDS_TIME_LONG_MIN_1ST_SINGULAR, + { IDS_TIME_LONG_MINS_1ST_DEFAULT, IDS_TIME_LONG_MINS_1ST_SINGULAR, IDS_TIME_LONG_MINS_1ST_ZERO, IDS_TIME_LONG_MINS_1ST_TWO, IDS_TIME_LONG_MINS_1ST_FEW, IDS_TIME_LONG_MINS_1ST_MANY }, "one{# minute }", " other{# minutes }" }; static const Pluralities IDS_LONG_SEC_2ND = { - { IDS_TIME_LONG_SECS_2ND_DEFAULT, IDS_TIME_LONG_SEC_2ND_SINGULAR, + { IDS_TIME_LONG_SECS_2ND_DEFAULT, IDS_TIME_LONG_SECS_2ND_SINGULAR, IDS_TIME_LONG_SECS_2ND_ZERO, IDS_TIME_LONG_SECS_2ND_TWO, IDS_TIME_LONG_SECS_2ND_FEW, IDS_TIME_LONG_SECS_2ND_MANY }, "one{# second}", " other{# seconds}" }; static const Pluralities IDS_DURATION_HOUR_1ST = { - { IDS_TIME_HOURS_1ST_DEFAULT, IDS_TIME_HOUR_1ST_SINGULAR, + { IDS_TIME_HOURS_1ST_DEFAULT, IDS_TIME_HOURS_1ST_SINGULAR, IDS_TIME_HOURS_1ST_ZERO, IDS_TIME_HOURS_1ST_TWO, IDS_TIME_HOURS_1ST_FEW, IDS_TIME_HOURS_1ST_MANY }, "one{# hour }", " other{# hours }" }; static const Pluralities IDS_LONG_MIN_2ND = { - { IDS_TIME_LONG_MINS_2ND_DEFAULT, IDS_TIME_LONG_MIN_2ND_SINGULAR, + { IDS_TIME_LONG_MINS_2ND_DEFAULT, IDS_TIME_LONG_MINS_2ND_SINGULAR, IDS_TIME_LONG_MINS_2ND_ZERO, IDS_TIME_LONG_MINS_2ND_TWO, IDS_TIME_LONG_MINS_2ND_FEW, IDS_TIME_LONG_MINS_2ND_MANY }, "one{# minute}", " other{# minutes}" }; static const Pluralities IDS_DURATION_DAY_1ST = { - { IDS_TIME_DAYS_1ST_DEFAULT, IDS_TIME_DAY_1ST_SINGULAR, + { IDS_TIME_DAYS_1ST_DEFAULT, IDS_TIME_DAYS_1ST_SINGULAR, IDS_TIME_DAYS_1ST_ZERO, IDS_TIME_DAYS_1ST_TWO, IDS_TIME_DAYS_1ST_FEW, IDS_TIME_DAYS_1ST_MANY }, "one{# day }", " other{# days }" }; static const Pluralities IDS_DURATION_HOUR_2ND = { - { IDS_TIME_HOURS_2ND_DEFAULT, IDS_TIME_HOUR_2ND_SINGULAR, + { IDS_TIME_HOURS_2ND_DEFAULT, IDS_TIME_HOURS_2ND_SINGULAR, IDS_TIME_HOURS_2ND_ZERO, IDS_TIME_HOURS_2ND_TWO, IDS_TIME_HOURS_2ND_FEW, IDS_TIME_HOURS_2ND_MANY }, "one{# hour}", diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc index daea33fe88..e2a91444a6 100644 --- a/ui/base/resource/resource_bundle.cc +++ b/ui/base/resource/resource_bundle.cc @@ -632,8 +632,8 @@ void ResourceBundle::AddDataPackFromPathInternal(const base::FilePath& path, void ResourceBundle::AddDataPack(DataPack* data_pack) { data_packs_.push_back(data_pack); - if (GetImageScale(data_pack->GetScaleFactor()) > - GetImageScale(max_scale_factor_)) + if (GetScaleForScaleFactor(data_pack->GetScaleFactor()) > + GetScaleForScaleFactor(max_scale_factor_)) max_scale_factor_ = data_pack->GetScaleFactor(); } diff --git a/ui/base/strings/ui_strings.grd b/ui/base/strings/ui_strings.grd index 5012ba797e..499ee1958e 100644 --- a/ui/base/strings/ui_strings.grd +++ b/ui/base/strings/ui_strings.grd @@ -219,13 +219,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_SEC_SINGULAR" + <message name="IDS_TIME_SECS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_SEC_SINGULAR" + <message translateable="false" name="IDS_TIME_SECS_SINGULAR" desc=""> NA </message> @@ -290,13 +290,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_LONG_SEC_SINGULAR" + <message name="IDS_TIME_LONG_SECS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> second </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_LONG_SEC_SINGULAR" + <message translateable="false" name="IDS_TIME_LONG_SECS_SINGULAR" desc=""> NA </message> @@ -361,13 +361,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_LONG_SEC_2ND_SINGULAR" + <message name="IDS_TIME_LONG_SECS_2ND_SINGULAR" desc="Second part of 'xx minutes yy seconds' time format where yy (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> second </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_LONG_SEC_2ND_SINGULAR" + <message translateable="false" name="IDS_TIME_LONG_SECS_2NDS_SINGULAR" desc=""> NA </message> @@ -432,13 +432,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_MIN_SINGULAR" + <message name="IDS_TIME_MINS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> min </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_MIN_SINGULAR" + <message translateable="false" name="IDS_TIME_MINS_SINGULAR" desc=""> NA </message> @@ -503,13 +503,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_LONG_MIN_SINGULAR" + <message name="IDS_TIME_LONG_MINS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_LONG_MIN_SINGULAR" + <message translateable="false" name="IDS_TIME_LONG_MINS_SINGULAR" desc=""> NA </message> @@ -574,13 +574,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_LONG_MIN_1ST_SINGULAR" + <message name="IDS_TIME_LONG_MINS_1ST_SINGULAR" desc="First part of 'xx minutes yy seconds' time format (including the space between first and second part, if the language requires a space there) where xx (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute ''' </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_LONG_MIN_1ST_SINGULAR" + <message translateable="false" name="IDS_TIME_LONG_MINS_1ST_SINGULAR" desc=""> NA </message> @@ -645,13 +645,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_LONG_MIN_2ND_SINGULAR" + <message name="IDS_TIME_LONG_MINS_2ND_SINGULAR" desc="Second part of 'xx hours yy minutes' time format where yy (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_LONG_MIN_2ND_SINGULAR" + <message translateable="false" name="IDS_TIME_LONG_MINS_2ND_SINGULAR" desc=""> NA </message> @@ -716,13 +716,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_HOUR_SINGULAR" + <message name="IDS_TIME_HOURS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_HOUR_SINGULAR" + <message translateable="false" name="IDS_TIME_HOURS_SINGULAR" desc=""> NA </message> @@ -787,13 +787,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_HOUR_1ST_SINGULAR" + <message name="IDS_TIME_HOURS_1ST_SINGULAR" desc="First part of 'xx hours yy minutes' time format (including the space between first and second part, if the language requires a space there) where xx (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour ''' </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_HOUR_1ST_SINGULAR" + <message translateable="false" name="IDS_TIME_HOURS_1ST_SINGULAR" desc=""> NA </message> @@ -858,13 +858,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_HOUR_2ND_SINGULAR" + <message name="IDS_TIME_HOURS_2ND_SINGULAR" desc="Second part of 'xx days yy hours' time format where yy (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_HOUR_2ND_SINGULAR" + <message translateable="false" name="IDS_TIME_HOURS_2ND_SINGULAR" desc=""> NA </message> @@ -929,13 +929,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_DAY_SINGULAR" + <message name="IDS_TIME_DAYS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> day </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_DAY_SINGULAR" + <message translateable="false" name="IDS_TIME_DAYS_SINGULAR" desc=""> NA </message> @@ -1000,13 +1000,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_DAY_1ST_SINGULAR" + <message name="IDS_TIME_DAYS_1ST_SINGULAR" desc="First part of 'xx days yy hours' time format (including the space between first and second part, if the language requires a space there) where xx (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> day ''' </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_DAY_1ST_SINGULAR" + <message translateable="false" name="IDS_TIME_DAYS_1ST_SINGULAR" desc=""> NA </message> @@ -1071,13 +1071,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_REMAINING_SEC_SINGULAR" + <message name="IDS_TIME_REMAINING_SECS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec left </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_REMAINING_SEC_SINGULAR" + <message translateable="false" name="IDS_TIME_REMAINING_SECS_SINGULAR" desc=""> NA </message> @@ -1142,13 +1142,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_REMAINING_LONG_SEC_SINGULAR" + <message name="IDS_TIME_REMAINING_LONG_SECS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> second left </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_REMAINING_SEC_SINGULAR" + <message translateable="false" name="IDS_TIME_REMAINING_SECS_SINGULAR" desc=""> NA </message> @@ -1213,13 +1213,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_REMAINING_MIN_SINGULAR" + <message name="IDS_TIME_REMAINING_MINS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> min left </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_REMAINING_MIN_SINGULAR" + <message translateable="false" name="IDS_TIME_REMAINING_MINS_SINGULAR" desc=""> NA </message> @@ -1283,13 +1283,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_REMAINING_LONG_MIN_SINGULAR" + <message name="IDS_TIME_REMAINING_LONG_MINS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute left </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_REMAINING_LONG_MIN_SINGULAR" + <message translateable="false" name="IDS_TIME_REMAINING_LONG_MINS_SINGULAR" desc=""> NA </message> @@ -1353,13 +1353,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_REMAINING_HOUR_SINGULAR" + <message name="IDS_TIME_REMAINING_HOURS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour left </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_REMAINING_HOUR_SINGULAR" + <message translateable="false" name="IDS_TIME_REMAINING_HOURS_SINGULAR" desc=""> NA </message> @@ -1424,13 +1424,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_REMAINING_DAY_SINGULAR" + <message name="IDS_TIME_REMAINING_DAYS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> day left </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_REMAINING_DAY_SINGULAR" + <message translateable="false" name="IDS_TIME_REMAINING_DAYS_SINGULAR" desc=""> NA </message> @@ -1494,13 +1494,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_ELAPSED_SEC_SINGULAR" + <message name="IDS_TIME_ELAPSED_SECS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec ago </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_ELAPSED_SEC_SINGULAR" + <message translateable="false" name="IDS_TIME_ELAPSED_SECS_SINGULAR" desc=""> NA </message> @@ -1565,13 +1565,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_ELAPSED_MIN_SINGULAR" + <message name="IDS_TIME_ELAPSED_MINS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> min ago </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_ELAPSED_MIN_SINGULAR" + <message translateable="false" name="IDS_TIME_ELAPSED_MINS_SINGULAR" desc=""> NA </message> @@ -1636,13 +1636,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_ELAPSED_HOUR_SINGULAR" + <message name="IDS_TIME_ELAPSED_HOURS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour ago </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_ELAPSED_HOUR_SINGULAR" + <message translateable="false" name="IDS_TIME_ELAPSED_HOURS_SINGULAR" desc=""> NA </message> @@ -1707,13 +1707,13 @@ need to be translated for each locale.--> </message> <if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message name="IDS_TIME_ELAPSED_DAY_SINGULAR" + <message name="IDS_TIME_ELAPSED_DAYS_SINGULAR" desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada."> <ph name="NUMBER_ONE"><ex>1</ex>#</ph> day ago </message> </if> <if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']"> - <message translateable="false" name="IDS_TIME_ELAPSED_DAY_SINGULAR" + <message translateable="false" name="IDS_TIME_ELAPSED_DAYS_SINGULAR" desc=""> NA </message> diff --git a/ui/base/strings/ui_strings_am.xtb b/ui/base/strings/ui_strings_am.xtb index 349f686bd1..b2bc258ddb 100644 --- a/ui/base/strings/ui_strings_am.xtb +++ b/ui/base/strings/ui_strings_am.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> ባ</translation> <translation id="3660179305079774227">የላይ ቀስት</translation> +<translation id="3969863827134279083">ወደላይ አውጣ</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> ሁለተኛ ግራ</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> ሜባ/ሰ</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ሰዓት</translation> <translation id="3990502903496589789">የቀኝ ጠርዝ</translation> <translation id="9038489124413477075">ያልተሰየመ አቃፊ</translation> +<translation id="1940483897317142625">ወደ የመስመር መጨረሻ ሰርዝ</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> ደቂቃ</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> ቀናት ይቀራሉ</translation> <translation id="932327136139879170">መነሻ</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">ከ<ph name="NUMBER_FEW"/> ቀናት በፊት</translation> <translation id="5076340679995252485">&ለጥፍ</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> ቴባ</translation> +<translation id="7139614227326422685">ቃል ወደ ቀኝ ውሰድ</translation> <translation id="364720409959344976">የሚሰቀል ዓቃፊ ይምረጡ</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">ከ<ph name="NUMBER_TWO"/> ደቂቃ በፊት</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">ማሳወቂያ ዝጋ</translation> <translation id="6364916375976753737">ወደ ግራ ሸብልል</translation> <translation id="2629089419211541119">ከ<ph name="NUMBER_ONE"/> ሰዓት በፊት</translation> +<translation id="4218160142017529598">ወደኋላ ሰርዝ</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> ደቂቃዎች</translation> <translation id="6982279413068714821">ከ<ph name="NUMBER_DEFAULT"/> ደቂቃ በፊት</translation> <translation id="6945221475159498467">ይምረጡ</translation> <translation id="6620110761915583480">ፋይል አስቀምጥ</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> ሰከንዶች</translation> +<translation id="8924469368910458384">ወደ የመስመር መጀመሪያ ሰርዝ</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> ሰዓት</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> ደቂቃ ቀርቷል</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> ደቂቃ</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ቀናት</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ሰዓቶች ይቀራሉ</translation> <translation id="5329858601952122676">&ሠርዝ</translation> +<translation id="6556866813142980365">ድገም</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> ሴኮንድ</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> ኪባ</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> ደቂቃዎች</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> ደቂቃዎች</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> ደቂቃ ይቀራል</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> ሰከንዶች ቀርተዋል</translation> +<translation id="6903282483217634857">ወደ ቀኝ ውሰድ</translation> <translation id="6659594942844771486">ትር</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> ሜባ</translation> <translation id="4988273303304146523">ከ<ph name="NUMBER_DEFAULT"/> ቀን በፊት</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> ደቂቃ</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> ሰዓት ይቀራል</translation> <translation id="7135556860107312402">ማሳወቂያዎች ከሚከተሉት እንዲመጡ ፍቀድ፦</translation> +<translation id="2479520428668657293">ወደ ቀኝ ውሰድ እና ምርጫ ቀይር</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ሰዓቶች</translation> <translation id="1398853756734560583">አስፋ</translation> <translation id="4250229828105606438">ቅጽበታዊ ገጽ እይታ</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ሰዓቶች</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> ደቂቃ ይቀራል</translation> +<translation id="2557207087669398617">ወደ የመስመር መጀመሪያ ውሰድ</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> ጊባ</translation> <translation id="1901303067676059328">&ሁሉንም ምረጥ</translation> <translation id="2168039046890040389">ወደላይ አንቀሳቅስ</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> ደቂቃ</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ቀን</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> ደቂቃ</translation> +<translation id="6122334925474904337">ቃል ወደ ቀኝ ውሰድ እና ምርጫ ቀይር</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> ደቂቃ</translation> <translation id="8448317557906454022">ከ<ph name="NUMBER_ZERO"/> ሴኮንድ በፊት</translation> <translation id="4927753642311223124">እዚህ ምንም የሚታይ ነገር የለም፣ ይቀጥሉ።</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> ቀን</translation> <translation id="3183922693828471536">ወደ እዚህ ሸብልል</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">ወደታች አውርድ</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ሰዓቶች</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> ኪባ/ሰ</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ሰዓት ይቀራል</translation> <translation id="1413622004203049571">ከ<ph name="NOTIFIER_NAME"/> የሚመጡ ማሳወቂያዎችን አሰናክል</translation> <translation id="2666092431469916601">ላይ</translation> +<translation id="2538759511191347839">ወደ የመስመር መጨረሻ ውሰድ እና ምርጫ ቀይር</translation> +<translation id="928465423150706909">ወደ የመስመር መጨረሻ ውሰድ</translation> <translation id="8331626408530291785">ወደ ላይ ሸብልል</translation> <translation id="7907591526440419938">ፋይል ክፈት</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> ቀን ይቀራል</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">ሚዲያ አቁም</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> ደቂቃ ይቀራል</translation> <translation id="3157931365184549694">እነበረበት መልስ</translation> +<translation id="5349525451964472598">ወደ ግራ ውሰድ እና ምርጫ ቀይር</translation> +<translation id="1781701194097416995">ቃል ወደ ግራ ውሰድ</translation> <translation id="1243314992276662751">ስቀል</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> ቀን ይቀራል</translation> <translation id="8179976553408161302">አስገባ</translation> +<translation id="8471049483003785219">ቃል ወደ ግራ ውሰድ እና ምርጫ ቀይር</translation> <translation id="945522503751344254">ግብረ መልስ ላክ</translation> <translation id="9170848237812810038">&ቀልብስ</translation> <translation id="1285266685456062655">ከ<ph name="NUMBER_FEW"/> ሰዓቶች በፊት</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350">ከ<ph name="NUMBER_ZERO"/> ሰዓት በፊት</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> ጊባ/ሰ</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ቀን</translation> +<translation id="2704295676501803339">ወደ ግራ ውሰድ</translation> <translation id="9098468523912235228">ከ<ph name="NUMBER_DEFAULT"/> ሴኮንድ በፊት</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> ሴኮንድ ይቀራል</translation> <translation id="4570886800634958009">ማሳወቂያ ዘርጋ</translation> +<translation id="566737009157135450">ወደኋላ ሰርዝ</translation> <translation id="436869212180315161">ተጫን</translation> <translation id="4860787810836767172">ከ<ph name="NUMBER_FEW"/> ሴኮንድ በፊት</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> ቴባ/ሰ</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">ከ<ph name="NUMBER_MANY"/> ደቂቃ በፊት</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> ባ/ሰ</translation> <translation id="7649070708921625228">እገዛ</translation> +<translation id="2405367043325750948">ወደፊት ሰርዝ</translation> <translation id="6699343763173986273">የሚዲያ ቀጣይ ትራክ</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> ሰከንዶች ቀርተዋል</translation> <translation id="8226233771743600312">ለአንድ ቀን አትረብሽ</translation> +<translation id="4252565523989510616">ቃል ወደፊት ሰርዝ</translation> <translation id="7457942297256758195">ሁሉንም አጽዳ</translation> <translation id="822618367988303761">ከ<ph name="NUMBER_TWO"/> ቀናት በፊት</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> ደቂቃ</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> ፔባ/ሰ</translation> <translation id="2743387203779672305">ወደ ቅንጥብ ሰሌዳ ገልብጥ</translation> <translation id="8371695176452482769">አሁን ይናገሩ</translation> +<translation id="1167268268675672572">ወደ የመስመር መጀመሪያ ውሰድ እና ምርጫ ቀይር</translation> <translation id="6965382102122355670">ይሁን</translation> <translation id="7850320739366109486">አትረብሽ</translation> <translation id="6978839998405419496">ከ<ph name="NUMBER_ZERO"/> ቀን በፊት</translation> diff --git a/ui/base/strings/ui_strings_ar.xtb b/ui/base/strings/ui_strings_ar.xtb index 4f384be59d..db81eaf4d0 100644 --- a/ui/base/strings/ui_strings_ar.xtb +++ b/ui/base/strings/ui_strings_ar.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> بايت</translation> <translation id="3660179305079774227">مفتاح سهم إلى أعلى</translation> +<translation id="3969863827134279083">تحريك لأعلى</translation> <translation id="7062130397825382308">يتبقى <ph name="NUMBER_ONE"/> ثانية</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> ميغابايات/ثانية</translation> <translation id="5608669887400696928">عدد الساعات: <ph name="NUMBER_DEFAULT"/></translation> <translation id="3990502903496589789">الحافة اليسرى</translation> <translation id="9038489124413477075">مجلد بدون اسم</translation> +<translation id="1940483897317142625">حذف إلى نهاية السطر</translation> <translation id="8507996248087185956">عدد الدقائق: <ph name="NUMBER_DEFAULT"/></translation> <translation id="3520476450377425184">عدد الأيام المتبقيّة <ph name="NUMBER_MANY"/></translation> <translation id="932327136139879170">الصفحة الرئيسية</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">قبل <ph name="NUMBER_FEW"/> يوم</translation> <translation id="5076340679995252485">ل&صق</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> تيرابايت</translation> +<translation id="7139614227326422685">الانتقال كلمة يمينًا</translation> <translation id="364720409959344976">حدد مجلدًا للتحميل</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">قبل <ph name="NUMBER_TWO"/> دقيقة</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">إغلاق الإشعار</translation> <translation id="6364916375976753737">التمرير إلى اليمين</translation> <translation id="2629089419211541119">قبل <ph name="NUMBER_ONE"/> ساعة</translation> +<translation id="4218160142017529598">حذف للخلف</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> دقيقة</translation> <translation id="6982279413068714821">قبل <ph name="NUMBER_DEFAULT"/> دقيقة</translation> <translation id="6945221475159498467">تحديد</translation> <translation id="6620110761915583480">حفظ الملف</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> بلا ثوانٍ</translation> +<translation id="8924469368910458384">حذف إلى بداية السطر</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> ساعة</translation> <translation id="7836361698254323868">عدد الدقائق المتبقية: <ph name="NUMBER_ONE"/></translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> دقيقة</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> يومًا</translation> <translation id="7163503212501929773">عدد الساعات المتبقية: <ph name="NUMBER_MANY"/></translation> <translation id="5329858601952122676">&حذف</translation> +<translation id="6556866813142980365">إعادة</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> ثانية</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> كيلوبايت</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> دقيقة</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412">دقيقتان (<ph name="NUMBER_TWO"/>)</translation> <translation id="50960180632766478">عدد الدقائق المتبقية: <ph name="NUMBER_FEW"/></translation> <translation id="5517291721709019259">يتبقى <ph name="NUMBER_FEW"/> ثواني</translation> +<translation id="6903282483217634857">الانتقال يمينًا</translation> <translation id="6659594942844771486">علامة تبويب</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> ميغابايت</translation> <translation id="4988273303304146523">قبل <ph name="NUMBER_DEFAULT"/> يوم</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773">عدد الدقائق: <ph name="NUMBER_TWO"/></translation> <translation id="5149131957118398098">متبقٍ <ph name="NUMBER_ZERO"/> ساعة</translation> <translation id="7135556860107312402">السماح بالإشعارات من الجهات التالية:</translation> +<translation id="2479520428668657293">الانتقال يمينًا وتعديل التحديد</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ساعات</translation> <translation id="1398853756734560583">تكبير</translation> <translation id="4250229828105606438">لقطة شاشة</translation> <translation id="6690744523875189208">عدد الساعات: <ph name="NUMBER_TWO"/></translation> <translation id="5260878308685146029">عدد الدقائق المتبقية: <ph name="NUMBER_TWO"/></translation> +<translation id="2557207087669398617">الانتقال إلى بداية السطر</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> غيغابايت</translation> <translation id="1901303067676059328">تح&ديد الكلّ</translation> <translation id="2168039046890040389">صفحة إلى أعلى</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> دقيقة</translation> <translation id="9107059250669762581">عدد الأيام <ph name="NUMBER_DEFAULT"/></translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> دقيقة</translation> +<translation id="6122334925474904337">الانتقال كلمة يمينًا وتعديل التحديد</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> دقيقة واحدة</translation> <translation id="8448317557906454022">قبل <ph name="NUMBER_ZERO"/> ثانية</translation> <translation id="4927753642311223124">ليس هناك شيء تراه هنا، انتقل إلى مكان آخر.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> يوم</translation> <translation id="3183922693828471536">التمرير إلى هنا</translation> <translation id="4552416320897244156">مفتاح PgDwn (صفحة إلى أسفل)</translation> +<translation id="3066573403916685335">الانتقال لأسفل</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ساعة</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> كيلوبايت/ثانية</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">عدد الساعات المتبقية: <ph name="NUMBER_ONE"/></translation> <translation id="1413622004203049571">تعطيل الإشعارات من <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">أعلى</translation> +<translation id="2538759511191347839">الانتقال إلى نهاية السطر وتعديل التحديد</translation> +<translation id="928465423150706909">الانتقال إلى نهاية السطر</translation> <translation id="8331626408530291785">التمرير إلى أعلى</translation> <translation id="7907591526440419938">فتح ملف</translation> <translation id="2864069933652346933">متبقٍ <ph name="NUMBER_ZERO"/> يوم</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">إيقاف الوسائط</translation> <translation id="1308727876662951186">متبقٍ <ph name="NUMBER_ZERO"/> دقيقة</translation> <translation id="3157931365184549694">استعادة</translation> +<translation id="5349525451964472598">الانتقال ي</translation> +<translation id="1781701194097416995">الانتقال كلمة يسارًا</translation> <translation id="1243314992276662751">تحميل</translation> <translation id="50030952220075532">عدد الأيام المتبقية <ph name="NUMBER_ONE"/></translation> <translation id="8179976553408161302">تفضل</translation> +<translation id="8471049483003785219">الانتقال كلمة يسارًا وتعديل التحديد</translation> <translation id="945522503751344254">إرسال تعليقات</translation> <translation id="9170848237812810038">&إلغاء</translation> <translation id="1285266685456062655">قبل <ph name="NUMBER_FEW"/> ساعة</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350">قبل <ph name="NUMBER_ZERO"/> ساعة</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> غيغابايت/ثانية</translation> <translation id="6644971472240498405">عدد الأيام <ph name="NUMBER_ONE"/></translation> +<translation id="2704295676501803339">الانتقال يسارًا</translation> <translation id="9098468523912235228">قبل <ph name="NUMBER_DEFAULT"/> ثانية</translation> <translation id="494645311413743213">عدد الثواني المتبقية: <ph name="NUMBER_TWO"/></translation> <translation id="4570886800634958009">توسيع الإشعار</translation> +<translation id="566737009157135450">حذف كلمة للخلف</translation> <translation id="436869212180315161">اضغط</translation> <translation id="4860787810836767172">قبل <ph name="NUMBER_FEW"/> ثانية</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> تيرابايت/ثانية</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">قبل <ph name="NUMBER_MANY"/> دقيقة</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> بايت/ثانية</translation> <translation id="7649070708921625228">مساعدة</translation> +<translation id="2405367043325750948">حذف للأمام</translation> <translation id="6699343763173986273">المقطع الصوتي التالي للوسائط</translation> <translation id="5445120697129764393">يتبقى <ph name="NUMBER_DEFAULT"/> ثانية</translation> <translation id="8226233771743600312">الرجاء عدم الإزعاج لمدة يوم واحد</translation> +<translation id="4252565523989510616">حذف كلمة للأمام</translation> <translation id="7457942297256758195">محو الكل</translation> <translation id="822618367988303761">قبل <ph name="NUMBER_TWO"/> يوم</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> دقيقة</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> بيتابايت/ثانية</translation> <translation id="2743387203779672305">نسخ إلى الحافظة</translation> <translation id="8371695176452482769">تحدث الآن</translation> +<translation id="1167268268675672572">الانتقال إلى بداية السطر وتعديل التحديد</translation> <translation id="6965382102122355670">موافق</translation> <translation id="7850320739366109486">الرجاء عدم الإزعاج</translation> <translation id="6978839998405419496">قبل <ph name="NUMBER_ZERO"/> يوم</translation> diff --git a/ui/base/strings/ui_strings_bg.xtb b/ui/base/strings/ui_strings_bg.xtb index 1f4e8d9163..caaf7a5c69 100644 --- a/ui/base/strings/ui_strings_bg.xtb +++ b/ui/base/strings/ui_strings_bg.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> Б</translation> <translation id="3660179305079774227">Стрелка нагоре</translation> +<translation id="3969863827134279083">Преместване нагоре</translation> <translation id="7062130397825382308">Остава <ph name="NUMBER_ONE"/> секунда</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> МБ/сек</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> часа</translation> <translation id="3990502903496589789">Десн край</translation> <translation id="9038489124413477075">Папка без име</translation> +<translation id="1940483897317142625">Изтриване до края на реда</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> мин</translation> <translation id="3520476450377425184">Остават <ph name="NUMBER_MANY"/> дни</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">преди <ph name="NUMBER_FEW"/> дни</translation> <translation id="5076340679995252485">&Поставяне</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> ТБ</translation> +<translation id="7139614227326422685">Преместване надясно с една дума</translation> <translation id="364720409959344976">Избиране на папка за качване</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">преди <ph name="NUMBER_TWO"/> мин</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Затваряне на известието</translation> <translation id="6364916375976753737">Превъртане наляво</translation> <translation id="2629089419211541119">преди <ph name="NUMBER_ONE"/> час/а</translation> +<translation id="4218160142017529598">Изтриване назад</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> минути</translation> <translation id="6982279413068714821">преди <ph name="NUMBER_DEFAULT"/> мин</translation> <translation id="6945221475159498467">Изберете</translation> <translation id="6620110761915583480">Запазване на файл</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> секунди</translation> +<translation id="8924469368910458384">Изтриване до началото на реда</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Остава <ph name="NUMBER_ONE"/> минута</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> мин</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> дни</translation> <translation id="7163503212501929773">Остават <ph name="NUMBER_MANY"/> часа</translation> <translation id="5329858601952122676">&Изтриване</translation> +<translation id="6556866813142980365">Възстановяване</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> сек</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KБ</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> минути</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> минути</translation> <translation id="50960180632766478">Остават <ph name="NUMBER_FEW"/> мин</translation> <translation id="5517291721709019259">Остават <ph name="NUMBER_FEW"/> секунди</translation> +<translation id="6903282483217634857">Преместване надясно</translation> <translation id="6659594942844771486">Раздел</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> МБ</translation> <translation id="4988273303304146523">преди <ph name="NUMBER_DEFAULT"/> дни</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> мин</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Разрешаване на известията от следните неща:</translation> +<translation id="2479520428668657293">Преместване надясно и промяна на избраното</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> часа</translation> <translation id="1398853756734560583">Увеличаване</translation> <translation id="4250229828105606438">Eкранна снимка</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> часа</translation> <translation id="5260878308685146029">Остават <ph name="NUMBER_TWO"/> мин</translation> +<translation id="2557207087669398617">Преместване до началото на реда</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> ГБ</translation> <translation id="1901303067676059328">&Избиране на всички</translation> <translation id="2168039046890040389">Страница нагоре</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> дни</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> мин</translation> +<translation id="6122334925474904337">Преместване надясно с една дума и промяна на избраното</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> минута</translation> <translation id="8448317557906454022">преди <ph name="NUMBER_ZERO"/> сек</translation> <translation id="4927753642311223124">Тук няма нищо, продължете нататък.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Превъртане до тук</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Преместване надолу</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> часа</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> КБ/сек</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">Остава <ph name="NUMBER_ONE"/> час</translation> <translation id="1413622004203049571">Деактивиране на известията от <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Най-горе</translation> +<translation id="2538759511191347839">Преместване до края на реда и промяна на избраното</translation> +<translation id="928465423150706909">Преместване до края на реда</translation> <translation id="8331626408530291785">Превъртане нагоре</translation> <translation id="7907591526440419938">Отваряне на файл</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Мултимедия, стоп</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Възстановяване</translation> +<translation id="5349525451964472598">Преместване наляво и промяна на избраното</translation> +<translation id="1781701194097416995">Преместване наляво с една дума</translation> <translation id="1243314992276662751">Качване</translation> <translation id="50030952220075532">Остава <ph name="NUMBER_ONE"/> ден</translation> <translation id="8179976553408161302">Влизане</translation> +<translation id="8471049483003785219">Преместване наляво с една дума и промяна на избраното</translation> <translation id="945522503751344254">Изпращане на отзиви</translation> <translation id="9170848237812810038">&Отмяна</translation> <translation id="1285266685456062655">преди <ph name="NUMBER_FEW"/> часа</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> ГБ/сек</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ден</translation> +<translation id="2704295676501803339">Преместване наляво</translation> <translation id="9098468523912235228">преди <ph name="NUMBER_DEFAULT"/> сек</translation> <translation id="494645311413743213">Остават <ph name="NUMBER_TWO"/> сек</translation> <translation id="4570886800634958009">Разгъване на известието</translation> +<translation id="566737009157135450">Изтриване назад дума по дума</translation> <translation id="436869212180315161">Натиснете</translation> <translation id="4860787810836767172">преди <ph name="NUMBER_FEW"/> сек</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> ТБ/сек</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">преди <ph name="NUMBER_MANY"/> мин</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> Б/сек</translation> <translation id="7649070708921625228">Помощ</translation> +<translation id="2405367043325750948">Изтриване напред</translation> <translation id="6699343763173986273">Мултимедия, следващият запис</translation> <translation id="5445120697129764393">Остават <ph name="NUMBER_DEFAULT"/> секунди</translation> <translation id="8226233771743600312">Не безпокойте за един ден</translation> +<translation id="4252565523989510616">Изтриване напред дума по дума</translation> <translation id="7457942297256758195">Изчистване на всички</translation> <translation id="822618367988303761">преди <ph name="NUMBER_TWO"/> дни</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> мин</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> ПБ/сек</translation> <translation id="2743387203779672305">Копиране в буферната памет</translation> <translation id="8371695176452482769">Говорете сега</translation> +<translation id="1167268268675672572">Преместване до началото на реда и промяна на избраното</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Не безпокойте</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_bn.xtb b/ui/base/strings/ui_strings_bn.xtb index 7a70c1a297..329030547b 100644 --- a/ui/base/strings/ui_strings_bn.xtb +++ b/ui/base/strings/ui_strings_bn.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Up Arrow</translation> +<translation id="3969863827134279083">উপরে যান</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> সেকেন্ড বাকি</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ঘন্টা</translation> <translation id="3990502903496589789">ডান প্রান্ত</translation> <translation id="9038489124413477075">নামবিহীন ফোল্ডার</translation> +<translation id="1940483897317142625">লাইনের শেষ পর্যন্ত মুছে ফেলুন</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> মিনিট</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> দিন বাকি</translation> <translation id="932327136139879170">হোম</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&প্রতিলেপন</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">ডানদিকে শব্দ সরান</translation> <translation id="364720409959344976">আপলোড করার জন্য ফোল্ডার নির্বাচন করুন</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">বিজ্ঞপ্তি বন্ধ করা হয়েছে</translation> <translation id="6364916375976753737">বাম দিকে স্ক্রোল করুন</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation> +<translation id="4218160142017529598">পিছনের দিকে মুছুন</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> মিনিট</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> মিনিট আগে</translation> <translation id="6945221475159498467">নির্বাচন</translation> <translation id="6620110761915583480">ফাইল সংরক্ষণ করুন</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> সেকেন্ড</translation> +<translation id="8924469368910458384">লাইনের শুরু পর্যন্ত মুছে ফেলুন</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> মিনিট বাকি</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> মিনিট</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> দিন</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ঘন্টা বাকি</translation> <translation id="5329858601952122676">&মুছুন</translation> +<translation id="6556866813142980365">পুনরায় করুন</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> সেকেন্ড</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> মিনিট</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> মিনিট</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> মিনিট বাকি</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> সেকেন্ড বাকি</translation> +<translation id="6903282483217634857">ডানদিকে সরান</translation> <translation id="6659594942844771486">ট্যাব</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> দিন আগে</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> মিনিট</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">নিম্নলিখিত থেকে বিজ্ঞপ্তিগুলি মঞ্জুরি করুন:</translation> +<translation id="2479520428668657293">ডানদিকে সরান এবং নির্বাচন পরিবর্তন করুন</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ঘন্টা</translation> <translation id="1398853756734560583">বড় করুন</translation> <translation id="4250229828105606438">স্ক্রীনশট</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ঘন্টা</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> মিনিট বাকি</translation> +<translation id="2557207087669398617">লাইনের শুরু পর্যন্ত সরান</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">&সকল নির্বাচন করুন</translation> <translation id="2168039046890040389">পৃষ্ঠা নীচে</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> দিন</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> মিনিট</translation> +<translation id="6122334925474904337">শব্দকে ডানদিকে সরান এবং নির্বাচন পরিবর্তন করুন</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> মিনিট</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">এখানে দেখার কিছু নেই , এগিয়ে যান৷</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">এখান পর্যন্ত স্ক্রোল করুন</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">নীচে যান</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ঘন্টা</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ঘন্টা বাকি</translation> <translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> এর থেকে বিজ্ঞপ্তিগুলি অক্ষম করুন</translation> <translation id="2666092431469916601">শীর্ষ</translation> +<translation id="2538759511191347839">লাইনের শেষ অবধি সরান এবং নির্বাচন পরিবর্তন করুন</translation> +<translation id="928465423150706909">লাইনের শেষ পর্যন্ত সরান</translation> <translation id="8331626408530291785">উপরে স্ক্রোল করুন</translation> <translation id="7907591526440419938">খোলা ফাইল</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">মিডিয়া থামান</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">পুনরুদ্ধার করুন</translation> +<translation id="5349525451964472598">বামদিকে সরান এবং নির্বাচন পরিবর্তন করুন</translation> +<translation id="1781701194097416995">শব্দকে বামদিকে সরান</translation> <translation id="1243314992276662751">আপলোড</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> দিন বাকি</translation> <translation id="8179976553408161302">প্রবেশ করুন</translation> +<translation id="8471049483003785219">শব্দকে বামদিকে সরান এবং নির্বাচন পরিবর্তন করুন</translation> <translation id="945522503751344254">প্রতিক্রিয়া প্রেরণ করুন</translation> <translation id="9170848237812810038">&পূর্বাবস্থায় ফিরুন</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> দিন</translation> +<translation id="2704295676501803339">বামদিকে সরান</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> সেকেন্ড আগে</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> সেকেন্ড বাকি</translation> <translation id="4570886800634958009">বিজ্ঞপ্তি প্রসারিত করুন</translation> +<translation id="566737009157135450">পিছনের দিকে শব্দকে মুছুন</translation> <translation id="436869212180315161">টিপুন</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">সহায়তা</translation> +<translation id="2405367043325750948">সামনের দিকে মুছুন</translation> <translation id="6699343763173986273">মিডিয়া পরবর্তী ট্র্যাক</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> সেকেন্ড বাকি</translation> <translation id="8226233771743600312">এক দিনের জন্য বিরক্ত করবেন না</translation> +<translation id="4252565523989510616">শব্দকে সামনের দিকে মুছুন</translation> <translation id="7457942297256758195">সমস্ত সাফ করুন</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> মিনিট</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">ক্লিপবোর্ডে অনুলিপি করুন</translation> <translation id="8371695176452482769">এখনই বলুন</translation> +<translation id="1167268268675672572">লাইনের শুরু পর্যন্ত সরান এবং নির্বাচন পরিবর্তন করুন</translation> <translation id="6965382102122355670">ওকে</translation> <translation id="7850320739366109486">বিরক্ত করবেন না</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_ca.xtb b/ui/base/strings/ui_strings_ca.xtb index a373c758fe..5a7f04968d 100644 --- a/ui/base/strings/ui_strings_ca.xtb +++ b/ui/base/strings/ui_strings_ca.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Fletxa amunt</translation> +<translation id="3969863827134279083">Mou cap amunt</translation> <translation id="7062130397825382308">Queda <ph name="NUMBER_ONE"/> segon.</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> hores</translation> <translation id="3990502903496589789">Extrem dret</translation> <translation id="9038489124413477075">Carpeta sense nom</translation> +<translation id="1940483897317142625">Suprimeix fins al final de la línia</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuts</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dies restants</translation> <translation id="932327136139879170">Inici</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Fa <ph name="NUMBER_FEW"/> dies</translation> <translation id="5076340679995252485">Engan&xa</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Mou la paraula a la dreta</translation> <translation id="364720409959344976">Selecció d'una carpeta per penjar</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">Fa <ph name="NUMBER_TWO"/> minuts</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Tanca la notificació</translation> <translation id="6364916375976753737">Desplaçament a l'esquerra</translation> <translation id="2629089419211541119">Fa <ph name="NUMBER_ONE"/> hora</translation> +<translation id="4218160142017529598">Suprimeix cap enrere</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuts</translation> <translation id="6982279413068714821">Fa <ph name="NUMBER_DEFAULT"/> minuts</translation> <translation id="6945221475159498467">Selecciona</translation> <translation id="6620110761915583480">Desa el fitxer</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> segons</translation> +<translation id="8924469368910458384">Suprimeix fins al començament de la línia</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Queda <ph name="NUMBER_ONE"/> minut</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minut</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dies</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hores restants</translation> <translation id="5329858601952122676">&Suprimeix</translation> +<translation id="6556866813142980365">Refés</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> segons</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minuts</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuts</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuts restants</translation> <translation id="5517291721709019259">Queden <ph name="NUMBER_FEW"/> segons</translation> +<translation id="6903282483217634857">Mou a la dreta</translation> <translation id="6659594942844771486">Pestanya</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Fa <ph name="NUMBER_DEFAULT"/> dies</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minuts</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Permet notificacions de les fonts següents:</translation> +<translation id="2479520428668657293">Mou a la dreta i modifica la selecció</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> hores</translation> <translation id="1398853756734560583">Maximitza</translation> <translation id="4250229828105606438">Captura de pantalla</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hores</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minuts restants</translation> +<translation id="2557207087669398617">Mou al començament de la línia</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Selecciona-ho &tot</translation> <translation id="2168039046890040389">Re Pàg</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dies</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minuts</translation> +<translation id="6122334925474904337">Mou la paraula a la dreta i modifica la selecció</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minut</translation> <translation id="8448317557906454022">Fa <ph name="NUMBER_ZERO"/> segons</translation> <translation id="4927753642311223124">No hi ha cap notificació, podeu continuar.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Desplaçament fins aquí</translation> <translation id="4552416320897244156">Av Pàg</translation> +<translation id="3066573403916685335">Mou cap avall</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hores</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hores restants</translation> <translation id="1413622004203049571">Desactiva les notificacions de <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Superior</translation> +<translation id="2538759511191347839">Mou al final de la línia i modifica la selecció</translation> +<translation id="928465423150706909">Mou al final de la línia</translation> <translation id="8331626408530291785">Desplaçament amunt</translation> <translation id="7907591526440419938">Obre un fitxer</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Fitxer multimèdia: atura</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Restaura</translation> +<translation id="5349525451964472598">Mou a l'esquerra i modifica la selecció</translation> +<translation id="1781701194097416995">Mou la paraula a l'esquerra</translation> <translation id="1243314992276662751">Penja</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> dia restant</translation> <translation id="8179976553408161302">Intro</translation> +<translation id="8471049483003785219">Mou la paraula a l'esquerra i modifica la selecció</translation> <translation id="945522503751344254">Envia comentaris</translation> <translation id="9170848237812810038">&Desfés</translation> <translation id="1285266685456062655">Fa <ph name="NUMBER_FEW"/> hores</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dia</translation> +<translation id="2704295676501803339">Mou a l'esquerra</translation> <translation id="9098468523912235228">Fa <ph name="NUMBER_DEFAULT"/> segons</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> segons restants</translation> <translation id="4570886800634958009">Amplia la notificació</translation> +<translation id="566737009157135450">Suprimeix la paraula cap enrere</translation> <translation id="436869212180315161">Prem</translation> <translation id="4860787810836767172">Fa <ph name="NUMBER_FEW"/> segons</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">Fa <ph name="NUMBER_MANY"/> minuts</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Ajuda</translation> +<translation id="2405367043325750948">Suprimeix cap endavant</translation> <translation id="6699343763173986273">Fitxer multimèdia: pista següent</translation> <translation id="5445120697129764393">Queden <ph name="NUMBER_DEFAULT"/> segons.</translation> <translation id="8226233771743600312">No molesteu durant un dia</translation> +<translation id="4252565523989510616">Suprimeix la paraula cap endavant</translation> <translation id="7457942297256758195">Esborra-ho tot</translation> <translation id="822618367988303761">Fa <ph name="NUMBER_TWO"/> dies</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuts</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Copia al porta-retalls</translation> <translation id="8371695176452482769">Parleu ara</translation> +<translation id="1167268268675672572">Mou al començament de la línia i modifica la selecció</translation> <translation id="6965382102122355670">D'acord</translation> <translation id="7850320739366109486">No molesteu</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_cs.xtb b/ui/base/strings/ui_strings_cs.xtb index e26b1f2667..ece04e7fcf 100644 --- a/ui/base/strings/ui_strings_cs.xtb +++ b/ui/base/strings/ui_strings_cs.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Klávesa šipka nahoru</translation> +<translation id="3969863827134279083">Přesunout nahoru</translation> <translation id="7062130397825382308">Zbývá <ph name="NUMBER_ONE"/> sekunda</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> hod</translation> <translation id="3990502903496589789">Pravý okraj</translation> <translation id="9038489124413477075">Nepojmenovaná složka</translation> +<translation id="1940483897317142625">Smazat do konce řádku</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minut</translation> <translation id="3520476450377425184">Zbývá: <ph name="NUMBER_MANY"/> dnů</translation> <translation id="932327136139879170">Domů</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Před <ph name="NUMBER_FEW"/> dny</translation> <translation id="5076340679995252485">Vložit</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Přesunout slovo doprava</translation> <translation id="364720409959344976">Vyberte složku pro nahrávání</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Zavřít oznámení</translation> <translation id="6364916375976753737">Posuv doleva</translation> <translation id="2629089419211541119">Před <ph name="NUMBER_ONE"/> hodinou</translation> +<translation id="4218160142017529598">Smazat zpět</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> min</translation> <translation id="6982279413068714821">před <ph name="NUMBER_DEFAULT"/> minutami</translation> <translation id="6945221475159498467">Vybrat</translation> <translation id="6620110761915583480">Uložit soubor</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> s</translation> +<translation id="8924469368910458384">Smazat k začátku řádku</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Zbývá <ph name="NUMBER_ONE"/> minuta</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dnů</translation> <translation id="7163503212501929773">Zbývá: <ph name="NUMBER_MANY"/> hod</translation> <translation id="5329858601952122676">&Smazat</translation> +<translation id="6556866813142980365">Opakovat</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> s</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> min</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> min</translation> <translation id="50960180632766478">Zbývá: <ph name="NUMBER_FEW"/> min</translation> <translation id="5517291721709019259">Zbývají <ph name="NUMBER_FEW"/> sekundy</translation> +<translation id="6903282483217634857">Přesunout doprava</translation> <translation id="6659594942844771486">Karta</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Před <ph name="NUMBER_DEFAULT"/> dny</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> min</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Povolit oznámení z následujících zdrojů:</translation> +<translation id="2479520428668657293">Přesunout doprava a změnit výběr</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> hod</translation> <translation id="1398853756734560583">Maximalizovat</translation> <translation id="4250229828105606438">Snímek obrazovky</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hod</translation> <translation id="5260878308685146029">Zbývá: <ph name="NUMBER_TWO"/> min</translation> +<translation id="2557207087669398617">Přesunout na začátek řádku</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">&Vybrat vše</translation> <translation id="2168039046890040389">Klávesa PageUp</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dnů</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> min</translation> +<translation id="6122334925474904337">Přesunout slovo doprava a změnit výběr</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> min</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Tady není nic k vidění, rozejděte se.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Posunout sem</translation> <translation id="4552416320897244156">Klávesa PgDwn</translation> +<translation id="3066573403916685335">Posunout dolů</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hod</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">Zbývá: <ph name="NUMBER_ONE"/> hod</translation> <translation id="1413622004203049571">Deaktivovat oznámení ze služby <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Nahoru</translation> +<translation id="2538759511191347839">Přesunout na konec řádku a změnit výběr</translation> +<translation id="928465423150706909">Přesunout na konec řádku</translation> <translation id="8331626408530291785">Posuv nahoru</translation> <translation id="7907591526440419938">Otevřít soubor</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Média – zastavit</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Obnovit</translation> +<translation id="5349525451964472598">Přesunout doleva a upravit výběr</translation> +<translation id="1781701194097416995">Přesunout slovo doleva</translation> <translation id="1243314992276662751">Nahrát</translation> <translation id="50030952220075532">Zbývá: <ph name="NUMBER_ONE"/> den</translation> <translation id="8179976553408161302">Začít</translation> +<translation id="8471049483003785219">Přesunout slovo doleva a upravit výběr</translation> <translation id="945522503751344254">Odeslat zpětnou vazbu</translation> <translation id="9170848237812810038">Z&pět</translation> <translation id="1285266685456062655">Před <ph name="NUMBER_FEW"/> hodinami</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> den</translation> +<translation id="2704295676501803339">Přesunout doleva</translation> <translation id="9098468523912235228">Před <ph name="NUMBER_DEFAULT"/> sekundami</translation> <translation id="494645311413743213">Zbývá: <ph name="NUMBER_TWO"/> s</translation> <translation id="4570886800634958009">Rozbalit oznámení</translation> +<translation id="566737009157135450">Smazat slovo zpět</translation> <translation id="436869212180315161">Tisk</translation> <translation id="4860787810836767172">Před <ph name="NUMBER_FEW"/> sekundami</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Nápověda</translation> +<translation id="2405367043325750948">Smazat vpřed</translation> <translation id="6699343763173986273">Média – další skladba</translation> <translation id="5445120697129764393">Zbývá <ph name="NUMBER_DEFAULT"/> sekund</translation> <translation id="8226233771743600312">Nerušit jeden den</translation> +<translation id="4252565523989510616">Smazat slovo vpřed</translation> <translation id="7457942297256758195">Vymazat vše</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Zkopírovat do schránky</translation> <translation id="8371695176452482769">Mluvte</translation> +<translation id="1167268268675672572">Přesunout na začátek řádku a upravit výběr</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Nerušit</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_da.xtb b/ui/base/strings/ui_strings_da.xtb index bd4043344a..e5afe75e03 100644 --- a/ui/base/strings/ui_strings_da.xtb +++ b/ui/base/strings/ui_strings_da.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Pil opad</translation> +<translation id="3969863827134279083">Flyt op</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> sekund tilbage</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/sek.</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> timer</translation> <translation id="3990502903496589789">Højre kant</translation> <translation id="9038489124413477075">Unavngiven mappe</translation> +<translation id="1940483897317142625">Slet til slutningen af linjen</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutter</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dage tilbage</translation> <translation id="932327136139879170">Start</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> dage siden</translation> <translation id="5076340679995252485">&Indsæt</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Flyt til højre efter ordet</translation> <translation id="364720409959344976">Vælg den mappe, der skal uploades</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minutter siden</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Luk underretning</translation> <translation id="6364916375976753737">Scroll Left</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> time siden</translation> +<translation id="4218160142017529598">Slet bagud</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutter</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minutter siden</translation> <translation id="6945221475159498467">Vælg</translation> <translation id="6620110761915583480">Gem fil</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekunder</translation> +<translation id="8924469368910458384">Slet til begyndelsen af linjen</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minut tilbage</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min.</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dage</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> timer tilbage</translation> <translation id="5329858601952122676">&Slet</translation> +<translation id="6556866813142980365">Gør det igen</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sek.</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutter</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutter</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutter tilbage</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> sekunder tilbage</translation> +<translation id="6903282483217634857">Flyt til højre</translation> <translation id="6659594942844771486">Fane</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> dage siden</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutter</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Tillad underretninger fra følgende:</translation> +<translation id="2479520428668657293">Flyt til højre, og rediger markering</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> timer</translation> <translation id="1398853756734560583">Maksimer</translation> <translation id="4250229828105606438">Skærmbillede</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> timer</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minutter tilbage</translation> +<translation id="2557207087669398617">Flyt til begyndelsen af linjen</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Vælg &alle</translation> <translation id="2168039046890040389">Side op</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dage</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutter</translation> +<translation id="6122334925474904337">Flyt ordet til højre, og rediger markering</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minut</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> sekunder siden</translation> <translation id="4927753642311223124">Der er intet at se her, så du kan bare gå videre.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Scroll hertil</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Flyt ned</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> timer</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> kB/sek.</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> timer tilbage</translation> <translation id="1413622004203049571">Deaktiver underretninger fra <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Top</translation> +<translation id="2538759511191347839">Flyt til slutningen af linjen, og rediger markering</translation> +<translation id="928465423150706909">Flyt til slutningen af linjen</translation> <translation id="8331626408530291785">Scroll Up</translation> <translation id="7907591526440419938">Åbn fil</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Medie: Stop</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Gendan</translation> +<translation id="5349525451964472598">Flyt til venstre, og rediger markering</translation> +<translation id="1781701194097416995">Flyt til venstre efter ordet</translation> <translation id="1243314992276662751">Upload</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> dage tilbage</translation> <translation id="8179976553408161302">Start</translation> +<translation id="8471049483003785219">Flyt ord til venstre, og rediger markering</translation> <translation id="945522503751344254">Send feedback</translation> <translation id="9170848237812810038">&Fortryd</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> timer siden</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/sek.</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/>dag</translation> +<translation id="2704295676501803339">Flyt til vestre</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> sekunder siden</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> sek. tilbage</translation> <translation id="4570886800634958009">Udvid underretning</translation> +<translation id="566737009157135450">Slet baglæns med et ord</translation> <translation id="436869212180315161">Tryk</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> sekunder siden</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/sek.</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minutter siden</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/sek.</translation> <translation id="7649070708921625228">Hjælp</translation> +<translation id="2405367043325750948">Slet fremad</translation> <translation id="6699343763173986273">Medie: Næste nummer</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> sekunder tilbage</translation> <translation id="8226233771743600312">Vil ikke forstyrres i et døgn</translation> +<translation id="4252565523989510616">Slet fremad med et ord</translation> <translation id="7457942297256758195">Ryd alle</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> dage siden</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutter</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/sek.</translation> <translation id="2743387203779672305">Kopiér til udklipsholderen</translation> <translation id="8371695176452482769">Indtal nu</translation> +<translation id="1167268268675672572">Flyt til begyndelsen af linjen, og rediger markering</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Vil ikke forstyrres</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_de.xtb b/ui/base/strings/ui_strings_de.xtb index 39c0099484..4062ce5716 100644 --- a/ui/base/strings/ui_strings_de.xtb +++ b/ui/base/strings/ui_strings_de.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Aufwärtspfeil</translation> +<translation id="3969863827134279083">Nach oben</translation> <translation id="7062130397825382308">Noch <ph name="NUMBER_ONE"/> Sekunde</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> Stunden</translation> <translation id="3990502903496589789">Rechter Rand</translation> <translation id="9038489124413477075">Unbenannter Ordner</translation> +<translation id="1940483897317142625">Bis zum Zeilenende löschen</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> Minuten</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> Tage übrig</translation> <translation id="932327136139879170">Startseite</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&Einfügen</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Ein Wort nach rechts</translation> <translation id="364720409959344976">Ordner zum Hochladen auswählen</translation> <translation id="4999762576397546063">Strg+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Benachrichtigung schließen</translation> <translation id="6364916375976753737">Nach links blättern</translation> <translation id="2629089419211541119">Vor <ph name="NUMBER_ONE"/> Stunde</translation> +<translation id="4218160142017529598">Letztes Zeichen löschen</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> Minuten</translation> <translation id="6982279413068714821">Vor <ph name="NUMBER_DEFAULT"/> Minuten</translation> <translation id="6945221475159498467">Auswählen</translation> <translation id="6620110761915583480">Datei speichern</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> Sekunden</translation> +<translation id="8924469368910458384">Bis zum Zeilenanfang löschen</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Noch <ph name="NUMBER_ONE"/> Minute</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> Minute</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> Tage</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> Stunden übrig</translation> <translation id="5329858601952122676">&Löschen</translation> +<translation id="6556866813142980365">Wiederholen</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> Sekunden</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> Minuten</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> Minuten</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> Minuten übrig</translation> <translation id="5517291721709019259">Noch <ph name="NUMBER_FEW"/> Sekunden</translation> +<translation id="6903282483217634857">Nach rechts</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Vor <ph name="NUMBER_DEFAULT"/> Tagen</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> Minuten</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Alle Benachrichtigungen zulassen von:</translation> +<translation id="2479520428668657293">Nach rechts und Auswahl ändern</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> Stunden</translation> <translation id="1398853756734560583">Vergrößern</translation> <translation id="4250229828105606438">Screenshot</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> Stunden</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> Minuten übrig</translation> +<translation id="2557207087669398617">Zum Zeilenanfang</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">&Alles auswählen</translation> <translation id="2168039046890040389">Nach oben</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> Tage</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> Minuten</translation> +<translation id="6122334925474904337">Ein Wort nach rechts und Auswahl ändern</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> Minute</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Sie haben keine Benachrichtigungen.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Hierher blättern</translation> <translation id="4552416320897244156">BildAb</translation> +<translation id="3066573403916685335">Nach unten</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> Stunden</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> Stunde übrig</translation> <translation id="1413622004203049571">Benachrichtigungen von <ph name="NOTIFIER_NAME"/> deaktivieren</translation> <translation id="2666092431469916601">Oben</translation> +<translation id="2538759511191347839">Zum Zeilenende und Auswahl ändern</translation> +<translation id="928465423150706909">Zum Zeilenende</translation> <translation id="8331626408530291785">Nach oben blättern</translation> <translation id="7907591526440419938">Datei öffnen</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Medien – Stopp</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Wiederherstellen</translation> +<translation id="5349525451964472598">Nach links und Auswahl ändern</translation> +<translation id="1781701194097416995">Ein Wort nach links</translation> <translation id="1243314992276662751">Hochladen</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> Tag übrig</translation> <translation id="8179976553408161302">Enter</translation> +<translation id="8471049483003785219">Ein Wort nach links und Auswahl ändern</translation> <translation id="945522503751344254">Feedback geben</translation> <translation id="9170848237812810038">&Rückgängig</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> Tag</translation> +<translation id="2704295676501803339">Nach links</translation> <translation id="9098468523912235228">Vor <ph name="NUMBER_DEFAULT"/> Sekunden</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> Sekunden übrig</translation> <translation id="4570886800634958009">Benachrichtigung anzeigen</translation> +<translation id="566737009157135450">Letztes Wort löschen</translation> <translation id="436869212180315161">Klicken</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> Byte/s</translation> <translation id="7649070708921625228">Hilfe</translation> +<translation id="2405367043325750948">Nächstes Zeichen löschen</translation> <translation id="6699343763173986273">Medien – nächster Titel</translation> <translation id="5445120697129764393">Noch <ph name="NUMBER_DEFAULT"/> Sekunden</translation> <translation id="8226233771743600312">1 Tag nicht stören</translation> +<translation id="4252565523989510616">Nächstes Wort löschen</translation> <translation id="7457942297256758195">Alle löschen</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> Minuten</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">In Zwischenablage kopieren</translation> <translation id="8371695176452482769">Jetzt sprechen</translation> +<translation id="1167268268675672572">Zum Zeilenanfang und Auswahl ändern</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Nicht stören</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_el.xtb b/ui/base/strings/ui_strings_el.xtb index c331a60471..ff3650e841 100644 --- a/ui/base/strings/ui_strings_el.xtb +++ b/ui/base/strings/ui_strings_el.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> Β</translation> <translation id="3660179305079774227">Πάνω βέλος</translation> +<translation id="3969863827134279083">Μετακίνηση επάνω</translation> <translation id="7062130397825382308">Απομένει <ph name="NUMBER_ONE"/> δευτερόλεπτο</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ώρες</translation> <translation id="3990502903496589789">Δεξιά άκρη</translation> <translation id="9038489124413477075">Φάκελος χωρίς όνομα</translation> +<translation id="1940483897317142625">Διαγραφή έως το τέλος της γραμμής</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> λεπτά</translation> <translation id="3520476450377425184">Υπολείπονται <ph name="NUMBER_MANY"/> ημέρες</translation> <translation id="932327136139879170">Αρχική σελίδα</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Πριν από <ph name="NUMBER_FEW"/> ημέρες</translation> <translation id="5076340679995252485">&Επικόλληση</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Μετακίνηση στην επόμενη λέξη δεξιά</translation> <translation id="364720409959344976">Επιλέξτε φάκελο για μεταφόρτωση</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">Πριν από <ph name="NUMBER_TWO"/> λεπτά</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Κλείσιμο ειδοποίησης</translation> <translation id="6364916375976753737">Κύλιση αριστερά</translation> <translation id="2629089419211541119">Πριν από <ph name="NUMBER_ONE"/> ώρα</translation> +<translation id="4218160142017529598">Διαγραφή προς τα πίσω</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> λεπτά</translation> <translation id="6982279413068714821">Πριν από <ph name="NUMBER_DEFAULT"/> λεπτά</translation> <translation id="6945221475159498467">Επιλογή</translation> <translation id="6620110761915583480">Αποθήκευση Αρχείου</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> δευτερόλεπτα</translation> +<translation id="8924469368910458384">Διαγραφή έως την αρχή της γραμμής</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Υπολείπεται <ph name="NUMBER_ONE"/> λεπτό</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> λεπτό</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ημέρες</translation> <translation id="7163503212501929773">Υπολείπονται <ph name="NUMBER_MANY"/> ώρες</translation> <translation id="5329858601952122676">&Διαγραφή</translation> +<translation id="6556866813142980365">Επανάληψη ενέργειας</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> δευτερόλεπτα</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> λεπτά</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> λεπτά</translation> <translation id="50960180632766478">Υπολείπονται <ph name="NUMBER_FEW"/> λεπτά</translation> <translation id="5517291721709019259">Απομένουν <ph name="NUMBER_FEW"/> δευτερόλεπτα</translation> +<translation id="6903282483217634857">Μετακίνηση δεξιά</translation> <translation id="6659594942844771486">Καρτέλα</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Πριν από <ph name="NUMBER_DEFAULT"/> ημέρες</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> λεπτά</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Να επιτρέπονται ειδοποιήσεις από:</translation> +<translation id="2479520428668657293">Μετακίνηση δεξιά και τροποποίηση επιλογής</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ώρες</translation> <translation id="1398853756734560583">Μεγιστοποίηση</translation> <translation id="4250229828105606438">Στιγμιότυπο οθόνης</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ώρες</translation> <translation id="5260878308685146029">Υπολείπονται <ph name="NUMBER_TWO"/> λεπτά</translation> +<translation id="2557207087669398617">Μετακίνηση στην αρχή της γραμμής</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Επιλογή όλ&ων</translation> <translation id="2168039046890040389">Προηγούμενη σελίδα</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ημέρες</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> λεπτά</translation> +<translation id="6122334925474904337">Μετακίνηση στην επόμενη λέξη δεξιά και τροποποίηση επιλογής</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> λεπτό</translation> <translation id="8448317557906454022">Πριν από <ph name="NUMBER_ZERO"/> δευτερόλεπτα</translation> <translation id="4927753642311223124">Δεν υπάρχει τίποτα να δείτε εδώ, συνεχίστε με αυτό που κάνατε.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Κύλιση εδώ</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Μετακίνηση κάτω</translation> <translation id="7052633198403197513">Πλήκτρο F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ώρες</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">Υπολείπεται <ph name="NUMBER_ONE"/> ώρα</translation> <translation id="1413622004203049571">Απενεργοποίηση ειδοποιήσεων από <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Κορυφή</translation> +<translation id="2538759511191347839">Μετακίνηση στο τέλος της γραμμής και τροποποίηση επιλογής</translation> +<translation id="928465423150706909">Μετακίνηση στο τέλος της γραμμής</translation> <translation id="8331626408530291785">Κύλιση επάνω</translation> <translation id="7907591526440419938">Άνοιγμα Αρχείου</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Διακοπή πολυμέσων</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Επαναφορά</translation> +<translation id="5349525451964472598">Μετακίνηση αριστερά και τροποποίηση επιλογής</translation> +<translation id="1781701194097416995">Μετακίνηση στην προηγούμενη λέξη προς τα αριστερά</translation> <translation id="1243314992276662751">Μεταφόρτωση</translation> <translation id="50030952220075532">Υπολείπεται <ph name="NUMBER_ONE"/> ημέρα</translation> <translation id="8179976553408161302">Είσοδος</translation> +<translation id="8471049483003785219">Μετακίνηση στην προηγούμενη λέξη προς τα αριστερά και τροποποίηση επιλογής</translation> <translation id="945522503751344254">Αποστολή σχολίων</translation> <translation id="9170848237812810038">Αναί&ρεση</translation> <translation id="1285266685456062655">Πριν από <ph name="NUMBER_FEW"/> ώρες</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ημέρα</translation> +<translation id="2704295676501803339">Μετακίνηση αριστερά</translation> <translation id="9098468523912235228">Πριν από <ph name="NUMBER_DEFAULT"/> δευτερόλεπτα</translation> <translation id="494645311413743213">Υπολείπονται <ph name="NUMBER_TWO"/> δευτερόλεπτα</translation> <translation id="4570886800634958009">Επέκταση ειδοποίησης</translation> +<translation id="566737009157135450">Διαγραφή λέξης προς τα πίσω</translation> <translation id="436869212180315161">Πιέστε</translation> <translation id="4860787810836767172">Πριν από <ph name="NUMBER_FEW"/> δευτερόλεπτα</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">Πριν από <ph name="NUMBER_MANY"/> λεπτά</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Βοήθεια</translation> +<translation id="2405367043325750948">Διαγραφή προς τα εμπρός</translation> <translation id="6699343763173986273">Επόμενο κομμάτι πολυμέσων</translation> <translation id="5445120697129764393">Απομένουν <ph name="NUMBER_DEFAULT"/> δευτερόλεπτα</translation> <translation id="8226233771743600312">Μην ενοχλείτε για μία ημέρα</translation> +<translation id="4252565523989510616">Διαγραφή επόμενης λέξης προς τα εμπρός</translation> <translation id="7457942297256758195">Εκκαθάριση όλων</translation> <translation id="822618367988303761">Πριν από <ph name="NUMBER_TWO"/> ημέρες</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> λεπτά</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Αντιγραφή στο πρόχειρο</translation> <translation id="8371695176452482769">Μιλήστε τώρα</translation> +<translation id="1167268268675672572">Μετακίνηση στην αρχή της γραμμής και τροποποίηση επιλογής</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Μην ενοχλείτε</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_en-GB.xtb b/ui/base/strings/ui_strings_en-GB.xtb index cb6de0b90a..5c5aa58e87 100644 --- a/ui/base/strings/ui_strings_en-GB.xtb +++ b/ui/base/strings/ui_strings_en-GB.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Up Arrow</translation> +<translation id="3969863827134279083">Move Up</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> second left</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> hours</translation> <translation id="3990502903496589789">Right Edge</translation> <translation id="9038489124413477075">Unnamed Folder</translation> +<translation id="1940483897317142625">Delete To End Of Line</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> mins</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&Paste</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Move Word Right</translation> <translation id="364720409959344976">Select Folder to Upload</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Notification close</translation> <translation id="6364916375976753737">Scroll Left</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation> +<translation id="4218160142017529598">Delete Backward</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutes</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation> <translation id="6945221475159498467">Select</translation> <translation id="6620110761915583480">Save File</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation> +<translation id="8924469368910458384">Delete To Beginning Of Line</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minute left</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> days</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hours left</translation> <translation id="5329858601952122676">&Delete</translation> +<translation id="6556866813142980365">Redo</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">Move Right</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> mins</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Allow notifications from the following:</translation> +<translation id="2479520428668657293">Move Right And Modify Selection</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> hours</translation> <translation id="1398853756734560583">Maximise</translation> <translation id="4250229828105606438">Screenshot</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hours</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> mins left</translation> +<translation id="2557207087669398617">Move To Beginning Of Line</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Select &all</translation> <translation id="2168039046890040389">Page Up</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> days</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation> +<translation id="6122334925474904337">Move Word Right And Modify Selection</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minute</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Nothing to see here, move along.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Scroll to Here</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Move Down</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hours</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hour left</translation> <translation id="1413622004203049571">Disable notifications from <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Top</translation> +<translation id="2538759511191347839">Move To End Of Line And Modify Selection</translation> +<translation id="928465423150706909">Move To End Of Line</translation> <translation id="8331626408530291785">Scroll Up</translation> <translation id="7907591526440419938">Open File</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Media Stop</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Restore</translation> +<translation id="5349525451964472598">Move Left And Modify Selection</translation> +<translation id="1781701194097416995">Move Word Left</translation> <translation id="1243314992276662751">Upload</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> day left</translation> <translation id="8179976553408161302">Enter</translation> +<translation id="8471049483003785219">Move Word Left And Modify Selection</translation> <translation id="945522503751344254">Send feedback</translation> <translation id="9170848237812810038">&Undo</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> day</translation> +<translation id="2704295676501803339">Move Left</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation> <translation id="4570886800634958009">Notification expand</translation> +<translation id="566737009157135450">Delete Word Backward</translation> <translation id="436869212180315161">Press</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Help</translation> +<translation id="2405367043325750948">Delete Forward</translation> <translation id="6699343763173986273">Media Next Track</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> seconds left</translation> <translation id="8226233771743600312">Do not disturb for one day</translation> +<translation id="4252565523989510616">Delete Word Forward</translation> <translation id="7457942297256758195">Clear All</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Copy to clipboard</translation> <translation id="8371695176452482769">Speak now</translation> +<translation id="1167268268675672572">Move To Beginning Of Line And Modify Selection</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Do Not Disturb</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_es-419.xtb b/ui/base/strings/ui_strings_es-419.xtb index 79b04ffe29..903cb8ccb1 100644 --- a/ui/base/strings/ui_strings_es-419.xtb +++ b/ui/base/strings/ui_strings_es-419.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Flecha arriba</translation> +<translation id="3969863827134279083">Subir</translation> <translation id="7062130397825382308">Falta <ph name="NUMBER_ONE"/> segundo.</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> de MB</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> horas</translation> <translation id="3990502903496589789">Borde derecho</translation> <translation id="9038489124413477075">Carpeta sin nombre</translation> +<translation id="1940483897317142625">Eliminar hasta el final de la línea</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutos</translation> <translation id="3520476450377425184">Faltan <ph name="NUMBER_MANY"/> días</translation> <translation id="932327136139879170">Inicio</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Hace <ph name="NUMBER_FEW"/> días</translation> <translation id="5076340679995252485">&Pegar</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Mover una palabra a la derecha</translation> <translation id="364720409959344976">Seleccionar carpeta para cargar</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">Hace <ph name="NUMBER_TWO"/> minutos</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Cerrar notificación</translation> <translation id="6364916375976753737">Desplazar hacia la izquierda</translation> <translation id="2629089419211541119">Hace <ph name="NUMBER_ONE"/> hora</translation> +<translation id="4218160142017529598">Eliminar anterior</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutos</translation> <translation id="6982279413068714821">Hace <ph name="NUMBER_DEFAULT"/> minutos</translation> <translation id="6945221475159498467">Seleccionar</translation> <translation id="6620110761915583480">Guardar archivo</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation> +<translation id="8924469368910458384">Eliminar hasta el principio de la línea</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Falta <ph name="NUMBER_ONE"/> minuto.</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> días</translation> <translation id="7163503212501929773">Faltan <ph name="NUMBER_MANY"/> horas</translation> <translation id="5329858601952122676">&Suprimir</translation> +<translation id="6556866813142980365">Rehacer</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> seg.</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478">Faltan <ph name="NUMBER_FEW"/> minutos</translation> <translation id="5517291721709019259">Faltan <ph name="NUMBER_FEW"/> segundos.</translation> +<translation id="6903282483217634857">Mover hacia la derecha</translation> <translation id="6659594942844771486">Pestaña</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Hace <ph name="NUMBER_DEFAULT"/> días</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutos</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Permitir notificaciones de:</translation> +<translation id="2479520428668657293">Mover hacia la derecha y modificar selección</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> horas</translation> <translation id="1398853756734560583">Maximizar</translation> <translation id="4250229828105606438">Captura de pantalla</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> horas</translation> <translation id="5260878308685146029">Faltan <ph name="NUMBER_TWO"/> minutos</translation> +<translation id="2557207087669398617">Mover hasta el principio de la línea</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Seleccionar &todo</translation> <translation id="2168039046890040389">Retroceder página</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> días</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutos</translation> +<translation id="6122334925474904337">Mover una palabra hacia la derecha y modificar selección</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation> <translation id="8448317557906454022">Hace <ph name="NUMBER_ZERO"/> segundos</translation> <translation id="4927753642311223124">No hay ningún elemento que mostrar.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Desplazarse hasta aquí</translation> <translation id="4552416320897244156">AvPág</translation> +<translation id="3066573403916685335">Bajar</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">Falta <ph name="NUMBER_ONE"/> hora</translation> <translation id="1413622004203049571">Inhabilitar notificaciones de <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Superior</translation> +<translation id="2538759511191347839">Mover hasta el final de la línea y modificar selección</translation> +<translation id="928465423150706909">Mover hasta el final de la línea</translation> <translation id="8331626408530291785">Desplazar hacia arriba</translation> <translation id="7907591526440419938">Abrir archivo</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Detener contenido multimedia</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Restaurar</translation> +<translation id="5349525451964472598">Mover hacia la izquierda y modificar selección</translation> +<translation id="1781701194097416995">Mover una palabra a la izquierda</translation> <translation id="1243314992276662751">Cargar</translation> <translation id="50030952220075532">Falta <ph name="NUMBER_ONE"/> día</translation> <translation id="8179976553408161302">Entrar</translation> +<translation id="8471049483003785219">Mover una palabra a la izquierda y modificar selección</translation> <translation id="945522503751344254">Enviar comentarios</translation> <translation id="9170848237812810038">&Deshacer</translation> <translation id="1285266685456062655">Hace <ph name="NUMBER_FEW"/> horas</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> día</translation> +<translation id="2704295676501803339">Mover hacia la izquierda</translation> <translation id="9098468523912235228">Hace <ph name="NUMBER_DEFAULT"/> segundos</translation> <translation id="494645311413743213">Faltan <ph name="NUMBER_TWO"/> segundos</translation> <translation id="4570886800634958009">Ampliar notificación</translation> +<translation id="566737009157135450">Eliminar palabra anterior</translation> <translation id="436869212180315161">Hacer clic</translation> <translation id="4860787810836767172">Hace <ph name="NUMBER_FEW"/> segundos</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">Hace <ph name="NUMBER_MANY"/> minutos</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Ayuda</translation> +<translation id="2405367043325750948">Eliminar siguiente</translation> <translation id="6699343763173986273">Pista multimedia siguiente</translation> <translation id="5445120697129764393">Faltan <ph name="NUMBER_DEFAULT"/> segundos.</translation> <translation id="8226233771743600312">No molestar durante un día</translation> +<translation id="4252565523989510616">Eliminar palabra siguiente</translation> <translation id="7457942297256758195">Borrar todo</translation> <translation id="822618367988303761">Hace <ph name="NUMBER_TWO"/> días</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutos</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Copiar al portapapeles</translation> <translation id="8371695176452482769">Hablar ahora</translation> +<translation id="1167268268675672572">Mover hasta el principio de la línea y modificar selección</translation> <translation id="6965382102122355670">Aceptar</translation> <translation id="7850320739366109486">No molestar</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_es.xtb b/ui/base/strings/ui_strings_es.xtb index 93a6ca6c71..295f3a3f51 100644 --- a/ui/base/strings/ui_strings_es.xtb +++ b/ui/base/strings/ui_strings_es.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Flecha arriba</translation> +<translation id="3969863827134279083">Mover hacia arriba</translation> <translation id="7062130397825382308">Queda <ph name="NUMBER_ONE"/> segundo</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> horas</translation> <translation id="3990502903496589789">Borde derecho</translation> <translation id="9038489124413477075">Carpeta sin nombre</translation> +<translation id="1940483897317142625">Eliminar hasta el final de la línea</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutos</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> días restantes</translation> <translation id="932327136139879170">Inicio</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">hace <ph name="NUMBER_FEW"/> días</translation> <translation id="5076340679995252485">&Pegar</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Mover una palabra a la derecha</translation> <translation id="364720409959344976">Seleccionar una carpeta para subirla</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">hace <ph name="NUMBER_TWO"/> minutos</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Cerrar notificación</translation> <translation id="6364916375976753737">Desplazar hacia la izquierda</translation> <translation id="2629089419211541119">hace <ph name="NUMBER_ONE"/> hora</translation> +<translation id="4218160142017529598">Eliminar anterior</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutos</translation> <translation id="6982279413068714821">hace <ph name="NUMBER_DEFAULT"/> minutos</translation> <translation id="6945221475159498467">Seleccionar</translation> <translation id="6620110761915583480">Guardar archivo</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> segundos</translation> +<translation id="8924469368910458384">Eliminar hasta el inicio de la línea</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Queda <ph name="NUMBER_ONE"/> minuto</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> días</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> horas restantes</translation> <translation id="5329858601952122676">&Suprimir</translation> +<translation id="6556866813142980365">Rehacer</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> seg.</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutos</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutos</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutos restantes</translation> <translation id="5517291721709019259">Quedan <ph name="NUMBER_FEW"/> segundos</translation> +<translation id="6903282483217634857">Mover hacia la derecha</translation> <translation id="6659594942844771486">Pestaña</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">hace <ph name="NUMBER_DEFAULT"/> días</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutos</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Permitir notificaciones de:</translation> +<translation id="2479520428668657293">Mover hacia la derecha y modificar selección</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> horas</translation> <translation id="1398853756734560583">Maximizar</translation> <translation id="4250229828105606438">Captura de pantalla</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> horas</translation> <translation id="5260878308685146029">Faltan <ph name="NUMBER_TWO"/> minutos</translation> +<translation id="2557207087669398617">Mover hasta el inicio de la línea</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Seleccionar &todo</translation> <translation id="2168039046890040389">Retroceder página</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> días</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutos</translation> +<translation id="6122334925474904337">Mover una palabra a la derecha y modificar selección</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation> <translation id="8448317557906454022">hace <ph name="NUMBER_ZERO"/> segundos</translation> <translation id="4927753642311223124">Aquí no hay nada que ver, circulen...</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Desplazarse hasta aquí</translation> <translation id="4552416320897244156">AvPág</translation> +<translation id="3066573403916685335">Mover hacia abajo</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">Falta <ph name="NUMBER_ONE"/> hora</translation> <translation id="1413622004203049571">Inhabilitar notificaciones de <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Superior</translation> +<translation id="2538759511191347839">Mover hasta el final de la línea y modificar selección</translation> +<translation id="928465423150706909">Mover hasta el final de la línea</translation> <translation id="8331626408530291785">Desplazar hacia arriba</translation> <translation id="7907591526440419938">Abrir archivo</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Detener contenido multimedia</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Restaurar</translation> +<translation id="5349525451964472598">Mover hacia la izquierda y modificar selección</translation> +<translation id="1781701194097416995">Mover una palabra a la izquierda</translation> <translation id="1243314992276662751">Subir</translation> <translation id="50030952220075532">Falta <ph name="NUMBER_ONE"/> día</translation> <translation id="8179976553408161302">Entrar</translation> +<translation id="8471049483003785219">Mover una palabra a la izquierda y modificar selección</translation> <translation id="945522503751344254">Danos tu opinión</translation> <translation id="9170848237812810038">&Deshacer</translation> <translation id="1285266685456062655">hace <ph name="NUMBER_FEW"/> horas</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> día</translation> +<translation id="2704295676501803339">Mover hacia la izquierda</translation> <translation id="9098468523912235228">hace <ph name="NUMBER_DEFAULT"/> segundos</translation> <translation id="494645311413743213">Faltan <ph name="NUMBER_TWO"/> segundos</translation> <translation id="4570886800634958009">Ampliar notificación</translation> +<translation id="566737009157135450">Eliminar palabra anterior</translation> <translation id="436869212180315161">Pulsar</translation> <translation id="4860787810836767172">hace <ph name="NUMBER_FEW"/> segundos</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">hace <ph name="NUMBER_MANY"/> minutos</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Ayuda</translation> +<translation id="2405367043325750948">Eliminar siguiente</translation> <translation id="6699343763173986273">Siguiente pista multimedia</translation> <translation id="5445120697129764393">Quedan <ph name="NUMBER_DEFAULT"/> segundos</translation> <translation id="8226233771743600312">No molestar durante un día</translation> +<translation id="4252565523989510616">Eliminar palabra siguiente</translation> <translation id="7457942297256758195">Borrar todo</translation> <translation id="822618367988303761">hace <ph name="NUMBER_TWO"/> días</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutos</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Copiar al portapapeles</translation> <translation id="8371695176452482769">Habla ahora</translation> +<translation id="1167268268675672572">Mover hasta el inicio de la línea y modificar selección</translation> <translation id="6965382102122355670">Aceptar</translation> <translation id="7850320739366109486">No molestar</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_et.xtb b/ui/base/strings/ui_strings_et.xtb index 80706e285a..1126797c7b 100644 --- a/ui/base/strings/ui_strings_et.xtb +++ b/ui/base/strings/ui_strings_et.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Ülesnool</translation> +<translation id="3969863827134279083">Liiguta üles</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> sekund jäänud</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> tundi</translation> <translation id="3990502903496589789">Parem serv</translation> <translation id="9038489124413477075">Nimeta kaust</translation> +<translation id="1940483897317142625">Kustuta rea lõpuni</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutit</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/>päeva jäänud</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> päeva tagasi</translation> <translation id="5076340679995252485">&Kleebi</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Liiguta sõna võrra paremale</translation> <translation id="364720409959344976">Kausta valimine üleslaadimiseks</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minutit tagasi</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Märguande sulgemine</translation> <translation id="6364916375976753737">Keri vasakule</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> tund tagasi</translation> +<translation id="4218160142017529598">Kustuta tagasisuunas</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutit</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minutit tagasi</translation> <translation id="6945221475159498467">Vali</translation> <translation id="6620110761915583480">Faili salvestamine</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation> +<translation id="8924469368910458384">Kustuta rea alguseni</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minut on jäänud</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minut</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> päeva</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> tundi jäänud</translation> <translation id="5329858601952122676">&Kustuta</translation> +<translation id="6556866813142980365">Tee uuesti</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sekundit</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutit jäänud</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> sekundit jäänud</translation> +<translation id="6903282483217634857">Liiguta paremale</translation> <translation id="6659594942844771486">Vaheleht</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> päeva tagasi</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutit</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Luba märguanded järgmistest kohtadest:</translation> +<translation id="2479520428668657293">Liiguta paremale ja muuda valikut</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> tundi</translation> <translation id="1398853756734560583">Maksimeeri</translation> <translation id="4250229828105606438">Ekraanipilt</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> tundi</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minutit jäänud</translation> +<translation id="2557207087669398617">Liiguta rea algusesse</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Vali &kõik</translation> <translation id="2168039046890040389">Lehekülje üles</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> päeva</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutit</translation> +<translation id="6122334925474904337">Liiguta sõna võrra paremale ja muuda valikut</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minut</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> sekundit tagasi</translation> <translation id="4927753642311223124">Siin pole ühtegi märguannet, liikuge edasi.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Keri siia</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Liiguta allapoole</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> tundi</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> tundi jäänud</translation> <translation id="1413622004203049571">Keela märguanded: <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Üles</translation> +<translation id="2538759511191347839">Liiguta rea lõppu ja muuda valikut</translation> +<translation id="928465423150706909">Liiguta rea lõppu</translation> <translation id="8331626408530291785">Keri üles</translation> <translation id="7907591526440419938">Faili avamine</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Meediumi peatamine</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Taasta</translation> +<translation id="5349525451964472598">Liiguta vasakule ja muuda valikut</translation> +<translation id="1781701194097416995">Liiguta sõna võrra vasakule</translation> <translation id="1243314992276662751">Laadi üles</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> päev jäänud</translation> <translation id="8179976553408161302">Sisestusklahv</translation> +<translation id="8471049483003785219">Liiguta sõna võrra vasakule ja muuda valikut</translation> <translation id="945522503751344254">Saada tagasisidet</translation> <translation id="9170848237812810038">&Võta tagasi</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> tundi tagasi</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> päev</translation> +<translation id="2704295676501803339">Liiguta vasakule</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> sekundit tagasi</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> sekundit jäänud</translation> <translation id="4570886800634958009">Märguande laiendamine</translation> +<translation id="566737009157135450">Kustuta sõna tagasisuunas</translation> <translation id="436869212180315161">Vajuta</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> sekundit tagasi</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minutit tagasi</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Abi</translation> +<translation id="2405367043325750948">Kustuta edasisuunas</translation> <translation id="6699343763173986273">Meediumi järgmine lugu</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> sekundit jäänud</translation> <translation id="8226233771743600312">Mitte segada üks päev</translation> +<translation id="4252565523989510616">Kustuta sõna edasisuunas</translation> <translation id="7457942297256758195">Kustuta kõik</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> päeva tagasi</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutit</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Kopeeri lõikelauale</translation> <translation id="8371695176452482769">Alustage rääkimist</translation> +<translation id="1167268268675672572">Liiguta rea algusesse ja muuda valikut</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Mitte segada</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_fa.xtb b/ui/base/strings/ui_strings_fa.xtb index f29be1644e..a436c03abd 100644 --- a/ui/base/strings/ui_strings_fa.xtb +++ b/ui/base/strings/ui_strings_fa.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> بایت</translation> <translation id="3660179305079774227">پیکان بالا</translation> +<translation id="3969863827134279083">حرکت به بالا</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> ثانیه باقی مانده است</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> مگابایت/ثانیه</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ساعت</translation> <translation id="3990502903496589789">حاشیه راست</translation> <translation id="9038489124413477075">پوشه بدون نام</translation> +<translation id="1940483897317142625">حذف تا پایان خط</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> دقیقه</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation> <translation id="932327136139879170">صفحهٔ اصلی</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&جاگذاری</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> ترابایت</translation> +<translation id="7139614227326422685">حرکت به کلمه راست</translation> <translation id="364720409959344976">انتخاب پوشه برای آپلود</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">بستن اعلان</translation> <translation id="6364916375976753737">پیمایش به چپ</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ساعت قبل</translation> +<translation id="4218160142017529598">حذف به سمت عقب</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> دقیقه</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> دقیقه قبل</translation> <translation id="6945221475159498467">انتخاب</translation> <translation id="6620110761915583480">ذخیره کردن فایل</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> ثانیه</translation> +<translation id="8924469368910458384">حذف تا ابتدای خط</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> دقیقه باقیمانده</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> دقیقه</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> days</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hours left</translation> <translation id="5329858601952122676">&حذف</translation> +<translation id="6556866813142980365">انجام مجدد</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> کیلوبایت</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> دقیقه</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> دقیقه</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">حرکت به راست</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> مگابایت</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> روز قبل</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> mins</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">اعلان موارد زیر مجاز باشد:</translation> +<translation id="2479520428668657293">حرکت به راست و اصلاح انتخاب</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> hours</translation> <translation id="1398853756734560583">بزرگ کردن</translation> <translation id="4250229828105606438">عکس از صفحه نمایش</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hours</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> mins left</translation> +<translation id="2557207087669398617">حرکت به ابتدای خط</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> گیگابایت</translation> <translation id="1901303067676059328">انتخاب &همه</translation> <translation id="2168039046890040389">صفحه بالا</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> روز</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation> +<translation id="6122334925474904337">خرکت به کلمه راست و اصلاح انتخاب</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> دقیقه</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">اینجا خبری نیست، برگردید.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">پیمایش به اینجا</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">حرکت به پایین</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hours</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> کیلوبایت/ثانیه</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ساعت مانده</translation> <translation id="1413622004203049571">غیرفعال کردن اعلانها از <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">بالا</translation> +<translation id="2538759511191347839">حرکت به انتهای خط و اصلاح انتخاب</translation> +<translation id="928465423150706909">حرکت به انتهای خط</translation> <translation id="8331626408530291785">پیمایش به بالا</translation> <translation id="7907591526440419938">باز کردن فایل</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">توقف رسانه</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">بازیابی</translation> +<translation id="5349525451964472598">حرکت به چپ و اصلاح انتخاب</translation> +<translation id="1781701194097416995">حرکت به کلمه چپ</translation> <translation id="1243314992276662751">آپلود</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> روز مانده</translation> <translation id="8179976553408161302">ورود</translation> +<translation id="8471049483003785219">حرکت به کلمه چپ و اصلاح انتخاب</translation> <translation id="945522503751344254">ارسال بازخورد</translation> <translation id="9170848237812810038">&واگرد</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> گیگابایت/ثانیه</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> روز</translation> +<translation id="2704295676501803339">حرکت به چپ</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> ثانیه قبل</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation> <translation id="4570886800634958009">باز کردن اعلان</translation> +<translation id="566737009157135450">حذف کلمه قبلی</translation> <translation id="436869212180315161">فشار دادن</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> ترابایت/ثانیه</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> بایت/ثانیه</translation> <translation id="7649070708921625228">راهنما</translation> +<translation id="2405367043325750948">حذف به سمت جلو</translation> <translation id="6699343763173986273">آهنگ بعدی رسانه</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> ثانیه باقی مانده است</translation> <translation id="8226233771743600312">یک روز مزاحم نشوید</translation> +<translation id="4252565523989510616">حذف کلمه بعدی</translation> <translation id="7457942297256758195">پاک کردن همه</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> پتابایت/ثانیه</translation> <translation id="2743387203779672305">کپی در کلیپبورد</translation> <translation id="8371695176452482769">اکنون صحبت کنید</translation> +<translation id="1167268268675672572">حرکت به ابتدای خط و اصلاح انتخاب</translation> <translation id="6965382102122355670">تأیید</translation> <translation id="7850320739366109486">مزاحم نشوید</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_fi.xtb b/ui/base/strings/ui_strings_fi.xtb index 80b5e81fc8..e24b6156cc 100644 --- a/ui/base/strings/ui_strings_fi.xtb +++ b/ui/base/strings/ui_strings_fi.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> t</translation> <translation id="3660179305079774227">Nuoli yl.</translation> +<translation id="3969863827134279083">Siirrä ylös</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> sekunti jäljellä</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> Mt/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> tuntia</translation> <translation id="3990502903496589789">Oikea reuna</translation> <translation id="9038489124413477075">Nimetön kansio</translation> +<translation id="1940483897317142625">Poista rivin loppuun asti</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuuttia</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> päivää jäljellä</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&Liitä</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> Tt</translation> +<translation id="7139614227326422685">Siirrä sanan oikealle puolelle</translation> <translation id="364720409959344976">Valitse lähetettävä kansio</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Ilmoitus sulje</translation> <translation id="6364916375976753737">Vieritä vasemmalle</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> tunti sitten</translation> +<translation id="4218160142017529598">Poista taaksepäin</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuuttia</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minuuttia sitten</translation> <translation id="6945221475159498467">Valitse</translation> <translation id="6620110761915583480">Tallenna tiedosto</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekuntia</translation> +<translation id="8924469368910458384">Poista rivin alkuun asti</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minuutti jäljellä</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minuuttia</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> päivää</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> tuntia jäljellä</translation> <translation id="5329858601952122676">&Poista</translation> +<translation id="6556866813142980365">Tee uudelleen</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sekuntia</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> kt</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuuttia jäljellä</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">Siirrä oikealle</translation> <translation id="6659594942844771486">Välilehti</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> Mt</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> päivää sitten</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minuuttia</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Salli ilmoitukset seuraavista:</translation> +<translation id="2479520428668657293">Siirrä oikealle ja muokkaa valintaa</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> tuntia</translation> <translation id="1398853756734560583">Suurenna</translation> <translation id="4250229828105606438">Kuvakaappaus</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> tuntia</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minuuttia jäljellä</translation> +<translation id="2557207087669398617">Siirrä rivin alkuun</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> Gt</translation> <translation id="1901303067676059328">Valitse &kaikki</translation> <translation id="2168039046890040389">Sivu ylös</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> päivää</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minuuttia</translation> +<translation id="6122334925474904337">Siirrä sanan oikealle puolelle ja muokkaa valintaa</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuutti</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Täällä ei ole mitään nähtävää.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Vieritä tähän</translation> <translation id="4552416320897244156">Sivu alas</translation> +<translation id="3066573403916685335">Siirrä alas</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> tuntia</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> kt/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> tuntia jäljellä</translation> <translation id="1413622004203049571">Poista ilmoitukset käytöstä sovellukselta <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Yleisin</translation> +<translation id="2538759511191347839">Siirrä rivin loppuun ja muokkaa valintaa</translation> +<translation id="928465423150706909">Siirrä rivin loppuun</translation> <translation id="8331626408530291785">Vieritä ylös</translation> <translation id="7907591526440419938">Avaa tiedosto</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Media: pysäytä</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Palauta</translation> +<translation id="5349525451964472598">Siirrä vasemmalle ja muokkaa valintaa</translation> +<translation id="1781701194097416995">Siirrä sanan vasemmalle puolelle</translation> <translation id="1243314992276662751">Lähetä</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> päivää jäljellä</translation> <translation id="8179976553408161302">Sisään</translation> +<translation id="8471049483003785219">Siirrä sanan vasemmalle puolelle ja muokkaa valintaa</translation> <translation id="945522503751344254">Lähetä palautetta</translation> <translation id="9170848237812810038">K&umoa</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> Gt/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> päivää</translation> +<translation id="2704295676501803339">Siirrä vasemmalle</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> sekuntia sitten</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> sekuntia jäljellä</translation> <translation id="4570886800634958009">Ilmoitus laajenna</translation> +<translation id="566737009157135450">Poista edellinen sana</translation> <translation id="436869212180315161">Paina</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> Tt/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> t/s</translation> <translation id="7649070708921625228">Ohje</translation> +<translation id="2405367043325750948">Poista eteenpäin</translation> <translation id="6699343763173986273">Media: seuraava kappale</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> sekuntia jäljellä</translation> <translation id="8226233771743600312">Älä häiritse päivään</translation> +<translation id="4252565523989510616">Poista seuraava sana</translation> <translation id="7457942297256758195">Tyhjennä kaikki</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuuttia</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> Pt/s</translation> <translation id="2743387203779672305">Kopioi leikepöydälle</translation> <translation id="8371695176452482769">Puhu nyt</translation> +<translation id="1167268268675672572">Siirrä rivin alkuun ja muokkaa valintaa</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Älä häiritse</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_fil.xtb b/ui/base/strings/ui_strings_fil.xtb index 65e280602d..5788c9e19c 100644 --- a/ui/base/strings/ui_strings_fil.xtb +++ b/ui/base/strings/ui_strings_fil.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> (na) B</translation> <translation id="3660179305079774227">Up Arrow</translation> +<translation id="3969863827134279083">Lumipat Pataas</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> segundo ang natitira</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> (na) MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> mga oras</translation> <translation id="3990502903496589789">Tamang Lamang</translation> <translation id="9038489124413477075">Walang Pangalan na Folder</translation> +<translation id="1940483897317142625">Tanggalin Papunta Sa Dulo Ng Linya</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> mga minuto</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> mga nalalabing araw</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> araw ang nakalipas</translation> <translation id="5076340679995252485">&Ilagay</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> (na) TB</translation> +<translation id="7139614227326422685">Lumipat Sa Kanan Ng Salita</translation> <translation id="364720409959344976">Pumili ng Folder na I-a-upload</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minuto ang nakalipas</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Isara ang notification</translation> <translation id="6364916375976753737">Mag-scroll Pakaliwa</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> oras ang nakalipas</translation> +<translation id="4218160142017529598">Tanggalin Ang Nakaraan (Na Salita)</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> (na) minuto</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minuto ang nakalipas</translation> <translation id="6945221475159498467">Pumili</translation> <translation id="6620110761915583480">I-save ang File</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> na segundo</translation> +<translation id="8924469368910458384">Tanggalin Papunta Sa Umpisa Ng Linya</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minuto ang natitira</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minuto</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> mga araw</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> mga oras na nalalabi</translation> <translation id="5329858601952122676">&Tanggalin</translation> +<translation id="6556866813142980365">Redo</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> seg</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> (na) minuto</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuto</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> natitirang minuto</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">Lumipat Pakanan</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> (na) MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> araw ang nakalipas</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minuto</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Payagan ang mga notification mula sa sumusunod:</translation> +<translation id="2479520428668657293">Lumipat Pakanan At Baguhin ang Pinili</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/>mga oras</translation> <translation id="1398853756734560583">Maximize</translation> <translation id="4250229828105606438">Screenshot</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> mga oras</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> natitirang minuto</translation> +<translation id="2557207087669398617">Lumipat Sa Umpisa Ng Linya</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> (na) GB</translation> <translation id="1901303067676059328">Piliin ang &lahat</translation> <translation id="2168039046890040389">Pataas</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> mga araw</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mga minuto</translation> +<translation id="6122334925474904337">Lumipat Sa Kanan ng Salita At Baguhin ang Pinili</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> segundo ang nakalipas</translation> <translation id="4927753642311223124">Walang makikita rito, magpatuloy.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Mag-scroll dito</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Lumipat Pababa</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> mga oras</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> natitirang oras</translation> <translation id="1413622004203049571">I-disable ang mga notification mula sa <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Tuktok</translation> +<translation id="2538759511191347839">Lumipat Papunta Sa Dulo ng Linya At Baguhin ang Pinili</translation> +<translation id="928465423150706909">Lumipat Sa Dulo Ng Linya</translation> <translation id="8331626408530291785">Mag-scroll Pataas</translation> <translation id="7907591526440419938">Buksan ang File</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Media Ihinto</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Ipanumbalik</translation> +<translation id="5349525451964472598">Lumipat Pakaliwa At Baguhin ang Pinili</translation> +<translation id="1781701194097416995">Lumipat Sa Kaliwa Ng Salita</translation> <translation id="1243314992276662751">I-upload</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> natitirang araw</translation> <translation id="8179976553408161302">Pumasok</translation> +<translation id="8471049483003785219">Lumipat Sa Kaliwa Ng Salita At Baguhin ang Pinili</translation> <translation id="945522503751344254">Magpadala ng feedback...</translation> <translation id="9170848237812810038">&I-undo</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> (na) oras ang nakalipas</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> (na) GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> araw</translation> +<translation id="2704295676501803339">Lumipat Pakaliwa</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> segundo ang nakalipas</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> mga natitirang segundo</translation> <translation id="4570886800634958009">Palawakin ang notification</translation> +<translation id="566737009157135450">Tanggalin Ang Nakaraang Salita</translation> <translation id="436869212180315161">Pindutin</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> segundo ang nakalipas</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> (na) TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minuto ang nakalipas</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> (na) B/s</translation> <translation id="7649070708921625228">Tulong</translation> +<translation id="2405367043325750948">Tanggalin Ang Susunod (Na Salita)</translation> <translation id="6699343763173986273">Susunod na Track ng Media</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> (na) segundo ang natitira</translation> <translation id="8226233771743600312">Huwag istorbohin sa loob ng isang araw</translation> +<translation id="4252565523989510616">Tanggalin Ang Susunod Na Salita</translation> <translation id="7457942297256758195">I-clear Lahat</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> araw ang nakalipas</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mga minuto</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> (na) PB/s</translation> <translation id="2743387203779672305">Kopyahin sa clipboard</translation> <translation id="8371695176452482769">Magsalita ngayon</translation> +<translation id="1167268268675672572">Lumipat Sa Umpisa Ng Linya At Baguhin ang Pinili</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Huwag Istorbohin</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_fr.xtb b/ui/base/strings/ui_strings_fr.xtb index a6b3d4bb87..f34d2d395b 100644 --- a/ui/base/strings/ui_strings_fr.xtb +++ b/ui/base/strings/ui_strings_fr.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> o</translation> <translation id="3660179305079774227">Haut</translation> +<translation id="3969863827134279083">Déplacer vers le haut</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> seconde restante</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> Mo/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> heures</translation> <translation id="3990502903496589789">Côté droit</translation> <translation id="9038489124413477075">Dossier sans nom</translation> +<translation id="1940483897317142625">Supprimer jusqu'à la fin de la ligne</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutes</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> jours restants</translation> <translation id="932327136139879170">Début</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">C&oller</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> To</translation> +<translation id="7139614227326422685">Déplacer jusqu'au prochain mot sur la droite</translation> <translation id="364720409959344976">Sélectionner le dossier d'importation</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">il y a <ph name="NUMBER_TWO"/> minutes</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Fermer la notification</translation> <translation id="6364916375976753737">Défilement vers la gauche</translation> <translation id="2629089419211541119">il y a <ph name="NUMBER_ONE"/> heure</translation> +<translation id="4218160142017529598">Supprimer en arrière</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutes</translation> <translation id="6982279413068714821">il y a <ph name="NUMBER_DEFAULT"/> minutes</translation> <translation id="6945221475159498467">Sélectionner</translation> <translation id="6620110761915583480">Enregistrer le fichier</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation> +<translation id="8924469368910458384">Supprimer jusqu'au début de la ligne</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minute restante</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minute</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> jours</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> heures restantes</translation> <translation id="5329858601952122676">&Supprimer</translation> +<translation id="6556866813142980365">Rétablir</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secondes</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> Ko</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutes restantes</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">Déplacer vers la droite</translation> <translation id="6659594942844771486">Onglet</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> Mo</translation> <translation id="4988273303304146523">il y a <ph name="NUMBER_DEFAULT"/> jours</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Autoriser les notifications des éléments suivants :</translation> +<translation id="2479520428668657293">Déplacer vers la droite et modifier la sélection</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> heures</translation> <translation id="1398853756734560583">Agrandir</translation> <translation id="4250229828105606438">Capture d'écran</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> heures</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minutes restantes</translation> +<translation id="2557207087669398617">Déplacer vers le début de la ligne</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> Go</translation> <translation id="1901303067676059328">&Tout sélectionner</translation> <translation id="2168039046890040389">Page précédente</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> jours</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutes</translation> +<translation id="6122334925474904337">Déplacer jusqu'au prochain mot sur la droite et modifier la sélection</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minute</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Aucune notification</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Défilement jusqu'ici</translation> <translation id="4552416320897244156">PgSuiv</translation> +<translation id="3066573403916685335">Déplacer vers le bas</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> heures</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> Ko/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> heure restante</translation> <translation id="1413622004203049571">Désactiver les notifications <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">En haut</translation> +<translation id="2538759511191347839">Déplacer à la fin de la ligne et modifier la sélection</translation> +<translation id="928465423150706909">Déplacer à la fin de la ligne</translation> <translation id="8331626408530291785">Défilement vers le haut</translation> <translation id="7907591526440419938">Ouvrir le fichier</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Contenu multimédia : arrêt</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Restaurer</translation> +<translation id="5349525451964472598">Déplacer vers la gauche et modifier la sélection</translation> +<translation id="1781701194097416995">Déplacer jusqu'au mot précédent sur la gauche</translation> <translation id="1243314992276662751">Importer</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> jour restant</translation> <translation id="8179976553408161302">Entrer</translation> +<translation id="8471049483003785219">Déplacer jusqu'au mot précédent sur la gauche et modifier la sélection</translation> <translation id="945522503751344254">Envoyer le commentaire</translation> <translation id="9170848237812810038">Ann&uler</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> Go/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> jour</translation> +<translation id="2704295676501803339">Déplacer vers la gauche</translation> <translation id="9098468523912235228">il y a <ph name="NUMBER_DEFAULT"/> secondes</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> secondes restantes</translation> <translation id="4570886800634958009">Développer la notification</translation> +<translation id="566737009157135450">Supprimer un mot en arrière</translation> <translation id="436869212180315161">Cliquer</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> To/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> o/s</translation> <translation id="7649070708921625228">Aide</translation> +<translation id="2405367043325750948">Supprimer vers l'avant</translation> <translation id="6699343763173986273">Contenu multimédia : titre suivant</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> secondes restantes</translation> <translation id="8226233771743600312">Ne pas déranger pendant un jour</translation> +<translation id="4252565523989510616">Supprimer un mot vers l'avant</translation> <translation id="7457942297256758195">Tout effacer</translation> <translation id="822618367988303761">il y a <ph name="NUMBER_TWO"/> jours</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutes</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> Po/s</translation> <translation id="2743387203779672305">Copier dans le Presse-papier</translation> <translation id="8371695176452482769">Parlez maintenant</translation> +<translation id="1167268268675672572">Déplacer au début de la ligne et modifier la sélection</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Ne pas déranger</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_gu.xtb b/ui/base/strings/ui_strings_gu.xtb index c3c2007958..12bd88f772 100644 --- a/ui/base/strings/ui_strings_gu.xtb +++ b/ui/base/strings/ui_strings_gu.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> અબજ</translation> <translation id="3660179305079774227">ઉપર એરો</translation> +<translation id="3969863827134279083">ઉપર ખસેડો</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> સેકંડ બાકી</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> કલાક</translation> <translation id="3990502903496589789">જમણી કિનારી</translation> <translation id="9038489124413477075">અનામાંકિત ફોલ્ડર</translation> +<translation id="1940483897317142625">લીટીના અંત સુધીનું કાઢી નાખો</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> મિનિટ</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> દિવસ બાકી</translation> <translation id="932327136139879170">હોમ</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">પેસ્ટ કરો</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">શબ્દની જમણી બાજુએ ખસેડો</translation> <translation id="364720409959344976">અપલોડ કરવા માટે ફોલ્ડર પસંદ કરો</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">સૂચના બંધ છે</translation> <translation id="6364916375976753737">ડાબે સ્ક્રોલ કરો</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation> +<translation id="4218160142017529598">પાછળનું કાઢી નાખો</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> મિનિટ</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation> <translation id="6945221475159498467">પસંદ કરો</translation> <translation id="6620110761915583480">ફાઇલ સાચવો</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> સેકંડ</translation> +<translation id="8924469368910458384">લીટીની શરૂઆત સુધીનું કાઢી નાખો</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> કલાક</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> મિનિટ બાકી</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> મિનિટ</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> દિવસ</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> કલાક બાકી</translation> <translation id="5329858601952122676">&કાઢી નાખો</translation> +<translation id="6556866813142980365">ફરી કરો</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> સેકંડ</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> મિનિટ</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> મિનિટ</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> મિનિટ બાકી</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> સેકંડ બાકી</translation> +<translation id="6903282483217634857">જમણી બાજુએ ખસેડો</translation> <translation id="6659594942844771486">ટૅબ</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/>MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> મિનિટ</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> કલાક બાકી</translation> <translation id="7135556860107312402">નીચેના પરથી સૂચનાઓને મંજૂરી આપો:</translation> +<translation id="2479520428668657293">જમણી બાજુએ ખસેડો અને પસંદગી સંશોધિત કરો</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> કલાક</translation> <translation id="1398853756734560583">મોટું કરો</translation> <translation id="4250229828105606438">સ્ક્રીનશૉટ</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> કલાક</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> મિનિટ બાકી</translation> +<translation id="2557207087669398617">લીટીની શરૂઆતમાં ખસેડો</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">&બધા પસંદ કરો</translation> <translation id="2168039046890040389">પૃષ્ઠ ઉપર</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> મિનિટ</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> દિવસ</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> મિનિટ્સ</translation> +<translation id="6122334925474904337">શબ્દની જમણી બાજુએ ખસેડો અને પસંદગી સંશોધિત કરો</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> મિનિટ</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">અહીં જોવા માટે કંઈ નથી, આગળ વધો.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> દિવસ</translation> <translation id="3183922693828471536">અહીં સુધી સ્ક્રોલ કરો</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">નીચે ખસેડો</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> કલાક</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> કલાક બાકી</translation> <translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> તરફથી સૂચનાઓ અક્ષમ કરો</translation> <translation id="2666092431469916601">ઉપર</translation> +<translation id="2538759511191347839">લીટીની અંતમાં ખસેડો અને પસંદગી સંશોધિત કરો</translation> +<translation id="928465423150706909">લીટીના અંતમાં ખસેડો</translation> <translation id="8331626408530291785">ઉપર સ્ક્રોલ કરો</translation> <translation id="7907591526440419938">ફાઇલ ખોલો</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> દિવસ બાકી</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">મીડિયા સ્ટોપ</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> મિનિટ બાકી</translation> <translation id="3157931365184549694">પુનઃસ્થાપિત કરો</translation> +<translation id="5349525451964472598">ડાબે ખસેડો અને પસંદગી સંશોધિત કરો</translation> +<translation id="1781701194097416995">શબ્દની ડાબી બાજુએ ખસેડો</translation> <translation id="1243314992276662751">અપલોડ કરો</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> દિવસ બાકી</translation> <translation id="8179976553408161302">દાખલ કરો</translation> +<translation id="8471049483003785219">શબ્દની ડાબી બાજુએ ખસેડો અને પસંદગી સંશોધિત કરો</translation> <translation id="945522503751344254">પ્રતિસાદ મોકલો</translation> <translation id="9170848237812810038">&પૂર્વવત્ કરો</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> કલાક પહેલા</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> દિવસ</translation> +<translation id="2704295676501803339">ડાબે ખસેડો</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> સેકન્ડ બાકી</translation> <translation id="4570886800634958009">સૂચના વિસ્તૃત છે</translation> +<translation id="566737009157135450">શબ્દની પાછળનું કાઢી નાખો</translation> <translation id="436869212180315161">દબાવો</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">સહાય</translation> +<translation id="2405367043325750948">આગળનું કાઢી નાખો</translation> <translation id="6699343763173986273">મીડિયા આગલો ટ્રૅક</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> સેકંડ બાકી</translation> <translation id="8226233771743600312">એક દિવસ માટે ખલેલ પાડશો નહીં</translation> +<translation id="4252565523989510616">શબ્દની આગળનું કાઢી નાખો</translation> <translation id="7457942297256758195">બધું સાફ કરો</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> મિનિટ</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">ક્લિપબોર્ડ પર કૉપિ કરો</translation> <translation id="8371695176452482769">હવે બોલો</translation> +<translation id="1167268268675672572">લીટીની શરૂઆતમાં ખસેડો અને પસંદગી સંશોધિત કરો</translation> <translation id="6965382102122355670">ઓકે</translation> <translation id="7850320739366109486">ખલેલ પાડશો નહીં</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> દિવસ પહેલા</translation> diff --git a/ui/base/strings/ui_strings_hi.xtb b/ui/base/strings/ui_strings_hi.xtb index 5009c7597f..c1a889fc44 100644 --- a/ui/base/strings/ui_strings_hi.xtb +++ b/ui/base/strings/ui_strings_hi.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> बाइट</translation> <translation id="3660179305079774227">ऊपर तीर</translation> +<translation id="3969863827134279083">ऊपर ले जाएं</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> सेकंड शेष</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> घंटे</translation> <translation id="3990502903496589789">दायां सिरा</translation> <translation id="9038489124413477075">अनाम फ़ोल्डर</translation> +<translation id="1940483897317142625">पंक्ति के अंत तक हटाएं</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> मिनट</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation> <translation id="932327136139879170">मुख्यपृष्ठ</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> दिन पहले</translation> <translation id="5076340679995252485">&चिपकाएं</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">शब्द के दाईं ओर ले जाएं</translation> <translation id="364720409959344976">अपलोड करने के लिए फ़ोल्डर चुनें</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">सूचना बंद करें</translation> <translation id="6364916375976753737">बाएं स्क्रॉल करें</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> घंटे पहले</translation> +<translation id="4218160142017529598">पीछे की ओर का शब्द हटाएं</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> मिनट</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation> <translation id="6945221475159498467">चुनें</translation> <translation id="6620110761915583480">फ़ाइल सहेजें</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> सेकंड</translation> +<translation id="8924469368910458384">पंक्ति की शुरुआत तक हटाएं</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> घंटे</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> मिनट शेष</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> मिनट</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> दिन</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hours left</translation> <translation id="5329858601952122676">&हटाएं</translation> +<translation id="6556866813142980365">पुन: करें</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> सेकंड</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> मिनट</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> मिनट</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">दाईं ओर ले जाएं</translation> <translation id="6659594942844771486">टैब</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> दिन पहले</translation> @@ -90,17 +97,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> मिनट</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">निम्न से आने वाली सूचनाओं की अनुमति दें:</translation> +<translation id="2479520428668657293">दाईं ओर ले जाएं और चयन बदलें</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> घंटे</translation> <translation id="1398853756734560583">बड़ा करें</translation> <translation id="4250229828105606438">स्क्रीनशॉट</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> घंटे</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> mins left</translation> +<translation id="2557207087669398617">पंक्ति के प्रारंभ में ले जाएं</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">&सभी को चुनें</translation> <translation id="2168039046890040389">पृष्ठ ऊपर</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> मिनट</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> दिन</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> मिनट</translation> +<translation id="6122334925474904337">शब्द के दाईं ओर ले जाएं और चयन बदलें</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> मिनट</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">यहां देखने के लिए कुछ भी नहीं है, आगे चलें.</translation> @@ -108,6 +118,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> दिन</translation> <translation id="3183922693828471536">यहां तक स्क्रॉल करें</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">नीचे ले जाएं</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> घंटे</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -124,6 +135,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> घंटे शेष</translation> <translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> से सूचनाएं अक्षम करें</translation> <translation id="2666092431469916601">शीर्ष</translation> +<translation id="2538759511191347839">पंक्ति के अंत में ले जाएं और चयन बदलें</translation> +<translation id="928465423150706909">पंक्ति के अंत में ले जाएं</translation> <translation id="8331626408530291785">ऊपर स्क्रॉल करें</translation> <translation id="7907591526440419938">फ़ाइल खोलें</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -133,9 +146,12 @@ <translation id="6808150112686056157">मीडिया रोकें</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">पुनर्स्थापित करें</translation> +<translation id="5349525451964472598">बाईं ओर ले जाएं और चयन बदलें</translation> +<translation id="1781701194097416995">शब्द के बाईं ओर ले जाएं</translation> <translation id="1243314992276662751">अपलोड करें</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> दिन शेष</translation> <translation id="8179976553408161302">प्रविष्ट करें</translation> +<translation id="8471049483003785219">शब्द के बाईं ओर ले जाएं और चयन बदलें</translation> <translation id="945522503751344254">सुझाव भेजें</translation> <translation id="9170848237812810038">&पूर्ववत् करें</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> घंटे पहले</translation> @@ -159,9 +175,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> घंटे पहले</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> दिन</translation> +<translation id="2704295676501803339">बाईं ओर ले जाएं</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> सेकंड पहले</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation> <translation id="4570886800634958009">सूचना विस्तार</translation> +<translation id="566737009157135450">पीछे की ओर एक शब्द हटाएं</translation> <translation id="436869212180315161">दबाएं</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -171,9 +189,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">सहायता</translation> +<translation id="2405367043325750948">आगे की ओर हटाएं</translation> <translation id="6699343763173986273">मीडिया अगला ट्रैक</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> seconds left</translation> <translation id="8226233771743600312">एक दिन तक परेशान न करें</translation> +<translation id="4252565523989510616">आगे की ओर एक शब्द हटाएं</translation> <translation id="7457942297256758195">सभी साफ़ करें</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> दिन पहले</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> मिनट</translation> @@ -189,6 +209,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">क्लिपबोर्ड पर प्रतिलिपि बनाएं</translation> <translation id="8371695176452482769">अब बोलें</translation> +<translation id="1167268268675672572">पंक्ति के प्रारंभ में ले जाएं और चयन बदलें</translation> <translation id="6965382102122355670">ठीक</translation> <translation id="7850320739366109486">परेशान न करें</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> दिन पहले</translation> diff --git a/ui/base/strings/ui_strings_hr.xtb b/ui/base/strings/ui_strings_hr.xtb index 4382680d39..82fa96fe47 100644 --- a/ui/base/strings/ui_strings_hr.xtb +++ b/ui/base/strings/ui_strings_hr.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Strelica prema gore</translation> +<translation id="3969863827134279083">Premjesti prema gore</translation> <translation id="7062130397825382308">Preostalo <ph name="NUMBER_ONE"/> s</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928">Broj sati: <ph name="NUMBER_DEFAULT"/></translation> <translation id="3990502903496589789">Desni rub</translation> <translation id="9038489124413477075">Neimenovana mapa</translation> +<translation id="1940483897317142625">Izbriši do kraja retka</translation> <translation id="8507996248087185956">Broj minuta: <ph name="NUMBER_DEFAULT"/></translation> <translation id="3520476450377425184">Preostalo dana: <ph name="NUMBER_MANY"/></translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Prije <ph name="NUMBER_FEW"/> dana</translation> <translation id="5076340679995252485">&Zalijepi</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Premjesti riječ udesno</translation> <translation id="364720409959344976">Odabir mape za prijenos</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">Prije <ph name="NUMBER_TWO"/> minute</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Zatvaranje obavijesti</translation> <translation id="6364916375976753737">Pomakni se lijevo</translation> <translation id="2629089419211541119">Prije <ph name="NUMBER_ONE"/> sat</translation> +<translation id="4218160142017529598">Izbriši unatrag</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuta</translation> <translation id="6982279413068714821">Prije <ph name="NUMBER_DEFAULT"/> minuta</translation> <translation id="6945221475159498467">Odaberi</translation> <translation id="6620110761915583480">Spremi datoteku</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation> +<translation id="8924469368910458384">Izbriši do početka retka</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Preostalo minuta: <ph name="NUMBER_ONE"/></translation> <translation id="2953767478223974804">Broj minuta: <ph name="NUMBER_ONE"/></translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863">Broj dana: <ph name="NUMBER_MANY"/></translation> <translation id="7163503212501929773">Preostalo sati: <ph name="NUMBER_MANY"/></translation> <translation id="5329858601952122676">&Obriši</translation> +<translation id="6556866813142980365">Ponovi</translation> <translation id="8088823334188264070">Sekundi: <ph name="NUMBER_MANY"/></translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478">Preostalo minuta: <ph name="NUMBER_FEW"/></translation> <translation id="5517291721709019259">Preostalo <ph name="NUMBER_FEW"/> s</translation> +<translation id="6903282483217634857">Premjesti udesno</translation> <translation id="6659594942844771486">Kartica</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Prije <ph name="NUMBER_DEFAULT"/> dana</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773">Broj minuta: <ph name="NUMBER_TWO"/></translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Omogućite obavijesti iz sljedećih izvora:</translation> +<translation id="2479520428668657293">Premjesti udesno i izmijeni odabir</translation> <translation id="8112886015144590373">Broj sati: <ph name="NUMBER_FEW"/></translation> <translation id="1398853756734560583">Maksimiziraj</translation> <translation id="4250229828105606438">Snimka zaslona</translation> <translation id="6690744523875189208">Broj sati: <ph name="NUMBER_TWO"/></translation> <translation id="5260878308685146029">Preostalo minuta: <ph name="NUMBER_TWO"/></translation> +<translation id="2557207087669398617">Premjesti na početak retka</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Odaberi &sve</translation> <translation id="2168039046890040389">Stranica prema gore</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581">Broj dana: <ph name="NUMBER_DEFAULT"/></translation> <translation id="6463061331681402734">Broj minuta: <ph name="NUMBER_MANY"/></translation> +<translation id="6122334925474904337">Premjesti riječ udesno i izmijeni odabir</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuta</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Nema nikakvih obavijesti.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Pomakni ovdje</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Premjesti dolje</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401">Sati: <ph name="NUMBER_MANY"/></translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">Preostalo sati: <ph name="NUMBER_ONE"/></translation> <translation id="1413622004203049571">Onemogući obavijesti pošiljatelja <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Gornji</translation> +<translation id="2538759511191347839">Premjesti na kraj retka i izmijeni odabir</translation> +<translation id="928465423150706909">Premjesti na kraj retka</translation> <translation id="8331626408530291785">Pomakni se gore</translation> <translation id="7907591526440419938">Otvori datoteku</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Zaustavi Medije</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Vrati</translation> +<translation id="5349525451964472598">Premjesti ulijevo i izmijeni odabir</translation> +<translation id="1781701194097416995">Premjesti riječ ulijevo</translation> <translation id="1243314992276662751">Prenesi</translation> <translation id="50030952220075532">Preostalo dana: <ph name="NUMBER_ONE"/></translation> <translation id="8179976553408161302">Pridružite se</translation> +<translation id="8471049483003785219">Premjesti riječ ulijevo i izmijeni odabir</translation> <translation id="945522503751344254">Slanje povratnih informacija</translation> <translation id="9170848237812810038">&Poništi</translation> <translation id="1285266685456062655">Prije <ph name="NUMBER_FEW"/> sata</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/>dan</translation> +<translation id="2704295676501803339">Premjesti ulijevo</translation> <translation id="9098468523912235228">Prije <ph name="NUMBER_DEFAULT"/> sekundi</translation> <translation id="494645311413743213">Preostalo sekundi <ph name="NUMBER_TWO"/></translation> <translation id="4570886800634958009">Proširivanje obavijesti</translation> +<translation id="566737009157135450">Izbriši prethodnu riječ</translation> <translation id="436869212180315161">Pritisnite</translation> <translation id="4860787810836767172">Prije <ph name="NUMBER_FEW"/> sek</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Pomoć</translation> +<translation id="2405367043325750948">Izbriši prema naprijed</translation> <translation id="6699343763173986273">Sljedeći zapis Medija</translation> <translation id="5445120697129764393">Preostalo <ph name="NUMBER_DEFAULT"/> s</translation> <translation id="8226233771743600312">Ne ometaj jedan dan</translation> +<translation id="4252565523989510616">Izbriši sljedeću riječ</translation> <translation id="7457942297256758195">Očisti sve</translation> <translation id="822618367988303761">Prije <ph name="NUMBER_TWO"/> dana</translation> <translation id="4745438305783437565">Broj minuta: <ph name="NUMBER_FEW"/></translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Kopiraj u međuspremnik</translation> <translation id="8371695176452482769">Govorite sad</translation> +<translation id="1167268268675672572">Pomakni na početak retka i izmijeni odabir</translation> <translation id="6965382102122355670">U redu</translation> <translation id="7850320739366109486">Ne ometaj</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_hu.xtb b/ui/base/strings/ui_strings_hu.xtb index 7240269d70..984a0c5e86 100644 --- a/ui/base/strings/ui_strings_hu.xtb +++ b/ui/base/strings/ui_strings_hu.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> bájt</translation> <translation id="3660179305079774227">Felfelé nyíl</translation> +<translation id="3969863827134279083">Fel</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> másodperc van hátra</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> óra</translation> <translation id="3990502903496589789">Jobb sarok</translation> <translation id="9038489124413477075">Név nélküli mappa</translation> +<translation id="1940483897317142625">Törlés a sor végéig</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> perc</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> nap van hátra</translation> <translation id="932327136139879170">Főoldal</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&Beillesztés</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Egy szóval jobbra</translation> <translation id="364720409959344976">Mappa kiválasztása a feltöltéshez</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Értesítés bezárása</translation> <translation id="6364916375976753737">Görgetés balra</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> órája</translation> +<translation id="4218160142017529598">Törlés visszafelé</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> perc</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> perce</translation> <translation id="6945221475159498467">Kiválasztás</translation> <translation id="6620110761915583480">Fájl mentése</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> másodperc</translation> +<translation id="8924469368910458384">Törlés a sor elejéig</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> perc van hátra</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> perc</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> nap</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> óra van hátra</translation> <translation id="5329858601952122676">&Törlés</translation> +<translation id="6556866813142980365">Újra</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> másodperc</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> perc</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> perc</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> perc van hátra</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">Jobbra</translation> <translation id="6659594942844771486">Lap</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> napja</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> perc</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Értesítések engedélyezése a következőtől:</translation> +<translation id="2479520428668657293">Jobbra és kijelölés módosítása</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> óra</translation> <translation id="1398853756734560583">Teljes méret</translation> <translation id="4250229828105606438">Képernyőkép</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> óra</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> perc van hátra</translation> +<translation id="2557207087669398617">Sor elejére</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Össz&es kiválasztása</translation> <translation id="2168039046890040389">Oldal fel</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> nap</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> perc</translation> +<translation id="6122334925474904337">Egy szóval jobbra és kijelölés módosítása</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> perc</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Itt nincs semmi, továbbmehet.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Görgessen ide</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Le</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> óra</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> óra van hátra</translation> <translation id="1413622004203049571">A(z) <ph name="NOTIFIER_NAME"/> értesítéseinek kikapcsolása</translation> <translation id="2666092431469916601">Felülre</translation> +<translation id="2538759511191347839">Sor végére és kijelölés módosítása</translation> +<translation id="928465423150706909">Sor végére</translation> <translation id="8331626408530291785">Görgetés felfelé</translation> <translation id="7907591526440419938">Fájl megnyitása</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Leállítás</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Visszaállítás</translation> +<translation id="5349525451964472598">Lefelé és kijelölés módosítása</translation> +<translation id="1781701194097416995">Egy szóval lefelé</translation> <translation id="1243314992276662751">Feltöltés</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> nap van hátra</translation> <translation id="8179976553408161302">Belépés</translation> +<translation id="8471049483003785219">Egy szóval balra és kijelölés módosítása</translation> <translation id="945522503751344254">Visszajelzés küldése</translation> <translation id="9170848237812810038">&Visszavonás</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> nap</translation> +<translation id="2704295676501803339">Balra</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> másodperce</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> másodperc van hátra.</translation> <translation id="4570886800634958009">Értesítés kibontása</translation> +<translation id="566737009157135450">Szó törlése visszafelé</translation> <translation id="436869212180315161">Sajtó</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Súgó</translation> +<translation id="2405367043325750948">Törlés előrefelé</translation> <translation id="6699343763173986273">Következő szám</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> másodperc van hátra</translation> <translation id="8226233771743600312">Ne zavarj egy napig</translation> +<translation id="4252565523989510616">Szó törlése előrefelé</translation> <translation id="7457942297256758195">Összes törlése</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> perc</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Másolás a vágólapra</translation> <translation id="8371695176452482769">Most beszéljen</translation> +<translation id="1167268268675672572">Sor elejére és kijelölés módosítása</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Ne zavarj</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_id.xtb b/ui/base/strings/ui_strings_id.xtb index 5927d2d0b7..82c362375e 100644 --- a/ui/base/strings/ui_strings_id.xtb +++ b/ui/base/strings/ui_strings_id.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Panah Atas</translation> +<translation id="3969863827134279083">Pindah ke Atas</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> detik lagi</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/dtk</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> jam</translation> <translation id="3990502903496589789">Tepi Kanan</translation> <translation id="9038489124413477075">Folder Tanpa Nama</translation> +<translation id="1940483897317142625">Hapus Sampai Akhir Baris</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> menit</translation> <translation id="3520476450377425184">Tersisa <ph name="NUMBER_MANY"/> hari</translation> <translation id="932327136139879170">Beranda</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> hari yang lalu</translation> <translation id="5076340679995252485">Tem&pel</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Pindahkan ke Kanan Kata</translation> <translation id="364720409959344976">Pilih Folder untuk Diunggah</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mnt. yang lalu</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Tutup pemberitahuan</translation> <translation id="6364916375976753737">Gulir ke Kiri</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> jam yang lalu</translation> +<translation id="4218160142017529598">Hapus dari Belakang</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> menit</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mnt. yang lalu</translation> <translation id="6945221475159498467">Pilih</translation> <translation id="6620110761915583480">Simpan File</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> detik</translation> +<translation id="8924469368910458384">Hapus Sampai Awal Baris</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Tersisa <ph name="NUMBER_ONE"/> menit</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> menit</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> hari</translation> <translation id="7163503212501929773">Tersisa <ph name="NUMBER_MANY"/> jam</translation> <translation id="5329858601952122676">&Hapus</translation> +<translation id="6556866813142980365">Urungkan</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> detik</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> menit</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> menit</translation> <translation id="50960180632766478">Tersisa <ph name="NUMBER_FEW"/> menit</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">Pindah ke Kanan</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> hari yang lalu</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> menit</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Izinkan pemberitahuan dari yang berikut:</translation> +<translation id="2479520428668657293">Pindah ke Kanan dan Ubah Pilihan</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> jam</translation> <translation id="1398853756734560583">Perbesar</translation> <translation id="4250229828105606438">Tangkapan layar</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> jam</translation> <translation id="5260878308685146029">Tersisa <ph name="NUMBER_TWO"/> menit</translation> +<translation id="2557207087669398617">Pindah ke Awal Baris</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Pilih semu&a</translation> <translation id="2168039046890040389">Page Up</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> hari</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> menit</translation> +<translation id="6122334925474904337">Pindah ke Kanan Kata dan Ubah Pilihan</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> menit</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> dtk. yang lalu</translation> <translation id="4927753642311223124">Tidak ada apa-apa di sini, lihat yang lain saja.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Gulir ke Sini</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Turunkan</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> jam</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/dtk</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">Tersisa <ph name="NUMBER_ONE"/> jam</translation> <translation id="1413622004203049571">Nonaktifkan pemberitahuan dari <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Atas</translation> +<translation id="2538759511191347839">Pindah ke Akhir Baris dan Ubah Pilihan</translation> +<translation id="928465423150706909">Pindah ke Akhir Baris</translation> <translation id="8331626408530291785">Gulir ke Atas</translation> <translation id="7907591526440419938">Buka File</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Hentikan Media</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Pulihkan</translation> +<translation id="5349525451964472598">Pindah ke Kiri dan Ubah Pilihan</translation> +<translation id="1781701194097416995">Pindah ke Kiri Kata</translation> <translation id="1243314992276662751">Unggah</translation> <translation id="50030952220075532">Tersisa <ph name="NUMBER_ONE"/> hari</translation> <translation id="8179976553408161302">Masuk</translation> +<translation id="8471049483003785219">Pindah ke Kiri Kata dan Ubah Pilihan</translation> <translation id="945522503751344254">Kirim masukan</translation> <translation id="9170848237812810038">&Urung</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> jam yang lalu</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/dtk</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> hari</translation> +<translation id="2704295676501803339">Pindah ke Kiri</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> dtk. yang lalu</translation> <translation id="494645311413743213">Tersisa <ph name="NUMBER_TWO"/> detik</translation> <translation id="4570886800634958009">Luaskan pemberitahuan</translation> +<translation id="566737009157135450">Hapus dari Belakang Per Kata</translation> <translation id="436869212180315161">Tekan</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> dtk. yang lalu</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/dtk</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mnt. yang lalu</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/dtk</translation> <translation id="7649070708921625228">Bantuan</translation> +<translation id="2405367043325750948">Hapus dari Depan</translation> <translation id="6699343763173986273">Lacak Media Berikutnya</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> detik lagi</translation> <translation id="8226233771743600312">Jangan ganggu selama satu hari</translation> +<translation id="4252565523989510616">Hapus dari Depan Per Kata</translation> <translation id="7457942297256758195">Hapus Semua</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> hari yang lalu</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> menit</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/dtk</translation> <translation id="2743387203779672305">Salin ke papan klip</translation> <translation id="8371695176452482769">Bicaralah sekarang</translation> +<translation id="1167268268675672572">Pindah ke Awal Baris dan Ubah Pilihan</translation> <translation id="6965382102122355670">Oke</translation> <translation id="7850320739366109486">Jangan Ganggu</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_it.xtb b/ui/base/strings/ui_strings_it.xtb index 7d2abdb890..88e31b4108 100644 --- a/ui/base/strings/ui_strings_it.xtb +++ b/ui/base/strings/ui_strings_it.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Freccia SU</translation> +<translation id="3969863827134279083">Sposta su</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> secondo rimasto</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ore</translation> <translation id="3990502903496589789">Margine destro</translation> <translation id="9038489124413477075">Cartella senza nome</translation> +<translation id="1940483897317142625">Elimina fino a fine riga</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min.</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> giorni rimanenti</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> giorni fa</translation> <translation id="5076340679995252485">&Incolla</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Sposta di una parola a destra</translation> <translation id="364720409959344976">Seleziona la cartella da caricare</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minuti fa</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Chiusura notifica</translation> <translation id="6364916375976753737">Scorri a sinistra</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ora fa</translation> +<translation id="4218160142017529598">Elimina indietro</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuti</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minuti fa</translation> <translation id="6945221475159498467">Seleziona</translation> <translation id="6620110761915583480">Salva file</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> secondi</translation> +<translation id="8924469368910458384">Elimina fino a inizio riga</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minuto rimanente</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min.</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> giorni</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ore rimanenti</translation> <translation id="5329858601952122676">&Elimina</translation> +<translation id="6556866813142980365">Ripeti</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sec.</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> min. rimanenti</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> secondi rimasti</translation> +<translation id="6903282483217634857">Sposta a destra</translation> <translation id="6659594942844771486">TAB</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> giorni fa</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> min.</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Consenti notifiche da:</translation> +<translation id="2479520428668657293">Sposta a destra e modifica selezione</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ore</translation> <translation id="1398853756734560583">Ingrandisci</translation> <translation id="4250229828105606438">Screenshot</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ore</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> min. rimanenti</translation> +<translation id="2557207087669398617">Sposta fino a inizio riga</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Seleziona &tutto</translation> <translation id="2168039046890040389">Pagina su</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> giorni</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> min.</translation> +<translation id="6122334925474904337">Sposta di una parola a destra e modifica selezione</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secondi fa</translation> <translation id="4927753642311223124">Nessuna notifica.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Scorri fino a qui</translation> <translation id="4552416320897244156">PGGIÙ</translation> +<translation id="3066573403916685335">Sposta giù</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ore</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ora rimanente</translation> <translation id="1413622004203049571">Disabilita notifiche da <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">In alto</translation> +<translation id="2538759511191347839">Sposta fino a fine riga e modifica selezione</translation> +<translation id="928465423150706909">Sposta fino a fine riga</translation> <translation id="8331626408530291785">Scorri verso l'alto</translation> <translation id="7907591526440419938">Apri file</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Interrompi contenuti multimediali</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Ripristina</translation> +<translation id="5349525451964472598">Sposta a sinistra e modifica selezione</translation> +<translation id="1781701194097416995">Sposta di una parola a sinistra</translation> <translation id="1243314992276662751">Carica</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> giorno rimanente</translation> <translation id="8179976553408161302">Invia</translation> +<translation id="8471049483003785219">Sposta di una parola a sinistra e modifica selezione</translation> <translation id="945522503751344254">Invia feedback</translation> <translation id="9170848237812810038">&Annulla</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> ore fa</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> giorno</translation> +<translation id="2704295676501803339">Sposta a sinistra</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secondi fa</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> sec. rimanenti</translation> <translation id="4570886800634958009">Espansione notifica</translation> +<translation id="566737009157135450">Elimina una parola indietro</translation> <translation id="436869212180315161">Premi</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secondi fa</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minuti fa</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Guida</translation> +<translation id="2405367043325750948">Elimina avanti</translation> <translation id="6699343763173986273">Traccia successiva contenuti multimediali</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> secondi rimasti</translation> <translation id="8226233771743600312">Non disturbare per un giorno</translation> +<translation id="4252565523989510616">Elimina una parola avanti</translation> <translation id="7457942297256758195">Cancella tutto</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> giorni fa</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min.</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Copia negli appunti</translation> <translation id="8371695176452482769">Parla adesso</translation> +<translation id="1167268268675672572">Sposta fino a inizio riga e modifica selezione</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Non disturbare</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_iw.xtb b/ui/base/strings/ui_strings_iw.xtb index 693594b05d..f39dfc85f7 100644 --- a/ui/base/strings/ui_strings_iw.xtb +++ b/ui/base/strings/ui_strings_iw.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">חץ למעלה</translation> +<translation id="3969863827134279083">עלה למעלה</translation> <translation id="7062130397825382308">נותרה שנייה <ph name="NUMBER_ONE"/></translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> שעות</translation> <translation id="3990502903496589789">קצה ימני</translation> <translation id="9038489124413477075">תיקייה ללא שם</translation> +<translation id="1940483897317142625">מחק עד סוף השורה</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> דקות</translation> <translation id="3520476450377425184">נותרו <ph name="NUMBER_MANY"/> ימים</translation> <translation id="932327136139879170">בית</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">לפני <ph name="NUMBER_FEW"/> ימים</translation> <translation id="5076340679995252485">&הדבק</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">העבר את המילה ימינה</translation> <translation id="364720409959344976">בחירת תיקיה להעלאה</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">לפני <ph name="NUMBER_TWO"/> דקות</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">סגירת הודעה</translation> <translation id="6364916375976753737">גלול שמאלה</translation> <translation id="2629089419211541119">לפני <ph name="NUMBER_ONE"/> שעה</translation> +<translation id="4218160142017529598">מחק לאחור</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> דקות</translation> <translation id="6982279413068714821">לפני <ph name="NUMBER_DEFAULT"/> דקות</translation> <translation id="6945221475159498467">בחר</translation> <translation id="6620110761915583480">שמור קובץ</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> שניות</translation> +<translation id="8924469368910458384">מחק עד תחילת השורה</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">נותרה דקה <ph name="NUMBER_ONE"/></translation> <translation id="2953767478223974804">דקה <ph name="NUMBER_ONE"/></translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ימים</translation> <translation id="7163503212501929773">נותרו <ph name="NUMBER_MANY"/> שעות</translation> <translation id="5329858601952122676">&מחק</translation> +<translation id="6556866813142980365">בצע מחדש</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> שניות</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> דקות</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> דקות</translation> <translation id="50960180632766478">נותרו <ph name="NUMBER_FEW"/> דקות</translation> <translation id="5517291721709019259">נותרו <ph name="NUMBER_FEW"/> שניות</translation> +<translation id="6903282483217634857">העבר ימינה</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">לפני <ph name="NUMBER_DEFAULT"/> ימים</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> דקות</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">אפשר התראות ממקורות אלה:</translation> +<translation id="2479520428668657293">העבר ימינה ושנה את הבחירה</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> שעות</translation> <translation id="1398853756734560583">הגדל</translation> <translation id="4250229828105606438">צילום מסך</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> שעות</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> דקות נותרו</translation> +<translation id="2557207087669398617">העבר לתחילת השורה</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">בחר &הכל</translation> <translation id="2168039046890040389">דף למעלה</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ימים</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> דקות</translation> +<translation id="6122334925474904337">העבר את המילה ימינה ושנה את הבחירה</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> דקה</translation> <translation id="8448317557906454022">לפני <ph name="NUMBER_ZERO"/> שניות</translation> <translation id="4927753642311223124">אין התראות להצגה, המשך הלאה.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">גלול ל'כאן'</translation> <translation id="4552416320897244156">דף למטה</translation> +<translation id="3066573403916685335">העבר למטה</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> שעות</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">נותרו <ph name="NUMBER_ONE"/> שעות</translation> <translation id="1413622004203049571">השבת הודעות מאת <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">למעלה</translation> +<translation id="2538759511191347839">העבר לסוף השורה ושנה את הבחירה</translation> +<translation id="928465423150706909">העבר לסוף השורה</translation> <translation id="8331626408530291785">גלול למעלה</translation> <translation id="7907591526440419938">פתח קובץ</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">עצור מדיה</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">שחזר</translation> +<translation id="5349525451964472598">העבר שמאלה ושנה את הבחירה</translation> +<translation id="1781701194097416995">העבר את המילה שמאלה</translation> <translation id="1243314992276662751">העלה</translation> <translation id="50030952220075532">נותר יום <ph name="NUMBER_ONE"/></translation> <translation id="8179976553408161302">היכנס</translation> +<translation id="8471049483003785219">העבר את המילה שמאלה ושנה את הבחירה</translation> <translation id="945522503751344254">שלח משוב</translation> <translation id="9170848237812810038">&ביטול</translation> <translation id="1285266685456062655">לפני <ph name="NUMBER_FEW"/> שעות</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405">יום <ph name="NUMBER_ONE"/></translation> +<translation id="2704295676501803339">העבר שמאלה</translation> <translation id="9098468523912235228">לפני <ph name="NUMBER_DEFAULT"/> שניות</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> שניות נותרו</translation> <translation id="4570886800634958009">הרחבת הודעה</translation> +<translation id="566737009157135450">מחק את המילה לאחור</translation> <translation id="436869212180315161">לחץ</translation> <translation id="4860787810836767172">לפני <ph name="NUMBER_FEW"/> שניות</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">לפני <ph name="NUMBER_MANY"/> דקות</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">עזרה</translation> +<translation id="2405367043325750948">מחק קדימה</translation> <translation id="6699343763173986273">הרצועה הבאה במדיה</translation> <translation id="5445120697129764393">נותרו <ph name="NUMBER_DEFAULT"/> שניות</translation> <translation id="8226233771743600312">נא לא להפריע ליום אחד</translation> +<translation id="4252565523989510616">מחק את המילה קדימה</translation> <translation id="7457942297256758195">נקה הכל</translation> <translation id="822618367988303761">לפני <ph name="NUMBER_TWO"/> ימים</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> דקות</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">העתק ללוח</translation> <translation id="8371695176452482769">דבר עכשיו</translation> +<translation id="1167268268675672572">העבר לתחילת השורה ושנה את הבחירה</translation> <translation id="6965382102122355670">אישור</translation> <translation id="7850320739366109486">נא לא להפריע</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_ja.xtb b/ui/base/strings/ui_strings_ja.xtb index 0990fbaef4..7b0f3466b2 100644 --- a/ui/base/strings/ui_strings_ja.xtb +++ b/ui/base/strings/ui_strings_ja.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">上矢印キー</translation> +<translation id="3969863827134279083">上に移動</translation> <translation id="7062130397825382308">残り <ph name="NUMBER_ONE"/> 秒</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/秒</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> 時間</translation> <translation id="3990502903496589789">右端</translation> <translation id="9038489124413477075">名前のないフォルダ</translation> +<translation id="1940483897317142625">行末まで削除</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> 分</translation> <translation id="3520476450377425184">残り <ph name="NUMBER_MANY"/> 日</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> 日前</translation> <translation id="5076340679995252485">貼り付け(&P)</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">右の単語に移動</translation> <translation id="364720409959344976">アップロードするフォルダを選択</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> 分前</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">通知を閉じる</translation> <translation id="6364916375976753737">左にスクロール</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> 時間前</translation> +<translation id="4218160142017529598">後方削除</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> 分</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> 分前</translation> <translation id="6945221475159498467">選択</translation> <translation id="6620110761915583480">ファイルを保存</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> 秒</translation> +<translation id="8924469368910458384">行頭まで削除</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">残り <ph name="NUMBER_ONE"/> 分</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> 分</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> 日</translation> <translation id="7163503212501929773">残り <ph name="NUMBER_MANY"/> 時間</translation> <translation id="5329858601952122676">削除(&D)</translation> +<translation id="6556866813142980365">やり直す</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> 秒</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> 分</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> 分</translation> <translation id="50960180632766478">残り <ph name="NUMBER_FEW"/> 分</translation> <translation id="5517291721709019259">残り <ph name="NUMBER_FEW"/> 秒</translation> +<translation id="6903282483217634857">右に移動</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> 日前</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> 分</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">次の通知を許可:</translation> +<translation id="2479520428668657293">右に移動して選択範囲を変更</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> 時間</translation> <translation id="1398853756734560583">最大化</translation> <translation id="4250229828105606438">スクリーンショット</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> 時間</translation> <translation id="5260878308685146029">残り <ph name="NUMBER_TWO"/> 分</translation> +<translation id="2557207087669398617">行頭に移動</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">すべて選択(&A)</translation> <translation id="2168039046890040389">前のページへ</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> 日</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> 分</translation> +<translation id="6122334925474904337">右の単語に移動して選択範囲を変更</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> 分</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> 秒前</translation> <translation id="4927753642311223124">表示する通知はありません。続行してください。</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">ここまでスクロール</translation> <translation id="4552416320897244156">PageDown</translation> +<translation id="3066573403916685335">下に移動</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> 時間</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/秒</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">残り <ph name="NUMBER_ONE"/> 時間</translation> <translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> からの通知を無効にする</translation> <translation id="2666092431469916601">一番上</translation> +<translation id="2538759511191347839">行末に移動して選択範囲を変更</translation> +<translation id="928465423150706909">行末に移動</translation> <translation id="8331626408530291785">上にスクロール</translation> <translation id="7907591526440419938">ファイルを開く</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">メディアの停止</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">復元</translation> +<translation id="5349525451964472598">左に移動して選択範囲を変更</translation> +<translation id="1781701194097416995">左の単語に移動</translation> <translation id="1243314992276662751">アップロード</translation> <translation id="50030952220075532">残り <ph name="NUMBER_ONE"/> 日</translation> <translation id="8179976553408161302">Enter</translation> +<translation id="8471049483003785219">左の単語に移動して選択範囲を変更</translation> <translation id="945522503751344254">フィードバックを送信</translation> <translation id="9170848237812810038">取消(&U)</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> 時間前</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/秒</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> 日</translation> +<translation id="2704295676501803339">左に移動</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> 秒前</translation> <translation id="494645311413743213">残り <ph name="NUMBER_TWO"/> 秒</translation> <translation id="4570886800634958009">通知を展開</translation> +<translation id="566737009157135450">後方の単語を削除</translation> <translation id="436869212180315161">押す</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> 秒前</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/秒</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> 分前</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/秒</translation> <translation id="7649070708921625228">ヘルプ</translation> +<translation id="2405367043325750948">前方削除</translation> <translation id="6699343763173986273">メディアの次のトラック</translation> <translation id="5445120697129764393">残り <ph name="NUMBER_DEFAULT"/> 秒</translation> <translation id="8226233771743600312">通知を 1 日間ミュート</translation> +<translation id="4252565523989510616">前方の単語を削除</translation> <translation id="7457942297256758195">すべて消去</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> 日前</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> 分</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/秒</translation> <translation id="2743387203779672305">クリップボードにコピー</translation> <translation id="8371695176452482769">お話しください</translation> +<translation id="1167268268675672572">行頭に移動して選択範囲を変更</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">通知を一時的にミュート</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_kn.xtb b/ui/base/strings/ui_strings_kn.xtb index 732e856d96..05490ddf32 100644 --- a/ui/base/strings/ui_strings_kn.xtb +++ b/ui/base/strings/ui_strings_kn.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">ಮೇಲಿನ ಬಾಣದ ಗುರುತು</translation> +<translation id="3969863827134279083">ಮೇಲಕ್ಕೆ ಸರಿಸಿ</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> ಸೆಕೆಂಡ್ ಉಳಿದಿದೆ</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ಗಂಟೆಗಳು</translation> <translation id="3990502903496589789">ಬಲ ತುದಿ</translation> <translation id="9038489124413477075">ಹೆಸರಿಸದ ಫೋಲ್ಡರ್</translation> +<translation id="1940483897317142625">ಸಾಲಿನ ಕೊನೆಯವರೆಗೆ ಅಳಿಸಿ</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> ನಿಮಿಷಗಳು</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> ದಿನಗಳು ಉಳಿದಿವೆ</translation> <translation id="932327136139879170">ಮುಖಪುಟ</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&ಅಂಟಿಸಿ</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">ಪದವನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ</translation> <translation id="364720409959344976">ಅಪ್ಲೋಡ್ ಮಾಡಲು ಫೋಲ್ಡರ್ ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">ಅಧಿಸೂಚನೆ ಮುಚ್ಚು</translation> <translation id="6364916375976753737">ಎಡಕ್ಕೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation> +<translation id="4218160142017529598">ಹಿಮ್ಮುಖವಾಗಿ ಅಳಿಸಿ</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> ನಿಮಿಷಗಳು</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation> <translation id="6945221475159498467">ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="6620110761915583480">ಫೈಲ್ ಉಳಿಸು</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> ಸೆಕೆಂಡುಗಳು</translation> +<translation id="8924469368910458384">ಸಾಲಿನ ಪ್ರಾರಂಭದವರೆಗೆ ಅಳಿಸಿ</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> ನಿಮಿಷ ಉಳಿದಿದೆ</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> ನಿಮಿಷ</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ದಿನಗಳು</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ಗಂಟೆಗಳು ಉಳಿದಿದೆ</translation> <translation id="5329858601952122676">&ಅಳಿಸು</translation> +<translation id="6556866813142980365">ಮತ್ತೆಮಾಡು</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> ಸೆಕೆಂಡುಗಳು</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> ನಿಮಿಷಗಳು</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> ನಿಮಿಷಗಳು</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> ನಿಮಿಷಗಳು ಉಳಿದಿದೆ</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> ಸೆಕೆಂಡ್ಗಳು ಉಳಿದಿವೆ</translation> +<translation id="6903282483217634857">ಬಲಕ್ಕೆ ಸರಿಸಿ</translation> <translation id="6659594942844771486">ಟ್ಯಾಬ್</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> ನಿಮಿಷಗಳು</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">ಕೆಳಗಿನವುಗಳಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ಅನುಮತಿಸಿ:</translation> +<translation id="2479520428668657293">ಬಲಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ಗಂಟೆಗಳು</translation> <translation id="1398853756734560583">ಗರಿಷ್ಠಗೊಳಿಸು</translation> <translation id="4250229828105606438">ಸ್ಕ್ರೀನ್ಶಾಟ್</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ಗಂಟೆಗಳು</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> ನಿಮಿಷಗಳು ಉಳಿದಿವೆ</translation> +<translation id="2557207087669398617">ಸಾಲಿನ ಪ್ರಾರಂಭಕ್ಕೆ ಸರಿಸಿ</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">&ಎಲ್ಲ ಆಯ್ಕೆ ಮಾಡಿ</translation> <translation id="2168039046890040389">ಪುಟ ಮೇಲೆ</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ದಿನಗಳು</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> ನಿಮಿಷಗಳು</translation> +<translation id="6122334925474904337">ಪದವನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> ನಿಮಿಷ</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">ಇಲ್ಲಿ ನೋಡಲು ಏನೂ ಇಲ್ಲ, ಮುಂದೆ ಸಾಗಿ.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">ಇಲ್ಲಿಗೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">ಕೆಳಕ್ಕೆ ಸರಿಸಿ</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ಗಂಟೆಗಳು</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s </translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ಗಂಟೆಗಳು ಉಳಿದಿದೆ</translation> <translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> ಅವರ ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="2666092431469916601">ಮೇಲೆ</translation> +<translation id="2538759511191347839">ಸಾಲಿನ ಅಂತ್ಯಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation> +<translation id="928465423150706909">ಸಾಲಿನ ಅಂತ್ಯಕ್ಕೆ ಸರಿಸಿ</translation> <translation id="8331626408530291785">ಮೇಲೆ ಸ್ಕ್ರೋಲ್ ಮಾಡು</translation> <translation id="7907591526440419938">ಫೈಲ್ ತೆರೆಯಿರಿ</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">ಮೀಡಿಯಾ ನಿಲುಗಡೆ</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">ಪುನಃಸ್ಥಾಪನೆ</translation> +<translation id="5349525451964472598">ಎಡಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation> +<translation id="1781701194097416995">ಪದವನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ</translation> <translation id="1243314992276662751">ಅಪ್ಲೋಡ್</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> ದಿನಗಳು ಉಳಿದಿವೆ</translation> <translation id="8179976553408161302">ನಮೂದಿಸಿ</translation> +<translation id="8471049483003785219">ಪದವನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation> <translation id="945522503751344254">ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಕಳುಹಿಸಿ</translation> <translation id="9170848237812810038">&ರದ್ದುಮಾಡು</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ದಿನ</translation> +<translation id="2704295676501803339">ಎಡಕ್ಕೆ ಸರಿಸಿ</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> ಸೆಕೆಂಡುಗಳು ಉಳಿದಿದೆ</translation> <translation id="4570886800634958009">ಅಧಿಸೂಚನೆ ವಿಸ್ತರಿಸು</translation> +<translation id="566737009157135450">ಪದವನ್ನು ಹಿಂದಕ್ಕೆ ಅಳಿಸಿ</translation> <translation id="436869212180315161">ಒತ್ತಿರಿ</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">ಸಹಾಯ</translation> +<translation id="2405367043325750948">ಮುಂದಕ್ಕೆ ಅಳಿಸಿ</translation> <translation id="6699343763173986273">ಮೀಡಿಯಾದ ಮುಂದಿನ ಟ್ರ್ಯಾಕ್</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> ಸೆಕೆಂಡ್ಗಳು ಉಳಿದಿವೆ</translation> <translation id="8226233771743600312">ಒಂದು ದಿನದವರೆಗೆ ಅಡಚಣೆ ಮಾಡಬೇಡಿ</translation> +<translation id="4252565523989510616">ಪದದ ಮುಂದಕ್ಕೆ ಅಳಿಸಿ</translation> <translation id="7457942297256758195">ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> ನಿಮಿಷಗಳು</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ನಕಲಿಸಿ</translation> <translation id="8371695176452482769">ಈಗ ಮಾತನಾಡಿ</translation> +<translation id="1167268268675672572">ಸಾಲಿನ ಪ್ರಾರಂಭಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation> <translation id="6965382102122355670">ಸರಿ</translation> <translation id="7850320739366109486">ಅಡಚಣೆ ಮಾಡಬೇಡಿ</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_ko.xtb b/ui/base/strings/ui_strings_ko.xtb index 026a6dcf6c..3d0c4702b1 100644 --- a/ui/base/strings/ui_strings_ko.xtb +++ b/ui/base/strings/ui_strings_ko.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/>B</translation> <translation id="3660179305079774227">위쪽 화살표</translation> +<translation id="3969863827134279083">위로 이동</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/>초 남음</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/>MB/초</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/>시간</translation> <translation id="3990502903496589789">오른쪽 모서리</translation> <translation id="9038489124413477075">이름이 없는 폴더</translation> +<translation id="1940483897317142625">마지막 줄까지 삭제</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/>분</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/>일 남음</translation> <translation id="932327136139879170">홈</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/>일 전</translation> <translation id="5076340679995252485">붙여넣기(&P)</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/>TB</translation> +<translation id="7139614227326422685">단어 오른쪽으로 이동</translation> <translation id="364720409959344976">업로드할 폴더 선택</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/>분 전</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">알림 닫기</translation> <translation id="6364916375976753737">왼쪽으로 스크롤</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/>시간 전</translation> +<translation id="4218160142017529598">이전 삭제</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/>분</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/>분 전</translation> <translation id="6945221475159498467">선택</translation> <translation id="6620110761915583480">파일 저장</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/>초</translation> +<translation id="8924469368910458384">첫 줄까지 삭제</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minute left</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/>분</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/>일</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/>시간 남음</translation> <translation id="5329858601952122676">삭제(&D)</translation> +<translation id="6556866813142980365">다시실행</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/>초</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/>KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/>분</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/>분</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/>분 남음</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/>초 남음</translation> +<translation id="6903282483217634857">오른쪽으로 이동</translation> <translation id="6659594942844771486">탭</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/>MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/>일 전</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/>분</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">다음 항목에 알림 허용:</translation> +<translation id="2479520428668657293">오른쪽으로 이동 및 선택사항 수정</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/>시간</translation> <translation id="1398853756734560583">최대화</translation> <translation id="4250229828105606438">캡처화면</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/>시간</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/>분 남음</translation> +<translation id="2557207087669398617">첫 줄로 이동</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/>GB</translation> <translation id="1901303067676059328">전체 선택(&A)</translation> <translation id="2168039046890040389">페이지 위로</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/>일</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/>분</translation> +<translation id="6122334925474904337">오른쪽으로 이동 및 선택사항 수정</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/>분</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/>초 전</translation> <translation id="4927753642311223124">표시할 내용이 없습니다.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">여기로 스크롤</translation> <translation id="4552416320897244156">PageDown</translation> +<translation id="3066573403916685335">아래로 이동</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/>시간</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/>KB/초</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/>시간 남음</translation> <translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/>의 알림 사용 중지</translation> <translation id="2666092431469916601">맨 위</translation> +<translation id="2538759511191347839">마지막 줄로 이동 및 선택사항 수정</translation> +<translation id="928465423150706909">마지막 줄로 이동</translation> <translation id="8331626408530291785">위로 스크롤</translation> <translation id="7907591526440419938">파일 열기</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">미디어 중지</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">복구</translation> +<translation id="5349525451964472598">왼쪽으로 이동 및 선택사항 수정</translation> +<translation id="1781701194097416995">단어 왼쪽으로 이동</translation> <translation id="1243314992276662751">업로드</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/>일 남음</translation> <translation id="8179976553408161302">Enter</translation> +<translation id="8471049483003785219">단어 왼쪽으로 이동 및 선택사항 수정</translation> <translation id="945522503751344254">의견 보내기</translation> <translation id="9170848237812810038">실행 취소(&U)</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/>시간 전</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/>GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/>일</translation> +<translation id="2704295676501803339">왼쪽으로 이동</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/>초 전</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/>초 남음</translation> <translation id="4570886800634958009">알림 펼치기</translation> +<translation id="566737009157135450">이전 단어 삭제</translation> <translation id="436869212180315161">누르기</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/>초 전</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/>TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/>분 전</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/>B/s</translation> <translation id="7649070708921625228">도움말</translation> +<translation id="2405367043325750948">다음 삭제</translation> <translation id="6699343763173986273">미디어 다음 트랙</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/>초 남음</translation> <translation id="8226233771743600312">하루 동안 알림 일시중지</translation> +<translation id="4252565523989510616">다음 단어 삭제</translation> <translation id="7457942297256758195">모두 지우기</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/>일 전</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/>분</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/>PB/s</translation> <translation id="2743387203779672305">클립보드로 복사</translation> <translation id="8371695176452482769">지금 말하기</translation> +<translation id="1167268268675672572">첫 줄로 이동 및 선택사항 수정</translation> <translation id="6965382102122355670">확인</translation> <translation id="7850320739366109486">알림 일시중지</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_lt.xtb b/ui/base/strings/ui_strings_lt.xtb index 8aa5b44469..a7733646aa 100644 --- a/ui/base/strings/ui_strings_lt.xtb +++ b/ui/base/strings/ui_strings_lt.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Rodyklė „Aukštyn“</translation> +<translation id="3969863827134279083">Perkelti į viršų</translation> <translation id="7062130397825382308">Liko <ph name="NUMBER_ONE"/> sekundė</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> val.</translation> <translation id="3990502903496589789">Dešinysis kraštas</translation> <translation id="9038489124413477075">Aplankas be pavadinimo</translation> +<translation id="1940483897317142625">Trinti iki eilutės pabaigos</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min.</translation> <translation id="3520476450377425184">liko <ph name="NUMBER_MANY"/> dienos (-ų)</translation> <translation id="932327136139879170">Pradžia</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Prieš <ph name="NUMBER_FEW"/> dienas (-ų)</translation> <translation id="5076340679995252485">&Įklijuoti</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Perkelti per vieną žodį į dešinę</translation> <translation id="364720409959344976">Pasirinkite norimą įkelti aplanką</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">Prieš <ph name="NUMBER_TWO"/> min.</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Uždaryti pranešimus</translation> <translation id="6364916375976753737">Slinkti į kairę</translation> <translation id="2629089419211541119">Prieš <ph name="NUMBER_ONE"/> val.</translation> +<translation id="4218160142017529598">Trinti atgal</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> min.</translation> <translation id="6982279413068714821">Prieš <ph name="NUMBER_DEFAULT"/> min.</translation> <translation id="6945221475159498467">Pasirinkti</translation> <translation id="6620110761915583480">Išsaugoti failą</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sek.</translation> +<translation id="8924469368910458384">Trinti iki eilutės pradžios</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Liko <ph name="NUMBER_ONE"/> min.</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min.</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dienos</translation> <translation id="7163503212501929773">liko <ph name="NUMBER_MANY"/> valandos (-ų)</translation> <translation id="5329858601952122676">&Pašalinti</translation> +<translation id="6556866813142980365">Grąžinti</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sek.</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> min.</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> min.</translation> <translation id="50960180632766478">liko <ph name="NUMBER_FEW"/> min.</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">Perkelti į dešinę</translation> <translation id="6659594942844771486">Skirtukas</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Prieš <ph name="NUMBER_DEFAULT"/> dienas (-ų)</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> min.</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Leisti pranešimus iš šių plėtinių:</translation> +<translation id="2479520428668657293">Perkelti į dešinę ir pakeisti pažymėtą tekstą</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> valandos (-ų)</translation> <translation id="1398853756734560583">Išskleisti</translation> <translation id="4250229828105606438">Ekrano kopija</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> valandos (-ų)</translation> <translation id="5260878308685146029">liko <ph name="NUMBER_TWO"/> min.</translation> +<translation id="2557207087669398617">Perkelti į eilutės pradžią</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Pasirinkti &viską</translation> <translation id="2168039046890040389">Puslapį į viršų</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dienos</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> min.</translation> +<translation id="6122334925474904337">Perkelti per vieną žodį į dešinę ir pakeisti pažymėtą tekstą</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> min.</translation> <translation id="8448317557906454022">Prieš <ph name="NUMBER_ZERO"/> sek.</translation> <translation id="4927753642311223124">Čia nieko nėra, slinkite toliau.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Slinkti iki čia</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Perkelti žemyn</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> valandos (-ų)</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB per sek.</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">liko <ph name="NUMBER_ONE"/> val.</translation> <translation id="1413622004203049571">Išjungti pranešimus nuo <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Į viršų</translation> +<translation id="2538759511191347839">Perkelti į eilutės pabaigą ir pakeisti pažymėtą tekstą</translation> +<translation id="928465423150706909">Perkelti į eilutės pabaigą</translation> <translation id="8331626408530291785">Slinkti į viršų</translation> <translation id="7907591526440419938">Atidaryti failą</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Sustabdyti mediją</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Atkurti</translation> +<translation id="5349525451964472598">Perkelti į kairę ir pakeisti pažymėtą tekstą</translation> +<translation id="1781701194097416995">Perkelti per vieną žodį į kairę</translation> <translation id="1243314992276662751">Įkelti</translation> <translation id="50030952220075532">liko <ph name="NUMBER_ONE"/> diena</translation> <translation id="8179976553408161302">Įvesti</translation> +<translation id="8471049483003785219">Perkelti per vieną žodį į kairę ir pakeisti pažymėtą tekstą</translation> <translation id="945522503751344254">Siųsti atsiliepimą</translation> <translation id="9170848237812810038">&Atšaukti</translation> <translation id="1285266685456062655">Prieš <ph name="NUMBER_FEW"/> val.</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> diena</translation> +<translation id="2704295676501803339">Perkelti į kairę</translation> <translation id="9098468523912235228">Prieš <ph name="NUMBER_DEFAULT"/> sek.</translation> <translation id="494645311413743213">liko <ph name="NUMBER_TWO"/> sek.</translation> <translation id="4570886800634958009">Išplėsti pranešimą</translation> +<translation id="566737009157135450">Trinti žodį atgal</translation> <translation id="436869212180315161">Spustelėti</translation> <translation id="4860787810836767172">Prieš <ph name="NUMBER_FEW"/> sek.</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">Prieš <ph name="NUMBER_MANY"/> min.</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Žinynas</translation> +<translation id="2405367043325750948">Trinti pirmyn</translation> <translation id="6699343763173986273">Kitas medijos takelis</translation> <translation id="5445120697129764393">Liko <ph name="NUMBER_DEFAULT"/> sekundžių</translation> <translation id="8226233771743600312">Netrukdyti vieną dieną</translation> +<translation id="4252565523989510616">Trinti žodį pirmyn</translation> <translation id="7457942297256758195">Išvalyti viską</translation> <translation id="822618367988303761">Prieš <ph name="NUMBER_TWO"/> dienas</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min.</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Kopijuoti į iškarpinę</translation> <translation id="8371695176452482769">Kalbėti dabar</translation> +<translation id="1167268268675672572">Perkelti į eilutės pradžią ir pakeisti pažymėtą tekstą</translation> <translation id="6965382102122355670">Gerai</translation> <translation id="7850320739366109486">Netrukdyti</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_lv.xtb b/ui/base/strings/ui_strings_lv.xtb index 144d2d3f4a..9e340f44cb 100644 --- a/ui/base/strings/ui_strings_lv.xtb +++ b/ui/base/strings/ui_strings_lv.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Bulta augšup</translation> +<translation id="3969863827134279083">Pārvietot augšup</translation> <translation id="7062130397825382308">Atlikusi <ph name="NUMBER_ONE"/> sekunde</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> stundas</translation> <translation id="3990502903496589789">Labā puse</translation> <translation id="9038489124413477075">Mape bez nosaukuma</translation> +<translation id="1940483897317142625">Dzēst līdz rindiņas beigām</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minūtes</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dienas atlikušas</translation> <translation id="932327136139879170">Sākumvieta</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Pirms <ph name="NUMBER_FEW"/> dienām</translation> <translation id="5076340679995252485">&Ielīmēt</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Pārvietot pa labi par vienu vārdu</translation> <translation id="364720409959344976">Augšupielādējamās mapes atlase</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Paziņojuma aizvēršana</translation> <translation id="6364916375976753737">Ritināt pa kreisi</translation> <translation id="2629089419211541119">Pirms <ph name="NUMBER_ONE"/> stundas</translation> +<translation id="4218160142017529598">Dzēst iepriekšējo</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minūtes</translation> <translation id="6982279413068714821">Pirms <ph name="NUMBER_DEFAULT"/> minūtēm</translation> <translation id="6945221475159498467">Atlasīt</translation> <translation id="6620110761915583480">Saglabāt failu</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekunžu</translation> +<translation id="8924469368910458384">Dzēst līdz rindiņas sākumam</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Atlikusi <ph name="NUMBER_ONE"/> minūte</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minūtes</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dienas</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/>stundas atlikušas</translation> <translation id="5329858601952122676">Dzēst</translation> +<translation id="6556866813142980365">Atcelt atsaukšanu</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sekundes</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minūtes atlikušas</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">Pārvietot pa labi</translation> <translation id="6659594942844771486">Cilne</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Pirms <ph name="NUMBER_DEFAULT"/> dienām</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minūtes</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Atļaut paziņojumu saņemšanu no:</translation> +<translation id="2479520428668657293">Pārvietot pa labi un mainīt atlasi</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> stundas</translation> <translation id="1398853756734560583">Maksimizēt</translation> <translation id="4250229828105606438">Ekrānuzņēmums</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> stundas</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minūtes atlikušas</translation> +<translation id="2557207087669398617">Pārvietot uz rindiņas sākumu</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Izvēlēties visus</translation> <translation id="2168039046890040389">Augšup</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/>dienas</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minūtes</translation> +<translation id="6122334925474904337">Pārvietot pa labi par vienu vārdu un mainīt atlasi</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minūte</translation> <translation id="8448317557906454022">Pirms <ph name="NUMBER_ZERO"/> sekundēm</translation> <translation id="4927753642311223124">Te nekā nav, varat doties tālāk!</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Ritināt šeit</translation> <translation id="4552416320897244156">Lejup</translation> +<translation id="3066573403916685335">Pārvietot lejup</translation> <translation id="7052633198403197513">taustiņš F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> stundas</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> stundas atlikušas</translation> <translation id="1413622004203049571">Atspējot paziņojumu saņemšanu no: <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Augša</translation> +<translation id="2538759511191347839">Pārvietot uz rindiņas beigām un mainīt atlasi</translation> +<translation id="928465423150706909">Pārvietot uz rindiņas beigām</translation> <translation id="8331626408530291785">Ritināt augšup</translation> <translation id="7907591526440419938">Atvērt failu</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Multivide — pārtraukt</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Atjaunot</translation> +<translation id="5349525451964472598">Pārvietot pa kreisi un mainīt atlasi</translation> +<translation id="1781701194097416995">Pārvietot pa kreisi par vienu vārdu</translation> <translation id="1243314992276662751">Augšupielādēt</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> dienas atlikušas</translation> <translation id="8179976553408161302">Ievadīt</translation> +<translation id="8471049483003785219">Pārvietot pa kreisi par vienu vārdu un mainīt atlasi</translation> <translation id="945522503751344254">Sūtīt atsauksmes</translation> <translation id="9170848237812810038">&Atsaukt</translation> <translation id="1285266685456062655">Pirms <ph name="NUMBER_FEW"/> stundām</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> diena</translation> +<translation id="2704295676501803339">Pārvietot pa kreisi</translation> <translation id="9098468523912235228">Pirms <ph name="NUMBER_DEFAULT"/> sekundēm</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> sekundes atlikušas</translation> <translation id="4570886800634958009">Paziņojuma izvēršana</translation> +<translation id="566737009157135450">Dzēst iepriekšējo vārdu</translation> <translation id="436869212180315161">Nospiediet</translation> <translation id="4860787810836767172">Pirms <ph name="NUMBER_FEW"/> sekundēm</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Palīdzība</translation> +<translation id="2405367043325750948">Dzēst nākamo</translation> <translation id="6699343763173986273">Multivide — nākamā dziesma</translation> <translation id="5445120697129764393">Atlikušas <ph name="NUMBER_DEFAULT"/> sekundes</translation> <translation id="8226233771743600312">Netraucēt dienu</translation> +<translation id="4252565523989510616">Dzēst nākamo vārdu</translation> <translation id="7457942297256758195">Notīrīt visu</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minūtes</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Kopēt starpliktuvē</translation> <translation id="8371695176452482769">Runājiet tūlīt</translation> +<translation id="1167268268675672572">Pārvietot uz rindiņas sākumu un mainīt atlasi</translation> <translation id="6965382102122355670">Labi</translation> <translation id="7850320739366109486">Netraucēt</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_ml.xtb b/ui/base/strings/ui_strings_ml.xtb index d74c461d3c..e1e5fc9bb4 100644 --- a/ui/base/strings/ui_strings_ml.xtb +++ b/ui/base/strings/ui_strings_ml.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">മുകളിലേക്കുള്ള അമ്പടയാളം</translation> +<translation id="3969863827134279083">മുകളിലേക്ക് നീക്കുക</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> നിമിഷം ശേഷിക്കുന്നു</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> മണിക്കൂര്</translation> <translation id="3990502903496589789">വലത് അഗ്രം</translation> <translation id="9038489124413477075">പേരിടാത്ത ഫോൾഡർ</translation> +<translation id="1940483897317142625">വരിയുടെ അവസാനം വരെ ഇല്ലാതാക്കുക</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> മിനിറ്റ്</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> ദിവസം ശേഷിക്കുന്നു</translation> <translation id="932327136139879170">ഹോം</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&ഒട്ടിക്കുക</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">വലതുവശത്തുള്ള പദത്തിലേക്ക് നീക്കുക</translation> <translation id="364720409959344976">അപ്ലോഡുചെയ്യുന്നതിന് ഫോൾഡർ തിരഞ്ഞെടുക്കുക</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">അറിയിപ്പ് അടയ്ക്കൽ</translation> <translation id="6364916375976753737">ഇടത്തേക്ക് സ്ക്രോള് ചെയ്യുക</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation> +<translation id="4218160142017529598">പുറകിലേക്ക് ഇല്ലാതാക്കുക</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> മിനിറ്റ്</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation> <translation id="6945221475159498467">തിരഞ്ഞെടുക്കുക</translation> <translation id="6620110761915583480">ഫയല് സംരക്ഷിക്കുക</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> സെക്കൻഡ്</translation> +<translation id="8924469368910458384">വരിയുടെ തുടക്കം വരെ ഇല്ലാതാക്കുക</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> മിനിറ്റ് ശേഷിക്കുന്നു</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> മിനിറ്റ്</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ദിവസം</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> മണിക്കൂര് ശേഷിക്കുന്നു</translation> <translation id="5329858601952122676">&ഇല്ലാതാക്കൂ</translation> +<translation id="6556866813142980365">വീണ്ടുംചെയ്യുക</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> സെക്കന്റ്</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> മിനിറ്റ്</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> മിനിറ്റ്</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> മിനിറ്റ് അവശേഷിക്കുന്നു</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> നിമിഷം ശേഷിക്കുന്നു</translation> +<translation id="6903282483217634857">വലതുവശത്തേക്ക് നീക്കുക</translation> <translation id="6659594942844771486">ടാബ്</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> മിനിറ്റ്</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">ഇനിപ്പറയുന്നതിൽ നിന്നുള്ള അറിയിപ്പുകൾ അനുവദിക്കുക:</translation> +<translation id="2479520428668657293">വലതുവശത്തേക്ക് നീക്കി തിരഞ്ഞെടുത്തത് പരിഷ്ക്കരിക്കുക</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> മണിക്കൂര്</translation> <translation id="1398853756734560583">വലുതാക്കുക</translation> <translation id="4250229828105606438">സ്ക്രീൻഷോട്ട്</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> മണിക്കൂര്</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> മിനിറ്റ് അവശേഷിക്കുന്നു</translation> +<translation id="2557207087669398617">വരിയുടെ തുടക്കത്തിലേക്ക് നീക്കുക</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">എല്ലാം &തിരഞ്ഞെടുക്കൂ</translation> <translation id="2168039046890040389">പേജ് മുകളിലേയ്ക്ക്</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ദിവസം</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> മിനിറ്റ്</translation> +<translation id="6122334925474904337">വലതുവശത്തുള്ള പദത്തിലേക്ക് നീക്കി തിരഞ്ഞെടുത്തത് പരിഷ്ക്കരിക്കുക</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> മിനിറ്റ്</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">ഇവിടെ കാണുന്നതിനായി ഒന്നുമില്ല, തുടരുക.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">ഇവിടെ സ്ക്രോള് ചെയ്യുക</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">താഴേക്ക് നീക്കുക</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> മണിക്കൂര്</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> മണിക്കൂര് ശേഷിക്കുന്നു</translation> <translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> എന്നതിൽ നിന്നുള്ള അറിയിപ്പുകൾ പ്രവർത്തനരഹിതമാക്കുക</translation> <translation id="2666092431469916601">മുകളിലേക്ക്</translation> +<translation id="2538759511191347839">വരിയുടെ അവസാനത്തിലേക്ക് നീക്കി തിരഞ്ഞെടുത്തത് പരിഷ്ക്കരിക്കുക</translation> +<translation id="928465423150706909">വരിയുടെ അവസാനത്തിലേക്ക് നീക്കുക</translation> <translation id="8331626408530291785">മുകളിലേക്ക് സ്ക്രോള് ചെയ്യൂ</translation> <translation id="7907591526440419938">ഫയല് തുറക്കുക</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">മീഡിയ നിർത്തുക</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">പുനഃസ്ഥാപിക്കുക</translation> +<translation id="5349525451964472598">ഇടത് വശത്തേക്ക് നീക്കി തിരഞ്ഞെടുത്തത് പരിഷ്ക്കരിക്കുക</translation> +<translation id="1781701194097416995">ഇടതുവശത്തുള്ള പദത്തിലേക്ക് നീക്കുക</translation> <translation id="1243314992276662751">അപ്ലോഡുചെയ്യുക</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> ദിവസം അവശേഷിക്കുന്നു</translation> <translation id="8179976553408161302">നൽകുക</translation> +<translation id="8471049483003785219">ഇടതുവശത്തുള്ള പദത്തിലേക്ക് നീക്കി തിരഞ്ഞെടുത്ത് പരിഷ്ക്കരിക്കുക</translation> <translation id="945522503751344254">ഫീഡ്ബാക്ക് അയയ്ക്കുക</translation> <translation id="9170848237812810038">&പൂര്വാവസ്ഥയിലാക്കുക</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ദിവസം</translation> +<translation id="2704295676501803339">ഇടതുവശത്തേക്ക് നീക്കുക</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> സെക്കന്റ് മുമ്പ്</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> സെക്കന്റ് അവശേഷിക്കുന്നു</translation> <translation id="4570886800634958009">അറിയിപ്പ് വിപുലീകരണം</translation> +<translation id="566737009157135450">പദം പുറകിലേക്ക് ഇല്ലാതാക്കുക</translation> <translation id="436869212180315161">അമര്ത്തുക</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">സഹായം</translation> +<translation id="2405367043325750948">മുമ്പിലേക്ക് ഇല്ലാതാക്കുക</translation> <translation id="6699343763173986273">അടുത്ത മീഡിയ ട്രാക്ക്</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> നിമിഷം ശേഷിക്കുന്നു</translation> <translation id="8226233771743600312">ഒരു ദിവസത്തേക്ക് ശല്യപ്പെടുത്തരുത്</translation> +<translation id="4252565523989510616">പദം മുമ്പിലേക്ക് ഇല്ലാതാക്കുക</translation> <translation id="7457942297256758195">എല്ലാം മായ്ക്കുക</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> മിനിറ്റ്</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുക</translation> <translation id="8371695176452482769">ഇപ്പോള് സംസാരിക്കുക</translation> +<translation id="1167268268675672572">വരിയുടെ തുടക്കത്തിലേക്ക് നീക്കി തിരഞ്ഞെടുത്തത് പരിഷ്ക്കരിക്കുക</translation> <translation id="6965382102122355670">ശരി</translation> <translation id="7850320739366109486">ശല്യം ചെയ്യരുത്</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_mr.xtb b/ui/base/strings/ui_strings_mr.xtb index e951afc500..6a7b562700 100644 --- a/ui/base/strings/ui_strings_mr.xtb +++ b/ui/base/strings/ui_strings_mr.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Up Arrow</translation> +<translation id="3969863827134279083">वर हलवा</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> सेकंद शिल्लक</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> तास</translation> <translation id="3990502903496589789">उजवा काठ</translation> <translation id="9038489124413477075">अनामित फोल्डर</translation> +<translation id="1940483897317142625">ओळीच्या समाप्तीपर्यंत हटवा</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> मि</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> दिवस बाकी</translation> <translation id="932327136139879170">मुख्यपृष्ठ</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&पेस्ट करा</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">शब्द उजवीकडे हलवा</translation> <translation id="364720409959344976">अपलोड करण्यासाठी फोल्डर निवडा</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">सूचना बंद</translation> <translation id="6364916375976753737">डावीकडे स्क्रोल करा</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation> +<translation id="4218160142017529598">मागील हटवा</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> मिनिटे</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation> <translation id="6945221475159498467">निवडा</translation> <translation id="6620110761915583480">फाइल जतन करा</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> सेकंद</translation> +<translation id="8924469368910458384">ओळीच्या सुरुवातीपर्यंत हटवा</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> मिनिट शिल्लक</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> मि</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> दिवस</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> तास बाकी</translation> <translation id="5329858601952122676">&हटवा</translation> +<translation id="6556866813142980365">पुन्हा करा</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> से</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> मिनिटे</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> मिनिटे</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> मि बाकी</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> सेकंद शिल्लक</translation> +<translation id="6903282483217634857">उजवीकडे हलवा</translation> <translation id="6659594942844771486">टॅब</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> मि</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">खालील लोकांकडील सूचनांना अनुमत करा:</translation> +<translation id="2479520428668657293">उजवीकडे हलवा आणि निवड सुधारित करा</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> तास</translation> <translation id="1398853756734560583">वाढवा</translation> <translation id="4250229828105606438">स्क्रीनशॉट</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> तास</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> मि बाकी</translation> +<translation id="2557207087669398617">ओळीच्या सुरुवातीस हलवा</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">&सर्व निवडा</translation> <translation id="2168039046890040389">पृष्ठ वर</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> दिवस</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> मि</translation> +<translation id="6122334925474904337">शब्द उजवीकडे हलवा आणि निवड सुधारित करा</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> मिनिट</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">येथे पाहण्यासाठी काही नाही, पुढे चला.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">येथे स्क्रोल करा</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">खाली हलवा</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> तास</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> तास बाकी</translation> <translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> वरील सूचना अक्षम करा</translation> <translation id="2666092431469916601">शीर्ष</translation> +<translation id="2538759511191347839">ओळीच्या समाप्तीवर हलवा आणि निवड सुधारित करा</translation> +<translation id="928465423150706909">ओळीच्या समाप्तीवर हलवा</translation> <translation id="8331626408530291785">वर स्क्रोल करा</translation> <translation id="7907591526440419938">फाइल उघडा</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">मीडिया थांबवा</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">पुनर्संचयित करा</translation> +<translation id="5349525451964472598">डावीकडे हलवा आणि निवड सुधारित करा</translation> +<translation id="1781701194097416995">शब्द डावीकडे हलवा</translation> <translation id="1243314992276662751">अपलोड करा</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> दिवस बाकी</translation> <translation id="8179976553408161302">प्रवेश करा</translation> +<translation id="8471049483003785219">शब्द डावीकडे हलवा आणि निवड सुधारित करा</translation> <translation id="945522503751344254">अभिप्राय पाठवा</translation> <translation id="9170848237812810038">&पूर्ववत करा</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> दिवस</translation> +<translation id="2704295676501803339">डावीकडे हलवा</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> से बाकी</translation> <translation id="4570886800634958009">सूचना विस्तार</translation> +<translation id="566737009157135450">मागचा शब्द हटवा</translation> <translation id="436869212180315161">दाबा</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">मदत</translation> +<translation id="2405367043325750948">पुढचा हटवा</translation> <translation id="6699343763173986273">मीडिया पुढील ट्रॅक</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> सेकंद शिल्लक</translation> <translation id="8226233771743600312">एक दिवस व्यत्यय आणू नका</translation> +<translation id="4252565523989510616">पुढचा शब्द हटवा</translation> <translation id="7457942297256758195">सर्व साफ करा</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> मि</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">क्लिपबोर्डवर कॉपी करा</translation> <translation id="8371695176452482769">आता बोला</translation> +<translation id="1167268268675672572">ओळीच्या सुरुवातीवर हलवा आणि निवड सुधारित करा</translation> <translation id="6965382102122355670">ठिक आहे</translation> <translation id="7850320739366109486">व्यत्यय आणू नका</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_ms.xtb b/ui/base/strings/ui_strings_ms.xtb index 04b3cc4ba9..c94b4f1220 100644 --- a/ui/base/strings/ui_strings_ms.xtb +++ b/ui/base/strings/ui_strings_ms.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Anak Panah Atas</translation> +<translation id="3969863827134279083">Alihkan ke Atas</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> saat lagi</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> jam</translation> <translation id="3990502903496589789">Tepi Kanan</translation> <translation id="9038489124413477075">Folder Tanpa Nama</translation> +<translation id="1940483897317142625">Padamkan Hingga Akhir Baris</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> mins</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> hari lagi</translation> <translation id="932327136139879170">Halaman Utama</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> hari yang lalu</translation> <translation id="5076340679995252485">&Tampal</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Alihkan Perkataan ke Kanan</translation> <translation id="364720409959344976">Pilih Folder untuk Dimuat Naik</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minit lalu</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Tutup Pemberitahuan</translation> <translation id="6364916375976753737">Tatal Ke Kiri</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> jam yang lalu</translation> +<translation id="4218160142017529598">Padamkan ke Belakang</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minit</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minit yang lalu</translation> <translation id="6945221475159498467">Pilih</translation> <translation id="6620110761915583480">Simpan Fail</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> saat</translation> +<translation id="8924469368910458384">Padamkan Hingga Permulaan Baris</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> jam</translation> <translation id="7836361698254323868">Tinggal <ph name="NUMBER_ONE"/> minit</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minit</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> hari</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> jam lagi</translation> <translation id="5329858601952122676">&Padam</translation> +<translation id="6556866813142980365">Buat semula</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> saat</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minit</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minit</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minit lagi</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> saat lagi</translation> +<translation id="6903282483217634857">Alihkan Ke Kanan</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> hari yang lalu</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> mins</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> jam lagi</translation> <translation id="7135556860107312402">Benarkan pemberitahuan daripada yang berikut:</translation> +<translation id="2479520428668657293">Alihkan Ke Kanan Dan Ubah Suai Pilihan</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> jam</translation> <translation id="1398853756734560583">Maksimumkan</translation> <translation id="4250229828105606438">Tangkapan skrin</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> jam</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minit lagi</translation> +<translation id="2557207087669398617">Alihkan Ke Permulaan Baris</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Pilih &semua</translation> <translation id="2168039046890040389">Halaman Ke Atas</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> hari</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation> +<translation id="6122334925474904337">Alihkan Perkataan ke Kanan Dan Ubah Suai Pilihan</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minit</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> saat yang lalu</translation> <translation id="4927753642311223124">Tiada apa-apa untuk dilihat di sini, teruskan.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> hari</translation> <translation id="3183922693828471536">Tatal ke Sini</translation> <translation id="4552416320897244156">BwhHlmn</translation> +<translation id="3066573403916685335">Alihkan Ke Bawah</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> jam</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> jam lagi</translation> <translation id="1413622004203049571">Lumpuhkan pemberitahuan daripada <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Atas</translation> +<translation id="2538759511191347839">Alihkan Ke Hujung Baris Dan Ubah Suai Pilihan</translation> +<translation id="928465423150706909">Alihkan Ke Hujung Baris</translation> <translation id="8331626408530291785">Tatal Ke Atas</translation> <translation id="7907591526440419938">Buka Fail</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> hari lagi</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Media Berhenti</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> minit lagi</translation> <translation id="3157931365184549694">Pulihkan</translation> +<translation id="5349525451964472598">Alihkan Ke Kiri Dan Ubah Suai Pilihan</translation> +<translation id="1781701194097416995">Alihkan Perkataan Ke Kiri</translation> <translation id="1243314992276662751">Muat naik</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> hari lagi</translation> <translation id="8179976553408161302">Masuk</translation> +<translation id="8471049483003785219">Alihkan Perkataan Ke Kiri dan Ubah Suai Pilihan</translation> <translation id="945522503751344254">Hantar maklum balas</translation> <translation id="9170848237812810038">&Buat asal</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> jam yang lalu</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> jam yang lalu</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> hari</translation> +<translation id="2704295676501803339">Alihkan Ke Kiri</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> saat yang lalu</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> saat lagi</translation> <translation id="4570886800634958009">Kembangkan pemberitahuan</translation> +<translation id="566737009157135450">Padamkan Perkataan Ke Belakang</translation> <translation id="436869212180315161">Tekan</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> saat yang lalu</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minit yang lalu</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Bantuan</translation> +<translation id="2405367043325750948">Padamkan Ke Hadapan</translation> <translation id="6699343763173986273">Lagu Media Seterusnya</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> saat lagi</translation> <translation id="8226233771743600312">Jangan ganggu selama sehari</translation> +<translation id="4252565523989510616">Padamkan Perkataan Ke Hadapan</translation> <translation id="7457942297256758195">Kosongkan Semua</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> hari yang lalu</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Salin ke papan keratan</translation> <translation id="8371695176452482769">Cakap sekarang</translation> +<translation id="1167268268675672572">Alihkan Ke Permulaan Baris Dan Ubah Suai Pilihan</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Jangan Ganggu</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> hari yang lalu</translation> diff --git a/ui/base/strings/ui_strings_nl.xtb b/ui/base/strings/ui_strings_nl.xtb index 9d174b7c9c..5cbf083a97 100644 --- a/ui/base/strings/ui_strings_nl.xtb +++ b/ui/base/strings/ui_strings_nl.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Pijl-omhoog</translation> +<translation id="3969863827134279083">Naar boven</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> seconde resterend</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> uur</translation> <translation id="3990502903496589789">Rechterzijde</translation> <translation id="9038489124413477075">Naamloze map</translation> +<translation id="1940483897317142625">Verwijderen tot einde van regel</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuten</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dagen resterend</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> dagen geleden</translation> <translation id="5076340679995252485">&Plakken</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Eén woord naar rechts</translation> <translation id="364720409959344976">Map voor uploaden selecteren</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minuten geleden</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Melding sluiten</translation> <translation id="6364916375976753737">Naar links bladeren</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> uur geleden</translation> +<translation id="4218160142017529598">Achterwaarts verwijderen</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuten</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minuten geleden</translation> <translation id="6945221475159498467">Selecteren</translation> <translation id="6620110761915583480">Bestand opslaan</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconden</translation> +<translation id="8924469368910458384">Verwijderen tot begin van regel</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minuut resterend</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minuut</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dagen</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> uur resterend</translation> <translation id="5329858601952122676">Verwij&deren</translation> +<translation id="6556866813142980365">Opnieuw</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> seconden</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuten</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuten resterend</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconden resterend</translation> +<translation id="6903282483217634857">Naar rechts verplaatsen</translation> <translation id="6659594942844771486">Tabblad</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> dagen geleden</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minuten</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Meldingen toestaan van het volgende:</translation> +<translation id="2479520428668657293">Naar rechts verplaatsen en selectie aanpassen</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> uur</translation> <translation id="1398853756734560583">Maximaliseren</translation> <translation id="4250229828105606438">Screenshot</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> uur</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minuten resterend</translation> +<translation id="2557207087669398617">Naar begin van regel verplaatsen</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">&Alles selecteren</translation> <translation id="2168039046890040389">Pagina omhoog</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dagen</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minuten</translation> +<translation id="6122334925474904337">Eén woord naar rechts verplaatsen en selectie aanpassen</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuut</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> seconden geleden</translation> <translation id="4927753642311223124">Er zijn geen meldingen.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Hiernaartoe bladeren</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Naar beneden</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> uur</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> uur resterend</translation> <translation id="1413622004203049571">Meldingen van <ph name="NOTIFIER_NAME"/> uitschakelen</translation> <translation id="2666092431469916601">Boven</translation> +<translation id="2538759511191347839">Naar einde van regel verplaatsen en selectie aanpassen</translation> +<translation id="928465423150706909">Naar einde van regel verplaatsen</translation> <translation id="8331626408530291785">Omhoog bladeren</translation> <translation id="7907591526440419938">Bestand openen</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Media stoppen</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Herstellen</translation> +<translation id="5349525451964472598">Naar links verplaatsen en selectie aanpassen</translation> +<translation id="1781701194097416995">Eén woord naar links verplaatsen</translation> <translation id="1243314992276662751">Uploaden</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> dag resterend</translation> <translation id="8179976553408161302">Beginnen</translation> +<translation id="8471049483003785219">Eén woord naar links verplaatsen en selectie aanpassen</translation> <translation id="945522503751344254">Feedback verzenden</translation> <translation id="9170848237812810038">&Ongedaan maken</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> uur geleden</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dag</translation> +<translation id="2704295676501803339">Naar links verplaatsen</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> seconden geleden</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> seconden resterend</translation> <translation id="4570886800634958009">Melding uitbreiden</translation> +<translation id="566737009157135450">Het voorgaande woord verwijderen</translation> <translation id="436869212180315161">Drukken</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> seconden geleden</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minuten geleden</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Help</translation> +<translation id="2405367043325750948">Voorwaarts verwijderen</translation> <translation id="6699343763173986273">Volgende track voor media</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> seconden resterend</translation> <translation id="8226233771743600312">Een dag niet storen</translation> +<translation id="4252565523989510616">Het volgende woord verwijderen</translation> <translation id="7457942297256758195">Alles wissen</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> dagen geleden</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuten</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Kopiëren naar klembord</translation> <translation id="8371695176452482769">Begin nu te spreken</translation> +<translation id="1167268268675672572">Naar begin van regel verplaatsen en selectie aanpassen</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Niet storen</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_no.xtb b/ui/base/strings/ui_strings_no.xtb index 1a45a2480c..01243cd961 100644 --- a/ui/base/strings/ui_strings_no.xtb +++ b/ui/base/strings/ui_strings_no.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Pil opp</translation> +<translation id="3969863827134279083">Flytt opp</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> sekund igjen</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB per sek.</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> timer</translation> <translation id="3990502903496589789">Høyre kant</translation> <translation id="9038489124413477075">Mappe uten navn</translation> +<translation id="1940483897317142625">Slett til slutten av linjen</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutter</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dager igjen</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&Lim inn</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Flytt ett ord til høyre</translation> <translation id="364720409959344976">Velg mappen du vil laste opp</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Lukk varsel</translation> <translation id="6364916375976753737">Rull mot venstre</translation> <translation id="2629089419211541119">For <ph name="NUMBER_ONE"/> time siden</translation> +<translation id="4218160142017529598">Slett bakover</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutter</translation> <translation id="6982279413068714821">For <ph name="NUMBER_DEFAULT"/> minutter siden</translation> <translation id="6945221475159498467">Velg</translation> <translation id="6620110761915583480">Lagre fil</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekunder</translation> +<translation id="8924469368910458384">Slett til begynnelsen av linjen</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minutt igjen</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minutt</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dager</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> timer igjen</translation> <translation id="5329858601952122676">&Slett</translation> +<translation id="6556866813142980365">Gjør om</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sekunder</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutter</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutter</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutter igjen</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> sekunder igjen</translation> +<translation id="6903282483217634857">Flytt til høyre</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">For <ph name="NUMBER_DEFAULT"/> dager siden</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutter</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Tillat varsler fra følgende:</translation> +<translation id="2479520428668657293">Flytt til høyre og endre merkingen</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> timer</translation> <translation id="1398853756734560583">Maksimer</translation> <translation id="4250229828105606438">Skjermdump</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> timer</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minutter igjen</translation> +<translation id="2557207087669398617">Flytt til begynnelsen av linjen</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Marker &alt</translation> <translation id="2168039046890040389">Opp 1 s.</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dager</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutter</translation> +<translation id="6122334925474904337">Flytt ett ord til høyre og endre merkingen</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minutt</translation> <translation id="8448317557906454022">For <ph name="NUMBER_ZERO"/> sekunder siden</translation> <translation id="4927753642311223124">Det er ikke noe å se her. Gå videre.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Rull hit</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Flytt ned</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> timer</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> kB per sek</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> time igjen</translation> <translation id="1413622004203049571">Deaktiver varsler fra <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Topp</translation> +<translation id="2538759511191347839">Flytt til slutten av linjen og endre merkingen</translation> +<translation id="928465423150706909">Flytt til slutten av linjen</translation> <translation id="8331626408530291785">Rull opp</translation> <translation id="7907591526440419938">Åpne filen</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Media – stopp</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Gjenopprett</translation> +<translation id="5349525451964472598">Flytt til venstre og endre merkingen</translation> +<translation id="1781701194097416995">Flytt ett ord til venstre</translation> <translation id="1243314992276662751">Last opp</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> dag igjen</translation> <translation id="8179976553408161302">Start</translation> +<translation id="8471049483003785219">Flytt ett ord til venstre og endre merkingen</translation> <translation id="945522503751344254">Gi tilbakemelding</translation> <translation id="9170848237812810038">&Angre</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB per sek</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dag</translation> +<translation id="2704295676501803339">Flytt til venstre</translation> <translation id="9098468523912235228">For <ph name="NUMBER_DEFAULT"/> sekunder siden</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> sekunder igjen</translation> <translation id="4570886800634958009">Utvid varsel</translation> +<translation id="566737009157135450">Slett ett ord bakover</translation> <translation id="436869212180315161">Trykk</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB per sek</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B per sek</translation> <translation id="7649070708921625228">Hjelp</translation> +<translation id="2405367043325750948">Slett fremover</translation> <translation id="6699343763173986273">Media – neste spor</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> sekunder igjen</translation> <translation id="8226233771743600312">Ikke forstyrr i en dag</translation> +<translation id="4252565523989510616">Slett ett ord fremover</translation> <translation id="7457942297256758195">Fjern alle</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutter</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB per sek</translation> <translation id="2743387203779672305">Kopiér til utklippstavlen</translation> <translation id="8371695176452482769">Snakk nå</translation> +<translation id="1167268268675672572">Flytt til begynnelsen av linjen og endre merkingen</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Ikke forstyrr</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_pl.xtb b/ui/base/strings/ui_strings_pl.xtb index 407920a0cc..4e91ca29d6 100644 --- a/ui/base/strings/ui_strings_pl.xtb +++ b/ui/base/strings/ui_strings_pl.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Strzałka w górę</translation> +<translation id="3969863827134279083">Przejdź do góry</translation> <translation id="7062130397825382308">Pozostała <ph name="NUMBER_ONE"/> sekunda</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> godz.</translation> <translation id="3990502903496589789">Krawędź po prawej</translation> <translation id="9038489124413477075">Folder bez nazwy</translation> +<translation id="1940483897317142625">Usuń do końca wiersza</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dni</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> dni temu</translation> <translation id="5076340679995252485">&Wklej</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Przejdź o słowo w prawo</translation> <translation id="364720409959344976">Wybierz folder do przesłania</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> min temu</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Zamknięcie powiadomienia</translation> <translation id="6364916375976753737">Przewiń w lewo</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> godz. temu</translation> +<translation id="4218160142017529598">Usuń przed kursorem</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuty</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> min temu</translation> <translation id="6945221475159498467">Wybierz</translation> <translation id="6620110761915583480">Zapisz plik</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation> +<translation id="8924469368910458384">Usuń do początku wiersza</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Pozostała <ph name="NUMBER_ONE"/> minuta</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863">Liczba dni: <ph name="NUMBER_MANY"/></translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> godz</translation> <translation id="5329858601952122676">&Usuń</translation> +<translation id="6556866813142980365">Ponów</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> s</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> min</translation> <translation id="5517291721709019259">Pozostały <ph name="NUMBER_FEW"/> sekundy</translation> +<translation id="6903282483217634857">Przejdź w prawo</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> dni temu</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> min</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Zezwalaj na powiadomienia z:</translation> +<translation id="2479520428668657293">Przejdź w prawo i zmodyfikuj zaznaczenie</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> godz.</translation> <translation id="1398853756734560583">Maksymalizuj</translation> <translation id="4250229828105606438">Zrzut ekranu</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> godz.</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> min</translation> +<translation id="2557207087669398617">Przejdź na początek wiersza</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Zaznacz &wszystko</translation> <translation id="2168039046890040389">Strona do góry</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581">Liczba dni: <ph name="NUMBER_DEFAULT"/></translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> min</translation> +<translation id="6122334925474904337">Przejdź o słowo w prawo i zmodyfikuj zaznaczenie</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuta</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Nic tu nie ma.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Przewiń tutaj</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Przejdź w dół</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> godz.</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">Pozostała <ph name="NUMBER_ONE"/> godzina</translation> <translation id="1413622004203049571">Wyłącz powiadomienia z <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Do góry</translation> +<translation id="2538759511191347839">Przejdź na koniec wiersza i zmodyfikuj zaznaczenie</translation> +<translation id="928465423150706909">Przejdź na koniec wiersza</translation> <translation id="8331626408530291785">Przewiń w górę</translation> <translation id="7907591526440419938">Otwórz plik</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Zatrzymaj multimedia</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Przywróć</translation> +<translation id="5349525451964472598">Przejdź w lewo i zmodyfikuj zaznaczenie</translation> +<translation id="1781701194097416995">Przejdź o słowo w lewo</translation> <translation id="1243314992276662751">Prześlij</translation> <translation id="50030952220075532">Pozostał <ph name="NUMBER_ONE"/> dzień</translation> <translation id="8179976553408161302">Start</translation> +<translation id="8471049483003785219">Przejdź o słowo w lewo i zmodyfikuj zaznaczenie</translation> <translation id="945522503751344254">Wyślij zgłoszenie</translation> <translation id="9170848237812810038">&Cofnij</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> godz. temu</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dzień</translation> +<translation id="2704295676501803339">Przejdź w lewo</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> s temu</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> sek</translation> <translation id="4570886800634958009">Rozwinięcie powiadomienia</translation> +<translation id="566737009157135450">Usuń słowo przed kursorem</translation> <translation id="436869212180315161">Kliknij</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> s temu</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Pomoc</translation> +<translation id="2405367043325750948">Usuń za kursorem</translation> <translation id="6699343763173986273">Następny utwór multimedialny</translation> <translation id="5445120697129764393">Pozostało <ph name="NUMBER_DEFAULT"/> sekund</translation> <translation id="8226233771743600312">Nie przeszkadzać przez jeden dzień</translation> +<translation id="4252565523989510616">Usuń słowo za kursorem</translation> <translation id="7457942297256758195">Wyczyść wszystkie</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> dni temu</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Skopiuj do schowka</translation> <translation id="8371695176452482769">Mów teraz</translation> +<translation id="1167268268675672572">Przejdź na początek wiersza i zmodyfikuj zaznaczenie</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Nie przeszkadzać</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_pt-BR.xtb b/ui/base/strings/ui_strings_pt-BR.xtb index 089dda7582..f0855dc13f 100644 --- a/ui/base/strings/ui_strings_pt-BR.xtb +++ b/ui/base/strings/ui_strings_pt-BR.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> bytes</translation> <translation id="3660179305079774227">Seta para cima</translation> +<translation id="3969863827134279083">Mover para cima</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> segundo restante</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> horas</translation> <translation id="3990502903496589789">Borda direita</translation> <translation id="9038489124413477075">Pasta sem nome</translation> +<translation id="1940483897317142625">Excluir até o fim da linha</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutos</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dias restantes</translation> <translation id="932327136139879170">Página inicial</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&Colar</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Mover para palavra à direita</translation> <translation id="364720409959344976">Selecionar pasta para upload</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Fechar notificação</translation> <translation id="6364916375976753737">Percorrer à esquerda</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hora atrás</translation> +<translation id="4218160142017529598">Excluir para trás</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutos</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minutos atrás</translation> <translation id="6945221475159498467">Selecionar</translation> <translation id="6620110761915583480">Salvar arquivo</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> segundos</translation> +<translation id="8924469368910458384">Excluir até o começo da linha</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minuto restante</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minuto</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dias</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> horas restantes</translation> <translation id="5329858601952122676">&Excluir</translation> +<translation id="6556866813142980365">Refazer</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> s</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutos</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutos</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutos restantes</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">Mover para a direita</translation> <translation id="6659594942844771486">Guia</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> dias atrás</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutos</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Permitir as seguintes notificações:</translation> +<translation id="2479520428668657293">Mover para a direita e modificar seleção</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> horas</translation> <translation id="1398853756734560583">Maximizar</translation> <translation id="4250229828105606438">Captura de tela</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> horas</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minutos restantes</translation> +<translation id="2557207087669398617">Mover para o início da linha</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Selecionar &tudo</translation> <translation id="2168039046890040389">Página para cima</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dias</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutos</translation> +<translation id="6122334925474904337">Mover para palavra à direita e modificar seleção</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Nada para ver aqui, siga em frente.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Percorrer até aqui</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Mover para baixo</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hora restante</translation> <translation id="1413622004203049571">Desativar notificações de <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Parte superior</translation> +<translation id="2538759511191347839">Mover para o fim da linha e modificar seleção</translation> +<translation id="928465423150706909">Mover para o fim da linha</translation> <translation id="8331626408530291785">Percorrer para cima</translation> <translation id="7907591526440419938">Abrir arquivo</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Parar mídia</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Restaurar</translation> +<translation id="5349525451964472598">Mover para a esquerda e modificar seleção</translation> +<translation id="1781701194097416995">Mover para palavra à esquerda</translation> <translation id="1243314992276662751">Fazer upload</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> dia restante</translation> <translation id="8179976553408161302">Entrar</translation> +<translation id="8471049483003785219">Mover para palavra à esquerda e modificar seleção</translation> <translation id="945522503751344254">Enviar comentários</translation> <translation id="9170848237812810038">&Desfazer</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dia</translation> +<translation id="2704295676501803339">Mover para a esquerda</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> segundos atrás</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> segundos restantes</translation> <translation id="4570886800634958009">Expandir notificação</translation> +<translation id="566737009157135450">Excluir palavra anterior</translation> <translation id="436869212180315161">Apertar</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Ajuda</translation> +<translation id="2405367043325750948">Excluir para frente</translation> <translation id="6699343763173986273">Próxima faixa da mídia</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> segundos restantes</translation> <translation id="8226233771743600312">Não perturbe por um dia</translation> +<translation id="4252565523989510616">Excluir palavra da frente</translation> <translation id="7457942297256758195">Limpar tudo</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutos</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Copiar para a área de trabalho</translation> <translation id="8371695176452482769">Fale agora</translation> +<translation id="1167268268675672572">Mover para o começo da linha e modificar seleção</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Não Perturbe</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_pt-PT.xtb b/ui/base/strings/ui_strings_pt-PT.xtb index 573c190db5..3310e4df55 100644 --- a/ui/base/strings/ui_strings_pt-PT.xtb +++ b/ui/base/strings/ui_strings_pt-PT.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Seta para cima</translation> +<translation id="3969863827134279083">Mover para cima</translation> <translation id="7062130397825382308">Falta <ph name="NUMBER_ONE"/> segundo</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> horas</translation> <translation id="3990502903496589789">Margem direita</translation> <translation id="9038489124413477075">Pasta sem nome</translation> +<translation id="1940483897317142625">Eliminar para o fim da linha</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min.</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dias restantes</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Há <ph name="NUMBER_FEW"/> dias</translation> <translation id="5076340679995252485">C&olar</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Mover palavra para a direita</translation> <translation id="364720409959344976">Selecionar Pasta a Carregar</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">Há <ph name="NUMBER_TWO"/> min.</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Fechar notificação</translation> <translation id="6364916375976753737">Deslocar-se para a esquerda</translation> <translation id="2629089419211541119">Há <ph name="NUMBER_ONE"/> hora</translation> +<translation id="4218160142017529598">Eliminar para trás</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutos</translation> <translation id="6982279413068714821">Há <ph name="NUMBER_DEFAULT"/> min.</translation> <translation id="6945221475159498467">Seleccionar</translation> <translation id="6620110761915583480">Guardar ficheiro</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> segundos</translation> +<translation id="8924469368910458384">Eliminar para o início da linha</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Falta <ph name="NUMBER_ONE"/> minuto</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min.</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dias</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> horas restantes</translation> <translation id="5329858601952122676">E&liminar</translation> +<translation id="6556866813142980365">Refazer</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> seg.</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutos</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutos</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> min. restantes</translation> <translation id="5517291721709019259">Faltam <ph name="NUMBER_FEW"/> segundos</translation> +<translation id="6903282483217634857">Mover para a direita</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Há <ph name="NUMBER_DEFAULT"/> dias</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> min.</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Permitir notificações de:</translation> +<translation id="2479520428668657293">Mover para a direita e modificar seleção</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> horas</translation> <translation id="1398853756734560583">Maximizar</translation> <translation id="4250229828105606438">Captura de ecrã</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> horas</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> min. restantes</translation> +<translation id="2557207087669398617">Mover para o início da linha</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Seleccion&ar tudo</translation> <translation id="2168039046890040389">Página para cima</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dias</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> min.</translation> +<translation id="6122334925474904337">Mover palavra para a direita e modificar seleção</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation> <translation id="8448317557906454022">Há <ph name="NUMBER_ZERO"/> seg.</translation> <translation id="4927753642311223124">Nada de novo a apresentar por aqui.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Deslocar-se para aqui</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Mover para baixo</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hora restante</translation> <translation id="1413622004203049571">Desativar notificações de <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Parte superior</translation> +<translation id="2538759511191347839">Mover para o fim da linha e modificar seleção</translation> +<translation id="928465423150706909">Mover para o fim da linha</translation> <translation id="8331626408530291785">Deslocar-se para cima</translation> <translation id="7907591526440419938">Abrir ficheiro</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Parar multimédia</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Restaurar</translation> +<translation id="5349525451964472598">Mover para a esquerda e modificar seleção</translation> +<translation id="1781701194097416995">Mover palavra para a esquerda</translation> <translation id="1243314992276662751">Carregar</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> dia restante</translation> <translation id="8179976553408161302">Entrar</translation> +<translation id="8471049483003785219">Mover palavra para a esquerda e modificar seleção</translation> <translation id="945522503751344254">Enviar comentários</translation> <translation id="9170848237812810038">An&ular</translation> <translation id="1285266685456062655">Há <ph name="NUMBER_FEW"/> horas</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dia</translation> +<translation id="2704295676501803339">Mover para a esquerda</translation> <translation id="9098468523912235228">Há <ph name="NUMBER_DEFAULT"/> seg.</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> seg. restantes</translation> <translation id="4570886800634958009">Expandir notificação</translation> +<translation id="566737009157135450">Eliminar uma palavra para trás</translation> <translation id="436869212180315161">Premir</translation> <translation id="4860787810836767172">Há <ph name="NUMBER_FEW"/> seg.</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">Há <ph name="NUMBER_MANY"/> min.</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Ajuda</translation> +<translation id="2405367043325750948">Eliminar para a frente</translation> <translation id="6699343763173986273">Faixa seguinte de multimédia</translation> <translation id="5445120697129764393">Faltam <ph name="NUMBER_DEFAULT"/> segundos</translation> <translation id="8226233771743600312">Não incomodar durante um dia</translation> +<translation id="4252565523989510616">Eliminar uma palavra para a frente</translation> <translation id="7457942297256758195">Limpar Tudo</translation> <translation id="822618367988303761">Há <ph name="NUMBER_TWO"/> dias</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min.</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Copiar para a área de transferência</translation> <translation id="8371695176452482769">Falar agora</translation> +<translation id="1167268268675672572">Mover para o início da linha e modificar seleção</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Não incomodar</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_ro.xtb b/ui/base/strings/ui_strings_ro.xtb index c797175602..91cc92c0bf 100644 --- a/ui/base/strings/ui_strings_ro.xtb +++ b/ui/base/strings/ui_strings_ro.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> O</translation> <translation id="3660179305079774227">Săgeata în sus</translation> +<translation id="3969863827134279083">Mutați în sus</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> secundă rămasă</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MO/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ore</translation> <translation id="3990502903496589789">Marginea dreaptă</translation> <translation id="9038489124413477075">Dosar fără nume</translation> +<translation id="1940483897317142625">Ștergeți până la sfârșitul rândului</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minute</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> zile rămase</translation> <translation id="932327136139879170">Pagina de pornire</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Cu <ph name="NUMBER_FEW"/> zile în urmă</translation> <translation id="5076340679995252485">&Inserați</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TO</translation> +<translation id="7139614227326422685">Mutați la cuvântul următor</translation> <translation id="364720409959344976">Selectați un dosar de încărcat</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">Cu <ph name="NUMBER_TWO"/> minute în urmă</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Buton de închidere a notificării</translation> <translation id="6364916375976753737">Derulați spre stânga</translation> <translation id="2629089419211541119">Cu <ph name="NUMBER_ONE"/> oră în urmă</translation> +<translation id="4218160142017529598">Ștergeți înapoi</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minute</translation> <translation id="6982279413068714821">Cu <ph name="NUMBER_DEFAULT"/> (de) minute în urmă</translation> <translation id="6945221475159498467">Selectați</translation> <translation id="6620110761915583480">Salvați fișierul</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> secunde</translation> +<translation id="8924469368910458384">Ștergeți până la începutul rândului</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> ore</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minut rămas</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minut</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> zile</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ore rămase</translation> <translation id="5329858601952122676">Ș&tergeți</translation> +<translation id="6556866813142980365">Refaceți</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secunde</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KO</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minute</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minute rămase</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> secunde rămase</translation> +<translation id="6903282483217634857">Mutați spre dreapta</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MO</translation> <translation id="4988273303304146523">Cu <ph name="NUMBER_DEFAULT"/> zile în urmă</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minute</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> ore rămase</translation> <translation id="7135556860107312402">Permiteți notificările de la următoarele:</translation> +<translation id="2479520428668657293">Mutați spre dreapta și modificați selecția</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ore</translation> <translation id="1398853756734560583">Maximizați</translation> <translation id="4250229828105606438">Captură de ecran</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ore</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minute rămase</translation> +<translation id="2557207087669398617">Mutați la începutul rândului</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GO</translation> <translation id="1901303067676059328">Select&ați tot</translation> <translation id="2168039046890040389">O pagină mai sus</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> minute</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> zile</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minute</translation> +<translation id="6122334925474904337">Mutați la cuvântul următor și modificați selecția</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minut</translation> <translation id="8448317557906454022">Cu <ph name="NUMBER_ZERO"/> secunde în urmă</translation> <translation id="4927753642311223124">Nimic de văzut aici, treceți mai departe.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> zile</translation> <translation id="3183922693828471536">Derulați până aici</translation> <translation id="4552416320897244156">PgDwn (o pagină mai jos)</translation> +<translation id="3066573403916685335">Mutați în jos</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ore</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KO/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> oră rămasă</translation> <translation id="1413622004203049571">Dezactivați notificările de la <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Sus</translation> +<translation id="2538759511191347839">Mutați la sfârșitul rândului și modificați selecția</translation> +<translation id="928465423150706909">Mutați la sfârșitul rândului</translation> <translation id="8331626408530291785">Derulați în sus</translation> <translation id="7907591526440419938">Deschideți fișierul</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> zile rămase</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Opriți conținutul media</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> minute rămase</translation> <translation id="3157931365184549694">Restabiliți</translation> +<translation id="5349525451964472598">Mutați spre stânga și modificați selecția</translation> +<translation id="1781701194097416995">Mutați la cuvântul anterior</translation> <translation id="1243314992276662751">Încărcați</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> zi rămasă</translation> <translation id="8179976553408161302">Intrați</translation> +<translation id="8471049483003785219">Mutați la cuvântul anterior și modificați selecția</translation> <translation id="945522503751344254">Trimiteți feedback</translation> <translation id="9170848237812810038">&Anulați</translation> <translation id="1285266685456062655">Cu <ph name="NUMBER_FEW"/> ore în urmă</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350">Cu <ph name="NUMBER_ZERO"/> ore în urmă</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GO/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> zi</translation> +<translation id="2704295676501803339">Mutați spre stânga</translation> <translation id="9098468523912235228">Cu <ph name="NUMBER_DEFAULT"/> (de) secunde în urmă</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> secunde rămase</translation> <translation id="4570886800634958009">Buton de extindere a notificării</translation> +<translation id="566737009157135450">Ștergeți înapoi un cuvânt</translation> <translation id="436869212180315161">Apăsați</translation> <translation id="4860787810836767172">Cu <ph name="NUMBER_FEW"/> secunde în urmă</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TO/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">Cu <ph name="NUMBER_MANY"/> (de) minute în urmă</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> O/s</translation> <translation id="7649070708921625228">Ajutor</translation> +<translation id="2405367043325750948">Ștergeți înainte</translation> <translation id="6699343763173986273">Melodia următoare din conținutul media</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> de secunde rămase</translation> <translation id="8226233771743600312">Nu deranja o zi</translation> +<translation id="4252565523989510616">Ștergeți înainte un cuvânt</translation> <translation id="7457942297256758195">Ștergeți-le pe toate</translation> <translation id="822618367988303761">Cu <ph name="NUMBER_TWO"/> zile în urmă</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minute</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PO/s</translation> <translation id="2743387203779672305">Copiați în clipboard</translation> <translation id="8371695176452482769">Vorbiți acum</translation> +<translation id="1167268268675672572">Mutați la începutul rândului și modificați selecția</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Nu deranja</translation> <translation id="6978839998405419496">Cu <ph name="NUMBER_ZERO"/> zile în urmă</translation> diff --git a/ui/base/strings/ui_strings_ru.xtb b/ui/base/strings/ui_strings_ru.xtb index 55e8c54a19..9eb0224a77 100644 --- a/ui/base/strings/ui_strings_ru.xtb +++ b/ui/base/strings/ui_strings_ru.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> Б</translation> <translation id="3660179305079774227">Стрелка вверх</translation> +<translation id="3969863827134279083">Перейти вверх</translation> <translation id="7062130397825382308">Осталась <ph name="NUMBER_ONE"/> секунда</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> МБ/с</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ч.</translation> <translation id="3990502903496589789">Правый край</translation> <translation id="9038489124413477075">Без названия</translation> +<translation id="1940483897317142625">Удалить текст до конца строки</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> мин.</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> дн.</translation> <translation id="932327136139879170">На главную</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> дн. назад</translation> <translation id="5076340679995252485">&Вставить</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> ТБ</translation> +<translation id="7139614227326422685">Перейти вправо к следующему слову</translation> <translation id="364720409959344976">Выберите папку для загрузки</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Закрыть оповещение</translation> <translation id="6364916375976753737">Прокрутка влево</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ч. назад</translation> +<translation id="4218160142017529598">Удалить предыдущий символ</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> мин.</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> мин. назад</translation> <translation id="6945221475159498467">Выбрать</translation> <translation id="6620110761915583480">Сохранить файл</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> сек.</translation> +<translation id="8924469368910458384">Удалить текст до начала строки</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Осталась <ph name="NUMBER_ONE"/> минута</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> мин.</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> дн.</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ч.</translation> <translation id="5329858601952122676">&Удалить</translation> +<translation id="6556866813142980365">Повторить</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> сек.</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> КБ</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> мин.</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> мин.</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> мин.</translation> <translation id="5517291721709019259">Осталось <ph name="NUMBER_FEW"/> секунды</translation> +<translation id="6903282483217634857">Перейти вправо</translation> <translation id="6659594942844771486">Вкладка</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> МБ</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> дн. назад</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> мин.</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Разрешить оповещения от:</translation> +<translation id="2479520428668657293">Перейти вправо и изменить выделение</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ч.</translation> <translation id="1398853756734560583">Развернуть</translation> <translation id="4250229828105606438">Скриншот</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ч.</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> мин.</translation> +<translation id="2557207087669398617">Перейти к началу строки</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> ГБ</translation> <translation id="1901303067676059328">Выделить &все</translation> <translation id="2168039046890040389">Вверх</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> дн.</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> мин.</translation> +<translation id="6122334925474904337">Перейти вправо к следующему слову и изменить выделение</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> мин.</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Оповещений нет.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Прокрутить до этого места</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Перейти вниз</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ч.</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> КБ/с</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ч.</translation> <translation id="1413622004203049571">Отключить оповещения от <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Наверх</translation> +<translation id="2538759511191347839">Перейти к концу строки и изменить выделение</translation> +<translation id="928465423150706909">Перейти к концу строки</translation> <translation id="8331626408530291785">Прокрутка вверх</translation> <translation id="7907591526440419938">Открытие файла</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Остановить</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Восстановить</translation> +<translation id="5349525451964472598">Перейти влево и изменить выделение</translation> +<translation id="1781701194097416995">Перейти влево к следующему слову</translation> <translation id="1243314992276662751">Загрузить</translation> <translation id="50030952220075532">Остался <ph name="NUMBER_ONE"/> день</translation> <translation id="8179976553408161302">Войти</translation> +<translation id="8471049483003785219">Перейти влево к следующему слову и изменить выделение</translation> <translation id="945522503751344254">Отправить отзыв</translation> <translation id="9170848237812810038">&Отменить</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> ч. назад</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> ГБ/с</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> день</translation> +<translation id="2704295676501803339">Перейти влево</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> с. назад</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> сек.</translation> <translation id="4570886800634958009">Раскрыть оповещение</translation> +<translation id="566737009157135450">Удалить предыдущее слово</translation> <translation id="436869212180315161">Нажать</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> с. назад</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> ТБ/с</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> Б/с</translation> <translation id="7649070708921625228">Справка</translation> +<translation id="2405367043325750948">Удалить следующий символ</translation> <translation id="6699343763173986273">Следующий трек</translation> <translation id="5445120697129764393">Осталось <ph name="NUMBER_DEFAULT"/> секунд</translation> <translation id="8226233771743600312">Не беспокоить (1 день)</translation> +<translation id="4252565523989510616">Удалить следующее слово</translation> <translation id="7457942297256758195">Очистить все</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> мин.</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> ПБ/с</translation> <translation id="2743387203779672305">Скопировать в буфер</translation> <translation id="8371695176452482769">Говорите</translation> +<translation id="1167268268675672572">Перейти к началу строки и изменить выделение</translation> <translation id="6965382102122355670">ОК</translation> <translation id="7850320739366109486">Не беспокоить</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_sk.xtb b/ui/base/strings/ui_strings_sk.xtb index 876626cfc4..050bd59430 100644 --- a/ui/base/strings/ui_strings_sk.xtb +++ b/ui/base/strings/ui_strings_sk.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Šípka nahor</translation> +<translation id="3969863827134279083">Presunúť nahor</translation> <translation id="7062130397825382308">Zostáva <ph name="NUMBER_ONE"/> sekunda</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928">Počet hodín: <ph name="NUMBER_DEFAULT"/></translation> <translation id="3990502903496589789">Pravý okraj</translation> <translation id="9038489124413477075">Priečinok bez názvu</translation> +<translation id="1940483897317142625">Odstrániť po koniec riadka</translation> <translation id="8507996248087185956">Počet minút: <ph name="NUMBER_DEFAULT"/></translation> <translation id="3520476450377425184">Počet zvyšných dní: <ph name="NUMBER_MANY"/></translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Pred <ph name="NUMBER_FEW"/> dňami</translation> <translation id="5076340679995252485">&Vložiť</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Presunúť slovo doprava</translation> <translation id="364720409959344976">Výber priečinka na nahranie</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Zavrieť upozornenie</translation> <translation id="6364916375976753737">Rolovať doľava</translation> <translation id="2629089419211541119">Pred <ph name="NUMBER_ONE"/> hod</translation> +<translation id="4218160142017529598">Odstrániť predchádzajúci znak</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> min</translation> <translation id="6982279413068714821">Pred <ph name="NUMBER_DEFAULT"/> minútami</translation> <translation id="6945221475159498467">Vybrať</translation> <translation id="6620110761915583480">Uložiť súbor</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekúnd</translation> +<translation id="8924469368910458384">Odstrániť po začiatok riadka</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Zostáva <ph name="NUMBER_ONE"/> minúta</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minúta</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863">Počet dní: <ph name="NUMBER_MANY"/></translation> <translation id="7163503212501929773">Počet zvyšných hodín: <ph name="NUMBER_MANY"/></translation> <translation id="5329858601952122676">&Odstrániť</translation> +<translation id="6556866813142980365">Znova</translation> <translation id="8088823334188264070">Počet sekúnd: <ph name="NUMBER_MANY"/></translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minúty</translation> <translation id="50960180632766478">Počet zvyšných minút: <ph name="NUMBER_FEW"/></translation> <translation id="5517291721709019259">Zostávajú <ph name="NUMBER_FEW"/> sekundy</translation> +<translation id="6903282483217634857">Presunúť doprava</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Pred <ph name="NUMBER_DEFAULT"/> dňami</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773">Počet minút: <ph name="NUMBER_TWO"/></translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Povoliť prijímanie upozornení od:</translation> +<translation id="2479520428668657293">Presunúť doprava a upraviť výber</translation> <translation id="8112886015144590373">Počet hodín: <ph name="NUMBER_FEW"/></translation> <translation id="1398853756734560583">Maximalizovať</translation> <translation id="4250229828105606438">Snímka obrazovky</translation> <translation id="6690744523875189208">Počet hodín: <ph name="NUMBER_TWO"/></translation> <translation id="5260878308685146029">Počet zvyšných minút: <ph name="NUMBER_TWO"/></translation> +<translation id="2557207087669398617">Presunúť na začiatok riadka</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Vybrať &všetko</translation> <translation id="2168039046890040389">Page Up</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581">Počet dní: <ph name="NUMBER_DEFAULT"/></translation> <translation id="6463061331681402734">Počet minút: <ph name="NUMBER_MANY"/></translation> +<translation id="6122334925474904337">Presunúť slovo doprava a upraviť výber</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minúta</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Tu sa nič nenachádza, pokračujte ďalej.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Rolovať na toto miesto</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Presunúť nadol</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401">Počet hodín: <ph name="NUMBER_MANY"/></translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">Zostáva <ph name="NUMBER_ONE"/> hodina</translation> <translation id="1413622004203049571">Zakázať upozornenia od <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Vrch</translation> +<translation id="2538759511191347839">Presunúť na koniec riadka a upraviť výber</translation> +<translation id="928465423150706909">Presunúť na koniec riadka</translation> <translation id="8331626408530291785">Rolovať nahor</translation> <translation id="7907591526440419938">Otvoriť súbor</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Médiá – zastaviť</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Obnoviť</translation> +<translation id="5349525451964472598">Presunúť doľava a upraviť výber</translation> +<translation id="1781701194097416995">Presunúť slovo doľava</translation> <translation id="1243314992276662751">Nahrať</translation> <translation id="50030952220075532">Zostáva <ph name="NUMBER_ONE"/> deň</translation> <translation id="8179976553408161302">Začať</translation> +<translation id="8471049483003785219">Presunúť slovo doľava a upraviť výber</translation> <translation id="945522503751344254">Poslať pripomienky</translation> <translation id="9170848237812810038">&Naspäť</translation> <translation id="1285266685456062655">Pred <ph name="NUMBER_FEW"/> hodinami</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> deň</translation> +<translation id="2704295676501803339">Presunúť doľava</translation> <translation id="9098468523912235228">Pred <ph name="NUMBER_DEFAULT"/> s</translation> <translation id="494645311413743213">Počet zvyšných sekúnd: <ph name="NUMBER_TWO"/></translation> <translation id="4570886800634958009">Rozbaliť upozornenie</translation> +<translation id="566737009157135450">Odstrániť predchádzajúce slovo</translation> <translation id="436869212180315161">Stlačiť</translation> <translation id="4860787810836767172">Pred <ph name="NUMBER_FEW"/> s</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Pomocník</translation> +<translation id="2405367043325750948">Odstrániť nasledujúci znak</translation> <translation id="6699343763173986273">Média – ďalšia stopa</translation> <translation id="5445120697129764393">Zostáva <ph name="NUMBER_DEFAULT"/> sekúnd</translation> <translation id="8226233771743600312">Nerušiť jeden deň</translation> +<translation id="4252565523989510616">Odstrániť nasledujúce slovo</translation> <translation id="7457942297256758195">Vymazať všetky</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565">Počet minút: <ph name="NUMBER_FEW"/></translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Kopírovať do schránky</translation> <translation id="8371695176452482769">Začnite hovoriť</translation> +<translation id="1167268268675672572">Presunúť na začiatok riadka a upraviť výber</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Nerušiť</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_sl.xtb b/ui/base/strings/ui_strings_sl.xtb index d2e184cf8a..1e3db6ea15 100644 --- a/ui/base/strings/ui_strings_sl.xtb +++ b/ui/base/strings/ui_strings_sl.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Puščica gor</translation> +<translation id="3969863827134279083">Premik gor</translation> <translation id="7062130397825382308">Še <ph name="NUMBER_ONE"/> sekundo</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> h</translation> <translation id="3990502903496589789">Desni rob</translation> <translation id="9038489124413477075">Neimenovana mapa</translation> +<translation id="1940483897317142625">Brisanje do konca vrstice</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min</translation> <translation id="3520476450377425184">še <ph name="NUMBER_MANY"/> dni</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Pred <ph name="NUMBER_FEW"/> dnevi</translation> <translation id="5076340679995252485">&Prilepi</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Premik besede desno</translation> <translation id="364720409959344976">Izberite mapo, ki jo želite prenesti</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">Pred <ph name="NUMBER_TWO"/> min</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Zapri obvestilo</translation> <translation id="6364916375976753737">Pomik levo</translation> <translation id="2629089419211541119">Pred <ph name="NUMBER_ONE"/> h</translation> +<translation id="4218160142017529598">Brisanje nazaj</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> min</translation> <translation id="6982279413068714821">Pred <ph name="NUMBER_DEFAULT"/> min</translation> <translation id="6945221475159498467">Izberi</translation> <translation id="6620110761915583480">Shrani datoteko</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation> +<translation id="8924469368910458384">Brisanje do začetka vrstice</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">še <ph name="NUMBER_ONE"/> min</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> days</translation> <translation id="7163503212501929773">še <ph name="NUMBER_MANY"/> ur</translation> <translation id="5329858601952122676">&Izbriši</translation> +<translation id="6556866813142980365">Uveljavi</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuti</translation> <translation id="50960180632766478">še <ph name="NUMBER_FEW"/> min</translation> <translation id="5517291721709019259">Še <ph name="NUMBER_FEW"/> sekunde</translation> +<translation id="6903282483217634857">Premik desno</translation> <translation id="6659594942844771486">Tabulator</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Pred <ph name="NUMBER_DEFAULT"/> dnevi</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> min</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Omogočanje obvestil teh aplikacij:</translation> +<translation id="2479520428668657293">Premik desno in sprememba izbire</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ur</translation> <translation id="1398853756734560583">Povečaj</translation> <translation id="4250229828105606438">Posnetek zaslona</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> uri</translation> <translation id="5260878308685146029">še <ph name="NUMBER_TWO"/> min</translation> +<translation id="2557207087669398617">Premik na začetek vrstice</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Izberi &vse</translation> <translation id="2168039046890040389">Stran gor</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dni</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation> +<translation id="6122334925474904337">Premik besede desno in sprememba izbire</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuta</translation> <translation id="8448317557906454022">Pred <ph name="NUMBER_ZERO"/> s</translation> <translation id="4927753642311223124">Tu ni ničesar, pomaknite se naprej.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Pomik do sem</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Premik dol</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ur</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">še <ph name="NUMBER_ONE"/> ura</translation> <translation id="1413622004203049571">Izklop obvestil za <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Na vrh</translation> +<translation id="2538759511191347839">Premik na konec vrstice in sprememba izbire</translation> +<translation id="928465423150706909">Premik na konec vrstice</translation> <translation id="8331626408530291785">Pomik gor</translation> <translation id="7907591526440419938">Odpri datoteko</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Ustavitev</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Obnovi</translation> +<translation id="5349525451964472598">Premik levo in sprememba izbire</translation> +<translation id="1781701194097416995">Premik besede levo</translation> <translation id="1243314992276662751">Prenesi</translation> <translation id="50030952220075532">še <ph name="NUMBER_ONE"/> dan</translation> <translation id="8179976553408161302">Potrdi</translation> +<translation id="8471049483003785219">Premik besede levo in sprememba izbire</translation> <translation id="945522503751344254">Pošlji povratne informacije</translation> <translation id="9170848237812810038">&Razveljavi</translation> <translation id="1285266685456062655">Pred <ph name="NUMBER_FEW"/> h</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dan</translation> +<translation id="2704295676501803339">Premik levo</translation> <translation id="9098468523912235228">Pred <ph name="NUMBER_DEFAULT"/> s</translation> <translation id="494645311413743213">še <ph name="NUMBER_TWO"/> sek</translation> <translation id="4570886800634958009">Razširi obvestilo</translation> +<translation id="566737009157135450">Brisanje besede nazaj</translation> <translation id="436869212180315161">Pritisnite</translation> <translation id="4860787810836767172">Pred <ph name="NUMBER_FEW"/> s</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">Pred <ph name="NUMBER_MANY"/> min</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Pomoč</translation> +<translation id="2405367043325750948">Brisanje naprej</translation> <translation id="6699343763173986273">Naslednja skladba</translation> <translation id="5445120697129764393">Še <ph name="NUMBER_DEFAULT"/> sekund</translation> <translation id="8226233771743600312">Ne moti en dan</translation> +<translation id="4252565523989510616">Brisanje besede naprej</translation> <translation id="7457942297256758195">Izbriši vse</translation> <translation id="822618367988303761">Pred <ph name="NUMBER_TWO"/> dnevoma</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Kopiraj v odložišče</translation> <translation id="8371695176452482769">Začnite govoriti</translation> +<translation id="1167268268675672572">Premik na začetek vrstice in sprememba izbire</translation> <translation id="6965382102122355670">V redu</translation> <translation id="7850320739366109486">Ne moti</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_sr.xtb b/ui/base/strings/ui_strings_sr.xtb index 97b177a69e..5e833cb722 100644 --- a/ui/base/strings/ui_strings_sr.xtb +++ b/ui/base/strings/ui_strings_sr.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Стрелица нагоре</translation> +<translation id="3969863827134279083">Помери нагоре</translation> <translation id="7062130397825382308">Још <ph name="NUMBER_ONE"/> секунда</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928">Сати: <ph name="NUMBER_DEFAULT"/></translation> <translation id="3990502903496589789">Десна ивица</translation> <translation id="9038489124413477075">Неименовани директоријум</translation> +<translation id="1940483897317142625">Избриши до краја реда</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> мин.</translation> <translation id="3520476450377425184">Преостало <ph name="NUMBER_MANY"/> дана</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">Пре <ph name="NUMBER_FEW"/> дана</translation> <translation id="5076340679995252485">&Налепи</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Помери удесно за реч</translation> <translation id="364720409959344976">Избор директоријума за отпремање</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">Пре <ph name="NUMBER_TWO"/> минута</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Затвори обавештење</translation> <translation id="6364916375976753737">Помери налево</translation> <translation id="2629089419211541119">Пре <ph name="NUMBER_ONE"/> сат</translation> +<translation id="4218160142017529598">Избриши уназад</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> мин</translation> <translation id="6982279413068714821">Пре <ph name="NUMBER_DEFAULT"/> минута</translation> <translation id="6945221475159498467">Изабери</translation> <translation id="6620110761915583480">Чување датотеке</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> секунди</translation> +<translation id="8924469368910458384">Избриши до почетка реда</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Преостао је <ph name="NUMBER_ONE"/> минут</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> мин.</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863">Дана: <ph name="NUMBER_MANY"/></translation> <translation id="7163503212501929773">Преостало сати: <ph name="NUMBER_MANY"/></translation> <translation id="5329858601952122676">&Избриши</translation> +<translation id="6556866813142980365">Понови</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> сек.</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> минута</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> минута</translation> <translation id="50960180632766478">Преостало <ph name="NUMBER_FEW"/> мин.</translation> <translation id="5517291721709019259">Још <ph name="NUMBER_FEW"/> секунде</translation> +<translation id="6903282483217634857">Помери удесно</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">Пре <ph name="NUMBER_DEFAULT"/> дана</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> мин.</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Дозволи обавештења из следећих извора:</translation> +<translation id="2479520428668657293">Помери удесно и измени избор</translation> <translation id="8112886015144590373">Сати: <ph name="NUMBER_FEW"/></translation> <translation id="1398853756734560583">Увећај</translation> <translation id="4250229828105606438">Снимак екрана</translation> <translation id="6690744523875189208">Сати: <ph name="NUMBER_TWO"/></translation> <translation id="5260878308685146029">Преостало <ph name="NUMBER_TWO"/> мин.</translation> +<translation id="2557207087669398617">Помери на почетак реда</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Изабери &све</translation> <translation id="2168039046890040389">Страница нагоре</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581">Дана: <ph name="NUMBER_DEFAULT"/></translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> мин.</translation> +<translation id="6122334925474904337">Помери удесно за реч и измени избор</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> минут</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Нема шта да се види овде. Наставите даље.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Помери се овде</translation> <translation id="4552416320897244156">Page Down</translation> +<translation id="3066573403916685335">Помери надоле</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401">Сати: <ph name="NUMBER_MANY"/></translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">Преостао <ph name="NUMBER_ONE"/> сат</translation> <translation id="1413622004203049571">Онемогући обавештења од <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Врх</translation> +<translation id="2538759511191347839">Помери до краја реда и измени избор</translation> +<translation id="928465423150706909">Помери до краја реда</translation> <translation id="8331626408530291785">Помери нагоре</translation> <translation id="7907591526440419938">Отварање датотеке</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Заустављање медија</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Поново отвори</translation> +<translation id="5349525451964472598">Помери улево и измени избор</translation> +<translation id="1781701194097416995">Помери улево за реч</translation> <translation id="1243314992276662751">Отпреми</translation> <translation id="50030952220075532">Преостао <ph name="NUMBER_ONE"/> дан</translation> <translation id="8179976553408161302">Унеси</translation> +<translation id="8471049483003785219">Помери улево за реч и измени избор</translation> <translation id="945522503751344254">Пошаљи повратне информације</translation> <translation id="9170848237812810038">&Опозови</translation> <translation id="1285266685456062655">Пре <ph name="NUMBER_FEW"/> сата</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> дан</translation> +<translation id="2704295676501803339">Помери улево</translation> <translation id="9098468523912235228">Пре <ph name="NUMBER_DEFAULT"/> секунди</translation> <translation id="494645311413743213">Преостало <ph name="NUMBER_TWO"/> сек.</translation> <translation id="4570886800634958009">Прошири обавештење</translation> +<translation id="566737009157135450">Избриши реч уназад</translation> <translation id="436869212180315161">Притисните</translation> <translation id="4860787810836767172">Пре <ph name="NUMBER_FEW"/> секунде</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Помоћ</translation> +<translation id="2405367043325750948">Избриши унапред</translation> <translation id="6699343763173986273">Следећа песма медија</translation> <translation id="5445120697129764393">Још <ph name="NUMBER_DEFAULT"/> секунди</translation> <translation id="8226233771743600312">Не узнемиравај у периоду од једног дана</translation> +<translation id="4252565523989510616">Избриши реч унапред</translation> <translation id="7457942297256758195">Обриши све</translation> <translation id="822618367988303761">Пре <ph name="NUMBER_TWO"/> дана</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> мин.</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Копирај у меморију</translation> <translation id="8371695176452482769">Почните да говорите</translation> +<translation id="1167268268675672572">Помери на почетак реда и измени избор</translation> <translation id="6965382102122355670">Потврди</translation> <translation id="7850320739366109486">Не узнемиравај</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_sv.xtb b/ui/base/strings/ui_strings_sv.xtb index d967817674..bd33ee966a 100644 --- a/ui/base/strings/ui_strings_sv.xtb +++ b/ui/base/strings/ui_strings_sv.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Uppil</translation> +<translation id="3969863827134279083">Flytta upp</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> sekund kvar</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/sek</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> timmar</translation> <translation id="3990502903496589789">Högerkant</translation> <translation id="9038489124413477075">Namnlös mapp</translation> +<translation id="1940483897317142625">Radera till slutet av raden</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuter</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dagar kvar</translation> <translation id="932327136139879170">Startsida</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">K&listra in</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Flytta ett ord åt höger</translation> <translation id="364720409959344976">Välj en mapp för överföring</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Meddelande om stängning</translation> <translation id="6364916375976753737">Rulla åt vänster</translation> <translation id="2629089419211541119">För <ph name="NUMBER_ONE"/> timme sedan</translation> +<translation id="4218160142017529598">Radera bakåt</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuter</translation> <translation id="6982279413068714821">För <ph name="NUMBER_DEFAULT"/> minuter sedan</translation> <translation id="6945221475159498467">Välj</translation> <translation id="6620110761915583480">Spara fil</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekunder</translation> +<translation id="8924469368910458384">Radera till radens början</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minut kvar</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minut</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dagar</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> timmar kvar</translation> <translation id="5329858601952122676">&Ta bort</translation> +<translation id="6556866813142980365">Upprepa</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sekunder</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minuter</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuter</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuter kvar</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> sekunder kvar</translation> +<translation id="6903282483217634857">Flytta åt höger</translation> <translation id="6659594942844771486">Flik</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523">För <ph name="NUMBER_DEFAULT"/> dagar sedan</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> minuter</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Tillåt meddelanden från följande:</translation> +<translation id="2479520428668657293">Flytta åt höger och ändra markeringen</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> timmar</translation> <translation id="1398853756734560583">Maximera</translation> <translation id="4250229828105606438">Skärmdump</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> timmar</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minuter kvar</translation> +<translation id="2557207087669398617">Flytta till radens början</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Välj &alla</translation> <translation id="2168039046890040389">Page Up</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dagar</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minuter</translation> +<translation id="6122334925474904337">Flytta ett ord åt höger och ändra markeringen</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minut</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Här finns inget att se, fortsätt.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Rulla hit</translation> <translation id="4552416320897244156">Page Down</translation> +<translation id="3066573403916685335">Flytta ner</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> timmar</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> kB/sek</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> timmar kvar</translation> <translation id="1413622004203049571">Inaktivera aviseringar från <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Överst</translation> +<translation id="2538759511191347839">Flytta till slutet av raden och ändra markeringen</translation> +<translation id="928465423150706909">Flytta till slutet av raden</translation> <translation id="8331626408530291785">Rulla uppåt</translation> <translation id="7907591526440419938">Öppna fil</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Stoppa</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Återställ</translation> +<translation id="5349525451964472598">Flytta åt vänster och ändra markeringen</translation> +<translation id="1781701194097416995">Flytta ett ord åt vänster</translation> <translation id="1243314992276662751">Överför</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> dag kvar</translation> <translation id="8179976553408161302">Start</translation> +<translation id="8471049483003785219">Flytta ett ord åt vänster och ändra markeringen</translation> <translation id="945522503751344254">Skicka synpunkter</translation> <translation id="9170848237812810038">&Ångra</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/sek</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dag</translation> +<translation id="2704295676501803339">Flytta åt vänster</translation> <translation id="9098468523912235228">För <ph name="NUMBER_DEFAULT"/> sekunder sedan</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> sekunder kvar</translation> <translation id="4570886800634958009">Meddelande om utökning</translation> +<translation id="566737009157135450">Radera ett ord bakåt</translation> <translation id="436869212180315161">Pressen</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/sek</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/sek</translation> <translation id="7649070708921625228">Hjälp</translation> +<translation id="2405367043325750948">Radera framåt</translation> <translation id="6699343763173986273">Nästa spår</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> sekunder kvar</translation> <translation id="8226233771743600312">Stör inte i en dag</translation> +<translation id="4252565523989510616">Radera ett ord framåt</translation> <translation id="7457942297256758195">Ta bort alla</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuter</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/sek</translation> <translation id="2743387203779672305">Kopiera till Urklipp</translation> <translation id="8371695176452482769">Prata nu</translation> +<translation id="1167268268675672572">Flytta till radens början och ändra markeringen</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Stör inte</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_sw.xtb b/ui/base/strings/ui_strings_sw.xtb index c3e1852461..53b939ab18 100644 --- a/ui/base/strings/ui_strings_sw.xtb +++ b/ui/base/strings/ui_strings_sw.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658">B <ph name="QUANTITY"/></translation> <translation id="3660179305079774227">Mshale Juu</translation> +<translation id="3969863827134279083">Sogeza Juu</translation> <translation id="7062130397825382308">Imesalia sekunde <ph name="NUMBER_ONE"/></translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928">saa <ph name="NUMBER_DEFAULT"/></translation> <translation id="3990502903496589789">Ncha ya Kulia</translation> <translation id="9038489124413477075">Folda isiyo na jina</translation> +<translation id="1940483897317142625">Futa Hadi Mwisho Wa Mstari</translation> <translation id="8507996248087185956">dakika <ph name="NUMBER_DEFAULT"/></translation> <translation id="3520476450377425184">zimesalia siku <ph name="NUMBER_MANY"/></translation> <translation id="932327136139879170">Nyumbani</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011">siku <ph name="NUMBER_FEW"/> zilizopita</translation> <translation id="5076340679995252485">&Bandika</translation> <translation id="7460907917090416791">TB <ph name="QUANTITY"/></translation> +<translation id="7139614227326422685">Sogeza Upande Wa Kulia Wa Neno</translation> <translation id="364720409959344976">Chagua Folda ya Kupakia</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016">dakika <ph name="NUMBER_TWO"/> zilizopita</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Funga arifa</translation> <translation id="6364916375976753737">Sogeza Kushoto</translation> <translation id="2629089419211541119">saa <ph name="NUMBER_ONE"/> lililopita</translation> +<translation id="4218160142017529598">Futa Kuelekea Nyuma</translation> <translation id="2994641463185352298">Dakika <ph name="NUMBER_DEFAULT"/></translation> <translation id="6982279413068714821">dakika <ph name="NUMBER_DEFAULT"/> zilizopita</translation> <translation id="6945221475159498467">Chagua</translation> <translation id="6620110761915583480">Hifadhi Faili</translation> <translation id="4349181486102621992">Sekunde <ph name="NUMBER_ZERO"/></translation> +<translation id="8924469368910458384">Futa Hadi Mwanzo Wa Mstari</translation> <translation id="6719684875142564568">saa <ph name="NUMBER_ZERO"/></translation> <translation id="7836361698254323868">Imesalia dakika <ph name="NUMBER_ONE"/></translation> <translation id="2953767478223974804">dakika <ph name="NUMBER_ONE"/></translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863">siku <ph name="NUMBER_MANY"/></translation> <translation id="7163503212501929773">zimesalia saa <ph name="NUMBER_MANY"/></translation> <translation id="5329858601952122676">&Futa</translation> +<translation id="6556866813142980365">Rudia</translation> <translation id="8088823334188264070">sekunde <ph name="NUMBER_MANY"/></translation> <translation id="8901569739625249689">KB <ph name="QUANTITY"/></translation> <translation id="7712011264267466734">Dakika <ph name="NUMBER_MANY"/></translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412">Dakika <ph name="NUMBER_TWO"/></translation> <translation id="50960180632766478">zimesalia dakika <ph name="NUMBER_FEW"/></translation> <translation id="5517291721709019259">Zimesalia sekunde <ph name="NUMBER_FEW"/></translation> +<translation id="6903282483217634857">Sogeza Kulia</translation> <translation id="6659594942844771486">Kichupo</translation> <translation id="3049748772180311791">MB <ph name="QUANTITY"/></translation> <translation id="4988273303304146523">siku <ph name="NUMBER_DEFAULT"/> zilizopita</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773">dakika <ph name="NUMBER_TWO"/></translation> <translation id="5149131957118398098">Zimesalia saa <ph name="NUMBER_ZERO"/></translation> <translation id="7135556860107312402">Ruhusu arifa kutoka kwa:</translation> +<translation id="2479520428668657293">Sogeza Kulia Na Ubadilisha Uteuzi</translation> <translation id="8112886015144590373">saa <ph name="NUMBER_FEW"/></translation> <translation id="1398853756734560583">Tanua</translation> <translation id="4250229828105606438">Picha ya skrini</translation> <translation id="6690744523875189208">saa <ph name="NUMBER_TWO"/></translation> <translation id="5260878308685146029">zimesalia dakika <ph name="NUMBER_TWO"/></translation> +<translation id="2557207087669398617">Sogeza Hadi Mwanzo Wa Mstari</translation> <translation id="3757388668994797779">GB <ph name="QUANTITY"/></translation> <translation id="1901303067676059328">Chagua &yote</translation> <translation id="2168039046890040389">Ukurasa mmoja juu</translation> <translation id="7363290921156020669">dakika <ph name="NUMBER_ZERO"/></translation> <translation id="9107059250669762581">siku <ph name="NUMBER_DEFAULT"/></translation> <translation id="6463061331681402734">dakika <ph name="NUMBER_MANY"/></translation> +<translation id="6122334925474904337">Sogeza Upande Wa Kulia Wa Neno Na Ubadilishe Uteuzi</translation> <translation id="7634624804467787019">Dakika <ph name="NUMBER_ONE"/></translation> <translation id="8448317557906454022">sekunde <ph name="NUMBER_ZERO"/> zilizopita</translation> <translation id="4927753642311223124">Hakuna cha kuangalia hapa, endelea.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075">siku <ph name="NUMBER_ZERO"/></translation> <translation id="3183922693828471536">Sogeza Hadi Hapa</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Sogeza Chini</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401">saa <ph name="NUMBER_MANY"/></translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">limesalia saa <ph name="NUMBER_ONE"/></translation> <translation id="1413622004203049571">Zima arifa kutoka <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Ya Juu</translation> +<translation id="2538759511191347839">Sogeza Hadi Mwisho Wa Mstari Na Ubadilishe Uteuzi</translation> +<translation id="928465423150706909">Sogeza Mwisho Wa Mstari</translation> <translation id="8331626408530291785">Sogeza Juu</translation> <translation id="7907591526440419938">Fungua Faili</translation> <translation id="2864069933652346933">zimesalia siku <ph name="NUMBER_ZERO"/></translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Simamisha Media</translation> <translation id="1308727876662951186">zimesalia dakika <ph name="NUMBER_ZERO"/></translation> <translation id="3157931365184549694">Rejesha</translation> +<translation id="5349525451964472598">Sogeza Kushoto Na Ubadilishe Uteuzi</translation> +<translation id="1781701194097416995">Sogeza Upande Wa Kulia Wa Neno</translation> <translation id="1243314992276662751">Pakia</translation> <translation id="50030952220075532">imesalia siku <ph name="NUMBER_ONE"/></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="8471049483003785219">Sogeza Upande Wa Kulia Wa Neno Na Ubadilishe Uteuzi</translation> <translation id="945522503751344254">Tuma maoni</translation> <translation id="9170848237812810038">&Tendua</translation> <translation id="1285266685456062655">Saa <ph name="NUMBER_FEW"/> zilizopita</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350">Saa <ph name="NUMBER_ZERO"/> zilizopita</translation> <translation id="3740362395218339114">GB/s <ph name="QUANTITY"/></translation> <translation id="6644971472240498405">siku <ph name="NUMBER_ONE"/></translation> +<translation id="2704295676501803339">Sogeza Kushoto</translation> <translation id="9098468523912235228">sekunde <ph name="NUMBER_DEFAULT"/> zilizopita</translation> <translation id="494645311413743213">zimesalia sekunde <ph name="NUMBER_TWO"/></translation> <translation id="4570886800634958009">Panua arifa</translation> +<translation id="566737009157135450">Futa Neno Kwa Kuelekea Nyuma</translation> <translation id="436869212180315161">Bofya</translation> <translation id="4860787810836767172">sekunde <ph name="NUMBER_FEW"/> zilizopita</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497">dakika <ph name="NUMBER_MANY"/> zilizopita</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">Usaidizi</translation> +<translation id="2405367043325750948">Futa Ukielekea Upande Wa Mbele</translation> <translation id="6699343763173986273">Wimbo Unaofuata kwenye Media</translation> <translation id="5445120697129764393">Zimesalia sekunde <ph name="NUMBER_DEFAULT"/></translation> <translation id="8226233771743600312">Usinisumbue kwa siku moja</translation> +<translation id="4252565523989510616">Futa Neno Ukielekea Upande Wa Mbele</translation> <translation id="7457942297256758195">Futa Zote</translation> <translation id="822618367988303761">siku <ph name="NUMBER_TWO"/> zilizopita</translation> <translation id="4745438305783437565">dakika <ph name="NUMBER_FEW"/></translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">Nakili kwenye ubao wa kunakili</translation> <translation id="8371695176452482769">Ongea sasa</translation> +<translation id="1167268268675672572">Sogeza Hadi Mwanzo Wa Mstari Na Ubadilishe Uteuzi</translation> <translation id="6965382102122355670">Sawa</translation> <translation id="7850320739366109486">Usinisumbue</translation> <translation id="6978839998405419496">siku <ph name="NUMBER_ZERO"/> zilizopita</translation> diff --git a/ui/base/strings/ui_strings_ta.xtb b/ui/base/strings/ui_strings_ta.xtb index e21652002b..62b0f030cd 100644 --- a/ui/base/strings/ui_strings_ta.xtb +++ b/ui/base/strings/ui_strings_ta.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> பை</translation> <translation id="3660179305079774227">மேல்நோக்கிய அம்பு</translation> +<translation id="3969863827134279083">மேலே நகர்த்து</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> வினாடி உள்ளது</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> மெ.பை/வி</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> மணி நேரம்</translation> <translation id="3990502903496589789">வலது விளிம்பு</translation> <translation id="9038489124413477075">பெயரிடப்படாதக் கோப்புறை</translation> +<translation id="1940483897317142625">வரியின் இறுதிவரை நீக்கு</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> நிமிடங்கள்</translation> <translation id="3520476450377425184">இன்னும் <ph name="NUMBER_MANY"/> நாட்கள் உள்ளன</translation> <translation id="932327136139879170">முகப்பு</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&ஒட்டு</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> டெ.பை</translation> +<translation id="7139614227326422685">வார்த்தையின் வலதுபுறம் நகர்த்து</translation> <translation id="364720409959344976">பதிவேற்றுவதற்குக் கோப்புறையைத் தேர்ந்தெடு</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">அறிவிப்பை மூடு</translation> <translation id="6364916375976753737">இடப்புறம் உருட்டு</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation> +<translation id="4218160142017529598">பின்னோக்கி நீக்கு</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> நிமிடங்கள்</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation> <translation id="6945221475159498467">தேர்ந்தெடு</translation> <translation id="6620110761915583480">கோப்பைச் சேமி</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> வினாடிகள்</translation> +<translation id="8924469368910458384">வரியின் துவக்கம்வரை நீக்கு</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> நிமிடம் உள்ளது</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> நிமிடம்</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> நாட்கள்</translation> <translation id="7163503212501929773">இன்னும் <ph name="NUMBER_MANY"/> மணிநேரம் உள்ளது</translation> <translation id="5329858601952122676">&நீக்கு</translation> +<translation id="6556866813142980365">மீண்டும் செய்</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> நொடிகள்</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> கி.பை.</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> நிமிடங்கள்</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> நிமிடங்கள்</translation> <translation id="50960180632766478">இன்னும் <ph name="NUMBER_FEW"/> நிமிடங்கள் உள்ளன</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> வினாடிகள் உள்ளன</translation> +<translation id="6903282483217634857">வலதுபுறமாக நகர்த்து</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> மெ.பை</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> நிமிடங்கள்</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">பின்வருபவற்றிலிருந்து வரும் அறிவிப்புகளை அனுமதி:</translation> +<translation id="2479520428668657293">வலதுபுறமாக நகர்ந்து தேர்வை மாற்று</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> மணி நேரம்</translation> <translation id="1398853756734560583">பெரிதாக்கு</translation> <translation id="4250229828105606438">ஸ்கிரீன் ஷாட்</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> மணி நேரம்</translation> <translation id="5260878308685146029">இன்னும் <ph name="NUMBER_TWO"/> நிமிடங்கள் உள்ளன</translation> +<translation id="2557207087669398617">வரியின் துவக்கத்திற்கு நகர்த்து</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">அ&னைத்தையும் தேர்ந்தெடு</translation> <translation id="2168039046890040389">பக்கத்தின் மேலே</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> நாட்கள்</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> நிமிடங்கள்</translation> +<translation id="6122334925474904337">வார்த்தையின் வலதுபுறம் நகர்ந்து தேர்வை மாற்று</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> நிமிடம்</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">பார்க்க இங்கு எதுவுமில்லை, தொடரவும்.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">இங்கே உருட்டு</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">கீழே நகர்த்து</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> மணிநேரம்</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> கி.பை./வி</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">இன்னும் <ph name="NUMBER_ONE"/> மணிநேரம் உள்ளது</translation> <translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> இடமிருந்து வரும் அறிவிப்புகளை முடக்கு</translation> <translation id="2666092431469916601">மேலே</translation> +<translation id="2538759511191347839">வரியின் இறுதிக்கு நகர்ந்து தேர்வை மாற்று</translation> +<translation id="928465423150706909">வரியின் இறுதிக்கு நகர்த்து</translation> <translation id="8331626408530291785">மேலே உருட்டு</translation> <translation id="7907591526440419938">கோப்பைத் திற</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">ஊடகத்தை நிறுத்து</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">மீட்டமை</translation> +<translation id="5349525451964472598">இடதுபுறமாக நகர்ந்து தேர்வை மாற்று</translation> +<translation id="1781701194097416995">வார்த்தையின் இடதுபுறம் நகர்த்து</translation> <translation id="1243314992276662751">பதிவேற்று</translation> <translation id="50030952220075532">இன்னும் <ph name="NUMBER_ONE"/> நாட்கள் உள்ளன</translation> <translation id="8179976553408161302">உள்ளிடு</translation> +<translation id="8471049483003785219">வார்த்தையின் இடதுபுறம் நகர்ந்து தேர்வை மாற்று</translation> <translation id="945522503751344254">பின்னூட்டம் அனுப்புக</translation> <translation id="9170848237812810038">&செயல்தவிர்</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> ஜி.பை/வி</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> நாள்</translation> +<translation id="2704295676501803339">இடதுபுறமாக நகர்த்து</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> வினாடிகள் உள்ளன</translation> <translation id="4570886800634958009">அறிவிப்பை விரிவாக்கு</translation> +<translation id="566737009157135450">வார்த்தையைப் பின்னோக்கி நீக்கு</translation> <translation id="436869212180315161">அழுத்து</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> டெ.பை/வி</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> பை/வி</translation> <translation id="7649070708921625228">உதவி</translation> +<translation id="2405367043325750948">முன்புறமாக நீக்கு</translation> <translation id="6699343763173986273">ஊடகத்தின் அடுத்த டிராக்</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> வினாடிகள் உள்ளன</translation> <translation id="8226233771743600312">ஒரு நாள் தொந்தரவு செய்ய வேண்டாம்</translation> +<translation id="4252565523989510616">வார்த்தையை முன்புறமாக நீக்கு</translation> <translation id="7457942297256758195">அனைத்தையும் அழி</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> நிமிடங்கள்</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> பெ.பை/வி</translation> <translation id="2743387203779672305">கிளிப்போர்டுக்கு நகலெடு</translation> <translation id="8371695176452482769">இப்போது பேசுக</translation> +<translation id="1167268268675672572">வரியின் துவக்கத்திற்கு நகர்ந்து தேர்வை மாற்று</translation> <translation id="6965382102122355670">சரி</translation> <translation id="7850320739366109486">தொந்தரவு செய்ய வேண்டாம்</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_te.xtb b/ui/base/strings/ui_strings_te.xtb index 30e4587f6b..1717834eb4 100644 --- a/ui/base/strings/ui_strings_te.xtb +++ b/ui/base/strings/ui_strings_te.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">ఎగువ బాణం</translation> +<translation id="3969863827134279083">పైకి తరలించండి</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> సెకను మిగిలి ఉంది</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> గంటలు</translation> <translation id="3990502903496589789">కుడి సరిహద్దు</translation> <translation id="9038489124413477075">పేరులేని ఫోల్డర్</translation> +<translation id="1940483897317142625">పంక్తి చివరికి తొలగించండి</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> నిమిషాలు</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> రోజులు మిగిలి ఉన్నాయి</translation> <translation id="932327136139879170">హోమ్</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&అతికించు</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">పదం కుడివైపుకి తరలించండి</translation> <translation id="364720409959344976">అప్లోడ్ చేయడానికి ఫోల్డర్ని ఎంచుకోండి</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">నోటిఫికేషన్ను మూసివేయి</translation> <translation id="6364916375976753737">ఎడమకి స్క్రోల్ చేయి</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation> +<translation id="4218160142017529598">వెనుకకు తొలగించండి</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> నిమిషాలు</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation> <translation id="6945221475159498467">ఎంచుకోండి</translation> <translation id="6620110761915583480">ఫైల్ను సేవ్ చేయి</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> సెకన్లు</translation> +<translation id="8924469368910458384">పంక్తి మొదటికి తొలగించండి</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> నిమిషం మిగిలి ఉంది</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> నిమిషం</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> రోజులు</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> గంటలు మిగిలి ఉన్నాయి</translation> <translation id="5329858601952122676">&తొలగించు</translation> +<translation id="6556866813142980365">చర్య పునరావృతం</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> సెకన్లు</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> నిమిషాలు</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> నిమిషాలు</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> నిమిషాలు మిగిలిలాయి</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> సెకన్ల సమయం మిగిలి ఉంది</translation> +<translation id="6903282483217634857">కుడివైపు తరలించండి</translation> <translation id="6659594942844771486">టాబ్</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> నిమిషాలు</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">వీటి నుండి నోటిఫికేషన్లను అనుమతించు:</translation> +<translation id="2479520428668657293">కుడివైపు తరలించి, ఎంపికను సవరించండి</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> గంటలు</translation> <translation id="1398853756734560583">గరిష్ఠీకరించు</translation> <translation id="4250229828105606438">స్క్రీన్షాట్</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> గంటలు</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> నిమిషాలు మిగిలాయి</translation> +<translation id="2557207087669398617">పంక్తి మొదటికి తరలించండి</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">&అన్నీ ఎంచుకోండి</translation> <translation id="2168039046890040389">పేజీ పైకి</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> రోజులు</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> నిమిషాలు</translation> +<translation id="6122334925474904337">పదం కుడివైపుకి తరలించి, ఎంపికను సవరించండి</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> నిమిషం</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">ఇక్కడ చూడటానికి ఏమీ లేదు, కొనసాగండి.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">ఇక్కడ స్క్రోల్ చెయ్యండి</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">క్రిందికి తరలించండి</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> గంటలు</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/సె</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> గంటలు మిగిలా యి</translation> <translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> నుండి వచ్చే నోటిఫికేషన్లను నిలిపివేయి</translation> <translation id="2666092431469916601">పైన</translation> +<translation id="2538759511191347839">పంక్తి చివరికి తరలించి, ఎంపికను సవరించండి</translation> +<translation id="928465423150706909">పంక్తి చివరికి తరలించండి</translation> <translation id="8331626408530291785">పైకి స్క్రోల్ చెయ్యి</translation> <translation id="7907591526440419938">ఫైల్ను తెరువు</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">మీడియా ఆపివేయి</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">పునరుద్ధరించు</translation> +<translation id="5349525451964472598">ఎడమవైపు తరలించి, ఎంపికను సవరించండి</translation> +<translation id="1781701194097416995">పదం ఎడమవైపుకి తరలించండి</translation> <translation id="1243314992276662751">అప్లోడ్ చేయి</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> రోజులు మిగిలి ఉన్నాయి</translation> <translation id="8179976553408161302">నమోదు చేయండి</translation> +<translation id="8471049483003785219">పదం ఎడమవైపుకు తరలించి, ఎంపికను సవరించండి</translation> <translation id="945522503751344254">అభిప్రాయాన్ని పంపండి</translation> <translation id="9170848237812810038">&అన్డు</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> రోజు</translation> +<translation id="2704295676501803339">ఎడమవైపుకు తరలించండి</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> సెకన్లు మిగిలి ఉన్నాయి</translation> <translation id="4570886800634958009">నోటిఫికేషన్ను విస్తరించు</translation> +<translation id="566737009157135450">పదం నుండి వెనుకవైపుకు తొలగించండి</translation> <translation id="436869212180315161">నొక్కు</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">సహాయం</translation> +<translation id="2405367043325750948">ముందుకు తొలగించండి</translation> <translation id="6699343763173986273">మీడియా తదుపరి ట్రాక్</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> సెకన్ల సమయం మిగిలి ఉంది</translation> <translation id="8226233771743600312">ఒక రోజుపాటు అంతరాయం కలిగించవద్దు</translation> +<translation id="4252565523989510616">పదం నుండి ముందువైపుకు తొలగించండి</translation> <translation id="7457942297256758195">అన్నీ క్లియర్ చేయి</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> నిమిషాలు</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">క్లిప్బోర్డ్కు కాపీ చేయి</translation> <translation id="8371695176452482769">ఇప్పుడు మాట్లాడండి</translation> +<translation id="1167268268675672572">పంక్తి మొదటికి తరలించి, ఎంపికను సవరించండి</translation> <translation id="6965382102122355670">సరే</translation> <translation id="7850320739366109486">అంతరాయం కలిగించవద్దు</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_th.xtb b/ui/base/strings/ui_strings_th.xtb index a3fb41976b..65bad62d88 100644 --- a/ui/base/strings/ui_strings_th.xtb +++ b/ui/base/strings/ui_strings_th.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">ลูกศรขึ้น</translation> +<translation id="3969863827134279083">เลื่อนขึ้น</translation> <translation id="7062130397825382308">เหลือ <ph name="NUMBER_ONE"/> วินาที</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/วินาที</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ชั่วโมง</translation> <translation id="3990502903496589789">ขอบขวา</translation> <translation id="9038489124413477075">โฟลเดอร์ที่ไม่มีชื่อ</translation> +<translation id="1940483897317142625">ลบจนถึงท้ายบรรทัด</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> นาที</translation> <translation id="3520476450377425184">เหลือ <ph name="NUMBER_MANY"/> วัน</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> วันที่ผ่านมา</translation> <translation id="5076340679995252485">&วาง</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">ย้ายคำมาทางขวา</translation> <translation id="364720409959344976">เลือกโฟลเดอร์เพื่ออัปโหลด</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> นาทีที่ผ่านมา</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">ปิดการแจ้งเตือน</translation> <translation id="6364916375976753737">เลื่อนทางซ้าย</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ชั่วโมงที่ผ่านมา</translation> +<translation id="4218160142017529598">ลบย้อนหลัง</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> นาที</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> นาทีที่ผ่านมา</translation> <translation id="6945221475159498467">เลือก</translation> <translation id="6620110761915583480">บันทึกไฟล์</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation> +<translation id="8924469368910458384">ลบจนถึงจุดเริ่มต้นบรรทัด</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">เหลือ <ph name="NUMBER_ONE"/> นาที</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> นาที</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> วัน</translation> <translation id="7163503212501929773">เหลือ <ph name="NUMBER_MANY"/> ชั่วโมง</translation> <translation id="5329858601952122676">&ลบ</translation> +<translation id="6556866813142980365">ทำซ้ำ</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> วินาที</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478">เหลือ <ph name="NUMBER_FEW"/> นาที</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">ย้ายไปทางขวา</translation> <translation id="6659594942844771486">แท็บ</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> วันที่ผ่านมา</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> นาที</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">อนุญาตให้มีการแจ้งเตือนจากรายการต่อไปนี้</translation> +<translation id="2479520428668657293">ย้ายไปทางขวาและปรับการเลือก</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ชั่วโมง</translation> <translation id="1398853756734560583">ย่อ</translation> <translation id="4250229828105606438">ภาพหน้าจอ</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ชั่วโมง</translation> <translation id="5260878308685146029">เหลือ <ph name="NUMBER_TWO"/> นาที</translation> +<translation id="2557207087669398617">ย้ายไปจุดเริ่มต้นบรรทัด</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">เลือก&ทั้งหมด</translation> <translation id="2168039046890040389">เลื่อนหน้าขึ้น</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> วัน</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> นาที</translation> +<translation id="6122334925474904337">ย้ายคำไปทางขวาและปรับการเลือก</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> นาที</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> วินาทีที่ผ่านมา</translation> <translation id="4927753642311223124">ที่นี่ไม่มีอะไรต้องดู ไปต่อได้</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">เลื่อนมาที่นี่</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">เลื่อนลง</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ชั่วโมง</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/วินาที</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">เหลือ <ph name="NUMBER_ONE"/> ชั่วโมง</translation> <translation id="1413622004203049571">ปิดการแจ้งเตือนจาก <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">ด้านบน</translation> +<translation id="2538759511191347839">ย้ายไปท้ายบรรทัดและปรับการเลือก</translation> +<translation id="928465423150706909">ย้ายไปท้ายบรรทัด</translation> <translation id="8331626408530291785">เลื่อนขึ้น</translation> <translation id="7907591526440419938">เปิดไฟล์</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">หยุดสื่อ</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">คืนค่า</translation> +<translation id="5349525451964472598">ย้ายไปทางซ้ายและปรับการเลือก</translation> +<translation id="1781701194097416995">ย้ายคำไปทางซ้าย</translation> <translation id="1243314992276662751">อัปโหลด</translation> <translation id="50030952220075532">เหลือ <ph name="NUMBER_ONE"/> วัน</translation> <translation id="8179976553408161302">เข้าใช้</translation> +<translation id="8471049483003785219">ย้ายคำไปทางซ้ายและปรับการเลือก</translation> <translation id="945522503751344254">ส่งความคิดเห็น</translation> <translation id="9170848237812810038">เ&ลิกทำ</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> ชั่วโมงที่ผ่านมา</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/วินาที</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> วัน</translation> +<translation id="2704295676501803339">ย้ายไปทางซ้าย</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> วินาทีที่ผ่านมา</translation> <translation id="494645311413743213">เหลือ <ph name="NUMBER_TWO"/> วินาที</translation> <translation id="4570886800634958009">ขยายการแจ้งเตือน</translation> +<translation id="566737009157135450">ลบคำย้อนหลัง</translation> <translation id="436869212180315161">กด</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> วินาทีที่ผ่านมา</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/วินาที</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> นาทีที่ผ่านมา</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/วินาที</translation> <translation id="7649070708921625228">ช่วยเหลือ</translation> +<translation id="2405367043325750948">ลบไปข้างหน้า</translation> <translation id="6699343763173986273">แทร็กถัดไปของสื่อ</translation> <translation id="5445120697129764393">เหลือ <ph name="NUMBER_DEFAULT"/> วินาที</translation> <translation id="8226233771743600312">ห้ามรบกวนเป็นเวลาหนึ่งวัน</translation> +<translation id="4252565523989510616">ลบคำไปข้างหน้า</translation> <translation id="7457942297256758195">ล้างทั้งหมด</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> วันที่ผ่านมา</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> นาที</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/วินาที</translation> <translation id="2743387203779672305">คัดลอกไว้ที่คลิปบอร์ด</translation> <translation id="8371695176452482769">เชิญพูดเลย</translation> +<translation id="1167268268675672572">ย้ายไปจุดเริ่มต้นของบรรทัดและปรับการเลือก</translation> <translation id="6965382102122355670">ตกลง</translation> <translation id="7850320739366109486">ห้ามรบกวน</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_tr.xtb b/ui/base/strings/ui_strings_tr.xtb index 7b668557b0..eb884a88e9 100644 --- a/ui/base/strings/ui_strings_tr.xtb +++ b/ui/base/strings/ui_strings_tr.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Yukarı Ok</translation> +<translation id="3969863827134279083">Yukarı Git</translation> <translation id="7062130397825382308"><ph name="NUMBER_ONE"/> second left</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/sn</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> saat</translation> <translation id="3990502903496589789">Sağ Kenar</translation> <translation id="9038489124413477075">Adsız Klasör</translation> +<translation id="1940483897317142625">Satırın Sonuna Kadar Sil</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> dakika</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> gün kaldı</translation> <translation id="932327136139879170">Ana Sayfa</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> gün önce</translation> <translation id="5076340679995252485">&Yapıştır</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Bir Kelime Sağa Git</translation> <translation id="364720409959344976">Yüklenecek Klasörü Seçin</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> dakika önce</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Bildirimi kapat</translation> <translation id="6364916375976753737">Sola Kaydır</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> saat önce</translation> +<translation id="4218160142017529598">Geriye Doğru Sil</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> dakika</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> dakika önce</translation> <translation id="6945221475159498467">Seç</translation> <translation id="6620110761915583480">Dosyayı Kaydet</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation> +<translation id="8924469368910458384">Satırın Başına Kadar Sil</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868"><ph name="NUMBER_ONE"/> dakika kaldı</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> dakika</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> gün</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> saat kaldı</translation> <translation id="5329858601952122676">&Sil</translation> +<translation id="6556866813142980365">Yeniden Yap</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> saniye</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> dakika kaldı</translation> <translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation> +<translation id="6903282483217634857">Sağa Git</translation> <translation id="6659594942844771486">Sekme</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> gün önce</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> dakika</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Şunlardan gelen bildirimlere izin ver:</translation> +<translation id="2479520428668657293">Sağa Git ve Seçimi Değiştir</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> saat</translation> <translation id="1398853756734560583">Büyüt</translation> <translation id="4250229828105606438">Ekran görüntüsü</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> saat</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> dakika kaldı</translation> +<translation id="2557207087669398617">Satırın Başına Git</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Tümünü &seç</translation> <translation id="2168039046890040389">Page Up</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> gün</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> dakika</translation> +<translation id="6122334925474904337">Bir Kelime Sağa Git ve Seçimi Değiştir</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minute</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> saniye önce</translation> <translation id="4927753642311223124">Burada görülecek bir şey yok, devam edin.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Buraya Kaydır</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Aşağı Git</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> saat</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/sn</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> saat kaldı</translation> <translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> bildirimlerini devre dışı bırak</translation> <translation id="2666092431469916601">Üst</translation> +<translation id="2538759511191347839">Satırın Sonuna Git ve Seçimi Değiştir</translation> +<translation id="928465423150706909">Satırın Sonuna Git</translation> <translation id="8331626408530291785">Yukarı Kaydır</translation> <translation id="7907591526440419938">Dosya Aç</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Medyayı Durdur</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Geri yükle</translation> +<translation id="5349525451964472598">Sola Git ve Seçimi Değiştir</translation> +<translation id="1781701194097416995">Bir Kelime Sola Git</translation> <translation id="1243314992276662751">Yükle</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> gün kaldı</translation> <translation id="8179976553408161302">Giriş</translation> +<translation id="8471049483003785219">Bir Kelime Sola Git ve Seçimi Değiştir</translation> <translation id="945522503751344254">Geri bildirim gönder</translation> <translation id="9170848237812810038">&Geri al</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> saat önce</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/sn</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> gün</translation> +<translation id="2704295676501803339">Sola Git</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> saniye önce</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> saniye kaldı</translation> <translation id="4570886800634958009">Bildirimi genişlet</translation> +<translation id="566737009157135450">Geriye Doğru Bir Kelime Sil</translation> <translation id="436869212180315161">Basın</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> saniye önce</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/sn</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> dakika önce</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/sn</translation> <translation id="7649070708921625228">Yardım</translation> +<translation id="2405367043325750948">İleriye Doğru Sil</translation> <translation id="6699343763173986273">Medya Sonraki Parça</translation> <translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> saniye kaldı</translation> <translation id="8226233771743600312">Bir gün süreyle rahatsız etmeyin</translation> +<translation id="4252565523989510616">İleriye Doğru Bir Kelime Sil</translation> <translation id="7457942297256758195">Tümünü Temizle</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> gün önce</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> dakika</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/sn</translation> <translation id="2743387203779672305">Panoya kopyala</translation> <translation id="8371695176452482769">Şimdi konuşun</translation> +<translation id="1167268268675672572">Satırın Başına Git ve Seçimi Değiştir</translation> <translation id="6965382102122355670">Tamam</translation> <translation id="7850320739366109486">Rahatsız Etmeyin</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_uk.xtb b/ui/base/strings/ui_strings_uk.xtb index fbe079fc02..beede81381 100644 --- a/ui/base/strings/ui_strings_uk.xtb +++ b/ui/base/strings/ui_strings_uk.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> б</translation> <translation id="3660179305079774227">Курсор угору</translation> +<translation id="3969863827134279083">Перемістити курсор угору</translation> <translation id="7062130397825382308">Залишилася <ph name="NUMBER_ONE"/> секунда</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> Мб/сек.</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> годин</translation> <translation id="3990502903496589789">Правий край</translation> <translation id="9038489124413477075">Папка без назви</translation> +<translation id="1940483897317142625">Видалити символи до кінця рядка</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> хв.</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation> <translation id="932327136139879170">Home</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> дн. тому</translation> <translation id="5076340679995252485">&Вставити</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> Тб</translation> +<translation id="7139614227326422685">Перемістити курсор на одне слово праворуч</translation> <translation id="364720409959344976">Виберіть папку для завантаження</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Закрити сповіщення</translation> <translation id="6364916375976753737">Прокрутка вліво</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> год. тому</translation> +<translation id="4218160142017529598">Видалити символи перед курсором</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> хв</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> хв. тому</translation> <translation id="6945221475159498467">Вибрати</translation> <translation id="6620110761915583480">Зберегти файл</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation> +<translation id="8924469368910458384">Видалити символи до початку рядка</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Залишилася <ph name="NUMBER_ONE"/> хвилина</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> хв.</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> days</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hours left</translation> <translation id="5329858601952122676">&Видалити</translation> +<translation id="6556866813142980365">Повторити</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> Кб</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> хв. залишилось</translation> <translation id="5517291721709019259">Залишилося <ph name="NUMBER_FEW"/> секунди</translation> +<translation id="6903282483217634857">Перемістити курсор праворуч</translation> <translation id="6659594942844771486">Вкладка</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> Мб</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> дн. тому</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> mins</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Дозволити сповіщення з перелічених нижче джерел.</translation> +<translation id="2479520428668657293">Перемістити курсор праворуч і змінити виділений фрагмент</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> годин</translation> <translation id="1398853756734560583">Збільшити</translation> <translation id="4250229828105606438">Знімок екрана</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hours</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> mins left</translation> +<translation id="2557207087669398617">Перемістити курсор на початок рядка</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> Гб</translation> <translation id="1901303067676059328">Вибрати &всі</translation> <translation id="2168039046890040389">Сторінка вгору</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> днів</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation> +<translation id="6122334925474904337">Перемістити курсор на одне слово праворуч і змінити виділений фрагмент</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> хвилина</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Сповіщень немає.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Прокрутка до цього місця</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">Перемістити курсор униз</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> годин</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> Кб/сек.</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> година залишилась</translation> <translation id="1413622004203049571">Вимкнути сповіщення від <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Верх</translation> +<translation id="2538759511191347839">Перемістити курсор у кінець рядка та змінити виділений фрагмент</translation> +<translation id="928465423150706909">Перемістити курсор у кінець рядка</translation> <translation id="8331626408530291785">Прокрутка вгору</translation> <translation id="7907591526440419938">Відкрити файл</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Зупинити</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Відновити</translation> +<translation id="5349525451964472598">Перемістити курсор ліворуч і змінити виділений фрагмент</translation> +<translation id="1781701194097416995">Перемістити курсор на одне слово ліворуч</translation> <translation id="1243314992276662751">Завантажити</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> день залишився</translation> <translation id="8179976553408161302">Увійти</translation> +<translation id="8471049483003785219">Перемістити курсор на одне слово ліворуч і змінити виділений фрагмент</translation> <translation id="945522503751344254">Надіслати відгук</translation> <translation id="9170848237812810038">&Скасувати</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> год. тому</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> Гб/сек.</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> день</translation> +<translation id="2704295676501803339">Перемістити курсор ліворуч</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> сек. тому</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation> <translation id="4570886800634958009">Розгорнути сповіщення</translation> +<translation id="566737009157135450">Видалити слово перед курсором</translation> <translation id="436869212180315161">Натиснути</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> сек. тому</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> Тб/сек.</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> б/сек.</translation> <translation id="7649070708921625228">Довідка</translation> +<translation id="2405367043325750948">Видалити символи після курсора</translation> <translation id="6699343763173986273">Наступна композиція</translation> <translation id="5445120697129764393">Залишилося <ph name="NUMBER_DEFAULT"/> секунд</translation> <translation id="8226233771743600312">Не турбувати впродовж одного дня</translation> +<translation id="4252565523989510616">Видалити слово після курсора</translation> <translation id="7457942297256758195">Очистити все</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> хв.</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> Пб/сек.</translation> <translation id="2743387203779672305">Копіювати в буфер</translation> <translation id="8371695176452482769">Диктуйте</translation> +<translation id="1167268268675672572">Перемістити курсор на початок рядка та змінити виділений фрагмент</translation> <translation id="6965382102122355670">ОК</translation> <translation id="7850320739366109486">Не турбувати</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_vi.xtb b/ui/base/strings/ui_strings_vi.xtb index 37c4af42c8..18071afaab 100644 --- a/ui/base/strings/ui_strings_vi.xtb +++ b/ui/base/strings/ui_strings_vi.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">Phím mũi tên Lên</translation> +<translation id="3969863827134279083">Di chuyển lên</translation> <translation id="7062130397825382308">Còn <ph name="NUMBER_ONE"/> giây</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/giây</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> giờ</translation> <translation id="3990502903496589789">Cạnh bên Phải</translation> <translation id="9038489124413477075">Thư mục không có tên</translation> +<translation id="1940483897317142625">Xóa đến cuối dòng</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> phút</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> ngày còn lại</translation> <translation id="932327136139879170">Trang chủ</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation> <translation id="5076340679995252485">&Dán</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">Di chuyển sang bên phải từ</translation> <translation id="364720409959344976">Chọn thư mục để tải lên</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">Đóng thông báo</translation> <translation id="6364916375976753737">Cuộn qua Trái</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation> +<translation id="4218160142017529598">Xóa lùi</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> phút</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> phút trước</translation> <translation id="6945221475159498467">Chọn</translation> <translation id="6620110761915583480">Lưu Tệp</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> giây</translation> +<translation id="8924469368910458384">Xóa đến đầu dòng</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">Còn lại <ph name="NUMBER_ONE"/> phút</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> phút</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ngày</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> giờ còn lại</translation> <translation id="5329858601952122676">&Xoá</translation> +<translation id="6556866813142980365">Làm lại</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> giây</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> phút</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> phút</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> phút còn lại</translation> <translation id="5517291721709019259">Còn <ph name="NUMBER_FEW"/> giây</translation> +<translation id="6903282483217634857">Di chuyển sang phải</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> ngày trước</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> phút</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">Cho phép thông báo từ:</translation> +<translation id="2479520428668657293">Di chuyển sang phải và sửa đổi lựa chọn</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> giờ</translation> <translation id="1398853756734560583">Phóng to</translation> <translation id="4250229828105606438">Ảnh chụp màn hình</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> giờ</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> phút còn lại</translation> +<translation id="2557207087669398617">Di chuyển tới đầu dòng</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">Chọn &tất cả</translation> <translation id="2168039046890040389">Page Up</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ngày</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> phút</translation> +<translation id="6122334925474904337">Di chuyển sang bên phải từ và sửa đổi lựa chọn</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> phút</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation> <translation id="4927753642311223124">Không có nội dung nào để xem ở đây, hãy tiếp tục.</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">Cuộn tới Đây</translation> <translation id="4552416320897244156">Trang Dưới</translation> +<translation id="3066573403916685335">Di chuyển xuống</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> giờ</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> giờ còn lại</translation> <translation id="1413622004203049571">Tắt thông báo từ <ph name="NOTIFIER_NAME"/></translation> <translation id="2666092431469916601">Hàng đầu</translation> +<translation id="2538759511191347839">Di chuyển đến cuối dòng và sửa đổi lựa chọn</translation> +<translation id="928465423150706909">Di chuyển đến cuối dòng</translation> <translation id="8331626408530291785">Cuộn Lên</translation> <translation id="7907591526440419938">Mở Tệp</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">Dừng trình phát phương tiện</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">Khôi phục</translation> +<translation id="5349525451964472598">Di chuyển sang trái và sửa đổi lựa chọn</translation> +<translation id="1781701194097416995">Di chuyển sang bên trái từ</translation> <translation id="1243314992276662751">Tải lên</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> ngày còn lại</translation> <translation id="8179976553408161302">Vào</translation> +<translation id="8471049483003785219">Di chuyển sang bên trái từ và sửa đổi lựa chọn</translation> <translation id="945522503751344254">Gửi phản hồi</translation> <translation id="9170848237812810038">H&oàn tác</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/giây</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ngày</translation> +<translation id="2704295676501803339">Di chuyển sang trái</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> giây trước</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> giây còn lại</translation> <translation id="4570886800634958009">Mở rộng thông báo</translation> +<translation id="566737009157135450">Xóa lùi từ</translation> <translation id="436869212180315161">Nhấp vào</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/giây</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/giây</translation> <translation id="7649070708921625228">Trợ giúp</translation> +<translation id="2405367043325750948">Xóa tiến</translation> <translation id="6699343763173986273">Bản nhạc tiếp theo của trình phát phương tiện</translation> <translation id="5445120697129764393">Còn <ph name="NUMBER_DEFAULT"/> giây</translation> <translation id="8226233771743600312">Không làm phiền trong một ngày</translation> +<translation id="4252565523989510616">Xóa tiến từ</translation> <translation id="7457942297256758195">Xóa tất cả</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> phút</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/giây</translation> <translation id="2743387203779672305">Sao chép vào khay nhớ tạm</translation> <translation id="8371695176452482769">Nói ngay bây giờ</translation> +<translation id="1167268268675672572">Di chuyển tới đầu dòng và sửa đổi lựa chọn</translation> <translation id="6965382102122355670">OK</translation> <translation id="7850320739366109486">Không làm phiền</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_zh-CN.xtb b/ui/base/strings/ui_strings_zh-CN.xtb index 88ba74d4e8..0020688e5c 100644 --- a/ui/base/strings/ui_strings_zh-CN.xtb +++ b/ui/base/strings/ui_strings_zh-CN.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">向上箭头</translation> +<translation id="3969863827134279083">上移</translation> <translation id="7062130397825382308">还剩<ph name="NUMBER_ONE"/>秒</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> 小时</translation> <translation id="3990502903496589789">右边缘</translation> <translation id="9038489124413477075">未命名的文件夹</translation> +<translation id="1940483897317142625">删除至行末</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> 分钟</translation> <translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation> <translation id="932327136139879170">主页</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> 天前</translation> <translation id="5076340679995252485">粘贴(&P)</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">向右移一个字</translation> <translation id="364720409959344976">选择要上传的文件夹</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> 分钟前</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">关闭通知</translation> <translation id="6364916375976753737">向左滚动</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> 小时前</translation> +<translation id="4218160142017529598">向前删除</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> 分钟</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> 分钟前</translation> <translation id="6945221475159498467">选择</translation> <translation id="6620110761915583480">保存文件</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> 秒</translation> +<translation id="8924469368910458384">删除至行首</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">还剩 <ph name="NUMBER_ONE"/> 分钟</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> days</translation> <translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hours left</translation> <translation id="5329858601952122676">删除(&D)</translation> +<translation id="6556866813142980365">重做</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> 分钟</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> 分钟</translation> <translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation> <translation id="5517291721709019259">还剩<ph name="NUMBER_FEW"/>秒</translation> +<translation id="6903282483217634857">右移</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> 天前</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> mins</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">允许以下来源的通知:</translation> +<translation id="2479520428668657293">右移并更改选择范围</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> hours</translation> <translation id="1398853756734560583">最大化</translation> <translation id="4250229828105606438">屏幕截图</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hours</translation> <translation id="5260878308685146029"><ph name="NUMBER_TWO"/> mins left</translation> +<translation id="2557207087669398617">移至行首</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">全选(&A)</translation> <translation id="2168039046890040389">向上翻页</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> 天</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation> +<translation id="6122334925474904337">向右移一个字并更改选择范围</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> 分钟</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> 秒前</translation> <translation id="4927753642311223124">这里没有任何通知,往前走吧。</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">滚动到此处</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">下移</translation> <translation id="7052633198403197513">F1</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hours</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hour left</translation> <translation id="1413622004203049571">停用来自“<ph name="NOTIFIER_NAME"/>”的通知</translation> <translation id="2666092431469916601">顶部</translation> +<translation id="2538759511191347839">移至行末并更改选择范围</translation> +<translation id="928465423150706909">移至行末</translation> <translation id="8331626408530291785">向上滚动</translation> <translation id="7907591526440419938">打开文件</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">媒体停止</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">恢复</translation> +<translation id="5349525451964472598">左移并更改选择范围</translation> +<translation id="1781701194097416995">向左移一个字</translation> <translation id="1243314992276662751">上传</translation> <translation id="50030952220075532"><ph name="NUMBER_ONE"/> day left</translation> <translation id="8179976553408161302">进入</translation> +<translation id="8471049483003785219">向左移一个字并更改选择范围</translation> <translation id="945522503751344254">发送反馈</translation> <translation id="9170848237812810038">撤消(&U)</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> 小时前</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> day</translation> +<translation id="2704295676501803339">左移</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> 秒前</translation> <translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation> <translation id="4570886800634958009">展开通知</translation> +<translation id="566737009157135450">向前删除一个字</translation> <translation id="436869212180315161">按</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> 秒前</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> 分钟前</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation> <translation id="7649070708921625228">帮助</translation> +<translation id="2405367043325750948">向后删除</translation> <translation id="6699343763173986273">媒体下一曲</translation> <translation id="5445120697129764393">还剩<ph name="NUMBER_DEFAULT"/>秒</translation> <translation id="8226233771743600312">1 天内请勿打扰</translation> +<translation id="4252565523989510616">向后删除一个字</translation> <translation id="7457942297256758195">全部清除</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> 天前</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation> <translation id="2743387203779672305">复制到剪贴板</translation> <translation id="8371695176452482769">请开始说话</translation> +<translation id="1167268268675672572">移至行首并更改选择范围</translation> <translation id="6965382102122355670">确定</translation> <translation id="7850320739366109486">请勿打扰</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/strings/ui_strings_zh-TW.xtb b/ui/base/strings/ui_strings_zh-TW.xtb index 30ca641e2f..2686aa8344 100644 --- a/ui/base/strings/ui_strings_zh-TW.xtb +++ b/ui/base/strings/ui_strings_zh-TW.xtb @@ -24,11 +24,13 @@ <translation id="7222373446505536781">F11</translation> <translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation> <translation id="3660179305079774227">向上鍵</translation> +<translation id="3969863827134279083">上移</translation> <translation id="7062130397825382308">剩下 <ph name="NUMBER_ONE"/> 秒</translation> <translation id="1809410197924942083"><ph name="QUANTITY"/> MB/秒</translation> <translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> 小時</translation> <translation id="3990502903496589789">右邊緣</translation> <translation id="9038489124413477075">未命名的資料夾</translation> +<translation id="1940483897317142625">刪除到行尾</translation> <translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> 分鐘</translation> <translation id="3520476450377425184">剩下 <ph name="NUMBER_MANY"/> 天</translation> <translation id="932327136139879170">首頁</translation> @@ -41,6 +43,7 @@ <translation id="3353284378027041011"><ph name="NUMBER_FEW"/> 天前</translation> <translation id="5076340679995252485">貼上(&P)</translation> <translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation> +<translation id="7139614227326422685">右移到文字分行</translation> <translation id="364720409959344976">選取要上傳的資料夾</translation> <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation> <translation id="7770995925463083016"><ph name="NUMBER_TWO"/> 分鐘前</translation> @@ -51,11 +54,13 @@ <translation id="1860796786778352021">通知關閉</translation> <translation id="6364916375976753737">向左捲動</translation> <translation id="2629089419211541119"><ph name="NUMBER_ONE"/> 小時前</translation> +<translation id="4218160142017529598">向後刪除</translation> <translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> 分鐘</translation> <translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> 分鐘前</translation> <translation id="6945221475159498467">選取</translation> <translation id="6620110761915583480">儲存檔案</translation> <translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> 秒</translation> +<translation id="8924469368910458384">刪除到行首</translation> <translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation> <translation id="7836361698254323868">剩下 <ph name="NUMBER_ONE"/> 分鐘</translation> <translation id="2953767478223974804"><ph name="NUMBER_ONE"/> 分鐘</translation> @@ -63,6 +68,7 @@ <translation id="1572103024875503863"><ph name="NUMBER_MANY"/> 天</translation> <translation id="7163503212501929773">剩下 <ph name="NUMBER_MANY"/> 小時</translation> <translation id="5329858601952122676">刪除(&D)</translation> +<translation id="6556866813142980365">重做</translation> <translation id="8088823334188264070"><ph name="NUMBER_MANY"/> 秒</translation> <translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation> <translation id="7712011264267466734"><ph name="NUMBER_MANY"/> 分鐘</translation> @@ -71,6 +77,7 @@ <translation id="3424538384153559412"><ph name="NUMBER_TWO"/> 分鐘</translation> <translation id="50960180632766478">剩下 <ph name="NUMBER_FEW"/> 分鐘</translation> <translation id="5517291721709019259">剩下 <ph name="NUMBER_FEW"/> 秒</translation> +<translation id="6903282483217634857">右移</translation> <translation id="6659594942844771486">Tab</translation> <translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation> <translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> 天前</translation> @@ -89,17 +96,20 @@ <translation id="290555789621781773"><ph name="NUMBER_TWO"/> 分鐘</translation> <translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation> <translation id="7135556860107312402">允許接收下列來源發出的通知:</translation> +<translation id="2479520428668657293">右移並修改選取範圍</translation> <translation id="8112886015144590373"><ph name="NUMBER_FEW"/> 小時</translation> <translation id="1398853756734560583">放到最大</translation> <translation id="4250229828105606438">螢幕擷取畫面</translation> <translation id="6690744523875189208"><ph name="NUMBER_TWO"/> 小時</translation> <translation id="5260878308685146029">剩下 <ph name="NUMBER_TWO"/> 分鐘</translation> +<translation id="2557207087669398617">移到行首</translation> <translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation> <translation id="1901303067676059328">選取全部(&A)</translation> <translation id="2168039046890040389">向上翻頁</translation> <translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation> <translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> 天</translation> <translation id="6463061331681402734"><ph name="NUMBER_MANY"/> 分鐘</translation> +<translation id="6122334925474904337">右移到文字分行並修改選取範圍</translation> <translation id="7634624804467787019"><ph name="NUMBER_ONE"/> 分鐘</translation> <translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> 秒前</translation> <translation id="4927753642311223124">這裡沒有任何通知訊息,以後再來看看吧!</translation> @@ -107,6 +117,7 @@ <translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation> <translation id="3183922693828471536">捲動至此</translation> <translation id="4552416320897244156">PgDwn</translation> +<translation id="3066573403916685335">下移</translation> <translation id="7052633198403197513">F1 鍵</translation> <translation id="2052389551707911401"><ph name="NUMBER_MANY"/> 小時</translation> <translation id="8677655579646609597"><ph name="QUANTITY"/> KB/秒</translation> @@ -123,6 +134,8 @@ <translation id="7414887922320653780">剩下 <ph name="NUMBER_ONE"/> 小時</translation> <translation id="1413622004203049571">停用「<ph name="NOTIFIER_NAME"/>」的通知</translation> <translation id="2666092431469916601">置頂</translation> +<translation id="2538759511191347839">移到行尾並修改選取範圍</translation> +<translation id="928465423150706909">移到行尾</translation> <translation id="8331626408530291785">向上捲動</translation> <translation id="7907591526440419938">開啟檔案</translation> <translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation> @@ -132,9 +145,12 @@ <translation id="6808150112686056157">停止媒體播放</translation> <translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation> <translation id="3157931365184549694">還原</translation> +<translation id="5349525451964472598">左移並修改選取範圍</translation> +<translation id="1781701194097416995">左移到文字分行</translation> <translation id="1243314992276662751">上傳</translation> <translation id="50030952220075532">剩下 <ph name="NUMBER_ONE"/> 天</translation> <translation id="8179976553408161302">進入</translation> +<translation id="8471049483003785219">左移到文字分行並修改選取範圍</translation> <translation id="945522503751344254">提供意見</translation> <translation id="9170848237812810038">取消(&U)</translation> <translation id="1285266685456062655"><ph name="NUMBER_FEW"/> 小時前</translation> @@ -157,9 +173,11 @@ <translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation> <translation id="3740362395218339114"><ph name="QUANTITY"/> GB/秒</translation> <translation id="6644971472240498405"><ph name="NUMBER_ONE"/> 天</translation> +<translation id="2704295676501803339">左移</translation> <translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> 秒前</translation> <translation id="494645311413743213">剩下 <ph name="NUMBER_TWO"/> 秒</translation> <translation id="4570886800634958009">通知展開</translation> +<translation id="566737009157135450">向後刪除文字</translation> <translation id="436869212180315161">按下</translation> <translation id="4860787810836767172"><ph name="NUMBER_FEW"/> 秒前</translation> <translation id="2297836609126180313"><ph name="QUANTITY"/> TB/秒</translation> @@ -169,9 +187,11 @@ <translation id="1101671447232096497"><ph name="NUMBER_MANY"/> 分鐘前</translation> <translation id="6142413573757616983"><ph name="QUANTITY"/> B/秒</translation> <translation id="7649070708921625228">說明</translation> +<translation id="2405367043325750948">向前刪除</translation> <translation id="6699343763173986273">下一首媒體曲目</translation> <translation id="5445120697129764393">剩下 <ph name="NUMBER_DEFAULT"/> 秒</translation> <translation id="8226233771743600312">1 天內請勿打擾</translation> +<translation id="4252565523989510616">向前刪除文字</translation> <translation id="7457942297256758195">全部清除</translation> <translation id="822618367988303761"><ph name="NUMBER_TWO"/> 天前</translation> <translation id="4745438305783437565"><ph name="NUMBER_FEW"/> 分鐘</translation> @@ -187,6 +207,7 @@ <translation id="6907759265145635167"><ph name="QUANTITY"/> PB/秒</translation> <translation id="2743387203779672305">複製到剪貼簿</translation> <translation id="8371695176452482769">請說話</translation> +<translation id="1167268268675672572">移到行首並修改選取範圍</translation> <translation id="6965382102122355670">確定</translation> <translation id="7850320739366109486">請勿打擾</translation> <translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation> diff --git a/ui/base/ui_base.gyp b/ui/base/ui_base.gyp index 2ee7723143..3d9214f9c7 100644 --- a/ui/base/ui_base.gyp +++ b/ui/base/ui_base.gyp @@ -376,7 +376,6 @@ }], ['use_glib == 1', { 'dependencies': [ - # font_gtk.cc uses fontconfig. '../../build/linux/system.gyp:fontconfig', '../../build/linux/system.gyp:glib', ], @@ -566,6 +565,46 @@ }], ], }, + { + 'target_name': 'ui_base_test_support', + 'dependencies': [ + '../../base/base.gyp:base', + '../../skia/skia.gyp:skia', + '../../testing/gtest.gyp:gtest', + '../gfx/gfx.gyp:gfx', + '../gfx/gfx.gyp:gfx_geometry', + ], + 'sources': [ + 'test/ui_controls.h', + 'test/ui_controls_aura.cc', + 'test/ui_controls_internal_win.cc', + 'test/ui_controls_internal_win.h', + 'test/ui_controls_mac.mm', + 'test/ui_controls_win.cc', + ], + 'include_dirs': [ + '../..', + ], + 'conditions': [ + ['OS!="ios"', { + 'type': 'static_library', + 'includes': [ 'ime/ime_test_support.gypi' ], + }, { # OS=="ios" + # None of the sources in this target are built on iOS, resulting in + # link errors when building targets that depend on this target + # because the static library isn't found. If this target is changed + # to have sources that are built on iOS, the target should be changed + # to be of type static_library on all platforms. + 'type': 'none', + }], + ['use_aura==1', { + 'sources!': [ + 'test/ui_controls_mac.mm', + 'test/ui_controls_win.cc', + ], + }], + ], + }, ], 'conditions': [ ['OS=="android"' , { diff --git a/ui/base/ui_base.target.darwin-arm.mk b/ui/base/ui_base.target.darwin-arm.mk index 4b43a10a9e..b814021877 100644 --- a/ui/base/ui_base.target.darwin-arm.mk +++ b/ui/base/ui_base.target.darwin-arm.mk @@ -145,12 +145,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -270,12 +273,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -351,7 +357,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/base/ui_base.target.darwin-mips.mk b/ui/base/ui_base.target.darwin-mips.mk index f31f2d7fed..3af7d1b185 100644 --- a/ui/base/ui_base.target.darwin-mips.mk +++ b/ui/base/ui_base.target.darwin-mips.mk @@ -144,12 +144,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -268,12 +271,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -347,7 +353,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/base/ui_base.target.darwin-x86.mk b/ui/base/ui_base.target.darwin-x86.mk index 992f78f5d5..07cd479fcf 100644 --- a/ui/base/ui_base.target.darwin-x86.mk +++ b/ui/base/ui_base.target.darwin-x86.mk @@ -145,12 +145,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -269,12 +272,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -347,7 +353,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/base/ui_base.target.darwin-x86_64.mk b/ui/base/ui_base.target.darwin-x86_64.mk index 268a87d307..af066fc413 100644 --- a/ui/base/ui_base.target.darwin-x86_64.mk +++ b/ui/base/ui_base.target.darwin-x86_64.mk @@ -146,12 +146,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -271,12 +274,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -349,7 +355,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/base/ui_base.target.linux-arm.mk b/ui/base/ui_base.target.linux-arm.mk index 4b43a10a9e..b814021877 100644 --- a/ui/base/ui_base.target.linux-arm.mk +++ b/ui/base/ui_base.target.linux-arm.mk @@ -145,12 +145,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -270,12 +273,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -351,7 +357,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/base/ui_base.target.linux-mips.mk b/ui/base/ui_base.target.linux-mips.mk index f31f2d7fed..3af7d1b185 100644 --- a/ui/base/ui_base.target.linux-mips.mk +++ b/ui/base/ui_base.target.linux-mips.mk @@ -144,12 +144,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -268,12 +271,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -347,7 +353,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/base/ui_base.target.linux-x86.mk b/ui/base/ui_base.target.linux-x86.mk index 992f78f5d5..07cd479fcf 100644 --- a/ui/base/ui_base.target.linux-x86.mk +++ b/ui/base/ui_base.target.linux-x86.mk @@ -145,12 +145,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -269,12 +272,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -347,7 +353,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/base/ui_base.target.linux-x86_64.mk b/ui/base/ui_base.target.linux-x86_64.mk index 268a87d307..af066fc413 100644 --- a/ui/base/ui_base.target.linux-x86_64.mk +++ b/ui/base/ui_base.target.linux-x86_64.mk @@ -146,12 +146,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -271,12 +274,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -349,7 +355,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/base/x/selection_requestor.cc b/ui/base/x/selection_requestor.cc index 080007aac7..8757c72656 100644 --- a/ui/base/x/selection_requestor.cc +++ b/ui/base/x/selection_requestor.cc @@ -69,12 +69,16 @@ bool SelectionRequestor::PerformBlockingConvertSelection( DCHECK_EQ(&pending_request, pending_requests_.back()); pending_requests_.pop_back(); - if (pending_request.returned_property != property_to_set) - return false; - - return ui::GetRawBytesOfProperty(x_window_, pending_request.returned_property, - out_data, out_data_bytes, out_data_items, - out_type); + bool success = false; + if (pending_request.returned_property == property_to_set) { + success = ui::GetRawBytesOfProperty(x_window_, + pending_request.returned_property, + out_data, out_data_bytes, + out_data_items, out_type); + } + if (pending_request.returned_property != None) + XDeleteProperty(x_display_, x_window_, pending_request.returned_property); + return success; } SelectionData SelectionRequestor::RequestAndWaitForTypes( @@ -118,8 +122,14 @@ void SelectionRequestor::OnSelectionNotify(const XSelectionEvent& event) { // This event doesn't correspond to any XConvertSelection calls that we // issued in PerformBlockingConvertSelection. This shouldn't happen, but any // client can send any message, so it can happen. - if (!request_notified) + if (!request_notified) { + // ICCCM requires us to delete the property passed into SelectionNotify. If + // |request_notified| is true, the property will be deleted when the run + // loop has quit. + if (event.property != None) + XDeleteProperty(x_display_, x_window_, event.property); return; + } request_notified->returned_property = event.property; request_notified->returned = true; diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc index 3d733ddf1d..dd5444e37a 100644 --- a/ui/base/x/x11_util.cc +++ b/ui/base/x/x11_util.cc @@ -601,8 +601,11 @@ bool WindowContainsPoint(XID window, gfx::Point screen_loc) { rectangle_kind[kind_index], &shape_rects_size, &dummy); - if (!shape_rects) - continue; + if (!shape_rects) { + // The shape is empty. This can occur when |window| is minimized. + DCHECK_EQ(0, shape_rects_size); + return false; + } bool is_in_shape_rects = false; for (int i = 0; i < shape_rects_size; ++i) { // The ShapeInput and ShapeBounding rects are to be in window space, so we diff --git a/ui/chromeos/OWNERS b/ui/chromeos/OWNERS new file mode 100644 index 0000000000..50cce3ef71 --- /dev/null +++ b/ui/chromeos/OWNERS @@ -0,0 +1,4 @@ +derat@chromium.org +jamescook@chromium.org +oshima@chromium.org +stevenjb@chromium.org diff --git a/ui/chromeos/ui_chromeos.gyp b/ui/chromeos/ui_chromeos.gyp index c00d57630d..7f7362e05b 100644 --- a/ui/chromeos/ui_chromeos.gyp +++ b/ui/chromeos/ui_chromeos.gyp @@ -13,14 +13,14 @@ 'dependencies': [ '../../base/base.gyp:base', '../events/events.gyp:events', - '../wm/wm.gyp:wm_core', + '../wm/wm.gyp:wm', ], 'defines': [ 'UI_CHROMEOS_IMPLEMENTATION', ], 'sources': [ - 'user_activity_notifier.cc', - 'user_activity_notifier.h', + 'user_activity_power_manager_notifier.cc', + 'user_activity_power_manager_notifier.h', ], }, ], diff --git a/ui/chromeos/user_activity_notifier.cc b/ui/chromeos/user_activity_power_manager_notifier.cc index 53f312910d..7952b5986a 100644 --- a/ui/chromeos/user_activity_notifier.cc +++ b/ui/chromeos/user_activity_power_manager_notifier.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/chromeos/user_activity_notifier.h" +#include "ui/chromeos/user_activity_power_manager_notifier.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/power_manager_client.h" @@ -41,16 +41,17 @@ power_manager::UserActivityType GetUserActivityTypeForEvent( } // namespace -UserActivityNotifier::UserActivityNotifier(::wm::UserActivityDetector* detector) +UserActivityPowerManagerNotifier::UserActivityPowerManagerNotifier( + ::wm::UserActivityDetector* detector) : detector_(detector) { detector_->AddObserver(this); } -UserActivityNotifier::~UserActivityNotifier() { +UserActivityPowerManagerNotifier::~UserActivityPowerManagerNotifier() { detector_->RemoveObserver(this); } -void UserActivityNotifier::OnUserActivity(const Event* event) { +void UserActivityPowerManagerNotifier::OnUserActivity(const Event* event) { base::TimeTicks now = base::TimeTicks::Now(); // InSeconds() truncates rather than rounding, so it's fine for this // comparison. diff --git a/ui/chromeos/user_activity_notifier.h b/ui/chromeos/user_activity_power_manager_notifier.h index dab5955bf4..483f1b51e2 100644 --- a/ui/chromeos/user_activity_notifier.h +++ b/ui/chromeos/user_activity_power_manager_notifier.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_CHROMEOS_USER_ACTIVITY_NOTIFIER_H_ -#define UI_CHROMEOS_USER_ACTIVITY_NOTIFIER_H_ +#ifndef UI_CHROMEOS_USER_ACTIVITY_POWER_MANAGER_NOTIFIER_H_ +#define UI_CHROMEOS_USER_ACTIVITY_POWER_MANAGER_NOTIFIER_H_ #include "base/basictypes.h" #include "base/compiler_specific.h" @@ -18,11 +18,12 @@ class UserActivityDetector; namespace ui { // Notifies the power manager when the user is active. -class UI_CHROMEOS_EXPORT UserActivityNotifier +class UI_CHROMEOS_EXPORT UserActivityPowerManagerNotifier : public ::wm::UserActivityObserver { public: - explicit UserActivityNotifier(::wm::UserActivityDetector* detector); - virtual ~UserActivityNotifier(); + explicit UserActivityPowerManagerNotifier( + ::wm::UserActivityDetector* detector); + virtual ~UserActivityPowerManagerNotifier(); // UserActivityObserver implementation. virtual void OnUserActivity(const Event* event) OVERRIDE; @@ -33,9 +34,9 @@ class UI_CHROMEOS_EXPORT UserActivityNotifier // Last time that the power manager was notified. base::TimeTicks last_notify_time_; - DISALLOW_COPY_AND_ASSIGN(UserActivityNotifier); + DISALLOW_COPY_AND_ASSIGN(UserActivityPowerManagerNotifier); }; } // namespace ui -#endif // UI_CHROMEOS_USER_ACTIVITY_NOTIFIER_H_ +#endif // UI_CHROMEOS_USER_ACTIVITY_POWER_MANAGER_NOTIFIER_H_ diff --git a/ui/compositor/dip_util.cc b/ui/compositor/dip_util.cc index 2d95af6383..fcecf24955 100644 --- a/ui/compositor/dip_util.cc +++ b/ui/compositor/dip_util.cc @@ -60,6 +60,14 @@ gfx::Size ConvertSizeToPixel(const Layer* layer, gfx::Rect ConvertRectToPixel(const Layer* layer, const gfx::Rect& rect_in_dip) { float scale = GetDeviceScaleFactor(layer); - return gfx::ToFlooredRectDeprecated(gfx::ScaleRect(rect_in_dip, scale)); + // Use ToEnclosingRect() to ensure we paint all the possible pixels + // touched. ToEnclosingRect() floors the origin, and ceils the max + // coordinate. To do otherwise (such as flooring the size) potentially + // results in rounding down and not drawing all the pixels that are + // touched. + return gfx::ToEnclosingRect( + gfx::RectF(gfx::ScalePoint(rect_in_dip.origin(), scale), + gfx::ScaleSize(rect_in_dip.size(), scale))); } + } // namespace ui diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc index c93ca680ac..df67e9075c 100644 --- a/ui/compositor/layer.cc +++ b/ui/compositor/layer.cc @@ -329,6 +329,12 @@ void Layer::SetBackgroundZoom(float zoom, int inset) { SetLayerBackgroundFilters(); } +void Layer::SetAlphaShape(scoped_ptr<SkRegion> region) { + alpha_shape_ = region.Pass(); + + SetLayerFilters(); +} + void Layer::SetLayerFilters() { cc::FilterOperations filters; if (layer_saturation_) { @@ -348,6 +354,10 @@ void Layer::SetLayerFilters() { filters.Append(cc::FilterOperation::CreateSaturatingBrightnessFilter( layer_brightness_)); } + if (alpha_shape_) { + filters.Append(cc::FilterOperation::CreateAlphaThresholdFilter( + *alpha_shape_, 1.f, 0.f)); + } cc_layer_->SetFilters(filters); } diff --git a/ui/compositor/layer.h b/ui/compositor/layer.h index fea3c513bb..c42cbfe5f1 100644 --- a/ui/compositor/layer.h +++ b/ui/compositor/layer.h @@ -192,6 +192,9 @@ class COMPOSITOR_EXPORT Layer // edge across |inset| pixels. void SetBackgroundZoom(float zoom, int inset); + // Set the shape of this layer. + void SetAlphaShape(scoped_ptr<SkRegion> region); + // Invert the layer. bool layer_inverted() const { return layer_inverted_; } void SetLayerInverted(bool inverted); @@ -447,6 +450,9 @@ class COMPOSITOR_EXPORT Layer // Width of the border in pixels, where the scaling is blended. int zoom_inset_; + // Shape of the window. + scoped_ptr<SkRegion> alpha_shape_; + std::string name_; LayerDelegate* delegate_; diff --git a/ui/compositor/layer_owner.cc b/ui/compositor/layer_owner.cc index f72666bb19..8e6c29fac7 100644 --- a/ui/compositor/layer_owner.cc +++ b/ui/compositor/layer_owner.cc @@ -21,10 +21,10 @@ void LayerOwner::SetLayer(Layer* layer) { layer_->owner_ = this; } -Layer* LayerOwner::AcquireLayer() { +scoped_ptr<Layer> LayerOwner::AcquireLayer() { if (layer_owner_) layer_owner_->owner_ = NULL; - return layer_owner_.release(); + return layer_owner_.Pass(); } scoped_ptr<Layer> LayerOwner::RecreateLayer() { diff --git a/ui/compositor/layer_owner.h b/ui/compositor/layer_owner.h index 4828e7406f..27002e5db0 100644 --- a/ui/compositor/layer_owner.h +++ b/ui/compositor/layer_owner.h @@ -26,7 +26,7 @@ class COMPOSITOR_EXPORT LayerOwner { // function, and the caller is then responsible for disposing of the layer // once any animation completes. Note that layer() will remain valid until the // end of ~LayerOwner(). - Layer* AcquireLayer() WARN_UNUSED_RESULT; + scoped_ptr<Layer> AcquireLayer(); // Asks the owner to recreate the layer, returning the old Layer. NULL is // returned if there is no existing layer, or recreate is not supported. diff --git a/ui/display/chromeos/x11/native_display_delegate_x11.cc b/ui/display/chromeos/x11/native_display_delegate_x11.cc index 2258fa3246..3dff81bb31 100644 --- a/ui/display/chromeos/x11/native_display_delegate_x11.cc +++ b/ui/display/chromeos/x11/native_display_delegate_x11.cc @@ -19,7 +19,7 @@ #include "ui/display/chromeos/x11/display_util_x11.h" #include "ui/display/chromeos/x11/native_display_event_dispatcher_x11.h" #include "ui/display/types/chromeos/native_display_observer.h" -#include "ui/display/x11/edid_parser_x11.h" +#include "ui/display/util/x11/edid_parser_x11.h" #include "ui/events/platform/platform_event_observer.h" #include "ui/events/platform/platform_event_source.h" #include "ui/gfx/x/x11_error_tracker.h" @@ -149,7 +149,8 @@ void NativeDisplayDelegateX11::PlatformEventObserverX11::DidProcessEvent( NativeDisplayDelegateX11::NativeDisplayDelegateX11() : display_(gfx::GetXDisplay()), window_(DefaultRootWindow(display_)), - screen_(NULL) {} + screen_(NULL), + background_color_argb_(0) {} NativeDisplayDelegateX11::~NativeDisplayDelegateX11() { if (ui::PlatformEventSource::GetInstance()) { @@ -201,22 +202,7 @@ void NativeDisplayDelegateX11::UngrabServer() { void NativeDisplayDelegateX11::SyncWithServer() { XSync(display_, 0); } void NativeDisplayDelegateX11::SetBackgroundColor(uint32_t color_argb) { - // Configuring CRTCs/Framebuffer clears the boot screen image. Set the - // same background color while configuring the display to minimize the - // duration of black screen at boot time. The background is filled with - // black later in ash::DisplayManager. crbug.com/171050. - XSetWindowAttributes swa = {0}; - XColor color; - Colormap colormap = DefaultColormap(display_, 0); - // XColor uses 16 bits per color. - color.red = (color_argb & 0x00FF0000) >> 8; - color.green = (color_argb & 0x0000FF00); - color.blue = (color_argb & 0x000000FF) << 8; - color.flags = DoRed | DoGreen | DoBlue; - XAllocColor(display_, colormap, &color); - swa.background_pixel = color.pixel; - XChangeWindowAttributes(display_, window_, CWBackPixel, &swa); - XFreeColors(display_, colormap, &color.pixel, 1, 0); + background_color_argb_ = color_argb; } void NativeDisplayDelegateX11::ForceDPMSOn() { @@ -316,6 +302,21 @@ void NativeDisplayDelegateX11::CreateFrameBuffer(const gfx::Size& size) { int mm_height = size.height() * kPixelsToMmScale; XRRSetScreenSize( display_, window_, size.width(), size.height(), mm_width, mm_height); + // We don't wait for root window resize, therefore this end up with drawing + // in the old window size, which we care during the boot. + DrawBackground(); + + // Don't redraw the background upon framebuffer change again. This should + // happen only once after boot. + background_color_argb_ = 0; +} + +void NativeDisplayDelegateX11::AddObserver(NativeDisplayObserver* observer) { + observers_.AddObserver(observer); +} + +void NativeDisplayDelegateX11::RemoveObserver(NativeDisplayObserver* observer) { + observers_.RemoveObserver(observer); } void NativeDisplayDelegateX11::InitModes() { @@ -651,12 +652,29 @@ XRRCrtcGamma* NativeDisplayDelegateX11::CreateGammaRampForProfile( return NULL; } -void NativeDisplayDelegateX11::AddObserver(NativeDisplayObserver* observer) { - observers_.AddObserver(observer); -} +void NativeDisplayDelegateX11::DrawBackground() { + if (!background_color_argb_) + return; + // Configuring CRTCs/Framebuffer clears the boot screen image. Paint the + // same background color after updating framebuffer to minimize the + // duration of black screen at boot time. + XColor color; + Colormap colormap = DefaultColormap(display_, 0); + // XColor uses 16 bits per color. + color.red = (background_color_argb_ & 0x00FF0000) >> 8; + color.green = (background_color_argb_ & 0x0000FF00); + color.blue = (background_color_argb_ & 0x000000FF) << 8; + color.flags = DoRed | DoGreen | DoBlue; + XAllocColor(display_, colormap, &color); -void NativeDisplayDelegateX11::RemoveObserver(NativeDisplayObserver* observer) { - observers_.RemoveObserver(observer); + GC gc = XCreateGC(display_, window_, 0, 0); + XSetForeground(display_, gc, color.pixel); + XSetFillStyle(display_, gc, FillSolid); + int width = DisplayWidth(display_, DefaultScreen(display_)); + int height = DisplayHeight(display_, DefaultScreen(display_)); + XFillRectangle(display_, window_, gc, 0, 0, width, height); + XFreeGC(display_, gc); + XFreeColors(display_, colormap, &color.pixel, 1, 0); } } // namespace ui diff --git a/ui/display/chromeos/x11/native_display_delegate_x11.h b/ui/display/chromeos/x11/native_display_delegate_x11.h index 511219779b..f9eade3907 100644 --- a/ui/display/chromeos/x11/native_display_delegate_x11.h +++ b/ui/display/chromeos/x11/native_display_delegate_x11.h @@ -124,6 +124,8 @@ class DISPLAY_EXPORT NativeDisplayDelegateX11 : public NativeDisplayDelegate { const DisplaySnapshotX11& x11_output, ColorCalibrationProfile new_profile); + void DrawBackground(); + Display* display_; Window window_; @@ -149,6 +151,9 @@ class DISPLAY_EXPORT NativeDisplayDelegateX11 : public NativeDisplayDelegate { // List of observers waiting for display configuration change events. ObserverList<NativeDisplayObserver> observers_; + // A background color used during boot time + multi displays. + uint32_t background_color_argb_; + DISALLOW_COPY_AND_ASSIGN(NativeDisplayDelegateX11); }; diff --git a/ui/display/display.gyp b/ui/display/display.gyp index 3cc5d8e2e4..44a3038122 100644 --- a/ui/display/display.gyp +++ b/ui/display/display.gyp @@ -23,7 +23,7 @@ 'types/chromeos/display_snapshot.cc', 'types/chromeos/display_snapshot.h', 'types/chromeos/native_display_delegate.h', - 'types/chromeos/native_display_observer', + 'types/chromeos/native_display_observer.h', 'types/display_constants.h', 'types/display_types_export.h', ], @@ -35,6 +35,7 @@ '../../base/base.gyp:base', '../../ui/gfx/gfx.gyp:gfx', '../../ui/gfx/gfx.gyp:gfx_geometry', + 'display_util', ], 'defines': [ 'DISPLAY_IMPLEMENTATION', @@ -61,12 +62,6 @@ 'display_export.h', 'display_switches.cc', 'display_switches.h', - 'display_util.cc', - 'display_util.h', - 'edid_parser.cc', - 'edid_parser.h', - 'x11/edid_parser_x11.cc', - 'x11/edid_parser_x11.h', ], 'conditions': [ ['use_x11 == 1', { @@ -82,6 +77,44 @@ 'display_types', ], }], + ['use_ozone == 1', { + 'dependencies': [ + '../../ui/ozone/ozone.gyp:ozone', + ], + }], + ], + }, + { + 'target_name': 'display_util', + 'type': '<(component)', + 'dependencies': [ + '../../base/base.gyp:base', + '../../ui/gfx/gfx.gyp:gfx_geometry', + ], + 'defines': [ + 'DISPLAY_UTIL_IMPLEMENTATION', + ], + 'sources': [ + 'util/display_util.cc', + 'util/display_util.h', + 'util/display_util_export.h', + 'util/edid_parser.cc', + 'util/edid_parser.h', + 'util/x11/edid_parser_x11.cc', + 'util/x11/edid_parser_x11.h', + ], + 'conditions': [ + ['use_x11 == 1', { + 'dependencies': [ + '../../build/linux/system.gyp:xrandr', + '../../ui/gfx/gfx.gyp:gfx', + ], + }], + ['chromeos == 1', { + 'dependencies': [ + 'display_types', + ], + }], ], }, { diff --git a/ui/display/display_unittests.gypi b/ui/display/display_unittests.gypi index 75f5c77555..b266a1a32c 100644 --- a/ui/display/display_unittests.gypi +++ b/ui/display/display_unittests.gypi @@ -8,15 +8,15 @@ 'dependencies': [ '../base/base.gyp:test_support_base', '../testing/gtest.gyp:gtest', - '../ui/display/display.gyp:display', + '../ui/display/display.gyp:display_util', '../ui/gfx/gfx.gyp:gfx_geometry', ], 'sources': [ - 'edid_parser_unittest.cc', 'chromeos/display_configurator_unittest.cc', 'chromeos/x11/display_util_x11_unittest.cc', 'chromeos/x11/native_display_event_dispatcher_x11_unittest.cc', - 'display_util_unittest.cc', + 'util/display_util_unittest.cc', + 'util/edid_parser_unittest.cc', ], 'conditions': [ # TODO(dnicoara) When we add non-chromeos display code this dependency can @@ -24,6 +24,7 @@ # not like empty libraries. ['chromeos == 1', { 'dependencies': [ + '../ui/display/display.gyp:display', '../ui/display/display.gyp:display_test_util', '../ui/display/display.gyp:display_types', ], diff --git a/ui/display/display_util.cc b/ui/display/util/display_util.cc index aeaeed939a..aa23ec69a7 100644 --- a/ui/display/display_util.cc +++ b/ui/display/util/display_util.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/display/display_util.h" +#include "ui/display/util/display_util.h" #include "base/logging.h" @@ -41,14 +41,14 @@ bool IsDisplaySizeBlackListed(const gfx::Size& physical_size) { // Ignore if the reported display is smaller than minimum size. if (physical_size.width() <= kInvalidDisplaySizeList[0][0] || physical_size.height() <= kInvalidDisplaySizeList[0][1]) { - LOG(WARNING) << "Smaller than minimum display size"; + VLOG(1) << "Smaller than minimum display size"; return true; } for (size_t i = 1; i < arraysize(kInvalidDisplaySizeList); ++i) { const gfx::Size size(kInvalidDisplaySizeList[i][0], kInvalidDisplaySizeList[i][1]); if (physical_size == size) { - LOG(WARNING) << "Black listed display size detected:" << size.ToString(); + VLOG(1) << "Black listed display size detected:" << size.ToString(); return true; } } diff --git a/ui/display/display_util.h b/ui/display/util/display_util.h index 0928ef5c84..012269d103 100644 --- a/ui/display/display_util.h +++ b/ui/display/util/display_util.h @@ -2,24 +2,25 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_DISPLAY_DISPLAY_UTIL_H_ -#define UI_DISPLAY_DISPLAY_UTIL_H_ +#ifndef UI_DISPLAY_UTIL_DISPLAY_UTIL_H_ +#define UI_DISPLAY_UTIL_DISPLAY_UTIL_H_ -#include "ui/display/display_export.h" +#include "ui/display/util/display_util_export.h" #include "ui/gfx/geometry/size.h" namespace ui { // Returns true if a given size is in the list of bogus sizes in mm that should // be ignored. -DISPLAY_EXPORT bool IsDisplaySizeBlackListed(const gfx::Size& physical_size); +DISPLAY_UTIL_EXPORT bool IsDisplaySizeBlackListed( + const gfx::Size& physical_size); // Returns the desired device scale factor for the display with the given // physical_size and resoultion. -DISPLAY_EXPORT float GetScaleFactor( +DISPLAY_UTIL_EXPORT float GetScaleFactor( const gfx::Size& physical_size_in_mm, const gfx::Size& screen_size_in_pixels); } // namespace ui -#endif // UI_DISPLAY_DISPLAY_UTIL_H_ +#endif // UI_DISPLAY_UTIL_DISPLAY_UTIL_H_ diff --git a/ui/display/util/display_util_export.h b/ui/display/util/display_util_export.h new file mode 100644 index 0000000000..8eeb30d4e2 --- /dev/null +++ b/ui/display/util/display_util_export.h @@ -0,0 +1,37 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_DISPLAY_UTIL_DISPLAY_UTIL_EXPORT_H_ +#define UI_DISPLAY_UTIL_DISPLAY_UTIL_EXPORT_H_ + +// Defines DISPLAY_UTIL_EXPORT so that functionality implemented by the +// display_util module can be exported to consumers. + +#if defined(COMPONENT_BUILD) + +#if defined(WIN32) + +#if defined(DISPLAY_UTIL_IMPLEMENTATION) +#define DISPLAY_UTIL_EXPORT __declspec(dllexport) +#else +#define DISPLAY_UTIL_EXPORT __declspec(dllimport) +#endif + +#else // !defined(WIN32) + +#if defined(DISPLAY_UTIL_IMPLEMENTATION) +#define DISPLAY_UTIL_EXPORT __attribute__((visibility("default"))) +#else +#define DISPLAY_UTIL_EXPORT +#endif + +#endif + +#else // !defined(COMPONENT_BUILD) + +#define DISPLAY_UTIL_EXPORT + +#endif + +#endif // UI_DISPLAY_UTIL_DISPLAY_UTIL_EXPORT_H_ diff --git a/ui/display/display_util_unittest.cc b/ui/display/util/display_util_unittest.cc index 8b426734c1..ddb4a1cd07 100644 --- a/ui/display/display_util_unittest.cc +++ b/ui/display/util/display_util_unittest.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/display/display_util.h" +#include "ui/display/util/display_util.h" #include "testing/gtest/include/gtest/gtest.h" diff --git a/ui/display/edid_parser.cc b/ui/display/util/edid_parser.cc index 686b07147c..b95eef4c62 100644 --- a/ui/display/edid_parser.cc +++ b/ui/display/util/edid_parser.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/display/edid_parser.h" +#include "ui/display/util/edid_parser.h" #include <algorithm> diff --git a/ui/display/edid_parser.h b/ui/display/util/edid_parser.h index 2527abf86d..4f12d40aaa 100644 --- a/ui/display/edid_parser.h +++ b/ui/display/util/edid_parser.h @@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_DISPLAY_EDID_PARSER_H_ -#define UI_DISPLAY_EDID_PARSER_H_ +#ifndef UI_DISPLAY_UTIL_EDID_PARSER_H_ +#define UI_DISPLAY_UTIL_EDID_PARSER_H_ #include <stdint.h> #include <string> #include <vector> -#include "ui/display/display_export.h" +#include "ui/display/util/display_util_export.h" // EDID (Extended Display Identification Data) is a format for monitor // metadata. This provides a parser for the data. @@ -20,21 +20,23 @@ namespace ui { // Generates the display id for the pair of |edid| and |index|, and store in // |display_id_out|. Returns true if the display id is successfully generated, // or false otherwise. -DISPLAY_EXPORT bool GetDisplayIdFromEDID(const std::vector<uint8_t>& edid, - uint8_t index, - int64_t* display_id_out); +DISPLAY_UTIL_EXPORT bool GetDisplayIdFromEDID(const std::vector<uint8_t>& edid, + uint8_t index, + int64_t* display_id_out); // Parses |edid| as EDID data and stores extracted data into |manufacturer_id| // and |human_readable_name| and returns true. NULL can be passed for unwanted // output parameters. Some devices (especially internal displays) may not have // the field for |human_readable_name|, and it will return true in that case. -DISPLAY_EXPORT bool ParseOutputDeviceData(const std::vector<uint8_t>& edid, - uint16_t* manufacturer_id, - std::string* human_readable_name); +DISPLAY_UTIL_EXPORT bool ParseOutputDeviceData( + const std::vector<uint8_t>& edid, + uint16_t* manufacturer_id, + std::string* human_readable_name); -DISPLAY_EXPORT bool ParseOutputOverscanFlag(const std::vector<uint8_t>& edid, - bool* flag); +DISPLAY_UTIL_EXPORT bool ParseOutputOverscanFlag( + const std::vector<uint8_t>& edid, + bool* flag); } // namespace ui -#endif // UI_DISPLAY_EDID_PARSER_H_ +#endif // UI_DISPLAY_UTIL_EDID_PARSER_H_ diff --git a/ui/display/edid_parser_unittest.cc b/ui/display/util/edid_parser_unittest.cc index cac630e860..ef55bd682f 100644 --- a/ui/display/edid_parser_unittest.cc +++ b/ui/display/util/edid_parser_unittest.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/display/edid_parser.h" +#include "ui/display/util/edid_parser.h" #include "base/memory/scoped_ptr.h" #include "testing/gtest/include/gtest/gtest.h" diff --git a/ui/display/x11/DEPS b/ui/display/util/x11/DEPS index 25c2d71b78..25c2d71b78 100644 --- a/ui/display/x11/DEPS +++ b/ui/display/util/x11/DEPS diff --git a/ui/display/x11/edid_parser_x11.cc b/ui/display/util/x11/edid_parser_x11.cc index 55fa62b62f..407639b650 100644 --- a/ui/display/x11/edid_parser_x11.cc +++ b/ui/display/util/x11/edid_parser_x11.cc @@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/display/x11/edid_parser_x11.h" +#include "ui/display/util/x11/edid_parser_x11.h" #include <X11/extensions/Xrandr.h> #include <X11/Xatom.h> #include <X11/Xlib.h> #include "base/strings/string_util.h" -#include "ui/display/edid_parser.h" +#include "ui/display/util/edid_parser.h" #include "ui/gfx/x/x11_types.h" namespace ui { @@ -20,8 +20,7 @@ bool IsRandRAvailable() { int randr_version_major = 0; int randr_version_minor = 0; static bool is_randr_available = XRRQueryVersion( - gfx::GetXDisplay(), - &randr_version_major, &randr_version_minor); + gfx::GetXDisplay(), &randr_version_major, &randr_version_minor); return is_randr_available; } diff --git a/ui/display/x11/edid_parser_x11.h b/ui/display/util/x11/edid_parser_x11.h index d6ac9b96c6..55048e699e 100644 --- a/ui/display/x11/edid_parser_x11.h +++ b/ui/display/util/x11/edid_parser_x11.h @@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_DISPLAY_X11_EDID_PARSER_X11_H_ -#define UI_DISPLAY_X11_EDID_PARSER_X11_H_ +#ifndef UI_DISPLAY_UTIL_X11_EDID_PARSER_X11_H_ +#define UI_DISPLAY_UTIL_X11_EDID_PARSER_X11_H_ #include <stdint.h> #include <string> -#include "ui/display/display_export.h" #include "ui/display/types/display_constants.h" +#include "ui/display/util/display_util_export.h" typedef unsigned long XID; typedef XID RROutput; @@ -21,20 +21,20 @@ namespace ui { // Gets the EDID data from |output| and generates the display id through // |GetDisplayIdFromEDID|. -DISPLAY_EXPORT bool GetDisplayId(XID output, - uint8_t index, - int64_t* display_id_out); +DISPLAY_UTIL_EXPORT bool GetDisplayId(XID output, + uint8_t index, + int64_t* display_id_out); // Generate the human readable string from EDID obtained from |output|. -DISPLAY_EXPORT std::string GetDisplayName(RROutput output); +DISPLAY_UTIL_EXPORT std::string GetDisplayName(RROutput output); // Gets the overscan flag from |output| and stores to |flag|. Returns true if // the flag is found. Otherwise returns false and doesn't touch |flag|. The // output will produce overscan if |flag| is set to true, but the output may // still produce overscan even though it returns true and |flag| is set to // false. -DISPLAY_EXPORT bool GetOutputOverscanFlag(RROutput output, bool* flag); +DISPLAY_UTIL_EXPORT bool GetOutputOverscanFlag(RROutput output, bool* flag); } // namespace ui -#endif // UI_DISPLAY_X11_EDID_PARSER_X11_H_ +#endif // UI_DISPLAY_UTIL_X11_EDID_PARSER_X11_H_ diff --git a/ui/events/BUILD.gn b/ui/events/BUILD.gn index 91c32ffeb9..a6061ed891 100644 --- a/ui/events/BUILD.gn +++ b/ui/events/BUILD.gn @@ -215,7 +215,7 @@ component("gesture_detection") { } if (!use_aura && !is_android) { - sources -= [ "gesture_detection/gesture_config_helper.cc" ] + sources -= [ "gesture_detection/gesture_config_helper_aura.cc" ] } } @@ -259,7 +259,7 @@ source_set("events_test_support") { } } -test("events_unittest") { +test("events_unittests") { sources = [ "cocoa/cocoa_event_utils_unittest.mm", "event_dispatcher_unittest.cc", @@ -300,5 +300,6 @@ test("events_unittest") { "//base", "//base/test:run_all_unittests", "//testing/gtest", + "//ui/gfx:gfx_test_support", ] } diff --git a/ui/events/dom4_keycode_converter.target.darwin-arm.mk b/ui/events/dom4_keycode_converter.target.darwin-arm.mk index 53cc173e35..b0a045c184 100644 --- a/ui/events/dom4_keycode_converter.target.darwin-arm.mk +++ b/ui/events/dom4_keycode_converter.target.darwin-arm.mk @@ -219,7 +219,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/dom4_keycode_converter.target.darwin-mips.mk b/ui/events/dom4_keycode_converter.target.darwin-mips.mk index cb61e356d9..514ad3d0cd 100644 --- a/ui/events/dom4_keycode_converter.target.darwin-mips.mk +++ b/ui/events/dom4_keycode_converter.target.darwin-mips.mk @@ -215,7 +215,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/dom4_keycode_converter.target.darwin-x86.mk b/ui/events/dom4_keycode_converter.target.darwin-x86.mk index 7355649a6e..ed11429d35 100644 --- a/ui/events/dom4_keycode_converter.target.darwin-x86.mk +++ b/ui/events/dom4_keycode_converter.target.darwin-x86.mk @@ -217,7 +217,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/dom4_keycode_converter.target.darwin-x86_64.mk b/ui/events/dom4_keycode_converter.target.darwin-x86_64.mk index 6a5bd35fd0..da5b2ada44 100644 --- a/ui/events/dom4_keycode_converter.target.darwin-x86_64.mk +++ b/ui/events/dom4_keycode_converter.target.darwin-x86_64.mk @@ -217,7 +217,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/dom4_keycode_converter.target.linux-arm.mk b/ui/events/dom4_keycode_converter.target.linux-arm.mk index 53cc173e35..b0a045c184 100644 --- a/ui/events/dom4_keycode_converter.target.linux-arm.mk +++ b/ui/events/dom4_keycode_converter.target.linux-arm.mk @@ -219,7 +219,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/dom4_keycode_converter.target.linux-mips.mk b/ui/events/dom4_keycode_converter.target.linux-mips.mk index cb61e356d9..514ad3d0cd 100644 --- a/ui/events/dom4_keycode_converter.target.linux-mips.mk +++ b/ui/events/dom4_keycode_converter.target.linux-mips.mk @@ -215,7 +215,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/dom4_keycode_converter.target.linux-x86.mk b/ui/events/dom4_keycode_converter.target.linux-x86.mk index 7355649a6e..ed11429d35 100644 --- a/ui/events/dom4_keycode_converter.target.linux-x86.mk +++ b/ui/events/dom4_keycode_converter.target.linux-x86.mk @@ -217,7 +217,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/dom4_keycode_converter.target.linux-x86_64.mk b/ui/events/dom4_keycode_converter.target.linux-x86_64.mk index 6a5bd35fd0..da5b2ada44 100644 --- a/ui/events/dom4_keycode_converter.target.linux-x86_64.mk +++ b/ui/events/dom4_keycode_converter.target.linux-x86_64.mk @@ -217,7 +217,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/event_constants.h b/ui/events/event_constants.h index 467a9fa989..a19a136f0d 100644 --- a/ui/events/event_constants.h +++ b/ui/events/event_constants.h @@ -92,6 +92,11 @@ enum EventFlags { EF_MOD3_DOWN = 1 << 11, }; +// Flags specific to key events +enum KeyEventFlags { + EF_NUMPAD_KEY = 1 << 16, // Key originates from number pad (Xkb only) +}; + // Flags specific to mouse events enum MouseEventFlags { EF_IS_DOUBLE_CLICK = 1 << 16, diff --git a/ui/events/event_switches.cc b/ui/events/event_switches.cc index 314370af41..829b9d0d79 100644 --- a/ui/events/event_switches.cc +++ b/ui/events/event_switches.cc @@ -27,7 +27,7 @@ const char kTouchEventsDisabled[] = "disabled"; const char kTouchDevices[] = "touch-devices"; #endif -#if defined(USE_XI2_MT) +#if defined(USE_XI2_MT) || defined(USE_OZONE) // The calibration factors given as "<left>,<right>,<top>,<bottom>". const char kTouchCalibration[] = "touch-calibration"; #endif diff --git a/ui/events/event_switches.h b/ui/events/event_switches.h index caaa779f46..7ac2722b03 100644 --- a/ui/events/event_switches.h +++ b/ui/events/event_switches.h @@ -20,7 +20,7 @@ EVENTS_BASE_EXPORT extern const char kTouchEventsDisabled[]; EVENTS_BASE_EXPORT extern const char kTouchDevices[]; #endif -#if defined(USE_XI2_MT) +#if defined(USE_XI2_MT) || defined(USE_OZONE) EVENTS_BASE_EXPORT extern const char kTouchCalibration[]; #endif diff --git a/ui/events/events.gyp b/ui/events/events.gyp index c7dd93b750..00f5186c11 100644 --- a/ui/events/events.gyp +++ b/ui/events/events.gyp @@ -117,6 +117,14 @@ 'gestures/gesture_types.h', 'gestures/velocity_calculator.cc', 'gestures/velocity_calculator.h', + 'ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc', + 'ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h', + 'ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc', + 'ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h', + 'ozone/evdev/libgestures_glue/gesture_logging.cc', + 'ozone/evdev/libgestures_glue/gesture_logging.h', + 'ozone/evdev/libgestures_glue/gesture_timer_provider.cc', + 'ozone/evdev/libgestures_glue/gesture_timer_provider.h', 'ozone/evdev/device_manager_evdev.cc', 'ozone/evdev/device_manager_evdev.h', 'ozone/evdev/device_manager_udev.cc', @@ -146,6 +154,8 @@ 'platform/scoped_event_dispatcher.h', 'platform/x11/x11_event_source.cc', 'platform/x11/x11_event_source.h', + 'platform/x11/x11_event_source_glib.cc', + 'platform/x11/x11_event_source_libevent.cc', 'win/events_win.cc', 'x/events_x.cc', 'linux/text_edit_command_auralinux.cc', @@ -182,6 +192,14 @@ 'dependencies': [ '../../build/linux/system.gyp:glib', ], + 'sources!': [ + 'platform/x11/x11_event_source_libevent.cc', + ], + }, { + # use_glib == 0 + 'sources!': [ + 'platform/x11/x11_event_source_glib.cc', + ], }], ['use_ozone_evdev==1', { 'defines': ['USE_OZONE_EVDEV=1'], @@ -191,6 +209,19 @@ '<(DEPTH)/build/linux/system.gyp:udev', ], }], + ['use_ozone_evdev==1 and use_evdev_gestures==1', { + 'dependencies': [ + '<(DEPTH)/build/linux/system.gyp:libgestures', + '<(DEPTH)/build/linux/system.gyp:libevdev-cros', + ], + 'defines': [ + 'USE_EVDEV_GESTURES', + ], + }, { + 'sources/': [ + ['exclude', '^ozone/evdev/libgestures_glue/'], + ], + }], ['use_udev==0', { 'sources!': [ 'ozone/evdev/device_manager_udev.cc', @@ -361,7 +392,6 @@ ], 'variables': { 'test_suite_name': 'events_unittests', - 'input_shlib_path': '<(SHARED_LIB_DIR)/<(SHARED_LIB_PREFIX)events_unittests<(SHARED_LIB_SUFFIX)', }, 'includes': [ '../../build/apk_test.gypi' ], }, diff --git a/ui/events/events.target.darwin-arm.mk b/ui/events/events.target.darwin-arm.mk deleted file mode 100644 index d2be3d574c..0000000000 --- a/ui/events/events.target.darwin-arm.mk +++ /dev/null @@ -1,353 +0,0 @@ -# This file is generated by gyp; do not edit. - -include $(CLEAR_VARS) - -LOCAL_MODULE_CLASS := STATIC_LIBRARIES -LOCAL_MODULE := ui_events_events_gyp -LOCAL_MODULE_SUFFIX := .a -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) -gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) - -# Make sure our deps are built first. -GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a - -GYP_GENERATED_OUTPUTS := - -# Make sure our deps and generated files are built first. -LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) - -LOCAL_CPP_EXTENSION := .cc -LOCAL_GENERATED_SOURCES := - -GYP_COPIED_SOURCE_ORIGIN_DIRS := - -LOCAL_SRC_FILES := \ - ui/events/event.cc \ - ui/events/event_dispatcher.cc \ - ui/events/event_handler.cc \ - ui/events/event_processor.cc \ - ui/events/event_source.cc \ - ui/events/event_target.cc \ - ui/events/event_targeter.cc \ - ui/events/event_utils.cc \ - ui/events/events_stub.cc \ - ui/events/gestures/gesture_configuration.cc \ - ui/events/gestures/gesture_point.cc \ - ui/events/gestures/gesture_recognizer_impl.cc \ - ui/events/gestures/gesture_sequence.cc \ - ui/events/gestures/velocity_calculator.cc \ - ui/events/platform/platform_event_source.cc \ - ui/events/platform/platform_event_source_stub.cc \ - ui/events/platform/scoped_event_dispatcher.cc - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Debug := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -fno-tree-sra \ - -fuse-ld=gold \ - -Wno-psabi \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -g \ - -fomit-frame-pointer \ - -fdata-sections \ - -ffunction-sections \ - -funwind-tables - -MY_DEFS_Debug := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \ - '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \ - '-D_DEBUG' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Debug := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-abi \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Release := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -fno-tree-sra \ - -fuse-ld=gold \ - -Wno-psabi \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -fno-ident \ - -fdata-sections \ - -ffunction-sections \ - -fomit-frame-pointer \ - -funwind-tables - -MY_DEFS_Release := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DNDEBUG' \ - '-DNVALGRIND' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \ - '-D_FORTIFY_SOURCE=2' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Release := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-abi \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION)) -LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION)) -LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION)) -LOCAL_ASFLAGS := $(LOCAL_CFLAGS) -### Rules for final target. - -LOCAL_LDFLAGS_Debug := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -Wl,-z,relro \ - -Wl,-z,now \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,--icf=safe \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel \ - -Wl,-O1 \ - -Wl,--as-needed - - -LOCAL_LDFLAGS_Release := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -Wl,-z,relro \ - -Wl,-z,now \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,--icf=safe \ - -Wl,-O1 \ - -Wl,--as-needed \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel - - -LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION)) - -LOCAL_STATIC_LIBRARIES := \ - skia_skia_library_gyp - -# Enable grouping to fix circular references -LOCAL_GROUP_STATIC_LIBRARIES := true - -LOCAL_SHARED_LIBRARIES := \ - libstlport \ - libdl - -# Add target alias to "gyp_all_modules" target. -.PHONY: gyp_all_modules -gyp_all_modules: ui_events_events_gyp - -# Alias gyp target name. -.PHONY: events -events: ui_events_events_gyp - -include $(BUILD_STATIC_LIBRARY) diff --git a/ui/events/events.target.darwin-mips.mk b/ui/events/events.target.darwin-mips.mk deleted file mode 100644 index 34eae586f6..0000000000 --- a/ui/events/events.target.darwin-mips.mk +++ /dev/null @@ -1,347 +0,0 @@ -# This file is generated by gyp; do not edit. - -include $(CLEAR_VARS) - -LOCAL_MODULE_CLASS := STATIC_LIBRARIES -LOCAL_MODULE := ui_events_events_gyp -LOCAL_MODULE_SUFFIX := .a -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) -gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) - -# Make sure our deps are built first. -GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a - -GYP_GENERATED_OUTPUTS := - -# Make sure our deps and generated files are built first. -LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) - -LOCAL_CPP_EXTENSION := .cc -LOCAL_GENERATED_SOURCES := - -GYP_COPIED_SOURCE_ORIGIN_DIRS := - -LOCAL_SRC_FILES := \ - ui/events/event.cc \ - ui/events/event_dispatcher.cc \ - ui/events/event_handler.cc \ - ui/events/event_processor.cc \ - ui/events/event_source.cc \ - ui/events/event_target.cc \ - ui/events/event_targeter.cc \ - ui/events/event_utils.cc \ - ui/events/events_stub.cc \ - ui/events/gestures/gesture_configuration.cc \ - ui/events/gestures/gesture_point.cc \ - ui/events/gestures/gesture_recognizer_impl.cc \ - ui/events/gestures/gesture_sequence.cc \ - ui/events/gestures/velocity_calculator.cc \ - ui/events/platform/platform_event_source.cc \ - ui/events/platform/platform_event_source_stub.cc \ - ui/events/platform/scoped_event_dispatcher.cc - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Debug := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -EL \ - -mhard-float \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -g \ - -fomit-frame-pointer \ - -fdata-sections \ - -ffunction-sections \ - -funwind-tables - -MY_DEFS_Debug := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \ - '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \ - '-D_DEBUG' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Debug := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-uninitialized \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Release := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -EL \ - -mhard-float \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -fno-ident \ - -fdata-sections \ - -ffunction-sections \ - -fomit-frame-pointer \ - -funwind-tables - -MY_DEFS_Release := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DNDEBUG' \ - '-DNVALGRIND' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \ - '-D_FORTIFY_SOURCE=2' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Release := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-uninitialized \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION)) -LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION)) -LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION)) -LOCAL_ASFLAGS := $(LOCAL_CFLAGS) -### Rules for final target. - -LOCAL_LDFLAGS_Debug := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -EL \ - -Wl,--no-keep-memory \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel \ - -Wl,-O1 \ - -Wl,--as-needed - - -LOCAL_LDFLAGS_Release := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -EL \ - -Wl,--no-keep-memory \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,-O1 \ - -Wl,--as-needed \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel - - -LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION)) - -LOCAL_STATIC_LIBRARIES := \ - skia_skia_library_gyp - -# Enable grouping to fix circular references -LOCAL_GROUP_STATIC_LIBRARIES := true - -LOCAL_SHARED_LIBRARIES := \ - libstlport \ - libdl - -# Add target alias to "gyp_all_modules" target. -.PHONY: gyp_all_modules -gyp_all_modules: ui_events_events_gyp - -# Alias gyp target name. -.PHONY: events -events: ui_events_events_gyp - -include $(BUILD_STATIC_LIBRARY) diff --git a/ui/events/events.target.darwin-x86.mk b/ui/events/events.target.darwin-x86.mk deleted file mode 100644 index c56cc1d74d..0000000000 --- a/ui/events/events.target.darwin-x86.mk +++ /dev/null @@ -1,349 +0,0 @@ -# This file is generated by gyp; do not edit. - -include $(CLEAR_VARS) - -LOCAL_MODULE_CLASS := STATIC_LIBRARIES -LOCAL_MODULE := ui_events_events_gyp -LOCAL_MODULE_SUFFIX := .a -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) -gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) - -# Make sure our deps are built first. -GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a - -GYP_GENERATED_OUTPUTS := - -# Make sure our deps and generated files are built first. -LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) - -LOCAL_CPP_EXTENSION := .cc -LOCAL_GENERATED_SOURCES := - -GYP_COPIED_SOURCE_ORIGIN_DIRS := - -LOCAL_SRC_FILES := \ - ui/events/event.cc \ - ui/events/event_dispatcher.cc \ - ui/events/event_handler.cc \ - ui/events/event_processor.cc \ - ui/events/event_source.cc \ - ui/events/event_target.cc \ - ui/events/event_targeter.cc \ - ui/events/event_utils.cc \ - ui/events/events_stub.cc \ - ui/events/gestures/gesture_configuration.cc \ - ui/events/gestures/gesture_point.cc \ - ui/events/gestures/gesture_recognizer_impl.cc \ - ui/events/gestures/gesture_sequence.cc \ - ui/events/gestures/velocity_calculator.cc \ - ui/events/platform/platform_event_source.cc \ - ui/events/platform/platform_event_source_stub.cc \ - ui/events/platform/scoped_event_dispatcher.cc - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Debug := \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -msse2 \ - -mfpmath=sse \ - -mmmx \ - -m32 \ - -fuse-ld=gold \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -fno-stack-protector \ - -Os \ - -g \ - -fomit-frame-pointer \ - -fdata-sections \ - -ffunction-sections \ - -funwind-tables - -MY_DEFS_Debug := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \ - '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \ - '-D_DEBUG' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Debug := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Release := \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -msse2 \ - -mfpmath=sse \ - -mmmx \ - -m32 \ - -fuse-ld=gold \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -fno-stack-protector \ - -Os \ - -fno-ident \ - -fdata-sections \ - -ffunction-sections \ - -fomit-frame-pointer \ - -funwind-tables - -MY_DEFS_Release := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DNDEBUG' \ - '-DNVALGRIND' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \ - '-D_FORTIFY_SOURCE=2' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Release := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION)) -LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION)) -LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION)) -LOCAL_ASFLAGS := $(LOCAL_CFLAGS) -### Rules for final target. - -LOCAL_LDFLAGS_Debug := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -m32 \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel \ - -Wl,-O1 \ - -Wl,--as-needed - - -LOCAL_LDFLAGS_Release := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -m32 \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,-O1 \ - -Wl,--as-needed \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel - - -LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION)) - -LOCAL_STATIC_LIBRARIES := \ - skia_skia_library_gyp - -# Enable grouping to fix circular references -LOCAL_GROUP_STATIC_LIBRARIES := true - -LOCAL_SHARED_LIBRARIES := \ - libstlport \ - libdl - -# Add target alias to "gyp_all_modules" target. -.PHONY: gyp_all_modules -gyp_all_modules: ui_events_events_gyp - -# Alias gyp target name. -.PHONY: events -events: ui_events_events_gyp - -include $(BUILD_STATIC_LIBRARY) diff --git a/ui/events/events.target.darwin-x86_64.mk b/ui/events/events.target.darwin-x86_64.mk deleted file mode 100644 index 00e97fd437..0000000000 --- a/ui/events/events.target.darwin-x86_64.mk +++ /dev/null @@ -1,349 +0,0 @@ -# This file is generated by gyp; do not edit. - -include $(CLEAR_VARS) - -LOCAL_MODULE_CLASS := STATIC_LIBRARIES -LOCAL_MODULE := ui_events_events_gyp -LOCAL_MODULE_SUFFIX := .a -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) -gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) - -# Make sure our deps are built first. -GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a - -GYP_GENERATED_OUTPUTS := - -# Make sure our deps and generated files are built first. -LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) - -LOCAL_CPP_EXTENSION := .cc -LOCAL_GENERATED_SOURCES := - -GYP_COPIED_SOURCE_ORIGIN_DIRS := - -LOCAL_SRC_FILES := \ - ui/events/event.cc \ - ui/events/event_dispatcher.cc \ - ui/events/event_handler.cc \ - ui/events/event_processor.cc \ - ui/events/event_source.cc \ - ui/events/event_target.cc \ - ui/events/event_targeter.cc \ - ui/events/event_utils.cc \ - ui/events/events_stub.cc \ - ui/events/gestures/gesture_configuration.cc \ - ui/events/gestures/gesture_point.cc \ - ui/events/gestures/gesture_recognizer_impl.cc \ - ui/events/gestures/gesture_sequence.cc \ - ui/events/gestures/velocity_calculator.cc \ - ui/events/platform/platform_event_source.cc \ - ui/events/platform/platform_event_source_stub.cc \ - ui/events/platform/scoped_event_dispatcher.cc - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Debug := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -Wno-unused-local-typedefs \ - -m64 \ - -march=x86-64 \ - -fuse-ld=gold \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -g \ - -fomit-frame-pointer \ - -fdata-sections \ - -ffunction-sections \ - -funwind-tables - -MY_DEFS_Debug := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \ - '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \ - '-D_DEBUG' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Debug := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Release := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -Wno-unused-local-typedefs \ - -m64 \ - -march=x86-64 \ - -fuse-ld=gold \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -fno-ident \ - -fdata-sections \ - -ffunction-sections \ - -fomit-frame-pointer \ - -funwind-tables - -MY_DEFS_Release := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DNDEBUG' \ - '-DNVALGRIND' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \ - '-D_FORTIFY_SOURCE=2' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Release := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION)) -LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION)) -LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION)) -LOCAL_ASFLAGS := $(LOCAL_CFLAGS) -### Rules for final target. - -LOCAL_LDFLAGS_Debug := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -m64 \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel \ - -Wl,-O1 \ - -Wl,--as-needed - - -LOCAL_LDFLAGS_Release := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -m64 \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,-O1 \ - -Wl,--as-needed \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel - - -LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION)) - -LOCAL_STATIC_LIBRARIES := \ - skia_skia_library_gyp - -# Enable grouping to fix circular references -LOCAL_GROUP_STATIC_LIBRARIES := true - -LOCAL_SHARED_LIBRARIES := \ - libstlport \ - libdl - -# Add target alias to "gyp_all_modules" target. -.PHONY: gyp_all_modules -gyp_all_modules: ui_events_events_gyp - -# Alias gyp target name. -.PHONY: events -events: ui_events_events_gyp - -include $(BUILD_STATIC_LIBRARY) diff --git a/ui/events/events.target.linux-arm.mk b/ui/events/events.target.linux-arm.mk deleted file mode 100644 index d2be3d574c..0000000000 --- a/ui/events/events.target.linux-arm.mk +++ /dev/null @@ -1,353 +0,0 @@ -# This file is generated by gyp; do not edit. - -include $(CLEAR_VARS) - -LOCAL_MODULE_CLASS := STATIC_LIBRARIES -LOCAL_MODULE := ui_events_events_gyp -LOCAL_MODULE_SUFFIX := .a -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) -gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) - -# Make sure our deps are built first. -GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a - -GYP_GENERATED_OUTPUTS := - -# Make sure our deps and generated files are built first. -LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) - -LOCAL_CPP_EXTENSION := .cc -LOCAL_GENERATED_SOURCES := - -GYP_COPIED_SOURCE_ORIGIN_DIRS := - -LOCAL_SRC_FILES := \ - ui/events/event.cc \ - ui/events/event_dispatcher.cc \ - ui/events/event_handler.cc \ - ui/events/event_processor.cc \ - ui/events/event_source.cc \ - ui/events/event_target.cc \ - ui/events/event_targeter.cc \ - ui/events/event_utils.cc \ - ui/events/events_stub.cc \ - ui/events/gestures/gesture_configuration.cc \ - ui/events/gestures/gesture_point.cc \ - ui/events/gestures/gesture_recognizer_impl.cc \ - ui/events/gestures/gesture_sequence.cc \ - ui/events/gestures/velocity_calculator.cc \ - ui/events/platform/platform_event_source.cc \ - ui/events/platform/platform_event_source_stub.cc \ - ui/events/platform/scoped_event_dispatcher.cc - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Debug := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -fno-tree-sra \ - -fuse-ld=gold \ - -Wno-psabi \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -g \ - -fomit-frame-pointer \ - -fdata-sections \ - -ffunction-sections \ - -funwind-tables - -MY_DEFS_Debug := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \ - '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \ - '-D_DEBUG' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Debug := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-abi \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Release := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -fno-tree-sra \ - -fuse-ld=gold \ - -Wno-psabi \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -fno-ident \ - -fdata-sections \ - -ffunction-sections \ - -fomit-frame-pointer \ - -funwind-tables - -MY_DEFS_Release := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DNDEBUG' \ - '-DNVALGRIND' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \ - '-D_FORTIFY_SOURCE=2' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Release := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-abi \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION)) -LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION)) -LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION)) -LOCAL_ASFLAGS := $(LOCAL_CFLAGS) -### Rules for final target. - -LOCAL_LDFLAGS_Debug := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -Wl,-z,relro \ - -Wl,-z,now \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,--icf=safe \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel \ - -Wl,-O1 \ - -Wl,--as-needed - - -LOCAL_LDFLAGS_Release := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -Wl,-z,relro \ - -Wl,-z,now \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,--icf=safe \ - -Wl,-O1 \ - -Wl,--as-needed \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel - - -LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION)) - -LOCAL_STATIC_LIBRARIES := \ - skia_skia_library_gyp - -# Enable grouping to fix circular references -LOCAL_GROUP_STATIC_LIBRARIES := true - -LOCAL_SHARED_LIBRARIES := \ - libstlport \ - libdl - -# Add target alias to "gyp_all_modules" target. -.PHONY: gyp_all_modules -gyp_all_modules: ui_events_events_gyp - -# Alias gyp target name. -.PHONY: events -events: ui_events_events_gyp - -include $(BUILD_STATIC_LIBRARY) diff --git a/ui/events/events.target.linux-mips.mk b/ui/events/events.target.linux-mips.mk deleted file mode 100644 index 34eae586f6..0000000000 --- a/ui/events/events.target.linux-mips.mk +++ /dev/null @@ -1,347 +0,0 @@ -# This file is generated by gyp; do not edit. - -include $(CLEAR_VARS) - -LOCAL_MODULE_CLASS := STATIC_LIBRARIES -LOCAL_MODULE := ui_events_events_gyp -LOCAL_MODULE_SUFFIX := .a -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) -gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) - -# Make sure our deps are built first. -GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a - -GYP_GENERATED_OUTPUTS := - -# Make sure our deps and generated files are built first. -LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) - -LOCAL_CPP_EXTENSION := .cc -LOCAL_GENERATED_SOURCES := - -GYP_COPIED_SOURCE_ORIGIN_DIRS := - -LOCAL_SRC_FILES := \ - ui/events/event.cc \ - ui/events/event_dispatcher.cc \ - ui/events/event_handler.cc \ - ui/events/event_processor.cc \ - ui/events/event_source.cc \ - ui/events/event_target.cc \ - ui/events/event_targeter.cc \ - ui/events/event_utils.cc \ - ui/events/events_stub.cc \ - ui/events/gestures/gesture_configuration.cc \ - ui/events/gestures/gesture_point.cc \ - ui/events/gestures/gesture_recognizer_impl.cc \ - ui/events/gestures/gesture_sequence.cc \ - ui/events/gestures/velocity_calculator.cc \ - ui/events/platform/platform_event_source.cc \ - ui/events/platform/platform_event_source_stub.cc \ - ui/events/platform/scoped_event_dispatcher.cc - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Debug := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -EL \ - -mhard-float \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -g \ - -fomit-frame-pointer \ - -fdata-sections \ - -ffunction-sections \ - -funwind-tables - -MY_DEFS_Debug := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \ - '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \ - '-D_DEBUG' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Debug := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-uninitialized \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Release := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -EL \ - -mhard-float \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -fno-ident \ - -fdata-sections \ - -ffunction-sections \ - -fomit-frame-pointer \ - -funwind-tables - -MY_DEFS_Release := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DNDEBUG' \ - '-DNVALGRIND' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \ - '-D_FORTIFY_SOURCE=2' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Release := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-uninitialized \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION)) -LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION)) -LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION)) -LOCAL_ASFLAGS := $(LOCAL_CFLAGS) -### Rules for final target. - -LOCAL_LDFLAGS_Debug := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -EL \ - -Wl,--no-keep-memory \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel \ - -Wl,-O1 \ - -Wl,--as-needed - - -LOCAL_LDFLAGS_Release := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -EL \ - -Wl,--no-keep-memory \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,-O1 \ - -Wl,--as-needed \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel - - -LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION)) - -LOCAL_STATIC_LIBRARIES := \ - skia_skia_library_gyp - -# Enable grouping to fix circular references -LOCAL_GROUP_STATIC_LIBRARIES := true - -LOCAL_SHARED_LIBRARIES := \ - libstlport \ - libdl - -# Add target alias to "gyp_all_modules" target. -.PHONY: gyp_all_modules -gyp_all_modules: ui_events_events_gyp - -# Alias gyp target name. -.PHONY: events -events: ui_events_events_gyp - -include $(BUILD_STATIC_LIBRARY) diff --git a/ui/events/events.target.linux-x86.mk b/ui/events/events.target.linux-x86.mk deleted file mode 100644 index c56cc1d74d..0000000000 --- a/ui/events/events.target.linux-x86.mk +++ /dev/null @@ -1,349 +0,0 @@ -# This file is generated by gyp; do not edit. - -include $(CLEAR_VARS) - -LOCAL_MODULE_CLASS := STATIC_LIBRARIES -LOCAL_MODULE := ui_events_events_gyp -LOCAL_MODULE_SUFFIX := .a -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) -gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) - -# Make sure our deps are built first. -GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a - -GYP_GENERATED_OUTPUTS := - -# Make sure our deps and generated files are built first. -LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) - -LOCAL_CPP_EXTENSION := .cc -LOCAL_GENERATED_SOURCES := - -GYP_COPIED_SOURCE_ORIGIN_DIRS := - -LOCAL_SRC_FILES := \ - ui/events/event.cc \ - ui/events/event_dispatcher.cc \ - ui/events/event_handler.cc \ - ui/events/event_processor.cc \ - ui/events/event_source.cc \ - ui/events/event_target.cc \ - ui/events/event_targeter.cc \ - ui/events/event_utils.cc \ - ui/events/events_stub.cc \ - ui/events/gestures/gesture_configuration.cc \ - ui/events/gestures/gesture_point.cc \ - ui/events/gestures/gesture_recognizer_impl.cc \ - ui/events/gestures/gesture_sequence.cc \ - ui/events/gestures/velocity_calculator.cc \ - ui/events/platform/platform_event_source.cc \ - ui/events/platform/platform_event_source_stub.cc \ - ui/events/platform/scoped_event_dispatcher.cc - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Debug := \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -msse2 \ - -mfpmath=sse \ - -mmmx \ - -m32 \ - -fuse-ld=gold \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -fno-stack-protector \ - -Os \ - -g \ - -fomit-frame-pointer \ - -fdata-sections \ - -ffunction-sections \ - -funwind-tables - -MY_DEFS_Debug := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \ - '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \ - '-D_DEBUG' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Debug := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Release := \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -msse2 \ - -mfpmath=sse \ - -mmmx \ - -m32 \ - -fuse-ld=gold \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -fno-stack-protector \ - -Os \ - -fno-ident \ - -fdata-sections \ - -ffunction-sections \ - -fomit-frame-pointer \ - -funwind-tables - -MY_DEFS_Release := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DNDEBUG' \ - '-DNVALGRIND' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \ - '-D_FORTIFY_SOURCE=2' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Release := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION)) -LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION)) -LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION)) -LOCAL_ASFLAGS := $(LOCAL_CFLAGS) -### Rules for final target. - -LOCAL_LDFLAGS_Debug := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -m32 \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel \ - -Wl,-O1 \ - -Wl,--as-needed - - -LOCAL_LDFLAGS_Release := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -m32 \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,-O1 \ - -Wl,--as-needed \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel - - -LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION)) - -LOCAL_STATIC_LIBRARIES := \ - skia_skia_library_gyp - -# Enable grouping to fix circular references -LOCAL_GROUP_STATIC_LIBRARIES := true - -LOCAL_SHARED_LIBRARIES := \ - libstlport \ - libdl - -# Add target alias to "gyp_all_modules" target. -.PHONY: gyp_all_modules -gyp_all_modules: ui_events_events_gyp - -# Alias gyp target name. -.PHONY: events -events: ui_events_events_gyp - -include $(BUILD_STATIC_LIBRARY) diff --git a/ui/events/events.target.linux-x86_64.mk b/ui/events/events.target.linux-x86_64.mk deleted file mode 100644 index 00e97fd437..0000000000 --- a/ui/events/events.target.linux-x86_64.mk +++ /dev/null @@ -1,349 +0,0 @@ -# This file is generated by gyp; do not edit. - -include $(CLEAR_VARS) - -LOCAL_MODULE_CLASS := STATIC_LIBRARIES -LOCAL_MODULE := ui_events_events_gyp -LOCAL_MODULE_SUFFIX := .a -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) -gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) - -# Make sure our deps are built first. -GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a - -GYP_GENERATED_OUTPUTS := - -# Make sure our deps and generated files are built first. -LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) - -LOCAL_CPP_EXTENSION := .cc -LOCAL_GENERATED_SOURCES := - -GYP_COPIED_SOURCE_ORIGIN_DIRS := - -LOCAL_SRC_FILES := \ - ui/events/event.cc \ - ui/events/event_dispatcher.cc \ - ui/events/event_handler.cc \ - ui/events/event_processor.cc \ - ui/events/event_source.cc \ - ui/events/event_target.cc \ - ui/events/event_targeter.cc \ - ui/events/event_utils.cc \ - ui/events/events_stub.cc \ - ui/events/gestures/gesture_configuration.cc \ - ui/events/gestures/gesture_point.cc \ - ui/events/gestures/gesture_recognizer_impl.cc \ - ui/events/gestures/gesture_sequence.cc \ - ui/events/gestures/velocity_calculator.cc \ - ui/events/platform/platform_event_source.cc \ - ui/events/platform/platform_event_source_stub.cc \ - ui/events/platform/scoped_event_dispatcher.cc - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Debug := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -Wno-unused-local-typedefs \ - -m64 \ - -march=x86-64 \ - -fuse-ld=gold \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -g \ - -fomit-frame-pointer \ - -fdata-sections \ - -ffunction-sections \ - -funwind-tables - -MY_DEFS_Debug := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \ - '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \ - '-D_DEBUG' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Debug := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -# Flags passed to both C and C++ files. -MY_CFLAGS_Release := \ - -fstack-protector \ - --param=ssp-buffer-size=4 \ - -Werror \ - -fno-exceptions \ - -fno-strict-aliasing \ - -Wall \ - -Wno-unused-parameter \ - -Wno-missing-field-initializers \ - -fvisibility=hidden \ - -pipe \ - -fPIC \ - -Wno-unused-local-typedefs \ - -m64 \ - -march=x86-64 \ - -fuse-ld=gold \ - -ffunction-sections \ - -funwind-tables \ - -g \ - -fstack-protector \ - -fno-short-enums \ - -finline-limit=64 \ - -Wa,--noexecstack \ - -U_FORTIFY_SOURCE \ - -Wno-extra \ - -Wno-ignored-qualifiers \ - -Wno-type-limits \ - -Wno-unused-but-set-variable \ - -Os \ - -fno-ident \ - -fdata-sections \ - -ffunction-sections \ - -fomit-frame-pointer \ - -funwind-tables - -MY_DEFS_Release := \ - '-DV8_DEPRECATION_WARNINGS' \ - '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \ - '-D_FILE_OFFSET_BITS=64' \ - '-DNO_TCMALLOC' \ - '-DDISABLE_NACL' \ - '-DCHROMIUM_BUILD' \ - '-DUSE_LIBJPEG_TURBO=1' \ - '-DENABLE_WEBRTC=1' \ - '-DUSE_PROPRIETARY_CODECS' \ - '-DENABLE_CONFIGURATION_POLICY' \ - '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \ - '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \ - '-DENABLE_EGLIMAGE=1' \ - '-DCLD_VERSION=1' \ - '-DENABLE_PRINTING=1' \ - '-DENABLE_MANAGED_USERS=1' \ - '-DEVENTS_IMPLEMENTATION' \ - '-DSK_ENABLE_INST_COUNT=0' \ - '-DSK_SUPPORT_GPU=1' \ - '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \ - '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ - '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ - '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ - '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ - '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ - '-DSK_SUPPORT_LEGACY_N32_NAME' \ - '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ - '-DSK_BUILD_FOR_ANDROID' \ - '-DSK_USE_POSIX_THREADS' \ - '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ - '-DU_USING_ICU_NAMESPACE=0' \ - '-DUSE_OPENSSL=1' \ - '-DUSE_OPENSSL_CERTS=1' \ - '-D__STDC_CONSTANT_MACROS' \ - '-D__STDC_FORMAT_MACROS' \ - '-DANDROID' \ - '-D__GNU_SOURCE=1' \ - '-DUSE_STLPORT=1' \ - '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \ - '-DCHROME_BUILD_ID=""' \ - '-DNDEBUG' \ - '-DNVALGRIND' \ - '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \ - '-D_FORTIFY_SOURCE=2' - - -# Include paths placed before CFLAGS/CPPFLAGS -LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ - $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ - $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/skia/config \ - $(LOCAL_PATH)/third_party/skia/src/core \ - $(LOCAL_PATH)/third_party/skia/include/core \ - $(LOCAL_PATH)/third_party/skia/include/effects \ - $(LOCAL_PATH)/third_party/skia/include/pdf \ - $(LOCAL_PATH)/third_party/skia/include/gpu \ - $(LOCAL_PATH)/third_party/skia/include/lazy \ - $(LOCAL_PATH)/third_party/skia/include/pathops \ - $(LOCAL_PATH)/third_party/skia/include/pipe \ - $(LOCAL_PATH)/third_party/skia/include/ports \ - $(LOCAL_PATH)/third_party/skia/include/utils \ - $(LOCAL_PATH)/skia/ext \ - $(PWD)/external/icu4c/common \ - $(PWD)/external/icu4c/i18n \ - $(PWD)/frameworks/wilhelm/include \ - $(PWD)/bionic \ - $(PWD)/external/stlport/stlport - - -# Flags passed to only C++ (and not C) files. -LOCAL_CPPFLAGS_Release := \ - -fno-rtti \ - -fno-threadsafe-statics \ - -fvisibility-inlines-hidden \ - -Wsign-compare \ - -Wno-non-virtual-dtor \ - -Wno-sign-promo - - -LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION)) -LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION)) -LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION)) -LOCAL_ASFLAGS := $(LOCAL_CFLAGS) -### Rules for final target. - -LOCAL_LDFLAGS_Debug := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -m64 \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel \ - -Wl,-O1 \ - -Wl,--as-needed - - -LOCAL_LDFLAGS_Release := \ - -Wl,-z,now \ - -Wl,-z,relro \ - -Wl,--fatal-warnings \ - -Wl,-z,noexecstack \ - -fPIC \ - -m64 \ - -fuse-ld=gold \ - -nostdlib \ - -Wl,--no-undefined \ - -Wl,--exclude-libs=ALL \ - -Wl,-O1 \ - -Wl,--as-needed \ - -Wl,--gc-sections \ - -Wl,--warn-shared-textrel - - -LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION)) - -LOCAL_STATIC_LIBRARIES := \ - skia_skia_library_gyp - -# Enable grouping to fix circular references -LOCAL_GROUP_STATIC_LIBRARIES := true - -LOCAL_SHARED_LIBRARIES := \ - libstlport \ - libdl - -# Add target alias to "gyp_all_modules" target. -.PHONY: gyp_all_modules -gyp_all_modules: ui_events_events_gyp - -# Alias gyp target name. -.PHONY: events -events: ui_events_events_gyp - -include $(BUILD_STATIC_LIBRARY) diff --git a/ui/events/events_base.target.darwin-arm.mk b/ui/events/events_base.target.darwin-arm.mk index 19e3baa9e7..570bc45e1e 100644 --- a/ui/events/events_base.target.darwin-arm.mk +++ b/ui/events/events_base.target.darwin-arm.mk @@ -95,12 +95,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -215,12 +218,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -292,7 +298,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/events_base.target.darwin-mips.mk b/ui/events/events_base.target.darwin-mips.mk index 3e9e19d524..6420e3401e 100644 --- a/ui/events/events_base.target.darwin-mips.mk +++ b/ui/events/events_base.target.darwin-mips.mk @@ -94,12 +94,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -213,12 +216,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -288,7 +294,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/events_base.target.darwin-x86.mk b/ui/events/events_base.target.darwin-x86.mk index b15bb089ca..b1557b46ae 100644 --- a/ui/events/events_base.target.darwin-x86.mk +++ b/ui/events/events_base.target.darwin-x86.mk @@ -96,12 +96,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -216,12 +219,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/events_base.target.darwin-x86_64.mk b/ui/events/events_base.target.darwin-x86_64.mk index 26c84cdb3f..0c2555240d 100644 --- a/ui/events/events_base.target.darwin-x86_64.mk +++ b/ui/events/events_base.target.darwin-x86_64.mk @@ -96,12 +96,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -216,12 +219,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/events_base.target.linux-arm.mk b/ui/events/events_base.target.linux-arm.mk index 19e3baa9e7..570bc45e1e 100644 --- a/ui/events/events_base.target.linux-arm.mk +++ b/ui/events/events_base.target.linux-arm.mk @@ -95,12 +95,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -215,12 +218,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -292,7 +298,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/events_base.target.linux-mips.mk b/ui/events/events_base.target.linux-mips.mk index 3e9e19d524..6420e3401e 100644 --- a/ui/events/events_base.target.linux-mips.mk +++ b/ui/events/events_base.target.linux-mips.mk @@ -94,12 +94,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -213,12 +216,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -288,7 +294,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/events_base.target.linux-x86.mk b/ui/events/events_base.target.linux-x86.mk index b15bb089ca..b1557b46ae 100644 --- a/ui/events/events_base.target.linux-x86.mk +++ b/ui/events/events_base.target.linux-x86.mk @@ -96,12 +96,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -216,12 +219,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/events_base.target.linux-x86_64.mk b/ui/events/events_base.target.linux-x86_64.mk index 26c84cdb3f..0c2555240d 100644 --- a/ui/events/events_base.target.linux-x86_64.mk +++ b/ui/events/events_base.target.linux-x86_64.mk @@ -96,12 +96,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -216,12 +219,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/gesture_detection.target.darwin-arm.mk b/ui/events/gesture_detection.target.darwin-arm.mk index 86dd26c3eb..a684bbcc73 100644 --- a/ui/events/gesture_detection.target.darwin-arm.mk +++ b/ui/events/gesture_detection.target.darwin-arm.mk @@ -101,12 +101,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -221,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/gesture_detection.target.darwin-mips.mk b/ui/events/gesture_detection.target.darwin-mips.mk index 766cbdcd44..76e78d1bee 100644 --- a/ui/events/gesture_detection.target.darwin-mips.mk +++ b/ui/events/gesture_detection.target.darwin-mips.mk @@ -100,12 +100,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -219,12 +222,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/gesture_detection.target.darwin-x86.mk b/ui/events/gesture_detection.target.darwin-x86.mk index 2134ec1bd1..c35addd757 100644 --- a/ui/events/gesture_detection.target.darwin-x86.mk +++ b/ui/events/gesture_detection.target.darwin-x86.mk @@ -102,12 +102,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -222,12 +225,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/gesture_detection.target.darwin-x86_64.mk b/ui/events/gesture_detection.target.darwin-x86_64.mk index 489761dd68..e59f0d6d30 100644 --- a/ui/events/gesture_detection.target.darwin-x86_64.mk +++ b/ui/events/gesture_detection.target.darwin-x86_64.mk @@ -102,12 +102,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -222,12 +225,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/gesture_detection.target.linux-arm.mk b/ui/events/gesture_detection.target.linux-arm.mk index 86dd26c3eb..a684bbcc73 100644 --- a/ui/events/gesture_detection.target.linux-arm.mk +++ b/ui/events/gesture_detection.target.linux-arm.mk @@ -101,12 +101,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -221,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/gesture_detection.target.linux-mips.mk b/ui/events/gesture_detection.target.linux-mips.mk index 766cbdcd44..76e78d1bee 100644 --- a/ui/events/gesture_detection.target.linux-mips.mk +++ b/ui/events/gesture_detection.target.linux-mips.mk @@ -100,12 +100,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -219,12 +222,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/gesture_detection.target.linux-x86.mk b/ui/events/gesture_detection.target.linux-x86.mk index 2134ec1bd1..c35addd757 100644 --- a/ui/events/gesture_detection.target.linux-x86.mk +++ b/ui/events/gesture_detection.target.linux-x86.mk @@ -102,12 +102,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -222,12 +225,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/gesture_detection.target.linux-x86_64.mk b/ui/events/gesture_detection.target.linux-x86_64.mk index 489761dd68..e59f0d6d30 100644 --- a/ui/events/gesture_detection.target.linux-x86_64.mk +++ b/ui/events/gesture_detection.target.linux-x86_64.mk @@ -102,12 +102,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -222,12 +225,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/events/gesture_detection/filtered_gesture_provider.cc b/ui/events/gesture_detection/filtered_gesture_provider.cc index 9e3c49359c..76ee5201d1 100644 --- a/ui/events/gesture_detection/filtered_gesture_provider.cc +++ b/ui/events/gesture_detection/filtered_gesture_provider.cc @@ -41,12 +41,9 @@ void FilteredGestureProvider::OnTouchEventAck(bool event_consumed) { gesture_filter_.OnTouchEventAck(event_consumed); } -void FilteredGestureProvider::ResetGestureDetectors() { - gesture_provider_.ResetGestureDetectors(); -} - -void FilteredGestureProvider::SetMultiTouchSupportEnabled(bool enabled) { - gesture_provider_.SetMultiTouchSupportEnabled(enabled); +void FilteredGestureProvider::SetMultiTouchZoomSupportEnabled( + bool enabled) { + gesture_provider_.SetMultiTouchZoomSupportEnabled(enabled); } void FilteredGestureProvider::SetDoubleTapSupportForPlatformEnabled( diff --git a/ui/events/gesture_detection/filtered_gesture_provider.h b/ui/events/gesture_detection/filtered_gesture_provider.h index b1f71e3be5..4d63be64a8 100644 --- a/ui/events/gesture_detection/filtered_gesture_provider.h +++ b/ui/events/gesture_detection/filtered_gesture_provider.h @@ -33,8 +33,7 @@ class GESTURE_DETECTION_EXPORT FilteredGestureProvider void OnTouchEventAck(bool event_consumed); // Methods delegated to |gesture_provider_|. - void ResetGestureDetectors(); - void SetMultiTouchSupportEnabled(bool enabled); + void SetMultiTouchZoomSupportEnabled(bool enabled); void SetDoubleTapSupportForPlatformEnabled(bool enabled); void SetDoubleTapSupportForPageEnabled(bool enabled); const ui::MotionEvent* GetCurrentDownEvent() const; diff --git a/ui/events/gesture_detection/gesture_detector.cc b/ui/events/gesture_detection/gesture_detector.cc index 1628c266b7..e086ef0745 100644 --- a/ui/events/gesture_detection/gesture_detector.cc +++ b/ui/events/gesture_detection/gesture_detector.cc @@ -347,6 +347,24 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev) { return handled; } +void GestureDetector::SetDoubleTapListener( + DoubleTapListener* double_tap_listener) { + if (double_tap_listener == double_tap_listener_) + return; + + DCHECK(!is_double_tapping_); + + // Null'ing the double-tap listener should flush an active tap timeout. + if (!double_tap_listener) { + if (timeout_handler_->HasTimeout(TAP)) { + timeout_handler_->StopTimeout(TAP); + OnTapTimeout(); + } + } + + double_tap_listener_ = double_tap_listener; +} + void GestureDetector::Init(const Config& config) { DCHECK(listener_); diff --git a/ui/events/gesture_detection/gesture_detector.h b/ui/events/gesture_detection/gesture_detector.h index c09b31fd68..5fe6a27c82 100644 --- a/ui/events/gesture_detection/gesture_detector.h +++ b/ui/events/gesture_detection/gesture_detector.h @@ -93,10 +93,10 @@ class GestureDetector { bool OnTouchEvent(const MotionEvent& ev); - void set_doubletap_listener(DoubleTapListener* double_tap_listener) { - DCHECK(!is_double_tapping_ || double_tap_listener_); - double_tap_listener_ = double_tap_listener; - } + // Setting a valid |double_tap_listener| will enable double-tap detection, + // wherein calls to |OnSimpleTapConfirmed| are delayed by the tap timeout. + // Note: The listener must never be changed while |is_double_tapping| is true. + void SetDoubleTapListener(DoubleTapListener* double_tap_listener); bool has_doubletap_listener() const { return double_tap_listener_ != NULL; } diff --git a/ui/events/gesture_detection/gesture_event_data.cc b/ui/events/gesture_detection/gesture_event_data.cc index 0177d96557..9cd92b30f1 100644 --- a/ui/events/gesture_detection/gesture_event_data.cc +++ b/ui/events/gesture_detection/gesture_event_data.cc @@ -14,6 +14,7 @@ GestureEventData::GestureEventData(EventType type, float x, float y, int touch_point_count, + const gfx::RectF& bounding_box, const GestureEventDetails& details) : type(type), motion_event_id(motion_event_id), @@ -25,6 +26,7 @@ GestureEventData::GestureEventData(EventType type, DCHECK_NE(0, touch_point_count); DCHECK(ET_GESTURE_TYPE_START <= type && type <= ET_GESTURE_TYPE_END); this->details.set_touch_points(touch_point_count); + this->details.set_bounding_box(bounding_box); } GestureEventData::GestureEventData(EventType type, @@ -32,7 +34,8 @@ GestureEventData::GestureEventData(EventType type, base::TimeTicks time, float x, float y, - int touch_point_count) + int touch_point_count, + const gfx::RectF& bounding_box) : type(type), motion_event_id(motion_event_id), time(time), @@ -43,6 +46,7 @@ GestureEventData::GestureEventData(EventType type, DCHECK_NE(0, touch_point_count); DCHECK(ET_GESTURE_TYPE_START <= type && type <= ET_GESTURE_TYPE_END); details.set_touch_points(touch_point_count); + details.set_bounding_box(bounding_box); } GestureEventData::GestureEventData() : type(ET_UNKNOWN), x(0), y(0) {} diff --git a/ui/events/gesture_detection/gesture_event_data.h b/ui/events/gesture_detection/gesture_event_data.h index 4953284c76..c5e24e048a 100644 --- a/ui/events/gesture_detection/gesture_event_data.h +++ b/ui/events/gesture_detection/gesture_event_data.h @@ -21,6 +21,7 @@ struct GESTURE_DETECTION_EXPORT GestureEventData { float x, float y, int touch_point_count, + const gfx::RectF& bounding_box, const GestureEventDetails& details); GestureEventData(EventType type, @@ -28,7 +29,8 @@ struct GESTURE_DETECTION_EXPORT GestureEventData { base::TimeTicks time, float x, float y, - int touch_point_count); + int touch_point_count, + const gfx::RectF& bounding_box); EventType type; int motion_event_id; diff --git a/ui/events/gesture_detection/gesture_provider.cc b/ui/events/gesture_detection/gesture_provider.cc index d932a02ca5..84fb854aec 100644 --- a/ui/events/gesture_detection/gesture_provider.cc +++ b/ui/events/gesture_detection/gesture_provider.cc @@ -30,12 +30,25 @@ const char* GetMotionEventActionName(MotionEvent::Action action) { return ""; } +gfx::RectF GetBoundingBox(const MotionEvent& event) { + gfx::RectF bounds; + for (size_t i = 0; i < event.GetPointerCount(); ++i) { + float diameter = event.GetTouchMajor(i); + bounds.Union(gfx::RectF(event.GetX(i) - diameter / 2, + event.GetY(i) - diameter / 2, + diameter, + diameter)); + } + return bounds; +} + GestureEventData CreateGesture(EventType type, int motion_event_id, base::TimeTicks time, float x, float y, size_t touch_point_count, + const gfx::RectF& bounding_box, const GestureEventDetails& details) { return GestureEventData(type, motion_event_id, @@ -43,6 +56,7 @@ GestureEventData CreateGesture(EventType type, x, y, static_cast<int>(touch_point_count), + bounding_box, details); } @@ -51,9 +65,15 @@ GestureEventData CreateGesture(EventType type, base::TimeTicks time, float x, float y, - size_t touch_point_count) { - return GestureEventData( - type, motion_event_id, time, x, y, static_cast<int>(touch_point_count)); + size_t touch_point_count, + const gfx::RectF& bounding_box) { + return GestureEventData(type, + motion_event_id, + time, + x, + y, + static_cast<int>(touch_point_count), + bounding_box); } GestureEventData CreateGesture(EventType type, @@ -65,6 +85,7 @@ GestureEventData CreateGesture(EventType type, event.GetX(), event.GetY(), event.GetPointerCount(), + GetBoundingBox(event), details); } @@ -75,7 +96,8 @@ GestureEventData CreateGesture(EventType type, event.GetEventTime(), event.GetX(), event.GetY(), - event.GetPointerCount()); + event.GetPointerCount(), + GetBoundingBox(event)); } GestureEventDetails CreateTapGestureDetails(EventType type, @@ -84,8 +106,6 @@ GestureEventDetails CreateTapGestureDetails(EventType type, // consistent with double tap behavior on a mobile viewport. See // crbug.com/234986 for context. GestureEventDetails tap_details(type, 1, 0); - tap_details.set_bounding_box( - gfx::RectF(event.GetTouchMajor(), event.GetTouchMajor())); return tap_details; } @@ -142,7 +162,8 @@ class GestureProvider::ScaleGestureListenerImpl detector.GetEventTime(), 0, 0, - e.GetPointerCount())); + e.GetPointerCount(), + GetBoundingBox(e))); pinch_event_sent_ = false; } @@ -157,7 +178,8 @@ class GestureProvider::ScaleGestureListenerImpl detector.GetEventTime(), detector.GetFocusX(), detector.GetFocusY(), - e.GetPointerCount())); + e.GetPointerCount(), + GetBoundingBox(e))); } float scale = detector.GetScaleFactor(); @@ -183,6 +205,7 @@ class GestureProvider::ScaleGestureListenerImpl detector.GetFocusX(), detector.GetFocusY(), e.GetPointerCount(), + GetBoundingBox(e), pinch_details)); return true; } @@ -192,12 +215,12 @@ class GestureProvider::ScaleGestureListenerImpl scale_gesture_detector_.SetQuickScaleEnabled(enabled); } - void SetMultiTouchEnabled(bool value) { + void SetMultiTouchEnabled(bool enabled) { // Note that returning false from OnScaleBegin / OnScale makes the // gesture detector not to emit further scaling notifications // related to this gesture. Thus, if detector events are enabled in // the middle of the gesture, we don't need to do anything. - ignore_multitouch_events_ = value; + ignore_multitouch_events_ = !enabled; } bool IsDoubleTapInProgress() const { @@ -270,8 +293,6 @@ class GestureProvider::GestureListenerImpl seen_first_scroll_event_ = false; GestureEventDetails tap_details(ET_GESTURE_TAP_DOWN, 0, 0); - tap_details.set_bounding_box( - gfx::RectF(e.GetTouchMajor(), e.GetTouchMajor())); provider_->Send(CreateGesture(ET_GESTURE_TAP_DOWN, e, tap_details)); // Return true to indicate that we want to handle touch. @@ -320,6 +341,7 @@ class GestureProvider::GestureListenerImpl e1.GetX(), e1.GetY(), e2.GetPointerCount(), + GetBoundingBox(e2), scroll_details)); } @@ -351,9 +373,6 @@ class GestureProvider::GestureListenerImpl virtual void OnShowPress(const MotionEvent& e) OVERRIDE { GestureEventDetails show_press_details(ET_GESTURE_SHOW_PRESS, 0, 0); - // TODO(jdduke): Expose minor axis length and rotation in |MotionEvent|. - show_press_details.set_bounding_box( - gfx::RectF(e.GetTouchMajor(), e.GetTouchMajor())); provider_->Send( CreateGesture(ET_GESTURE_SHOW_PRESS, e, show_press_details)); } @@ -430,8 +449,6 @@ class GestureProvider::GestureListenerImpl SetIgnoreSingleTap(true); GestureEventDetails long_press_details(ET_GESTURE_LONG_PRESS, 0, 0); - long_press_details.set_bounding_box( - gfx::RectF(e.GetTouchMajor(), e.GetTouchMajor())); provider_->Send( CreateGesture(ET_GESTURE_LONG_PRESS, e, long_press_details)); @@ -443,16 +460,9 @@ class GestureProvider::GestureListenerImpl void SetDoubleTapEnabled(bool enabled) { DCHECK(!IsDoubleTapInProgress()); - if (enabled) { - gesture_detector_.set_doubletap_listener(this); - } else { - // TODO(jdduke): Send GESTURE_TAP if GESTURE_TAP_UNCONFIRMED already sent. - gesture_detector_.set_doubletap_listener(NULL); - } + gesture_detector_.SetDoubleTapListener(enabled ? this : NULL); } - bool IsClickDelayDisabled() const { return disable_click_delay_; } - bool IsDoubleTapInProgress() const { return gesture_detector_.is_double_tapping(); } @@ -526,24 +536,20 @@ bool GestureProvider::OnTouchEvent(const MotionEvent& event) { return true; } -void GestureProvider::ResetGestureDetectors() { - if (!current_down_event_) - return; - scoped_ptr<MotionEvent> cancel_event = current_down_event_->Cancel(); - gesture_listener_->OnTouchEvent(*cancel_event, false); - scale_gesture_listener_->OnTouchEvent(*cancel_event); -} - -void GestureProvider::SetMultiTouchSupportEnabled(bool enabled) { - scale_gesture_listener_->SetMultiTouchEnabled(!enabled); +void GestureProvider::SetMultiTouchZoomSupportEnabled(bool enabled) { + scale_gesture_listener_->SetMultiTouchEnabled(enabled); } void GestureProvider::SetDoubleTapSupportForPlatformEnabled(bool enabled) { + if (double_tap_support_for_platform_ == enabled) + return; double_tap_support_for_platform_ = enabled; UpdateDoubleTapDetectionSupport(); } void GestureProvider::SetDoubleTapSupportForPageEnabled(bool enabled) { + if (double_tap_support_for_page_ == enabled) + return; double_tap_support_for_page_ = enabled; UpdateDoubleTapDetectionSupport(); } @@ -561,14 +567,6 @@ bool GestureProvider::IsDoubleTapInProgress() const { scale_gesture_listener_->IsDoubleTapInProgress(); } -bool GestureProvider::IsDoubleTapSupported() const { - return double_tap_support_for_page_ && double_tap_support_for_platform_; -} - -bool GestureProvider::IsClickDelayDisabled() const { - return gesture_listener_->IsClickDelayDisabled(); -} - void GestureProvider::InitGestureDetectors(const Config& config) { TRACE_EVENT0("input", "GestureProvider::InitGestureDetectors"); gesture_listener_.reset( @@ -640,7 +638,8 @@ void GestureProvider::Send(const GestureEventData& gesture) { gesture.time, gesture.x, gesture.y, - gesture.details.touch_points())); + gesture.details.touch_points(), + gesture.details.bounding_box())); touch_scroll_in_progress_ = false; break; case ET_GESTURE_PINCH_BEGIN: @@ -651,7 +650,8 @@ void GestureProvider::Send(const GestureEventData& gesture) { gesture.time, gesture.x, gesture.y, - gesture.details.touch_points())); + gesture.details.touch_points(), + gesture.details.bounding_box())); pinch_in_progress_ = true; break; case ET_GESTURE_PINCH_END: @@ -676,8 +676,6 @@ bool GestureProvider::SendLongTapIfNecessary(const MotionEvent& event) { !current_longpress_time_.is_null() && !scale_gesture_listener_->IsScaleGestureDetectionInProgress()) { GestureEventDetails long_tap_details(ET_GESTURE_LONG_TAP, 0, 0); - long_tap_details.set_bounding_box( - gfx::RectF(event.GetTouchMajor(), event.GetTouchMajor())); Send(CreateGesture(ET_GESTURE_LONG_TAP, event, long_tap_details)); return true; } @@ -693,15 +691,6 @@ void GestureProvider::EndTouchScrollIfNecessary(const MotionEvent& event, touch_scroll_in_progress_ = false; } -void GestureProvider::UpdateDoubleTapDetectionSupport() { - if (current_down_event_ || IsDoubleTapInProgress()) - return; - - const bool supports_double_tap = IsDoubleTapSupported(); - gesture_listener_->SetDoubleTapEnabled(supports_double_tap); - scale_gesture_listener_->SetDoubleTapEnabled(supports_double_tap); -} - void GestureProvider::OnTouchEventHandlingBegin(const MotionEvent& event) { switch (event.GetAction()) { case MotionEvent::ACTION_DOWN: @@ -750,4 +739,17 @@ void GestureProvider::OnTouchEventHandlingEnd(const MotionEvent& event) { } } +void GestureProvider::UpdateDoubleTapDetectionSupport() { + // The GestureDetector requires that any provided DoubleTapListener remain + // attached to it for the duration of a touch sequence. Defer any potential + // null'ing of the listener until the sequence has ended. + if (current_down_event_) + return; + + const bool double_tap_enabled = double_tap_support_for_page_ && + double_tap_support_for_platform_; + gesture_listener_->SetDoubleTapEnabled(double_tap_enabled); + scale_gesture_listener_->SetDoubleTapEnabled(double_tap_enabled); +} + } // namespace ui diff --git a/ui/events/gesture_detection/gesture_provider.h b/ui/events/gesture_detection/gesture_provider.h index 41f09900e5..22558f198f 100644 --- a/ui/events/gesture_detection/gesture_provider.h +++ b/ui/events/gesture_detection/gesture_provider.h @@ -54,21 +54,15 @@ class GESTURE_DETECTION_EXPORT GestureProvider { // be handled. bool OnTouchEvent(const MotionEvent& event); - // Resets all gesture detectors; called on DidStartLoading(). - void ResetGestureDetectors(); + // Update whether multi-touch pinch zoom is supported by the platform. + void SetMultiTouchZoomSupportEnabled(bool enabled); - // Update whether multi-touch gestures are supported. - void SetMultiTouchSupportEnabled(bool enabled); - - // Update whether double-tap gestures are supported. This allows - // double-tap gesture suppression independent of whether or not the page's - // viewport and scale would normally prevent double-tap. - // Note: This should not be called while a double-tap gesture is in progress. + // Update whether double-tap gestures are supported by the platform. void SetDoubleTapSupportForPlatformEnabled(bool enabled); - // Update whether double-tap gesture detection should be suppressed due to - // the viewport or scale of the current page. Suppressing double-tap gesture - // detection allows for rapid and responsive single-tap gestures. + // Update whether double-tap gesture detection should be suppressed, e.g., + // if the page scale is fixed or the page has a mobile viewport. This disables + // the tap delay, allowing rapid and responsive single-tap gestures. void SetDoubleTapSupportForPageEnabled(bool enabled); // Whether a scroll gesture is in-progress. @@ -82,13 +76,6 @@ class GESTURE_DETECTION_EXPORT GestureProvider { // double-tap drag zoom). bool IsDoubleTapInProgress() const; - // Whether double-tap gesture detection is supported. - bool IsDoubleTapSupported() const; - - // Whether the tap gesture delay is explicitly disabled (independent of - // whether double-tap is supported), see |Config.disable_click_delay|. - bool IsClickDelayDisabled() const; - // May be NULL if there is no currently active touch sequence. const ui::MotionEvent* current_down_event() const { return current_down_event_.get(); diff --git a/ui/events/gesture_detection/gesture_provider_unittest.cc b/ui/events/gesture_detection/gesture_provider_unittest.cc index 5d9c664d02..9720a20153 100644 --- a/ui/events/gesture_detection/gesture_provider_unittest.cc +++ b/ui/events/gesture_detection/gesture_provider_unittest.cc @@ -26,6 +26,7 @@ const float kFakeCoordY = 24.f; const TimeDelta kOneSecond = TimeDelta::FromSeconds(1); const TimeDelta kOneMicrosecond = TimeDelta::FromMicroseconds(1); const TimeDelta kDeltaTimeForFlingSequences = TimeDelta::FromMilliseconds(5); +const float kMockTouchRadius = MockMotionEvent::TOUCH_MAJOR / 2; GestureProvider::Config CreateDefaultConfig() { GestureProvider::Config sConfig; @@ -44,6 +45,11 @@ GestureProvider::Config CreateDefaultConfig() { return sConfig; } +gfx::RectF BoundsForSingleMockTouchAtLocation(float x, float y) { + float diameter = MockMotionEvent::TOUCH_MAJOR; + return gfx::RectF(x - diameter / 2, y - diameter / 2, diameter, diameter); +} + } // namespace class GestureProviderTest : public testing::Test, public GestureProviderClient { @@ -75,7 +81,7 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient { // Test virtual void SetUp() OVERRIDE { gesture_provider_.reset(new GestureProvider(GetDefaultConfig(), this)); - gesture_provider_->SetMultiTouchSupportEnabled(false); + gesture_provider_->SetMultiTouchZoomSupportEnabled(false); } virtual void TearDown() OVERRIDE { @@ -110,7 +116,7 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient { return gestures_.back(); } - const EventType GetMostRecentGestureEventType() const { + EventType GetMostRecentGestureEventType() const { EXPECT_FALSE(gestures_.empty()); return gestures_.back().type; } @@ -147,7 +153,7 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient { GestureProvider::Config config = GetDefaultConfig(); config.gesture_begin_end_types_enabled = true; gesture_provider_.reset(new GestureProvider(config, this)); - gesture_provider_->SetMultiTouchSupportEnabled(false); + gesture_provider_->SetMultiTouchZoomSupportEnabled(false); } bool HasDownEvent() const { return gesture_provider_->current_down_event(); } @@ -177,6 +183,8 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient { EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN)); EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id); EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetMostRecentGestureEventType()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(scroll_to_x, scroll_to_y), + GetMostRecentGestureEvent().details.bounding_box()); ASSERT_EQ(3U, GetReceivedGestureCount()) << "Only TapDown, " "ScrollBegin and ScrollBy " "should have been sent"; @@ -196,6 +204,8 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient { EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType()); EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(scroll_to_x, scroll_to_y), + GetMostRecentGestureEvent().details.bounding_box()); } static void RunTasksAndWait(base::TimeDelta delay) { @@ -224,6 +234,8 @@ TEST_F(GestureProviderTest, GestureTapTap) { EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType()); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY), + GetMostRecentGestureEvent().details.bounding_box()); event = ObtainMotionEvent(event_time + kOneMicrosecond, MotionEvent::ACTION_UP); @@ -232,11 +244,11 @@ TEST_F(GestureProviderTest, GestureTapTap) { EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType()); // Ensure tap details have been set. - EXPECT_EQ(10, GetMostRecentGestureEvent().details.bounding_box().width()); - EXPECT_EQ(10, GetMostRecentGestureEvent().details.bounding_box().height()); EXPECT_EQ(1, GetMostRecentGestureEvent().details.tap_count()); EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY), + GetMostRecentGestureEvent().details.bounding_box()); } // Verify that a DOWN followed shortly by an UP will trigger @@ -255,6 +267,8 @@ TEST_F(GestureProviderTest, GestureTapTapWithDelay) { EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType()); EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY), + GetMostRecentGestureEvent().details.bounding_box()); event = ObtainMotionEvent(event_time + kOneMicrosecond, MotionEvent::ACTION_UP); @@ -263,11 +277,11 @@ TEST_F(GestureProviderTest, GestureTapTapWithDelay) { EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType()); // Ensure tap details have been set. - EXPECT_EQ(10, GetMostRecentGestureEvent().details.bounding_box().width()); - EXPECT_EQ(10, GetMostRecentGestureEvent().details.bounding_box().height()); EXPECT_EQ(1, GetMostRecentGestureEvent().details.tap_count()); EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY), + GetMostRecentGestureEvent().details.bounding_box()); EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_TAP)); } @@ -305,6 +319,9 @@ TEST_F(GestureProviderTest, GestureFlingAndCancelLongPress) { EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_LONG_PRESS)); + EXPECT_EQ( + BoundsForSingleMockTouchAtLocation(kFakeCoordX * 10, kFakeCoordY * 10), + GetMostRecentGestureEvent().details.bounding_box()); } // Verify that for a normal scroll the following events are sent: @@ -504,6 +521,8 @@ TEST_F(GestureProviderTest, DoubleTapDragZoomBasic) { EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN)); ASSERT_EQ(ET_GESTURE_PINCH_BEGIN, GetMostRecentGestureEventType()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY + 100), + GetMostRecentGestureEvent().details.bounding_box()); event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 2, MotionEvent::ACTION_MOVE, @@ -512,6 +531,8 @@ TEST_F(GestureProviderTest, DoubleTapDragZoomBasic) { EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); ASSERT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType()); EXPECT_LT(1.f, GetMostRecentGestureEvent().details.scale()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY + 200), + GetMostRecentGestureEvent().details.bounding_box()); event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 3, MotionEvent::ACTION_MOVE, @@ -520,6 +541,8 @@ TEST_F(GestureProviderTest, DoubleTapDragZoomBasic) { EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); ASSERT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType()); EXPECT_GT(1.f, GetMostRecentGestureEvent().details.scale()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY + 100), + GetMostRecentGestureEvent().details.bounding_box()); event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 4, MotionEvent::ACTION_UP, @@ -528,6 +551,8 @@ TEST_F(GestureProviderTest, DoubleTapDragZoomBasic) { EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_PINCH_END)); EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY - 200), + GetMostRecentGestureEvent().details.bounding_box()); } // Generate a scroll gesture and verify that the resulting scroll motion event @@ -696,11 +721,15 @@ TEST_F(GestureProviderTest, GestureLongTap) { EXPECT_EQ(ET_GESTURE_LONG_PRESS, GetMostRecentGestureEventType()); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY), + GetMostRecentGestureEvent().details.bounding_box()); event = ObtainMotionEvent(event_time + kOneSecond, MotionEvent::ACTION_UP); gesture_provider_->OnTouchEvent(event); EXPECT_EQ(ET_GESTURE_LONG_TAP, GetMostRecentGestureEventType()); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY), + GetMostRecentGestureEvent().details.bounding_box()); } TEST_F(GestureProviderTest, GestureLongPressDoesNotPreventScrolling) { @@ -862,15 +891,14 @@ TEST_F(GestureProviderTest, NoScrollWithinTouchSlop) { } TEST_F(GestureProviderTest, NoDoubleTapWhenExplicitlyDisabled) { + // Ensure that double-tap gestures can be disabled. gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false); base::TimeTicks event_time = base::TimeTicks::Now(); MockMotionEvent event = ObtainMotionEvent( event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY); EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); - EXPECT_EQ(1U, GetReceivedGestureCount()); EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType()); - EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); event = ObtainMotionEvent(event_time + kOneMicrosecond, MotionEvent::ACTION_UP, @@ -878,7 +906,6 @@ TEST_F(GestureProviderTest, NoDoubleTapWhenExplicitlyDisabled) { kFakeCoordY); EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType()); - EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); event = ObtainMotionEvent(event_time + kOneMicrosecond * 2, MotionEvent::ACTION_DOWN, @@ -886,7 +913,6 @@ TEST_F(GestureProviderTest, NoDoubleTapWhenExplicitlyDisabled) { kFakeCoordY); EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType()); - EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); event = ObtainMotionEvent(event_time + kOneMicrosecond * 3, MotionEvent::ACTION_UP, @@ -894,7 +920,86 @@ TEST_F(GestureProviderTest, NoDoubleTapWhenExplicitlyDisabled) { kFakeCoordY); EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType()); - EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + + // Ensure that double-tap gestures can be interrupted. + gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true); + + event_time = base::TimeTicks::Now(); + event = ObtainMotionEvent( + event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY); + EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); + EXPECT_EQ(5U, GetReceivedGestureCount()); + + event = ObtainMotionEvent(event_time + kOneMicrosecond, + MotionEvent::ACTION_UP, + kFakeCoordX, + kFakeCoordY); + EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); + EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType()); + + gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false); + EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType()); + + // Ensure that double-tap gestures can be resumed. + gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true); + + event = ObtainMotionEvent(event_time + kOneMicrosecond * 2, + MotionEvent::ACTION_DOWN, + kFakeCoordX, + kFakeCoordY); + EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); + EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType()); + + event = ObtainMotionEvent(event_time + kOneMicrosecond * 3, + MotionEvent::ACTION_UP, + kFakeCoordX, + kFakeCoordY); + EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); + EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType()); + + event = ObtainMotionEvent(event_time + kOneMicrosecond * 4, + MotionEvent::ACTION_DOWN, + kFakeCoordX, + kFakeCoordY); + EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); + EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType()); + + event = ObtainMotionEvent(event_time + kOneMicrosecond * 5, + MotionEvent::ACTION_UP, + kFakeCoordX, + kFakeCoordY); + EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); + EXPECT_EQ(ET_GESTURE_DOUBLE_TAP, GetMostRecentGestureEventType()); +} + +TEST_F(GestureProviderTest, NoDelayedTapWhenDoubleTapSupportToggled) { + gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true); + + base::TimeTicks event_time = base::TimeTicks::Now(); + MockMotionEvent event = ObtainMotionEvent( + event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY); + EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); + EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType()); + EXPECT_EQ(1U, GetReceivedGestureCount()); + + event = ObtainMotionEvent(event_time + kOneMicrosecond, + MotionEvent::ACTION_UP, + kFakeCoordX, + kFakeCoordY); + EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); + EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType()); + EXPECT_EQ(2U, GetReceivedGestureCount()); + + // Disabling double-tap during the tap timeout should flush the delayed tap. + gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false); + EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType()); + EXPECT_EQ(3U, GetReceivedGestureCount()); + + // No further timeout gestures should arrive. + const base::TimeDelta long_press_timeout = + GetLongPressTimeout() + GetShowPressTimeout() + kOneMicrosecond; + RunTasksAndWait(long_press_timeout); + EXPECT_EQ(3U, GetReceivedGestureCount()); } TEST_F(GestureProviderTest, NoDoubleTapDragZoomWhenDisabledOnPlatform) { @@ -1098,7 +1203,7 @@ TEST_F(GestureProviderTest, PinchZoom) { gesture_provider_->SetDoubleTapSupportForPageEnabled(false); gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true); - gesture_provider_->SetMultiTouchSupportEnabled(true); + gesture_provider_->SetMultiTouchZoomSupportEnabled(true); int secondary_coord_x = kFakeCoordX + 20 * touch_slop; int secondary_coord_y = kFakeCoordY + 20 * touch_slop; @@ -1109,6 +1214,8 @@ TEST_F(GestureProviderTest, PinchZoom) { EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType()); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY), + GetMostRecentGestureEvent().details.bounding_box()); // Toggling double-tap support should not take effect until the next sequence. gesture_provider_->SetDoubleTapSupportForPageEnabled(true); @@ -1124,6 +1231,8 @@ TEST_F(GestureProviderTest, PinchZoom) { gesture_provider_->OnTouchEvent(event); EXPECT_EQ(1U, GetReceivedGestureCount()); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY), + GetMostRecentGestureEvent().details.bounding_box()); secondary_coord_x += 5 * touch_slop; secondary_coord_y += 5 * touch_slop; @@ -1144,6 +1253,12 @@ TEST_F(GestureProviderTest, PinchZoom) { EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_PINCH_BEGIN)); EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN)); EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_UPDATE)); + EXPECT_EQ( + gfx::RectF(kFakeCoordX - kMockTouchRadius, + kFakeCoordY - kMockTouchRadius, + secondary_coord_x - kFakeCoordX + kMockTouchRadius * 2, + secondary_coord_y - kFakeCoordY + kMockTouchRadius * 2), + GetMostRecentGestureEvent().details.bounding_box()); secondary_coord_x += 2 * touch_slop; secondary_coord_y += 2 * touch_slop; @@ -1164,6 +1279,12 @@ TEST_F(GestureProviderTest, PinchZoom) { EXPECT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType()); EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points()); EXPECT_LT(1.f, GetMostRecentGestureEvent().details.scale()); + EXPECT_EQ( + gfx::RectF(kFakeCoordX - kMockTouchRadius, + kFakeCoordY - kMockTouchRadius, + secondary_coord_x - kFakeCoordX + kMockTouchRadius * 2, + secondary_coord_y - kFakeCoordY + kMockTouchRadius * 2), + GetMostRecentGestureEvent().details.bounding_box()); event = ObtainMotionEvent(event_time, MotionEvent::ACTION_POINTER_UP, @@ -1178,11 +1299,22 @@ TEST_F(GestureProviderTest, PinchZoom) { EXPECT_EQ(ET_GESTURE_PINCH_END, GetMostRecentGestureEventType()); EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points()); EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SCROLL_END)); + EXPECT_EQ( + gfx::RectF(kFakeCoordX - kMockTouchRadius, + kFakeCoordY - kMockTouchRadius, + secondary_coord_x - kFakeCoordX + kMockTouchRadius * 2, + secondary_coord_y - kFakeCoordY + kMockTouchRadius * 2), + GetMostRecentGestureEvent().details.bounding_box()); event = ObtainMotionEvent(event_time, MotionEvent::ACTION_UP); gesture_provider_->OnTouchEvent(event); EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType()); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(gfx::RectF(kFakeCoordX - kMockTouchRadius, + kFakeCoordY - kMockTouchRadius, + kMockTouchRadius * 2, + kMockTouchRadius * 2), + GetMostRecentGestureEvent().details.bounding_box()); } // Verify that the timer of LONG_PRESS will be cancelled when scrolling begins @@ -1319,6 +1451,11 @@ TEST_F(GestureProviderTest, GestureBeginAndEnd) { EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType()); EXPECT_EQ(2U, GetReceivedGestureCount()); EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points()); + EXPECT_EQ(gfx::RectF(kFakeCoordX - kMockTouchRadius, + kFakeCoordY - kMockTouchRadius, + kMockTouchRadius * 2, + kMockTouchRadius * 2), + GetMostRecentGestureEvent().details.bounding_box()); event = ObtainMotionEvent(event_time, MotionEvent::ACTION_POINTER_DOWN); event.pointer_count = 2; diff --git a/ui/events/gesture_detection/mock_motion_event.cc b/ui/events/gesture_detection/mock_motion_event.cc index cf293874ba..65bfe03136 100644 --- a/ui/events/gesture_detection/mock_motion_event.cc +++ b/ui/events/gesture_detection/mock_motion_event.cc @@ -9,9 +9,6 @@ using base::TimeTicks; namespace ui { -namespace { -const float kTouchMajor = 10.f; -} // namespace MockMotionEvent::MockMotionEvent() : action(ACTION_CANCEL), pointer_count(1), id(0) {} @@ -79,7 +76,7 @@ float MockMotionEvent::GetY(size_t pointer_index) const { } float MockMotionEvent::GetTouchMajor(size_t pointer_index) const { - return kTouchMajor; + return TOUCH_MAJOR; } float MockMotionEvent::GetPressure(size_t pointer_index) const { diff --git a/ui/events/gesture_detection/mock_motion_event.h b/ui/events/gesture_detection/mock_motion_event.h index 9793494e28..c9f43d93a1 100644 --- a/ui/events/gesture_detection/mock_motion_event.h +++ b/ui/events/gesture_detection/mock_motion_event.h @@ -11,6 +11,7 @@ namespace ui { struct MockMotionEvent : public MotionEvent { enum { MAX_POINTERS = 3 }; + enum { TOUCH_MAJOR = 10 }; MockMotionEvent(); explicit MockMotionEvent(Action action); @@ -54,7 +55,6 @@ struct MockMotionEvent : public MotionEvent { void MovePoint(size_t index, float x, float y); void ReleasePoint(); void CancelPoint(); - MotionEvent::Action action; size_t pointer_count; gfx::PointF points[MAX_POINTERS]; diff --git a/ui/events/gesture_detection/touch_disposition_gesture_filter.cc b/ui/events/gesture_detection/touch_disposition_gesture_filter.cc index 2e14aaf92a..d4ba635ac7 100644 --- a/ui/events/gesture_detection/touch_disposition_gesture_filter.cc +++ b/ui/events/gesture_detection/touch_disposition_gesture_filter.cc @@ -17,13 +17,15 @@ COMPILE_ASSERT(ET_GESTURE_TYPE_END - ET_GESTURE_TYPE_START < 32, GestureEventData CreateGesture(EventType type, int motion_event_id) { + GestureEventDetails details(type, 0, 0); return GestureEventData(type, motion_event_id, base::TimeTicks(), 0, 0, 1, - GestureEventDetails(type, 0, 0)); + gfx::RectF(0, 0, 0, 0), + details); } enum RequiredTouches { @@ -37,8 +39,8 @@ struct DispositionHandlingInfo { int required_touches; EventType antecedent_event_type; - DispositionHandlingInfo(int required_touches) - : required_touches(required_touches) {} + explicit DispositionHandlingInfo(int required_touches) + : required_touches(required_touches), antecedent_event_type(ET_UNKNOWN) {} DispositionHandlingInfo(int required_touches, EventType antecedent_event_type) @@ -104,6 +106,8 @@ DispositionHandlingInfo GetDispositionHandlingInfo(EventType type) { } int GetGestureTypeIndex(EventType type) { + DCHECK_GE(type, ET_GESTURE_TYPE_START); + DCHECK_LE(type, ET_GESTURE_TYPE_END); return type - ET_GESTURE_TYPE_START; } @@ -337,10 +341,13 @@ bool TouchDispositionGestureFilter::GestureHandlingState::Filter( GetDispositionHandlingInfo(gesture_type); int required_touches = disposition_handling_info.required_touches; + EventType antecedent_event_type = + disposition_handling_info.antecedent_event_type; if ((required_touches & RT_START && start_touch_consumed_) || (required_touches & RT_CURRENT && current_touch_consumed_) || - (last_gesture_of_type_dropped_.has_bit(GetGestureTypeIndex( - disposition_handling_info.antecedent_event_type)))) { + (antecedent_event_type != ET_UNKNOWN && + last_gesture_of_type_dropped_.has_bit( + GetGestureTypeIndex(antecedent_event_type)))) { last_gesture_of_type_dropped_.mark_bit(GetGestureTypeIndex(gesture_type)); return true; } diff --git a/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc b/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc index 837ec7df4d..d201c87f3a 100644 --- a/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc +++ b/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc @@ -168,7 +168,8 @@ class TouchDispositionGestureFilterTest } static GestureEventData CreateGesture(EventType type) { - return GestureEventData(type, 0, base::TimeTicks(), 0, 0, 1); + return GestureEventData( + type, 0, base::TimeTicks(), 0, 0, 1, gfx::RectF(0, 0, 0, 0)); } private: diff --git a/ui/events/gesture_event_details.cc b/ui/events/gesture_event_details.cc index ead9f4a59f..389a924962 100644 --- a/ui/events/gesture_event_details.cc +++ b/ui/events/gesture_event_details.cc @@ -95,17 +95,6 @@ GestureEventDetails::GestureEventDetails(ui::EventType type, } } -void GestureEventDetails::SetScrollVelocity(float velocity_x, - float velocity_y, - float velocity_x_ordinal, - float velocity_y_ordinal) { - CHECK_EQ(ui::ET_GESTURE_SCROLL_UPDATE, type_); - data.scroll_update.velocity_x = velocity_x; - data.scroll_update.velocity_y = velocity_y; - data.scroll_update.velocity_x_ordinal = velocity_x_ordinal; - data.scroll_update.velocity_y_ordinal = velocity_y_ordinal; -} - GestureEventDetails::Details::Details() { memset(this, 0, sizeof(Details)); } diff --git a/ui/events/gesture_event_details.h b/ui/events/gesture_event_details.h index c97ca84194..17c73acc6a 100644 --- a/ui/events/gesture_event_details.h +++ b/ui/events/gesture_event_details.h @@ -37,9 +37,6 @@ struct EVENTS_BASE_EXPORT GestureEventDetails { void set_bounding_box(const gfx::RectF& box) { bounding_box_ = box; } - void SetScrollVelocity(float velocity_x, float velocity_y, - float velocity_x_ordinal, float velocity_y_ordinal); - float scroll_x_hint() const { DCHECK_EQ(ui::ET_GESTURE_SCROLL_BEGIN, type_); return data.scroll_begin.x_hint; @@ -61,17 +58,13 @@ struct EVENTS_BASE_EXPORT GestureEventDetails { } float velocity_x() const { - DCHECK(type_ == ui::ET_GESTURE_SCROLL_UPDATE || - type_ == ui::ET_SCROLL_FLING_START); - return type_ == ui::ET_SCROLL_FLING_START ? data.fling_velocity.x : - data.scroll_update.velocity_x; + DCHECK(type_ == ui::ET_SCROLL_FLING_START); + return data.fling_velocity.x; } float velocity_y() const { - DCHECK(type_ == ui::ET_GESTURE_SCROLL_UPDATE || - type_ == ui::ET_SCROLL_FLING_START); - return type_ == ui::ET_SCROLL_FLING_START ? data.fling_velocity.y : - data.scroll_update.velocity_y; + DCHECK(type_ == ui::ET_SCROLL_FLING_START); + return data.fling_velocity.y; } // *_ordinal values are unmodified by rail based clamping. @@ -86,19 +79,13 @@ struct EVENTS_BASE_EXPORT GestureEventDetails { } float velocity_x_ordinal() const { - DCHECK(type_ == ui::ET_GESTURE_SCROLL_UPDATE || - type_ == ui::ET_SCROLL_FLING_START); - return type_ == ui::ET_SCROLL_FLING_START ? - data.fling_velocity.x_ordinal : - data.scroll_update.velocity_x_ordinal; + DCHECK(type_ == ui::ET_SCROLL_FLING_START); + return data.fling_velocity.x_ordinal; } float velocity_y_ordinal() const { - DCHECK(type_ == ui::ET_GESTURE_SCROLL_UPDATE || - type_ == ui::ET_SCROLL_FLING_START); - return type_ == ui::ET_SCROLL_FLING_START ? - data.fling_velocity.y_ordinal : - data.scroll_update.velocity_y_ordinal; + DCHECK(type_ == ui::ET_SCROLL_FLING_START); + return data.fling_velocity.y_ordinal; } float first_finger_width() const { @@ -157,12 +144,8 @@ struct EVENTS_BASE_EXPORT GestureEventDetails { struct { // SCROLL delta. float x; float y; - float velocity_x; - float velocity_y; float x_ordinal; float y_ordinal; - float velocity_x_ordinal; - float velocity_y_ordinal; } scroll_update; float scale; // PINCH scale. diff --git a/ui/events/gestures/gesture_sequence.cc b/ui/events/gestures/gesture_sequence.cc index f0513dd7a1..d9a5e68a72 100644 --- a/ui/events/gestures/gesture_sequence.cc +++ b/ui/events/gestures/gesture_sequence.cc @@ -1055,11 +1055,6 @@ void GestureSequence::AppendScrollGestureUpdate(GesturePoint& point, GestureEventDetails details(ui::ET_GESTURE_SCROLL_UPDATE, d.x(), d.y(), o.x(), o.y()); - details.SetScrollVelocity( - scroll_type_ == ST_VERTICAL ? 0 : point.XVelocity(), - scroll_type_ == ST_HORIZONTAL ? 0 : point.YVelocity(), - point.XVelocity(), - point.YVelocity()); gestures->push_back(CreateGestureEvent( details, location, @@ -1423,7 +1418,6 @@ bool GestureSequence::MaybeSwipe(const TouchEvent& event, } float min_velocity = GestureConfiguration::min_swipe_speed(); - min_velocity *= min_velocity; velocity_x = fabs(velocity_x / point_count_); velocity_y = fabs(velocity_y / point_count_); diff --git a/ui/events/ozone/evdev/event_converter_evdev.cc b/ui/events/ozone/evdev/event_converter_evdev.cc index d3d9aedad8..0a54fc4c22 100644 --- a/ui/events/ozone/evdev/event_converter_evdev.cc +++ b/ui/events/ozone/evdev/event_converter_evdev.cc @@ -11,6 +11,9 @@ namespace ui { EventConverterEvdev::EventConverterEvdev() {} +EventConverterEvdev::EventConverterEvdev(const EventDispatchCallback& callback) + : dispatch_callback_(callback) {} + EventConverterEvdev::~EventConverterEvdev() {} void EventConverterEvdev::DispatchEventToCallback(ui::Event* event) { diff --git a/ui/events/ozone/evdev/event_converter_evdev.h b/ui/events/ozone/evdev/event_converter_evdev.h index 5dd9988f81..7f6223d854 100644 --- a/ui/events/ozone/evdev/event_converter_evdev.h +++ b/ui/events/ozone/evdev/event_converter_evdev.h @@ -15,16 +15,15 @@ namespace ui { class Event; class EventModifiersEvdev; +typedef base::Callback<void(Event*)> EventDispatchCallback; + // Base class for device-specific evdev event conversion. class EVENTS_EXPORT EventConverterEvdev { public: EventConverterEvdev(); + explicit EventConverterEvdev(const EventDispatchCallback& callback); virtual ~EventConverterEvdev(); - void SetDispatchCallback(base::Callback<void(void*)> callback) { - dispatch_callback_ = callback; - } - // Start converting events. virtual void Start() = 0; @@ -37,7 +36,7 @@ class EVENTS_EXPORT EventConverterEvdev { virtual void DispatchEventToCallback(ui::Event* event); private: - base::Callback<void(void*)> dispatch_callback_; + EventDispatchCallback dispatch_callback_; DISALLOW_COPY_AND_ASSIGN(EventConverterEvdev); }; diff --git a/ui/events/ozone/evdev/event_device_info.cc b/ui/events/ozone/evdev/event_device_info.cc index 858f57c1af..2734b9d2f4 100644 --- a/ui/events/ozone/evdev/event_device_info.cc +++ b/ui/events/ozone/evdev/event_device_info.cc @@ -149,4 +149,41 @@ int32 EventDeviceInfo::GetAbsMaximum(unsigned int code) const { return abs_info_[code].maximum; } +bool EventDeviceInfo::HasAbsXY() const { + if (HasAbsEvent(ABS_X) && HasAbsEvent(ABS_Y)) + return true; + + if (HasAbsEvent(ABS_MT_POSITION_X) && HasAbsEvent(ABS_MT_POSITION_Y)) + return true; + + return false; +} + +bool EventDeviceInfo::HasRelXY() const { + return HasRelEvent(REL_X) && HasRelEvent(REL_Y); +} + +bool EventDeviceInfo::IsMappedToScreen() const { + // Device position is mapped directly to the screen. + if (HasProp(INPUT_PROP_DIRECT)) + return true; + + // Device position moves the cursor. + if (HasProp(INPUT_PROP_POINTER)) + return false; + + // Tablets are mapped to the screen. + if (HasKeyEvent(BTN_TOOL_PEN) || HasKeyEvent(BTN_STYLUS) || + HasKeyEvent(BTN_STYLUS2)) + return true; + + // Touchpads are not mapped to the screen. + if (HasKeyEvent(BTN_LEFT) || HasKeyEvent(BTN_MIDDLE) || + HasKeyEvent(BTN_RIGHT) || HasKeyEvent(BTN_TOOL_FINGER)) + return false; + + // Touchscreens are mapped to the screen. + return true; +} + } // namespace ui diff --git a/ui/events/ozone/evdev/event_device_info.h b/ui/events/ozone/evdev/event_device_info.h index 284d1e83cc..309ee38489 100644 --- a/ui/events/ozone/evdev/event_device_info.h +++ b/ui/events/ozone/evdev/event_device_info.h @@ -44,6 +44,16 @@ class EVENTS_EXPORT EventDeviceInfo { // Check input device properties. bool HasProp(unsigned int code) const; + // Has absolute X & Y axes. + bool HasAbsXY() const; + + // Has relativeX & Y axes. + bool HasRelXY() const; + + // Determine whether absolute device X/Y coordinates are mapped onto the + // screen. This is the case for touchscreens and tablets but not touchpads. + bool IsMappedToScreen() const; + private: unsigned long ev_bits_[EVDEV_BITS_TO_LONGS(EV_CNT)]; unsigned long key_bits_[EVDEV_BITS_TO_LONGS(KEY_CNT)]; diff --git a/ui/events/ozone/evdev/event_factory_evdev.cc b/ui/events/ozone/evdev/event_factory_evdev.cc index 78d34b8cdc..a36d9e7118 100644 --- a/ui/events/ozone/evdev/event_factory_evdev.cc +++ b/ui/events/ozone/evdev/event_factory_evdev.cc @@ -20,6 +20,11 @@ #include "ui/events/ozone/evdev/device_manager_udev.h" #endif +#if defined(USE_EVDEV_GESTURES) +#include "ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h" +#include "ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h" +#endif + #ifndef EVIOCSCLOCKID #define EVIOCSCLOCKID _IOW('E', 0xa0, int) #endif @@ -28,16 +33,49 @@ namespace ui { namespace { -bool IsTouchPad(const EventDeviceInfo& devinfo) { - if (!devinfo.HasEventType(EV_ABS)) - return false; +#if defined(USE_EVDEV_GESTURES) +bool UseGesturesLibraryForDevice(const EventDeviceInfo& devinfo) { + if (devinfo.HasAbsXY() && !devinfo.IsMappedToScreen()) + return true; // touchpad + + if (devinfo.HasRelXY()) + return true; // mouse - return devinfo.HasKeyEvent(BTN_LEFT) || devinfo.HasKeyEvent(BTN_MIDDLE) || - devinfo.HasKeyEvent(BTN_RIGHT) || devinfo.HasKeyEvent(BTN_TOOL_FINGER); + return false; } +#endif + +scoped_ptr<EventConverterEvdev> CreateConverter( + int fd, + const base::FilePath& path, + const EventDeviceInfo& devinfo, + const EventDispatchCallback& dispatch, + EventModifiersEvdev* modifiers, + CursorDelegateEvdev* cursor) { +#if defined(USE_EVDEV_GESTURES) + // Touchpad or mouse: use gestures library. + // EventReaderLibevdevCros -> GestureInterpreterLibevdevCros -> DispatchEvent + if (UseGesturesLibraryForDevice(devinfo)) { + scoped_ptr<GestureInterpreterLibevdevCros> gesture_interp = make_scoped_ptr( + new GestureInterpreterLibevdevCros(modifiers, cursor, dispatch)); + scoped_ptr<EventReaderLibevdevCros> libevdev_reader = + make_scoped_ptr(new EventReaderLibevdevCros( + fd, + path, + gesture_interp.PassAs<EventReaderLibevdevCros::Delegate>())); + return libevdev_reader.PassAs<EventConverterEvdev>(); + } +#endif + + // Touchscreen: use TouchEventConverterEvdev. + scoped_ptr<EventConverterEvdev> converter; + if (devinfo.HasAbsXY()) + return make_scoped_ptr<EventConverterEvdev>( + new TouchEventConverterEvdev(fd, path, devinfo, dispatch)); -bool IsTouchScreen(const EventDeviceInfo& devinfo) { - return devinfo.HasEventType(EV_ABS) && !IsTouchPad(devinfo); + // Everything else: use KeyEventConverterEvdev. + return make_scoped_ptr<EventConverterEvdev>( + new KeyEventConverterEvdev(fd, path, modifiers, dispatch)); } // Open an input device. Opening may put the calling thread to sleep, and @@ -51,6 +89,7 @@ void OpenInputDevice( EventModifiersEvdev* modifiers, CursorDelegateEvdev* cursor, scoped_refptr<base::TaskRunner> reply_runner, + const EventDispatchCallback& dispatch, base::Callback<void(scoped_ptr<EventConverterEvdev>)> reply_callback) { TRACE_EVENT1("ozone", "OpenInputDevice", "path", path.value()); @@ -74,26 +113,12 @@ void OpenInputDevice( return; } - if (IsTouchPad(devinfo)) { - LOG(WARNING) << "touchpad device not supported: " << path.value(); - close(fd); - return; - } - - // TODO(spang) Add more device types. - scoped_ptr<EventConverterEvdev> converter; - if (IsTouchScreen(devinfo)) - converter.reset(new TouchEventConverterEvdev(fd, path, devinfo)); - else if (devinfo.HasEventType(EV_KEY)) - converter.reset(new KeyEventConverterEvdev(fd, path, modifiers)); + scoped_ptr<EventConverterEvdev> converter = + CreateConverter(fd, path, devinfo, dispatch, modifiers, cursor); - if (converter) { - // Reply with the constructed converter. - reply_runner->PostTask( - FROM_HERE, base::Bind(reply_callback, base::Passed(&converter))); - } else { - close(fd); - } + // Reply with the constructed converter. + reply_runner->PostTask(FROM_HERE, + base::Bind(reply_callback, base::Passed(&converter))); } // Close an input device. Closing may put the calling thread to sleep, and @@ -111,16 +136,26 @@ EventFactoryEvdev::EventFactoryEvdev() : ui_task_runner_(base::MessageLoopProxy::current()), file_task_runner_(base::MessageLoopProxy::current()), cursor_(NULL), + dispatch_callback_( + base::Bind(base::IgnoreResult(&EventFactoryEvdev::DispatchUiEvent), + base::Unretained(this))), weak_ptr_factory_(this) {} EventFactoryEvdev::EventFactoryEvdev(CursorDelegateEvdev* cursor) : ui_task_runner_(base::MessageLoopProxy::current()), file_task_runner_(base::MessageLoopProxy::current()), cursor_(cursor), + dispatch_callback_( + base::Bind(base::IgnoreResult(&EventFactoryEvdev::DispatchUiEvent), + base::Unretained(this))), weak_ptr_factory_(this) {} EventFactoryEvdev::~EventFactoryEvdev() { STLDeleteValues(&converters_); } +void EventFactoryEvdev::DispatchUiEvent(Event* event) { + EventFactoryOzone::DispatchEvent(event); +} + void EventFactoryEvdev::AttachInputDevice( const base::FilePath& path, scoped_ptr<EventConverterEvdev> converter) { @@ -134,9 +169,6 @@ void EventFactoryEvdev::AttachInputDevice( // Add initialized device to map. converters_[path] = converter.release(); - converters_[path]->SetDispatchCallback( - base::Bind(base::IgnoreResult(&EventFactoryEvdev::DispatchEvent), - base::Unretained(this))); converters_[path]->Start(); } @@ -151,6 +183,7 @@ void EventFactoryEvdev::OnDeviceAdded(const base::FilePath& path) { &modifiers_, cursor_, ui_task_runner_, + dispatch_callback_, base::Bind(&EventFactoryEvdev::AttachInputDevice, weak_ptr_factory_.GetWeakPtr(), path))); diff --git a/ui/events/ozone/evdev/event_factory_evdev.h b/ui/events/ozone/evdev/event_factory_evdev.h index 39d61ba580..b1802fdbad 100644 --- a/ui/events/ozone/evdev/event_factory_evdev.h +++ b/ui/events/ozone/evdev/event_factory_evdev.h @@ -27,6 +27,8 @@ class EVENTS_EXPORT EventFactoryEvdev : public EventFactoryOzone { explicit EventFactoryEvdev(CursorDelegateEvdev* cursor); virtual ~EventFactoryEvdev(); + void DispatchUiEvent(Event* event); + // EventFactoryOzone: virtual void StartProcessingEvents() OVERRIDE; virtual void SetFileTaskRunner(scoped_refptr<base::TaskRunner> task_runner) @@ -66,6 +68,9 @@ class EVENTS_EXPORT EventFactoryEvdev : public EventFactoryOzone { // Cursor movement. CursorDelegateEvdev* cursor_; + // Dispatch callback for events. + EventDispatchCallback dispatch_callback_; + // Support weak pointers for attach & detach callbacks. base::WeakPtrFactory<EventFactoryEvdev> weak_ptr_factory_; diff --git a/ui/events/ozone/evdev/event_modifiers_evdev.cc b/ui/events/ozone/evdev/event_modifiers_evdev.cc index 05d4bd6d14..d867b5eef7 100644 --- a/ui/events/ozone/evdev/event_modifiers_evdev.cc +++ b/ui/events/ozone/evdev/event_modifiers_evdev.cc @@ -71,4 +71,9 @@ void EventModifiersEvdev::UpdateFlags(unsigned int modifier) { int EventModifiersEvdev::GetModifierFlags() { return modifier_flags_; } +// static +int EventModifiersEvdev::GetEventFlagFromModifier(unsigned int modifier) { + return kEventFlagFromModifiers[modifier]; +} + } // namespace ui diff --git a/ui/events/ozone/evdev/event_modifiers_evdev.h b/ui/events/ozone/evdev/event_modifiers_evdev.h index 4b8f21a76a..e767758519 100644 --- a/ui/events/ozone/evdev/event_modifiers_evdev.h +++ b/ui/events/ozone/evdev/event_modifiers_evdev.h @@ -53,6 +53,9 @@ class EVENTS_EXPORT EventModifiersEvdev { // Return current flags to use for incoming events. int GetModifierFlags(); + // Return the mask for the specified modifier. + static int GetEventFlagFromModifier(unsigned int modifier); + private: // Count of keys pressed for each modifier. int modifiers_down_[EVDEV_NUM_MODIFIERS]; diff --git a/ui/events/ozone/evdev/key_event_converter_evdev.cc b/ui/events/ozone/evdev/key_event_converter_evdev.cc index e17498c7e5..6f990d42a7 100644 --- a/ui/events/ozone/evdev/key_event_converter_evdev.cc +++ b/ui/events/ozone/evdev/key_event_converter_evdev.cc @@ -187,10 +187,15 @@ bool IsLockButton(unsigned int code) { return code == KEY_CAPSLOCK; } } // namespace -KeyEventConverterEvdev::KeyEventConverterEvdev(int fd, - base::FilePath path, - EventModifiersEvdev* modifiers) - : fd_(fd), path_(path), modifiers_(modifiers) { +KeyEventConverterEvdev::KeyEventConverterEvdev( + int fd, + base::FilePath path, + EventModifiersEvdev* modifiers, + const EventDispatchCallback& callback) + : EventConverterEvdev(callback), + fd_(fd), + path_(path), + modifiers_(modifiers) { // TODO(spang): Initialize modifiers using EVIOCGKEY. } diff --git a/ui/events/ozone/evdev/key_event_converter_evdev.h b/ui/events/ozone/evdev/key_event_converter_evdev.h index a30c58c598..ea0d983275 100644 --- a/ui/events/ozone/evdev/key_event_converter_evdev.h +++ b/ui/events/ozone/evdev/key_event_converter_evdev.h @@ -22,7 +22,8 @@ class EVENTS_EXPORT KeyEventConverterEvdev public: KeyEventConverterEvdev(int fd, base::FilePath path, - EventModifiersEvdev* modifiers); + EventModifiersEvdev* modifiers, + const EventDispatchCallback& dispatch); virtual ~KeyEventConverterEvdev(); // Start & stop watching for events. diff --git a/ui/events/ozone/evdev/key_event_converter_evdev_unittest.cc b/ui/events/ozone/evdev/key_event_converter_evdev_unittest.cc index 52cc62e2d8..88ee64609e 100644 --- a/ui/events/ozone/evdev/key_event_converter_evdev_unittest.cc +++ b/ui/events/ozone/evdev/key_event_converter_evdev_unittest.cc @@ -19,7 +19,10 @@ const char kTestDevicePath[] = "/dev/input/test-device"; class MockKeyEventConverterEvdev : public KeyEventConverterEvdev { public: MockKeyEventConverterEvdev(int fd, EventModifiersEvdev* modifiers) - : KeyEventConverterEvdev(fd, base::FilePath(kTestDevicePath), modifiers) { + : KeyEventConverterEvdev(fd, + base::FilePath(kTestDevicePath), + modifiers, + EventDispatchCallback()) { Start(); } virtual ~MockKeyEventConverterEvdev() {}; diff --git a/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc b/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc new file mode 100644 index 0000000000..86f8834d38 --- /dev/null +++ b/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc @@ -0,0 +1,107 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h" + +#include <errno.h> +#include <libevdev/libevdev.h> +#include <linux/input.h> + +#include "base/message_loop/message_loop.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" + +namespace ui { + +namespace { + +std::string FormatLog(const char* fmt, va_list args) { + std::string msg = base::StringPrintV(fmt, args); + if (!msg.empty() && msg[msg.size() - 1] == '\n') + msg.erase(msg.end() - 1, msg.end()); + return msg; +} + +} // namespace + +EventReaderLibevdevCros::EventReaderLibevdevCros(int fd, + const base::FilePath& path, + scoped_ptr<Delegate> delegate) + : path_(path), delegate_(delegate.Pass()) { + memset(&evdev_, 0, sizeof(evdev_)); + evdev_.log = OnLogMessage; + evdev_.log_udata = this; + evdev_.syn_report = OnSynReport; + evdev_.syn_report_udata = this; + evdev_.fd = fd; + + memset(&evstate_, 0, sizeof(evstate_)); + evdev_.evstate = &evstate_; + Event_Init(&evdev_); + + Event_Open(&evdev_); + + delegate_->OnLibEvdevCrosOpen(&evdev_, &evstate_); +} + +EventReaderLibevdevCros::~EventReaderLibevdevCros() { + Stop(); + EvdevClose(&evdev_); +} + +EventReaderLibevdevCros::Delegate::~Delegate() {} + +void EventReaderLibevdevCros::Start() { + base::MessageLoopForUI::current()->WatchFileDescriptor( + evdev_.fd, + true, + base::MessagePumpLibevent::WATCH_READ, + &controller_, + this); +} + +void EventReaderLibevdevCros::Stop() { + controller_.StopWatchingFileDescriptor(); +} + +void EventReaderLibevdevCros::OnFileCanReadWithoutBlocking(int fd) { + if (EvdevRead(&evdev_)) { + if (errno == EINTR || errno == EAGAIN) + return; + if (errno != ENODEV) + PLOG(ERROR) << "error reading device " << path_.value(); + Stop(); + return; + } +} + +void EventReaderLibevdevCros::OnFileCanWriteWithoutBlocking(int fd) { + NOTREACHED(); +} + +// static +void EventReaderLibevdevCros::OnSynReport(void* data, + EventStateRec* evstate, + struct timeval* tv) { + EventReaderLibevdevCros* reader = static_cast<EventReaderLibevdevCros*>(data); + reader->delegate_->OnLibEvdevCrosEvent(&reader->evdev_, evstate, *tv); +} + +// static +void EventReaderLibevdevCros::OnLogMessage(void* data, + int level, + const char* fmt, + ...) { + va_list args; + va_start(args, fmt); + if (level >= LOGLEVEL_ERROR) + LOG(ERROR) << "libevdev: " << FormatLog(fmt, args); + else if (level >= LOGLEVEL_WARNING) + LOG(WARNING) << "libevdev: " << FormatLog(fmt, args); + else + VLOG(3) << "libevdev: " << FormatLog(fmt, args); + va_end(args); +} + +} // namespace ui diff --git a/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h b/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h new file mode 100644 index 0000000000..1631c5b685 --- /dev/null +++ b/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h @@ -0,0 +1,78 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_EVENT_READER_LIBEVDEV_CROS_H_ +#define UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_EVENT_READER_LIBEVDEV_CROS_H_ + +#include <libevdev/libevdev.h> + +#include "base/files/file_path.h" +#include "base/message_loop/message_loop.h" +#include "ui/events/ozone/evdev/event_converter_evdev.h" + +namespace ui { + +// Basic wrapper for libevdev-cros. +// +// This drives libevdev-cros from a file descriptor and calls delegate +// with the updated event state from libevdev-cros. +// +// The library doesn't support all devices currently. In particular there +// is no support for keyboard events. +class EventReaderLibevdevCros : public base::MessagePumpLibevent::Watcher, + public EventConverterEvdev { + public: + class Delegate { + public: + virtual ~Delegate(); + + // Notifier for open. This is called with the initial event state. + virtual void OnLibEvdevCrosOpen(Evdev* evdev, EventStateRec* evstate) = 0; + + // Notifier for event. This is called with the updated event state. + virtual void OnLibEvdevCrosEvent(Evdev* evdev, + EventStateRec* state, + const timeval& time) = 0; + }; + + EventReaderLibevdevCros(int fd, + const base::FilePath& path, + scoped_ptr<Delegate> delegate); + ~EventReaderLibevdevCros(); + + // Overridden from ui::EventDeviceEvdev. + void Start() OVERRIDE; + void Stop() OVERRIDE; + + // Overidden from MessagePumpLibevent::Watcher. + virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE; + virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE; + + private: + static void OnSynReport(void* data, + EventStateRec* evstate, + struct timeval* tv); + static void OnLogMessage(void*, int level, const char*, ...); + + // Libevdev state. + Evdev evdev_; + + // Event state. + EventStateRec evstate_; + + // Path to input device. + base::FilePath path_; + + // Delegate for event processing. + scoped_ptr<Delegate> delegate_; + + // Controller for watching the input fd. + base::MessagePumpLibevent::FileDescriptorWatcher controller_; + + DISALLOW_COPY_AND_ASSIGN(EventReaderLibevdevCros); +}; + +} // namspace ui + +#endif // UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_EVENT_READER_LIBEVDEV_CROS_H_ diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc new file mode 100644 index 0000000000..503155a7c4 --- /dev/null +++ b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc @@ -0,0 +1,266 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h" + +#include <gestures/gestures.h> +#include <libevdev/libevdev.h> + +#include "base/strings/stringprintf.h" +#include "base/timer/timer.h" +#include "ui/events/event.h" +#include "ui/events/ozone/evdev/cursor_delegate_evdev.h" +#include "ui/events/ozone/evdev/event_modifiers_evdev.h" +#include "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h" +#include "ui/gfx/geometry/point_f.h" + +namespace ui { + +namespace { + +// Convert libevdev device class to libgestures device class. +GestureInterpreterDeviceClass GestureDeviceClass(Evdev* evdev) { + switch (evdev->info.evdev_class) { + case EvdevClassMouse: + return GESTURES_DEVCLASS_MOUSE; + case EvdevClassMultitouchMouse: + return GESTURES_DEVCLASS_MULTITOUCH_MOUSE; + case EvdevClassTouchpad: + return GESTURES_DEVCLASS_TOUCHPAD; + case EvdevClassTouchscreen: + return GESTURES_DEVCLASS_TOUCHSCREEN; + default: + return GESTURES_DEVCLASS_UNKNOWN; + } +} + +// Convert libevdev state to libgestures hardware properties. +HardwareProperties GestureHardwareProperties(Evdev* evdev) { + HardwareProperties hwprops; + hwprops.left = Event_Get_Left(evdev); + hwprops.top = Event_Get_Top(evdev); + hwprops.right = Event_Get_Right(evdev); + hwprops.bottom = Event_Get_Bottom(evdev); + hwprops.res_x = Event_Get_Res_X(evdev); + hwprops.res_y = Event_Get_Res_Y(evdev); + hwprops.screen_x_dpi = 133; + hwprops.screen_y_dpi = 133; + hwprops.orientation_minimum = Event_Get_Orientation_Minimum(evdev); + hwprops.orientation_maximum = Event_Get_Orientation_Maximum(evdev); + hwprops.max_finger_cnt = Event_Get_Slot_Count(evdev); + hwprops.max_touch_cnt = Event_Get_Touch_Count_Max(evdev); + hwprops.supports_t5r2 = Event_Get_T5R2(evdev); + hwprops.support_semi_mt = Event_Get_Semi_MT(evdev); + /* buttonpad means a physical button under the touch surface */ + hwprops.is_button_pad = Event_Get_Button_Pad(evdev); + return hwprops; +} + +// Callback from libgestures when a gesture is ready. +void OnGestureReadyHelper(void* client_data, const Gesture* gesture) { + GestureInterpreterLibevdevCros* interpreter = + static_cast<GestureInterpreterLibevdevCros*>(client_data); + interpreter->OnGestureReady(gesture); +} + +// Convert gestures timestamp (stime_t) to ui::Event timestamp. +base::TimeDelta StimeToTimedelta(stime_t timestamp) { + return base::TimeDelta::FromMicroseconds(timestamp * + base::Time::kMicrosecondsPerSecond); +} + +// Number of fingers for scroll gestures. +const int kGestureScrollFingerCount = 2; + +} // namespace + +GestureInterpreterLibevdevCros::GestureInterpreterLibevdevCros( + EventModifiersEvdev* modifiers, + CursorDelegateEvdev* cursor, + const EventDispatchCallback& callback) + : modifiers_(modifiers), + cursor_(cursor), + dispatch_callback_(callback), + interpreter_(NULL) {} + +GestureInterpreterLibevdevCros::~GestureInterpreterLibevdevCros() { + if (interpreter_) { + DeleteGestureInterpreter(interpreter_); + interpreter_ = NULL; + } +} + +void GestureInterpreterLibevdevCros::OnLibEvdevCrosOpen( + Evdev* evdev, + EventStateRec* evstate) { + CHECK(evdev->info.is_monotonic) << "libevdev must use monotonic timestamps"; + VLOG(9) << "HACK DO NOT REMOVE OR LINK WILL FAIL" << (void*)gestures_log; + + HardwareProperties hwprops = GestureHardwareProperties(evdev); + GestureInterpreterDeviceClass devclass = GestureDeviceClass(evdev); + + // Create & initialize GestureInterpreter. + CHECK(!interpreter_); + interpreter_ = NewGestureInterpreter(); + GestureInterpreterInitialize(interpreter_, devclass); + GestureInterpreterSetHardwareProperties(interpreter_, &hwprops); + GestureInterpreterSetTimerProvider( + interpreter_, + const_cast<GesturesTimerProvider*>(&kGestureTimerProvider), + this); + GestureInterpreterSetCallback(interpreter_, OnGestureReadyHelper, this); +} + +void GestureInterpreterLibevdevCros::OnLibEvdevCrosEvent(Evdev* evdev, + EventStateRec* evstate, + const timeval& time) { + HardwareState hwstate; + memset(&hwstate, 0, sizeof(hwstate)); + hwstate.timestamp = StimeFromTimeval(&time); + + // Mouse. + hwstate.rel_x = evstate->rel_x; + hwstate.rel_y = evstate->rel_y; + hwstate.rel_wheel = evstate->rel_wheel; + hwstate.rel_hwheel = evstate->rel_hwheel; + + // Touch. + FingerState fingers[Event_Get_Slot_Count(evdev)]; + memset(&fingers, 0, sizeof(fingers)); + int current_finger = 0; + for (int i = 0; i < evstate->slot_count; i++) { + MtSlotPtr slot = &evstate->slots[i]; + if (slot->tracking_id == -1) + continue; + fingers[current_finger].touch_major = slot->touch_major; + fingers[current_finger].touch_minor = slot->touch_minor; + fingers[current_finger].width_major = slot->width_major; + fingers[current_finger].width_minor = slot->width_minor; + fingers[current_finger].pressure = slot->pressure; + fingers[current_finger].orientation = slot->orientation; + fingers[current_finger].position_x = slot->position_x; + fingers[current_finger].position_y = slot->position_y; + fingers[current_finger].tracking_id = slot->tracking_id; + current_finger++; + } + hwstate.touch_cnt = Event_Get_Touch_Count(evdev); + hwstate.finger_cnt = current_finger; + hwstate.fingers = fingers; + + // Buttons. + if (Event_Get_Button_Left(evdev)) + hwstate.buttons_down |= GESTURES_BUTTON_LEFT; + if (Event_Get_Button_Middle(evdev)) + hwstate.buttons_down |= GESTURES_BUTTON_MIDDLE; + if (Event_Get_Button_Right(evdev)) + hwstate.buttons_down |= GESTURES_BUTTON_RIGHT; + + GestureInterpreterPushHardwareState(interpreter_, &hwstate); +} + +void GestureInterpreterLibevdevCros::OnGestureReady(const Gesture* gesture) { + switch (gesture->type) { + case kGestureTypeMove: + OnGestureMove(gesture, &gesture->details.move); + break; + case kGestureTypeScroll: + OnGestureScroll(gesture, &gesture->details.scroll); + break; + case kGestureTypeButtonsChange: + OnGestureButtonsChange(gesture, &gesture->details.buttons); + break; + case kGestureTypeContactInitiated: + case kGestureTypeFling: + case kGestureTypeSwipe: + case kGestureTypeSwipeLift: + case kGestureTypePinch: + case kGestureTypeMetrics: + // TODO(spang): Support remaining gestures. + NOTIMPLEMENTED(); + break; + default: + LOG(WARNING) << base::StringPrintf("Unrecognized gesture type (%u)", + gesture->type); + break; + } +} + +void GestureInterpreterLibevdevCros::OnGestureMove(const Gesture* gesture, + const GestureMove* move) { + DVLOG(3) << base::StringPrintf("Gesture Move: (%f, %f) [%f, %f]", + move->dx, + move->dy, + move->ordinal_dx, + move->ordinal_dy); + if (!cursor_) + return; // No cursor! + cursor_->MoveCursor(gfx::Vector2dF(move->dx, move->dy)); + // TODO(spang): Use move->ordinal_dx, move->ordinal_dy + // TODO(spang): Use move->start_time, move->end_time + MouseEvent event(ET_MOUSE_MOVED, + cursor_->location(), + cursor_->location(), + modifiers_->GetModifierFlags(), + /* changed_button_flags */ 0); + Dispatch(&event); +} + +void GestureInterpreterLibevdevCros::OnGestureScroll( + const Gesture* gesture, + const GestureScroll* scroll) { + DVLOG(3) << base::StringPrintf("Gesture Scroll: (%f, %f) [%f, %f]", + scroll->dx, + scroll->dy, + scroll->ordinal_dx, + scroll->ordinal_dy); + // TODO(spang): Support SetNaturalScroll + // TODO(spang): Use scroll->start_time + ScrollEvent event(ET_SCROLL, + cursor_->location(), + StimeToTimedelta(gesture->end_time), + modifiers_->GetModifierFlags(), + scroll->dx, + scroll->dy, + scroll->ordinal_dx, + scroll->ordinal_dy, + kGestureScrollFingerCount); + Dispatch(&event); +} + +void GestureInterpreterLibevdevCros::OnGestureButtonsChange( + const Gesture* gesture, + const GestureButtonsChange* buttons) { + DVLOG(3) << base::StringPrintf("Gesture Button Change: down=0x%02x up=0x%02x", + buttons->down, + buttons->up); + // TODO(spang): Use buttons->start_time, buttons->end_time + if (buttons->down & GESTURES_BUTTON_LEFT) + DispatchMouseButton(EVDEV_MODIFIER_LEFT_MOUSE_BUTTON, true); + if (buttons->down & GESTURES_BUTTON_MIDDLE) + DispatchMouseButton(EVDEV_MODIFIER_MIDDLE_MOUSE_BUTTON, true); + if (buttons->down & GESTURES_BUTTON_RIGHT) + DispatchMouseButton(EVDEV_MODIFIER_RIGHT_MOUSE_BUTTON, true); + if (buttons->up & GESTURES_BUTTON_LEFT) + DispatchMouseButton(EVDEV_MODIFIER_LEFT_MOUSE_BUTTON, false); + if (buttons->up & GESTURES_BUTTON_MIDDLE) + DispatchMouseButton(EVDEV_MODIFIER_MIDDLE_MOUSE_BUTTON, false); + if (buttons->up & GESTURES_BUTTON_RIGHT) + DispatchMouseButton(EVDEV_MODIFIER_RIGHT_MOUSE_BUTTON, false); +} + +void GestureInterpreterLibevdevCros::Dispatch(Event* event) { + dispatch_callback_.Run(event); +} + +void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int modifier, + bool down) { + const gfx::PointF& loc = cursor_->location(); + int flag = modifiers_->GetEventFlagFromModifier(modifier); + EventType type = (down ? ET_MOUSE_PRESSED : ET_MOUSE_RELEASED); + modifiers_->UpdateModifier(modifier, down); + MouseEvent event(type, loc, loc, modifiers_->GetModifierFlags() | flag, flag); + Dispatch(&event); +} + +} // namespace ui diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h new file mode 100644 index 0000000000..66bbef37ed --- /dev/null +++ b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h @@ -0,0 +1,82 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_INTERPRETER_LIBEVDEV_CROS_H_ +#define UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_INTERPRETER_LIBEVDEV_CROS_H_ + +#include <gestures/gestures.h> +#include <libevdev/libevdev.h> + +#include "base/callback.h" +#include "base/memory/scoped_ptr.h" +#include "ui/events/events_export.h" +#include "ui/events/ozone/evdev/cursor_delegate_evdev.h" +#include "ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h" + +namespace ui { + +class Event; +class EventDeviceInfo; +class EventModifiersEvdev; +class CursorDelegateEvdev; + +typedef base::Callback<void(Event*)> EventDispatchCallback; + +// Convert libevdev-cros events to ui::Events using libgestures. +// +// This builds a GestureInterpreter for an input device (touchpad or +// mouse). +// +// Raw input events must be preprocessed into a form suitable for +// libgestures. The kernel protocol only emits changes to the device state, +// so changes must be accumulated until a sync event. The full device state +// at sync is then processed by libgestures. +// +// Once we have the state at sync, we convert it to a HardwareState object +// and forward it to libgestures. If any gestures are produced, they are +// converted to ui::Events and dispatched. +class EVENTS_EXPORT GestureInterpreterLibevdevCros + : public EventReaderLibevdevCros::Delegate { + public: + GestureInterpreterLibevdevCros(EventModifiersEvdev* modifiers, + CursorDelegateEvdev* cursor, + const EventDispatchCallback& callback); + virtual ~GestureInterpreterLibevdevCros(); + + // Overriden from ui::EventReaderLibevdevCros::Delegate + virtual void OnLibEvdevCrosOpen(Evdev* evdev, + EventStateRec* evstate) OVERRIDE; + virtual void OnLibEvdevCrosEvent(Evdev* evdev, + EventStateRec* evstate, + const timeval& time) OVERRIDE; + + // Handler for gesture events generated from libgestures. + void OnGestureReady(const Gesture* gesture); + + private: + void OnGestureMove(const Gesture* gesture, const GestureMove* move); + void OnGestureScroll(const Gesture* gesture, const GestureScroll* move); + void OnGestureButtonsChange(const Gesture* gesture, + const GestureButtonsChange* move); + void Dispatch(Event* event); + void DispatchMouseButton(unsigned int modifier, bool down); + + // Shared modifier state. + EventModifiersEvdev* modifiers_; + + // Shared cursor state. + CursorDelegateEvdev* cursor_; + + // Callback for dispatching events. + EventDispatchCallback dispatch_callback_; + + // Gestures interpretation state. + gestures::GestureInterpreter* interpreter_; + + DISALLOW_COPY_AND_ASSIGN(GestureInterpreterLibevdevCros); +}; + +} // namspace ui + +#endif // UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_INTERPRETER_LIBEVDEV_CROS_H_ diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_logging.cc b/ui/events/ozone/evdev/libgestures_glue/gesture_logging.cc new file mode 100644 index 0000000000..009fc93902 --- /dev/null +++ b/ui/events/ozone/evdev/libgestures_glue/gesture_logging.cc @@ -0,0 +1,32 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/events/ozone/evdev/libgestures_glue/gesture_logging.h" + +#include <gestures/gestures.h> +#include <stdarg.h> + +#include "base/logging.h" +#include "base/strings/stringprintf.h" + +namespace { + +std::string FormatLog(const char* fmt, va_list args) { + std::string msg = base::StringPrintV(fmt, args); + if (!msg.empty() && msg[msg.size() - 1] == '\n') + msg.erase(msg.end() - 1, msg.end()); + return msg; +} + +} // namespace + +void gestures_log(int verb, const char* fmt, ...) { + va_list args; + va_start(args, fmt); + if (verb <= GESTURES_LOG_ERROR) + LOG(ERROR) << "gestures: " << FormatLog(fmt, args); + else if (verb <= GESTURES_LOG_INFO) + VLOG(3) << "gestures: " << FormatLog(fmt, args); + va_end(args); +} diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_logging.h b/ui/events/ozone/evdev/libgestures_glue/gesture_logging.h new file mode 100644 index 0000000000..a5f543556a --- /dev/null +++ b/ui/events/ozone/evdev/libgestures_glue/gesture_logging.h @@ -0,0 +1,15 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_LOGGING_H_ +#define UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_LOGGING_H_ + +// libgestures.so binds to this function for logging. +// TODO(spang): Fix libgestures to not require this. +extern "C" + __attribute__((visibility("default"))) void gestures_log(int verb, + const char* fmt, + ...); + +#endif // UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_LOGGING_H_ diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc b/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc new file mode 100644 index 0000000000..92f15b7782 --- /dev/null +++ b/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc @@ -0,0 +1,72 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h" + +#include <gestures/gestures.h> + +#include "base/timer/timer.h" + +// libgestures requires that this be in the top level namespace. +class GesturesTimer { + public: + GesturesTimer() : callback_(NULL), callback_data_(NULL) {} + ~GesturesTimer() {} + + void Set(stime_t delay, GesturesTimerCallback callback, void* callback_data) { + callback_ = callback; + callback_data_ = callback_data; + timer_.Start(FROM_HERE, + base::TimeDelta::FromMicroseconds( + delay * base::Time::kMicrosecondsPerSecond), + this, + &GesturesTimer::OnTimerExpired); + } + + void Cancel() { timer_.Stop(); } + + private: + void OnTimerExpired() { + struct timespec ts; + CHECK(!clock_gettime(CLOCK_MONOTONIC, &ts)); + stime_t next_delay = callback_(StimeFromTimespec(&ts), callback_data_); + if (next_delay >= 0) { + timer_.Start(FROM_HERE, + base::TimeDelta::FromMicroseconds( + next_delay * base::Time::kMicrosecondsPerSecond), + this, + &GesturesTimer::OnTimerExpired); + } + } + + GesturesTimerCallback callback_; + void* callback_data_; + base::OneShotTimer<GesturesTimer> timer_; +}; + +namespace ui { + +namespace { + +GesturesTimer* GesturesTimerCreate(void* data) { return new GesturesTimer; } + +void GesturesTimerSet(void* data, + GesturesTimer* timer, + stime_t delay, + GesturesTimerCallback callback, + void* callback_data) { + timer->Set(delay, callback, callback_data); +} + +void GesturesTimerCancel(void* data, GesturesTimer* timer) { timer->Cancel(); } + +void GesturesTimerFree(void* data, GesturesTimer* timer) { delete timer; } + +} // namespace + +const GesturesTimerProvider kGestureTimerProvider = { + GesturesTimerCreate, GesturesTimerSet, GesturesTimerCancel, + GesturesTimerFree}; + +} // namespace ui diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h b/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h new file mode 100644 index 0000000000..edc20ba9c0 --- /dev/null +++ b/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h @@ -0,0 +1,16 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_TIMER_PROVIDER_H_ +#define UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_TIMER_PROVIDER_H_ + +#include <gestures/gestures.h> + +namespace ui { + +extern const GesturesTimerProvider kGestureTimerProvider; + +} // namspace ui + +#endif // UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_TIMER_PROVIDER_H_ diff --git a/ui/events/ozone/evdev/touch_event_converter_evdev.cc b/ui/events/ozone/evdev/touch_event_converter_evdev.cc index 8d27e84a26..9efa8fcb65 100644 --- a/ui/events/ozone/evdev/touch_event_converter_evdev.cc +++ b/ui/events/ozone/evdev/touch_event_converter_evdev.cc @@ -16,11 +16,16 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/command_line.h" #include "base/logging.h" #include "base/memory/scoped_vector.h" #include "base/message_loop/message_loop.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" #include "ui/events/event.h" #include "ui/events/event_constants.h" +#include "ui/events/event_switches.h" #include "ui/events/ozone/event_factory_ozone.h" #include "ui/gfx/screen.h" @@ -30,21 +35,60 @@ namespace { // TODO(rjkroege): Configure this per device. const float kFingerWidth = 25.f; +struct TouchCalibration { + int bezel_left; + int bezel_right; + int bezel_top; + int bezel_bottom; +}; + +void GetTouchCalibration(TouchCalibration* cal) { + std::vector<std::string> parts; + if (Tokenize(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + switches::kTouchCalibration), + ",", + &parts) >= 4) { + if (!base::StringToInt(parts[0], &cal->bezel_left)) + DLOG(ERROR) << "Incorrect left border calibration value passed."; + if (!base::StringToInt(parts[1], &cal->bezel_right)) + DLOG(ERROR) << "Incorrect right border calibration value passed."; + if (!base::StringToInt(parts[2], &cal->bezel_top)) + DLOG(ERROR) << "Incorrect top border calibration value passed."; + if (!base::StringToInt(parts[3], &cal->bezel_bottom)) + DLOG(ERROR) << "Incorrect bottom border calibration value passed."; + } +} + +float TuxelsToPixels(float val, + float min_tuxels, + float num_tuxels, + float min_pixels, + float num_pixels) { + // Map [min_tuxels, min_tuxels + num_tuxels) to + // [min_pixels, min_pixels + num_pixels). + return min_pixels + (val - min_tuxels) * num_pixels / num_tuxels; +} + } // namespace namespace ui { -TouchEventConverterEvdev::TouchEventConverterEvdev(int fd, - base::FilePath path, - const EventDeviceInfo& info) - : pressure_min_(info.GetAbsMinimum(ABS_MT_PRESSURE)), +TouchEventConverterEvdev::TouchEventConverterEvdev( + int fd, + base::FilePath path, + const EventDeviceInfo& info, + const EventDispatchCallback& callback) + : EventConverterEvdev(callback), + pressure_min_(info.GetAbsMinimum(ABS_MT_PRESSURE)), pressure_max_(info.GetAbsMaximum(ABS_MT_PRESSURE)), - x_scale_(1.), - y_scale_(1.), - x_min_(info.GetAbsMinimum(ABS_MT_POSITION_X)), - x_max_(info.GetAbsMaximum(ABS_MT_POSITION_X)), - y_min_(info.GetAbsMinimum(ABS_MT_POSITION_Y)), - y_max_(info.GetAbsMaximum(ABS_MT_POSITION_Y)), + x_min_tuxels_(info.GetAbsMinimum(ABS_MT_POSITION_X)), + x_num_tuxels_(info.GetAbsMaximum(ABS_MT_POSITION_X) - x_min_tuxels_ + 1), + y_min_tuxels_(info.GetAbsMinimum(ABS_MT_POSITION_Y)), + y_num_tuxels_(info.GetAbsMaximum(ABS_MT_POSITION_Y) - y_min_tuxels_ + 1), + x_min_pixels_(x_min_tuxels_), + x_num_pixels_(x_num_tuxels_), + y_min_pixels_(y_min_tuxels_), + y_num_pixels_(y_num_tuxels_), current_slot_(0), fd_(fd), path_(path) { @@ -63,9 +107,29 @@ void TouchEventConverterEvdev::Init() { gfx::Display display = screen->GetPrimaryDisplay(); gfx::Size size = display.GetSizeInPixel(); - x_scale_ = (double)size.width() / (x_max_ - x_min_); - y_scale_ = (double)size.height() / (y_max_ - y_min_); - VLOG(1) << "touch scaling x_scale=" << x_scale_ << " y_scale=" << y_scale_; + // Map coordinates onto screen. + x_min_pixels_ = 0; + y_min_pixels_ = 0; + x_num_pixels_ = size.width(); + y_num_pixels_ = size.height(); + + VLOG(1) << "mapping touch coordinates to screen coordinates: " + << base::StringPrintf("%dx%d", size.width(), size.height()); + + // Apply --touch-calibration. + TouchCalibration cal = {}; + GetTouchCalibration(&cal); + x_min_tuxels_ += cal.bezel_left; + x_num_tuxels_ -= cal.bezel_left + cal.bezel_right; + y_min_tuxels_ += cal.bezel_top; + y_num_tuxels_ -= cal.bezel_top + cal.bezel_bottom; + + VLOG(1) << "applying touch calibration: " + << base::StringPrintf("[%d, %d, %d, %d]", + cal.bezel_left, + cal.bezel_right, + cal.bezel_top, + cal.bezel_bottom); } void TouchEventConverterEvdev::Start() { @@ -106,12 +170,20 @@ void TouchEventConverterEvdev::OnFileCanReadWithoutBlocking(int fd) { case ABS_X: case ABS_MT_POSITION_X: altered_slots_.set(current_slot_); - events_[current_slot_].x_ = roundf(input.value * x_scale_); + events_[current_slot_].x_ = TuxelsToPixels(input.value, + x_min_tuxels_, + x_num_tuxels_, + x_min_pixels_, + x_num_pixels_); break; case ABS_Y: case ABS_MT_POSITION_Y: altered_slots_.set(current_slot_); - events_[current_slot_].y_ = roundf(input.value * y_scale_); + events_[current_slot_].y_ = TuxelsToPixels(input.value, + y_min_tuxels_, + y_num_tuxels_, + y_min_pixels_, + y_num_pixels_); break; case ABS_MT_TRACKING_ID: altered_slots_.set(current_slot_); @@ -143,8 +215,7 @@ void TouchEventConverterEvdev::OnFileCanReadWithoutBlocking(int fd) { // TODO(rjkroege): Support elliptical finger regions. touch_events.push_back(new TouchEvent( events_[j].type_, - gfx::Point(std::min(x_max_, events_[j].x_), - std::min(y_max_, events_[j].y_)), + gfx::PointF(events_[j].x_, events_[j].y_), /* flags */ 0, /* touch_id */ j, base::TimeDelta::FromMicroseconds( diff --git a/ui/events/ozone/evdev/touch_event_converter_evdev.h b/ui/events/ozone/evdev/touch_event_converter_evdev.h index dea3ce8685..a1b81a6c0e 100644 --- a/ui/events/ozone/evdev/touch_event_converter_evdev.h +++ b/ui/events/ozone/evdev/touch_event_converter_evdev.h @@ -28,7 +28,8 @@ class EVENTS_EXPORT TouchEventConverterEvdev }; TouchEventConverterEvdev(int fd, base::FilePath path, - const EventDeviceInfo& info); + const EventDeviceInfo& info, + const EventDispatchCallback& dispatch); virtual ~TouchEventConverterEvdev(); // Start & stop watching for events. @@ -49,17 +50,21 @@ class EVENTS_EXPORT TouchEventConverterEvdev int pressure_min_; int pressure_max_; // Used to normalize pressure values. - // Touch scaling. - float x_scale_; - float y_scale_; + // Input range for x-axis. + float x_min_tuxels_; + float x_num_tuxels_; - // Range for x-axis. - int x_min_; - int x_max_; + // Input range for y-axis. + float y_min_tuxels_; + float y_num_tuxels_; - // Range for y-axis. - int y_min_; - int y_max_; + // Output range for x-axis. + float x_min_pixels_; + float x_num_pixels_; + + // Output range for y-axis. + float y_min_pixels_; + float y_num_pixels_; // Touch point currently being updated from the /dev/input/event* stream. int current_slot_; @@ -75,8 +80,8 @@ class EVENTS_EXPORT TouchEventConverterEvdev std::bitset<MAX_FINGERS> altered_slots_; struct InProgressEvents { - int x_; - int y_; + float x_; + float y_; int id_; // Device reported "unique" touch point id; -1 means not active int finger_; // "Finger" id starting from 0; -1 means not active diff --git a/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc b/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc index 472e79eb03..3fddb46a4f 100644 --- a/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc +++ b/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc @@ -53,7 +53,7 @@ class MockTouchEventConverterEvdev : public TouchEventConverterEvdev { base::RunLoop().RunUntilIdle(); } - void DispatchCallback(void* event) { + void DispatchCallback(Event* event) { dispatched_events_.push_back( new TouchEvent(*static_cast<TouchEvent*>(event))); } @@ -69,15 +69,20 @@ class MockTouchEventConverterEvdev : public TouchEventConverterEvdev { MockTouchEventConverterEvdev::MockTouchEventConverterEvdev(int fd, base::FilePath path) - : TouchEventConverterEvdev(fd, path, EventDeviceInfo()) { + : TouchEventConverterEvdev( + fd, + path, + EventDeviceInfo(), + base::Bind(&MockTouchEventConverterEvdev::DispatchCallback, + base::Unretained(this))) { pressure_min_ = 30; pressure_max_ = 60; // TODO(rjkroege): Check test axes. - x_min_ = 0; - x_max_ = std::numeric_limits<int>::max(); - y_min_ = 0; - y_max_ = std::numeric_limits<int>::max(); + x_min_pixels_ = x_min_tuxels_ = 0; + x_num_pixels_ = x_num_tuxels_ = std::numeric_limits<int>::max(); + y_min_pixels_ = y_min_tuxels_ = 0; + y_num_pixels_ = y_num_tuxels_ = std::numeric_limits<int>::max(); int fds[2]; @@ -122,9 +127,6 @@ class TouchEventConverterEvdevTest : public testing::Test { loop_ = new base::MessageLoopForUI; device_ = new ui::MockTouchEventConverterEvdev( events_in_, base::FilePath(kTestDevicePath)); - device_->SetDispatchCallback( - base::Bind(&ui::MockTouchEventConverterEvdev::DispatchCallback, - base::Unretained(device_))); } virtual void TearDown() OVERRIDE { diff --git a/ui/events/platform/platform_event_source.cc b/ui/events/platform/platform_event_source.cc index a1a79ce4f6..4abb4bad7d 100644 --- a/ui/events/platform/platform_event_source.cc +++ b/ui/events/platform/platform_event_source.cc @@ -34,17 +34,12 @@ PlatformEventSource* PlatformEventSource::GetInstance() { return instance_; } void PlatformEventSource::AddPlatformEventDispatcher( PlatformEventDispatcher* dispatcher) { CHECK(dispatcher); - DCHECK(std::find(dispatchers_.begin(), dispatchers_.end(), dispatcher) == - dispatchers_.end()); - dispatchers_.push_back(dispatcher); + dispatchers_.AddObserver(dispatcher); } void PlatformEventSource::RemovePlatformEventDispatcher( PlatformEventDispatcher* dispatcher) { - PlatformEventDispatcherList::iterator remove = - std::remove(dispatchers_.begin(), dispatchers_.end(), dispatcher); - if (remove != dispatchers_.end()) - dispatchers_.erase(remove); + dispatchers_.RemoveObserver(dispatcher); } scoped_ptr<ScopedEventDispatcher> PlatformEventSource::OverrideDispatcher( @@ -77,11 +72,10 @@ uint32_t PlatformEventSource::DispatchEvent(PlatformEvent platform_event) { action = overridden_dispatcher_->DispatchEvent(platform_event); should_quit = !!(action & POST_DISPATCH_QUIT_LOOP); - if (action & POST_DISPATCH_PERFORM_DEFAULT) { - for (PlatformEventDispatcherList::iterator i = dispatchers_.begin(); - i != dispatchers_.end(); - ++i) { - PlatformEventDispatcher* dispatcher = *(i); + if ((action & POST_DISPATCH_PERFORM_DEFAULT) && + dispatchers_.might_have_observers()) { + ObserverList<PlatformEventDispatcher>::Iterator iter(dispatchers_); + while (PlatformEventDispatcher* dispatcher = iter.GetNext()) { if (dispatcher->CanDispatchEvent(platform_event)) action = dispatcher->DispatchEvent(platform_event); if (action & POST_DISPATCH_QUIT_LOOP) diff --git a/ui/events/platform/platform_event_source.h b/ui/events/platform/platform_event_source.h index 407085cfc7..d5867cd54d 100644 --- a/ui/events/platform/platform_event_source.h +++ b/ui/events/platform/platform_event_source.h @@ -30,7 +30,14 @@ class EVENTS_EXPORT PlatformEventSource { static PlatformEventSource* GetInstance(); + // Adds a dispatcher to the dispatcher list. If a dispatcher is added during + // dispatching an event, then the newly added dispatcher also receives that + // event. void AddPlatformEventDispatcher(PlatformEventDispatcher* dispatcher); + + // Removes a dispatcher from the dispatcher list. Dispatchers can safely be + // removed from the dispatcher list during an event is being dispatched, + // without affecting the dispatch of the event to other existing dispatchers. void RemovePlatformEventDispatcher(PlatformEventDispatcher* dispatcher); // Installs a PlatformEventDispatcher that receives all the events. The @@ -65,7 +72,10 @@ class EVENTS_EXPORT PlatformEventSource { void OnOverriddenDispatcherRestored(); - typedef std::vector<PlatformEventDispatcher*> PlatformEventDispatcherList; + // Use an ObserverList<> instead of an std::vector<> to store the list of + // dispatchers, so that adding/removing dispatchers during an event dispatch + // is well-defined. + typedef ObserverList<PlatformEventDispatcher> PlatformEventDispatcherList; PlatformEventDispatcherList dispatchers_; PlatformEventDispatcher* overridden_dispatcher_; diff --git a/ui/events/platform/platform_event_source_unittest.cc b/ui/events/platform/platform_event_source_unittest.cc index 78b7cc4448..fa5e9eff7f 100644 --- a/ui/events/platform/platform_event_source_unittest.cc +++ b/ui/events/platform/platform_event_source_unittest.cc @@ -27,6 +27,20 @@ scoped_ptr<PlatformEvent> CreatePlatformEvent() { template <typename T> void DestroyScopedPtr(scoped_ptr<T> object) {} +void RemoveDispatcher(PlatformEventDispatcher* dispatcher) { + PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(dispatcher); +} + +void RemoveDispatchers(PlatformEventDispatcher* first, + PlatformEventDispatcher* second) { + PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(first); + PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(second); +} + +void AddDispatcher(PlatformEventDispatcher* dispatcher) { + PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(dispatcher); +} + } // namespace class TestPlatformEventSource : public PlatformEventSource { @@ -302,6 +316,170 @@ TEST_F(PlatformEventTest, OverriddenDispatcherInvokeDefaultDispatcher) { EXPECT_EQ(10, list[2]); } +// Runs a callback during an event dispatch. +class RunCallbackDuringDispatch : public TestPlatformEventDispatcher { + public: + RunCallbackDuringDispatch(int id, std::vector<int>* list) + : TestPlatformEventDispatcher(id, list) {} + virtual ~RunCallbackDuringDispatch() {} + + void set_callback(const base::Closure& callback) { + callback_ = callback; + } + + protected: + // PlatformEventDispatcher: + virtual uint32_t DispatchEvent(const PlatformEvent& event) OVERRIDE { + if (!callback_.is_null()) + callback_.Run(); + return TestPlatformEventDispatcher::DispatchEvent(event); + } + + private: + base::Closure callback_; + + DISALLOW_COPY_AND_ASSIGN(RunCallbackDuringDispatch); +}; + +// Test that if a dispatcher removes another dispatcher that is later in the +// dispatcher list during dispatching an event, then event dispatching still +// continues correctly. +TEST_F(PlatformEventTest, DispatcherRemovesNextDispatcherDuringDispatch) { + std::vector<int> list; + TestPlatformEventDispatcher first(10, &list); + RunCallbackDuringDispatch second(15, &list); + TestPlatformEventDispatcher third(20, &list); + TestPlatformEventDispatcher fourth(30, &list); + + second.set_callback(base::Bind(&RemoveDispatcher, base::Unretained(&third))); + + scoped_ptr<PlatformEvent> event(CreatePlatformEvent()); + source()->Dispatch(*event); + // |second| removes |third| from the dispatcher list during dispatch. So the + // event should only reach |first|, |second|, and |fourth|. + ASSERT_EQ(3u, list.size()); + EXPECT_EQ(10, list[0]); + EXPECT_EQ(15, list[1]); + EXPECT_EQ(30, list[2]); +} + +// Tests that if a dispatcher removes itself from the dispatcher list during +// dispatching an event, then event dispatching continues correctly. +TEST_F(PlatformEventTest, DispatcherRemovesSelfDuringDispatch) { + std::vector<int> list; + TestPlatformEventDispatcher first(10, &list); + RunCallbackDuringDispatch second(15, &list); + TestPlatformEventDispatcher third(20, &list); + + second.set_callback(base::Bind(&RemoveDispatcher, base::Unretained(&second))); + + scoped_ptr<PlatformEvent> event(CreatePlatformEvent()); + source()->Dispatch(*event); + // |second| removes itself from the dispatcher list during dispatch. So the + // event should reach all three dispatchers in the list. + ASSERT_EQ(3u, list.size()); + EXPECT_EQ(10, list[0]); + EXPECT_EQ(15, list[1]); + EXPECT_EQ(20, list[2]); +} + +// Tests that if a dispatcher removes itself from the dispatcher list during +// dispatching an event, and this dispatcher is last in the dispatcher-list, +// then event dispatching ends correctly. +TEST_F(PlatformEventTest, DispatcherRemovesSelfDuringDispatchLast) { + std::vector<int> list; + TestPlatformEventDispatcher first(10, &list); + RunCallbackDuringDispatch second(15, &list); + + second.set_callback(base::Bind(&RemoveDispatcher, base::Unretained(&second))); + + scoped_ptr<PlatformEvent> event(CreatePlatformEvent()); + source()->Dispatch(*event); + // |second| removes itself during dispatch. So both dispatchers will have + // received the event. + ASSERT_EQ(2u, list.size()); + EXPECT_EQ(10, list[0]); + EXPECT_EQ(15, list[1]); +} + +// Tests that if a dispatcher removes a single dispatcher that comes before it +// in the dispatcher list, then dispatch continues correctly. +TEST_F(PlatformEventTest, DispatcherRemovesPrevDispatcherDuringDispatch) { + std::vector<int> list; + TestPlatformEventDispatcher first(10, &list); + RunCallbackDuringDispatch second(15, &list); + TestPlatformEventDispatcher third(20, &list); + + second.set_callback(base::Bind(&RemoveDispatcher, base::Unretained(&first))); + + scoped_ptr<PlatformEvent> event(CreatePlatformEvent()); + source()->Dispatch(*event); + // |second| removes |first| from the dispatcher list during dispatch. The + // event should reach all three dispatchers. + ASSERT_EQ(3u, list.size()); + EXPECT_EQ(10, list[0]); + EXPECT_EQ(15, list[1]); + EXPECT_EQ(20, list[2]); +} + +// Tests that if a dispatcher removes multiple dispatchers that comes before it +// in the dispatcher list, then dispatch continues correctly. +TEST_F(PlatformEventTest, DispatcherRemovesPrevDispatchersDuringDispatch) { + std::vector<int> list; + TestPlatformEventDispatcher first(10, &list); + TestPlatformEventDispatcher second(12, &list); + RunCallbackDuringDispatch third(15, &list); + TestPlatformEventDispatcher fourth(20, &list); + + third.set_callback(base::Bind(&RemoveDispatchers, + base::Unretained(&first), + base::Unretained(&second))); + + scoped_ptr<PlatformEvent> event(CreatePlatformEvent()); + source()->Dispatch(*event); + // |third| removes |first| and |second| from the dispatcher list during + // dispatch. The event should reach all three dispatchers. + ASSERT_EQ(4u, list.size()); + EXPECT_EQ(10, list[0]); + EXPECT_EQ(12, list[1]); + EXPECT_EQ(15, list[2]); + EXPECT_EQ(20, list[3]); +} + +// Tests that adding a dispatcher during dispatching an event receives that +// event. +TEST_F(PlatformEventTest, DispatcherAddedDuringDispatchReceivesEvent) { + std::vector<int> list; + TestPlatformEventDispatcher first(10, &list); + RunCallbackDuringDispatch second(15, &list); + TestPlatformEventDispatcher third(20, &list); + TestPlatformEventDispatcher fourth(30, &list); + RemoveDispatchers(&third, &fourth); + + scoped_ptr<PlatformEvent> event(CreatePlatformEvent()); + source()->Dispatch(*event); + ASSERT_EQ(2u, list.size()); + EXPECT_EQ(10, list[0]); + EXPECT_EQ(15, list[1]); + + second.set_callback(base::Bind(&AddDispatcher, base::Unretained(&third))); + list.clear(); + source()->Dispatch(*event); + ASSERT_EQ(3u, list.size()); + EXPECT_EQ(10, list[0]); + EXPECT_EQ(15, list[1]); + EXPECT_EQ(20, list[2]); + + second.set_callback(base::Bind(&AddDispatcher, base::Unretained(&fourth))); + list.clear(); + source()->Dispatch(*event); + ASSERT_EQ(4u, list.size()); + EXPECT_EQ(10, list[0]); + EXPECT_EQ(15, list[1]); + EXPECT_EQ(20, list[2]); + EXPECT_EQ(30, list[3]); +} + // Provides mechanism for running tests from inside an active message-loop. class PlatformEventTestWithMessageLoop : public PlatformEventTest { public: diff --git a/ui/events/platform/x11/x11_event_source.cc b/ui/events/platform/x11/x11_event_source.cc index 910578f0bf..e074bc8e79 100644 --- a/ui/events/platform/x11/x11_event_source.cc +++ b/ui/events/platform/x11/x11_event_source.cc @@ -4,7 +4,6 @@ #include "ui/events/platform/x11/x11_event_source.h" -#include <glib.h> #include <X11/extensions/XInput2.h> #include <X11/X.h> #include <X11/Xlib.h> @@ -19,42 +18,6 @@ namespace ui { namespace { -struct GLibX11Source : public GSource { - // Note: The GLibX11Source is created and destroyed by GLib. So its - // constructor/destructor may or may not get called. - XDisplay* display; - GPollFD* poll_fd; -}; - -gboolean XSourcePrepare(GSource* source, gint* timeout_ms) { - GLibX11Source* gxsource = static_cast<GLibX11Source*>(source); - if (XPending(gxsource->display)) - *timeout_ms = 0; - else - *timeout_ms = -1; - return FALSE; -} - -gboolean XSourceCheck(GSource* source) { - GLibX11Source* gxsource = static_cast<GLibX11Source*>(source); - return XPending(gxsource->display); -} - -gboolean XSourceDispatch(GSource* source, - GSourceFunc unused_func, - gpointer data) { - X11EventSource* x11_source = static_cast<X11EventSource*>(data); - x11_source->DispatchXEvents(); - return TRUE; -} - -GSourceFuncs XSourceFuncs = { - XSourcePrepare, - XSourceCheck, - XSourceDispatch, - NULL -}; - int g_xinput_opcode = -1; bool InitializeXInput2(XDisplay* display) { @@ -117,18 +80,13 @@ bool InitializeXkb(XDisplay* display) { } // namespace X11EventSource::X11EventSource(XDisplay* display) - : display_(display), - x_source_(NULL) { + : display_(display) { CHECK(display_); InitializeXInput2(display_); InitializeXkb(display_); - - InitXSource(); } X11EventSource::~X11EventSource() { - g_source_destroy(x_source_); - g_source_unref(x_source_); } // static @@ -166,27 +124,6 @@ void X11EventSource::BlockUntilWindowMapped(XID window) { //////////////////////////////////////////////////////////////////////////////// // X11EventSource, private -void X11EventSource::InitXSource() { - CHECK(!x_source_); - CHECK(display_) << "Unable to get connection to X server"; - - x_poll_.reset(new GPollFD()); - x_poll_->fd = ConnectionNumber(display_); - x_poll_->events = G_IO_IN; - x_poll_->revents = 0; - - GLibX11Source* glib_x_source = static_cast<GLibX11Source*> - (g_source_new(&XSourceFuncs, sizeof(GLibX11Source))); - glib_x_source->display = display_; - glib_x_source->poll_fd = x_poll_.get(); - - x_source_ = glib_x_source; - g_source_add_poll(x_source_, x_poll_.get()); - g_source_set_can_recurse(x_source_, TRUE); - g_source_set_callback(x_source_, NULL, this, NULL); - g_source_attach(x_source_, g_main_context_default()); -} - uint32_t X11EventSource::DispatchEvent(XEvent* xevent) { bool have_cookie = false; if (xevent->type == GenericEvent && @@ -205,9 +142,4 @@ uint32_t X11EventSource::DispatchEvent(XEvent* xevent) { return action; } -scoped_ptr<PlatformEventSource> PlatformEventSource::CreateDefault() { - return scoped_ptr<PlatformEventSource>( - new X11EventSource(gfx::GetXDisplay())); -} - } // namespace ui diff --git a/ui/events/platform/x11/x11_event_source.h b/ui/events/platform/x11/x11_event_source.h index 93a371e4ac..b05918dfd1 100644 --- a/ui/events/platform/x11/x11_event_source.h +++ b/ui/events/platform/x11/x11_event_source.h @@ -41,22 +41,16 @@ class EVENTS_EXPORT X11EventSource : public PlatformEventSource { // functions which require a mapped window. void BlockUntilWindowMapped(XID window); - private: - // Initializes the glib event source for X. - void InitXSource(); + protected: + XDisplay* display() { return display_; } + private: // PlatformEventSource: virtual uint32_t DispatchEvent(XEvent* xevent) OVERRIDE; // The connection to the X11 server used to receive the events. XDisplay* display_; - // The GLib event source for X events. - GSource* x_source_; - - // The poll attached to |x_source_|. - scoped_ptr<GPollFD> x_poll_; - DISALLOW_COPY_AND_ASSIGN(X11EventSource); }; diff --git a/ui/events/platform/x11/x11_event_source_glib.cc b/ui/events/platform/x11/x11_event_source_glib.cc new file mode 100644 index 0000000000..95044226b5 --- /dev/null +++ b/ui/events/platform/x11/x11_event_source_glib.cc @@ -0,0 +1,101 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/events/platform/x11/x11_event_source.h" + +#include <glib.h> +#include <X11/Xlib.h> + +namespace ui { + +namespace { + +struct GLibX11Source : public GSource { + // Note: The GLibX11Source is created and destroyed by GLib. So its + // constructor/destructor may or may not get called. + XDisplay* display; + GPollFD* poll_fd; +}; + +gboolean XSourcePrepare(GSource* source, gint* timeout_ms) { + GLibX11Source* gxsource = static_cast<GLibX11Source*>(source); + if (XPending(gxsource->display)) + *timeout_ms = 0; + else + *timeout_ms = -1; + return FALSE; +} + +gboolean XSourceCheck(GSource* source) { + GLibX11Source* gxsource = static_cast<GLibX11Source*>(source); + return XPending(gxsource->display); +} + +gboolean XSourceDispatch(GSource* source, + GSourceFunc unused_func, + gpointer data) { + X11EventSource* x11_source = static_cast<X11EventSource*>(data); + x11_source->DispatchXEvents(); + return TRUE; +} + +GSourceFuncs XSourceFuncs = { + XSourcePrepare, + XSourceCheck, + XSourceDispatch, + NULL +}; + +class X11EventSourceGlib : public X11EventSource { + public: + explicit X11EventSourceGlib(XDisplay* display) + : X11EventSource(display), + x_source_(NULL) { + InitXSource(ConnectionNumber(display)); + } + + virtual ~X11EventSourceGlib() { + g_source_destroy(x_source_); + g_source_unref(x_source_); + } + + private: + void InitXSource(int fd) { + CHECK(!x_source_); + CHECK(display()) << "Unable to get connection to X server"; + + x_poll_.reset(new GPollFD()); + x_poll_->fd = fd; + x_poll_->events = G_IO_IN; + x_poll_->revents = 0; + + GLibX11Source* glib_x_source = static_cast<GLibX11Source*> + (g_source_new(&XSourceFuncs, sizeof(GLibX11Source))); + glib_x_source->display = display(); + glib_x_source->poll_fd = x_poll_.get(); + + x_source_ = glib_x_source; + g_source_add_poll(x_source_, x_poll_.get()); + g_source_set_can_recurse(x_source_, TRUE); + g_source_set_callback(x_source_, NULL, this, NULL); + g_source_attach(x_source_, g_main_context_default()); + } + + // The GLib event source for X events. + GSource* x_source_; + + // The poll attached to |x_source_|. + scoped_ptr<GPollFD> x_poll_; + + DISALLOW_COPY_AND_ASSIGN(X11EventSourceGlib); +}; + +} // namespace + +scoped_ptr<PlatformEventSource> PlatformEventSource::CreateDefault() { + return scoped_ptr<PlatformEventSource>( + new X11EventSourceGlib(gfx::GetXDisplay())); +} + +} // namespace ui diff --git a/ui/events/platform/x11/x11_event_source_libevent.cc b/ui/events/platform/x11/x11_event_source_libevent.cc new file mode 100644 index 0000000000..0f27e69f69 --- /dev/null +++ b/ui/events/platform/x11/x11_event_source_libevent.cc @@ -0,0 +1,51 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/events/platform/x11/x11_event_source.h" + +#include <X11/Xlib.h> + +#include "base/message_loop/message_loop.h" +#include "base/message_loop/message_pump_libevent.h" + +namespace ui { + +namespace { + +class X11EventSourceLibevent : public X11EventSource, + public base::MessagePumpLibevent::Watcher { + public: + explicit X11EventSourceLibevent(XDisplay* display) + : X11EventSource(display) { + int fd = ConnectionNumber(display); + base::MessageLoopForUI::current()->WatchFileDescriptor(fd, true, + base::MessagePumpLibevent::WATCH_READ, &watcher_controller_, this); + } + + virtual ~X11EventSourceLibevent() { + } + + private: + // base::MessagePumpLibevent::Watcher: + virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE { + DispatchXEvents(); + } + + virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE { + NOTREACHED(); + } + + base::MessagePumpLibevent::FileDescriptorWatcher watcher_controller_; + + DISALLOW_COPY_AND_ASSIGN(X11EventSourceLibevent); +}; + +} // namespace + +scoped_ptr<PlatformEventSource> PlatformEventSource::CreateDefault() { + return scoped_ptr<PlatformEventSource>( + new X11EventSourceLibevent(gfx::GetXDisplay())); +} + +} // namespace ui diff --git a/ui/events/win/events_win.cc b/ui/events/win/events_win.cc index 1588562ecf..7b559a6ea2 100644 --- a/ui/events/win/events_win.cc +++ b/ui/events/win/events_win.cc @@ -236,7 +236,7 @@ gfx::Point EventLocationFromNative(const base::NativeEvent& native_event) { native_point.y = GET_Y_LPARAM(native_event.lParam); } ScreenToClient(native_event.hwnd, &native_point); - return gfx::win::ScreenToDIPPoint(gfx::Point(native_point)); + return gfx::Point(native_point); } gfx::Point EventSystemLocationFromNative( diff --git a/ui/events/x/events_x.cc b/ui/events/x/events_x.cc index 15b1adc611..7a3ff70e6a 100644 --- a/ui/events/x/events_x.cc +++ b/ui/events/x/events_x.cc @@ -9,6 +9,7 @@ #include <X11/extensions/XInput.h> #include <X11/extensions/XInput2.h> #include <X11/Xlib.h> +#include <X11/Xutil.h> #include "base/logging.h" #include "base/memory/singleton.h" @@ -147,6 +148,11 @@ int GetEventFlagsFromXState(unsigned int state) { return flags; } +int GetEventFlagsFromXKeyEvent(XEvent* xevent) { + return GetEventFlagsFromXState(xevent->xkey.state) | + (IsKeypadKey(XLookupKeysym(&xevent->xkey, 0)) ? ui::EF_NUMPAD_KEY : 0); +} + // Get the event flag for the button in XButtonEvent. During a ButtonPress // event, |state| in XButtonEvent does not include the button that has just been // pressed. Instead |state| contains flags for the buttons (if any) that had @@ -327,7 +333,7 @@ int EventFlagsFromNative(const base::NativeEvent& native_event) { case KeyPress: case KeyRelease: { XModifierStateWatcher::GetInstance()->UpdateStateFromEvent(native_event); - return GetEventFlagsFromXState(native_event->xkey.state); + return GetEventFlagsFromXKeyEvent(native_event); } case ButtonPress: case ButtonRelease: { diff --git a/ui/events/x/events_x_unittest.cc b/ui/events/x/events_x_unittest.cc index d4fc3af76b..368682cbb1 100644 --- a/ui/events/x/events_x_unittest.cc +++ b/ui/events/x/events_x_unittest.cc @@ -6,6 +6,8 @@ #include <X11/extensions/XInput2.h> #include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/XKBlib.h> // Generically-named #defines from Xlib that conflict with symbols in GTest. #undef Bool @@ -40,6 +42,23 @@ void InitButtonEvent(XEvent* event, button_event->state = state; } +// Initializes the passed-in Xlib event. +void InitKeyEvent(Display* display, + XEvent* event, + bool is_press, + int keycode, + int state) { + memset(event, 0, sizeof(*event)); + + // We don't bother setting fields that the event code doesn't use, such as + // x_root/y_root and window/root/subwindow. + XKeyEvent* key_event = &(event->xkey); + key_event->display = display; + key_event->type = is_press ? KeyPress : KeyRelease; + key_event->keycode = keycode; + key_event->state = state; +} + } // namespace TEST(EventsXTest, ButtonEvents) { @@ -238,4 +257,117 @@ TEST(EventsXTest, TouchEventBasic) { EXPECT_FLOAT_EQ(GetTouchForce(scoped_xevent), 0.5f); } #endif + +TEST(EventsXTest, NumpadKeyEvents) { + XEvent event; + Display* display = gfx::GetXDisplay(); + + struct { + bool is_numpad_key; + int x_keysym; + ui::KeyboardCode ui_keycode; + } keys[] = { + // XK_KP_Space and XK_KP_Equal are the extrema in the conventional + // keysymdef.h numbering. + { true, XK_KP_Space }, + { true, XK_KP_Equal }, + // Other numpad keysyms. (This is actually exhaustive in the current list.) + { true, XK_KP_Tab }, + { true, XK_KP_Enter }, + { true, XK_KP_F1 }, + { true, XK_KP_F2 }, + { true, XK_KP_F3 }, + { true, XK_KP_F4 }, + { true, XK_KP_Home }, + { true, XK_KP_Left }, + { true, XK_KP_Up }, + { true, XK_KP_Right }, + { true, XK_KP_Down }, + { true, XK_KP_Prior }, + { true, XK_KP_Page_Up }, + { true, XK_KP_Next }, + { true, XK_KP_Page_Down }, + { true, XK_KP_End }, + { true, XK_KP_Begin }, + { true, XK_KP_Insert }, + { true, XK_KP_Delete }, + { true, XK_KP_Multiply }, + { true, XK_KP_Add }, + { true, XK_KP_Separator }, + { true, XK_KP_Subtract }, + { true, XK_KP_Decimal }, + { true, XK_KP_Divide }, + { true, XK_KP_0 }, + { true, XK_KP_1 }, + { true, XK_KP_2 }, + { true, XK_KP_3 }, + { true, XK_KP_4 }, + { true, XK_KP_5 }, + { true, XK_KP_6 }, + { true, XK_KP_7 }, + { true, XK_KP_8 }, + { true, XK_KP_9 }, + // Largest keysym preceding XK_KP_Space. + { false, XK_Num_Lock }, + // Smallest keysym following XK_KP_Equal. + { false, XK_F1 }, + // Non-numpad analogues of numpad keysyms. + { false, XK_Tab }, + { false, XK_Return }, + { false, XK_F1 }, + { false, XK_F2 }, + { false, XK_F3 }, + { false, XK_F4 }, + { false, XK_Home }, + { false, XK_Left }, + { false, XK_Up }, + { false, XK_Right }, + { false, XK_Down }, + { false, XK_Prior }, + { false, XK_Page_Up }, + { false, XK_Next }, + { false, XK_Page_Down }, + { false, XK_End }, + { false, XK_Insert }, + { false, XK_Delete }, + { false, XK_multiply }, + { false, XK_plus }, + { false, XK_minus }, + { false, XK_period }, + { false, XK_slash }, + { false, XK_0 }, + { false, XK_1 }, + { false, XK_2 }, + { false, XK_3 }, + { false, XK_4 }, + { false, XK_5 }, + { false, XK_6 }, + { false, XK_7 }, + { false, XK_8 }, + { false, XK_9 }, + // Miscellaneous other keysyms. + { false, XK_BackSpace }, + { false, XK_Scroll_Lock }, + { false, XK_Multi_key }, + { false, XK_Select }, + { false, XK_Num_Lock }, + { false, XK_Shift_L }, + { false, XK_space }, + { false, XK_A }, + }; + + for (size_t k = 0; k < ARRAYSIZE_UNSAFE(keys); ++k) { + int x_keycode = XKeysymToKeycode(display, keys[k].x_keysym); + // Exclude keysyms for which the server has no corresponding keycode. + if (x_keycode) { + InitKeyEvent(display, &event, true, x_keycode, 0); + // int keysym = XLookupKeysym(&event.xkey, 0); + // if (keysym) { + ui::KeyEvent ui_key_event(&event, false); + EXPECT_EQ(keys[k].is_numpad_key ? ui::EF_NUMPAD_KEY : 0, + ui_key_event.flags() & ui::EF_NUMPAD_KEY); + } + } +} + } // namespace ui diff --git a/ui/file_manager/DEPS b/ui/file_manager/DEPS new file mode 100644 index 0000000000..a99be7d7bc --- /dev/null +++ b/ui/file_manager/DEPS @@ -0,0 +1,6 @@ +include_rules = [ + "+grit/file_manager_resources.h", + "+grit/file_manager_resources_map.h", + "+ui/base", + "+ui/webui", +] diff --git a/ui/file_manager/OWNERS b/ui/file_manager/OWNERS new file mode 100644 index 0000000000..bca0cd957a --- /dev/null +++ b/ui/file_manager/OWNERS @@ -0,0 +1,3 @@ +hirono@chromium.org +mtomasz@chromium.org +yoshiki@chromium.org diff --git a/ui/file_manager/file_manager.gyp b/ui/file_manager/file_manager.gyp new file mode 100644 index 0000000000..ec12f68839 --- /dev/null +++ b/ui/file_manager/file_manager.gyp @@ -0,0 +1,52 @@ +# Copyright 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'variables': { + 'chromium_code': 1, + 'grit_out_dir': '<(SHARED_INTERMEDIATE_DIR)/ui/file_manager', + }, + 'targets': [ + { + 'target_name': 'file_manager_resources', + 'type': 'none', + 'actions': [ + { + 'action_name': 'file_manager_resources', + 'variables': { + 'grit_grd_file': 'file_manager_resources.grd', + }, + 'includes': [ '../../build/grit_action.gypi' ], + }, + ], + 'includes': [ '../../build/grit_target.gypi' ], + 'copies': [ + { + 'destination': '<(PRODUCT_DIR)', + 'files': [ + '<(SHARED_INTERMEDIATE_DIR)/ui/file_manager/file_manager_resources.pak', + ], + }, + ], + }, + { + 'target_name': 'file_manager', + 'type': '<(component)', + 'dependencies': [ + '../../base/base.gyp:base', + 'file_manager_resources', + ], + 'defines': [ + 'FILE_MANAGER_IMPLEMENTATION', + ], + 'sources': [ + 'file_manager_export.h', + 'file_manager_resource_util.cc', + 'file_manager_resource_util.h', + '<(grit_out_dir)/grit/file_manager_resources_map.cc', + '<(grit_out_dir)/grit/file_manager_resources_map.h', + ] + }, + ], +} diff --git a/ui/file_manager/file_manager_export.h b/ui/file_manager/file_manager_export.h new file mode 100644 index 0000000000..a61bf831a7 --- /dev/null +++ b/ui/file_manager/file_manager_export.h @@ -0,0 +1,32 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_FILE_MANAGER_FILE_MANAGER_EXPORT_H_ +#define UI_FILE_MANAGER_FILE_MANAGER_EXPORT_H_ + +// Defines FILE_MANAGER_EXPORT so that functionality implemented by the +// FILE_MANAGER module can be exported to consumers. + +#if defined(COMPONENT_BUILD) +#if defined(WIN32) + +#if defined(FILE_MANAGER_IMPLEMENTATION) +#define FILE_MANAGER_EXPORT __declspec(dllexport) +#else +#define FILE_MANAGER_EXPORT __declspec(dllimport) +#endif // defined(FILE_MANAGER_IMPLEMENTATION) + +#else // defined(WIN32) +#if defined(FILE_MANAGER_IMPLEMENTATION) +#define FILE_MANAGER_EXPORT __attribute__((visibility("default"))) +#else +#define FILE_MANAGER_EXPORT +#endif +#endif + +#else // defined(COMPONENT_BUILD) +#define FILE_MANAGER_EXPORT +#endif + +#endif // UI_FILE_MANAGER_FILE_MANAGER_EXPORT_H_ diff --git a/ui/file_manager/file_manager_resource_util.cc b/ui/file_manager/file_manager_resource_util.cc new file mode 100644 index 0000000000..5e8972073c --- /dev/null +++ b/ui/file_manager/file_manager_resource_util.cc @@ -0,0 +1,18 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/file_manager/file_manager_resource_util.h" + +#include "grit/file_manager_resources_map.h" +#include "ui/base/resource/resource_bundle.h" + +namespace file_manager { + +const GritResourceMap* GetFileManagerResources(size_t* size) { + DCHECK(size); + *size = kFileManagerResourcesSize; + return kFileManagerResources; +} + +} // namespace keyboard diff --git a/ui/file_manager/file_manager_resource_util.h b/ui/file_manager/file_manager_resource_util.h new file mode 100644 index 0000000000..826eb99e8d --- /dev/null +++ b/ui/file_manager/file_manager_resource_util.h @@ -0,0 +1,23 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_FILE_MANAGER_FILE_MANAGER_RESOURCE_UTIL_H_ +#define UI_FILE_MANAGER_FILE_MANAGER_RESOURCE_UTIL_H_ + +#include <cstddef> + +#include "ui/file_manager/file_manager_export.h" + +struct GritResourceMap; + +namespace file_manager { + +// Get the list of resources. |size| is populated with the number of resources +// in the returned array. +FILE_MANAGER_EXPORT const GritResourceMap* GetFileManagerResources( + size_t* size); + +} // namespace file_manager + +#endif // UI_FILE_MANAGER_FILE_MANAGER_RESOURCE_UTIL_H_ diff --git a/ui/file_manager/file_manager_resources.grd b/ui/file_manager/file_manager_resources.grd new file mode 100644 index 0000000000..3473d92371 --- /dev/null +++ b/ui/file_manager/file_manager_resources.grd @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<grit latest_public_release="0" current_release="1"> + <outputs> + <output filename="grit/file_manager_resources.h" type="rc_header"> + <emit emit_type='prepend'></emit> + </output> + <output filename="grit/file_manager_resources_map.cc" type="resource_file_map_source" /> + <output filename="grit/file_manager_resources_map.h" type="resource_map_header" /> + <output filename="file_manager_resources.pak" type="data_package" /> + <output filename="file_manager_resources.rc" type="rc_all" /> + </outputs> + <release seq="1"> + <includes> + <!-- VideoPlayer.app pages and scripts. --> + <include name="IDR_VIDEO_PLAYER_MANIFEST" file="video_player/manifest.json" type="BINDATA" /> + <include name="IDR_VIDEO_PLAYER" file="video_player/video_player.html" allowexternalscript="true" flattenhtml="true" type="BINDATA" /> + <include name="IDR_VIDEO_PLAYER_JS" file="video_player/js/video_player_scripts.js" flattenhtml="true" type="BINDATA" /> + <include name="IDR_VIDEO_PLAYER_BKGND_JS" file="video_player/js/background.js" flattenhtml="true" type="BINDATA" /> + <include name="IDR_VIDEO_PLAYER_TEST_UTIL_JS" file="video_player/js/test_util.js" flattenhtml="false" type="BINDATA" /> + <include name="IDR_VIDEO_PLAYER_ERROR_UTIL_JS" file="video_player/js/error_util.js" flattenhtml="false" type="BINDATA" /> + <include name="IDR_VIDEO_PLAYER_ICON_16" file="video_player/images/100/icon.png" type="BINDATA" /> + <include name="IDR_VIDEO_PLAYER_ICON_32" file="video_player/images/200/icon.png" type="BINDATA" /> + + <!-- Gallery.app pages and scripts. --> + <include name="IDR_GALLERY_MANIFEST" file="gallery/manifest.json" type="BINDATA" /> + <include name="IDR_GALLERY" file="gallery/gallery.html" allowexternalscript="true" flattenhtml="true" type="BINDATA" /> + <include name="IDR_GALLERY_JS" file="gallery/js/gallery_scripts.js" flattenhtml="true" type="BINDATA" /> + <include name="IDR_GALLERY_BKGND_JS" file="gallery/js/background.js" flattenhtml="true" type="BINDATA" /> + <include name="IDR_GALLERY_TEST_UTIL_JS" file="gallery/js/test_util.js" flattenhtml="false" type="BINDATA" /> + <include name="IDR_GALLERY_ERROR_UTIL_JS" file="gallery/js/error_util.js" flattenhtml="false" type="BINDATA" /> + <include name="IDR_GALLERY_ICON_16" file="gallery/images/100/icon.png" type="BINDATA" /> + <include name="IDR_GALLERY_ICON_32" file="gallery/images/200/icon.png" type="BINDATA" /> + + <!-- Image loader extension manifest and scripts. --> + <if expr="image_loader_extension"> + <include name="IDR_IMAGE_LOADER_MANIFEST" file="image_loader/manifest.json" type="BINDATA" /> + <include name="IDR_IMAGE_LOADER_IMAGE_LOADER_JS" file="image_loader/image_loader.js" type="BINDATA" /> + <include name="IDR_IMAGE_LOADER_CACHE_JS" file="image_loader/cache.js" type="BINDATA" /> + <include name="IDR_IMAGE_LOADER_WORKER_JS" file="image_loader/worker.js" type="BINDATA" /> + <include name="IDR_IMAGE_LOADER_REQUEST_JS" file="image_loader/request.js" type="BINDATA" /> + <include name="IDR_IMAGE_LOADER_BACKGROUND_JS" file="image_loader/background.js" type="BINDATA" /> + <include name="IDR_IMAGE_LOADER_CLIENT_JS" file="image_loader/image_loader_client.js" type="BINDATA" /> + </if> + </includes> + </release> +</grit> diff --git a/ui/file_manager/gallery/css/gallery.css b/ui/file_manager/gallery/css/gallery.css new file mode 100644 index 0000000000..ae32e96763 --- /dev/null +++ b/ui/file_manager/gallery/css/gallery.css @@ -0,0 +1,1381 @@ +/* Copyright (c) 2014 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +body { + -webkit-user-select: none; + font-family: Open Sans, Droid Sans Fallback, sans-serif; + font-size: 84%; + margin: 0; +} + +.gallery, +.gallery .content { + bottom: 0; + left: 0; + overflow: hidden; + position: absolute; + right: 0; + top: 0; +} + +/* Common background for both mosaic and slide mode. */ +.gallery .content { + background-color: black; +} + +/* Close button */ + +/* We actually want (left,top) to be (0,0) but for some weird reason + this triggers :hover style on page reload which is ugly. */ +.gallery > .back-button { + cursor: pointer; + left: 1px; + position: absolute; + top: 1px; + z-index: 200; +} + +/* The close icon is in a nested div so that its opacity can be manipulated + independently from its parent (which can be dimmed when the crop frame + overlaps it) */ +.gallery > .back-button div { + background-image: -webkit-image-set( + url('../images/100/back_to_files.png') 1x, + url('../images/200/back_to_files.png') 2x); + background-position: center center; + background-repeat: no-repeat; + height: 40px; + opacity: 0; + width: 64px; +} + +.gallery[tools] > .back-button div { + opacity: 0.5; +} + +.gallery[tools] > .back-button div:hover { + opacity: 1; +} + +/* Image container and canvas elements */ + +.gallery .image-container { + cursor: none; /* Only visible when the toolbar is active */ + height: 100%; + position: absolute; + width: 100%; +} + +.gallery[tools] .image-container[cursor='default'] { + cursor: default; +} + +.gallery[tools] .image-container[cursor='move'] { + cursor: -webkit-image-set( + url('../images/100/cursor_move.png') 1x, + url('../images/200/cursor_move.png') 2x) 15 15, auto; +} + +.gallery[tools] .image-container[cursor='crop'] { + cursor: -webkit-image-set( + url('../images/100/cursor_crop.png') 1x, + url('../images/200/cursor_crop.png') 2x) 15 15, auto; +} + +.gallery[tools] .image-container[cursor='n-resize'], +.gallery[tools] .image-container[cursor='s-resize'] { + cursor: -webkit-image-set( + url('../images/100/cursor_updown.png') 1x, + url('../images/200/cursor_updown.png') 2x) 15 15, auto; +} + +.gallery[tools] .image-container[cursor='e-resize'], +.gallery[tools] .image-container[cursor='w-resize'] { + cursor: -webkit-image-set( + url('../images/100/cursor_leftright.png') 1x, + url('../images/200/cursor_leftright.png') 2x) 15 15, auto; +} + +.gallery[tools] .image-container[cursor='nw-resize'], +.gallery[tools] .image-container[cursor='se-resize'] { + cursor: -webkit-image-set( + url('../images/100/cursor_nwse.png') 1x, + url('../images/200/cursor_nwse.png') 2x) 15 15, auto; +} + +.gallery[tools] .image-container[cursor='ne-resize'], +.gallery[tools] .image-container[cursor='sw-resize'] { + cursor: -webkit-image-set( + url('../images/100/cursor_swne.png') 1x, + url('../images/200/cursor_swne.png') 2x) 15 15, auto; +} + +.gallery .image-container > .image { + pointer-events: none; + position: absolute; + /* Duration and timing function are set in Javascript. */ + transition-property: -webkit-transform, opacity; +} + +.gallery .image-container > .image[fade] { + opacity: 0; +} + +/* Full resolution image is invisible unless printing. */ +.gallery .image-container > canvas.fullres { + display: none; +} + +@media print { + /* Do not print anything but the image content. */ + .gallery > :not(.content) { + display: none !important; + } + + /* Center the printed image. */ + .gallery .image-container { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + display: -webkit-box; + } + + /* Do not print the screen resolution image. */ + .gallery .image-container > canvas.image { + display: none !important; + } + + /* Print the full resolution image instead. */ + .gallery .image-container > canvas.fullres { + display: block !important; + max-height: 100%; + max-width: 100%; + } + + /* Print video at the center of the page */ + .gallery .image-container > video.image { + position: auto !important; + } +} + +/* Toolbar */ + +.gallery > .header, +.gallery > .toolbar { + -webkit-box-align: stretch; + -webkit-box-orient: horizontal; + -webkit-box-pack: start; + background-color: rgba(30, 30, 30, 0.8); + display: -webkit-box; + left: 0; + opacity: 0; + padding: 0 10px; + pointer-events: none; + position: absolute; + right: 0; + transition: opacity 300ms ease; +} + +.gallery > .header { + -webkit-box-align: center; + -webkit-box-pack: end; + border-bottom: 1px solid rgba(50, 50, 50, 0.8); + display: -webkit-box; + height: 45px; + top: 0; +} + +.gallery > .toolbar { + border-top: 1px solid rgba(50, 50, 50, 0.8); + bottom: 0; + height: 55px; + min-width: 800px; +} + +.gallery[tools]:not([slideshow]) > .header, +.gallery[tools]:not([slideshow]) > .toolbar { + opacity: 1; + pointer-events: auto; +} + +/* Hide immediately when entering the slideshow. */ +.gallery[tools][slideshow] > .toolbar { + transition-duration: 0; +} + +.gallery[tools][locked] > .toolbar { + pointer-events: none; +} + +.gallery .arrow-box { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + display: -webkit-box; + height: 100%; + pointer-events: none; + position: absolute; + width: 100%; + z-index: 100; +} + +.gallery .arrow-box .arrow { + opacity: 0; + pointer-events: none; +} + +.gallery .arrow-box .arrow-spacer { + -webkit-box-flex: 1; + pointer-events: none; +} + +.gallery[tools] .arrow-box[active] .arrow { + cursor: pointer; + opacity: 1; + pointer-events: auto; +} + +/* The arrow icons are in nested divs so that their opacity can be manipulated + * independently from their parent (which can be dimmed when the crop frame + * overlaps it) */ +.gallery .arrow div { + background-position: center center; + background-repeat: no-repeat; + height: 193px; + opacity: 0; + width: 105px; +} + +.gallery[tools] .arrow-box[active] .arrow div { + opacity: 0.25; +} + +.gallery[tools] .arrow-box[active] .arrow div:hover { + opacity: 1; +} + +.gallery .arrow.left div { + background-image: -webkit-image-set( + url('../images/100/arrow_left.png') 1x, + url('../images/200/arrow_left.png') 2x); +} + +.gallery .arrow.right div { + background-image: -webkit-image-set( + url('../images/100/arrow_right.png') 1x, + url('../images/200/arrow_right.png') 2x); +} + +/* Special behavior on mouse drag. + Redundant .gallery attributes included to make the rules more specific */ + +/* Everything but the image container should become mouse-transparent */ +.gallery[tools][editing][mousedrag] * { + pointer-events: none; +} + +.gallery[tools][editing][mousedrag] .image-container { + pointer-events: auto; +} + +/* The editor marks elements with 'dimmed' attribute to get them out of the way + of the crop frame */ +.gallery[tools][editing] [dimmed], +.gallery[tools][editing] [dimmed] * { + pointer-events: none; +} + +.gallery[tools][editing] [dimmed] { + opacity: 0.2; +} + +/* Filename */ + +.gallery .filename-spacer { + position: relative; + width: 270px; +} + +.gallery .filename-spacer > * { + background-color: transparent; + overflow: hidden; + position: absolute; + transition: visibility 0 linear 180ms, all 180ms linear; + width: 260px; +} + +.gallery .filename-spacer * { + color: white; +} + +.gallery .filename-spacer .namebox { + height: 22px; + top: 15px; +} + +.gallery[editing] .filename-spacer .namebox { + height: 21px; + top: 5px; +} + + +.gallery .filename-spacer .namebox { + background-color: transparent; + border: none; + box-sizing: border-box; + cursor: pointer; + display: block; + font-size: 120%; + outline: none; + overflow: hidden; + padding: 0 3px; + position: absolute; + text-overflow: ellipsis; + white-space: nowrap; +} + +.gallery .filename-spacer .namebox[disabled] { + -webkit-user-select: none; + cursor: default; +} + +.gallery .filename-spacer .namebox:not([disabled]):not(:focus):hover { + background-color: rgba(48, 48, 48, 1.0); +} + +.gallery .filename-spacer .namebox:focus { + background-color: white; + color: black; + cursor: text; +} + +.gallery .filename-spacer .options { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: start; + display: -webkit-box; + opacity: 0; + top: 50px; + visibility: hidden; +} + +.gallery[editing] .filename-spacer .options { + opacity: 1; + top: 28px; + visibility: visible; +} + +.gallery .filename-spacer .saved, +.gallery .filename-spacer .overwrite-original { + cursor: inherit; + font-size: 90%; + margin-left: 3px; + margin-right: 18px; + opacity: 0; + pointer-events: none; + transition: all linear 120ms; +} + +.gallery[editing] .filename-spacer .saved { + color: white; + opacity: 0.5; +} + +.gallery[editing] .filename-spacer .overwrite-original, +.gallery[editing] .filename-spacer .overwrite-original > * { + cursor: pointer; + opacity: 1; + pointer-events: auto; +} + +.gallery[editing] .options[saved] .overwrite-original { + opacity: 0.5; +} + +.gallery[editing] .options[saved] .overwrite-original, +.gallery[editing] .options[saved] .overwrite-original > * { + cursor: default; + pointer-events: none; +} + +.gallery .filename-spacer .overwrite-original input { + margin-bottom: -2px; + margin-right: 6px; +} + +.gallery .filename-spacer .saved[highlighted] { + -webkit-transform: scaleX(1.1) scaleY(1.1) rotate(0); + opacity: 1; +} + +/* Bubble */ +.gallery .toolbar .bubble { + bottom: 65px; + font-size: 85%; + left: 50px; + position: absolute; + width: 220px; +} + +.gallery:not([editing]) .toolbar .bubble { + display: none; +} + +/* Toolbar buttons */ + +.gallery .button-spacer { + -webkit-box-flex: 1; + display: -webkit-box; +} + +/* Thumbnails */ + +.gallery .ribbon-spacer { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + display: -webkit-box; + height: 100%; + left: 280px; + position: absolute; + right: 280px; +} + +.gallery .toolbar .ribbon { + -webkit-box-flex: 0; + -webkit-box-orient: horizontal; + -webkit-box-pack: start; + display: -webkit-box; + height: 100%; + overflow: hidden; + transition: opacity 180ms linear, visibility 0 linear; + z-index: 0; +} + +.gallery[editing] .toolbar .ribbon { + opacity: 0; + transition-delay: 0, 180ms; + visibility: hidden; +} + +.gallery .ribbon-image { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + border: 2px solid rgba(255, 255, 255, 0); /* transparent white */ + cursor: pointer; + display: -webkit-box; + height: 47px; + margin: 2px; + overflow: hidden; + transition: all 180ms linear; + width: 47px; +} + +.ribbon-image[vanishing='smooth'] { + border-left-width: 0; + border-right-width: 0; + margin-left: 0; + margin-right: 0; + width: 0; +} + +.gallery .ribbon-image[selected] { + border: 2px solid rgba(255, 233, 168, 1); +} + +.gallery .toolbar .ribbon.fade-left { + -webkit-mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, + rgba(0, 0, 0, 1) 40px); +} + +.gallery .toolbar .ribbon.fade-right { + -webkit-mask-image: linear-gradient(to left, rgba(0, 0, 0, 0) 0, + rgba(0, 0, 0, 1) 40px); +} + +.gallery .toolbar .ribbon.fade-left.fade-right { + -webkit-mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, + rgba(0, 0, 0, 1) 40px, + rgba(0, 0, 0, 1) 230px, + rgba(0, 0, 0, 0) 100%); +} + +.gallery .image-wrapper { + background-size: 45px 45px; + border: 1px solid rgba(0, 0, 0, 0); /* transparent black */ + height: 45px; + overflow: hidden; + position: relative; + width: 45px; +} + +.gallery .image-wrapper > img { + position: absolute; +} + +.gallery .image-wrapper > img:not(.cached) { + -webkit-animation: fadeIn 500ms ease-in; +} + +/* Editor buttons */ + +.gallery .edit-bar-spacer { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + display: -webkit-box; + height: 100%; + left: 280px; + opacity: 0; + position: absolute; + right: 280px; + transition: opacity 180ms linear, visibility 0 linear 180ms; + visibility: hidden; +} + +.gallery .toolbar .edit-main { + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + color: white; + display: -webkit-box; + height: 55px; + overflow: visible; +} + +.gallery[editing] .edit-bar-spacer { + opacity: 1.0; + pointer-events: auto; + transition-delay: 100ms, 100ms; + visibility: visible; +} + +.gallery .header button, +.gallery .toolbar button, +.gallery .header button[disabled], +.gallery .toolbar button[disabled] { + -webkit-box-align: center; + -webkit-box-flex: 0; + -webkit-box-orient: horizontal; + -webkit-box-pack: end; + background-color: rgba(0, 0, 0, 0); + background-position: center; + background-repeat: no-repeat; + border: none; + box-shadow: none; + color: white; + cursor: pointer; + display: -webkit-box; + opacity: 0.99; /* Workaround for http://crosbug.com/21065 */ + padding: 1px; /* Instead of a border. */ + position: relative; + z-index: 10; +} + +.gallery .header button, +.gallery .toolbar button { + height: 40px; + margin: 6px 0; + min-width: 40px; /* Reset. */ + width: 40px; +} + +/* By default, labels are hidden. */ +.gallery > .toolbar button span { + display: none; +} + +/* Show labels if there is enough space. */ +@media (min-width: 1180px) { + + .gallery .edit-main button, + .gallery .edit-main button[disabled] { + background-position: 5px center; + max-width: 60px; + min-width: 0; /* Reset. */ + padding: 0 10px 0 35px; + width: auto; + } + + .gallery > .toolbar button span { + display: inline; + } + +} + +.gallery .header button:hover, +.gallery .toolbar button:hover { + background-color: rgba(31, 31, 31, 1); + color: white; +} + +.gallery .header button:active, +.gallery .toolbar button:active, +.gallery .header button[pressed], +.gallery .toolbar button[pressed], +.gallery .header button[pressed]:hover, +.gallery .toolbar button[pressed]:hover { + background-color: rgba(240, 240, 240, 1); + color: black; +} + +.gallery > .toolbar button.autofix { + background-image: -webkit-image-set( + url('../images/100/icon_autofix.png') 1x, + url('../images/200/icon_autofix.png') 2x); +} + +.gallery > .toolbar button.autofix:active, +.gallery > .toolbar button.autofix[pressed] { + background-image: -webkit-image-set( + url('../images/100/icon_autofix_selected.png') 1x, + url('../images/200/icon_autofix_selected.png') 2x); +} + +.gallery > .toolbar button.crop { + background-image: -webkit-image-set( + url('../images/100/icon_crop.png') 1x, + url('../images/200/icon_crop.png') 2x); +} + +.gallery > .toolbar button.crop:active, +.gallery > .toolbar button.crop[pressed] { + background-image: -webkit-image-set( + url('../images/100/icon_crop_selected.png') 1x, + url('../images/200/icon_crop_selected.png') 2x); +} + +.gallery > .toolbar button.exposure { + background-image: -webkit-image-set( + url('../images/100/icon_brightness.png') 1x, + url('../images/200/icon_brightness.png') 2x); +} + +.gallery > .toolbar button.exposure:active, +.gallery > .toolbar button.exposure[pressed] { + background-image: -webkit-image-set( + url('../images/100/icon_brightness_selected.png') 1x, + url('../images/200/icon_brightness_selected.png') 2x); +} + +.gallery > .toolbar button.rotate_right { + background-image: -webkit-image-set( + url('../images/100/icon_rotate.png') 1x, + url('../images/200/icon_rotate.png') 2x); +} + +.gallery > .toolbar button.rotate_right:active, +.gallery > .toolbar button.rotate_right[pressed] { + background-image: -webkit-image-set( + url('../images/100/icon_rotate_selected.png') 1x, + url('../images/200/icon_rotate_selected.png') 2x); +} + +.gallery > .toolbar button.rotate_left { + background-image: -webkit-image-set( + url('../images/100/icon_rotate_left.png') 1x, + url('../images/200/icon_rotate_left.png') 2x); +} + +.gallery > .toolbar button.rotate_left:active, +.gallery > .toolbar button.rotate_left[pressed] { + background-image: -webkit-image-set( + url('../images/100/icon_rotate_left_selected.png') 1x, + url('../images/200/icon_rotate_left_selected.png') 2x); +} + +.gallery > .toolbar button.undo { + background-image: -webkit-image-set( + url('../images/100/icon_undo.png') 1x, + url('../images/200/icon_undo.png') 2x); +} + +.gallery > .toolbar button.undo:active, +.gallery > .toolbar button.undo[pressed] { + background-image: -webkit-image-set( + url('../images/100/icon_undo_selected.png') 1x, + url('../images/200/icon_undo_selected.png') 2x); +} + +.gallery > .toolbar button.redo { + background-image: -webkit-image-set( + url('../images/100/icon_redo.png') 1x, + url('../images/200/icon_redo.png') 2x); + position: absolute; /* Exclude from center-packing*/ +} + +.gallery > .toolbar button.redo:active, +.gallery > .toolbar button.redo[pressed] { + background-image: -webkit-image-set( + url('../images/100/icon_redo_selected.png') 1x, + url('../images/200/icon_redo_selected.png') 2x); +} + +.gallery > .toolbar button[disabled], +.gallery[tools][locked] > .toolbar button { + opacity: 0.5; + pointer-events: none; +} + +.gallery > .toolbar button[hidden] { + display: none; +} + +.gallery[mode='slide'] > .toolbar > button.mode { + background-image: -webkit-image-set( + url('../images/100/icon_mosaic.png') 1x, + url('../images/200/icon_mosaic.png') 2x); +} + +.gallery[mode='slide'] > .toolbar > button.mode:active { + background-image: -webkit-image-set( + url('../images/100/icon_mosaic_selected.png') 1x, + url('../images/200/icon_mosaic_selected.png') 2x); +} + +.gallery[mode='mosaic'] > .toolbar > button.mode { + background-image: -webkit-image-set( + url('../images/100/icon_1up.png') 1x, + url('../images/200/icon_1up.png') 2x); +} + +.gallery[mode='mosaic'] > .toolbar > button.mode:active { + background-image: -webkit-image-set( + url('../images/100/icon_1up_selected.png') 1x, + url('../images/200/icon_1up_selected.png') 2x); +} + +.gallery > .toolbar > button.slideshow { + background-image: -webkit-image-set( + url('../images/100/icon_slideshow.png') 1x, + url('../images/200/icon_slideshow.png') 2x); +} + +.gallery > .toolbar > button.slideshow:active, +.gallery > .toolbar > button.slideshow[pressed] { + background-image: -webkit-image-set( + url('../images/100/icon_slideshow_selected.png') 1x, + url('../images/200/icon_slideshow_selected.png') 2x); +} + +.gallery > .toolbar > button.delete { + background-image: -webkit-image-set( + url('../images/100/icon_delete.png') 1x, + url('../images/200/icon_delete.png') 2x); +} + +.gallery > .toolbar > button.delete:active { + background-image: -webkit-image-set( + url('../images/100/icon_delete_selected.png') 1x, + url('../images/200/icon_delete_selected.png') 2x); +} + +.gallery > .toolbar > button.edit { + background-image: -webkit-image-set( + url('../images/100/icon_edit.png') 1x, + url('../images/200/icon_edit.png') 2x); +} + +.gallery > .toolbar > button.edit:active, +.gallery > .toolbar > button.edit[pressed] { + background-image: -webkit-image-set( + url('../images/100/icon_edit_selected.png') 1x, + url('../images/200/icon_edit_selected.png') 2x); +} + +.gallery > .toolbar > button.print { + background-image: -webkit-image-set( + url('../images/100/icon_print.png') 1x, + url('../images/200/icon_print.png') 2x); +} + +.gallery > .toolbar > button.print:active, +.gallery > .toolbar > button.print[pressed] { + background-image: -webkit-image-set( + url('../images/100/icon_print_selected.png') 1x, + url('../images/200/icon_print_selected.png') 2x); +} + +.gallery > .toolbar > button.share { + background-image: -webkit-image-set( + url('../images/100/icon_share.png') 1x, + url('../images/200/icon_share.png') 2x); +} + +.gallery > .toolbar > button.share:active, +.gallery > .toolbar > button.share[pressed] { + background-image: -webkit-image-set( + url('../images/100/icon_share_selected.png') 1x, + url('../images/200/icon_share_selected.png') 2x); +} + +.gallery > .toolbar > button.share[disabled] { + display: none; +} + +/* Secondary toolbar (mode-specific tools) */ + +.gallery .edit-modal { + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + bottom: 80px; + display: -webkit-box; + height: 40px; + pointer-events: none; + position: absolute; + width: 100%; +} + +.gallery .edit-modal-wrapper[hidden] { + display: none; +} + +.gallery .edit-modal-wrapper { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + background-color: rgba(0, 0, 0, 0.75); + color: white; + display: -webkit-box; + padding-right: 5px; + pointer-events: auto; +} + +.gallery .edit-modal .label { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + background-position: 20px center; + background-repeat: no-repeat; + display: -webkit-box; + height: 20px; + padding-left: 50px; + padding-right: 10px; +} + +.gallery .edit-modal .label.brightness { + background-image: -webkit-image-set( + url('../images/100/icon_brightness.png') 1x, + url('../images/200/icon_brightness.png') 2x); +} + +.gallery .edit-modal .label.contrast { + background-image: -webkit-image-set( + url('../images/100/icon_contrast.png') 1x, + url('../images/200/icon_contrast.png') 2x); + height: 24px; + margin-left: 15px; +} + +.gallery .edit-modal .range { + -webkit-appearance: none !important; + height: 3px; + margin-right: 10px; + margin-top: 1px; +} + +.gallery .edit-modal .range::-webkit-slider-thumb { + -webkit-appearance: none; + background-image: -webkit-image-set( + url('../images/100/slider_thumb.png') 1x, + url('../images/200/slider_thumb.png') 2x); + height: 29px; + width: 16px; +} + +/* Crop frame */ + +.gallery .crop-overlay { + -webkit-box-orient: vertical; + display: -webkit-box; + pointer-events: none; + position: absolute; +} + +.gallery .crop-overlay .shadow { + background-color: rgba(0, 0, 0, 0.65); +} + +.gallery .crop-overlay .middle-box { + -webkit-box-flex: 1; + -webkit-box-orient: horizontal; + display: -webkit-box; +} + +.gallery .crop-frame { + -webkit-box-flex: 1; + display: -webkit-box; + position: relative; +} + +.gallery .crop-frame div { + background-color: rgba(255, 255, 255, 1); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.75); + position: absolute; +} + +.gallery .crop-frame .horizontal { + height: 1px; + left: 7px; + right: 7px; +} + +.gallery .crop-frame .horizontal.top { + top: 0; +} + +.gallery .crop-frame .horizontal.bottom { + bottom: 0; +} + +.gallery .crop-frame .vertical { + bottom: 7px; + top: 7px; + width: 1px; +} + +.gallery .crop-frame .vertical.left { + left: 0; +} + +.gallery .crop-frame .vertical.right { + right: 0; +} + +.gallery .crop-frame .corner { + border-radius: 6px; + height: 13px; + width: 13px; +} + +.gallery .crop-frame .corner.left { + left: -6px; +} + +.gallery .crop-frame .corner.right { + right: -6px; +} + +.gallery .crop-frame .corner.top { + top: -6px; +} + +.gallery .crop-frame .corner.bottom { + bottom: -6px; +} + +/* Prompt/notification panel */ + +.gallery .prompt-wrapper { + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + display: -webkit-box; + height: 100%; + pointer-events: none; + position: absolute; + width: 100%; +} + +.gallery .prompt-wrapper[pos=top] { + -webkit-box-align: start; +} + +.gallery .prompt-wrapper[pos=center] { + -webkit-box-align: center; +} + +.gallery .prompt-wrapper[pos=center] .back-button { + display: none; +} + +.gallery .prompt-wrapper > div.dimmable { + opacity: 1; + transition: opacity 220ms ease; +} + +.gallery .prompt { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + background-color: rgba(0, 0, 0, 0.8); + color: white; + display: -webkit-box; + font-size: 120%; + height: 40px; + opacity: 0; + padding: 0 20px; + position: relative; + top: 5px; + transition: all 180ms ease; +} + +.gallery .prompt[state='fadein'] { + opacity: 1; + top: 0; +} + +.gallery .prompt[state='fadeout'] { + opacity: 0; + top: 0; +} + +.gallery .prompt-wrapper[pos=top] .prompt { + padding-right: 10px; +} + +.gallery .prompt .back-button { + background-image: -webkit-image-set( + url('../images/100/butterbar_close_button.png') 1x, + url('../images/200/butterbar_close_button.png') 2x); + background-position: center center; + background-repeat: no-repeat; + height: 16px; + margin-left: 16px; + opacity: 0.65; + pointer-events: auto; + width: 16px; +} + +.gallery .prompt .back-button:hover { + background-color: rgba(81, 81, 81, 1); + opacity: 1.0; +} + +.gallery .share-menu { + -webkit-box-align: stretch; + -webkit-box-orient: vertical; + -webkit-box-pack: start; + background-color: white; + border: 1px solid #7f7f7f; + border-radius: 1px; + bottom: 60px; + display: -webkit-box; + opacity: 1.0; + padding: 8px; + position: absolute; + right: 10px; + transition: opacity 500ms ease-in-out; +} + +.gallery .share-menu .bubble-point { + background-image: -webkit-image-set( + url('../images/100/bubble_point.png') 1x, + url('../images/200/bubble_point.png') 2x); + background-position: center top; + background-repeat: no-repeat; + bottom: -8px; + height: 8px; + padding: 0; + position: absolute; + right: 20px; + width: 20px; +} + +.gallery .share-menu[hidden] { + bottom: -100%; /* Offscreen so that 'dimmed' attribute does not show it. */ + opacity: 0; + pointer-events: none; +} + +.gallery .share-menu > .item { + background-color: rgba(0, 0, 0, 0); + background-position: 5px center; + background-repeat: no-repeat; + cursor: pointer; + padding: 5px; + padding-left: 26px; +} + +.gallery .share-menu > .item:hover { + background-color: rgba(240, 240, 240, 1); +} + +.gallery .share-menu > div > img { + display: block; + margin-right: 5px; +} + +/* Load spinner and error banner. */ + +.gallery .spinner { + background-image: url(../images/100/common/spinner.svg); + background-size: 100%; + height: 16px; + left: 50%; + margin-left: -8px; + margin-top: -8px; + position: absolute; + top: 50%; + width: 16px; +} + +.gallery:not([spinner]) .spinner { + display: none; +} + +.gallery .error-banner { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + background-color: rgba(24, 24, 24, 1); + background-image: -webkit-image-set( + url('../images/100/media/error.png') 1x, + url('../images/100/media/2x/error.png') 2x); + background-position: 25px center; + background-repeat: no-repeat; + color: white; + display: -webkit-box; + height: 54px; + padding-left: 70px; + padding-right: 35px; +} + +.gallery:not([error]) .error-banner { + display: none; +} + +/* Video playback support. */ + +.gallery video { + height: 100%; + position: absolute; + width: 100%; +} + +.gallery .video-controls-spacer { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + bottom: 60px; /* Just above the toolbar */ + display: -webkit-box; + height: 30px; + left: 0; + opacity: 0; + pointer-events: none; + position: absolute; + right: 0; +} + +.gallery[video] .video-controls-spacer { + /* Animate opacity on 'tools' attribute toggle. */ + /* Change opacity immediately on 'video' attribute change. */ + transition: opacity 280ms ease; +} + +.gallery[video][tools] .video-controls-spacer { + opacity: 1; +} + +.gallery .video-controls { + display: none; + max-width: 800px; +} + +.gallery[video] .video-controls { + -webkit-box-flex: 1; + display: -webkit-box; +} + +.gallery[video] > .toolbar .edit-main { + display: none; +} + +/* Mosaic view. */ +.mosaic { + bottom: 55px; /* Toolbar height. */ + left: 0; + overflow-x: scroll; + overflow-y: hidden; + position: absolute; + right: 0; + top: 0; + + /* transition-duration is set in Javascript. */ + transition-property: -webkit-transform; + transition-timing-function: linear; +} + +.mosaic::-webkit-scrollbar { + background: transparent; +} + +.mosaic::-webkit-scrollbar-thumb { + background: rgb(31, 31, 31); +} + +.gallery:not([mode='mosaic']) .mosaic::-webkit-scrollbar-thumb { + background: transparent; +} + +.mosaic-tile { + position: absolute; + /* Tile's zoom factor is animated on hover. We apply the transform to + the entire tile so that the image outline is included into the animation. */ + transition: -webkit-transform 150ms linear; +} + +/* Mosaic tile's opacity is controlled by |visible| attribute which changes + separately from .gallery[mode] */ +.mosaic:not([visible]) .mosaic-tile .img-border { + opacity: 0; +} + +/* Animate tile's opacity, except for the selected tile which should show/hide + instantly (this looks better when zooming to/from the slide mode). */ +.mosaic-tile:not([selected]) .img-border { + transition: opacity 350ms linear; +} + +/* Must be in sync with mosaic_mode.js. + Mosaic.Layout.SPACING should be equal to + top + bottom + border-top-width + border-bottom-width AND + left + right + border-left-width + border-right-width */ +.mosaic-tile .img-border { + border: 1px solid black; /* Space between the outline and the image. */ + bottom: 4px; + left: 4px; + outline: 2px solid transparent; + overflow: hidden; + position: absolute; + right: 4px; + top: 4px; +} + +/* Selected and hover state are only visible when zoom transition is over. */ +.mosaic[visible='normal'] .mosaic-tile[selected] .img-border { + outline-color: rgb(51, 153, 255); +} + +.mosaic[visible='normal'].hover-visible .mosaic-tile:hover { + -webkit-transform: scale(1.05); + z-index: 50; +} + +.mosaic[visible='normal'].hover-visible + .mosaic-tile:hover:not([selected]) .img-border { + outline-color: rgb(182, 212, 252); +} + +.mosaic-tile .img-wrapper { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.mosaic-tile .img-wrapper[generic-thumbnail], +.mosaic-tile .img-wrapper.animated:not([generic-thumbnail]) + canvas:not(.cached) { + -webkit-animation: fadeIn ease-in 1; + -webkit-animation-duration: 500ms; + -webkit-animation-fill-mode: forwards; +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* In order to do mode animated transitions smoothly we keep both mosaic and + image-container but transparent. */ +.gallery:not([mode='mosaic']) .mosaic, +.gallery:not([mode='slide']) .image-container { + pointer-events: none; +} + +.gallery:not([mode='slide']) .ribbon, +.gallery:not([mode='slide']) .arrow-box { + opacity: 0; + pointer-events: none; +} + +/* Temporary. Remove this along with the delete confirmation dialog + when Undo delete is implemented. */ +.cr-dialog-shield { + background-color: black; +} + +/* Slideshow controls */ + +.slideshow-toolbar { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + bottom: 0; + display: none; + left: 0; + padding-bottom: 6px; + pointer-events: none; + position: absolute; + right: 0; +} + +.gallery[tools][slideshow] .slideshow-toolbar { + display: -webkit-box; +} + +.slideshow-toolbar > div { + background-position: center; + background-repeat: no-repeat; + height: 68px; + opacity: 0.5; + pointer-events: auto; + width: 68px; +} + +.slideshow-toolbar > div:hover { + opacity: 1; +} + +.slideshow-toolbar > .slideshow-play { + background-image: -webkit-image-set( + url('../images/100/slideshow-play.png') 1x, + url('../images/200/slideshow-play.png') 2x); + margin-right: -2px; +} + +.gallery[slideshow='playing'] .slideshow-toolbar > .slideshow-play { + background-image: -webkit-image-set( + url('../images/100/slideshow-pause.png') 1x, + url('../images/200/slideshow-pause.png') 2x); +} + +.slideshow-toolbar > .slideshow-end { + background-image: -webkit-image-set( + url('../images/100/slideshow-end.png') 1x, + url('../images/200/slideshow-end.png') 2x); + margin-left: -2px; +} + +.gallery > .header > button { + -webkit-margin-start: 10px; + cursor: default; + height: 32px; + min-width: 32px; + width: 32px; +} + +.gallery > .header > .minimize-button { + background: -webkit-image-set( + url('chrome://resources/images/apps/topbar_button_minimize.png') 1x, + url('chrome://resources/images/2x/apps/topbar_button_minimize.png') 2x) + center; +} + +.gallery > .header > .maximize-button { + background: -webkit-image-set( + url('chrome://resources/images/apps/topbar_button_maximize.png') 1x, + url('chrome://resources/images/2x/apps/topbar_button_maximize.png') 2x) + center; +} + +.gallery > .header > .close-button { + background: -webkit-image-set( + url('chrome://resources/images/apps/topbar_button_close.png') 1x, + url('chrome://resources/images/2x/apps/topbar_button_close.png') 2x) + center; +} diff --git a/ui/file_manager/gallery/gallery.html b/ui/file_manager/gallery/gallery.html new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/ui/file_manager/gallery/gallery.html diff --git a/ui/file_manager/gallery/images/100/arrow_left.png b/ui/file_manager/gallery/images/100/arrow_left.png Binary files differnew file mode 100644 index 0000000000..85e687a116 --- /dev/null +++ b/ui/file_manager/gallery/images/100/arrow_left.png diff --git a/ui/file_manager/gallery/images/100/arrow_right.png b/ui/file_manager/gallery/images/100/arrow_right.png Binary files differnew file mode 100644 index 0000000000..0361556bd2 --- /dev/null +++ b/ui/file_manager/gallery/images/100/arrow_right.png diff --git a/ui/file_manager/gallery/images/100/back_to_files.png b/ui/file_manager/gallery/images/100/back_to_files.png Binary files differnew file mode 100644 index 0000000000..96e420a657 --- /dev/null +++ b/ui/file_manager/gallery/images/100/back_to_files.png diff --git a/ui/file_manager/gallery/images/100/bubble_point.png b/ui/file_manager/gallery/images/100/bubble_point.png Binary files differnew file mode 100644 index 0000000000..a4a44e0cf0 --- /dev/null +++ b/ui/file_manager/gallery/images/100/bubble_point.png diff --git a/ui/file_manager/gallery/images/100/butterbar_close_button.png b/ui/file_manager/gallery/images/100/butterbar_close_button.png Binary files differnew file mode 100644 index 0000000000..3c65c23015 --- /dev/null +++ b/ui/file_manager/gallery/images/100/butterbar_close_button.png diff --git a/ui/file_manager/gallery/images/100/cursor_crop.png b/ui/file_manager/gallery/images/100/cursor_crop.png Binary files differnew file mode 100644 index 0000000000..6084188e0a --- /dev/null +++ b/ui/file_manager/gallery/images/100/cursor_crop.png diff --git a/ui/file_manager/gallery/images/100/cursor_leftright.png b/ui/file_manager/gallery/images/100/cursor_leftright.png Binary files differnew file mode 100644 index 0000000000..30eeb03acc --- /dev/null +++ b/ui/file_manager/gallery/images/100/cursor_leftright.png diff --git a/ui/file_manager/gallery/images/100/cursor_move.png b/ui/file_manager/gallery/images/100/cursor_move.png Binary files differnew file mode 100644 index 0000000000..c5026d1b41 --- /dev/null +++ b/ui/file_manager/gallery/images/100/cursor_move.png diff --git a/ui/file_manager/gallery/images/100/cursor_nwse.png b/ui/file_manager/gallery/images/100/cursor_nwse.png Binary files differnew file mode 100644 index 0000000000..87fb564ba6 --- /dev/null +++ b/ui/file_manager/gallery/images/100/cursor_nwse.png diff --git a/ui/file_manager/gallery/images/100/cursor_swne.png b/ui/file_manager/gallery/images/100/cursor_swne.png Binary files differnew file mode 100644 index 0000000000..5e34475c86 --- /dev/null +++ b/ui/file_manager/gallery/images/100/cursor_swne.png diff --git a/ui/file_manager/gallery/images/100/cursor_updown.png b/ui/file_manager/gallery/images/100/cursor_updown.png Binary files differnew file mode 100644 index 0000000000..f3a422477c --- /dev/null +++ b/ui/file_manager/gallery/images/100/cursor_updown.png diff --git a/ui/file_manager/gallery/images/100/icon.png b/ui/file_manager/gallery/images/100/icon.png Binary files differnew file mode 100644 index 0000000000..9ec2dbd5cb --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon.png diff --git a/ui/file_manager/gallery/images/100/icon_1up.png b/ui/file_manager/gallery/images/100/icon_1up.png Binary files differnew file mode 100644 index 0000000000..546e87ae49 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_1up.png diff --git a/ui/file_manager/gallery/images/100/icon_1up_selected.png b/ui/file_manager/gallery/images/100/icon_1up_selected.png Binary files differnew file mode 100644 index 0000000000..a3043a8a05 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_1up_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_autofix.png b/ui/file_manager/gallery/images/100/icon_autofix.png Binary files differnew file mode 100644 index 0000000000..0fb5b827d7 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_autofix.png diff --git a/ui/file_manager/gallery/images/100/icon_autofix_selected.png b/ui/file_manager/gallery/images/100/icon_autofix_selected.png Binary files differnew file mode 100644 index 0000000000..fb5972d4d9 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_autofix_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_brightness.png b/ui/file_manager/gallery/images/100/icon_brightness.png Binary files differnew file mode 100644 index 0000000000..ec9c114d24 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_brightness.png diff --git a/ui/file_manager/gallery/images/100/icon_brightness_selected.png b/ui/file_manager/gallery/images/100/icon_brightness_selected.png Binary files differnew file mode 100644 index 0000000000..88ee72290a --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_brightness_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_contrast.png b/ui/file_manager/gallery/images/100/icon_contrast.png Binary files differnew file mode 100644 index 0000000000..0188d48344 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_contrast.png diff --git a/ui/file_manager/gallery/images/100/icon_crop.png b/ui/file_manager/gallery/images/100/icon_crop.png Binary files differnew file mode 100644 index 0000000000..efff5ba58f --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_crop.png diff --git a/ui/file_manager/gallery/images/100/icon_crop_selected.png b/ui/file_manager/gallery/images/100/icon_crop_selected.png Binary files differnew file mode 100644 index 0000000000..18b8317cba --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_crop_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_delete.png b/ui/file_manager/gallery/images/100/icon_delete.png Binary files differnew file mode 100644 index 0000000000..efb132aa72 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_delete.png diff --git a/ui/file_manager/gallery/images/100/icon_delete_selected.png b/ui/file_manager/gallery/images/100/icon_delete_selected.png Binary files differnew file mode 100644 index 0000000000..f2f88d8d0f --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_delete_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_edit.png b/ui/file_manager/gallery/images/100/icon_edit.png Binary files differnew file mode 100644 index 0000000000..fc72ecf3b6 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_edit.png diff --git a/ui/file_manager/gallery/images/100/icon_edit_selected.png b/ui/file_manager/gallery/images/100/icon_edit_selected.png Binary files differnew file mode 100644 index 0000000000..61540b5b46 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_edit_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_mosaic.png b/ui/file_manager/gallery/images/100/icon_mosaic.png Binary files differnew file mode 100644 index 0000000000..6e49d3c929 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_mosaic.png diff --git a/ui/file_manager/gallery/images/100/icon_mosaic_selected.png b/ui/file_manager/gallery/images/100/icon_mosaic_selected.png Binary files differnew file mode 100644 index 0000000000..86edb6e1ec --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_mosaic_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_print.png b/ui/file_manager/gallery/images/100/icon_print.png Binary files differnew file mode 100644 index 0000000000..b2355367c2 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_print.png diff --git a/ui/file_manager/gallery/images/100/icon_print_selected.png b/ui/file_manager/gallery/images/100/icon_print_selected.png Binary files differnew file mode 100644 index 0000000000..657b9c8e29 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_print_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_redo.png b/ui/file_manager/gallery/images/100/icon_redo.png Binary files differnew file mode 100644 index 0000000000..7b4703b618 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_redo.png diff --git a/ui/file_manager/gallery/images/100/icon_redo_selected.png b/ui/file_manager/gallery/images/100/icon_redo_selected.png Binary files differnew file mode 100644 index 0000000000..0022a136d0 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_redo_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_rotate.png b/ui/file_manager/gallery/images/100/icon_rotate.png Binary files differnew file mode 100644 index 0000000000..c60f258f6b --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_rotate.png diff --git a/ui/file_manager/gallery/images/100/icon_rotate_left.png b/ui/file_manager/gallery/images/100/icon_rotate_left.png Binary files differnew file mode 100644 index 0000000000..ef2f21f435 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_rotate_left.png diff --git a/ui/file_manager/gallery/images/100/icon_rotate_left_selected.png b/ui/file_manager/gallery/images/100/icon_rotate_left_selected.png Binary files differnew file mode 100644 index 0000000000..1e4c1d6d62 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_rotate_left_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_rotate_selected.png b/ui/file_manager/gallery/images/100/icon_rotate_selected.png Binary files differnew file mode 100644 index 0000000000..445350fcaf --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_rotate_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_share.png b/ui/file_manager/gallery/images/100/icon_share.png Binary files differnew file mode 100644 index 0000000000..36bb2218a8 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_share.png diff --git a/ui/file_manager/gallery/images/100/icon_share_selected.png b/ui/file_manager/gallery/images/100/icon_share_selected.png Binary files differnew file mode 100644 index 0000000000..438e8a2599 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_share_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_slideshow.png b/ui/file_manager/gallery/images/100/icon_slideshow.png Binary files differnew file mode 100644 index 0000000000..72763d44ed --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_slideshow.png diff --git a/ui/file_manager/gallery/images/100/icon_slideshow_selected.png b/ui/file_manager/gallery/images/100/icon_slideshow_selected.png Binary files differnew file mode 100644 index 0000000000..4f80a48d40 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_slideshow_selected.png diff --git a/ui/file_manager/gallery/images/100/icon_undo.png b/ui/file_manager/gallery/images/100/icon_undo.png Binary files differnew file mode 100644 index 0000000000..79e3fddf26 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_undo.png diff --git a/ui/file_manager/gallery/images/100/icon_undo_selected.png b/ui/file_manager/gallery/images/100/icon_undo_selected.png Binary files differnew file mode 100644 index 0000000000..d5d13a71a9 --- /dev/null +++ b/ui/file_manager/gallery/images/100/icon_undo_selected.png diff --git a/ui/file_manager/gallery/images/100/slider_thumb.png b/ui/file_manager/gallery/images/100/slider_thumb.png Binary files differnew file mode 100644 index 0000000000..cb2d712068 --- /dev/null +++ b/ui/file_manager/gallery/images/100/slider_thumb.png diff --git a/ui/file_manager/gallery/images/100/slideshow-end.png b/ui/file_manager/gallery/images/100/slideshow-end.png Binary files differnew file mode 100644 index 0000000000..f437111536 --- /dev/null +++ b/ui/file_manager/gallery/images/100/slideshow-end.png diff --git a/ui/file_manager/gallery/images/100/slideshow-pause.png b/ui/file_manager/gallery/images/100/slideshow-pause.png Binary files differnew file mode 100644 index 0000000000..2170ce90cf --- /dev/null +++ b/ui/file_manager/gallery/images/100/slideshow-pause.png diff --git a/ui/file_manager/gallery/images/100/slideshow-play.png b/ui/file_manager/gallery/images/100/slideshow-play.png Binary files differnew file mode 100644 index 0000000000..f949121d24 --- /dev/null +++ b/ui/file_manager/gallery/images/100/slideshow-play.png diff --git a/ui/file_manager/gallery/images/200/arrow_left.png b/ui/file_manager/gallery/images/200/arrow_left.png Binary files differnew file mode 100644 index 0000000000..6e4fb6659a --- /dev/null +++ b/ui/file_manager/gallery/images/200/arrow_left.png diff --git a/ui/file_manager/gallery/images/200/arrow_right.png b/ui/file_manager/gallery/images/200/arrow_right.png Binary files differnew file mode 100644 index 0000000000..22a6c73943 --- /dev/null +++ b/ui/file_manager/gallery/images/200/arrow_right.png diff --git a/ui/file_manager/gallery/images/200/back_to_files.png b/ui/file_manager/gallery/images/200/back_to_files.png Binary files differnew file mode 100644 index 0000000000..e04d9d317c --- /dev/null +++ b/ui/file_manager/gallery/images/200/back_to_files.png diff --git a/ui/file_manager/gallery/images/200/bubble_point.png b/ui/file_manager/gallery/images/200/bubble_point.png Binary files differnew file mode 100644 index 0000000000..161e4c06be --- /dev/null +++ b/ui/file_manager/gallery/images/200/bubble_point.png diff --git a/ui/file_manager/gallery/images/200/butterbar_close_button.png b/ui/file_manager/gallery/images/200/butterbar_close_button.png Binary files differnew file mode 100644 index 0000000000..aa6c816938 --- /dev/null +++ b/ui/file_manager/gallery/images/200/butterbar_close_button.png diff --git a/ui/file_manager/gallery/images/200/cursor_crop.png b/ui/file_manager/gallery/images/200/cursor_crop.png Binary files differnew file mode 100644 index 0000000000..6202fa978a --- /dev/null +++ b/ui/file_manager/gallery/images/200/cursor_crop.png diff --git a/ui/file_manager/gallery/images/200/cursor_leftright.png b/ui/file_manager/gallery/images/200/cursor_leftright.png Binary files differnew file mode 100644 index 0000000000..a7ee09c632 --- /dev/null +++ b/ui/file_manager/gallery/images/200/cursor_leftright.png diff --git a/ui/file_manager/gallery/images/200/cursor_move.png b/ui/file_manager/gallery/images/200/cursor_move.png Binary files differnew file mode 100644 index 0000000000..faa3c8ac39 --- /dev/null +++ b/ui/file_manager/gallery/images/200/cursor_move.png diff --git a/ui/file_manager/gallery/images/200/cursor_nwse.png b/ui/file_manager/gallery/images/200/cursor_nwse.png Binary files differnew file mode 100644 index 0000000000..0cd6399da7 --- /dev/null +++ b/ui/file_manager/gallery/images/200/cursor_nwse.png diff --git a/ui/file_manager/gallery/images/200/cursor_swne.png b/ui/file_manager/gallery/images/200/cursor_swne.png Binary files differnew file mode 100644 index 0000000000..04d9dc0270 --- /dev/null +++ b/ui/file_manager/gallery/images/200/cursor_swne.png diff --git a/ui/file_manager/gallery/images/200/cursor_updown.png b/ui/file_manager/gallery/images/200/cursor_updown.png Binary files differnew file mode 100644 index 0000000000..1e9adfb516 --- /dev/null +++ b/ui/file_manager/gallery/images/200/cursor_updown.png diff --git a/ui/file_manager/gallery/images/200/icon.png b/ui/file_manager/gallery/images/200/icon.png Binary files differnew file mode 100644 index 0000000000..df61101582 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon.png diff --git a/ui/file_manager/gallery/images/200/icon_1up.png b/ui/file_manager/gallery/images/200/icon_1up.png Binary files differnew file mode 100644 index 0000000000..58cbc28c4c --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_1up.png diff --git a/ui/file_manager/gallery/images/200/icon_1up_selected.png b/ui/file_manager/gallery/images/200/icon_1up_selected.png Binary files differnew file mode 100644 index 0000000000..a0ca726fa0 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_1up_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_autofix.png b/ui/file_manager/gallery/images/200/icon_autofix.png Binary files differnew file mode 100644 index 0000000000..8ce4917d4d --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_autofix.png diff --git a/ui/file_manager/gallery/images/200/icon_autofix_selected.png b/ui/file_manager/gallery/images/200/icon_autofix_selected.png Binary files differnew file mode 100644 index 0000000000..8838d5ce5f --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_autofix_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_brightness.png b/ui/file_manager/gallery/images/200/icon_brightness.png Binary files differnew file mode 100644 index 0000000000..ffcd385294 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_brightness.png diff --git a/ui/file_manager/gallery/images/200/icon_brightness_selected.png b/ui/file_manager/gallery/images/200/icon_brightness_selected.png Binary files differnew file mode 100644 index 0000000000..90bf03bbd8 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_brightness_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_contrast.png b/ui/file_manager/gallery/images/200/icon_contrast.png Binary files differnew file mode 100644 index 0000000000..eec931d56d --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_contrast.png diff --git a/ui/file_manager/gallery/images/200/icon_crop.png b/ui/file_manager/gallery/images/200/icon_crop.png Binary files differnew file mode 100644 index 0000000000..7c12fb5423 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_crop.png diff --git a/ui/file_manager/gallery/images/200/icon_crop_selected.png b/ui/file_manager/gallery/images/200/icon_crop_selected.png Binary files differnew file mode 100644 index 0000000000..bb2e9e6cc0 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_crop_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_delete.png b/ui/file_manager/gallery/images/200/icon_delete.png Binary files differnew file mode 100644 index 0000000000..a55ac6c808 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_delete.png diff --git a/ui/file_manager/gallery/images/200/icon_delete_selected.png b/ui/file_manager/gallery/images/200/icon_delete_selected.png Binary files differnew file mode 100644 index 0000000000..af54168a2e --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_delete_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_edit.png b/ui/file_manager/gallery/images/200/icon_edit.png Binary files differnew file mode 100644 index 0000000000..288bc5b7e4 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_edit.png diff --git a/ui/file_manager/gallery/images/200/icon_edit_selected.png b/ui/file_manager/gallery/images/200/icon_edit_selected.png Binary files differnew file mode 100644 index 0000000000..bcf993396d --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_edit_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_mosaic.png b/ui/file_manager/gallery/images/200/icon_mosaic.png Binary files differnew file mode 100644 index 0000000000..3e1a621b55 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_mosaic.png diff --git a/ui/file_manager/gallery/images/200/icon_mosaic_selected.png b/ui/file_manager/gallery/images/200/icon_mosaic_selected.png Binary files differnew file mode 100644 index 0000000000..d9e329d907 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_mosaic_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_print.png b/ui/file_manager/gallery/images/200/icon_print.png Binary files differnew file mode 100644 index 0000000000..b5a9be0c6b --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_print.png diff --git a/ui/file_manager/gallery/images/200/icon_print_selected.png b/ui/file_manager/gallery/images/200/icon_print_selected.png Binary files differnew file mode 100644 index 0000000000..048a34172e --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_print_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_redo.png b/ui/file_manager/gallery/images/200/icon_redo.png Binary files differnew file mode 100644 index 0000000000..075275da89 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_redo.png diff --git a/ui/file_manager/gallery/images/200/icon_redo_selected.png b/ui/file_manager/gallery/images/200/icon_redo_selected.png Binary files differnew file mode 100644 index 0000000000..beed584ffe --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_redo_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_rotate.png b/ui/file_manager/gallery/images/200/icon_rotate.png Binary files differnew file mode 100644 index 0000000000..db2c0b09f9 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_rotate.png diff --git a/ui/file_manager/gallery/images/200/icon_rotate_left.png b/ui/file_manager/gallery/images/200/icon_rotate_left.png Binary files differnew file mode 100644 index 0000000000..da57329d89 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_rotate_left.png diff --git a/ui/file_manager/gallery/images/200/icon_rotate_left_selected.png b/ui/file_manager/gallery/images/200/icon_rotate_left_selected.png Binary files differnew file mode 100644 index 0000000000..d1b00a7e73 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_rotate_left_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_rotate_selected.png b/ui/file_manager/gallery/images/200/icon_rotate_selected.png Binary files differnew file mode 100644 index 0000000000..b3a9bf60a2 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_rotate_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_share.png b/ui/file_manager/gallery/images/200/icon_share.png Binary files differnew file mode 100644 index 0000000000..b1da6d96d4 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_share.png diff --git a/ui/file_manager/gallery/images/200/icon_share_selected.png b/ui/file_manager/gallery/images/200/icon_share_selected.png Binary files differnew file mode 100644 index 0000000000..b3cd00f111 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_share_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_slideshow.png b/ui/file_manager/gallery/images/200/icon_slideshow.png Binary files differnew file mode 100644 index 0000000000..fec87c0ae9 --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_slideshow.png diff --git a/ui/file_manager/gallery/images/200/icon_slideshow_selected.png b/ui/file_manager/gallery/images/200/icon_slideshow_selected.png Binary files differnew file mode 100644 index 0000000000..4e1ed5aabf --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_slideshow_selected.png diff --git a/ui/file_manager/gallery/images/200/icon_undo.png b/ui/file_manager/gallery/images/200/icon_undo.png Binary files differnew file mode 100644 index 0000000000..c51fd6258e --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_undo.png diff --git a/ui/file_manager/gallery/images/200/icon_undo_selected.png b/ui/file_manager/gallery/images/200/icon_undo_selected.png Binary files differnew file mode 100644 index 0000000000..92d3a01d8e --- /dev/null +++ b/ui/file_manager/gallery/images/200/icon_undo_selected.png diff --git a/ui/file_manager/gallery/images/200/slider_thumb.png b/ui/file_manager/gallery/images/200/slider_thumb.png Binary files differnew file mode 100644 index 0000000000..e100da6261 --- /dev/null +++ b/ui/file_manager/gallery/images/200/slider_thumb.png diff --git a/ui/file_manager/gallery/images/200/slideshow-end.png b/ui/file_manager/gallery/images/200/slideshow-end.png Binary files differnew file mode 100644 index 0000000000..5e19f8d002 --- /dev/null +++ b/ui/file_manager/gallery/images/200/slideshow-end.png diff --git a/ui/file_manager/gallery/images/200/slideshow-pause.png b/ui/file_manager/gallery/images/200/slideshow-pause.png Binary files differnew file mode 100644 index 0000000000..13457d999f --- /dev/null +++ b/ui/file_manager/gallery/images/200/slideshow-pause.png diff --git a/ui/file_manager/gallery/images/200/slideshow-play.png b/ui/file_manager/gallery/images/200/slideshow-play.png Binary files differnew file mode 100644 index 0000000000..aa9bd88fc8 --- /dev/null +++ b/ui/file_manager/gallery/images/200/slideshow-play.png diff --git a/ui/file_manager/gallery/js/background.js b/ui/file_manager/gallery/js/background.js new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/ui/file_manager/gallery/js/background.js diff --git a/ui/file_manager/gallery/js/error_util.js b/ui/file_manager/gallery/js/error_util.js new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/ui/file_manager/gallery/js/error_util.js diff --git a/ui/file_manager/gallery/js/gallery.js b/ui/file_manager/gallery/js/gallery.js new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/ui/file_manager/gallery/js/gallery.js diff --git a/ui/file_manager/gallery/js/gallery_scripts.js b/ui/file_manager/gallery/js/gallery_scripts.js new file mode 100644 index 0000000000..a9286e09ab --- /dev/null +++ b/ui/file_manager/gallery/js/gallery_scripts.js @@ -0,0 +1,20 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// The include directives are put into Javascript-style comments to prevent +// parsing errors in non-flattened mode. The flattener still sees them. +// Note that this makes the flattener to comment out the first line of the +// included file but that's all right since any javascript file should start +// with a copyright comment anyway. + +//<include src="error_util.js"/> + +//<include src="../../../webui/resources/js/cr.js"/> +//<include src="../../../webui/resources/js/load_time_data.js"/> + +(function() { +'use strict'; + +//<include src="gallery.js"/> +})(); diff --git a/ui/file_manager/gallery/js/test_util.js b/ui/file_manager/gallery/js/test_util.js new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/ui/file_manager/gallery/js/test_util.js diff --git a/ui/file_manager/gallery/manifest.json b/ui/file_manager/gallery/manifest.json new file mode 100644 index 0000000000..3dbeda2222 --- /dev/null +++ b/ui/file_manager/gallery/manifest.json @@ -0,0 +1,50 @@ +{ + // chrome-extension://jcgeabjmjgoblfofpppfkcoakmfobdko/ + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0/gRbJc545iEGRZs20Rl/HtrSUp8H3gJd4Y6hCe0CG1xQiJhZ5nc8qZyxa96gMxRAKBq54S6sjVVtV6uS70oU6FvrvwItByYkkqr4ZE7eMJKwMqnGItxWbh6KBodf89lpKoIy6MtYTqubBhXB/IQBZsXah90tXwRzaaJNWw+2BBRIhcPsH3ng+wgN7rwFxo4HIv9ZpqkYlx90rwkfjOmKPPnSXyXFIBJfmqfdbd8PLtcxzzOTE+vxwoXZuYWrthKm4uKfNqXIYns74sSJlqyKfctuR+nQdNh8uePv0e+/Ul3wER1/jIXULLjfyoaklyDs+ak3SDf+xWScJ+0LJ0AwIDAQAB", + "manifest_version": 2, + "name": "Gallery", + "version": "2.0", + "description": "Picture and video browser app.", + "display_in_launcher": false, + "incognito" : "split", + "icons": { + "16": "images/100/icon.png", + "32": "images/200/icon.png" + }, + "permissions": [ + "fileSystem", + "fileBrowserPrivate", + "fullscreen", + "mediaPlayerPrivate", + "storage", + "chrome://theme/" + ], + "file_handlers": { + "video": { + "types": [ + "image/*" + ], + "extensions": [ + "bmp", + "gif", + "ico", + "jpg", + "jpeg", + "png", + "webp" + ], + // TODO(hirono): Rename and localize this. + "title": "Open in new Gallery" + } + }, + "app": { + "background": { + "scripts": [ + "js/error_util.js", + "js/test_util.js", + "js/background.js" + ] + }, + "content_security_policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' chrome://theme data:; media-src 'self'; object-src 'self'" + } +} diff --git a/ui/file_manager/image_loader/background.js b/ui/file_manager/image_loader/background.js new file mode 100644 index 0000000000..028a08298c --- /dev/null +++ b/ui/file_manager/image_loader/background.js @@ -0,0 +1,8 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +// Load the extension. +ImageLoader.getInstance(); diff --git a/ui/file_manager/image_loader/cache.js b/ui/file_manager/image_loader/cache.js new file mode 100644 index 0000000000..dde287c1a0 --- /dev/null +++ b/ui/file_manager/image_loader/cache.js @@ -0,0 +1,410 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +/** + * Persistent cache storing images in an indexed database on the hard disk. + * @constructor + */ +function Cache() { + /** + * IndexedDB database handle. + * @type {IDBDatabase} + * @private + */ + this.db_ = null; +} + +/** + * Cache database name. + * @type {string} + * @const + */ +Cache.DB_NAME = 'image-loader'; + +/** + * Cache database version. + * @type {number} + * @const + */ +Cache.DB_VERSION = 11; + +/** + * Memory limit for images data in bytes. + * + * @const + * @type {number} + */ +Cache.MEMORY_LIMIT = 250 * 1024 * 1024; // 250 MB. + +/** + * Minimal amount of memory freed per eviction. Used to limit number of + * evictions which are expensive. + * + * @const + * @type {number} + */ +Cache.EVICTION_CHUNK_SIZE = 50 * 1024 * 1024; // 50 MB. + +/** + * Creates a cache key. + * + * @param {Object} request Request options. + * @return {string} Cache key. + */ +Cache.createKey = function(request) { + return JSON.stringify({url: request.url, + scale: request.scale, + width: request.width, + height: request.height, + maxWidth: request.maxWidth, + maxHeight: request.maxHeight}); +}; + +/** + * Initializes the cache database. + * @param {function()} callback Completion callback. + */ +Cache.prototype.initialize = function(callback) { + // Establish a connection to the database or (re)create it if not available + // or not up to date. After changing the database's schema, increment + // Cache.DB_VERSION to force database recreating. + var openRequest = window.webkitIndexedDB.open(Cache.DB_NAME, + Cache.DB_VERSION); + + openRequest.onsuccess = function(e) { + this.db_ = e.target.result; + callback(); + }.bind(this); + + openRequest.onerror = callback; + + openRequest.onupgradeneeded = function(e) { + console.info('Cache database creating or upgrading.'); + var db = e.target.result; + if (db.objectStoreNames.contains('metadata')) + db.deleteObjectStore('metadata'); + if (db.objectStoreNames.contains('data')) + db.deleteObjectStore('data'); + if (db.objectStoreNames.contains('settings')) + db.deleteObjectStore('settings'); + db.createObjectStore('metadata', {keyPath: 'key'}); + db.createObjectStore('data', {keyPath: 'key'}); + db.createObjectStore('settings', {keyPath: 'key'}); + }; +}; + +/** + * Sets size of the cache. + * + * @param {number} size Size in bytes. + * @param {IDBTransaction=} opt_transaction Transaction to be reused. If not + * provided, then a new one is created. + * @private + */ +Cache.prototype.setCacheSize_ = function(size, opt_transaction) { + var transaction = opt_transaction || + this.db_.transaction(['settings'], 'readwrite'); + var settingsStore = transaction.objectStore('settings'); + + settingsStore.put({key: 'size', value: size}); // Update asynchronously. +}; + +/** + * Fetches current size of the cache. + * + * @param {function(number)} onSuccess Callback to return the size. + * @param {function()} onFailure Failure callback. + * @param {IDBTransaction=} opt_transaction Transaction to be reused. If not + * provided, then a new one is created. + * @private + */ +Cache.prototype.fetchCacheSize_ = function( + onSuccess, onFailure, opt_transaction) { + var transaction = opt_transaction || + this.db_.transaction(['settings', 'metadata', 'data'], 'readwrite'); + var settingsStore = transaction.objectStore('settings'); + var sizeRequest = settingsStore.get('size'); + + sizeRequest.onsuccess = function(e) { + if (e.target.result) + onSuccess(e.target.result.value); + else + onSuccess(0); + }; + + sizeRequest.onerror = function() { + console.error('Failed to fetch size from the database.'); + onFailure(); + }; +}; + +/** + * Evicts the least used elements in cache to make space for a new image and + * updates size of the cache taking into account the upcoming item. + * + * @param {number} size Requested size. + * @param {function()} onSuccess Success callback. + * @param {function()} onFailure Failure callback. + * @param {IDBTransaction=} opt_transaction Transaction to be reused. If not + * provided, then a new one is created. + * @private + */ +Cache.prototype.evictCache_ = function( + size, onSuccess, onFailure, opt_transaction) { + var transaction = opt_transaction || + this.db_.transaction(['settings', 'metadata', 'data'], 'readwrite'); + + // Check if the requested size is smaller than the cache size. + if (size > Cache.MEMORY_LIMIT) { + onFailure(); + return; + } + + var onCacheSize = function(cacheSize) { + if (size < Cache.MEMORY_LIMIT - cacheSize) { + // Enough space, no need to evict. + this.setCacheSize_(cacheSize + size, transaction); + onSuccess(); + return; + } + + var bytesToEvict = Math.max(size, Cache.EVICTION_CHUNK_SIZE); + + // Fetch all metadata. + var metadataEntries = []; + var metadataStore = transaction.objectStore('metadata'); + var dataStore = transaction.objectStore('data'); + + var onEntriesFetched = function() { + metadataEntries.sort(function(a, b) { + return b.lastLoadTimestamp - a.lastLoadTimestamp; + }); + + var totalEvicted = 0; + while (bytesToEvict > 0) { + var entry = metadataEntries.pop(); + totalEvicted += entry.size; + bytesToEvict -= entry.size; + metadataStore.delete(entry.key); // Remove asynchronously. + dataStore.delete(entry.key); // Remove asynchronously. + } + + this.setCacheSize_(cacheSize - totalEvicted + size, transaction); + }.bind(this); + + metadataStore.openCursor().onsuccess = function(e) { + var cursor = event.target.result; + if (cursor) { + metadataEntries.push(cursor.value); + cursor.continue(); + } else { + onEntriesFetched(); + } + }; + }.bind(this); + + this.fetchCacheSize_(onCacheSize, onFailure, transaction); +}; + +/** + * Saves an image in the cache. + * + * @param {string} key Cache key. + * @param {string} data Image data. + * @param {number} timestamp Last modification timestamp. Used to detect + * if the cache entry becomes out of date. + */ +Cache.prototype.saveImage = function(key, data, timestamp) { + if (!this.db_) { + console.warn('Cache database not available.'); + return; + } + + var onNotFoundInCache = function() { + var metadataEntry = {key: key, + timestamp: timestamp, + size: data.length, + lastLoadTimestamp: Date.now()}; + var dataEntry = {key: key, + data: data}; + + var transaction = this.db_.transaction(['settings', 'metadata', 'data'], + 'readwrite'); + var metadataStore = transaction.objectStore('metadata'); + var dataStore = transaction.objectStore('data'); + + var onCacheEvicted = function() { + metadataStore.put(metadataEntry); // Add asynchronously. + dataStore.put(dataEntry); // Add asynchronously. + }; + + // Make sure there is enough space in the cache. + this.evictCache_(data.length, onCacheEvicted, function() {}, transaction); + }.bind(this); + + // Check if the image is already in cache. If not, then save it to cache. + this.loadImage(key, timestamp, function() {}, onNotFoundInCache); +}; + +/** + * Loads an image from the cache (if available) or returns null. + * + * @param {string} key Cache key. + * @param {number} timestamp Last modification timestamp. If different + * that the one in cache, then the entry will be invalidated. + * @param {function(<string>)} onSuccess Success callback with the image's data. + * @param {function()} onFailure Failure callback. + */ +Cache.prototype.loadImage = function(key, timestamp, onSuccess, onFailure) { + if (!this.db_) { + console.warn('Cache database not available.'); + onFailure(); + return; + } + + var transaction = this.db_.transaction(['settings', 'metadata', 'data'], + 'readwrite'); + var metadataStore = transaction.objectStore('metadata'); + var dataStore = transaction.objectStore('data'); + var metadataRequest = metadataStore.get(key); + var dataRequest = dataStore.get(key); + + var metadataEntry = null; + var metadataReceived = false; + var dataEntry = null; + var dataReceived = false; + + var onPartialSuccess = function() { + // Check if all sub-requests have finished. + if (!metadataReceived || !dataReceived) + return; + + // Check if both entries are available or both unavailable. + if (!!metadataEntry != !!dataEntry) { + console.warn('Incosistent cache database.'); + onFailure(); + return; + } + + // Process the responses. + if (!metadataEntry) { + // The image not found. + onFailure(); + } else if (metadataEntry.timestamp != timestamp) { + // The image is not up to date, so remove it. + this.removeImage(key, function() {}, function() {}, transaction); + onFailure(); + } else { + // The image is available. Update the last load time and return the + // image data. + metadataEntry.lastLoadTimestamp = Date.now(); + metadataStore.put(metadataEntry); // Added asynchronously. + onSuccess(dataEntry.data); + } + }.bind(this); + + metadataRequest.onsuccess = function(e) { + if (e.target.result) + metadataEntry = e.target.result; + metadataReceived = true; + onPartialSuccess(); + }; + + dataRequest.onsuccess = function(e) { + if (e.target.result) + dataEntry = e.target.result; + dataReceived = true; + onPartialSuccess(); + }; + + metadataRequest.onerror = function() { + console.error('Failed to fetch metadata from the database.'); + metadataReceived = true; + onPartialSuccess(); + }; + + dataRequest.onerror = function() { + console.error('Failed to fetch image data from the database.'); + dataReceived = true; + onPartialSuccess(); + }; +}; + +/** + * Removes the image from the cache. + * + * @param {string} key Cache key. + * @param {function()=} opt_onSuccess Success callback. + * @param {function()=} opt_onFailure Failure callback. + * @param {IDBTransaction=} opt_transaction Transaction to be reused. If not + * provided, then a new one is created. + */ +Cache.prototype.removeImage = function( + key, opt_onSuccess, opt_onFailure, opt_transaction) { + if (!this.db_) { + console.warn('Cache database not available.'); + return; + } + + var transaction = opt_transaction || + this.db_.transaction(['settings', 'metadata', 'data'], 'readwrite'); + var metadataStore = transaction.objectStore('metadata'); + var dataStore = transaction.objectStore('data'); + + var cacheSize = null; + var cacheSizeReceived = false; + var metadataEntry = null; + var metadataReceived = false; + + var onPartialSuccess = function() { + if (!cacheSizeReceived || !metadataReceived) + return; + + // If either cache size or metadata entry is not available, then it is + // an error. + if (cacheSize === null || !metadataEntry) { + if (opt_onFailure) + onFailure(); + return; + } + + if (opt_onSuccess) + opt_onSuccess(); + + this.setCacheSize_(cacheSize - metadataEntry.size, transaction); + metadataStore.delete(key); // Delete asynchronously. + dataStore.delete(key); // Delete asynchronously. + }.bind(this); + + var onCacheSizeFailure = function() { + cacheSizeReceived = true; + }; + + var onCacheSizeSuccess = function(result) { + cacheSize = result; + cacheSizeReceived = true; + onPartialSuccess(); + }; + + // Fetch the current cache size. + this.fetchCacheSize_(onCacheSizeSuccess, onCacheSizeFailure, transaction); + + // Receive image's metadata. + var metadataRequest = metadataStore.get(key); + + metadataRequest.onsuccess = function(e) { + if (e.target.result) + metadataEntry = e.target.result; + metadataReceived = true; + onPartialSuccess(); + }; + + metadataRequest.onerror = function() { + console.error('Failed to remove an image.'); + metadataReceived = true; + onPartialSuccess(); + }; +}; diff --git a/ui/file_manager/image_loader/image_loader.js b/ui/file_manager/image_loader/image_loader.js new file mode 100644 index 0000000000..24b07a4d62 --- /dev/null +++ b/ui/file_manager/image_loader/image_loader.js @@ -0,0 +1,234 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +/** + * Loads and resizes an image. + * @constructor + */ +function ImageLoader() { + /** + * Persistent cache object. + * @type {Cache} + * @private + */ + this.cache_ = new Cache(); + + /** + * Manages pending requests and runs them in order of priorities. + * @type {Worker} + * @private + */ + this.worker_ = new Worker(); + + // Grant permissions to all volumes, initialize the cache and then start the + // worker. + chrome.fileBrowserPrivate.getVolumeMetadataList(function(volumeMetadataList) { + var initPromises = volumeMetadataList.map(function(volumeMetadata) { + var requestPromise = new Promise(function(callback) { + chrome.fileBrowserPrivate.requestFileSystem( + volumeMetadata.volumeId, + callback); + }); + return requestPromise; + }); + initPromises.push(new Promise(this.cache_.initialize.bind(this.cache_))); + + // After all initializatino promises are done, start the worker. + Promise.all(initPromises).then(this.worker_.start.bind(this.worker_)); + + // Listen for mount events, and grant permissions to volumes being mounted. + chrome.fileBrowserPrivate.onMountCompleted.addListener( + function(event) { + if (event.eventType == 'mount' && event.status == 'success') { + chrome.fileBrowserPrivate.requestFileSystem( + event.volumeMetadata.volumeId, function() {}); + } + }); + }.bind(this)); + + // Listen for incoming requests. + chrome.extension.onMessageExternal.addListener(function(request, + sender, + sendResponse) { + if (ImageLoader.ALLOWED_CLIENTS.indexOf(sender.id) !== -1) { + // Sending a response may fail if the receiver already went offline. + // This is not an error, but a normal and quite common situation. + var failSafeSendResponse = function(response) { + try { + sendResponse(response); + } + catch (e) { + // Ignore the error. + } + }; + return this.onMessage_(sender.id, request, failSafeSendResponse); + } + }.bind(this)); +} + +/** + * List of extensions allowed to perform image requests. + * + * @const + * @type {Array.<string>} + */ +ImageLoader.ALLOWED_CLIENTS = + ['hhaomjibdihmijegdhdafkllkbggdgoj']; // File Manager's extension id. + +/** + * Handles a request. Depending on type of the request, starts or stops + * an image task. + * + * @param {string} senderId Sender's extension id. + * @param {Object} request Request message as a hash array. + * @param {function} callback Callback to be called to return response. + * @return {boolean} True if the message channel should stay alive until the + * callback is called. + * @private + */ +ImageLoader.prototype.onMessage_ = function(senderId, request, callback) { + var requestId = senderId + ':' + request.taskId; + if (request.cancel) { + // Cancel a task. + this.worker_.remove(requestId); + return false; // No callback calls. + } else { + // Create a request task and add it to the worker (queue). + var requestTask = new Request(requestId, this.cache_, request, callback); + this.worker_.add(requestTask); + return true; // Request will call the callback. + } +}; + +/** + * Returns the singleton instance. + * @return {ImageLoader} ImageLoader object. + */ +ImageLoader.getInstance = function() { + if (!ImageLoader.instance_) + ImageLoader.instance_ = new ImageLoader(); + return ImageLoader.instance_; +}; + +/** + * Checks if the options contain any image processing. + * + * @param {number} width Source width. + * @param {number} height Source height. + * @param {Object} options Resizing options as a hash array. + * @return {boolean} True if yes, false if not. + */ +ImageLoader.shouldProcess = function(width, height, options) { + var targetDimensions = ImageLoader.resizeDimensions(width, height, options); + + // Dimensions has to be adjusted. + if (targetDimensions.width != width || targetDimensions.height != height) + return true; + + // Orientation has to be adjusted. + if (options.orientation) + return true; + + // No changes required. + return false; +}; + +/** + * Calculates dimensions taking into account resize options, such as: + * - scale: for scaling, + * - maxWidth, maxHeight: for maximum dimensions, + * - width, height: for exact requested size. + * Returns the target size as hash array with width, height properties. + * + * @param {number} width Source width. + * @param {number} height Source height. + * @param {Object} options Resizing options as a hash array. + * @return {Object} Dimensions, eg. {width: 100, height: 50}. + */ +ImageLoader.resizeDimensions = function(width, height, options) { + var sourceWidth = width; + var sourceHeight = height; + + // Flip dimensions for odd orientation values: 1 (90deg) and 3 (270deg). + if (options.orientation && options.orientation % 2) { + sourceWidth = height; + sourceHeight = width; + } + + var targetWidth = sourceWidth; + var targetHeight = sourceHeight; + + if ('scale' in options) { + targetWidth = sourceWidth * options.scale; + targetHeight = sourceHeight * options.scale; + } + + if (options.maxWidth && + targetWidth > options.maxWidth) { + var scale = options.maxWidth / targetWidth; + targetWidth *= scale; + targetHeight *= scale; + } + + if (options.maxHeight && + targetHeight > options.maxHeight) { + var scale = options.maxHeight / targetHeight; + targetWidth *= scale; + targetHeight *= scale; + } + + if (options.width) + targetWidth = options.width; + + if (options.height) + targetHeight = options.height; + + targetWidth = Math.round(targetWidth); + targetHeight = Math.round(targetHeight); + + return {width: targetWidth, height: targetHeight}; +}; + +/** + * Performs resizing of the source image into the target canvas. + * + * @param {HTMLCanvasElement|Image} source Source image or canvas. + * @param {HTMLCanvasElement} target Target canvas. + * @param {Object} options Resizing options as a hash array. + */ +ImageLoader.resize = function(source, target, options) { + var targetDimensions = ImageLoader.resizeDimensions( + source.width, source.height, options); + + target.width = targetDimensions.width; + target.height = targetDimensions.height; + + // Default orientation is 0deg. + var orientation = options.orientation || 0; + + // For odd orientation values: 1 (90deg) and 3 (270deg) flip dimensions. + var drawImageWidth; + var drawImageHeight; + if (orientation % 2) { + drawImageWidth = target.height; + drawImageHeight = target.width; + } else { + drawImageWidth = target.width; + drawImageHeight = target.height; + } + + var targetContext = target.getContext('2d'); + targetContext.save(); + targetContext.translate(target.width / 2, target.height / 2); + targetContext.rotate(orientation * Math.PI / 2); + targetContext.drawImage( + source, + 0, 0, + source.width, source.height, + -drawImageWidth / 2, -drawImageHeight / 2, + drawImageWidth, drawImageHeight); + targetContext.restore(); +}; diff --git a/ui/file_manager/image_loader/image_loader_client.js b/ui/file_manager/image_loader/image_loader_client.js new file mode 100644 index 0000000000..9baba5997b --- /dev/null +++ b/ui/file_manager/image_loader/image_loader_client.js @@ -0,0 +1,366 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +/** + * Client used to connect to the remote ImageLoader extension. Client class runs + * in the extension, where the client.js is included (eg. Files.app). + * It sends remote requests using IPC to the ImageLoader class and forwards + * its responses. + * + * Implements cache, which is stored in the calling extension. + * + * @constructor + */ +function ImageLoaderClient() { + /** + * Hash array with active tasks. + * @type {Object} + * @private + */ + this.tasks_ = {}; + + /** + * @type {number} + * @private + */ + this.lastTaskId_ = 0; + + /** + * LRU cache for images. + * @type {ImageLoaderClient.Cache} + * @private + */ + this.cache_ = new ImageLoaderClient.Cache(); +} + +/** + * Image loader's extension id. + * @const + * @type {string} + */ +ImageLoaderClient.EXTENSION_ID = 'pmfjbimdmchhbnneeidfognadeopoehp'; + +/** + * Returns a singleton instance. + * @return {Client} Client instance. + */ +ImageLoaderClient.getInstance = function() { + if (!ImageLoaderClient.instance_) + ImageLoaderClient.instance_ = new ImageLoaderClient(); + return ImageLoaderClient.instance_; +}; + +/** + * Records binary metrics. Counts for true and false are stored as a histogram. + * @param {string} name Histogram's name. + * @param {boolean} value True or false. + */ +ImageLoaderClient.recordBinary = function(name, value) { + chrome.metricsPrivate.recordValue( + { metricName: 'ImageLoader.Client.' + name, + type: 'histogram-linear', + min: 1, // According to histogram.h, this should be 1 for enums. + max: 2, // Maximum should be exclusive. + buckets: 3 }, // Number of buckets: 0, 1 and overflowing 2. + value ? 1 : 0); +}; + +/** + * Records percent metrics, stored as a histogram. + * @param {string} name Histogram's name. + * @param {number} value Value (0..100). + */ +ImageLoaderClient.recordPercentage = function(name, value) { + chrome.metricsPrivate.recordPercentage('ImageLoader.Client.' + name, + Math.round(value)); +}; + +/** + * Sends a message to the Image Loader extension. + * @param {Object} request Hash array with request data. + * @param {function(Object)=} opt_callback Response handling callback. + * The response is passed as a hash array. + * @private + */ +ImageLoaderClient.sendMessage_ = function(request, opt_callback) { + opt_callback = opt_callback || function(response) {}; + var sendMessage = chrome.runtime ? chrome.runtime.sendMessage : + chrome.extension.sendMessage; + sendMessage(ImageLoaderClient.EXTENSION_ID, request, opt_callback); +}; + +/** + * Handles a message from the remote image loader and calls the registered + * callback to pass the response back to the requester. + * + * @param {Object} message Response message as a hash array. + * @private + */ +ImageLoaderClient.prototype.handleMessage_ = function(message) { + if (!(message.taskId in this.tasks_)) { + // This task has been canceled, but was already fetched, so it's result + // should be discarded anyway. + return; + } + + var task = this.tasks_[message.taskId]; + + // Check if the task is still valid. + if (task.isValid()) + task.accept(message); + + delete this.tasks_[message.taskId]; +}; + +/** + * Loads and resizes and image. Use opt_isValid to easily cancel requests + * which are not valid anymore, which will reduce cpu consumption. + * + * @param {string} url Url of the requested image. + * @param {function} callback Callback used to return response. + * @param {Object=} opt_options Loader options, such as: scale, maxHeight, + * width, height and/or cache. + * @param {function=} opt_isValid Function returning false in case + * a request is not valid anymore, eg. parent node has been detached. + * @return {?number} Remote task id or null if loaded from cache. + */ +ImageLoaderClient.prototype.load = function( + url, callback, opt_options, opt_isValid) { + opt_options = opt_options || {}; + opt_isValid = opt_isValid || function() { return true; }; + + // Record cache usage. + ImageLoaderClient.recordPercentage('Cache.Usage', this.cache_.getUsage()); + + // Cancel old, invalid tasks. + var taskKeys = Object.keys(this.tasks_); + for (var index = 0; index < taskKeys.length; index++) { + var taskKey = taskKeys[index]; + var task = this.tasks_[taskKey]; + if (!task.isValid()) { + // Cancel this task since it is not valid anymore. + this.cancel(taskKey); + delete this.tasks_[taskKey]; + } + } + + // Replace the extension id. + var sourceId = chrome.i18n.getMessage('@@extension_id'); + var targetId = ImageLoaderClient.EXTENSION_ID; + + url = url.replace('filesystem:chrome-extension://' + sourceId, + 'filesystem:chrome-extension://' + targetId); + + // Try to load from cache, if available. + var cacheKey = ImageLoaderClient.Cache.createKey(url, opt_options); + if (opt_options.cache) { + // Load from cache. + ImageLoaderClient.recordBinary('Cached', 1); + var cachedData = this.cache_.loadImage(cacheKey, opt_options.timestamp); + if (cachedData) { + ImageLoaderClient.recordBinary('Cache.HitMiss', 1); + callback({status: 'success', data: cachedData}); + return null; + } else { + ImageLoaderClient.recordBinary('Cache.HitMiss', 0); + } + } else { + // Remove from cache. + ImageLoaderClient.recordBinary('Cached', 0); + this.cache_.removeImage(cacheKey); + } + + // Not available in cache, performing a request to a remote extension. + var request = opt_options; + this.lastTaskId_++; + var task = {isValid: opt_isValid}; + this.tasks_[this.lastTaskId_] = task; + + request.url = url; + request.taskId = this.lastTaskId_; + request.timestamp = opt_options.timestamp; + + ImageLoaderClient.sendMessage_( + request, + function(result) { + // Save to cache. + if (result.status == 'success' && opt_options.cache) + this.cache_.saveImage(cacheKey, result.data, opt_options.timestamp); + callback(result); + }.bind(this)); + return request.taskId; +}; + +/** + * Cancels the request. + * @param {number} taskId Task id returned by ImageLoaderClient.load(). + */ +ImageLoaderClient.prototype.cancel = function(taskId) { + ImageLoaderClient.sendMessage_({taskId: taskId, cancel: true}); +}; + +/** + * Least Recently Used (LRU) cache implementation to be used by + * Client class. It has memory constraints, so it will never + * exceed specified memory limit defined in MEMORY_LIMIT. + * + * @constructor + */ +ImageLoaderClient.Cache = function() { + this.images_ = []; + this.size_ = 0; +}; + +/** + * Memory limit for images data in bytes. + * + * @const + * @type {number} + */ +ImageLoaderClient.Cache.MEMORY_LIMIT = 20 * 1024 * 1024; // 20 MB. + +/** + * Creates a cache key. + * + * @param {string} url Image url. + * @param {Object=} opt_options Loader options as a hash array. + * @return {string} Cache key. + */ +ImageLoaderClient.Cache.createKey = function(url, opt_options) { + opt_options = opt_options || {}; + return JSON.stringify({url: url, + orientation: opt_options.orientation, + scale: opt_options.scale, + width: opt_options.width, + height: opt_options.height, + maxWidth: opt_options.maxWidth, + maxHeight: opt_options.maxHeight}); +}; + +/** + * Evicts the least used elements in cache to make space for a new image. + * + * @param {number} size Requested size. + * @private + */ +ImageLoaderClient.Cache.prototype.evictCache_ = function(size) { + // Sort from the most recent to the oldest. + this.images_.sort(function(a, b) { + return b.lastLoadTimestamp - a.lastLoadTimestamp; + }); + + while (this.images_.length > 0 && + (ImageLoaderClient.Cache.MEMORY_LIMIT - this.size_ < size)) { + var entry = this.images_.pop(); + this.size_ -= entry.data.length; + } +}; + +/** + * Saves an image in the cache. + * + * @param {string} key Cache key. + * @param {string} data Image data. + * @param {number=} opt_timestamp Last modification timestamp. Used to detect + * if the cache entry becomes out of date. + */ +ImageLoaderClient.Cache.prototype.saveImage = function( + key, data, opt_timestamp) { + // If the image is currently in cache, then remove it. + if (this.images_[key]) + this.removeImage(key); + + if (ImageLoaderClient.Cache.MEMORY_LIMIT - this.size_ < data.length) { + ImageLoaderClient.recordBinary('Evicted', 1); + this.evictCache_(data.length); + } else { + ImageLoaderClient.recordBinary('Evicted', 0); + } + + if (ImageLoaderClient.Cache.MEMORY_LIMIT - this.size_ >= data.length) { + this.images_[key] = {lastLoadTimestamp: Date.now(), + timestamp: opt_timestamp ? opt_timestamp : null, + data: data}; + this.size_ += data.length; + } +}; + +/** + * Loads an image from the cache (if available) or returns null. + * + * @param {string} key Cache key. + * @param {number=} opt_timestamp Last modification timestamp. If different + * that the one in cache, then the entry will be invalidated. + * @return {?string} Data of the loaded image or null. + */ +ImageLoaderClient.Cache.prototype.loadImage = function(key, opt_timestamp) { + if (!(key in this.images_)) + return null; + + var entry = this.images_[key]; + entry.lastLoadTimestamp = Date.now(); + + // Check if the image in cache is up to date. If not, then remove it and + // return null. + if (entry.timestamp != opt_timestamp) { + this.removeImage(key); + return null; + } + + return entry.data; +}; + +/** + * Returns cache usage. + * @return {number} Value in percent points (0..100). + */ +ImageLoaderClient.Cache.prototype.getUsage = function() { + return this.size_ / ImageLoaderClient.Cache.MEMORY_LIMIT * 100.0; +}; + +/** + * Removes the image from the cache. + * @param {string} key Cache key. + */ +ImageLoaderClient.Cache.prototype.removeImage = function(key) { + if (!(key in this.images_)) + return; + + var entry = this.images_[key]; + this.size_ -= entry.data.length; + delete this.images_[key]; +}; + +// Helper functions. + +/** + * Loads and resizes and image. Use opt_isValid to easily cancel requests + * which are not valid anymore, which will reduce cpu consumption. + * + * @param {string} url Url of the requested image. + * @param {Image} image Image node to load the requested picture into. + * @param {Object} options Loader options, such as: orientation, scale, + * maxHeight, width, height and/or cache. + * @param {function=} onSuccess Callback for success. + * @param {function=} onError Callback for failure. + * @param {function=} opt_isValid Function returning false in case + * a request is not valid anymore, eg. parent node has been detached. + * @return {?number} Remote task id or null if loaded from cache. + */ +ImageLoaderClient.loadToImage = function( + url, image, options, onSuccess, onError, opt_isValid) { + var callback = function(result) { + if (result.status == 'error') { + onError(); + return; + } + image.src = result.data; + onSuccess(); + }; + + return ImageLoaderClient.getInstance().load( + url, callback, options, opt_isValid); +}; diff --git a/ui/file_manager/image_loader/manifest.json b/ui/file_manager/image_loader/manifest.json new file mode 100644 index 0000000000..ba4e8206b8 --- /dev/null +++ b/ui/file_manager/image_loader/manifest.json @@ -0,0 +1,26 @@ +{ + // chrome-extension://pmfjbimdmchhbnneeidfognadeopoehp + "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDowC9B4+K6zbl4PnALNyOUgra/MPdD8gZ39Fk/IAJWt03qrN7vz1gd/mmrBg0EEIsyLRmUmfyVEfvcIUOZxFqn4A9D2aaRSvNHy9qkasZMBDEql8Nt2iNZm/kGS7sizidDV6Bc/vyLNiH1gKOXBQ42JIxKjgtrmnhGV2giw2vJGwIDAQAB", + "name": "Image loader", + "version": "0.1", + "description": "Image loader", + "incognito" : "split", + "manifest_version": 2, + "permissions": [ + "fileBrowserHandler", + "fileBrowserPrivate", + "https://www.googledrive.com/" + ], + "content_security_policy": "default-src 'none'; script-src 'self'; style-src 'self'; frame-src 'self'; img-src 'self' data:; media-src 'self'; connect-src 'self' https://www.googledrive.com", + "background": { + "scripts": [ + "image_loader.js", + "cache.js", + "worker.js", + "request.js", + "background.js" + ], + "persistent": false + }, + "web_accessible_resources": ["image_loader_client.js"] +} diff --git a/ui/file_manager/image_loader/request.js b/ui/file_manager/image_loader/request.js new file mode 100644 index 0000000000..11fc7c1ec6 --- /dev/null +++ b/ui/file_manager/image_loader/request.js @@ -0,0 +1,438 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +/** + * Creates and starts downloading and then resizing of the image. Finally, + * returns the image using the callback. + * + * @param {string} id Request ID. + * @param {Cache} cache Cache object. + * @param {Object} request Request message as a hash array. + * @param {function} callback Callback used to send the response. + * @constructor + */ +function Request(id, cache, request, callback) { + /** + * @type {string} + * @private + */ + this.id_ = id; + + /** + * @type {Cache} + * @private + */ + this.cache_ = cache; + + /** + * @type {Object} + * @private + */ + this.request_ = request; + + /** + * @type {function} + * @private + */ + this.sendResponse_ = callback; + + /** + * Temporary image used to download images. + * @type {Image} + * @private + */ + this.image_ = new Image(); + + /** + * MIME type of the fetched image. + * @type {string} + * @private + */ + this.contentType_ = null; + + /** + * Used to download remote images using http:// or https:// protocols. + * @type {AuthorizedXHR} + * @private + */ + this.xhr_ = new AuthorizedXHR(); + + /** + * Temporary canvas used to resize and compress the image. + * @type {HTMLCanvasElement} + * @private + */ + this.canvas_ = document.createElement('canvas'); + + /** + * @type {CanvasRenderingContext2D} + * @private + */ + this.context_ = this.canvas_.getContext('2d'); + + /** + * Callback to be called once downloading is finished. + * @type {function()} + * @private + */ + this.downloadCallback_ = null; +} + +/** + * Returns ID of the request. + * @return {string} Request ID. + */ +Request.prototype.getId = function() { + return this.id_; +}; + +/** + * Returns priority of the request. The higher priority, the faster it will + * be handled. The highest priority is 0. The default one is 2. + * + * @return {number} Priority. + */ +Request.prototype.getPriority = function() { + return (this.request_.priority !== undefined) ? this.request_.priority : 2; +}; + +/** + * Tries to load the image from cache if exists and sends the response. + * + * @param {function()} onSuccess Success callback. + * @param {function()} onFailure Failure callback. + */ +Request.prototype.loadFromCacheAndProcess = function(onSuccess, onFailure) { + this.loadFromCache_( + function(data) { // Found in cache. + this.sendImageData_(data); + onSuccess(); + }.bind(this), + onFailure); // Not found in cache. +}; + +/** + * Tries to download the image, resizes and sends the response. + * @param {function()} callback Completion callback. + */ +Request.prototype.downloadAndProcess = function(callback) { + if (this.downloadCallback_) + throw new Error('Downloading already started.'); + + this.downloadCallback_ = callback; + this.downloadOriginal_(this.onImageLoad_.bind(this), + this.onImageError_.bind(this)); +}; + +/** + * Fetches the image from the persistent cache. + * + * @param {function()} onSuccess Success callback. + * @param {function()} onFailure Failure callback. + * @private + */ +Request.prototype.loadFromCache_ = function(onSuccess, onFailure) { + var cacheKey = Cache.createKey(this.request_); + + if (!this.request_.cache) { + // Cache is disabled for this request; therefore, remove it from cache + // if existed. + this.cache_.removeImage(cacheKey); + onFailure(); + return; + } + + if (!this.request_.timestamp) { + // Persistent cache is available only when a timestamp is provided. + onFailure(); + return; + } + + this.cache_.loadImage(cacheKey, + this.request_.timestamp, + onSuccess, + onFailure); +}; + +/** + * Saves the image to the persistent cache. + * + * @param {string} data The image's data. + * @private + */ +Request.prototype.saveToCache_ = function(data) { + if (!this.request_.cache || !this.request_.timestamp) { + // Persistent cache is available only when a timestamp is provided. + return; + } + + var cacheKey = Cache.createKey(this.request_); + this.cache_.saveImage(cacheKey, + data, + this.request_.timestamp); +}; + +/** + * Downloads an image directly or for remote resources using the XmlHttpRequest. + * + * @param {function()} onSuccess Success callback. + * @param {function()} onFailure Failure callback. + * @private + */ +Request.prototype.downloadOriginal_ = function(onSuccess, onFailure) { + this.image_.onload = onSuccess; + this.image_.onerror = onFailure; + + // Download data urls directly since they are not supported by XmlHttpRequest. + var dataUrlMatches = this.request_.url.match(/^data:([^,;]*)[,;]/); + if (dataUrlMatches) { + this.image_.src = this.request_.url; + this.contentType_ = dataUrlMatches[1]; + return; + } + + // Fetch the image via authorized XHR and parse it. + var parseImage = function(contentType, blob) { + var reader = new FileReader(); + reader.onerror = onFailure; + reader.onload = function(e) { + this.image_.src = e.target.result; + }.bind(this); + + // Load the data to the image as a data url. + reader.readAsDataURL(blob); + }.bind(this); + + // Request raw data via XHR. + this.xhr_.load(this.request_.url, parseImage, onFailure); +}; + +/** + * Creates a XmlHttpRequest wrapper with injected OAuth2 authentication headers. + * @constructor + */ +function AuthorizedXHR() { + this.xhr_ = null; + this.aborted_ = false; +} + +/** + * Aborts the current request (if running). + */ +AuthorizedXHR.prototype.abort = function() { + this.aborted_ = true; + if (this.xhr_) + this.xhr_.abort(); +}; + +/** + * Loads an image using a OAuth2 token. If it fails, then tries to retry with + * a refreshed OAuth2 token. + * + * @param {string} url URL to the resource to be fetched. + * @param {function(string, Blob}) onSuccess Success callback with the content + * type and the fetched data. + * @param {function()} onFailure Failure callback. + */ +AuthorizedXHR.prototype.load = function(url, onSuccess, onFailure) { + this.aborted_ = false; + + // Do not call any callbacks when aborting. + var onMaybeSuccess = function(contentType, response) { + if (!this.aborted_) + onSuccess(contentType, response); + }.bind(this); + var onMaybeFailure = function(opt_code) { + if (!this.aborted_) + onFailure(); + }.bind(this); + + // Fetches the access token and makes an authorized call. If refresh is true, + // then forces refreshing the access token. + var requestTokenAndCall = function(refresh, onInnerSuccess, onInnerFailure) { + chrome.fileBrowserPrivate.requestAccessToken(refresh, function(token) { + if (this.aborted_) + return; + if (!token) { + onInnerFailure(); + return; + } + this.xhr_ = AuthorizedXHR.load_( + token, url, onInnerSuccess, onInnerFailure); + }.bind(this)); + }.bind(this); + + // Refreshes the access token and retries the request. + var maybeRetryCall = function(code) { + if (this.aborted_) + return; + requestTokenAndCall(true, onMaybeSuccess, onMaybeFailure); + }.bind(this); + + // Do not request a token for local resources, since it is not necessary. + if (url.indexOf('filesystem:') === 0) { + this.xhr_ = AuthorizedXHR.load_(null, url, onMaybeSuccess, onMaybeFailure); + return; + } + + // Make the request with reusing the current token. If it fails, then retry. + requestTokenAndCall(false, onMaybeSuccess, maybeRetryCall); +}; + +/** + * Fetches data using authorized XmlHttpRequest with the provided OAuth2 token. + * If the token is invalid, the request will fail. + * + * @param {?string} token OAuth2 token to be injected to the request. Null for + * no token. + * @param {string} url URL to the resource to be fetched. + * @param {function(string, Blob}) onSuccess Success callback with the content + * type and the fetched data. + * @param {function(number=)} onFailure Failure callback with the error code + * if available. + * @return {AuthorizedXHR} XHR instance. + * @private + */ +AuthorizedXHR.load_ = function(token, url, onSuccess, onFailure) { + var xhr = new XMLHttpRequest(); + xhr.responseType = 'blob'; + + xhr.onreadystatechange = function() { + if (xhr.readyState != 4) + return; + if (xhr.status != 200) { + onFailure(xhr.status); + return; + } + var contentType = xhr.getResponseHeader('Content-Type'); + onSuccess(contentType, xhr.response); + }.bind(this); + + // Perform a xhr request. + try { + xhr.open('GET', url, true); + if (token) + xhr.setRequestHeader('Authorization', 'Bearer ' + token); + xhr.send(); + } catch (e) { + onFailure(); + } + + return xhr; +}; + +/** + * Sends the resized image via the callback. If the image has been changed, + * then packs the canvas contents, otherwise sends the raw image data. + * + * @param {boolean} imageChanged Whether the image has been changed. + * @private + */ +Request.prototype.sendImage_ = function(imageChanged) { + var imageData; + if (!imageChanged) { + // The image hasn't been processed, so the raw data can be directly + // forwarded for speed (no need to encode the image again). + imageData = this.image_.src; + } else { + // The image has been resized or rotated, therefore the canvas has to be + // encoded to get the correct compressed image data. + switch (this.contentType_) { + case 'image/gif': + case 'image/png': + case 'image/svg': + case 'image/bmp': + imageData = this.canvas_.toDataURL('image/png'); + break; + case 'image/jpeg': + default: + imageData = this.canvas_.toDataURL('image/jpeg', 0.9); + } + } + + // Send and store in the persistent cache. + this.sendImageData_(imageData); + this.saveToCache_(imageData); +}; + +/** + * Sends the resized image via the callback. + * @param {string} data Compressed image data. + * @private + */ +Request.prototype.sendImageData_ = function(data) { + this.sendResponse_({status: 'success', + data: data, + taskId: this.request_.taskId}); +}; + +/** + * Handler, when contents are loaded into the image element. Performs resizing + * and finalizes the request process. + * + * @param {function()} callback Completion callback. + * @private + */ +Request.prototype.onImageLoad_ = function(callback) { + // Perform processing if the url is not a data url, or if there are some + // operations requested. + if (!this.request_.url.match(/^data/) || + ImageLoader.shouldProcess(this.image_.width, + this.image_.height, + this.request_)) { + ImageLoader.resize(this.image_, this.canvas_, this.request_); + this.sendImage_(true); // Image changed. + } else { + this.sendImage_(false); // Image not changed. + } + this.cleanup_(); + this.downloadCallback_(); +}; + +/** + * Handler, when loading of the image fails. Sends a failure response and + * finalizes the request process. + * + * @param {function()} callback Completion callback. + * @private + */ +Request.prototype.onImageError_ = function(callback) { + this.sendResponse_({status: 'error', + taskId: this.request_.taskId}); + this.cleanup_(); + this.downloadCallback_(); +}; + +/** + * Cancels the request. + */ +Request.prototype.cancel = function() { + this.cleanup_(); + + // If downloading has started, then call the callback. + if (this.downloadCallback_) + this.downloadCallback_(); +}; + +/** + * Cleans up memory used by this request. + * @private + */ +Request.prototype.cleanup_ = function() { + this.image_.onerror = function() {}; + this.image_.onload = function() {}; + + // Transparent 1x1 pixel gif, to force garbage collecting. + this.image_.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAA' + + 'ABAAEAAAICTAEAOw=='; + + this.xhr_.onload = function() {}; + this.xhr_.abort(); + + // Dispose memory allocated by Canvas. + this.canvas_.width = 0; + this.canvas_.height = 0; +}; diff --git a/ui/file_manager/image_loader/worker.js b/ui/file_manager/image_loader/worker.js new file mode 100644 index 0000000000..fe1f2f1535 --- /dev/null +++ b/ui/file_manager/image_loader/worker.js @@ -0,0 +1,166 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +/** + * Worker for requests. Fetches requests from a queue and processes them + * synchronously, taking into account priorities. The highest priority is 0. + */ +function Worker() { + /** + * List of requests waiting to be checked. If these items are available in + * cache, then they are processed immediately after starting the worker. + * However, if they have to be downloaded, then these requests are moved + * to pendingRequests_. + * + * @type {Array.<Request>} + * @private + */ + this.newRequests_ = []; + + /** + * List of pending requests for images to be downloaded. + * @type {Array.<Request>} + * @private + */ + this.pendingRequests_ = []; + + /** + * List of requests being processed. + * @type {Array.<Request>} + * @private + */ + this.activeRequests_ = []; + + /** + * Hash array of requests being added to the queue, but not finalized yet. + * @type {Object} + * @private + */ + this.requests_ = {}; + + /** + * If the worker has been started. + * @type {boolean} + * @private + */ + this.started_ = false; +} + +/** + * Maximum download requests to be run in parallel. + * @type {number} + * @const + */ +Worker.MAXIMUM_IN_PARALLEL = 5; + +/** + * Adds a request to the internal priority queue and executes it when requests + * with higher priorities are finished. If the result is cached, then it is + * processed immediately once the worker is started. + * + * @param {Request} request Request object. + */ +Worker.prototype.add = function(request) { + if (!this.started_) { + this.newRequests_.push(request); + this.requests_[request.getId()] = request; + return; + } + + // Enqueue the request, since already started. + this.pendingRequests_.push(request); + this.sortPendingRequests_(); + + this.continue_(); +}; + +/** + * Removes a request from the worker (if exists). + * @param {string} requestId Unique ID of the request. + */ +Worker.prototype.remove = function(requestId) { + var request = this.requests_[requestId]; + if (!request) + return; + + // Remove from the internal queues with pending tasks. + var newIndex = this.pendingRequests_.indexOf(request); + if (newIndex != -1) + this.newRequests_.splice(newIndex, 1); + var pendingIndex = this.pendingRequests_.indexOf(request); + if (pendingIndex != -1) + this.pendingRequests_.splice(pendingIndex, 1); + + // Cancel the request. + request.cancel(); + delete this.requests_[requestId]; +}; + +/** + * Starts handling requests. + */ +Worker.prototype.start = function() { + this.started_ = true; + + // Process tasks added before worker has been started. + this.pendingRequests_ = this.newRequests_; + this.sortPendingRequests_(); + this.newRequests_ = []; + + // Start serving enqueued requests. + this.continue_(); +}; + +/** + * Sorts pending requests by priorities. + * @private + */ +Worker.prototype.sortPendingRequests_ = function() { + this.pendingRequests_.sort(function(a, b) { + return a.getPriority() - b.getPriority(); + }); +}; + +/** + * Processes pending requests from the queue. There is no guarantee that + * all of the tasks will be processed at once. + * + * @private + */ +Worker.prototype.continue_ = function() { + // Run only up to MAXIMUM_IN_PARALLEL in the same time. + while (this.pendingRequests_.length && + this.activeRequests_.length < Worker.MAXIMUM_IN_PARALLEL) { + var request = this.pendingRequests_.shift(); + this.activeRequests_.push(request); + + // Try to load from cache. If doesn't exist, then download. + request.loadFromCacheAndProcess( + this.finish_.bind(this, request), + function(currentRequest) { + currentRequest.downloadAndProcess( + this.finish_.bind(this, currentRequest)); + }.bind(this, request)); + } +}; + +/** + * Handles finished requests. + * + * @param {Request} request Finished request. + * @private + */ +Worker.prototype.finish_ = function(request) { + var index = this.activeRequests_.indexOf(request); + if (index < 0) + console.warn('Request not found.'); + this.activeRequests_.splice(index, 1); + delete this.requests_[request.getId()]; + + // Continue handling the most important requests (if started). + if (this.started_) + this.continue_(); +}; diff --git a/ui/file_manager/video_player/OWNERS b/ui/file_manager/video_player/OWNERS new file mode 100644 index 0000000000..f19953323c --- /dev/null +++ b/ui/file_manager/video_player/OWNERS @@ -0,0 +1 @@ +yoshiki@chromium.org
\ No newline at end of file diff --git a/ui/file_manager/video_player/css/video_player.css b/ui/file_manager/video_player/css/video_player.css new file mode 100644 index 0000000000..2c11c339ce --- /dev/null +++ b/ui/file_manager/video_player/css/video_player.css @@ -0,0 +1,103 @@ +/* Copyright (c) 2012 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +body { + -webkit-user-select: none; + background: black; + font-family: Noto Sans UI,Droid Sans Fallback,sans-serif; + font-size: 84%; + margin: 0; + overflow: hidden; +} + +#video-player { + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +#video-container { + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +video { + height: 100%; + left: 0; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; +} + +#controls-wrapper { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + bottom: 0; + display: -webkit-box; + left: 0; + position: absolute; + right: 0; +} + +#controls { + -webkit-box-flex: 1; + display: -webkit-box; +} + +#video-player:not([tools]) .tool { + opacity: 0; +} + +#video-player:not([tools]) { + cursor: none; +} + +#video-player[disabled] .tool { + display: none; +} + +.tool { + transition: opacity 180ms linear; +} + +#error-wrapper { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + display: -webkit-box; + height: 100%; + left: 0; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; +} + +#error { + -webkit-box-align: center; + -webkit-box-orient: horizontal; + -webkit-box-pack: center; + background-color: rgba(24, 24, 24, 1); + background-image: -webkit-image-set( + url('../images/100/error.png') 1x, + url('../images/200/error.png') 2x); + background-position: 25px center; + background-repeat: no-repeat; + color: white; + display: -webkit-box; + height: 54px; + padding-left: 70px; + padding-right: 35px; +} + +#error:not([visible]) { + display: none; +} diff --git a/ui/file_manager/video_player/images/100/error.png b/ui/file_manager/video_player/images/100/error.png Binary files differnew file mode 100644 index 0000000000..125c0b7589 --- /dev/null +++ b/ui/file_manager/video_player/images/100/error.png diff --git a/ui/file_manager/video_player/images/100/icon.png b/ui/file_manager/video_player/images/100/icon.png Binary files differnew file mode 100644 index 0000000000..73b70f63b2 --- /dev/null +++ b/ui/file_manager/video_player/images/100/icon.png diff --git a/ui/file_manager/video_player/images/200/error.png b/ui/file_manager/video_player/images/200/error.png Binary files differnew file mode 100644 index 0000000000..200baf571a --- /dev/null +++ b/ui/file_manager/video_player/images/200/error.png diff --git a/ui/file_manager/video_player/images/200/icon.png b/ui/file_manager/video_player/images/200/icon.png Binary files differnew file mode 100644 index 0000000000..a8346a3f20 --- /dev/null +++ b/ui/file_manager/video_player/images/200/icon.png diff --git a/ui/file_manager/video_player/js/background.js b/ui/file_manager/video_player/js/background.js new file mode 100644 index 0000000000..57ff169de2 --- /dev/null +++ b/ui/file_manager/video_player/js/background.js @@ -0,0 +1,43 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + + +// Stores the app windows OLNY for test purpose. +// We SHOULD NOT use it as it is except for test, since the files which have +// the same name will be overridden each other. +var appWindowsForTest = {}; + +chrome.app.runtime.onLaunched.addListener(function(launchData) { + if (!launchData || !launchData.items || launchData.items.length == 0) + return; + + var entry = launchData.items[0].entry; + entry.file(function(file) { + var url = window.URL.createObjectURL(file); + open(url, entry.name); + }.wrap(), + function() { + // TODO(yoshiki): handle error in a smarter way. + open('', 'error'); // Empty URL shows the error message. + }.wrap()); +}.wrap()); + +function open(url, title) { + chrome.app.window.create('video_player.html', { + id: 'video', + singleton: false, + minWidth: 160, + minHeight: 100 + }, + function(createdWindow) { + // Stores the window for test purpose. + appWindowsForTest[title] = createdWindow; + + createdWindow.setIcon('images/200/icon.png'); + createdWindow.contentWindow.videoUrl = url; + createdWindow.contentWindow.videoTitle = title; + }.wrap()); +} diff --git a/ui/file_manager/video_player/js/error_util.js b/ui/file_manager/video_player/js/error_util.js new file mode 100644 index 0000000000..fedf9f534b --- /dev/null +++ b/ui/file_manager/video_player/js/error_util.js @@ -0,0 +1,43 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +/** + * This variable is checked in SelectFileDialogExtensionBrowserTest. + * @type {number} + */ +window.JSErrorCount = 0; + +/** + * Counts uncaught exceptions. + */ +window.onerror = function() { window.JSErrorCount++; }; + +/** + * Wraps the function to use it as a callback. + * This does: + * - Capture the stack trace in case of error. + * - Bind this object + * + * @param {Object} thisObject Object to be used as this. + * @return {function} Wapped function. + */ +Function.prototype.wrap = function(thisObject) { + var func = this; + var liveStack = (new Error('Stack trace before async call')).stack; + if (thisObject === undefined) + thisObject = null; + + return function wrappedCallback() { + try { + return func.apply(thisObject, arguments); + } catch (e) { + console.error('Exception happens in callback.', liveStack); + + window.JSErrorCount++; + throw e; + } + } +}; diff --git a/ui/file_manager/video_player/js/test_util.js b/ui/file_manager/video_player/js/test_util.js new file mode 100644 index 0000000000..c01df4a8eb --- /dev/null +++ b/ui/file_manager/video_player/js/test_util.js @@ -0,0 +1,121 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * Namespace for test related things. + */ +var test = test || {}; + +/** + * Namespace for test utility functions. + * + * Public functions in the test.util.sync and the test.util.async namespaces are + * published to test cases and can be called by using callRemoteTestUtil. The + * arguments are serialized as JSON internally. If application ID is passed to + * callRemoteTestUtil, the content window of the application is added as the + * first argument. The functions in the test.util.async namespace are passed the + * callback function as the last argument. + */ +test.util = {}; + +/** + * Namespace for synchronous utility functions. + */ +test.util.sync = {}; + +/** + * Namespace for asynchronous utility functions. + */ +test.util.async = {}; + +/** + * Extension ID of the testing extension. + * @type {string} + * @const + */ +test.util.TESTING_EXTENSION_ID = 'oobinhbdbiehknkpbpejbbpdbkdjmoco'; + +/** + * Opens the main Files.app's window and waits until it is ready. + * + * @param {Window} contentWindow Video player window to be chacked toOB. + * @return {boolean} True if the video is playing, false otherwise. + */ +test.util.sync.isPlaying = function(contentWindow) { + var selector = 'video[src]'; + var element = contentWindow.document.querySelector(selector); + if (!element) + return false; + + return !element.paused; +}; + +/** + * Gets total Javascript error count from each app window. + * @return {number} Error count. + */ +test.util.sync.getErrorCount = function() { + var totalCount = JSErrorCount; + for (var appId in appWindowsForTest) { + var contentWindow = appWindowsForTest[appId].contentWindow; + if (contentWindow.JSErrorCount) + totalCount += contentWindow.JSErrorCount; + } + + // Errors in the background page. + totalCount += window.JSErrorCount; + + return totalCount; +}; + +/** + * Registers message listener, which runs test utility functions. + */ +test.util.registerRemoteTestUtils = function() { + // Register the message listener. + var onMessage = chrome.runtime ? chrome.runtime.onMessageExternal : + chrome.extension.onMessageExternal; + // Return true for asynchronous functions and false for synchronous. + onMessage.addListener(function(request, sender, sendResponse) { + // Check the sender. + if (sender.id != test.util.TESTING_EXTENSION_ID) { + console.error('The testing extension must be white-listed.'); + sendResponse(false); + return false; + } + if (!request.func || request.func[request.func.length - 1] == '_') { + request.func = ''; + } + // Prepare arguments. + var args = request.args.slice(); // shallow copy + if (request.file) { + if (!appWindowsForTest[request.file]) { + console.error('Specified window not found: ' + request.file); + sendResponse(false); + return false; + } + args.unshift(appWindowsForTest[request.file].contentWindow); + } + // Call the test utility function and respond the result. + if (test.util.async[request.func]) { + args[test.util.async[request.func].length - 1] = function() { + console.debug('Received the result of ' + request.func); + sendResponse.apply(null, arguments); + }; + console.debug('Waiting for the result of ' + request.func); + test.util.async[request.func].apply(null, args); + return true; + } else if (test.util.sync[request.func]) { + sendResponse(test.util.sync[request.func].apply(null, args)); + return false; + } else { + console.error('Invalid function name.'); + sendResponse(false); + return false; + } + }.wrap()); +}; + +// Register the test utils. +test.util.registerRemoteTestUtils(); diff --git a/ui/file_manager/video_player/js/video_player.js b/ui/file_manager/video_player/js/video_player.js new file mode 100644 index 0000000000..f472cdff9a --- /dev/null +++ b/ui/file_manager/video_player/js/video_player.js @@ -0,0 +1,215 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +/** + * Displays error message. + * @param {string} message Message id. + */ +function showErrorMessage(message) { + var errorBanner = document.querySelector('#error'); + errorBanner.textContent = + loadTimeData.getString(message); + errorBanner.setAttribute('visible', 'true'); + + // The window is hidden if the video has not loaded yet. + chrome.app.window.current().show(); +} + +/** + * Handles playback (decoder) errors. + */ +function onPlaybackError() { + showErrorMessage('GALLERY_VIDEO_DECODING_ERROR'); + decodeErrorOccured = true; + + // Disable inactivity watcher, and disable the ui, by hiding tools manually. + controls.inactivityWatcher.disabled = true; + document.querySelector('#video-player').setAttribute('disabled', 'true'); + + // Detach the video element, since it may be unreliable and reset stored + // current playback time. + controls.cleanup(); + controls.clearState(); + + // Avoid reusing a video element. + video.parentNode.removeChild(video); + video = null; +} + +/** + * @param {Element} playerContainer Main container. + * @param {Element} videoContainer Container for the video element. + * @param {Element} controlsContainer Container for video controls. + * @constructor + */ +function FullWindowVideoControls( + playerContainer, videoContainer, controlsContainer) { + VideoControls.call(this, + controlsContainer, + onPlaybackError, + loadTimeData.getString.wrap(loadTimeData), + this.toggleFullScreen_.wrap(this), + videoContainer); + + this.playerContainer_ = playerContainer; + + this.updateStyle(); + window.addEventListener('resize', this.updateStyle.wrap(this)); + + document.addEventListener('keydown', function(e) { + if (e.keyIdentifier == 'U+0020') { // Space + this.togglePlayStateWithFeedback(); + e.preventDefault(); + } + if (e.keyIdentifier == 'U+001B') { // Escape + util.toggleFullScreen( + chrome.app.window.current(), + false); // Leave the full screen mode. + e.preventDefault(); + } + }.wrap(this)); + + // TODO(mtomasz): Simplify. crbug.com/254318. + videoContainer.addEventListener('click', function(e) { + if (e.ctrlKey) { + this.toggleLoopedModeWithFeedback(true); + if (!this.isPlaying()) + this.togglePlayStateWithFeedback(); + } else { + this.togglePlayStateWithFeedback(); + } + }.wrap(this)); + + this.inactivityWatcher_ = new MouseInactivityWatcher(playerContainer); + this.__defineGetter__('inactivityWatcher', function() { + return this.inactivityWatcher_; + }); + + this.inactivityWatcher_.check(); +} + +FullWindowVideoControls.prototype = { __proto__: VideoControls.prototype }; + +/** + * Toggles the full screen mode. + * @private + */ +FullWindowVideoControls.prototype.toggleFullScreen_ = function() { + var appWindow = chrome.app.window.current(); + util.toggleFullScreen(appWindow, !util.isFullScreen(appWindow)); +}; + +// TODO(mtomasz): Convert it to class members: crbug.com/171191. +var decodeErrorOccured; +var video; +var controls; + +/** + * Initializes the video player window. + */ +function loadVideoPlayer() { + document.ondragstart = function(e) { e.preventDefault() }; + + chrome.fileBrowserPrivate.getStrings(function(strings) { + loadTimeData.data = strings; + + var url = window.videoUrl; + document.title = window.videoTitle; + + controls = new FullWindowVideoControls( + document.querySelector('#video-player'), + document.querySelector('#video-container'), + document.querySelector('#controls')); + + var reloadVideo = function(e) { + if (decodeErrorOccured && + // Ignore shortcut keys + !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) { + loadVideo(url); + e.preventDefault(); + } + }; + + loadVideo(url); + document.addEventListener('keydown', reloadVideo, true); + document.addEventListener('click', reloadVideo, true); + }); +} + +/** + * Unloads the player. + */ +function unload() { + if (!controls.getMedia()) + return; + + controls.savePosition(true /* exiting */); + controls.cleanup(); +} + +/** + * Reloads the player. + * @param {string} url URL of the video file. + */ +function loadVideo(url) { + // Re-enable ui and hide error message if already displayed. + document.querySelector('#video-player').removeAttribute('disabled'); + document.querySelector('#error').removeAttribute('visible'); + controls.inactivityWatcher.disabled = false; + decodeErrorOccured = false; + + // Detach the previous video element, if exists. + if (video) + video.parentNode.removeChild(video); + + video = document.createElement('video'); + document.querySelector('#video-container').appendChild(video); + controls.attachMedia(video); + + video.src = url; + video.load(); + video.addEventListener('loadedmetadata', function() { + // TODO: chrome.app.window soon will be able to resize the content area. + // Until then use approximate title bar height. + var TITLE_HEIGHT = 33; + + var aspect = video.videoWidth / video.videoHeight; + var newWidth = video.videoWidth; + var newHeight = video.videoHeight + TITLE_HEIGHT; + + var shrinkX = newWidth / window.screen.availWidth; + var shrinkY = newHeight / window.screen.availHeight; + if (shrinkX > 1 || shrinkY > 1) { + if (shrinkY > shrinkX) { + newHeight = newHeight / shrinkY; + newWidth = (newHeight - TITLE_HEIGHT) * aspect; + } else { + newWidth = newWidth / shrinkX; + newHeight = newWidth / aspect + TITLE_HEIGHT; + } + } + + var oldLeft = window.screenX; + var oldTop = window.screenY; + var oldWidth = window.outerWidth; + var oldHeight = window.outerHeight; + + if (!oldWidth && !oldHeight) { + oldLeft = window.screen.availWidth / 2; + oldTop = window.screen.availHeight / 2; + } + + var appWindow = chrome.app.window.current(); + appWindow.resizeTo(newWidth, newHeight); + appWindow.moveTo(oldLeft - (newWidth - oldWidth) / 2, + oldTop - (newHeight - oldHeight) / 2); + appWindow.show(); + + video.play(); + }); +} + +util.addPageLoadHandler(loadVideoPlayer); diff --git a/ui/file_manager/video_player/js/video_player_scripts.js b/ui/file_manager/video_player/js/video_player_scripts.js new file mode 100644 index 0000000000..a3f6c6a7c3 --- /dev/null +++ b/ui/file_manager/video_player/js/video_player_scripts.js @@ -0,0 +1,27 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// The include directives are put into Javascript-style comments to prevent +// parsing errors in non-flattened mode. The flattener still sees them. +// Note that this makes the flattener to comment out the first line of the +// included file but that's all right since any javascript file should start +// with a copyright comment anyway. + +//<include src="error_util.js"/> + +//<include src="../../../webui/resources/js/cr.js"/> +//<include src="../../../webui/resources/js/load_time_data.js"/> + +(function() { +'use strict'; + +//<include src="../../../../chrome/browser/resources/file_manager/common/js/util.js"/> +//<include src="../../../../chrome/browser/resources/file_manager/foreground/js/media/media_controls.js"/> +//<include src="../../../../chrome/browser/resources/file_manager/foreground/js/media/util.js"/> + +//<include src="video_player.js"/> + +window.unload = unload; + +})(); diff --git a/ui/file_manager/video_player/manifest.json b/ui/file_manager/video_player/manifest.json new file mode 100644 index 0000000000..5478a98b30 --- /dev/null +++ b/ui/file_manager/video_player/manifest.json @@ -0,0 +1,57 @@ +{ + // chrome-extension://jcgeabjmjgoblfofpppfkcoakmfobdko/ + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0/gRbJc545iEGRZs20Rl/HtrSUp8H3gJd4Y6hCe0CG1xQiJhZ5nc8qZyxa96gMxRAKBq54S6sjVVtV6uS70oU6FvrvwItByYkkqr4ZE7eMJKwMqnGItxWbh6KBodf89lpKoIy6MtYTqubBhXB/IQBZsXah90tXwRzaaJNWw+2BBRIhcPsH3ng+wgN7rwFxo4HIv9ZpqkYlx90rwkfjOmKPPnSXyXFIBJfmqfdbd8PLtcxzzOTE+vxwoXZuYWrthKm4uKfNqXIYns74sSJlqyKfctuR+nQdNh8uePv0e+/Ul3wER1/jIXULLjfyoaklyDs+ak3SDf+xWScJ+0LJ0AwIDAQAB", + "manifest_version": 2, + "name": "Video Player", + "version": "1.0", + "description": "Video Player", + "display_in_launcher": false, + "incognito" : "split", + "icons": { + "16": "images/100/icon.png", + "32": "images/200/icon.png" + }, + "permissions": [ + "fileSystem", + "fileBrowserPrivate", + "fullscreen", + "mediaPlayerPrivate", + "storage", + "chrome://theme/" + ], + "file_handlers": { + "video": { + "types": [ + "video/*" + ], + "extensions": [ + "3gp", + "avi", + "m4v", + "mkv", + "mov", + "mp4", + "mpeg", + "mpeg4", + "mpg", + "mpg4", + "ogm", + "ogv", + "ogx", + "webm" + ], + // TODO(yoshiki): localize this. + "title": "Watch" + } + }, + "app": { + "background": { + "scripts": [ + "js/error_util.js", + "js/test_util.js", + "js/background.js" + ] + }, + "content_security_policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' chrome://theme data:; media-src 'self'; object-src 'self'" + } +} diff --git a/ui/file_manager/video_player/video_player.html b/ui/file_manager/video_player/video_player.html new file mode 100644 index 0000000000..52b50f0e44 --- /dev/null +++ b/ui/file_manager/video_player/video_player.html @@ -0,0 +1,28 @@ +<!-- + -- Copyright 2014 The Chromium Authors. All rights reserved. + -- Use of this source code is governed by a BSD-style license that can be + -- found in the LICENSE file. + --> +<html> +<head> + <title>#xFEFF;</title> + <link rel="icon" type="image/png" href="images/200/icon.png"> + <link rel="stylesheet" type="text/css" + href="../../../chrome/browser/resources/file_manager/foreground/css/media_controls.css"> + <link rel="stylesheet" type="text/css" href="css/video_player.css"> + + <script src="js/video_player_scripts.js"></script> +</head> +<body> + <div id="video-player" tools> + <div id="video-container"> + </div> + <div id="controls-wrapper"> + <div id="controls" class="tool"></div> + </div> + <div id="error-wrapper"> + <div id="error"></div> + </div> + </div> +</body> +</html> diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn index 02d2e776c3..783394556c 100644 --- a/ui/gfx/BUILD.gn +++ b/ui/gfx/BUILD.gn @@ -7,6 +7,16 @@ if (is_android) { import("//build/config/android/config.gni") } +# Several targets want to include this header file, and some of them are +# child dependencies of "gfx". Therefore, we separate it out here so multiple +# targets can all have a dependency for header checking purposes without +# creating circular dependencies. +source_set("gfx_export") { + sources = [ + "gfx_export.h", + ] +} + component("gfx") { sources = [ "android/device_display_info.cc", @@ -84,7 +94,6 @@ component("gfx") { "frame_time.h", "gdi_util.cc", "gdi_util.h", - "gfx_export.h", "gfx_paths.cc", "gfx_paths.h", "gpu_memory_buffer.cc", @@ -235,6 +244,7 @@ component("gfx") { defines = [ "GFX_IMPLEMENTATION" ] deps = [ + ":gfx_export", "//base", "//base:i18n", "//base:base_static", @@ -347,13 +357,20 @@ component("gfx") { sources -= [ "nine_image_painter.cc", "nine_image_painter.h", + "path_aura.cc", ] } + if (use_x11) { deps += [ ":gfx_x11", ] + } else { + sources -= [ + "path_x11.cc", + ] } + if (use_pango) { sources -= [ "platform_font_ozone.cc", @@ -382,6 +399,7 @@ source_set("gfx_test_support") { deps = [ "//base", + "//base/test:test_support", "//skia", "//testing/gtest", ] diff --git a/ui/gfx/android/device_display_info.cc b/ui/gfx/android/device_display_info.cc index f7c9eed85b..4d2c80c09d 100644 --- a/ui/gfx/android/device_display_info.cc +++ b/ui/gfx/android/device_display_info.cc @@ -47,4 +47,8 @@ int DeviceDisplayInfo::GetSmallestDIPWidth() { return SharedDeviceDisplayInfo::GetInstance()->GetSmallestDIPWidth(); } +int DeviceDisplayInfo::GetRotationDegrees() { + return SharedDeviceDisplayInfo::GetInstance()->GetRotationDegrees(); +} + } // namespace gfx diff --git a/ui/gfx/android/device_display_info.h b/ui/gfx/android/device_display_info.h index 2c6db28df1..74e0ada487 100644 --- a/ui/gfx/android/device_display_info.h +++ b/ui/gfx/android/device_display_info.h @@ -51,6 +51,11 @@ class GFX_EXPORT DeviceDisplayInfo { // Smallest possible screen size in density-independent pixels. int GetSmallestDIPWidth(); + // Returns the display rotation angle from its natural orientation. Expected + // values are one of { 0, 90, 180, 270 }. + // See DeviceDispayInfo.java for more information. + int GetRotationDegrees(); + private: DISALLOW_COPY_AND_ASSIGN(DeviceDisplayInfo); }; diff --git a/ui/gfx/android/shared_device_display_info.cc b/ui/gfx/android/shared_device_display_info.cc index ae02ef5d92..c58813dfce 100644 --- a/ui/gfx/android/shared_device_display_info.cc +++ b/ui/gfx/android/shared_device_display_info.cc @@ -21,12 +21,13 @@ static void UpdateSharedDeviceDisplayInfo(JNIEnv* env, jint bits_per_pixel, jint bits_per_component, jdouble dip_scale, - jint smallest_dip_width) { + jint smallest_dip_width, + jint rotation_degrees) { SharedDeviceDisplayInfo::GetInstance()->InvokeUpdate(env, obj, display_height, display_width, physical_display_height, physical_display_width, bits_per_pixel, bits_per_component, - dip_scale, smallest_dip_width); + dip_scale, smallest_dip_width, rotation_degrees); } // static @@ -80,6 +81,11 @@ int SharedDeviceDisplayInfo::GetSmallestDIPWidth() { return smallest_dip_width_; } +int SharedDeviceDisplayInfo::GetRotationDegrees() { + base::AutoLock autolock(lock_); + return rotation_degrees_; +} + // static bool SharedDeviceDisplayInfo::RegisterSharedDeviceDisplayInfo(JNIEnv* env) { return RegisterNativesImpl(env); @@ -94,14 +100,15 @@ void SharedDeviceDisplayInfo::InvokeUpdate(JNIEnv* env, jint bits_per_pixel, jint bits_per_component, jdouble dip_scale, - jint smallest_dip_width) { + jint smallest_dip_width, + jint rotation_degrees) { base::AutoLock autolock(lock_); UpdateDisplayInfo(env, obj, display_height, display_width, physical_display_height, physical_display_width, bits_per_pixel, bits_per_component, dip_scale, - smallest_dip_width); + smallest_dip_width, rotation_degrees); } SharedDeviceDisplayInfo::SharedDeviceDisplayInfo() @@ -124,7 +131,8 @@ SharedDeviceDisplayInfo::SharedDeviceDisplayInfo() Java_DeviceDisplayInfo_getBitsPerPixel(env, j_device_info_.obj()), Java_DeviceDisplayInfo_getBitsPerComponent(env, j_device_info_.obj()), Java_DeviceDisplayInfo_getDIPScale(env, j_device_info_.obj()), - Java_DeviceDisplayInfo_getSmallestDIPWidth(env, j_device_info_.obj())); + Java_DeviceDisplayInfo_getSmallestDIPWidth(env, j_device_info_.obj()), + Java_DeviceDisplayInfo_getRotationDegrees(env, j_device_info_.obj())); } SharedDeviceDisplayInfo::~SharedDeviceDisplayInfo() { @@ -139,7 +147,8 @@ void SharedDeviceDisplayInfo::UpdateDisplayInfo(JNIEnv* env, jint bits_per_pixel, jint bits_per_component, jdouble dip_scale, - jint smallest_dip_width) { + jint smallest_dip_width, + jint rotation_degrees) { display_height_ = static_cast<int>(display_height); display_width_ = static_cast<int>(display_width); physical_display_height_ = static_cast<int>(physical_display_height); @@ -148,6 +157,7 @@ void SharedDeviceDisplayInfo::UpdateDisplayInfo(JNIEnv* env, bits_per_component_ = static_cast<int>(bits_per_component); dip_scale_ = static_cast<double>(dip_scale); smallest_dip_width_ = static_cast<int>(smallest_dip_width); + rotation_degrees_ = static_cast<int>(rotation_degrees); } } // namespace gfx diff --git a/ui/gfx/android/shared_device_display_info.h b/ui/gfx/android/shared_device_display_info.h index 7d81353d11..e6983e58aa 100644 --- a/ui/gfx/android/shared_device_display_info.h +++ b/ui/gfx/android/shared_device_display_info.h @@ -27,6 +27,7 @@ class SharedDeviceDisplayInfo { int GetBitsPerComponent(); double GetDIPScale(); int GetSmallestDIPWidth(); + int GetRotationDegrees(); // Registers methods with JNI and returns true if succeeded. static bool RegisterSharedDeviceDisplayInfo(JNIEnv* env); @@ -40,7 +41,8 @@ class SharedDeviceDisplayInfo { jint bits_per_pixel, jint bits_per_component, jdouble dip_scale, - jint smallest_dip_width); + jint smallest_dip_width, + jint rotation_degrees); private: friend struct DefaultSingletonTraits<SharedDeviceDisplayInfo>; @@ -55,7 +57,8 @@ class SharedDeviceDisplayInfo { jint bits_per_pixel, jint bits_per_component, jdouble dip_scale, - jint smallest_dip_width); + jint smallest_dip_width, + jint rotation_degrees); base::Lock lock_; base::android::ScopedJavaGlobalRef<jobject> j_device_info_; @@ -68,6 +71,7 @@ class SharedDeviceDisplayInfo { int bits_per_component_; double dip_scale_; int smallest_dip_width_; + int rotation_degrees_; DISALLOW_COPY_AND_ASSIGN(SharedDeviceDisplayInfo); }; diff --git a/ui/gfx/display.cc b/ui/gfx/display.cc index 2cdc9a539a..069c79eccc 100644 --- a/ui/gfx/display.cc +++ b/ui/gfx/display.cc @@ -85,6 +85,42 @@ Display::Display(int64 id, const gfx::Rect& bounds) Display::~Display() { } +int Display::RotationAsDegree() const { + switch (rotation_) { + case ROTATE_0: + return 0; + case ROTATE_90: + return 90; + case ROTATE_180: + return 180; + case ROTATE_270: + return 270; + } + + NOTREACHED(); + return 0; +} + +void Display::SetRotationAsDegree(int rotation) { + switch (rotation) { + case 0: + rotation_ = ROTATE_0; + break; + case 90: + rotation_ = ROTATE_90; + break; + case 180: + rotation_ = ROTATE_180; + break; + case 270: + rotation_ = ROTATE_270; + break; + default: + // We should not reach that but we will just ignore the call if we do. + NOTREACHED(); + } +} + Insets Display::GetWorkAreaInsets() const { return gfx::Insets(work_area_.y() - bounds_.y(), work_area_.x() - bounds_.x(), diff --git a/ui/gfx/display.h b/ui/gfx/display.h index eb35a5f5c6..90fc42f5c3 100644 --- a/ui/gfx/display.h +++ b/ui/gfx/display.h @@ -73,6 +73,8 @@ class GFX_EXPORT Display { Rotation rotation() const { return rotation_; } void set_rotation(Rotation rotation) { rotation_ = rotation; } + int RotationAsDegree() const; + void SetRotationAsDegree(int rotation); TouchSupport touch_support() const { return touch_support_; } void set_touch_support(TouchSupport support) { touch_support_ = support; } diff --git a/ui/gfx/gdk_compat.h b/ui/gfx/gdk_compat.h deleted file mode 100644 index b11d779583..0000000000 --- a/ui/gfx/gdk_compat.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_GFX_GDK_COMPAT_H_ -#define UI_GFX_GDK_COMPAT_H_ - -#include <gtk/gtk.h> -#include <gdk/gdkx.h> - -// Google Chrome must depend on GTK 2.18, at least until the next LTS drops -// (and we might have to extend which version of GTK we want to target due to -// RHEL). To make our porting job for GTK3 easier, we define all the methods -// that replace deprecated APIs in this file and then include it everywhere. -// -// This file is organized first by version, and then with each version, -// alphabetically by method. - -#if !GTK_CHECK_VERSION(2, 24, 0) -inline GdkWindow* gdk_x11_window_lookup_for_display(GdkDisplay* display, - Window window) { - return static_cast<GdkWindow*>(gdk_xid_table_lookup_for_display(display, - window)); -} -#endif - -#endif // UI_GFX_GDK_COMPAT_H_ diff --git a/ui/gfx/geometry/BUILD.gn b/ui/gfx/geometry/BUILD.gn index ac10b1119e..9492ced963 100644 --- a/ui/gfx/geometry/BUILD.gn +++ b/ui/gfx/geometry/BUILD.gn @@ -56,5 +56,6 @@ component("geometry") { deps = [ "//base", + "//ui/gfx:gfx_export", ] } diff --git a/ui/gfx/gfx.gyp b/ui/gfx/gfx.gyp index f0b4099dfa..cb94431a0d 100644 --- a/ui/gfx/gfx.gyp +++ b/ui/gfx/gfx.gyp @@ -201,18 +201,6 @@ 'nine_image_painter.cc', 'nine_image_painter.h', 'overlay_transform.h', - 'ozone/dri/dri_buffer.cc', - 'ozone/dri/dri_buffer.h', - 'ozone/dri/dri_surface.cc', - 'ozone/dri/dri_surface.h', - 'ozone/dri/dri_surface_factory.cc', - 'ozone/dri/dri_surface_factory.h', - 'ozone/dri/dri_vsync_provider.cc', - 'ozone/dri/dri_vsync_provider.h', - 'ozone/dri/dri_wrapper.cc', - 'ozone/dri/dri_wrapper.h', - 'ozone/dri/hardware_display_controller.cc', - 'ozone/dri/hardware_display_controller.h', 'ozone/impl/file_surface_factory.cc', 'ozone/impl/file_surface_factory.h', 'ozone/surface_factory_ozone.cc', @@ -402,11 +390,6 @@ 'render_text_ozone.cc', ], }], - ['ozone_platform_dri==1', { - 'dependencies': [ - '<(DEPTH)/build/linux/system.gyp:dridrm', - ], - }], ['desktop_linux==1 or chromeos==1', { 'dependencies': [ # font_render_params_linux.cc uses fontconfig diff --git a/ui/gfx/gfx.target.darwin-arm.mk b/ui/gfx/gfx.target.darwin-arm.mk index faada444af..e9fb59fcff 100644 --- a/ui/gfx/gfx.target.darwin-arm.mk +++ b/ui/gfx/gfx.target.darwin-arm.mk @@ -151,12 +151,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -279,12 +282,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -364,7 +370,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx.target.darwin-mips.mk b/ui/gfx/gfx.target.darwin-mips.mk index 9902bbb3de..0c02a51cb9 100644 --- a/ui/gfx/gfx.target.darwin-mips.mk +++ b/ui/gfx/gfx.target.darwin-mips.mk @@ -150,12 +150,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -277,12 +280,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -360,7 +366,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx.target.darwin-x86.mk b/ui/gfx/gfx.target.darwin-x86.mk index 063a6414cc..6bda3fcb0f 100644 --- a/ui/gfx/gfx.target.darwin-x86.mk +++ b/ui/gfx/gfx.target.darwin-x86.mk @@ -152,12 +152,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -280,12 +283,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -362,7 +368,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx.target.darwin-x86_64.mk b/ui/gfx/gfx.target.darwin-x86_64.mk index 490fd4783f..c07caa0ab8 100644 --- a/ui/gfx/gfx.target.darwin-x86_64.mk +++ b/ui/gfx/gfx.target.darwin-x86_64.mk @@ -152,12 +152,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -280,12 +283,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -362,7 +368,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx.target.linux-arm.mk b/ui/gfx/gfx.target.linux-arm.mk index faada444af..e9fb59fcff 100644 --- a/ui/gfx/gfx.target.linux-arm.mk +++ b/ui/gfx/gfx.target.linux-arm.mk @@ -151,12 +151,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -279,12 +282,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -364,7 +370,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx.target.linux-mips.mk b/ui/gfx/gfx.target.linux-mips.mk index 9902bbb3de..0c02a51cb9 100644 --- a/ui/gfx/gfx.target.linux-mips.mk +++ b/ui/gfx/gfx.target.linux-mips.mk @@ -150,12 +150,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -277,12 +280,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -360,7 +366,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx.target.linux-x86.mk b/ui/gfx/gfx.target.linux-x86.mk index 063a6414cc..6bda3fcb0f 100644 --- a/ui/gfx/gfx.target.linux-x86.mk +++ b/ui/gfx/gfx.target.linux-x86.mk @@ -152,12 +152,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -280,12 +283,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -362,7 +368,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx.target.linux-x86_64.mk b/ui/gfx/gfx.target.linux-x86_64.mk index 490fd4783f..c07caa0ab8 100644 --- a/ui/gfx/gfx.target.linux-x86_64.mk +++ b/ui/gfx/gfx.target.linux-x86_64.mk @@ -152,12 +152,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -280,12 +283,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DCHROME_PNG_WRITE_SUPPORT' \ '-DPNG_USER_CONFIG' \ @@ -362,7 +368,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx_geometry.target.darwin-arm.mk b/ui/gfx/gfx_geometry.target.darwin-arm.mk index b791ca673c..0bb7755f19 100644 --- a/ui/gfx/gfx_geometry.target.darwin-arm.mk +++ b/ui/gfx/gfx_geometry.target.darwin-arm.mk @@ -240,7 +240,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx_geometry.target.darwin-mips.mk b/ui/gfx/gfx_geometry.target.darwin-mips.mk index 91d8873d43..e9af83c1f6 100644 --- a/ui/gfx/gfx_geometry.target.darwin-mips.mk +++ b/ui/gfx/gfx_geometry.target.darwin-mips.mk @@ -236,7 +236,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx_geometry.target.darwin-x86.mk b/ui/gfx/gfx_geometry.target.darwin-x86.mk index 8d943f4d55..33945e18a8 100644 --- a/ui/gfx/gfx_geometry.target.darwin-x86.mk +++ b/ui/gfx/gfx_geometry.target.darwin-x86.mk @@ -238,7 +238,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx_geometry.target.darwin-x86_64.mk b/ui/gfx/gfx_geometry.target.darwin-x86_64.mk index 74957f47a7..c4f41b8fa4 100644 --- a/ui/gfx/gfx_geometry.target.darwin-x86_64.mk +++ b/ui/gfx/gfx_geometry.target.darwin-x86_64.mk @@ -238,7 +238,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx_geometry.target.linux-arm.mk b/ui/gfx/gfx_geometry.target.linux-arm.mk index b791ca673c..0bb7755f19 100644 --- a/ui/gfx/gfx_geometry.target.linux-arm.mk +++ b/ui/gfx/gfx_geometry.target.linux-arm.mk @@ -240,7 +240,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx_geometry.target.linux-mips.mk b/ui/gfx/gfx_geometry.target.linux-mips.mk index 91d8873d43..e9af83c1f6 100644 --- a/ui/gfx/gfx_geometry.target.linux-mips.mk +++ b/ui/gfx/gfx_geometry.target.linux-mips.mk @@ -236,7 +236,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx_geometry.target.linux-x86.mk b/ui/gfx/gfx_geometry.target.linux-x86.mk index 8d943f4d55..33945e18a8 100644 --- a/ui/gfx/gfx_geometry.target.linux-x86.mk +++ b/ui/gfx/gfx_geometry.target.linux-x86.mk @@ -238,7 +238,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/gfx_geometry.target.linux-x86_64.mk b/ui/gfx/gfx_geometry.target.linux-x86_64.mk index 74957f47a7..c4f41b8fa4 100644 --- a/ui/gfx/gfx_geometry.target.linux-x86_64.mk +++ b/ui/gfx/gfx_geometry.target.linux-x86_64.mk @@ -238,7 +238,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gfx/screen_android.cc b/ui/gfx/screen_android.cc index e90bb76725..9114b85545 100644 --- a/ui/gfx/screen_android.cc +++ b/ui/gfx/screen_android.cc @@ -43,6 +43,7 @@ class ScreenAndroid : public Screen { gfx::Display display(0, bounds_in_dip); if (!gfx::Display::HasForceDeviceScaleFactor()) display.set_device_scale_factor(device_scale_factor); + display.SetRotationAsDegree(device_info.GetRotationDegrees()); return display; } diff --git a/ui/gfx/win/dpi.cc b/ui/gfx/win/dpi.cc index fbcbb77866..1afd5156b8 100644 --- a/ui/gfx/win/dpi.cc +++ b/ui/gfx/win/dpi.cc @@ -44,6 +44,10 @@ float GetUnforcedDeviceScaleFactor() { float GetModernUIScaleWrapper() { float result = 1.0f; + // TODO(cpu) : Fix scale for Win7. + if (base::win::GetVersion() < base::win::VERSION_WIN8) + return result; + typedef float(WINAPI *GetModernUIScalePtr)(VOID); HMODULE lib = LoadLibraryA("metro_driver.dll"); if (lib) { @@ -191,12 +195,8 @@ float GetDeviceScaleFactor() { } Point ScreenToDIPPoint(const Point& pixel_point) { - static float scaling_factor = - GetDeviceScaleFactor() > GetUnforcedDeviceScaleFactor() ? - 1.0f / GetDeviceScaleFactor() : - 1.0f; return ToFlooredPoint(ScalePoint(pixel_point, - scaling_factor)); + 1.0f / GetDeviceScaleFactor())); } Point DIPToScreenPoint(const Point& dip_point) { diff --git a/ui/gfx/x/x11_error_tracker.cc b/ui/gfx/x/x11_error_tracker.cc index 16ed5955d5..110f79ccd0 100644 --- a/ui/gfx/x/x11_error_tracker.cc +++ b/ui/gfx/x/x11_error_tracker.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/logging.h" #include "ui/gfx/x/x11_error_tracker.h" #include "ui/gfx/x/x11_types.h" @@ -9,6 +10,7 @@ namespace { unsigned char g_x11_error_code = 0; +static gfx::X11ErrorTracker* g_handler = NULL; int X11ErrorHandler(Display* display, XErrorEvent* error) { g_x11_error_code = error->error_code; @@ -19,10 +21,19 @@ int X11ErrorHandler(Display* display, XErrorEvent* error) { namespace gfx { X11ErrorTracker::X11ErrorTracker() { + // This is a poor-man's check for incorrect usage. It disallows nested + // X11ErrorTracker instances on the same thread. + DCHECK(g_handler == NULL); + g_handler = this; + XSync(GetXDisplay(), False); old_handler_ = XSetErrorHandler(X11ErrorHandler); + g_x11_error_code = 0; } -X11ErrorTracker::~X11ErrorTracker() { XSetErrorHandler(old_handler_); } +X11ErrorTracker::~X11ErrorTracker() { + g_handler = NULL; + XSetErrorHandler(old_handler_); +} bool X11ErrorTracker::FoundNewError() { XSync(GetXDisplay(), False); diff --git a/ui/gl/gl.target.darwin-arm.mk b/ui/gl/gl.target.darwin-arm.mk index 44322bbf9d..fb24817377 100644 --- a/ui/gl/gl.target.darwin-arm.mk +++ b/ui/gl/gl.target.darwin-arm.mk @@ -139,7 +139,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -fno-tree-sra \ -fuse-ld=gold \ -Wno-psabi \ @@ -192,12 +191,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -268,7 +270,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -fno-tree-sra \ -fuse-ld=gold \ -Wno-psabi \ @@ -321,12 +322,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -404,7 +408,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gl/gl.target.darwin-mips.mk b/ui/gl/gl.target.darwin-mips.mk index 38fb6056cb..f8cf564a0c 100644 --- a/ui/gl/gl.target.darwin-mips.mk +++ b/ui/gl/gl.target.darwin-mips.mk @@ -139,7 +139,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -EL \ -mhard-float \ -ffunction-sections \ @@ -191,12 +190,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -267,7 +269,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -EL \ -mhard-float \ -ffunction-sections \ @@ -319,12 +320,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -400,7 +404,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gl/gl.target.darwin-x86.mk b/ui/gl/gl.target.darwin-x86.mk index 486ad80f0b..bba382d9b6 100644 --- a/ui/gl/gl.target.darwin-x86.mk +++ b/ui/gl/gl.target.darwin-x86.mk @@ -138,7 +138,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -msse2 \ -mfpmath=sse \ -mmmx \ @@ -193,12 +192,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -267,7 +269,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -msse2 \ -mfpmath=sse \ -mmmx \ @@ -322,12 +323,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -402,7 +406,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gl/gl.target.darwin-x86_64.mk b/ui/gl/gl.target.darwin-x86_64.mk index ba2e9d5786..f4811f34e1 100644 --- a/ui/gl/gl.target.darwin-x86_64.mk +++ b/ui/gl/gl.target.darwin-x86_64.mk @@ -140,7 +140,6 @@ MY_CFLAGS_Debug := \ -pipe \ -fPIC \ -Wno-unused-local-typedefs \ - -Wno-unknown-pragmas \ -m64 \ -march=x86-64 \ -fuse-ld=gold \ @@ -193,12 +192,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -269,7 +271,6 @@ MY_CFLAGS_Release := \ -pipe \ -fPIC \ -Wno-unused-local-typedefs \ - -Wno-unknown-pragmas \ -m64 \ -march=x86-64 \ -fuse-ld=gold \ @@ -322,12 +323,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -402,7 +406,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gl/gl.target.linux-arm.mk b/ui/gl/gl.target.linux-arm.mk index 44322bbf9d..fb24817377 100644 --- a/ui/gl/gl.target.linux-arm.mk +++ b/ui/gl/gl.target.linux-arm.mk @@ -139,7 +139,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -fno-tree-sra \ -fuse-ld=gold \ -Wno-psabi \ @@ -192,12 +191,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -268,7 +270,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -fno-tree-sra \ -fuse-ld=gold \ -Wno-psabi \ @@ -321,12 +322,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -404,7 +408,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gl/gl.target.linux-mips.mk b/ui/gl/gl.target.linux-mips.mk index 38fb6056cb..f8cf564a0c 100644 --- a/ui/gl/gl.target.linux-mips.mk +++ b/ui/gl/gl.target.linux-mips.mk @@ -139,7 +139,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -EL \ -mhard-float \ -ffunction-sections \ @@ -191,12 +190,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -267,7 +269,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -EL \ -mhard-float \ -ffunction-sections \ @@ -319,12 +320,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -400,7 +404,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gl/gl.target.linux-x86.mk b/ui/gl/gl.target.linux-x86.mk index 486ad80f0b..bba382d9b6 100644 --- a/ui/gl/gl.target.linux-x86.mk +++ b/ui/gl/gl.target.linux-x86.mk @@ -138,7 +138,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -msse2 \ -mfpmath=sse \ -mmmx \ @@ -193,12 +192,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -267,7 +269,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -msse2 \ -mfpmath=sse \ -mmmx \ @@ -322,12 +323,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -402,7 +406,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gl/gl.target.linux-x86_64.mk b/ui/gl/gl.target.linux-x86_64.mk index ba2e9d5786..f4811f34e1 100644 --- a/ui/gl/gl.target.linux-x86_64.mk +++ b/ui/gl/gl.target.linux-x86_64.mk @@ -140,7 +140,6 @@ MY_CFLAGS_Debug := \ -pipe \ -fPIC \ -Wno-unused-local-typedefs \ - -Wno-unknown-pragmas \ -m64 \ -march=x86-64 \ -fuse-ld=gold \ @@ -193,12 +192,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -269,7 +271,6 @@ MY_CFLAGS_Release := \ -pipe \ -fPIC \ -Wno-unused-local-typedefs \ - -Wno-unknown-pragmas \ -m64 \ -march=x86-64 \ -fuse-ld=gold \ @@ -322,12 +323,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -402,7 +406,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/gl/gl_bindings.h b/ui/gl/gl_bindings.h index 8e0f2c6e61..8b136088fe 100644 --- a/ui/gl/gl_bindings.h +++ b/ui/gl/gl_bindings.h @@ -128,6 +128,9 @@ #define GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM 0x84F5 #define GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM 0x84F6 +// GL_CHROMIUM_sync_query +#define GL_COMMANDS_COMPLETED_CHROMIUM 0x84F7 + // GL_OES_texure_3D #define GL_SAMPLER_3D_OES 0x8B5F diff --git a/ui/gl/gl_fence.cc b/ui/gl/gl_fence.cc index 262de48af6..def030b5de 100644 --- a/ui/gl/gl_fence.cc +++ b/ui/gl/gl_fence.cc @@ -7,6 +7,7 @@ #include "base/compiler_specific.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_context.h" +#include "ui/gl/gl_version_info.h" namespace { @@ -165,7 +166,8 @@ gfx::GLFence* CreateFence(bool flush) { return new EGLFenceSync(flush); #endif // Prefer ARB_sync which supports server-side wait. - if (gfx::g_driver_gl.ext.b_GL_ARB_sync) + if (gfx::g_driver_gl.ext.b_GL_ARB_sync || + gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es3) return new GLFenceARBSync(flush); if (gfx::g_driver_gl.ext.b_GL_NV_fence) return new GLFenceNVFence(flush); diff --git a/ui/keyboard/keyboard.gyp b/ui/keyboard/keyboard.gyp index fe359c6ae1..153b38c44a 100644 --- a/ui/keyboard/keyboard.gyp +++ b/ui/keyboard/keyboard.gyp @@ -48,7 +48,7 @@ '../events/events.gyp:events', '../gfx/gfx.gyp:gfx', '../gfx/gfx.gyp:gfx_geometry', - '../wm/wm.gyp:wm_core', + '../wm/wm.gyp:wm', 'keyboard_resources', ], 'defines': [ diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc index 4dd085c6e0..52c7c14771 100644 --- a/ui/keyboard/keyboard_controller.cc +++ b/ui/keyboard/keyboard_controller.cc @@ -275,9 +275,9 @@ void KeyboardController::RemoveObserver(KeyboardControllerObserver* observer) { observer_list_.RemoveObserver(observer); } -void KeyboardController::ShowAndLockKeyboard() { - set_lock_keyboard(true); - OnShowImeIfNeeded(); +void KeyboardController::ShowKeyboard(bool lock) { + set_lock_keyboard(lock); + ShowKeyboardInternal(); } void KeyboardController::OnWindowHierarchyChanged( @@ -298,7 +298,7 @@ void KeyboardController::OnTextInputStateChanged( return; if (IsKeyboardUsabilityExperimentEnabled()) { - OnShowImeIfNeeded(); + ShowKeyboardInternal(); return; } @@ -337,6 +337,10 @@ void KeyboardController::OnInputMethodDestroyed( } void KeyboardController::OnShowImeIfNeeded() { + ShowKeyboardInternal(); +} + +void KeyboardController::ShowKeyboardInternal() { if (!container_.get()) return; @@ -350,7 +354,7 @@ void KeyboardController::OnShowImeIfNeeded() { proxy_->ReloadKeyboardIfNeeded(); - if (keyboard_visible_) + if (keyboard_visible_ || proxy_->GetKeyboardWindow()->bounds().height() == 0) return; keyboard_visible_ = true; @@ -370,10 +374,6 @@ void KeyboardController::OnShowImeIfNeeded() { !container_->layer()->GetAnimator()->is_animating()) return; - ShowKeyboard(); -} - -void KeyboardController::ShowKeyboard() { ToggleTouchEventLogging(false); ui::LayerAnimator* container_animator = container_->layer()->GetAnimator(); @@ -394,6 +394,8 @@ void KeyboardController::ShowKeyboard() { base::Unretained(this)))); container_animator->AddObserver(animation_observer_.get()); + proxy_->ShowKeyboardContainer(container_.get()); + { // Scope the following animation settings as we don't want to animate // visibility change that triggered by a call to the base class function @@ -406,8 +408,6 @@ void KeyboardController::ShowKeyboard() { container_->SetTransform(gfx::Transform()); container_->layer()->SetOpacity(1.0); } - - proxy_->ShowKeyboardContainer(container_.get()); } bool KeyboardController::WillHideKeyboard() const { diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h index 0541165b33..d62306263c 100644 --- a/ui/keyboard/keyboard_controller.h +++ b/ui/keyboard/keyboard_controller.h @@ -76,8 +76,9 @@ class KEYBOARD_EXPORT KeyboardController : public ui::InputMethodObserver, void set_lock_keyboard(bool lock) { lock_keyboard_ = lock; } - // Force the keyboard to show up if not showing and lock the keyboard. - void ShowAndLockKeyboard(); + // Force the keyboard to show up if not showing and lock the keyboard if + // |lock| is true. + void ShowKeyboard(bool lock); // Sets the active keyboard controller. KeyboardController takes ownership of // the instance. Calling ResetIntance with a new instance destroys the @@ -118,7 +119,7 @@ class KEYBOARD_EXPORT KeyboardController : public ui::InputMethodObserver, virtual void OnShowImeIfNeeded() OVERRIDE; // Show virtual keyboard immediately with animation. - void ShowKeyboard(); + void ShowKeyboardInternal(); // Returns true if keyboard is scheduled to hide. bool WillHideKeyboard() const; diff --git a/ui/keyboard/keyboard_controller_proxy.cc b/ui/keyboard/keyboard_controller_proxy.cc index acd78f89c3..92869462fb 100644 --- a/ui/keyboard/keyboard_controller_proxy.cc +++ b/ui/keyboard/keyboard_controller_proxy.cc @@ -54,9 +54,7 @@ class KeyboardContentsDelegate : public content::WebContentsDelegate, int new_height = pos.height(); bounds.set_y(bounds.y() + bounds.height() - new_height); bounds.set_height(new_height); - proxy_->set_resizing_from_contents(true); keyboard->SetBounds(bounds); - proxy_->set_resizing_from_contents(false); } // Overridden from content::WebContentsDelegate: @@ -81,7 +79,7 @@ class KeyboardContentsDelegate : public content::WebContentsDelegate, namespace keyboard { KeyboardControllerProxy::KeyboardControllerProxy() - : default_url_(kKeyboardURL), resizing_from_contents_(false) { + : default_url_(kKeyboardURL) { } KeyboardControllerProxy::~KeyboardControllerProxy() { diff --git a/ui/keyboard/keyboard_controller_proxy.h b/ui/keyboard/keyboard_controller_proxy.h index f05f6f2997..0884cd91bb 100644 --- a/ui/keyboard/keyboard_controller_proxy.h +++ b/ui/keyboard/keyboard_controller_proxy.h @@ -52,19 +52,10 @@ class KEYBOARD_EXPORT KeyboardControllerProxy { // with the proxy. virtual aura::Window* GetKeyboardWindow(); - // Whether the keyboard window is resizing from its web contents. - bool resizing_from_contents() const { return resizing_from_contents_; } - // Whether the keyboard window is created. The keyboard window is tied to a // WebContent so we can just check if the WebContent is created or not. virtual bool HasKeyboardWindow() const; - // Sets the flag of whether the keyboard window is resizing from - // its web contents. - void set_resizing_from_contents(bool resizing) { - resizing_from_contents_ = resizing; - } - // Gets the InputMethod that will provide notifications about changes in the // text input context. virtual ui::InputMethod* GetInputMethod() = 0; @@ -130,9 +121,6 @@ class KEYBOARD_EXPORT KeyboardControllerProxy { scoped_ptr<content::WebContents> keyboard_contents_; - // Whether the current keyboard window is resizing from its web content. - bool resizing_from_contents_; - DISALLOW_COPY_AND_ASSIGN(KeyboardControllerProxy); }; diff --git a/ui/keyboard/keyboard_controller_unittest.cc b/ui/keyboard/keyboard_controller_unittest.cc index cee5581bec..4333c84a17 100644 --- a/ui/keyboard/keyboard_controller_unittest.cc +++ b/ui/keyboard/keyboard_controller_unittest.cc @@ -27,6 +27,7 @@ #include "ui/keyboard/keyboard_controller_observer.h" #include "ui/keyboard/keyboard_controller_proxy.h" #include "ui/keyboard/keyboard_switches.h" +#include "ui/keyboard/keyboard_util.h" namespace keyboard { namespace { @@ -193,8 +194,15 @@ class KeyboardControllerTest : public testing::Test { void SetFocus(ui::TextInputClient* client) { ui::InputMethod* input_method = proxy()->GetInputMethod(); input_method->SetFocusedTextInputClient(client); - if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) + if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) { input_method->ShowImeIfNeeded(); + if (proxy_->GetKeyboardWindow()->bounds().height() == 0) { + // Set initial bounds for test keyboard window. + proxy_->GetKeyboardWindow()->SetBounds( + KeyboardBoundsFromWindowBounds( + controller()->GetContainerWindow()->bounds(), 100)); + } + } } bool WillHideKeyboard() { @@ -214,17 +222,27 @@ class KeyboardControllerTest : public testing::Test { TEST_F(KeyboardControllerTest, KeyboardSize) { aura::Window* container(controller()->GetContainerWindow()); - gfx::Rect bounds(0, 0, 100, 100); - container->SetBounds(bounds); + aura::Window* keyboard(proxy()->GetKeyboardWindow()); + container->SetBounds(gfx::Rect(0, 0, 200, 100)); + + container->AddChild(keyboard); + const gfx::Rect& before_bounds = keyboard->bounds(); + // The initial keyboard should be positioned at the bottom of container and + // has 0 height. + ASSERT_EQ(gfx::Rect(0, 100, 200, 0), before_bounds); - const gfx::Rect& before_bounds = proxy()->GetKeyboardWindow()->bounds(); gfx::Rect new_bounds( - before_bounds.x(), before_bounds.y(), - before_bounds.width() / 2, before_bounds.height() / 2); + before_bounds.x(), before_bounds.y() - 50, + before_bounds.width(), 50); + + keyboard->SetBounds(new_bounds); + ASSERT_EQ(new_bounds, keyboard->bounds()); - // The KeyboardController's LayoutManager shouldn't let this happen - proxy()->GetKeyboardWindow()->SetBounds(new_bounds); - ASSERT_EQ(before_bounds, proxy()->GetKeyboardWindow()->bounds()); + // Mock a screen rotation. + container->SetBounds(gfx::Rect(0, 0, 100, 200)); + // The above call should resize keyboard to new width while keeping the old + // height. + ASSERT_EQ(gfx::Rect(0, 150, 100, 50), keyboard->bounds()); } // Tests that tapping/clicking inside the keyboard does not give it focus. @@ -393,33 +411,6 @@ TEST_F(KeyboardControllerTest, AlwaysVisibleWhenLocked) { EXPECT_FALSE(keyboard_container->IsVisible()); } -TEST_F(KeyboardControllerTest, KeyboardResizingFromContents) { - aura::Window* keyboard_container = controller()->GetContainerWindow(); - aura::Window* keyboard_window = proxy()->GetKeyboardWindow(); - keyboard_container->SetBounds(gfx::Rect(800, 600)); - keyboard_container->AddChild(keyboard_window); - - int original_height = keyboard_window->bounds().height(); - - // Resizes from contents when flag is unset. - keyboard_window->SetBounds(gfx::Rect(100, 80)); - EXPECT_EQ(original_height, keyboard_window->bounds().height()); - - // Resizes from contents when flag is set. - proxy()->set_resizing_from_contents(true); - keyboard_window->SetBounds(gfx::Rect(100, 80)); - EXPECT_EQ(80, keyboard_window->bounds().height()); - - // Resizes from container when flag is set. - keyboard_container->SetBounds(gfx::Rect(400, 300)); - EXPECT_EQ(80, keyboard_window->bounds().height()); - - // Resizes from container when flag is unset. - proxy()->set_resizing_from_contents(false); - keyboard_container->SetBounds(gfx::Rect(800, 600)); - EXPECT_EQ(original_height, keyboard_window->bounds().height()); -} - class KeyboardControllerAnimationTest : public KeyboardControllerTest, public KeyboardControllerObserver { public: diff --git a/ui/keyboard/keyboard_layout_manager.cc b/ui/keyboard/keyboard_layout_manager.cc index 32085415bf..d7faf0fa7a 100644 --- a/ui/keyboard/keyboard_layout_manager.cc +++ b/ui/keyboard/keyboard_layout_manager.cc @@ -4,6 +4,7 @@ #include "ui/keyboard/keyboard_layout_manager.h" +#include "ui/compositor/layer_animator.h" #include "ui/keyboard/keyboard_controller.h" #include "ui/keyboard/keyboard_controller_proxy.h" #include "ui/keyboard/keyboard_util.h" @@ -12,14 +13,24 @@ namespace keyboard { // Overridden from aura::LayoutManager void KeyboardLayoutManager::OnWindowResized() { - if (keyboard_ && !controller_->proxy()->resizing_from_contents()) - ResizeKeyboardToDefault(keyboard_); + if (keyboard_) { + gfx::Rect window_bounds = controller_->GetContainerWindow()->bounds(); + // Keep the same height when window resize. It usually get called when + // screen rotate. + int height = keyboard_->bounds().height(); + keyboard_->SetBounds(gfx::Rect( + window_bounds.x(), + window_bounds.bottom() - height, + window_bounds.width(), + height)); + } } void KeyboardLayoutManager::OnWindowAddedToLayout(aura::Window* child) { DCHECK(!keyboard_); keyboard_ = child; - ResizeKeyboardToDefault(keyboard_); + keyboard_->SetBounds(DefaultKeyboardBoundsFromWindowBounds( + controller_->GetContainerWindow()->bounds())); } void KeyboardLayoutManager::SetChildBounds(aura::Window* child, @@ -28,16 +39,25 @@ void KeyboardLayoutManager::SetChildBounds(aura::Window* child, // resizing from the contents (through window.resizeTo call in JS). // The flag resizing_from_contents() is used to determine the source of the // resize. - if (controller_->proxy()->resizing_from_contents()) { + DCHECK(child == keyboard_); + + ui::LayerAnimator* animator = + controller_->GetContainerWindow()->layer()->GetAnimator(); + // Stops previous animation if a window resize is requested during animation. + if (animator->is_animating()) + animator->StopAnimating(); + + gfx::Rect old_bounds = child->bounds(); + SetChildBoundsDirect(child, requested_bounds); + if (old_bounds.height() == 0 && child->bounds().height() != 0) { + // The window height is set to 0 initially. If the height of |old_bounds| is + // 0 and the new bounds is not 0, it probably means window.resizeTo is + // called to set the window height. We should try to show keyboard again in + // case the show keyboard request is called before the height is set. + controller_->ShowKeyboard(false); + } else { controller_->NotifyKeyboardBoundsChanging(requested_bounds); - SetChildBoundsDirect(child, requested_bounds); } } -void KeyboardLayoutManager::ResizeKeyboardToDefault(aura::Window* child) { - gfx::Rect keyboard_bounds = DefaultKeyboardBoundsFromWindowBounds( - controller_->GetContainerWindow()->bounds()); - SetChildBoundsDirect(child, keyboard_bounds); -} - } // namespace keyboard diff --git a/ui/keyboard/keyboard_layout_manager.h b/ui/keyboard/keyboard_layout_manager.h index 52af5c9525..bc13f16c9c 100644 --- a/ui/keyboard/keyboard_layout_manager.h +++ b/ui/keyboard/keyboard_layout_manager.h @@ -32,8 +32,6 @@ class KeyboardLayoutManager : public aura::LayoutManager { const gfx::Rect& requested_bounds) OVERRIDE; private: - void ResizeKeyboardToDefault(aura::Window* child); - KeyboardController* controller_; aura::Window* keyboard_; diff --git a/ui/keyboard/keyboard_util.cc b/ui/keyboard/keyboard_util.cc index 7048be2e55..1e06795bdc 100644 --- a/ui/keyboard/keyboard_util.cc +++ b/ui/keyboard/keyboard_util.cc @@ -43,26 +43,6 @@ bool g_accessibility_keyboard_enabled = false; base::LazyInstance<GURL> g_override_content_url = LAZY_INSTANCE_INITIALIZER; -// The ratio between the height of the keyboard and the screen when using the -// usability keyboard. -const float kUsabilityKeyboardHeightRatio = 1.0f; - -// The default ratio between the height of the keyboard and the screen. -const float kDefaultKeyboardHeightRatio = 0.41f; - -// The ratio between the height of the keyboard and the screen when using the -// accessibility keyboard. -const float kAccessibilityKeyboardHeightRatio = 0.3f; - -float GetKeyboardHeightRatio(){ - if (keyboard::IsKeyboardUsabilityExperimentEnabled()) { - return kUsabilityKeyboardHeightRatio; - } else if (keyboard::GetAccessibilityKeyboardEnabled()) { - return kAccessibilityKeyboardHeightRatio; - } - return kDefaultKeyboardHeightRatio; -} - bool g_touch_keyboard_enabled = false; } // namespace @@ -71,12 +51,23 @@ namespace keyboard { gfx::Rect DefaultKeyboardBoundsFromWindowBounds( const gfx::Rect& window_bounds) { - const float kKeyboardHeightRatio = GetKeyboardHeightRatio(); + // Initialize default keyboard height to 0. The keyboard window height should + // only be set by window.resizeTo in virtual keyboard web contents. Otherwise, + // the default height may conflict with the new height and causing some + // strange animation issues. For keyboard usability experiments, a full screen + // virtual keyboard window is always preferred. int keyboard_height = - static_cast<int>(window_bounds.height() * kKeyboardHeightRatio); + keyboard::IsKeyboardUsabilityExperimentEnabled() ? + window_bounds.height() : 0; + + return KeyboardBoundsFromWindowBounds(window_bounds, keyboard_height); +} + +gfx::Rect KeyboardBoundsFromWindowBounds(const gfx::Rect& window_bounds, + int keyboard_height) { return gfx::Rect( window_bounds.x(), - window_bounds.y() + window_bounds.height() - keyboard_height, + window_bounds.bottom() - keyboard_height, window_bounds.width(), keyboard_height); } diff --git a/ui/keyboard/keyboard_util.h b/ui/keyboard/keyboard_util.h index a3a1f8a9bf..4e09d96e61 100644 --- a/ui/keyboard/keyboard_util.h +++ b/ui/keyboard/keyboard_util.h @@ -42,6 +42,11 @@ enum KeyboardControlEvent { KEYBOARD_EXPORT gfx::Rect DefaultKeyboardBoundsFromWindowBounds( const gfx::Rect& window_bounds); +// Gets the caculated keyboard bounds from |window_bounds|. The keyboard height +// is specified by |keyboard_height|. +KEYBOARD_EXPORT gfx::Rect KeyboardBoundsFromWindowBounds( + const gfx::Rect& window_bounds, int keyboard_height); + // Sets the state of the a11y onscreen keyboard. KEYBOARD_EXPORT void SetAccessibilityKeyboardEnabled(bool enabled); diff --git a/ui/keyboard/resources/constants.js b/ui/keyboard/resources/constants.js index 96365592ca..9b017046de 100644 --- a/ui/keyboard/resources/constants.js +++ b/ui/keyboard/resources/constants.js @@ -59,6 +59,18 @@ var KEY_ASPECT_RATIO_PORTRAIT = 1; var KEY_ASPECT_RATIO_LANDSCAPE = 1.46; /** + * The ratio between the height and width of the compact keyboard. + * @type {number} + */ +var DEFAULT_KEYBOARD_ASPECT_RATIO = 0.3; + +/** + * The ratio between the height and width of the a11y keyboard. + * @type {number} + */ +var DEFAULT_A11Y_KEYBOARD_ASPECT_RATIO = 0.41; + +/** * The default weight of a key. * @type {number} */ diff --git a/ui/keyboard/resources/elements/kb-key.html b/ui/keyboard/resources/elements/kb-key.html index 6b9103af73..4a947bed04 100644 --- a/ui/keyboard/resources/elements/kb-key.html +++ b/ui/keyboard/resources/elements/kb-key.html @@ -9,13 +9,13 @@ <template> <style> :host { - background-color: #3b3b3e; - border-radius: 2px; + background-color: #ffffff; + border-radius: 1px; border-style: solid; - border-width: 1px 0px; - color: #ffffff; - font-family: roboto-bold; - font-weight: 300; + border-width: 0px 0px; + color: #666666; + font-family: 'Droid Sans'; + font-weight: 100; } :host .key { @@ -58,20 +58,20 @@ height: 80%; } + :host .hint, + :host([invert]) key { + color: #bbbbbb; + } + :host .hint { - color: #313131; font-size: 70%; position: absolute; right: 7%; top: 5%; } - :host([invert]) .key { - color: #313131; - } - :host([invert]) .hint { - color: #ffffff; + color: #666666; } :host(.dark) { @@ -79,26 +79,17 @@ } :host(.active) { - -webkit-box-shadow: inset 0px 1px #969696, inset 0px -1px #6f6f6f; - background-image: -webkit-linear-gradient(#8b8b8b, #7d7d7d); + background-color: #dddddd; background-size: cover; - border-bottom-color: #5b5b5b; - border-top-color: #a4a4a4; } :host(.dark:not(.active)) { - -webkit-box-shadow: inset 0px 1px #313131, inset 0px -1px #202020; - background-color: #222222; - border-bottom-color: #1c1c1c; - border-top-color: #4f4f4f; + background-color: #555555; } :host(:not(.dark):not(.active)) { - -webkit-box-shadow: inset 0px 1px #6f6f6f, inset 0px -1px #565656; - background-image: -webkit-linear-gradient(#636363, #5b5b5b); + background-color: #ffffff; background-size: cover; - border-bottom-color: #4a4a4a; - border-top-color: #878787; } </style> <div id="key" class="key"> diff --git a/ui/keyboard/resources/elements/kb-keyboard.html b/ui/keyboard/resources/elements/kb-keyboard.html index 4d32229d47..b0b3ca6f15 100644 --- a/ui/keyboard/resources/elements/kb-keyboard.html +++ b/ui/keyboard/resources/elements/kb-keyboard.html @@ -15,8 +15,7 @@ <style> :host { -webkit-user-select: none; - background-image: -webkit-linear-gradient(#282828, #000000); - background-size: cover; + background-color: #eeeeee; bottom: 0; cursor: default; left: 0; diff --git a/ui/keyboard/resources/elements/kb-shift-key.html b/ui/keyboard/resources/elements/kb-shift-key.html index 4deab642e1..1e1e734007 100644 --- a/ui/keyboard/resources/elements/kb-shift-key.html +++ b/ui/keyboard/resources/elements/kb-shift-key.html @@ -19,13 +19,9 @@ } .shift-light { - -webkit-box-shadow: inset 0 1px #101010, inset 0 -1px #444444; - background-image: -webkit-linear-gradient(#101010, #000000); - border: solid; - border-bottom-color: #1d1d1d; - border-top-color: #2d2d2d; - border-width: 1px 0; - height: 0.3em; + background-color: #ffffff; + border: none; + height: 0.2em; margin: 0 auto; position: relative; width: 1.8em; diff --git a/ui/keyboard/resources/images/back.svg b/ui/keyboard/resources/images/back.svg index 33d519a7f5..61895dc4ae 100644 --- a/ui/keyboard/resources/images/back.svg +++ b/ui/keyboard/resources/images/back.svg @@ -24,4 +24,4 @@ d="m 0,0 -6.845,0 2.8,2.8 -1.132,1.132 -4.697,-4.699 4.688,-4.764 1.14,1.122 L -6.81,-1.6 0,-1.6 0,0 z" inkscape:connector-curvature="0" id="path14" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></svg>
\ No newline at end of file + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></svg> diff --git a/ui/keyboard/resources/images/backspace.svg b/ui/keyboard/resources/images/backspace.svg index 9e195abc92..eab8171e22 100644 --- a/ui/keyboard/resources/images/backspace.svg +++ b/ui/keyboard/resources/images/backspace.svg @@ -9,7 +9,7 @@ </sodipodi:namedview> <g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> <g id="g1722" transform="matrix(1.25,0,0,-1.25,31.657411,29.649286)"> - <path id="path1724" inkscape:connector-curvature="0" fill="#FFFFFF" d="M-0.626,0.41l-3.181,3.177l-3.176-3.18l-1.106,1.106 + <path id="path1724" inkscape:connector-curvature="0" fill="#666666" d="M-0.626,0.41l-3.181,3.177l-3.176-3.18l-1.106,1.106 l3.179,3.181l-3.179,3.179l1.106,1.107l3.176-3.18l3.181,3.18l1.103-1.107L-2.7,4.692l3.177-3.18L-0.626,0.41z M-18.792,4.47 l6.248-6.231H6.54V10.8h-19.084L-18.792,4.47z"/> </g> diff --git a/ui/keyboard/resources/images/down.svg b/ui/keyboard/resources/images/down.svg index 45f6466e6e..f83fdd0042 100644 --- a/ui/keyboard/resources/images/down.svg +++ b/ui/keyboard/resources/images/down.svg @@ -24,4 +24,4 @@ d="M 0,0 3.57,-3.57 7.199,0" inkscape:connector-curvature="0" id="path14" - style="fill:none;stroke:#ffffff;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg>
\ No newline at end of file + style="fill:none;stroke:#666666;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg> diff --git a/ui/keyboard/resources/images/hide-keyboard.svg b/ui/keyboard/resources/images/hide-keyboard.svg index 3c2d0f3dbf..55d59ebe74 100644 --- a/ui/keyboard/resources/images/hide-keyboard.svg +++ b/ui/keyboard/resources/images/hide-keyboard.svg @@ -4,11 +4,11 @@ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve"> <symbol id="ic_x5F_keyboard_x0D_" viewBox="0 -24 24 24"> - <path fill="#FFFFFF" d="M21-5H3C1.896-5,1.01-5.896,1.01-7L1-18c0-1.104,0.896-2,2-2h18c1.104,0,2,0.896,2,2v11 + <path fill="#666666" d="M21-5H3C1.896-5,1.01-5.896,1.01-7L1-18c0-1.104,0.896-2,2-2h18c1.104,0,2,0.896,2,2v11 C23-5.896,22.104-5,21-5z M11-8h2v-2h-2V-8z M11-11h2v-2h-2V-11z M8-8h2v-2H8V-8z M8-11h2v-2H8V-11z M7-13H5v2h2V-13z M7-10H5v2h2 V-10z M16-17H8v2h8V-17z M16-13h-2v2h2V-13z M16-10h-2v2h2V-10z M19-13h-2v2h2V-13z M19-10h-2v2h2V-10z"/> <polygon fill="none" points="24,-24 0,-24 0,0 24,0 "/> </symbol> <use xlink:href="#ic_x5F_keyboard_x0D_" width="24" height="24" id="XMLID_144_" y="-24" transform="matrix(1 0 0 -1 12 10)" overflow="visible"/> -<polygon fill="#FFFFFF" points="21,32 27,32 24,35 "/> +<polygon fill="#666666" points="21,32 27,32 24,35 "/> </svg> diff --git a/ui/keyboard/resources/images/left.svg b/ui/keyboard/resources/images/left.svg index 0d31feb576..8c2e7436dd 100644 --- a/ui/keyboard/resources/images/left.svg +++ b/ui/keyboard/resources/images/left.svg @@ -24,4 +24,4 @@ d="M 0,0 -3.57,-3.57 0,-7.199" inkscape:connector-curvature="0" id="path14" - style="fill:none;stroke:#ffffff;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg>
\ No newline at end of file + style="fill:none;stroke:#666666;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg> diff --git a/ui/keyboard/resources/images/return.svg b/ui/keyboard/resources/images/return.svg index 3d69631fc7..d83cc06f96 100644 --- a/ui/keyboard/resources/images/return.svg +++ b/ui/keyboard/resources/images/return.svg @@ -9,7 +9,7 @@ </sodipodi:namedview> <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1"> <g id="g1718" transform="matrix(1.25,0,0,-1.25,39.764197,19.091786)"> - <path id="path1720" inkscape:connector-curvature="0" fill="#FFFFFF" d="M0.457,0.572v-3.598h-18v6.295l-9.936-7.197l9.936-7.193 + <path id="path1720" inkscape:connector-curvature="0" fill="#666666" d="M0.457,0.572v-3.598h-18v6.295l-9.936-7.197l9.936-7.193 v6.295h19.8v5.398H0.457z"/> </g> </g> diff --git a/ui/keyboard/resources/images/right.svg b/ui/keyboard/resources/images/right.svg index 09f2e28c72..94178420cd 100644 --- a/ui/keyboard/resources/images/right.svg +++ b/ui/keyboard/resources/images/right.svg @@ -24,4 +24,4 @@ d="M 0,0 3.57,3.57 0,7.199" inkscape:connector-curvature="0" id="path14" - style="fill:none;stroke:#ffffff;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg>
\ No newline at end of file + style="fill:none;stroke:#666666;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg> diff --git a/ui/keyboard/resources/images/search.svg b/ui/keyboard/resources/images/search.svg index 9628a3c2c9..5a5a783cd6 100644 --- a/ui/keyboard/resources/images/search.svg +++ b/ui/keyboard/resources/images/search.svg @@ -9,7 +9,7 @@ </sodipodi:namedview> <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1"> <g id="g1682" transform="matrix(1.25,0,0,-1.25,36.051257,32.440573)"> - <path id="path1684" inkscape:connector-curvature="0" fill="#FFFFFF" d="M0.114-0.8l-5.342,5.346h-1.102L-6.819,5.03 + <path id="path1684" inkscape:connector-curvature="0" fill="#666666" d="M0.114-0.8l-5.342,5.346h-1.102L-6.819,5.03 c2.267,2.885,2.064,6.957-0.52,9.551c-2.802,2.799-7.329,2.799-10.138,0c-2.786-2.809-2.788-7.338,0-10.139 c2.598-2.58,6.629-2.792,9.557-0.513l0.486-0.485V2.342l5.338-5.347c0.324-0.32,1.108-0.198,1.756,0.447 C0.307-1.908,0.441-1.126,0.114-0.8 M-8.772,5.897L-8.772,5.897h-0.02V5.878c-2.006-1.991-5.24-1.987-7.244,0.008 diff --git a/ui/keyboard/resources/images/shift-filled.svg b/ui/keyboard/resources/images/shift-filled.svg index 12cccf69a7..a6a87bba20 100644 --- a/ui/keyboard/resources/images/shift-filled.svg +++ b/ui/keyboard/resources/images/shift-filled.svg @@ -9,7 +9,7 @@ </sodipodi:namedview> <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1"> <g id="g1726" transform="matrix(1.25,0,0,-1.25,24.286964,10.049732)"> - <path id="path1728" inkscape:connector-curvature="0" fill="#FFFFFF" d="M-0.229-0.686l-7.02-7.051l-7.021-7.054h8.134v-6.845 + <path id="path1728" inkscape:connector-curvature="0" fill="#666666" d="M-0.229-0.686l-7.02-7.051l-7.021-7.054h8.134v-6.845 H5.256v6.845h8.555L6.795-7.736L-0.229-0.686z"/> </g> </g> diff --git a/ui/keyboard/resources/images/shift.svg b/ui/keyboard/resources/images/shift.svg index 4f0f95fbb3..39f25d22ae 100644 --- a/ui/keyboard/resources/images/shift.svg +++ b/ui/keyboard/resources/images/shift.svg @@ -9,7 +9,7 @@ </sodipodi:namedview> <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1"> <g id="g1726" transform="matrix(1.25,0,0,-1.25,24.286964,10.049732)"> - <path id="path1728" inkscape:connector-curvature="0" fill="#FFFFFF" d="M-0.229-0.686l-7.02-7.051l-7.021-7.054h8.134v-6.845 + <path id="path1728" inkscape:connector-curvature="0" fill="#666666" d="M-0.229-0.686l-7.02-7.051l-7.021-7.054h8.134v-6.845 H5.256v6.845h8.555L6.795-7.736L-0.229-0.686z M-0.229-3.873l5.428-5.45l3.198-3.216H5.256h-2.25v-2.25v-4.595h-6.891v4.595v2.25 h-2.25h-2.72l3.201,3.215L-0.229-3.873z"/> </g> diff --git a/ui/keyboard/resources/images/tab.svg b/ui/keyboard/resources/images/tab.svg index 89c2f62178..cb64ebd8ba 100644 --- a/ui/keyboard/resources/images/tab.svg +++ b/ui/keyboard/resources/images/tab.svg @@ -9,11 +9,11 @@ </sodipodi:namedview> <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1"> <g id="g1736" transform="matrix(1.25,0,0,-1.25,38.01192,16.333282)"> - <path id="path1738" inkscape:connector-curvature="0" fill="#FFFFFF" d="M1.422-0.841h-15.969v-5.077l-8.011,5.802l8.011,5.805 + <path id="path1738" inkscape:connector-curvature="0" fill="#666666" d="M1.422-0.841h-15.969v-5.077l-8.011,5.802l8.011,5.805 V0.611H1.422V-0.841z"/> </g> <g id="g1742" transform="matrix(1.25,0,0,-1.25,6.434791,29.565652)"> - <path id="path1744" inkscape:connector-curvature="0" fill="#FFFFFF" d="M1.421-0.841h15.97v5.076l8.011-5.801L17.391-7.37v5.076 + <path id="path1744" inkscape:connector-curvature="0" fill="#666666" d="M1.421-0.841h15.97v5.076l8.011-5.801L17.391-7.37v5.076 H1.421V-0.841z"/> </g> </g> diff --git a/ui/keyboard/resources/images/up.svg b/ui/keyboard/resources/images/up.svg index 3b55bd7a08..696f92fea3 100644 --- a/ui/keyboard/resources/images/up.svg +++ b/ui/keyboard/resources/images/up.svg @@ -24,4 +24,4 @@ d="M 0,0 -3.57,3.57 -7.199,0" inkscape:connector-curvature="0" id="path14" - style="fill:none;stroke:#ffffff;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg>
\ No newline at end of file + style="fill:none;stroke:#666666;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg> diff --git a/ui/keyboard/resources/main.css b/ui/keyboard/resources/main.css index 99c2c27080..b206ea4465 100644 --- a/ui/keyboard/resources/main.css +++ b/ui/keyboard/resources/main.css @@ -15,7 +15,7 @@ */ kb-keyboard.ctrl-active kb-modifier-key[char=Ctrl], kb-keyboard.alt-active kb-modifier-key[char=Alt] { - color: lightblue; + background-color: #bbbbbb; } kb-keyboard[keyset="upper"] kb-shift-key.dark /deep/ .key { @@ -31,74 +31,24 @@ kb-keyboard[keyset="lower"] kb-shift-key /deep/ .key{ */ kb-keyboard.caps-locked kb-shift-key.dark /deep/ .shift-light { - -webkit-box-shadow: 0 1px 1px rgba(213, 213, 213, 0.5), - 0 -1px 1px rgba(213, 213, 213, 0.5); - background-image: -webkit-linear-gradient(#d5d5d5, #d5d5d5); - border: none; - height: 0.2em; -} -kb-keyboard.caps-locked kb-shift-key.dark /deep/ - .shift-light-wrapper { - bottom: 2px; + background-color: rgba(0, 0, 255, 0.5); } kb-keyboard.ctrl-active kb-modifier-key[char=Ctrl], kb-keyboard.ctrl-active kb-modifier-key[char=Ctrl] { - color: lightblue; -} - -/** TODO(rsadam@): Move these rules to kb-row once we uprev to latest Polymer.*/ -kb-row:nth-child(2) kb-key:not(.dark):not(.active){ - -webkit-box-shadow: inset 0px 1px #666666, inset 0px -1px #4c4c4c; - background-image: -webkit-linear-gradient(#5a5a5a, #515151); - background-size: cover; - border-bottom-color: #414141; - border-top-color: #7f7f7f; -} - -kb-row:nth-child(3) kb-key:not(.dark):not(.active){ - -webkit-box-shadow: inset 0px 1px #5d5d5d, inset 0px -1px #444444; - background-image: -webkit-linear-gradient(#505050, #494949); - background-size: cover; - border-bottom-color: #3a3a3a; - border-top-color: #787878; -} - -kb-row:nth-child(n+3) kb-key:not(.dark):not(.active){ - -webkit-box-shadow: inset 0px 1px #565656, inset 0px -1px #434343; - background-image: -webkit-linear-gradient(#484848, #474747); - background-size: cover; - border-bottom-color: #393939; - border-top-color: #717171; -} - -kb-row:nth-child(2) kb-key:not([invert]) /deep/ .hint { - color: #2C2C2C; -} - -kb-row:nth-child(3) kb-key:not([invert]) /deep/ .hint { - color: #272727; -} - -kb-row:nth-child(n+3) kb-key:not([invert]) /deep/ .hint { - color: #232323; + color: blue; } +.space, .dark { font-size: 70%; } -.dark:not(.active) { - -webkit-box-shadow: inset 0px 1px #313131, inset 0px -1px #202020; - background-color: #222222; - border-bottom-color: #1c1c1c; - border-top-color: #4f4f4f; +.dark:not(.active), +:not(kb-altkey-set) > :not(.dark).active { + background-color: #dddddd; } -:not(kb-altkey-set) > .active { - -webkit-box-shadow: inset 0px 1px #969696, inset 0px -1px #6f6f6f; - background-image: -webkit-linear-gradient(#8b8b8b, #7d7d7d); - background-size: cover; - border-bottom-color: #5b5b5b; - border-top-color: #a4a4a4; +.space { + color: bbbbbb; } diff --git a/ui/keyboard/resources/main.js b/ui/keyboard/resources/main.js index 8eb8d5bbb1..c837aed2ad 100644 --- a/ui/keyboard/resources/main.js +++ b/ui/keyboard/resources/main.js @@ -205,9 +205,14 @@ * @return {Array.<String, number>} The bounds of the keyboard container. */ function getKeyboardBounds_() { + var keyboard = $('keyboard'); + var ratio = DEFAULT_KEYBOARD_ASPECT_RATIO; + if (keyboard.config && keyboard.config.a11ymode) { + ratio = DEFAULT_A11Y_KEYBOARD_ASPECT_RATIO; + } return { - "width": window.innerWidth, - "height": window.innerHeight, + "width": screen.width, + "height": screen.height * ratio }; } @@ -566,8 +571,7 @@ */ function resizeKeyboardContainer(opt_params) { var params = opt_params ? opt_params : new AlignmentOptions(); - var bounds = getKeyboardBounds(); - if (Math.abs(bounds.height - params.height) > RESIZE_THRESHOLD) { + if (Math.abs(window.innerHeight - params.height) > RESIZE_THRESHOLD) { // Cannot resize more than 50% of screen height due to crbug.com/338829. window.resizeTo(params.width, params.height); } diff --git a/ui/message_center/cocoa/opaque_views.h b/ui/message_center/cocoa/opaque_views.h new file mode 100644 index 0000000000..1a2f3b0235 --- /dev/null +++ b/ui/message_center/cocoa/opaque_views.h @@ -0,0 +1,36 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_MESSAGE_CENTER_COCOA_OPAQUE_VIEWS_H_ +#define UI_MESSAGE_CENTER_COCOA_OPAQUE_VIEWS_H_ + +#import <Cocoa/Cocoa.h> + +#include "base/mac/scoped_nsobject.h" + +// MCDropDown is the same as an NSPopupButton except that it fills its +// background with a settable color. +@interface MCDropDown : NSPopUpButton { + @private + base::scoped_nsobject<NSColor> backgroundColor_; +} + +// Gets and sets the bubble's background color. +- (NSColor*)backgroundColor; +- (void)setBackgroundColor:(NSColor*)backgroundColor; +@end + +// MCTextField fills its background with an opaque color. It also configures +// the view to have a plan appearance, without bezel, border, editing, etc. +@interface MCTextField : NSTextField { + @private + base::scoped_nsobject<NSColor> backgroundColor_; +} + +// Use this method to create the text field. The color is required so it +// can correctly subpixel antialias. +- (id)initWithFrame:(NSRect)frameRect backgroundColor:(NSColor*)color; +@end + +#endif // UI_MESSAGE_CENTER_COCOA_OPAQUE_VIEWS_H_ diff --git a/ui/message_center/cocoa/opaque_views.mm b/ui/message_center/cocoa/opaque_views.mm new file mode 100644 index 0000000000..b6e054f519 --- /dev/null +++ b/ui/message_center/cocoa/opaque_views.mm @@ -0,0 +1,63 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ui/message_center/cocoa/opaque_views.h" + +@implementation MCDropDown +// The view must be opaque to render subpixel antialiasing. +- (BOOL)isOpaque { + return YES; +} + +// The view must also fill its background to render subpixel antialiasing. +- (void)drawRect:(NSRect)dirtyRect { + [backgroundColor_ set]; + NSRectFill(dirtyRect); + [super drawRect:dirtyRect]; +} + +- (NSColor*)backgroundColor { + return backgroundColor_; +} + +- (void)setBackgroundColor:(NSColor*)backgroundColor { + backgroundColor_.reset([backgroundColor retain]); +} +@end + +@implementation MCTextField +- (id)initWithFrame:(NSRect)frameRect backgroundColor:(NSColor*)color { + self = [self initWithFrame:frameRect]; + if (self) { + [self setBackgroundColor:color]; + backgroundColor_.reset([color retain]); + } + return self; +} + +- (id)initWithFrame:(NSRect)frameRect { + self = [super initWithFrame:frameRect]; + if (self) { + [self setAutoresizingMask:NSViewMinYMargin]; + [self setBezeled:NO]; + [self setBordered:NO]; + [self setEditable:NO]; + [self setSelectable:NO]; + [self setDrawsBackground:YES]; + } + return self; +} + +// The view must be opaque to render subpixel antialiasing. +- (BOOL)isOpaque { + return YES; +} + +// The view must also fill its background to render subpixel antialiasing. +- (void)drawRect:(NSRect)dirtyRect { + [backgroundColor_ set]; + NSRectFill(dirtyRect); + [super drawRect:dirtyRect]; +} +@end diff --git a/ui/message_center/cocoa/settings_controller.h b/ui/message_center/cocoa/settings_controller.h index 522e7e7f60..9869206732 100644 --- a/ui/message_center/cocoa/settings_controller.h +++ b/ui/message_center/cocoa/settings_controller.h @@ -9,6 +9,7 @@ #import "base/mac/scoped_nsobject.h" #include "base/memory/scoped_ptr.h" +#import "ui/message_center/cocoa/opaque_views.h" #import "ui/message_center/cocoa/settings_entry_view.h" #include "ui/message_center/message_center_export.h" #include "ui/message_center/notifier_settings.h" @@ -53,7 +54,7 @@ MESSAGE_CENTER_EXPORT base::scoped_nsobject<NSTextField> detailsText_; // The profile switcher. - base::scoped_nsobject<NSPopUpButton> groupDropDownButton_; + base::scoped_nsobject<MCDropDown> groupDropDownButton_; // Container for all the checkboxes. base::scoped_nsobject<NSScrollView> scrollView_; diff --git a/ui/message_center/cocoa/settings_controller.mm b/ui/message_center/cocoa/settings_controller.mm index 1f8e204517..0bf9d5af08 100644 --- a/ui/message_center/cocoa/settings_controller.mm +++ b/ui/message_center/cocoa/settings_controller.mm @@ -13,6 +13,7 @@ #include "grit/ui_strings.h" #include "skia/ext/skia_utils_mac.h" #include "ui/base/l10n/l10n_util.h" +#import "ui/message_center/cocoa/opaque_views.h" #import "ui/message_center/cocoa/settings_entry_view.h" #import "ui/message_center/cocoa/tray_view_controller.h" #include "ui/message_center/message_center_style.h" @@ -104,12 +105,11 @@ void NotifierSettingsObserverMac::NotifierGroupChanged() { } - (NSTextField*)newLabelWithFrame:(NSRect)frame { - NSTextField* label = [[NSTextField alloc] initWithFrame:frame]; - [label setDrawsBackground:NO]; - [label setBezeled:NO]; - [label setEditable:NO]; - [label setSelectable:NO]; - [label setAutoresizingMask:NSViewMinYMargin]; + NSColor* color = gfx::SkColorToCalibratedNSColor( + message_center::kMessageCenterBackgroundColor); + MCTextField* label = + [[MCTextField alloc] initWithFrame:frame backgroundColor:color]; + return label; } @@ -141,7 +141,6 @@ void NotifierSettingsObserverMac::NotifierGroupChanged() { NSWidth(fullFrame), NSHeight(fullFrame)); settingsText_.reset([self newLabelWithFrame:headerFrame]); - [settingsText_ setAutoresizingMask:NSViewMinYMargin]; [settingsText_ setTextColor: gfx::SkColorToCalibratedNSColor(message_center::kRegularTextColor)]; [settingsText_ @@ -161,7 +160,6 @@ void NotifierSettingsObserverMac::NotifierGroupChanged() { NSWidth(fullFrame), NSHeight(fullFrame)); detailsText_.reset([self newLabelWithFrame:subheaderFrame]); - [detailsText_ setAutoresizingMask:NSViewMinYMargin]; [detailsText_ setTextColor: gfx::SkColorToCalibratedNSColor(message_center::kDimTextColor)]; [detailsText_ @@ -186,8 +184,10 @@ void NotifierSettingsObserverMac::NotifierGroupChanged() { NSWidth(fullFrame), NSHeight(fullFrame)); groupDropDownButton_.reset( - [[NSPopUpButton alloc] initWithFrame:dropDownButtonFrame - pullsDown:YES]); + [[MCDropDown alloc] initWithFrame:dropDownButtonFrame pullsDown:YES]); + [groupDropDownButton_ + setBackgroundColor:gfx::SkColorToCalibratedNSColor( + message_center::kMessageCenterBackgroundColor)]; [groupDropDownButton_ setAction:@selector(notifierGroupSelectionChanged:)]; [groupDropDownButton_ setTarget:self]; // Add a dummy item for pull-down. diff --git a/ui/message_center/cocoa/settings_entry_view.mm b/ui/message_center/cocoa/settings_entry_view.mm index 0607247f87..ab73d98c74 100644 --- a/ui/message_center/cocoa/settings_entry_view.mm +++ b/ui/message_center/cocoa/settings_entry_view.mm @@ -56,6 +56,23 @@ const int kCorrectedIconTextPadding = const int kCorrectedEntryRightPadding = kInternalHorizontalSpacing - kIntrinsicLearnMorePadding; +//////////////////////////////////////////////////////////////////////////////// + +@interface MCSettingsButton : NSButton +@end + +@implementation MCSettingsButton +// drawRect: needs to fill the button with a background, otherwise we don't get +// subpixel antialiasing. +- (void)drawRect:(NSRect)dirtyRect { + NSColor* color = gfx::SkColorToCalibratedNSColor( + message_center::kMessageCenterBackgroundColor); + [color set]; + NSRectFill(dirtyRect); + [super drawRect:dirtyRect]; +} +@end + @interface MCSettingsButtonCell : NSButtonCell { // A checkbox's regular image is the checkmark image. This additional image // is used for the favicon or app icon shown next to the checkmark. @@ -65,6 +82,10 @@ const int kCorrectedEntryRightPadding = @end @implementation MCSettingsButtonCell +- (BOOL)isOpaque { + return YES; +} + - (void)setExtraImage:(NSImage*)extraImage { extraImage_.reset([extraImage retain]); } @@ -133,7 +154,6 @@ const int kCorrectedEntryRightPadding = @end @implementation MCSettingsEntryView - - (id)initWithController:(MCSettingsController*)controller notifier:(message_center::Notifier*)notifier frame:(NSRect)frame @@ -218,7 +238,7 @@ const int kCorrectedEntryRightPadding = } if (!checkbox_.get()) { - checkbox_.reset([[NSButton alloc] initWithFrame:checkboxFrame]); + checkbox_.reset([[MCSettingsButton alloc] initWithFrame:checkboxFrame]); [self addSubview:checkbox_]; } else { [checkbox_ setFrame:checkboxFrame]; diff --git a/ui/message_center/cocoa/tray_view_controller.mm b/ui/message_center/cocoa/tray_view_controller.mm index 5344268fed..2458457185 100644 --- a/ui/message_center/cocoa/tray_view_controller.mm +++ b/ui/message_center/cocoa/tray_view_controller.mm @@ -14,6 +14,7 @@ #import "ui/base/cocoa/hover_image_button.h" #include "ui/base/l10n/l10n_util_mac.h" #include "ui/base/resource/resource_bundle.h" +#import "ui/message_center/cocoa/opaque_views.h" #import "ui/message_center/cocoa/notification_controller.h" #import "ui/message_center/cocoa/settings_controller.h" #include "ui/message_center/message_center.h" @@ -398,19 +399,12 @@ const CGFloat kTrayBottomMargin = 75; ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); NSView* view = [self view]; - auto configureLabel = ^(NSTextField* textField) { - [textField setAutoresizingMask:NSViewMinYMargin]; - [textField setBezeled:NO]; - [textField setBordered:NO]; - [textField setDrawsBackground:NO]; - [textField setEditable:NO]; - [textField setSelectable:NO]; - }; - // Create the "Notifications" label at the top of the tray. NSFont* font = [NSFont labelFontOfSize:message_center::kTitleFontSize]; - title_.reset([[NSTextField alloc] initWithFrame:NSZeroRect]); - configureLabel(title_); + NSColor* color = gfx::SkColorToCalibratedNSColor( + message_center::kMessageCenterBackgroundColor); + title_.reset( + [[MCTextField alloc] initWithFrame:NSZeroRect backgroundColor:color]); [title_ setFont:font]; [title_ setStringValue: @@ -541,8 +535,8 @@ const CGFloat kTrayBottomMargin = 75; // Create the description field for the empty message center. Initially it is // invisible. - emptyDescription_.reset([[NSTextField alloc] initWithFrame:NSZeroRect]); - configureLabel(emptyDescription_); + emptyDescription_.reset( + [[MCTextField alloc] initWithFrame:NSZeroRect backgroundColor:color]); NSFont* smallFont = [NSFont labelFontOfSize:message_center::kEmptyCenterFontSize]; diff --git a/ui/message_center/message_center.gyp b/ui/message_center/message_center.gyp index 8fc29a6209..9db4e5a7e2 100644 --- a/ui/message_center/message_center.gyp +++ b/ui/message_center/message_center.gyp @@ -28,6 +28,8 @@ 'sources': [ 'cocoa/notification_controller.h', 'cocoa/notification_controller.mm', + 'cocoa/opaque_views.h', + 'cocoa/opaque_views.mm', 'cocoa/popup_collection.h', 'cocoa/popup_collection.mm', 'cocoa/popup_controller.h', diff --git a/ui/message_center/message_center_impl.cc b/ui/message_center/message_center_impl.cc index b56e76e710..14cbe7b967 100644 --- a/ui/message_center/message_center_impl.cc +++ b/ui/message_center/message_center_impl.cc @@ -637,15 +637,16 @@ void MessageCenterImpl::RemoveNotification(const std::string& id, if (!HasNotification(id)) return; - scoped_refptr<NotificationDelegate> delegate = - notification_list_->GetNotificationDelegate(id); - if (delegate.get()) - delegate->Close(by_user); - // In many cases |id| is a reference to an existing notification instance // but the instance can be destructed in RemoveNotification(). Hence // copies the id explicitly here. std::string copied_id(id); + + scoped_refptr<NotificationDelegate> delegate = + notification_list_->GetNotificationDelegate(copied_id); + if (delegate.get()) + delegate->Close(by_user); + notification_list_->RemoveNotification(copied_id); notification_cache_.Rebuild( notification_list_->GetVisibleNotifications(blockers_)); diff --git a/ui/native_theme/common_theme.cc b/ui/native_theme/common_theme.cc index 0e6b76bcc0..49d59c8e1d 100644 --- a/ui/native_theme/common_theme.cc +++ b/ui/native_theme/common_theme.cc @@ -32,6 +32,8 @@ const SkColor kEnabledMenuItemForegroundColor = SK_ColorBLACK; const SkColor kDisabledMenuItemForegroundColor = SkColorSetRGB(161, 161, 146); const SkColor kHoverMenuItemBackgroundColor = SkColorSetARGB(204, 255, 255, 255); +// Button: +const SkColor kButtonHoverBackgroundColor = SkColorSetRGB(0xEA, 0xEA, 0xEA); } // namespace @@ -79,6 +81,10 @@ bool CommonThemeGetSystemColor(NativeTheme::ColorId color_id, SkColor* color) { case NativeTheme::kColorId_ButtonDisabledColor: *color = kDisabledMenuItemForegroundColor; break; + // Button + case NativeTheme::kColorId_ButtonHoverBackgroundColor: + *color = kButtonHoverBackgroundColor; + break; default: return false; } diff --git a/ui/native_theme/fallback_theme.cc b/ui/native_theme/fallback_theme.cc index ffb15fd662..ab6fc27aae 100644 --- a/ui/native_theme/fallback_theme.cc +++ b/ui/native_theme/fallback_theme.cc @@ -36,6 +36,8 @@ SkColor FallbackTheme::GetSystemColor(ColorId color_id) const { static const SkColor kButtonDisabledColor = SkColorSetRGB(0x99, 0x99, 0x99); static const SkColor kButtonHighlightColor = SkColorSetRGB(0, 0, 0); static const SkColor kButtonHoverColor = kButtonEnabledColor; + static const SkColor kButtonHoverBackgroundColor = + SkColorSetRGB(0xEA, 0xEA, 0xEA); // MenuItem: static const SkColor kEnabledMenuItemForegroundColor = kButtonEnabledColor; static const SkColor kDisabledMenuItemForegroundColor = kButtonDisabledColor; @@ -135,6 +137,8 @@ SkColor FallbackTheme::GetSystemColor(ColorId color_id) const { return kButtonHighlightColor; case kColorId_ButtonHoverColor: return kButtonHoverColor; + case kColorId_ButtonHoverBackgroundColor: + return kButtonHoverBackgroundColor; // MenuItem case kColorId_EnabledMenuItemForegroundColor: diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h index 67af252d7b..aab923a933 100644 --- a/ui/native_theme/native_theme.h +++ b/ui/native_theme/native_theme.h @@ -240,6 +240,7 @@ class NATIVE_THEME_EXPORT NativeTheme { kColorId_ButtonDisabledColor, kColorId_ButtonHighlightColor, kColorId_ButtonHoverColor, + kColorId_ButtonHoverBackgroundColor, // MenuItem kColorId_EnabledMenuItemForegroundColor, kColorId_DisabledMenuItemForegroundColor, diff --git a/ui/native_theme/native_theme.target.darwin-arm.mk b/ui/native_theme/native_theme.target.darwin-arm.mk index 1882cbf93c..c15f7c8fbf 100644 --- a/ui/native_theme/native_theme.target.darwin-arm.mk +++ b/ui/native_theme/native_theme.target.darwin-arm.mk @@ -99,12 +99,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -221,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -300,7 +306,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/native_theme/native_theme.target.darwin-mips.mk b/ui/native_theme/native_theme.target.darwin-mips.mk index 377630299f..f6a88a5599 100644 --- a/ui/native_theme/native_theme.target.darwin-mips.mk +++ b/ui/native_theme/native_theme.target.darwin-mips.mk @@ -98,12 +98,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -219,12 +222,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/native_theme/native_theme.target.darwin-x86.mk b/ui/native_theme/native_theme.target.darwin-x86.mk index 44e2198c2f..d255548c6b 100644 --- a/ui/native_theme/native_theme.target.darwin-x86.mk +++ b/ui/native_theme/native_theme.target.darwin-x86.mk @@ -100,12 +100,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -221,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/native_theme/native_theme.target.darwin-x86_64.mk b/ui/native_theme/native_theme.target.darwin-x86_64.mk index f11a32e407..2151037253 100644 --- a/ui/native_theme/native_theme.target.darwin-x86_64.mk +++ b/ui/native_theme/native_theme.target.darwin-x86_64.mk @@ -100,12 +100,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -222,12 +225,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/native_theme/native_theme.target.linux-arm.mk b/ui/native_theme/native_theme.target.linux-arm.mk index 1882cbf93c..c15f7c8fbf 100644 --- a/ui/native_theme/native_theme.target.linux-arm.mk +++ b/ui/native_theme/native_theme.target.linux-arm.mk @@ -99,12 +99,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -221,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -300,7 +306,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/native_theme/native_theme.target.linux-mips.mk b/ui/native_theme/native_theme.target.linux-mips.mk index 377630299f..f6a88a5599 100644 --- a/ui/native_theme/native_theme.target.linux-mips.mk +++ b/ui/native_theme/native_theme.target.linux-mips.mk @@ -98,12 +98,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -219,12 +222,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/native_theme/native_theme.target.linux-x86.mk b/ui/native_theme/native_theme.target.linux-x86.mk index 44e2198c2f..d255548c6b 100644 --- a/ui/native_theme/native_theme.target.linux-x86.mk +++ b/ui/native_theme/native_theme.target.linux-x86.mk @@ -100,12 +100,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -221,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/native_theme/native_theme.target.linux-x86_64.mk b/ui/native_theme/native_theme.target.linux-x86_64.mk index f11a32e407..2151037253 100644 --- a/ui/native_theme/native_theme.target.linux-x86_64.mk +++ b/ui/native_theme/native_theme.target.linux-x86_64.mk @@ -100,12 +100,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -222,12 +225,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc index a09be6c30e..55c9f486a3 100644 --- a/ui/native_theme/native_theme_win.cc +++ b/ui/native_theme/native_theme_win.cc @@ -50,6 +50,7 @@ const SkColor kUnfocusedBorderColor = SkColorSetRGB(0xd9, 0xd9, 0xd9); const SkColor kButtonBackgroundColor = SkColorSetRGB(0xde, 0xde, 0xde); const SkColor kButtonHighlightColor = SkColorSetARGB(200, 255, 255, 255); const SkColor kButtonHoverColor = SkColorSetRGB(6, 45, 117); +const SkColor kButtonHoverBackgroundColor = SkColorSetRGB(0xEA, 0xEA, 0xEA); // MenuItem: const SkColor kEnabledMenuItemForegroundColor = SkColorSetRGB(6, 45, 117); const SkColor kDisabledMenuItemForegroundColor = SkColorSetRGB(161, 161, 146); @@ -532,6 +533,8 @@ SkColor NativeThemeWin::GetSystemColor(ColorId color_id) const { return kButtonHighlightColor; case kColorId_ButtonHoverColor: return kButtonHoverColor; + case kColorId_ButtonHoverBackgroundColor: + return kButtonHoverBackgroundColor; // MenuItem case kColorId_EnabledMenuItemForegroundColor: diff --git a/ui/ozone/ozone.gyp b/ui/ozone/ozone.gyp index 0dfb9c75c2..8ccb0d7272 100644 --- a/ui/ozone/ozone.gyp +++ b/ui/ozone/ozone.gyp @@ -41,10 +41,30 @@ 'ozone_platform.h', 'ozone_switches.cc', 'ozone_switches.h', + 'platform/dri/chromeos/display_mode_dri.cc', + 'platform/dri/chromeos/display_mode_dri.h', + 'platform/dri/chromeos/display_snapshot_dri.cc', + 'platform/dri/chromeos/display_snapshot_dri.h', + 'platform/dri/chromeos/native_display_delegate_dri.cc', + 'platform/dri/chromeos/native_display_delegate_dri.h', 'platform/dri/ozone_platform_dri.cc', 'platform/dri/ozone_platform_dri.h', 'platform/dri/cursor_factory_evdev_dri.cc', 'platform/dri/cursor_factory_evdev_dri.h', + 'platform/dri/dri_buffer.cc', + 'platform/dri/dri_buffer.h', + 'platform/dri/dri_surface.cc', + 'platform/dri/dri_surface.h', + 'platform/dri/dri_surface_factory.cc', + 'platform/dri/dri_surface_factory.h', + 'platform/dri/dri_util.cc', + 'platform/dri/dri_util.h', + 'platform/dri/dri_vsync_provider.cc', + 'platform/dri/dri_vsync_provider.h', + 'platform/dri/dri_wrapper.cc', + 'platform/dri/dri_wrapper.h', + 'platform/dri/hardware_display_controller.cc', + 'platform/dri/hardware_display_controller.h', 'platform/test/ozone_platform_test.cc', 'platform/test/ozone_platform_test.h', '<@(external_ozone_platform_files)', @@ -80,7 +100,11 @@ 'ozone_platforms': [ 'dri' ] - } + }, + 'dependencies': [ + '../../build/linux/system.gyp:dridrm', + '../../ui/display/display.gyp:display_util', + ], }, { # ozone_platform_dri==0 'sources/': [ ['exclude', '^platform/dri/'], diff --git a/ui/ozone/ozone_platform.cc b/ui/ozone/ozone_platform.cc index feb36baea2..e8199b2ce9 100644 --- a/ui/ozone/ozone_platform.cc +++ b/ui/ozone/ozone_platform.cc @@ -6,6 +6,9 @@ #include "base/debug/trace_event.h" #include "base/logging.h" #include "ui/base/cursor/ozone/cursor_factory_ozone.h" +#include "ui/events/ozone/event_factory_ozone.h" +#include "ui/gfx/ozone/surface_factory_ozone.h" +#include "ui/ozone/ime/input_method_context_factory_ozone.h" #include "ui/ozone/ozone_platform.h" #include "ui/ozone/ozone_platform_list.h" #include "ui/ozone/ozone_switches.h" diff --git a/ui/ozone/ozone_platform.h b/ui/ozone/ozone_platform.h index e87f422050..536ff0ed8e 100644 --- a/ui/ozone/ozone_platform.h +++ b/ui/ozone/ozone_platform.h @@ -6,14 +6,17 @@ #define UI_OZONE_OZONE_PLATFORM_H_ #include "base/memory/scoped_ptr.h" -#include "ui/events/ozone/event_factory_ozone.h" -#include "ui/gfx/ozone/surface_factory_ozone.h" -#include "ui/ozone/ime/input_method_context_factory_ozone.h" #include "ui/ozone/ozone_export.h" +namespace gfx { +class SurfaceFactoryOzone; +} + namespace ui { class CursorFactoryOzone; +class EventFactoryOzone; +class InputMethodContextFactoryOzone; class NativeDisplayDelegate; // Base class for Ozone platform implementations. diff --git a/ui/ozone/ozone_unittests.gypi b/ui/ozone/ozone_unittests.gypi new file mode 100644 index 0000000000..b9d8819393 --- /dev/null +++ b/ui/ozone/ozone_unittests.gypi @@ -0,0 +1,23 @@ +# Copyright 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'sources': [ + 'platform/dri/hardware_display_controller_unittest.cc', + 'platform/dri/dri_surface_factory_unittest.cc', + 'platform/dri/dri_surface_unittest.cc', + ], + 'conditions': [ + ['ozone_platform_dri == 1', { + 'dependencies': [ + '../build/linux/system.gyp:dridrm', + '../ui/ozone/ozone.gyp:ozone', + ], + }, { + 'sources/': [ + ['exclude', '^platform/dri/'], + ], + }], + ], +} diff --git a/ui/ozone/platform/caca/caca_surface_factory.cc b/ui/ozone/platform/caca/caca_surface_factory.cc index 13b8a8c01e..1786831cb9 100644 --- a/ui/ozone/platform/caca/caca_surface_factory.cc +++ b/ui/ozone/platform/caca/caca_surface_factory.cc @@ -23,6 +23,8 @@ class CacaSurface : public gfx::SurfaceOzoneCanvas { CacaSurface(CacaConnection* connection); virtual ~CacaSurface(); + bool Initialize(); + // gfx::SurfaceOzoneCanvas overrides: virtual skia::RefPtr<SkCanvas> GetCanvas() OVERRIDE; virtual bool ResizeCanvas(const gfx::Size& viewport_size) OVERRIDE; @@ -46,7 +48,7 @@ CacaSurface::~CacaSurface() { caca_free_dither(dither_); } -bool CacaSurface::InitializeCanvas() { +bool CacaSurface::Initialize() { SkImageInfo info = SkImageInfo::Make(connection_->bitmap_size().width(), connection_->bitmap_size().height(), kPMColor_SkColorType, @@ -140,7 +142,9 @@ scoped_ptr<gfx::SurfaceOzoneCanvas> CacaSurfaceFactory::CreateCanvasForWidget( CHECK_EQ(INITIALIZED, state_); CHECK_EQ(kDefaultWidgetHandle, widget); - return make_scoped_ptr<gfx::SurfaceOzoneCanvas>(new CacaSurface(connection_)); + scoped_ptr<CacaSurface> canvas(new CacaSurface(connection_)); + CHECK(canvas->Initialize()); + return canvas.PassAs<gfx::SurfaceOzoneCanvas>(); } } // namespace ui diff --git a/ui/ozone/platform/caca/caca_surface_factory.h b/ui/ozone/platform/caca/caca_surface_factory.h index 80fd34f7f2..c3db5fda5f 100644 --- a/ui/ozone/platform/caca/caca_surface_factory.h +++ b/ui/ozone/platform/caca/caca_surface_factory.h @@ -10,6 +10,10 @@ #include "base/memory/scoped_ptr.h" #include "ui/gfx/ozone/surface_factory_ozone.h" +namespace gfx { +class SurfaceOzone; +} + namespace ui { class CacaConnection; @@ -26,7 +30,7 @@ class CacaSurfaceFactory : public gfx::SurfaceFactoryOzone { virtual bool LoadEGLGLES2Bindings( AddGLLibraryCallback add_gl_library, SetGLGetProcAddressProcCallback set_gl_get_proc_address) OVERRIDE; - virtual scoped_ptr<gfx::SurfaceOzone> CreateSurfaceForWidget( + virtual scoped_ptr<gfx::SurfaceOzoneCanvas> CreateCanvasForWidget( gfx::AcceleratedWidget widget) OVERRIDE; private: diff --git a/ui/ozone/platform/caca/ozone_platform_caca.cc b/ui/ozone/platform/caca/ozone_platform_caca.cc index 6a35c6b75f..a5a6b02ae2 100644 --- a/ui/ozone/platform/caca/ozone_platform_caca.cc +++ b/ui/ozone/platform/caca/ozone_platform_caca.cc @@ -4,8 +4,12 @@ #include "ui/ozone/platform/caca/ozone_platform_caca.h" +#include "ui/base/cursor/ozone/cursor_factory_ozone.h" +#include "ui/ozone/ime/input_method_context_factory_ozone.h" #include "ui/ozone/ozone_platform.h" #include "ui/ozone/platform/caca/caca_connection.h" +#include "ui/ozone/platform/caca/caca_event_factory.h" +#include "ui/ozone/platform/caca/caca_surface_factory.h" #if defined(OS_CHROMEOS) #include "ui/ozone/common/chromeos/native_display_delegate_ozone.h" @@ -13,37 +17,49 @@ namespace ui { -OzonePlatformCaca::OzonePlatformCaca() - : connection_(), - surface_factory_ozone_(&connection_), - event_factory_ozone_(&connection_) {} +namespace { -OzonePlatformCaca::~OzonePlatformCaca() {} +class OzonePlatformCaca : public OzonePlatform { + public: + OzonePlatformCaca() + : surface_factory_ozone_(&connection_), + event_factory_ozone_(&connection_) {} + virtual ~OzonePlatformCaca() {} -gfx::SurfaceFactoryOzone* OzonePlatformCaca::GetSurfaceFactoryOzone() { - return &surface_factory_ozone_; -} + // OzonePlatform: + virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE { + return &surface_factory_ozone_; + } + virtual EventFactoryOzone* GetEventFactoryOzone() OVERRIDE { + return &event_factory_ozone_; + } + virtual InputMethodContextFactoryOzone* GetInputMethodContextFactoryOzone() + OVERRIDE { + return &input_method_context_factory_ozone_; + } + virtual CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE { + return &cursor_factory_ozone_; + } -ui::EventFactoryOzone* OzonePlatformCaca::GetEventFactoryOzone() { - return &event_factory_ozone_; -} +#if defined(OS_CHROMEOS) + virtual scoped_ptr<NativeDisplayDelegate> CreateNativeDisplayDelegate() + OVERRIDE { + return scoped_ptr<NativeDisplayDelegate>(new NativeDisplayDelegateOzone()); + } +#endif -ui::InputMethodContextFactoryOzone* -OzonePlatformCaca::GetInputMethodContextFactoryOzone() { - return &input_method_context_factory_ozone_; -} + private: + CacaConnection connection_; + CacaSurfaceFactory surface_factory_ozone_; + CacaEventFactory event_factory_ozone_; + // This creates a minimal input context. + InputMethodContextFactoryOzone input_method_context_factory_ozone_; + CursorFactoryOzone cursor_factory_ozone_; -ui::CursorFactoryOzone* OzonePlatformCaca::GetCursorFactoryOzone() { - return &cursor_factory_ozone_; -} + DISALLOW_COPY_AND_ASSIGN(OzonePlatformCaca); +}; -#if defined(OS_CHROMEOS) -scoped_ptr<ui::NativeDisplayDelegate> -OzonePlatformCaca::CreateNativeDisplayDelegate() { - return scoped_ptr<ui::NativeDisplayDelegate>( - new NativeDisplayDelegateOzone()); -} -#endif +} // namespace OzonePlatform* CreateOzonePlatformCaca() { return new OzonePlatformCaca; } diff --git a/ui/ozone/platform/caca/ozone_platform_caca.h b/ui/ozone/platform/caca/ozone_platform_caca.h index f25b947e2a..bf1f735208 100644 --- a/ui/ozone/platform/caca/ozone_platform_caca.h +++ b/ui/ozone/platform/caca/ozone_platform_caca.h @@ -5,45 +5,12 @@ #ifndef UI_OZONE_PLATFORM_CACA_OZONE_PLATFORM_CACA_H_ #define UI_OZONE_PLATFORM_CACA_OZONE_PLATFORM_CACA_H_ -#include "ui/base/cursor/ozone/cursor_factory_ozone.h" -#include "ui/ozone/ozone_export.h" -#include "ui/ozone/ozone_platform.h" -#include "ui/ozone/platform/caca/caca_connection.h" -#include "ui/ozone/platform/caca/caca_event_factory.h" -#include "ui/ozone/platform/caca/caca_surface_factory.h" - namespace ui { -class CacaConnection; - -class OzonePlatformCaca : public OzonePlatform { - public: - OzonePlatformCaca(); - virtual ~OzonePlatformCaca(); - - virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE; - virtual ui::EventFactoryOzone* GetEventFactoryOzone() OVERRIDE; - virtual ui::InputMethodContextFactoryOzone* - GetInputMethodContextFactoryOzone() OVERRIDE; - virtual ui::CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE; -#if defined(OS_CHROMEOS) - virtual scoped_ptr<ui::NativeDisplayDelegate> - CreateNativeDisplayDelegate() OVERRIDE; -#endif - - private: - ui::CacaConnection connection_; - ui::CacaSurfaceFactory surface_factory_ozone_; - ui::CacaEventFactory event_factory_ozone_; - // This creates a minimal input context. - ui::InputMethodContextFactoryOzone input_method_context_factory_ozone_; - ui::CursorFactoryOzone cursor_factory_ozone_; - - DISALLOW_COPY_AND_ASSIGN(OzonePlatformCaca); -}; +class OzonePlatform; // Constructor hook for use in ozone_platform_list.cc -OZONE_EXPORT OzonePlatform* CreateOzonePlatformCaca(); +OzonePlatform* CreateOzonePlatformCaca(); } // namespace ui diff --git a/ui/ozone/platform/dri/DEPS b/ui/ozone/platform/dri/DEPS new file mode 100644 index 0000000000..ee54c22bef --- /dev/null +++ b/ui/ozone/platform/dri/DEPS @@ -0,0 +1,4 @@ +include_rules = [ + "+skia/ext", + "+third_party/skia", +] diff --git a/ui/ozone/platform/dri/chromeos/DEPS b/ui/ozone/platform/dri/chromeos/DEPS new file mode 100644 index 0000000000..0ab14717d9 --- /dev/null +++ b/ui/ozone/platform/dri/chromeos/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + "+ui/display/util", +] diff --git a/ui/ozone/platform/dri/chromeos/display_mode_dri.cc b/ui/ozone/platform/dri/chromeos/display_mode_dri.cc new file mode 100644 index 0000000000..707cb91b7c --- /dev/null +++ b/ui/ozone/platform/dri/chromeos/display_mode_dri.cc @@ -0,0 +1,17 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/ozone/platform/dri/chromeos/display_mode_dri.h" + +namespace ui { + +DisplayModeDri::DisplayModeDri(const drmModeModeInfo& mode) + : DisplayMode(gfx::Size(mode.hdisplay, mode.vdisplay), + mode.flags & DRM_MODE_FLAG_INTERLACE, + mode.vrefresh), + mode_info_(mode) {} + +DisplayModeDri::~DisplayModeDri() {} + +} // namespace ui diff --git a/ui/ozone/platform/dri/chromeos/display_mode_dri.h b/ui/ozone/platform/dri/chromeos/display_mode_dri.h new file mode 100644 index 0000000000..ab50df28d7 --- /dev/null +++ b/ui/ozone/platform/dri/chromeos/display_mode_dri.h @@ -0,0 +1,33 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_MODE_DRI_H_ +#define UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_MODE_DRI_H_ + +#include <stdint.h> +#include <stdlib.h> +#include <xf86drmMode.h> + +#include "ui/display/types/chromeos/display_mode.h" + +namespace ui { + +class DisplayModeDri : public DisplayMode { + public: + DisplayModeDri(const drmModeModeInfo& mode); + virtual ~DisplayModeDri(); + + // Native details about this mode. Only used internally in the DRI + // implementation. + drmModeModeInfo mode_info() const { return mode_info_; } + + private: + drmModeModeInfo mode_info_; + + DISALLOW_COPY_AND_ASSIGN(DisplayModeDri); +}; + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_MODE_DRI_H_ diff --git a/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc b/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc new file mode 100644 index 0000000000..df9f4c65d1 --- /dev/null +++ b/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc @@ -0,0 +1,142 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/ozone/platform/dri/chromeos/display_snapshot_dri.h" + +#include <stdint.h> +#include <stdlib.h> +#include <xf86drmMode.h> + +#include "base/format_macros.h" +#include "base/logging.h" +#include "base/strings/stringprintf.h" +#include "ui/display/util/edid_parser.h" +#include "ui/ozone/platform/dri/chromeos/display_mode_dri.h" +#include "ui/ozone/platform/dri/dri_wrapper.h" + +namespace ui { + +namespace { + +DisplayConnectionType GetDisplayType(drmModeConnector* connector) { + switch (connector->connector_type) { + case DRM_MODE_CONNECTOR_VGA: + return DISPLAY_CONNECTION_TYPE_VGA; + case DRM_MODE_CONNECTOR_DVII: + case DRM_MODE_CONNECTOR_DVID: + case DRM_MODE_CONNECTOR_DVIA: + return DISPLAY_CONNECTION_TYPE_DVI; + case DRM_MODE_CONNECTOR_LVDS: + case DRM_MODE_CONNECTOR_eDP: + return DISPLAY_CONNECTION_TYPE_INTERNAL; + case DRM_MODE_CONNECTOR_DisplayPort: + return DISPLAY_CONNECTION_TYPE_DISPLAYPORT; + case DRM_MODE_CONNECTOR_HDMIA: + case DRM_MODE_CONNECTOR_HDMIB: + return DISPLAY_CONNECTION_TYPE_HDMI; + default: + return DISPLAY_CONNECTION_TYPE_UNKNOWN; + } +} + +bool SameMode(const drmModeModeInfo& lhs, const drmModeModeInfo& rhs) { + return lhs.clock == rhs.clock && + lhs.hdisplay == rhs.vdisplay && + lhs.vrefresh == rhs.vrefresh && + lhs.hsync_start == rhs.hsync_start && + lhs.hsync_end == rhs.hsync_end && + lhs.htotal == rhs.htotal && + lhs.hskew == rhs.hskew && + lhs.vsync_start == rhs.vsync_start && + lhs.vsync_end == rhs.vsync_end && + lhs.vtotal == rhs.vtotal && + lhs.vscan == rhs.vscan && + lhs.flags == rhs.flags && + strcmp(lhs.name, rhs.name) == 0; +} + +bool IsAspectPreserving(DriWrapper* drm, drmModeConnector* connector) { + drmModePropertyRes* property = drm->GetProperty(connector, "scaling mode"); + if (property) { + for (int j = 0; j < property->count_enums; ++j) { + if (property->enums[j].value == + connector->prop_values[property->prop_id] && + strcmp(property->enums[j].name, "Full aspect") == 0) { + drm->FreeProperty(property); + return true; + } + } + + drm->FreeProperty(property); + } + + return false; +} + +} // namespace + +DisplaySnapshotDri::DisplaySnapshotDri( + DriWrapper* drm, + drmModeConnector* connector, + drmModeCrtc* crtc, + uint32_t index) + : DisplaySnapshot(index, + false, + gfx::Point(crtc->x, crtc->y), + gfx::Size(connector->mmWidth, connector->mmHeight), + GetDisplayType(connector), + IsAspectPreserving(drm, connector), + false, + std::string(), + std::vector<const DisplayMode*>(), + NULL, + NULL), + connector_(connector->connector_id), + crtc_(crtc->crtc_id), + dpms_property_(drm->GetProperty(connector, "DPMS")) { + drmModePropertyBlobRes* edid_blob = drm->GetPropertyBlob(connector, "EDID"); + + if (edid_blob) { + std::vector<uint8_t> edid( + static_cast<uint8_t*>(edid_blob->data), + static_cast<uint8_t*>(edid_blob->data) + edid_blob->length); + + has_proper_display_id_ = GetDisplayIdFromEDID(edid, index, &display_id_); + ParseOutputDeviceData(edid, NULL, &display_name_); + ParseOutputOverscanFlag(edid, &overscan_flag_); + + drm->FreePropertyBlob(edid_blob); + } else { + VLOG(1) << "Failed to get EDID blob for connector " + << connector->connector_id; + } + + for (int i = 0; i < connector->count_modes; ++i) { + drmModeModeInfo& mode = connector->modes[i]; + modes_.push_back(new DisplayModeDri(mode)); + + if (crtc->mode_valid && SameMode(crtc->mode, mode)) + current_mode_ = modes_.back(); + + if (mode.type & DRM_MODE_TYPE_PREFERRED) + native_mode_ = modes_.back(); + } +} + +DisplaySnapshotDri::~DisplaySnapshotDri() { + if (dpms_property_) + drmModeFreeProperty(dpms_property_); +} + +std::string DisplaySnapshotDri::ToString() const { + return base::StringPrintf( + "[type=%d, connector=%" PRIu32 ", crtc=%" PRIu32 ", mode=%s, dim=%s]", + type_, + connector_, + crtc_, + current_mode_ ? current_mode_->ToString().c_str() : "NULL", + physical_size_.ToString().c_str()); +} + +} // namespace ui diff --git a/ui/ozone/platform/dri/chromeos/display_snapshot_dri.h b/ui/ozone/platform/dri/chromeos/display_snapshot_dri.h new file mode 100644 index 0000000000..1f69af47ed --- /dev/null +++ b/ui/ozone/platform/dri/chromeos/display_snapshot_dri.h @@ -0,0 +1,47 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_SNAPSHOT_DRI_H_ +#define UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_SNAPSHOT_DRI_H_ + +#include "ui/display/types/chromeos/display_snapshot.h" + +typedef struct _drmModeConnector drmModeConnector; +typedef struct _drmModeCrtc drmModeCrtc; +typedef struct _drmModeProperty drmModePropertyRes; + +namespace ui { + +class DriWrapper; + +class DisplaySnapshotDri : public DisplaySnapshot { + public: + DisplaySnapshotDri(DriWrapper* drm, + drmModeConnector* connector, + drmModeCrtc* crtc, + uint32_t index); + virtual ~DisplaySnapshotDri(); + + // Native properties of a display used by the DRI implementation in + // configuring this display. + uint32_t connector() const { return connector_; } + uint32_t crtc() const { return crtc_; } + drmModePropertyRes* dpms_property() const { return dpms_property_; } + + // DisplaySnapshot overrides: + virtual std::string ToString() const OVERRIDE; + + private: + uint32_t connector_; + uint32_t crtc_; + drmModePropertyRes* dpms_property_; + std::string name_; + bool overscan_flag_; + + DISALLOW_COPY_AND_ASSIGN(DisplaySnapshotDri); +}; + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_SNAPSHOT_DRI_H_ diff --git a/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.cc b/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.cc new file mode 100644 index 0000000000..cb73a96444 --- /dev/null +++ b/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.cc @@ -0,0 +1,157 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h" + +#include "ui/ozone/platform/dri/chromeos/display_mode_dri.h" +#include "ui/ozone/platform/dri/chromeos/display_snapshot_dri.h" +#include "ui/ozone/platform/dri/dri_surface_factory.h" +#include "ui/ozone/platform/dri/dri_util.h" +#include "ui/ozone/platform/dri/dri_wrapper.h" + +namespace ui { + +namespace { +const size_t kMaxDisplayCount = 2; +} // namespace + +NativeDisplayDelegateDri::NativeDisplayDelegateDri( + DriSurfaceFactory* surface_factory) + : surface_factory_(surface_factory) {} + +NativeDisplayDelegateDri::~NativeDisplayDelegateDri() {} + +void NativeDisplayDelegateDri::Initialize() { + gfx::SurfaceFactoryOzone::HardwareState state = + surface_factory_->InitializeHardware(); + + CHECK_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, state) + << "Failed to initialize hardware"; +} + +void NativeDisplayDelegateDri::GrabServer() {} + +void NativeDisplayDelegateDri::UngrabServer() {} + +void NativeDisplayDelegateDri::SyncWithServer() {} + +void NativeDisplayDelegateDri::SetBackgroundColor(uint32_t color_argb) { + NOTIMPLEMENTED(); +} + +void NativeDisplayDelegateDri::ForceDPMSOn() { + for (size_t i = 0; i < cached_displays_.size(); ++i) { + DisplaySnapshotDri* dri_output = cached_displays_[i]; + if (dri_output->dpms_property()) + surface_factory_->drm()->SetProperty( + dri_output->connector(), + dri_output->dpms_property()->prop_id, + DRM_MODE_DPMS_ON); + } +} + +std::vector<DisplaySnapshot*> NativeDisplayDelegateDri::GetDisplays() { + cached_displays_.clear(); + cached_modes_.clear(); + + drmModeRes* resources = drmModeGetResources( + surface_factory_->drm()->get_fd()); + DCHECK(resources) << "Failed to get DRM resources"; + ScopedVector<HardwareDisplayControllerInfo> displays = + GetAvailableDisplayControllerInfos( + surface_factory_->drm()->get_fd(), + resources); + for (size_t i = 0; + i < displays.size() && cached_displays_.size() < kMaxDisplayCount; ++i) { + DisplaySnapshotDri* display = new DisplaySnapshotDri( + surface_factory_->drm(), + displays[i]->connector(), + displays[i]->crtc(), + i); + cached_displays_.push_back(display); + // Modes can be shared between different displays, so we need to keep track + // of them independently for cleanup. + cached_modes_.insert(cached_modes_.end(), + display->modes().begin(), + display->modes().end()); + } + + drmModeFreeResources(resources); + + std::vector<DisplaySnapshot*> generic_displays(cached_displays_.begin(), + cached_displays_.end()); + return generic_displays; +} + +void NativeDisplayDelegateDri::AddMode(const DisplaySnapshot& output, + const DisplayMode* mode) {} + +bool NativeDisplayDelegateDri::Configure(const DisplaySnapshot& output, + const DisplayMode* mode, + const gfx::Point& origin) { + const DisplaySnapshotDri& dri_output = + static_cast<const DisplaySnapshotDri&>(output); + + VLOG(1) << "DRM configuring: crtc=" << dri_output.crtc() + << " connector=" << dri_output.connector() + << " origin=" << origin.ToString() + << " size=" << mode->size().ToString(); + + if (mode) { + if (!surface_factory_->CreateHardwareDisplayController( + dri_output.connector(), + dri_output.crtc(), + static_cast<const DisplayModeDri*>(mode)->mode_info())) { + VLOG(1) << "Failed to configure: crtc=" << dri_output.crtc() + << " connector=" << dri_output.connector(); + return false; + } + } else { + if (!surface_factory_->DisableHardwareDisplayController( + dri_output.crtc())) { + VLOG(1) << "Failed to disable crtc=" << dri_output.crtc(); + return false; + } + } + + return true; +} + +void NativeDisplayDelegateDri::CreateFrameBuffer(const gfx::Size& size) {} + +bool NativeDisplayDelegateDri::GetHDCPState(const DisplaySnapshot& output, + HDCPState* state) { + NOTIMPLEMENTED(); + return false; +} + +bool NativeDisplayDelegateDri::SetHDCPState(const DisplaySnapshot& output, + HDCPState state) { + NOTIMPLEMENTED(); + return false; +} + +std::vector<ui::ColorCalibrationProfile> +NativeDisplayDelegateDri::GetAvailableColorCalibrationProfiles( + const ui::DisplaySnapshot& output) { + NOTIMPLEMENTED(); + return std::vector<ui::ColorCalibrationProfile>(); +} + +bool NativeDisplayDelegateDri::SetColorCalibrationProfile( + const ui::DisplaySnapshot& output, + ui::ColorCalibrationProfile new_profile) { + NOTIMPLEMENTED(); + return false; +} + +void NativeDisplayDelegateDri::AddObserver(NativeDisplayObserver* observer) { + observers_.AddObserver(observer); +} + +void NativeDisplayDelegateDri::RemoveObserver(NativeDisplayObserver* observer) { + observers_.RemoveObserver(observer); +} + +} // namespace ui diff --git a/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h b/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h new file mode 100644 index 0000000000..db5b5eb2b7 --- /dev/null +++ b/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h @@ -0,0 +1,60 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_OZONE_PLATFORM_DRI_CHROMEOS_NATIVE_DISPLAY_DELEGATE_DRI_H_ +#define UI_OZONE_PLATFORM_DRI_CHROMEOS_NATIVE_DISPLAY_DELEGATE_DRI_H_ + +#include "base/memory/scoped_vector.h" +#include "base/observer_list.h" +#include "ui/display/types/chromeos/native_display_delegate.h" + +namespace ui { + +class DisplaySnapshotDri; +class DriSurfaceFactory; + +class NativeDisplayDelegateDri : public NativeDisplayDelegate { + public: + NativeDisplayDelegateDri(DriSurfaceFactory* surface_factory); + virtual ~NativeDisplayDelegateDri(); + + // NativeDisplayDelegate overrides: + virtual void Initialize() OVERRIDE; + virtual void GrabServer() OVERRIDE; + virtual void UngrabServer() OVERRIDE; + virtual void SyncWithServer() OVERRIDE; + virtual void SetBackgroundColor(uint32_t color_argb) OVERRIDE; + virtual void ForceDPMSOn() OVERRIDE; + virtual std::vector<DisplaySnapshot*> GetDisplays() OVERRIDE; + virtual void AddMode(const DisplaySnapshot& output, + const DisplayMode* mode) OVERRIDE; + virtual bool Configure(const DisplaySnapshot& output, + const DisplayMode* mode, + const gfx::Point& origin) OVERRIDE; + virtual void CreateFrameBuffer(const gfx::Size& size) OVERRIDE; + virtual bool GetHDCPState(const DisplaySnapshot& output, + HDCPState* state) OVERRIDE; + virtual bool SetHDCPState(const DisplaySnapshot& output, + HDCPState state) OVERRIDE; + virtual std::vector<ui::ColorCalibrationProfile> + GetAvailableColorCalibrationProfiles( + const ui::DisplaySnapshot& output) OVERRIDE; + virtual bool SetColorCalibrationProfile( + const ui::DisplaySnapshot& output, + ui::ColorCalibrationProfile new_profile) OVERRIDE; + virtual void AddObserver(NativeDisplayObserver* observer) OVERRIDE; + virtual void RemoveObserver(NativeDisplayObserver* observer) OVERRIDE; + + private: + DriSurfaceFactory* surface_factory_; // Not owned. + ScopedVector<const DisplayMode> cached_modes_; + ScopedVector<DisplaySnapshotDri> cached_displays_; + ObserverList<NativeDisplayObserver> observers_; + + DISALLOW_COPY_AND_ASSIGN(NativeDisplayDelegateDri); +}; + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_DRI_CHROMEOS_NATIVE_DISPLAY_DELEGATE_DRI_H_ diff --git a/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc b/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc index fd073caf03..46b26db8aa 100644 --- a/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc +++ b/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc @@ -5,13 +5,15 @@ #include "ui/ozone/platform/dri/cursor_factory_evdev_dri.h" #include "ui/gfx/geometry/point_conversions.h" -#include "ui/gfx/ozone/dri/dri_surface_factory.h" +#include "ui/ozone/platform/dri/dri_surface_factory.h" namespace ui { -CursorFactoryEvdevDri::CursorFactoryEvdevDri(gfx::DriSurfaceFactory* dri) +CursorFactoryEvdevDri::CursorFactoryEvdevDri(DriSurfaceFactory* dri) : dri_(dri) { - cursor_window_ = dri_->GetAcceleratedWidget(); + // TODO(dnicoara) Assume the first widget since at this point there are no + // widgets initialized. + cursor_window_ = DriSurfaceFactory::kDefaultWidgetHandle; cursor_bounds_ = gfx::RectF(0, 0, 2560, 1700); // TODO(spang): Argh! cursor_location_ = gfx::PointF(cursor_bounds_.width() / 2, cursor_bounds_.height() / 2); @@ -19,7 +21,7 @@ CursorFactoryEvdevDri::CursorFactoryEvdevDri(gfx::DriSurfaceFactory* dri) // The DRI cursor is invisible unless explicitly set. Therefore, set the // pointer cursor on initialization. // TODO(spang): Move this to DRI window initialization. - SetCursor(dri->GetAcceleratedWidget(), GetDefaultCursor(kCursorPointer)); + SetCursor(cursor_window_, GetDefaultCursor(kCursorPointer)); } CursorFactoryEvdevDri::~CursorFactoryEvdevDri() {} diff --git a/ui/ozone/platform/dri/cursor_factory_evdev_dri.h b/ui/ozone/platform/dri/cursor_factory_evdev_dri.h index b7a50dbbad..b1a1a7d12c 100644 --- a/ui/ozone/platform/dri/cursor_factory_evdev_dri.h +++ b/ui/ozone/platform/dri/cursor_factory_evdev_dri.h @@ -12,7 +12,7 @@ #include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/native_widget_types.h" -namespace gfx { +namespace ui { class DriSurfaceFactory; } @@ -21,7 +21,7 @@ namespace ui { class CursorFactoryEvdevDri : public BitmapCursorFactoryOzone, public CursorDelegateEvdev { public: - CursorFactoryEvdevDri(gfx::DriSurfaceFactory* dri); + CursorFactoryEvdevDri(DriSurfaceFactory* dri); virtual ~CursorFactoryEvdevDri(); // BitmapCursorFactoryOzone: @@ -41,7 +41,7 @@ class CursorFactoryEvdevDri : public BitmapCursorFactoryOzone, gfx::Point bitmap_location(); // The DRI implementation for setting the hardware cursor. - gfx::DriSurfaceFactory* dri_; + DriSurfaceFactory* dri_; // The current cursor bitmap. scoped_refptr<BitmapCursorOzone> cursor_; diff --git a/ui/gfx/ozone/dri/dri_buffer.cc b/ui/ozone/platform/dri/dri_buffer.cc index ce487a4c7c..11b40038ef 100644 --- a/ui/gfx/ozone/dri/dri_buffer.cc +++ b/ui/ozone/platform/dri/dri_buffer.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/gfx/ozone/dri/dri_buffer.h" +#include "ui/ozone/platform/dri/dri_buffer.h" #include <errno.h> #include <sys/mman.h> @@ -11,9 +11,9 @@ #include "base/logging.h" #include "third_party/skia/include/core/SkCanvas.h" -#include "ui/gfx/ozone/dri/dri_wrapper.h" +#include "ui/ozone/platform/dri/dri_wrapper.h" -namespace gfx { +namespace ui { namespace { @@ -121,4 +121,4 @@ uint8_t DriBuffer::GetColorDepth() const { } } -} // namespace gfx +} // namespace ui diff --git a/ui/gfx/ozone/dri/dri_buffer.h b/ui/ozone/platform/dri/dri_buffer.h index ccf6b8874e..4624cadde5 100644 --- a/ui/gfx/ozone/dri/dri_buffer.h +++ b/ui/ozone/platform/dri/dri_buffer.h @@ -2,24 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_GFX_OZONE_DRI_DRI_BUFFER_H_ -#define UI_GFX_OZONE_DRI_DRI_BUFFER_H_ +#ifndef UI_OZONE_PLATFORM_DRI_DRI_BUFFER_H_ +#define UI_OZONE_PLATFORM_DRI_DRI_BUFFER_H_ #include "base/macros.h" #include "skia/ext/refptr.h" #include "third_party/skia/include/core/SkSurface.h" -#include "ui/gfx/gfx_export.h" +#include "ui/ozone/ozone_export.h" class SkCanvas; -namespace gfx { +namespace ui { class DriWrapper; // Wrapper for a DRM allocated buffer. Keeps track of the native properties of // the buffer and wraps the pixel memory into a SkSurface which can be used to // draw into using Skia. -class GFX_EXPORT DriBuffer { +class OZONE_EXPORT DriBuffer { public: DriBuffer(DriWrapper* dri); virtual ~DriBuffer(); @@ -59,6 +59,6 @@ class GFX_EXPORT DriBuffer { DISALLOW_COPY_AND_ASSIGN(DriBuffer); }; -} // namespace gfx +} // namespace ui -#endif // UI_GFX_OZONE_DRI_DRI_BUFFER_H_ +#endif // UI_OZONE_PLATFORM_DRI_DRI_BUFFER_H_ diff --git a/ui/gfx/ozone/dri/dri_surface.cc b/ui/ozone/platform/dri/dri_surface.cc index d6568f5c47..77852b2655 100644 --- a/ui/gfx/ozone/dri/dri_surface.cc +++ b/ui/ozone/platform/dri/dri_surface.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/gfx/ozone/dri/dri_surface.h" +#include "ui/ozone/platform/dri/dri_surface.h" #include <errno.h> #include <sys/mman.h> @@ -12,11 +12,11 @@ #include "base/logging.h" #include "third_party/skia/include/core/SkCanvas.h" #include "ui/gfx/geometry/rect.h" -#include "ui/gfx/ozone/dri/dri_buffer.h" -#include "ui/gfx/ozone/dri/dri_wrapper.h" #include "ui/gfx/skia_util.h" +#include "ui/ozone/platform/dri/dri_buffer.h" +#include "ui/ozone/platform/dri/dri_wrapper.h" -namespace gfx { +namespace ui { namespace { @@ -91,7 +91,7 @@ void DriSurface::SwapBuffers() { SkIRect device_damage; frontbuffer()->canvas()->getClipDeviceBounds(&device_damage); - CopyRect(backbuffer(), frontbuffer(), SkIRectToRect(device_damage)); + CopyRect(backbuffer(), frontbuffer(), gfx::SkIRectToRect(device_damage)); } SkCanvas* DriSurface::GetDrawableForWidget() { @@ -101,4 +101,4 @@ SkCanvas* DriSurface::GetDrawableForWidget() { DriBuffer* DriSurface::CreateBuffer() { return new DriBuffer(dri_); } -} // namespace gfx +} // namespace ui diff --git a/ui/gfx/ozone/dri/dri_surface.h b/ui/ozone/platform/dri/dri_surface.h index 62d4832ab2..a85c858b00 100644 --- a/ui/gfx/ozone/dri/dri_surface.h +++ b/ui/ozone/platform/dri/dri_surface.h @@ -1,19 +1,19 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_GFX_OZONE_DRI_DRI_SURFACE_H_ -#define UI_GFX_OZONE_DRI_DRI_SURFACE_H_ +#ifndef UI_OZONE_PLATFORM_DRI_DRI_SURFACE_H_ +#define UI_OZONE_PLATFORM_DRI_DRI_SURFACE_H_ #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "ui/gfx/geometry/size.h" -#include "ui/gfx/gfx_export.h" #include "ui/gfx/skia_util.h" +#include "ui/ozone/ozone_export.h" class SkCanvas; -namespace gfx { +namespace ui { class DriBuffer; class DriWrapper; @@ -117,7 +117,7 @@ class DriWrapper; // to the backbuffer. // // At this point we're back to step 1 and can start a new draw iteration. -class GFX_EXPORT DriSurface { +class OZONE_EXPORT DriSurface { public: DriSurface(DriWrapper* dri, const gfx::Size& size); @@ -168,6 +168,6 @@ class GFX_EXPORT DriSurface { DISALLOW_COPY_AND_ASSIGN(DriSurface); }; -} // namespace gfx +} // namespace ui -#endif // UI_GFX_OZONE_DRI_DRI_SURFACE_H_ +#endif // UI_OZONE_PLATFORM_DRI_DRI_SURFACE_H_ diff --git a/ui/gfx/ozone/dri/dri_surface_factory.cc b/ui/ozone/platform/dri/dri_surface_factory.cc index 51725c3cc6..1a14d41f77 100644 --- a/ui/gfx/ozone/dri/dri_surface_factory.cc +++ b/ui/ozone/platform/dri/dri_surface_factory.cc @@ -1,31 +1,30 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/gfx/ozone/dri/dri_surface_factory.h" +#include "ui/ozone/platform/dri/dri_surface_factory.h" #include <drm.h> #include <errno.h> #include <xf86drm.h> +#include "base/debug/trace_event.h" #include "base/message_loop/message_loop.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkDevice.h" #include "ui/gfx/native_widget_types.h" -#include "ui/gfx/ozone/dri/dri_surface.h" -#include "ui/gfx/ozone/dri/dri_vsync_provider.h" -#include "ui/gfx/ozone/dri/dri_wrapper.h" -#include "ui/gfx/ozone/dri/hardware_display_controller.h" #include "ui/gfx/ozone/surface_ozone_canvas.h" +#include "ui/ozone/platform/dri/dri_surface.h" +#include "ui/ozone/platform/dri/dri_util.h" +#include "ui/ozone/platform/dri/dri_vsync_provider.h" +#include "ui/ozone/platform/dri/dri_wrapper.h" +#include "ui/ozone/platform/dri/hardware_display_controller.h" -namespace gfx { +namespace ui { namespace { const char kDefaultGraphicsCardPath[] = "/dev/dri/card0"; -const char kDPMSProperty[] = "DPMS"; - -const gfx::AcceleratedWidget kDefaultWidgetHandle = 1; // TODO(dnicoara) Read the cursor plane size from the hardware. const gfx::Size kCursorSize(64, 64); @@ -45,60 +44,11 @@ void HandlePageFlipEvent(int fd, unsigned int seconds, unsigned int useconds, void* controller) { + TRACE_EVENT0("dri", "HandlePageFlipEvent"); static_cast<HardwareDisplayController*>(controller) ->OnPageFlipEvent(frame, seconds, useconds); } -uint32_t GetDriProperty(int fd, drmModeConnector* connector, const char* name) { - for (int i = 0; i < connector->count_props; ++i) { - drmModePropertyPtr property = drmModeGetProperty(fd, connector->props[i]); - if (!property) - continue; - - if (strcmp(property->name, name) == 0) { - uint32_t id = property->prop_id; - drmModeFreeProperty(property); - return id; - } - - drmModeFreeProperty(property); - } - return 0; -} - -uint32_t GetCrtc(int fd, drmModeRes* resources, drmModeConnector* connector) { - // If the connector already has an encoder try to re-use. - if (connector->encoder_id) { - drmModeEncoder* encoder = drmModeGetEncoder(fd, connector->encoder_id); - if (encoder) { - if (encoder->crtc_id) { - uint32_t crtc = encoder->crtc_id; - drmModeFreeEncoder(encoder); - return crtc; - } - drmModeFreeEncoder(encoder); - } - } - - // Try to find an encoder for the connector. - for (int i = 0; i < connector->count_encoders; ++i) { - drmModeEncoder* encoder = drmModeGetEncoder(fd, connector->encoders[i]); - if (!encoder) - continue; - - for (int j = 0; j < resources->count_crtcs; ++j) { - // Check if the encoder is compatible with this CRTC - if (!(encoder->possible_crtcs & (1 << j))) - continue; - - drmModeFreeEncoder(encoder); - return resources->crtcs[j]; - } - } - - return 0; -} - void UpdateCursorImage(DriSurface* cursor, const SkBitmap& image) { SkRect damage; image.getBounds(&damage); @@ -122,13 +72,13 @@ void UpdateCursorImage(DriSurface* cursor, const SkBitmap& image) { // the compositor merely owns this proxy object. // // TODO(spang): Should the compositor own any bits of the DriSurface? -class DriSurfaceAdapter : public SurfaceOzoneCanvas { +class DriSurfaceAdapter : public gfx::SurfaceOzoneCanvas { public: DriSurfaceAdapter(gfx::AcceleratedWidget w, DriSurfaceFactory* dri) : widget_(w), dri_(dri) {} virtual ~DriSurfaceAdapter() {} - // SurfaceOzoneCanvas overrides: + // gfx::SurfaceOzoneCanvas overrides: virtual skia::RefPtr<SkCanvas> GetCanvas() OVERRIDE { return skia::SharePtr(dri_->GetCanvasForWidget(widget_)); } @@ -150,10 +100,14 @@ class DriSurfaceAdapter : public SurfaceOzoneCanvas { } // namespace +// static +const gfx::AcceleratedWidget DriSurfaceFactory::kDefaultWidgetHandle = 1; + DriSurfaceFactory::DriSurfaceFactory() : drm_(), state_(UNINITIALIZED), - controller_() { + controllers_(), + allocated_widgets_(0) { } DriSurfaceFactory::~DriSurfaceFactory() { @@ -161,9 +115,10 @@ DriSurfaceFactory::~DriSurfaceFactory() { ShutdownHardware(); } -SurfaceFactoryOzone::HardwareState +gfx::SurfaceFactoryOzone::HardwareState DriSurfaceFactory::InitializeHardware() { - CHECK(state_ == UNINITIALIZED); + if (state_ != UNINITIALIZED) + return state_; // TODO(dnicoara): Short-cut right now. What we want is to look at all the // graphics devices available and select the primary one. @@ -189,7 +144,7 @@ DriSurfaceFactory::InitializeHardware() { void DriSurfaceFactory::ShutdownHardware() { CHECK(state_ == INITIALIZED); - controller_.reset(); + controllers_.clear(); drm_.reset(); state_ = UNINITIALIZED; @@ -198,57 +153,26 @@ void DriSurfaceFactory::ShutdownHardware() { gfx::AcceleratedWidget DriSurfaceFactory::GetAcceleratedWidget() { CHECK(state_ != FAILED); - // TODO(dnicoara) When there's more information on which display we want, - // then we can return the widget associated with the display. - // For now just assume we have 1 display device and return it. - if (!controller_.get()) - controller_.reset(new HardwareDisplayController()); - - // TODO(dnicoara) We only have 1 display for now, so only 1 AcceleratedWidget. - // When we'll support multiple displays this needs to be changed to return a - // different handle for every display. - return kDefaultWidgetHandle; + // We're not using 0 since other code assumes that a 0 AcceleratedWidget is an + // invalid widget. + return ++allocated_widgets_; } -scoped_ptr<SurfaceOzoneCanvas> DriSurfaceFactory::CreateCanvasForWidget( +scoped_ptr<gfx::SurfaceOzoneCanvas> DriSurfaceFactory::CreateCanvasForWidget( gfx::AcceleratedWidget w) { CHECK(state_ == INITIALIZED); - // TODO(dnicoara) Once we can handle multiple displays this needs to be - // changed. - CHECK(w == kDefaultWidgetHandle); - - CHECK(controller_->get_state() == - HardwareDisplayController::UNASSOCIATED); - - // Until now the controller is just a stub. Initializing it will link it to a - // hardware display. - if (!InitializeControllerForPrimaryDisplay(drm_.get(), controller_.get())) { - LOG(ERROR) << "Failed to initialize controller"; - return scoped_ptr<SurfaceOzoneCanvas>(); - } - - // Create a surface suitable for the current controller. - scoped_ptr<DriSurface> surface(CreateSurface( - Size(controller_->get_mode().hdisplay, - controller_->get_mode().vdisplay))); - - if (!surface->Initialize()) { - LOG(ERROR) << "Failed to initialize surface"; - return scoped_ptr<SurfaceOzoneCanvas>(); - } - - // Bind the surface to the controller. This will register the backing buffers - // with the hardware CRTC such that we can show the buffers. The controller - // takes ownership of the surface. - if (!controller_->BindSurfaceToController(surface.Pass())) { - LOG(ERROR) << "Failed to bind surface to controller"; - return scoped_ptr<SurfaceOzoneCanvas>(); + // When running with content_shell, a default Display gets created. But we + // can't just create a surface without a backing native display. This forces + // initialization of a display. + if (controllers_.size() == 0 && !InitializePrimaryDisplay()) { + LOG(ERROR) << "Failed forced initialization of primary display"; + return scoped_ptr<gfx::SurfaceOzoneCanvas>(); } // Initial cursor set. - ResetCursor(); + ResetCursor(w); - return make_scoped_ptr<SurfaceOzoneCanvas>(new DriSurfaceAdapter(w, this)); + return scoped_ptr<gfx::SurfaceOzoneCanvas>(new DriSurfaceAdapter(w, this)); } bool DriSurfaceFactory::LoadEGLGLES2Bindings( @@ -258,16 +182,14 @@ bool DriSurfaceFactory::LoadEGLGLES2Bindings( } bool DriSurfaceFactory::SchedulePageFlip(gfx::AcceleratedWidget w) { + TRACE_EVENT0("dri", "DriSurfaceFactory::SchedulePageFlip"); + CHECK(state_ == INITIALIZED); // TODO(dnicoara) Change this CHECK once we're running with the threaded // compositor. CHECK(base::MessageLoopForUI::IsCurrent()); - // TODO(dnicoara) Once we can handle multiple displays this needs to be - // changed. - CHECK(w == kDefaultWidgetHandle); - - if (!controller_->SchedulePageFlip()) + if (!GetControllerForWidget(w)->SchedulePageFlip()) return false; // Only wait for the page flip event to finish if it was properly scheduled. @@ -292,14 +214,44 @@ bool DriSurfaceFactory::SchedulePageFlip(gfx::AcceleratedWidget w) { SkCanvas* DriSurfaceFactory::GetCanvasForWidget( gfx::AcceleratedWidget w) { CHECK(state_ == INITIALIZED); - CHECK_EQ(kDefaultWidgetHandle, w); - return controller_->get_surface()->GetDrawableForWidget(); + return GetControllerForWidget(w)->get_surface()->GetDrawableForWidget(); } scoped_ptr<gfx::VSyncProvider> DriSurfaceFactory::CreateVSyncProvider( gfx::AcceleratedWidget w) { CHECK(state_ == INITIALIZED); - return scoped_ptr<VSyncProvider>(new DriVSyncProvider(controller_.get())); + return scoped_ptr<gfx::VSyncProvider>(new DriVSyncProvider( + GetControllerForWidget(w))); +} + +bool DriSurfaceFactory::CreateHardwareDisplayController( + uint32_t connector, uint32_t crtc, const drmModeModeInfo& mode) { + scoped_ptr<HardwareDisplayController> controller( + new HardwareDisplayController(drm_.get(), connector, crtc, mode)); + + // Create a surface suitable for the current controller. + scoped_ptr<DriSurface> surface(CreateSurface( + gfx::Size(mode.hdisplay, mode.vdisplay))); + + if (!surface->Initialize()) { + LOG(ERROR) << "Failed to initialize surface"; + return false; + } + + // Bind the surface to the controller. This will register the backing buffers + // with the hardware CRTC such that we can show the buffers and performs the + // initial modeset. The controller takes ownership of the surface. + if (!controller->BindSurfaceToController(surface.Pass())) { + LOG(ERROR) << "Failed to bind surface to controller"; + return false; + } + + controllers_.push_back(controller.release()); + return true; +} + +bool DriSurfaceFactory::DisableHardwareDisplayController(uint32_t crtc) { + return drm_->DisableCrtc(crtc); } void DriSurfaceFactory::SetHardwareCursor(gfx::AcceleratedWidget window, @@ -311,7 +263,7 @@ void DriSurfaceFactory::SetHardwareCursor(gfx::AcceleratedWidget window, if (state_ != INITIALIZED) return; - ResetCursor(); + ResetCursor(window); } void DriSurfaceFactory::MoveHardwareCursor(gfx::AcceleratedWidget window, @@ -321,7 +273,7 @@ void DriSurfaceFactory::MoveHardwareCursor(gfx::AcceleratedWidget window, if (state_ != INITIALIZED) return; - controller_->MoveCursor(location); + GetControllerForWidget(window)->MoveCursor(location); } void DriSurfaceFactory::UnsetHardwareCursor(gfx::AcceleratedWidget window) { @@ -330,7 +282,7 @@ void DriSurfaceFactory::UnsetHardwareCursor(gfx::AcceleratedWidget window) { if (state_ != INITIALIZED) return; - ResetCursor(); + ResetCursor(window); } //////////////////////////////////////////////////////////////////////////////// @@ -344,56 +296,33 @@ DriWrapper* DriSurfaceFactory::CreateWrapper() { return new DriWrapper(kDefaultGraphicsCardPath); } -bool DriSurfaceFactory::InitializeControllerForPrimaryDisplay( - DriWrapper* drm, - HardwareDisplayController* controller) { - CHECK(state_ == SurfaceFactoryOzone::INITIALIZED); - - drmModeRes* resources = drmModeGetResources(drm->get_fd()); +bool DriSurfaceFactory::InitializePrimaryDisplay() { + drmModeRes* resources = drmModeGetResources(drm_->get_fd()); + DCHECK(resources) << "Failed to get DRM resources"; + ScopedVector<HardwareDisplayControllerInfo> displays = + GetAvailableDisplayControllerInfos(drm_->get_fd(), resources); + drmModeFreeResources(resources); - // Search for an active connector. - for (int i = 0; i < resources->count_connectors; ++i) { - drmModeConnector* connector = drmModeGetConnector( - drm->get_fd(), - resources->connectors[i]); - - if (!connector) - continue; - - if (connector->connection != DRM_MODE_CONNECTED || - connector->count_modes == 0) { - drmModeFreeConnector(connector); - continue; - } - - uint32_t crtc = GetCrtc(drm->get_fd(), resources, connector); - - if (!crtc) - continue; - - uint32_t dpms_property_id = GetDriProperty(drm->get_fd(), - connector, - kDPMSProperty); - - // TODO(dnicoara) Select one mode for now. In the future we may need to - // save all the modes and allow the user to choose a specific mode. Or - // even some fullscreen applications may need to change the mode. - controller->SetControllerInfo( - drm, - connector->connector_id, - crtc, - dpms_property_id, - connector->modes[0]); - - drmModeFreeConnector(connector); - - return true; - } + if (displays.size() == 0) + return false; - return false; + drmModePropertyRes* dpms = drm_->GetProperty(displays[0]->connector(), + "DPMS"); + if (dpms) + drm_->SetProperty(displays[0]->connector()->connector_id, + dpms->prop_id, + DRM_MODE_DPMS_ON); + + CreateHardwareDisplayController( + displays[0]->connector()->connector_id, + displays[0]->crtc()->crtc_id, + displays[0]->connector()->modes[0]); + return true; } void DriSurfaceFactory::WaitForPageFlipEvent(int fd) { + TRACE_EVENT0("dri", "WaitForPageFlipEvent"); + drmEventContext drm_event; drm_event.version = DRM_EVENT_CONTEXT_VERSION; drm_event.page_flip_handler = HandlePageFlipEvent; @@ -403,19 +332,26 @@ void DriSurfaceFactory::WaitForPageFlipEvent(int fd) { drmHandleEvent(fd, &drm_event); } -void DriSurfaceFactory::ResetCursor() { +void DriSurfaceFactory::ResetCursor(gfx::AcceleratedWidget w) { if (!cursor_bitmap_.empty()) { // Draw new cursor into backbuffer. UpdateCursorImage(cursor_surface_.get(), cursor_bitmap_); // Reset location & buffer. - controller_->MoveCursor(cursor_location_); - controller_->SetCursor(cursor_surface_.get()); + GetControllerForWidget(w)->MoveCursor(cursor_location_); + GetControllerForWidget(w)->SetCursor(cursor_surface_.get()); } else { // No cursor set. - controller_->UnsetCursor(); + GetControllerForWidget(w)->UnsetCursor(); } } +HardwareDisplayController* DriSurfaceFactory::GetControllerForWidget( + gfx::AcceleratedWidget w) { + CHECK_GE(w, 1); + CHECK_LE(static_cast<size_t>(w), controllers_.size()); + + return controllers_[w - 1]; +} -} // namespace gfx +} // namespace ui diff --git a/ui/gfx/ozone/dri/dri_surface_factory.h b/ui/ozone/platform/dri/dri_surface_factory.h index 993dc0744e..2a358711d8 100644 --- a/ui/gfx/ozone/dri/dri_surface_factory.h +++ b/ui/ozone/platform/dri/dri_surface_factory.h @@ -1,35 +1,45 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_GFX_OZONE_DRI_DRI_SURFACE_FACTORY_H_ -#define UI_GFX_OZONE_DRI_DRI_SURFACE_FACTORY_H_ +#ifndef UI_OZONE_PLATFORM_DRI_DRI_SURFACE_FACTORY_H_ +#define UI_OZONE_PLATFORM_DRI_DRI_SURFACE_FACTORY_H_ #include "base/memory/scoped_ptr.h" +#include "base/memory/scoped_vector.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/ozone/surface_factory_ozone.h" +#include "ui/ozone/ozone_export.h" + +typedef struct _drmModeModeInfo drmModeModeInfo; namespace gfx { +class SurfaceOzoneCanvas; +} + +namespace ui { class DriSurface; class DriWrapper; class HardwareDisplayController; -class SurfaceOzoneCanvas; // SurfaceFactoryOzone implementation on top of DRM/KMS using dumb buffers. // This implementation is used in conjunction with the software rendering // path. -class GFX_EXPORT DriSurfaceFactory : public SurfaceFactoryOzone { +class OZONE_EXPORT DriSurfaceFactory : public gfx::SurfaceFactoryOzone { public: + static const gfx::AcceleratedWidget kDefaultWidgetHandle; + DriSurfaceFactory(); virtual ~DriSurfaceFactory(); + // SurfaceFactoryOzone overrides: virtual HardwareState InitializeHardware() OVERRIDE; virtual void ShutdownHardware() OVERRIDE; virtual gfx::AcceleratedWidget GetAcceleratedWidget() OVERRIDE; - virtual scoped_ptr<SurfaceOzoneCanvas> CreateCanvasForWidget( + virtual scoped_ptr<gfx::SurfaceOzoneCanvas> CreateCanvasForWidget( gfx::AcceleratedWidget w) OVERRIDE; virtual bool LoadEGLGLES2Bindings( @@ -43,22 +53,35 @@ class GFX_EXPORT DriSurfaceFactory : public SurfaceFactoryOzone { virtual scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider( gfx::AcceleratedWidget w); - void SetHardwareCursor(AcceleratedWidget window, + void SetHardwareCursor(gfx::AcceleratedWidget window, const SkBitmap& image, const gfx::Point& location); - void MoveHardwareCursor(AcceleratedWidget window, const gfx::Point& location); + void MoveHardwareCursor(gfx::AcceleratedWidget window, + const gfx::Point& location); - void UnsetHardwareCursor(AcceleratedWidget window); + void UnsetHardwareCursor(gfx::AcceleratedWidget window); + + // Called to initialize a new display. The display is then added to + // |controllers_|. When GetAcceleratedWidget() is called it will get the next + // available display from |controllers_|. + bool CreateHardwareDisplayController(uint32_t connector, + uint32_t crtc, + const drmModeModeInfo& mode); + + bool DisableHardwareDisplayController(uint32_t crtc); + + DriWrapper* drm() const { return drm_.get(); } private: virtual DriSurface* CreateSurface(const gfx::Size& size); virtual DriWrapper* CreateWrapper(); - virtual bool InitializeControllerForPrimaryDisplay( - DriWrapper* drm, - HardwareDisplayController* controller); + // On non CrOS builds there is no display configurator to look-up available + // displays and initialize the HDCs. In such cases this is called internally + // to initialize a display. + virtual bool InitializePrimaryDisplay(); // Blocks until a DRM event is read. // TODO(dnicoara) Remove once we can safely move DRM event processing in the @@ -67,14 +90,19 @@ class GFX_EXPORT DriSurfaceFactory : public SurfaceFactoryOzone { virtual void WaitForPageFlipEvent(int fd); // Draw the last set cursor & update the cursor plane. - void ResetCursor(); + void ResetCursor(gfx::AcceleratedWidget w); + + // Returns the controller in |controllers_| associated with |w|. + HardwareDisplayController* GetControllerForWidget( + gfx::AcceleratedWidget w); scoped_ptr<DriWrapper> drm_; HardwareState state_; - // Active output. - scoped_ptr<HardwareDisplayController> controller_; + // Active outputs. + ScopedVector<HardwareDisplayController> controllers_; + int allocated_widgets_; scoped_ptr<DriSurface> cursor_surface_; @@ -84,6 +112,6 @@ class GFX_EXPORT DriSurfaceFactory : public SurfaceFactoryOzone { DISALLOW_COPY_AND_ASSIGN(DriSurfaceFactory); }; -} // namespace gfx +} // namespace ui -#endif // UI_GFX_OZONE_DRI_DRI_SURFACE_FACTORY_H_ +#endif // UI_OZONE_PLATFORM_DRI_DRI_SURFACE_FACTORY_H_ diff --git a/ui/gfx/ozone/dri/dri_surface_factory_unittest.cc b/ui/ozone/platform/dri/dri_surface_factory_unittest.cc index 446fdb970b..ff1c088076 100644 --- a/ui/gfx/ozone/dri/dri_surface_factory_unittest.cc +++ b/ui/ozone/platform/dri/dri_surface_factory_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,13 +9,13 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColor.h" -#include "ui/gfx/ozone/dri/dri_buffer.h" -#include "ui/gfx/ozone/dri/dri_surface.h" -#include "ui/gfx/ozone/dri/dri_surface_factory.h" -#include "ui/gfx/ozone/dri/dri_wrapper.h" -#include "ui/gfx/ozone/dri/hardware_display_controller.h" #include "ui/gfx/ozone/surface_factory_ozone.h" #include "ui/gfx/ozone/surface_ozone_canvas.h" +#include "ui/ozone/platform/dri/dri_buffer.h" +#include "ui/ozone/platform/dri/dri_surface.h" +#include "ui/ozone/platform/dri/dri_surface_factory.h" +#include "ui/ozone/platform/dri/dri_wrapper.h" +#include "ui/ozone/platform/dri/hardware_display_controller.h" namespace { @@ -31,16 +31,14 @@ const uint32_t kConnectorId = 1; // Mock CRTC ID. const uint32_t kCrtcId = 1; -const uint32_t kDPMSPropertyId = 1; - const gfx::AcceleratedWidget kDefaultWidgetHandle = 1; // The real DriWrapper makes actual DRM calls which we can't use in unit tests. -class MockDriWrapper : public gfx::DriWrapper { +class MockDriWrapper : public ui::DriWrapper { public: MockDriWrapper(int fd) : DriWrapper(""), - add_framebuffer_expectation_(true), - page_flip_expectation_(true) { + add_framebuffer_expectation_(true), + page_flip_expectation_(true) { fd_ = fd; } @@ -79,14 +77,25 @@ class MockDriWrapper : public gfx::DriWrapper { virtual bool PageFlip(uint32_t crtc_id, uint32_t framebuffer, void* data) OVERRIDE { - static_cast<gfx::HardwareDisplayController*>(data)->get_surface() + static_cast<ui::HardwareDisplayController*>(data)->get_surface() ->SwapBuffers(); return page_flip_expectation_; } - virtual bool ConnectorSetProperty(uint32_t connector_id, - uint32_t property_id, - uint64_t value) OVERRIDE { return true; } + virtual bool SetProperty(uint32_t connector_id, + uint32_t property_id, + uint64_t value) OVERRIDE { return true; } + + virtual void FreeProperty(drmModePropertyRes* prop) OVERRIDE { delete prop; } + + virtual drmModePropertyBlobRes* GetPropertyBlob(drmModeConnector* connector, + const char* name) OVERRIDE { + return new drmModePropertyBlobRes; + } + + virtual void FreePropertyBlob(drmModePropertyBlobRes* blob) OVERRIDE { + delete blob; + } virtual bool SetCursor(uint32_t crtc_id, uint32_t handle, @@ -112,9 +121,9 @@ class MockDriWrapper : public gfx::DriWrapper { DISALLOW_COPY_AND_ASSIGN(MockDriWrapper); }; -class MockDriBuffer : public gfx::DriBuffer { +class MockDriBuffer : public ui::DriBuffer { public: - MockDriBuffer(gfx::DriWrapper* dri) : DriBuffer(dri) {} + MockDriBuffer(ui::DriWrapper* dri) : DriBuffer(dri) {} virtual ~MockDriBuffer() { surface_.clear(); } @@ -130,23 +139,23 @@ class MockDriBuffer : public gfx::DriBuffer { DISALLOW_COPY_AND_ASSIGN(MockDriBuffer); }; -class MockDriSurface : public gfx::DriSurface { +class MockDriSurface : public ui::DriSurface { public: - MockDriSurface(gfx::DriWrapper* dri, const gfx::Size& size) + MockDriSurface(ui::DriWrapper* dri, const gfx::Size& size) : DriSurface(dri, size), dri_(dri) {} virtual ~MockDriSurface() {} const std::vector<MockDriBuffer*>& bitmaps() const { return bitmaps_; } private: - virtual gfx::DriBuffer* CreateBuffer() OVERRIDE { + virtual ui::DriBuffer* CreateBuffer() OVERRIDE { MockDriBuffer* bitmap = new MockDriBuffer(dri_); bitmaps_.push_back(bitmap); return bitmap; } - gfx::DriWrapper* dri_; // Not owned. + ui::DriWrapper* dri_; // Not owned. std::vector<MockDriBuffer*> bitmaps_; // Not owned. DISALLOW_COPY_AND_ASSIGN(MockDriSurface); @@ -156,8 +165,7 @@ class MockDriSurface : public gfx::DriSurface { // backend to allocate and display our buffers. Thus, we replace these // resources with stubs. For DRM calls, we simply use stubs that do nothing and // for buffers we use the default SkBitmap allocator. -class MockDriSurfaceFactory - : public gfx::DriSurfaceFactory { +class MockDriSurfaceFactory : public ui::DriSurfaceFactory { public: MockDriSurfaceFactory() : DriSurfaceFactory(), @@ -181,13 +189,13 @@ class MockDriSurfaceFactory const std::vector<MockDriSurface*>& get_surfaces() const { return surfaces_; } private: - virtual gfx::DriSurface* CreateSurface(const gfx::Size& size) OVERRIDE { + virtual ui::DriSurface* CreateSurface(const gfx::Size& size) OVERRIDE { MockDriSurface* surface = new MockDriSurface(mock_drm_, size); surfaces_.push_back(surface); return surface; } - virtual gfx::DriWrapper* CreateWrapper() OVERRIDE { + virtual ui::DriWrapper* CreateWrapper() OVERRIDE { if (drm_wrapper_expectation_) mock_drm_ = new MockDriWrapper(kFd); else @@ -198,16 +206,10 @@ class MockDriSurfaceFactory // Normally we'd use DRM to figure out the controller configuration. But we // can't use DRM in unit tests, so we just create a fake configuration. - virtual bool InitializeControllerForPrimaryDisplay( - gfx::DriWrapper* drm, - gfx::HardwareDisplayController* controller) OVERRIDE { + virtual bool InitializePrimaryDisplay() OVERRIDE { if (initialize_controller_expectation_) { - controller->SetControllerInfo(drm, - kConnectorId, - kCrtcId, - kDPMSPropertyId, - kDefaultMode); - return true; + return CreateHardwareDisplayController( + kConnectorId, kCrtcId, kDefaultMode); } else { return false; } diff --git a/ui/gfx/ozone/dri/dri_surface_unittest.cc b/ui/ozone/platform/dri/dri_surface_unittest.cc index 4ddadb5c4b..ed7393a81a 100644 --- a/ui/gfx/ozone/dri/dri_surface_unittest.cc +++ b/ui/ozone/platform/dri/dri_surface_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -6,9 +6,9 @@ #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkDevice.h" -#include "ui/gfx/ozone/dri/dri_buffer.h" -#include "ui/gfx/ozone/dri/dri_surface.h" -#include "ui/gfx/ozone/dri/hardware_display_controller.h" +#include "ui/ozone/platform/dri/dri_buffer.h" +#include "ui/ozone/platform/dri/dri_surface.h" +#include "ui/ozone/platform/dri/hardware_display_controller.h" namespace { @@ -25,10 +25,7 @@ const uint32_t kConnectorId = 1; // Mock CRTC ID. const uint32_t kCrtcId = 1; -// Mock DPMS property ID. -const uint32_t kDPMSPropertyId = 1; - -class MockDriWrapper : public gfx::DriWrapper { +class MockDriWrapper : public ui::DriWrapper { public: MockDriWrapper() : DriWrapper(""), id_(1) { fd_ = kFd; } virtual ~MockDriWrapper() { fd_ = -1; } @@ -57,18 +54,26 @@ class MockDriWrapper : public gfx::DriWrapper { void* data) OVERRIDE { return true; } - virtual bool ConnectorSetProperty(uint32_t connector_id, - uint32_t property_id, - uint64_t value) OVERRIDE { return true; } + virtual bool SetProperty(uint32_t connector_id, + uint32_t property_id, + uint64_t value) OVERRIDE { return true; } + virtual void FreeProperty(drmModePropertyRes* prop) OVERRIDE { delete prop; } + virtual drmModePropertyBlobRes* GetPropertyBlob(drmModeConnector* connector, + const char* name) OVERRIDE { + return new drmModePropertyBlobRes; + } + virtual void FreePropertyBlob(drmModePropertyBlobRes* blob) OVERRIDE { + delete blob; + } private: int id_; DISALLOW_COPY_AND_ASSIGN(MockDriWrapper); }; -class MockDriBuffer : public gfx::DriBuffer { +class MockDriBuffer : public ui::DriBuffer { public: - MockDriBuffer(gfx::DriWrapper* dri, bool initialize_expectation) + MockDriBuffer(ui::DriWrapper* dri, bool initialize_expectation) : DriBuffer(dri), initialize_expectation_(initialize_expectation) {} virtual ~MockDriBuffer() { surface_.clear(); @@ -90,9 +95,9 @@ class MockDriBuffer : public gfx::DriBuffer { DISALLOW_COPY_AND_ASSIGN(MockDriBuffer); }; -class MockDriSurface : public gfx::DriSurface { +class MockDriSurface : public ui::DriSurface { public: - MockDriSurface(gfx::DriWrapper* dri, const gfx::Size& size) + MockDriSurface(ui::DriWrapper* dri, const gfx::Size& size) : DriSurface(dri, size), dri_(dri), initialize_expectation_(true) {} virtual ~MockDriSurface() {} @@ -101,11 +106,11 @@ class MockDriSurface : public gfx::DriSurface { } private: - virtual gfx::DriBuffer* CreateBuffer() OVERRIDE { + virtual ui::DriBuffer* CreateBuffer() OVERRIDE { return new MockDriBuffer(dri_, initialize_expectation_); } - gfx::DriWrapper* dri_; + ui::DriWrapper* dri_; bool initialize_expectation_; DISALLOW_COPY_AND_ASSIGN(MockDriSurface); @@ -122,7 +127,7 @@ class DriSurfaceTest : public testing::Test { protected: scoped_ptr<MockDriWrapper> drm_; - scoped_ptr<gfx::HardwareDisplayController> controller_; + scoped_ptr<ui::HardwareDisplayController> controller_; scoped_ptr<MockDriSurface> surface_; private: @@ -131,9 +136,8 @@ class DriSurfaceTest : public testing::Test { void DriSurfaceTest::SetUp() { drm_.reset(new MockDriWrapper()); - controller_.reset(new gfx::HardwareDisplayController()); - controller_->SetControllerInfo( - drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode); + controller_.reset(new ui::HardwareDisplayController( + drm_.get(), kConnectorId, kCrtcId, kDefaultMode)); surface_.reset(new MockDriSurface(drm_.get(), gfx::Size(kDefaultMode.hdisplay, @@ -157,8 +161,7 @@ TEST_F(DriSurfaceTest, SuccessfulInitialization) { TEST_F(DriSurfaceTest, CheckFBIDOnSwap) { EXPECT_TRUE(surface_->Initialize()); - controller_->BindSurfaceToController( - surface_.PassAs<gfx::DriSurface>()); + controller_->BindSurfaceToController(surface_.PassAs<ui::DriSurface>()); // Check that the framebuffer ID is correct. EXPECT_EQ(2u, controller_->get_surface()->GetFramebufferId()); diff --git a/ui/ozone/platform/dri/dri_util.cc b/ui/ozone/platform/dri/dri_util.cc new file mode 100644 index 0000000000..cb7cdf7f15 --- /dev/null +++ b/ui/ozone/platform/dri/dri_util.cc @@ -0,0 +1,108 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/ozone/platform/dri/dri_util.h" + +#include <stdint.h> +#include <stdlib.h> +#include <xf86drmMode.h> + +namespace ui { + +namespace { + +bool IsCrtcInUse(uint32_t crtc, + const ScopedVector<HardwareDisplayControllerInfo>& displays) { + for (size_t i = 0; i < displays.size(); ++i) { + if (crtc == displays[i]->crtc()->crtc_id) + return true; + } + + return false; +} + +uint32_t GetCrtc(int fd, + drmModeConnector* connector, + drmModeRes* resources, + const ScopedVector<HardwareDisplayControllerInfo>& displays) { + // If the connector already has an encoder try to re-use. + if (connector->encoder_id) { + drmModeEncoder* encoder = drmModeGetEncoder(fd, connector->encoder_id); + if (encoder) { + if (encoder->crtc_id && !IsCrtcInUse(encoder->crtc_id, displays)) { + uint32_t crtc = encoder->crtc_id; + drmModeFreeEncoder(encoder); + return crtc; + } + drmModeFreeEncoder(encoder); + } + } + + // Try to find an encoder for the connector. + for (int i = 0; i < connector->count_encoders; ++i) { + drmModeEncoder* encoder = drmModeGetEncoder(fd, connector->encoders[i]); + if (!encoder) + continue; + + for (int j = 0; j < resources->count_crtcs; ++j) { + // Check if the encoder is compatible with this CRTC + if (!(encoder->possible_crtcs & (1 << j)) || + IsCrtcInUse(resources->crtcs[j], displays)) { + continue; + } + + drmModeFreeEncoder(encoder); + return resources->crtcs[j]; + } + + drmModeFreeEncoder(encoder); + } + + return 0; +} + +} // namespace + +HardwareDisplayControllerInfo::HardwareDisplayControllerInfo( + drmModeConnector* connector, + drmModeCrtc* crtc) + : connector_(connector), + crtc_(crtc) {} + +HardwareDisplayControllerInfo::~HardwareDisplayControllerInfo() { + drmModeFreeConnector(connector_); + drmModeFreeCrtc(crtc_); +} + +ScopedVector<HardwareDisplayControllerInfo> +GetAvailableDisplayControllerInfos(int fd, drmModeRes* resources) { + ScopedVector<HardwareDisplayControllerInfo> displays; + + for (int i = 0; i < resources->count_connectors; ++i) { + drmModeConnector* connector = drmModeGetConnector( + fd, resources->connectors[i]); + + if (!connector) + continue; + + if (connector->connection != DRM_MODE_CONNECTED || + connector->count_modes == 0) { + drmModeFreeConnector(connector); + continue; + } + + uint32_t crtc_id = GetCrtc(fd, connector, resources, displays); + if (!crtc_id) { + drmModeFreeConnector(connector); + continue; + } + + drmModeCrtc* crtc = drmModeGetCrtc(fd, crtc_id); + displays.push_back(new HardwareDisplayControllerInfo(connector, crtc)); + } + + return displays.Pass(); +} + +} // namespace ui diff --git a/ui/ozone/platform/dri/dri_util.h b/ui/ozone/platform/dri/dri_util.h new file mode 100644 index 0000000000..f2d72b4aeb --- /dev/null +++ b/ui/ozone/platform/dri/dri_util.h @@ -0,0 +1,41 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_OZONE_PLATFORM_DRI_DRI_UTIL_H_ +#define UI_OZONE_PLATFORM_DRI_DRI_UTIL_H_ + +#include "base/macros.h" +#include "base/memory/scoped_vector.h" + +typedef struct _drmModeConnector drmModeConnector; +typedef struct _drmModeCrtc drmModeCrtc; +typedef struct _drmModeRes drmModeRes; + +namespace ui { + +// Representation of the information required to initialize and configure a +// native display. +class HardwareDisplayControllerInfo { + public: + HardwareDisplayControllerInfo(drmModeConnector* connector, drmModeCrtc* crtc); + ~HardwareDisplayControllerInfo(); + + drmModeConnector* connector() const { return connector_; } + drmModeCrtc* crtc() const { return crtc_; } + + private: + drmModeConnector* connector_; + drmModeCrtc* crtc_; + + DISALLOW_COPY_AND_ASSIGN(HardwareDisplayControllerInfo); +}; + +// Looks-up and parses the native display configurations returning all available +// displays. +ScopedVector<HardwareDisplayControllerInfo> +GetAvailableDisplayControllerInfos(int fd, drmModeRes* resources); + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_DRI_DRI_UTIL_H_ diff --git a/ui/gfx/ozone/dri/dri_vsync_provider.cc b/ui/ozone/platform/dri/dri_vsync_provider.cc index b5717e686f..9c617629c6 100644 --- a/ui/gfx/ozone/dri/dri_vsync_provider.cc +++ b/ui/ozone/platform/dri/dri_vsync_provider.cc @@ -1,13 +1,13 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/gfx/ozone/dri/dri_vsync_provider.h" +#include "ui/ozone/platform/dri/dri_vsync_provider.h" #include "base/time/time.h" -#include "ui/gfx/ozone/dri/hardware_display_controller.h" +#include "ui/ozone/platform/dri/hardware_display_controller.h" -namespace gfx { +namespace ui { DriVSyncProvider::DriVSyncProvider(HardwareDisplayController* controller) : controller_(controller) {} @@ -29,4 +29,4 @@ void DriVSyncProvider::GetVSyncParameters(const UpdateVSyncCallback& callback) { callback.Run(timebase, interval); } -} // namespace gfx +} // namespace ui diff --git a/ui/gfx/ozone/dri/dri_vsync_provider.h b/ui/ozone/platform/dri/dri_vsync_provider.h index b6cb6047eb..f031a8edce 100644 --- a/ui/gfx/ozone/dri/dri_vsync_provider.h +++ b/ui/ozone/platform/dri/dri_vsync_provider.h @@ -1,17 +1,17 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_GFX_OZONE_IMPL_DRI_VSYNC_PROVIDER_H_ -#define UI_GFX_OZONE_IMPL_DRI_VSYNC_PROVIDER_H_ +#ifndef UI_OZONE_PLATFORM_IMPL_DRI_VSYNC_PROVIDER_H_ +#define UI_OZONE_PLATFORM_IMPL_DRI_VSYNC_PROVIDER_H_ #include "ui/gfx/vsync_provider.h" -namespace gfx { +namespace ui { class HardwareDisplayController; -class DriVSyncProvider : public VSyncProvider { +class DriVSyncProvider : public gfx::VSyncProvider { public: DriVSyncProvider(HardwareDisplayController* controller); virtual ~DriVSyncProvider(); @@ -24,6 +24,6 @@ class DriVSyncProvider : public VSyncProvider { DISALLOW_COPY_AND_ASSIGN(DriVSyncProvider); }; -} // namespace gfx +} // namespace ui -#endif // UI_GFX_OZONE_IMPL_DRI_VSYNC_PROVIDER_H_ +#endif // UI_OZONE_PLATFORM_IMPL_DRI_VSYNC_PROVIDER_H_ diff --git a/ui/gfx/ozone/dri/dri_wrapper.cc b/ui/ozone/platform/dri/dri_wrapper.cc index 7eec1a7222..38524de426 100644 --- a/ui/gfx/ozone/dri/dri_wrapper.cc +++ b/ui/ozone/platform/dri/dri_wrapper.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/gfx/ozone/dri/dri_wrapper.h" +#include "ui/ozone/platform/dri/dri_wrapper.h" #include <fcntl.h> #include <unistd.h> @@ -10,7 +10,7 @@ #include "base/logging.h" -namespace gfx { +namespace ui { DriWrapper::DriWrapper(const char* device_path) { fd_ = open(device_path, O_RDWR | O_CLOEXEC); @@ -31,9 +31,9 @@ void DriWrapper::FreeCrtc(drmModeCrtc* crtc) { } bool DriWrapper::SetCrtc(uint32_t crtc_id, - uint32_t framebuffer, - uint32_t* connectors, - drmModeModeInfo* mode) { + uint32_t framebuffer, + uint32_t* connectors, + drmModeModeInfo* mode) { CHECK(fd_ >= 0); return !drmModeSetCrtc(fd_, crtc_id, framebuffer, 0, 0, connectors, 1, mode); } @@ -50,6 +50,11 @@ bool DriWrapper::SetCrtc(drmModeCrtc* crtc, uint32_t* connectors) { &crtc->mode); } +bool DriWrapper::DisableCrtc(uint32_t crtc_id) { + CHECK(fd_ >= 0); + return !drmModeSetCrtc(fd_, crtc_id, 0, 0, 0, NULL, 0, NULL); +} + bool DriWrapper::AddFramebuffer(const drmModeModeInfo& mode, uint8_t depth, uint8_t bpp, @@ -83,13 +88,59 @@ bool DriWrapper::PageFlip(uint32_t crtc_id, data); } -bool DriWrapper::ConnectorSetProperty(uint32_t connector_id, - uint32_t property_id, - uint64_t value) { +drmModePropertyRes* DriWrapper::GetProperty(drmModeConnector* connector, + const char* name) { + for (int i = 0; i < connector->count_props; ++i) { + drmModePropertyRes* property = drmModeGetProperty(fd_, connector->props[i]); + if (!property) + continue; + + if (strcmp(property->name, name) == 0) + return property; + + drmModeFreeProperty(property); + } + + return NULL; +} + +bool DriWrapper::SetProperty(uint32_t connector_id, + uint32_t property_id, + uint64_t value) { CHECK(fd_ >= 0); return !drmModeConnectorSetProperty(fd_, connector_id, property_id, value); } +void DriWrapper::FreeProperty(drmModePropertyRes* prop) { + drmModeFreeProperty(prop); +} + +drmModePropertyBlobRes* DriWrapper::GetPropertyBlob(drmModeConnector* connector, + const char* name) { + CHECK(fd_ >= 0); + for (int i = 0; i < connector->count_props; ++i) { + drmModePropertyRes* property = drmModeGetProperty(fd_, connector->props[i]); + if (!property) + continue; + + if (strcmp(property->name, name) == 0 && + property->flags & DRM_MODE_PROP_BLOB) { + drmModePropertyBlobRes* blob = + drmModeGetPropertyBlob(fd_, connector->prop_values[i]); + drmModeFreeProperty(property); + return blob; + } + + drmModeFreeProperty(property); + } + + return NULL; +} + +void DriWrapper::FreePropertyBlob(drmModePropertyBlobRes* blob) { + drmModeFreePropertyBlob(blob); +} + bool DriWrapper::SetCursor(uint32_t crtc_id, uint32_t handle, uint32_t width, @@ -103,4 +154,4 @@ bool DriWrapper::MoveCursor(uint32_t crtc_id, int x, int y) { return !drmModeMoveCursor(fd_, crtc_id, x, y); } -} // namespace gfx +} // namespace ui diff --git a/ui/gfx/ozone/dri/dri_wrapper.h b/ui/ozone/platform/dri/dri_wrapper.h index f81eb214b7..a14489d324 100644 --- a/ui/gfx/ozone/dri/dri_wrapper.h +++ b/ui/ozone/platform/dri/dri_wrapper.h @@ -1,24 +1,27 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_GFX_OZONE_DRI_DRI_WRAPPER_H_ -#define UI_GFX_OZONE_DRI_DRI_WRAPPER_H_ +#ifndef UI_OZONE_PLATFORM_DRI_DRI_WRAPPER_H_ +#define UI_OZONE_PLATFORM_DRI_DRI_WRAPPER_H_ #include <stdint.h> #include "base/basictypes.h" -#include "ui/gfx/gfx_export.h" +#include "ui/ozone/ozone_export.h" +typedef struct _drmModeConnector drmModeConnector; typedef struct _drmModeCrtc drmModeCrtc; typedef struct _drmModeModeInfo drmModeModeInfo; +typedef struct _drmModeProperty drmModePropertyRes; +typedef struct _drmModePropertyBlob drmModePropertyBlobRes; -namespace gfx { +namespace ui { // Wraps DRM calls into a nice interface. Used to provide different // implementations of the DRM calls. For the actual implementation the DRM API // would be called. In unit tests this interface would be stubbed. -class GFX_EXPORT DriWrapper { +class OZONE_EXPORT DriWrapper { public: DriWrapper(const char* device_path); virtual ~DriWrapper(); @@ -45,6 +48,8 @@ class GFX_EXPORT DriWrapper { // its original configuration. virtual bool SetCrtc(drmModeCrtc* crtc, uint32_t* connectors); + virtual bool DisableCrtc(uint32_t crtc_id); + // Register a buffer with the CRTC. On successful registration, the CRTC will // assign a framebuffer ID to |framebuffer|. virtual bool AddFramebuffer(const drmModeModeInfo& mode, @@ -64,11 +69,32 @@ class GFX_EXPORT DriWrapper { // will receive when processing the pageflip event. virtual bool PageFlip(uint32_t crtc_id, uint32_t framebuffer, void* data); + // Returns the property with name |name| associated with |connector|. Returns + // NULL if property not found. If the returned value is valid, it must be + // released using FreeProperty(). + virtual drmModePropertyRes* GetProperty(drmModeConnector* connector, + const char* name); + // Sets the value of property with ID |property_id| to |value|. The property // is applied to the connector with ID |connector_id|. - virtual bool ConnectorSetProperty(uint32_t connector_id, - uint32_t property_id, - uint64_t value); + virtual bool SetProperty(uint32_t connector_id, + uint32_t property_id, + uint64_t value); + + // Frees |prop| and any resources it allocated when it was created. |prop| + // must be a valid object. + virtual void FreeProperty(drmModePropertyRes* prop); + + // Return a binary blob associated with |connector|. The binary blob is + // associated with the property with name |name|. Return NULL if the property + // could not be found or if the property does not have a binary blob. If valid + // the returned object must be freed using FreePropertyBlob(). + virtual drmModePropertyBlobRes* GetPropertyBlob(drmModeConnector* connector, + const char* name); + + // Frees |blob| and any resources allocated when it was created. |blob| must + // be a valid object. + virtual void FreePropertyBlob(drmModePropertyBlobRes* blob); // Set the cursor to be displayed in CRTC |crtc_id|. (width, height) is the // cursor size pointed by |handle|. @@ -92,6 +118,6 @@ class GFX_EXPORT DriWrapper { DISALLOW_COPY_AND_ASSIGN(DriWrapper); }; -} // namespace gfx +} // namespace ui -#endif // UI_GFX_OZONE_DRI_DRI_WRAPPER_H_ +#endif // UI_OZONE_PLATFORM_DRI_DRI_WRAPPER_H_ diff --git a/ui/gfx/ozone/dri/hardware_display_controller.cc b/ui/ozone/platform/dri/hardware_display_controller.cc index e676bef50e..ae9c41065e 100644 --- a/ui/gfx/ozone/dri/hardware_display_controller.cc +++ b/ui/ozone/platform/dri/hardware_display_controller.cc @@ -1,61 +1,40 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/gfx/ozone/dri/hardware_display_controller.h" +#include "ui/ozone/platform/dri/hardware_display_controller.h" #include <errno.h> #include <string.h> #include "base/basictypes.h" +#include "base/debug/trace_event.h" #include "base/logging.h" #include "base/time/time.h" #include "third_party/skia/include/core/SkCanvas.h" #include "ui/gfx/geometry/point.h" -#include "ui/gfx/ozone/dri/dri_buffer.h" -#include "ui/gfx/ozone/dri/dri_surface.h" -#include "ui/gfx/ozone/dri/dri_wrapper.h" - -namespace gfx { - -HardwareDisplayController::HardwareDisplayController() - : drm_(NULL), - connector_id_(0), - crtc_id_(0), - mode_(), - saved_crtc_(NULL), - state_(UNASSOCIATED), - surface_(), - time_of_last_flip_(0) {} +#include "ui/ozone/platform/dri/dri_buffer.h" +#include "ui/ozone/platform/dri/dri_surface.h" +#include "ui/ozone/platform/dri/dri_wrapper.h" + +namespace ui { -void HardwareDisplayController::SetControllerInfo( +HardwareDisplayController::HardwareDisplayController( DriWrapper* drm, uint32_t connector_id, uint32_t crtc_id, - uint32_t dpms_property_id, - drmModeModeInfo mode) { - drm_ = drm; - connector_id_ = connector_id; - crtc_id_ = crtc_id; - dpms_property_id_ = dpms_property_id; - mode_ = mode; - saved_crtc_ = drm_->GetCrtc(crtc_id_); - state_ = UNINITIALIZED; -} + drmModeModeInfo mode) + : drm_(drm), + connector_id_(connector_id), + crtc_id_(crtc_id), + mode_(mode), + surface_(), + time_of_last_flip_(0) {} HardwareDisplayController::~HardwareDisplayController() { - if (state_ == UNASSOCIATED) - return; - // Reset the cursor. UnsetCursor(); - if (saved_crtc_) { - if (!drm_->SetCrtc(saved_crtc_, &connector_id_)) - DLOG(ERROR) << "Failed to restore CRTC state: " << strerror(errno); - drm_->FreeCrtc(saved_crtc_); - } - if (surface_.get()) { // Unregister the buffers. for (size_t i = 0; i < arraysize(surface_->bitmaps_); ++i) { @@ -68,8 +47,7 @@ HardwareDisplayController::~HardwareDisplayController() { bool HardwareDisplayController::BindSurfaceToController( scoped_ptr<DriSurface> surface) { - CHECK(state_ == UNINITIALIZED); - + CHECK(surface); // Register the buffers. for (size_t i = 0; i < arraysize(surface->bitmaps_); ++i) { uint32_t fb_id; @@ -81,43 +59,31 @@ HardwareDisplayController::BindSurfaceToController( surface->bitmaps_[i]->handle(), &fb_id)) { DLOG(ERROR) << "Failed to register framebuffer: " << strerror(errno); - state_ = FAILED; return false; } surface->bitmaps_[i]->set_framebuffer(fb_id); } + if (!drm_->SetCrtc(crtc_id_, + surface->GetFramebufferId(), + &connector_id_, + &mode_)) { + LOG(ERROR) << "Failed to modeset: crtc=" << crtc_id_ << " connector=" + << connector_id_ << " framebuffer_id=" + << surface->GetFramebufferId(); + return false; + } + surface_.reset(surface.release()); - state_ = SURFACE_INITIALIZED; return true; } bool HardwareDisplayController::SchedulePageFlip() { - CHECK(state_ == SURFACE_INITIALIZED || state_ == INITIALIZED); - - if (state_ == SURFACE_INITIALIZED) { - // Perform the initial modeset. - if (!drm_->SetCrtc(crtc_id_, - surface_->GetFramebufferId(), - &connector_id_, - &mode_)) { - DLOG(ERROR) << "Cannot set CRTC: " << strerror(errno); - state_ = FAILED; - return false; - } else { - state_ = INITIALIZED; - } - - if (dpms_property_id_) - drm_->ConnectorSetProperty(connector_id_, - dpms_property_id_, - DRM_MODE_DPMS_ON); - } + CHECK(surface_); if (!drm_->PageFlip(crtc_id_, surface_->GetFramebufferId(), this)) { - state_ = FAILED; LOG(ERROR) << "Cannot page flip: " << strerror(errno); return false; } @@ -136,7 +102,6 @@ void HardwareDisplayController::OnPageFlipEvent(unsigned int frame, } bool HardwareDisplayController::SetCursor(DriSurface* surface) { - CHECK(state_ != UNASSOCIATED); bool ret = drm_->SetCursor(crtc_id_, surface->GetHandle(), surface->size().width(), @@ -146,13 +111,11 @@ bool HardwareDisplayController::SetCursor(DriSurface* surface) { } bool HardwareDisplayController::UnsetCursor() { - CHECK(state_ != UNASSOCIATED); return drm_->SetCursor(crtc_id_, 0, 0, 0); } bool HardwareDisplayController::MoveCursor(const gfx::Point& location) { - CHECK(state_ != UNASSOCIATED); return drm_->MoveCursor(crtc_id_, location.x(), location.y()); } -} // namespace gfx +} // namespace ui diff --git a/ui/gfx/ozone/dri/hardware_display_controller.h b/ui/ozone/platform/dri/hardware_display_controller.h index 46861a1e42..af7dd866f9 100644 --- a/ui/gfx/ozone/dri/hardware_display_controller.h +++ b/ui/ozone/platform/dri/hardware_display_controller.h @@ -1,9 +1,9 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_GFX_OZONE_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ -#define UI_GFX_OZONE_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ +#ifndef UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ +#define UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ #include <stddef.h> #include <stdint.h> @@ -12,13 +12,16 @@ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" -#include "ui/gfx/gfx_export.h" -#include "ui/gfx/ozone/dri/dri_wrapper.h" +#include "ui/ozone/ozone_export.h" +#include "ui/ozone/platform/dri/dri_wrapper.h" namespace gfx { +class Point; +} + +namespace ui { class DriSurface; -class Point; // The HDCOz will handle modesettings and scannout operations for hardware // devices. @@ -77,44 +80,15 @@ class Point; // // TODO(dnicoara) Need to have a way to detect events (such as monitor // connected or disconnected). -class GFX_EXPORT HardwareDisplayController { +class OZONE_EXPORT HardwareDisplayController { public: - // Controller states. The state transitions will happen from top to bottom. - enum State { - // When we allocate a HDCO as a stub. At this point there is no connector - // and CRTC associated with this device. - UNASSOCIATED, - - // When |SetControllerInfo| is called and the HDCO has the information of - // the hardware it will control. At this point it knows everything it needs - // to control the hardware but doesn't have a surface. - UNINITIALIZED, - - // A surface is associated with the HDCO. This means that the controller can - // potentially display the backing surface to the display. Though the - // surface framebuffer still needs to be registered with the CRTC. - SURFACE_INITIALIZED, - - // The CRTC now knows about the surface attributes. - INITIALIZED, - - // Error state if any of the initialization steps fail. - FAILED, - }; - - HardwareDisplayController(); + HardwareDisplayController(DriWrapper* drm, + uint32_t connector_id, + uint32_t crtc_id, + drmModeModeInfo mode); ~HardwareDisplayController(); - // Set the hardware configuration for this HDCO. Once this is set, the HDCO is - // responsible for keeping track of the connector and CRTC and cleaning up - // when it is destroyed. - void SetControllerInfo(DriWrapper* drm, - uint32_t connector_id, - uint32_t crtc_id, - uint32_t dpms_property_id, - drmModeModeInfo mode); - // Associate the HDCO with a surface implementation and initialize it. bool BindSurfaceToController(scoped_ptr<DriSurface> surface); @@ -154,8 +128,6 @@ class GFX_EXPORT HardwareDisplayController { // Moves the hardware cursor to |location|. bool MoveCursor(const gfx::Point& location); - State get_state() const { return state_; }; - int get_fd() const { return drm_->get_fd(); }; const drmModeModeInfo& get_mode() const { return mode_; }; @@ -176,17 +148,9 @@ class GFX_EXPORT HardwareDisplayController { uint32_t crtc_id_; - uint32_t dpms_property_id_; - // TODO(dnicoara) Need to store all the modes. drmModeModeInfo mode_; - // Saved CRTC state from before we used it. Need it to restore state once we - // are finished using this device. - drmModeCrtc* saved_crtc_; - - State state_; - scoped_ptr<DriSurface> surface_; uint64_t time_of_last_flip_; @@ -194,6 +158,6 @@ class GFX_EXPORT HardwareDisplayController { DISALLOW_COPY_AND_ASSIGN(HardwareDisplayController); }; -} // namespace gfx +} // namespace ui -#endif // UI_GFX_OZONE_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ +#endif // UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ diff --git a/ui/gfx/ozone/dri/hardware_display_controller_unittest.cc b/ui/ozone/platform/dri/hardware_display_controller_unittest.cc index da0e7b4984..1beb85b69a 100644 --- a/ui/gfx/ozone/dri/hardware_display_controller_unittest.cc +++ b/ui/ozone/platform/dri/hardware_display_controller_unittest.cc @@ -1,13 +1,13 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkCanvas.h" -#include "ui/gfx/ozone/dri/dri_buffer.h" -#include "ui/gfx/ozone/dri/dri_surface.h" -#include "ui/gfx/ozone/dri/dri_wrapper.h" -#include "ui/gfx/ozone/dri/hardware_display_controller.h" +#include "ui/ozone/platform/dri/dri_buffer.h" +#include "ui/ozone/platform/dri/dri_surface.h" +#include "ui/ozone/platform/dri/dri_wrapper.h" +#include "ui/ozone/platform/dri/hardware_display_controller.h" namespace { @@ -26,10 +26,8 @@ const uint32_t kConnectorId = 1; // Mock CRTC ID. const uint32_t kCrtcId = 1; -const uint32_t kDPMSPropertyId = 1; - // The real DriWrapper makes actual DRM calls which we can't use in unit tests. -class MockDriWrapper : public gfx::DriWrapper { +class MockDriWrapper : public ui::DriWrapper { public: MockDriWrapper(int fd) : DriWrapper(""), get_crtc_call_count_(0), @@ -88,9 +86,20 @@ class MockDriWrapper : public gfx::DriWrapper { return page_flip_expectation_; } - virtual bool ConnectorSetProperty(uint32_t connector_id, - uint32_t property_id, - uint64_t value) OVERRIDE { return true; } + virtual bool SetProperty(uint32_t connector_id, + uint32_t property_id, + uint64_t value) OVERRIDE { return true; } + + virtual void FreeProperty(drmModePropertyRes* prop) OVERRIDE { delete prop; } + + virtual drmModePropertyBlobRes* GetPropertyBlob(drmModeConnector* connector, + const char* name) OVERRIDE { + return new drmModePropertyBlobRes; + } + + virtual void FreePropertyBlob(drmModePropertyBlobRes* blob) OVERRIDE { + delete blob; + } virtual bool SetCursor(uint32_t crtc_id, uint32_t handle, @@ -147,9 +156,9 @@ class MockDriWrapper : public gfx::DriWrapper { DISALLOW_COPY_AND_ASSIGN(MockDriWrapper); }; -class MockDriBuffer : public gfx::DriBuffer { +class MockDriBuffer : public ui::DriBuffer { public: - MockDriBuffer(gfx::DriWrapper* dri) : DriBuffer(dri) {} + MockDriBuffer(ui::DriWrapper* dri) : DriBuffer(dri) {} virtual ~MockDriBuffer() { surface_.clear(); } @@ -165,18 +174,18 @@ class MockDriBuffer : public gfx::DriBuffer { DISALLOW_COPY_AND_ASSIGN(MockDriBuffer); }; -class MockDriSurface : public gfx::DriSurface { +class MockDriSurface : public ui::DriSurface { public: - MockDriSurface(gfx::DriWrapper* dri, const gfx::Size& size) + MockDriSurface(ui::DriWrapper* dri, const gfx::Size& size) : DriSurface(dri, size), dri_(dri) {} virtual ~MockDriSurface() {} private: - virtual gfx::DriBuffer* CreateBuffer() OVERRIDE { + virtual ui::DriBuffer* CreateBuffer() OVERRIDE { return new MockDriBuffer(dri_); } - gfx::DriWrapper* dri_; + ui::DriWrapper* dri_; DISALLOW_COPY_AND_ASSIGN(MockDriSurface); }; @@ -191,7 +200,7 @@ class HardwareDisplayControllerTest : public testing::Test { virtual void SetUp() OVERRIDE; virtual void TearDown() OVERRIDE; protected: - scoped_ptr<gfx::HardwareDisplayController> controller_; + scoped_ptr<ui::HardwareDisplayController> controller_; scoped_ptr<MockDriWrapper> drm_; private: @@ -199,8 +208,9 @@ class HardwareDisplayControllerTest : public testing::Test { }; void HardwareDisplayControllerTest::SetUp() { - controller_.reset(new gfx::HardwareDisplayController()); drm_.reset(new MockDriWrapper(kFd)); + controller_.reset(new ui::HardwareDisplayController( + drm_.get(), kConnectorId, kCrtcId, kDefaultMode)); } void HardwareDisplayControllerTest::TearDown() { @@ -208,115 +218,72 @@ void HardwareDisplayControllerTest::TearDown() { drm_.reset(); } -TEST_F(HardwareDisplayControllerTest, CheckInitialState) { - EXPECT_EQ(gfx::HardwareDisplayController::UNASSOCIATED, - controller_->get_state()); -} - -TEST_F(HardwareDisplayControllerTest, - CheckStateAfterControllerIsInitialized) { - controller_->SetControllerInfo( - drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode); - - EXPECT_EQ(1, drm_->get_get_crtc_call_count()); - EXPECT_EQ(gfx::HardwareDisplayController::UNINITIALIZED, - controller_->get_state()); -} - TEST_F(HardwareDisplayControllerTest, CheckStateAfterSurfaceIsBound) { - controller_->SetControllerInfo( - drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode); - scoped_ptr<gfx::DriSurface> surface( + scoped_ptr<ui::DriSurface> surface( new MockDriSurface(drm_.get(), kDefaultModeSize)); EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass())); EXPECT_EQ(2, drm_->get_add_framebuffer_call_count()); - EXPECT_EQ(gfx::HardwareDisplayController::SURFACE_INITIALIZED, - controller_->get_state()); + EXPECT_TRUE(controller_->get_surface() != NULL); } TEST_F(HardwareDisplayControllerTest, CheckStateIfBindingFails) { drm_->set_add_framebuffer_expectation(false); - controller_->SetControllerInfo( - drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode); - scoped_ptr<gfx::DriSurface> surface( + scoped_ptr<ui::DriSurface> surface( new MockDriSurface(drm_.get(), kDefaultModeSize)); EXPECT_TRUE(surface->Initialize()); EXPECT_FALSE(controller_->BindSurfaceToController(surface.Pass())); EXPECT_EQ(1, drm_->get_add_framebuffer_call_count()); - EXPECT_EQ(gfx::HardwareDisplayController::FAILED, - controller_->get_state()); + EXPECT_EQ(NULL, controller_->get_surface()); } TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) { - controller_->SetControllerInfo( - drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode); - scoped_ptr<gfx::DriSurface> surface( + scoped_ptr<ui::DriSurface> surface( new MockDriSurface(drm_.get(), kDefaultModeSize)); EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass())); - controller_->SchedulePageFlip(); - - EXPECT_EQ(gfx::HardwareDisplayController::INITIALIZED, - controller_->get_state()); + EXPECT_TRUE(controller_->SchedulePageFlip()); + EXPECT_TRUE(controller_->get_surface() != NULL); } TEST_F(HardwareDisplayControllerTest, CheckStateIfModesetFails) { drm_->set_set_crtc_expectation(false); - controller_->SetControllerInfo( - drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode); - scoped_ptr<gfx::DriSurface> surface( + scoped_ptr<ui::DriSurface> surface( new MockDriSurface(drm_.get(), kDefaultModeSize)); EXPECT_TRUE(surface->Initialize()); - EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass())); - - controller_->SchedulePageFlip(); - - EXPECT_EQ(gfx::HardwareDisplayController::FAILED, - controller_->get_state()); + EXPECT_FALSE(controller_->BindSurfaceToController(surface.Pass())); + EXPECT_EQ(NULL, controller_->get_surface()); } TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) { drm_->set_page_flip_expectation(false); - controller_->SetControllerInfo( - drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode); - scoped_ptr<gfx::DriSurface> surface( + scoped_ptr<ui::DriSurface> surface( new MockDriSurface(drm_.get(), kDefaultModeSize)); EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass())); - - controller_->SchedulePageFlip(); - - EXPECT_EQ(gfx::HardwareDisplayController::FAILED, - controller_->get_state()); + EXPECT_FALSE(controller_->SchedulePageFlip()); } TEST_F(HardwareDisplayControllerTest, CheckProperDestruction) { - controller_->SetControllerInfo( - drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode); - scoped_ptr<gfx::DriSurface> surface( + scoped_ptr<ui::DriSurface> surface( new MockDriSurface(drm_.get(), kDefaultModeSize)); EXPECT_TRUE(surface->Initialize()); EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass())); - - EXPECT_EQ(gfx::HardwareDisplayController::SURFACE_INITIALIZED, - controller_->get_state()); + EXPECT_TRUE(controller_->get_surface() != NULL); controller_.reset(); EXPECT_EQ(2, drm_->get_remove_framebuffer_call_count()); - EXPECT_EQ(1, drm_->get_restore_crtc_call_count()); - EXPECT_EQ(1, drm_->get_free_crtc_call_count()); } diff --git a/ui/ozone/platform/dri/ozone_platform_dri.cc b/ui/ozone/platform/dri/ozone_platform_dri.cc index 8175a1d01c..bd0561f999 100644 --- a/ui/ozone/platform/dri/ozone_platform_dri.cc +++ b/ui/ozone/platform/dri/ozone_platform_dri.cc @@ -5,44 +5,64 @@ #include "ui/ozone/platform/dri/ozone_platform_dri.h" #include "ui/events/ozone/evdev/cursor_delegate_evdev.h" +#include "ui/events/ozone/evdev/event_factory_evdev.h" +#include "ui/ozone/ime/input_method_context_factory_ozone.h" #include "ui/ozone/ozone_platform.h" +#include "ui/ozone/platform/dri/cursor_factory_evdev_dri.h" +#include "ui/ozone/platform/dri/dri_surface_factory.h" #if defined(OS_CHROMEOS) -#include "ui/ozone/common/chromeos/native_display_delegate_ozone.h" +#include "ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h" #endif namespace ui { -OzonePlatformDri::OzonePlatformDri() - : cursor_factory_ozone_(&surface_factory_ozone_), - event_factory_ozone_(&cursor_factory_ozone_) {} +namespace { -OzonePlatformDri::~OzonePlatformDri() {} +// OzonePlatform for Linux DRI (Direct Rendering Infrastructure) +// +// This platform is Linux without any display server (no X, wayland, or +// anything). This means chrome alone owns the display and input devices. +class OzonePlatformDri : public OzonePlatform { + public: + OzonePlatformDri() + : cursor_factory_ozone_(&surface_factory_ozone_), + event_factory_ozone_(&cursor_factory_ozone_) {} + virtual ~OzonePlatformDri() {} -gfx::SurfaceFactoryOzone* OzonePlatformDri::GetSurfaceFactoryOzone() { - return &surface_factory_ozone_; -} - -ui::EventFactoryOzone* OzonePlatformDri::GetEventFactoryOzone() { - return &event_factory_ozone_; -} + // OzonePlatform: + virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE { + return &surface_factory_ozone_; + } + virtual ui::EventFactoryOzone* GetEventFactoryOzone() OVERRIDE { + return &event_factory_ozone_; + } + virtual ui::InputMethodContextFactoryOzone* + GetInputMethodContextFactoryOzone() OVERRIDE { + return &input_method_context_factory_ozone_; + } + virtual ui::CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE { + return &cursor_factory_ozone_; + } +#if defined(OS_CHROMEOS) + virtual scoped_ptr<ui::NativeDisplayDelegate> CreateNativeDisplayDelegate() + OVERRIDE { + return scoped_ptr<ui::NativeDisplayDelegate>( + new NativeDisplayDelegateDri(&surface_factory_ozone_)); + } +#endif -ui::InputMethodContextFactoryOzone* -OzonePlatformDri::GetInputMethodContextFactoryOzone() { - return &input_method_context_factory_ozone_; -} + private: + ui::DriSurfaceFactory surface_factory_ozone_; + ui::CursorFactoryEvdevDri cursor_factory_ozone_; + ui::EventFactoryEvdev event_factory_ozone_; + // This creates a minimal input context. + ui::InputMethodContextFactoryOzone input_method_context_factory_ozone_; -ui::CursorFactoryOzone* OzonePlatformDri::GetCursorFactoryOzone() { - return &cursor_factory_ozone_; -} + DISALLOW_COPY_AND_ASSIGN(OzonePlatformDri); +}; -#if defined(OS_CHROMEOS) -scoped_ptr<ui::NativeDisplayDelegate> -OzonePlatformDri::CreateNativeDisplayDelegate() { - return scoped_ptr<ui::NativeDisplayDelegate>( - new NativeDisplayDelegateOzone()); -} -#endif +} // namespace OzonePlatform* CreateOzonePlatformDri() { return new OzonePlatformDri; } diff --git a/ui/ozone/platform/dri/ozone_platform_dri.h b/ui/ozone/platform/dri/ozone_platform_dri.h index dff706b385..a63a0541dd 100644 --- a/ui/ozone/platform/dri/ozone_platform_dri.h +++ b/ui/ozone/platform/dri/ozone_platform_dri.h @@ -5,41 +5,9 @@ #ifndef UI_OZONE_PLATFORM_DRI_OZONE_PLATFORM_DRI_H_ #define UI_OZONE_PLATFORM_DRI_OZONE_PLATFORM_DRI_H_ -#include "ui/events/ozone/evdev/event_factory_evdev.h" -#include "ui/gfx/ozone/dri/dri_surface_factory.h" -#include "ui/ozone/ozone_platform.h" -#include "ui/ozone/platform/dri/cursor_factory_evdev_dri.h" - namespace ui { -// OzonePlatform for Linux DRI (Direct Rendering Infrastructure) -// -// This platform is Linux without any display server (no X, wayland, or -// anything). This means chrome alone owns the display and input devices. -class OzonePlatformDri : public OzonePlatform { - public: - OzonePlatformDri(); - virtual ~OzonePlatformDri(); - - virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE; - virtual ui::EventFactoryOzone* GetEventFactoryOzone() OVERRIDE; - virtual ui::InputMethodContextFactoryOzone* - GetInputMethodContextFactoryOzone() OVERRIDE; - virtual ui::CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE; -#if defined(OS_CHROMEOS) - virtual scoped_ptr<ui::NativeDisplayDelegate> - CreateNativeDisplayDelegate() OVERRIDE; -#endif - - private: - gfx::DriSurfaceFactory surface_factory_ozone_; - ui::CursorFactoryEvdevDri cursor_factory_ozone_; - ui::EventFactoryEvdev event_factory_ozone_; - // This creates a minimal input context. - ui::InputMethodContextFactoryOzone input_method_context_factory_ozone_; - - DISALLOW_COPY_AND_ASSIGN(OzonePlatformDri); -}; +class OzonePlatform; // Constructor hook for use in ozone_platform_list.cc OzonePlatform* CreateOzonePlatformDri(); diff --git a/ui/ozone/platform/test/ozone_platform_test.cc b/ui/ozone/platform/test/ozone_platform_test.cc index 2a848954c4..da94ba4b3f 100644 --- a/ui/ozone/platform/test/ozone_platform_test.cc +++ b/ui/ozone/platform/test/ozone_platform_test.cc @@ -6,6 +6,10 @@ #include "base/command_line.h" #include "base/files/file_path.h" +#include "ui/base/cursor/ozone/cursor_factory_ozone.h" +#include "ui/events/ozone/evdev/event_factory_evdev.h" +#include "ui/gfx/ozone/impl/file_surface_factory.h" +#include "ui/ozone/ime/input_method_context_factory_ozone.h" #include "ui/ozone/ozone_platform.h" #include "ui/ozone/ozone_switches.h" @@ -15,36 +19,50 @@ namespace ui { -OzonePlatformTest::OzonePlatformTest(const base::FilePath& dump_file) - : surface_factory_ozone_(dump_file) {} +namespace { -OzonePlatformTest::~OzonePlatformTest() {} +// OzonePlatform for testing +// +// This platform dumps images to a file for testing purposes. +class OzonePlatformTest : public OzonePlatform { + public: + OzonePlatformTest(const base::FilePath& dump_file) + : surface_factory_ozone_(dump_file) {} + virtual ~OzonePlatformTest() {} -gfx::SurfaceFactoryOzone* OzonePlatformTest::GetSurfaceFactoryOzone() { - return &surface_factory_ozone_; -} + // OzonePlatform: + virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE { + return &surface_factory_ozone_; + } + virtual ui::EventFactoryOzone* GetEventFactoryOzone() OVERRIDE { + return &event_factory_ozone_; + } + virtual ui::InputMethodContextFactoryOzone* + GetInputMethodContextFactoryOzone() OVERRIDE { + return &input_method_context_factory_ozone_; + } + virtual ui::CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE { + return &cursor_factory_ozone_; + } -ui::EventFactoryOzone* OzonePlatformTest::GetEventFactoryOzone() { - return &event_factory_ozone_; -} +#if defined(OS_CHROMEOS) + virtual scoped_ptr<ui::NativeDisplayDelegate> CreateNativeDisplayDelegate() + OVERRIDE { + return scoped_ptr<ui::NativeDisplayDelegate>( + new NativeDisplayDelegateOzone()); + } +#endif -ui::InputMethodContextFactoryOzone* -OzonePlatformTest::GetInputMethodContextFactoryOzone() { - return &input_method_context_factory_ozone_; -} + private: + gfx::FileSurfaceFactory surface_factory_ozone_; + ui::EventFactoryEvdev event_factory_ozone_; + ui::InputMethodContextFactoryOzone input_method_context_factory_ozone_; + ui::CursorFactoryOzone cursor_factory_ozone_; -ui::CursorFactoryOzone* OzonePlatformTest::GetCursorFactoryOzone() { - return &cursor_factory_ozone_; -} + DISALLOW_COPY_AND_ASSIGN(OzonePlatformTest); +}; -#if defined(OS_CHROMEOS) -scoped_ptr<ui::NativeDisplayDelegate> -OzonePlatformTest::CreateNativeDisplayDelegate() { - return scoped_ptr<ui::NativeDisplayDelegate>( - new NativeDisplayDelegateOzone()); - return scoped_ptr<ui::NativeDisplayDelegate>(); -} -#endif +} // namespace OzonePlatform* CreateOzonePlatformTest() { CommandLine* cmd = CommandLine::ForCurrentProcess(); diff --git a/ui/ozone/platform/test/ozone_platform_test.h b/ui/ozone/platform/test/ozone_platform_test.h index 1f6a9648d2..fb25fd69f5 100644 --- a/ui/ozone/platform/test/ozone_platform_test.h +++ b/ui/ozone/platform/test/ozone_platform_test.h @@ -5,40 +5,9 @@ #ifndef UI_OZONE_PLATFORM_TEST_OZONE_PLATFORM_TEST_H_ #define UI_OZONE_PLATFORM_TEST_OZONE_PLATFORM_TEST_H_ -#include "base/files/file_path.h" -#include "ui/base/cursor/ozone/cursor_factory_ozone.h" -#include "ui/events/ozone/evdev/event_factory_evdev.h" -#include "ui/gfx/ozone/impl/file_surface_factory.h" -#include "ui/ozone/ozone_platform.h" - namespace ui { -// OzonePlatform for testing -// -// This platform dumps images to a file for testing purposes. -class OzonePlatformTest : public OzonePlatform { - public: - OzonePlatformTest(const base::FilePath& dump_file); - virtual ~OzonePlatformTest(); - - virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE; - virtual ui::EventFactoryOzone* GetEventFactoryOzone() OVERRIDE; - virtual ui::InputMethodContextFactoryOzone* - GetInputMethodContextFactoryOzone() OVERRIDE; - virtual ui::CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE; -#if defined(OS_CHROMEOS) - virtual scoped_ptr<ui::NativeDisplayDelegate> - CreateNativeDisplayDelegate() OVERRIDE; -#endif - - private: - gfx::FileSurfaceFactory surface_factory_ozone_; - ui::EventFactoryEvdev event_factory_ozone_; - ui::InputMethodContextFactoryOzone input_method_context_factory_ozone_; - ui::CursorFactoryOzone cursor_factory_ozone_; - - DISALLOW_COPY_AND_ASSIGN(OzonePlatformTest); -}; +class OzonePlatform; // Constructor hook for use in ozone_platform_list.cc OzonePlatform* CreateOzonePlatformTest(); diff --git a/ui/resources/BUILD.gn b/ui/resources/BUILD.gn new file mode 100644 index 0000000000..30e62bae31 --- /dev/null +++ b/ui/resources/BUILD.gn @@ -0,0 +1,10 @@ +# Copyright 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//tools/grit/grit_rule.gni") + +grit("resources") { + output_name = "ui_resources" + source = "ui_resources.grd" +} diff --git a/ui/resources/ui_resources.grd b/ui/resources/ui_resources.grd index 260f05cda2..6cd4ed9809 100644 --- a/ui/resources/ui_resources.grd +++ b/ui/resources/ui_resources.grd @@ -259,7 +259,7 @@ <structure type="chrome_scaled_image" name="IDR_COMBOBOX_BUTTON_F_H_TOP_RIGHT" file="common/combobox_button_top_right_focused_hover.png" /> <structure type="chrome_scaled_image" name="IDR_COMBOBOX_BUTTON_F_P_TOP_RIGHT" file="common/combobox_button_top_right_focused_pressed.png" /> </if> - <if expr="toolkit_uses_gtk or toolkit_views"> + <if expr="toolkit_views"> <structure type="chrome_scaled_image" name="IDR_CONTENT_BOTTOM_CENTER" file="content_bottom_center.png" /> <structure type="chrome_scaled_image" name="IDR_CONTENT_BOTTOM_LEFT_CORNER" file="content_bottom_left_corner.png" /> <structure type="chrome_scaled_image" name="IDR_CONTENT_BOTTOM_RIGHT_CORNER" file="content_bottom_right_corner.png" /> @@ -484,7 +484,7 @@ <structure type="chrome_scaled_image" name="IDR_SCROLLBAR_THUMB_BASE_PRESSED_TOP_LEFT" file="common/aura_scrollbar_thumb_base_pressed_top_left.png" /> <structure type="chrome_scaled_image" name="IDR_SCROLLBAR_THUMB_BASE_PRESSED_TOP_RIGHT" file="common/aura_scrollbar_thumb_base_pressed_top_right.png" /> </if> - <if expr="toolkit_uses_gtk or toolkit_views"> + <if expr="toolkit_views"> <structure type="chrome_scaled_image" name="IDR_TEXTBUTTON_HOVER_BOTTOM" file="common/textbutton_hover_bottom.png" /> <structure type="chrome_scaled_image" name="IDR_TEXTBUTTON_HOVER_BOTTOM_LEFT" file="common/textbutton_hover_bottom_left.png" /> <structure type="chrome_scaled_image" name="IDR_TEXTBUTTON_HOVER_BOTTOM_RIGHT" file="common/textbutton_hover_bottom_right.png" /> @@ -524,7 +524,7 @@ <structure type="chrome_scaled_image" name="IDR_TRAY_EMPTY" file="mac/notification_tray_empty.png"/> <structure type="chrome_scaled_image" name="IDR_TRAY_EMPTY_PRESSED" file="mac/notification_tray_empty_pressed.png"/> </if> - <if expr="toolkit_uses_gtk or toolkit_views"> + <if expr="toolkit_views"> <structure type="chrome_scaled_image" name="IDR_WINDOW_BOTTOM_CENTER" file="common/window_bottom_center.png" /> <structure type="chrome_scaled_image" name="IDR_WINDOW_BOTTOM_LEFT_CORNER" file="common/window_bottom_left_corner.png" /> <structure type="chrome_scaled_image" name="IDR_WINDOW_BOTTOM_RIGHT_CORNER" file="common/window_bottom_right_corner.png" /> diff --git a/ui/shell_dialogs/shell_dialogs.target.darwin-arm.mk b/ui/shell_dialogs/shell_dialogs.target.darwin-arm.mk index 6f799209e8..3fc1b31fb1 100644 --- a/ui/shell_dialogs/shell_dialogs.target.darwin-arm.mk +++ b/ui/shell_dialogs/shell_dialogs.target.darwin-arm.mk @@ -102,12 +102,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -226,12 +229,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -307,7 +313,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/shell_dialogs/shell_dialogs.target.darwin-mips.mk b/ui/shell_dialogs/shell_dialogs.target.darwin-mips.mk index fbc9133e14..1f9c4088e8 100644 --- a/ui/shell_dialogs/shell_dialogs.target.darwin-mips.mk +++ b/ui/shell_dialogs/shell_dialogs.target.darwin-mips.mk @@ -101,12 +101,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -224,12 +227,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -303,7 +309,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/shell_dialogs/shell_dialogs.target.darwin-x86.mk b/ui/shell_dialogs/shell_dialogs.target.darwin-x86.mk index fa6bfaf19f..bcd87f697b 100644 --- a/ui/shell_dialogs/shell_dialogs.target.darwin-x86.mk +++ b/ui/shell_dialogs/shell_dialogs.target.darwin-x86.mk @@ -103,12 +103,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -226,12 +229,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -303,7 +309,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/shell_dialogs/shell_dialogs.target.darwin-x86_64.mk b/ui/shell_dialogs/shell_dialogs.target.darwin-x86_64.mk index 61d7198cb4..38e6267607 100644 --- a/ui/shell_dialogs/shell_dialogs.target.darwin-x86_64.mk +++ b/ui/shell_dialogs/shell_dialogs.target.darwin-x86_64.mk @@ -103,12 +103,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -227,12 +230,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -305,7 +311,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/shell_dialogs/shell_dialogs.target.linux-arm.mk b/ui/shell_dialogs/shell_dialogs.target.linux-arm.mk index 6f799209e8..3fc1b31fb1 100644 --- a/ui/shell_dialogs/shell_dialogs.target.linux-arm.mk +++ b/ui/shell_dialogs/shell_dialogs.target.linux-arm.mk @@ -102,12 +102,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -226,12 +229,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -307,7 +313,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/shell_dialogs/shell_dialogs.target.linux-mips.mk b/ui/shell_dialogs/shell_dialogs.target.linux-mips.mk index fbc9133e14..1f9c4088e8 100644 --- a/ui/shell_dialogs/shell_dialogs.target.linux-mips.mk +++ b/ui/shell_dialogs/shell_dialogs.target.linux-mips.mk @@ -101,12 +101,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -224,12 +227,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -303,7 +309,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/shell_dialogs/shell_dialogs.target.linux-x86.mk b/ui/shell_dialogs/shell_dialogs.target.linux-x86.mk index fa6bfaf19f..bcd87f697b 100644 --- a/ui/shell_dialogs/shell_dialogs.target.linux-x86.mk +++ b/ui/shell_dialogs/shell_dialogs.target.linux-x86.mk @@ -103,12 +103,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -226,12 +229,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -303,7 +309,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/shell_dialogs/shell_dialogs.target.linux-x86_64.mk b/ui/shell_dialogs/shell_dialogs.target.linux-x86_64.mk index 61d7198cb4..38e6267607 100644 --- a/ui/shell_dialogs/shell_dialogs.target.linux-x86_64.mk +++ b/ui/shell_dialogs/shell_dialogs.target.linux-x86_64.mk @@ -103,12 +103,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -227,12 +230,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -305,7 +311,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/snapshot/snapshot.target.darwin-arm.mk b/ui/snapshot/snapshot.target.darwin-arm.mk index 6d81bf21ba..df5313cab2 100644 --- a/ui/snapshot/snapshot.target.darwin-arm.mk +++ b/ui/snapshot/snapshot.target.darwin-arm.mk @@ -93,12 +93,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -215,12 +218,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/snapshot/snapshot.target.darwin-mips.mk b/ui/snapshot/snapshot.target.darwin-mips.mk index add41c0286..6b0bd0d097 100644 --- a/ui/snapshot/snapshot.target.darwin-mips.mk +++ b/ui/snapshot/snapshot.target.darwin-mips.mk @@ -92,12 +92,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -213,12 +216,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/snapshot/snapshot.target.darwin-x86.mk b/ui/snapshot/snapshot.target.darwin-x86.mk index 4febd0e378..18528de2ec 100644 --- a/ui/snapshot/snapshot.target.darwin-x86.mk +++ b/ui/snapshot/snapshot.target.darwin-x86.mk @@ -94,12 +94,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -215,12 +218,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/snapshot/snapshot.target.darwin-x86_64.mk b/ui/snapshot/snapshot.target.darwin-x86_64.mk index 427add6bc8..098730a08f 100644 --- a/ui/snapshot/snapshot.target.darwin-x86_64.mk +++ b/ui/snapshot/snapshot.target.darwin-x86_64.mk @@ -94,12 +94,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -216,12 +219,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -292,7 +298,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/snapshot/snapshot.target.linux-arm.mk b/ui/snapshot/snapshot.target.linux-arm.mk index 6d81bf21ba..df5313cab2 100644 --- a/ui/snapshot/snapshot.target.linux-arm.mk +++ b/ui/snapshot/snapshot.target.linux-arm.mk @@ -93,12 +93,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -215,12 +218,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/snapshot/snapshot.target.linux-mips.mk b/ui/snapshot/snapshot.target.linux-mips.mk index add41c0286..6b0bd0d097 100644 --- a/ui/snapshot/snapshot.target.linux-mips.mk +++ b/ui/snapshot/snapshot.target.linux-mips.mk @@ -92,12 +92,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -213,12 +216,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/snapshot/snapshot.target.linux-x86.mk b/ui/snapshot/snapshot.target.linux-x86.mk index 4febd0e378..18528de2ec 100644 --- a/ui/snapshot/snapshot.target.linux-x86.mk +++ b/ui/snapshot/snapshot.target.linux-x86.mk @@ -94,12 +94,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -215,12 +218,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/snapshot/snapshot.target.linux-x86_64.mk b/ui/snapshot/snapshot.target.linux-x86_64.mk index 427add6bc8..098730a08f 100644 --- a/ui/snapshot/snapshot.target.linux-x86_64.mk +++ b/ui/snapshot/snapshot.target.linux-x86_64.mk @@ -94,12 +94,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -216,12 +219,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ @@ -292,7 +298,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/surface/surface.target.darwin-arm.mk b/ui/surface/surface.target.darwin-arm.mk index f8c16b3125..5e7eb7f601 100644 --- a/ui/surface/surface.target.darwin-arm.mk +++ b/ui/surface/surface.target.darwin-arm.mk @@ -45,7 +45,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -fno-tree-sra \ -fuse-ld=gold \ -Wno-psabi \ @@ -97,12 +96,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -173,7 +175,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -fno-tree-sra \ -fuse-ld=gold \ -Wno-psabi \ @@ -225,12 +226,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -308,7 +312,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/surface/surface.target.darwin-mips.mk b/ui/surface/surface.target.darwin-mips.mk index fa800ab1c0..12ee7d8171 100644 --- a/ui/surface/surface.target.darwin-mips.mk +++ b/ui/surface/surface.target.darwin-mips.mk @@ -45,7 +45,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -EL \ -mhard-float \ -ffunction-sections \ @@ -96,12 +95,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -172,7 +174,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -EL \ -mhard-float \ -ffunction-sections \ @@ -223,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -304,7 +308,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/surface/surface.target.darwin-x86.mk b/ui/surface/surface.target.darwin-x86.mk index cb2b06d8a9..4cceb1433d 100644 --- a/ui/surface/surface.target.darwin-x86.mk +++ b/ui/surface/surface.target.darwin-x86.mk @@ -44,7 +44,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -msse2 \ -mfpmath=sse \ -mmmx \ @@ -98,12 +97,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DUSE_OPENSSL=1' \ @@ -171,7 +173,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -msse2 \ -mfpmath=sse \ -mmmx \ @@ -225,12 +226,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DUSE_OPENSSL=1' \ @@ -304,7 +308,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/surface/surface.target.darwin-x86_64.mk b/ui/surface/surface.target.darwin-x86_64.mk index f6317b5302..0f7186a898 100644 --- a/ui/surface/surface.target.darwin-x86_64.mk +++ b/ui/surface/surface.target.darwin-x86_64.mk @@ -46,7 +46,6 @@ MY_CFLAGS_Debug := \ -pipe \ -fPIC \ -Wno-unused-local-typedefs \ - -Wno-unknown-pragmas \ -m64 \ -march=x86-64 \ -fuse-ld=gold \ @@ -98,12 +97,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -174,7 +176,6 @@ MY_CFLAGS_Release := \ -pipe \ -fPIC \ -Wno-unused-local-typedefs \ - -Wno-unknown-pragmas \ -m64 \ -march=x86-64 \ -fuse-ld=gold \ @@ -226,12 +227,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -306,7 +310,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/surface/surface.target.linux-arm.mk b/ui/surface/surface.target.linux-arm.mk index f8c16b3125..5e7eb7f601 100644 --- a/ui/surface/surface.target.linux-arm.mk +++ b/ui/surface/surface.target.linux-arm.mk @@ -45,7 +45,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -fno-tree-sra \ -fuse-ld=gold \ -Wno-psabi \ @@ -97,12 +96,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -173,7 +175,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -fno-tree-sra \ -fuse-ld=gold \ -Wno-psabi \ @@ -225,12 +226,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -308,7 +312,6 @@ LOCAL_LDFLAGS_Debug := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--icf=safe \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/surface/surface.target.linux-mips.mk b/ui/surface/surface.target.linux-mips.mk index fa800ab1c0..12ee7d8171 100644 --- a/ui/surface/surface.target.linux-mips.mk +++ b/ui/surface/surface.target.linux-mips.mk @@ -45,7 +45,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -EL \ -mhard-float \ -ffunction-sections \ @@ -96,12 +95,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -172,7 +174,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -EL \ -mhard-float \ -ffunction-sections \ @@ -223,12 +224,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -304,7 +308,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/surface/surface.target.linux-x86.mk b/ui/surface/surface.target.linux-x86.mk index cb2b06d8a9..4cceb1433d 100644 --- a/ui/surface/surface.target.linux-x86.mk +++ b/ui/surface/surface.target.linux-x86.mk @@ -44,7 +44,6 @@ MY_CFLAGS_Debug := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -msse2 \ -mfpmath=sse \ -mmmx \ @@ -98,12 +97,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DUSE_OPENSSL=1' \ @@ -171,7 +173,6 @@ MY_CFLAGS_Release := \ -fvisibility=hidden \ -pipe \ -fPIC \ - -Wno-unknown-pragmas \ -msse2 \ -mfpmath=sse \ -mmmx \ @@ -225,12 +226,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ '-DUSE_OPENSSL=1' \ @@ -304,7 +308,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/surface/surface.target.linux-x86_64.mk b/ui/surface/surface.target.linux-x86_64.mk index f6317b5302..0f7186a898 100644 --- a/ui/surface/surface.target.linux-x86_64.mk +++ b/ui/surface/surface.target.linux-x86_64.mk @@ -46,7 +46,6 @@ MY_CFLAGS_Debug := \ -pipe \ -fPIC \ -Wno-unused-local-typedefs \ - -Wno-unknown-pragmas \ -m64 \ -march=x86-64 \ -fuse-ld=gold \ @@ -98,12 +97,15 @@ MY_DEFS_Debug := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -174,7 +176,6 @@ MY_CFLAGS_Release := \ -pipe \ -fPIC \ -Wno-unused-local-typedefs \ - -Wno-unknown-pragmas \ -m64 \ -march=x86-64 \ -fuse-ld=gold \ @@ -226,12 +227,15 @@ MY_DEFS_Release := \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \ + '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \ + '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \ '-DSK_SUPPORT_LEGACY_N32_NAME' \ + '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \ + '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ - '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DPOSIX_AVOID_MMAP' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DMESA_EGL_NO_X11_HEADERS' \ @@ -306,7 +310,6 @@ LOCAL_LDFLAGS_Debug := \ -nostdlib \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ - -Wl,--gc-sections \ -Wl,--warn-shared-textrel \ -Wl,-O1 \ -Wl,--as-needed diff --git a/ui/ui_unittests.gyp b/ui/ui_unittests.gyp index 5b57002577..cfea34789f 100644 --- a/ui/ui_unittests.gyp +++ b/ui/ui_unittests.gyp @@ -8,54 +8,6 @@ }, 'targets': [ { - 'target_name': 'ui_test_support', - 'dependencies': [ - '../base/base.gyp:base', - '../skia/skia.gyp:skia', - '../testing/gtest.gyp:gtest', - 'gfx/gfx.gyp:gfx', - 'gfx/gfx.gyp:gfx_geometry', - ], - 'sources': [ - 'base/test/ui_controls.h', - 'base/test/ui_controls_aura.cc', - 'base/test/ui_controls_internal_win.cc', - 'base/test/ui_controls_internal_win.h', - 'base/test/ui_controls_mac.mm', - 'base/test/ui_controls_win.cc', - ], - 'include_dirs': [ - '../', - ], - 'conditions': [ - ['OS!="ios"', { - 'type': 'static_library', - 'includes': [ 'base/ime/ime_test_support.gypi' ], - }, { # OS=="ios" - # None of the sources in this target are built on iOS, resulting in - # link errors when building targets that depend on this target - # because the static library isn't found. If this target is changed - # to have sources that are built on iOS, the target should be changed - # to be of type static_library on all platforms. - 'type': 'none', - # The cocoa files don't apply to iOS. - 'sources/': [['exclude', 'cocoa']], - }], - ['chromeos==1', { - 'dependencies': [ - '../chromeos/chromeos.gyp:chromeos_test_support_without_gmock', - '../skia/skia.gyp:skia', - ], - }], - ['use_aura==1', { - 'sources!': [ - 'base/test/ui_controls_mac.mm', - 'base/test/ui_controls_win.cc', - ], - }], - ], - }, - { 'target_name': 'ui_unittests', 'type': '<(gtest_target_type)', 'dependencies': [ @@ -69,11 +21,11 @@ '../url/url.gyp:url_lib', 'base/strings/ui_strings.gyp:ui_strings', 'base/ui_base.gyp:ui_base', + 'base/ui_base.gyp:ui_base_test_support', 'events/events.gyp:events_base', 'gfx/gfx.gyp:gfx_test_support', 'resources/ui_resources.gyp:ui_resources', 'resources/ui_resources.gyp:ui_test_pak', - 'ui_test_support', ], # iOS uses a small subset of ui. common_sources are the only files that # are built on iOS. @@ -135,9 +87,6 @@ 'gfx/font_list_unittest.cc', 'gfx/image/image_mac_unittest.mm', 'gfx/image/image_util_unittest.cc', - 'gfx/ozone/dri/hardware_display_controller_unittest.cc', - 'gfx/ozone/dri/dri_surface_factory_unittest.cc', - 'gfx/ozone/dri/dri_surface_unittest.cc', 'gfx/platform_font_mac_unittest.mm', 'gfx/render_text_unittest.cc', 'gfx/sequential_id_generator_unittest.cc', @@ -146,6 +95,7 @@ ], 'includes': [ 'display/display_unittests.gypi', + 'ozone/ozone_unittests.gypi', ], 'include_dirs': [ '../', @@ -239,14 +189,6 @@ '../tools/xdisplaycheck/xdisplaycheck.gyp:xdisplaycheck', ], }], - ['toolkit_uses_gtk == 1', { - 'sources': [ - 'base/dragdrop/gtk_dnd_util_unittest.cc', - ], - 'dependencies': [ - '../build/linux/system.gyp:gtk', - ], - }], ['OS=="android" or OS=="ios"', { 'sources!': [ 'gfx/render_text_unittest.cc', @@ -285,11 +227,6 @@ 'gfx/screen_unittest.cc', ], }], - ['use_ozone==1', { - 'dependencies': [ - '<(DEPTH)/build/linux/system.gyp:dridrm', - ], - }], ['use_ozone==1 and use_pango==0', { 'sources!': [ 'gfx/text_elider_unittest.cc', @@ -300,6 +237,9 @@ ], }], ['chromeos==1', { + 'dependencies': [ + '../chromeos/chromeos.gyp:chromeos', + ], 'sources!': [ 'base/dragdrop/os_exchange_data_provider_aurax11_unittest.cc', ], @@ -343,7 +283,6 @@ ], 'variables': { 'test_suite_name': 'ui_unittests', - 'input_shlib_path': '<(SHARED_LIB_DIR)/<(SHARED_LIB_PREFIX)ui_unittests<(SHARED_LIB_SUFFIX)', }, 'includes': [ '../build/apk_test.gypi' ], }, diff --git a/ui/views/accessibility/ax_tree_source_views.cc b/ui/views/accessibility/ax_tree_source_views.cc index 27f880215f..80c1125b62 100644 --- a/ui/views/accessibility/ax_tree_source_views.cc +++ b/ui/views/accessibility/ax_tree_source_views.cc @@ -4,6 +4,8 @@ #include "ui/views/accessibility/ax_tree_source_views.h" +#include <vector> + #include "base/strings/utf_string_conversions.h" #include "ui/accessibility/ax_view_state.h" #include "ui/views/widget/widget.h" @@ -13,7 +15,7 @@ namespace views { // A simple store associating each |View| with a unique id. class AXViewStore { public: - AXViewStore() : view_id_(0) {}; + AXViewStore() : view_id_(0) {} int32 GetOrStoreView(View* view) { int32 current_id = RetrieveId(view); @@ -63,15 +65,18 @@ class AXViewStore { std::map<View*, int32> view_to_id_; }; -AXTreeSourceViews::AXTreeSourceViews(Widget* root) : - view_store_(new AXViewStore()), - root_(root) { +AXTreeSourceViews::AXTreeSourceViews(Widget* root) + : view_store_(new AXViewStore()), + root_(root) { root->AddObserver(this); + root->AddRemovalsObserver(this); } AXTreeSourceViews::~AXTreeSourceViews() { - if (root_) + if (root_) { root_->RemoveObserver(this); + root_->RemoveRemovalsObserver(this); + } } View* AXTreeSourceViews::GetRoot() const { @@ -148,4 +153,4 @@ void AXTreeSourceViews::OnWidgetDestroyed(Widget* widget) { root_ = NULL; } -} // namespace views +} // namespace views diff --git a/ui/views/accessibility/ax_tree_source_views_unittest.cc b/ui/views/accessibility/ax_tree_source_views_unittest.cc index 9472faf495..7b46bfe588 100644 --- a/ui/views/accessibility/ax_tree_source_views_unittest.cc +++ b/ui/views/accessibility/ax_tree_source_views_unittest.cc @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <vector> + #include "base/memory/scoped_ptr.h" #include "base/strings/utf_string_conversions.h" #include "testing/gtest/include/gtest/gtest.h" @@ -68,9 +70,7 @@ TEST_F(AXTreeSourceViewsTest, SimpleAccessers) { TEST_F(AXTreeSourceViewsTest, SimpleSerialization) { AXTreeSourceViews ax_tree(widget_.get()); - ui::AXTreeSource<View*>* ax_source = - static_cast<ui::AXTreeSource<View*>* >(&ax_tree); - ui::AXTreeSerializer<View*> ax_serializer(ax_source); + ui::AXTreeSerializer<View*> ax_serializer(&ax_tree); ui::AXTreeUpdate out_update; ax_serializer.SerializeChanges(ax_tree.GetRoot(), &out_update); ASSERT_EQ(3U, out_update.nodes.size()); @@ -82,4 +82,4 @@ TEST_F(AXTreeSourceViewsTest, SimpleSerialization) { out_update.nodes[2].ToString()); } -} // namespace views +} // namespace views diff --git a/ui/views/bubble/bubble_delegate.h b/ui/views/bubble/bubble_delegate.h index 0142889e11..8bfd4a2b2b 100644 --- a/ui/views/bubble/bubble_delegate.h +++ b/ui/views/bubble/bubble_delegate.h @@ -184,9 +184,6 @@ class VIEWS_EXPORT BubbleDelegateView : public WidgetDelegateView, // Insets applied to the |anchor_view_| bounds. gfx::Insets anchor_view_insets_; - // The widget hosting the border for this bubble (non-Aura Windows only). - Widget* border_widget_; - // If true, the bubble does not take focus on display; default is false. bool use_focusless_; diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc index cadd40bdbe..717d2e08a4 100644 --- a/ui/views/controls/label.cc +++ b/ui/views/controls/label.cc @@ -323,7 +323,7 @@ void Label::PaintText(gfx::Canvas* canvas, int flags) { gfx::ShadowValues shadows; if (has_shadow_) - shadows.push_back(gfx::ShadowValue(shadow_offset_, 0, + shadows.push_back(gfx::ShadowValue(shadow_offset_, shadow_blur_, enabled() ? enabled_shadow_color_ : disabled_shadow_color_)); canvas->DrawStringRectWithShadows(text, font_list_, enabled() ? actual_enabled_color_ : actual_disabled_color_, @@ -398,6 +398,7 @@ void Label::Init(const base::string16& text, const gfx::FontList& font_list) { disabled_shadow_color_ = 0; shadow_offset_.SetPoint(1, 1); has_shadow_ = false; + shadow_blur_ = 0; cached_heights_.resize(kCachedSizeLimit); ResetCachedSize(); diff --git a/ui/views/controls/label.h b/ui/views/controls/label.h index 0964b036c5..17251f3528 100644 --- a/ui/views/controls/label.h +++ b/ui/views/controls/label.h @@ -94,6 +94,9 @@ class VIEWS_EXPORT Label : public View { // Sets the drop shadow's offset from the text. void SetShadowOffset(int x, int y); + // Sets the shadow blur. Default is zero. + void set_shadow_blur(double shadow_blur) { shadow_blur_ = shadow_blur; } + // Disables shadows. void ClearEmbellishing(); @@ -267,6 +270,8 @@ class VIEWS_EXPORT Label : public View { bool auto_color_readability_; mutable gfx::Size text_size_; mutable bool text_size_valid_; + // Indicates the level of shadow blurring. Default is zero. + double shadow_blur_; int line_height_; bool is_multi_line_; bool is_obscured_; diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc index 1861724d21..a63448d679 100644 --- a/ui/views/controls/menu/menu_controller.cc +++ b/ui/views/controls/menu/menu_controller.cc @@ -13,18 +13,21 @@ #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" +#include "ui/aura/client/screen_position_client.h" #include "ui/aura/env.h" #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" +#include "ui/aura/window_tree_host.h" #include "ui/base/dragdrop/drag_utils.h" #include "ui/base/dragdrop/os_exchange_data.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/events/event_constants.h" +#include "ui/events/event.h" #include "ui/events/event_utils.h" #include "ui/events/platform/platform_event_source.h" #include "ui/events/platform/scoped_event_dispatcher.h" #include "ui/gfx/canvas.h" #include "ui/gfx/native_widget_types.h" +#include "ui/gfx/point.h" #include "ui/gfx/screen.h" #include "ui/gfx/vector2d.h" #include "ui/native_theme/native_theme.h" @@ -35,9 +38,9 @@ #include "ui/views/controls/menu/menu_scroll_view_container.h" #include "ui/views/controls/menu/submenu_view.h" #include "ui/views/drag_utils.h" -#include "ui/views/event_utils.h" #include "ui/views/focus/view_storage.h" #include "ui/views/mouse_constants.h" +#include "ui/views/view.h" #include "ui/views/view_constants.h" #include "ui/views/views_delegate.h" #include "ui/views/widget/root_view.h" @@ -56,6 +59,7 @@ #include "ui/views/controls/menu/menu_event_dispatcher_linux.h" #endif +using aura::client::ScreenPositionClient; using base::Time; using base::TimeDelta; using ui::OSExchangeData; @@ -973,14 +977,7 @@ void MenuController::SetSelectionOnPointerDown(SubmenuView* source, #if defined(OS_WIN) // We're going to close and we own the mouse capture. We need to repost the // mouse down, otherwise the window the user clicked on won't get the event. - if (!state_.item) { - // We some times get an event after closing all the menus. Ignore it. Make - // sure the menu is in fact not visible. If the menu is visible, then - // we're in a bad state where we think the menu isn't visibile but it is. - DCHECK(!source->GetWidget()->IsVisible()); - } else { - RepostEvent(source, event); - } + RepostEvent(source, event); #endif // And close. @@ -2145,52 +2142,106 @@ bool MenuController::SelectByChar(base::char16 character) { void MenuController::RepostEvent(SubmenuView* source, const ui::LocatedEvent& event) { + if (!event.IsMouseEvent()) { + // TODO(rbyers): Gesture event repost is tricky to get right + // crbug.com/170987. + DCHECK(event.IsGestureEvent()); + return; + } + +#if defined(OS_WIN) + if (!state_.item) { + // We some times get an event after closing all the menus. Ignore it. Make + // sure the menu is in fact not visible. If the menu is visible, then + // we're in a bad state where we think the menu isn't visibile but it is. + DCHECK(!source->GetWidget()->IsVisible()); + return; + } + + state_.item->GetRootMenuItem()->GetSubmenu()->ReleaseCapture(); +#endif + gfx::Point screen_loc(event.location()); View::ConvertPointToScreen(source->GetScrollViewContainer(), &screen_loc); - gfx::NativeView native_view = source->GetWidget()->GetNativeView(); + if (!native_view) + return; + gfx::Screen* screen = gfx::Screen::GetScreenFor(native_view); gfx::NativeWindow window = screen->GetWindowAtScreenPoint(screen_loc); - // On Windows, it is ok for window to be NULL. Please refer to the - // RepostLocatedEvent function for more information. #if defined(OS_WIN) - // Release the capture. - SubmenuView* submenu = state_.item->GetRootMenuItem()->GetSubmenu(); - submenu->ReleaseCapture(); - - gfx::NativeView view = submenu->GetWidget()->GetNativeView(); - if (view && window) { - DWORD view_tid = GetWindowThreadProcessId(HWNDForNativeView(view), NULL); - if (view_tid != GetWindowThreadProcessId(HWNDForNativeView(window), NULL)) { + // PostMessage() to metro windows isn't allowed (access will be denied). Don't + // try to repost with Win32 if the window under the mouse press is in metro. + if (!ViewsDelegate::views_delegate || + !ViewsDelegate::views_delegate->IsWindowInMetro(window)) { + HWND target_window = window ? HWNDForNativeWindow(window) : + WindowFromPoint(screen_loc.ToPOINT()); + HWND source_window = HWNDForNativeView(native_view); + if (!target_window || !source_window || + GetWindowThreadProcessId(source_window, NULL) != + GetWindowThreadProcessId(target_window, NULL)) { // Even though we have mouse capture, windows generates a mouse event if // the other window is in a separate thread. Only repost an event if - // |view| was created on the same thread, else the target window can get - // double events leading to bad behavior. + // |target_window| and |source_window| were created on the same thread, + // else double events can occur and lead to bad behavior. return; } + + // Determine whether the click was in the client area or not. + // NOTE: WM_NCHITTEST coordinates are relative to the screen. + LPARAM coords = MAKELPARAM(screen_loc.x(), screen_loc.y()); + LRESULT nc_hit_result = SendMessage(target_window, WM_NCHITTEST, 0, coords); + const bool client_area = nc_hit_result == HTCLIENT; + + // TODO(sky): this isn't right. The event to generate should correspond with + // the event we just got. MouseEvent only tells us what is down, which may + // differ. Need to add ability to get changed button from MouseEvent. + int event_type; + int flags = event.flags(); + if (flags & ui::EF_LEFT_MOUSE_BUTTON) { + event_type = client_area ? WM_LBUTTONDOWN : WM_NCLBUTTONDOWN; + } else if (flags & ui::EF_MIDDLE_MOUSE_BUTTON) { + event_type = client_area ? WM_MBUTTONDOWN : WM_NCMBUTTONDOWN; + } else if (flags & ui::EF_RIGHT_MOUSE_BUTTON) { + event_type = client_area ? WM_RBUTTONDOWN : WM_NCRBUTTONDOWN; + } else { + NOTREACHED(); + return; + } + + int window_x = screen_loc.x(); + int window_y = screen_loc.y(); + if (client_area) { + POINT pt = { window_x, window_y }; + ScreenToClient(target_window, &pt); + window_x = pt.x; + window_y = pt.y; + } + + WPARAM target = client_area ? event.native_event().wParam : nc_hit_result; + LPARAM window_coords = MAKELPARAM(window_x, window_y); + PostMessage(target_window, event_type, target, window_coords); + return; } -#else +#endif + // Non-Windows Aura or |window| is in metro mode. if (!window) return; -#endif - scoped_ptr<ui::LocatedEvent> clone; - if (event.IsMouseEvent()) { - clone.reset(new ui::MouseEvent(static_cast<const ui::MouseEvent&>(event))); - } else if (event.IsGestureEvent()) { - // TODO(rbyers): Gesture event repost is tricky to get right - // crbug.com/170987. + aura::Window* root = window->GetRootWindow(); + ScreenPositionClient* spc = aura::client::GetScreenPositionClient(root); + if (!spc) return; - } else { - NOTREACHED(); - return; - } - clone->set_location(screen_loc); - RepostLocatedEvent(window, *clone); -} + gfx::Point root_loc(screen_loc); + spc->ConvertPointFromScreen(root, &root_loc); + ui::MouseEvent clone(static_cast<const ui::MouseEvent&>(event)); + clone.set_location(root_loc); + clone.set_root_location(root_loc); + root->GetHost()->dispatcher()->RepostEvent(clone); +} void MenuController::SetDropMenuItem( MenuItemView* new_target, diff --git a/ui/views/controls/menu/menu_message_pump_dispatcher_linux.cc b/ui/views/controls/menu/menu_message_pump_dispatcher_linux.cc deleted file mode 100644 index 0172f8b33d..0000000000 --- a/ui/views/controls/menu/menu_message_pump_dispatcher_linux.cc +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/controls/menu/menu_message_pump_dispatcher.h" - -#include "ui/events/event_utils.h" -#include "ui/events/keycodes/keyboard_code_conversion.h" -#include "ui/events/keycodes/keyboard_codes.h" -#include "ui/views/controls/menu/menu_controller.h" - -namespace views { -namespace internal { - -uint32_t MenuMessagePumpDispatcher::Dispatch(const base::NativeEvent& event) { - if (menu_controller_->exit_type() == MenuController::EXIT_ALL || - menu_controller_->exit_type() == MenuController::EXIT_DESTROYED) - return (POST_DISPATCH_QUIT_LOOP | POST_DISPATCH_PERFORM_DEFAULT); - - switch (ui::EventTypeFromNative(event)) { - case ui::ET_KEY_PRESSED: { - if (!menu_controller_->OnKeyDown(ui::KeyboardCodeFromNative(event))) - return POST_DISPATCH_QUIT_LOOP; - - // Do not check mnemonics if the Alt or Ctrl modifiers are pressed. - int flags = ui::EventFlagsFromNative(event); - if ((flags & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)) == 0) { - char c = ui::GetCharacterFromKeyCode(ui::KeyboardCodeFromNative(event), - flags); - if (menu_controller_->SelectByChar(c)) - return POST_DISPATCH_QUIT_LOOP; - } - return POST_DISPATCH_NONE; - } - case ui::ET_KEY_RELEASED: - return POST_DISPATCH_NONE; - default: - break; - } - - return POST_DISPATCH_PERFORM_DEFAULT | - (menu_controller_->exit_type() == MenuController::EXIT_NONE - ? POST_DISPATCH_NONE - : POST_DISPATCH_QUIT_LOOP); -} - -} // namespace internal -} // namespace views diff --git a/ui/views/controls/tree/tree_view.cc b/ui/views/controls/tree/tree_view.cc index bf75a65ac3..d5a3911026 100644 --- a/ui/views/controls/tree/tree_view.cc +++ b/ui/views/controls/tree/tree_view.cc @@ -79,7 +79,6 @@ TreeView::TreeView() editable_(true), controller_(NULL), root_shown_(true), - has_custom_icons_(false), row_height_(font_list_.GetHeight() + kTextVerticalPadding * 2) { SetFocusable(true); closed_icon_ = *ui::ResourceBundle::GetSharedInstance().GetImageNamed( diff --git a/ui/views/controls/tree/tree_view.h b/ui/views/controls/tree/tree_view.h index 097700a7c4..24780fc051 100644 --- a/ui/views/controls/tree/tree_view.h +++ b/ui/views/controls/tree/tree_view.h @@ -374,9 +374,6 @@ class VIEWS_EXPORT TreeView : public ui::TreeModelObserver, // Whether or not the root is shown in the tree. bool root_shown_; - // Did the model return a non-empty set of icons from GetIcons? - bool has_custom_icons_; - // Cached preferred size. gfx::Size preferred_size_; diff --git a/ui/views/controls/webview/web_dialog_view.cc b/ui/views/controls/webview/web_dialog_view.cc index a1f41c1b32..688892c3ae 100644 --- a/ui/views/controls/webview/web_dialog_view.cc +++ b/ui/views/controls/webview/web_dialog_view.cc @@ -42,7 +42,6 @@ WebDialogView::WebDialogView( WebContentsHandler* handler) : ClientView(NULL, NULL), WebDialogWebContentsDelegate(context, handler), - initialized_(false), delegate_(delegate), web_view_(new views::WebView(context)), is_attempting_close_dialog_(false), diff --git a/ui/views/controls/webview/web_dialog_view.h b/ui/views/controls/webview/web_dialog_view.h index 902aa3269b..b138abd49b 100644 --- a/ui/views/controls/webview/web_dialog_view.h +++ b/ui/views/controls/webview/web_dialog_view.h @@ -122,11 +122,6 @@ class WEBVIEW_EXPORT WebDialogView : public views::ClientView, // Initializes the contents of the dialog. void InitDialog(); - // Whether the view is initialized. That is, dialog accelerators is registered - // and FreezeUpdates property is set to prevent WM from showing the window - // until the property is removed. - bool initialized_; - // This view is a delegate to the HTML content since it needs to get notified // about when the dialog is closing. For all other actions (besides dialog // closing) we delegate to the creator of this view, which we keep track of diff --git a/ui/views/event_utils.h b/ui/views/event_utils.h deleted file mode 100644 index 03bf65b9fa..0000000000 --- a/ui/views/event_utils.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_EVENT_UTILS_H_ -#define UI_VIEWS_EVENT_UTILS_H_ - -#include "ui/gfx/native_widget_types.h" -#include "ui/views/views_export.h" - -namespace ui { -class LocatedEvent; -} - -namespace views { - -// Reposts a located event natively. Returns false when |event| could not be -// reposted. |event| should be in screen coordinates. |window| is the target -// window that the event will be forwarded to. Only some events are supported. -// On Windows |window| can be NULL, in which case the event is forwarded to -// the HWND at the current location if it is on the same thread. -VIEWS_EXPORT bool RepostLocatedEvent(gfx::NativeWindow window, - const ui::LocatedEvent& event); - -#if defined(OS_WIN) -// Reposts a located event to the HWND passed in. -VIEWS_EXPORT bool RepostLocatedEventWin(HWND window, - const ui::LocatedEvent& event); -#endif - -} // namespace views - -#endif // UI_VIEWS_EVENT_UTILS_H_ diff --git a/ui/views/event_utils_aura.cc b/ui/views/event_utils_aura.cc deleted file mode 100644 index 5e93e8e557..0000000000 --- a/ui/views/event_utils_aura.cc +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/event_utils.h" - -#include "base/logging.h" -#include "base/memory/scoped_ptr.h" -#include "ui/aura/client/screen_position_client.h" -#include "ui/aura/window_event_dispatcher.h" -#include "ui/aura/window_tree_host.h" -#include "ui/events/event.h" -#include "ui/gfx/point.h" -#include "ui/views/views_delegate.h" - -using aura::client::ScreenPositionClient; - -namespace views { - -bool RepostLocatedEvent(gfx::NativeWindow window, - const ui::LocatedEvent& event) { -#if defined(OS_WIN) - // On Windows, if the |window| parameter is NULL, then we attempt to repost - // the event to the window at the current location, if it is on the current - // thread. - HWND target_window = NULL; - if (!window) { - target_window = ::WindowFromPoint(event.location().ToPOINT()); - if (::GetWindowThreadProcessId(target_window, NULL) != - ::GetCurrentThreadId()) - return false; - } else { - if (ViewsDelegate::views_delegate && - !ViewsDelegate::views_delegate->IsWindowInMetro(window)) - target_window = window->GetHost()->GetAcceleratedWidget(); - } - return RepostLocatedEventWin(target_window, event); -#else - if (!window) - return false; - - aura::Window* root_window = window->GetRootWindow(); - - gfx::Point root_loc(event.location()); - ScreenPositionClient* spc = - aura::client::GetScreenPositionClient(root_window); - if (!spc) - return false; - - spc->ConvertPointFromScreen(root_window, &root_loc); - - scoped_ptr<ui::LocatedEvent> relocated; - if (!event.IsMouseEvent()) { - // TODO(rbyers): Gesture event repost is tricky to get right - // crbug.com/170987. - DCHECK(event.IsGestureEvent()); - return false; - } - - const ui::MouseEvent& orig = static_cast<const ui::MouseEvent&>(event); - relocated.reset(new ui::MouseEvent(orig)); - relocated->set_location(root_loc); - relocated->set_root_location(root_loc); - - root_window->GetHost()->dispatcher()->RepostEvent(*relocated); - return true; -#endif -} - -} // namespace views diff --git a/ui/views/event_utils_win.cc b/ui/views/event_utils_win.cc deleted file mode 100644 index 78cb9df791..0000000000 --- a/ui/views/event_utils_win.cc +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/event_utils.h" - -#include <windowsx.h> - -#include "base/logging.h" -#include "ui/events/event.h" -#include "ui/events/event_constants.h" -#include "ui/gfx/point.h" - -namespace views { - -bool RepostLocatedEventWin(HWND window, - const ui::LocatedEvent& event) { - if (!window) - return false; - - // Determine whether the click was in the client area or not. - // NOTE: WM_NCHITTEST coordinates are relative to the screen. - const gfx::Point screen_loc = event.location(); - LRESULT nc_hit_result = SendMessage(window, WM_NCHITTEST, 0, - MAKELPARAM(screen_loc.x(), - screen_loc.y())); - const bool in_client_area = nc_hit_result == HTCLIENT; - - // TODO(sky): this isn't right. The event to generate should correspond with - // the event we just got. MouseEvent only tells us what is down, which may - // differ. Need to add ability to get changed button from MouseEvent. - int event_type; - int flags = event.flags(); - if (flags & ui::EF_LEFT_MOUSE_BUTTON) { - event_type = in_client_area ? WM_LBUTTONDOWN : WM_NCLBUTTONDOWN; - } else if (flags & ui::EF_MIDDLE_MOUSE_BUTTON) { - event_type = in_client_area ? WM_MBUTTONDOWN : WM_NCMBUTTONDOWN; - } else if (flags & ui::EF_RIGHT_MOUSE_BUTTON) { - event_type = in_client_area ? WM_RBUTTONDOWN : WM_NCRBUTTONDOWN; - } else { - NOTREACHED(); - return false; - } - - int window_x = screen_loc.x(); - int window_y = screen_loc.y(); - if (in_client_area) { - POINT pt = {window_x, window_y}; - ScreenToClient(window, &pt); - window_x = pt.x; - window_y = pt.y; - } - - WPARAM target = in_client_area ? event.native_event().wParam : nc_hit_result; - PostMessage(window, event_type, target, MAKELPARAM(window_x, window_y)); - return true; -} - -} // namespace views diff --git a/ui/views/layout/grid_layout.cc b/ui/views/layout/grid_layout.cc index 9466c5160d..e28a1b7235 100644 --- a/ui/views/layout/grid_layout.cc +++ b/ui/views/layout/grid_layout.cc @@ -162,7 +162,6 @@ class Column : public LayoutElement { GridLayout::SizeType size_type, int fixed_width, int min_width, - size_t index, bool is_padding) : LayoutElement(resize_percent), h_align_(h_align), @@ -171,7 +170,6 @@ class Column : public LayoutElement { same_size_column_(-1), fixed_width_(fixed_width), min_width_(min_width), - index_(index), is_padding_(is_padding), master_column_(NULL) {} @@ -201,9 +199,6 @@ class Column : public LayoutElement { const int fixed_width_; const int min_width_; - // Index of this column in the ColumnSet. - const size_t index_; - const bool is_padding_; // If multiple columns have their sizes linked, one is the @@ -264,10 +259,8 @@ void Column::AdjustSize(int size) { class Row : public LayoutElement { public: - Row(bool fixed_height, int height, float resize_percent, - ColumnSet* column_set) + Row(int height, float resize_percent, ColumnSet* column_set) : LayoutElement(resize_percent), - fixed_height_(fixed_height), height_(height), column_set_(column_set), max_ascent_(0), @@ -301,7 +294,6 @@ class Row : public LayoutElement { } private: - const bool fixed_height_; const int height_; // The column set used for this row; null for padding rows. ColumnSet* column_set_; @@ -422,8 +414,7 @@ void ColumnSet::AddColumn(GridLayout::Alignment h_align, int min_width, bool is_padding) { Column* column = new Column(h_align, v_align, resize_percent, size_type, - fixed_width, min_width, columns_.size(), - is_padding); + fixed_width, min_width, is_padding); columns_.push_back(column); } @@ -718,11 +709,11 @@ void GridLayout::StartRowWithPadding(float vertical_resize, int column_set_id, void GridLayout::StartRow(float vertical_resize, int column_set_id) { ColumnSet* column_set = GetColumnSet(column_set_id); DCHECK(column_set); - AddRow(new Row(false, 0, vertical_resize, column_set)); + AddRow(new Row(0, vertical_resize, column_set)); } void GridLayout::AddPaddingRow(float vertical_resize, int pixel_count) { - AddRow(new Row(true, pixel_count, vertical_resize, NULL)); + AddRow(new Row(pixel_count, vertical_resize, NULL)); } void GridLayout::SkipColumns(int col_count) { diff --git a/ui/views/metrics_aura.cc b/ui/views/metrics_aura.cc index 03aa832f01..046baa892c 100644 --- a/ui/views/metrics_aura.cc +++ b/ui/views/metrics_aura.cc @@ -11,7 +11,6 @@ namespace { // Default double click interval in milliseconds. -// Same as what gtk uses. const int kDefaultDoubleClickInterval = 500; } // namespace diff --git a/ui/views/test/test_views_delegate.cc b/ui/views/test/test_views_delegate.cc index 47c1d66cae..d68eb3fa5c 100644 --- a/ui/views/test/test_views_delegate.cc +++ b/ui/views/test/test_views_delegate.cc @@ -4,15 +4,8 @@ #include "ui/views/test/test_views_delegate.h" -#include "base/command_line.h" -#include "base/logging.h" -#include "content/public/test/web_contents_tester.h" #include "ui/wm/core/wm_state.h" -#if !defined(OS_CHROMEOS) -#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" -#include "ui/views/widget/native_widget_aura.h" -#endif namespace views { @@ -31,50 +24,14 @@ void TestViewsDelegate::SetUseTransparentWindows(bool transparent) { use_transparent_windows_ = transparent; } -void TestViewsDelegate::SaveWindowPlacement(const Widget* window, - const std::string& window_name, - const gfx::Rect& bounds, - ui::WindowShowState show_state) { -} - -bool TestViewsDelegate::GetSavedWindowPlacement( - const Widget* window, - const std::string& window_name, - gfx::Rect* bounds, - ui:: WindowShowState* show_state) const { - return false; -} - -#if defined(OS_LINUX) && !defined(OS_CHROMEOS) -gfx::ImageSkia* TestViewsDelegate::GetDefaultWindowIcon() const { - return NULL; -} -#endif - -NonClientFrameView* TestViewsDelegate::CreateDefaultNonClientFrameView( - Widget* widget) { - return NULL; -} - -content::WebContents* TestViewsDelegate::CreateWebContents( - content::BrowserContext* browser_context, - content::SiteInstance* site_instance) { - return NULL; -} - void TestViewsDelegate::OnBeforeWidgetInit( Widget::InitParams* params, internal::NativeWidgetDelegate* delegate) { if (params->opacity == Widget::InitParams::INFER_OPACITY) { - if (use_transparent_windows_) - params->opacity = Widget::InitParams::TRANSLUCENT_WINDOW; - else - params->opacity = Widget::InitParams::OPAQUE_WINDOW; + params->opacity = use_transparent_windows_ ? + Widget::InitParams::TRANSLUCENT_WINDOW : + Widget::InitParams::OPAQUE_WINDOW; } } -base::TimeDelta TestViewsDelegate::GetDefaultTextfieldObscuredRevealDuration() { - return base::TimeDelta(); -} - } // namespace views diff --git a/ui/views/test/test_views_delegate.h b/ui/views/test/test_views_delegate.h index 3642160c16..52f11a0d14 100644 --- a/ui/views/test/test_views_delegate.h +++ b/ui/views/test/test_views_delegate.h @@ -5,24 +5,14 @@ #ifndef UI_VIEWS_TEST_TEST_VIEWS_DELEGATE_H_ #define UI_VIEWS_TEST_TEST_VIEWS_DELEGATE_H_ -#include "base/basictypes.h" -#include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" -#include "build/build_config.h" -#include "ui/accessibility/ax_enums.h" #include "ui/views/views_delegate.h" -namespace ui { -class Clipboard; -} - namespace wm { class WMState; } namespace views { -class View; -class Widget; class TestViewsDelegate : public ViewsDelegate { public: @@ -31,51 +21,13 @@ class TestViewsDelegate : public ViewsDelegate { void SetUseTransparentWindows(bool transparent); - // Overridden from ViewsDelegate: - virtual void SaveWindowPlacement(const Widget* window, - const std::string& window_name, - const gfx::Rect& bounds, - ui::WindowShowState show_state) OVERRIDE; - virtual bool GetSavedWindowPlacement( - const Widget* window, - const std::string& window_name, - gfx::Rect* bounds, - ui::WindowShowState* show_state) const OVERRIDE; - - virtual void NotifyAccessibilityEvent( - View* view, ui::AXEvent event_type) OVERRIDE {} - - virtual void NotifyMenuItemFocused(const base::string16& menu_name, - const base::string16& menu_item_name, - int item_index, - int item_count, - bool has_submenu) OVERRIDE {} -#if defined(OS_WIN) - virtual HICON GetDefaultWindowIcon() const OVERRIDE { - return NULL; - } - - virtual bool IsWindowInMetro(gfx::NativeWindow window) const { - return false; - } -#elif defined(OS_LINUX) && !defined(OS_CHROMEOS) - virtual gfx::ImageSkia* GetDefaultWindowIcon() const OVERRIDE; -#endif - virtual NonClientFrameView* CreateDefaultNonClientFrameView( - Widget* widget) OVERRIDE; - virtual void AddRef() OVERRIDE {} - virtual void ReleaseRef() OVERRIDE {} - virtual content::WebContents* CreateWebContents( - content::BrowserContext* browser_context, - content::SiteInstance* site_instance) OVERRIDE; + // ViewsDelegate: virtual void OnBeforeWidgetInit( Widget::InitParams* params, internal::NativeWidgetDelegate* delegate) OVERRIDE; - virtual base::TimeDelta GetDefaultTextfieldObscuredRevealDuration() OVERRIDE; private: bool use_transparent_windows_; - scoped_ptr<wm::WMState> wm_state_; DISALLOW_COPY_AND_ASSIGN(TestViewsDelegate); diff --git a/ui/views/view.cc b/ui/views/view.cc index 763714ed83..43b7ba964d 100644 --- a/ui/views/view.cc +++ b/ui/views/view.cc @@ -2148,6 +2148,15 @@ bool View::ProcessMousePressed(const ui::MouseEvent& event) { context_menu_controller_ : 0; View::DragInfo* drag_info = GetDragInfo(); + // TODO(sky): for debugging 360238. + int storage_id = 0; + if (event.IsOnlyRightMouseButton() && context_menu_controller && + kContextMenuOnMousePress && HitTestPoint(event.location())) { + ViewStorage* view_storage = ViewStorage::GetInstance(); + storage_id = view_storage->CreateStorageID(); + view_storage->StoreView(storage_id, this); + } + const bool enabled = enabled_; const bool result = OnMousePressed(event); @@ -2160,6 +2169,8 @@ bool View::ProcessMousePressed(const ui::MouseEvent& event) { // from mouse pressed. gfx::Point location(event.location()); if (HitTestPoint(location)) { + if (storage_id != 0) + CHECK_EQ(this, ViewStorage::GetInstance()->RetrieveView(storage_id)); ConvertPointToScreen(this, &location); ShowContextMenu(location, ui::MENU_SOURCE_MOUSE); return true; diff --git a/ui/views/view_aura.cc b/ui/views/view_aura.cc index 006f1da284..ce60963de1 100644 --- a/ui/views/view_aura.cc +++ b/ui/views/view_aura.cc @@ -7,11 +7,9 @@ namespace { // Default horizontal drag threshold in pixels. -// Same as what gtk uses. const int kDefaultHorizontalDragThreshold = 8; // Default vertical drag threshold in pixels. -// Same as what gtk uses. const int kDefaultVerticalDragThreshold = 8; } // namespace diff --git a/ui/views/views.gyp b/ui/views/views.gyp index 4f5e4e44ed..f553d25d3e 100644 --- a/ui/views/views.gyp +++ b/ui/views/views.gyp @@ -29,7 +29,7 @@ '../gfx/gfx.gyp:gfx_geometry', '../native_theme/native_theme.gyp:native_theme', '../resources/ui_resources.gyp:ui_resources', - '../wm/wm.gyp:wm_core', + '../wm/wm.gyp:wm', ], 'export_dependent_settings': [ '../accessibility/accessibility.gyp:ax_gen', @@ -232,9 +232,6 @@ 'drag_controller.h', 'drag_utils.cc', 'drag_utils.h', - 'event_utils.h', - 'event_utils_aura.cc', - 'event_utils_win.cc', 'focus/external_focus_tracker.cc', 'focus/external_focus_tracker.h', 'focus/focus_manager.cc', @@ -389,8 +386,6 @@ 'widget/widget_removals_observer.h', 'widget/window_reorderer.cc', 'widget/window_reorderer.h', - 'win/appbar.cc', - 'win/appbar.h', 'win/fullscreen_handler.cc', 'win/fullscreen_handler.h', 'win/hwnd_message_handler.cc', @@ -436,7 +431,7 @@ }], ['chromeos==0 and use_x11==1', { 'dependencies': [ - '../display/display.gyp:display', + '../display/display.gyp:display_util', ], }], ['OS=="linux" and chromeos==0', { @@ -516,7 +511,7 @@ '../events/events.gyp:events', '../gfx/gfx.gyp:gfx', '../gfx/gfx.gyp:gfx_geometry', - '../wm/wm.gyp:wm_core', + '../wm/wm.gyp:wm', 'views', ], 'include_dirs': [ @@ -572,6 +567,7 @@ '../aura/aura.gyp:aura_test_support', '../base/strings/ui_strings.gyp:ui_strings', '../base/ui_base.gyp:ui_base', + '../base/ui_base.gyp:ui_base_test_support', '../compositor/compositor.gyp:compositor', '../compositor/compositor.gyp:compositor_test_support', '../events/events.gyp:events', @@ -579,8 +575,7 @@ '../gfx/gfx.gyp:gfx_geometry', '../resources/ui_resources.gyp:ui_resources', '../resources/ui_resources.gyp:ui_test_pak', - '../ui_unittests.gyp:ui_test_support', - '../wm/wm.gyp:wm_core', + '../wm/wm.gyp:wm', 'views', 'views_test_support', ], diff --git a/ui/views/views_delegate.cc b/ui/views/views_delegate.cc index 6552dd786e..d7bd03173d 100644 --- a/ui/views/views_delegate.cc +++ b/ui/views/views_delegate.cc @@ -17,8 +17,75 @@ ViewsDelegate::~ViewsDelegate() { ui::TouchSelectionControllerFactory::SetInstance(NULL); } +void ViewsDelegate::SaveWindowPlacement(const Widget* widget, + const std::string& window_name, + const gfx::Rect& bounds, + ui::WindowShowState show_state) { +} + +bool ViewsDelegate::GetSavedWindowPlacement( + const Widget* widget, + const std::string& window_name, + gfx::Rect* bounds, + ui::WindowShowState* show_state) const { + return false; +} + +void ViewsDelegate::NotifyAccessibilityEvent(View* view, + ui::AXEvent event_type) { +} + +void ViewsDelegate::NotifyMenuItemFocused(const base::string16& menu_name, + const base::string16& menu_item_name, + int item_index, + int item_count, + bool has_submenu) { +} + +#if defined(OS_WIN) +HICON ViewsDelegate::GetDefaultWindowIcon() const { + return NULL; +} + +bool ViewsDelegate::IsWindowInMetro(gfx::NativeWindow window) const { + return false; +} +#elif defined(OS_LINUX) && !defined(OS_CHROMEOS) +gfx::ImageSkia* ViewsDelegate::GetDefaultWindowIcon() const { + return NULL; +} +#endif + +NonClientFrameView* ViewsDelegate::CreateDefaultNonClientFrameView( + Widget* widget) { + return NULL; +} + +void ViewsDelegate::AddRef() { +} + +void ViewsDelegate::ReleaseRef() { +} + +content::WebContents* ViewsDelegate::CreateWebContents( + content::BrowserContext* browser_context, + content::SiteInstance* site_instance) { + return NULL; +} + +base::TimeDelta ViewsDelegate::GetDefaultTextfieldObscuredRevealDuration() { + return base::TimeDelta(); +} + bool ViewsDelegate::WindowManagerProvidesTitleBar(bool maximized) { return false; } +#if defined(OS_WIN) +int ViewsDelegate::GetAppbarAutohideEdges(HMONITOR monitor, + const base::Closure& callback) { + return EDGE_BOTTOM; +} +#endif + } // namespace views diff --git a/ui/views/views_delegate.h b/ui/views/views_delegate.h index 4201dbb61d..8be8a0d584 100644 --- a/ui/views/views_delegate.h +++ b/ui/views/views_delegate.h @@ -52,11 +52,16 @@ class NativeWidgetDelegate; // implementation. class VIEWS_EXPORT ViewsDelegate { public: - // The active ViewsDelegate used by the views system. - static ViewsDelegate* views_delegate; +#if defined(OS_WIN) + enum AppbarAutohideEdge { + EDGE_TOP = 1 << 0, + EDGE_LEFT = 1 << 1, + EDGE_BOTTOM = 1 << 2, + EDGE_RIGHT = 1 << 3, + }; +#endif ViewsDelegate(); - virtual ~ViewsDelegate(); // Saves the position, size and "show" state for the window with the @@ -64,19 +69,16 @@ class VIEWS_EXPORT ViewsDelegate { virtual void SaveWindowPlacement(const Widget* widget, const std::string& window_name, const gfx::Rect& bounds, - ui::WindowShowState show_state) = 0; + ui::WindowShowState show_state); // Retrieves the saved position and size and "show" state for the window with // the specified name. - virtual bool GetSavedWindowPlacement( - const Widget* widget, - const std::string& window_name, - gfx::Rect* bounds, - ui::WindowShowState* show_state) const = 0; + virtual bool GetSavedWindowPlacement(const Widget* widget, + const std::string& window_name, + gfx::Rect* bounds, + ui::WindowShowState* show_state) const; - virtual void NotifyAccessibilityEvent( - View* view, - ui::AXEvent event_type) = 0; + virtual void NotifyAccessibilityEvent(View* view, ui::AXEvent event_type); // For accessibility, notify the delegate that a menu item was focused // so that alternate feedback (speech / magnified text) can be provided. @@ -84,40 +86,39 @@ class VIEWS_EXPORT ViewsDelegate { const base::string16& menu_item_name, int item_index, int item_count, - bool has_submenu) = 0; + bool has_submenu); #if defined(OS_WIN) // Retrieves the default window icon to use for windows if none is specified. - virtual HICON GetDefaultWindowIcon() const = 0; + virtual HICON GetDefaultWindowIcon() const; // Returns true if the window passed in is in the Windows 8 metro // environment. - virtual bool IsWindowInMetro(gfx::NativeWindow window) const = 0; + virtual bool IsWindowInMetro(gfx::NativeWindow window) const; #elif defined(OS_LINUX) && !defined(OS_CHROMEOS) - virtual gfx::ImageSkia* GetDefaultWindowIcon() const = 0; + virtual gfx::ImageSkia* GetDefaultWindowIcon() const; #endif // Creates a default NonClientFrameView to be used for windows that don't // specify their own. If this function returns NULL, the // views::CustomFrameView type will be used. - virtual NonClientFrameView* CreateDefaultNonClientFrameView( - Widget* widget) = 0; + virtual NonClientFrameView* CreateDefaultNonClientFrameView(Widget* widget); // AddRef/ReleaseRef are invoked while a menu is visible. They are used to // ensure we don't attempt to exit while a menu is showing. - virtual void AddRef() = 0; - virtual void ReleaseRef() = 0; + virtual void AddRef(); + virtual void ReleaseRef(); // Creates a web contents. This will return NULL unless overriden. virtual content::WebContents* CreateWebContents( content::BrowserContext* browser_context, - content::SiteInstance* site_instance) = 0; + content::SiteInstance* site_instance); // Gives the platform a chance to modify the properties of a Widget. virtual void OnBeforeWidgetInit(Widget::InitParams* params, internal::NativeWidgetDelegate* delegate) = 0; // Returns the default obscured text reveal duration. - virtual base::TimeDelta GetDefaultTextfieldObscuredRevealDuration() = 0; + virtual base::TimeDelta GetDefaultTextfieldObscuredRevealDuration(); // Returns true if the operating system's window manager will always provide a // title bar with caption buttons (ignoring the setting to @@ -125,8 +126,24 @@ class VIEWS_EXPORT ViewsDelegate { // maximized windows; otherwise to restored windows. virtual bool WindowManagerProvidesTitleBar(bool maximized); +#if defined(OS_WIN) + // Starts a query for the appbar autohide edges of the specified monitor and + // returns the current value. If the query finds the edges have changed from + // the current value, |callback| is subsequently invoked. If the edges have + // not changed, |callback| is never run. + // + // The return value is a bitmask of AppbarAutohideEdge. + virtual int GetAppbarAutohideEdges(HMONITOR monitor, + const base::Closure& callback); +#endif + + // The active ViewsDelegate used by the views system. + static ViewsDelegate* views_delegate; + private: scoped_ptr<ViewsTouchSelectionControllerFactory> views_tsc_factory_; + + DISALLOW_COPY_AND_ASSIGN(ViewsDelegate); }; } // namespace views diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc index 9dc300b263..f07140a6d1 100644 --- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc +++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc @@ -9,7 +9,6 @@ #include "base/event_types.h" #include "base/lazy_instance.h" #include "base/message_loop/message_loop.h" -#include "base/message_loop/message_pump_dispatcher.h" #include "ui/aura/window.h" #include "ui/aura/window_tree_host.h" #include "ui/base/clipboard/clipboard.h" @@ -621,12 +620,12 @@ void DesktopDragDropClientAuraX11::OnXdndDrop( void DesktopDragDropClientAuraX11::OnSelectionNotify( const XSelectionEvent& xselection) { - if (!target_current_context_) { - NOTIMPLEMENTED(); - return; - } + if (target_current_context_) + target_current_context_->OnSelectionNotify(xselection); - target_current_context_->OnSelectionNotify(xselection); + // ICCCM requires us to delete the property passed into SelectionNotify. + if (xselection.property != None) + XDeleteProperty(xdisplay_, xwindow_, xselection.property); } int DesktopDragDropClientAuraX11::StartDragAndDrop( diff --git a/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc b/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc index ec898fbc18..187aa6e612 100644 --- a/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc +++ b/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc @@ -40,7 +40,8 @@ void DesktopNativeCursorManager::SetDisplay( const gfx::Display& display, wm::NativeCursorManagerDelegate* delegate) { cursor_loader_->UnloadAll(); - cursor_loader_->set_display(display); + cursor_loader_->set_rotation(display.rotation()); + cursor_loader_->set_scale(display.device_scale_factor()); if (cursor_loader_updater_.get()) cursor_loader_updater_->OnDisplayUpdated(display, cursor_loader_.get()); diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc index 12aec9272d..914c1d24a8 100644 --- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc +++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc @@ -437,9 +437,8 @@ void DesktopNativeWidgetAura::InitNativeWidget( // handed way of accomplishing focus. // No event filter for aura::Env. Create CompoundEvnetFilter per // WindowEventDispatcher. - root_window_event_filter_ = new wm::CompoundEventFilter; - // Pass ownership of the filter to the root_window. - host_->window()->SetEventFilter(root_window_event_filter_); + root_window_event_filter_.reset(new wm::CompoundEventFilter); + host_->window()->AddPreTargetHandler(root_window_event_filter_.get()); // The host's dispatcher must be added to |native_cursor_manager_| before // OnNativeWidgetCreated() is called. diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h index 85a0a3a28e..8735ac0773 100644 --- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h +++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h @@ -83,7 +83,7 @@ class VIEWS_EXPORT DesktopNativeWidgetAura return input_method_event_filter_.get(); } wm::CompoundEventFilter* root_window_event_filter() { - return root_window_event_filter_; + return root_window_event_filter_.get(); } aura::WindowTreeHost* host() { return host_.get(); @@ -280,7 +280,7 @@ class VIEWS_EXPORT DesktopNativeWidgetAura scoped_ptr<FocusManagerEventHandler> focus_manager_event_handler_; // Toplevel event filter which dispatches to other event filters. - wm::CompoundEventFilter* root_window_event_filter_; + scoped_ptr<wm::CompoundEventFilter> root_window_event_filter_; scoped_ptr<wm::InputMethodEventFilter> input_method_event_filter_; diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11.cc b/ui/views/widget/desktop_aura/desktop_screen_x11.cc index 0e6858bd08..99ca833d9a 100644 --- a/ui/views/widget/desktop_aura/desktop_screen_x11.cc +++ b/ui/views/widget/desktop_aura/desktop_screen_x11.cc @@ -16,8 +16,8 @@ #include "ui/aura/window_event_dispatcher.h" #include "ui/aura/window_tree_host.h" #include "ui/base/layout.h" -#include "ui/display/display_util.h" -#include "ui/display/x11/edid_parser_x11.h" +#include "ui/display/util/display_util.h" +#include "ui/display/util/x11/edid_parser_x11.h" #include "ui/events/platform/platform_event_source.h" #include "ui/gfx/display.h" #include "ui/gfx/display_observer.h" @@ -141,7 +141,9 @@ DesktopScreenX11::DesktopScreenX11() ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); XRRSelectInput(xdisplay_, x_root_window_, - RRScreenChangeNotifyMask | RROutputChangeNotifyMask); + RRScreenChangeNotifyMask | + RROutputChangeNotifyMask | + RRCrtcChangeNotifyMask); displays_ = BuildDisplaysFromXRandRInfo(); } else { diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc b/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc index d0c0a8631c..b0f4c81939 100644 --- a/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc +++ b/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc @@ -8,9 +8,12 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/aura/client/aura_constants.h" +#include "ui/aura/test/event_generator.h" #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/aura/window_tree_host.h" +#include "ui/base/hit_test.h" #include "ui/base/x/x11_util.h" #include "ui/events/platform/platform_event_dispatcher.h" #include "ui/events/platform/platform_event_source.h" @@ -21,6 +24,34 @@ #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" #include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" +namespace { + +// Class which allows for the designation of non-client component targets of +// hit tests. +class TestDesktopNativeWidgetAura : public views::DesktopNativeWidgetAura { + public: + explicit TestDesktopNativeWidgetAura( + views::internal::NativeWidgetDelegate* delegate) + : views::DesktopNativeWidgetAura(delegate) {} + virtual ~TestDesktopNativeWidgetAura() {} + + void set_window_component(int window_component) { + window_component_ = window_component; + } + + // DesktopNativeWidgetAura: + virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE { + return window_component_; + } + + private: + int window_component_; + + DISALLOW_COPY_AND_ASSIGN(TestDesktopNativeWidgetAura); +}; + +} // namespace + namespace views { const int64 kFirstDisplay = 5321829; @@ -125,12 +156,18 @@ class DesktopScreenX11Test : public views::ViewsTestBase, removed_display_.clear(); } - Widget* BuildTopLevelDesktopWidget(const gfx::Rect& bounds) { + Widget* BuildTopLevelDesktopWidget(const gfx::Rect& bounds, + bool use_test_native_widget) { Widget* toplevel = new Widget; Widget::InitParams toplevel_params = CreateParams(Widget::InitParams::TYPE_WINDOW); - toplevel_params.native_widget = - new views::DesktopNativeWidgetAura(toplevel); + if (use_test_native_widget) { + toplevel_params.native_widget = + new TestDesktopNativeWidgetAura(toplevel); + } else { + toplevel_params.native_widget = + new views::DesktopNativeWidgetAura(toplevel); + } toplevel_params.bounds = bounds; toplevel_params.remove_standard_frame = true; toplevel->Init(toplevel_params); @@ -275,10 +312,12 @@ TEST_F(DesktopScreenX11Test, GetPrimaryDisplay) { } TEST_F(DesktopScreenX11Test, GetWindowAtScreenPoint) { - Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(110, 110, 10, 10)); - Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(150, 150, 10, 10)); + Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(110, 110, 10, 10), + false); + Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(150, 150, 10, 10), + false); Widget* window_three = - BuildTopLevelDesktopWidget(gfx::Rect(115, 115, 20, 20)); + BuildTopLevelDesktopWidget(gfx::Rect(115, 115, 20, 20), false); window_three->Show(); window_two->Show(); @@ -317,8 +356,10 @@ TEST_F(DesktopScreenX11Test, GetDisplayNearestWindow) { gfx::Rect(640, 0, 1024, 768))); screen()->ProcessDisplayChange(displays); - Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(10, 10, 10, 10)); - Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(650, 50, 10, 10)); + Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(10, 10, 10, 10), + false); + Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(650, 50, 10, 10), + false); EXPECT_EQ( kFirstDisplay, @@ -331,4 +372,87 @@ TEST_F(DesktopScreenX11Test, GetDisplayNearestWindow) { window_two->CloseNow(); } +// Tests that the window is maximized in response to a double click event. +TEST_F(DesktopScreenX11Test, DoubleClickHeaderMaximizes) { + Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); + widget->Show(); + TestDesktopNativeWidgetAura* native_widget = + static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); + native_widget->set_window_component(HTCAPTION); + + aura::Window* window = widget->GetNativeWindow(); + window->SetProperty(aura::client::kCanMaximizeKey, true); + + // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized + DesktopWindowTreeHost* rwh = + DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> + GetAcceleratedWidget()); + + aura::test::EventGenerator generator(window); + generator.ClickLeftButton(); + generator.DoubleClickLeftButton(); + RunPendingMessages(); + EXPECT_TRUE(rwh->IsMaximized()); + + widget->CloseNow(); +} + +// Tests that the window does not maximize in response to a double click event, +// if the first click was to a different target component than that of the +// second click. +TEST_F(DesktopScreenX11Test, DoubleClickTwoDifferentTargetsDoesntMaximizes) { + Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); + widget->Show(); + TestDesktopNativeWidgetAura* native_widget = + static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); + + aura::Window* window = widget->GetNativeWindow(); + window->SetProperty(aura::client::kCanMaximizeKey, true); + + // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized + DesktopWindowTreeHost* rwh = + DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> + GetAcceleratedWidget()); + + aura::test::EventGenerator generator(window); + native_widget->set_window_component(HTCLIENT); + generator.ClickLeftButton(); + native_widget->set_window_component(HTCAPTION); + generator.DoubleClickLeftButton(); + RunPendingMessages(); + EXPECT_FALSE(rwh->IsMaximized()); + + widget->CloseNow(); +} + +// Tests that the window does not maximize in response to a double click event, +// if the double click was interrupted by a right click. +TEST_F(DesktopScreenX11Test, RightClickDuringDoubleClickDoesntMaximize) { + Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); + widget->Show(); + TestDesktopNativeWidgetAura* native_widget = + static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); + + aura::Window* window = widget->GetNativeWindow(); + window->SetProperty(aura::client::kCanMaximizeKey, true); + + // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized + DesktopWindowTreeHost* rwh = static_cast<DesktopWindowTreeHost*>( + DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> + GetAcceleratedWidget())); + + aura::test::EventGenerator generator(window); + native_widget->set_window_component(HTCLIENT); + generator.ClickLeftButton(); + native_widget->set_window_component(HTCAPTION); + generator.PressRightButton(); + generator.ReleaseRightButton(); + EXPECT_FALSE(rwh->IsMaximized()); + generator.DoubleClickLeftButton(); + RunPendingMessages(); + EXPECT_FALSE(rwh->IsMaximized()); + + widget->CloseNow(); +} + } // namespace views diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc index 221d1843af..efd24b6b76 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc @@ -34,6 +34,7 @@ #include "ui/gfx/insets.h" #include "ui/gfx/path.h" #include "ui/gfx/path_x11.h" +#include "ui/gfx/screen.h" #include "ui/native_theme/native_theme.h" #include "ui/views/corewm/tooltip_aura.h" #include "ui/views/ime/input_method.h" @@ -342,8 +343,9 @@ void DesktopWindowTreeHostX11::ShowWindowWithState( void DesktopWindowTreeHostX11::ShowMaximizedWithBounds( const gfx::Rect& restored_bounds) { - restored_bounds_ = restored_bounds; ShowWindowWithState(ui::SHOW_STATE_MAXIMIZED); + // Enforce |restored_bounds_| since calling Maximize() could have reset it. + restored_bounds_ = restored_bounds; } bool DesktopWindowTreeHostX11::IsVisible() const { @@ -484,9 +486,9 @@ bool DesktopWindowTreeHostX11::IsActive() const { } void DesktopWindowTreeHostX11::Maximize() { - // When we're the process requesting the maximizing, we can accurately keep - // track of our restored bounds instead of relying on the heuristics that are - // in the PropertyNotify and ConfigureNotify handlers. + // When we are in the process of requesting to maximize a window, we can + // accurately keep track of our restored bounds instead of relying on the + // heuristics that are in the PropertyNotify and ConfigureNotify handlers. restored_bounds_ = bounds_; SetWMSpecState(true, @@ -614,10 +616,27 @@ NonClientFrameView* DesktopWindowTreeHostX11::CreateNonClientFrameView() { } void DesktopWindowTreeHostX11::SetFullscreen(bool fullscreen) { + if (is_fullscreen_ == fullscreen) + return; is_fullscreen_ = fullscreen; SetWMSpecState(fullscreen, atom_cache_.GetAtom("_NET_WM_STATE_FULLSCREEN"), None); + // Try to guess the size we will have after the switch to/from fullscreen: + // - (may) avoid transient states + // - works around Flash content which expects to have the size updated + // synchronously. + // See https://crbug.com/361408 + if (fullscreen) { + restored_bounds_ = bounds_; + const gfx::Display display = + gfx::Screen::GetScreenFor(NULL)->GetDisplayNearestWindow(window()); + bounds_ = display.bounds(); + } else { + bounds_ = restored_bounds_; + } + OnHostMoved(bounds_.origin()); + OnHostResized(bounds_.size()); } bool DesktopWindowTreeHostX11::IsFullscreen() const { @@ -1316,8 +1335,6 @@ uint32_t DesktopWindowTreeHostX11::DispatchEvent( switch (xev->type) { case EnterNotify: case LeaveNotify: { - if (!g_current_capture) - X11DesktopHandler::get()->ProcessXEvent(xev); ui::MouseEvent mouse_event(xev); DispatchMouseEvent(&mouse_event); break; @@ -1365,6 +1382,7 @@ uint32_t DesktopWindowTreeHostX11::DispatchEvent( if (xev->xfocus.mode != NotifyGrab) { ReleaseCapture(); OnHostLostWindowCapture(); + X11DesktopHandler::get()->ProcessXEvent(xev); } else { dispatcher()->OnHostLostMouseGrab(); } diff --git a/ui/views/widget/desktop_aura/x11_desktop_handler.cc b/ui/views/widget/desktop_aura/x11_desktop_handler.cc index 170b5f790c..0d764e4f87 100644 --- a/ui/views/widget/desktop_aura/x11_desktop_handler.cc +++ b/ui/views/widget/desktop_aura/x11_desktop_handler.cc @@ -104,21 +104,14 @@ bool X11DesktopHandler::IsActiveWindow(::Window window) const { void X11DesktopHandler::ProcessXEvent(XEvent* event) { switch (event->type) { - case EnterNotify: - if (event->xcrossing.focus == True && - current_window_ != event->xcrossing.window) - OnActiveWindowChanged(event->xcrossing.window); - break; - case LeaveNotify: - if (event->xcrossing.focus == False && - current_window_ == event->xcrossing.window) - OnActiveWindowChanged(None); - break; case FocusIn: - if (event->xfocus.mode == NotifyNormal && - current_window_ != event->xfocus.window) + if (current_window_ != event->xfocus.window) OnActiveWindowChanged(event->xfocus.window); break; + case FocusOut: + if (current_window_ == event->xfocus.window) + OnActiveWindowChanged(None); + break; default: NOTREACHED(); } diff --git a/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc b/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc index 250b9de849..e465174db8 100644 --- a/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc +++ b/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc @@ -131,6 +131,8 @@ uint32_t X11WholeScreenMoveLoop::DispatchEvent(const ui::PlatformEvent& event) { bool X11WholeScreenMoveLoop::RunMoveLoop(aura::Window* source, gfx::NativeCursor cursor) { + DCHECK(!in_move_loop_); // Can only handle one nested loop at a time. + // Start a capture on the host, so that it continues to receive events during // the drag. This may be second time we are capturing the mouse events - the // first being when a mouse is first pressed. That first capture needs to be @@ -140,23 +142,21 @@ bool X11WholeScreenMoveLoop::RunMoveLoop(aura::Window* source, { ScopedCapturer capturer(source->GetHost()); - DCHECK(!in_move_loop_); // Can only handle one nested loop at a time. - in_move_loop_ = true; - - XDisplay* display = gfx::GetXDisplay(); - - grab_input_window_ = CreateDragInputWindow(display); - if (!drag_image_.isNull() && CheckIfIconValid()) - CreateDragImageWindow(); - ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); + grab_input_window_ = CreateDragInputWindow(gfx::GetXDisplay()); // Releasing ScopedCapturer ensures that any other instance of // X11ScopedCapture will not prematurely release grab that will be acquired // below. } // TODO(varkha): Consider integrating GrabPointerAndKeyboard with // ScopedCapturer to avoid possibility of logically keeping multiple grabs. - if (!GrabPointerAndKeyboard(cursor)) + if (!GrabPointerAndKeyboard(cursor)) { + XDestroyWindow(gfx::GetXDisplay(), grab_input_window_); return false; + } + + ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); + if (!drag_image_.isNull() && CheckIfIconValid()) + CreateDragImageWindow(); // We are handling a mouse drag outside of the aura::RootWindow system. We // must manually make aura think that the mouse button is pressed so that we @@ -167,6 +167,7 @@ bool X11WholeScreenMoveLoop::RunMoveLoop(aura::Window* source, should_reset_mouse_flags_ = true; } + in_move_loop_ = true; canceled_ = false; base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); base::MessageLoop::ScopedNestableTaskAllower allow_nested(loop); diff --git a/ui/views/widget/desktop_aura/x11_window_event_filter.cc b/ui/views/widget/desktop_aura/x11_window_event_filter.cc index d6fbfc0fbd..887bb979e0 100644 --- a/ui/views/widget/desktop_aura/x11_window_event_filter.cc +++ b/ui/views/widget/desktop_aura/x11_window_event_filter.cc @@ -68,7 +68,8 @@ X11WindowEventFilter::X11WindowEventFilter( x_root_window_(DefaultRootWindow(xdisplay_)), atom_cache_(xdisplay_, kAtomsToCache), window_tree_host_(window_tree_host), - is_active_(false) { + is_active_(false), + click_component_(HTNOWHERE) { } X11WindowEventFilter::~X11WindowEventFilter() { @@ -102,8 +103,13 @@ void X11WindowEventFilter::OnMouseEvent(ui::MouseEvent* event) { if (!target->delegate()) return; + int previous_click_component = HTNOWHERE; int component = target->delegate()->GetNonClientComponent(event->location()); + if (event->IsLeftMouseButton()) { + previous_click_component = click_component_; + click_component_ = component; + } if (component == HTCLIENT) return; @@ -134,15 +140,18 @@ void X11WindowEventFilter::OnMouseEvent(ui::MouseEvent* event) { } // Left button case. - if (event->flags() & ui::EF_IS_DOUBLE_CLICK && - component == HTCAPTION && - target->GetProperty(aura::client::kCanMaximizeKey)) { - // Our event is a double click in the caption area in a window that can be - // maximized. We are responsible for dispatching this as a minimize/ - // maximize on X11 (Windows converts this to min/max events for us). - ToggleMaximizedState(); - event->SetHandled(); - return; + if (event->flags() & ui::EF_IS_DOUBLE_CLICK) { + click_component_ = HTNOWHERE; + if (component == HTCAPTION && + target->GetProperty(aura::client::kCanMaximizeKey) && + previous_click_component == component) { + // Our event is a double click in the caption area in a window that can be + // maximized. We are responsible for dispatching this as a minimize/ + // maximize on X11 (Windows converts this to min/max events for us). + ToggleMaximizedState(); + event->SetHandled(); + return; + } } // Get the |x_root_window_| location out of the native event. diff --git a/ui/views/widget/desktop_aura/x11_window_event_filter.h b/ui/views/widget/desktop_aura/x11_window_event_filter.h index 47bc69fc91..5c7e72229b 100644 --- a/ui/views/widget/desktop_aura/x11_window_event_filter.h +++ b/ui/views/widget/desktop_aura/x11_window_event_filter.h @@ -60,6 +60,13 @@ class VIEWS_EXPORT X11WindowEventFilter : public ui::EventHandler { // True if |xwindow_| is the current _NET_ACTIVE_WINDOW. bool is_active_; + // The non-client component for the target of a MouseEvent. Mouse events can + // be destructive to the window tree, which can cause the component of a + // ui::EF_IS_DOUBLE_CLICK event to no longer be the same as that of the + // initial click. Acting on a double click should only occur for matching + // components. + int click_component_; + DISALLOW_COPY_AND_ASSIGN(X11WindowEventFilter); }; diff --git a/ui/views/widget/monitor_win.cc b/ui/views/widget/monitor_win.cc index 2c6d830447..1220671beb 100644 --- a/ui/views/widget/monitor_win.cc +++ b/ui/views/widget/monitor_win.cc @@ -4,10 +4,9 @@ #include "ui/views/widget/monitor_win.h" -#include <shellapi.h> +#include <windows.h> #include "base/logging.h" -#include "base/win/win_util.h" #include "ui/gfx/rect.h" namespace views { @@ -16,8 +15,7 @@ gfx::Rect GetMonitorBoundsForRect(const gfx::Rect& rect) { RECT p_rect = rect.ToRECT(); HMONITOR monitor = MonitorFromRect(&p_rect, MONITOR_DEFAULTTONEAREST); if (monitor) { - MONITORINFO mi = {0}; - mi.cbSize = sizeof(mi); + MONITORINFO mi = { sizeof(MONITORINFO) }; GetMonitorInfo(monitor, &mi); return gfx::Rect(mi.rcWork); } @@ -25,15 +23,4 @@ gfx::Rect GetMonitorBoundsForRect(const gfx::Rect& rect) { return gfx::Rect(); } -HWND GetTopmostAutoHideTaskbarForEdge(UINT edge, HMONITOR monitor) { - // NOTE: this may be invoked on a background thread. - APPBARDATA taskbar_data = { sizeof(APPBARDATA), NULL, 0, edge }; - HWND taskbar = reinterpret_cast<HWND>(SHAppBarMessage(ABM_GETAUTOHIDEBAR, - &taskbar_data)); - return (::IsWindow(taskbar) && (monitor != NULL) && - (MonitorFromWindow(taskbar, MONITOR_DEFAULTTONULL) == monitor) && - (GetWindowLong(taskbar, GWL_EXSTYLE) & WS_EX_TOPMOST)) ? - taskbar : NULL; -} - } // namespace views diff --git a/ui/views/widget/monitor_win.h b/ui/views/widget/monitor_win.h index 87bdc4e00c..ef4d3dde61 100644 --- a/ui/views/widget/monitor_win.h +++ b/ui/views/widget/monitor_win.h @@ -5,8 +5,6 @@ #ifndef UI_VIEWS_WIDGET_MONITOR_WIN_H_ #define UI_VIEWS_WIDGET_MONITOR_WIN_H_ -#include <windows.h> - #include "ui/views/views_export.h" namespace gfx { @@ -19,14 +17,6 @@ namespace views { // intersection with the specified rectangle. VIEWS_EXPORT gfx::Rect GetMonitorBoundsForRect(const gfx::Rect& rect); -// Returns the always-on-top auto-hiding taskbar for edge |edge| (one of -// ABE_LEFT, TOP, RIGHT, or BOTTOM) of monitor |monitor|. NULL is returned -// if nothing is found. -// -// WARNING: this function spawns a nested message loop. Use Appbar instead if -// possible. -VIEWS_EXPORT HWND GetTopmostAutoHideTaskbarForEdge(UINT edge, HMONITOR monitor); - } // namespace views #endif // UI_VIEWS_WIDGET_MONITOR_WIN_H_ diff --git a/ui/views/win/appbar.cc b/ui/views/win/appbar.cc deleted file mode 100644 index 92151d4775..0000000000 --- a/ui/views/win/appbar.cc +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/views/win/appbar.h" - -#include <shellapi.h> - -#include "base/auto_reset.h" -#include "base/bind.h" -#include "base/location.h" -#include "base/threading/worker_pool.h" -#include "base/win/scoped_com_initializer.h" -#include "ui/views/widget/monitor_win.h" - -namespace views { - -namespace { - -void GetEdgesOnWorkerThread(HMONITOR monitor, int* edge) { - base::win::ScopedCOMInitializer com_initializer; - *edge = 0; - if (GetTopmostAutoHideTaskbarForEdge(ABE_LEFT, monitor)) - *edge = Appbar::EDGE_LEFT; - if (GetTopmostAutoHideTaskbarForEdge(ABE_TOP, monitor)) - *edge = Appbar::EDGE_TOP; - if (GetTopmostAutoHideTaskbarForEdge(ABE_RIGHT, monitor)) - *edge = Appbar::EDGE_RIGHT; - if (GetTopmostAutoHideTaskbarForEdge(ABE_BOTTOM, monitor)) - *edge = Appbar::EDGE_BOTTOM; -} - -} - -// static -Appbar* Appbar::instance() { - static Appbar* appbar = NULL; - if (!appbar) - appbar = new Appbar(); - return appbar; -} - -int Appbar::GetAutohideEdges(HMONITOR monitor, const base::Closure& callback) { - // Initialize the map with EDGE_BOTTOM. This is important, as if we return an - // initial value of 0 (no auto-hide edges) then we'll go fullscreen and - // windows will automatically remove WS_EX_TOPMOST from the appbar resulting - // in us thinking there is no auto-hide edges. By returning at least one edge - // we don't initially go fullscreen until we figure out the real auto-hide - // edges. - if (edge_map_.find(monitor) == edge_map_.end()) - edge_map_[monitor] = Appbar::EDGE_BOTTOM; - if (!in_callback_) { - int* edge = new int; - base::WorkerPool::PostTaskAndReply( - FROM_HERE, - base::Bind(&GetEdgesOnWorkerThread, - monitor, - base::Unretained(edge)), - base::Bind(&Appbar::OnGotEdges, - weak_factory_.GetWeakPtr(), - callback, - monitor, - edge_map_[monitor], - base::Owned(edge)), - false); - } - return edge_map_[monitor]; -} - -Appbar::Appbar() : weak_factory_(this), in_callback_(false) { -} - -Appbar::~Appbar() { -} - -void Appbar::OnGotEdges(const base::Closure& callback, - HMONITOR monitor, - int returned_edges, - int* edges) { - edge_map_[monitor] = *edges; - if (returned_edges == *edges) - return; - - base::AutoReset<bool> in_callback_setter(&in_callback_, true); - callback.Run(); -} - -} // namespace views diff --git a/ui/views/win/appbar.h b/ui/views/win/appbar.h deleted file mode 100644 index 4c24c19254..0000000000 --- a/ui/views/win/appbar.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_VIEWS_WIN_APPBAR_H_ -#define UI_VIEWS_WIN_APPBAR_H_ - -#include <map> - -#include <windows.h> - -#include "base/basictypes.h" -#include "base/callback_forward.h" -#include "base/memory/weak_ptr.h" - -namespace views { - -// Appbar provides an API to query for the edges of the monitor that have an -// autohide bar. -// NOTE: querying is done on a separate thread as it spawns a nested message -// loop. The nested message loop is particularly problematic here as it's -// possible for the nested message loop to run during window creation and -// startup time (WM_NCCALCSIZE is called at creation time). -class Appbar { - public: - enum Edge { - EDGE_TOP = 1 << 0, - EDGE_LEFT = 1 << 1, - EDGE_BOTTOM = 1 << 2, - EDGE_RIGHT = 1 << 3, - }; - - // Returns the singleton instance. - static Appbar* instance(); - - // Starts a query for the autohide edges of the specified monitor and returns - // the current value. If the edges have changed |callback| is subsequently - // invoked. If the edges have not changed |callback| is never run. - // - // Return value is a bitmask of Edges. - int GetAutohideEdges(HMONITOR monitor, const base::Closure& callback); - - private: - typedef std::map<HMONITOR, int> EdgeMap; - - Appbar(); - ~Appbar(); - - // Callback on main thread with the edges. |returned_edges| is the value that - // was returned from the call to GetAutohideEdges() that initiated the lookup. - void OnGotEdges(const base::Closure& callback, - HMONITOR monitor, - int returned_edges, - int* edges); - - EdgeMap edge_map_; - - base::WeakPtrFactory<Appbar> weak_factory_; - - // If true we're in the process of notifying a callback. When true we do not - // start a new query. - bool in_callback_; - - DISALLOW_COPY_AND_ASSIGN(Appbar); -}; - -} // namespace views - -#endif // UI_VIEWS_WIN_APPBAR_H_ - diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index a647d207b2..e2c9a132da 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc @@ -38,7 +38,6 @@ #include "ui/views/views_delegate.h" #include "ui/views/widget/monitor_win.h" #include "ui/views/widget/widget_hwnd_utils.h" -#include "ui/views/win/appbar.h" #include "ui/views/win/fullscreen_handler.h" #include "ui/views/win/hwnd_message_handler_delegate.h" #include "ui/views/win/scoped_fullscreen_visibility.h" @@ -971,10 +970,12 @@ LRESULT HWNDMessageHandler::HandleNcHitTestMessage(unsigned int message, int HWNDMessageHandler::GetAppbarAutohideEdges(HMONITOR monitor) { autohide_factory_.InvalidateWeakPtrs(); - return Appbar::instance()->GetAutohideEdges( - monitor, - base::Bind(&HWNDMessageHandler::OnAppbarAutohideEdgesChanged, - autohide_factory_.GetWeakPtr())); + return ViewsDelegate::views_delegate ? + ViewsDelegate::views_delegate->GetAppbarAutohideEdges( + monitor, + base::Bind(&HWNDMessageHandler::OnAppbarAutohideEdgesChanged, + autohide_factory_.GetWeakPtr())) : + ViewsDelegate::EDGE_BOTTOM; } void HWNDMessageHandler::OnAppbarAutohideEdgesChanged() { @@ -1089,7 +1090,8 @@ bool HWNDMessageHandler::GetClientAreaInsets(gfx::Insets* insets) const { if (IsMaximized()) { // Windows automatically adds a standard width border to all sides when a // window is maximized. - int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME); + int border_thickness = + GetSystemMetrics(SM_CXSIZEFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER); if (remove_standard_frame_) border_thickness -= 1; *insets = gfx::Insets( @@ -1667,9 +1669,9 @@ LRESULT HWNDMessageHandler::OnNCCalcSize(BOOL mode, LPARAM l_param) { } } const int autohide_edges = GetAppbarAutohideEdges(monitor); - if (autohide_edges & Appbar::EDGE_LEFT) + if (autohide_edges & ViewsDelegate::EDGE_LEFT) client_rect->left += kAutoHideTaskbarThicknessPx; - if (autohide_edges & Appbar::EDGE_TOP) { + if (autohide_edges & ViewsDelegate::EDGE_TOP) { if (!delegate_->IsUsingCustomFrame()) { // Tricky bit. Due to a bug in DwmDefWindowProc()'s handling of // WM_NCHITTEST, having any nonclient area atop the window causes the @@ -1685,9 +1687,9 @@ LRESULT HWNDMessageHandler::OnNCCalcSize(BOOL mode, LPARAM l_param) { client_rect->top += kAutoHideTaskbarThicknessPx; } } - if (autohide_edges & Appbar::EDGE_RIGHT) + if (autohide_edges & ViewsDelegate::EDGE_RIGHT) client_rect->right -= kAutoHideTaskbarThicknessPx; - if (autohide_edges & Appbar::EDGE_BOTTOM) + if (autohide_edges & ViewsDelegate::EDGE_BOTTOM) client_rect->bottom -= kAutoHideTaskbarThicknessPx; // We cannot return WVR_REDRAW when there is nonclient area, or Windows @@ -1757,8 +1759,10 @@ LRESULT HWNDMessageHandler::OnNCHitTest(const gfx::Point& point) { // the vertical scrollar down arrow would be drawn. // We check if the hittest coordinates lie in this region and if yes // we return HTCLIENT. - int border_width = ::GetSystemMetrics(SM_CXSIZEFRAME); - int border_height = ::GetSystemMetrics(SM_CYSIZEFRAME); + int border_width = ::GetSystemMetrics(SM_CXSIZEFRAME) + + GetSystemMetrics(SM_CXPADDEDBORDER); + int border_height = ::GetSystemMetrics(SM_CYSIZEFRAME) + + GetSystemMetrics(SM_CXPADDEDBORDER); int scroll_width = ::GetSystemMetrics(SM_CXVSCROLL); int scroll_height = ::GetSystemMetrics(SM_CYVSCROLL); RECT window_rect; @@ -2221,7 +2225,8 @@ void HWNDMessageHandler::OnWindowPosChanging(WINDOWPOS* window_pos) { new_window_rect = monitor_rect; } else if (IsMaximized()) { new_window_rect = work_area; - int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME); + int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME) + + GetSystemMetrics(SM_CXPADDEDBORDER); new_window_rect.Inset(-border_thickness, -border_thickness); } else { new_window_rect = gfx::Rect(window_rect); diff --git a/ui/views/win/hwnd_message_handler.h b/ui/views/win/hwnd_message_handler.h index 9b29b1df71..f4fc19a220 100644 --- a/ui/views/win/hwnd_message_handler.h +++ b/ui/views/win/hwnd_message_handler.h @@ -229,11 +229,13 @@ class VIEWS_EXPORT HWNDMessageHandler : WPARAM w_param, LPARAM l_param) OVERRIDE; - // Returns the auto-hide edges of the appbar. See Appbar::GetAutohideEdges() - // for details. If the edges change OnAppbarAutohideEdgesChanged() is called. + // Returns the auto-hide edges of the appbar. See + // ViewsDelegate::GetAppbarAutohideEdges() for details. If the edges change, + // OnAppbarAutohideEdgesChanged() is called. int GetAppbarAutohideEdges(HMONITOR monitor); - // Callback if the autohide edges have changed. See Appbar for details. + // Callback if the autohide edges have changed. See + // ViewsDelegate::GetAppbarAutohideEdges() for details. void OnAppbarAutohideEdgesChanged(); // Can be called after the delegate has had the opportunity to set focus and diff --git a/ui/webui/resources/js/cr/ui/list.js b/ui/webui/resources/js/cr/ui/list.js index 1dc38b6dc2..3f1d1a84f3 100644 --- a/ui/webui/resources/js/cr/ui/list.js +++ b/ui/webui/resources/js/cr/ui/list.js @@ -631,6 +631,7 @@ cr.define('cr.ui', function() { } } this.cachedItems_ = newCachedItems; + this.pinnedItem_ = null; var newCachedItemHeights = {}; for (var index in this.cachedItemHeights_) { diff --git a/ui/wm/core/base_focus_rules.h b/ui/wm/core/base_focus_rules.h index 7195dad1e7..07dfb65fbc 100644 --- a/ui/wm/core/base_focus_rules.h +++ b/ui/wm/core/base_focus_rules.h @@ -13,7 +13,7 @@ namespace wm { // A set of basic focus and activation rules. Specializations should most likely // subclass this and call up to these methods rather than reimplementing them. -class WM_CORE_EXPORT BaseFocusRules : public FocusRules { +class WM_EXPORT BaseFocusRules : public FocusRules { protected: BaseFocusRules(); virtual ~BaseFocusRules(); diff --git a/ui/wm/core/capture_controller.h b/ui/wm/core/capture_controller.h index a368b63cca..d8028183e2 100644 --- a/ui/wm/core/capture_controller.h +++ b/ui/wm/core/capture_controller.h @@ -11,12 +11,12 @@ #include "base/compiler_specific.h" #include "ui/aura/client/capture_client.h" #include "ui/aura/window_observer.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace wm { // Internal CaptureClient implementation. See ScopedCaptureClient for details. -class WM_CORE_EXPORT CaptureController : public aura::client::CaptureClient { +class WM_EXPORT CaptureController : public aura::client::CaptureClient { public: // Adds |root| to the list of RootWindows notified when capture changes. void Attach(aura::Window* root); @@ -53,7 +53,7 @@ class WM_CORE_EXPORT CaptureController : public aura::client::CaptureClient { // ScopedCaptureClient is responsible for creating a CaptureClient for a // RootWindow. Specifically it creates a single CaptureController that is shared // among all ScopedCaptureClients and adds the RootWindow to it. -class WM_CORE_EXPORT ScopedCaptureClient : public aura::WindowObserver { +class WM_EXPORT ScopedCaptureClient : public aura::WindowObserver { public: explicit ScopedCaptureClient(aura::Window* root); virtual ~ScopedCaptureClient(); diff --git a/ui/wm/core/compound_event_filter.cc b/ui/wm/core/compound_event_filter.cc index 21270e3561..d1f652c02f 100644 --- a/ui/wm/core/compound_event_filter.cc +++ b/ui/wm/core/compound_event_filter.cc @@ -30,8 +30,7 @@ namespace { bool ShouldHideCursorOnTouch(const ui::TouchEvent& event) { #if defined(OS_WIN) return true; -#endif // defind(OS_WIN) -#if defined(OS_CHROMEOS) +#elif defined(OS_CHROMEOS) #if defined(USE_X11) int device_id = event.source_device_id(); if (device_id >= 0 && diff --git a/ui/wm/core/compound_event_filter.h b/ui/wm/core/compound_event_filter.h index 4b726730f6..ab4fdf83d0 100644 --- a/ui/wm/core/compound_event_filter.h +++ b/ui/wm/core/compound_event_filter.h @@ -10,7 +10,7 @@ #include "ui/events/event.h" #include "ui/events/event_handler.h" #include "ui/gfx/native_widget_types.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace aura { class CursorManager; @@ -37,7 +37,7 @@ namespace wm { // consumed by any of those filters. If an event is consumed by a filter, the // rest of the filter(s) and CompoundEventFilter will not see the consumed // event. -class WM_CORE_EXPORT CompoundEventFilter : public ui::EventHandler { +class WM_EXPORT CompoundEventFilter : public ui::EventHandler { public: CompoundEventFilter(); virtual ~CompoundEventFilter(); diff --git a/ui/wm/core/cursor_manager.h b/ui/wm/core/cursor_manager.h index 0fe25f76ca..f60ef14174 100644 --- a/ui/wm/core/cursor_manager.h +++ b/ui/wm/core/cursor_manager.h @@ -14,7 +14,7 @@ #include "ui/gfx/native_widget_types.h" #include "ui/gfx/point.h" #include "ui/wm/core/native_cursor_manager_delegate.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace gfx { class Display; @@ -36,8 +36,8 @@ class NativeCursorManager; // requests to queue any further changes until a later time. It sends changes // to the NativeCursorManager, which communicates back to us when these changes // were made through the NativeCursorManagerDelegate interface. -class WM_CORE_EXPORT CursorManager : public aura::client::CursorClient, - public NativeCursorManagerDelegate { +class WM_EXPORT CursorManager : public aura::client::CursorClient, + public NativeCursorManagerDelegate { public: explicit CursorManager(scoped_ptr<NativeCursorManager> delegate); virtual ~CursorManager(); diff --git a/ui/wm/core/easy_resize_window_targeter.h b/ui/wm/core/easy_resize_window_targeter.h index fae6d4680c..90b0848fc0 100644 --- a/ui/wm/core/easy_resize_window_targeter.h +++ b/ui/wm/core/easy_resize_window_targeter.h @@ -7,13 +7,13 @@ #include "ui/aura/window_targeter.h" #include "ui/gfx/geometry/insets.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace wm { // An EventTargeter for a container window that uses a slightly larger // hit-target region for easier resize. -class WM_CORE_EXPORT EasyResizeWindowTargeter : public aura::WindowTargeter { +class WM_EXPORT EasyResizeWindowTargeter : public aura::WindowTargeter { public: // |container| window is the owner of this targeter. EasyResizeWindowTargeter(aura::Window* container, diff --git a/ui/wm/core/focus_controller.h b/ui/wm/core/focus_controller.h index fecdd2e329..3366ea0c18 100644 --- a/ui/wm/core/focus_controller.h +++ b/ui/wm/core/focus_controller.h @@ -12,8 +12,8 @@ #include "ui/aura/client/focus_client.h" #include "ui/aura/window_observer.h" #include "ui/events/event_handler.h" -#include "ui/wm/core/wm_core_export.h" #include "ui/wm/public/activation_client.h" +#include "ui/wm/wm_export.h" namespace wm { @@ -34,10 +34,10 @@ class FocusRules; // . Window disposition changes (implemented here in aura::WindowObserver). // (The FocusController registers itself as an observer of the active and // focused windows). -class WM_CORE_EXPORT FocusController : public aura::client::ActivationClient, - public aura::client::FocusClient, - public ui::EventHandler, - public aura::WindowObserver { +class WM_EXPORT FocusController : public aura::client::ActivationClient, + public aura::client::FocusClient, + public ui::EventHandler, + public aura::WindowObserver { public: // |rules| cannot be NULL. explicit FocusController(FocusRules* rules); diff --git a/ui/wm/core/focus_rules.h b/ui/wm/core/focus_rules.h index 79ffd74422..cb9a4ddbd8 100644 --- a/ui/wm/core/focus_rules.h +++ b/ui/wm/core/focus_rules.h @@ -5,7 +5,7 @@ #ifndef UI_WM_CORE_FOCUS_RULES_H_ #define UI_WM_CORE_FOCUS_RULES_H_ -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace aura { class Window; @@ -15,7 +15,7 @@ namespace wm { // Implemented by an object that establishes the rules about what can be // focused or activated. -class WM_CORE_EXPORT FocusRules { +class WM_EXPORT FocusRules { public: virtual ~FocusRules() {} diff --git a/ui/wm/core/image_grid.h b/ui/wm/core/image_grid.h index 49ac642987..bee1e46745 100644 --- a/ui/wm/core/image_grid.h +++ b/ui/wm/core/image_grid.h @@ -12,7 +12,7 @@ #include "ui/compositor/layer_delegate.h" #include "ui/gfx/rect.h" #include "ui/gfx/size.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace gfx { class Image; @@ -56,10 +56,10 @@ namespace wm { // | xXX| // ... // -class WM_CORE_EXPORT ImageGrid { +class WM_EXPORT ImageGrid { public: // Helper class for use by tests. - class WM_CORE_EXPORT TestAPI { + class WM_EXPORT TestAPI { public: TestAPI(ImageGrid* grid) : grid_(grid) {} diff --git a/ui/wm/core/input_method_event_filter.h b/ui/wm/core/input_method_event_filter.h index 17a6a0e814..c4033d1268 100644 --- a/ui/wm/core/input_method_event_filter.h +++ b/ui/wm/core/input_method_event_filter.h @@ -11,7 +11,7 @@ #include "ui/base/ime/input_method_delegate.h" #include "ui/events/event_handler.h" #include "ui/gfx/native_widget_types.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace ui { class EventProcessor; @@ -22,7 +22,7 @@ namespace wm { // An event filter that forwards a KeyEvent to a system IME, and dispatches a // TranslatedKeyEvent to the root window as needed. -class WM_CORE_EXPORT InputMethodEventFilter +class WM_EXPORT InputMethodEventFilter : public ui::EventHandler, public ui::internal::InputMethodDelegate { public: diff --git a/ui/wm/core/input_method_event_filter_unittest.cc b/ui/wm/core/input_method_event_filter_unittest.cc index 038ec00993..6fc1b393fb 100644 --- a/ui/wm/core/input_method_event_filter_unittest.cc +++ b/ui/wm/core/input_method_event_filter_unittest.cc @@ -27,35 +27,36 @@ namespace wm { typedef aura::test::AuraTestBase InputMethodEventFilterTest; TEST_F(InputMethodEventFilterTest, TestInputMethodProperty) { - CompoundEventFilter* root_filter = new CompoundEventFilter; - root_window()->SetEventFilter(root_filter); + CompoundEventFilter root_filter; + root_window()->AddPreTargetHandler(&root_filter); InputMethodEventFilter input_method_event_filter( host()->GetAcceleratedWidget()); - root_filter->AddHandler(&input_method_event_filter); + root_filter.AddHandler(&input_method_event_filter); // Tests if InputMethodEventFilter adds a window property on its // construction. EXPECT_TRUE(root_window()->GetProperty( aura::client::kRootWindowInputMethodKey)); - root_filter->RemoveHandler(&input_method_event_filter); + root_filter.RemoveHandler(&input_method_event_filter); + root_window()->RemovePreTargetHandler(&root_filter); } // Tests if InputMethodEventFilter dispatches a ui::ET_TRANSLATED_KEY_* event to // the root window. TEST_F(InputMethodEventFilterTest, TestInputMethodKeyEventPropagation) { - CompoundEventFilter* root_filter = new CompoundEventFilter; - root_window()->SetEventFilter(root_filter); + CompoundEventFilter root_filter; + root_window()->AddPreTargetHandler(&root_filter); // Add the InputMethodEventFilter before the TestEventFilter. InputMethodEventFilter input_method_event_filter( host()->GetAcceleratedWidget()); - root_filter->AddHandler(&input_method_event_filter); + root_filter.AddHandler(&input_method_event_filter); // Add TestEventFilter to the RootWindow. ui::test::TestEventHandler test_filter; - root_filter->AddHandler(&test_filter); + root_filter.AddHandler(&test_filter); // We need an active window. Otherwise, the root window will not forward a key // event to event filters. @@ -79,11 +80,12 @@ TEST_F(InputMethodEventFilterTest, TestInputMethodKeyEventPropagation) { generator.ReleaseKey(ui::VKEY_SPACE, 0); EXPECT_EQ(2, test_filter.num_key_events()); - root_filter->RemoveHandler(&input_method_event_filter); - root_filter->RemoveHandler(&test_filter); + root_filter.RemoveHandler(&input_method_event_filter); + root_filter.RemoveHandler(&test_filter); // Reset window before |test_delegate| gets deleted. window.reset(); + root_window()->RemovePreTargetHandler(&root_filter); } } // namespace wm diff --git a/ui/wm/core/masked_window_targeter.h b/ui/wm/core/masked_window_targeter.h index 846021a6ba..46cf4d272d 100644 --- a/ui/wm/core/masked_window_targeter.h +++ b/ui/wm/core/masked_window_targeter.h @@ -6,7 +6,7 @@ #define UI_WM_CORE_MASKED_WINDOW_TARGETER_H_ #include "ui/aura/window_targeter.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace gfx { class Path; @@ -14,7 +14,7 @@ class Path; namespace wm { -class WM_CORE_EXPORT MaskedWindowTargeter : public aura::WindowTargeter { +class WM_EXPORT MaskedWindowTargeter : public aura::WindowTargeter { public: explicit MaskedWindowTargeter(aura::Window* masked_window); virtual ~MaskedWindowTargeter(); diff --git a/ui/wm/core/native_cursor_manager.h b/ui/wm/core/native_cursor_manager.h index 669772889b..c1da74d569 100644 --- a/ui/wm/core/native_cursor_manager.h +++ b/ui/wm/core/native_cursor_manager.h @@ -7,7 +7,7 @@ #include "base/strings/string16.h" #include "ui/wm/core/native_cursor_manager_delegate.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace gfx { class Display; @@ -19,7 +19,7 @@ namespace wm { // requested changes to cursor state. When requested, implementer should tell // the CursorManager of any actual state changes performed through the // delegate. -class WM_CORE_EXPORT NativeCursorManager { +class WM_EXPORT NativeCursorManager { public: virtual ~NativeCursorManager() {} diff --git a/ui/wm/core/native_cursor_manager_delegate.h b/ui/wm/core/native_cursor_manager_delegate.h index aad982561a..1393b2cd4b 100644 --- a/ui/wm/core/native_cursor_manager_delegate.h +++ b/ui/wm/core/native_cursor_manager_delegate.h @@ -7,14 +7,14 @@ #include "ui/base/cursor/cursor.h" #include "ui/gfx/native_widget_types.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace wm { // The non-public interface that CursorManager exposes to its users. This // gives accessors to all the current state, and mutators to all the current // state. -class WM_CORE_EXPORT NativeCursorManagerDelegate { +class WM_EXPORT NativeCursorManagerDelegate { public: virtual ~NativeCursorManagerDelegate() {} diff --git a/ui/wm/core/shadow.h b/ui/wm/core/shadow.h index fa42976858..c153ecf158 100644 --- a/ui/wm/core/shadow.h +++ b/ui/wm/core/shadow.h @@ -9,7 +9,7 @@ #include "base/memory/scoped_ptr.h" #include "ui/compositor/layer_animation_observer.h" #include "ui/gfx/rect.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace ui { class Layer; @@ -20,7 +20,7 @@ namespace wm { class ImageGrid; // Simple class that draws a drop shadow around content at given bounds. -class WM_CORE_EXPORT Shadow : public ui::ImplicitAnimationObserver { +class WM_EXPORT Shadow : public ui::ImplicitAnimationObserver { public: enum Style { // Active windows have more opaque shadows, shifted down to make the window diff --git a/ui/wm/core/shadow_controller.h b/ui/wm/core/shadow_controller.h index 47aa7435dc..c84689453f 100644 --- a/ui/wm/core/shadow_controller.h +++ b/ui/wm/core/shadow_controller.h @@ -10,8 +10,8 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" -#include "ui/wm/core/wm_core_export.h" #include "ui/wm/public/activation_change_observer.h" +#include "ui/wm/wm_export.h" namespace aura { class Window; @@ -31,10 +31,10 @@ class Shadow; // shadows as needed. ShadowController itself is light weight and per // ActivationClient. ShadowController delegates to its implementation class, // which observes all window creation. -class WM_CORE_EXPORT ShadowController : +class WM_EXPORT ShadowController : public aura::client::ActivationChangeObserver { public: - class WM_CORE_EXPORT TestApi { + class WM_EXPORT TestApi { public: explicit TestApi(ShadowController* controller) : controller_(controller) {} ~TestApi() {} diff --git a/ui/wm/core/shadow_types.h b/ui/wm/core/shadow_types.h index 49c92fd88d..1198a43b16 100644 --- a/ui/wm/core/shadow_types.h +++ b/ui/wm/core/shadow_types.h @@ -6,7 +6,7 @@ #define UI_WM_CORE_SHADOW_TYPES_H_ #include "ui/aura/window.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace aura { class Window; @@ -22,8 +22,8 @@ enum ShadowType { SHADOW_TYPE_RECTANGULAR, }; -WM_CORE_EXPORT void SetShadowType(aura::Window* window, ShadowType shadow_type); -WM_CORE_EXPORT ShadowType GetShadowType(aura::Window* window); +WM_EXPORT void SetShadowType(aura::Window* window, ShadowType shadow_type); +WM_EXPORT ShadowType GetShadowType(aura::Window* window); // A property key describing the drop shadow that should be displayed under the // window. If unset, no shadow is displayed. diff --git a/ui/wm/core/transient_window_controller.h b/ui/wm/core/transient_window_controller.h index 125cd28f80..8638824ae3 100644 --- a/ui/wm/core/transient_window_controller.h +++ b/ui/wm/core/transient_window_controller.h @@ -5,14 +5,14 @@ #ifndef UI_WM_CORE_TRANSIENT_WINDOW_CONTROLLER_H_ #define UI_WM_CORE_TRANSIENT_WINDOW_CONTROLLER_H_ -#include "ui/wm/core/wm_core_export.h" #include "ui/wm/public/transient_window_client.h" +#include "ui/wm/wm_export.h" namespace wm { // TransientWindowClient implementation. Uses TransientWindowManager to handle // tracking transient per window. -class WM_CORE_EXPORT TransientWindowController +class WM_EXPORT TransientWindowController : public aura::client::TransientWindowClient { public: TransientWindowController(); diff --git a/ui/wm/core/transient_window_manager.h b/ui/wm/core/transient_window_manager.h index 350bb1a294..7d37679f92 100644 --- a/ui/wm/core/transient_window_manager.h +++ b/ui/wm/core/transient_window_manager.h @@ -9,7 +9,7 @@ #include "base/observer_list.h" #include "ui/aura/window_observer.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace wm { @@ -26,7 +26,7 @@ class TransientWindowObserver; // Transient windows are typically used for popups and menus. // TODO(sky): when we nuke TransientWindowClient rename this to // TransientWindowController. -class WM_CORE_EXPORT TransientWindowManager : public aura::WindowObserver { +class WM_EXPORT TransientWindowManager : public aura::WindowObserver { public: typedef std::vector<aura::Window*> Windows; diff --git a/ui/wm/core/transient_window_observer.h b/ui/wm/core/transient_window_observer.h index 6a7a2e2ffe..aff5af5e2e 100644 --- a/ui/wm/core/transient_window_observer.h +++ b/ui/wm/core/transient_window_observer.h @@ -5,7 +5,7 @@ #ifndef UI_WM_CORE_TRANSIENT_WINDOW_OBSERVER_H_ #define UI_WM_CORE_TRANSIENT_WINDOW_OBSERVER_H_ -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace aura { class Window; @@ -13,7 +13,7 @@ class Window; namespace wm { -class WM_CORE_EXPORT TransientWindowObserver { +class WM_EXPORT TransientWindowObserver { public: // Called when a transient child is added to |window|. virtual void OnTransientChildAdded(aura::Window* window, diff --git a/ui/wm/core/transient_window_stacking_client.h b/ui/wm/core/transient_window_stacking_client.h index 5641a2241c..4ab4aea174 100644 --- a/ui/wm/core/transient_window_stacking_client.h +++ b/ui/wm/core/transient_window_stacking_client.h @@ -6,13 +6,13 @@ #define UI_WM_CORE_TRANSIENT_WINDOW_STACKING_CLIENT_H_ #include "ui/aura/client/window_stacking_client.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace wm { class TransientWindowManager; -class WM_CORE_EXPORT TransientWindowStackingClient +class WM_EXPORT TransientWindowStackingClient : public aura::client::WindowStackingClient { public: TransientWindowStackingClient(); diff --git a/ui/wm/core/user_activity_detector.h b/ui/wm/core/user_activity_detector.h index 6a94db146c..851f07ac32 100644 --- a/ui/wm/core/user_activity_detector.h +++ b/ui/wm/core/user_activity_detector.h @@ -10,14 +10,14 @@ #include "base/observer_list.h" #include "base/time/time.h" #include "ui/events/event_handler.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace wm { class UserActivityObserver; // Watches for input events and notifies observers that the user is active. -class WM_CORE_EXPORT UserActivityDetector : public ui::EventHandler { +class WM_EXPORT UserActivityDetector : public ui::EventHandler { public: // Minimum amount of time between notifications to observers. static const int kNotifyIntervalMs; diff --git a/ui/wm/core/user_activity_observer.h b/ui/wm/core/user_activity_observer.h index 2c3b8877c8..0fb35a61f0 100644 --- a/ui/wm/core/user_activity_observer.h +++ b/ui/wm/core/user_activity_observer.h @@ -6,7 +6,7 @@ #define UI_WM_CORE_USER_ACTIVITY_OBSERVER_H_ #include "base/basictypes.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace ui { class Event; @@ -16,7 +16,7 @@ namespace wm { // Interface for classes that want to be notified about user activity. // Implementations should register themselves with UserActivityDetector. -class WM_CORE_EXPORT UserActivityObserver { +class WM_EXPORT UserActivityObserver { public: // Invoked periodically while the user is active (i.e. generating input // events). |event| is the event that triggered the notification; it may diff --git a/ui/wm/core/visibility_controller.h b/ui/wm/core/visibility_controller.h index 912e9748fd..47ae9910c7 100644 --- a/ui/wm/core/visibility_controller.h +++ b/ui/wm/core/visibility_controller.h @@ -8,11 +8,11 @@ #include "base/compiler_specific.h" #include "base/logging.h" #include "ui/aura/client/visibility_client.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace wm { -class WM_CORE_EXPORT VisibilityController +class WM_EXPORT VisibilityController : public aura::client::VisibilityClient { public: VisibilityController(); @@ -47,7 +47,7 @@ class WM_CORE_EXPORT VisibilityController // // previous state. // } // -class WM_CORE_EXPORT SuspendChildWindowVisibilityAnimations { +class WM_EXPORT SuspendChildWindowVisibilityAnimations { public: // Suspend visibility animations of child windows. explicit SuspendChildWindowVisibilityAnimations(aura::Window* window); @@ -66,7 +66,7 @@ class WM_CORE_EXPORT SuspendChildWindowVisibilityAnimations { }; // Tells |window| to animate visibility changes to its children. -void WM_CORE_EXPORT SetChildWindowVisibilityChangesAnimated( +void WM_EXPORT SetChildWindowVisibilityChangesAnimated( aura::Window* window); } // namespace wm diff --git a/ui/wm/core/window_animations.cc b/ui/wm/core/window_animations.cc index 42439e37ea..bea416f8dd 100644 --- a/ui/wm/core/window_animations.cc +++ b/ui/wm/core/window_animations.cc @@ -41,7 +41,7 @@ DECLARE_WINDOW_PROPERTY_TYPE(int) DECLARE_WINDOW_PROPERTY_TYPE(wm::WindowVisibilityAnimationType) DECLARE_WINDOW_PROPERTY_TYPE(wm::WindowVisibilityAnimationTransition) DECLARE_WINDOW_PROPERTY_TYPE(float) -DECLARE_EXPORTED_WINDOW_PROPERTY_TYPE(WM_CORE_EXPORT, bool) +DECLARE_EXPORTED_WINDOW_PROPERTY_TYPE(WM_EXPORT, bool) namespace wm { namespace { diff --git a/ui/wm/core/window_animations.h b/ui/wm/core/window_animations.h index b2ab4defb6..1c55d4990e 100644 --- a/ui/wm/core/window_animations.h +++ b/ui/wm/core/window_animations.h @@ -8,7 +8,7 @@ #include <vector> #include "ui/compositor/scoped_layer_animation_settings.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace aura { class Window; @@ -58,26 +58,25 @@ enum WindowVisibilityAnimationTransition { // These two methods use int for type rather than WindowVisibilityAnimationType // since downstream libraries can extend the set of animations. -WM_CORE_EXPORT void SetWindowVisibilityAnimationType(aura::Window* window, - int type); -WM_CORE_EXPORT int GetWindowVisibilityAnimationType(aura::Window* window); +WM_EXPORT void SetWindowVisibilityAnimationType(aura::Window* window, int type); +WM_EXPORT int GetWindowVisibilityAnimationType(aura::Window* window); -WM_CORE_EXPORT void SetWindowVisibilityAnimationTransition( +WM_EXPORT void SetWindowVisibilityAnimationTransition( aura::Window* window, WindowVisibilityAnimationTransition transition); -WM_CORE_EXPORT bool HasWindowVisibilityAnimationTransition( +WM_EXPORT bool HasWindowVisibilityAnimationTransition( aura::Window* window, WindowVisibilityAnimationTransition transition); -WM_CORE_EXPORT void SetWindowVisibilityAnimationDuration( +WM_EXPORT void SetWindowVisibilityAnimationDuration( aura::Window* window, const base::TimeDelta& duration); -WM_CORE_EXPORT base::TimeDelta GetWindowVisibilityAnimationDuration( +WM_EXPORT base::TimeDelta GetWindowVisibilityAnimationDuration( const aura::Window& window); -WM_CORE_EXPORT void SetWindowVisibilityAnimationVerticalPosition( +WM_EXPORT void SetWindowVisibilityAnimationVerticalPosition( aura::Window* window, float position); @@ -86,7 +85,7 @@ class HidingWindowAnimationObserver; // Use this to ensure that the hiding animation is visible even after // the window is deleted or deactivated, instead of using // ui::ScopedLayerAnimationSettings directly. -class WM_CORE_EXPORT ScopedHidingAnimationSettings { +class WM_EXPORT ScopedHidingAnimationSettings { public: explicit ScopedHidingAnimationSettings(aura::Window* window); ~ScopedHidingAnimationSettings(); @@ -104,15 +103,14 @@ class WM_CORE_EXPORT ScopedHidingAnimationSettings { }; // Returns false if the |window| didn't animate. -WM_CORE_EXPORT bool AnimateOnChildWindowVisibilityChanged(aura::Window* window, - bool visible); -WM_CORE_EXPORT bool AnimateWindow(aura::Window* window, - WindowAnimationType type); +WM_EXPORT bool AnimateOnChildWindowVisibilityChanged(aura::Window* window, + bool visible); +WM_EXPORT bool AnimateWindow(aura::Window* window, WindowAnimationType type); // Returns true if window animations are disabled for |window|. Window // animations are enabled by default. If |window| is NULL, this just checks // if the global flag disabling window animations is present. -WM_CORE_EXPORT bool WindowAnimationsDisabled(aura::Window* window); +WM_EXPORT bool WindowAnimationsDisabled(aura::Window* window); } // namespace wm diff --git a/ui/wm/core/window_modality_controller.h b/ui/wm/core/window_modality_controller.h index d098d57fdc..4d52c2190b 100644 --- a/ui/wm/core/window_modality_controller.h +++ b/ui/wm/core/window_modality_controller.h @@ -11,7 +11,7 @@ #include "ui/aura/env_observer.h" #include "ui/aura/window_observer.h" #include "ui/events/event_handler.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace ui { class EventTarget; @@ -21,18 +21,18 @@ class LocatedEvent; namespace wm { // Sets the modal parent for the child. -WM_CORE_EXPORT void SetModalParent(aura::Window* child, aura::Window* parent); +WM_EXPORT void SetModalParent(aura::Window* child, aura::Window* parent); // Returns the modal transient child of |window|, or NULL if |window| does not // have any modal transient children. -WM_CORE_EXPORT aura::Window* GetModalTransient(aura::Window* window); +WM_EXPORT aura::Window* GetModalTransient(aura::Window* window); // WindowModalityController is an event filter that consumes events sent to // windows that are the transient parents of window-modal windows. This filter // must be added to the CompoundEventFilter so that activation works properly. -class WM_CORE_EXPORT WindowModalityController : public ui::EventHandler, - public aura::EnvObserver, - public aura::WindowObserver { +class WM_EXPORT WindowModalityController : public ui::EventHandler, + public aura::EnvObserver, + public aura::WindowObserver { public: explicit WindowModalityController(ui::EventTarget* event_target); virtual ~WindowModalityController(); diff --git a/ui/wm/core/window_util.h b/ui/wm/core/window_util.h index 81989f9706..78f2ffbf11 100644 --- a/ui/wm/core/window_util.h +++ b/ui/wm/core/window_util.h @@ -10,7 +10,7 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace aura { class Window; @@ -24,18 +24,18 @@ class LayerTreeOwner; namespace wm { -WM_CORE_EXPORT void ActivateWindow(aura::Window* window); -WM_CORE_EXPORT void DeactivateWindow(aura::Window* window); -WM_CORE_EXPORT bool IsActiveWindow(aura::Window* window); -WM_CORE_EXPORT bool CanActivateWindow(aura::Window* window); +WM_EXPORT void ActivateWindow(aura::Window* window); +WM_EXPORT void DeactivateWindow(aura::Window* window); +WM_EXPORT bool IsActiveWindow(aura::Window* window); +WM_EXPORT bool CanActivateWindow(aura::Window* window); // Retrieves the activatable window for |window|. The ActivationClient makes // this determination. -WM_CORE_EXPORT aura::Window* GetActivatableWindow(aura::Window* window); +WM_EXPORT aura::Window* GetActivatableWindow(aura::Window* window); // Retrieves the toplevel window for |window|. The ActivationClient makes this // determination. -WM_CORE_EXPORT aura::Window* GetToplevelWindow(aura::Window* window); +WM_EXPORT aura::Window* GetToplevelWindow(aura::Window* window); // Returns the existing Layer for |root| (and all its descendants) and creates // a new layer for |root| and all its descendants. This is intended for @@ -43,26 +43,24 @@ WM_CORE_EXPORT aura::Window* GetToplevelWindow(aura::Window* window); // // As a result of this |root| has freshly created layers, meaning the layers // have not yet been painted to. -WM_CORE_EXPORT scoped_ptr<ui::LayerTreeOwner> RecreateLayers( +WM_EXPORT scoped_ptr<ui::LayerTreeOwner> RecreateLayers( ui::LayerOwner* root); // Convenience functions that get the TransientWindowManager for the window and // redirect appropriately. These are preferable to calling functions on // TransientWindowManager as they handle the appropriate NULL checks. -WM_CORE_EXPORT aura::Window* GetTransientParent(aura::Window* window); -WM_CORE_EXPORT const aura::Window* GetTransientParent( +WM_EXPORT aura::Window* GetTransientParent(aura::Window* window); +WM_EXPORT const aura::Window* GetTransientParent( const aura::Window* window); -WM_CORE_EXPORT const std::vector<aura::Window*>& GetTransientChildren( +WM_EXPORT const std::vector<aura::Window*>& GetTransientChildren( const aura::Window* window); -WM_CORE_EXPORT void AddTransientChild(aura::Window* parent, - aura::Window* child); -WM_CORE_EXPORT void RemoveTransientChild(aura::Window* parent, - aura::Window* child); +WM_EXPORT void AddTransientChild(aura::Window* parent, aura::Window* child); +WM_EXPORT void RemoveTransientChild(aura::Window* parent, aura::Window* child); // Returns true if |window| has |ancestor| as a transient ancestor. A transient // ancestor is found by following the transient parent chain of the window. -WM_CORE_EXPORT bool HasTransientAncestor(const aura::Window* window, - const aura::Window* ancestor); +WM_EXPORT bool HasTransientAncestor(const aura::Window* window, + const aura::Window* ancestor); } // namespace wm diff --git a/ui/wm/core/wm_core_export.h b/ui/wm/core/wm_core_export.h deleted file mode 100644 index 2056ccc568..0000000000 --- a/ui/wm/core/wm_core_export.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_WM_CORE_WM_CORE_EXPORT_H_ -#define UI_WM_CORE_WM_CORE_EXPORT_H_ - -// Defines WM_CORE_EXPORT so that functionality implemented by the Views module -// can be exported to consumers. - -#if defined(COMPONENT_BUILD) -#if defined(WIN32) - -#if defined(WM_CORE_IMPLEMENTATION) -#define WM_CORE_EXPORT __declspec(dllexport) -#else -#define WM_CORE_EXPORT __declspec(dllimport) -#endif // defined(WM_CORE_IMPLEMENTATION) - -#else // defined(WIN32) -#if defined(WM_CORE_IMPLEMENTATION) -#define WM_CORE_EXPORT __attribute__((visibility("default"))) -#else -#define WM_CORE_EXPORT -#endif -#endif - -#else // defined(COMPONENT_BUILD) -#define WM_CORE_EXPORT -#endif - -#endif // UI_WM_CORE_WM_CORE_EXPORT_H_ diff --git a/ui/wm/core/wm_core_switches.h b/ui/wm/core/wm_core_switches.h index dd480256ee..05658d6abb 100644 --- a/ui/wm/core/wm_core_switches.h +++ b/ui/wm/core/wm_core_switches.h @@ -6,7 +6,7 @@ #define UI_WM_CORE_WM_CORE_SWITCHES_H_ #include "build/build_config.h" -#include "ui/wm/core/wm_core_export.h" +#include "ui/wm/wm_export.h" namespace wm { namespace switches { @@ -16,7 +16,7 @@ namespace switches { // see chromeos::LoginUtil::GetOffTheRecordCommandLine().) // Please keep alphabetized. -WM_CORE_EXPORT extern const char kWindowAnimationsDisabled[]; +WM_EXPORT extern const char kWindowAnimationsDisabled[]; } // namespace switches } // namespace wm diff --git a/ui/wm/core/wm_state.cc b/ui/wm/core/wm_state.cc index 991940e732..6d58086339 100644 --- a/ui/wm/core/wm_state.cc +++ b/ui/wm/core/wm_state.cc @@ -15,8 +15,6 @@ WMState::WMState() transient_window_client_(new TransientWindowController) { aura::client::SetWindowStackingClient(window_stacking_client_.get()); aura::client::SetTransientWindowClient(transient_window_client_.get()); - if (!ui::PlatformEventSource::GetInstance()) - event_source_ = ui::PlatformEventSource::CreateDefault(); } WMState::~WMState() { diff --git a/ui/wm/core/wm_state.h b/ui/wm/core/wm_state.h index dff17a69ec..289c9dac5b 100644 --- a/ui/wm/core/wm_state.h +++ b/ui/wm/core/wm_state.h @@ -6,11 +6,7 @@ #define UI_WM_CORE_WM_STATE_H_ #include "base/memory/scoped_ptr.h" -#include "ui/wm/core/wm_core_export.h" - -namespace ui { -class PlatformEventSource; -} +#include "ui/wm/wm_export.h" namespace wm { @@ -18,7 +14,7 @@ class TransientWindowController; class TransientWindowStackingClient; // Installs state needed by the window manager. -class WM_CORE_EXPORT WMState { +class WM_EXPORT WMState { public: WMState(); ~WMState(); @@ -27,7 +23,6 @@ class WM_CORE_EXPORT WMState { private: scoped_ptr<TransientWindowStackingClient> window_stacking_client_; scoped_ptr<TransientWindowController> transient_window_client_; - scoped_ptr<ui::PlatformEventSource> event_source_; DISALLOW_COPY_AND_ASSIGN(WMState); }; diff --git a/ui/wm/test/wm_test_helper.cc b/ui/wm/test/wm_test_helper.cc index dddb7af1c7..1982be5c6d 100644 --- a/ui/wm/test/wm_test_helper.cc +++ b/ui/wm/test/wm_test_helper.cc @@ -9,7 +9,6 @@ #include "ui/aura/env.h" #include "ui/aura/test/test_focus_client.h" #include "ui/aura/window.h" -#include "ui/events/platform/platform_event_source.h" #include "ui/wm/core/compound_event_filter.h" #include "ui/wm/core/input_method_event_filter.h" @@ -17,7 +16,6 @@ namespace wm { WMTestHelper::WMTestHelper(const gfx::Size& default_window_size) { aura::Env::CreateInstance(); - event_source_ = ui::PlatformEventSource::CreateDefault(); host_.reset(aura::WindowTreeHost::Create(gfx::Rect(default_window_size))); host_->InitHost(); aura::client::SetWindowTreeClient(host_->window(), this); @@ -25,9 +23,8 @@ WMTestHelper::WMTestHelper(const gfx::Size& default_window_size) { focus_client_.reset(new aura::test::TestFocusClient); aura::client::SetFocusClient(host_->window(), focus_client_.get()); - root_window_event_filter_ = new wm::CompoundEventFilter; - // Pass ownership of the filter to the root_window. - host_->window()->SetEventFilter(root_window_event_filter_); + root_window_event_filter_.reset(new wm::CompoundEventFilter); + host_->window()->AddPreTargetHandler(root_window_event_filter_.get()); input_method_filter_.reset(new wm::InputMethodEventFilter( host_->GetAcceleratedWidget())); diff --git a/ui/wm/test/wm_test_helper.h b/ui/wm/test/wm_test_helper.h index 1bde9f33f7..1a3dd0964a 100644 --- a/ui/wm/test/wm_test_helper.h +++ b/ui/wm/test/wm_test_helper.h @@ -25,10 +25,6 @@ class Rect; class Size; } -namespace ui { -class PlatformEventSource; -} - namespace wm { class CompoundEventFilter; @@ -52,14 +48,11 @@ class WMTestHelper : public aura::client::WindowTreeClient { private: scoped_ptr<aura::WindowTreeHost> host_; - // Owned by the root Window. - wm::CompoundEventFilter* root_window_event_filter_; - + scoped_ptr<wm::CompoundEventFilter> root_window_event_filter_; scoped_ptr<aura::client::DefaultCaptureClient> capture_client_; scoped_ptr<wm::InputMethodEventFilter> input_method_filter_; scoped_ptr<aura::client::DefaultActivationClient> activation_client_; scoped_ptr<aura::client::FocusClient> focus_client_; - scoped_ptr<ui::PlatformEventSource> event_source_; DISALLOW_COPY_AND_ASSIGN(WMTestHelper); }; diff --git a/ui/wm/wm.gyp b/ui/wm/wm.gyp index 5d124b1cef..17ceaa361a 100644 --- a/ui/wm/wm.gyp +++ b/ui/wm/wm.gyp @@ -8,19 +8,7 @@ }, 'targets': [ { - 'target_name': 'wm_public', - 'type': 'static_library', - 'dependencies': [ - '../../skia/skia.gyp:skia', - '../aura/aura.gyp:aura', - '../gfx/gfx.gyp:gfx_geometry', - ], - 'sources': [ - 'public/window_types.h', - ], - }, - { - 'target_name': 'wm_core', + 'target_name': 'wm', 'type': '<(component)', 'dependencies': [ '../../base/base.gyp:base', @@ -35,7 +23,7 @@ '../base/ui_base.gyp:ui_base', ], 'defines': [ - 'WM_CORE_IMPLEMENTATION', + 'WM_IMPLEMENTATION', ], 'sources': [ 'core/base_focus_rules.cc', @@ -83,11 +71,12 @@ 'core/window_modality_controller.h', 'core/window_util.cc', 'core/window_util.h', - 'core/wm_core_export.h', 'core/wm_core_switches.cc', 'core/wm_core_switches.h', 'core/wm_state.cc', 'core/wm_state.h', + 'public/window_types.h', + 'wm_export.h', ], }, { @@ -105,7 +94,7 @@ ], }, { - 'target_name': 'wm_core_unittests', + 'target_name': 'wm_unittests', 'type': 'executable', 'dependencies': [ '../../base/base.gyp:base', @@ -120,7 +109,7 @@ '../gfx/gfx.gyp:gfx_geometry', '../gfx/gfx.gyp:gfx', '../base/ui_base.gyp:ui_base', - 'wm_core', + 'wm', 'wm_test_support', ], 'sources': [ diff --git a/ui/wm/wm_export.h b/ui/wm/wm_export.h new file mode 100644 index 0000000000..461d6934ad --- /dev/null +++ b/ui/wm/wm_export.h @@ -0,0 +1,32 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_WM_WM_EXPORT_H_ +#define UI_WM_WM_EXPORT_H_ + +// Defines WM_EXPORT so that functionality implemented by the WM module +// can be exported to consumers. + +#if defined(COMPONENT_BUILD) +#if defined(WIN32) + +#if defined(WM_IMPLEMENTATION) +#define WM_EXPORT __declspec(dllexport) +#else +#define WM_EXPORT __declspec(dllimport) +#endif // defined(WM_IMPLEMENTATION) + +#else // defined(WIN32) +#if defined(WM_IMPLEMENTATION) +#define WM_EXPORT __attribute__((visibility("default"))) +#else +#define WM_EXPORT +#endif +#endif + +#else // defined(COMPONENT_BUILD) +#define WM_EXPORT +#endif + +#endif // UI_WM_WM_EXPORT_H_ |