Compare commits

..

No commits in common. "ubuntu/plucky" and "ubuntu/12" have entirely different histories.

321 changed files with 728 additions and 9753 deletions

View File

@ -5,69 +5,11 @@
all:
# Desktop file
(cd lubuntu/po/ && make)
(cd kubuntu/po/ && make)
(cd ubuntuunity/po && make)
chmod +x lubuntu/*.desktop
# Slideshow
(cd lubuntu/branding/lubuntu/lang/ && make)
# basicwallpaper
(cd common/basicwallpaper && mkdir build && cd build && cmake .. -DCMAKE_BUILD_TYPE=Release && make)
# Lubuntu OEM setup stuff
(cd lubuntu && mkdir oemconfig && cd oemconfig && mkdir -p usr/bin && mkdir -p etc/calamares && mkdir -p usr/share/xsessions && mkdir -p usr/libexec && mkdir -p etc && mkdir -p usr/share/applications && mkdir -p home/oem/Desktop)
(cp lubuntu/calamares-logs-helper lubuntu/oemconfig/usr/bin/)
(cp lubuntu/oem/sddm.conf lubuntu/oemconfig/etc/)
(cp lubuntu/oem/sudoers.oem lubuntu/oemconfig/etc/ && chmod 400 lubuntu/oemconfig/etc/sudoers.oem)
(cp lubuntu/oem/calamares-oemfinish.sh lubuntu/oemconfig/usr/libexec/)
(cp lubuntu/oem/calamares-finish-oem lubuntu/oemconfig/usr/bin/)
(cp lubuntu/oem/calamares-finish-oem.desktop lubuntu/oemconfig/usr/share/applications/)
(cp -r lubuntu/branding lubuntu/oemconfig/etc/calamares/)
(cp -r lubuntu/oem/modules/ lubuntu/oemconfig/etc/calamares/)
(cp lubuntu/oem/settings.conf lubuntu/oemconfig/etc/calamares/)
(cp lubuntu/oem/lubuntu-oem-env/lubuntu-oem-environment.desktop lubuntu/oemconfig/usr/share/xsessions/)
(cp lubuntu/oem/lubuntu-oem-env/start-lubuntu-oem-env lubuntu/oemconfig/usr/libexec/)
(cp common/basicwallpaper/build/basicwallpaper lubuntu/oemconfig/usr/bin/)
(cp lubuntu/oem/calamares-finish-oem.desktop lubuntu/oemconfig/home/oem/Desktop/)
(fakeroot bash -c "chown -R root:root lubuntu/oemconfig && tar cvzf lubuntu/oemconfig.tar.gz lubuntu/oemconfig")
# Kubuntu OEM setup stuff
(cd kubuntu && mkdir oemconfig && cd oemconfig && mkdir -p usr/bin && mkdir -p etc/calamares && mkdir -p usr/share/xsessions && mkdir -p usr/libexec && mkdir -p etc && mkdir -p usr/share/applications && mkdir -p home/oem/Desktop)
(cp kubuntu/calamares-logs-helper kubuntu/oemconfig/usr/bin/)
(cp kubuntu/oem/sddm.conf kubuntu/oemconfig/etc/)
(cp kubuntu/oem/sudoers.oem kubuntu/oemconfig/etc/ && chmod 400 kubuntu/oemconfig/etc/sudoers.oem)
(cp kubuntu/oem/calamares-oemfinish.sh kubuntu/oemconfig/usr/libexec/)
(cp kubuntu/oem/calamares-finish-oem kubuntu/oemconfig/usr/bin/)
(cp kubuntu/oem/calamares-finish-oem.desktop kubuntu/oemconfig/usr/share/applications/)
(cp -r kubuntu/branding kubuntu/oemconfig/etc/calamares/)
(cp -r kubuntu/oem/modules/ kubuntu/oemconfig/etc/calamares/)
(cp kubuntu/oem/settings.conf kubuntu/oemconfig/etc/calamares/)
(cp kubuntu/oem/kubuntu-oem-env/kubuntu-oem-environment.desktop kubuntu/oemconfig/usr/share/xsessions/)
(cp kubuntu/oem/kubuntu-oem-env/start-kubuntu-oem-env kubuntu/oemconfig/usr/libexec/)
(cp common/basicwallpaper/build/basicwallpaper kubuntu/oemconfig/usr/bin/)
(cp kubuntu/oem/calamares-finish-oem.desktop kubuntu/oemconfig/home/oem/Desktop/)
(fakeroot bash -c "chown -R root:root kubuntu/oemconfig && tar cvzf kubuntu/oemconfig.tar.gz kubuntu/oemconfig")
# Ubuntu Unity OEM setup stuff
(cd ubuntuunity && mkdir oemconfig && cd oemconfig && mkdir -p usr/bin && mkdir -p etc/calamares && mkdir -p usr/share/xsessions && mkdir -p usr/libexec && mkdir -p etc/lightdm && mkdir -p usr/share/applications && mkdir -p home/oem/Desktop)
(cp ubuntuunity/calamares-logs-helper ubuntuunity/oemconfig/usr/bin/)
(cp ubuntuunity/oem/lightdm.conf ubuntuunity/oemconfig/etc/lightdm/)
(cp ubuntuunity/oem/sudoers.oem ubuntuunity/oemconfig/etc/ && chmod 400 kubuntu/oemconfig/etc/sudoers.oem)
(cp ubuntuunity/oem/calamares-oemfinish.sh ubuntuunity/oemconfig/usr/libexec/)
(cp ubuntuunity/oem/calamares-finish-oem ubuntuunity/oemconfig/usr/bin/)
(cp ubuntuunity/oem/calamares-finish-oem.desktop ubuntuunity/oemconfig/usr/share/applications/)
(cp -r ubuntuunity/branding ubuntuunity/oemconfig/etc/calamares/)
(cp -r ubuntuunity/oem/modules/ ubuntuunity/oemconfig/etc/calamares/)
(cp ubuntuunity/oem/settings.conf ubuntuunity/oemconfig/etc/calamares/)
(cp ubuntuunity/oem/ubuntu-unity-oem-env/ubuntu-unity-oem-environment.desktop ubuntuunity/oemconfig/usr/share/xsessions/)
(cp ubuntuunity/oem/ubuntu-unity-oem-env/start-ubuntu-unity-oem-env ubuntuunity/oemconfig/usr/libexec/)
(cp common/basicwallpaper/build/basicwallpaper ubuntuunity/oemconfig/usr/bin/)
(cp ubuntuunity/oem/calamares-finish-oem.desktop ubuntuunity/oemconfig/home/oem/Desktop/)
(fakeroot bash -c "chown -R root:root ubuntuunity/oemconfig && tar cvzf ubuntuunity/oemconfig.tar.gz ubuntuunity/oemconfig")
# Get rid of the unnecessary files
find lubuntu/ -type f -iname "*.in" | xargs rm -f
find lubuntu/ -type f -iname "Makefile" | xargs rm -f
find kubuntu/ -type f -iname "*.in" | xargs rm -f
find kubuntu/ -type f -iname "Makefile" | xargs rm -f
find ubuntuunity/ -type f -iname "*.in" | xargs rm -f
find ubuntuunity/ -type f -iname "Makefile" | xargs rm -f
rm -rf kubuntu/oemconfig
rm -rf lubuntu/oemconfig
rm -rf ubuntuunity/oemconfig
rm -rf common/basicwallpaper/build
# vim:ts=4

View File

@ -6,8 +6,8 @@ If you want to add a new package for your flavor, here's how to do it:
2. Edit files and rename the branding directory for your flavor. All of the
configuration files are pretty self-explanatory, but they're documented
well upstream, so it shouldn't be hard to put your own spin on things.
3. Create a new binary package, and *make sure to Provides+Conflicts against
`calamares-settings-ubuntu-flavor`*. This needs to be done because all
3. Create a new binary package, and *make sure to Conflicts against all other
binary packages in this source package*. This needs to be done because all
subdirectories are installed in the same location, so this makes sure that
nobody tries to install any two binary packages at the same time.

View File

@ -1,24 +0,0 @@
# Ubuntu Studio's Calamares Branding (archived)
This directory houses the branding Ubuntu Studio used when Calamares was still
being used as the installer, along with some additional potentially useful
configuration fragments. Ubuntu Studio has since switched to using
ubuntu-desktop-provision, and thus most of the actual configuration has been
removed.
Unless otherwise stated, the contents of this directory are licensed as follows:
Copyright (C) 2020 Ubuntu Studio Developers <ubuntu-studio-devel@lists.ubuntu.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this software. If not, see <http://www.gnu.org/licenses/>.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 379 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 460 KiB

View File

@ -1,31 +0,0 @@
---
componentName: ubuntustudio
windowExpanding: normal
windowSize: "890px,600px"
strings:
productName: Ubuntu Studio
shortProductName: Ubuntu Studio
version: 23.10
shortVersion: noble
versionedName: Ubuntu Studio
shortVersionedName: Ubuntu Studio 23.10
bootloaderEntryName: Ubuntu
productUrl: https://ubuntustudio.org/
supportUrl: https://ubuntustudio.org/support/
images:
productLogo: "logo.png"
productIcon: "icon.png"
productWelcome: "welcome.png"
slideshow: "show.qml"
slideshowAPI: 1
style:
SidebarBackground: "#1E1E1E"
SidebarText: "#BBBBBB"
SidebarTextCurrent: "#FFFFFF"
SidebarBackgroundCurrent: "#121212"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,11 +0,0 @@
#!/usr/bin/make -f
LANGUAGES := ar ca de es eu gl be da el et fr ko pl pt pt_BR
all:
for i in $(LANGUAGES); do \
/usr/lib/qt5/bin/lrelease "calamares-lubuntu_$$i.ts"; \
rm calamares-lubuntu_$$i.ts; \
done
# vim:ts=4

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ar">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation>احصل على المساعدة</translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation>https://lubuntu.me</translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation>ايميلك</translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation>مُدار بواسطة تروجيتا</translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation>لتشغيل جميع أفلامك</translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation>ليبر أوفيس</translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation>لتحرير ولتعديل جميع مستنداتك</translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation>الصور</translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation>تظهر بواسطة نوكامس</translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation>أحصل على المرح!</translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation>مع 2048 لعبة</translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation>دردشة اي ار سي</translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation>مع كواسيل اي ار سي</translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation>أظهر مستنداتك</translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation>مع عارض كيو بد دي اف</translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ca">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation>Obtenir Suport</translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation>https://lubuntu.me</translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation>El Teu E-Mail</translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation>Gestionat per Trojitá</translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation>SMPlayer</translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation>Per reproduir Totes les Teves Pel·lícules</translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation>LibreOffice</translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation>Per Editar Tots el Teus Documents</translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation>Imatges</translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation>Mostrades Amb Nomacs</translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation>Diverteix-te!</translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation>Amb el joc 2048</translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation>IRC Chat</translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation>Amb Quassel IRC</translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation>Consulteu els Vostres Documents</translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation>Amb QPDFView</translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="da_DK">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation> support</translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation>https://lubuntu.me</translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation>Din e-mail</translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation>Styret af Trojitá</translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation>SMPlayer</translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation>Til at afspille alle dine videoer</translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation>LibreOffice</translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation>Rediger alle dine dokumenter</translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation>Billeder</translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation>Se dem med Nomacs</translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation>Hav det sjovt!</translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation>Med 2048 spillet</translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation>IRC Chat</translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation>Med Quassel IRC</translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation>Se dine dokumenter</translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation>Med QPDFView</translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation>Unterstützung erhalten</translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation>https://lubuntu.me</translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation>Ihre E-Mail-Adresse</translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation>von Trojitá verwaltet</translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation>SMPlayer</translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation>Um alle ihre Filme abzuspielen</translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation>LibreOffice</translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation>Bearbeitet all ihre Dokumente</translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation>Bilder</translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation>Viel Spaß!</translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation>Mit das 2048 Spiel</translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation>IRC Chat</translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation>Mit Quassel IRC</translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation>Ihre Dokumente anzeigen</translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation>Mit QPDFView</translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="es">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation>Obtén Soporte</translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation>https://lubuntu.me</translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation>Tu e-mail</translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation>Gestionado por Trojitá</translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation>SMPlayer</translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation>Para Reproducir Todas Tus Películas</translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation>LibreOffice</translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation>Edita Todos Tus Documentos</translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation>Imágenes</translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation>Mostradas Con Nomacs</translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation>¡Diviértete!</translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation>Con el juego 2048</translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation>Chat de IRC</translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation>Con Quassel IRC</translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation>Visualiza tus Documentos</translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation>Con QPDFView</translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="fr">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation>Obtenir de l&apos;aide</translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation>https://lubuntu.me</translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation>Votre mail</translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation>Managé par Trojità</translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation>SMPlayer</translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation>Pour regarder tous vos films</translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation>LibreOffice</translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation>Édite tous vos documents</translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation>Images</translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation>Visionné avec Nomacs</translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation>Amusez vous !</translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation>Avec le jeux 2018</translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation>Chat IRC</translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation>Avec Quassel IRC</translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation>Regardez vos documents</translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation>Avec QPDFView</translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="it_IT">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation>Ricevi Supporto</translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation>https://lubuntu.me</translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation>La tua Mail</translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation>Gestito da Trojitá</translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation>SMPlayer</translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation>Per Riprodurre Tutti i Tuoi Filmati</translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation>LibreOffice</translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation>Modifica tutti i tuoi documenti</translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation>Immagini</translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation>Visualizzato con Nomacs</translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation>Divertiti!</translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation>Con il gioco 2048</translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation>Chat IRC</translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation>Con Quassel IRC</translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation>Vedi i tuoi documenti</translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation>Con QPDFView</translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="no">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation> brukerstøtte</translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation>https://lubuntu.me</translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation>Din epost</translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation>Håndtert av Trojitá</translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation>SMPlayer</translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation>For å spille alle dine filmer</translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation>LibreOffice</translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation>Skriv alle dine dokumenter</translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation>Bilder</translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation>Vist med Nomacs</translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation>Ha det gøy!</translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation>Med 2048-spillet</translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation>IRC Chat</translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation>Med Quassel IRC</translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation>Se dine dokumenter</translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation>Med QPDFView</translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="pl">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation>Uzyskaj wsparcie</translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation>https://lubuntu.me</translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation>Twój e-mail</translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation>Obsługiwany przez Trojitá</translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation>SMPlayer</translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation>Odtwarzający wszystkie Twoje filmy</translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation>LibreOffice</translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation>Edytuje Twoje dokumenty</translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation>Zdjęcia</translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation>Wyświetlane przez Nomacs</translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation>Baw się dobrze!</translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation>Z grą 2048</translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation>Czat IRC</translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation>Dzięki Quassel IRC</translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation>Wyświetlaj swoje dokumenty</translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation>W QPDFView</translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="pt">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation>Suporte</translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation>https://lubuntu.me</translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation>O seu correio eletrónico (e-mail)</translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation>Gerido por Trojitá</translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation>SMPlayer</translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation>Para a reprodução de todos os seus filmes</translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation>LibreOffice</translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation>Edita todos os seus documentos</translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation>Imagens</translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation>Visualizado com Nomacs</translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation>Divirta-se!</translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation>Com o jogo 2048</translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation>Converse via IRC</translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation>Com o Quassel IRC</translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation>Visualize os seus documentos</translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation>Com o QPDFView</translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="pt_BR">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation>Suporte</translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation>https://lubuntu.me</translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation>Seu correio eletrônico (e-mail)</translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation>Gerenciado por Trojitá</translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation>SMPlayer</translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation>Para reprodução dos seus filmes favoritos</translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation>LibreOffice</translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation>Edita todos os seus documentos</translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation>Imagens</translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation>Visualizadas com Nomacs</translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation>Divirta-se!</translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation>Com o jogo 2048</translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation>Converse via IRC</translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation>Com o Quassel IRC</translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation>Visualize os seus documentos</translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation>Com o QPDFView</translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru_RU">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="32"/>
<source>Get Support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="56"/>
<source>https://lubuntu.me</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="90"/>
<source>Your Mail</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="114"/>
<source>Managed by Trojitá</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="148"/>
<source>SMPlayer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="172"/>
<source>To Play All of Your Movies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="206"/>
<source>LibreOffice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="230"/>
<source>Edits All Of Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="264"/>
<source>Pictures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="288"/>
<source>Viewed With Nomacs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="322"/>
<source>Have Fun!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="346"/>
<source>With the 2048 game</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="380"/>
<source>IRC Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="404"/>
<source>With Quassel IRC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="438"/>
<source>View Your Documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="462"/>
<source>With QPDFView</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1,106 +0,0 @@
import QtQuick 2.0;
import calamares.slideshow 1.0;
Presentation
{
id: presentation
Timer {
interval: 20000
running: true
repeat: true
onTriggered: presentation.goToNextSlide()
}
Slide {
Image {
anchors.centerIn: parent
id: image1
x:0
y:0
width: 790
height: 520
fillMode: Image.PreserveAspectFit
smooth: true
source: "NewLook.png"
}
}
Slide {
Image {
anchors.centerIn: parent
id: image3
x: 0
y: 0
width: 790
height: 520
fillMode: Image.PreserveAspectFit
smooth: true
source: "Audio.png"
}
}
Slide {
Image {
anchors.centerIn: parent
id: image4
x: 0
y: 0
width: 790
height: 520
fillMode: Image.PreserveAspectFit
smooth: true
source: "Video.png"
}
}
Slide {
Image {
anchors.centerIn: parent
id: image5
x: 0
y: 0
width: 790
height: 520
fillMode: Image.PreserveAspectFit
smooth: true
source: "Art.png"
}
}
Slide {
Image {
anchors.centerIn: parent
id: image6
x: 0
y: 0
width: 790
height: 520
fillMode: Image.PreserveAspectFit
smooth: true
source: "Photography.png"
}
}
Slide {
Image {
anchors.centerIn: parent
id: image7
x: 0
y: 0
width: 790
height: 520
fillMode: Image.PreserveAspectFit
smooth: true
source: "Software.png"
}
}
Slide {
Image {
anchors.centerIn: parent
id: image2
x: 0
y: 0
width: 790
height: 520
fillMode: Image.PreserveAspectFit
smooth: true
source: "FindUs.png"
}
}
}

View File

@ -1,92 +0,0 @@
/*
A branding component can ship a stylesheet (like this one)
which is applied to parts of the Calamares user-interface.
In principle, all parts can be styled through CSS.
Missing parts should be filed as issues.
The IDs are based on the object names in the C++ code.
You can use the Debug Dialog to find out object names:
- Open the debug dialog
- Choose tab *Tools*
- Click *Widget Tree* button
The list of object names is printed in the log.
Documentation for styling Qt Widgets through a stylesheet
can be found at
https://doc.qt.io/qt-5/stylesheet-examples.html
https://doc.qt.io/qt-5/stylesheet-reference.html
In Calamares, styling widget classes is supported (e.g.
using `QComboBox` as a selector).
This example stylesheet has all the actual styling commented out.
The examples are not exhaustive.
*/
/*** Generic Widgets.
*
* You can style **all** widgets of a given class by selecting
* the class name. Some widgets have specialized sub-selectors.
*/
/*
QPushButton { background-color: green; }
*/
/*** Main application window.
*
* The main application window has the sidebar, which in turn
* contains a logo and a list of items -- note that the list
* can **not** be styled, since it has its own custom C++
* delegate code.
*/
/*
#mainApp { setStyleSheet("color: white; background-color: black;"); }
#sidebarApp { }
#logoApp { }
*/
/*** Welcome module.
*
* There are plenty of parts, but the buttons are the most interesting
* ones (donate, release notes, ...). The little icon image can be
* styled through *qproperty-icon*, which is a little obscure.
* URLs can reference the QRC paths of the Calamares application
* or loaded via plugins or within the filesystem. There is no
* comprehensive list of available icons, though.
*/
/*
QPushButton#aboutButton { qproperty-icon: url(:/data/images/release.svg); }
#donateButton,
#supportButton,
#releaseNotesButton,
#knownIssuesButton { qproperty-icon: url(:/data/images/help.svg); }
*/
/*** Partitioning module.
*
* Many moving parts, which you will need to experiment with.
*/
/*
#bootInfoIcon { }
#bootInfoLable { }
#deviceInfoIcon { }
#defineInfoLabel { }
#scrollAreaWidgetContents { }
#partitionBarView { }
*/
/*** Licensing module.
*
* The licensing module paints individual widgets for each of
* the licenses. The item can be collapsed or expanded.
*/
/*
#licenseItem { }
#licenseItemFullText { }
*/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

View File

@ -1,119 +0,0 @@
[ColorEffects:Disabled]
Color=56,56,56
ColorAmount=0
ColorEffect=0
ContrastAmount=0.65
ContrastEffect=1
IntensityAmount=0.1
IntensityEffect=2
[ColorEffects:Inactive]
ChangeSelectionColor=true
Color=112,111,110
ColorAmount=0.025
ColorEffect=2
ContrastAmount=0.1
ContrastEffect=2
Enable=false
IntensityAmount=0
IntensityEffect=0
[Colors:Button]
BackgroundAlternate=163,212,250
BackgroundNormal=246,245,244
DecorationFocus=53,132,228
DecorationHover=53,132,228
ForegroundActive=53,132,228
ForegroundInactive=112,125,138
ForegroundLink=41,128,185
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=35,38,41
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[Colors:Complementary]
BackgroundAlternate=27,30,32
BackgroundNormal=42,46,50
DecorationFocus=53,132,228
DecorationHover=53,132,228
ForegroundActive=53,132,228
ForegroundInactive=161,169,177
ForegroundLink=29,153,243
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=252,252,252
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[Colors:Selection]
BackgroundAlternate=163,212,250
BackgroundNormal=53,132,228
DecorationFocus=53,132,228
DecorationHover=53,132,228
ForegroundActive=53,132,228
ForegroundInactive=112,125,138
ForegroundLink=41,128,185
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=255,255,255
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[Colors:Tooltip]
BackgroundAlternate=234,231,229
BackgroundNormal=246,245,244
DecorationFocus=53,132,228
DecorationHover=53,132,228
ForegroundActive=53,132,228
ForegroundInactive=112,125,138
ForegroundLink=41,128,185
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=35,38,41
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[Colors:View]
BackgroundAlternate=246,245,244
BackgroundNormal=255,255,255
DecorationFocus=53,132,228
DecorationHover=53,132,228
ForegroundActive=53,132,228
ForegroundInactive=112,125,138
ForegroundLink=41,128,185
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=35,38,41
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[Colors:Window]
BackgroundAlternate=227,229,231
BackgroundNormal=234,231,229
DecorationFocus=53,132,228
DecorationHover=53,132,228
ForegroundActive=53,132,228
ForegroundInactive=112,125,138
ForegroundLink=41,128,185
ForegroundNegative=218,68,83
ForegroundNeutral=246,116,0
ForegroundNormal=35,38,41
ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[General]
ColorScheme=UbuntuStudioLight
Name=Ubuntu Studio Light
shadeSortColumn=true
[KDE]
contrast=4
[WM]
activeBackground=234,231,229
activeBlend=227,229,231
activeForeground=35,38,41
inactiveBackground=234,231,229
inactiveBlend=234,231,229
inactiveForeground=112,125,138

View File

@ -1,4 +0,0 @@
[General]
AutomountEnabled=false
AutomountOnLogin=false
AutomountOnPlugin=false

View File

@ -1,45 +0,0 @@
cmake_minimum_required(VERSION 3.16)
project(basicwallpaper VERSION 0.1 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
set(PROJECT_SOURCES
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(basicwallpaper
MANUAL_FINALIZATION
${PROJECT_SOURCES}
)
else()
add_executable(basicwallpaper
${PROJECT_SOURCES}
)
endif()
target_link_libraries(basicwallpaper PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
install(TARGETS basicwallpaper
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(basicwallpaper)
endif()

View File

@ -1,3 +0,0 @@
# basicwallpaper: Shows an image in the background across all screens
Copyright (C) 2024 Kubuntu Developers <kubuntu-devel@lists.ubuntu.com>. Licensed under the GNU GPL version 3. This license applies to all files in the repository. Inspiration taken from lubuntu-installer-prompt and pcmanfm-qt.

View File

@ -1,28 +0,0 @@
#include "mainwindow.h"
#include <QApplication>
#include <QScreen>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString wallpaperFile;
if (argc > 1) {
wallpaperFile = QString(argv[1]);
} else {
return 1;
}
for (QScreen *screen : QApplication::screens()) {
MainWindow *w = new MainWindow(wallpaperFile);
w->setWindowFlags(Qt::WindowStaysOnBottomHint);
w->setGeometry(screen->geometry());
w->showFullScreen();
w->show();
w->applyWallpaper();
}
return a.exec();
}

View File

@ -1,43 +0,0 @@
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QDebug>
#include <QImage>
MainWindow::MainWindow(const QString &wallpaperFile, QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_wallpaperFile = wallpaperFile;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::applyWallpaper()
{
QImage image(m_wallpaperFile);
if (!image.isNull()) {
qreal imgRatio = static_cast<qreal>(image.width()) / image.height();
qreal screenRatio = static_cast<qreal>(this->width()) / this->height();
QImage scaled;
if (imgRatio < screenRatio) {
scaled = image.scaledToWidth(this->width(), Qt::SmoothTransformation);
int yGap = (scaled.height() - this->height()) / 2;
scaled = scaled.copy(0, yGap, scaled.width(), this->height());
} else {
scaled = image.scaledToHeight(this->height(), Qt::SmoothTransformation);
int xGap = (scaled.width() - this->width()) / 2;
scaled = scaled.copy(xGap, 0, this->width(), scaled.height());
}
QPixmap bg = QPixmap::fromImage(scaled);
QPalette palette;
palette.setBrush(QPalette::Window, bg);
this->setPalette(palette);
} else {
qCritical() << "ERROR: Wallpaper does not exist!";
}
}

View File

@ -1,24 +0,0 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(const QString &wallpaperFile, QWidget *parent = nullptr);
~MainWindow();
void applyWallpaper();
private:
Ui::MainWindow *ui;
QString m_wallpaperFile;
};
#endif // MAINWINDOW_H

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menubar"/>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,3 +0,0 @@
#!/bin/bash
setxkbmap -query | awk '/layout/{ print $2 }' > /dev/shm/fixconkeys-layout
cp /usr/libexec/fixconkeys-part2 ${1}/usr/libexec/fixconkeys-part2

View File

@ -1,4 +0,0 @@
#!/bin/bash
loadkeys "$(cat /dev/shm/fixconkeys-layout)"
setupcon --save-only
rm /usr/libexec/fixconkeys-part2

View File

@ -1,16 +0,0 @@
---
# Which base URL to use for the archive.
#
# This assumes that your mirror URLs are under XX.baseURL
baseUrl: archive.ubuntu.com
# URL used for IP address lookup
geoip:
style: "xml"
url: "https://geoip.ubuntu.com/lookup"
# Distribution that this is based off of.
# This is so we can make safe assumptions for the contents of
# sources.list-like files.
distribution: Ubuntu

View File

@ -1,126 +0,0 @@
#!/usr/bin/env python3
# Copyright (C) 2018-2023 Simon Quigley <tsimonq2@ubuntu.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import libcalamares
from time import strftime
import urllib.request
from urllib.error import HTTPError, URLError
import socket
import logging
import distro
import xml.etree.ElementTree as ET
from os import remove
SUBDOMAINS_BY_COUNTRY_CODE = {
"US": "us.", "AU": "au.", "SE": "no.", "NO": "no.",
"NZ": "nz.", "NL": "nl.", "KR": "kr.", "DE": "de.",
"GE": "ge.", "PF": "pf.", "CZ": "cz.", "HR": "hr."
}
def get_sources_template():
return """# Automatically generated by Calamares on {date}.
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of {distro}.
## Ubuntu distribution repository
##
## The following settings can be adjusted to configure which packages to use from Ubuntu.
## Mirror your choices (except for URIs and Suites) in the security section below to
## ensure timely security updates.
##
## Types: Append deb-src to enable the fetching of source package.
## URIs: A URL to the repository (you may add multiple URLs)
## Suites: The following additional suites can be configured
## <name>-updates - Major bug fix updates produced after the final release of the
## distribution.
## <name>-backports - software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
## Components: Aside from main, the following components can be added to the list
## restricted - Software that may not be under a free license, or protected by patents.
## universe - Community maintained packages.
## Software from this repository is only maintained and supported by Canonical
## for machines with Ubuntu Pro subscriptions. Without Ubuntu Pro, the Ubuntu
## community provides best-effort security maintenance.
## multiverse - Community maintained of restricted. Software from this repository is
## ENTIRELY UNSUPPORTED by the Ubuntu team, and may not be under a free
## licence. Please satisfy yourself as to your rights to use the software.
## Also, please note that software in multiverse WILL NOT receive any
## review or updates from the Ubuntu security team.
##
## See the sources.list(5) manual page for further settings.
Types: deb
URIs: {url}
Suites: {codename} {codename}-updates {codename}-backports
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
## Ubuntu security updates. Aside from URIs and Suites,
## this should mirror your choices in the previous section.
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: {codename}-security
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
"""
def get_country_code():
if not libcalamares.globalstorage.value("hasInternet"):
return ""
geoip_config = libcalamares.job.configuration["geoip"]
try:
with urllib.request.urlopen(geoip_config["url"], timeout=75) as resp:
if geoip_config["style"] == "json":
return json.loads(resp.read().decode())["country_code"]
elif geoip_config["style"] == "xml":
return ET.parse(resp).getroot().find("CountryCode").text
except (HTTPError, URLError, socket.timeout):
logging.error("Failed to get country code.")
return ""
def get_subdomain_by_country(country_code):
return SUBDOMAINS_BY_COUNTRY_CODE.get(country_code, "")
def write_file(path, content):
with open(path, "w") as f:
f.write(content)
def run():
country_code = get_country_code()
subdomain = get_subdomain_by_country(country_code)
base_url = "http://{}{}/ubuntu".format(subdomain, libcalamares.job.configuration["baseUrl"])
codename = distro.codename()
root_mount_point = libcalamares.globalstorage.value("rootMountPoint")
sources = get_sources_template().format(date=strftime("%Y-%m-%d"), distro=libcalamares.job.configuration["distribution"], url=base_url, codename=codename)
write_file(f"{root_mount_point}/etc/apt/sources.list.d/ubuntu.sources", sources)
remove(f"{root_mount_point}/etc/apt/sources.list")
libcalamares.globalstorage.insert("mirrorURL", base_url)
libcalamares.globalstorage.insert("ubuntuCodename", codename)

View File

@ -1,5 +0,0 @@
---
type: "job"
name: "automirror"
interface: "python"
script: "main.py"

View File

@ -1,18 +0,0 @@
# Make sure the correct bootloader package is installed for EFI.
# Also pull in shim so secureboot has a chance at working.
# Because of edge cases, we ignore BIOS, and do the same
# procedure for all EFI types.
---
firmwareType:
bios: "-/bin/true"
"*":
- command: apt-cdrom add -m -d=/media/cdrom/
timeout: 10
- command: sed -i '/deb http/d' /etc/apt/sources.list
timeout: 10
- command: apt-get update
timeout: 10800
- command: apt install -y --no-upgrade -o Acquire::gpgv::Options::=--ignore-time-conflict grub-efi-$(if grep -q 64 /sys/firmware/efi/fw_platform_size; then echo amd64-signed; else echo ia32; fi)
timeout: 10800
- command: apt install -y --no-upgrade -o Acquire::gpgv::Options::=--ignore-time-conflict shim-signed
timeout: 10800

View File

@ -1,5 +0,0 @@
---
dontChroot: true
timeout: 60
script:
- command: "cp /cdrom/casper/vmlinuz ${ROOT}/boot/vmlinuz-$(uname -r)"

View File

@ -1,3 +0,0 @@
---
restartNowMode: user-checked
restartNowCommand: "systemctl -i reboot"

View File

@ -1,2 +0,0 @@
crypttabOptions: luks,keyscript=/bin/cat
efiMountOptions: umask=0077

View File

@ -1,3 +0,0 @@
overwrite: false
defaults:
GRUB_ENABLE_CRYPTODISK: true

View File

@ -1,8 +0,0 @@
---
region: "America"
zone: "New_York"
localeGenPath: "/etc/locale.gen"
geoip:
style: "xml"
url: "https://geoip.ubuntu.com/lookup"
selector: "TimeZone"

View File

@ -1,8 +0,0 @@
---
# Whether to create /etc/machine-id for systemd.
systemd: true
# Whether to create /var/lib/dbus/machine-id for D-Bus.
dbus: true
# Whether /var/lib/dbus/machine-id should be a symlink to /etc/machine-id
# (ignored if dbus is false, or if there is no /etc/machine-id to point to).
dbus-symlink: true

View File

@ -1,41 +0,0 @@
extraMounts:
- device: proc
fs: proc
mountPoint: /proc
- device: sys
fs: sysfs
mountPoint: /sys
- device: /dev
mountPoint: /dev
options: [ bind ]
- device: tmpfs
fs: tmpfs
mountPoint: /run
- device: /run/udev
mountPoint: /run/udev
options: [ bind ]
- device: efivarfs
fs: efivarfs
mountPoint: /sys/firmware/efi/efivars
efi: true
- device: /run/systemd/resolve
mountPoint: /run/systemd/resolve
options: [ bind ]
- device: /cdrom
mountPoint: /media/cdrom
options: [ bind ]
mountOptions:
- filesystem: default
options: [ defaults ]
- filesystem: btrfs
options: [ defaults, noatime, autodefrag ]
ssdOptions: [ discard, compress=lzo ]
- filesystem: ext4
ssdOptions: [ discard ]
- filesystem: jfs
ssdOptions: [ discard ]
- filesystem: xfs
ssdOptions: [ discard ]
- filesystem: swap
ssdOptions: [ discard ]

View File

@ -1,31 +0,0 @@
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
include(FeatureSummary)
set( CMAKE_CXX_STANDARD 17 )
set( CMAKE_CXX_STANDARD_REQUIRED ON )
set( CALAMARES_VERSION_REQUIRED 3.3.9 )
find_package(ECM "6.0.0" NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH})
include(KDEInstallDirs)
find_package(KF6 REQUIRED COMPONENTS CoreAddons)
find_package(Calamares ${CALAMARES_VERSION_REQUIRED} NO_CMAKE_PACKAGE_REGISTRY)
if (NOT TARGET Calamares::calamares OR NOT TARGET Calamares::calamaresui)
find_package(Calamares ${CALAMARES_VERSION_REQUIRED} REQUIRED)
endif()
message(STATUS "Found Calamares version ${Calamares_VERSION}")
message(STATUS " libraries ${Calamares_LIB_DIRS}")
message(STATUS "")
calamares_add_plugin( pkgselect
TYPE viewmodule
EXPORT_MACRO PLUGINDLLEXPORT_PRO
SOURCES
PackageSelectViewStep.cpp
UI
pkgselect.ui
SHARED_LIB
)

View File

@ -1,391 +0,0 @@
#include "PackageSelectViewStep.h"
#include "ui_pkgselect.h"
#include "JobQueue.h"
#include "GlobalStorage.h"
#include "network/Manager.h"
#include <QCheckBox>
#include <QVariant>
#include <QDebug>
#include <QLabel>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QRadioButton>
/**
* @brief Initializes a new PackageSelectViewStep object.
* @param parent The parent QObject.
*/
PackageSelectViewStep::PackageSelectViewStep(QObject* parent)
: Calamares::ViewStep(parent),
m_packageSelections(),
ui(new Ui::pkgselect),
m_widget(new QWidget()), // Parent set to nullptr
m_connectionsMade(false)
{
ui->setupUi(m_widget);
// Layout Adjustment to Prevent Shifting
// Ensures that hiding/showing elements does not disrupt the layout
QGridLayout* mainLayout = qobject_cast<QGridLayout*>(ui->gridLayout);
if (mainLayout) {
mainLayout->setRowStretch(mainLayout->rowCount(), 1);
}
}
/**
* @brief Cleans up the PackageSelectViewStep object.
*/
PackageSelectViewStep::~PackageSelectViewStep()
{
delete ui;
delete m_widget;
}
QString PackageSelectViewStep::prettyName() const
{
return tr("Customize");
}
bool PackageSelectViewStep::exists_and_true(const QString& key) const
{
return m_packageSelections.contains(key) && m_packageSelections.value(key).toBool();
}
QWidget* PackageSelectViewStep::widget()
{
return m_widget;
}
Calamares::JobList PackageSelectViewStep::jobs() const
{
return Calamares::JobList();
}
bool PackageSelectViewStep::isNextEnabled() const
{
return true;
}
bool PackageSelectViewStep::isBackEnabled() const
{
return true;
}
bool PackageSelectViewStep::isAtBeginning() const
{
return true;
}
bool PackageSelectViewStep::isAtEnd() const
{
return true;
}
void PackageSelectViewStep::setConfigurationMap(const QVariantMap& configurationMap)
{
m_configurationMap = configurationMap;
}
/**
* @brief Activates the step, setting up the UI based on network availability and configuration.
*
* This method is called when the step becomes active. It handles network checks,
* dynamically creates package selection checkboxes, and connects signal handlers.
*/
void PackageSelectViewStep::onActivate()
{
// Check network availability
Calamares::Network::Manager network;
bool hasInternet = network.hasInternet();
// Handle network unavailability
//if (!hasInternet) {
// Disable almost all fancy features to avoid bugs, revert in 25.10 cycle
ui->full_button->setVisible(false);
ui->full_text->setVisible(false);
ui->left_spacer->changeSize(20, 20, QSizePolicy::Fixed, QSizePolicy::Fixed);
ui->right_spacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
ui->additional_label->setVisible(false);
ui->updates_button->setVisible(false);
ui->updates_text->setVisible(false);
ui->extraparty_scroll->setVisible(false);
ui->extraparty_text->setVisible(false);
ui->mandatory_warning_label->setVisible(false);
//}
// Dynamically create package checkboxes only once
if (m_packageCheckBoxes.isEmpty()) {
QVariantList additionalPackages = m_configurationMap.value("packages").toMap().value("additional_packages").toList();
QVBoxLayout* packagesLayout = ui->extraparty_scrollhouse->findChild<QVBoxLayout*>("packages_layout");
if (!packagesLayout) {
qWarning() << "packages_layout not found in UI.";
return;
}
for (const QVariant& var : additionalPackages) {
QVariantMap pkg = var.toMap();
QString packageId = pkg.value("id").toString();
QString packageName = pkg.value("name").toString();
QString packageDescription = pkg.value("description").toString();
bool isSnap = pkg.value("snap").toBool();
// Create checkbox
QCheckBox* checkbox = new QCheckBox(packageName, m_widget);
checkbox->setObjectName(packageId); // Naming as packageId directly
// Create description label
QLabel* descriptionLabel = new QLabel(packageDescription, m_widget);
QFont descFont = descriptionLabel->font();
descFont.setPointSize(10);
descFont.setItalic(true);
descriptionLabel->setFont(descFont);
descriptionLabel->setWordWrap(true);
// Add to layout
packagesLayout->addWidget(checkbox);
packagesLayout->addWidget(descriptionLabel);
// Store in the map
m_packageCheckBoxes.insert(packageId, checkbox);
// Connect checkbox toggled signal
connect(checkbox, &QCheckBox::toggled, this, &PackageSelectViewStep::updatePackageSelections);
}
}
// Handle installation modes
// Connect radio buttons to lambda functions only once
if (!m_connectionsMade) {
connect(ui->minimal_button, &QRadioButton::toggled, this, [this, hasInternet](bool checked) {
if (checked && hasInternet) {
// Hide additional packages UI
ui->extraparty_scroll->setVisible(false);
ui->extraparty_text->setVisible(false);
ui->mandatory_warning_label->setVisible(false);
// Uncheck and disable all additional package checkboxes
QVariantList removePackages = m_configurationMap.value("packages").toMap().value("minimal_remove_packages").toList();
for (const QVariant& var : removePackages) {
QString packageId = var.toString();
QCheckBox* checkbox = m_packageCheckBoxes.value(packageId, nullptr);
if (checkbox) {
checkbox->setChecked(false);
checkbox->setEnabled(false);
}
}
}
});
connect(ui->normal_button, &QRadioButton::toggled, this, [this, hasInternet](bool checked) {
if (checked && hasInternet) {
// Show additional packages UI
ui->extraparty_scroll->setVisible(true);
ui->extraparty_text->setVisible(true);
ui->mandatory_warning_label->setVisible(true);
// Enable all additional package checkboxes
for (auto checkbox : m_packageCheckBoxes) {
if (checkbox) {
checkbox->setEnabled(true);
}
}
}
});
connect(ui->full_button, &QRadioButton::toggled, this, [this, hasInternet](bool checked) {
if (checked && hasInternet) {
// Show additional packages UI
ui->extraparty_scroll->setVisible(true);
ui->extraparty_text->setVisible(true);
ui->mandatory_warning_label->setVisible(true);
// Check and disable all additional package checkboxes
for (auto checkbox : m_packageCheckBoxes) {
if (checkbox) {
checkbox->setChecked(true);
checkbox->setEnabled(false);
}
}
}
});
m_connectionsMade = true;
}
// Layout Adjustment to Prevent Shifting
// Ensure that hiding/showing elements does not center the remaining widgets
// This is generally handled by Qt's layout system, but adding stretch ensures stability
QGridLayout* mainLayout = qobject_cast<QGridLayout*>(ui->gridLayout);
if (mainLayout) {
mainLayout->setRowStretch(mainLayout->rowCount(), 1);
}
}
/**
* @brief Handles actions to perform when leaving the step, such as storing selected packages.
*
* This method gathers the selected packages, determines the installation mode,
* and stores the relevant data into Calamares' GlobalStorage for use in subsequent steps.
*/
void PackageSelectViewStep::onLeave()
{
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
if (!gs) {
qWarning() << "GlobalStorage is not available.";
return;
}
bool isStackedSquashfs = m_configurationMap.value("stacked_squashfs").toBool();
QVariantMap installationData = gs->value("installation_data").toMap();
QString installationMode = installationData.value("installation_mode").toString();
bool downloadUpdates = installationData.value("download_updates").toBool();
QVariantList packagesToInstall = installationData.value("packages_to_install").toList();
QVariantList packagesToRemove = installationData.value("packages_to_remove").toList();
QVariantList presentSnaps = installationData.value("present_snaps").toList();
// Handle default value for rootMountPoint
QString rootMountPoint = "/";
if (gs->contains("rootMountPoint")) {
rootMountPoint = gs->value("rootMountPoint").toString();
}
QVariantMap globalData;
// Determine selected installation mode
if (ui->minimal_button->isChecked()) {
installationMode = "minimal";
} else if (ui->normal_button->isChecked()) {
installationMode = "normal";
} else if (ui->full_button->isChecked()) {
installationMode = "full";
}
globalData.insert("installation_mode", installationMode);
// Used by unpackfs on stacked squashfs systems
if (installationMode == "minimal") {
}
if (installationMode == "minimal") {
globalData.insert("unpack_regular", false);
if (!isStackedSquashfs) {
QVariantList minimalPackages = m_configurationMap.value("packages").toMap().value("minimal_remove_packages").toList();
QVariantList installerPackages = m_configurationMap.value("packages").toMap().value("installer_remove_packages").toList();
QVariantList combinedRemove = minimalPackages + installerPackages;
globalData.insert("packages_to_remove", combinedRemove);
}
} else {
globalData.insert("unpack_regular", true);
// For normal and full, store packages to install
QVariantList selectedPackagesList;
// Store the snaps that are already on the system by default
QStringList presentSnapList;
// Process all checked boxes
for (auto it = m_packageCheckBoxes.constBegin(); it != m_packageCheckBoxes.constEnd(); ++it) {
const QString& packageId = it.key();
QCheckBox* checkbox = it.value();
if (checkbox && checkbox->isChecked()) {
// Retrieve package details from configuration
QVariantList additionalPackages = m_configurationMap.value("packages").toMap().value("additional_packages").toList();
QVariantMap packageDetails;
for (const QVariant& var : additionalPackages) {
QVariantMap pkg = var.toMap();
if (pkg.value("id").toString() == packageId) {
packageDetails.insert("id", pkg.value("id").toString());
packageDetails.insert("snap", pkg.value("snap").toBool());
break;
}
}
if (!packageDetails.isEmpty()) {
selectedPackagesList.append(packageDetails);
}
}
}
// Add the additional packages to be installed and substitute locale
QVariantList installPackages = m_configurationMap.value("packages").toMap().value("regular_install_packages").toList();
QString localeVal = gs->value("locale").toString();
for (const QVariant& installPackage : installPackages) {
QString packageId = installPackage.toString().replace("$LOCALE", localeVal);
QVariantMap packageDetails;
packageDetails.insert("id", packageId);
packageDetails.insert("snap", false);
selectedPackagesList.append(packageDetails);
}
// Ensure delta updates are processed first
QVariantList refreshSnaps = m_configurationMap.value("packages").toMap().value("refresh_snaps").toList();
for (const QVariant& snapVar : refreshSnaps) {
QString snapId = snapVar.toString();
presentSnapList.append(snapId);
}
// As a temporary measure until OEM is refactored in the 25.10 cycle,
// we need to ensure that Calamares and its necessary dependencies are
// installed on the target, iff this is a stacked squashfs.
// FIXME: remove in favor of more nuanced stacked squashfs
// functionality in 25.10
// Ref: https://discourse.ubuntu.com/t/implementation-of-ship-live-within-a-squashfs/57510
// LP: #2104343
if (isStackedSquashfs) {
QVector<QString> stage_two_packages = {"calamares", "kdialog"};
for (QString& package_name : stage_two_packages) {
QVariantMap package_details;
package_details.insert("id", package_name);
package_details.insert("snap", false);
selectedPackagesList.append(package_details);
}
}
globalData.insert("packages_to_install", selectedPackagesList);
if (!isStackedSquashfs) {
QVariantList installerPackages = m_configurationMap.value("packages").toMap().value("installer_remove_packages").toList();
globalData.insert("packages_to_remove", installerPackages);
}
globalData.insert("present_snaps", presentSnapList);
}
// Store the state of 'download_updates' checkbox
bool updatesChecked = ui->updates_button->isChecked();
globalData.insert("download_updates", updatesChecked);
gs->insert("installation_data", globalData);
}
/**
* @brief Slot to handle checkbox toggle events.
*
* This method updates the internal package selection map based on user interactions
* with the package checkboxes.
*
* @param checked The new checked state of the checkbox.
*/
void PackageSelectViewStep::updatePackageSelections(bool checked)
{
QCheckBox* checkbox = qobject_cast<QCheckBox*>(sender());
if (!checkbox)
return;
QString packageId = checkbox->objectName();
m_packageSelections[packageId] = checked;
emit packageSelectionsChanged();
}
/**
* @brief Retrieves the checkbox associated with a given package ID.
*
* @param id The package ID.
* @return A pointer to the QCheckBox, or nullptr if not found.
*/
QCheckBox* PackageSelectViewStep::getCheckboxById(const QString& id) const
{
return m_packageCheckBoxes.value(id, nullptr);
}
CALAMARES_PLUGIN_FACTORY_DEFINITION(PackageSelectViewStepFactory, registerPlugin<PackageSelectViewStep>(); )

View File

@ -1,143 +0,0 @@
#ifndef PACKAGESELECTVIEWSTEP_H
#define PACKAGESELECTVIEWSTEP_H
#include <QObject>
#include <QVariantMap>
#include <QMap>
#include "DllMacro.h"
#include "utils/PluginFactory.h"
#include "viewpages/ViewStep.h"
namespace Ui {
class pkgselect;
}
class QCheckBox;
/**
* @class PackageSelectViewStep
* @brief A Calamares view step for selecting and customizing packages during installation.
*
* This class provides a user interface for selecting additional packages to install,
* managing installation modes, and handling network availability scenarios.
*/
class PLUGINDLLEXPORT PackageSelectViewStep : public Calamares::ViewStep
{
Q_OBJECT
public:
/**
* @brief Constructs a new PackageSelectViewStep object.
* @param parent The parent QObject.
*/
explicit PackageSelectViewStep(QObject* parent = nullptr);
/**
* @brief Destroys the PackageSelectViewStep object.
*/
~PackageSelectViewStep() override;
/**
* @brief Returns the display name of the step.
* @return The pretty name as a QString.
*/
QString prettyName() const override;
/**
* @brief Returns the widget associated with this step.
* @return A pointer to the QWidget.
*/
QWidget* widget() override;
/**
* @brief Returns the list of jobs to execute for this step.
* @return An empty Calamares::JobList.
*/
Calamares::JobList jobs() const override;
/**
* @brief Indicates whether the "Next" button is enabled.
* @return Always returns true.
*/
bool isNextEnabled() const override;
/**
* @brief Indicates whether the "Back" button is enabled.
* @return Always returns true.
*/
bool isBackEnabled() const override;
/**
* @brief Indicates whether the step is at the beginning.
* @return Always returns true.
*/
bool isAtBeginning() const override;
/**
* @brief Indicates whether the step is at the end.
* @return Always returns true.
*/
bool isAtEnd() const override;
/**
* @brief Activates the step, setting up the UI based on network availability and configuration.
*/
void onActivate() override;
/**
* @brief Handles actions to perform when leaving the step, such as storing selected packages.
*/
void onLeave() override;
/**
* @brief Sets the configuration map for the step.
* @param configurationMap The QVariantMap containing configuration data.
*/
void setConfigurationMap(const QVariantMap& configurationMap) override;
/**
* @brief Retrieves the current package selections.
* @return A QVariantMap of package selections.
*/
QVariantMap packageSelections() const { return m_packageSelections; }
public slots:
/**
* @brief Slot to handle checkbox toggle events.
* @param checked The new checked state of the checkbox.
*/
void updatePackageSelections(bool checked);
signals:
/**
* @brief Signal emitted when package selections change.
*/
void packageSelectionsChanged();
private:
/**
* @brief Retrieves the checkbox associated with a given package ID.
* @param id The package ID.
* @return A pointer to the QCheckBox, or nullptr if not found.
*/
QCheckBox* getCheckboxById(const QString& id) const;
/**
* @brief Checks if a given key exists in package selections and is set to true.
* @param key The key to check.
* @return True if the key exists and is true, otherwise false.
*/
bool exists_and_true(const QString& key) const;
QVariantMap m_packageSelections; ///< Stores the state of package selections.
Ui::pkgselect* ui; ///< Pointer to the UI class.
QWidget* m_widget; ///< Pointer to the main widget of the step.
QVariantMap m_configurationMap; ///< Stores configuration data.
QMap<QString, QCheckBox*> m_packageCheckBoxes; ///< Maps package IDs to their corresponding checkboxes.
bool m_connectionsMade; ///< Flag to ensure signal connections are made only once.
};
CALAMARES_PLUGIN_FACTORY_DECLARATION(PackageSelectViewStepFactory)
#endif // PACKAGESELECTVIEWSTEP_H

View File

@ -1,51 +0,0 @@
---
packages:
additional_packages:
- id: "element-desktop"
name: "Element"
description: "Matrix-based end-to-end encrypted messenger and secure collaboration app."
snap: true
- id: "thunderbird"
name: "Thunderbird"
description: "Email, newsfeed, chat, and calendaring client."
snap: true
- id: "krita"
name: "Krita"
description: "Graphics editor designed primarily for digital art and 2D animation."
snap: true
minimal_remove_packages:
- "snapd"
- "lubuntu-snap-installation-monitor"
- "vlc"
- "plasma-discover"
- "transmission-qt"
- "quassel"
- "2048-qt"
- "featherpad"
- "noblenote"
- "kcalc"
- "qps"
- "zsync"
- "partitionmanager"
- "qapt-deb-installer"
- "picom"
- "qlipper"
- "qtpass"
- "libreoffice*"
installer_remove_packages:
- "^live-*"
- calamares-settings-lubuntu
- calamares
- zram-config
- cifs-utils
- lubuntu-installer-prompt
regular_install_packages:
- language-pack-$LOCALE
- language-pack-gnome-$LOCALE
- language-pack-kde-$LOCALE
- hunspell-$LOCALE
- libreoffice-help-$LOCALE
- libreoffice-l10n-$LOCALE
refresh_snaps:
- "firefox"
- "firmware-updater"

View File

@ -1,380 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>pkgselect</class>
<widget class="QWidget" name="pkgselect">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>830</width>
<height>943</height>
</rect>
</property>
<property name="windowTitle">
<string>Package Selection</string>
</property>
<property name="styleSheet">
<string notr="true">QRadioButton {
spacing: 13px;
}
QCheckBox {
spacing: 13px;
}
QLabel {
padding-left: 33px;
padding-right: 33px;
}</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<!-- Installation Mode Label -->
<item row="1" column="1">
<widget class="QLabel" name="apps_label">
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">padding-left: 0px; padding-right: 0px;</string>
</property>
<property name="text">
<string>Installation Mode</string>
</property>
</widget>
</item>
<!-- Minimal Installation Radio Button -->
<item row="9" column="1">
<widget class="QRadioButton" name="minimal_button">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>21</height>
</size>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>Minimal Installation</string>
</property>
</widget>
</item>
<!-- Minimal Installation Description -->
<item row="10" column="1">
<widget class="QLabel" name="minimal_text">
<property name="font">
<font>
<pointsize>10</pointsize>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Only the desktop environment</string>
</property>
</widget>
</item>
<!-- Normal Installation Radio Button -->
<item row="6" column="1">
<widget class="QRadioButton" name="normal_button">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>21</height>
</size>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>Normal Installation</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<!-- Normal Installation Description -->
<item row="7" column="1">
<widget class="QLabel" name="normal_text">
<property name="font">
<font>
<pointsize>10</pointsize>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Web browser, utilities, office software, games, and media players</string>
</property>
</widget>
</item>
<!-- Full Installation Radio Button -->
<item row="2" column="1">
<widget class="QRadioButton" name="full_button">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>21</height>
</size>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>Full Installation</string>
</property>
</widget>
</item>
<!-- Full Installation Description -->
<item row="3" column="1">
<widget class="QLabel" name="full_text">
<property name="font">
<font>
<pointsize>10</pointsize>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>All applications in the Normal Installation, and all extra third-party packages listed below</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
</widget>
</item>
<!-- Spacer Elements -->
<item row="0" column="0">
<spacer name="left_spacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="2">
<spacer name="right_spacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="8" column="1">
<spacer name="verticalSpacer_6">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<!-- Additional Options Label -->
<item row="12" column="1">
<widget class="QLabel" name="additional_label">
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">padding-left: 0px; padding-right: 0px;</string>
</property>
<property name="text">
<string>Additional Options</string>
</property>
</widget>
</item>
<!-- Update Checkbox -->
<item row="13" column="1">
<widget class="QCheckBox" name="updates_button">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>21</height>
</size>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>Download and install updates following installation</string>
</property>
</widget>
</item>
<!-- Updates Text -->
<item row="14" column="1">
<widget class="QLabel" name="updates_text">
<property name="font">
<font>
<pointsize>10</pointsize>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>This saves time after installation, and keeps your system secure</string>
</property>
</widget>
</item>
<!-- Mandatory Warning Label -->
<item row="20" column="0" colspan="3">
<widget class="QLabel" name="mandatory_warning_label">
<property name="font">
<font>
<pointsize>11</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Note: Ubuntu and flavors are NOT responsible for third-party software installed from this list.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<!-- Pushup Spacer -->
<item row="21" column="1">
<spacer name="pushup">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<!-- Additional Packages Label -->
<item row="16" column="1">
<widget class="QLabel" name="extraparty_text">
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">padding-left: 0px; padding-right: 0px;</string>
</property>
<property name="text">
<string>Install additional third-party packages</string>
</property>
</widget>
</item>
<!-- Scroll Area for Additional Packages -->
<item row="19" column="1">
<widget class="QScrollArea" name="extraparty_scroll">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="extraparty_scrollhouse">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>762</width>
<height>281</height>
</rect>
</property>
<layout class="QVBoxLayout" name="packages_layout">
<!-- Dynamic Checkboxes will be added here -->
</layout>
</widget>
</widget>
</item>
<!-- Stretch to Push Elements Up -->
<item row="22" column="1">
<spacer name="stretch_spacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,37 +0,0 @@
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
include(FeatureSummary)
set( CMAKE_CXX_STANDARD 23 )
set( CMAKE_CXX_STANDARD_REQUIRED ON )
find_library(APT_PKG_LIB apt-pkg)
if (NOT APT_PKG_LIB)
message(FATAL_ERROR "Could not find libapt-pkg")
endif()
find_package(ECM "6.0.0" NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH})
find_package(KF6 REQUIRED COMPONENTS CoreAddons)
include(KDEInstallDirs)
set( CALAMARES_VERSION_REQUIRED 3.3.9 )
find_package(Calamares ${CALAMARES_VERSION_REQUIRED} NO_CMAKE_PACKAGE_REGISTRY)
if (NOT TARGET Calamares::calamares OR NOT TARGET Calamares::calamaresui)
find_package(Calamares ${CALAMARES_VERSION_REQUIRED} REQUIRED)
endif()
message(STATUS "Found Calamares version ${Calamares_VERSION}")
message(STATUS " libraries ${Calamares_LIB_DIRS}")
message(STATUS "")
calamares_add_plugin( pkgselectprocess
TYPE job
EXPORT_MACRO PLUGINDLLEXPORT_PRO
SOURCES
PackageSelectProcess.cpp
SHARED_LIB
NO_CONFIG
)
add_executable(check_package checkpackage-backend.cpp)
target_link_libraries(check_package PRIVATE ${APT_PKG_LIB})

View File

@ -1,573 +0,0 @@
#include "PackageSelectProcess.h"
#include "GlobalStorage.h"
#include "JobQueue.h"
#include <QProcess>
#include <QDebug>
#include <QDir>
#include <QCoreApplication>
#include <QRegularExpression>
#include <QFile>
CALAMARES_PLUGIN_FACTORY_DEFINITION(PackageSelectProcessFactory, registerPlugin<PackageSelectProcess>();)
PackageSelectProcess::PackageSelectProcess(QObject* parent)
: Calamares::CppJob(parent),
m_prettyStatus(tr("Preparing to install selected packages..."))
{
}
QString PackageSelectProcess::prettyName() const
{
return tr("Installing selected packages");
}
QString PackageSelectProcess::prettyStatusMessage() const
{
return m_prettyStatus;
}
void PackageSelectProcess::setConfigurationMap(const QVariantMap& configurationMap)
{
m_configurationMap = configurationMap;
}
Calamares::JobResult PackageSelectProcess::runAptCommand(const QString& command,
const QString& rootMountPoint,
double startProgress,
double endProgress,
bool verboseProgress)
{
qDebug() << "Running apt command:" << command;
QProcess aptProcess(this);
aptProcess.setProgram("/usr/sbin/chroot");
aptProcess.setArguments({ rootMountPoint, "/bin/bash", "-c", command });
aptProcess.setProcessChannelMode(QProcess::MergedChannels);
constexpr int MAX_LINES = 5000;
double progressRange = endProgress - startProgress;
double progressPerLine = progressRange / static_cast<double>(MAX_LINES);
int lineCount = 0;
QString commandHRPrefix;
if (command.contains("install")) {
commandHRPrefix = tr("Installing packages: ");
} else if (command.contains("full-upgrade")) {
commandHRPrefix = tr("Upgrading installed system: ");
} else if (command.contains("remove")) {
commandHRPrefix = tr("Cleaning up packages: ");
} else if (command.contains("cdrom")) {
commandHRPrefix = tr("cdrom: ");
}
QRegularExpression getRegex(R"(Get:\d+\s+[^ ]+\s+[^ ]+\s+(.+?)\s+\S+\s+(\S+)\s+\[(.*?)\])");
connect(&aptProcess, &QProcess::readyReadStandardOutput, this,
[this, &lineCount, progressPerLine, startProgress, endProgress, verboseProgress, commandHRPrefix, getRegex]() {
QProcess *aptProcess = (QProcess *)(QObject::sender());
if (aptProcess == NULL) return;
while (aptProcess->canReadLine()) {
QString line = QString::fromUtf8(aptProcess->readLine()).trimmed();
qDebug() << "Apt log line: " << line;
if (line.isEmpty()) {
continue;
}
if (verboseProgress && !line.contains("Running in chroot, ignoring command") &&
!line.contains("Waiting until unit") && !line.contains("Stopping snap") &&
!line.contains("/dev/pts")) {
// Process "Get:" lines to show download information
if (line.startsWith("Get:")) {
QRegularExpressionMatch match = getRegex.match(line);
if (match.hasMatch()) {
QString packageName = match.captured(1);
QString packageVersion = match.captured(2);
QString packageSize = match.captured(3);
line = tr("Downloading %1 %2 (%3)").arg(packageName, packageVersion, packageSize);
}
}
m_prettyStatus = commandHRPrefix + line;
emit prettyStatusMessageChanged(m_prettyStatus);
qDebug() << m_prettyStatus;
}
lineCount++;
double currentProgress = startProgress + (lineCount * progressPerLine);
currentProgress = qBound(startProgress, currentProgress, endProgress);
emit progress(currentProgress);
}
});
aptProcess.start();
if (!aptProcess.waitForStarted()) {
qWarning() << "Failed to start apt command:" << aptProcess.errorString();
return Calamares::JobResult::error(tr("Apt command failed"),
tr("Failed to start apt command: %1").arg(aptProcess.errorString()));
}
while (!aptProcess.waitForFinished(100)) {
QCoreApplication::processEvents();
}
if (aptProcess.exitStatus() != QProcess::NormalExit || aptProcess.exitCode() != 0) {
QString errorOutput = QString::fromUtf8(aptProcess.readAllStandardError()).trimmed();
qWarning() << "Apt command error:" << errorOutput;
return Calamares::JobResult::error(tr("Apt command failed"),
tr("Failed to execute apt command: %1").arg(errorOutput));
}
emit progress(endProgress);
m_prettyStatus = tr("Command executed successfully.");
emit prettyStatusMessageChanged(m_prettyStatus);
return Calamares::JobResult::ok();
}
Calamares::JobResult PackageSelectProcess::runSnapCommand(const QStringList& snapPackages,
const QString& rootMountPoint,
double startProgress,
double endProgress)
{
const QString seedDirectory = QDir::cleanPath(rootMountPoint + "/var/lib/snapd/seed");
QDir dir(seedDirectory);
if (!dir.exists() && !dir.mkpath(".")) {
return Calamares::JobResult::error(tr("Snap installation failed"),
tr("Failed to create seed directory: %1").arg(seedDirectory));
}
QStringList snapCommandArgs = { "--seed", seedDirectory };
snapCommandArgs += snapPackages;
qDebug() << "Executing Snap Command:" << snapCommandArgs.join(" ");
QProcess snapProcess(this);
snapProcess.setProgram("/usr/bin/snapd-seed-glue");
snapProcess.setArguments(snapCommandArgs);
snapProcess.setProcessChannelMode(QProcess::MergedChannels);
QString currentDescription;
connect(&snapProcess, &QProcess::readyReadStandardOutput, this,
[&snapProcess, this, &currentDescription, startProgress, endProgress]( ) {
while (snapProcess.canReadLine()) {
QString line = QString::fromUtf8(snapProcess.readLine()).trimmed();
if (line.isEmpty()) {
continue;
}
QStringList parts = line.split("\t");
if (parts.size() != 2) {
qWarning() << "Unexpected output format from snap-seed-glue:" << line;
continue;
}
bool ok = false;
double percentage = parts[0].toDouble(&ok);
const QString& description = parts[1];
if (!ok) {
qWarning() << "Failed to parse percentage from line:" << line;
continue;
}
if (description != currentDescription) {
m_prettyStatus = description;
emit prettyStatusMessageChanged(m_prettyStatus);
currentDescription = description;
qDebug() << description;
}
double scaledProgress = startProgress + (percentage / 100.0) * (endProgress - startProgress);
emit progress(scaledProgress);
}
});
m_prettyStatus = tr("Installing snap packages...");
emit prettyStatusMessageChanged(m_prettyStatus);
emit progress(startProgress);
snapProcess.start();
if (!snapProcess.waitForStarted()) {
qWarning() << "Failed to start snap installation process:" << snapProcess.errorString();
return Calamares::JobResult::error(tr("Snap installation failed"),
tr("Failed to start snap installation process: %1").arg(snapProcess.errorString()));
}
while (!snapProcess.waitForFinished(100)) {
QCoreApplication::processEvents();
}
if (snapProcess.exitStatus() != QProcess::NormalExit || snapProcess.exitCode() != 0) {
QString errorOutput = QString::fromUtf8(snapProcess.readAllStandardError()).trimmed();
qWarning() << "Snap installation error:" << errorOutput;
return Calamares::JobResult::error(tr("Snap installation failed"),
tr("Failed to install snap packages: %1").arg(errorOutput));
}
emit progress(endProgress);
m_prettyStatus = tr("Snap packages installed successfully!");
emit prettyStatusMessageChanged(m_prettyStatus);
return Calamares::JobResult::ok();
}
void PackageSelectProcess::divert(bool enable)
{
for (auto it = dpkgDiversions.constBegin(); it != dpkgDiversions.constEnd(); ++it) {
const QString& name = it.key();
const QString& path = it.value();
QString divertedPath = path + ".REAL";
QString command;
if (enable) {
qDebug() << tr("Adding diversion for %1...").arg(name);
command = QString("dpkg-divert --quiet --add --divert %1 --rename %2")
.arg(divertedPath, path);
} else {
qDebug() << tr("Removing diversion for %1...").arg(name);
QFile::remove(rootMountPoint + path);
command = QString("dpkg-divert --quiet --remove --rename %1").arg(path);
}
// Set up the QProcess to run the command in chroot
QProcess process;
process.setProgram("/usr/sbin/chroot");
process.setArguments({ rootMountPoint, "/bin/bash", "-c", command });
process.setProcessChannelMode(QProcess::MergedChannels);
// Run the process
process.start();
if (!process.waitForFinished()) {
qWarning() << "Process error:" << process.errorString();
continue;
}
if (process.exitStatus() != QProcess::NormalExit || process.exitCode() != 0) {
qWarning() << "Error handling diversion for" << name << ":" << process.readAll();
continue;
}
if (!enable) { continue; }
// Create the replacement script in chroot
QString scriptContent = QString(
"#!/bin/sh\n"
"echo \"%1: diverted (will be called later)\" >&1\n"
"exit 0\n"
).arg(name);
QString scriptPath = rootMountPoint + path;
QFile scriptFile(scriptPath);
if (!scriptFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
qWarning() << "Error creating script for" << name << ":" << scriptFile.errorString();
continue;
}
QTextStream out(&scriptFile);
out << scriptContent;
scriptFile.close();
// Make the script executable
QFile::setPermissions(scriptPath, QFile::permissions(scriptPath) | QFile::ExeOwner | QFile::ExeGroup | QFile::ExeOther);
}
}
Calamares::JobResult PackageSelectProcess::exec()
{
auto gs = Calamares::JobQueue::instance()->globalStorage();
if (!gs || !gs->contains("installation_data")) {
return Calamares::JobResult::error(tr("No installation data found."),
tr("Installation data is missing from global storage."));
}
const QVariantMap installationData = gs->value("installation_data").toMap();
const QString installationMode = installationData.value("installation_mode").toString();
const bool hasInternet = gs->value("hasInternet").toBool();
const bool downloadUpdates = (installationData.value("download_updates").toBool() && hasInternet);
const QVariantList packagesToInstall = installationData.value("packages_to_install").toList();
const QVariantList packagesToRemove = installationData.value("packages_to_remove").toList();
const QVariantList presentSnaps = installationData.value("present_snaps").toList();
// Handle default value for rootMountPoint
rootMountPoint = "/";
if (gs->contains("rootMountPoint")) {
rootMountPoint = gs->value("rootMountPoint").toString();
}
const QString checkpackage_path = "/usr/libexec/checkpackage-backend";
const QString chroot_checkpackage_path = rootMountPoint + checkpackage_path;
QFile* cpbe = new QFile(chroot_checkpackage_path);
static const QMap<QString, QVector<ProgressAllocation>> allocationMap = {
{ "minimal", { {0.0, 1.0} } },
{ "normal", { {0.0, 0.4}, {0.4, 1.0} } },
{ "full", { {0.0, 0.25}, {0.25, 1.0} } }
};
const QVector<ProgressAllocation> allocations = allocationMap.value(installationMode, { {0.0, 1.0} });
const double aptRange = allocations[0].end - allocations[0].start;
const double updateStart = allocations[0].start;
const double updateEnd = updateStart + 0.1 * aptRange;
// Temporarily copy ubuntu.sources elsewhere, if we do not have network
// This is so we can update the apt cache safely
// FIXME: there has to be a better, more native way to do this. It works
// for now, but in the 25.10 cycle, we're probably going to move some of
// these command-line apt calls to the libapt C library. LP: #2107287
if (!hasInternet) {
const QString ubuntu_sources_path = rootMountPoint + "/etc/apt/sources.list.d/ubuntu.sources";
QFile* ubuntu_sources = new QFile(ubuntu_sources_path);
// Just in case this module is used in a non-Ubuntu environment, make sure ubuntu.sources exists
// TODO: make this configurable in the 25.10 cycle
if (ubuntu_sources->exists()) {
const QString backup_name = ubuntu_sources_path + ".bak";
if (!ubuntu_sources->rename(ubuntu_sources_path + ".bak")) {
return Calamares::JobResult::error(tr("Internal Error"),
tr("Permission denied when moving ubuntu.sources to prepare for offline install"));
}
Calamares::JobResult addCdromResult = runAptCommand("apt-cdrom add -m -d=/media/cdrom/", rootMountPoint, updateStart, updateEnd, true);
if (!addCdromResult) return std::move(addCdromResult);
} else {
return Calamares::JobResult::error(tr("Internal Error"),
tr("/etc/apt/sources.list.d/ubuntu.sources not found in the target, are you a downstream?"));
}
}
// Run apt update
m_prettyStatus = tr("Updating apt cache");
emit prettyStatusMessageChanged(m_prettyStatus);
emit progress(updateStart);
Calamares::JobResult updateResult = runAptCommand("DEBIAN_FRONTEND=noninteractive apt-get update",
rootMountPoint,
updateStart,
updateEnd,
false);
if (!updateResult) { // Using operator bool() to check for errors
return std::move(updateResult); // Move to avoid copy
}
QStringList debPackages;
for (const QVariant& var : packagesToInstall) {
const QVariantMap pkg = var.toMap();
if (!pkg.value("snap").toBool()) {
debPackages << pkg.value("id").toString();
}
}
// Add diversions for dracut, update-initramfs, and locale-gen
/*
dpkgDiversions = {
{"dracut", "/usr/bin/dracut"},
{"update-initramfs", "/usr/sbin/update-initramfs"},
{"locale-gen", "/usr/sbin/locale-gen"}
};
divert(true);
*/
double installStart;
double installEnd;
if (downloadUpdates) {
const double upgradeStart = updateEnd;
const double upgradeEnd = upgradeStart + 0.25 * aptRange;
Calamares::JobResult upgradeResult = runAptCommand(
"DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::='--force-confnew' full-upgrade",
rootMountPoint,
upgradeStart,
upgradeEnd,
true
);
if (!upgradeResult) { // Using operator bool() to check for errors
return std::move(upgradeResult); // Move to avoid copy
}
installStart = upgradeEnd;
installEnd = installStart + 0.25 * aptRange;
}
else {
installStart = updateEnd;
installEnd = installStart + 0.5 * aptRange;
installEnd = qMin(installEnd, allocations[0].end);
}
qDebug() << "Progress range: installStart:" << installStart << "installEnd:" << installEnd;
if (!debPackages.isEmpty()) {
// Corresponding to the temporary hack in pkgselect adding calamares
// and kdialog to the list, we only want those two included in the
// final installation if we're actually in OEM mode. Otherwise, they
// can be ignored, and are just clutter.
// FIXME: When the OEM stack is rewritten in 25.10, this needs to be
// removed.
if (!QFile::exists("/etc/calamares/OEM_MODE_ACTIVATED")) {
QStringList wip_list;
for (auto debPackage : debPackages) {
if (!debPackage.contains(QString("calamares")) &&
!debPackage.contains(QString("kdialog"))) {
wip_list << debPackage;
}
}
debPackages = wip_list;
}
// checkpackage-backend needs to be explicitly copied to the chroot
// and removed later for systems with stacked squashfses, or the
// install command will fail. LP: #2104243
if (!cpbe->exists()) {
QFile* parent_cpbe = new QFile(checkpackage_path);
if (!parent_cpbe->copy(chroot_checkpackage_path)) {
return Calamares::JobResult::error(tr("Internal Error"),
tr("Permission denied when copying checkpackage-backend, are you running Calamares correctly?"));
}
}
const QString packageList = debPackages.join(" ");
const QString installCommand = QString("DEBIAN_FRONTEND=noninteractive apt-get -y install $(/usr/libexec/checkpackage-backend %1);").arg(packageList);
Calamares::JobResult installResult = runAptCommand(installCommand,
rootMountPoint,
installStart,
installEnd,
true);
if (!installResult) {
if (!cpbe->remove()) qDebug() << "Warning: failed to clean up /usr/libexec/checkpackage-backend";
return std::move(installResult);
}
}
else qDebug() << "No packages to install.";
QStringList removeDebPackages;
for (const QVariant& var : packagesToRemove) {
removeDebPackages << var.toString();
}
// As part of the fix for LP: #2104343, we need to ensure that, if
// we are currently in OEM mode, Calamares and friends remain
// installed. During stage two, we clean it up.
// FIXME: When the OEM stack is rewritten in 25.10, this needs to be
// rewritten.
if (QFile::exists("/etc/calamares/OEM_MODE_ACTIVATED")) {
QStringList wip_list;
for (auto removeDebPackage : removeDebPackages) {
if (!removeDebPackage.contains(QString("calamares"))) wip_list << removeDebPackage;
}
removeDebPackages = wip_list;
}
const double removeStart = installEnd;
const double removeEnd = removeStart + 0.2 * aptRange;
if (!removeDebPackages.isEmpty()) {
const QString removeCommand = QString("DEBIAN_FRONTEND=noninteractive apt-get -y --purge remove $(/usr/libexec/checkpackage-backend %1);")
.arg(removeDebPackages.join(" "));
Calamares::JobResult removeResult = runAptCommand(removeCommand,
rootMountPoint,
removeStart,
removeEnd,
true);
if (!removeResult) return std::move(removeResult);
}
const double autoremoveStart = removeEnd;
const double autoremoveEnd = autoremoveStart + 0.2 * aptRange;
Calamares::JobResult autoremoveResult = runAptCommand("DEBIAN_FRONTEND=noninteractive apt-get -y autoremove",
rootMountPoint,
autoremoveStart,
autoremoveEnd,
true);
// Disable diversions
//divert(false);
// Move ubuntu.sources back, and clean up the cdrom file
// FIXME: there has to be a better, more native way to do this. It works
// for now, but in the 25.10 cycle, we're probably going to move some of
// these command-line apt calls to the libapt C library. LP: #2107287
try {
if (!hasInternet) {
const QString ubuntu_sources_path = rootMountPoint + "/etc/apt/sources.list.d/ubuntu.sources";
const QString backup_name = ubuntu_sources_path + ".bak";
QFile* ubuntu_sources = new QFile(ubuntu_sources_path);
QFile* ubuntu_sources_bak = new QFile(backup_name);
// Just in case this module is used in a non-Ubuntu environment, make sure ubuntu.sources exists
// TODO: make this configurable in the 25.10 cycle
if (ubuntu_sources->exists()) {
if (!ubuntu_sources->remove()) {
return Calamares::JobResult::error(tr("Internal Error"),
tr("/etc/apt/sources.list.d/ubuntu.sources already exists and it won't budge - this is a rare edge case, please report!"));
}
}
if (!ubuntu_sources_bak->rename(ubuntu_sources_path)) {
return Calamares::JobResult::error(tr("Internal Error"),
tr("Permission denied when moving ubuntu.sources back after offline install"));
}
// Remove the apt-cdrom entry we added earlier
// This may seem drastic, but we already expect that the automirror
// module, ran before this, creates a deb822-style ubuntu.sources
QFile* cdrom_sources_list = new QFile(rootMountPoint + "/etc/apt/sources.list");
if (!cdrom_sources_list->remove()) {
return Calamares::JobResult::error(tr("Internal Error"),
tr("Failed to remove classic sources.list file"));
}
}
} catch (const std::exception &exc) {
qDebug() << exc.what();
} catch (...) {
qDebug() << "Caught unknown error";
}
// Handle snap packages
if (installationMode != "minimal") {
QStringList snapPackages;
QStringList presentSnapsList;
// Convert QVariantList to QStringList
for (const QVariant& var : presentSnaps) {
presentSnapsList << var.toString();
}
for (const QVariant& var : packagesToInstall) {
const QVariantMap pkg = var.toMap();
if (pkg.value("snap").toBool()) {
snapPackages << pkg.value("id").toString();
}
}
QStringList finalSnapPackages;
if (!snapPackages.isEmpty() && !presentSnapsList.isEmpty()) {
finalSnapPackages = presentSnapsList + snapPackages;
}
else if (!snapPackages.isEmpty()) {
finalSnapPackages = snapPackages;
}
else if (!presentSnapsList.isEmpty() && downloadUpdates) {
finalSnapPackages = presentSnapsList;
}
if (!finalSnapPackages.isEmpty()) {
double snapStart = allocations.size() > 1 ? allocations[1].start : allocations[0].end;
double snapEnd = allocations.size() > 1 ? allocations[1].end : allocations[0].end;
Calamares::JobResult snapResult = runSnapCommand(finalSnapPackages,
rootMountPoint,
snapStart,
snapEnd);
if (!snapResult) { // Using operator bool() to check for errors
return std::move(snapResult); // Move to avoid copy
}
}
}
emit progress(1.0);
m_prettyStatus = tr("All selected packages installed successfully.");
emit prettyStatusMessageChanged(m_prettyStatus);
if (!cpbe->remove()) qDebug() << "Warning: failed to clean up /usr/libexec/checkpackage-backend";
return Calamares::JobResult::ok();
}

View File

@ -1,60 +0,0 @@
#ifndef PACKAGESELECTPROCESS_H
#define PACKAGESELECTPROCESS_H
#include <QMap>
#include <QObject>
#include <QString>
#include <QVariantMap>
#include "CppJob.h"
#include "utils/PluginFactory.h"
#include "DllMacro.h"
class QProcess;
class PLUGINDLLEXPORT PackageSelectProcess : public Calamares::CppJob
{
Q_OBJECT
public:
explicit PackageSelectProcess(QObject* parent = nullptr);
~PackageSelectProcess() override = default;
QString prettyName() const override;
QString prettyStatusMessage() const override;
Calamares::JobResult exec() override;
void setConfigurationMap(const QVariantMap& configurationMap) override;
signals:
void prettyStatusMessageChanged(const QString&);
private:
struct ProgressAllocation
{
double start;
double end;
};
Calamares::JobResult runAptCommand(const QString& command,
const QString& rootMountPoint,
double startProgress,
double endProgress,
bool verboseProgress);
Calamares::JobResult runSnapCommand(const QStringList& snapPackages,
const QString& rootMountPoint,
double startProgress,
double endProgress);
void divert(bool enable);
QMap<QString, QString> dpkgDiversions;
QString rootMountPoint;
QVariantMap m_configurationMap;
QString m_prettyStatus;
};
CALAMARES_PLUGIN_FACTORY_DECLARATION(PackageSelectProcessFactory)
#endif // PACKAGESELECTPROCESS_H

View File

@ -1,54 +0,0 @@
#include <iostream>
#include <string>
#include <unordered_set>
#include <apt-pkg/algorithms.h>
#include <apt-pkg/cacheiterators.h>
#include <apt-pkg/init.h>
#include <apt-pkg/cachefile.h>
#include <apt-pkg/pkgcache.h>
#include <apt-pkg/pkgsystem.h>
#include <apt-pkg/progress.h>
int main(int argc, char* argv[]) {
pkgInitConfig(*_config);
pkgInitSystem(*_config, _system);
if (_system == 0) {
std::cerr << "apt-pkg not initialized\n";
return 1;
}
// Open the package cache.
pkgCacheFile *cache = new pkgCacheFile();
OpProgress progress;
if (!cache || cache->Open(&progress, false) == false) {
std::cerr << "Error: could not open APT cache.\n";
return 1;
}
pkgApplyStatus(*cache);
std::vector<std::string> package_names(argv + 1, argv + argc);
if (package_names.empty()) return 0;
std::unordered_set<std::string> seen_packages;
for (std::string package_name : package_names) {
if (seen_packages.contains(package_name)) continue;
seen_packages.insert(package_name);
// Tasks and wildcards should just be passed through as-is, for now
if (package_name.starts_with('^') || package_name.contains('*')) {
std::cout << package_name << " ";
continue;
}
pkgCache::GrpIterator grp = cache->GetPkgCache()->FindGrp(package_name);
if (!grp.end()) {
pkgCache::PkgIterator it = grp.FindPreferredPkg(true);
if (!it.end() && !it.VersionList().end()) {
std::cout << package_name << " ";
}
}
}
std::cout << "\n";
cache->Close();
return 0;
}

View File

@ -1,7 +0,0 @@
---
type: "job"
name: "pkgselectprocess"
interface: "qtplugin"
load: "libcalamares_job_pkgselectprocess.so"
noconfig: true
weight: 12

View File

@ -1,5 +0,0 @@
---
dontChroot: false
timeout: 30
script:
- command: "/usr/bin/dpkg --add-architecture i386"

View File

@ -1,5 +0,0 @@
---
dontChroot: false
timeout: 30
script:
- "touch ${ROOT}/boot/initrd.img-$(uname -r)"

View File

@ -1,7 +0,0 @@
---
dontChroot: false
timeout: 120
script:
- "sed -i 's/oem:x:1000:1000/oem:x:60999:60999/' /etc/passwd"
- "sed -i 's/oem:x:1000/oem:x:60999/' /etc/group"
- "chown -R 60999:60999 /home/oem"

View File

@ -1,5 +0,0 @@
---
dontChroot: true
timeout: 30
script:
- /usr/libexec/fixconkeys-part1 ${ROOT}

View File

@ -1,5 +0,0 @@
---
dontChroot: false
timeout: 10800
script:
- /usr/libexec/fixconkeys-part2

View File

@ -1,4 +0,0 @@
---
# Setting emergency to true will make it so this module is still run
# when a prior module fails
emergency: true

View File

@ -1,10 +0,0 @@
kubuntu/branding/ etc/calamares/
kubuntu/calamares-launch-normal usr/bin/
kubuntu/calamares-logs-helper usr/bin/
kubuntu/kubuntu-calamares.desktop usr/share/applications/
kubuntu/modules/ etc/calamares/
kubuntu/oem/calamares-launch-oem usr/bin/
kubuntu/oem/calamares-launch-oem.desktop usr/share/applications/
kubuntu/oem/calamares-oemprep.sh usr/libexec/
kubuntu/oemconfig.tar.gz etc/calamares/
kubuntu/settings.conf etc/calamares/

View File

@ -1,7 +0,0 @@
# sudo will always be present in the target system
calamares-settings-kubuntu: desktop-command-not-in-package sudo *
# there will be no manpage for any of this in the foreseeable future
calamares-settings-kubuntu: no-manual-page *
# We're just extracting a log file and preserving it for the user to look at
# after the installation, this is normal.
calamares-settings-kubuntu: uses-dpkg-database-directly [usr/bin/calamares-logs-helper]

View File

@ -1,12 +1,5 @@
lubuntu/branding/ etc/calamares/
lubuntu/calamares-launch-normal usr/bin/
lubuntu/calamares.desktop etc/skel/Desktop/
lubuntu/calamares-logs-helper usr/bin/
lubuntu/lubuntu-calamares.desktop usr/share/applications/
lubuntu/lubuntu-installer.svg usr/share/icons/hicolor/scalable/apps/
lubuntu/branding/ etc/calamares/
lubuntu/modules/ etc/calamares/
lubuntu/oem/calamares-launch-oem usr/bin/
lubuntu/oem/calamares-launch-oem.desktop usr/share/applications/
lubuntu/oem/calamares-oemprep.sh usr/libexec/
lubuntu/oem/calamares-raspiprep.sh usr/libexec/
lubuntu/oemconfig.tar.gz etc/calamares/
lubuntu/settings.conf etc/calamares/

View File

@ -1,7 +1,3 @@
# sudo will always exist in the target system
calamares-settings-lubuntu: desktop-command-not-in-package sudo *
# there will be no manpage for any of this in the foreseeable future
calamares-settings-lubuntu: no-manual-page *
# We're just extracting a log file and preserving it for the user to look at
# after the installation, this is normal.
calamares-settings-lubuntu: uses-dpkg-database-directly [usr/bin/calamares-logs-helper]
# Although it's technically against policy, in this case it's justified because it's the only way
calamares-settings-lubuntu: package-contains-file-in-etc-skel etc/skel/Desktop/
calamares-settings-lubuntu: package-contains-file-in-etc-skel etc/skel/Desktop/calamares.desktop

View File

@ -1 +0,0 @@
usr/lib/calamares/modules/automirror usr/lib/${DEB_HOST_MULTIARCH}/calamares/modules/automirror

View File

@ -1,12 +0,0 @@
ubuntuunity/branding/ etc/calamares/
ubuntuunity/calamares-launch-normal usr/bin/
ubuntuunity/calamares-logs-helper usr/bin/
ubuntuunity/kvantum.kvconfig etc/xdg/Kvantum/
ubuntuunity/modules/ etc/calamares/
ubuntuunity/oem/calamares-launch-oem usr/bin/
ubuntuunity/oem/calamares-launch-oem.desktop usr/share/applications/
ubuntuunity/oem/calamares-oemprep.sh usr/libexec/
ubuntuunity/oemconfig.tar.gz etc/calamares/
ubuntuunity/settings.conf etc/calamares/
ubuntuunity/ubuntu-unity-calamares.desktop usr/share/applications/
ubuntuunity/ubuntu-unity-installer.svg usr/share/icons/hicolor/scalable/apps/

View File

@ -1,7 +0,0 @@
# sudo will always be present in the target system
calamares-settings-ubuntu-unity: desktop-command-not-in-package sudo *
# there will be no manpage for any of this in the foreseeable future
calamares-settings-ubuntu-unity: no-manual-page *
# We're just extracting a log file and preserving it for the user to look at
# after the installation, this is normal.
calamares-settings-ubuntu-unity: uses-dpkg-database-directly [usr/bin/calamares-logs-helper]

1247
debian/changelog vendored

File diff suppressed because it is too large Load Diff

1
debian/compat vendored Normal file
View File

@ -0,0 +1 @@
11

102
debian/control vendored
View File

@ -3,102 +3,14 @@ Section: devel
Priority: optional
Maintainer: Lubuntu Developers <lubuntu-devel@lists.ubuntu.com>
Uploaders: Simon Quigley <tsimonq2@ubuntu.com>
Build-Depends: debhelper-compat (= 13),
dh-sequence-qmldeps,
cmake,
extra-cmake-modules,
fakeroot,
intltool,
libapt-pkg-dev,
libcalamares-dev (>= 3.3.13-0ubuntu4),
libkf6coreaddons-dev,
libqt6svg6-dev,
libyaml-cpp-dev,
python3,
qt6-base-dev,
qt6-declarative-dev,
qt6-l10n-tools,
qt6-tools-dev,
qt6-tools-dev-tools
Standards-Version: 4.7.2
Homepage: https://code.launchpad.net/~ubuntu-qt-code/+git/calamares-settings-ubuntu
Vcs-Browser: https://git.launchpad.net/~ubuntu-qt-code/+git/calamares-settings-ubuntu
Vcs-Git: https://git.launchpad.net/~ubuntu-qt-code/+git/calamares-settings-ubuntu
Rules-Requires-Root: no
Package: calamares-settings-kubuntu
Architecture: all
Depends: calamares-settings-ubuntu-common (>= ${binary:Version}),
${misc:Depends},
${qml6:Depends}
Conflicts: calamares-settings-ubuntu-flavor
Provides: calamares-settings-ubuntu-flavor
Description: Kubuntu Calamares Settings and Branding
This package contains the Calamares settings and branding for Kubuntu.
As part of the branding the installer slideshow is contained within.
The settings ensure a proper Kubuntu desktop is installed with the
KDE Plasma desktop environment.
Build-Depends: debhelper (>= 11), intltool, qttools5-dev-tools
Standards-Version: 4.1.5
Homepage: https://code.launchpad.net/ubuntu-calamares-settings
Vcs-Git: https://git.launchpad.net/ubuntu-calamares-settings
Vcs-Browser: https://git.launchpad.net/ubuntu-calamares-settings
Package: calamares-settings-lubuntu
Architecture: all
Depends: calamares-settings-ubuntu-common (>= ${binary:Version}),
${misc:Depends},
${qml6:Depends}
Recommends: lubuntu-installer-prompt
Conflicts: calamares-settings-ubuntu-flavor
Provides: calamares-settings-ubuntu-flavor
Depends: calamares, squashfs-tools, ${misc:Depends}
Description: Lubuntu Calamares Settings and Branding
This package contains the Calamares settings and branding for Lubuntu.
As part of the branding the installer slideshow is contained within.
The settings ensure a proper Lubuntu desktop is installed with the
LXQt desktop environment.
Package: calamares-settings-ubuntu-unity
Architecture: all
Depends: calamares-settings-ubuntu-common (>= ${binary:Version}),
qt6-style-kvantum,
qt6-style-kvantum-themes,
${misc:Depends},
${qml6:Depends}
Conflicts: calamares-settings-ubuntu-flavor
Provides: calamares-settings-ubuntu-flavor
Description: Ubuntu Unity Calamares Settings and Branding
This package contains the Calamares settings and branding for Ubuntu Unity.
As part of the branding the installer slideshow is contained within.
The settings ensure a proper Ubuntu Unity desktop is installed with the
Unity desktop environment.
Package: calamares-settings-ubuntu-common
Architecture: any
Depends: calamares (>= 3.3.13-0ubuntu4),
calamares-settings-ubuntu-common-data (= ${binary:Version}),
cryptsetup,
dracut-core,
kdialog,
keyutils,
libglib2.0-bin,
snapd-seed-glue,
squashfs-tools,
sudo,
${misc:Depends},
${shlibs:Depends}
Description: Common Calamares Settings
This package contains the common Calamares settings for all flavors.
There is also a automirror Python script to set sources based on
geolocation.
.
Common settings for all Ubuntu flavors.
Package: calamares-settings-ubuntu-common-data
Architecture: all
Depends: ${misc:Depends},
python3,
python3-distro,
Conflicts: calamares-settings-ubuntu-common (<< 1:25.04.16)
Replaces: calamares-settings-ubuntu-common (<< 1:25.04.16)
Description: Data for Common Calamares Settings
This package contains the common Calamares settings for all flavors.
There is also a automirror Python script to set sources based on
geolocation.
.
Architecture-independent data for the common Calamares settings.
This package contains the calamares settings and branding for Lubuntu Next.

29
debian/copyright vendored
View File

@ -2,10 +2,7 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Files: *
Copyright: 2014 Rohan Garg <shadeslayer@systems>
2020 Ubuntu Studio Developers <ubuntu-studio-devel@lists.ubuntu.com>
2024 Kubuntu Developers <kubuntu-devel@lists.ubuntu.com>
2024 Ubuntu Unity Developers
2017-2024 Lubuntu Developers <lubuntu-devel@lists.ubuntu.com>
2017-2018 Lubuntu Developers <lubuntu-devel@lists.ubuntu.com>
License: GPL-3+
This package is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -22,27 +19,3 @@ License: GPL-3+
.
On Debian systems, the complete text of the GNU General
Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
Files: ubuntuunity/ubuntu-unity-installer.svg
Copyright: 2014 Uri Herrera <uri_herrera@nitrux.in> and others
2024 Ubuntu Unity Developers
License: LGPL-3+
This package is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
.
This package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
.
On Debian systems, the complete text of the GNU Lesser General
Public License version 3 can be found in "/usr/share/common-licenses/LGPL-3".
Comment:
Adapted from the Breeze icon theme. See
https://develop.kde.org/frameworks/breeze-icons for more information about
Breeze icons.

View File

@ -1 +0,0 @@
calamares.slideshow calamares

49
debian/rules vendored
View File

@ -1,53 +1,4 @@
#!/usr/bin/make -f
export LC_ALL=C.UTF-8
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
export GOPATH=/usr/share/gocode
export GO111MODULE=off
export GOCACHE=$(CURDIR)/.gocache
export PKGSELECT = "common/modules/pkgselect"
export PKGSELECTPROCESS = "common/modules/pkgselectprocess"
export USRDIR = "debian/calamares-settings-ubuntu-common/usr"
export DATA_USRDIR = "debian/calamares-settings-ubuntu-common-data/usr"
export MODULES_DIR = "debian/calamares-settings-ubuntu-common/usr/lib/$(DEB_HOST_MULTIARCH)/calamares/modules"
export DATA_MODULES_DIR = "debian/calamares-settings-ubuntu-common-data/usr/lib/calamares/modules"
DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
%:
dh $@
override_dh_auto_configure:
(cd $(PKGSELECT) && mkdir build && cd build && cmake ..)
(cd $(PKGSELECTPROCESS) && mkdir build && cd build && cmake ..)
override_dh_auto_build:
make;
(cd $(PKGSELECT)/build && $(MAKE))
(cd $(PKGSELECTPROCESS)/build && $(MAKE))
override_dh_auto_clean:
dh_auto_clean
rm -rf $(GOCACHE)
override_dh_auto_install:
(cd $(PKGSELECT)/build && $(MAKE) DESTDIR=$(CURDIR)/debian/calamares-settings-ubuntu-common/ install)
override_dh_missing:
dh_missing
mkdir -pv $(MODULES_DIR) $(DATA_MODULES_DIR)
cp -vr common/modules/automirror $(DATA_MODULES_DIR)
mkdir -pv debian/calamares-settings-ubuntu-common-data/etc/calamares/modules
cp -vr common/modules/*.conf debian/calamares-settings-ubuntu-common-data/etc/calamares/modules
chmod 644 $(DATA_MODULES_DIR)/automirror/automirror.conf
chmod 644 $(DATA_MODULES_DIR)/automirror/module.desc
chmod 644 $(MODULES_DIR)/pkgselect/libcalamares_viewmodule_pkgselect.so
chmod 644 $(MODULES_DIR)/pkgselect/module.desc
mkdir -pv $(MODULES_DIR)/pkgselectprocess
cp -v $(PKGSELECTPROCESS)/build/*.so $(PKGSELECTPROCESS)/build/*.desc $(MODULES_DIR)/pkgselectprocess
chmod 644 $(MODULES_DIR)/pkgselectprocess/libcalamares_job_pkgselectprocess.so
chmod 644 $(MODULES_DIR)/pkgselectprocess/module.desc
mkdir -pv $(USRDIR)/libexec/ $(DATA_USRDIR)/libexec/
cp -v common/fixconkeys-part1 $(DATA_USRDIR)/libexec/fixconkeys-part1
cp -v common/fixconkeys-part2 $(DATA_USRDIR)/libexec/fixconkeys-part2
cp -v $(PKGSELECTPROCESS)/build/check_package $(USRDIR)/libexec/checkpackage-backend

View File

@ -1,21 +0,0 @@
# Kubuntu's Calamares Settings
This directory houses the Calamares settings for Kubuntu.
Unless otherwise stated, the contents of this directory are licensed as follows:
Copyright (C) 2018 Lubuntu Developers <lubuntu-devel@lists.ubuntu.com>
Copyright (C) 2024 Kubuntu Developers <kubuntu-devel@lists.ubuntu.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this software. If not, see <http://www.gnu.org/licenses/>.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

View File

@ -1,29 +0,0 @@
---
componentName: kubuntu
windowExpanding: fullscreen
strings:
productName: Kubuntu
shortProductName: Kubuntu
version: 25.04
shortVersion: plucky
versionedName: Kubuntu
shortVersionedName: Kubuntu 25.04
bootloaderEntryName: Kubuntu
productUrl: https://kubuntu.org/
supportUrl: https://kubuntu.org/contact/
images:
productLogo: "logo.png"
productIcon: "icon.png"
productWelcome: "welcome.png"
slideshow: "show.qml"
slideshowAPI: 1
style:
SidebarBackground: "#6C7B93"
SidebarText: "#FFFFFF"
SidebarTextCurrent: "#0068C8"

Some files were not shown because too many files have changed in this diff Show More