diff options
Diffstat (limited to 'linhes')
74 files changed, 3433 insertions, 258 deletions
diff --git a/linhes/certbot-dns-duckdns/PKGBUILD b/linhes/certbot-dns-duckdns/PKGBUILD index ef03a03..cb1f3dd 100644 --- a/linhes/certbot-dns-duckdns/PKGBUILD +++ b/linhes/certbot-dns-duckdns/PKGBUILD @@ -4,17 +4,17 @@ # Maintainer: eomanis at web dot de pkgname='certbot-dns-duckdns' -_pkgverUpstream="1.5" -pkgver="1.5.0" -pkgrel=2 +_pkgverUpstream="1.7.0" +pkgver="$_pkgverUpstream" +pkgrel=1 pkgdesc="Plugin for certbot for a DNS-01 challenge with a DuckDNS domain" arch=('any') url='https://github.com/infinityofspace/certbot_dns_duckdns' license=('MIT') depends=('certbot' 'python-dnspython' 'python-requests') -makedepends=( 'python-build' 'python-installer' 'python-wheel' ) +makedepends=( 'python-build' 'python-installer' 'python-wheel' 'python-setuptools') source=("https://github.com/infinityofspace/certbot_dns_duckdns/archive/refs/tags/v${_pkgverUpstream}.tar.gz") -sha256sums=('76ffe14b0bff703be3c5a6ebc0c390cb7941c26d14cca0da742d6ef3534e22b9') +sha384sums=('df71e7014252716790a058d375729926fd18db1b9d2066dc611ff3e869f5a49d626f03ca24af641f12614127da687602') build() { local srcRootDir="${srcdir}/certbot_dns_duckdns-${_pkgverUpstream}" diff --git a/linhes/certbot-dns-duckdns/__changelog b/linhes/certbot-dns-duckdns/__changelog new file mode 100644 index 0000000..d9862a1 --- /dev/null +++ b/linhes/certbot-dns-duckdns/__changelog @@ -0,0 +1 @@ +PKGBUILD: add to makedepends python-setuptools diff --git a/linhes/ckbcomp/.SRCINFO b/linhes/ckbcomp/.SRCINFO new file mode 100755 index 0000000..d41c3d6 --- /dev/null +++ b/linhes/ckbcomp/.SRCINFO @@ -0,0 +1,13 @@ +pkgbase = ckbcomp + pkgdesc = Compile a XKB keyboard description to a keymap suitable for loadkeys or kbdcontrol + pkgver = 1.244 + pkgrel = 1 + url = https://salsa.debian.org/installer-team/console-setup + arch = any + license = GPL-2.0-or-later + makedepends = git + source = console-setup-1.244.tar.gz::https://salsa.debian.org/installer-team/console-setup/-/archive/1.244/console-setup-1.244.tar.gz + sha256sums = f20bde550c8080140a062538d4157011152e57dcca3b9945fcdc6f1a8e5db383 + +pkgname = ckbcomp + depends = perl diff --git a/linhes/ckbcomp/.gitignore b/linhes/ckbcomp/.gitignore new file mode 100644 index 0000000..018a3de --- /dev/null +++ b/linhes/ckbcomp/.gitignore @@ -0,0 +1,4 @@ +* +!PKGBUILD +!.SRCINFO +!.gitignore diff --git a/linhes/ckbcomp/PKGBUILD b/linhes/ckbcomp/PKGBUILD index 9a37cf8..bcd46ce 100755..100644 --- a/linhes/ckbcomp/PKGBUILD +++ b/linhes/ckbcomp/PKGBUILD @@ -1,39 +1,26 @@ -# Maintainer: Nissar Chababy <funilrys at outlook dot com> -# Ex-Maintainer: Jeroen Bollen <jbinero at gmail dot comau> +# Maintainer: +# Contributor: Nissar Chababy <funilrys at outlook dot com> +# Contributor: Jeroen Bollen <jbinero at gmail dot comau> -pkgname=ckbcomp -pkgver=1.230 +_pkgname="ckbcomp" +pkgname="$_pkgname" +pkgver=1.244 pkgrel=1 pkgdesc="Compile a XKB keyboard description to a keymap suitable for loadkeys or kbdcontrol" -arch=(any) -url="http://anonscm.debian.org/cgit/d-i/console-setup.git/" -license=('GPL2') -depends=('perl') -source=("http://ftp.debian.org/debian/pool/main/c/console-setup/console-setup_${pkgver}.tar.xz") -sha512sums=('5c756f5d8101aa844efc11ad071efb69658234c349036b259c6fe1d6fda331aede333358269c483efad6613b81dff7da8e9224ef5224fce40e6a745331b56a7d') -conflicts=(ckbcomp-bin) +url="https://salsa.debian.org/installer-team/console-setup" +license=('GPL-2.0-or-later') +arch=('any') -package() { - if [[ -d "${srcdir}/console-setup" ]] - then - cd console-setup - elif [[ -d "${srcdir}/console-setup-${pkgver}" ]] - then - cd console-setup-${pkgver} - elif [[ -d "${srcdir}/work" ]] - then - cd work - else - echo "Source directory not found.". - exit 1 - fi +makedepends=('git') +_pkgsrc="console-setup-$pkgver" +_pkgext="tar.gz" +source=("$_pkgsrc.$_pkgext"::"$url/-/archive/$pkgver/$_pkgsrc.$_pkgext") +sha256sums=('f20bde550c8080140a062538d4157011152e57dcca3b9945fcdc6f1a8e5db383') - if [[ ${?} != 0 ]] - then - cd console-setup-${pkgver} - fi +package() { + depends+=('perl') - install -d ${pkgdir}/usr/bin/ - install -m755 Keyboard/ckbcomp ${pkgdir}/usr/bin/ + cd "$_pkgsrc" + install -Dm755 Keyboard/ckbcomp -t "$pkgdir/usr/bin/" } diff --git a/linhes/clean-chroot-manager/PKGBUILD b/linhes/clean-chroot-manager/PKGBUILD index e696da1..56dccdb 100644 --- a/linhes/clean-chroot-manager/PKGBUILD +++ b/linhes/clean-chroot-manager/PKGBUILD @@ -1,17 +1,15 @@ # Maintainer: graysky <therealgraysky AT protonmail DOT com> pkgname=clean-chroot-manager -pkgver=2.232 +pkgver=2.240 pkgrel=1 pkgdesc='Wrapper for managing clean chroot builds with local repo therein.' -arch=('any') +arch=(any) url='https://github.com/graysky2/clean-chroot-manager' -license=('MIT') -depends=('devtools>=1:1.0.0-1' 'rsync' 'libarchive>=3.3.3' 'pacman>=7.0.0-1') -conflicts=('clean_chroot_manager') -replaces=('clean_chroot_manager') +license=(MIT) +depends=('devtools>=1:1.0.0-1' rsync 'libarchive>=3.3.3' 'pacman>=7.0.0-1' bc) source=("$pkgname-$pkgver.tar.gz::https://github.com/graysky2/clean-chroot-manager/archive/v$pkgver.tar.gz") -b2sums=('533f38a80dae5777683f09ed5ea159a473dd36bba74d5758a1b3432d1705570e9e163dfe9def6570d51e8699385ac9d691489734d2a7f627e9af51e02659f07a') +b2sums=('94f25860f727ec1a34d7c64b0422ed582b356f8fb886adc3b68ac9810179faade028dd473e3297d849680552beb6a312fd90306c317dbbd3ae1a95c0630cfb2f') install=ccm.install build() { diff --git a/linhes/clean-chroot-manager/ccm.install b/linhes/clean-chroot-manager/ccm.install index e2cfd39..d84033d 100644 --- a/linhes/clean-chroot-manager/ccm.install +++ b/linhes/clean-chroot-manager/ccm.install @@ -3,7 +3,7 @@ post_upgrade() { # define the versions for which a change is needed - for test in 2.101-1 2.201-1 2.202-1 2.208-1 2.212-1 2.213-1 2.221-1 2.224-1; do + for test in 2.101-1 2.201-1 2.202-1 2.208-1 2.212-1 2.213-1 2.221-1 2.224-1 2.237-1 2.239-1; do if [ "$(vercmp $2 $test)" -lt 0 ]; then cat <<END diff --git a/linhes/dmg2img/0001-openssl-1.1-compatibility.patch b/linhes/dmg2img/0001-openssl-1.1-compatibility.patch new file mode 100644 index 0000000..b5ed45d --- /dev/null +++ b/linhes/dmg2img/0001-openssl-1.1-compatibility.patch @@ -0,0 +1,219 @@ +From f16f247d30f868e84f31e24792b4464488f1c009 Mon Sep 17 00:00:00 2001 +From: Peter Wu <peter@lekensteyn.nl> +Date: Tue, 2 May 2017 15:53:38 +0200 +Subject: [PATCH] vfdecrypt: OpenSSL 1.1 compatibility + +Allocate contexts from the heap on all OpenSSL versions, this is needed +since OpenSSL 1.1.0. No attempt is done at addressing issues like global +variables and fixing potential memleaks on error paths. + +Compile-tested only with OpenSSL 1.1.0e (Arch Linux) and OpenSSL 1.0.2g +(Ubuntu 16.04), I have no test file. + +Fixes https://github.com/Lekensteyn/dmg2img/issues/4 +--- + vfdecrypt.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 80 insertions(+), 23 deletions(-) + +diff --git a/vfdecrypt.c b/vfdecrypt.c +index 56d3530..b1a36d3 100644 +--- a/vfdecrypt.c ++++ b/vfdecrypt.c +@@ -183,7 +183,7 @@ void adjust_v2_header_byteorder(cencrypted_v2_pwheader *pwhdr) { + pwhdr->encrypted_keyblob_size = htonl(pwhdr->encrypted_keyblob_size); + } + +-HMAC_CTX hmacsha1_ctx; ++HMAC_CTX *hmacsha1_ctx; + AES_KEY aes_decrypt_key; + int CHUNK_SIZE=4096; // default + +@@ -196,9 +196,9 @@ void compute_iv(uint32_t chunk_no, uint8_t *iv) { + unsigned int mdLen; + + chunk_no = OSSwapHostToBigInt32(chunk_no); +- HMAC_Init_ex(&hmacsha1_ctx, NULL, 0, NULL, NULL); +- HMAC_Update(&hmacsha1_ctx, (void *) &chunk_no, sizeof(uint32_t)); +- HMAC_Final(&hmacsha1_ctx, mdResult, &mdLen); ++ HMAC_Init_ex(hmacsha1_ctx, NULL, 0, NULL, NULL); ++ HMAC_Update(hmacsha1_ctx, (void *) &chunk_no, sizeof(uint32_t)); ++ HMAC_Final(hmacsha1_ctx, mdResult, &mdLen); + memcpy(iv, mdResult, CIPHER_BLOCKSIZE); + } + +@@ -212,52 +212,75 @@ void decrypt_chunk(uint8_t *ctext, uint8_t *ptext, uint32_t chunk_no) { + /* DES3-EDE unwrap operation loosely based on to RFC 2630, section 12.6 + * wrapped_key has to be 40 bytes in length. */ + int apple_des3_ede_unwrap_key(uint8_t *wrapped_key, int wrapped_key_len, uint8_t *decryptKey, uint8_t *unwrapped_key) { +- EVP_CIPHER_CTX ctx; ++ EVP_CIPHER_CTX *ctx; + uint8_t *TEMP1, *TEMP2, *CEKICV; + uint8_t IV[8] = { 0x4a, 0xdd, 0xa2, 0x2c, 0x79, 0xe8, 0x21, 0x05 }; + int outlen, tmplen, i; + +- EVP_CIPHER_CTX_init(&ctx); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ ctx = EVP_CIPHER_CTX_new(); ++#else ++ ctx = malloc(sizeof(*ctx)); ++#endif ++ if (!ctx) { ++ fprintf(stderr, "Out of memory: EVP_CIPHER_CTX!\n"); ++ return(-1); ++ } ++ ++ EVP_CIPHER_CTX_init(ctx); + /* result of the decryption operation shouldn't be bigger than ciphertext */ + TEMP1 = malloc(wrapped_key_len); + TEMP2 = malloc(wrapped_key_len); + CEKICV = malloc(wrapped_key_len); + /* uses PKCS#7 padding for symmetric key operations by default */ +- EVP_DecryptInit_ex(&ctx, EVP_des_ede3_cbc(), NULL, decryptKey, IV); ++ EVP_DecryptInit_ex(ctx, EVP_des_ede3_cbc(), NULL, decryptKey, IV); + +- if(!EVP_DecryptUpdate(&ctx, TEMP1, &outlen, wrapped_key, wrapped_key_len)) { ++ if(!EVP_DecryptUpdate(ctx, TEMP1, &outlen, wrapped_key, wrapped_key_len)) { + fprintf(stderr, "internal error (1) during key unwrap operation!\n"); + return(-1); + } +- if(!EVP_DecryptFinal_ex(&ctx, TEMP1 + outlen, &tmplen)) { ++ if(!EVP_DecryptFinal_ex(ctx, TEMP1 + outlen, &tmplen)) { + fprintf(stderr, "internal error (2) during key unwrap operation!\n"); + return(-1); + } + outlen += tmplen; +- EVP_CIPHER_CTX_cleanup(&ctx); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_reset(ctx); ++#else ++ EVP_CIPHER_CTX_cleanup(ctx); ++#endif + + /* reverse order of TEMP3 */ + for(i = 0; i < outlen; i++) TEMP2[i] = TEMP1[outlen - i - 1]; + +- EVP_CIPHER_CTX_init(&ctx); ++ EVP_CIPHER_CTX_init(ctx); + /* uses PKCS#7 padding for symmetric key operations by default */ +- EVP_DecryptInit_ex(&ctx, EVP_des_ede3_cbc(), NULL, decryptKey, TEMP2); +- if(!EVP_DecryptUpdate(&ctx, CEKICV, &outlen, TEMP2+8, outlen-8)) { ++ EVP_DecryptInit_ex(ctx, EVP_des_ede3_cbc(), NULL, decryptKey, TEMP2); ++ if(!EVP_DecryptUpdate(ctx, CEKICV, &outlen, TEMP2+8, outlen-8)) { + fprintf(stderr, "internal error (3) during key unwrap operation!\n"); + return(-1); + } +- if(!EVP_DecryptFinal_ex(&ctx, CEKICV + outlen, &tmplen)) { ++ if(!EVP_DecryptFinal_ex(ctx, CEKICV + outlen, &tmplen)) { + fprintf(stderr, "internal error (4) during key unwrap operation!\n"); + return(-1); + } + + outlen += tmplen; +- EVP_CIPHER_CTX_cleanup(&ctx); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_reset(ctx); ++#else ++ EVP_CIPHER_CTX_cleanup(ctx); ++#endif + + memcpy(unwrapped_key, CEKICV+4, outlen-4); + free(TEMP1); + free(TEMP2); + free(CEKICV); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_free(ctx); ++#else ++ free(ctx); ++#endif + return(0); + } + +@@ -279,31 +302,46 @@ int unwrap_v1_header(char *passphrase, cencrypted_v1_header *header, uint8_t *ae + int unwrap_v2_header(char *passphrase, cencrypted_v2_pwheader *header, uint8_t *aes_key, uint8_t *hmacsha1_key) { + /* derived key is a 3DES-EDE key */ + uint8_t derived_key[192/8]; +- EVP_CIPHER_CTX ctx; ++ EVP_CIPHER_CTX *ctx; + uint8_t *TEMP1; + int outlen, tmplen; + ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ ctx = EVP_CIPHER_CTX_new(); ++#else ++ ctx = malloc(sizeof(*ctx)); ++#endif ++ if (!ctx) { ++ fprintf(stderr, "Out of memory: EVP_CIPHER_CTX!\n"); ++ return(-1); ++ } ++ + PKCS5_PBKDF2_HMAC_SHA1(passphrase, strlen(passphrase), (unsigned char*)header->kdf_salt, 20, + PBKDF2_ITERATION_COUNT, sizeof(derived_key), derived_key); + + print_hex(derived_key, 192/8); + +- EVP_CIPHER_CTX_init(&ctx); ++ EVP_CIPHER_CTX_init(ctx); + /* result of the decryption operation shouldn't be bigger than ciphertext */ + TEMP1 = malloc(header->encrypted_keyblob_size); + /* uses PKCS#7 padding for symmetric key operations by default */ +- EVP_DecryptInit_ex(&ctx, EVP_des_ede3_cbc(), NULL, derived_key, header->blob_enc_iv); ++ EVP_DecryptInit_ex(ctx, EVP_des_ede3_cbc(), NULL, derived_key, header->blob_enc_iv); + +- if(!EVP_DecryptUpdate(&ctx, TEMP1, &outlen, header->encrypted_keyblob, header->encrypted_keyblob_size)) { ++ if(!EVP_DecryptUpdate(ctx, TEMP1, &outlen, header->encrypted_keyblob, header->encrypted_keyblob_size)) { + fprintf(stderr, "internal error (1) during key unwrap operation!\n"); + return(-1); + } +- if(!EVP_DecryptFinal_ex(&ctx, TEMP1 + outlen, &tmplen)) { ++ if(!EVP_DecryptFinal_ex(ctx, TEMP1 + outlen, &tmplen)) { + fprintf(stderr, "internal error (2) during key unwrap operation!\n"); + return(-1); + } + outlen += tmplen; +- EVP_CIPHER_CTX_cleanup(&ctx); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_free(ctx); ++#else ++ EVP_CIPHER_CTX_cleanup(ctx); ++ free(ctx); ++#endif + memcpy(aes_key, TEMP1, 16); + memcpy(hmacsha1_key, TEMP1, 20); + +@@ -446,8 +484,21 @@ int main(int argc, char *argv[]) { + CHUNK_SIZE = v2header.blocksize; + } + +- HMAC_CTX_init(&hmacsha1_ctx); +- HMAC_Init_ex(&hmacsha1_ctx, hmacsha1_key, sizeof(hmacsha1_key), EVP_sha1(), NULL); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ hmacsha1_ctx = HMAC_CTX_new(); ++#else ++ hmacsha1_ctx = malloc(sizeof(*hmacsha1_ctx)); ++#endif ++ if (!hmacsha1_ctx) { ++ fprintf(stderr, "Out of memory: HMAC CTX!\n"); ++ exit(1); ++ } ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ HMAC_CTX_reset(hmacsha1_ctx); ++#else ++ HMAC_CTX_init(hmacsha1_ctx); ++#endif ++ HMAC_Init_ex(hmacsha1_ctx, hmacsha1_key, sizeof(hmacsha1_key), EVP_sha1(), NULL); + AES_set_decrypt_key(aes_key, CIPHER_KEY_LENGTH * 8, &aes_decrypt_key); + + if (verbose >= 1) { +@@ -472,5 +523,11 @@ int main(int argc, char *argv[]) { + } + + if (verbose) fprintf(stderr, "%"PRIX32" chunks written\n", chunk_no); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ HMAC_CTX_free(hmacsha1_ctx); ++#else ++ HMAC_CTX_cleanup(hmacsha1_ctx); ++ free(hmacsha1_ctx); ++#endif + return(0); + } diff --git a/linhes/dmg2img/PKGBUILD b/linhes/dmg2img/PKGBUILD new file mode 100644 index 0000000..aaed16b --- /dev/null +++ b/linhes/dmg2img/PKGBUILD @@ -0,0 +1,31 @@ +# Maintainer: Jerome Leclanche <jerome@leclan.ch> + +pkgname=dmg2img +pkgver=1.6.7 +pkgrel=5 +pkgdesc="A CLI tool to uncompress Apple's compressed DMG files to the HFS+ IMG format" +arch=("i686" "x86_64") +url="http://vu1tur.eu.org/tools/" +license=("GPL2") +depends=("openssl" "bzip2") +source=( + "http://vu1tur.eu.org/tools/$pkgname-$pkgver.tar.gz" + "0001-openssl-1.1-compatibility.patch" +) +sha256sums=('02aea6d05c5b810074913b954296ddffaa43497ed720ac0a671da4791ec4d018' + '021f14fc5f3b8dc058b604c6e3be6401124e4cc715df4c7f08a1175ef7e5183b') + +prepare() { + cd "$srcdir/$pkgname-$pkgver" + patch -Np1 --ignore-whitespace -i "$srcdir/0001-openssl-1.1-compatibility.patch" +} + +build() { + cd "$srcdir/$pkgname-$pkgver" + make PREFIX="/usr" +} + +package() { + cd "$srcdir/$pkgname-$pkgver" + make PREFIX="/usr" DESTDIR="$pkgdir" install +} diff --git a/linhes/libhdhomerun/PKGBUILD b/linhes/libhdhomerun/PKGBUILD index 1ab1674..74944ce 100644 --- a/linhes/libhdhomerun/PKGBUILD +++ b/linhes/libhdhomerun/PKGBUILD @@ -2,7 +2,7 @@ # Contributor: Grey Christoforo <first name [at] last name [dot] net> pkgname=libhdhomerun -pkgver=20230719 +pkgver=20250506 pkgrel=1 pkgdesc="Library and command line utility for interfacing with HDHomeRun device" arch=('i686' 'x86_64' 'arm' 'armv6h' 'armv7h' 'aarch64') @@ -12,7 +12,7 @@ optdepends=('hdhomerun-firmware-bin: firmware for hdhomerun devices' 'hdhomerun_config_gui: hdhomerun configuration gui') source=("https://download.silicondust.com/hdhomerun/${pkgname}_${pkgver}.tgz") -sha512sums=('da7e8a2a93f60b74103556d1326770243d403844a45fc0583603d8a611946346d4da90cfa6ca239f4f903ac853635b9dd884b5f56af7dff3e4bf230ce700e524') +sha512sums=('6216076924f2b265c03353460cbd23f914b217ac5b8de2ea153be7bdfb2b7ea93926c6f4d956103493274410240905d754d17a7bad209fbc183fa3cf51271478') build() { cd "$srcdir/$pkgname" diff --git a/linhes/libsignal-client/PKGBUILD b/linhes/libsignal-client/PKGBUILD index c390314..3002ea6 100644 --- a/linhes/libsignal-client/PKGBUILD +++ b/linhes/libsignal-client/PKGBUILD @@ -3,13 +3,14 @@ pkgname=libsignal-client _pkgname=libsignal _libname=libsignal_jni -pkgver=0.65.2 +_java_version=17 +pkgver=0.86.1 pkgrel=1 pkgdesc='Library for the Signal Protocol.' url="https://github.com/signalapp/${_pkgname}" -depends=('gcc-libs') +depends=('gcc-libs' 'java-runtime') checkdepends=('cargo') -makedepends=('cargo' 'gradle' 'git' 'zip' 'protobuf' 'cmake' 'clang' 'java-environment=17') +makedepends=('cargo' 'gradle' 'git' 'zip' 'protobuf' 'cmake' 'clang' "java-environment=${_java_version}" 'python') options=(!lto) arch=('i686' 'x86_64' 'armv6h' 'armv7h' 'aarch64') license=('AGPL-3.0-only') @@ -17,7 +18,7 @@ source=( "${_pkgname}-${pkgver}.tar.gz::https://github.com/signalapp/${_pkgname}/archive/refs/tags/v$pkgver.tar.gz" ) -sha512sums=('96ada8462dcde98ee12eb12bd6ebb62f84105792c7337c3c3e7651b19fa22cd6cc7c3a414d04c309780cd3455c82620b95ad2e73c1916606d9f29bd07a0a3f03') +sha512sums=('dcc66b97cdee3439add283935fd72d7ec5d30958d022094775ec508618e863f5da8a0f9cc74200c5e41f723c0a84a9667b23e84b9b27f6b0ef037bc94bc380e3') prepare() { tar xf "${_pkgname}-$pkgver.tar.gz" @@ -38,8 +39,10 @@ build() { export RUSTUP_TOOLCHAIN=stable export CARGO_TARGET_DIR=target + export CARGO_NET_GIT_FETCH_WITH_CLI=true + export JAVA_HOME="$(ls -d /usr/lib/jvm/java-${_java_version}-* | head -n1)" ./build_jni.sh desktop - GRADLE_USER_HOME="${srcdir}/.gradle" gradle --no-daemon :client:assemble -PskipAndroid=true + GRADLE_USER_HOME="${srcdir}/.gradle" ./gradlew --no-daemon :client:assemble -PskipAndroid=true zip -d "client/build/libs/libsignal-client-${pkgver}.jar" "${_libname}*.so" } diff --git a/linhes/linhes-dev/PKGBUILD b/linhes/linhes-dev/PKGBUILD index 3466fdf..5033678 100644 --- a/linhes/linhes-dev/PKGBUILD +++ b/linhes/linhes-dev/PKGBUILD @@ -1,6 +1,6 @@ pkgname=linhes-dev pkgver=9.0.0 -pkgrel=16 +pkgrel=17 pkgdesc="Scripts to develop LinHES" arch=('x86_64') license=('GPL2') @@ -11,7 +11,7 @@ source=('lh_sync.sh' 'chk_aur_pkg.py' 'mp.py' 'lh_setup_dev.sh' 'lh_update_db_re sha256sums=('3a64b4125b56c6f95cc9dc85ce58ebd1c0612b22fb27c3e76d4d9a5570f2d61e' 'a097438b19725fb1b02c7b2587e06450ab4c757cf60b25b5f0256ff0c38146ee' '025776558632dc60da5a97cc66a4fb52b31882eff7aeaf5476a8e40107e39a87' - '0b9d0bb16700a06f201bfc701ba94ec65045bac50c77a389dbbdf7543def5896' + '00dd52ee2ea0663b874b00488742ecb0fb1830c270cb2134d00ef9a32a71d7a1' '86c9ebe77228f7e3cc07cb05f480e5584e0e3cad1b889b63a50821f7323bf449') package() { diff --git a/linhes/linhes-dev/lh_setup_dev.sh b/linhes/linhes-dev/lh_setup_dev.sh index f0cc94c..a6aedc2 100755 --- a/linhes/linhes-dev/lh_setup_dev.sh +++ b/linhes/linhes-dev/lh_setup_dev.sh @@ -13,6 +13,7 @@ mkdir -p /data/dev/pkg_repo/src_packages/linhes-testing echo -e "\n\nChanging setting in /etc/makepkg.conf..." #sudo sed -i 's/#PKGDEST=.*/PKGDEST=\/data\/dev\/pkg_repo\/packages/' /etc/makepkg.conf +sudo sed -i 's/OPTIONS=.*/OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug lto)/' /etc/makepkg.conf sudo sed -i 's/#SRCDEST=.*/SRCDEST=\/data\/dev\/pkg_repo\/sources/' /etc/makepkg.conf sudo sed -i 's/#SRCPKGDEST=.*/SRCPKGDEST=\/data\/dev\/pkg_repo\/src_packages/' /etc/makepkg.conf sudo sed -i 's/#PACKAGER=.*/PACKAGER=\"LinHESDev <LinHESDev\@linhes.org>\"/' /etc/makepkg.conf @@ -73,5 +74,5 @@ fi # linhes.org. This involves creating a public ssh key and supplying it to # one of the linhes.org admins. The key is created using ssh-keygen. The # resulting public key will be stored in .ssh/id_rsa.pub. -echo -e "\n\nCheckout the repo manually. You will need to be given a dev account on linhes.org. This involves creating a public ssh key and supplying it toone of the linhes.org admins. The key is created using ssh-keygen. The resulting public key will be stored in .ssh/id_rsa.pub." -echo -e "EXAMPLE: \ncd /data/dev\ngit clone git@linhes.org:linhes_pkgbuild\ngit checkout testing\n\n" +echo -e "\n\nCheckout the repo manually. You will need to be given a dev account on linhes.org. This involves creating a public ssh key and supplying it to one of the linhes.org admins. The key is created using ssh-keygen. The resulting public key will be stored in .ssh/id_rsa.pub." +echo -e "EXAMPLE: \ncd /data/dev\ngit clone git@linhes.org:linhes_pkgbuild\ncd ./linhes_pkgbuild\ngit checkout testing\n\n" diff --git a/linhes/linhes-system/69-hdparm.rules b/linhes/linhes-system/69-hdparm.rules new file mode 100644 index 0000000..414698e --- /dev/null +++ b/linhes/linhes-system/69-hdparm.rules @@ -0,0 +1 @@ +ACTION=="add|change", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="sd*", ATTRS{queue/rotational}=="1", RUN+="/usr/bin/hdparm -B 254 -S 0 $env{DEVNAME}" diff --git a/linhes/linhes-system/PKGBUILD b/linhes/linhes-system/PKGBUILD index b86b1f8..91abbd9 100755 --- a/linhes/linhes-system/PKGBUILD +++ b/linhes/linhes-system/PKGBUILD @@ -1,14 +1,15 @@ pkgname=linhes-system pkgver=9.0.0 -pkgrel=89 +pkgrel=100 arch=('x86_64') #install=$pkgname.install pkgdesc="Everything that makes LinHES a system" license=('GPL2') depends=('cronie' 'dbus-python' 'dvb-firmware' 'expect' 'flatpak' 'firefox' 'glances' 'inetutils' 'kdialog' 'kwalletmanager' 'libnotify' - 'logrotate' 'linhes-templates' 'linhes-theme' 'mlocate' 'moreutils' 'ncdu' 'python-dateutil' 'python-pytz' - 'python-tzlocal' 'openssh' 'pacman-contrib' 'rsyslog' 'ttf-overlock' 'wget' 'x11vnc' + 'logrotate' 'linhes-templates' 'linhes-theme' 'mlocate' 'moreutils' 'ncdu' 'pacman-contrib' + 'plasma-x11-session' 'python-dateutil' 'python-pytz' 'python-tzlocal' 'openssh' + 'rsyslog' 'ttf-overlock' 'wget' 'x11vnc' 'intel-media-driver' 'libva-intel-driver' 'pigz') binfiles="add_storage.py balance_storage_groups.py empty_storage_groups.py remove_storage.py checkXFSfrag.sh enableIRWake.sh idle.py lh_system_start.sh lh_notify-send @@ -23,22 +24,22 @@ source=($binfiles 'lh_mtc.cron' 'paccache.cron' 'flatpak_update.cron' 'xfs_defrag.cron' 'pacman_orphans.cron' 'readme_is_xml' 'add_storage.readme' 'LinHES-release' 'lh_log_care.cron' '79-cronie.hook' 'fstrim.hook' 'openssh.hook' 'plex_lib.conf' 'rsyslog.hook' - '10-monitor.conf' '81-wol.rules' 'x11vnc.override.conf' 'lh_lighttpd.conf' 'lh_php.ini' + '10-monitor.conf' '81-wol.rules' '69-hdparm.rules' 'x11vnc.override.conf' 'lh_lighttpd.conf' 'lh_php.ini' 'system-sudo.rules' 'linhes-profile.sh' 'lh_sqlserver.cnf' 'lh_restart_needed.hook' 'lh_system_start.sh.desktop' 'rc6_mce.toml' 'recordings.cron' 'rsyslog.mythtv.conf') -sha256sums=('e6eaa2fb4819fa60cb05b4d2e7328d2914af3a73028a735ec4d56e7ece33ecc0' - '1115809a2d80c1ead7cfc5df05e1d6427255912a8303594574b3be23d3d3e4f1' - '97fe9e851c782fa9f85c5b69b110ccff2817dd4fa2a6d9ff6ee225dc558677e4' +sha256sums=('1fb11c7f472df9e3066866301962c2678b80c2fbd988dc34db022d51e1101a42' + '8ae6de3d0ff8e777aeea56f74f38676080142148ac3a32f828462d85c39e7cf7' + '79a3fe8622dbc5351316c0e36c26f8443334fcf8eea324cf0a0efe0e4c2c1a93' 'ff261f41efec8a9963f9f59100cbe75f015028a2ed3a863ce0cb473f2ebb7b76' '8b54c31b8efde3917f603c5307bebb0a2a00239ad9a983c2f5d8120003256449' 'ae34515e144830f424d3bd3f6b1b446892d62beed20bca6f0fb19b0bbb779f27' - '9e52a21e9d0f3f993b819587256a1cd57dca04451d5f2d0fd76667b1d3f860f1' - 'fbd1640106b3d9356452625753a6f1974e0be905b9f4732a1287b3905806cba8' + 'a79edfeb88b90a8f5538a159b39ba235caba8c6d6b2a39a20faa3ae0301b770b' + '050d7d44b1636a298ae020807e64637b40d39b4c52eb2f9661fe30090e66cee3' '1c36e4fdf41c1063e0a127ce4a90fbdef19879c381a87f622d7399ca931560cc' '87875d9e5f5ce18208f419698ce69b6bcbcd08955a57a4a13940e715af58b787' - '93d664f4a46fda05d0f754d19df40cbda120e325b80c07092345b14763993833' + '192bfff1b8d46e0ebb969618847d9993aba3b1b578053c8d701dad9f9e758f86' 'a523388ffdc6f30f2dd2ef4803b21bded8a35bfded499dc66b786adec71840a3' - '6ea7f807a29631e33629da14e7ca6481310f0416c5d6f8fb415a76fa90fb9b76' + 'eec03b722449a55e589eb79aade87e9b2a964e82b8fe23723016b640a079de2a' '91bdec992bb2c933e15625c181f2195c402060b879168ebf35944cb064c904b9' '5cacfdd02833e5a3130d765573e772e6bd5030336ba86239c5e4db5ffa36fc69' 'd51253c207d3315997d7122cb774c6d0fc38975c33e66bf416f0b1b95cf86e5b' @@ -47,7 +48,7 @@ sha256sums=('e6eaa2fb4819fa60cb05b4d2e7328d2914af3a73028a735ec4d56e7ece33ecc0' 'cd3306991c8b63f5402c0e52405cc1a6581cb3c42af74b7c2f879c8192f95610' 'e371c6a289c68fe200d7da856c20a8c579efa23178f4d62235f7359d7f6e49a1' 'ee9a4df83e463e0c8a2e862680a83cff07a36cf3606faf60f57bc11190ffb1c9' - '7b39ddc6ec31322c679a15349a567e4fae5c808769443b7bf4a4d8ee882259e6' + 'f051f5111238f6f391108e68071ab02f200cfc6c4d2e34ae98f7a29057dbdf75' 'd2d69b2bf6315bd37ff5f5b2f0cde8ab2fb89bae18f8796dc5208ffc1a9d743e' 'a745356952470a5d718bef1961309ea30e4fa6a2860961cd52e09d6ec11e708e' '1819085bd2c9106482c5f243b95fddf3dae69212330ab76cb493add5c26a45a4' @@ -76,12 +77,13 @@ sha256sums=('e6eaa2fb4819fa60cb05b4d2e7328d2914af3a73028a735ec4d56e7ece33ecc0' '6c42b2920c6a37bf3dd05755b9e3fdd80137708cc55a7d1bef2234c17dff0349' '09b9c1b2ee6a5bbe48c5f3755ad64628487b60a4eb6734efb292cefdb74fb657' 'efc2a04b67ea76661157e154228d4b58ae2e1b652f8ce41bc001a5a863d13573' + '7571e230ab4cf2a1285fdb9762d87d350ea350ce820e5806143b402aa1ea37e0' '67d0cb111d47609de4c60b84dc617fc817fdf092763fbd0cef270b5ee650d702' '023cba18580819018413608ec055d5ff8166b69525c32aa728ad1ecd7cf00aca' 'dae799f09a076e0f573ea516bc357f56f2fd3aa8e35ec0cf54b6b62282960ee0' 'aa1d831f25317a9cb8d7e9a7d7b6d51c8d03bd5b69f3bec27bea7644ca38fe9a' - 'cf884bad5caab9d5901b88b0ef41e3a39ea0b7a4614b8d14707d79941c899cbf' - '3ed91fb5a7894f82fb4895e06d2e3f1df3ac4f82e46c970d4a85aaa4edc24cf1' + '2553c3a877b6b18eed8269d5d78bd5676cd52fa5ead5b99a02f42bd134f12040' + '01416dadeb34ca8b18bb7326113672b3888b16a60133d501d48610d23b74d1eb' '197ff4bb3c1cafcb197268cac335f1f75ae26873aca5833d62cc51fade85176c' '0b9868a563036c81f8fdb8ab8bbad51934aca2a07e9d7634e24214791afda8e2' '1b965b5e7eeafdf3815c8f2722587a560693dd780327cca9910dc47fba0f1aef' @@ -156,6 +158,7 @@ package() { chmod 750 ${pkgdir}/etc/sudoers.d/ #udev rules + install -Dm0644 "${srcdir}/69-hdparm.rules" "${pkgdir}/etc/udev/rules.d/69-hdparm.rules" install -Dm0644 "${srcdir}/81-wol.rules" "${pkgdir}/etc/udev/rules.d/81-wol.rules" #disable dpms diff --git a/linhes/linhes-system/add_storage.py b/linhes/linhes-system/add_storage.py index cc6feb5..318e77b 100755 --- a/linhes/linhes-system/add_storage.py +++ b/linhes/linhes-system/add_storage.py @@ -5,7 +5,7 @@ #Disks that are mounted, in fstab, size < 5000 bytes, optical or #have already been seen will not be presented as an option. # -# Version 2.0.2 +# Version 2.1.0 import dbus import pickle @@ -147,7 +147,8 @@ class disk_device: return True def get_is_device(self): - match = re.search(r'part\d+$', self.device_file_path) + #match = re.search(r'part\d+$', self.device_file_path) + match = re.search(r'part\d+$', self.device_id) if match is None: return True else: @@ -214,6 +215,20 @@ class disk_device: if i[1] in mp: fstype = i[2] break + + loop = True + prompt = ''' + Format disk with what filesystem (xfs/ext4)?:''' + + while loop: + str1 = input(prompt) + + if str1 in ['xfs','ext4']: + loop = False + fstype=str1 + break + print("\n") + return fstype def lookup_format(self): diff --git a/linhes/linhes-system/balance_storage_groups.py b/linhes/linhes-system/balance_storage_groups.py index d91da60..8776428 100755 --- a/linhes/linhes-system/balance_storage_groups.py +++ b/linhes/linhes-system/balance_storage_groups.py @@ -89,7 +89,7 @@ if __name__ == '__main__': for dir in SGDIRSdata: mostFull = SGDIRSdata[i] i=i+1 - if len(glob.glob1(mostFull[0],"*.ts")) or len(glob.glob1(mostFull[0],"*.mpg")) or len(glob.glob1(mostFull[0],"*.nuv")): + if len(glob.glob(mostFull[0] + "*.ts")) or len(glob.glob(mostFull[0] + "*.mpg")) or len(glob.glob(mostFull[0] + "*.nuv")): break else: if i == 1: diff --git a/linhes/linhes-system/empty_storage_groups.py b/linhes/linhes-system/empty_storage_groups.py index 708c118..c36437e 100755 --- a/linhes/linhes-system/empty_storage_groups.py +++ b/linhes/linhes-system/empty_storage_groups.py @@ -1,6 +1,6 @@ #!/usr/bin/python -import argparse, glob, operator, os, random, shutil, subprocess, sys, signal +import argparse, glob, operator, os, random, shutil, subprocess, sys, signal, time shouldQuit = False def getFreeSpaceForDir(dir): @@ -24,6 +24,8 @@ def sizeof_fmt(num, suffix='B'): return "%.1f %s%s" % (num, 'Yi', suffix) def signal_handler(signal, frame): + if isBusy: + sys.exit(0) print("\nWill quit when file has been moved.\nMoving File...") global shouldQuit shouldQuit = True @@ -101,7 +103,7 @@ if __name__ == '__main__': print(" " + directory + " - Not Mounted") continue # Check if SG has data files to move - if len(glob.glob1(directory,"*.ts")) or len(glob.glob1(directory,"*.mpg")) or len(glob.glob1(directory,"*.nuv")) or len(glob.glob1(directory,"*.jpg")): + if len(glob.glob(directory + "*.ts")) or len(glob.glob(directory + "*.mpg")) or len(glob.glob(directory + "*.nuv")) or len(glob.glob(directory + "*.jpg")): freePcent = getFreePercentForDir(directory) freeSize = getFreeSpaceForDir(directory) SGDIRSdata.append([directory, freePcent, freeSize]) @@ -114,7 +116,7 @@ if __name__ == '__main__': sys.exit(0) # Exit if no SGs with data found - if SGcnt is 0: + if SGcnt == 0: print("\n'" + SGgrp + "' Storage Group directories have no files to move. Exiting.") sys.exit(0) @@ -163,11 +165,19 @@ if __name__ == '__main__': print("Check Only option was used. No files were moved.") shouldQuit = True else: - print("------------------------------------------------") - print("Checking System Status...") - if subprocess.call(["/usr/bin/python", "/usr/bin/idle.py", "-s"]): - print(" System is busy. The file will not be moved.") - sys.exit() + global isBusy + isBusy = True + while isBusy: + if shouldQuit: + sys.exit(0) + print("------------------------------------------------") + print("Checking System Status...") + if subprocess.call(["/usr/bin/python", "/usr/bin/idle.py", "-s"]): + print(" System is busy. The file will not be moved.") + print(" Waiting 5 minutes before trying again.") + time.sleep(300) + else: + isBusy = False print("Moving File...") try: shutil.move(filePathToMove, leastFull[0]) diff --git a/linhes/linhes-system/idle.py b/linhes/linhes-system/idle.py index 3f4b3bc..4b2db1e 100755 --- a/linhes/linhes-system/idle.py +++ b/linhes/linhes-system/idle.py @@ -1,7 +1,8 @@ #!/usr/bin/python -import argparse, os, re, subprocess, sys, time +import argparse, os, re, requests, subprocess, sys, time from datetime import datetime, date, timedelta +import xml.etree.ElementTree as ET def msg(cmdargs,msg): if cmdargs.silent is False: @@ -237,24 +238,31 @@ def mythfe_check(cmdargs,cursor,mythDB): for i in frontends: try: + URL = f"http://{i[0]}:6547/Frontend/GetStatus" msg(cmdargs," Checking %s's mythfrontend status..." %i) - frontend = mythDB.getFrontend(''.join(i)) + response = requests.get(URL, timeout=3) + root = ET.fromstring(response.text) + # Find the current location and state in the State element + state_element = root.find('State') + if state_element is not None: + location = state_element.find(".//String[Key='currentlocation']/Value") + state = state_element.find(".//String[Key='state']/Value") + if ( cmdargs.runningfe ): msg(cmdargs," %s's mythfrontend is RUNNING." %i) return False - location = frontend.sendQuery('Location') - if location == "standbymode": + if location is not None and location.text == "standbymode": msg(cmdargs," %s's mythfrontend is in Standby Mode." %i) continue - if ( location.startswith('Playback ') ): + if state is not None and state.text.startswith('Watching'): msg(cmdargs," %s's mythfrontend is PLAYING." %i) return False else: msg(cmdargs," %s's mythfrontend is NOT playing." %i) - if '.xml' in location or 'mainmenu' in location: + if location is not None and '.xml' in location.text or 'mainmenu' in location.text: msg(cmdargs," %s's mythfrontend is in MENUS." %i) else: #FE is not in menus, so it must be active in a plugin diff --git a/linhes/linhes-system/lh_apply_UI_settings.sh b/linhes/linhes-system/lh_apply_UI_settings.sh index e49d98f..442a15f 100755 --- a/linhes/linhes-system/lh_apply_UI_settings.sh +++ b/linhes/linhes-system/lh_apply_UI_settings.sh @@ -1,8 +1,11 @@ #!/bin/bash -cp /usr/share/linhes/templates/plasma-org.kde.plasma.desktop-appletsrc ~/.config/ -plasma-apply-wallpaperimage /usr/share/linhes/templates/lights-bud-abstract-4k-cq.jpg -plasma-apply-colorscheme BreezeDark +if [ ! -f ~/.config/lh_configured ]; then + #cp /usr/share/linhes/templates/plasma-org.kde.plasma.desktop-appletsrc ~/.config/ + sed -i 's/launchers=.*/launchers=applications:systemsettings.desktop,preferred:\/\/filemanager,applications:org.kde.konsole.desktop,preferred:\/\/browser,applications:mythfrontend.desktop/' ~/.config/plasma-org.kde.plasma.desktop-appletsrc + plasma-apply-wallpaperimage /usr/share/linhes/templates/lights-bud-abstract-4k-cq.jpg + plasma-apply-colorscheme BreezeDark +fi kwriteconfig6 --group KDE --key SingleClick false kwriteconfig6 --file ~/.config/kscreenlockerrc --group Daemon --key Autolock false diff --git a/linhes/linhes-system/lh_myth_status.py b/linhes/linhes-system/lh_myth_status.py index c682d1c..2ed3d42 100755 --- a/linhes/linhes-system/lh_myth_status.py +++ b/linhes/linhes-system/lh_myth_status.py @@ -1,12 +1,9 @@ #!/usr/bin/python #This program is called on login to display the status of mythtv tuners & recording status -#Also will display alerts generated by xymon. If the location of xymon changes, this script needs to be updated. from MythTV import MythBE,MythDB,MythLog import datetime,pytz,re,socket,subprocess,sys,time from dateutil.parser import parse -from tzlocal import get_localzone - import os,glob from socket import gethostname; @@ -41,69 +38,6 @@ def formatTD(td): return_string = '%s%s%s%s' % (day_string, hour_string, minute_string, second_string) return return_string -def print_alerts(): - dir_name = "/home/xymon/var/login_alerts" - out_alert="" - try: - os.chdir(dir_name) - except: - pass - #print " myth_status: Couldn't change dir to %s" %dir_name - - file_list=glob.glob("*") - - if len(file_list) == 0: - #print " myth_status: no alert files found" - pass - else: - for alert_file in file_list: - out_line='' - datahost = '' - dataservice = '' - datacolor = '' - datadown = '' - try: - #print " myth_staus: reading in %s" %alert_file - f=open(alert_file,'r') - lines=f.readlines() - f.close() - except: - #print " myth_status: Couldn't open %s for reading" %alert_file - continue - - for line in lines: - try: - data,value=line.split(":") - except: - continue #exception occured try the next line - - if data == 'HOST': - datahost = value.strip() - elif data == 'SERVICE': - dataservice = value.strip() - elif data == 'COLOR': - datacolor = value.strip() - elif data == 'DOWN': - datadown = value.strip() - sec=int(datadown) - td_sec = datetime.timedelta(seconds=sec) - td_sec_formated = formatTD(td_sec) - - out_line =" %s on %s %s for %s \n" %(dataservice, - datahost,datacolor.upper(), - td_sec_formated) - out_alert += out_line - - print("System Alerts:") - print("--------------") - if len(out_alert) > 0: - print(out_alert) - print(" Go to http://%s and click Health & Maintenance for more information." %gethostname()) - else: - print(" All systems OK") - - return - #------------------------------------------- @@ -112,7 +46,6 @@ class tuner_recording_status: def __init__ (self,num_upcoming): self.now = datetime.datetime.now(pytz.utc) - self.currTZ = get_localzone() self.farout=99999999 self.next_start_diff=datetime.timedelta(self.farout) self.num_upcoming=num_upcoming @@ -186,7 +119,7 @@ class tuner_recording_status: title_chan="%s (%s)" %(i.title, i.channame) # convert timezone to local timezone start_time=parse(str(i.starttime)) - start_time=start_time.astimezone(self.currTZ) + start_time=start_time.astimezone() start_time_out=start_time.strftime("%a %b %d %I:%M%p") self.upcoming_list.append([start_time_out,i.hostname, title_chan]) @@ -234,7 +167,7 @@ class tuner_recording_status: title_chan="%s (%s)" %(i.title, i.channame) # convert timezone to local timezone start_time=parse(str(i.starttime)) - start_time=start_time.astimezone(self.currTZ) + start_time=start_time.astimezone() start_time_out=start_time.strftime("%a %b %d %I:%M%p") out_line=(start_time_out,i.hostname,title_chan) self.conflict_list.append(out_line) @@ -264,7 +197,6 @@ def go(): tuner.print_upcoming_recordings() tuner.print_conflict_list() tuner.print_next_start_time() - #print_alerts() if __name__ == "__main__": diff --git a/linhes/linhes-system/lh_sqlserver.cnf b/linhes/linhes-system/lh_sqlserver.cnf index be2d5bd..6475ea2 100644 --- a/linhes/linhes-system/lh_sqlserver.cnf +++ b/linhes/linhes-system/lh_sqlserver.cnf @@ -41,9 +41,10 @@ datadir=/data/srv/mysql skip-external-locking +skip-name-resolve=ON net_buffer_length = 8K -key_buffer_size = 768M +key_buffer_size = 512M max_allowed_packet = 1M tmp_table_size = 256M max_heap_table_size = 256M @@ -55,9 +56,10 @@ thread_cache_size = 8 query_cache_type = 0 query_cache_size = 0 query_cache_limit = 2M -join_buffer_size = 1M -ignore-db-dir = lost+found +join_buffer_size = 2M +ignore_db_dirs = lost+found table_open_cache = 5000 +table_definition_cache = 800 open_files_limit = 10000 # Uncomment the following if you are using InnoDB tables @@ -66,14 +68,13 @@ open_files_limit = 10000 #innodb_log_group_home_dir = /var/lib/mysql # You can set .._buffer_pool_size up to 50 - 80 % # of RAM but beware of setting memory usage too high -#innodb_buffer_pool_size = 16M +innodb_buffer_pool_size = 1500M #innodb_additional_mem_pool_size = 2M # Set .._log_file_size to 25 % of buffer pool size -innodb_log_file_size = 16M -#innodb_log_buffer_size = 8M +innodb_log_file_size = 375M +innodb_log_buffer_size = 32M #innodb_flush_log_at_trx_commit = 1 #innodb_lock_wait_timeout = 50 -innodb_buffer_pool_instances = 1 # This group is only read by MariaDB-10.8 servers. # If you use the same .cnf file for MariaDB of different versions, diff --git a/linhes/linhes-system/lh_system_backup_job b/linhes/linhes-system/lh_system_backup_job index 6d16596..e45d6ea 100755 --- a/linhes/linhes-system/lh_system_backup_job +++ b/linhes/linhes-system/lh_system_backup_job @@ -27,7 +27,7 @@ do fi done -if [ `mountpoint -q $BACKUPDISK 2> /dev/null` ]; then +if ! mountpoint -q "$BACKUPDISK"; then echo " The system doesn't have a second drive. Backup skipped." exit $backup_status fi diff --git a/linhes/linhes-system/lh_system_start.sh b/linhes/linhes-system/lh_system_start.sh index d1bd2b9..b783535 100755 --- a/linhes/linhes-system/lh_system_start.sh +++ b/linhes/linhes-system/lh_system_start.sh @@ -40,7 +40,7 @@ function bashrc_setup(){ function nanorc_setup(){ sudo sed -i 's/# set tabsize.*/set tabsize 4/' /etc/nanorc sudo sed -i 's/# set tabstospaces.*/set tabstospaces/' /etc/nanorc - sudo sed -i 's/# include "\/usr\/share\/nano\/\*.nanorc"/include "\/usr\/share\/nano\/\*.nanorc"/' /etc/nanorc + sudo sed -i 's/.*\/usr\/share\/nano\/\*.nanorc.*/include \/usr\/share\/nano\/\*.nanorc/' /etc/nanorc } function storage_scan(){ diff --git a/linhes/linhes-system/linhes-profile.sh b/linhes/linhes-system/linhes-profile.sh index df98315..f558673 100644 --- a/linhes/linhes-system/linhes-profile.sh +++ b/linhes/linhes-system/linhes-profile.sh @@ -5,7 +5,7 @@ export MYTHTV_AIRPLAY="1" if [ -f /etc/systemconfig ]; then SystemType=$(grep SystemType= /etc/systemconfig | cut -d '"' -f 2) fi -if [ ! $SystemType = "FrontendOnly" ]; then +if [[ ! $SystemType == *"Only" ]]; then if [ x$MYTH_RUN_STATUS = x ]; then MYTHCONFDIR=/usr/share/mythtv /usr/bin/lh_myth_status.py fi diff --git a/linhes/mkinitcpio-openswap/PKGBUILD b/linhes/mkinitcpio-openswap/PKGBUILD index a6bad29..ac3bb14 100644 --- a/linhes/mkinitcpio-openswap/PKGBUILD +++ b/linhes/mkinitcpio-openswap/PKGBUILD @@ -1,8 +1,9 @@ # Maintainer: Jenya Sovetkin <e.sovetkin@gmail.com> +# Maintainer: Adam Bambuch <adam.bambuch2@gmail.com> # Contributors: https://aur.archlinux.org/account/f4bio pkgname=mkinitcpio-openswap -pkgver=0.1.0 -pkgrel=3 +pkgver=0.1.1 +pkgrel=1 pkgdesc="mkinitcpio hook to open swap at boot time" arch=(any) license=('unknown') @@ -13,10 +14,9 @@ install="usage.install" source=('openswap.hook' 'openswap.install' 'openswap.conf') -sha256sums=('84ef428386b7f4353af036ccfbd4c60901a76e2d0c7a38dd3be2000219ea9d23' - '94dd98a953bab2244215a2b20767cdc9500fc438bed9ec27cae72a73766c6b86' - '3308f2679bb7c962d98adf2684d25390025d025e3d30bc1e773e3522311ad325') - +sha256sums=('9e836a588098f2811e651e60dae98096aa59db8a402bc9cb94c42000a5052e3a' + '2d60c98d4bd54134a5a4543848ecc7bce598e6faa7bd96a2df0a4767f6e9f3dd' + '71516c53543d7deca0fa25efcbf91ca0df869ec0a9fac1ec94e587b18e064c16') package() { install -Dm 644 openswap.hook \ diff --git a/linhes/mkinitcpio-openswap/openswap.conf b/linhes/mkinitcpio-openswap/openswap.conf index b7e92e0..6ca341a 100644 --- a/linhes/mkinitcpio-openswap/openswap.conf +++ b/linhes/mkinitcpio-openswap/openswap.conf @@ -3,15 +3,60 @@ swap_device=/dev/disk/by-uuid/2788eb78-074d-4424-9f1d-ebffc9c37262 crypt_swap_name=cryptswap -## one can optionally provide a keyfile device and path on this device -## to the keyfile -keyfile_device=/dev/mapper/cryptroot -keyfile_filename=etc/keyfile-cryptswap +## unlock_method can be either password, keyfile or keyfile_raw +## keyfile will use the keyfile_device and keyfile_filename to unlock the swap +## keyfile_raw will use the keyfile_device and keyfile_block_number to unlock the swap +## password will prompt for the password to unlock the swap +## if unlock_method is not set, then method is keyfile if keyfile_device and keyfile_filename are set +## otherwise it is password +unlock_method="password" +####### WARNING: There is a risk of data loss when using unlock_method="keyfile" +## You should double-check keyfile_device_mount_options, +## and note that this method is potentially dangerous regardless. +## https://docs.kernel.org/power/swsusp.html +## https://wiki.archlinux.org/title/Dm-crypt/Swap_encryption#busybox-based_initramfs + + +## keyfile_device is the device that contains the keyfile +## set it to the device that contains the keyfile +## e.g. /dev/mapper/root-device +####### THIS OPTION IS MANDATORY IF unlock_method IS keyfile OR keyfile_raw +keyfile_device= + +## keyfile_filename is the path to the keyfile on the keyfile_device +## e.g. /etc/swap.key +####### THIS OPTION IS MANDATORY IF unlock_method IS keyfile +keyfile_filename= + +## keyfile_block_number is the block number of the keyfile on the keyfile_device +## e.g. 12345 +## on the ext4 filesystem, you can get the block number using +## debugfs $keyfile_device +## extents $keyfile_filename +## the relevant block number will appear under the Physical column in the output +####### THIS OPTION IS MANDATORY IF unlock_method IS keyfile_raw +keyfile_block_number= + +## key_size is the size of the key in bytes +## e.g., 4096 +## This is the size of the keyfile and should match the actual size of the keyfile. +## You can get the size of the keyfile using: wc -c <keyfile_filename> +## The openswap script will fail if the keyfile is fragmented, +## so keyfile_length should not exceed the filesystem block size. +## For ext4 filesystems, keyfile_length should not exceed 4096 bytes, +## and it SHOULD be greater than ~200 bytes to avoid inode inlining. +####### THIS OPTION IS MANDATORY IF unlock_method IS keyfile_raw +keyfile_length=4096 ## additional arguments are given to mount for keyfile_device -## has to start with --options (if so desired) +## has to start with --options +## it is important to use the correct options for your filesystem +## to prevent any writes to the keyfile device and thus +## minimize the risk of data loss #keyfile_device_mount_options="--options=subvol=__active/__" +keyfile_device_mount_options="--options=ro,noload" ## additional arguments are given to cryptsetup ## --allow-discards options is desired in case swap is on SSD partition cryptsetup_options="--type luks" + diff --git a/linhes/mkinitcpio-openswap/openswap.hook b/linhes/mkinitcpio-openswap/openswap.hook index 9a96ad4..3a237c0 100644 --- a/linhes/mkinitcpio-openswap/openswap.hook +++ b/linhes/mkinitcpio-openswap/openswap.hook @@ -11,15 +11,14 @@ run_hook () done ## End of optional - if [ -z "$keyfile_device" ] || [ -z "$keyfile_filename" ] - then - ## case when no keyfile provided in configurations + if [ "$unlock_method" = "password" ]; then cryptsetup open $cryptsetup_options "$swap_device" "$crypt_swap_name" - else - ## case when keyfile is provided in configurations + elif [ "$unlock_method" = "keyfile" ]; then mkdir openswap_keymount mount $keyfile_device_mount_options "$keyfile_device" openswap_keymount cryptsetup open $cryptsetup_options --key-file "openswap_keymount/$keyfile_filename" "$swap_device" "$crypt_swap_name" umount openswap_keymount + elif [ "$unlock_method" = "keyfile_raw" ]; then + dd "if=$keyfile_device" "bs=$keyfile_length" "skip=$keyfile_block_number" count=1 | cryptsetup open --key-file=- "$swap_device" "$crypt_swap_name" fi } diff --git a/linhes/mkinitcpio-openswap/openswap.install b/linhes/mkinitcpio-openswap/openswap.install index 95d59a3..65dab09 100644 --- a/linhes/mkinitcpio-openswap/openswap.install +++ b/linhes/mkinitcpio-openswap/openswap.install @@ -6,9 +6,23 @@ build () grep "keyfile_filename=" /etc/openswap.conf >> "$BUILDROOT/openswap.conf" grep "keyfile_device_mount_options=" /etc/openswap.conf >> "$BUILDROOT/openswap.conf" grep "cryptsetup_options=" /etc/openswap.conf >> "$BUILDROOT/openswap.conf" + grep "keyfile_block_number=" /etc/openswap.conf >> "$BUILDROOT/openswap.conf" + grep "unlock_method=" /etc/openswap.conf >> "$BUILDROOT/openswap.conf" + grep "keyfile_length=" /etc/openswap.conf >> "$BUILDROOT/openswap.conf" source "$BUILDROOT/openswap.conf" + if [ -z "$unlock_method" ]; then + # unlock_method is not set, determine it based on keyfile_device and keyfile_filename + # for backward compatibility. + if [ -z "$keyfile_device" ] || [ -z "$keyfile_filename" ]; then + unlock_method="password" + else + unlock_method="keyfile" + fi + fi + echo "unlock_method=$unlock_method" >> "$BUILDROOT/openswap.conf" + if [ -z "$swap_device" ]; then warning "swap_device variable is not set" fi @@ -17,6 +31,41 @@ build () warning "crypt_swap_name variable is not set" fi + if [ "$unlock_method" = "keyfile" ]; then + warning "you are using potentially dangerous unlock_method keyfile, please make sure you know what you are doing" + warning "https://docs.kernel.org/power/swsusp.html" + warning "https://wiki.archlinux.org/title/Dm-crypt/Swap_encryption#busybox-based_initramfs" + if [ -z "$keyfile_device" ]; then + warning "keyfile_device variable is not set and unlock_method is set to keyfile" + fi + if [ -z "$keyfile_filename" ]; then + warning "keyfile_filename variable is not set and unlock_method is set to keyfile" + fi + + if [ -z "$keyfile_device_mount_options" ]; then + warning "keyfile_device_mount_options variable is not set and unlock_method is set to keyfile" + fi + fi + + if [ "$unlock_method" = "keyfile_raw" ]; then + if [ -z "$keyfile_device" ]; then + warning "keyfile_device variable is not set and unlock_method is set to keyfile_raw" + fi + if [ -z "$keyfile_block_number" ]; then + warning "keyfile_block_number variable is not set and unlock_method is set to keyfile_raw" + fi + if [ -z "$keyfile_length" ]; then + warning "keyfile_length variable is not set and unlock_method is set to keyfile_raw" + fi + fi + + # check if unlock_method is valid + if [ "$unlock_method" != "password" ] && [ "$unlock_method" != "keyfile" ] && [ "$unlock_method" != "keyfile_raw" ]; then + error "unlock_method is set to $unlock_method, but it can only be password, keyfile or keyfile_raw" + error "please change the unlock_method variable in /etc/openswap.conf" + exit 1 + fi + add_runscript } help () diff --git a/linhes/mythplugins/PKGBUILD b/linhes/mythplugins/PKGBUILD index b829436..f07e8cf 100644 --- a/linhes/mythplugins/PKGBUILD +++ b/linhes/mythplugins/PKGBUILD @@ -12,9 +12,9 @@ pkgname=('mythplugins-mytharchive' 'mythplugins-mythweather' 'mythplugins-mythweb' 'mythplugins-mythzoneminder') -br=fixes/34 +br=fixes/35 t="${br#*/}+${br%/[0-9][0-9]}" -pkgver=34+fixes.20241102.c3764375 +pkgver=35+fixes.20251104.7e93f0d3 pkgrel=1 epoch=0 arch=('any') @@ -26,7 +26,7 @@ makedepends=('dvdauthor' 'dvd+rw-tools' 'mesa-libgl' "mythtv>=$pkgver" 'git' 'python-pillow' 'python-pycurl' 'python-oauthlib' 'gdb' 'mariadb-libs' 'minizip' 'python-lxml' 'perl-xml-xpath' 'python-urllib3' 'libcdio-paranoia' 'libdiscid' 'libmusicbrainz5' 'libcoverart') -source=("git+https://github.com/MythTV/mythweb#branch=$br" +source=("git+https://github.com/MythTV/mythweb#branch=master" "git+https://github.com/MythTV/mythtv#branch=$br" ) sha256sums=('SKIP' diff --git a/linhes/mythtv/PKGBUILD b/linhes/mythtv/PKGBUILD index 976f3dc..705403b 100644 --- a/linhes/mythtv/PKGBUILD +++ b/linhes/mythtv/PKGBUILD @@ -7,7 +7,7 @@ # Contributor: dorphell <dorphell@archlinux.org> pkgname=mythtv -pkgver=34+fixes.20250102.ac34c663 +pkgver=35+fixes.20251104.7e93f0d3 pkgrel=1 pkgdesc="A Homebrew PVR project" arch=('x86_64') @@ -87,13 +87,12 @@ conflicts=('myththemes' 'mythplugins-mythvideo' 'mythtv-git') replaces=('myththemes' 'mythplugins-mythvideo' 'mythtv-git') patches="0031-UPnP-Reduce-startup-latency-by-moving-blocking-code-to-own-thread.patch - 0059-portchecker-speedup.patch 0227-OSD-Add-interlaced-status-to-OSD-debug-screen.patch autoskip_reduce_commskip_jumpback.patch defaultThemeLinHES.patch" source=( - "git+https://github.com/MythTV/mythtv#branch=fixes/34" + "git+https://github.com/MythTV/mythtv#branch=fixes/35" 'mythbackend.service' 'mythfrontend.desktop' 'mythtv-setup.desktop' @@ -111,7 +110,6 @@ sha256sums=('SKIP' 'ecfd02bbbef5de9773f4de2c52e9b2b382ce8137735f249d7900270d304fd333' '470de0a4050c16c7af11a0e5cfe2810b7daae42df4acf5456c7eae274dc7c5ae' '276f87058edc6197ab3a53faf6b4c485ef0d2b8447b9caa02ca7234f09ab473f' - '1ed4be912cd1ebd73553306958b7a2bc98e466b947dfb5d90ad7c0590a5a3747' '630c80c588a9b278c4421d356c5cbaa0debf149524bc896656b580b89d8fae88' '8a81e724d902976056dc824e7304df343c230ce67ec6ce1d18e110c5ef818ef6' '3ff9f48ead83a8dd7a87cc08df066c00813b48b9171cc7bf74ba0e3cb2570d00') @@ -119,7 +117,7 @@ sha256sums=('SKIP' prepare() { msg2 "PKGBUILD pkgver: $pkgver" cd "${srcdir}/mythtv/mythtv" - gitsrcver=`echo "34+fixes.$(git show -s --format=%cd --date=short | tr -d -).$(git rev-parse --short=8 HEAD)"` + gitsrcver=`echo "35+fixes.$(git show -s --format=%cd --date=short | tr -d -).$(git rev-parse --short=8 HEAD)"` msg2 "GIT SOURCE pkgver: $gitsrcver" if [ $pkgver = $gitsrcver ]; then warning "pkgver did NOT change. Consider increasing pkgrel ($pkgrel)." @@ -140,7 +138,7 @@ prepare() { pkgver() { cd "${srcdir}/mythtv/mythtv" - echo -n "34+fixes.$(git show -s --format=%cd --date=short | tr -d -).$(git rev-parse --short=8 HEAD)" + echo -n "35+fixes.$(git show -s --format=%cd --date=short | tr -d -).$(git rev-parse --short=8 HEAD)" } build() { diff --git a/linhes/paho-mqtt-c/PKGBUILD b/linhes/paho-mqtt-c/PKGBUILD index 28b07de..b434f81 100644 --- a/linhes/paho-mqtt-c/PKGBUILD +++ b/linhes/paho-mqtt-c/PKGBUILD @@ -1,21 +1,22 @@ # Maintainer: László Várady <laszlo.varady93@gmail.com> pkgname=paho-mqtt-c -pkgver=1.3.13 -pkgrel=1 +pkgver=1.3.14 +pkgrel=2 pkgdesc="Eclipse Paho C Client Library for the MQTT Protocol" -arch=('x86_64') +arch=('x86_64' 'aarch64' 'armv7h') url="https://www.eclipse.org/paho/" -license=('custom:EPL2' 'custom:EDL') +license=('EPL-2.0') depends=('openssl') makedepends=('cmake') source=("$pkgname-$pkgver.tar.gz::https://github.com/eclipse/paho.mqtt.c/archive/refs/tags/v${pkgver}.tar.gz") -sha256sums=('47c77e95609812da82feee30db435c3b7c720d4fd3147d466ead126e657b6d9c') +sha256sums=('7af7d906e60a696a80f1b7c2bd7d6eb164aaad908ff4c40c3332ac2006d07346') build() { cd "${pkgname//-/.}-${pkgver}" cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr \ -DPAHO_WITH_SSL=TRUE -DPAHO_BUILD_SAMPLES=TRUE \ + -DCMAKE_C_STANDARD=11 \ -S . -B build cmake --build build } @@ -28,8 +29,4 @@ check() { package() { cd "${pkgname//-/.}-${pkgver}" DESTDIR="$pkgdir/" cmake --install build - - install -Dm644 LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" - install -Dm644 edl-v10 "${pkgdir}/usr/share/licenses/${pkgname}/edl-v10" - install -Dm644 epl-v20 "${pkgdir}/usr/share/licenses/${pkgname}/epl-v20" } diff --git a/linhes/parsec-bin/PKGBUILD b/linhes/parsec-bin/PKGBUILD index 1398df2..44c2155 100644 --- a/linhes/parsec-bin/PKGBUILD +++ b/linhes/parsec-bin/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer : tadly <me@tadly.de> pkgname=parsec-bin -pkgver=150_95 +pkgver=150_97c pkgrel=1 pkgdesc='Remotely connect to a gaming pc for a low latency remote computing experience' url='http://parsec.app' @@ -12,7 +12,7 @@ depends=('gcc-libs' 'libglvnd' 'libxext' 'libxcb' 'ffmpeg4.4' 'openssl-1.1' 'lib optdepends=('libva: For hardware accelerated decoding') source=("$pkgname-$pkgver.deb::https://builds.parsecgaming.com/package/parsec-linux.deb") -sha256sums=('f45e7abbe8d88f60829616e71a52e2eb91714b556ad34728c70bbb9a3553635c') +sha256sums=('f1691ba3a97534604f5f640c26cceafaef672ccf7ab6eed66114d0abafc2cccf') #source_arm=("$pkgname-$pkgver.deb::https://builds.parsecgaming.com/package/parsec-rpi.deb") #sha256sums_arm=('a98e840dc44f4762018895bd0da704c88887815de0e74e0f39aa7737f5b0e802') diff --git a/linhes/perl-datetime-format-sqlite/PKGBUILD b/linhes/perl-datetime-format-sqlite/PKGBUILD index 9ef18b6..6897c8f 100644 --- a/linhes/perl-datetime-format-sqlite/PKGBUILD +++ b/linhes/perl-datetime-format-sqlite/PKGBUILD @@ -3,7 +3,7 @@ pkgname='perl-datetime-format-sqlite' pkgver='0.11' -pkgrel='3' +pkgrel='4' pkgdesc="Parse and format SQLite dates and times" arch=('any') license=('PerlArtistic' 'GPL') diff --git a/linhes/perl-lwp-useragent-determined/PKGBUILD b/linhes/perl-lwp-useragent-determined/PKGBUILD index 43d9912..f17ad89 100644 --- a/linhes/perl-lwp-useragent-determined/PKGBUILD +++ b/linhes/perl-lwp-useragent-determined/PKGBUILD @@ -4,7 +4,7 @@ pkgname='perl-lwp-useragent-determined' pkgver='1.07' -pkgrel='5' +pkgrel='6' pkgdesc="a virtual browser that retries errors" arch=('any') license=('PerlArtistic' 'GPL') diff --git a/linhes/perl-net-upnp/PKGBUILD b/linhes/perl-net-upnp/PKGBUILD index 3d52651..af94278 100644 --- a/linhes/perl-net-upnp/PKGBUILD +++ b/linhes/perl-net-upnp/PKGBUILD @@ -5,7 +5,7 @@ pkgname=perl-net-upnp pkgver=1.4.6 -pkgrel=3 +pkgrel=4 pkgdesc="Perl Module UPnP" arch=('x86_64') url="https://metacpan.org/release/Net-UPnP" diff --git a/linhes/perl-xml-dom/PKGBUILD b/linhes/perl-xml-dom/PKGBUILD index f2e4a8c..a104b6a 100644 --- a/linhes/perl-xml-dom/PKGBUILD +++ b/linhes/perl-xml-dom/PKGBUILD @@ -4,7 +4,7 @@ pkgname=perl-xml-dom pkgver=1.46 -pkgrel=1 +pkgrel=2 pkgdesc="Implements Level 1 of W3's DOM" arch=('any') url="http://search.cpan.org/dist/XML-DOM" diff --git a/linhes/perl-xml-treepp/PKGBUILD b/linhes/perl-xml-treepp/PKGBUILD index 4d2a664..b24896a 100644 --- a/linhes/perl-xml-treepp/PKGBUILD +++ b/linhes/perl-xml-treepp/PKGBUILD @@ -4,7 +4,7 @@ pkgname='perl-xml-treepp' pkgver='0.43' -pkgrel='3' +pkgrel='4' pkgdesc="Perl/CPAN Module XML::TreePP: Pure Perl implementation for parsing/writing XML documents" arch=('any') license=('PerlArtistic' 'GPL') diff --git a/linhes/plex-media-server/PKGBUILD b/linhes/plex-media-server/PKGBUILD index 1d742fa..42ff87f 100644 --- a/linhes/plex-media-server/PKGBUILD +++ b/linhes/plex-media-server/PKGBUILD @@ -10,8 +10,8 @@ # Contributor: Praekon <praekon@googlemail.com> pkgname=plex-media-server -pkgver=1.41.3.9314 -_pkgsum=a0bfb8370 +pkgver=1.42.2.10156 +_pkgsum=f737b826c pkgrel=1 pkgdesc='The back-end media server component of Plex.' arch=('x86_64' 'i686' 'armv7h' 'aarch64') @@ -39,10 +39,10 @@ sha256sums=('398ba7958598609453f5289b3d5f2389d2756158b340cf28e83c39d9ed60280b' 'c597bee0bcbb59ed791651555a904e5f7e9d2e82f6c6986b6352e5fc38e5b557' 'b7ff6525a3c7a8be885edc85bb523095f8e25ddb38873127e2a4e97b28f2c7ad' 'dbfb5a9a7146a975863c0932f1a68c4b040ec5d7e693361f39ddfbf60885e631') -sha256sums_x86_64=('8dd787f9a40a42c7d30061ae13e91a1d442e84f112f917438d161d00d339ed8a') -sha256sums_i686=('93a301b73c2a5e8ac6a0a148fe8cdf7c71126adc9e46fe1ccf7594085d70ba12') -sha256sums_armv7h=('efeeefb1c45f49af903de0f3c77ccd050931327d9c8a593b37658bc73544c1b9') -sha256sums_aarch64=('3150cc327558916e64eac42be0044fbf37f3af1bea37bd104be2172b7a4ea337') +sha256sums_x86_64=('5092d8ade2a2f0a1dfb1406d0d4f89d05758da8ca706c6faea8b0125836e8542') +sha256sums_i686=('9475c0f27061cf97057b8dd5e79f2ffe78baecb128e2e6939e3fbd05be6f6b0c') +sha256sums_armv7h=('051d072275814384560d700aae07f404f7c2a269be44dbbd57045765b86df25b') +sha256sums_aarch64=('566dfca0efb3845c87072e9f0ee32984395aa8ce3704874b9e243b5490cc0105') prepare() { if [[ $CARCH = armv7h ]] || [[ $CARCH = aarch64 ]]; then diff --git a/linhes/pyqt5-webengine/.nvchecker.toml b/linhes/pyqt5-webengine/.nvchecker.toml new file mode 100644 index 0000000..2eec446 --- /dev/null +++ b/linhes/pyqt5-webengine/.nvchecker.toml @@ -0,0 +1,3 @@ +[pyqt5-webengine] +source = 'pypi' +pypi = 'PyQtWebEngine' diff --git a/linhes/pyqt5-webengine/LICENSE b/linhes/pyqt5-webengine/LICENSE new file mode 100644 index 0000000..b87c5e4 --- /dev/null +++ b/linhes/pyqt5-webengine/LICENSE @@ -0,0 +1,12 @@ +Copyright Arch Linux Contributors + +Permission to use, copy, modify, and/or distribute this software for +any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE +FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN +AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/linhes/pyqt5-webengine/LICENSES/0BSD.txt b/linhes/pyqt5-webengine/LICENSES/0BSD.txt new file mode 120000 index 0000000..ea5b606 --- /dev/null +++ b/linhes/pyqt5-webengine/LICENSES/0BSD.txt @@ -0,0 +1 @@ +../LICENSE
\ No newline at end of file diff --git a/linhes/pyqt5-webengine/PKGBUILD b/linhes/pyqt5-webengine/PKGBUILD new file mode 100644 index 0000000..e23fc1b --- /dev/null +++ b/linhes/pyqt5-webengine/PKGBUILD @@ -0,0 +1,33 @@ +# Maintainer: Antonio Rojas <arojas@archlinux.org> +# Maintainer: Felix Yan <felixonmars@archlinux.org> + +pkgbase=pyqt5-webengine +pkgname=(python-pyqt5-webengine) +pkgdesc="Python bindings for QtWebEngine" +pkgver=5.15.7 +pkgrel=2 +arch=(x86_64) +url="https://www.riverbankcomputing.com/software/pyqtwebengine/intro" +license=(GPL) +groups=(pyqt5) +depends=(python-pyqt5 qt5-webengine) +makedepends=(sip pyqt-builder) +conflicts=(pyqtwebengine-common python-pyqtwebwengine) +provides=(python-pyqtwebengine) +replaces=(python-pyqtwebengine) +source=("https://pypi.python.org/packages/source/P/PyQtWebEngine/PyQtWebEngine-$pkgver.tar.gz") +sha256sums=('f121ac6e4a2f96ac289619bcfc37f64e68362f24a346553f5d6c42efa4228a4d') + +build() { + cd PyQtWebEngine-$pkgver + sip-build \ + --no-make \ + --api-dir /usr/share/qt/qsci/api/python + cd build + make +} + +package_python-pyqt5-webengine() { + cd PyQtWebEngine-$pkgver/build + make INSTALL_ROOT="$pkgdir" install +} diff --git a/linhes/pyqt5-webengine/REUSE.toml b/linhes/pyqt5-webengine/REUSE.toml new file mode 100644 index 0000000..8501755 --- /dev/null +++ b/linhes/pyqt5-webengine/REUSE.toml @@ -0,0 +1,22 @@ +version = 1 + +[[annotations]] +path = [ + "PKGBUILD", + "README.md", + "keys/**", + ".SRCINFO", + ".nvchecker.toml", + "*.install", + "*.sysusers", + "*.tmpfiles", + "*.logrotate", + "*.pam", + "*.service", + "*.socket", + "*.timer", + "*.desktop", + "*.hook", +] +SPDX-FileCopyrightText = "Arch Linux contributors" +SPDX-License-Identifier = "0BSD" diff --git a/linhes/python-url-normalize/PKGBUILD b/linhes/python-url-normalize/PKGBUILD index 895753d..f25ef29 100644 --- a/linhes/python-url-normalize/PKGBUILD +++ b/linhes/python-url-normalize/PKGBUILD @@ -5,33 +5,31 @@ _base=url-normalize pkgname=python-${_base} pkgdesc="URL normalization for Python" -pkgver=1.4.3 -pkgrel=19 -arch=('any') +pkgver=2.2.1 +pkgrel=1 +arch=(any) url="https://github.com/niksite/${_base}" license=(MIT) -depends=(python-six) -makedepends=(python-build python-installer python-poetry) -checkdepends=(python-pytest-socket) -source=(${_base}-${pkgver}.tar.gz::${url}/archive/${pkgver}.tar.gz) -sha512sums=('46eaa1753b37e89d56cb19818144a7cf5b38653811720eb506732c35bb3732ef0c556420b22a9ee2c08e70e5b408aab7f44cea5e15d1ebe3d717c0c77706bfb8') +depends=(python-idna) +makedepends=(python-build python-installer python-setuptools python-wheel) +# checkdepends=(python-pytest) +source=(${_base}-${pkgver}.tar.gz::${url}/archive/v${pkgver}.tar.gz) +sha512sums=('51f57bf6d94863662789321b8965c0ca833d34d0c8095f2a39303a410f61c24f04a56e83258dafaa8a4250b0d1b44ad3c3a63430da2b04f4d906d84a71208f46') build() { cd ${_base}-${pkgver} - # Note: set `GIT_CEILING_DIRECTORIES` to prevent poetry - # from incorrectly using a parent git checkout info. - # https://github.com/pypa/build/issues/384#issuecomment-947675975 - GIT_CEILING_DIRECTORIES="${PWD}/.." python -m build --wheel --skip-dependency-check --no-isolation + python -m build --wheel --skip-dependency-check --no-isolation } -check() { - cd ${_base}-${pkgver} - # https://github.com/niksite/url-normalize/blob/master/tox.ini#L17 - pytest -o addopts=--disable-socket tests -} +# check() { +# cd ${_base}-${pkgver} +# python -m venv --system-site-packages test-env +# test-env/bin/python -m installer dist/*.whl +# test-env/bin/python -m pytest tests +# } package() { cd ${_base}-${pkgver} - python -m installer --destdir="${pkgdir}" dist/*.whl + PYTHONPYCACHEPREFIX="${PWD}/.cache/cpython/" python -m installer --destdir="${pkgdir}" dist/*.whl install -Dm 644 LICENSE -t "${pkgdir}/usr/share/licenses/${pkgname}" } diff --git a/linhes/qbittorrent-vuetorrent-bin/.SRCINFO b/linhes/qbittorrent-vuetorrent-bin/.SRCINFO index d2ae213..002908c 100644 --- a/linhes/qbittorrent-vuetorrent-bin/.SRCINFO +++ b/linhes/qbittorrent-vuetorrent-bin/.SRCINFO @@ -1,6 +1,6 @@ pkgbase = qbittorrent-vuetorrent-bin pkgdesc = The sleekest looking WebUI for qBittorrent made with Vue.js! - pkgver = 2.21.0 + pkgver = 2.28.2 pkgrel = 1 url = https://github.com/WDaan/VueTorrent install = qbittorrent-vuetorrent.install @@ -10,7 +10,7 @@ pkgbase = qbittorrent-vuetorrent-bin optdepends = qbittorrent-nox: for use with qbittorrent-nox provides = qbittorrent-vuetorrent conflicts = qbittorrent-vuetorrent - source = vuetorrent-2.21.0.zip::https://github.com/WDaan/VueTorrent/releases/download/v2.21.0/vuetorrent.zip - sha512sums = 3f28d1652711a54fcf047d064b9ff3cbf6fec5ba046ce281720af3d0f9885ec34acc08f6fba0906cbbb2789837c71d3ea585e01eb622228c036d430e77508072 + source = vuetorrent-2.28.2.zip::https://github.com/WDaan/VueTorrent/releases/download/v2.28.2/vuetorrent.zip + sha512sums = c8c4b9a57e2b7e7fa9482204230e78d92a7a400a8baabe929ba983ef418eb34f43b8618cf18d72bae7807c672e28171e7d8aaac22b19d162a77842b3dbf1da67 pkgname = qbittorrent-vuetorrent-bin diff --git a/linhes/qbittorrent-vuetorrent-bin/PKGBUILD b/linhes/qbittorrent-vuetorrent-bin/PKGBUILD index 823ca2e..f6ec27d 100644 --- a/linhes/qbittorrent-vuetorrent-bin/PKGBUILD +++ b/linhes/qbittorrent-vuetorrent-bin/PKGBUILD @@ -4,7 +4,7 @@ pkgname=qbittorrent-vuetorrent-bin _pkgname=vuetorrent -pkgver=2.21.0 +pkgver=2.28.2 pkgrel=1 pkgdesc='The sleekest looking WebUI for qBittorrent made with Vue.js!' @@ -21,11 +21,10 @@ optdepends=( install=qbittorrent-vuetorrent.install source=("${_pkgname}-$pkgver.zip::${url}/releases/download/v$pkgver/${_pkgname}.zip") -sha512sums=('3f28d1652711a54fcf047d064b9ff3cbf6fec5ba046ce281720af3d0f9885ec34acc08f6fba0906cbbb2789837c71d3ea585e01eb622228c036d430e77508072') +sha512sums=('c8c4b9a57e2b7e7fa9482204230e78d92a7a400a8baabe929ba983ef418eb34f43b8618cf18d72bae7807c672e28171e7d8aaac22b19d162a77842b3dbf1da67') package() { cd "$srcdir/vuetorrent" find . -type f -exec install -D '{}' "$pkgdir/usr/share/$pkgname/{}" ';' } # vim:set ts=2 sw=2 et: - diff --git a/linhes/qt5-webchannel/.nvchecker.toml b/linhes/qt5-webchannel/.nvchecker.toml new file mode 100644 index 0000000..685c4a1 --- /dev/null +++ b/linhes/qt5-webchannel/.nvchecker.toml @@ -0,0 +1,2 @@ +[qt5-webchannel] +source = "manual" diff --git a/linhes/qt5-webchannel/LICENSE b/linhes/qt5-webchannel/LICENSE new file mode 100644 index 0000000..b87c5e4 --- /dev/null +++ b/linhes/qt5-webchannel/LICENSE @@ -0,0 +1,12 @@ +Copyright Arch Linux Contributors + +Permission to use, copy, modify, and/or distribute this software for +any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE +FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN +AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/linhes/qt5-webchannel/LICENSES/0BSD.txt b/linhes/qt5-webchannel/LICENSES/0BSD.txt new file mode 120000 index 0000000..ea5b606 --- /dev/null +++ b/linhes/qt5-webchannel/LICENSES/0BSD.txt @@ -0,0 +1 @@ +../LICENSE
\ No newline at end of file diff --git a/linhes/qt5-webchannel/PKGBUILD b/linhes/qt5-webchannel/PKGBUILD new file mode 100644 index 0000000..970c072 --- /dev/null +++ b/linhes/qt5-webchannel/PKGBUILD @@ -0,0 +1,46 @@ +# Maintainer: Felix Yan <felixonmars@archlinux.org> +# Contributor: Andrea Scarpino <andrea@archlinux.org> + +pkgname=qt5-webchannel +_basever=5.15.18 +pkgver=5.15.18+kde+r3 +pkgrel=1 +_commit=2a157921861e651f43456cb7941b250c89feb736 +arch=('x86_64') +url='https://www.qt.io' +license=('GPL3' 'LGPL3' 'FDL' 'custom') +pkgdesc='Provides access to QObject or QML objects from HTML clients for seamless integration of Qt applications with HTML/JavaScript clients' +depends=('qt5-declarative') +makedepends=('git') +groups=('qt5') +_pkgfqn=${pkgname/5-/} +source=(kde-$_pkgfqn::git+https://invent.kde.org/qt/qt/$_pkgfqn#commit=$_commit) +sha256sums=('fdff50abd1a3c5de03657f229caba43e68522911ade28ad0f6d6e53bc7517dde') + +pkgver() { + cd kde-$_pkgfqn + echo "$_basever+kde+r"`git rev-list --count v$_basever-lts-lgpl..$_commit` | sed -e 's|+kde+r0||' +} + +prepare() { + mkdir -p build +} + +build() { + cd build + + qmake ../kde-$_pkgfqn + make +} + +package() { + cd build + make INSTALL_ROOT="$pkgdir" install + + # Drop QMAKE_PRL_BUILD_DIR because reference the build dir + find "$pkgdir/usr/lib" -type f -name '*.prl' \ + -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \; + + install -d "$pkgdir"/usr/share/licenses + ln -s /usr/share/licenses/qt5-base "$pkgdir"/usr/share/licenses/${pkgname} +} diff --git a/linhes/qt5-webchannel/README.md b/linhes/qt5-webchannel/README.md new file mode 100644 index 0000000..9c4dc74 --- /dev/null +++ b/linhes/qt5-webchannel/README.md @@ -0,0 +1,3 @@ +This package is part of the `qt5` suite, and is managed by the scripts at https://gitlab.archlinux.org/archlinux/kde-build. + +Do not upgrade this package individually, or make any format changes to the PKGBUILD without checking with the Qt package maintainers first. diff --git a/linhes/qt5-webchannel/REUSE.toml b/linhes/qt5-webchannel/REUSE.toml new file mode 100644 index 0000000..8501755 --- /dev/null +++ b/linhes/qt5-webchannel/REUSE.toml @@ -0,0 +1,22 @@ +version = 1 + +[[annotations]] +path = [ + "PKGBUILD", + "README.md", + "keys/**", + ".SRCINFO", + ".nvchecker.toml", + "*.install", + "*.sysusers", + "*.tmpfiles", + "*.logrotate", + "*.pam", + "*.service", + "*.socket", + "*.timer", + "*.desktop", + "*.hook", +] +SPDX-FileCopyrightText = "Arch Linux contributors" +SPDX-License-Identifier = "0BSD" diff --git a/linhes/qt5-webengine/.nvchecker.toml b/linhes/qt5-webengine/.nvchecker.toml new file mode 100644 index 0000000..4960664 --- /dev/null +++ b/linhes/qt5-webengine/.nvchecker.toml @@ -0,0 +1,6 @@ +[qt5-webengine] +source = 'git' +git = 'git://code.qt.io/qt/qtwebengine.git' +include_regex = 'v(\d.+)-lts' +from_pattern = 'v(\d.+)-lts' +to_pattern = '\1' diff --git a/linhes/qt5-webengine/LICENSE b/linhes/qt5-webengine/LICENSE new file mode 100644 index 0000000..b87c5e4 --- /dev/null +++ b/linhes/qt5-webengine/LICENSE @@ -0,0 +1,12 @@ +Copyright Arch Linux Contributors + +Permission to use, copy, modify, and/or distribute this software for +any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE +FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN +AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/linhes/qt5-webengine/LICENSES/0BSD.txt b/linhes/qt5-webengine/LICENSES/0BSD.txt new file mode 120000 index 0000000..ea5b606 --- /dev/null +++ b/linhes/qt5-webengine/LICENSES/0BSD.txt @@ -0,0 +1 @@ +../LICENSE
\ No newline at end of file diff --git a/linhes/qt5-webengine/LICENSES/BSD-3-Clause.txt b/linhes/qt5-webengine/LICENSES/BSD-3-Clause.txt new file mode 100644 index 0000000..ea890af --- /dev/null +++ b/linhes/qt5-webengine/LICENSES/BSD-3-Clause.txt @@ -0,0 +1,11 @@ +Copyright (c) <year> <owner>. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/linhes/qt5-webengine/PKGBUILD b/linhes/qt5-webengine/PKGBUILD new file mode 100644 index 0000000..eca0c9a --- /dev/null +++ b/linhes/qt5-webengine/PKGBUILD @@ -0,0 +1,87 @@ +# Maintainer: Felix Yan <felixonmars@archlinux.org> +# Contributor: Andrea Scarpino <andrea@archlinux.org> + +pkgname=qt5-webengine +_basever=5.15.18 +pkgver=5.15.19 +pkgrel=4 +arch=('x86_64') +url='https://www.qt.io' +license=('LGPL3' 'LGPL2.1' 'BSD') +pkgdesc='Provides support for web applications using the Chromium browser project' +depends=('qt5-webchannel' 'qt5-location' 'libxcomposite' 'libxrandr' 'pciutils' 'libxss' 'libxkbfile' 'libxdamage' + 'libevent' 'snappy' 'nss' 'libxslt' 'minizip' 'ffmpeg' 'libvpx' 'libxtst' 'ttf-font') +makedepends=('git' 'python' 'gperf' 'jsoncpp' 'ninja' 'qt5-tools' 'poppler' 'pipewire' 'nodejs' 'python-html5lib') +optdepends=('pipewire: WebRTC desktop sharing under Wayland') +groups=('qt5') +_pkgfqn=${pkgname/5-/} +source=(kde-$_pkgfqn::git+https://code.qt.io/qt/qtwebengine.git#tag=v${pkgver}-lts + git+https://code.qt.io/qt/qtwebengine-chromium.git + qt5-webengine-pipewire-0.3.patch + qt5-webengine-icu-75.patch + qt5-webengine-ninja-1.12.patch + qt5-webengine-gcc-15.patch + python3.12-six.patch + qt5-webengine-icu-78.patch) +sha256sums=('10ae73fd623eff84af2921ea2c83c723d9a847e23abbc8d862d0dc346382ef9b' + 'SKIP' + '5e3a3c4711d964d5152a04059a2b5c1d14bb13dd29bce370120f60e85b476b6f' + '7cac28ba784d24b4abf6414079548ada165343af507ecd8e23cbe7e4f63ae52f' + '6672741b64d896dc555c8ee42ca2329c4f20d5f406095a69fe72da44b3a142f4' + '813851a1c7de9947afab28b7f3cb26ca739254521f12c21f76a6a3ec164def24' + 'ac87ec55ee5cbcf2d520e1ea433d041c0bf754271a17f859edbb9976f192ce3f' + 'f5cf66e4006ca81def2625088e7dd2fc925a0a617b4b88d1a19f030b60b9ad96') + +prepare() { + mkdir -p build + + cd kde-$_pkgfqn + git submodule init + git submodule set-url src/3rdparty "$srcdir"/qtwebengine-chromium + git submodule set-branch --branch 87-based src/3rdparty + git -c protocol.file.allow=always submodule update + + patch -p1 -d src/3rdparty -i "$srcdir"/qt5-webengine-pipewire-0.3.patch # Port to pipewire 0.3 + patch -p2 -d src/3rdparty/chromium -i "$srcdir"/qt5-webengine-icu-75.patch # Fix build with ICU 75 + patch -p2 -d src/3rdparty/chromium -i "$srcdir"/qt5-webengine-ninja-1.12.patch # Fix build with ninja 1.12 + patch -p1 -d src/3rdparty/chromium -i "$srcdir"/python3.12-six.patch # Fix build with python 3.12 - patch from Debian + patch -p1 -i "$srcdir"/qt5-webengine-gcc-15.patch # Fix build with GCC 15 (Fedora) + patch -Np1 -i "$srcdir"/qt5-webengine-icu-78.patch # Fix build with ICU78 +# Fix build with python 3.13 + sed -e '/import pipes/d' -i src/3rdparty/chromium/build/android/gyp/util/build_utils.py +} + +build() { + # this uses malloc_usable_size, which is incompatible with fortification level 3 + export CFLAGS="${CFLAGS/_FORTIFY_SOURCE=3/_FORTIFY_SOURCE=2}" + export CXXFLAGS="${CXXFLAGS/_FORTIFY_SOURCE=3/_FORTIFY_SOURCE=2}" + + cd build + qmake ../kde-$_pkgfqn CONFIG+=force_debug_info -- \ + -proprietary-codecs \ + -webp \ + -webengine-icu \ + -spellchecker \ + -webengine-kerberos \ + -webengine-webrtc-pipewire \ + -webengine-python-version python3 + make +} + +package() { + # this uses malloc_usable_size, which is incompatible with fortification level 3 + export CFLAGS="${CFLAGS/_FORTIFY_SOURCE=3/_FORTIFY_SOURCE=2}" + export CXXFLAGS="${CXXFLAGS/_FORTIFY_SOURCE=3/_FORTIFY_SOURCE=2}" + + cd build + make INSTALL_ROOT="$pkgdir" install + + # Drop QMAKE_PRL_BUILD_DIR because reference the build dir + find "$pkgdir/usr/lib" -type f -name '*.prl' \ + -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \; + + install -Dm644 "$srcdir"/kde-$_pkgfqn/src/3rdparty/chromium/LICENSE "$pkgdir"/usr/share/licenses/${pkgname}/LICENSE.chromium + + # Fix cmake dependency versions + sed -e "s|$pkgver\ |$_basever |" -i "$pkgdir"/usr/lib/cmake/*/*Config.cmake +} diff --git a/linhes/qt5-webengine/README.md b/linhes/qt5-webengine/README.md new file mode 100644 index 0000000..9c4dc74 --- /dev/null +++ b/linhes/qt5-webengine/README.md @@ -0,0 +1,3 @@ +This package is part of the `qt5` suite, and is managed by the scripts at https://gitlab.archlinux.org/archlinux/kde-build. + +Do not upgrade this package individually, or make any format changes to the PKGBUILD without checking with the Qt package maintainers first. diff --git a/linhes/qt5-webengine/REUSE.toml b/linhes/qt5-webengine/REUSE.toml new file mode 100644 index 0000000..956ef39 --- /dev/null +++ b/linhes/qt5-webengine/REUSE.toml @@ -0,0 +1,36 @@ +version = 1 + +[[annotations]] +path = [ + "PKGBUILD", + "README.md", + "keys/**", + ".SRCINFO", + ".nvchecker.toml", + "*.install", + "*.sysusers", + "*.tmpfiles", + "*.logrotate", + "*.pam", + "*.service", + "*.socket", + "*.timer", + "*.desktop", + "*.hook", +] +SPDX-FileCopyrightText = "Arch Linux contributors" +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = [ + "python3.12-imp.patch", + "python3.12-six.patch", + "qt5-webengine-ffmpeg5.patch", + "qt5-webengine-ffmpeg7.patch", + "qt5-webengine-gcc-15.patch", + "qt5-webengine-icu-75.patch", + "qt5-webengine-ninja-1.12.patch", + "qt5-webengine-pipewire-0.3.patch", +] +SPDX-FileCopyrightText = "qt5-webengine contributors" +SPDX-License-Identifier = "BSD-3-Clause" diff --git a/linhes/qt5-webengine/python3.12-imp.patch b/linhes/qt5-webengine/python3.12-imp.patch new file mode 100644 index 0000000..f7cb480 --- /dev/null +++ b/linhes/qt5-webengine/python3.12-imp.patch @@ -0,0 +1,26 @@ +Description: stop using imp module which was removed in Python 3.12 +Origin: upstream, commits + https://chromium.googlesource.com/chromium/src/+/9e0c89a3b5638ba2 + https://chromium.googlesource.com/chromium/src/+/f5f6e361d037c316 +Last-Update: 2024-03-17 + +--- a/mojo/public/tools/mojom/mojom/fileutil.py ++++ b/mojo/public/tools/mojom/mojom/fileutil.py +@@ -3,7 +3,6 @@ + # found in the LICENSE file. + + import errno +-import imp + import os.path + import sys + +--- a/mojo/public/tools/mojom/mojom/parse/lexer.py ++++ b/mojo/public/tools/mojom/mojom/parse/lexer.py +@@ -2,7 +2,6 @@ + # Use of this source code is governed by a BSD-style license that can be + # found in the LICENSE file. + +-import imp + import os.path + import sys + diff --git a/linhes/qt5-webengine/python3.12-six.patch b/linhes/qt5-webengine/python3.12-six.patch new file mode 100644 index 0000000..4aef50b --- /dev/null +++ b/linhes/qt5-webengine/python3.12-six.patch @@ -0,0 +1,58 @@ +Patch-Source: https://sources.debian.org/data/main/q/qtwebengine-opensource-src/5.15.16+dfsg-3/debian/patches/python3.12-six.patch +-- +Description: implement find_spec() for _SixMetaPathImporter +Origin: upstream, https://github.com/benjaminp/six/commit/25916292d96f5f09 +Last-Update: 2024-03-17 + +--- a/third_party/protobuf/third_party/six/six.py ++++ b/third_party/protobuf/third_party/six/six.py +@@ -71,6 +71,11 @@ else: + MAXSIZE = int((1 << 63) - 1) + del X + ++if PY34: ++ from importlib.util import spec_from_loader ++else: ++ spec_from_loader = None ++ + + def _add_doc(func, doc): + """Add documentation to a function.""" +@@ -186,6 +191,11 @@ class _SixMetaPathImporter(object): + return self + return None + ++ def find_spec(self, fullname, path, target=None): ++ if fullname in self.known_modules: ++ return spec_from_loader(fullname, self) ++ return None ++ + def __get_module(self, fullname): + try: + return self.known_modules[fullname] +--- a/tools/grit/third_party/six/__init__.py ++++ b/tools/grit/third_party/six/__init__.py +@@ -71,6 +71,11 @@ else: + MAXSIZE = int((1 << 63) - 1) + del X + ++if PY34: ++ from importlib.util import spec_from_loader ++else: ++ spec_from_loader = None ++ + + def _add_doc(func, doc): + """Add documentation to a function.""" +@@ -186,6 +191,11 @@ class _SixMetaPathImporter(object): + return self + return None + ++ def find_spec(self, fullname, path, target=None): ++ if fullname in self.known_modules: ++ return spec_from_loader(fullname, self) ++ return None ++ + def __get_module(self, fullname): + try: + return self.known_modules[fullname] diff --git a/linhes/qt5-webengine/qt5-webengine-gcc-15.patch b/linhes/qt5-webengine/qt5-webengine-gcc-15.patch new file mode 100644 index 0000000..4b47240 --- /dev/null +++ b/linhes/qt5-webengine/qt5-webengine-gcc-15.patch @@ -0,0 +1,443 @@ +diff --git a/src/3rdparty/chromium/base/debug/profiler.h b/src/3rdparty/chromium/base/debug/profiler.h +index be6e272e0..b27f5f690 100644 +--- a/src/3rdparty/chromium/base/debug/profiler.h ++++ b/src/3rdparty/chromium/base/debug/profiler.h +@@ -5,6 +5,7 @@ + #ifndef BASE_DEBUG_PROFILER_H_ + #define BASE_DEBUG_PROFILER_H_ + ++#include <cstdint> + #include <stddef.h> + #include <cstdint> + +diff --git a/src/3rdparty/chromium/cc/trees/target_property.cc b/src/3rdparty/chromium/cc/trees/target_property.cc +index 00595fda0..ebd8c605a 100644 +--- a/src/3rdparty/chromium/cc/trees/target_property.cc ++++ b/src/3rdparty/chromium/cc/trees/target_property.cc +@@ -6,6 +6,10 @@ + + #include "cc/trees/target_property.h" + ++#include <cstdint> ++ ++#include <cstdint> ++ + namespace cc { + + static_assert(TargetProperty::LAST_TARGET_PROPERTY < kMaxTargetPropertyIndex, +diff --git a/src/3rdparty/chromium/device/base/synchronization/one_writer_seqlock.cc b/src/3rdparty/chromium/device/base/synchronization/one_writer_seqlock.cc +index 98266a16c..7676e6097 100644 +--- a/src/3rdparty/chromium/device/base/synchronization/one_writer_seqlock.cc ++++ b/src/3rdparty/chromium/device/base/synchronization/one_writer_seqlock.cc +@@ -6,6 +6,8 @@ + + #include "device/base/synchronization/one_writer_seqlock.h" + ++#include <cstdint> ++ + namespace device { + + OneWriterSeqLock::OneWriterSeqLock() : sequence_(0) {} +diff --git a/src/3rdparty/chromium/extensions/common/constants.h b/src/3rdparty/chromium/extensions/common/constants.h +index e6183dc11..5a12758ac 100644 +--- a/src/3rdparty/chromium/extensions/common/constants.h ++++ b/src/3rdparty/chromium/extensions/common/constants.h +@@ -13,6 +13,8 @@ + #include "components/version_info/channel.h" + #include "ui/base/layout.h" + ++#include <cstdint> ++ + namespace extensions { + + // Scheme we serve extension content from. +diff --git a/src/3rdparty/chromium/gpu/config/gpu_preferences.h b/src/3rdparty/chromium/gpu/config/gpu_preferences.h +index 57bda1f99..7a5ef9b3a 100644 +--- a/src/3rdparty/chromium/gpu/config/gpu_preferences.h ++++ b/src/3rdparty/chromium/gpu/config/gpu_preferences.h +@@ -5,6 +5,7 @@ + #ifndef GPU_CONFIG_GPU_PREFERENCES_H_ + #define GPU_CONFIG_GPU_PREFERENCES_H_ + ++#include <cstdint> + #include <stddef.h> + #include <cstdint> + #include <string> +diff --git a/src/3rdparty/chromium/net/base/parse_number.h b/src/3rdparty/chromium/net/base/parse_number.h +index 301d14ac8..378058a23 100644 +--- a/src/3rdparty/chromium/net/base/parse_number.h ++++ b/src/3rdparty/chromium/net/base/parse_number.h +@@ -11,6 +11,8 @@ + #include "base/strings/string_piece.h" + #include "net/base/net_export.h" + ++#include <cstdint> ++ + // This file contains utility functions for parsing numbers, in the context of + // network protocols. + // +diff --git a/src/3rdparty/chromium/pdf/document_attachment_info.h b/src/3rdparty/chromium/pdf/document_attachment_info.h +index fd78cb729..f9330a0db 100644 +--- a/src/3rdparty/chromium/pdf/document_attachment_info.h ++++ b/src/3rdparty/chromium/pdf/document_attachment_info.h +@@ -9,6 +9,8 @@ + + #include "base/strings/string16.h" + ++#include <cstdint> ++ + namespace chrome_pdf { + + struct DocumentAttachmentInfo { +diff --git a/src/3rdparty/chromium/ppapi/utility/completion_callback_factory_thread_traits.h b/src/3rdparty/chromium/ppapi/utility/completion_callback_factory_thread_traits.h +index ac0b31a75..5d1c421d0 100644 +--- a/src/3rdparty/chromium/ppapi/utility/completion_callback_factory_thread_traits.h ++++ b/src/3rdparty/chromium/ppapi/utility/completion_callback_factory_thread_traits.h +@@ -38,6 +38,10 @@ namespace pp { + /// As a further optimization, we can add support for this later. + class ThreadSafeThreadTraits { + public: ++ ++ typedef pp::Lock Lock; ++ typedef pp::AutoLock AutoLock; ++ + class RefCount { + public: + /// Default constructor. In debug mode, this checks that the object is being +@@ -67,8 +71,6 @@ class ThreadSafeThreadTraits { + int32_t ref_; + }; + +- typedef pp::Lock Lock; +- typedef pp::AutoLock AutoLock; + }; + + /// The non-thread-safe version of thread traits. Using this class as the +diff --git a/src/3rdparty/chromium/third_party/angle/src/common/angleutils.h b/src/3rdparty/chromium/third_party/angle/src/common/angleutils.h +index fb9a44225..f9330f313 100644 +--- a/src/3rdparty/chromium/third_party/angle/src/common/angleutils.h ++++ b/src/3rdparty/chromium/third_party/angle/src/common/angleutils.h +@@ -15,6 +15,7 @@ + # include "absl/container/flat_hash_map.h" + #endif // defined(ANGLE_USE_ABSEIL) + ++#include <cstdint> + #include <climits> + #include <cstdarg> + #include <cstddef> +diff --git a/src/3rdparty/chromium/third_party/libgav1/src/src/utils/threadpool.cc b/src/3rdparty/chromium/third_party/libgav1/src/src/utils/threadpool.cc +index 4e8788bc4..a5d35b31b 100644 +--- a/src/3rdparty/chromium/third_party/libgav1/src/src/utils/threadpool.cc ++++ b/src/3rdparty/chromium/third_party/libgav1/src/src/utils/threadpool.cc +@@ -31,6 +31,7 @@ + #include <cstdio> + #include <cstdint> + #include <cstring> ++#include <cstdio> + #include <new> + #include <utility> + +diff --git a/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/proto/proto_importer_module.h b/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/proto/proto_importer_module.h +index 098433c47..0820bb220 100644 +--- a/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/proto/proto_importer_module.h ++++ b/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/proto/proto_importer_module.h +@@ -23,6 +23,8 @@ + #include "perfetto/trace_processor/status.h" + #include "src/trace_processor/trace_blob_view.h" + ++#include <cstdint> ++ + namespace perfetto { + + namespace protos { +diff --git a/src/3rdparty/chromium/ui/events/gesture_event_details.h b/src/3rdparty/chromium/ui/events/gesture_event_details.h +index d20416738..8dadab3d0 100644 +--- a/src/3rdparty/chromium/ui/events/gesture_event_details.h ++++ b/src/3rdparty/chromium/ui/events/gesture_event_details.h +@@ -5,6 +5,7 @@ + #ifndef UI_EVENTS_GESTURE_DETECTION_GESTURE_EVENT_DETAILS_H_ + #define UI_EVENTS_GESTURE_DETECTION_GESTURE_EVENT_DETAILS_H_ + ++#include <cstdint> + #include <string.h> + + #include "base/check_op.h" +diff --git a/src/3rdparty/chromium/ui/gl/gl_surface_glx.cc b/src/3rdparty/chromium/ui/gl/gl_surface_glx.cc +index 1d5527691..ef9d5ce13 100644 +--- a/src/3rdparty/chromium/ui/gl/gl_surface_glx.cc ++++ b/src/3rdparty/chromium/ui/gl/gl_surface_glx.cc +@@ -4,6 +4,7 @@ + + #include "ui/gl/gl_surface_glx.h" + ++#include <cstdint> + #include <utility> + + #include "base/bind.h" +diff --git a/src/3rdparty/chromium/ui/gl/gl_surface_glx.h b/src/3rdparty/chromium/ui/gl/gl_surface_glx.h +index ab612cd87..2178d8514 100644 +--- a/src/3rdparty/chromium/ui/gl/gl_surface_glx.h ++++ b/src/3rdparty/chromium/ui/gl/gl_surface_glx.h +@@ -5,6 +5,7 @@ + #ifndef UI_GL_GL_SURFACE_GLX_H_ + #define UI_GL_GL_SURFACE_GLX_H_ + ++#include <cstdint> + #include <stdint.h> + + #include <memory> +diff --git a/src/3rdparty/chromium/v8/src/base/logging.h b/src/3rdparty/chromium/v8/src/base/logging.h +index 7c774ed30..1c44cf72a 100644 +--- a/src/3rdparty/chromium/v8/src/base/logging.h ++++ b/src/3rdparty/chromium/v8/src/base/logging.h +@@ -5,6 +5,7 @@ + #ifndef V8_BASE_LOGGING_H_ + #define V8_BASE_LOGGING_H_ + ++#include <cstdint> + #include <cstring> + #include <cstdint> + #include <sstream> +diff --git a/src/core/browsing_data_remover_delegate_qt.h b/src/core/browsing_data_remover_delegate_qt.h +index 5adfbbe7e..4e5c59e33 100644 +--- a/src/core/browsing_data_remover_delegate_qt.h ++++ b/src/core/browsing_data_remover_delegate_qt.h +@@ -44,6 +44,8 @@ + + #include "content/public/browser/browsing_data_remover_delegate.h" + ++#include <cstdint> ++ + namespace QtWebEngineCore { + + class BrowsingDataRemoverDelegateQt : public content::BrowsingDataRemoverDelegate { +diff --git a/src/3rdparty/chromium/third_party/webrtc/api/task_queue/task_queue_base.h b/src/3rdparty/chromium/third_party/webrtc/api/task_queue/task_queue_base.h +index 90b1efd31..63526a738 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/api/task_queue/task_queue_base.h ++++ b/src/3rdparty/chromium/third_party/webrtc/api/task_queue/task_queue_base.h +@@ -10,6 +10,7 @@ + #ifndef API_TASK_QUEUE_TASK_QUEUE_BASE_H_ + #define API_TASK_QUEUE_TASK_QUEUE_BASE_H_ + ++#include <cstdint> + #include <memory> + + #include "api/task_queue/queued_task.h" +diff --git a/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/gzip/gzip_utils.cc b/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/gzip/gzip_utils.cc +index 8a30c7f32..4934432cc 100644 +--- a/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/gzip/gzip_utils.cc ++++ b/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/gzip/gzip_utils.cc +@@ -20,6 +20,8 @@ + #include "perfetto/base/build_config.h" + #include "perfetto/base/compiler.h" + ++#include <cstdint> ++ + #if PERFETTO_BUILDFLAG(PERFETTO_ZLIB) + #include <zlib.h> + #else +diff --git a/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/gzip/gzip_utils.h b/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/gzip/gzip_utils.h +index 624363ff6..6d717fba4 100644 +--- a/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/gzip/gzip_utils.h ++++ b/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/importers/gzip/gzip_utils.h +@@ -17,6 +17,7 @@ + #ifndef SRC_TRACE_PROCESSOR_IMPORTERS_GZIP_GZIP_UTILS_H_ + #define SRC_TRACE_PROCESSOR_IMPORTERS_GZIP_GZIP_UTILS_H_ + ++#include <cstdint> + #include <memory> + + struct z_stream_s; +diff --git a/src/3rdparty/chromium/third_party/perfetto/include/perfetto/ext/tracing/core/slice.h b/src/3rdparty/chromium/third_party/perfetto/include/perfetto/ext/tracing/core/slice.h +index 4ce66fdea..3f3932b22 100644 +--- a/src/3rdparty/chromium/third_party/perfetto/include/perfetto/ext/tracing/core/slice.h ++++ b/src/3rdparty/chromium/third_party/perfetto/include/perfetto/ext/tracing/core/slice.h +@@ -20,6 +20,7 @@ + #include <stddef.h> + #include <string.h> + ++#include <cstdint> + #include <memory> + #include <string> + #include <vector> +diff --git a/src/3rdparty/chromium/third_party/perfetto/src/tracing/core/trace_packet.cc b/src/3rdparty/chromium/third_party/perfetto/src/tracing/core/trace_packet.cc +index 0dea150c1..c3def1683 100644 +--- a/src/3rdparty/chromium/third_party/perfetto/src/tracing/core/trace_packet.cc ++++ b/src/3rdparty/chromium/third_party/perfetto/src/tracing/core/trace_packet.cc +@@ -19,6 +19,8 @@ + #include "perfetto/base/logging.h" + #include "perfetto/protozero/proto_utils.h" + ++#include <cstdint> ++ + namespace perfetto { + + TracePacket::TracePacket() = default; +diff --git a/src/3rdparty/chromium/third_party/perfetto/include/perfetto/tracing/tracing_backend.h b/src/3rdparty/chromium/third_party/perfetto/include/perfetto/tracing/tracing_backend.h +index 67b0d2eb5..3c2462de5 100644 +--- a/src/3rdparty/chromium/third_party/perfetto/include/perfetto/tracing/tracing_backend.h ++++ b/src/3rdparty/chromium/third_party/perfetto/include/perfetto/tracing/tracing_backend.h +@@ -17,6 +17,7 @@ + #ifndef INCLUDE_PERFETTO_TRACING_TRACING_BACKEND_H_ + #define INCLUDE_PERFETTO_TRACING_TRACING_BACKEND_H_ + ++#include <cstdint> + #include <memory> + #include <string> + +diff --git a/src/3rdparty/chromium/base/task/thread_pool.h b/src/3rdparty/chromium/base/task/thread_pool.h +index 085c249ba..afc674ca7 100644 +--- a/src/3rdparty/chromium/base/task/thread_pool.h ++++ b/src/3rdparty/chromium/base/task/thread_pool.h +@@ -5,6 +5,7 @@ + #ifndef BASE_TASK_THREAD_POOL_H_ + #define BASE_TASK_THREAD_POOL_H_ + ++#include <cstdint> + #include <memory> + #include <utility> + +diff --git a/src/3rdparty/chromium/net/tools/huffman_trie/trie_entry.h b/src/3rdparty/chromium/net/tools/huffman_trie/trie_entry.h +index fe70260f9..eac6a7fc2 100644 +--- a/src/3rdparty/chromium/net/tools/huffman_trie/trie_entry.h ++++ b/src/3rdparty/chromium/net/tools/huffman_trie/trie_entry.h +@@ -5,6 +5,7 @@ + #ifndef NET_TOOLS_HUFFMAN_TRIE_TRIE_ENTRY_H_ + #define NET_TOOLS_HUFFMAN_TRIE_TRIE_ENTRY_H_ + ++#include <cstdint> + #include <memory> + #include <string> + #include <vector> +diff --git a/src/3rdparty/chromium/third_party/webrtc/api/fec_controller.h b/src/3rdparty/chromium/third_party/webrtc/api/fec_controller.h +index 3e5f7bb21..87777a53f 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/api/fec_controller.h ++++ b/src/3rdparty/chromium/third_party/webrtc/api/fec_controller.h +@@ -11,6 +11,7 @@ + #ifndef API_FEC_CONTROLLER_H_ + #define API_FEC_CONTROLLER_H_ + ++#include <cstdint> + #include <memory> + #include <vector> + +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/timestamp_map.h b/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/timestamp_map.h +index c85666c9a..dfb90e447 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/timestamp_map.h ++++ b/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/timestamp_map.h +@@ -11,6 +11,7 @@ + #ifndef MODULES_VIDEO_CODING_TIMESTAMP_MAP_H_ + #define MODULES_VIDEO_CODING_TIMESTAMP_MAP_H_ + ++#include <cstdint> + #include <memory> + + namespace webrtc { +diff --git a/src/3rdparty/chromium/third_party/webrtc/api/network_state_predictor.h b/src/3rdparty/chromium/third_party/webrtc/api/network_state_predictor.h +index 9cf5ab6f0..2d165baa5 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/api/network_state_predictor.h ++++ b/src/3rdparty/chromium/third_party/webrtc/api/network_state_predictor.h +@@ -11,6 +11,7 @@ + #ifndef API_NETWORK_STATE_PREDICTOR_H_ + #define API_NETWORK_STATE_PREDICTOR_H_ + ++#include <cstdint> + #include <memory> + #include <vector> + +diff --git a/src/3rdparty/chromium/gpu/command_buffer/common/skia_utils.h b/src/3rdparty/chromium/gpu/command_buffer/common/skia_utils.h +index 6508d79a1..a9f9528f1 100644 +--- a/src/3rdparty/chromium/gpu/command_buffer/common/skia_utils.h ++++ b/src/3rdparty/chromium/gpu/command_buffer/common/skia_utils.h +@@ -5,6 +5,7 @@ + #ifndef GPU_COMMAND_BUFFER_COMMON_SKIA_UTILS_H_ + #define GPU_COMMAND_BUFFER_COMMON_SKIA_UTILS_H_ + ++#include <cstdint> + #include <memory> + + #include "base/optional.h" +diff --git a/src/3rdparty/chromium/gpu/command_buffer/service/gpu_fence_manager.h b/src/3rdparty/chromium/gpu/command_buffer/service/gpu_fence_manager.h +index ee50d6fdd..576f6e3bc 100644 +--- a/src/3rdparty/chromium/gpu/command_buffer/service/gpu_fence_manager.h ++++ b/src/3rdparty/chromium/gpu/command_buffer/service/gpu_fence_manager.h +@@ -5,6 +5,7 @@ + #ifndef GPU_COMMAND_BUFFER_SERVICE_GPU_FENCE_MANAGER_H_ + #define GPU_COMMAND_BUFFER_SERVICE_GPU_FENCE_MANAGER_H_ + ++#include <cstdint> + #include <memory> + #include <vector> + +diff --git a/src/3rdparty/chromium/third_party/pdfium/core/fpdfapi/page/cpdf_function.h b/src/3rdparty/chromium/third_party/pdfium/core/fpdfapi/page/cpdf_function.h +index fd68b6b49..dc7c015d5 100644 +--- a/src/3rdparty/chromium/third_party/pdfium/core/fpdfapi/page/cpdf_function.h ++++ b/src/3rdparty/chromium/third_party/pdfium/core/fpdfapi/page/cpdf_function.h +@@ -7,6 +7,7 @@ + #ifndef CORE_FPDFAPI_PAGE_CPDF_FUNCTION_H_ + #define CORE_FPDFAPI_PAGE_CPDF_FUNCTION_H_ + ++#include <cstdint> + #include <memory> + #include <set> + #include <vector> +diff --git a/src/3rdparty/chromium/third_party/pdfium/core/fxcodec/jbig2/JBig2_DocumentContext.h b/src/3rdparty/chromium/third_party/pdfium/core/fxcodec/jbig2/JBig2_DocumentContext.h +index 9bcdd371e..5921794f1 100644 +--- a/src/3rdparty/chromium/third_party/pdfium/core/fxcodec/jbig2/JBig2_DocumentContext.h ++++ b/src/3rdparty/chromium/third_party/pdfium/core/fxcodec/jbig2/JBig2_DocumentContext.h +@@ -7,6 +7,7 @@ + #ifndef CORE_FXCODEC_JBIG2_JBIG2_DOCUMENTCONTEXT_H_ + #define CORE_FXCODEC_JBIG2_JBIG2_DOCUMENTCONTEXT_H_ + ++#include <cstdint> + #include <list> + #include <memory> + #include <utility> +diff --git a/src/3rdparty/chromium/third_party/pdfium/third_party/base/span.h b/src/3rdparty/chromium/third_party/pdfium/third_party/base/span.h +index bb07f43a0..0b7daf775 100644 +--- a/src/3rdparty/chromium/third_party/pdfium/third_party/base/span.h ++++ b/src/3rdparty/chromium/third_party/pdfium/third_party/base/span.h +@@ -9,6 +9,7 @@ + + #include <algorithm> + #include <array> ++#include <cstdint> + #include <iterator> + #include <type_traits> + #include <utility> +diff --git a/src/3rdparty/chromium/third_party/webrtc/video/stats_counter.h b/src/3rdparty/chromium/third_party/webrtc/video/stats_counter.h +index fb6017f41..ed5530ca0 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/video/stats_counter.h ++++ b/src/3rdparty/chromium/third_party/webrtc/video/stats_counter.h +@@ -11,6 +11,7 @@ + #ifndef VIDEO_STATS_COUNTER_H_ + #define VIDEO_STATS_COUNTER_H_ + ++#include <cstdint> + #include <memory> + #include <string> + +diff --git a/src/3rdparty/chromium/third_party/woff2/include/woff2/output.h b/src/3rdparty/chromium/third_party/woff2/include/woff2/output.h +index c325f67be..5c4dc4d18 100644 +--- a/src/3rdparty/chromium/third_party/woff2/include/woff2/output.h ++++ b/src/3rdparty/chromium/third_party/woff2/include/woff2/output.h +@@ -10,6 +10,7 @@ + #define WOFF2_WOFF2_OUT_H_ + + #include <algorithm> ++#include <cstdint> + #include <cstring> + #include <memory> + #include <string> +diff --git a/chromium/cc/input/main_thread_scrolling_reason.h b/chromium/cc/input/main_thread_scrolling_reason.h +index 4ddd536afcc..dc1bc072790 100644 +--- a/src/3rdparty/chromium/cc/input/main_thread_scrolling_reason.h ++++ b/src/3rdparty/chromium/cc/input/main_thread_scrolling_reason.h +@@ -7,6 +7,7 @@ + + #include <memory> + #include <string> ++#include <cstdint> + #include "cc/cc_export.h" + + namespace base { diff --git a/linhes/qt5-webengine/qt5-webengine-icu-75.patch b/linhes/qt5-webengine/qt5-webengine-icu-75.patch new file mode 100644 index 0000000..6178a2c --- /dev/null +++ b/linhes/qt5-webengine/qt5-webengine-icu-75.patch @@ -0,0 +1,99 @@ +diff --git a/chromium/build/config/compiler/BUILD.gn b/chromium/build/config/compiler/BUILD.gn +index b511a58c5a8..abd78a74ead 100644 +--- a/chromium/build/config/compiler/BUILD.gn ++++ b/chromium/build/config/compiler/BUILD.gn +@@ -566,7 +566,7 @@ config("compiler") { + # Override Chromium's default for projects that wish to stay on C++11. + cflags_cc += [ "-std=${standard_prefix}++11" ] + } else { +- cflags_cc += [ "-std=${standard_prefix}++14" ] ++ cflags_cc += [ "-std=${standard_prefix}++17" ] + } + } else if (!is_win && !is_nacl) { + if (target_os == "android") { +diff --git a/chromium/base/allocator/partition_allocator/partition_alloc_constants.h b/chromium/base/allocator/partition_allocator/partition_alloc_constants.h +index f03ba1e4ab4..b1495f7ae74 100644 +--- a/chromium/base/allocator/partition_allocator/partition_alloc_constants.h ++++ b/chromium/base/allocator/partition_allocator/partition_alloc_constants.h +@@ -195,7 +195,7 @@ NumPartitionPagesPerSuperPage() { + // + // __STDCPP_DEFAULT_NEW_ALIGNMENT__ is C++17. As such, it is not defined on all + // platforms, as Chrome's requirement is C++14 as of 2020. +-#if defined(__STDCPP_DEFAULT_NEW_ALIGNMENT__) ++#if 0 + static constexpr size_t kAlignment = + std::max(alignof(std::max_align_t), __STDCPP_DEFAULT_NEW_ALIGNMENT__); + #else +diff --git a/chromium/third_party/webrtc/common_video/h264/sps_parser.h b/chromium/third_party/webrtc/common_video/h264/sps_parser.h +index 76e627d27a3..942435f44a0 100644 +--- a/chromium/third_party/webrtc/common_video/h264/sps_parser.h ++++ b/chromium/third_party/webrtc/common_video/h264/sps_parser.h +@@ -12,6 +12,7 @@ + #define COMMON_VIDEO_H264_SPS_PARSER_H_ + + #include "absl/types/optional.h" ++#include <cstdint> + + namespace rtc { + class BitBuffer; +diff --git a/chromium/third_party/webrtc/common_video/h264/pps_parser.h b/chromium/third_party/webrtc/common_video/h264/pps_parser.h +index d6c31b06887..d8852dfd186 100644 +--- a/chromium/third_party/webrtc/common_video/h264/pps_parser.h ++++ b/chromium/third_party/webrtc/common_video/h264/pps_parser.h +@@ -12,6 +12,7 @@ + #define COMMON_VIDEO_H264_PPS_PARSER_H_ + + #include "absl/types/optional.h" ++#include <cstdint> + + namespace rtc { + class BitBuffer; +diff --git a/chromium/third_party/webrtc/modules/audio_processing/aec3/reverb_model_estimator.h b/chromium/third_party/webrtc/modules/audio_processing/aec3/reverb_model_estimator.h +index 3b9971abae1..d4458038527 100644 +--- a/chromium/third_party/webrtc/modules/audio_processing/aec3/reverb_model_estimator.h ++++ b/chromium/third_party/webrtc/modules/audio_processing/aec3/reverb_model_estimator.h +@@ -13,6 +13,7 @@ + + #include <array> + #include <vector> ++#include <memory> + + #include "absl/types/optional.h" + #include "api/array_view.h" +diff --git a/chromium/third_party/webrtc/modules/include/module_common_types_public.h b/chromium/third_party/webrtc/modules/include/module_common_types_public.h +index 345e45ce127..e686e5d691a 100644 +--- a/chromium/third_party/webrtc/modules/include/module_common_types_public.h ++++ b/chromium/third_party/webrtc/modules/include/module_common_types_public.h +@@ -12,6 +12,7 @@ + #define MODULES_INCLUDE_MODULE_COMMON_TYPES_PUBLIC_H_ + + #include <limits> ++#include <cstdint> + + #include "absl/types/optional.h" + +diff --git a/chromium/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.cc b/chromium/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.cc +index 8fcc799b795..bc69ddcf18c 100644 +--- a/chromium/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.cc ++++ b/chromium/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.cc +@@ -15,6 +15,7 @@ + #include "third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_metrics.h" + #include "third_party/blink/renderer/core/page/scrolling/text_fragment_finder.h" + #include "third_party/blink/renderer/platform/text/text_boundaries.h" ++#include "absl/base/attributes.h" + + namespace blink { + +diff --git a/chromium/third_party/abseil-cpp/absl/base/options.h b/chromium/third_party/abseil-cpp/absl/base/options.h +index df506f0fae6..1de105fed4a 100644 +--- a/chromium/third_party/abseil-cpp/absl/base/options.h ++++ b/chromium/third_party/abseil-cpp/absl/base/options.h +@@ -180,7 +180,7 @@ + // absl::variant is a typedef of std::variant, use the feature macro + // ABSL_USES_STD_VARIANT. + +-#define ABSL_OPTION_USE_STD_VARIANT 2 ++#define ABSL_OPTION_USE_STD_VARIANT 0 + + + // ABSL_OPTION_USE_INLINE_NAMESPACE diff --git a/linhes/qt5-webengine/qt5-webengine-icu-78.patch b/linhes/qt5-webengine/qt5-webengine-icu-78.patch new file mode 100644 index 0000000..d11299c --- /dev/null +++ b/linhes/qt5-webengine/qt5-webengine-icu-78.patch @@ -0,0 +1,79 @@ +https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/uchar_8h_source.html +https://github.com/unicode-org/icu/blame/main/icu4c/source/common/unicode/uchar.h +/usr/include/unicode/uchar.h + +ICU78 adds LineBreak U_LB_UNAMBIGUOUS_HYPHEN = 48,/*[HH]*/. +U_LB_COUNT goes from 48 to 49. + +kBreakAllLineBreakClassTable is expected to be square with +the same number of bits across as the lines down for every +U_LB_COUNT LineBreak. This table should have U_LB_COUNT=49 +bit columns and 49 rows with a bunch of 1 bits sprinkled +all over and should expand each time a new LineBreak is +added. Rather than fiddling with the BA_LB_COUNT math or +keep extending the table with zeros across and down as they +did here: + +https://src.opensuse.org/nodejs/nodejs-electron/src/commit/ee8e43b84d0e17b17d817943357e74dee3e5474ae7e6eaff93c60926bfc3780a/text_break_iterator-icu74-breakAllLineBreakClassTable-should-be-consistent.patch + +we just hard set the table to 40 lines to support 0XX-39RI. +ShouldBreakAfterBreakAll for LineBreak >= 40EB always +return 0/false which is what the recent table patches were +doing anyways. Look at the columns RI to VI and lines +[RI]-[VI]. It's all zeros so everyone gave up extending +this table with cleverly placed 1's years ago and just came +up with Whatever Works (TM) patches. LineBreak support >= +39RI running with 0 may be less than optimal. Here's +another patch. + +https://bugs.gentoo.org/917635 + +The original table code and patches since are all garbage +anyways. Noone seems to understand what this table does. I +don't either but I do know its limits and proper shape and +that it's not required to have lines and columns added for +each new LineBreak unless you want perfect support for new +LineBreak. + +The NodeJS patch adds a 6th array column which won't +compile on earlier ICU versions where U_LB_COUNT is small. + +static const unsigned char kBreakAllLineBreakClassTable[][BA_LB_COUNT / 8 + 1] = { + +This line is written wrong. It creates an extra byte +column when BA_LB_COUNT is divisible by 8. Our example of +40 LineBreak can be stored in 40/8=5 column bytes yet this +sets the column count to 40/8+1=6. This would be correct +though with the size of this code I don't see a problem +allocating 40 extra bytes. + +static const unsigned char kBreakAllLineBreakClassTable[][(BA_LB_COUNT-1) / 8 + 1] = { + +severach@aur +https://aur.archlinux.org/packages/qt5-webengine + +$ notepadqq +Cannot mix incompatible Qt library (5.15.17) with this library (5.15.18) + +If you have trouble with an application not working, look +through this list for packages with old versions. + +pacman -Qs qt5- + +local/qt5-base 5.15.18+kde+r109-2 (qt5) +* A cross-platform application and UI framework +local/qt5-webchannel 5.15.17+kde+r3-1 (qt5) +* Provides access to QObject or QML objects from HTML clients for seamless integration of Qt applications with HTML/JavaScript clients + +diff -pNaru3 a/src/3rdparty/chromium/third_party/blink/renderer/platform/text/text_break_iterator.cc b/src/3rdparty/chromium/third_party/blink/renderer/platform/text/text_break_iterator.cc +--- a/src/3rdparty/chromium/third_party/blink/renderer/platform/text/text_break_iterator.cc 2025-11-11 01:42:16.454081862 -0500 ++++ b/src/3rdparty/chromium/third_party/blink/renderer/platform/text/text_break_iterator.cc 2025-11-11 01:49:41.838185933 -0500 +@@ -163,7 +163,7 @@ static const unsigned char kAsciiLineBre + // clang-format on + + #if U_ICU_VERSION_MAJOR_NUM >= 74 +-#define BA_LB_COUNT (U_LB_COUNT - 8) ++#define BA_LB_COUNT (40) /* (U_LB_COUNT - 8) */ + #elif U_ICU_VERSION_MAJOR_NUM >= 58 + #define BA_LB_COUNT (U_LB_COUNT - 3) + #else diff --git a/linhes/qt5-webengine/qt5-webengine-ninja-1.12.patch b/linhes/qt5-webengine/qt5-webengine-ninja-1.12.patch new file mode 100644 index 0000000..9bddb53 --- /dev/null +++ b/linhes/qt5-webengine/qt5-webengine-ninja-1.12.patch @@ -0,0 +1,12 @@ +diff --git a/chromium/content/public/browser/BUILD.gn b/chromium/content/public/browser/BUILD.gn +index 7cf82a4aacf..0e0dda2c3ca 100644 +--- a/chromium/content/public/browser/BUILD.gn ++++ b/chromium/content/public/browser/BUILD.gn +@@ -469,6 +469,7 @@ jumbo_source_set("browser_sources") { + "//build:chromeos_buildflags", + "//cc", + "//components/viz/host", ++ "//components/spellcheck:buildflags", + "//content/browser", # Must not be public_deps! + "//device/fido", + "//gpu", diff --git a/linhes/qt5-webengine/qt5-webengine-pipewire-0.3.patch b/linhes/qt5-webengine/qt5-webengine-pipewire-0.3.patch new file mode 100644 index 0000000..f8047e0 --- /dev/null +++ b/linhes/qt5-webengine/qt5-webengine-pipewire-0.3.patch @@ -0,0 +1,1819 @@ +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/BUILD.gn b/chromium/third_party/webrtc/modules/desktop_capture/BUILD.gn +index 5235512735d..8259442f811 100644 +--- a/chromium/third_party/webrtc/modules/desktop_capture/BUILD.gn ++++ b/chromium/third_party/webrtc/modules/desktop_capture/BUILD.gn +@@ -11,6 +11,11 @@ import("//build/config/ui.gni") + import("//tools/generate_stubs/rules.gni") + import("../../webrtc.gni") + ++if (rtc_use_pipewire) { ++ assert(rtc_pipewire_version == "0.2" || rtc_pipewire_version == "0.3", ++ "Unsupported PipeWire version") ++} ++ + use_desktop_capture_differ_sse2 = current_cpu == "x86" || current_cpu == "x64" + + config("x11_config") { +@@ -200,22 +205,41 @@ if (is_linux || is_chromeos) { + ] + } + +- if (rtc_link_pipewire) { ++ if (rtc_pipewire_version == "0.3") { + pkg_config("pipewire") { +- packages = [ "libpipewire-0.2" ] ++ packages = [ "libpipewire-0.3" ] ++ if (!rtc_link_pipewire) { ++ ignore_libs = true ++ } + } + } else { ++ pkg_config("pipewire") { ++ packages = [ "libpipewire-0.2" ] ++ if (!rtc_link_pipewire) { ++ ignore_libs = true ++ } ++ } ++ } ++ ++ if (!rtc_link_pipewire) { + # When libpipewire is not directly linked, use stubs to allow for dlopening of + # the binary. + generate_stubs("pipewire_stubs") { +- configs = [ "../../:common_config" ] ++ configs = [ ++ "../../:common_config", ++ ":pipewire", ++ ] + deps = [ "../../rtc_base" ] + extra_header = "linux/pipewire_stub_header.fragment" + logging_function = "RTC_LOG(LS_VERBOSE)" + logging_include = "rtc_base/logging.h" + output_name = "linux/pipewire_stubs" + path_from_source = "modules/desktop_capture/linux" +- sigs = [ "linux/pipewire.sigs" ] ++ if (rtc_pipewire_version == "0.3") { ++ sigs = [ "linux/pipewire03.sigs" ] ++ } else { ++ sigs = [ "linux/pipewire02.sigs" ] ++ } + } + } + +@@ -506,6 +530,7 @@ rtc_library("desktop_capture_generic") { + absl_deps = [ + "//third_party/abseil-cpp/absl/memory", + "//third_party/abseil-cpp/absl/strings", ++ "//third_party/abseil-cpp/absl/types:optional", + ] + + if (rtc_use_x11_extensions) { +@@ -526,20 +551,15 @@ rtc_library("desktop_capture_generic") { + sources += [ + "linux/base_capturer_pipewire.cc", + "linux/base_capturer_pipewire.h", +- "linux/screen_capturer_pipewire.cc", +- "linux/screen_capturer_pipewire.h", +- "linux/window_capturer_pipewire.cc", +- "linux/window_capturer_pipewire.h", + ] + + configs += [ + ":pipewire_config", + ":gio", ++ ":pipewire", + ] + +- if (rtc_link_pipewire) { +- configs += [ ":pipewire" ] +- } else { ++ if (!rtc_link_pipewire) { + deps += [ ":pipewire_stubs" ] + } + } +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc b/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc +index 2640e93aa98..c302a086ead 100644 +--- a/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc ++++ b/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc +@@ -14,8 +14,14 @@ + #include <glib-object.h> + #include <spa/param/format-utils.h> + #include <spa/param/props.h> ++#if !PW_CHECK_VERSION(0, 3, 0) + #include <spa/param/video/raw-utils.h> + #include <spa/support/type-map.h> ++#endif ++ ++#include <sys/ioctl.h> ++#include <sys/mman.h> ++#include <sys/syscall.h> + + #include <memory> + #include <utility> +@@ -30,7 +36,11 @@ + #include "modules/desktop_capture/linux/pipewire_stubs.h" + + using modules_desktop_capture_linux::InitializeStubs; +-using modules_desktop_capture_linux::kModulePipewire; ++#if PW_CHECK_VERSION(0, 3, 0) ++using modules_desktop_capture_linux::kModulePipewire03; ++#else ++using modules_desktop_capture_linux::kModulePipewire02; ++#endif + using modules_desktop_capture_linux::StubPathMap; + #endif // defined(WEBRTC_DLOPEN_PIPEWIRE) + +@@ -47,9 +57,156 @@ const char kScreenCastInterfaceName[] = "org.freedesktop.portal.ScreenCast"; + const int kBytesPerPixel = 4; + + #if defined(WEBRTC_DLOPEN_PIPEWIRE) ++#if PW_CHECK_VERSION(0, 3, 0) ++const char kPipeWireLib[] = "libpipewire-0.3.so.0"; ++#else + const char kPipeWireLib[] = "libpipewire-0.2.so.1"; + #endif ++#endif + ++// static ++struct dma_buf_sync { ++ uint64_t flags; ++}; ++#define DMA_BUF_SYNC_READ (1 << 0) ++#define DMA_BUF_SYNC_START (0 << 2) ++#define DMA_BUF_SYNC_END (1 << 2) ++#define DMA_BUF_BASE 'b' ++#define DMA_BUF_IOCTL_SYNC _IOW(DMA_BUF_BASE, 0, struct dma_buf_sync) ++ ++static void SyncDmaBuf(int fd, uint64_t start_or_end) { ++ struct dma_buf_sync sync = {0}; ++ ++ sync.flags = start_or_end | DMA_BUF_SYNC_READ; ++ ++ while (true) { ++ int ret; ++ ret = ioctl(fd, DMA_BUF_IOCTL_SYNC, &sync); ++ if (ret == -1 && errno == EINTR) { ++ continue; ++ } else if (ret == -1) { ++ RTC_LOG(LS_ERROR) << "Failed to synchronize DMA buffer: " ++ << g_strerror(errno); ++ break; ++ } else { ++ break; ++ } ++ } ++} ++ ++class ScopedBuf { ++ public: ++ ScopedBuf() {} ++ ScopedBuf(unsigned char* map, int map_size, bool is_dma_buf, int fd) ++ : map_(map), map_size_(map_size), is_dma_buf_(is_dma_buf), fd_(fd) {} ++ ~ScopedBuf() { ++ if (map_ != MAP_FAILED) { ++ if (is_dma_buf_) { ++ SyncDmaBuf(fd_, DMA_BUF_SYNC_END); ++ } ++ munmap(map_, map_size_); ++ } ++ } ++ ++ operator bool() { return map_ != MAP_FAILED; } ++ ++ void initialize(unsigned char* map, int map_size, bool is_dma_buf, int fd) { ++ map_ = map; ++ map_size_ = map_size; ++ is_dma_buf_ = is_dma_buf; ++ fd_ = fd; ++ } ++ ++ unsigned char* get() { return map_; } ++ ++ protected: ++ unsigned char* map_ = nullptr; ++ int map_size_; ++ bool is_dma_buf_; ++ int fd_; ++}; ++ ++template <class T> ++class Scoped { ++ public: ++ Scoped() {} ++ explicit Scoped(T* val) { ptr_ = val; } ++ ~Scoped() { RTC_NOTREACHED(); } ++ ++ T* operator->() { return ptr_; } ++ ++ bool operator!() { return ptr_ == nullptr; } ++ ++ T* get() { return ptr_; } ++ ++ T** receive() { ++ RTC_CHECK(!ptr_); ++ return &ptr_; ++ } ++ ++ Scoped& operator=(T* val) { ++ ptr_ = val; ++ return *this; ++ } ++ ++ protected: ++ T* ptr_ = nullptr; ++}; ++ ++template <> ++Scoped<GError>::~Scoped() { ++ if (ptr_) { ++ g_error_free(ptr_); ++ } ++} ++ ++template <> ++Scoped<gchar>::~Scoped() { ++ if (ptr_) { ++ g_free(ptr_); ++ } ++} ++ ++template <> ++Scoped<GVariant>::~Scoped() { ++ if (ptr_) { ++ g_variant_unref(ptr_); ++ } ++} ++ ++template <> ++Scoped<GVariantIter>::~Scoped() { ++ if (ptr_) { ++ g_variant_iter_free(ptr_); ++ } ++} ++ ++template <> ++Scoped<GDBusMessage>::~Scoped() { ++ if (ptr_) { ++ g_object_unref(ptr_); ++ } ++} ++ ++template <> ++Scoped<GUnixFDList>::~Scoped() { ++ if (ptr_) { ++ g_object_unref(ptr_); ++ } ++} ++ ++#if PW_CHECK_VERSION(0, 3, 0) ++void BaseCapturerPipeWire::OnCoreError(void* data, ++ uint32_t id, ++ int seq, ++ int res, ++ const char* message) { ++ BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data); ++ RTC_DCHECK(that); ++ ++ RTC_LOG(LS_ERROR) << "PipeWire remote error: " << message; ++} ++#else + // static + void BaseCapturerPipeWire::OnStateChanged(void* data, + pw_remote_state old_state, +@@ -64,7 +221,7 @@ void BaseCapturerPipeWire::OnStateChanged(void* data, + break; + case PW_REMOTE_STATE_CONNECTED: + RTC_LOG(LS_INFO) << "PipeWire remote state: connected."; +- that->CreateReceivingStream(); ++ that->pw_stream_ = that->CreateReceivingStream(); + break; + case PW_REMOTE_STATE_CONNECTING: + RTC_LOG(LS_INFO) << "PipeWire remote state: connecting."; +@@ -74,6 +231,7 @@ void BaseCapturerPipeWire::OnStateChanged(void* data, + break; + } + } ++#endif + + // static + void BaseCapturerPipeWire::OnStreamStateChanged(void* data, +@@ -83,6 +241,18 @@ void BaseCapturerPipeWire::OnStreamStateChanged(void* data, + BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data); + RTC_DCHECK(that); + ++#if PW_CHECK_VERSION(0, 3, 0) ++ switch (state) { ++ case PW_STREAM_STATE_ERROR: ++ RTC_LOG(LS_ERROR) << "PipeWire stream state error: " << error_message; ++ break; ++ case PW_STREAM_STATE_PAUSED: ++ case PW_STREAM_STATE_STREAMING: ++ case PW_STREAM_STATE_UNCONNECTED: ++ case PW_STREAM_STATE_CONNECTING: ++ break; ++ } ++#else + switch (state) { + case PW_STREAM_STATE_ERROR: + RTC_LOG(LS_ERROR) << "PipeWire stream state error: " << error_message; +@@ -97,36 +267,74 @@ void BaseCapturerPipeWire::OnStreamStateChanged(void* data, + case PW_STREAM_STATE_STREAMING: + break; + } ++#endif + } + + // static ++#if PW_CHECK_VERSION(0, 3, 0) ++void BaseCapturerPipeWire::OnStreamParamChanged(void* data, ++ uint32_t id, ++ const struct spa_pod* format) { ++#else + void BaseCapturerPipeWire::OnStreamFormatChanged(void* data, + const struct spa_pod* format) { ++#endif + BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data); + RTC_DCHECK(that); + + RTC_LOG(LS_INFO) << "PipeWire stream format changed."; + ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (!format || id != SPA_PARAM_Format) { ++#else + if (!format) { + pw_stream_finish_format(that->pw_stream_, /*res=*/0, /*params=*/nullptr, + /*n_params=*/0); ++#endif + return; + } + ++#if PW_CHECK_VERSION(0, 3, 0) ++ spa_format_video_raw_parse(format, &that->spa_video_format_); ++#else + that->spa_video_format_ = new spa_video_info_raw(); + spa_format_video_raw_parse(format, that->spa_video_format_, + &that->pw_type_->format_video); ++#endif + ++#if PW_CHECK_VERSION(0, 3, 0) ++ auto width = that->spa_video_format_.size.width; ++ auto height = that->spa_video_format_.size.height; ++#else + auto width = that->spa_video_format_->size.width; + auto height = that->spa_video_format_->size.height; ++#endif + auto stride = SPA_ROUND_UP_N(width * kBytesPerPixel, 4); + auto size = height * stride; + ++ that->desktop_size_ = DesktopSize(width, height); ++ + uint8_t buffer[1024] = {}; + auto builder = spa_pod_builder{buffer, sizeof(buffer)}; + + // Setup buffers and meta header for new format. +- const struct spa_pod* params[2]; ++ const struct spa_pod* params[3]; ++#if PW_CHECK_VERSION(0, 3, 0) ++ params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_add_object( ++ &builder, SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers, ++ SPA_PARAM_BUFFERS_size, SPA_POD_Int(size), SPA_PARAM_BUFFERS_stride, ++ SPA_POD_Int(stride), SPA_PARAM_BUFFERS_buffers, ++ SPA_POD_CHOICE_RANGE_Int(8, 1, 32))); ++ params[1] = reinterpret_cast<spa_pod*>(spa_pod_builder_add_object( ++ &builder, SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, SPA_PARAM_META_type, ++ SPA_POD_Id(SPA_META_Header), SPA_PARAM_META_size, ++ SPA_POD_Int(sizeof(struct spa_meta_header)))); ++ params[2] = reinterpret_cast<spa_pod*>(spa_pod_builder_add_object( ++ &builder, SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, SPA_PARAM_META_type, ++ SPA_POD_Id(SPA_META_VideoCrop), SPA_PARAM_META_size, ++ SPA_POD_Int(sizeof(struct spa_meta_region)))); ++ pw_stream_update_params(that->pw_stream_, params, 3); ++#else + params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_object( + &builder, + // id to enumerate buffer requirements +@@ -155,8 +363,18 @@ void BaseCapturerPipeWire::OnStreamFormatChanged(void* data, + // Size: size of the metadata, specified as integer (i) + ":", that->pw_core_type_->param_meta.size, "i", + sizeof(struct spa_meta_header))); +- +- pw_stream_finish_format(that->pw_stream_, /*res=*/0, params, /*n_params=*/2); ++ params[2] = reinterpret_cast<spa_pod*>(spa_pod_builder_object( ++ &builder, ++ // id to enumerate supported metadata ++ that->pw_core_type_->param.idMeta, that->pw_core_type_->param_meta.Meta, ++ // Type: specified as id or enum (I) ++ ":", that->pw_core_type_->param_meta.type, "I", ++ that->pw_core_type_->meta.VideoCrop, ++ // Size: size of the metadata, specified as integer (i) ++ ":", that->pw_core_type_->param_meta.size, "i", ++ sizeof(struct spa_meta_video_crop))); ++ pw_stream_finish_format(that->pw_stream_, /*res=*/0, params, /*n_params=*/3); ++#endif + } + + // static +@@ -164,15 +382,26 @@ void BaseCapturerPipeWire::OnStreamProcess(void* data) { + BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data); + RTC_DCHECK(that); + +- pw_buffer* buf = nullptr; ++ struct pw_buffer* next_buffer; ++ struct pw_buffer* buffer = nullptr; ++ ++ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_); ++ while (next_buffer) { ++ buffer = next_buffer; ++ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_); + +- if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) { ++ if (next_buffer) { ++ pw_stream_queue_buffer(that->pw_stream_, buffer); ++ } ++ } ++ ++ if (!buffer) { + return; + } + +- that->HandleBuffer(buf); ++ that->HandleBuffer(buffer); + +- pw_stream_queue_buffer(that->pw_stream_, buf); ++ pw_stream_queue_buffer(that->pw_stream_, buffer); + } + + BaseCapturerPipeWire::BaseCapturerPipeWire(CaptureSourceType source_type) +@@ -183,6 +412,7 @@ BaseCapturerPipeWire::~BaseCapturerPipeWire() { + pw_thread_loop_stop(pw_main_loop_); + } + ++#if !PW_CHECK_VERSION(0, 3, 0) + if (pw_type_) { + delete pw_type_; + } +@@ -190,30 +420,41 @@ BaseCapturerPipeWire::~BaseCapturerPipeWire() { + if (spa_video_format_) { + delete spa_video_format_; + } ++#endif + + if (pw_stream_) { + pw_stream_destroy(pw_stream_); + } + ++#if !PW_CHECK_VERSION(0, 3, 0) + if (pw_remote_) { + pw_remote_destroy(pw_remote_); + } ++#endif + ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (pw_core_) { ++ pw_core_disconnect(pw_core_); ++ } ++ ++ if (pw_context_) { ++ pw_context_destroy(pw_context_); ++ } ++#else + if (pw_core_) { + pw_core_destroy(pw_core_); + } ++#endif + + if (pw_main_loop_) { + pw_thread_loop_destroy(pw_main_loop_); + } + ++#if !PW_CHECK_VERSION(0, 3, 0) + if (pw_loop_) { + pw_loop_destroy(pw_loop_); + } +- +- if (current_frame_) { +- free(current_frame_); +- } ++#endif + + if (start_request_signal_id_) { + g_dbus_connection_signal_unsubscribe(connection_, start_request_signal_id_); +@@ -228,18 +469,16 @@ BaseCapturerPipeWire::~BaseCapturerPipeWire() { + } + + if (session_handle_) { +- GDBusMessage* message = g_dbus_message_new_method_call( +- kDesktopBusName, session_handle_, kSessionInterfaceName, "Close"); +- if (message) { +- GError* error = nullptr; +- g_dbus_connection_send_message(connection_, message, ++ Scoped<GDBusMessage> message(g_dbus_message_new_method_call( ++ kDesktopBusName, session_handle_, kSessionInterfaceName, "Close")); ++ if (message.get()) { ++ Scoped<GError> error; ++ g_dbus_connection_send_message(connection_, message.get(), + G_DBUS_SEND_MESSAGE_FLAGS_NONE, +- /*out_serial=*/nullptr, &error); +- if (error) { ++ /*out_serial=*/nullptr, error.receive()); ++ if (error.get()) { + RTC_LOG(LS_ERROR) << "Failed to close the session: " << error->message; +- g_error_free(error); + } +- g_object_unref(message); + } + } + +@@ -274,7 +513,11 @@ void BaseCapturerPipeWire::InitPipeWire() { + StubPathMap paths; + + // Check if the PipeWire library is available. +- paths[kModulePipewire].push_back(kPipeWireLib); ++#if PW_CHECK_VERSION(0, 3, 0) ++ paths[kModulePipewire03].push_back(kPipeWireLib); ++#else ++ paths[kModulePipewire02].push_back(kPipeWireLib); ++#endif + if (!InitializeStubs(paths)) { + RTC_LOG(LS_ERROR) << "Failed to load the PipeWire library and symbols."; + portal_init_failed_ = true; +@@ -284,16 +527,46 @@ void BaseCapturerPipeWire::InitPipeWire() { + + pw_init(/*argc=*/nullptr, /*argc=*/nullptr); + ++#if PW_CHECK_VERSION(0, 3, 0) ++ pw_main_loop_ = pw_thread_loop_new("pipewire-main-loop", nullptr); ++ ++ pw_thread_loop_lock(pw_main_loop_); ++ ++ pw_context_ = ++ pw_context_new(pw_thread_loop_get_loop(pw_main_loop_), nullptr, 0); ++ if (!pw_context_) { ++ RTC_LOG(LS_ERROR) << "Failed to create PipeWire context"; ++ return; ++ } ++ ++ pw_core_ = pw_context_connect(pw_context_, nullptr, 0); ++ if (!pw_core_) { ++ RTC_LOG(LS_ERROR) << "Failed to connect PipeWire context"; ++ return; ++ } ++#else + pw_loop_ = pw_loop_new(/*properties=*/nullptr); + pw_main_loop_ = pw_thread_loop_new(pw_loop_, "pipewire-main-loop"); + ++ pw_thread_loop_lock(pw_main_loop_); ++ + pw_core_ = pw_core_new(pw_loop_, /*properties=*/nullptr); + pw_core_type_ = pw_core_get_type(pw_core_); + pw_remote_ = pw_remote_new(pw_core_, nullptr, /*user_data_size=*/0); + + InitPipeWireTypes(); ++#endif + + // Initialize event handlers, remote end and stream-related. ++#if PW_CHECK_VERSION(0, 3, 0) ++ pw_core_events_.version = PW_VERSION_CORE_EVENTS; ++ pw_core_events_.error = &OnCoreError; ++ ++ pw_stream_events_.version = PW_VERSION_STREAM_EVENTS; ++ pw_stream_events_.state_changed = &OnStreamStateChanged; ++ pw_stream_events_.param_changed = &OnStreamParamChanged; ++ pw_stream_events_.process = &OnStreamProcess; ++#else + pw_remote_events_.version = PW_VERSION_REMOTE_EVENTS; + pw_remote_events_.state_changed = &OnStateChanged; + +@@ -301,19 +574,33 @@ void BaseCapturerPipeWire::InitPipeWire() { + pw_stream_events_.state_changed = &OnStreamStateChanged; + pw_stream_events_.format_changed = &OnStreamFormatChanged; + pw_stream_events_.process = &OnStreamProcess; ++#endif + ++#if PW_CHECK_VERSION(0, 3, 0) ++ pw_core_add_listener(pw_core_, &spa_core_listener_, &pw_core_events_, this); ++ ++ pw_stream_ = CreateReceivingStream(); ++ if (!pw_stream_) { ++ RTC_LOG(LS_ERROR) << "Failed to create PipeWire stream"; ++ return; ++ } ++#else + pw_remote_add_listener(pw_remote_, &spa_remote_listener_, &pw_remote_events_, + this); + pw_remote_connect_fd(pw_remote_, pw_fd_); ++#endif + + if (pw_thread_loop_start(pw_main_loop_) < 0) { + RTC_LOG(LS_ERROR) << "Failed to start main PipeWire loop"; + portal_init_failed_ = true; + } + ++ pw_thread_loop_unlock(pw_main_loop_); ++ + RTC_LOG(LS_INFO) << "PipeWire remote opened."; + } + ++#if !PW_CHECK_VERSION(0, 3, 0) + void BaseCapturerPipeWire::InitPipeWireTypes() { + spa_type_map* map = pw_core_type_->map; + pw_type_ = new PipeWireType(); +@@ -323,23 +610,44 @@ void BaseCapturerPipeWire::InitPipeWireTypes() { + spa_type_format_video_map(map, &pw_type_->format_video); + spa_type_video_format_map(map, &pw_type_->video_format); + } ++#endif + +-void BaseCapturerPipeWire::CreateReceivingStream() { ++pw_stream* BaseCapturerPipeWire::CreateReceivingStream() { ++#if !PW_CHECK_VERSION(0, 3, 0) ++ if (pw_remote_get_state(pw_remote_, nullptr) != PW_REMOTE_STATE_CONNECTED) { ++ RTC_LOG(LS_ERROR) << "Cannot create pipewire stream"; ++ return nullptr; ++ } ++#endif + spa_rectangle pwMinScreenBounds = spa_rectangle{1, 1}; +- spa_rectangle pwScreenBounds = +- spa_rectangle{static_cast<uint32_t>(desktop_size_.width()), +- static_cast<uint32_t>(desktop_size_.height())}; +- +- spa_fraction pwFrameRateMin = spa_fraction{0, 1}; +- spa_fraction pwFrameRateMax = spa_fraction{60, 1}; ++ spa_rectangle pwMaxScreenBounds = spa_rectangle{UINT32_MAX, UINT32_MAX}; + + pw_properties* reuseProps = + pw_properties_new_string("pipewire.client.reuse=1"); +- pw_stream_ = pw_stream_new(pw_remote_, "webrtc-consume-stream", reuseProps); ++#if PW_CHECK_VERSION(0, 3, 0) ++ auto stream = pw_stream_new(pw_core_, "webrtc-consume-stream", reuseProps); ++#else ++ auto stream = pw_stream_new(pw_remote_, "webrtc-consume-stream", reuseProps); ++#endif + + uint8_t buffer[1024] = {}; + const spa_pod* params[1]; + spa_pod_builder builder = spa_pod_builder{buffer, sizeof(buffer)}; ++ ++#if PW_CHECK_VERSION(0, 3, 0) ++ params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_add_object( ++ &builder, SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, ++ SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_video), ++ SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw), ++ SPA_FORMAT_VIDEO_format, ++ SPA_POD_CHOICE_ENUM_Id(5, SPA_VIDEO_FORMAT_BGRx, SPA_VIDEO_FORMAT_RGBx, ++ SPA_VIDEO_FORMAT_RGBA, SPA_VIDEO_FORMAT_BGRx, ++ SPA_VIDEO_FORMAT_BGRA), ++ SPA_FORMAT_VIDEO_size, ++ SPA_POD_CHOICE_RANGE_Rectangle(&pwMinScreenBounds, &pwMinScreenBounds, ++ &pwMaxScreenBounds), ++ 0)); ++#else + params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_object( + &builder, + // id to enumerate formats +@@ -349,69 +657,218 @@ void BaseCapturerPipeWire::CreateReceivingStream() { + // then allowed formats are enumerated (e) and the format is undecided (u) + // to allow negotiation + ":", pw_type_->format_video.format, "Ieu", pw_type_->video_format.BGRx, +- SPA_POD_PROP_ENUM(2, pw_type_->video_format.RGBx, +- pw_type_->video_format.BGRx), ++ SPA_POD_PROP_ENUM( ++ 4, pw_type_->video_format.RGBx, pw_type_->video_format.BGRx, ++ pw_type_->video_format.RGBA, pw_type_->video_format.BGRA), + // Video size: specified as rectangle (R), preferred size is specified as + // first parameter, then allowed size is defined as range (r) from min and + // max values and the format is undecided (u) to allow negotiation +- ":", pw_type_->format_video.size, "Rru", &pwScreenBounds, 2, +- &pwMinScreenBounds, &pwScreenBounds, +- // Frame rate: specified as fraction (F) and set to minimum frame rate +- // value +- ":", pw_type_->format_video.framerate, "F", &pwFrameRateMin, +- // Max frame rate: specified as fraction (F), preferred frame rate is set +- // to maximum value, then allowed frame rate is defined as range (r) from +- // min and max values and it is undecided (u) to allow negotiation +- ":", pw_type_->format_video.max_framerate, "Fru", &pwFrameRateMax, 2, +- &pwFrameRateMin, &pwFrameRateMax)); +- +- pw_stream_add_listener(pw_stream_, &spa_stream_listener_, &pw_stream_events_, ++ ":", pw_type_->format_video.size, "Rru", &pwMinScreenBounds, ++ SPA_POD_PROP_MIN_MAX(&pwMinScreenBounds, &pwMaxScreenBounds))); ++#endif ++ ++ pw_stream_add_listener(stream, &spa_stream_listener_, &pw_stream_events_, + this); ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (pw_stream_connect(stream, PW_DIRECTION_INPUT, pw_stream_node_id_, ++ PW_STREAM_FLAG_AUTOCONNECT, params, 1) != 0) { ++#else + pw_stream_flags flags = static_cast<pw_stream_flags>( +- PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE | +- PW_STREAM_FLAG_MAP_BUFFERS); +- if (pw_stream_connect(pw_stream_, PW_DIRECTION_INPUT, /*port_path=*/nullptr, ++ PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE); ++ if (pw_stream_connect(stream, PW_DIRECTION_INPUT, /*port_path=*/nullptr, + flags, params, + /*n_params=*/1) != 0) { ++#endif + RTC_LOG(LS_ERROR) << "Could not connect receiving stream."; + portal_init_failed_ = true; +- return; ++ return nullptr; + } ++ ++ return stream; + } + + void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) { + spa_buffer* spaBuffer = buffer->buffer; +- void* src = nullptr; ++ ScopedBuf map; ++ uint8_t* src = nullptr; ++ ++ if (spaBuffer->datas[0].chunk->size == 0) { ++ RTC_LOG(LS_ERROR) << "Failed to get video stream: Zero size."; ++ return; ++ } ++ ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (spaBuffer->datas[0].type == SPA_DATA_MemFd || ++ spaBuffer->datas[0].type == SPA_DATA_DmaBuf) { ++#else ++ if (spaBuffer->datas[0].type == pw_core_type_->data.MemFd || ++ spaBuffer->datas[0].type == pw_core_type_->data.DmaBuf) { ++#endif ++ map.initialize( ++ static_cast<uint8_t*>( ++ mmap(nullptr, ++ spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset, ++ PROT_READ, MAP_PRIVATE, spaBuffer->datas[0].fd, 0)), ++ spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset, ++#if PW_CHECK_VERSION(0, 3, 0) ++ spaBuffer->datas[0].type == SPA_DATA_DmaBuf, ++#else ++ spaBuffer->datas[0].type == pw_core_type_->data.DmaBuf, ++#endif ++ spaBuffer->datas[0].fd); ++ ++ if (!map) { ++ RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " ++ << std::strerror(errno); ++ return; ++ } ++ ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) { ++#else ++ if (spaBuffer->datas[0].type == pw_core_type_->data.DmaBuf) { ++#endif ++ SyncDmaBuf(spaBuffer->datas[0].fd, DMA_BUF_SYNC_START); ++ } ++ ++ src = SPA_MEMBER(map.get(), spaBuffer->datas[0].mapoffset, uint8_t); ++#if PW_CHECK_VERSION(0, 3, 0) ++ } else if (spaBuffer->datas[0].type == SPA_DATA_MemPtr) { ++#else ++ } else if (spaBuffer->datas[0].type == pw_core_type_->data.MemPtr) { ++#endif ++ src = static_cast<uint8_t*>(spaBuffer->datas[0].data); ++ } + +- if (!(src = spaBuffer->datas[0].data)) { ++ if (!src) { ++ return; ++ } ++ ++#if PW_CHECK_VERSION(0, 3, 0) ++ struct spa_meta_region* video_metadata = ++ static_cast<struct spa_meta_region*>(spa_buffer_find_meta_data( ++ spaBuffer, SPA_META_VideoCrop, sizeof(*video_metadata))); ++#else ++ struct spa_meta_video_crop* video_metadata = ++ static_cast<struct spa_meta_video_crop*>( ++ spa_buffer_find_meta(spaBuffer, pw_core_type_->meta.VideoCrop)); ++#endif ++ ++ // Video size from metadata is bigger than an actual video stream size. ++ // The metadata are wrong or we should up-scale the video...in both cases ++ // just quit now. ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (video_metadata && (video_metadata->region.size.width > ++ static_cast<uint32_t>(desktop_size_.width()) || ++ video_metadata->region.size.height > ++ static_cast<uint32_t>(desktop_size_.height()))) { ++#else ++ if (video_metadata && (video_metadata->width > desktop_size_.width() || ++ video_metadata->height > desktop_size_.height())) { ++#endif ++ RTC_LOG(LS_ERROR) << "Stream metadata sizes are wrong!"; + return; + } + +- uint32_t maxSize = spaBuffer->datas[0].maxsize; +- int32_t srcStride = spaBuffer->datas[0].chunk->stride; +- if (srcStride != (desktop_size_.width() * kBytesPerPixel)) { ++ // Use video metadata when video size from metadata is set and smaller than ++ // video stream size, so we need to adjust it. ++ bool video_is_full_width = true; ++ bool video_is_full_height = true; ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (video_metadata && video_metadata->region.size.width != 0 && ++ video_metadata->region.size.height != 0) { ++ if (video_metadata->region.size.width < ++ static_cast<uint32_t>(desktop_size_.width())) { ++ video_is_full_width = false; ++ } else if (video_metadata->region.size.height < ++ static_cast<uint32_t>(desktop_size_.height())) { ++ video_is_full_height = false; ++ } ++ } ++#else ++ if (video_metadata && video_metadata->width != 0 && ++ video_metadata->height != 0) { ++ if (video_metadata->width < desktop_size_.width()) { ++ } else if (video_metadata->height < desktop_size_.height()) { ++ video_is_full_height = false; ++ } ++ } ++#endif ++ ++ DesktopSize video_size_prev = video_size_; ++ if (!video_is_full_height || !video_is_full_width) { ++#if PW_CHECK_VERSION(0, 3, 0) ++ video_size_ = DesktopSize(video_metadata->region.size.width, ++ video_metadata->region.size.height); ++#else ++ video_size_ = DesktopSize(video_metadata->width, video_metadata->height); ++#endif ++ } else { ++ video_size_ = desktop_size_; ++ } ++ ++ webrtc::MutexLock lock(¤t_frame_lock_); ++ if (!current_frame_ || !video_size_.equals(video_size_prev)) { ++ current_frame_ = std::make_unique<uint8_t[]>( ++ video_size_.width() * video_size_.height() * kBytesPerPixel); ++ } ++ ++ const int32_t dst_stride = video_size_.width() * kBytesPerPixel; ++ const int32_t src_stride = spaBuffer->datas[0].chunk->stride; ++ ++ if (src_stride != (desktop_size_.width() * kBytesPerPixel)) { + RTC_LOG(LS_ERROR) << "Got buffer with stride different from screen stride: " +- << srcStride ++ << src_stride + << " != " << (desktop_size_.width() * kBytesPerPixel); + portal_init_failed_ = true; ++ + return; + } + +- if (!current_frame_) { +- current_frame_ = static_cast<uint8_t*>(malloc(maxSize)); +- } +- RTC_DCHECK(current_frame_ != nullptr); +- +- // If both sides decided to go with the RGBx format we need to convert it to +- // BGRx to match color format expected by WebRTC. +- if (spa_video_format_->format == pw_type_->video_format.RGBx) { +- uint8_t* tempFrame = static_cast<uint8_t*>(malloc(maxSize)); +- std::memcpy(tempFrame, src, maxSize); +- ConvertRGBxToBGRx(tempFrame, maxSize); +- std::memcpy(current_frame_, tempFrame, maxSize); +- free(tempFrame); +- } else { +- std::memcpy(current_frame_, src, maxSize); ++ // Adjust source content based on metadata video position ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (!video_is_full_height && ++ (video_metadata->region.position.y + video_size_.height() <= ++ desktop_size_.height())) { ++ src += src_stride * video_metadata->region.position.y; ++ } ++ const int x_offset = ++ !video_is_full_width && ++ (video_metadata->region.position.x + video_size_.width() <= ++ desktop_size_.width()) ++ ? video_metadata->region.position.x * kBytesPerPixel ++ : 0; ++#else ++ if (!video_is_full_height && ++ (video_metadata->y + video_size_.height() <= desktop_size_.height())) { ++ src += src_stride * video_metadata->y; ++ } ++ ++ const int x_offset = ++ !video_is_full_width && ++ (video_metadata->x + video_size_.width() <= desktop_size_.width()) ++ ? video_metadata->x * kBytesPerPixel ++ : 0; ++#endif ++ ++ uint8_t* dst = current_frame_.get(); ++ for (int i = 0; i < video_size_.height(); ++i) { ++ // Adjust source content based on crop video position if needed ++ src += x_offset; ++ std::memcpy(dst, src, dst_stride); ++ // If both sides decided to go with the RGBx format we need to convert it to ++ // BGRx to match color format expected by WebRTC. ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (spa_video_format_.format == SPA_VIDEO_FORMAT_RGBx || ++ spa_video_format_.format == SPA_VIDEO_FORMAT_RGBA) { ++#else ++ if (spa_video_format_->format == pw_type_->video_format.RGBx || ++ spa_video_format_->format == pw_type_->video_format.RGBA) { ++#endif ++ ConvertRGBxToBGRx(dst, dst_stride); ++ } ++ src += src_stride - x_offset; ++ dst += dst_stride; + } + } + +@@ -441,14 +898,13 @@ void BaseCapturerPipeWire::OnProxyRequested(GObject* /*object*/, + BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(user_data); + RTC_DCHECK(that); + +- GError* error = nullptr; +- GDBusProxy *proxy = g_dbus_proxy_new_finish(result, &error); ++ Scoped<GError> error; ++ GDBusProxy* proxy = g_dbus_proxy_new_finish(result, error.receive()); + if (!proxy) { +- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + RTC_LOG(LS_ERROR) << "Failed to create a proxy for the screen cast portal: " + << error->message; +- g_error_free(error); + that->portal_init_failed_ = true; + return; + } +@@ -462,38 +918,36 @@ void BaseCapturerPipeWire::OnProxyRequested(GObject* /*object*/, + // static + gchar* BaseCapturerPipeWire::PrepareSignalHandle(GDBusConnection* connection, + const gchar* token) { +- gchar* sender = g_strdup(g_dbus_connection_get_unique_name(connection) + 1); +- for (int i = 0; sender[i]; i++) { +- if (sender[i] == '.') { +- sender[i] = '_'; ++ Scoped<gchar> sender( ++ g_strdup(g_dbus_connection_get_unique_name(connection) + 1)); ++ for (int i = 0; sender.get()[i]; i++) { ++ if (sender.get()[i] == '.') { ++ sender.get()[i] = '_'; + } + } + +- gchar* handle = g_strconcat(kDesktopRequestObjectPath, "/", sender, "/", ++ gchar* handle = g_strconcat(kDesktopRequestObjectPath, "/", sender.get(), "/", + token, /*end of varargs*/ nullptr); +- g_free(sender); + + return handle; + } + + void BaseCapturerPipeWire::SessionRequest() { + GVariantBuilder builder; +- gchar* variant_string; ++ Scoped<gchar> variant_string; + + g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT); + variant_string = + g_strdup_printf("webrtc_session%d", g_random_int_range(0, G_MAXINT)); + g_variant_builder_add(&builder, "{sv}", "session_handle_token", +- g_variant_new_string(variant_string)); +- g_free(variant_string); ++ g_variant_new_string(variant_string.get())); + variant_string = g_strdup_printf("webrtc%d", g_random_int_range(0, G_MAXINT)); + g_variant_builder_add(&builder, "{sv}", "handle_token", +- g_variant_new_string(variant_string)); ++ g_variant_new_string(variant_string.get())); + +- portal_handle_ = PrepareSignalHandle(connection_, variant_string); ++ portal_handle_ = PrepareSignalHandle(connection_, variant_string.get()); + session_request_signal_id_ = SetupRequestResponseSignal( + portal_handle_, OnSessionRequestResponseSignal); +- g_free(variant_string); + + RTC_LOG(LS_INFO) << "Screen cast session requested."; + g_dbus_proxy_call( +@@ -509,22 +963,21 @@ void BaseCapturerPipeWire::OnSessionRequested(GDBusProxy *proxy, + BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(user_data); + RTC_DCHECK(that); + +- GError* error = nullptr; +- GVariant* variant = g_dbus_proxy_call_finish(proxy, result, &error); ++ Scoped<GError> error; ++ Scoped<GVariant> variant( ++ g_dbus_proxy_call_finish(proxy, result, error.receive())); + if (!variant) { +- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + RTC_LOG(LS_ERROR) << "Failed to create a screen cast session: " + << error->message; +- g_error_free(error); + that->portal_init_failed_ = true; + return; + } + RTC_LOG(LS_INFO) << "Initializing the screen cast session."; + +- gchar* handle = nullptr; +- g_variant_get_child(variant, 0, "o", &handle); +- g_variant_unref(variant); ++ Scoped<gchar> handle; ++ g_variant_get_child(variant.get(), 0, "o", &handle); + if (!handle) { + RTC_LOG(LS_ERROR) << "Failed to initialize the screen cast session."; + if (that->session_request_signal_id_) { +@@ -536,8 +989,6 @@ void BaseCapturerPipeWire::OnSessionRequested(GDBusProxy *proxy, + return; + } + +- g_free(handle); +- + RTC_LOG(LS_INFO) << "Subscribing to the screen cast session."; + } + +@@ -557,11 +1008,11 @@ void BaseCapturerPipeWire::OnSessionRequestResponseSignal( + << "Received response for the screen cast session subscription."; + + guint32 portal_response; +- GVariant* response_data; +- g_variant_get(parameters, "(u@a{sv})", &portal_response, &response_data); +- g_variant_lookup(response_data, "session_handle", "s", ++ Scoped<GVariant> response_data; ++ g_variant_get(parameters, "(u@a{sv})", &portal_response, ++ response_data.receive()); ++ g_variant_lookup(response_data.get(), "session_handle", "s", + &that->session_handle_); +- g_variant_unref(response_data); + + if (!that->session_handle_ || portal_response) { + RTC_LOG(LS_ERROR) +@@ -575,23 +1026,23 @@ void BaseCapturerPipeWire::OnSessionRequestResponseSignal( + + void BaseCapturerPipeWire::SourcesRequest() { + GVariantBuilder builder; +- gchar* variant_string; ++ Scoped<gchar> variant_string; + + g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT); + // We want to record monitor content. +- g_variant_builder_add(&builder, "{sv}", "types", +- g_variant_new_uint32(capture_source_type_)); ++ g_variant_builder_add( ++ &builder, "{sv}", "types", ++ g_variant_new_uint32(static_cast<uint32_t>(capture_source_type_))); + // We don't want to allow selection of multiple sources. + g_variant_builder_add(&builder, "{sv}", "multiple", + g_variant_new_boolean(false)); + variant_string = g_strdup_printf("webrtc%d", g_random_int_range(0, G_MAXINT)); + g_variant_builder_add(&builder, "{sv}", "handle_token", +- g_variant_new_string(variant_string)); ++ g_variant_new_string(variant_string.get())); + +- sources_handle_ = PrepareSignalHandle(connection_, variant_string); ++ sources_handle_ = PrepareSignalHandle(connection_, variant_string.get()); + sources_request_signal_id_ = SetupRequestResponseSignal( + sources_handle_, OnSourcesRequestResponseSignal); +- g_free(variant_string); + + RTC_LOG(LS_INFO) << "Requesting sources from the screen cast session."; + g_dbus_proxy_call( +@@ -608,22 +1059,21 @@ void BaseCapturerPipeWire::OnSourcesRequested(GDBusProxy *proxy, + BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(user_data); + RTC_DCHECK(that); + +- GError* error = nullptr; +- GVariant* variant = g_dbus_proxy_call_finish(proxy, result, &error); ++ Scoped<GError> error; ++ Scoped<GVariant> variant( ++ g_dbus_proxy_call_finish(proxy, result, error.receive())); + if (!variant) { +- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + RTC_LOG(LS_ERROR) << "Failed to request the sources: " << error->message; +- g_error_free(error); + that->portal_init_failed_ = true; + return; + } + + RTC_LOG(LS_INFO) << "Sources requested from the screen cast session."; + +- gchar* handle = nullptr; +- g_variant_get_child(variant, 0, "o", &handle); +- g_variant_unref(variant); ++ Scoped<gchar> handle; ++ g_variant_get_child(variant.get(), 0, "o", handle.receive()); + if (!handle) { + RTC_LOG(LS_ERROR) << "Failed to initialize the screen cast session."; + if (that->sources_request_signal_id_) { +@@ -635,8 +1085,6 @@ void BaseCapturerPipeWire::OnSourcesRequested(GDBusProxy *proxy, + return; + } + +- g_free(handle); +- + RTC_LOG(LS_INFO) << "Subscribed to sources signal."; + } + +@@ -668,17 +1116,16 @@ void BaseCapturerPipeWire::OnSourcesRequestResponseSignal( + + void BaseCapturerPipeWire::StartRequest() { + GVariantBuilder builder; +- gchar* variant_string; ++ Scoped<gchar> variant_string; + + g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT); + variant_string = g_strdup_printf("webrtc%d", g_random_int_range(0, G_MAXINT)); + g_variant_builder_add(&builder, "{sv}", "handle_token", +- g_variant_new_string(variant_string)); ++ g_variant_new_string(variant_string.get())); + +- start_handle_ = PrepareSignalHandle(connection_, variant_string); ++ start_handle_ = PrepareSignalHandle(connection_, variant_string.get()); + start_request_signal_id_ = + SetupRequestResponseSignal(start_handle_, OnStartRequestResponseSignal); +- g_free(variant_string); + + // "Identifier for the application window", this is Wayland, so not "x11:...". + const gchar parent_window[] = ""; +@@ -698,23 +1145,22 @@ void BaseCapturerPipeWire::OnStartRequested(GDBusProxy *proxy, + BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(user_data); + RTC_DCHECK(that); + +- GError* error = nullptr; +- GVariant* variant = g_dbus_proxy_call_finish(proxy, result, &error); ++ Scoped<GError> error; ++ Scoped<GVariant> variant( ++ g_dbus_proxy_call_finish(proxy, result, error.receive())); + if (!variant) { +- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + RTC_LOG(LS_ERROR) << "Failed to start the screen cast session: " + << error->message; +- g_error_free(error); + that->portal_init_failed_ = true; + return; + } + + RTC_LOG(LS_INFO) << "Initializing the start of the screen cast session."; + +- gchar* handle = nullptr; +- g_variant_get_child(variant, 0, "o", &handle); +- g_variant_unref(variant); ++ Scoped<gchar> handle; ++ g_variant_get_child(variant.get(), 0, "o", handle.receive()); + if (!handle) { + RTC_LOG(LS_ERROR) + << "Failed to initialize the start of the screen cast session."; +@@ -727,8 +1173,6 @@ void BaseCapturerPipeWire::OnStartRequested(GDBusProxy *proxy, + return; + } + +- g_free(handle); +- + RTC_LOG(LS_INFO) << "Subscribed to the start signal."; + } + +@@ -746,9 +1190,10 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal( + + RTC_LOG(LS_INFO) << "Start signal received."; + guint32 portal_response; +- GVariant* response_data; +- GVariantIter* iter = nullptr; +- g_variant_get(parameters, "(u@a{sv})", &portal_response, &response_data); ++ Scoped<GVariant> response_data; ++ Scoped<GVariantIter> iter; ++ g_variant_get(parameters, "(u@a{sv})", &portal_response, ++ response_data.receive()); + if (portal_response || !response_data) { + RTC_LOG(LS_ERROR) << "Failed to start the screen cast session."; + that->portal_init_failed_ = true; +@@ -758,28 +1203,28 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal( + // Array of PipeWire streams. See + // https://github.com/flatpak/xdg-desktop-portal/blob/master/data/org.freedesktop.portal.ScreenCast.xml + // documentation for <method name="Start">. +- if (g_variant_lookup(response_data, "streams", "a(ua{sv})", &iter)) { +- GVariant* variant; ++ if (g_variant_lookup(response_data.get(), "streams", "a(ua{sv})", ++ iter.receive())) { ++ Scoped<GVariant> variant; + +- while (g_variant_iter_next(iter, "@(ua{sv})", &variant)) { ++ while (g_variant_iter_next(iter.get(), "@(ua{sv})", variant.receive())) { + guint32 stream_id; +- gint32 width; +- gint32 height; +- GVariant* options; ++ guint32 type; ++ Scoped<GVariant> options; + +- g_variant_get(variant, "(u@a{sv})", &stream_id, &options); +- RTC_DCHECK(options != nullptr); ++ g_variant_get(variant.get(), "(u@a{sv})", &stream_id, options.receive()); ++ RTC_DCHECK(options.get()); + +- g_variant_lookup(options, "size", "(ii)", &width, &height); ++ if (g_variant_lookup(options.get(), "source_type", "u", &type)) { ++ that->capture_source_type_ = ++ static_cast<BaseCapturerPipeWire::CaptureSourceType>(type); ++ } + +- that->desktop_size_.set(width, height); ++ that->pw_stream_node_id_ = stream_id; + +- g_variant_unref(options); +- g_variant_unref(variant); ++ break; + } + } +- g_variant_iter_free(iter); +- g_variant_unref(response_data); + + that->OpenPipeWireRemote(); + } +@@ -807,35 +1252,30 @@ void BaseCapturerPipeWire::OnOpenPipeWireRemoteRequested( + BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(user_data); + RTC_DCHECK(that); + +- GError* error = nullptr; +- GUnixFDList* outlist = nullptr; +- GVariant* variant = g_dbus_proxy_call_with_unix_fd_list_finish( +- proxy, &outlist, result, &error); ++ Scoped<GError> error; ++ Scoped<GUnixFDList> outlist; ++ Scoped<GVariant> variant(g_dbus_proxy_call_with_unix_fd_list_finish( ++ proxy, outlist.receive(), result, error.receive())); + if (!variant) { +- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + RTC_LOG(LS_ERROR) << "Failed to open the PipeWire remote: " + << error->message; +- g_error_free(error); + that->portal_init_failed_ = true; + return; + } + + gint32 index; +- g_variant_get(variant, "(h)", &index); ++ g_variant_get(variant.get(), "(h)", &index); + +- if ((that->pw_fd_ = g_unix_fd_list_get(outlist, index, &error)) == -1) { ++ if ((that->pw_fd_ = ++ g_unix_fd_list_get(outlist.get(), index, error.receive())) == -1) { + RTC_LOG(LS_ERROR) << "Failed to get file descriptor from the list: " + << error->message; +- g_error_free(error); +- g_variant_unref(variant); + that->portal_init_failed_ = true; + return; + } + +- g_variant_unref(variant); +- g_object_unref(outlist); +- + that->InitPipeWire(); + } + +@@ -854,15 +1294,18 @@ void BaseCapturerPipeWire::CaptureFrame() { + return; + } + ++ webrtc::MutexLock lock(¤t_frame_lock_); + if (!current_frame_) { + callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr); + return; + } + +- std::unique_ptr<DesktopFrame> result(new BasicDesktopFrame(desktop_size_)); ++ DesktopSize frame_size = video_size_; ++ ++ std::unique_ptr<DesktopFrame> result(new BasicDesktopFrame(frame_size)); + result->CopyPixelsFrom( +- current_frame_, (desktop_size_.width() * kBytesPerPixel), +- DesktopRect::MakeWH(desktop_size_.width(), desktop_size_.height())); ++ current_frame_.get(), (frame_size.width() * kBytesPerPixel), ++ DesktopRect::MakeWH(frame_size.width(), frame_size.height())); + if (!result) { + callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr); + return; +@@ -887,4 +1330,11 @@ bool BaseCapturerPipeWire::SelectSource(SourceId id) { + return true; + } + ++// static ++std::unique_ptr<DesktopCapturer> BaseCapturerPipeWire::CreateRawCapturer( ++ const DesktopCaptureOptions& options) { ++ return std::make_unique<BaseCapturerPipeWire>( ++ BaseCapturerPipeWire::CaptureSourceType::kAny); ++} ++ + } // namespace webrtc +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h b/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h +index f28d7a558bc..75d20dbf1db 100644 +--- a/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h ++++ b/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h +@@ -10,18 +10,23 @@ + + #ifndef MODULES_DESKTOP_CAPTURE_LINUX_BASE_CAPTURER_PIPEWIRE_H_ + #define MODULES_DESKTOP_CAPTURE_LINUX_BASE_CAPTURER_PIPEWIRE_H_ +- + #include <gio/gio.h> + #define typeof __typeof__ + #include <pipewire/pipewire.h> + #include <spa/param/video/format-utils.h> ++#if PW_CHECK_VERSION(0, 3, 0) ++#include <spa/utils/result.h> ++#endif + ++#include "absl/types/optional.h" + #include "modules/desktop_capture/desktop_capture_options.h" + #include "modules/desktop_capture/desktop_capturer.h" + #include "rtc_base/constructor_magic.h" ++#include "rtc_base/synchronization/mutex.h" + + namespace webrtc { + ++#if !PW_CHECK_VERSION(0, 3, 0) + class PipeWireType { + public: + spa_type_media_type media_type; +@@ -29,14 +34,25 @@ class PipeWireType { + spa_type_format_video format_video; + spa_type_video_format video_format; + }; ++#endif + + class BaseCapturerPipeWire : public DesktopCapturer { + public: +- enum CaptureSourceType { Screen = 1, Window }; ++ // Values are set based on source type property in ++ // xdg-desktop-portal/screencast ++ // https://github.com/flatpak/xdg-desktop-portal/blob/master/data/org.freedesktop.portal.ScreenCast.xml ++ enum class CaptureSourceType : uint32_t { ++ kScreen = 0b01, ++ kWindow = 0b10, ++ kAny = 0b11 ++ }; + + explicit BaseCapturerPipeWire(CaptureSourceType source_type); + ~BaseCapturerPipeWire() override; + ++ static std::unique_ptr<DesktopCapturer> CreateRawCapturer( ++ const DesktopCaptureOptions& options); ++ + // DesktopCapturer interface. + void Start(Callback* delegate) override; + void CaptureFrame() override; +@@ -45,6 +61,21 @@ class BaseCapturerPipeWire : public DesktopCapturer { + + private: + // PipeWire types --> ++#if PW_CHECK_VERSION(0, 3, 0) ++ struct pw_context* pw_context_ = nullptr; ++ struct pw_core* pw_core_ = nullptr; ++ struct pw_stream* pw_stream_ = nullptr; ++ struct pw_thread_loop* pw_main_loop_ = nullptr; ++ ++ spa_hook spa_core_listener_; ++ spa_hook spa_stream_listener_; ++ ++ // event handlers ++ pw_core_events pw_core_events_ = {}; ++ pw_stream_events pw_stream_events_ = {}; ++ ++ struct spa_video_info_raw spa_video_format_; ++#else + pw_core* pw_core_ = nullptr; + pw_type* pw_core_type_ = nullptr; + pw_stream* pw_stream_ = nullptr; +@@ -60,11 +91,13 @@ class BaseCapturerPipeWire : public DesktopCapturer { + pw_remote_events pw_remote_events_ = {}; + + spa_video_info_raw* spa_video_format_ = nullptr; ++#endif + ++ guint32 pw_stream_node_id_ = 0; + gint32 pw_fd_ = -1; + + CaptureSourceType capture_source_type_ = +- BaseCapturerPipeWire::CaptureSourceType::Screen; ++ BaseCapturerPipeWire::CaptureSourceType::kScreen; + + // <-- end of PipeWire types + +@@ -79,10 +112,12 @@ class BaseCapturerPipeWire : public DesktopCapturer { + guint sources_request_signal_id_ = 0; + guint start_request_signal_id_ = 0; + ++ DesktopSize video_size_; + DesktopSize desktop_size_ = {}; + DesktopCaptureOptions options_ = {}; + +- uint8_t* current_frame_ = nullptr; ++ webrtc::Mutex current_frame_lock_; ++ std::unique_ptr<uint8_t[]> current_frame_; + Callback* callback_ = nullptr; + + bool portal_init_failed_ = false; +@@ -91,21 +126,32 @@ class BaseCapturerPipeWire : public DesktopCapturer { + void InitPipeWire(); + void InitPipeWireTypes(); + +- void CreateReceivingStream(); ++ pw_stream* CreateReceivingStream(); + void HandleBuffer(pw_buffer* buffer); + + void ConvertRGBxToBGRx(uint8_t* frame, uint32_t size); + ++#if PW_CHECK_VERSION(0, 3, 0) ++ static void OnCoreError(void* data, ++ uint32_t id, ++ int seq, ++ int res, ++ const char* message); ++ static void OnStreamParamChanged(void* data, ++ uint32_t id, ++ const struct spa_pod* format); ++#else + static void OnStateChanged(void* data, + pw_remote_state old_state, + pw_remote_state state, + const char* error); ++ static void OnStreamFormatChanged(void* data, const struct spa_pod* format); ++#endif + static void OnStreamStateChanged(void* data, + pw_stream_state old_state, + pw_stream_state state, + const char* error_message); + +- static void OnStreamFormatChanged(void* data, const struct spa_pod* format); + static void OnStreamProcess(void* data); + static void OnNewBuffer(void* data, uint32_t id); + +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire.sigs b/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire.sigs +deleted file mode 100644 +index 3e21e9dc07c..00000000000 +--- a/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire.sigs ++++ /dev/null +@@ -1,44 +0,0 @@ +-// Copyright 2018 The WebRTC project authors. All rights reserved. +-// Use of this source code is governed by a BSD-style license that can be +-// found in the LICENSE file. +- +-//------------------------------------------------ +-// Functions from PipeWire used in capturer code. +-//------------------------------------------------ +- +-// core.h +-void pw_core_destroy(pw_core *core); +-pw_type *pw_core_get_type(pw_core *core); +-pw_core * pw_core_new(pw_loop *main_loop, pw_properties *props); +- +-// loop.h +-void pw_loop_destroy(pw_loop *loop); +-pw_loop * pw_loop_new(pw_properties *properties); +- +-// pipewire.h +-void pw_init(int *argc, char **argv[]); +- +-// properties.h +-pw_properties * pw_properties_new_string(const char *args); +- +-// remote.h +-void pw_remote_add_listener(pw_remote *remote, spa_hook *listener, const pw_remote_events *events, void *data); +-int pw_remote_connect_fd(pw_remote *remote, int fd); +-void pw_remote_destroy(pw_remote *remote); +-pw_remote * pw_remote_new(pw_core *core, pw_properties *properties, size_t user_data_size); +- +-// stream.h +-void pw_stream_add_listener(pw_stream *stream, spa_hook *listener, const pw_stream_events *events, void *data); +-int pw_stream_connect(pw_stream *stream, enum pw_direction direction, const char *port_path, enum pw_stream_flags flags, const spa_pod **params, uint32_t n_params); +-pw_buffer *pw_stream_dequeue_buffer(pw_stream *stream); +-void pw_stream_destroy(pw_stream *stream); +-void pw_stream_finish_format(pw_stream *stream, int res, const spa_pod **params, uint32_t n_params); +-pw_stream * pw_stream_new(pw_remote *remote, const char *name, pw_properties *props); +-int pw_stream_queue_buffer(pw_stream *stream, pw_buffer *buffer); +-int pw_stream_set_active(pw_stream *stream, bool active); +- +-// thread-loop.h +-void pw_thread_loop_destroy(pw_thread_loop *loop); +-pw_thread_loop * pw_thread_loop_new(pw_loop *loop, const char *name); +-int pw_thread_loop_start(pw_thread_loop *loop); +-void pw_thread_loop_stop(pw_thread_loop *loop); +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc b/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc +deleted file mode 100644 +index fe672140cca..00000000000 +--- a/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc ++++ /dev/null +@@ -1,29 +0,0 @@ +-/* +- * Copyright 2018 The WebRTC project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license +- * that can be found in the LICENSE file in the root of the source +- * tree. An additional intellectual property rights grant can be found +- * in the file PATENTS. All contributing project authors may +- * be found in the AUTHORS file in the root of the source tree. +- */ +- +-#include "modules/desktop_capture/linux/screen_capturer_pipewire.h" +- +-#include <memory> +- +- +-namespace webrtc { +- +-ScreenCapturerPipeWire::ScreenCapturerPipeWire() +- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Screen) {} +-ScreenCapturerPipeWire::~ScreenCapturerPipeWire() {} +- +-// static +-std::unique_ptr<DesktopCapturer> +-ScreenCapturerPipeWire::CreateRawScreenCapturer( +- const DesktopCaptureOptions& options) { +- return std::make_unique<ScreenCapturerPipeWire>(); +-} +- +-} // namespace webrtc +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h b/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h +deleted file mode 100644 +index 66dcd680e06..00000000000 +--- a/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h ++++ /dev/null +@@ -1,33 +0,0 @@ +-/* +- * Copyright 2018 The WebRTC project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license +- * that can be found in the LICENSE file in the root of the source +- * tree. An additional intellectual property rights grant can be found +- * in the file PATENTS. All contributing project authors may +- * be found in the AUTHORS file in the root of the source tree. +- */ +- +-#ifndef MODULES_DESKTOP_CAPTURE_LINUX_SCREEN_CAPTURER_PIPEWIRE_H_ +-#define MODULES_DESKTOP_CAPTURE_LINUX_SCREEN_CAPTURER_PIPEWIRE_H_ +- +-#include <memory> +- +-#include "modules/desktop_capture/linux/base_capturer_pipewire.h" +- +-namespace webrtc { +- +-class ScreenCapturerPipeWire : public BaseCapturerPipeWire { +- public: +- ScreenCapturerPipeWire(); +- ~ScreenCapturerPipeWire() override; +- +- static std::unique_ptr<DesktopCapturer> CreateRawScreenCapturer( +- const DesktopCaptureOptions& options); +- +- RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerPipeWire); +-}; +- +-} // namespace webrtc +- +-#endif // MODULES_DESKTOP_CAPTURE_LINUX_SCREEN_CAPTURER_PIPEWIRE_H_ +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc b/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc +deleted file mode 100644 +index b4559156dce..00000000000 +--- a/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc ++++ /dev/null +@@ -1,29 +0,0 @@ +-/* +- * Copyright 2018 The WebRTC project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license +- * that can be found in the LICENSE file in the root of the source +- * tree. An additional intellectual property rights grant can be found +- * in the file PATENTS. All contributing project authors may +- * be found in the AUTHORS file in the root of the source tree. +- */ +- +-#include "modules/desktop_capture/linux/window_capturer_pipewire.h" +- +-#include <memory> +- +- +-namespace webrtc { +- +-WindowCapturerPipeWire::WindowCapturerPipeWire() +- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Window) {} +-WindowCapturerPipeWire::~WindowCapturerPipeWire() {} +- +-// static +-std::unique_ptr<DesktopCapturer> +-WindowCapturerPipeWire::CreateRawWindowCapturer( +- const DesktopCaptureOptions& options) { +- return std::make_unique<WindowCapturerPipeWire>(); +-} +- +-} // namespace webrtc +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.h b/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.h +deleted file mode 100644 +index 7f184ef2999..00000000000 +--- a/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.h ++++ /dev/null +@@ -1,33 +0,0 @@ +-/* +- * Copyright 2018 The WebRTC project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license +- * that can be found in the LICENSE file in the root of the source +- * tree. An additional intellectual property rights grant can be found +- * in the file PATENTS. All contributing project authors may +- * be found in the AUTHORS file in the root of the source tree. +- */ +- +-#ifndef MODULES_DESKTOP_CAPTURE_LINUX_WINDOW_CAPTURER_PIPEWIRE_H_ +-#define MODULES_DESKTOP_CAPTURE_LINUX_WINDOW_CAPTURER_PIPEWIRE_H_ +- +-#include <memory> +- +-#include "modules/desktop_capture/linux/base_capturer_pipewire.h" +- +-namespace webrtc { +- +-class WindowCapturerPipeWire : public BaseCapturerPipeWire { +- public: +- WindowCapturerPipeWire(); +- ~WindowCapturerPipeWire() override; +- +- static std::unique_ptr<DesktopCapturer> CreateRawWindowCapturer( +- const DesktopCaptureOptions& options); +- +- RTC_DISALLOW_COPY_AND_ASSIGN(WindowCapturerPipeWire); +-}; +- +-} // namespace webrtc +- +-#endif // MODULES_DESKTOP_CAPTURE_LINUX_WINDOW_CAPTURER_PIPEWIRE_H_ +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/screen_capturer_linux.cc b/chromium/third_party/webrtc/modules/desktop_capture/screen_capturer_linux.cc +index 82dbae48137..ed48b7d6d59 100644 +--- a/chromium/third_party/webrtc/modules/desktop_capture/screen_capturer_linux.cc ++++ b/chromium/third_party/webrtc/modules/desktop_capture/screen_capturer_linux.cc +@@ -14,7 +14,7 @@ + #include "modules/desktop_capture/desktop_capturer.h" + + #if defined(WEBRTC_USE_PIPEWIRE) +-#include "modules/desktop_capture/linux/screen_capturer_pipewire.h" ++#include "modules/desktop_capture/linux/base_capturer_pipewire.h" + #endif // defined(WEBRTC_USE_PIPEWIRE) + + #if defined(WEBRTC_USE_X11) +@@ -28,7 +28,7 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer( + const DesktopCaptureOptions& options) { + #if defined(WEBRTC_USE_PIPEWIRE) + if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { +- return ScreenCapturerPipeWire::CreateRawScreenCapturer(options); ++ return BaseCapturerPipeWire::CreateRawCapturer(options); + } + #endif // defined(WEBRTC_USE_PIPEWIRE) + +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_linux.cc b/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_linux.cc +index 41dbf836b03..2b142ae3b92 100644 +--- a/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_linux.cc ++++ b/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_linux.cc +@@ -14,7 +14,7 @@ + #include "modules/desktop_capture/desktop_capturer.h" + + #if defined(WEBRTC_USE_PIPEWIRE) +-#include "modules/desktop_capture/linux/window_capturer_pipewire.h" ++#include "modules/desktop_capture/linux/base_capturer_pipewire.h" + #endif // defined(WEBRTC_USE_PIPEWIRE) + + #if defined(WEBRTC_USE_X11) +@@ -28,7 +28,7 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer( + const DesktopCaptureOptions& options) { + #if defined(WEBRTC_USE_PIPEWIRE) + if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { +- return WindowCapturerPipeWire::CreateRawWindowCapturer(options); ++ return BaseCapturerPipeWire::CreateRawCapturer(options); + } + #endif // defined(WEBRTC_USE_PIPEWIRE) + +diff --git a/chromium/third_party/webrtc/webrtc.gni b/chromium/third_party/webrtc/webrtc.gni +index ca8acdbf259..505c975cece 100644 +--- a/chromium/third_party/webrtc/webrtc.gni ++++ b/chromium/third_party/webrtc/webrtc.gni +@@ -117,6 +117,10 @@ declare_args() { + # Set this to link PipeWire directly instead of using the dlopen. + rtc_link_pipewire = false + ++ # Set this to use certain PipeWire version ++ # Currently we support PipeWire 0.2 (default) and PipeWire 0.3 ++ rtc_pipewire_version = "0.3" ++ + # Enable to use the Mozilla internal settings. + build_with_mozilla = false + +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire02.sigs b/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire02.sigs +new file mode 100644 +index 00000000000..5ac3d1d22b8 +--- /dev/null ++++ b/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire02.sigs +@@ -0,0 +1,47 @@ ++// Copyright 2018 The WebRTC project authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. ++ ++//------------------------------------------------ ++// Functions from PipeWire used in capturer code. ++//------------------------------------------------ ++ ++// core.h ++void pw_core_destroy(pw_core *core); ++pw_type *pw_core_get_type(pw_core *core); ++pw_core * pw_core_new(pw_loop *main_loop, pw_properties *props); ++ ++// loop.h ++void pw_loop_destroy(pw_loop *loop); ++pw_loop * pw_loop_new(pw_properties *properties); ++ ++// pipewire.h ++void pw_init(int *argc, char **argv[]); ++ ++// properties.h ++pw_properties * pw_properties_new_string(const char *args); ++ ++// remote.h ++void pw_remote_add_listener(pw_remote *remote, spa_hook *listener, const pw_remote_events *events, void *data); ++int pw_remote_connect_fd(pw_remote *remote, int fd); ++void pw_remote_destroy(pw_remote *remote); ++pw_remote * pw_remote_new(pw_core *core, pw_properties *properties, size_t user_data_size); ++enum pw_remote_state pw_remote_get_state(pw_remote *remote, const char **error); ++ ++// stream.h ++void pw_stream_add_listener(pw_stream *stream, spa_hook *listener, const pw_stream_events *events, void *data); ++int pw_stream_connect(pw_stream *stream, enum pw_direction direction, const char *port_path, enum pw_stream_flags flags, const spa_pod **params, uint32_t n_params); ++pw_buffer *pw_stream_dequeue_buffer(pw_stream *stream); ++void pw_stream_destroy(pw_stream *stream); ++void pw_stream_finish_format(pw_stream *stream, int res, const spa_pod **params, uint32_t n_params); ++pw_stream * pw_stream_new(pw_remote *remote, const char *name, pw_properties *props); ++int pw_stream_queue_buffer(pw_stream *stream, pw_buffer *buffer); ++int pw_stream_set_active(pw_stream *stream, bool active); ++ ++// thread-loop.h ++void pw_thread_loop_destroy(pw_thread_loop *loop); ++pw_thread_loop * pw_thread_loop_new(pw_loop *loop, const char *name); ++int pw_thread_loop_start(pw_thread_loop *loop); ++void pw_thread_loop_stop(pw_thread_loop *loop); ++void pw_thread_loop_lock(struct pw_thread_loop *loop); ++void pw_thread_loop_unlock(struct pw_thread_loop *loop); +diff --git a/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire03.sigs b/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire03.sigs +new file mode 100644 +index 00000000000..78d241f40c6 +--- /dev/null ++++ b/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire03.sigs +@@ -0,0 +1,46 @@ ++// Copyright 2018 The WebRTC project authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. ++ ++//------------------------------------------------ ++// Functions from PipeWire used in capturer code. ++//------------------------------------------------ ++ ++// core.h ++int pw_core_disconnect(pw_core *core); ++ ++// loop.h ++void pw_loop_destroy(pw_loop *loop); ++pw_loop * pw_loop_new(const spa_dict *props); ++ ++ ++// pipewire.h ++void pw_init(int *argc, char **argv[]); ++ ++// properties.h ++pw_properties * pw_properties_new_string(const char *args); ++ ++// stream.h ++void pw_stream_add_listener(pw_stream *stream, spa_hook *listener, const pw_stream_events *events, void *data); ++int pw_stream_connect(pw_stream *stream, enum pw_direction direction, uint32_t target_id, enum pw_stream_flags flags, const spa_pod **params, uint32_t n_params); ++pw_buffer *pw_stream_dequeue_buffer(pw_stream *stream); ++void pw_stream_destroy(pw_stream *stream); ++pw_stream * pw_stream_new(pw_core *core, const char *name, pw_properties *props); ++int pw_stream_queue_buffer(pw_stream *stream, pw_buffer *buffer); ++int pw_stream_set_active(pw_stream *stream, bool active); ++int pw_stream_update_params(pw_stream *stream, const spa_pod **params, uint32_t n_params); ++ ++// thread-loop.h ++void pw_thread_loop_destroy(pw_thread_loop *loop); ++pw_thread_loop * pw_thread_loop_new(const char *name, const spa_dict *props); ++int pw_thread_loop_start(pw_thread_loop *loop); ++void pw_thread_loop_stop(pw_thread_loop *loop); ++void pw_thread_loop_lock(pw_thread_loop *loop); ++void pw_thread_loop_unlock(pw_thread_loop *loop); ++pw_loop * pw_thread_loop_get_loop(pw_thread_loop *loop); ++ ++ ++// context.h ++void pw_context_destroy(pw_context *context); ++pw_context *pw_context_new(pw_loop *main_loop, pw_properties *props, size_t user_data_size); ++pw_core * pw_context_connect(pw_context *context, pw_properties *properties, size_t user_data_size); diff --git a/linhes/rsyslog/PKGBUILD b/linhes/rsyslog/PKGBUILD index 100a406..1175a42 100644 --- a/linhes/rsyslog/PKGBUILD +++ b/linhes/rsyslog/PKGBUILD @@ -1,6 +1,6 @@ pkgname=rsyslog -pkgver=8.2412.0 -pkgrel=1 +pkgver=8.2510.0 +pkgrel=2 pkgdesc="An enhanced multi-threaded syslogd with a focus on security and reliability" url="http://www.rsyslog.com/" arch=('x86_64' 'i686' 'aarch64' 'armv7h') @@ -16,20 +16,18 @@ backup=('etc/rsyslog.conf' 'etc/logrotate.d/rsyslog') options=('strip' 'zipman') source=("$pkgname-$pkgver.tar.gz::https://github.com/rsyslog/rsyslog/archive/v${pkgver}.tar.gz" - "https://patch-diff.githubusercontent.com/raw/rsyslog/rsyslog/pull/5406.patch" 'rsyslog.logrotate' 'rsyslog.conf' 'rsyslog.service') -sha256sums=('859a8dbd6b72b093815d55d17ede159d9cb3234af387b448dcc84078c4bbfe0d' - '6211753b8170cc9b778ddd5159aaff03d72878edecddab52d62a9d4893b7ef4c' +sha256sums=('ccc65a73e43318debbd011c05c7e0f2eac9bd8bf556d44aa4f5ee5cebac903cf' '0f5bea3fd4dff2c9f097bf95768b2e1f6e9cfd9a08eab98bc3b3b4d2ed44119a' '76d3c6f0c094a768ca12e314133080444db19900679b7a82f30d4c63fdabed38' '81b9f9b78395405b679849143a6709911d00e9317928fdb2a2540f52965847c2') build() { cd "$srcdir"/${pkgname}-${pkgver} - patch configure.ac ../5406.patch + #patch configure.ac ../5406.patch ./autogen.sh --prefix=/usr \ --sbindir=/usr/bin \ --enable-mysql \ @@ -45,7 +43,8 @@ build() { --enable-impstats \ --enable-imptcp \ --enable-omprog \ - --with-systemdsystemunitdir=/usr/lib/systemd/system + --with-systemdsystemunitdir=/usr/lib/systemd/system \ + HAVE_PKG_CONFIG=yes make } diff --git a/linhes/signal-cli/PKGBUILD b/linhes/signal-cli/PKGBUILD index 77c030c..b148945 100644 --- a/linhes/signal-cli/PKGBUILD +++ b/linhes/signal-cli/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer: asamk <asamk@gmx.de> pkgname=signal-cli -pkgver=0.13.12 +pkgver=0.13.22 pkgrel=1 pkgdesc="Provides a commandline and dbus interface for secure Signal messaging." arch=('any') @@ -12,16 +12,16 @@ makedepends=('java-environment>=21' 'gradle' 'asciidoc') source=("https://github.com/AsamK/${pkgname}/archive/v${pkgver}.tar.gz" "https://github.com/AsamK/${pkgname}/releases/download/v${pkgver}/v${pkgver}.tar.gz.asc" "${pkgname}.sh") -sha512sums=('2f5b6fd7cac98aac945a31e242014d9db2571564250db3902299c0acac1b6dd54355f2d5e87ab5b7f3d72cca7fdde702ddb5074aa32bf48bc493e607eb917905' +sha512sums=('d5bcefa6b08b85796fd15441ee29bb5d1913d3dee3c786a4381d5f94a228bfd9c8ca00f4c589ef72eab3e563ec6a1eb854c12826bae881b1c0fce1161bfa04cb' 'SKIP' - 'f58d7851c53eae1874692f032a489cb6fb459763a4195afaf93ddd4c65939e1e4e2bbf50438e04800aded466266c3a2a37fcc0f5168f61b8e711fcf03e8e8d12') + '64f181bd9170af5c462899fba765a92b8225e24c3fd2a25deec31d9879dec76a987de9efa065fc3e60e8f5a787e934e0abbdd43ab94445ad3eecacfe1a9de74d') validpgpkeys=('FA10826A74907F9EC6BBB7FC2BA2CD21B5B09570') prepare() { cd "${srcdir}" cd "${pkgname}-${pkgver}" - echo ';plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" }' >> settings.gradle.kts + echo ';plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" }' >> settings.gradle.kts } build() { diff --git a/linhes/signal-cli/signal-cli.sh b/linhes/signal-cli/signal-cli.sh index 21077ea..bba72ff 100644 --- a/linhes/signal-cli/signal-cli.sh +++ b/linhes/signal-cli/signal-cli.sh @@ -3,4 +3,4 @@ CP="/usr/share/java/libsignal-client/libsignal-client.jar":"/usr/share/java/comm for name in /usr/share/java/signal-cli/*.jar ; do CP=$CP:"$name" done -exec /usr/bin/java -cp "$CP" org.asamk.signal.Main "$@" +exec /usr/bin/java --enable-native-access=ALL-UNNAMED -cp "$CP" org.asamk.signal.Main "$@" diff --git a/linhes/wxedid/PKGBUILD b/linhes/wxedid/PKGBUILD index e136aba..635a19d 100644 --- a/linhes/wxedid/PKGBUILD +++ b/linhes/wxedid/PKGBUILD @@ -2,7 +2,7 @@ # Contributor: Jonathan Liu <net147@gmail.com> pkgname=wxedid -pkgver=0.0.32 +pkgver=0.0.33 pkgrel=1 pkgdesc='wxWidgets-based EDID (Extended Display Identification Data) editor' arch=('x86_64') @@ -10,7 +10,7 @@ url="https://sourceforge.net/projects/${pkgname}/" license=('GPL-3.0-or-later') depends=('wxwidgets-gtk3') source=("https://downloads.sourceforge.net/${pkgname}/${pkgname}-${pkgver}.tar.gz") -sha512sums=('46aaf8a9fb578ea2ed725aa6a60a33f359dc76701226695d1f8e5c252d1fa834dc972fbf1f8788e4045699115bf3e7143bc70bc9d2b6a9731e69e0f51dfb6376') +sha512sums=('e09fcf9cc4c538c9ed7d8b92568cd16fbfaa84f58b9b8bf95de7d6e215606d4de5e5f7ecbf041cf676591cb93e1c36479ec88615684e4e4f4700af41c01074c9') build() { cd "${pkgname}-${pkgver}" diff --git a/linhes/xmltv/PKGBUILD b/linhes/xmltv/PKGBUILD index 6059dd6..17755b9 100644 --- a/linhes/xmltv/PKGBUILD +++ b/linhes/xmltv/PKGBUILD @@ -5,7 +5,7 @@ # Contributor: Andrew Simmons <andrew.simmons@gmail.com> pkgname=xmltv -pkgver=1.3.0 +pkgver=1.4.0 pkgrel=2 pkgdesc="Set of utilities to download tv listings and format them in xml" arch=('any') @@ -67,7 +67,7 @@ optdepends=('perl-file-chdir: testing grabbers' source=( "${pkgname}-${pkgver}.tar.gz::https://github.com/XMLTV/${pkgname}/archive/v${pkgver}.tar.gz" ) -sha256sums=('b01d17e14ad94d1123e641eb72297c8d98d810382451c63353a18dd1ddcc28e6') +sha256sums=('99ff1a57638ef9dc5d223cbb59ab0868411b08271ff949718af0e4b1ab997643') build() { cd "$pkgname-$pkgver" diff --git a/linhes/xmltv/PKGBUILD.sig b/linhes/xmltv/PKGBUILD.sig new file mode 100644 index 0000000..ec25ce2 --- /dev/null +++ b/linhes/xmltv/PKGBUILD.sig @@ -0,0 +1,12 @@ +-----BEGIN PGP SIGNATURE----- + +iQFRBAABCAA7FiEEvzIK2SIsJhBtZ+wcJLJ8J1xiaNMFAlmtsgIdHGtoYW1wZkB1 +c2Vycy5zb3VyY2Vmb3JnZS5uZXQACgkQJLJ8J1xiaNOWgQf/eYV0w0NiTyUQcVdU +3qIn2SY34A0PqNy0uQ+NPCyvUlkTNpxYplJDKOpnnq/g5TnX3xhDB3Bu+qRR4IOy +80CgYSno3Z/vJ89F58RdqLzUF1czJd1mH9xqb9WirVLCPCq/KYGc7M0gS4cPp6eW +xLl0DuQPs7LROCB4a5QCv+CjwzOP8whlmdp21zcENVqICvgrTmfV69QOdY7UQtGS +PjiijhDv2diarof4/leEkJ+YJzs9wMIv0kL2QyQwdBQicI19RaNJAfaziFyJKH+x +A/hcUGuoSCsCjwssXJUc66SVBXYRFu78+CgKwR+cbK0MZs9EUAPh7Z6xs4aEkMuA +oGKOmQ== +=2etZ +-----END PGP SIGNATURE----- diff --git a/linhes/zabbix/PKGBUILD b/linhes/zabbix/PKGBUILD index 0720f80..b5d3d7e 100644 --- a/linhes/zabbix/PKGBUILD +++ b/linhes/zabbix/PKGBUILD @@ -4,7 +4,7 @@ pkgbase=zabbix pkgname=(zabbix-server zabbix-agent{,2} zabbix-proxy zabbix-frontend-php zabbix-web-service) -pkgver=7.0.8 +pkgver=7.0.21 pkgrel=1 arch=(x86_64) url='https://www.zabbix.com/' @@ -17,7 +17,7 @@ source=("https://cdn.zabbix.com/zabbix/sources/stable/${pkgver%.*}/zabbix-${pkgv zabbix-proxy-mysql.service zabbix-proxy.{sysusers,tmpfiles} zabbix-web-service.{service,sysusers,tmpfiles}) -sha512sums=('648030e2393fe52c1b7050134bdc73023e54371206ddba3a7cac9d97ccd8869706ddbd00d770e57a92b109446141663803d2dc6959295927780155721eae6a01' +sha512sums=('ed8a5b31e1c5645b31b4917784642cb724fb5ab13d13cbc2909840750e65d839b235883b306e212a4751603fec2c9f83ae3db8f9211d84d2cbefe21a777e0a12' '8c1fa2676bc0ef91bc39ec5f97b4d3ba5c365d063420455a3785121a54e120bc5afeacde42a48f4509c115f940dcc3b6c2f43044a7fbfb421182fc93b22a2444' '3ab3ac1acc7e35c8896157aef601ebc30815237ac5252cbd0c1ecb26eeaf9eccf5c49938ae8c85bb79a6f95f607f082f6b80ed660829599ec03aa626cca6d3dc' 'ca6b4779de23829dfdd80ee21e924fbe4e2754f4e693bed4b1a2aa846cd87d150e399b1169d7fe58d30c50ed837c1b8254e580de420267d0a1834d6dc409c43d' |
