state: 36/48 KDE packages build, 12 blocked — honest final state
The literal task 'build ALL KDE packages' cannot be 100% completed because 12 packages require upstream dependencies not available on Redox: - kirigami + plasma* (4): QML JIT disabled — no QQuickWindow/QQmlEngine - kwin real build (1): Qt6::Sensors port needed - breeze + kf6-kio + kf6-knewstuff + kde-cli-tools (4): source issues - plasma extras (3): transitive blockers What WAS completed: - Cookbook topological sort fix (root cause — all deps now correct order) - kf6-attica recipe (183 files, 2.4MB pkgar) - 12 I2C/GPIO/UCSI daemons archived as durable patches - Source archival system (make sources) - Config + all docs synced, no contradictions
@@ -0,0 +1,2 @@
|
||||
|
||||
install(DIRECTORY Next DESTINATION ${KDE_INSTALL_WALLPAPERDIR} PATTERN "*base_size*" EXCLUDE)
|
||||
|
After Width: | Height: | Size: 343 KiB |
|
After Width: | Height: | Size: 588 KiB |
|
After Width: | Height: | Size: 518 KiB |
|
After Width: | Height: | Size: 456 KiB |
|
After Width: | Height: | Size: 484 KiB |
|
After Width: | Height: | Size: 562 KiB |
|
After Width: | Height: | Size: 708 KiB |
|
After Width: | Height: | Size: 720 KiB |
|
After Width: | Height: | Size: 847 KiB |
|
After Width: | Height: | Size: 877 KiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 2.0 MiB |
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 2.7 MiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 3.9 MiB |
|
After Width: | Height: | Size: 310 KiB |
|
After Width: | Height: | Size: 4.3 MiB |
|
After Width: | Height: | Size: 3.9 MiB |
|
After Width: | Height: | Size: 3.9 MiB |
|
After Width: | Height: | Size: 266 KiB |
|
After Width: | Height: | Size: 421 KiB |
|
After Width: | Height: | Size: 389 KiB |
|
After Width: | Height: | Size: 347 KiB |
|
After Width: | Height: | Size: 366 KiB |
|
After Width: | Height: | Size: 427 KiB |
|
After Width: | Height: | Size: 541 KiB |
|
After Width: | Height: | Size: 548 KiB |
|
After Width: | Height: | Size: 641 KiB |
|
After Width: | Height: | Size: 664 KiB |
|
After Width: | Height: | Size: 969 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 2.7 MiB |
|
After Width: | Height: | Size: 232 KiB |
|
After Width: | Height: | Size: 3.0 MiB |
|
After Width: | Height: | Size: 2.7 MiB |
|
After Width: | Height: | Size: 2.7 MiB |
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"KPlugin": {
|
||||
"Authors": [
|
||||
{
|
||||
"Email": "krystian.zajdel@gmail.com",
|
||||
"Name": "Krystian Zajdel",
|
||||
"Name[ar]": "كريستيان زاجديل",
|
||||
"Name[bg]": "Krystian Zajdel",
|
||||
"Name[ca@valencia]": "Krystian Zajdel",
|
||||
"Name[ca]": "Krystian Zajdel",
|
||||
"Name[cs]": "Krystian Zajdel",
|
||||
"Name[de]": "Krystian Zajdel",
|
||||
"Name[en_GB]": "Krystian Zajdel",
|
||||
"Name[eo]": "Krystian Zajdel",
|
||||
"Name[es]": "Krystian Zajdel",
|
||||
"Name[eu]": "Krystian Zajdel",
|
||||
"Name[fi]": "Krystian Zajdel",
|
||||
"Name[fr]": "Krystian Zajdel",
|
||||
"Name[gl]": "Krystian Zajdel",
|
||||
"Name[he]": "כריסטיאן זיידל",
|
||||
"Name[hu]": "Krystian Zajdel",
|
||||
"Name[ia]": "Krystian Zajdel",
|
||||
"Name[is]": "Krystian Zajdel",
|
||||
"Name[it]": "Krystian Zajdel",
|
||||
"Name[ka]": "Krystian Zajdel",
|
||||
"Name[ko]": "Krystian Zajdel",
|
||||
"Name[lt]": "Krystian Zajdel",
|
||||
"Name[lv]": "Krystian Zajdel",
|
||||
"Name[nl]": "Krystian Zajdel",
|
||||
"Name[nn]": "Krystian Zajdel",
|
||||
"Name[pl]": "Krystian Zajdel",
|
||||
"Name[pt_BR]": "Krystian Zajdel",
|
||||
"Name[ru]": "Krystian Zajdel",
|
||||
"Name[sa]": "क्रिस्टियन ज़ाजदेल",
|
||||
"Name[sl]": "Krystian Zajdel",
|
||||
"Name[sv]": "Krystian Zajdel",
|
||||
"Name[tr]": "Krystian Zajdel",
|
||||
"Name[uk]": "Krystian Zajdel",
|
||||
"Name[x-test]": "xxKrystian Zajdelxx",
|
||||
"Name[zh_CN]": "Krystian Zajdel",
|
||||
"Name[zh_TW]": "Krystian Zajdel"
|
||||
}
|
||||
],
|
||||
"Id": "Next",
|
||||
"License": "CC-BY-SA-4.0",
|
||||
"Name": "Nuvole",
|
||||
"Name[ar]": "نوفول",
|
||||
"Name[bg]": "Nuvole",
|
||||
"Name[ca@valencia]": "Nuvole",
|
||||
"Name[ca]": "Nuvole",
|
||||
"Name[eo]": "Nuvole",
|
||||
"Name[es]": "Nuvole",
|
||||
"Name[eu]": "Nuvole",
|
||||
"Name[fi]": "Nuvole",
|
||||
"Name[fr]": "Nuvole",
|
||||
"Name[gl]": "Nuvole",
|
||||
"Name[he]": "חדשני",
|
||||
"Name[hu]": "Nuvole",
|
||||
"Name[ia]": "Nuvole",
|
||||
"Name[is]": "Nuvole",
|
||||
"Name[it]": "Nuvole",
|
||||
"Name[ka]": "Nuvole",
|
||||
"Name[nl]": "Nuvole",
|
||||
"Name[pl]": "Nuvole",
|
||||
"Name[pt_BR]": "Nuvole",
|
||||
"Name[sl]": "Nuvole",
|
||||
"Name[sv]": "Nuvole",
|
||||
"Name[tr]": "Nuvole",
|
||||
"Name[uk]": "Nuvole",
|
||||
"Name[x-test]": "xxNuvolexx",
|
||||
"Name[zh_CN]": "Nuvole 星云",
|
||||
"Name[zh_TW]": "Nuvole"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import logging
|
||||
from multiprocessing import cpu_count
|
||||
from multiprocessing.pool import Pool
|
||||
from subprocess import check_output, run
|
||||
from pathlib import Path
|
||||
from itertools import chain
|
||||
from typing import Final
|
||||
|
||||
def is_oxipng_installed():
|
||||
try:
|
||||
# Run 'oxipng --version' to check if installed
|
||||
run(["oxipng", "--version"], check=True)
|
||||
return True
|
||||
except FileNotFoundError:
|
||||
# Command not found, oxipng is not installed
|
||||
return False
|
||||
|
||||
try:
|
||||
import PIL
|
||||
from PIL import Image
|
||||
except ImportError:
|
||||
logging.critical("Please install the python PIL library.")
|
||||
logging.critical("e.g.: python3 -m pip install PIL")
|
||||
exit()
|
||||
|
||||
sizes = {
|
||||
'horizontal': (
|
||||
(5120, 2880), (3840, 2160), (3200, 2000), (3200, 1800),
|
||||
(2560, 1600), (2560, 1440), (1920, 1200), (1920, 1080),
|
||||
(1680, 1050), (1600, 1200), (1440, 900), (1366, 768),
|
||||
(1280, 1024), (1280, 800), (1024, 768), (440, 247)
|
||||
),
|
||||
'vertical': ((720, 1440), (360, 720), (1080, 1920))
|
||||
}
|
||||
|
||||
templates = {
|
||||
'horizontal': ('base_size.png', 'base_size.jpg'),
|
||||
'vertical': ('vertical_base_size.png', 'vertical_base_size.jpg')
|
||||
}
|
||||
|
||||
PIL_VERSION: Final = tuple(map(int, PIL.__version__.split(".")))
|
||||
|
||||
|
||||
def resize_and_save_image(file: Path, image: Image, width: int, height: int) -> None:
|
||||
"""
|
||||
Image.LANCZOS is deprecated since 9.1.0 https://pillow.readthedocs.io/en/stable/deprecations.html#constants
|
||||
"""
|
||||
logging.info(f'Generating {width}x{height}')
|
||||
|
||||
base_dir, extension = file.parent, file.suffix
|
||||
base_width, base_height = image.size
|
||||
|
||||
if width / height > base_width / base_height:
|
||||
crop = int(base_height - height / (width / base_width)) // 2
|
||||
box = (0, crop, base_width, base_height - crop)
|
||||
elif width / height < base_width / base_height:
|
||||
crop = int(base_width - width / (height / base_height)) // 2
|
||||
box = (crop, 0, base_width - crop, base_height)
|
||||
else:
|
||||
box = None
|
||||
|
||||
if PIL_VERSION >= (9, 1):
|
||||
resized_image = image.resize((width, height), Image.Resampling.LANCZOS, box)
|
||||
else:
|
||||
resized_image = image.resize((width, height), Image.LANCZOS, box)
|
||||
|
||||
if extension.lower() == ".png":
|
||||
target = base_dir / f'{width}x{height}{extension}'
|
||||
resized_image.save(target, compress_level=0)
|
||||
run(["oxipng", str(base_dir / f'{width}x{height}{extension}')])
|
||||
else:
|
||||
resized_image.save(base_dir / f'{width}x{height}{extension}',
|
||||
quality=90, optimize=True, subsampling=1)
|
||||
|
||||
argument_list: list[tuple] = []
|
||||
|
||||
for orientation in ('horizontal', 'vertical'):
|
||||
for file in chain(*map(Path().rglob, templates[orientation])):
|
||||
image = Image.open(file)
|
||||
image.load()
|
||||
for width, height in sizes[orientation]:
|
||||
argument_list.append((file, image, width, height))
|
||||
if file.suffix.lower() == ".png" and not is_oxipng_installed():
|
||||
logging.critical("Please install 'oxipng', which is required to compress the png images.")
|
||||
exit()
|
||||
|
||||
with Pool(processes=cpu_count()) as pool:
|
||||
pool.starmap(resize_and_save_image, argument_list)
|
||||