New port: x11/sddm

sddm is a QML based X11 and Wayland display manager
  https://github.com/sddm/sddm

Reviewed by:	rakuco, groot_kde.org
Differential Revision:	https://reviews.freebsd.org/D11619
This commit is contained in:
Tobias C. Berner 2017-09-06 19:32:40 +00:00
parent 65c3338c8c
commit b9272ca006
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=449358
20 changed files with 512 additions and 3 deletions

2
GIDs
View file

@ -160,7 +160,7 @@ opendnssec:*:215:
nsd:*:216:
anvil:*:217:
zap:*:218:
# free: 219
sddm:*:219:
bs:*:220:
# free: 221
rtpproxy:*:222:

2
UIDs
View file

@ -165,7 +165,7 @@ opendnssec:*:215:215::0:0:Opendnssec Pseudo User:/nonexistent:/usr/sbin/nologin
nsd:*:216:216::0:0:NSD DNS Server:/nonexistent:/usr/sbin/nologin
anvil:*:217:217::0:0:anvil certificate dropper:/var/db/anvil:/bin/sh
zap:*:218:218::0:0:zap user:/usr/local/zap:/bin/sh
# free: 219
sddm:*:219:219::0:0:SDDM Display Manager user:/usr/local/etc/sddm/home:/usr/sbin/nologin
bs:*:220:220::0:0:Big Sister:/usr/local/bigsister:/bin/sh
# free: 221
rtpproxy:*:222:222::0:0:& user:/nonexistent:/sbin/nologin

View file

@ -296,6 +296,7 @@
SUBDIR += screen-message
SUBDIR += scripts
SUBDIR += scrnsaverproto
SUBDIR += sddm
SUBDIR += sessreg
SUBDIR += setlayout
SUBDIR += setxkbmap

View file

@ -2,7 +2,7 @@
PORTNAME= kde-workspace
PORTVERSION= ${KDE4_WORKSPACE_VERSION}
PORTREVISION= 8
PORTREVISION= 9
CATEGORIES= x11 kde kde-applications
MAINTAINER= kde@FreeBSD.org
@ -129,6 +129,9 @@ pre-configure:
post-install:
${LN} -sf ${PREFIX}/bin/startkde ${STAGEDIR}${PREFIX}/bin/startkde4
# Install kde4.desktop to launch kde4 via sddm.
${MKDIR} ${STAGEDIR}${PREFIX}/share/xsessions
${INSTALL_DATA} ${FILESDIR}/kde4.desktop ${STAGEDIR}${PREFIX}/share/xsessions
post-install-GSTREAMER-on:
@${HEAD} -1 ${PKGMESSAGE} >> ${PKGMESSAGE}

View file

@ -0,0 +1,7 @@
[Desktop Entry]
Encoding=UTF-8
Type=XSession
Exec=/usr/local/bin/startkde
TryExec=/usr/local/bin/startkde
DesktopNames=KDE
Name=KDE4

View file

@ -2122,3 +2122,4 @@ share/polkit-1/actions/org.kde.ksysguard.processlisthelper.policy
share/sounds/pop.wav
share/wallpapers/stripes.png
share/wallpapers/stripes.png.desktop
share/xsessions/kde4.desktop

46
x11/sddm/Makefile Normal file
View file

@ -0,0 +1,46 @@
# $FreeBSD$
PORTNAME= sddm
PORTVERSION= 0.14.0
DISTVERSIONPREFIX= v
CATEGORIES= x11
MAINTAINER= kde@FreeBSD.org
COMMENT= QML based login manager
USES= cmake:outsource desktop-file-utils kde:5
USE_KDE= ecm
USE_QT5= concurrent core dbus gui linguisttools multimedia network \
printsupport qml quick script sql webkit widgets \
buildtools_build qmake_build
USE_XORG= xcb
CMAKE_ARGS= -DUID_MIN=1000 \
-DUID_MAX=65000 \
-DCMAKE_INSTALL_SYSCONFDIR:PATH=${LOCALBASE}/etc
# We need to disable PAM at the moment and use the passwd-based backend;
# the two backend are mutually exclusive, and we have to investigate how
# to make it compatible with OpenPAM.
CMAKE_ARGS+= -DENABLE_PAM:BOOL=FALSE
USE_RC_SUBR= sddm
USERS= sddm
GROUPS= sddm
USE_GITHUB= yes
post-patch:
# Patch in the correct location for X11 startup files, and make the session start
# script of sddm use the value of ${STARTUP} defined by 90-consolekit
${REINPLACE_CMD} -e 's#/etc/X11#${LOCALBASE}/etc/X11#g' \
-e '/exec.*session/s#exec#exec $${STARTUP}#g' \
${PATCH_WRKSRC}/data/scripts/Xsession
post-install:
# Install xsession.desktop to launch .xinitrc via sddm.
${MKDIR} ${STAGEDIR}${PREFIX}/share/xsessions
${INSTALL_DATA} ${FILESDIR}/xinitrc.desktop ${STAGEDIR}${PREFIX}/share/xsessions
${INSTALL_SCRIPT} ${FILESDIR}/xinit-session ${STAGEDIR}${PREFIX}/share/sddm/scripts
.include <bsd.port.mk>

3
x11/sddm/distinfo Normal file
View file

@ -0,0 +1,3 @@
TIMESTAMP = 1488014449
SHA256 (sddm-sddm-v0.14.0_GH0.tar.gz) = a551551a6ba324e9c384c89bc63e871de65fea3740eadbea2d63df86045f8205
SIZE (sddm-sddm-v0.14.0_GH0.tar.gz) = 3367582

View file

@ -0,0 +1,16 @@
1) On FreeBSD X is normally started on VT9.
2) The shutdown command uses '-p' and not '-P' on FreeBSD.
--- CMakeLists.txt.orig 2016-08-28 11:54:03 UTC
+++ CMakeLists.txt
@@ -143,8 +143,8 @@ if(SYSTEMD_FOUND)
set(REBOOT_COMMAND "/usr/bin/systemctl reboot")
else()
set(SYSTEMD_FOUND 0)
- set(MINIMUM_VT 7)
- set(HALT_COMMAND "/sbin/shutdown -h -P now")
+ set(MINIMUM_VT 9)
+ set(HALT_COMMAND "/sbin/shutdown -h -p now")
set(REBOOT_COMMAND "/sbin/shutdown -r now")
endif()
add_feature_info("systemd" SYSTEMD_FOUND "systemd support")

View file

@ -0,0 +1,39 @@
Modify the default configuration to fit in to FreeBSD. That is replace '/usr/bin'
with '/usr/local/bin' and so on.
The setting of '$PATH' I find a bit dumb... this should respect the values of the
users profile...
--- src/common/Configuration.h.orig 2016-08-28 11:54:03 UTC
+++ src/common/Configuration.h
@@ -58,11 +58,11 @@ namespace SDDM {
// TODO: Not absolutely sure if everything belongs here. Xsessions, VT and probably some more seem universal
Section(X11,
- Entry(ServerPath, QString, _S("/usr/bin/X"), _S("Path to X server binary"));
+ Entry(ServerPath, QString, _S("/usr/local/bin/X"), _S("Path to X server binary"));
Entry(ServerArguments, QString, _S("-nolisten tcp"), _S("Arguments passed to the X server invocation"));
- Entry(XephyrPath, QString, _S("/usr/bin/Xephyr"), _S("Path to Xephyr binary"));
- Entry(XauthPath, QString, _S("/usr/bin/xauth"), _S("Path to xauth binary"));
- Entry(SessionDir, QString, _S("/usr/share/xsessions"), _S("Directory containing available X sessions"));
+ Entry(XephyrPath, QString, _S("/usr/local/bin/Xephyr"), _S("Path to Xephyr binary"));
+ Entry(XauthPath, QString, _S("/usr/local/bin/xauth"), _S("Path to xauth binary"));
+ Entry(SessionDir, QString, _S("/usr/local/share/xsessions"), _S("Directory containing available X sessions"));
Entry(SessionCommand, QString, _S(SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session"));
Entry(SessionLogFile, QString, _S(".local/share/sddm/xorg-session.log"), _S("Path to the user session log file"));
Entry(UserAuthFile, QString, _S(".Xauthority"), _S("Path to the Xauthority file"));
@@ -72,13 +72,13 @@ namespace SDDM {
);
Section(Wayland,
- Entry(SessionDir, QString, _S("/usr/share/wayland-sessions"), _S("Directory containing available Wayland sessions"));
+ Entry(SessionDir, QString, _S("/usr/local/share/wayland-sessions"), _S("Directory containing available Wayland sessions"));
Entry(SessionCommand, QString, _S(WAYLAND_SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session"));
Entry(SessionLogFile, QString, _S(".local/share/sddm/wayland-session.log"),_S("Path to the user session log file"));
);
Section(Users,
- Entry(DefaultPath, QString, _S("/bin:/usr/bin:/usr/local/bin"), _S("Default $PATH for logged in users"));
+ Entry(DefaultPath, QString, _S("/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"), _S("Default $PATH for logged in users"));
Entry(MinimumUid, int, UID_MIN, _S("Minimum user id for displayed users"));
Entry(MaximumUid, int, UID_MAX, _S("Maximum user id for displayed users"));
Entry(HideUsers, QStringList, QStringList(), _S("Comma-separated list of users that should not be listed"));

View file

@ -0,0 +1,23 @@
This patch does two things:
1) Add the include directories for 'libxcb' to the compiler search directories,
2) Remove VirtualTerminal.cpp from the sources that need to be built.
see also 'patch-src_daemon_Display.cpp'
--- src/daemon/CMakeLists.txt.orig 2016-08-28 11:54:03 UTC
+++ src/daemon/CMakeLists.txt
@@ -3,6 +3,7 @@ include_directories(
"${CMAKE_SOURCE_DIR}/src/auth"
)
include_directories("${CMAKE_BINARY_DIR}/src/common")
+include_directories("${LIBXCB_INCLUDE_DIR}")
set(DAEMON_SOURCES
${CMAKE_SOURCE_DIR}/src/common/Configuration.cpp
@@ -26,7 +27,6 @@ set(DAEMON_SOURCES
SeatManager.cpp
SignalHandler.cpp
SocketServer.cpp
- VirtualTerminal.cpp
)
qt5_add_dbus_adaptor(DAEMON_SOURCES "${CMAKE_SOURCE_DIR}/data/interfaces/org.freedesktop.DisplayManager.xml" "DisplayManager.h" SDDM::DisplayManager)

View file

@ -0,0 +1,39 @@
VirtualTerminal for Wayland is only present on Linux at the moment.
As we are only interested in an X11 session at the moment, we therefore
can hide it behind a Q_OS_LINUX.
--- src/daemon/Display.cpp.orig 2016-08-28 11:54:03 UTC
+++ src/daemon/Display.cpp
@@ -30,7 +30,9 @@
#include "Greeter.h"
#include "Utils.h"
#include "SignalHandler.h"
+#if defined(Q_OS_LINUX)
#include "VirtualTerminal.h"
+#endif
#include <QDebug>
#include <QFile>
@@ -280,8 +282,10 @@ namespace SDDM {
// create new VT for Wayland sessions otherwise use greeter vt
int vt = terminalId();
+#if defined(Q_OS_LINUX)
if (session.xdgSessionType() == QLatin1String("wayland"))
vt = VirtualTerminal::setUpNewVt();
+#endif
m_lastSession.setVt(vt);
QProcessEnvironment env;
@@ -321,9 +325,11 @@ namespace SDDM {
stateConfig.Last.Session.setDefault();
stateConfig.save();
+#if defined(Q_OS_LINUX)
// switch to the new VT for Wayland sessions
if (m_lastSession.xdgSessionType() == QLatin1String("wayland"))
VirtualTerminal::jumpToVt(m_lastSession.vt());
+#endif
if (m_socket)
emit loginSucceeded(m_socket);

View file

@ -0,0 +1,12 @@
Call 'setpwent' to rewind to the beginning of the passwd database.
--- src/greeter/UserModel.cpp.orig 2016-07-10 21:26:13 UTC
+++ src/greeter/UserModel.cpp
@@ -55,6 +55,7 @@ namespace SDDM {
const QString defaultFace = QStringLiteral("%1/.face.icon").arg(facesDir);
struct passwd *current_pw;
+ setpwent();
while ((current_pw = getpwent()) != nullptr) {
// skip entries with uids smaller than minimum uid

View file

@ -0,0 +1,12 @@
Include '<errno.h>' as 'errno' is used.
--- src/helper/UserSession.cpp.orig 2016-07-06 14:00:10 UTC
+++ src/helper/UserSession.cpp
@@ -25,6 +25,7 @@
#include <sys/types.h>
#include <sys/ioctl.h>
+#include <errno.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>

View file

@ -0,0 +1,46 @@
Implement password authentication on FreeBSD.
This needs review :)
--- src/helper/backend/PasswdBackend.cpp.orig 2016-07-06 14:00:10 UTC
+++ src/helper/backend/PasswdBackend.cpp
@@ -27,8 +27,13 @@
#include <sys/types.h>
#include <pwd.h>
+#if defined(Q_OS_LINUX)
#include <shadow.h>
#include <crypt.h>
+#endif
+#if defined(Q_OS_FREEBSD)
+#include <unistd.h>
+#endif
namespace SDDM {
PasswdBackend::PasswdBackend(HelperApp *parent)
@@ -72,6 +77,17 @@ namespace SDDM {
return false;
}
+#if defined(Q_OS_FREEBSD)
+ if (!*pw->pw_passwd)
+ {
+ //empty password
+ return true;
+ }
+ char *crypted = crypt(qPrintable(password), pw->pw_passwd);
+ if (0 == strcmp(crypted, pw->pw_passwd)) {
+ return true;
+ }
+#else
struct spwd *spw = getspnam(pw->pw_name);
if (!spw) {
qWarning() << "[Passwd] Could get passwd but not shadow";
@@ -85,7 +101,7 @@ namespace SDDM {
if (0 == strcmp(crypted, spw->sp_pwdp)) {
return true;
}
-
+#endif
m_app->error(QStringLiteral("Wrong user/password combination"), Auth::ERROR_AUTHENTICATION);
return false;
}

75
x11/sddm/files/sddm.in Normal file
View file

@ -0,0 +1,75 @@
#!/bin/sh
# $FreeBSD$
#
# PROVIDE: sddm
# REQUIRE: LOGIN cleanvar moused syscons dbus hald
# KEYWORD: shutdown
#
# Add the following to /etc/rc.conf to start SDDM at boot time:
#
# sddm_enable="YES"
. /etc/rc.subr
name=sddm
rcvar=sddm_enable
load_rc_config ${name}
: ${sddm_lang="en_US"} # .UTF-8 suffix will be added later to comply with locale format
command="/usr/local/bin/sddm"
pidfile="/var/run/sddm.pid"
start_cmd="sddm_start"
stop_cmd="sddm_stop"
# Creates /etc/sddm.conf after `sddm --example-config` if it's not there already.
sddm_genconf()
{
if [ ! -r /etc/sddm.conf ]; then
echo "Generating SDDM configuration."
${command} --example-config > /etc/sddm.conf
fi
}
sddm_start()
{
echo "Starting ${name}."
local iter
sddm_genconf
( iter=0
while ! ps -axoargs | grep "^/usr/libexec/getty" | grep -qv grep > /dev/null 2>&1; do
if [ ${iter} -eq 60 ]; then
break
fi
sleep 1
iter=$((${iter} + 1))
done
if checkyesno hald_enable; then
if [ ! -x /usr/local/sbin/hald ]; then
err 1 "Hald does not seem to be installed."
fi
iter=0
while [ ${iter} -lt 60 ] &&
!pgrep -f "^/usr/local/sbin/hald" > /dev/null 2>&1; do
sleep 1
iter=$((${iter} + 1))
done
fi
LANG=${sddm_lang}.UTF-8 ${command} ${sddm_flags} ) &
}
# Only takes the user back to the sddm screen when run from X
sddm_stop()
{
echo "Stopping ${name}."
/bin/kill -9 $(/bin/cat "${pidfile}")
pkill -9 -U ${name}
pkill -9 X
}
run_rc_command "$1"

View file

@ -0,0 +1,12 @@
#!/bin/sh
#
# Runs the user's .xinitrc (at this point, .xsession has already
# been sourced).
RC="$HOME/.xinitrc"
test -f "$RC" || exit 1
test -x "$RC" && exec "$RC"
test -f "$RC" && exec /bin/sh "$RC"

View file

@ -0,0 +1,7 @@
[Desktop Entry]
Encoding=UTF-8
Type=XSession
Exec=/usr/local/share/sddm/scripts/xinit-session
TryExec=/usr/local/share/sddm/scripts/xinit-session
DesktopNames=User Session
Name=User Session

3
x11/sddm/pkg-descr Normal file
View file

@ -0,0 +1,3 @@
QML based X11 and Wayland display manager.
WWW: https://github.com/sddm/sddm

164
x11/sddm/pkg-plist Normal file
View file

@ -0,0 +1,164 @@
bin/sddm
bin/sddm-greeter
etc/dbus-1/system.d/org.freedesktop.DisplayManager.conf
etc/pam.d/sddm
etc/pam.d/sddm-autologin
etc/pam.d/sddm-greeter
etc/sddm.conf
%%QT_QMLDIR%%/SddmComponents/Background.qml
%%QT_QMLDIR%%/SddmComponents/Button.qml
%%QT_QMLDIR%%/SddmComponents/Clock.qml
%%QT_QMLDIR%%/SddmComponents/ComboBox.qml
%%QT_QMLDIR%%/SddmComponents/ImageButton.qml
%%QT_QMLDIR%%/SddmComponents/LayoutBox.qml
%%QT_QMLDIR%%/SddmComponents/Menu.qml
%%QT_QMLDIR%%/SddmComponents/PasswordBox.qml
%%QT_QMLDIR%%/SddmComponents/PictureBox.qml
%%QT_QMLDIR%%/SddmComponents/TextBox.qml
%%QT_QMLDIR%%/SddmComponents/TextConstants.qml
%%QT_QMLDIR%%/SddmComponents/qmldir
%%QT_QMLDIR%%/SddmComponents/warning.png
libexec/sddm-helper
%%DATADIR%%/faces/.face.icon
%%DATADIR%%/faces/root.face.icon
%%DATADIR%%/flags/ae.png
%%DATADIR%%/flags/am.png
%%DATADIR%%/flags/ar.png
%%DATADIR%%/flags/at.png
%%DATADIR%%/flags/az.png
%%DATADIR%%/flags/be.png
%%DATADIR%%/flags/bg.png
%%DATADIR%%/flags/bh.png
%%DATADIR%%/flags/br.png
%%DATADIR%%/flags/by.png
%%DATADIR%%/flags/ca.png
%%DATADIR%%/flags/ch.png
%%DATADIR%%/flags/cu.png
%%DATADIR%%/flags/cz.png
%%DATADIR%%/flags/de.png
%%DATADIR%%/flags/dj.png
%%DATADIR%%/flags/dk.png
%%DATADIR%%/flags/dz.png
%%DATADIR%%/flags/ee.png
%%DATADIR%%/flags/eg.png
%%DATADIR%%/flags/es.png
%%DATADIR%%/flags/eu.png
%%DATADIR%%/flags/fi.png
%%DATADIR%%/flags/fr.png
%%DATADIR%%/flags/gb.png
%%DATADIR%%/flags/ge.png
%%DATADIR%%/flags/gr.png
%%DATADIR%%/flags/hr.png
%%DATADIR%%/flags/hu.png
%%DATADIR%%/flags/il.png
%%DATADIR%%/flags/in.png
%%DATADIR%%/flags/iq.png
%%DATADIR%%/flags/is.png
%%DATADIR%%/flags/it.png
%%DATADIR%%/flags/jo.png
%%DATADIR%%/flags/jp.png
%%DATADIR%%/flags/km.png
%%DATADIR%%/flags/kr.png
%%DATADIR%%/flags/kw.png
%%DATADIR%%/flags/la.png
%%DATADIR%%/flags/lb.png
%%DATADIR%%/flags/lt.png
%%DATADIR%%/flags/lv.png
%%DATADIR%%/flags/ly.png
%%DATADIR%%/flags/ma.png
%%DATADIR%%/flags/mk.png
%%DATADIR%%/flags/mn.png
%%DATADIR%%/flags/mx.png
%%DATADIR%%/flags/nl.png
%%DATADIR%%/flags/no.png
%%DATADIR%%/flags/om.png
%%DATADIR%%/flags/pl.png
%%DATADIR%%/flags/ps.png
%%DATADIR%%/flags/pt.png
%%DATADIR%%/flags/qa.png
%%DATADIR%%/flags/qc.png
%%DATADIR%%/flags/ro.png
%%DATADIR%%/flags/ru.png
%%DATADIR%%/flags/sa.png
%%DATADIR%%/flags/sd.png
%%DATADIR%%/flags/se.png
%%DATADIR%%/flags/si.png
%%DATADIR%%/flags/sk.png
%%DATADIR%%/flags/so.png
%%DATADIR%%/flags/sr.png
%%DATADIR%%/flags/sy.png
%%DATADIR%%/flags/th.png
%%DATADIR%%/flags/tn.png
%%DATADIR%%/flags/tr.png
%%DATADIR%%/flags/ua.png
%%DATADIR%%/flags/uk.png
%%DATADIR%%/flags/un.png
%%DATADIR%%/flags/us.png
%%DATADIR%%/flags/uy.png
%%DATADIR%%/flags/vn.png
%%DATADIR%%/flags/ye.png
%%DATADIR%%/flags/yu.png
%%DATADIR%%/flags/zz.png
%%DATADIR%%/scripts/Xsession
%%DATADIR%%/scripts/Xsetup
%%DATADIR%%/scripts/Xstop
%%DATADIR%%/scripts/wayland-session
%%DATADIR%%/scripts/xinit-session
%%DATADIR%%/themes/elarun/Main.qml
%%DATADIR%%/themes/elarun/README
%%DATADIR%%/themes/elarun/angle-down.png
%%DATADIR%%/themes/elarun/elarun.jpg
%%DATADIR%%/themes/elarun/images/background.png
%%DATADIR%%/themes/elarun/images/lock.png
%%DATADIR%%/themes/elarun/images/login_active.png
%%DATADIR%%/themes/elarun/images/login_normal.png
%%DATADIR%%/themes/elarun/images/rectangle.png
%%DATADIR%%/themes/elarun/images/rectangle_overlay.png
%%DATADIR%%/themes/elarun/images/session_normal.png
%%DATADIR%%/themes/elarun/images/system_hibernate.png
%%DATADIR%%/themes/elarun/images/system_reboot.png
%%DATADIR%%/themes/elarun/images/system_shutdown.png
%%DATADIR%%/themes/elarun/images/system_suspend.png
%%DATADIR%%/themes/elarun/images/system_switch_user.png
%%DATADIR%%/themes/elarun/images/user_icon.png
%%DATADIR%%/themes/elarun/metadata.desktop
%%DATADIR%%/themes/elarun/theme.conf
%%DATADIR%%/themes/maldives/LICENSE
%%DATADIR%%/themes/maldives/Main.qml
%%DATADIR%%/themes/maldives/README
%%DATADIR%%/themes/maldives/angle-down.png
%%DATADIR%%/themes/maldives/background.jpg
%%DATADIR%%/themes/maldives/maldives.jpg
%%DATADIR%%/themes/maldives/metadata.desktop
%%DATADIR%%/themes/maldives/rectangle.png
%%DATADIR%%/themes/maldives/theme.conf
%%DATADIR%%/translations/ar.qm
%%DATADIR%%/translations/ca.qm
%%DATADIR%%/translations/cs.qm
%%DATADIR%%/translations/de.qm
%%DATADIR%%/translations/es.qm
%%DATADIR%%/translations/et.qm
%%DATADIR%%/translations/fi.qm
%%DATADIR%%/translations/fr.qm
%%DATADIR%%/translations/hu.qm
%%DATADIR%%/translations/it.qm
%%DATADIR%%/translations/ja.qm
%%DATADIR%%/translations/ko.qm
%%DATADIR%%/translations/lt.qm
%%DATADIR%%/translations/lv.qm
%%DATADIR%%/translations/nb.qm
%%DATADIR%%/translations/nn.qm
%%DATADIR%%/translations/pl.qm
%%DATADIR%%/translations/pt_BR.qm
%%DATADIR%%/translations/pt_PT.qm
%%DATADIR%%/translations/ro.qm
%%DATADIR%%/translations/ru.qm
%%DATADIR%%/translations/sr.qm
%%DATADIR%%/translations/sr@ijekavian.qm
%%DATADIR%%/translations/sr@ijekavianlatin.qm
%%DATADIR%%/translations/sr@latin.qm
%%DATADIR%%/translations/sv.qm
%%DATADIR%%/translations/tr.qm
%%DATADIR%%/translations/zh_CN.qm
%%DATADIR%%/translations/zh_TW.qm
share/xsessions/xinitrc.desktop