kgreeter: review

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2022-03-31 18:34:00 +03:00
parent 9e8cc9b5f0
commit 9906315da3
3 changed files with 97 additions and 52 deletions

View file

@ -2,30 +2,40 @@ cmake_minimum_required(VERSION 3.4 FATAL_ERROR)
project(kgreeter CXX) project(kgreeter CXX)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
set(CMAKE_AUTOMOC TRUE) set(CMAKE_AUTOMOC TRUE)
set(CMAKE_AUTOUIC TRUE) set(CMAKE_AUTOUIC TRUE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
include(GNUInstallDirs) include(GNUInstallDirs)
find_package(Katie REQUIRED) find_package(Katie REQUIRED)
find_package(KDE4 REQUIRED) find_package(KDE4 REQUIRED)
find_package(LightDM)
set_package_properties(LightDM PROPERTIES
PURPOSE "Required for the greeter"
DESCRIPTION "Cross-desktop display manager"
URL "https://github.com/canonical/lightdm"
TYPE REQUIRED
)
find_package(GLIB2)
set_package_properties(GLIB2 PROPERTIES
PURPOSE "Required for the greeter"
DESCRIPTION "Low-level core library that forms the basis for projects such as GTK and GNOME"
URL "https://gitlab.gnome.org/GNOME/glib"
TYPE REQUIRED
)
include_directories( include_directories(
${KATIE_INCLUDES} ${KATIE_INCLUDES}
${KDE4_INCLUDES} ${KDE4_INCLUDES}
/usr/include/lightdm-gobject-1 ${LIGHTDM_INCLUDE_DIR}
/usr/include/gio-unix-2.0 ${GLIB2_INCLUDE_DIR}
/usr/include/libmount
/usr/include/blkid
/usr/include/glib-2.0
/usr/lib/x86_64-linux-gnu/glib-2.0/include
/usr/include/libxml2
) )
link_directories(/usr/pkg/lib)
add_definitions( add_definitions(
${LIGHTDM_DEFINITIONS}
) )
add_executable(kgreeter kgreeter.cpp) add_executable(kgreeter kgreeter.cpp)
@ -33,9 +43,9 @@ target_link_libraries(kgreeter
Katie::Core Katie::Core
Katie::Gui Katie::Gui
KDE4::kdeui KDE4::kdeui
glib-2.0 ${LIGHTDM_LIBRARIES}
${GLIB2_LIBRARIES}
gobject-2.0 gobject-2.0
lightdm-gobject-1
) )
set_target_properties(kgreeter PROPERTIES set_target_properties(kgreeter PROPERTIES

View file

@ -0,0 +1,42 @@
# Try to find LightDM library, once done this will define:
#
# LIGHTDM_FOUND - system has LightDM
# LIGHTDM_INCLUDE_DIR - the LightDM include directory
# LIGHTDM_LIBRARIES - the libraries needed to use LightDM
# LIGHTDM_DEFINITIONS - compiler switches required for using LightDM
#
# Copyright (c) 2022 Ivailo Monev <xakepa10@gmail.com>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
if(NOT WIN32)
include(FindPkgConfig)
pkg_check_modules(PC_LIGHTDM QUIET liblightdm-gobject-1)
set(LIGHTDM_INCLUDE_DIR ${PC_LIGHTDM_INCLUDE_DIRS})
set(LIGHTDM_LIBRARIES ${PC_LIGHTDM_LIBRARIES})
endif()
set(LIGHTDM_VERSION ${PC_LIGHTDM_VERSION})
set(LIGHTDM_DEFINITIONS ${PC_LIGHTDM_CFLAGS_OTHER})
if(NOT LIGHTDM_INCLUDE_DIR OR NOT LIGHTDM_LIBRARIES)
find_path(LIGHTDM_INCLUDE_DIR
NAMES lightdm-gobject-1/lightdm.h
HINTS $ENV{LIGHTDMDIR}/include
)
find_library(LIGHTDM_LIBRARIES
NAMES lightdm-gobject-1
HINTS $ENV{LIGHTDMDIR}/lib
)
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LightDM
VERSION_VAR LIGHTDM_VERSION
REQUIRED_VARS LIGHTDM_LIBRARIES LIGHTDM_INCLUDE_DIR
)
mark_as_advanced(LIGHTDM_INCLUDE_DIR LIGHTDM_LIBRARIES)

View file

@ -13,14 +13,10 @@
#include "ui_kgreeter.h" #include "ui_kgreeter.h"
QT_USE_NAMESPACE // for the callbacks
// For the callbacks
static GMainLoop *glibloop = NULL; static GMainLoop *glibloop = NULL;
static QSettings kgreetersettings("/etc/lightdm/lightdm-kgreeter-greeter.conf", QSettings::IniFormat); static QSettings kgreetersettings("/etc/lightdm/lightdm-kgreeter-greeter.conf", QSettings::IniFormat);
// TODO: where to save it? /var/lib/lightdm/ is not writable
static QSettings kgreeterstate("/tmp/lightdm-kgreeter-greeter.ini", QSettings::IniFormat);
class KGreeter : public QMainWindow class KGreeter : public QMainWindow
{ {
@ -34,9 +30,9 @@ public:
LightDMGreeter* getGreater() const; LightDMGreeter* getGreater() const;
static void show_prompt_cb(LightDMGreeter *ldmgreeter, const char *ldmtext, LightDMPromptType ldmtype, gpointer ldmptr); static void showPromptCb(LightDMGreeter *ldmgreeter, const char *ldmtext, LightDMPromptType ldmtype, gpointer ldmptr);
static void authentication_complete_cb(LightDMGreeter *ldmgreeter, gpointer ldmptr); static void authenticationCompleteCb(LightDMGreeter *ldmgreeter, gpointer ldmptr);
static void show_message_cb(LightDMGreeter *ldmgreeter, const gchar *ldmtext, LightDMMessageType ldmtype, gpointer ldmptr); static void showMessageCb(LightDMGreeter *ldmgreeter, const gchar *ldmtext, LightDMMessageType ldmtype, gpointer ldmptr);
protected: protected:
void paintEvent(QPaintEvent *event); void paintEvent(QPaintEvent *event);
@ -73,9 +69,18 @@ KGreeter::KGreeter(QWidget *parent)
m_ldmgreeter = lightdm_greeter_new(); m_ldmgreeter = lightdm_greeter_new();
g_signal_connect(m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_SHOW_PROMPT, G_CALLBACK(KGreeter::show_prompt_cb), this); g_signal_connect(
g_signal_connect(m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK(KGreeter::authentication_complete_cb), this); m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_SHOW_PROMPT,
g_signal_connect(m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_SHOW_MESSAGE, G_CALLBACK(KGreeter::show_message_cb), this); G_CALLBACK(KGreeter::showPromptCb), this
);
g_signal_connect(
m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_AUTHENTICATION_COMPLETE,
G_CALLBACK(KGreeter::authenticationCompleteCb), this
);
g_signal_connect(
m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_SHOW_MESSAGE,
G_CALLBACK(KGreeter::showMessageCb), this
);
GList *ldmlayouts = lightdm_get_layouts(); GList *ldmlayouts = lightdm_get_layouts();
for (GList *ldmitem = ldmlayouts; ldmitem; ldmitem = ldmitem->next) { for (GList *ldmitem = ldmlayouts; ldmitem; ldmitem = ldmitem->next) {
@ -122,19 +127,13 @@ KGreeter::KGreeter(QWidget *parent)
} }
} }
} }
// qDebug() << Q_FUNC_INFO << kgreeterstate.fileName() << kgreeterstate.map() << kgreeterstate.status(); const QString ldmdefaultsession = QString::fromUtf8(lightdm_greeter_get_default_session_hint(m_ldmgreeter));
const QString lastuser = kgreeterstate.value("state/lastuser").toString(); if (!ldmdefaultsession.isEmpty()) {
for (int i = 0; i < m_ui.usersbox->count(); i++) { for (int i = 0; i < m_ui.sessionsbox->count(); i++) {
if (m_ui.usersbox->itemText(i) == lastuser) { if (m_ui.sessionsbox->itemData(i).toString() == ldmdefaultsession) {
m_ui.usersbox->setCurrentIndex(i); m_ui.sessionsbox->setCurrentIndex(i);
break; break;
} }
}
const QString lastsession = kgreeterstate.value("state/lastsession").toString();
for (int i = 0; i < m_ui.sessionsbox->count(); i++) {
if (m_ui.sessionsbox->itemData(i).toString() == lastuser) {
m_ui.sessionsbox->setCurrentIndex(i);
break;
} }
} }
@ -177,12 +176,12 @@ void KGreeter::paintEvent(QPaintEvent *event)
QByteArray KGreeter::getUser() const QByteArray KGreeter::getUser() const
{ {
return m_ui.usersbox->currentText().toLocal8Bit(); return m_ui.usersbox->currentText().toUtf8();
} }
QByteArray KGreeter::getPass() const QByteArray KGreeter::getPass() const
{ {
return m_ui.passedit->text().toLocal8Bit(); return m_ui.passedit->text().toUtf8();
} }
QByteArray KGreeter::getSession() const QByteArray KGreeter::getSession() const
@ -195,7 +194,7 @@ LightDMGreeter * KGreeter::getGreater() const
return m_ldmgreeter; return m_ldmgreeter;
} }
void KGreeter::show_prompt_cb(LightDMGreeter *ldmgreeter, const char *ldmtext, LightDMPromptType ldmtype, gpointer ldmptr) void KGreeter::showPromptCb(LightDMGreeter *ldmgreeter, const char *ldmtext, LightDMPromptType ldmtype, gpointer ldmptr)
{ {
// qDebug() << Q_FUNC_INFO; // qDebug() << Q_FUNC_INFO;
@ -210,7 +209,7 @@ void KGreeter::show_prompt_cb(LightDMGreeter *ldmgreeter, const char *ldmtext, L
} }
} }
void KGreeter::authentication_complete_cb(LightDMGreeter *ldmgreeter, gpointer ldmptr) void KGreeter::authenticationCompleteCb(LightDMGreeter *ldmgreeter, gpointer ldmptr)
{ {
// qDebug() << Q_FUNC_INFO; // qDebug() << Q_FUNC_INFO;
@ -219,10 +218,6 @@ void KGreeter::authentication_complete_cb(LightDMGreeter *ldmgreeter, gpointer l
const QByteArray kgreetersession = kgreeter->getSession(); const QByteArray kgreetersession = kgreeter->getSession();
kgreeterstate.setValue("state/lastsession", kgreetersession);
// qDebug() << Q_FUNC_INFO << kgreeterstate.fileName() << kgreeterstate.map() << kgreeterstate.status();
// Start the session
g_autoptr(GError) gliberror = NULL; g_autoptr(GError) gliberror = NULL;
if (!lightdm_greeter_get_is_authenticated(ldmgreeter) || if (!lightdm_greeter_get_is_authenticated(ldmgreeter) ||
!lightdm_greeter_start_session_sync(ldmgreeter, kgreetersession.constData(), &gliberror)) !lightdm_greeter_start_session_sync(ldmgreeter, kgreetersession.constData(), &gliberror))
@ -235,18 +230,14 @@ void KGreeter::authentication_complete_cb(LightDMGreeter *ldmgreeter, gpointer l
} }
} }
void KGreeter::show_message_cb(LightDMGreeter *ldmgreeter, const gchar *ldmtext, LightDMMessageType ldmtype, gpointer ldmptr) void KGreeter::showMessageCb(LightDMGreeter *ldmgreeter, const gchar *ldmtext, LightDMMessageType ldmtype, gpointer ldmptr)
{ {
// qDebug() << Q_FUNC_INFO; // qDebug() << Q_FUNC_INFO;
KGreeter* kgreeter = static_cast<KGreeter*>(ldmptr); KGreeter* kgreeter = static_cast<KGreeter*>(ldmptr);
Q_ASSERT(kgreeter); Q_ASSERT(kgreeter);
if (ldmtype == LIGHTDM_MESSAGE_TYPE_INFO) { kgreeter->statusBar()->showMessage(QString::fromUtf8(ldmtext));
kgreeter->statusBar()->showMessage(QString::fromUtf8(ldmtext));
} else {
kgreeter->statusBar()->showMessage(QString::fromUtf8(ldmtext));
}
} }
void KGreeter::slotSuspend() void KGreeter::slotSuspend()
@ -303,7 +294,6 @@ void KGreeter::slotLogin()
g_autoptr(GError) gliberror = NULL; g_autoptr(GError) gliberror = NULL;
lightdm_greeter_authenticate(m_ldmgreeter, kgreeterusername.constData(), &gliberror); lightdm_greeter_authenticate(m_ldmgreeter, kgreeterusername.constData(), &gliberror);
kgreeterstate.setValue("state/lastuser", kgreeterusername);
g_main_loop_run(glibloop); g_main_loop_run(glibloop);
} }
@ -320,7 +310,10 @@ int main(int argc, char**argv)
const QString kgreetercolorscheme = kgreetersettings.value("greeter/colorscheme").toString(); const QString kgreetercolorscheme = kgreetersettings.value("greeter/colorscheme").toString();
if (!kgreetercolorscheme.isEmpty()) { if (!kgreetercolorscheme.isEmpty()) {
KSharedConfigPtr kcolorschemeconfig = KSharedConfig::openConfig(QString::fromLatin1("color-schemes/%1.colors").arg(kgreetercolorscheme), KConfig::FullConfig, "data"); KSharedConfigPtr kcolorschemeconfig = KSharedConfig::openConfig(
QString::fromLatin1("color-schemes/%1.colors").arg(kgreetercolorscheme),
KConfig::FullConfig, "data"
);
app.setPalette(KGlobalSettings::createApplicationPalette(kcolorschemeconfig)); app.setPalette(KGlobalSettings::createApplicationPalette(kcolorschemeconfig));
} else { } else {
app.setPalette(KGlobalSettings::createApplicationPalette()); app.setPalette(KGlobalSettings::createApplicationPalette());