kde/sddm: vendor as a full-fork recipe (path=source, patches baked)

Convert the transient git-fetch sddm recipe to the vendored model: commit the
source/ tree (pristine sddm @63780fcd + the two Redox patches baked in), switch
[source] to path="source" so the build never reaches github at cook time, and
keep the .patch files tracked for re-application on a version bump. Also fixes
the malformed redox-helper-utmpx-stub.patch (wrong hunk line-counts -> 'malformed
patch at line 24') by regenerating it with correct headers. First of the 26
transient recipes being vendored for an offline, reproducible full-fork build.
This commit is contained in:
2026-08-01 04:40:37 +03:00
parent fa6b8a39f4
commit e99f220c6a
363 changed files with 25387 additions and 17 deletions
-2
View File
@@ -32,8 +32,6 @@ local/recipes/dev/ninja-build/source
# Bump-recipe cache used by local/scripts/bump-graphics-recipes.sh.
# Cache is fetched from upstream release indexes; reproducible from script run.
.redbear-recipe-bump/
local/recipes/kde/sddm/source
local/recipes/kde/sddm/source-pristine
# Build artifacts — target/ dirs are everywhere
target
+13 -10
View File
@@ -7,16 +7,19 @@ version = "0.3.1"
# XcbKeyboardBackend removed from greeter; XorgDisplayServer/XorgUserDisplayServer/XAuth
# removed from daemon. Default display server fallback is Wayland.
[source]
git = "https://github.com/sddm/sddm.git"
rev = "63780fcd79f1dbf81a30eef48c28c699ab15aded"
patches = [
# Redox has no Linux/FreeBSD VT subsystem (VT_ACTIVATE/VT_WAITACTIVE/KDSETMODE
# etc.); stub SDDM::VirtualTerminal to no-ops (greeter runs on the compositor).
"redox-virtualterminal-stub.patch",
# Redox has no utmp/utmpx login-accounting DB; stub sddm-helper's
# utmpLogin/utmpLogout to no-ops (skip <utmpx.h>).
"redox-helper-utmpx-stub.patch",
]
# Vendored local fork (full-fork model): build from the committed source/ tree so
# the distro builds offline/reproducibly, immune to upstream mirror churn. source/
# = pristine upstream + the Redox patches below BAKED IN. The .patch files are kept
# tracked (and source.tar holds the pristine snapshot) so a version bump can
# re-apply them to a newer upstream via sync-recipe-source.sh.
# upstream: https://github.com/sddm/sddm.git
# rev: 63780fcd79f1dbf81a30eef48c28c699ab15aded
# patches (baked into source/):
# redox-virtualterminal-stub.patch — Redox has no Linux/FreeBSD VT subsystem
# (VT_ACTIVATE/VT_WAITACTIVE/KDSETMODE); stub SDDM::VirtualTerminal to no-ops.
# redox-helper-utmpx-stub.patch — Redox has no utmp/utmpx login-accounting;
# stub sddm-helper's utmpLogin/utmpLogout to no-ops (skip <utmpx.h>).
path = "source"
[build]
template = "custom"
@@ -1,5 +1,5 @@
--- a/src/helper/HelperApp.cpp
+++ b/src/helper/HelperApp.cpp
--- a/src/helper/HelperApp.cpp 2026-08-01 04:21:31.968403136 +0300
+++ b/src/helper/HelperApp.cpp 2026-08-01 04:24:37.190803255 +0300
@@ -41,7 +41,9 @@
#if defined(Q_OS_LINUX)
#include <utmp.h>
@@ -10,7 +10,7 @@
#include <QByteArray>
#include <signal.h>
@@ -301,6 +303,10 @@
@@ -301,6 +303,12 @@
}
void HelperApp::utmpLogin(const QString &vt, const QString &displayName, const QString &user, qint64 pid, bool authSuccessful) {
@@ -23,7 +23,7 @@
struct utmpx entry { };
struct timeval tv;
@@ -339,9 +345,14 @@
@@ -339,9 +347,16 @@
#if defined(Q_OS_LINUX)
updwtmpx(authSuccessful ? "/var/log/wtmp" : "/var/log/btmp", &entry);
#endif
@@ -40,7 +40,7 @@
struct utmpx entry { };
struct timeval tv;
@@ -378,6 +389,7 @@
@@ -378,6 +393,7 @@
#elif defined(Q_OS_FREEBSD)
pututxline(&entry);
#endif
@@ -0,0 +1,30 @@
# ==[ Subject: One line only short meaningful description for logs ]===|
# ==[ Details: Describe what changed and explain why it changed ]======|
# Change log entry (see below for instructions).
#[ChangeLog][][]
# ==[ Footers: Uncomment and edit where applicable ]===================|
#
# One issue per entry. Remember space after colon.
#Issue:
#
# If this commit closes an issue use this. Remember space after colon.
#Closes:
#
# ==[ Please wrap at 72 characters ]===================================|
#
# Change log entry: If this commit adds a significant feature, fixes an
# issue or contains a behavior change that is relevant to others,
# add a change log entry. It can be multiple lines long and ends with an
# empty newline. Try to integrate it into the flow of the commit message
# to avoid redundancy.
# Use the module name to indicate the area of the change e.g. [Greeter].
# Optionally specify a class or subtopic [Daemon][Display].
# Other common tags are: [General] or [Important Behavior Changes].
#
# [ChangeLog][module][class/topic] description of the really important
# change that was just made on several lines.
@@ -0,0 +1,17 @@
# remove files from deployment using `git archive`
# common files
.commit-template export-ignore
.gitattributes export-ignore
.gitignore export-ignore
.mailmap export-ignore
.travis.yml export-ignore
# several files and directories we never want to export
# a little bit belt and braces as the most of these files
# should never ever be in the repository
*~ export-ignore
.kdev4 export-ignore
*build* export-ignore
*.user export-ignore
@@ -0,0 +1,98 @@
name: CI
on:
push:
branches:
- master
- develop
pull_request:
branches:
- master
- develop
env:
CLAZY_CHECKS: "level1"
jobs:
build:
if: "!contains(github.event.head_commit.message, 'ci skip')"
strategy:
fail-fast: false
matrix:
container-image:
- "quay.io/fedora/fedora:rawhide"
- "quay.io/centos/centos:stream9"
- "registry.opensuse.org/opensuse/tumbleweed-dnf"
- "docker.io/library/ubuntu:22.04"
- "docker.io/library/ubuntu:23.04"
compiler:
- gcc
- clang
qt:
- "qt5"
include:
- container-image: "docker.io/library/ubuntu:23.04"
compiler: clang
qt: "qt6"
- container-image: "docker.io/library/ubuntu:23.04"
compiler: gcc
qt: "qt6"
runs-on: ubuntu-latest
container:
image: ${{ matrix.container-image }}
steps:
- uses: actions/checkout@v3
- name: Dependencies (rpm-type)
if: ${{ contains(matrix.container-image, 'fedora') || contains(matrix.container-image, 'centos') || contains(matrix.container-image, 'opensuse') }}
run: |
set -x
dnf --assumeyes install dnf-plugins-core
if [[ "${{ matrix.container-image }}" =~ "centos" ]]; then dnf --assumeyes config-manager --set-enabled crb && dnf --assumeyes install epel-release; fi
dnf --assumeyes builddep sddm
if [ "${{ matrix.qt }}" = "qt5" ] && [[ "${{ matrix.container-image }}" =~ "fedora" ]]; then dnf --assumeyes install qt5-qtbase-devel qt5-qtdeclarative-devel qt5-qttools-devel; fi
dnf --assumeyes --allowerasing --nobest install clang clazy
- name: Dependencies (deb-type)
if: ${{ contains(matrix.container-image, 'ubuntu') }}
run: |
set -x
sed -i '/^#\sdeb-src /s/^#//' "/etc/apt/sources.list"
apt-get update -y
DEBIAN_FRONTEND=noninteractive apt-get build-dep sddm -y
if [ "${{ matrix.qt }}" = "qt6" ]; then
DEBIAN_FRONTEND=noninteractive apt-get install clang clazy qt6-base-dev qt6-base-dev-tools qt6-tools-dev qt6-declarative-dev qml6-module-qtqml-workerscript qml6-module-qtquick-window -y
else
DEBIAN_FRONTEND=noninteractive apt-get install clang clazy qml-module-qttest -y
fi
- name: Build
run: |
set -x
mkdir -p build
cd build
if [ "${{ matrix.qt }}" = "qt6" ]; then
BUILD_WITH_QT6=ON
else
BUILD_WITH_QT6=OFF
fi
if [ "${{ matrix.compiler }}" = "clang" ]; then
export CC=clang
#export CXX=clang++
export CXX=clazy
fi
if [ -f "/usr/etc/login.defs" ]; then
export LOGIN_DEFS_PATH="/usr/etc/login.defs"
else
export LOGIN_DEFS_PATH="/etc/login.defs"
fi
cmake .. \
-DBUILD_MAN_PAGES:BOOL=ON \
-DBUILD_WITH_QT6:BOOL=${BUILD_WITH_QT6} \
-DLOGIN_DEFS_PATH:PATH="${LOGIN_DEFS_PATH}"
make -j $(getconf _NPROCESSORS_ONLN)
make install
- name: Test
env:
CTEST_OUTPUT_ON_FAILURE: "1"
working-directory: build
run: make test
@@ -0,0 +1,28 @@
name: Checks
on:
push:
branches:
- master
- develop
tags:
- v*
pull_request:
types:
- opened
- synchronize
- reopened
- edited
jobs:
qml:
if: "!contains(github.event.head_commit.message, 'ci skip')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 1
- name: Validate QML and JavaScript files
uses: liri-infra/qmllint-action@8bfbc8ec90b2f48147db9b47403448eda7b20a31
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+3
View File
@@ -0,0 +1,3 @@
/build/
*~
*.user
+9
View File
@@ -0,0 +1,9 @@
Nathan Weber <supernathansunshine@gmail.com>
Nikita Mikhailov <nslqqq@gmail.com>
Andrea Scarpino <me@andreascarpino.it> <andrea@archlinux.org>
Isaque Galdino <igaldino@gmail.com> <izup@fake.com>
raffarti <raffarti@zoho.com> <raffarti@localhost.localdomain>
Martin Briza <mbriza@redhat.com> <m@rtinbriza.cz>
David Edmundson <kde@davidedmundson.co.uk> <david@davidedmundson.co.uk>
Pier Luigi Fiorini <pierluigi.fiorini@liri.io> <pierluigi.fiorini@gmail.com>
Pier Luigi Fiorini <pierluigi.fiorini@liri.io> <plfiorini@users.noreply.github.com>
@@ -0,0 +1 @@
63780fcd79f1
@@ -0,0 +1,234 @@
cmake_minimum_required(VERSION 3.4)
project(SDDM)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
# Set version
set(SDDM_VERSION_MAJOR 0)
set(SDDM_VERSION_MINOR 21)
set(SDDM_VERSION_PATCH 0)
set(SDDM_VERSION_STRING "${SDDM_VERSION_MAJOR}.${SDDM_VERSION_MINOR}.${SDDM_VERSION_PATCH}")
add_compile_definitions("SDDM_VERSION=\"${SDDM_VERSION_STRING}\"")
# Options
option(BUILD_MAN_PAGES "Build man pages" OFF)
option(ENABLE_JOURNALD "Enable logging to journald" ON)
option(NO_SYSTEMD "Disable systemd support" OFF)
option(USE_ELOGIND "Use elogind instead of logind" OFF)
option(BUILD_WITH_QT6 "Build with Qt 6" OFF)
option(INSTALL_PAM_CONFIGURATION "Install PAM configuration files" ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}")
# Definitions
add_definitions(-Wall -Wextra -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_FROM_BYTEARRAY -DQT_NO_FOREACH)
# Default build type
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# Handle build type
if(CMAKE_BUILD_TYPE MATCHES [Dd]ebug)
message(STATUS "Debug build")
add_definitions(-DDEBUG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0")
else()
message(STATUS "Release build")
add_definitions(-DNDEBUG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
endif()
# Default absolute paths
if(NOT DEFINED CMAKE_INSTALL_SYSCONFDIR)
set(CMAKE_INSTALL_SYSCONFDIR "/etc")
endif()
if(NOT DEFINED CMAKE_INSTALL_LOCALSTATEDIR)
set(CMAKE_INSTALL_LOCALSTATEDIR "/var")
endif()
# Standard installation paths
include(GNUInstallDirs)
# Macros
include(FeatureSummary)
# PKG-CONFIG
find_package(PkgConfig)
# PAM
find_package(PAM REQUIRED)
# XAU
pkg_check_modules(LIBXAU REQUIRED "xau")
# XCB
find_package(XCB REQUIRED)
# XKB
find_package(XKB REQUIRED)
# Qt
if(BUILD_WITH_QT6)
set(QT_MAJOR_VERSION 6)
message(STATUS "Building Qt 6 version")
else()
set(QT_MAJOR_VERSION 5)
message(STATUS "Building Qt 5 version")
endif()
find_package(Qt${QT_MAJOR_VERSION} 5.15.0 CONFIG REQUIRED Core DBus Gui Qml Quick LinguistTools Test QuickTest)
# find qt5 imports dir
get_target_property(QMAKE_EXECUTABLE Qt${QT_MAJOR_VERSION}::qmake LOCATION)
if(NOT QT_IMPORTS_DIR)
execute_process(COMMAND ${QMAKE_EXECUTABLE} -query QT_INSTALL_QML OUTPUT_VARIABLE QT_IMPORTS_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
# systemd
if(NOT NO_SYSTEMD AND NOT USE_ELOGIND)
pkg_check_modules(SYSTEMD "systemd")
endif()
if(SYSTEMD_FOUND)
add_definitions(-DHAVE_SYSTEMD)
set(CMAKE_AUTOMOC_MOC_OPTIONS -DHAVE_SYSTEMD)
# libsystemd-journal was merged into libsystemd in 209
if(${SYSTEMD_VERSION} VERSION_LESS 209)
pkg_check_modules(JOURNALD "libsystemd-journal")
else()
pkg_check_modules(JOURNALD "libsystemd")
endif()
if(ENABLE_JOURNALD)
if(JOURNALD_FOUND)
add_definitions(-DHAVE_JOURNALD)
set(CMAKE_AUTOMOC_MOC_OPTIONS -DHAVE_JOURNALD)
else()
message(WARNING "Disable journald support for lack of libsystemd-journal")
endif()
endif()
if (NOT DEFINED SYSTEMD_SYSTEM_UNIT_DIR)
pkg_get_variable(SYSTEMD_SYSTEM_UNIT_DIR systemd systemdsystemunitdir)
endif()
if (NOT DEFINED SYSTEMD_SYSUSERS_DIR)
pkg_get_variable(SYSTEMD_SYSUSERS_DIR systemd sysusersdir)
endif()
if (NOT DEFINED SYSTEMD_TMPFILES_DIR)
pkg_get_variable(SYSTEMD_TMPFILES_DIR systemd tmpfilesdir)
endif()
set(HALT_COMMAND "/usr/bin/systemctl poweroff")
set(REBOOT_COMMAND "/usr/bin/systemctl reboot")
else()
set(SYSTEMD_FOUND 0)
endif()
add_feature_info("systemd" SYSTEMD_FOUND "systemd support")
add_feature_info("journald" JOURNALD_FOUND "journald support")
# elogind
if(NO_SYSTEMD AND USE_ELOGIND)
pkg_check_modules(ELOGIND "libelogind")
endif()
if(ELOGIND_FOUND)
add_definitions(-DHAVE_ELOGIND)
set(CMAKE_AUTOMOC_MOC_OPTIONS -DHAVE_ELOGIND)
set(HALT_COMMAND "/usr/bin/loginctl poweroff")
set(REBOOT_COMMAND "/usr/bin/loginctl reboot")
endif()
add_feature_info("elogind" ELOGIND_FOUND "elogind support")
# Default behaviour if neither systemd nor elogind is used
if (NOT ELOGIND_FOUND AND NOT SYSTEMD_FOUND)
# Set the VT on which sddm will normally appear, and the
# commands for shutdown and reboot. On FreeBSD, there are
# normally more getty's running than on Linux.
if("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
set(HALT_COMMAND "/sbin/shutdown -p now")
else()
set(HALT_COMMAND "/sbin/shutdown -h -P now")
endif()
set(REBOOT_COMMAND "/sbin/shutdown -r now")
endif()
if (SYSTEMD_FOUND)
set(RUNTIME_DIR_DEFAULT "/run/sddm")
else()
set(RUNTIME_DIR_DEFAULT "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/run/sddm")
endif()
# Set constants
set(DATA_INSTALL_DIR "${CMAKE_INSTALL_FULL_DATADIR}/sddm" CACHE PATH "System application data install directory")
set(DBUS_CONFIG_DIR "${CMAKE_INSTALL_FULL_DATADIR}/dbus-1/system.d" CACHE PATH "DBus config files directory")
set(STATE_DIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/sddm" CACHE PATH "State directory")
set(RUNTIME_DIR "${RUNTIME_DIR_DEFAULT}" CACHE PATH "Runtime data storage directory")
set(QML_INSTALL_DIR "${QT_IMPORTS_DIR}" CACHE PATH "QML component installation directory")
set(SESSION_COMMAND "${DATA_INSTALL_DIR}/scripts/Xsession" CACHE PATH "Script to execute when starting the X11 desktop session")
set(WAYLAND_SESSION_COMMAND "${DATA_INSTALL_DIR}/scripts/wayland-session" CACHE PATH "Script to execute when starting the Wayland desktop session")
set(CONFIG_FILE "${CMAKE_INSTALL_FULL_SYSCONFDIR}/sddm.conf" CACHE PATH "Path of the sddm config file")
set(CONFIG_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}/sddm.conf.d" CACHE PATH "Path of the sddm config directory")
set(ACCOUNTSSERVICE_DATA_DIR "/var/lib/AccountsService" CACHE PATH "Path of the accountsservice data directory")
set(SYSTEM_CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/lib/sddm/sddm.conf.d" CACHE PATH "Path of the system sddm config directory")
set(LOG_FILE "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/log/sddm.log" CACHE PATH "Path of the sddm log file")
set(DBUS_CONFIG_FILENAME "org.freedesktop.DisplayManager.conf" CACHE STRING "Name of the sddm config file")
set(COMPONENTS_TRANSLATION_DIR "${DATA_INSTALL_DIR}/translations-qt${QT_MAJOR_VERSION}" CACHE PATH "Components translations directory")
set(SDDM_INITIAL_VT "1" CACHE STRING "Initial tty to use")
# Autodetect UID_MIN and UID_MAX from /etc/login.defs
if(NOT DEFINED LOGIN_DEFS_PATH)
set(LOGIN_DEFS_PATH "/etc/login.defs" CACHE PATH "Path to login.defs")
endif()
if(NOT EXISTS "${LOGIN_DEFS_PATH}" AND NOT DEFINED UID_MIN AND NOT DEFINED UID_MAX)
message(FATAL_ERROR "Could not find login.defs at ${LOGIN_DEFS_PATH}. Try -DLOGIN_DEFS_PATH.")
endif()
if(NOT DEFINED UID_MIN)
file(STRINGS "${LOGIN_DEFS_PATH}" UID_MIN LIMIT_COUNT 1 REGEX "^UID_MIN")
string(REGEX REPLACE "^UID_MIN[\t ]+([0-9]+)" "\\1" UID_MIN "${UID_MIN}")
if(NOT UID_MIN MATCHES "[0-9]+")
message(WARNING "Could not detect a valid UID_MIN (got '${UID_MIN}'). You should review your login.defs file.")
set(UID_MIN 1000)
else()
message(STATUS "Autodetected UID_MIN=${UID_MIN} from ${LOGIN_DEFS_PATH}")
endif()
endif()
if(NOT DEFINED UID_MAX)
file(STRINGS "${LOGIN_DEFS_PATH}" UID_MAX LIMIT_COUNT 1 REGEX "^UID_MAX")
string(REGEX REPLACE "^UID_MAX[\t ]+([0-9]+)" "\\1" UID_MAX "${UID_MAX}")
if(NOT UID_MAX MATCHES "[0-9]+")
message(WARNING "Could not detect a valid UID_MAX (got '${UID_MAX}'). You should review your login.defs file.")
set(UID_MAX 65000)
else()
message(STATUS "Autodetected UID_MAX=${UID_MAX} from ${LOGIN_DEFS_PATH}")
endif()
endif()
# Add subdirectories
add_subdirectory(components)
add_subdirectory(data)
add_subdirectory(services)
add_subdirectory(src)
enable_testing()
add_subdirectory(test)
# Display feature summary
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
+138
View File
@@ -0,0 +1,138 @@
This list contains list of contributors to the sddm. Names are sorted by number
of commits at time of this writing. Commit data has been generated using:
git shortlog -s -e -n
Commit counts have ben removed, since they change pretty frequently. Some of the
the committer names and email addresses have changed, so we use .mailmap file to
merge them.
Abdurrahman AVCI <abdurrahmanavci@gmail.com>
Pier Luigi Fiorini <pierluigi.fiorini@liri.io>
David Edmundson <kde@davidedmundson.co.uk>
Nikita Mikhailov <nslqqq@gmail.com>
Martin Briza <mbriza@redhat.com>
Jerome Leclanche <jerome@leclan.ch>
Fabian Vogt <fabian@ritter-vogt.de>
AnAkkk <anakin.cs@gmail.com>
Christopher Roy Bratusek <nano@tuxfamily.org>
Andrea Scarpino <me@andreascarpino.it>
Dāvis <davispuh@gmail.com>
Kevin S.C. Decker <kevin.decker@fu-berlin.de>
Reza Fatahilah Shah <rshah0385@kireihana.com>
Aaron Seigo <aseigo@kde.org>
Nathan Weber <supernathansunshine@gmail.com>
Elias Probst <mail@eliasprobst.eu>
Raphael Kubo da Costa <rakuco@FreeBSD.org>
Richard Martin <radiosity@gmail.com>
naund <naund@users.noreply.github.com>
Leonardo <leonardo.guilherme@gmail.com>
Sanjeev Premi <spremi@ymail.com>
Kristoffer Grundström <kristoffer.grundstrom1983@gmail.com>
Yury G. Kudryashov <urkud.urkud@gmail.com>
Alberto Milone <alberto.milone@canonical.com>
Andreas Müller <schnitzeltony@googlemail.com>
Antonio Larrosa <larrosa@kde.org>
Hendrik Lehmbruch <hlehmbruch@gmx.net>
Isaque Galdino <igaldino@gmail.com>
Kuzma Shapran <kuzma.shapran@gmail.com>
Robert Antoni Buj Gelonch <robert.buj@gmail.com>
Sven Eden <seden@havi.de>
welaq <welaq@users.noreply.github.com>
Albert Vaca <albertvaka@gmail.com>
Aurélien COUDERC <zecoucou@free.fr>
Florian Jacob <projects+git@florianjacob.de>
František Zatloukal <Zatloukal.Frantisek@gmail.com>
Gabriel Craciunescu <crazy@frugalware.org>
Generator <american.jesus.pt@gmail.com>
Guo Yunhe <guoyunhebrave@gmail.com>
Jonathan Marten <jjm@keelhaul.me.uk>
Jonathan Riddell <jr@jriddell.org>
José Pedro Arvela <jparvela@gmail.com>
Karl Ove Hufthammer <karl@huftis.org>
Kevin Funk <kfunk@kde.org>
Marcin Mikołajczak <me@m4sk.in>
Matthew Dawson <matthew@mjdsystems.ca>
Mika Kobayashi <mika@p4d.co.jp>
Nick Shaforostoff <shafff@ukr.net>
Nikolay Amiantov <ab@fmap.me>
Palo Kisa <palo.kisa@gmail.com>
Papoteur <yves.brungard_git@gadz.org>
leuqarte <leuqarte@users.noreply.github.com>
preisi <thomas.preisner@fau.de>
raven700 <raven700@o2.pl>
scootergrisen <scootergrisen@gmail.com>
林博仁 <Buo.Ren.Lin@gmail.com>
Alberto Luaces <aluaces@udc.es>
Aleix Pol <aleixpol@kde.org>
Aleksei Kovura <3616242+alex3kov@users.noreply.github.com>
Alexander Potashev <aspotashev@gmail.com>
Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
Arthur Țițeică <arthur@psw.ro>
B. Jacquot <bastien.jacquot@univ-reims.fr>
Bastian Beischer <bastian.beischer@gmail.com>
Baurzhan Muftakhidinov <baurthefirst@gmail.com>
Benjamin Chrétien <chretien@lirmm.fr>
Benjamin Robin <dev@benjarobin.fr>
Benno Fünfstück <benno.fuenfstueck@gmail.com>
Cherevan Andriy <cherevan.andriy@gmail.com>
Cochise César <cochisecesar@gmail.com>
David Heidelberger <david.heidelberger@ixit.cz>
Eric Engestrom <eric@engestrom.ch>
Eric Hameleers <alien@slackware.com>
Eric Koegel <eric.koegel@gmail.com>
Gabriel Martinez <reitaka@gmail.com>
Harald Sitter <sitter@kde.org>
HarveyMittens <teknocratdefunct@riseup.net>
Ioannis Koutras <ioannis.koutras@gmail.com>
Janik Rabe <janik-rabe@web.de>
Jeff Huang <s8321414@chakralinux.org>
Jeff Huang <s8321414@gmail.com>
Jiachen Yang <farseerfc@gmail.com>
Johannes Pointner <johannes.pointner@gmail.com>
Jon Eyolfson <jon@eyl.io>
Lasse Liehu <lasse.liehu@gmail.com>
Ludger Krämer <dbluelle@blau-weissoedingen.de>
Mads <mads@ab3.no>
Mario Young <maye.co@gmail.com>
Marius Bakke <mbakke@fastmail.com>
Mathieu Jobin <mathieu@justbudget.com>
Michal Petrucha <michal.petrucha@koniiiik.org>
Mingye Wang <arthur200126@gmail.com>
Mladen Pejaković <pejakm@autistici.org>
Nathaniel Graham <pointedstick@zoho.com>
Peter Wu <peter@lekensteyn.nl>
Petr Vanek <petr@scribus.info>
Péter Radics <mitchnull@gmail.com>
Robert Antoni Buj Gelonch <rbuj@users.noreply.github.com>
Robert Hoffmann <externer.dl.hoffmann@muenchen.de>
Robert Xu <robxu9@gmail.com>
Rohan Garg <rohan@kde.org>
SafaAlfulaij <safaalfulaij@hotmail.com>
Shinjo Park <peremen@gmail.com>
Simon Clemente <simon_clemente@yahoo.com>
Stany MARCEL <stanypub@gmail.com>
Stefan Majewsky <majewsky@gmx.net>
Steve Gerbino <steve@gerbino.co>
Sérgio Marques <smarquespt@gmail.com>
Takahiro Hashimoto <kenya888@gmail.com>
Thomas Preisner <mail@tpreisner.de>
Vincent43 <31109921+Vincent43@users.noreply.github.com>
Volkan Gezer <wakeup@users.noreply.github.com>
Volodymyr Medvid <vmmedvid@gmail.com>
Weng Xuetian <wengxt@gmail.com>
ZH <zhhhhz@zoho.com>
Zach Ploskey <zach@ploskey.com>
a.k.a. Harvey <teknocratdefunct@riseup.net>
akmc <liudas@akmc.lt>
alien999999999 <alien@rmail.be>
k2s <martin.minka@gmail.com>
m4sk1n <me@m4sk.in>
mortein79 <mortein79@gmail.com>
mscherer <misc@zarb.org>
raffarti <raffarti@zoho.com>
realsobek <liebundartig@freenet.de>
rehejuhan <jyri2000@mail.ee>
tesfabpel <tesfabpel@gmail.com>
w41l <walecha99@gmail.com>
林博仁(Buo-Ren Lin) <Buo.Ren.Lin@gmail.com>
+282
View File
@@ -0,0 +1,282 @@
## Legend
---------
+ New features
- Bug fixes
* Others
## 0.21.0
----------------------
+ sddm-greeter can now be built for both Qt5 and Qt6
+ Themes can now declare their Qt version compatibility to control which greeter gets used
+ New CMake option INSTALL_PAM_CONFIGURATION (defaults to ON)
+ Bulgarian translation added
* DBus policy files are now installed in /usr rather than /etc
* Do not show keyboard layouts on wayland as switching is not implemented
* Switch the default commandline for Weston to use the kiosk shell (available in 9.0+)
- Fix building with Qt 6.7
- Handle autologin failure by falling back to the greeter (#1775)
- Fix session names containing ',' (#1745)
- Don't let tmpfiles delete x11 auth files for very long running sessions
- Many improvements for the **experimental** wayland support
## 0.20.0 - 2023-06-23
----------------------
+ Initial Qt6 support (Will break themes which rely on Qt 5)
+ **Experimental** support for running the greeter with Wayland
+ Enable HiDPI scaling by default
+ Support for running X11 display server without root privileges
+ Greeter: Support setting environment variables
+ Allow additional env vars to be defined in session files (#1370)
+ Make accountsservice data directory overridable via CMake
+ Add support for X11 cursor size configuration
+ Search XDG Base Directories for session files
+ Display information and errors from PAM in the greeter (#1486)
* Remove the Passwd backend, make PAM mandatory
* Bump minimum CMake version to 3.4
* Introduce SDDM_INITIAL_VT as the TTY to reach out to
* Set XCURSOR_SIZE in XorgDisplayServer::start
* Make it possible to start ConsoleKit D-Bus service during SDDM startup
* pam: Do not use tally2 if faillock is present
* Bump to Qt 5.15, port away from deprecated APIs
* remove `-logfile` arg that causes server to fail
- Set RUNTIME_DIR to /run/sddm when using systemd to follow FHS 3.0
- Use avatars in FacesDir first and if not found search other locations
- Switch to using libxau with `FamilyWild` (#1230)
- New interface to access config values from themes (#1097)
- Session names are translated now (#1645)
- Many more bugfixes
## 0.19.0 - 2020-11-02
----------------------
* Don't disable authentication in --test-mode
- Fix X not having access control on startup
(fixes CVE-2020-28049)
- Don't fill UserModel if theme does not require it
* Set re-use session option by default
* Avoid adjusting active auth sessions
* Cleanup sessions on exit
* Don't abort on failure to start the display server
+ Custom default font
* Limit systemd service restarts
* Typo fixes
* Fix graphical glitches on NVIDIA after VT switching
* Rewind password database
* Memory allocation fixes
* FreeBSD fixes
* Use C++ scoping for handling buffer deletion
* Allow to configure the QML installation directory
* Port connects
* Keep string termination characters in utmp entries
* Look for available display for test mode
* Interlingue translation
* Remove chVt() from declarations
- Rewind password db before scanning it (again) for available users
- Session reuse: Only consider "online" sessions
* Use modern connects
* Update translations
## 0.18.1 - 2019-03-11
----------------------
- Fix crashes when creating a user session
## 0.18.0 - 2018-07-17
----------------------
+ Support theme supplied avatars
+ Compile against Qt 5.11
- Fix platform detection for HighDPI
- On close, switch VT to a running session if applicable
- Better ConsoleKit support
- Fix authentication when reusing existing sessions
- Hide sessions with NoDisplay=true
- Honor PAM's ambient supplemental groups
- Cleanup socket destruction
- Don't quit on SIGHUP
* Updated translations
## 0.17.0 - 2017-12-05
----------------------
+ Added possibility to change border width of ComboBox widget.
+ Added missing utmp/wtmp/btmp handling.
+ Make greeter see icons set by AccountsServices.
- Fix sddm.conf man page syntax error and update.
- Fix ComboBox widget.
- Fix connection of PropertiesChanged event for LogindSeat.
- Avoid race conditions with Xsetup.
* Update de translation.
* Update lt translation.
* Update zh_TW translation.
* Adjust order of components in the default PATH.
* Set default input method to qtvirtualkeyboard.
## 0.16.0 - 2017-10-04
----------------------
+ Support non-latin characters in theme settings.
+ Support fish shell in Xsession and wayland-session.
+ Unlock GNOME keyring at login.
+ Configuration directory.
- Make the default cursor themed.
- Update date and time in elarun theme.
- Fix theme metadata default values.
- Fix session selection in elarun.
- Do not truncate XAUTHORITY on login.
- Make enabled property of Button functional.
- Fix typos in documentation.
* Re-use existing sessions.
* Add ConsoleKit 2 support.
* Stop assuming shadow(5) is always available.
* Explicitely set XDG_SEAT when starting a user session.
* Suppress errors when pam_elogind is not available.
* Suppress errors when pam_systemd is not available.
* Added possibility to change color of dropdown menu.
* Add Hindi translation.
* Completed Swedish translation.
* Update French translation.
## 0.15.0 - 2017-08-30
----------------------
- Fix display of avatars.
+ New sddm.conf option EnableHiDPI to allow opt out of auto scaling.
- Theme cursor.
+ Support optional kwallet PAM opening.
+ Autologin, try last successful login if not explicitly set.
+ Ignore session desktop files with hidden=true.
+ Support elogind.
## 0.14.0 - 2016-08-28
----------------------
+ New sddm.conf option EnableAvatars (useful for slow filesystems)
+ New sddm.conf option UserAuthFile on the XDisplay section
to change the default Xauthority file name and path.
+ New sddm.conf option SessionLogFile on XDisplay and WaylandDisplay
sections to change the default user session log location.
+ ComboBox now exposes the arrow background color as
"arrowColor" property.
+ New "style" theme configuration for QtQuick Controls 2.0.
+ Require Qt 5.6 or better.
+ Enable HiDPI support.
+ Refresh sessions list.
+ Always fallback to an embedded theme if no suitable theme is found.
- Actually change Qt platform theme.
- Switch to Wayland session vt only when authentication
succeeds.
- Close PAM session.
- Delete PAM credentials after closing the session.
* More theme-neutral default user and root avatars
* REMOVED the "circles" theme. Remember to change it if you had it set!
* REMOVED the "maui" theme as a standalone theme as it is now
embedded in the greeter. Remember to change the theme to empty
if you had it set to "maui".
* Update Estonian translation.
* Add Catalan translation from Robert Antoni Buj Gelonch.
* Add Dutch translation from Eric Hameleers.
* Add Slovak translation from Martin Minka.
* Add Swedish translation from Kristoffer Grundström.
* Add Ukrainian translation from Cherevan Andriy.
* Add Indian flag from Sanjeev Premi.
## 0.13.0 - 2015-11-04
----------------------
+ Greeter inherits path environment variables from parent so that
themes installed in non-standard paths will work.
+ Add ENABLE_PAM option to toggle PAM support at build time.
+ Allow overriding textColor in ComboBox.
- Don't cast QByteArray to (char *).
- Disable greeters from loading KDE's debug hander
(fix CVE-2015-0856).
- Fix multi-screen support for some setups.
* Added Serbian translation.
* Added Traditional Chinese translation.
* Improved German translation.
* Remove failsafe session entry.
* Close the pipe fd passed to X server.
* A few micro-optimizations.
## 0.12.0 - 2015-09-05
----------------------
* Add a new "platformTheme" setting for themes.
Themes can now specify a Qt platform theme plugin.
* Autodetect UID_MIN and UID_MAX from /etc/login.defs
* Add Arabic translation by Safa Alfulaij.
* Add Hungarian translation by mortein79.
* Russian translation improvements by Alexander Potashev.
* Wait for display setup script to finish.
* Reload configuration after display setup.
* Pass locale environment variables to the greeter.
* Support right-to-left languages.
* Wayland session support.
* Xorg server arguments are configurable.
* Honor locale settings in /etc/environment
* Allow SYSTEMD_SYSTEM_UNIT_DIR to be overridden at compile time.
* No longer hardcode min/max UIDs.
* FreeBSD build fixes.
* Fixed Qt 5.5 build warnings.
* Honor TryExec in Xsession desktop files.
* New sddm.conf option XephyrPath.
* New sddm.conf option ServerArguments.
* New sddm.conf option DisplayStopCommand.
* Enable QT_NO_CAST_FROM_ASCII.
* Replace non-free background with a CC-BY-SA alternative for
the maldives theme.
* Many untracked bug fixes.
## 0.11.0 - 2014-11-20
----------------------
+ Reload the configuration every time we start a new session
- Fix stderr redirection in the helper. Solving a memory leak
- Set system locale in the greeter
- Bail on chdir failure
* Use QUuid for unique ID generation
* Update lithuanian translations
## 0.10.0 - 2014-10-16
----------------------
+ Set default icon theme from greeter theme configuration.
+ Set cursor theme according to greeter theme configuration.
- Never permit a login as the sddm user (CVE-2014-7271)
- Fix race condition in XAUTHORITY code (CVE-2014-7272)
- XAUTHORITY is no longer owned by root
- Flush any buffered data to the log file, this writes immediately
all the log messages.
- Fixed password field initial focus state
- Don't override pam environment variables.
* Remove Qt 4 support.
* Prioritize sessions with a .desktop prefix
* Add Kazakh translation.
* Separate display server specific code.
## 0.9.0 - 2014-08-02
---------------------
+ Implemented automatic login
+ Greeter now runs as its own user
+ Added translation support for themes.
+ Added keyboard layout support.
+ Added option to turn on numlock at startup.
+ ~/.xsession-errors support
+ Improved compatibility with GNOME and Unity
+ Initial Plymouth support
+ Implemented logging to journald if available
+ Added org.freedesktop.DisplayManager interface
+ Fast user switching
+ Test mode that can be toggled at runtime
+ Auto Relogging
+ User filtering based on shell
+ User filtering based on name
+ PAM is now optional
- No longer stripping comments from sddm.conf on login
- Fixed incorrect PAM handling causing PulseAudio to fail.
- Fixed a crash caused by incorrect handling of PAM
- Fixed compilation with Qt 5.0.0
- Correctly import PAM environment into the sesion
- Fixed missing environment variables
- Find empty displays and virtual desktops automatically
- Exit gracefully when SIGTERM is received
- Fix running SDDM under a Plasma 5.0 desktop.
* Now using Oxygen instead of Geosans Light
* Added man pages sddm(1), sddm-greeter(1), sddm.conf(5)
* Removed custom session
* Failsafe is no longer the default session
## 0.1.0 - 2013-03-19
---------------------
* Initial release
+39
View File
@@ -0,0 +1,39 @@
## Installation instructions
SDDM uses CMake to configure and build the project.
1. From the project root, create a build directory: `mkdir build`
2. From the build directory, run cmake to the project root. Eg: `cd build && cmake ..`
3. To build, run `make`.
4. To install, run `make install`.
CMake accepts a number of standard and extra arguments:
- BUILD_MAN_PAGES, pass -DBUILD_MAN_PAGES=ON to build man pages
- ENABLE_JOURNALD, pass -DENABLE_JOURNALD=OFF
to disable logging to the journal
By default, a debug build is created. To build for production, use
`cmake -DCMAKE_BUILD_TYPE=Release`.
To see all the possible arguments, run `cmake -L ..`.
For documentation on standard CMake variables, see:
http://www.cmake.org/cmake/help/v3.0/manual/cmake-variables.7.html
### Post-installation steps
By default, SDDM runs as its own user. An `sddm` user needs to be created, with
its home set to `/var/lib/sddm` by default.
### Dependencies
SDDM depends on PAM for authorization and XCB to communicate with the X server.
Apart from other things, it also depends on Qt for the user interface and event
loop management.
SDDM can optionally make use of logind (the systemd login manager API), or
ConsoleKit2, or upower to enable support for suspend, hibernate etc.
In order to build the man pages, you will need `rst2man` installed. It is
provided by the python `docutils` package
Note that SDDM makes use of C++11 features for a modern and clean codebase,
therefore it needs a recent version of GCC to compile (4.7 at least).
+280
View File
@@ -0,0 +1,280 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
@@ -0,0 +1,299 @@
Creative Commons Legal Code
Attribution 3.0 Unported
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL
SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT
RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS"
BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION
PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.
License
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE
BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE
CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE
IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
1. Definitions
a. "Adaptation" means a work based upon the Work, or upon the Work and other
pre-existing works, such as a translation, adaptation, derivative work,
arrangement of music or other alterations of a literary or artistic work,
or phonogram or performance and includes cinematographic adaptations or any
other form in which the Work may be recast, transformed, or adapted
including in any form recognizably derived from the original, except that a
work that constitutes a Collection will not be considered an Adaptation for
the purpose of this License. For the avoidance of doubt, where the Work is
a musical work, performance or phonogram, the synchronization of the Work
in timed-relation with a moving image ("synching") will be considered an
Adaptation for the purpose of this License.
b. "Collection" means a collection of literary or artistic works, such as
encyclopedias and anthologies, or performances, phonograms or broadcasts,
or other works or subject matter other than works listed in Section 1(f)
below, which, by reason of the selection and arrangement of their contents,
constitute intellectual creations, in which the Work is included in its
entirety in unmodified form along with one or more other contributions,
each constituting separate and independent works in themselves, which
together are assembled into a collective whole. A work that constitutes a
Collection will not be considered an Adaptation (as defined above) for the
purposes of this License.
c. "Distribute" means to make available to the public the original and copies
of the Work or Adaptation, as appropriate, through sale or other transfer
of ownership.
d. "Licensor" means the individual, individuals, entity or entities that offer
(s) the Work under the terms of this License.
e. "Original Author" means, in the case of a literary or artistic work, the
individual, individuals, entity or entities who created the Work or if no
individual or entity can be identified, the publisher; and in addition (i)
in the case of a performance the actors, singers, musicians, dancers, and
other persons who act, sing, deliver, declaim, play in, interpret or
otherwise perform literary or artistic works or expressions of folklore;
(ii) in the case of a phonogram the producer being the person or legal
entity who first fixes the sounds of a performance or other sounds; and,
(iii) in the case of broadcasts, the organization that transmits the
broadcast.
f. "Work" means the literary and/or artistic work offered under the terms of
this License including without limitation any production in the literary,
scientific and artistic domain, whatever may be the mode or form of its
expression including digital form, such as a book, pamphlet and other
writing; a lecture, address, sermon or other work of the same nature; a
dramatic or dramatico-musical work; a choreographic work or entertainment
in dumb show; a musical composition with or without words; a
cinematographic work to which are assimilated works expressed by a process
analogous to cinematography; a work of drawing, painting, architecture,
sculpture, engraving or lithography; a photographic work to which are
assimilated works expressed by a process analogous to photography; a work
of applied art; an illustration, map, plan, sketch or three-dimensional
work relative to geography, topography, architecture or science; a
performance; a broadcast; a phonogram; a compilation of data to the extent
it is protected as a copyrightable work; or a work performed by a variety
or circus performer to the extent it is not otherwise considered a literary
or artistic work.
g. "You" means an individual or entity exercising rights under this License
who has not previously violated the terms of this License with respect to
the Work, or who has received express permission from the Licensor to
exercise rights under this License despite a previous violation.
h. "Publicly Perform" means to perform public recitations of the Work and to
communicate to the public those public recitations, by any means or
process, including by wire or wireless means or public digital
performances; to make available to the public Works in such a way that
members of the public may access these Works from a place and at a place
individually chosen by them; to perform the Work to the public by any means
or process and the communication to the public of the performances of the
Work, including by public digital performance; to broadcast and rebroadcast
the Work by any means including signs, sounds or images.
i. "Reproduce" means to make copies of the Work by any means including without
limitation by sound or visual recordings and the right of fixation and
reproducing fixations of the Work, including storage of a protected
performance or phonogram in digital form or other electronic medium.
2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit,
or restrict any uses free from copyright or rights arising from limitations or
exceptions that are provided for in connection with the copyright protection
under copyright law or other applicable laws.
3. License Grant. Subject to the terms and conditions of this License, Licensor
hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the
duration of the applicable copyright) license to exercise the rights in the
Work as stated below:
a. to Reproduce the Work, to incorporate the Work into one or more
Collections, and to Reproduce the Work as incorporated in the Collections;
b. to create and Reproduce Adaptations provided that any such Adaptation,
including any translation in any medium, takes reasonable steps to clearly
label, demarcate or otherwise identify that changes were made to the
original Work. For example, a translation could be marked "The original
work was translated from English to Spanish," or a modification could
indicate "The original work has been modified.";
c. to Distribute and Publicly Perform the Work including as incorporated in
Collections; and,
d. to Distribute and Publicly Perform Adaptations.
e. For the avoidance of doubt:
i. Non-waivable Compulsory License Schemes. In those jurisdictions in
which the right to collect royalties through any statutory or
compulsory licensing scheme cannot be waived, the Licensor reserves the
exclusive right to collect such royalties for any exercise by You of
the rights granted under this License;
ii. Waivable Compulsory License Schemes. In those jurisdictions in which
the right to collect royalties through any statutory or compulsory
licensing scheme can be waived, the Licensor waives the exclusive right
to collect such royalties for any exercise by You of the rights granted
under this License; and,
iii. Voluntary License Schemes. The Licensor waives the right to collect
royalties, whether individually or, in the event that the Licensor is a
member of a collecting society that administers voluntary licensing
schemes, via that society, from any exercise by You of the rights
granted under this License.
The above rights may be exercised in all media and formats whether now known or
hereafter devised. The above rights include the right to make such
modifications as are technically necessary to exercise the rights in other
media and formats. Subject to Section 8(f), all rights not expressly granted by
Licensor are hereby reserved.
4. Restrictions. The license granted in Section 3 above is expressly made
subject to and limited by the following restrictions:
a. You may Distribute or Publicly Perform the Work only under the terms of
this License. You must include a copy of, or the Uniform Resource
Identifier (URI) for, this License with every copy of the Work You
Distribute or Publicly Perform. You may not offer or impose any terms on
the Work that restrict the terms of this License or the ability of the
recipient of the Work to exercise the rights granted to that recipient
under the terms of the License. You may not sublicense the Work. You must
keep intact all notices that refer to this License and to the disclaimer of
warranties with every copy of the Work You Distribute or Publicly Perform.
When You Distribute or Publicly Perform the Work, You may not impose any
effective technological measures on the Work that restrict the ability of a
recipient of the Work from You to exercise the rights granted to that
recipient under the terms of the License. This Section 4(a) applies to the
Work as incorporated in a Collection, but this does not require the
Collection apart from the Work itself to be made subject to the terms of
this License. If You create a Collection, upon notice from any Licensor You
must, to the extent practicable, remove from the Collection any credit as
required by Section 4(b), as requested. If You create an Adaptation, upon
notice from any Licensor You must, to the extent practicable, remove from
the Adaptation any credit as required by Section 4(b), as requested.
b. If You Distribute, or Publicly Perform the Work or any Adaptations or
Collections, You must, unless a request has been made pursuant to Section 4
(a), keep intact all copyright notices for the Work and provide, reasonable
to the medium or means You are utilizing: (i) the name of the Original
Author (or pseudonym, if applicable) if supplied, and/or if the Original
Author and/or Licensor designate another party or parties (e.g., a sponsor
institute, publishing entity, journal) for attribution ("Attribution
Parties") in Licensor's copyright notice, terms of service or by other
reasonable means, the name of such party or parties; (ii) the title of the
Work if supplied; (iii) to the extent reasonably practicable, the URI, if
any, that Licensor specifies to be associated with the Work, unless such
URI does not refer to the copyright notice or licensing information for the
Work; and (iv) , consistent with Section 3(b), in the case of an
Adaptation, a credit identifying the use of the Work in the Adaptation
(e.g., "French translation of the Work by Original Author," or "Screenplay
based on original Work by Original Author"). The credit required by this
Section 4 (b) may be implemented in any reasonable manner; provided,
however, that in the case of a Adaptation or Collection, at a minimum such
credit will appear, if a credit for all contributing authors of the
Adaptation or Collection appears, then as part of these credits and in a
manner at least as prominent as the credits for the other contributing
authors. For the avoidance of doubt, You may only use the credit required
by this Section for the purpose of attribution in the manner set out above
and, by exercising Your rights under this License, You may not implicitly
or explicitly assert or imply any connection with, sponsorship or
endorsement by the Original Author, Licensor and/or Attribution Parties, as
appropriate, of You or Your use of the Work, without the separate, express
prior written permission of the Original Author, Licensor and/or
Attribution Parties.
c. Except as otherwise agreed in writing by the Licensor or as may be
otherwise permitted by applicable law, if You Reproduce, Distribute or
Publicly Perform the Work either by itself or as part of any Adaptations or
Collections, You must not distort, mutilate, modify or take other
derogatory action in relation to the Work which would be prejudicial to the
Original Author's honor or reputation. Licensor agrees that in those
jurisdictions (e.g. Japan), in which any exercise of the right granted in
Section 3(b) of this License (the right to make Adaptations) would be
deemed to be a distortion, mutilation, modification or other derogatory
action prejudicial to the Original Author's honor and reputation, the
Licensor will waive or not assert, as appropriate, this Section, to the
fullest extent permitted by the applicable national law, to enable You to
reasonably exercise Your right under Section 3(b) of this License (right to
make Adaptations) but not otherwise.
5. Representations, Warranties and Disclaimer
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS
THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND
CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING,
WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A
PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE.
SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH
EXCLUSION MAY NOT APPLY TO YOU.
6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN
NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS
LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
7. Termination
a. This License and the rights granted hereunder will terminate automatically
upon any breach by You of the terms of this License. Individuals or
entities who have received Adaptations or Collections from You under this
License, however, will not have their licenses terminated provided such
individuals or entities remain in full compliance with those licenses.
Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
b. Subject to the above terms and conditions, the license granted here is
perpetual (for the duration of the applicable copyright in the Work).
Notwithstanding the above, Licensor reserves the right to release the Work
under different license terms or to stop distributing the Work at any time;
provided, however that any such election will not serve to withdraw this
License (or any other license that has been, or is required to be, granted
under the terms of this License), and this License will continue in full
force and effect unless terminated as stated above.
8. Miscellaneous
a. Each time You Distribute or Publicly Perform the Work or a Collection, the
Licensor offers to the recipient a license to the Work on the same terms
and conditions as the license granted to You under this License.
b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers
to the recipient a license to the original Work on the same terms and
conditions as the license granted to You under this License.
c. If any provision of this License is invalid or unenforceable under
applicable law, it shall not affect the validity or enforceability of the
remainder of the terms of this License, and without further action by the
parties to this agreement, such provision shall be reformed to the minimum
extent necessary to make such provision valid and enforceable.
d. No term or provision of this License shall be deemed waived and no breach
consented to unless such waiver or consent shall be in writing and signed
by the party to be charged with such waiver or consent.
e. This License constitutes the entire agreement between the parties with
respect to the Work licensed here. There are no understandings, agreements
or representations with respect to the Work not specified here. Licensor
shall not be bound by any additional provisions that may appear in any
communication from You. This License may not be modified without the mutual
written agreement of the Licensor and You.
f. The rights granted under, and the subject matter referenced, in this
License were drafted utilizing the terminology of the Berne Convention for
the Protection of Literary and Artistic Works (as amended on September 28,
1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the
WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright
Convention (as revised on July 24, 1971). These rights and subject matter
take effect in the relevant jurisdiction in which the License terms are
sought to be enforced according to the corresponding provisions of the
implementation of those treaty provisions in the applicable national law.
If the standard suite of rights granted under applicable copyright law
includes additional rights not granted under this License, such additional
rights are deemed to be included in the License; this License is not
intended to restrict the license of any rights under applicable law.
Creative Commons Notice
Creative Commons is not a party to this License, and makes no warranty
whatsoever in connection with the Work. Creative Commons will not be liable
to You or any party on any legal theory for any damages whatsoever,
including without limitation any general, special, incidental or
consequential damages arising in connection to this license.
Notwithstanding the foregoing two (2) sentences, if Creative Commons has
expressly identified itself as the Licensor hereunder, it shall have all
rights and obligations of Licensor.
Except for the limited purpose of indicating to the public that the Work is
licensed under the CCPL, Creative Commons does not authorize the use by
either party of the trademark "Creative Commons" or any related trademark
or logo of Creative Commons without the prior written consent of Creative
Commons. Any permitted use will be in compliance with Creative Commons'
then-current trademark usage guidelines, as may be published on its website
or otherwise made available upon request from time to time. For the
avoidance of doubt, this trademark restriction does not form part of this
License.
Creative Commons may be contacted at https://creativecommons.org/.
+107
View File
@@ -0,0 +1,107 @@
## INTRODUCTION
[![IRC Network](https://img.shields.io/badge/irc-freenode-blue.svg "IRC Freenode")](https://webchat.freenode.net/?channels=sddm)
SDDM is a modern display manager for X11 and Wayland sessions aiming to
be fast, simple and beautiful.
It uses modern technologies like QtQuick, which in turn gives the designer the ability to
create smooth, animated user interfaces.
SDDM is extremely themeable. We put no restrictions on the user interface design,
it is completely up to the designer. We simply provide a few callbacks to the user interface
which can be used for authentication, suspend etc.
To further ease theme creation we provide some premade components like a textbox,
a combox etc.
There are a few sample themes distributed with SDDM.
They can be used as a starting point for new themes.
## SCREENSHOTS
![sample screenshot](https://raw.github.com/sddm/sddm/master/src/greeter/theme/maui.jpg)
## VIDEOS
* [Video background](https://www.youtube.com/watch?v=kKwz2FQcE3c)
* [Maui theme 1](https://www.youtube.com/watch?v=-0d1wkcU9DU)
* [Maui theme 2](https://www.youtube.com/watch?v=dJ28mrOeuNA)
## RESOURCES
* [Issue tracker](https://github.com/sddm/sddm/issues)
* [Wiki](https://github.com/sddm/sddm/wiki)
* [Mailing List](https://groups.google.com/group/sddm-devel)
* IRC channel `#sddm` on [chat.freenode.net](https://webchat.freenode.net?channels=sddm)
## INSTALLATION
Qt >= 5.15.0 is required to use SDDM.
SDDM runs the greeter as a system user named "sddm" whose home directory needs
to be set to `/var/lib/sddm`.
If pam and systemd are available, the greeter will go through logind
which will give it access to drm devices.
Distributions without pam and systemd will need to put the "sddm" user
into the "video" group, otherwise errors regarding GL and drm devices
might be experienced.
## VIRTUAL TERMINALS
SDDM is assumed to start at the tty specified by the cmake variable
SDDM_INITIAL_VT which is an integer and defaults to 1.
If SDDM_INITIAL_VT wasn't available, SDDM will use the next available one
instead.
You can override SDDM_INITIAL_VT if you want to have a different one if,
for example, you were planning on using tty1 for something else.
## LICENSE
Source code of SDDM is licensed under GNU GPL version 2 or later (at your choosing).
QML files are MIT licensed and images are CC BY 3.0.
## TROUBLESHOOTING
### NVIDIA Prime
Add this at the bottom of the Xsetup script:
```sh
if [ -e /sbin/prime-offload ]; then
echo running NVIDIA Prime setup /sbin/prime-offload, you will need to manually run /sbin/prime-switch to shut down
/sbin/prime-offload
fi
```
### No User Icon
SDDM reads user icon from either ~/.face.icon or FacesDir/username.face.icon
You need to make sure that SDDM user have permissions to read those files.
In case you don't want to allow other users to access your $HOME you can use
ACLs if your filesystem does support it.
```sh
setfacl -m u:sddm:x /home/username
setfacl -m u:sddm:r /home/username/.face.icon
```
### Custom DPI
In order to set custom DPI for high resolution screens you should configure
Xorg yourself. An easy way is to pass an additional argument to Xorg.
Edit ``/etc/sddm.conf``, go to the ``X11`` section and change ``ServerArguments`` like this:
```
ServerArguments=-nolisten tcp -dpi 192
```
to set DPI to 192.
As an alternative you can edit Xorg configuration ``xorg.conf``, please refer to the
Xorg documentation.
@@ -0,0 +1,75 @@
# - Try to find the PAM libraries
# Once done this will define
#
# PAM_FOUND - system has pam
# PAM_INCLUDE_DIR - the pam include directory
# PAM_LIBRARIES - libpam library
if (PAM_INCLUDE_DIR AND PAM_LIBRARY)
# Already in cache, be silent
set(PAM_FIND_QUIETLY TRUE)
endif (PAM_INCLUDE_DIR AND PAM_LIBRARY)
find_path(PAM_INCLUDE_DIR NAMES security/pam_appl.h pam/pam_appl.h)
find_library(PAM_LIBRARY pam)
find_library(DL_LIBRARY dl)
find_library(HAVE_PAM_FAILLOCK NAME pam_faillock.so PATH_SUFFIXES security)
if (PAM_INCLUDE_DIR AND PAM_LIBRARY)
set(PAM_FOUND TRUE)
if (DL_LIBRARY)
set(PAM_LIBRARIES ${PAM_LIBRARY} ${DL_LIBRARY})
else (DL_LIBRARY)
set(PAM_LIBRARIES ${PAM_LIBRARY})
endif (DL_LIBRARY)
if (EXISTS ${PAM_INCLUDE_DIR}/pam/pam_appl.h)
# darwin claims to be something special
set(HAVE_PAM_PAM_APPL_H 1)
endif (EXISTS ${PAM_INCLUDE_DIR}/pam/pam_appl.h)
if (NOT DEFINED PAM_MESSAGE_CONST)
include(CheckCXXSourceCompiles)
# XXX does this work with plain c?
check_cxx_source_compiles("
#if ${HAVE_PAM_PAM_APPL_H}+0
# include <pam/pam_appl.h>
#else
# include <security/pam_appl.h>
#endif
static int PAM_conv(
int num_msg,
const struct pam_message **msg, /* this is the culprit */
struct pam_response **resp,
void *ctx)
{
return 0;
}
int main(void)
{
struct pam_conv PAM_conversation = {
&PAM_conv, /* this bombs out if the above does not match */
0
};
return 0;
}
" PAM_MESSAGE_CONST)
endif (NOT DEFINED PAM_MESSAGE_CONST)
set(PAM_MESSAGE_CONST ${PAM_MESSAGE_CONST} CACHE BOOL "PAM expects a conversation function with const pam_message")
endif (PAM_INCLUDE_DIR AND PAM_LIBRARY)
if (PAM_FOUND)
if (NOT PAM_FIND_QUIETLY)
message(STATUS "Found PAM: ${PAM_LIBRARIES}")
endif (NOT PAM_FIND_QUIETLY)
else (PAM_FOUND)
if (PAM_FIND_REQUIRED)
message(FATAL_ERROR "PAM was not found")
endif(PAM_FIND_REQUIRED)
endif (PAM_FOUND)
mark_as_advanced(PAM_INCLUDE_DIR PAM_LIBRARY DL_LIBRARY PAM_MESSAGE_CONST)
@@ -0,0 +1,54 @@
# - Try to find libxcb
# Once done this will define
#
# LIBXCB_FOUND - system has libxcb
# LIBXCB_LIBRARIES - Link these to use libxcb
# LIBXCB_INCLUDE_DIR - the libxcb include dir
# LIBXCB_DEFINITIONS - compiler switches required for using libxcb
# Copyright (c) 2008 Helio Chissini de Castro, <helio@kde.org>
# Copyright (c) 2007, Matthias Kretz, <kretz@kde.org>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
IF (NOT WIN32)
IF (LIBXCB_INCLUDE_DIR AND LIBXCB_LIBRARIES)
# in cache already
SET(XCB_FIND_QUIETLY TRUE)
ENDIF (LIBXCB_INCLUDE_DIR AND LIBXCB_LIBRARIES)
FIND_PACKAGE(PkgConfig)
PKG_CHECK_MODULES(PKG_XCB xcb)
SET(LIBXCB_DEFINITIONS ${PKG_XCB_CFLAGS})
FIND_PATH(LIBXCB_INCLUDE_DIR xcb/xcb.h ${PKG_XCB_INCLUDE_DIRS})
FIND_LIBRARY(LIBXCB_LIBRARIES NAMES xcb libxcb PATHS ${PKG_XCB_LIBRARY_DIRS})
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(XCB DEFAULT_MSG LIBXCB_LIBRARIES LIBXCB_INCLUDE_DIR)
MARK_AS_ADVANCED(LIBXCB_INCLUDE_DIR LIBXCB_LIBRARIES XCBPROC_EXECUTABLE)
ENDIF (NOT WIN32)
@@ -0,0 +1,58 @@
# - Try to find libxcb
# Once done this will define
#
# LIBXKB_FOUND - system has libxcb
# LIBXKB_LIBRARIES - Link these to use libxcb-xkb
# LIBXKB_INCLUDE_DIR - the libxcb-xkb include dir
# LIBXKB_DEFINITIONS - compiler switches required for using libxcb
# Copyright (c) 2013, Abdurrahman AVCI, <abdurrahmanavci@gmail.com>
# Copyright (c) 2008, Helio Chissini de Castro, <helio@kde.org>
# Copyright (c) 2007, Matthias Kretz, <kretz@kde.org>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
IF (NOT WIN32)
IF (LIBXKB_INCLUDE_DIR AND LIBXKB_LIBRARIES)
# in cache already
SET(XKB_FIND_QUIETLY TRUE)
ENDIF (LIBXKB_INCLUDE_DIR AND LIBXKB_LIBRARIES)
# use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
FIND_PACKAGE(PkgConfig)
PKG_CHECK_MODULES(PKG_XKB xcb-xkb)
SET(LIBXKB_DEFINITIONS ${PKG_XKB_CFLAGS})
FIND_PATH(LIBXKB_INCLUDE_DIR xcb/xkb.h ${PKG_XKB_INCLUDE_DIRS})
FIND_LIBRARY(LIBXKB_LIBRARIES NAMES xcb-xkb libxcb-xkb PATHS ${PKG_XKB_LIBRARY_DIRS})
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(XKB DEFAULT_MSG LIBXKB_LIBRARIES LIBXKB_INCLUDE_DIR)
MARK_AS_ADVANCED(LIBXKB_INCLUDE_DIR LIBXKB_LIBRARIES)
ENDIF (NOT WIN32)
@@ -0,0 +1,48 @@
/***************************************************************************
* Copyright (c) 2013 Abdurrahman AVCI <abdurrahmanavci@gmail.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
***************************************************************************/
import QtQuick 2.0
FocusScope {
id: container
property alias source: image.source
property alias fillMode: image.fillMode
property alias status: image.status
Image {
id: image
anchors.fill: parent
clip: true
focus: true
smooth: true
}
MouseArea {
anchors.fill: parent
onClicked: container.focus = true
}
}
@@ -0,0 +1,131 @@
/***************************************************************************
* Copyright (c) 2013 Abdurrahman AVCI <abdurrahmanavci@gmail.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
***************************************************************************/
import QtQuick 2.0
Rectangle {
id: container
width: 80; height: 30
property alias borderColor: main.color
property alias textColor: textArea.color
property alias font: textArea.font
property alias text: textArea.text
property alias implicitWidth: textArea.implicitWidth
property alias implicitHeight: textArea.implicitHeight
color: "#4682b4"
property color disabledColor: "#888888"
property color activeColor: "#266294"
property color pressedColor: "#064264"
property bool enabled: true
property bool spaceDown: false
property bool isFocused: activeFocus || mouseArea.containsMouse
property bool isPressed: spaceDown || mouseArea.pressed
signal pressed()
signal released()
signal clicked()
states: [
State {
name: "disabled"; when: (container.enabled === false)
PropertyChanges { target: container; color: disabledColor }
PropertyChanges { target: main; color: disabledColor }
},
State {
name: "active"; when: container.enabled && container.isFocused && !container.isPressed
PropertyChanges { target: container; color: activeColor }
PropertyChanges { target: main; color: activeColor }
},
State {
name: "pressed"; when: container.enabled && container.isPressed
PropertyChanges { target: container; color: pressedColor }
PropertyChanges { target: main; color: pressedColor }
}
]
Behavior on color { NumberAnimation { duration: 200 } }
clip: true
smooth: true
Rectangle {
id: main
width: parent.width - 2; height: parent.height - 2
anchors.centerIn: parent
color: parent.color
border.color: "white"
border.width: 1
visible: container.isFocused
}
Text {
id: textArea
anchors.centerIn: parent
color: "white"
text: "Button"
font.bold: true
}
MouseArea {
id: mouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: container.enabled
enabled: container.enabled
acceptedButtons: Qt.LeftButton
onPressed: { container.focus = true; container.pressed() }
onClicked: { container.focus = true; container.clicked() }
onReleased: { container.focus = true; container.released() }
}
Keys.onPressed: {
if (event.key === Qt.Key_Space) {
container.spaceDown = true;
container.pressed()
event.accepted = true
} else if (event.key === Qt.Key_Return) {
container.clicked()
event.accepted = true
}
}
Keys.onReleased: {
if (event.key === Qt.Key_Space) {
container.spaceDown = false;
container.released()
container.clicked()
event.accepted = true
}
}
}
@@ -0,0 +1,61 @@
/***************************************************************************
* Copyright (c) 2013 Abdurrahman AVCI <abdurrahmanavci@gmail.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
***************************************************************************/
import QtQuick 2.0
Column {
id: container
property date dateTime: new Date()
property color color: "white"
property alias timeFont: time.font
property alias dateFont: date.font
Timer {
interval: 100; running: true; repeat: true;
onTriggered: container.dateTime = new Date()
}
Text {
id: time
anchors.horizontalCenter: parent.horizontalCenter
color: container.color
text : Qt.formatTime(container.dateTime, "hh:mm")
font.pointSize: 72
}
Text {
id: date
anchors.horizontalCenter: parent.horizontalCenter
color: container.color
text : Qt.formatDate(container.dateTime, Qt.DefaultLocaleLongDate)
font.pointSize: 24
}
}
@@ -0,0 +1,258 @@
/***************************************************************************
* Copyright (c) 2013 Abdurrahman AVCI <abdurrahmanavci@gmail.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
***************************************************************************/
import QtQuick 2.0
FocusScope {
id: container
width: 80; height: 30
property color color: "white"
property color borderColor: "#ababab"
property color focusColor: "#266294"
property color hoverColor: "#5692c4"
property color menuColor: "white"
property color textColor: "black"
property int borderWidth: 1
property font font
property alias model: listView.model
property int index: 0
property alias arrowColor: arrow.color
property alias arrowIcon: arrowIcon.source
property Component rowDelegate: defaultRowDelegate
signal valueChanged(int id)
Component {
id: defaultRowDelegate
Text {
anchors.fill: parent
anchors.margins: 3 + container.borderWidth + (LayoutMirroring.enabled ? arrow.width : 0)
verticalAlignment: Text.AlignVCenter
color: container.textColor
font: container.font
text: parent.modelItem.name
}
}
onFocusChanged: if (!container.activeFocus) close(false)
Rectangle {
id: main
anchors.fill: parent
color: container.color
border.color: container.borderColor
border.width: container.borderWidth
Behavior on border.color { ColorAnimation { duration: 100 } }
states: [
State {
name: "hover"; when: mouseArea.containsMouse
PropertyChanges { target: main; border.width: container.borderWidth; border.color: container.hoverColor }
},
State {
name: "focus"; when: container.activeFocus && !mouseArea.containsMouse
PropertyChanges { target: main; border.width: container.borderWidth; border.color: container.focusColor }
}
]
}
Loader {
id: topRow
anchors.fill: parent
focus: true
clip: true
sourceComponent: rowDelegate
property variant modelItem
}
Rectangle {
id: arrow
anchors.right: parent.right
width: 20 + 2*border.width; height: parent.height
border.color: main.border.color
border.width: main.border.width
Image {
id: arrowIcon
anchors.fill: parent
anchors.leftMargin: parent.border.width
anchors.rightMargin: parent.border.width
clip: true
smooth: true
fillMode: Image.PreserveAspectFit
}
}
MouseArea {
id: mouseArea
anchors.fill: container
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
onEntered: if (main.state == "") main.state = "hover";
onExited: if (main.state == "hover") main.state = "";
onClicked: { container.focus = true; toggle() }
onWheel: {
if (wheel.angleDelta.y > 0)
listView.decrementCurrentIndex()
else
listView.incrementCurrentIndex()
}
}
Keys.onPressed: {
if (event.key === Qt.Key_Up) {
listView.decrementCurrentIndex()
} else if (event.key === Qt.Key_Down) {
if (event.modifiers !== Qt.AltModifier)
listView.incrementCurrentIndex()
else
toggle()
} else if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
close(true)
} else if (event.key === Qt.Key_Escape) {
close(false)
}
}
Rectangle {
id: dropDown
width: container.width; height: 0
anchors.top: container.bottom
anchors.topMargin: 0
color: container.menuColor
clip: true
Behavior on height { NumberAnimation { duration: 100 } }
Component {
id: myDelegate
Rectangle {
width: dropDown.width; height: container.height - 2*container.borderWidth
color: "transparent"
Loader {
id: loader
anchors.fill: parent
sourceComponent: rowDelegate
property variant modelItem: model
}
property variant modelItem: model
MouseArea {
id: delegateMouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
onEntered: listView.currentIndex = index
onClicked: close(true)
}
}
}
ListView {
id: listView
width: container.width; height: (container.height - 2*container.borderWidth) * count + container.borderWidth
delegate: myDelegate
highlight: Rectangle {
anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined;
color: container.hoverColor
}
}
Rectangle {
anchors.fill: listView
anchors.topMargin: -container.borderWidth
color: "transparent"
clip: false
border.color: main.border.color
border.width: main.border.width
}
states: [
State {
name: "visible";
PropertyChanges { target: dropDown; height: (container.height - 2*container.borderWidth) * listView.count + container.borderWidth}
}
]
}
function toggle() {
if (dropDown.state === "visible")
close(false)
else
open()
}
function open() {
dropDown.state = "visible"
listView.currentIndex = container.index
}
function close(update) {
dropDown.state = ""
if (update) {
container.index = listView.currentIndex
topRow.modelItem = listView.currentItem.modelItem
valueChanged(listView.currentIndex)
}
}
Component.onCompleted: {
listView.currentIndex = container.index
if (listView.currentItem)
topRow.modelItem = listView.currentItem.modelItem
}
onIndexChanged: {
listView.currentIndex = container.index
if (listView.currentItem)
topRow.modelItem = listView.currentItem.modelItem
}
onModelChanged: {
listView.currentIndex = container.index
if (listView.currentItem)
topRow.modelItem = listView.currentItem.modelItem
}
}
@@ -0,0 +1,97 @@
/***************************************************************************
* Copyright (c) 2013 Reza Fatahilah Shah <rshah0385@kireihana.com>
* Copyright (c) 2013 Abdurrahman AVCI <abdurrahmanavci@gmail.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
***************************************************************************/
import QtQuick 2.0
Image {
id: container
opacity: 0.6
property bool enabled: true
property bool spaceDown: false
property bool isFocused: activeFocus || mouseArea.containsMouse
property bool isPressed: spaceDown || mouseArea.pressed
signal pressed()
signal released()
signal clicked()
mirror: LayoutMirroring.enabled
states: [
State {
name: "disabled"; when: (container.enabled === false)
},
State {
name: "active"; when: container.enabled && container.isFocused && !container.isPressed
PropertyChanges { target: container; opacity: 1.0 }
},
State {
name: "pressed"; when: container.enabled && container.isPressed
}
]
Behavior on opacity { NumberAnimation { duration: 200 } }
clip: true
smooth: true
fillMode: Image.PreserveAspectFit
MouseArea {
id: mouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
acceptedButtons: Qt.LeftButton
onPressed: { container.focus = true; container.pressed() }
onClicked: { container.focus = true; container.clicked() }
onReleased: { container.focus = true; container.released() }
}
Keys.onPressed: {
if (event.key === Qt.Key_Space) {
container.spaceDown = true;
container.pressed()
event.accepted = true
} else if (event.key === Qt.Key_Return) {
container.clicked()
event.accepted = true
}
}
Keys.onReleased: {
if (event.key === Qt.Key_Space) {
container.spaceDown = false;
container.released()
container.clicked()
event.accepted = true
}
}
}
@@ -0,0 +1,69 @@
/***************************************************************************
* Copyright (c) 2013 Nikita Mikhaylov <nslqqq@gmail.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
***************************************************************************/
import QtQuick 2.0
ComboBox {
id: combo
model: keyboard.layouts
index: keyboard.currentLayout
onValueChanged: keyboard.currentLayout = id
Connections {
target: keyboard
onCurrentLayoutChanged: combo.index = keyboard.currentLayout
}
rowDelegate: Rectangle {
color: "transparent"
Image {
id: img
source: "${DATA_INSTALL_DIR}/flags/%1.png".arg(modelItem ? modelItem.modelData.shortName : "zz")
anchors.margins: 4
fillMode: Image.PreserveAspectFit
anchors.left: parent.left
anchors.top: parent.top
anchors.bottom: parent.bottom
}
Text {
anchors.margins: 4
anchors.left: img.right
anchors.top: parent.top
anchors.bottom: parent.bottom
verticalAlignment: Text.AlignVCenter
text: modelItem ? modelItem.modelData.shortName : "zz"
font.pixelSize: 14
}
}
}
@@ -0,0 +1,89 @@
/***************************************************************************
* Copyright (c) 2013 Reza Fatahilah Shah <rshah0385@kireihana.com>
* Copyright (c) 2013 Abdurrahman AVCI <abdurrahmanavci@gmail.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
***************************************************************************/
import QtQuick 2.0
Rectangle {
id: menu
width: 200; height: 0
property int itemHeight: 30
property alias model: menuList.model
property alias index: menuList.currentIndex
Behavior on height { NumberAnimation { duration: 100 } }
states: [
State {
name: "visible";
PropertyChanges { target: menu; height: itemHeight * menuList.count }
}
]
Component {
id: listViewItem
Rectangle {
color: mouseArea.containsMouse ? "steelblue" : "transparent"
width: parent.width; height: menu.itemHeight
Text {
anchors.fill: parent
anchors.margins: 4
text: model.name
elide: Text.ElideRight
verticalAlignment: Text.AlignVCenter
}
MouseArea {
id: mouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
onClicked: { menuList.currentIndex = index; menu.state = "" }
}
Keys.onReturnPressed: { itemClicked(index); menu.state = "" }
}
}
ListView {
id: menuList
anchors.fill: parent
clip: true
delegate: listViewItem
highlight: Rectangle { color: "lightsteelblue" }
}
}
@@ -0,0 +1,165 @@
/***************************************************************************
* Copyright (c) 2013 Nikita Mikhaylov <nslqqq@gmail.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
***************************************************************************/
import QtQuick 2.0
FocusScope {
id: container
width: 80; height: 30
property alias color: txtMain.color
property alias borderColor: txtMain.borderColor
property alias focusColor: txtMain.focusColor
property alias hoverColor: txtMain.hoverColor
property alias radius: txtMain.radius
property alias font: txtMain.font
property alias textColor: txtMain.textColor
property alias echoMode: txtMain.echoMode
property alias text: txtMain.text
property alias image: img.source
property double imageFadeIn: 300
property double imageFadeOut: 200
property alias tooltipEnabled: tooltip.visible
property alias tooltipText: tooltipText.text
property alias tooltipFG: tooltipText.color
property alias tooltipBG: tooltip.color
TextConstants {
id: textConstants
}
TextBox {
id: txtMain
width: parent.width; height: parent.height
font.pixelSize: 14
echoMode: TextInput.Password
focus: true
}
Image {
id: img
opacity: 0
state: keyboard.capsLock ? "activated" : ""
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
fillMode: Image.PreserveAspectFit
smooth: true
height: parent.height * 0.8
source: "warning.png"
sourceSize.width: width
sourceSize.height: height
anchors.rightMargin: 0.3 * width
states: [
State {
name: "activated"
PropertyChanges { target: img; opacity: 1; }
},
State {
name: ""
PropertyChanges { target: img; opacity: 0; }
}
]
transitions: [
Transition {
to: "activated"
NumberAnimation { target: img; property: "opacity"; from: 0; to: 1; duration: imageFadeIn; }
},
Transition {
to: ""
NumberAnimation { target: img; property: "opacity"; from: 1; to: 0; duration: imageFadeOut; }
}
]
MouseArea {
id: hoverArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.ArrowCursor
onEntered: {
tooltip.x = mouseX + img.x + 10
tooltip.y = mouseY + 10
}
onPositionChanged: {
tooltip.x = mouseX + img.x + 10
tooltip.y = mouseY + 10
}
}
}
Rectangle {
id: tooltip
color: "lightblue"
border.color: "black"
border.width: 1
width: 1.1 * tooltipText.implicitWidth
height: 1.4 * tooltipText.implicitHeight
radius: 2
opacity: 0
state: hoverArea.containsMouse && img.state == "activated" ? "activated" : ""
states: [
State {
name: "activated"
PropertyChanges { target: tooltip; opacity: 1 }
},
State {
name: ""
PropertyChanges { target: tooltip; opacity: 0 }
}
]
transitions: [
Transition {
to: "activated"
NumberAnimation { target: tooltip; property: "opacity"; from: 0; to: 1; duration: imageFadeIn; }
},
Transition {
to: ""
NumberAnimation { target: tooltip; property: "opacity"; from: 1; to: 0; duration: imageFadeOut; }
}
]
Text {
id: tooltipText
anchors.centerIn: parent;
text: textConstants.capslockWarning
}
}
}
@@ -0,0 +1,126 @@
/***************************************************************************
* Copyright (c) 2013 Abdurrahman AVCI <abdurrahmanavci@gmail.com
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
***************************************************************************/
import QtQuick 2.0
FocusScope {
id: container
width: 150; height: 185
clip: true
property alias name: name.text
property alias icon: icon.source
property alias password: password.text
property bool showPassword: true
signal login()
Behavior on height { NumberAnimation { duration: 100 } }
states: [
State {
name: ""
PropertyChanges { target: container; height: 185 }
},
State {
name: "active"
PropertyChanges { target: container; height: 225 }
}
]
Rectangle {
id: shadow
anchors.fill: parent
color: "#55000000"
}
Rectangle {
id: canvas
anchors.fill: shadow
anchors.margins: 2
color: "white"
}
MouseArea {
id: mouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
}
Column {
id: column
anchors.fill: canvas
anchors.margins: 5
spacing: 5
clip: true
Image {
id: icon
width: parent.width; height: 150
clip: true
smooth: true
fillMode: Image.PreserveAspectCrop
}
Text {
id: name
height: 20
anchors { left: parent.left; right: parent.right }
color: "#666666"
elide: Text.ElideRight
font { bold: true; capitalization: Font.AllUppercase }
horizontalAlignment: Text.AlignHCenter
}
PasswordBox {
id: password
width: parent.width; height: showPassword ? 30 : 0
font.pixelSize: 14
focus: true
visible: showPassword
Keys.onPressed: {
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
container.login();
event.accepted = true
}
}
}
Text {
id: pressToLogin
height: 30
font.pixelSize: 14
anchors { left: parent.left; right: parent.right }
color: "#666666"
elide: Text.ElideRight
font { bold: true; capitalization: Font.AllUppercase }
horizontalAlignment: Text.AlignHCenter
text: qsTr("Press to login")
}
}
}
@@ -0,0 +1,89 @@
/***************************************************************************
* Copyright (c) 2013 Abdurrahman AVCI <abdurrahmanavci@gmail.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
***************************************************************************/
import QtQuick 2.0
FocusScope {
id: container
width: 80; height: 30
property color color: "white"
property color borderColor: "#ababab"
property color focusColor: "#266294"
property color hoverColor: "#5692c4"
property alias radius: main.radius
property alias font: txtMain.font
property alias textColor: txtMain.color
property alias echoMode: txtMain.echoMode
property alias text: txtMain.text
Rectangle {
id: main
anchors.fill: parent
color: container.color
border.color: container.borderColor
border.width: 1
Behavior on border.color { ColorAnimation { duration: 100 } }
states: [
State {
name: "hover"; when: mouseArea.containsMouse
PropertyChanges { target: main; border.width: 1; border.color: container.hoverColor }
},
State {
name: "focus"; when: container.activeFocus && !mouseArea.containsMouse
PropertyChanges { target: main; border.width: 1; border.color: container.focusColor }
}
]
}
MouseArea {
id: mouseArea
anchors.fill: container
cursorShape: Qt.IBeamCursor
hoverEnabled: true
onEntered: if (main.state == "") main.state = "hover";
onExited: if (main.state == "hover") main.state = "";
onClicked: container.focus = true;
}
TextInput {
id: txtMain
width: parent.width - 16
anchors.centerIn: parent
color: "black"
clip: true
focus: true
passwordCharacter: "\u25cf"
}
}
@@ -0,0 +1,5 @@
configure_file("2.0/LayoutBox.qml" "2.0/LayoutBox.qml")
install(DIRECTORY "2.0/" DESTINATION "${QML_INSTALL_DIR}/SddmComponents" PATTERN "LayoutBox.qml" EXCLUDE)
install(DIRECTORY "common/" DESTINATION "${QML_INSTALL_DIR}/SddmComponents")
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/2.0/" DESTINATION "${QML_INSTALL_DIR}/SddmComponents")
@@ -0,0 +1,53 @@
/***************************************************************************
* Copyright (c) 2013 Nikita Mikhailov <nslqqq@gmail.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
***************************************************************************/
import QtQuick 2.0
QtObject {
readonly property string capslockWarning: qsTr("Warning, Caps Lock is ON!")
readonly property string layout: qsTr("Layout")
readonly property string login: qsTr("Login")
readonly property string loginFailed: qsTr("Login failed")
readonly property string loginSucceeded: qsTr("Login succeeded")
readonly property string password: qsTr("Password")
readonly property string emptyPassword: qsTr("Please enter a password!")
readonly property string passwordChange: qsTr("Change password")
readonly property string prompt: qsTr("Enter your username and password")
readonly property string promptSelectUser: qsTr("Select your user and enter password")
readonly property string promptUser: qsTr("Enter your username")
readonly property string promptPassword: qsTr("Enter your password")
readonly property string emptyPrompt: qsTr("Password:")
readonly property string showPasswordPrompt:qsTr("Show password")
readonly property string hidePasswordPrompt:qsTr("Hide password")
readonly property string reboot: qsTr("Reboot")
readonly property string session: qsTr("Session")
readonly property string shutdown: qsTr("Shutdown")
readonly property string suspend: qsTr("Suspend")
readonly property string hibernate: qsTr("Hibernate")
readonly property string userName: qsTr("Username")
readonly property string welcomeText: qsTr("Welcome to %1")
readonly property string pamMaxtriesError: qsTr("Password change aborted because maximum tries reached")
readonly property string pamMaxtriesInfo: qsTr("New password change round! Please input current password again!")
}
@@ -0,0 +1,13 @@
module SddmComponents
Background 2.0 Background.qml
Button 2.0 Button.qml
Clock 2.0 Clock.qml
ComboBox 2.0 ComboBox.qml
ImageButton 2.0 ImageButton.qml
LayoutBox 2.0 LayoutBox.qml
Menu 2.0 Menu.qml
PasswordBox 2.0 PasswordBox.qml
PictureBox 2.0 PictureBox.qml
TextBox 2.0 TextBox.qml
TextConstants 2.0 TextConstants.qml
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

@@ -0,0 +1,37 @@
install(DIRECTORY "flags" DESTINATION "${DATA_INSTALL_DIR}")
install(FILES
"org.freedesktop.DisplayManager.conf"
DESTINATION "${DBUS_CONFIG_DIR}"
RENAME ${DBUS_CONFIG_FILENAME}
)
install(FILES
"faces/root.face.icon.png"
DESTINATION "${DATA_INSTALL_DIR}/faces"
RENAME "root.face.icon"
)
install(FILES
"faces/default.face.icon.png"
DESTINATION "${DATA_INSTALL_DIR}/faces"
RENAME ".face.icon"
)
install(FILES
"scripts/Xsession"
"scripts/Xsetup"
"scripts/Xstop"
"scripts/wayland-session"
DESTINATION "${DATA_INSTALL_DIR}/scripts"
PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
)
if(BUILD_MAN_PAGES)
add_subdirectory(man)
endif()
add_subdirectory(themes)
add_subdirectory(translations)
@@ -0,0 +1,2 @@
These are the default avatars.
They are installed to `.face.icon` and `root.face.icon`. See ../CMakeLists.txt.
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 885 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1009 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 992 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 884 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

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