[arch-commits] Commit in electron/trunk (7 files)
Bruno Pagani
archange at gemini.archlinux.org
Thu Aug 4 10:10:40 UTC 2022
Date: Thursday, August 4, 2022 @ 10:10:40
Author: archange
Revision: 1260245
upgpkg: electron 20.0.0-1
Added:
electron/trunk/chromium-tflite-system-zlib.patch
electron/trunk/x11-ozone-fix-X11-screensaver-suspension.patch
Modified:
electron/trunk/PKGBUILD
electron/trunk/remove-no-opaque-pointers-flag.patch
Deleted:
electron/trunk/chromium-libxml-unbundle.patch
electron/trunk/iwyu-add-utility-for-std-exchange.patch
electron/trunk/sql-make-VirtualCursor-standard-layout-type.patch
---------------------------------------------------+
PKGBUILD | 37 -
chromium-libxml-unbundle.patch | 10
chromium-tflite-system-zlib.patch | 70 ++
iwyu-add-utility-for-std-exchange.patch | 27 -
remove-no-opaque-pointers-flag.patch | 10
sql-make-VirtualCursor-standard-layout-type.patch | 238 ---------
x11-ozone-fix-X11-screensaver-suspension.patch | 490 ++++++++++++++++++++
7 files changed, 582 insertions(+), 300 deletions(-)
Modified: PKGBUILD
===================================================================
--- PKGBUILD 2022-08-04 10:02:16 UTC (rev 1260244)
+++ PKGBUILD 2022-08-04 10:10:40 UTC (rev 1260245)
@@ -1,10 +1,10 @@
# Maintainer: Nicola Squartini <tensor5 at gmail.com>
_use_suffix=0
-pkgver=19.0.10
-_commit=7e1099a8e4b04709e3d5068403c77eb0feb7371f
-_chromiumver=102.0.5005.167
-_gcc_patchset=6
+pkgver=20.0.0
+_commit=f20a51a87fb2a6698cd8a25588496bdbc0fcfbb2
+_chromiumver=104.0.5112.65
+_gcc_patchset=2
# shellcheck disable=SC2034
pkgrel=1
@@ -54,15 +54,15 @@
'jinja-python-3.10.patch'
'use-system-libraries-in-node.patch'
'std-vector-non-const.patch'
+ 'x11-ozone-fix-X11-screensaver-suspension.patch'
'roll-src-third_party-ffmpeg.patch'
- 'chromium-libxml-unbundle.patch'
- 'sql-make-VirtualCursor-standard-layout-type.patch'
+ 'chromium-tflite-system-zlib.patch'
'remove-no-opaque-pointers-flag.patch'
)
# shellcheck disable=SC2034
sha256sums=('SKIP'
'SKIP'
- '23f2a772c4a6e31394d6ee7b8dbb5967d3b92bd859093444913377934bede594'
+ 'ce702099849465927cf47f7bc3a4a27045d0e35e16b17481ebf35e14506bafa7'
'3953f532a3ea5fce19ee33600c6ead89dcd066df6a01d3c3ab4c24f96e46fca2'
'4484200d90b76830b69eea3a471c103999a3ce86bb2c29e6c14c945bf4102bae'
'dd2d248831dd4944d385ebf008426e66efe61d6fdf66f8932c963a12167947b4'
@@ -69,10 +69,10 @@
'55dbe71dbc1f3ab60bf1fa79f7aea7ef1fe76436b1d7df48728a1f8227d2134e'
'c70652a8b24c237bcfd27469de32797a2cb46d9f0d63d897bb6418314a25644c'
'76b969e1534e8c355b8b524a686cbf3b24136eaa6bd40b0c09fdd9866049f159'
+ '9956a843bc8a765c130080616ccd3ebc46ea95c3a2324c4b403bc293a8705eb2'
'30df59a9e2d95dcb720357ec4a83d9be51e59cc5551365da4c0073e68ccdec44'
- 'fd3bf124aacc45f2d0a4f1dd86303fa7f2a3d4f4eeaf33854631d6cb39e12485'
- 'b94b2e88f63cfb7087486508b8139599c89f96d7a4181c61fec4b4e250ca327a'
- 'e8ea8528ecb119de3380555c60ac8495ebdef502359fa2114c6c5c98f84698cd')
+ '588c166bf748793758a7df438cfa665b32e09ca8fbd6380be28bc5984a33523c'
+ 'ab46b2c26a4dfe86486fd7e31bfc7211c515994a61a8c0cbd742f9c9e3c91873')
_system_libs=('ffmpeg'
'flac'
@@ -168,21 +168,18 @@
# Remove '-Xclang -no-opaque-pointers' flag not supported by our clang
patch -Np1 -i ../remove-no-opaque-pointers-flag.patch
+ # Fix build with unbundled zlip (patch from Gentoo)
+ patch -Np1 -i ../chromium-tflite-system-zlib.patch
+
+ # Upstream fixes
+ patch -Np1 -i ../x11-ozone-fix-X11-screensaver-suspension.patch
+
# Revert ffmpeg roll requiring new channel layout API support
# https://crbug.com/1325301
patch -Rp1 -i ../roll-src-third_party-ffmpeg.patch
- # https://chromium-review.googlesource.com/c/chromium/src/+/3488058
- patch -Np1 -i ../chromium-libxml-unbundle.patch
-
- # https://chromium-review.googlesource.com/c/chromium/src/+/2862724
- patch -Np1 -i ../sql-make-VirtualCursor-standard-layout-type.patch
-
# Fixes for building with libstdc++ instead of libc++
- patch -Np1 -i ../patches/chromium-102-fenced_frame_utils-include.patch
- patch -Np1 -i ../patches/chromium-102-regex_pattern-array.patch
- patch -Np1 -i ../patches/chromium-102-swiftshader-template-instantiation.patch
- patch -Np1 -i ../patches/chromium-102-symbolize-include.patch
+ patch -Np1 -i ../patches/chromium-103-VirtualCursor-std-layout.patch
# Electron specific fixes
patch -d third_party/electron_node/tools/inspector_protocol/jinja2 \
Deleted: chromium-libxml-unbundle.patch
===================================================================
--- chromium-libxml-unbundle.patch 2022-08-04 10:02:16 UTC (rev 1260244)
+++ chromium-libxml-unbundle.patch 2022-08-04 10:10:40 UTC (rev 1260245)
@@ -1,10 +0,0 @@
---- a/build/linux/unbundle/libxml.gn
-+++ b/build/linux/unbundle/libxml.gn
-@@ -19,6 +19,7 @@ static_library("libxml_utils") {
- ":xml_reader",
- ":xml_writer",
- "//base/test:test_support",
-+ "//services/data_decoder:lib",
- "//services/data_decoder:xml_parser_fuzzer_deps",
- ]
- sources = [
Added: chromium-tflite-system-zlib.patch
===================================================================
--- chromium-tflite-system-zlib.patch (rev 0)
+++ chromium-tflite-system-zlib.patch 2022-08-04 10:10:40 UTC (rev 1260245)
@@ -0,0 +1,70 @@
+--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc
++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc
+@@ -21,8 +21,8 @@ limitations under the License.
+ #include "absl/status/status.h" // from @com_google_absl
+ #include "absl/strings/str_format.h" // from @com_google_absl
+ #include "absl/strings/string_view.h" // from @com_google_absl
+-#include "contrib/minizip/ioapi.h"
+-#include "contrib/minizip/unzip.h"
++#include "third_party/zlib/contrib/minizip/ioapi.h"
++#include "third_party/zlib/contrib/minizip/unzip.h"
+ #include "flatbuffers/flatbuffers.h" // from @flatbuffers
+ #include "tensorflow/lite/schema/schema_generated.h"
+ #include "tensorflow_lite_support/cc/common.h"
+--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc
++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc
+@@ -19,8 +19,8 @@ limitations under the License.
+ #include <cstring>
+ #include <functional>
+
+-#include "contrib/minizip/ioapi.h"
+-#include "contrib/minizip/zip.h"
++#include "third_party/zlib/contrib/minizip/ioapi.h"
++#include "third_party/zlib/contrib/minizip/zip.h"
+ #include "flatbuffers/flatbuffers.h" // from @flatbuffers
+ #include "tensorflow/lite/schema/schema_generated.h"
+ #include "tensorflow_lite_support/cc/common.h"
+--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
+@@ -19,7 +19,7 @@ limitations under the License.
+ #include <cstdio>
+
+ #include "absl/strings/string_view.h" // from @com_google_absl
+-#include "contrib/minizip/ioapi.h"
++#include "third_party/zlib/contrib/minizip/ioapi.h"
+
+ namespace tflite {
+ namespace metadata {
+--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h
++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h
+@@ -19,7 +19,7 @@ limitations under the License.
+ #include <cstdlib>
+
+ #include "absl/strings/string_view.h" // from @com_google_absl
+-#include "contrib/minizip/ioapi.h"
++#include "third_party/zlib/contrib/minizip/ioapi.h"
+
+ namespace tflite {
+ namespace metadata {
+--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc
++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc
+@@ -19,7 +19,7 @@ limitations under the License.
+ #include <cstdio>
+
+ #include "absl/strings/string_view.h" // from @com_google_absl
+-#include "contrib/minizip/ioapi.h"
++#include "third_party/zlib/contrib/minizip/ioapi.h"
+
+ namespace tflite {
+ namespace metadata {
+--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h
++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h
+@@ -19,7 +19,7 @@ limitations under the License.
+ #include <cstdlib>
+
+ #include "absl/strings/string_view.h" // from @com_google_absl
+-#include "contrib/minizip/ioapi.h"
++#include "third_party/zlib/contrib/minizip/ioapi.h"
+
+ namespace tflite {
+ namespace metadata {
Deleted: iwyu-add-utility-for-std-exchange.patch
===================================================================
--- iwyu-add-utility-for-std-exchange.patch 2022-08-04 10:02:16 UTC (rev 1260244)
+++ iwyu-add-utility-for-std-exchange.patch 2022-08-04 10:10:40 UTC (rev 1260245)
@@ -1,27 +0,0 @@
-From 9dd0503835dc875807ab63efb1f477bffed2a852 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09 at googlemail.com>
-Date: Mon, 25 Apr 2022 23:18:30 +0000
-Subject: [PATCH] IWYU: add utility for std::exchange
-
-Bug: 957519
-Change-Id: I307d520fdc34d2452018ed32a505e7e519739410
-Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3604643
-Reviewed-by: Wez <wez at chromium.org>
-Commit-Queue: Stephan Hartmann <stha09 at googlemail.com>
-Cr-Commit-Position: refs/heads/main@{#995855}
----
- base/third_party/symbolize/symbolize.h | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/base/third_party/symbolize/symbolize.h b/base/third_party/symbolize/symbolize.h
-index 99029a968d5..278078f6071 100644
---- a/base/third_party/symbolize/symbolize.h
-+++ b/base/third_party/symbolize/symbolize.h
-@@ -61,6 +61,7 @@
- #ifdef HAVE_SYMBOLIZE
-
- #include <algorithm>
-+#include <utility>
-
- #if defined(__ELF__) // defined by gcc
- #if defined(__OpenBSD__)
Modified: remove-no-opaque-pointers-flag.patch
===================================================================
--- remove-no-opaque-pointers-flag.patch 2022-08-04 10:02:16 UTC (rev 1260244)
+++ remove-no-opaque-pointers-flag.patch 2022-08-04 10:10:40 UTC (rev 1260245)
@@ -1,12 +1,12 @@
---- a/build/config/compiler/BUILD.gn 2022-05-19 10:35:52.991415777 +0000
-+++ b/build/config/compiler/BUILD.gn 2022-05-19 10:36:11.102017131 +0000
-@@ -1538,15 +1538,6 @@ config("default_warnings") {
- cflags += [ "-Wno-deprecated-non-prototype" ]
+--- chromium-104.0.5112.57/build/config/compiler/BUILD.gn.orig 2022-07-26 08:11:54.192788877 +0000
++++ chromium-104.0.5112.57/build/config/compiler/BUILD.gn 2022-07-26 08:12:10.019328155 +0000
+@@ -1540,15 +1540,6 @@ config("default_warnings") {
+ cflags += [ "-Wno-unqualified-std-cast-call" ]
}
- if (!is_nacl && !(is_chromeos ||
- default_toolchain == "//build/toolchain/cros:target")) {
-- # TODO(https://crbug.com/1316298): Re-enable once test failure is figured out
+- # TODO(https://crbug.com/1322823): Remove flags once potential miscompile is investigated.
- cflags += [
- "-Xclang",
- "-no-opaque-pointers",
Deleted: sql-make-VirtualCursor-standard-layout-type.patch
===================================================================
--- sql-make-VirtualCursor-standard-layout-type.patch 2022-08-04 10:02:16 UTC (rev 1260244)
+++ sql-make-VirtualCursor-standard-layout-type.patch 2022-08-04 10:10:40 UTC (rev 1260245)
@@ -1,238 +0,0 @@
-From 144479ad7b4287bee4067f95e4218f614798a865 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09 at googlemail.com>
-Date: Sun, 16 Jan 2022 19:15:26 +0000
-Subject: [PATCH] sql: make VirtualCursor standard layout type
-
-sql::recover::VirtualCursor needs to be a standard layout type, but
-has members of type std::unique_ptr. However, std::unique_ptr is not
-guaranteed to be standard layout. Compiling with clang combined with
-gcc-11 libstdc++ fails because of this.
-
-Bug: 1189788
-Change-Id: Ia6dc388cc5ef1c0f2afc75f8ca45b9f12687ca9c
----
- sql/recover_module/btree.cc | 18 ++++++++++++------
- sql/recover_module/btree.h | 21 +++++++++++++++------
- sql/recover_module/cursor.cc | 24 ++++++++++++------------
- sql/recover_module/cursor.h | 2 +-
- sql/recover_module/pager.cc | 5 ++---
- sql/recover_module/pager.h | 6 +++---
- 6 files changed, 45 insertions(+), 31 deletions(-)
-
-diff --git a/sql/recover_module/btree.cc b/sql/recover_module/btree.cc
-index cc9420e5c05..f12d8fa32a2 100644
---- a/sql/recover_module/btree.cc
-+++ b/sql/recover_module/btree.cc
-@@ -136,16 +136,22 @@ static_assert(std::is_trivially_destructible<LeafPageDecoder>::value,
- "Move the destructor to the .cc file if it's non-trival");
- #endif // !DCHECK_IS_ON()
-
--LeafPageDecoder::LeafPageDecoder(DatabasePageReader* db_reader) noexcept
-- : page_id_(db_reader->page_id()),
-- db_reader_(db_reader),
-- cell_count_(ComputeCellCount(db_reader)),
-- next_read_index_(0),
-- last_record_size_(0) {
-+LeafPageDecoder::LeafPageDecoder() noexcept = default;
-+
-+void LeafPageDecoder::Initialize(DatabasePageReader* db_reader) {
-+ page_id_ = db_reader->page_id();
-+ db_reader_ = db_reader;
-+ cell_count_ = ComputeCellCount(db_reader);
-+ next_read_index_ = 0;
-+ last_record_size_ = 0;
- DCHECK(IsOnValidPage(db_reader));
- DCHECK(DatabasePageReader::IsValidPageId(page_id_));
- }
-
-+void LeafPageDecoder::Reset() {
-+ db_reader_ = nullptr;
-+}
-+
- bool LeafPageDecoder::TryAdvance() {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- DCHECK(CanAdvance());
-diff --git a/sql/recover_module/btree.h b/sql/recover_module/btree.h
-index eaa087a5c52..df0e0c937c0 100644
---- a/sql/recover_module/btree.h
-+++ b/sql/recover_module/btree.h
-@@ -101,9 +101,7 @@ class LeafPageDecoder {
- public:
- // Creates a decoder for a DatabasePageReader's last read page.
- //
-- // |db_reader| must have been used to read an inner page of a table B-tree.
-- // |db_reader| must outlive this instance.
-- explicit LeafPageDecoder(DatabasePageReader* db_reader) noexcept;
-+ LeafPageDecoder() noexcept;
- ~LeafPageDecoder() noexcept = default;
-
- LeafPageDecoder(const LeafPageDecoder&) = delete;
-@@ -151,6 +149,17 @@ class LeafPageDecoder {
- // read as long as CanAdvance() returns true.
- bool TryAdvance();
-
-+ // Initialize with DatabasePageReader
-+ // |db_reader| must have been used to read an inner page of a table B-tree.
-+ // |db_reader| must outlive this instance.
-+ void Initialize(DatabasePageReader* db_reader);
-+
-+ // Reset internal DatabasePageReader
-+ void Reset();
-+
-+ // True if DatabasePageReader is valid
-+ bool IsValid() { return (db_reader_ != nullptr); }
-+
- // True if the given reader may point to an inner page in a table B-tree.
- //
- // The last ReadPage() call on |db_reader| must have succeeded.
-@@ -164,14 +173,14 @@ class LeafPageDecoder {
- static int ComputeCellCount(DatabasePageReader* db_reader);
-
- // The number of the B-tree page this reader is reading.
-- const int64_t page_id_;
-+ int64_t page_id_;
- // Used to read the tree page.
- //
- // Raw pointer usage is acceptable because this instance's owner is expected
- // to ensure that the DatabasePageReader outlives this.
-- DatabasePageReader* const db_reader_;
-+ DatabasePageReader* db_reader_;
- // Caches the ComputeCellCount() value for this reader's page.
-- const int cell_count_ = ComputeCellCount(db_reader_);
-+ int cell_count_;
-
- // The reader's cursor state.
- //
-diff --git a/sql/recover_module/cursor.cc b/sql/recover_module/cursor.cc
-index 4f827edf1b4..240de4999fe 100644
---- a/sql/recover_module/cursor.cc
-+++ b/sql/recover_module/cursor.cc
-@@ -28,7 +28,7 @@ VirtualCursor::~VirtualCursor() {
- int VirtualCursor::First() {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- inner_decoders_.clear();
-- leaf_decoder_ = nullptr;
-+ leaf_decoder_.Reset();
-
- AppendPageDecoder(table_->root_page_id());
- return Next();
-@@ -38,18 +38,18 @@ int VirtualCursor::Next() {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- record_reader_.Reset();
-
-- while (!inner_decoders_.empty() || leaf_decoder_.get()) {
-- if (leaf_decoder_.get()) {
-- if (!leaf_decoder_->CanAdvance()) {
-+ while (!inner_decoders_.empty() || leaf_decoder_.IsValid()) {
-+ if (leaf_decoder_.IsValid()) {
-+ if (!leaf_decoder_.CanAdvance()) {
- // The leaf has been exhausted. Remove it from the DFS stack.
-- leaf_decoder_ = nullptr;
-+ leaf_decoder_.Reset();
- continue;
- }
-- if (!leaf_decoder_->TryAdvance())
-+ if (!leaf_decoder_.TryAdvance())
- continue;
-
-- if (!payload_reader_.Initialize(leaf_decoder_->last_record_size(),
-- leaf_decoder_->last_record_offset())) {
-+ if (!payload_reader_.Initialize(leaf_decoder_.last_record_size(),
-+ leaf_decoder_.last_record_offset())) {
- continue;
- }
- if (!record_reader_.Initialize())
-@@ -101,13 +101,13 @@ int VirtualCursor::ReadColumn(int column_index,
- int64_t VirtualCursor::RowId() {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- DCHECK(record_reader_.IsInitialized());
-- DCHECK(leaf_decoder_.get());
-- return leaf_decoder_->last_record_rowid();
-+ DCHECK(leaf_decoder_.IsValid());
-+ return leaf_decoder_.last_record_rowid();
- }
-
- void VirtualCursor::AppendPageDecoder(int page_id) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-- DCHECK(leaf_decoder_.get() == nullptr)
-+ DCHECK(!leaf_decoder_.IsValid())
- << __func__
- << " must only be called when the current path has no leaf decoder";
-
-@@ -115,7 +115,7 @@ void VirtualCursor::AppendPageDecoder(int page_id) {
- return;
-
- if (LeafPageDecoder::IsOnValidPage(&db_reader_)) {
-- leaf_decoder_ = std::make_unique<LeafPageDecoder>(&db_reader_);
-+ leaf_decoder_.Initialize(&db_reader_);
- return;
- }
-
-diff --git a/sql/recover_module/cursor.h b/sql/recover_module/cursor.h
-index 845b7852648..cc4e85f83f9 100644
---- a/sql/recover_module/cursor.h
-+++ b/sql/recover_module/cursor.h
-@@ -130,7 +130,7 @@ class VirtualCursor {
- std::vector<std::unique_ptr<InnerPageDecoder>> inner_decoders_;
-
- // Decodes the leaf page containing records.
-- std::unique_ptr<LeafPageDecoder> leaf_decoder_;
-+ LeafPageDecoder leaf_decoder_;
-
- SEQUENCE_CHECKER(sequence_checker_);
- };
-diff --git a/sql/recover_module/pager.cc b/sql/recover_module/pager.cc
-index 58e75de2704..69d98cef98d 100644
---- a/sql/recover_module/pager.cc
-+++ b/sql/recover_module/pager.cc
-@@ -23,8 +23,7 @@ static_assert(DatabasePageReader::kMaxPageId <= std::numeric_limits<int>::max(),
- "ints are not appropriate for representing page IDs");
-
- DatabasePageReader::DatabasePageReader(VirtualTable* table)
-- : page_data_(std::make_unique<uint8_t[]>(table->page_size())),
-- table_(table) {
-+ : page_data_(table->page_size()), table_(table) {
- DCHECK(table != nullptr);
- DCHECK(IsValidPageSize(table->page_size()));
- }
-@@ -58,7 +57,7 @@ int DatabasePageReader::ReadPage(int page_id) {
- "The |read_offset| computation above may overflow");
-
- int sqlite_status =
-- RawRead(sqlite_file, read_size, read_offset, page_data_.get());
-+ RawRead(sqlite_file, read_size, read_offset, page_data_.data());
-
- // |page_id_| needs to be set to kInvalidPageId if the read failed.
- // Otherwise, future ReadPage() calls with the previous |page_id_| value
-diff --git a/sql/recover_module/pager.h b/sql/recover_module/pager.h
-index 07cac3cb989..d08f0932fab 100644
---- a/sql/recover_module/pager.h
-+++ b/sql/recover_module/pager.h
-@@ -6,8 +6,8 @@
- #define SQL_RECOVER_MODULE_PAGER_H_
-
- #include <cstdint>
--#include <memory>
- #include <ostream>
-+#include <vector>
-
- #include "base/check_op.h"
- #include "base/memory/raw_ptr.h"
-@@ -72,7 +72,7 @@ class DatabasePageReader {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- DCHECK_NE(page_id_, kInvalidPageId)
- << "Successful ReadPage() required before accessing pager state";
-- return page_data_.get();
-+ return page_data_.data();
- }
-
- // The number of bytes in the page read by the last ReadPage() call.
-@@ -139,7 +139,7 @@ class DatabasePageReader {
- int page_id_ = kInvalidPageId;
- // Stores the bytes of the last page successfully read by ReadPage().
- // The content is undefined if the last call to ReadPage() did not succeed.
-- const std::unique_ptr<uint8_t[]> page_data_;
-+ std::vector<uint8_t> page_data_;
- // Raw pointer usage is acceptable because this instance's owner is expected
- // to ensure that the VirtualTable outlives this.
- const raw_ptr<VirtualTable> table_;
Added: x11-ozone-fix-X11-screensaver-suspension.patch
===================================================================
--- x11-ozone-fix-X11-screensaver-suspension.patch (rev 0)
+++ x11-ozone-fix-X11-screensaver-suspension.patch 2022-08-04 10:10:40 UTC (rev 1260245)
@@ -0,0 +1,490 @@
+From 8c1ebea5f601b0b5247535dcdfd01755f3e6e1a6 Mon Sep 17 00:00:00 2001
+From: Andrew Wolfers <aswolfers at chromium.org>
+Date: Tue, 19 Jul 2022 15:01:25 +0000
+Subject: [PATCH] [x11][ozone] Fix X11 screensaver suspension.
+
+X11 screensaver suspension was broken by https://crrev.com/c/3507472,
+in which usage patterns were migrated to a non-stacking paradigm.
+
+"Non-stacking" screensaver suspension describes an overriding behavior,
+such that the last suspending or un-suspending call defines the current
+state. Conversely, a "stacking" screensaver suspension paradigm allows
+for parallel suspension, such that suspending calls are expected to be
+matched by an equal number of un-suspending calls.
+
+Documentation for `PlatformScreen::SetScreenSaverSuspended` (inherited
+by `X11ScreenOzone`) explains that it should be used in a non-stacking
+manner [1], which contradicts the child class's underlying
+implementation [2].
+
+> If XScreenSaverSuspend is called multiple times with suspend set to
+> 'True', it must be called an equal number of times with suspend set
+> to 'False' in order for the screensaver timer to be restarted.
+
+This change updates the documentation/API of the `PlatformScreen`
+parent class to correctly describe the stacking behavior of child class
+`X11ScreenOzone`. This change also updates the implementation of
+`WaylandScreen` to a stacking version. Lastly, this change updates the
+call sites of `PlatformScreen` according to the API change.
+
+[1] https://crsrc.org/c/ui/ozone/public/platform_screen.h;l=96
+[2] https://linux.die.net/man/3/xscreensaverunsetattributes
+
+Bug: b:193670013
+Bug: b:196213351
+Bug: 1329573
+Bug: 1339361
+Change-Id: I60975c8da9f86a0f26f3c32cf49c4a7eeeea6a12
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3759067
+Commit-Queue: Andrew Wolfers <aswolfers at chromium.org>
+Reviewed-by: Thomas Anderson <thomasanderson at chromium.org>
+Reviewed-by: Scott Violet <sky at chromium.org>
+Cr-Commit-Position: refs/heads/main@{#1025717}
+
+(cherry picked from commit e61f08f8dbf1ec7cead427f3c497934e9d0db35f)
+---
+ ui/aura/screen_ozone.cc | 14 ++++++--
+ ui/aura/screen_ozone.h | 29 ++++++++++++----
+ ui/base/x/x11_util.h | 4 ++-
+ ui/display/screen.cc | 21 ++----------
+ ui/display/screen.h | 34 ++++++-------------
+ .../platform/wayland/host/wayland_screen.cc | 31 +++++++++++++++++
+ .../platform/wayland/host/wayland_screen.h | 30 +++++++++++++++-
+ ui/ozone/platform/x11/x11_screen_ozone.cc | 27 +++++++++++++--
+ ui/ozone/platform/x11/x11_screen_ozone.h | 19 ++++++++++-
+ ui/ozone/public/platform_screen.cc | 8 +++--
+ ui/ozone/public/platform_screen.h | 26 +++++++++++---
+ 11 files changed, 182 insertions(+), 61 deletions(-)
+
+diff --git a/ui/aura/screen_ozone.cc b/ui/aura/screen_ozone.cc
+index a78a6a48f1..09f62dc982 100644
+--- a/ui/aura/screen_ozone.cc
++++ b/ui/aura/screen_ozone.cc
+@@ -4,6 +4,8 @@
+
+ #include "ui/aura/screen_ozone.h"
+
++#include <memory>
++
+ #include "ui/aura/client/screen_position_client.h"
+ #include "ui/aura/window.h"
+ #include "ui/aura/window_tree_host.h"
+@@ -108,8 +110,16 @@ display::Display ScreenOzone::GetPrimaryDisplay() const {
+ }
+
+ #if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+-bool ScreenOzone::SetScreenSaverSuspended(bool suspend) {
+- return platform_screen_->SetScreenSaverSuspended(suspend);
++ScreenOzone::ScreenSaverSuspenderOzone::ScreenSaverSuspenderOzone(
++ std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender> suspender)
++ : suspender_(std::move(suspender)) {}
++
++ScreenOzone::ScreenSaverSuspenderOzone::~ScreenSaverSuspenderOzone() = default;
++
++std::unique_ptr<display::Screen::ScreenSaverSuspender>
++ScreenOzone::SuspendScreenSaver() {
++ return std::make_unique<ScreenSaverSuspenderOzone>(
++ platform_screen_->SuspendScreenSaver());
+ }
+ #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+
+diff --git a/ui/aura/screen_ozone.h b/ui/aura/screen_ozone.h
+index 2970a0e0e7..d033abf366 100644
+--- a/ui/aura/screen_ozone.h
++++ b/ui/aura/screen_ozone.h
+@@ -11,10 +11,7 @@
+ #include "build/chromeos_buildflags.h"
+ #include "ui/aura/aura_export.h"
+ #include "ui/display/screen.h"
+-
+-namespace ui {
+-class PlatformScreen;
+-}
++#include "ui/ozone/public/platform_screen.h"
+
+ namespace aura {
+
+@@ -48,6 +45,10 @@ class AURA_EXPORT ScreenOzone : public display::Screen {
+ display::Display GetDisplayMatching(
+ const gfx::Rect& match_rect) const override;
+ display::Display GetPrimaryDisplay() const override;
++#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
++ std::unique_ptr<display::Screen::ScreenSaverSuspender> SuspendScreenSaver()
++ override;
++#endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+ bool IsScreenSaverActive() const override;
+ base::TimeDelta CalculateIdleTime() const override;
+ void AddObserver(display::DisplayObserver* observer) override;
+@@ -65,11 +66,27 @@ class AURA_EXPORT ScreenOzone : public display::Screen {
+ protected:
+ ui::PlatformScreen* platform_screen() { return platform_screen_.get(); }
+
++ private:
+ #if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+- bool SetScreenSaverSuspended(bool suspend) override;
++ class ScreenSaverSuspenderOzone
++ : public display::Screen::ScreenSaverSuspender {
++ public:
++ explicit ScreenSaverSuspenderOzone(
++ std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender>
++ suspender);
++
++ ScreenSaverSuspenderOzone(const ScreenSaverSuspenderOzone&) = delete;
++ ScreenSaverSuspenderOzone& operator=(const ScreenSaverSuspenderOzone&) =
++ delete;
++
++ ~ScreenSaverSuspenderOzone() override;
++
++ private:
++ std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender>
++ suspender_;
++ };
+ #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+
+- private:
+ gfx::AcceleratedWidget GetAcceleratedWidgetForWindow(
+ aura::Window* window) const;
+
+diff --git a/ui/base/x/x11_util.h b/ui/base/x/x11_util.h
+index bf36efe170..0692571582 100644
+--- a/ui/base/x/x11_util.h
++++ b/ui/base/x/x11_util.h
+@@ -337,7 +337,9 @@ COMPONENT_EXPORT(UI_BASE_X) bool IsCompositingManagerPresent();
+ COMPONENT_EXPORT(UI_BASE_X) bool IsX11WindowFullScreen(x11::Window window);
+
+ // Suspends or resumes the X screen saver, and returns whether the operation was
+-// successful. Must be called on the UI thread.
++// successful. Must be called on the UI thread. If called multiple times with
++// |suspend| set to true, the screen saver is not un-suspended until this method
++// is called an equal number of times with |suspend| set to false.
+ COMPONENT_EXPORT(UI_BASE_X) bool SuspendX11ScreenSaver(bool suspend);
+
+ // Returns true if the window manager supports the given hint.
+diff --git a/ui/display/screen.cc b/ui/display/screen.cc
+index b9723889ce..70dc0a9f5c 100644
+--- a/ui/display/screen.cc
++++ b/ui/display/screen.cc
+@@ -85,26 +85,11 @@ void Screen::SetDisplayForNewWindows(int64_t display_id) {
+ }
+
+ #if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+-std::unique_ptr<Screen::ScreenSaverSuspender> Screen::SuspendScreenSaver() {
+- SetScreenSaverSuspended(true);
+- screen_saver_suspension_count_++;
+- return base::WrapUnique(new Screen::ScreenSaverSuspender(this));
+-}
+-
+-Screen::ScreenSaverSuspender::~ScreenSaverSuspender() {
+- // Check that this suspender still refers to the active screen. Particularly
+- // in tests, the screen might be destructed before the suspender.
+- if (screen_ == GetScreen()) {
+- screen_->screen_saver_suspension_count_--;
+- if (screen_->screen_saver_suspension_count_ == 0) {
+- screen_->SetScreenSaverSuspended(false);
+- }
+- }
+-}
++Screen::ScreenSaverSuspender::~ScreenSaverSuspender() = default;
+
+-bool Screen::SetScreenSaverSuspended(bool suspend) {
++std::unique_ptr<Screen::ScreenSaverSuspender> Screen::SuspendScreenSaver() {
+ NOTIMPLEMENTED_LOG_ONCE();
+- return false;
++ return nullptr;
+ }
+ #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+
+diff --git a/ui/display/screen.h b/ui/display/screen.h
+index a86c5b63cc..d04534006f 100644
+--- a/ui/display/screen.h
++++ b/ui/display/screen.h
+@@ -133,28 +133,22 @@ class DISPLAY_EXPORT Screen {
+ // its existence.
+ class ScreenSaverSuspender {
+ public:
+- ScreenSaverSuspender(const Screen&) = delete;
+- ScreenSaverSuspender& operator=(const Screen&) = delete;
++ ScreenSaverSuspender() = default;
+
+- // Notifies |screen_| that this instance is being destructed, and causes its
+- // platform-specific screensaver to be un-suspended if this is the last such
+- // remaining instance.
+- ~ScreenSaverSuspender();
++ ScreenSaverSuspender(const ScreenSaverSuspender&) = delete;
++ ScreenSaverSuspender& operator=(const ScreenSaverSuspender&) = delete;
+
+- private:
+- friend class Screen;
+-
+- explicit ScreenSaverSuspender(Screen* screen) : screen_(screen) {}
+-
+- Screen* screen_;
++ // Causes the platform-specific screensaver to be un-suspended iff this is
++ // the last remaining instance.
++ virtual ~ScreenSaverSuspender() = 0;
+ };
+
+ // Suspends the platform-specific screensaver until the returned
+- // |ScreenSaverSuspender| is destructed. This method allows stacking multiple
+- // overlapping calls, such that the platform-specific screensaver will not be
+- // un-suspended until all returned |SreenSaverSuspender| instances have been
+- // destructed.
+- std::unique_ptr<ScreenSaverSuspender> SuspendScreenSaver();
++ // |ScreenSaverSuspender| is destructed, or returns nullptr if suspension
++ // failed. This method allows stacking multiple overlapping calls, such that
++ // the platform-specific screensaver will not be un-suspended until all
++ // returned |ScreenSaverSuspender| instances have been destructed.
++ virtual std::unique_ptr<ScreenSaverSuspender> SuspendScreenSaver();
+ #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+
+ // Returns whether the screensaver is currently running.
+@@ -200,12 +194,6 @@ class DISPLAY_EXPORT Screen {
+ const gfx::GpuExtraInfo& gpu_extra_info);
+
+ protected:
+-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+- // Suspends or un-suspends the platform-specific screensaver, and returns
+- // whether the operation was successful.
+- virtual bool SetScreenSaverSuspended(bool suspend);
+-#endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+-
+ void set_shutdown(bool shutdown) { shutdown_ = shutdown; }
+
+ private:
+diff --git a/ui/ozone/platform/wayland/host/wayland_screen.cc b/ui/ozone/platform/wayland/host/wayland_screen.cc
+index 0c7dc5c02b..18cd81b472 100644
+--- a/ui/ozone/platform/wayland/host/wayland_screen.cc
++++ b/ui/ozone/platform/wayland/host/wayland_screen.cc
+@@ -327,6 +327,37 @@ display::Display WaylandScreen::GetDisplayMatching(
+ return display_matching ? *display_matching : GetPrimaryDisplay();
+ }
+
++std::unique_ptr<WaylandScreen::WaylandScreenSaverSuspender>
++WaylandScreen::WaylandScreenSaverSuspender::Create(WaylandScreen& screen) {
++ auto suspender = base::WrapUnique(new WaylandScreenSaverSuspender(screen));
++ if (suspender->is_suspending_) {
++ screen.screen_saver_suspension_count_++;
++ return suspender;
++ }
++
++ return nullptr;
++}
++
++WaylandScreen::WaylandScreenSaverSuspender::WaylandScreenSaverSuspender(
++ WaylandScreen& screen)
++ : screen_(screen.GetWeakPtr()) {
++ is_suspending_ = screen.SetScreenSaverSuspended(true);
++}
++
++WaylandScreen::WaylandScreenSaverSuspender::~WaylandScreenSaverSuspender() {
++ if (screen_ && is_suspending_) {
++ screen_->screen_saver_suspension_count_--;
++ if (screen_->screen_saver_suspension_count_ == 0) {
++ screen_->SetScreenSaverSuspended(false);
++ }
++ }
++}
++
++std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
++WaylandScreen::SuspendScreenSaver() {
++ return WaylandScreenSaverSuspender::Create(*this);
++}
++
+ bool WaylandScreen::SetScreenSaverSuspended(bool suspend) {
+ if (!connection_->zwp_idle_inhibit_manager())
+ return false;
+diff --git a/ui/ozone/platform/wayland/host/wayland_screen.h b/ui/ozone/platform/wayland/host/wayland_screen.h
+index 87358f4f06..8e5515104a 100644
+--- a/ui/ozone/platform/wayland/host/wayland_screen.h
++++ b/ui/ozone/platform/wayland/host/wayland_screen.h
+@@ -68,7 +68,8 @@ class WaylandScreen : public PlatformScreen {
+ const gfx::Point& point) const override;
+ display::Display GetDisplayMatching(
+ const gfx::Rect& match_rect) const override;
+- bool SetScreenSaverSuspended(bool suspend) override;
++ std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
++ SuspendScreenSaver() override;
+ bool IsScreenSaverActive() const override;
+ base::TimeDelta CalculateIdleTime() const override;
+ void AddObserver(display::DisplayObserver* observer) override;
+@@ -76,7 +77,33 @@ class WaylandScreen : public PlatformScreen {
+ std::vector<base::Value> GetGpuExtraInfo(
+ const gfx::GpuExtraInfo& gpu_extra_info) override;
+
++ protected:
++ // Suspends or un-suspends the platform-specific screensaver, and returns
++ // whether the operation was successful. Can be called more than once with the
++ // same value for |suspend|, but those states should not stack: the first
++ // alternating value should toggle the state of the suspend.
++ bool SetScreenSaverSuspended(bool suspend);
++
+ private:
++ class WaylandScreenSaverSuspender
++ : public PlatformScreen::PlatformScreenSaverSuspender {
++ public:
++ WaylandScreenSaverSuspender(const WaylandScreenSaverSuspender&) = delete;
++ WaylandScreenSaverSuspender& operator=(const WaylandScreenSaverSuspender&) =
++ delete;
++
++ ~WaylandScreenSaverSuspender() override;
++
++ static std::unique_ptr<WaylandScreenSaverSuspender> Create(
++ WaylandScreen& screen);
++
++ private:
++ explicit WaylandScreenSaverSuspender(WaylandScreen& screen);
++
++ base::WeakPtr<WaylandScreen> screen_;
++ bool is_suspending_ = false;
++ };
++
+ // All parameters are in DIP screen coordinates/units except |physical_size|,
+ // which is in physical pixels.
+ void AddOrUpdateDisplay(uint32_t output_id,
+@@ -103,6 +130,7 @@ class WaylandScreen : public PlatformScreen {
+ #endif
+
+ wl::Object<zwp_idle_inhibitor_v1> idle_inhibitor_;
++ uint32_t screen_saver_suspension_count_ = 0;
+
+ base::WeakPtrFactory<WaylandScreen> weak_factory_;
+ };
+diff --git a/ui/ozone/platform/x11/x11_screen_ozone.cc b/ui/ozone/platform/x11/x11_screen_ozone.cc
+index 53265ab58a..b450df9c83 100644
+--- a/ui/ozone/platform/x11/x11_screen_ozone.cc
++++ b/ui/ozone/platform/x11/x11_screen_ozone.cc
+@@ -4,6 +4,8 @@
+
+ #include "ui/ozone/platform/x11/x11_screen_ozone.h"
+
++#include <memory>
++
+ #include "base/containers/flat_set.h"
+ #include "ui/base/linux/linux_desktop.h"
+ #include "ui/base/x/x11_idle_query.h"
+@@ -131,8 +133,29 @@ display::Display X11ScreenOzone::GetDisplayMatching(
+ return matching_display ? *matching_display : GetPrimaryDisplay();
+ }
+
+-bool X11ScreenOzone::SetScreenSaverSuspended(bool suspend) {
+- return SuspendX11ScreenSaver(suspend);
++X11ScreenOzone::X11ScreenSaverSuspender::X11ScreenSaverSuspender() {
++ is_suspending_ = SuspendX11ScreenSaver(true);
++}
++
++std::unique_ptr<X11ScreenOzone::X11ScreenSaverSuspender>
++X11ScreenOzone::X11ScreenSaverSuspender::Create() {
++ auto suspender = base::WrapUnique(new X11ScreenSaverSuspender());
++ if (suspender->is_suspending_) {
++ return suspender;
++ }
++
++ return nullptr;
++}
++
++X11ScreenOzone::X11ScreenSaverSuspender::~X11ScreenSaverSuspender() {
++ if (is_suspending_) {
++ SuspendX11ScreenSaver(false);
++ }
++}
++
++std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
++X11ScreenOzone::SuspendScreenSaver() {
++ return X11ScreenSaverSuspender::Create();
+ }
+
+ bool X11ScreenOzone::IsScreenSaverActive() const {
+diff --git a/ui/ozone/platform/x11/x11_screen_ozone.h b/ui/ozone/platform/x11/x11_screen_ozone.h
+index d86acae9aa..81e0fd13d8 100644
+--- a/ui/ozone/platform/x11/x11_screen_ozone.h
++++ b/ui/ozone/platform/x11/x11_screen_ozone.h
+@@ -50,7 +50,8 @@ class X11ScreenOzone : public PlatformScreen,
+ const gfx::Point& point) const override;
+ display::Display GetDisplayMatching(
+ const gfx::Rect& match_rect) const override;
+- bool SetScreenSaverSuspended(bool suspend) override;
++ std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
++ SuspendScreenSaver() override;
+ bool IsScreenSaverActive() const override;
+ base::TimeDelta CalculateIdleTime() const override;
+ void AddObserver(display::DisplayObserver* observer) override;
+@@ -66,6 +67,22 @@ class X11ScreenOzone : public PlatformScreen,
+ private:
+ friend class X11ScreenOzoneTest;
+
++ class X11ScreenSaverSuspender
++ : public PlatformScreen::PlatformScreenSaverSuspender {
++ public:
++ X11ScreenSaverSuspender(const X11ScreenSaverSuspender&) = delete;
++ X11ScreenSaverSuspender& operator=(const X11ScreenSaverSuspender&) = delete;
++
++ ~X11ScreenSaverSuspender() override;
++
++ static std::unique_ptr<X11ScreenSaverSuspender> Create();
++
++ private:
++ X11ScreenSaverSuspender();
++
++ bool is_suspending_ = false;
++ };
++
+ // Overridden from ui::XDisplayManager::Delegate:
+ void OnXDisplayListUpdated() override;
+ float GetXDisplayScaleFactor() const override;
+diff --git a/ui/ozone/public/platform_screen.cc b/ui/ozone/public/platform_screen.cc
+index 98f599aa41..2353208396 100644
+--- a/ui/ozone/public/platform_screen.cc
++++ b/ui/ozone/public/platform_screen.cc
+@@ -30,9 +30,13 @@ std::string PlatformScreen::GetCurrentWorkspace() {
+ return {};
+ }
+
+-bool PlatformScreen::SetScreenSaverSuspended(bool suspend) {
++PlatformScreen::PlatformScreenSaverSuspender::~PlatformScreenSaverSuspender() =
++ default;
++
++std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
++PlatformScreen::SuspendScreenSaver() {
+ NOTIMPLEMENTED_LOG_ONCE();
+- return false;
++ return nullptr;
+ }
+
+ bool PlatformScreen::IsScreenSaverActive() const {
+diff --git a/ui/ozone/public/platform_screen.h b/ui/ozone/public/platform_screen.h
+index 091220a99f..e4adfafce3 100644
+--- a/ui/ozone/public/platform_screen.h
++++ b/ui/ozone/public/platform_screen.h
+@@ -89,11 +89,27 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformScreen {
+ virtual display::Display GetDisplayMatching(
+ const gfx::Rect& match_rect) const = 0;
+
+- // Suspends or un-suspends the platform-specific screensaver, and returns
+- // whether the operation was successful. Can be called more than once with the
+- // same value for |suspend|, but those states should not stack: the first
+- // alternating value should toggle the state of the suspend.
+- virtual bool SetScreenSaverSuspended(bool suspend);
++ // Object which suspends the platform-specific screensaver for the duration of
++ // its existence.
++ class PlatformScreenSaverSuspender {
++ public:
++ PlatformScreenSaverSuspender() = default;
++
++ PlatformScreenSaverSuspender(const PlatformScreenSaverSuspender&) = delete;
++ PlatformScreenSaverSuspender& operator=(
++ const PlatformScreenSaverSuspender&) = delete;
++
++ // Causes the platform-specific screensaver to be un-suspended iff this is
++ // the last remaining instance.
++ virtual ~PlatformScreenSaverSuspender() = 0;
++ };
++
++ // Suspends the platform-specific screensaver until the returned
++ // |PlatformScreenSaverSuspender| is destructed, or returns nullptr if
++ // suspension failed. This method allows stacking multiple overlapping calls,
++ // such that the platform-specific screensaver will not be un-suspended until
++ // all returned |PlatformScreenSaverSuspender| instances have been destructed.
++ virtual std::unique_ptr<PlatformScreenSaverSuspender> SuspendScreenSaver();
+
+ // Returns whether the screensaver is currently running.
+ virtual bool IsScreenSaverActive() const;
More information about the arch-commits
mailing list