diff --git a/kgreeter/CMakeLists.txt b/kgreeter/CMakeLists.txt index 7b83901c..274505b7 100644 --- a/kgreeter/CMakeLists.txt +++ b/kgreeter/CMakeLists.txt @@ -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 diff --git a/kgreeter/cmake/modules/FindLightDM.cmake b/kgreeter/cmake/modules/FindLightDM.cmake new file mode 100644 index 00000000..efbe782b --- /dev/null +++ b/kgreeter/cmake/modules/FindLightDM.cmake @@ -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 +# +# 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) diff --git a/kgreeter/kgreeter.cpp b/kgreeter/kgreeter.cpp index 8ce5c53e..34638e7f 100644 --- a/kgreeter/kgreeter.cpp +++ b/kgreeter/kgreeter.cpp @@ -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(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());