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)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
set(CMAKE_AUTOMOC TRUE)
set(CMAKE_AUTOUIC TRUE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
include(GNUInstallDirs)
find_package(Katie 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(
${KATIE_INCLUDES}
${KDE4_INCLUDES}
/usr/include/lightdm-gobject-1
/usr/include/gio-unix-2.0
/usr/include/libmount
/usr/include/blkid
/usr/include/glib-2.0
/usr/lib/x86_64-linux-gnu/glib-2.0/include
/usr/include/libxml2
${LIGHTDM_INCLUDE_DIR}
${GLIB2_INCLUDE_DIR}
)
link_directories(/usr/pkg/lib)
add_definitions(
${LIGHTDM_DEFINITIONS}
)
add_executable(kgreeter kgreeter.cpp)
@ -33,9 +43,9 @@ target_link_libraries(kgreeter
Katie::Core
Katie::Gui
KDE4::kdeui
glib-2.0
${LIGHTDM_LIBRARIES}
${GLIB2_LIBRARIES}
gobject-2.0
lightdm-gobject-1
)
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"
QT_USE_NAMESPACE
// For the callbacks
// for the callbacks
static GMainLoop *glibloop = NULL;
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
{
@ -34,9 +30,9 @@ public:
LightDMGreeter* getGreater() const;
static void show_prompt_cb(LightDMGreeter *ldmgreeter, const char *ldmtext, LightDMPromptType ldmtype, gpointer ldmptr);
static void authentication_complete_cb(LightDMGreeter *ldmgreeter, gpointer ldmptr);
static void show_message_cb(LightDMGreeter *ldmgreeter, const gchar *ldmtext, LightDMMessageType ldmtype, gpointer ldmptr);
static void showPromptCb(LightDMGreeter *ldmgreeter, const char *ldmtext, LightDMPromptType ldmtype, gpointer ldmptr);
static void authenticationCompleteCb(LightDMGreeter *ldmgreeter, gpointer ldmptr);
static void showMessageCb(LightDMGreeter *ldmgreeter, const gchar *ldmtext, LightDMMessageType ldmtype, gpointer ldmptr);
protected:
void paintEvent(QPaintEvent *event);
@ -73,9 +69,18 @@ KGreeter::KGreeter(QWidget *parent)
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(m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK(KGreeter::authentication_complete_cb), this);
g_signal_connect(m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_SHOW_MESSAGE, G_CALLBACK(KGreeter::show_message_cb), this);
g_signal_connect(
m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_SHOW_PROMPT,
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();
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 lastuser = kgreeterstate.value("state/lastuser").toString();
for (int i = 0; i < m_ui.usersbox->count(); i++) {
if (m_ui.usersbox->itemText(i) == lastuser) {
m_ui.usersbox->setCurrentIndex(i);
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;
const QString ldmdefaultsession = QString::fromUtf8(lightdm_greeter_get_default_session_hint(m_ldmgreeter));
if (!ldmdefaultsession.isEmpty()) {
for (int i = 0; i < m_ui.sessionsbox->count(); i++) {
if (m_ui.sessionsbox->itemData(i).toString() == ldmdefaultsession) {
m_ui.sessionsbox->setCurrentIndex(i);
break;
}
}
}
@ -177,12 +176,12 @@ void KGreeter::paintEvent(QPaintEvent *event)
QByteArray KGreeter::getUser() const
{
return m_ui.usersbox->currentText().toLocal8Bit();
return m_ui.usersbox->currentText().toUtf8();
}
QByteArray KGreeter::getPass() const
{
return m_ui.passedit->text().toLocal8Bit();
return m_ui.passedit->text().toUtf8();
}
QByteArray KGreeter::getSession() const
@ -195,7 +194,7 @@ LightDMGreeter * KGreeter::getGreater() const
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;
@ -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;
@ -219,10 +218,6 @@ void KGreeter::authentication_complete_cb(LightDMGreeter *ldmgreeter, gpointer l
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;
if (!lightdm_greeter_get_is_authenticated(ldmgreeter) ||
!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;
KGreeter* kgreeter = static_cast<KGreeter*>(ldmptr);
Q_ASSERT(kgreeter);
if (ldmtype == LIGHTDM_MESSAGE_TYPE_INFO) {
kgreeter->statusBar()->showMessage(QString::fromUtf8(ldmtext));
} else {
kgreeter->statusBar()->showMessage(QString::fromUtf8(ldmtext));
}
kgreeter->statusBar()->showMessage(QString::fromUtf8(ldmtext));
}
void KGreeter::slotSuspend()
@ -303,7 +294,6 @@ void KGreeter::slotLogin()
g_autoptr(GError) gliberror = NULL;
lightdm_greeter_authenticate(m_ldmgreeter, kgreeterusername.constData(), &gliberror);
kgreeterstate.setValue("state/lastuser", kgreeterusername);
g_main_loop_run(glibloop);
}
@ -320,7 +310,10 @@ int main(int argc, char**argv)
const QString kgreetercolorscheme = kgreetersettings.value("greeter/colorscheme").toString();
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));
} else {
app.setPalette(KGlobalSettings::createApplicationPalette());