From 918aca5b83c170b229c6449c27556ad70743f728 Mon Sep 17 00:00:00 2001 From: tangjie02 Date: Tue, 4 Jan 2022 17:11:31 +0800 Subject: [PATCH] fix(xinit): Fix the dbus error when the session manager is launched by xinit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复通过xinit启动会话管理时,程序会卡在获取DisplayManager的dbus句柄的地方 Signed-off-by: tangjie02 --- src/client/client-manager.cpp | 2 ++ src/main.cpp | 35 +++++++++++++++++++++++++++++++++ src/presence.cpp | 2 ++ src/session-manager.cpp | 2 ++ src/ui/ui-manager.cpp | 2 ++ src/wrapper/display-manager.cpp | 24 +++++++++++++++------- src/xsmp-server.cpp | 2 ++ 7 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/client/client-manager.cpp b/src/client/client-manager.cpp index be9a75b..e5c4df2 100644 --- a/src/client/client-manager.cpp +++ b/src/client/client-manager.cpp @@ -61,6 +61,8 @@ std::shared_ptr ClientManager::get_client_by_dbus_name(const std::st void ClientManager::init() { + KLOG_PROFILE(""); + this->dbus_daemon_proxy_->signal_signal().connect(sigc::mem_fun(this, &ClientManager::on_dbus_daemon_signal_cb)); this->xsmp_server_->signal_new_client_connected().connect(sigc::mem_fun(this, &ClientManager::on_new_xsmp_client_connected_cb)); this->xsmp_server_->signal_ice_conn_status_changed().connect(sigc::mem_fun(this, &ClientManager::on_ice_conn_status_changed_cb)); diff --git a/src/main.cpp b/src/main.cpp index a5571e9..005ae0e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,7 @@ * Author: tangjie02 */ +#include #include #include #include "src/app/app-manager.h" @@ -24,6 +25,37 @@ using namespace Kiran::Daemon; +#define DBUS_LAUNCH_COMMAND "dbus-launch" + +bool start_dbus_session(int argc, char **argv) +{ + int i = 0; + + RETURN_VAL_IF_TRUE(!Glib::getenv("DBUS_SESSION_BUS_ADDRESS").empty(), true); + RETURN_VAL_IF_TRUE(Kiran::StrUtils::startswith(argv[0], DBUS_LAUNCH_COMMAND), true); + + char **new_argv = (char **)g_malloc(argc + 3 * sizeof(*argv)); + + new_argv[0] = (char *)DBUS_LAUNCH_COMMAND; + new_argv[1] = (char *)"--exit-with-session"; + + for (i = 0; i < argc; i++) + { + new_argv[i + 2] = argv[i]; + } + + new_argv[i + 2] = NULL; + + KLOG_DEBUG("Start session manager by dbus-launch."); + + if (!execvp(DBUS_LAUNCH_COMMAND, new_argv)) + { + KLOG_WARNING("No session bus and could not exec dbus-launch: %s", g_strerror(errno)); + return false; + } + return true; +} + void init_env() { using param_type = std::map; @@ -72,6 +104,9 @@ int main(int argc, char *argv[]) { klog_gtk3_init(std::string(), "kylinsec-session", PROJECT_NAME, PROJECT_NAME); + // 这里做一个兼容性处理,当会话dbus-daemon没有启动时(一般不会出现),由会话管理进行拉起 + start_dbus_session(argc, argv); + setlocale(LC_ALL, ""); bindtextdomain(PROJECT_NAME, KSM_LOCALEDIR); bind_textdomain_codeset(PROJECT_NAME, "UTF-8"); diff --git a/src/presence.cpp b/src/presence.cpp index 3a898d3..d0fb4ff 100644 --- a/src/presence.cpp +++ b/src/presence.cpp @@ -32,6 +32,8 @@ Presence::Presence() : enabled_idle_timeout_(true), void Presence::init() { + KLOG_PROFILE(""); + this->idle_timeout_ = this->settings_->get_int(KSM_SCHEMA_KEY_IDLE_DELAY); this->idle_xlarm_.init(); this->update_idle_xlarm(); diff --git a/src/session-manager.cpp b/src/session-manager.cpp index d0cb95b..892c8b9 100644 --- a/src/session-manager.cpp +++ b/src/session-manager.cpp @@ -281,6 +281,8 @@ void SessionManager::CanReboot(MethodInvocation &invocation) void SessionManager::init() { + KLOG_PROFILE(""); + this->power_.init(); this->presence_->init(); diff --git a/src/ui/ui-manager.cpp b/src/ui/ui-manager.cpp index 3c5d9d2..046da89 100644 --- a/src/ui/ui-manager.cpp +++ b/src/ui/ui-manager.cpp @@ -32,6 +32,8 @@ void UIManager::global_init() void UIManager::init() { + KLOG_PROFILE(""); + auto resource = Gio::Resource::create_from_file(KSM_INSTALL_DATADIR "/kiran-session-manager.gresource"); resource->register_global(); diff --git a/src/wrapper/display-manager.cpp b/src/wrapper/display-manager.cpp index 558773d..4097056 100644 --- a/src/wrapper/display-manager.cpp +++ b/src/wrapper/display-manager.cpp @@ -23,15 +23,25 @@ namespace Daemon DisplayManager::DisplayManager() { + auto xdg_seat_object_path = Glib::getenv("XDG_SEAT_PATH"); + try { - auto xdg_seat_object_path = Glib::getenv("XDG_SEAT_PATH"); - this->display_proxy_ = Gio::DBus::Proxy::create_for_bus_sync(Gio::DBus::BUS_TYPE_SYSTEM, - DISPLAY_MANAGER_DBUS_NAME, - xdg_seat_object_path, - DISPLAY_MANAGER_DBUS_INTERFACE, - Glib::RefPtr(), - Gio::DBus::PROXY_FLAGS_DO_NOT_AUTO_START); + if (xdg_seat_object_path.empty()) + { + KLOG_WARNING("Not found XDG_SEAT_PATH."); + } + else + { + KLOG_DEBUG("XDG_SEAT_PATH: %s.", xdg_seat_object_path.c_str()); + + this->display_proxy_ = Gio::DBus::Proxy::create_for_bus_sync(Gio::DBus::BUS_TYPE_SYSTEM, + DISPLAY_MANAGER_DBUS_NAME, + xdg_seat_object_path, + DISPLAY_MANAGER_DBUS_INTERFACE, + Glib::RefPtr(), + Gio::DBus::PROXY_FLAGS_DO_NOT_AUTO_START); + } } catch (const Glib::Error& e) { diff --git a/src/xsmp-server.cpp b/src/xsmp-server.cpp index 35a6629..75e4173 100644 --- a/src/xsmp-server.cpp +++ b/src/xsmp-server.cpp @@ -58,6 +58,8 @@ void XsmpServer::global_init() void XsmpServer::init() { + KLOG_PROFILE(""); + char error_string[BUFSIZ]; SmsSetErrorHandler(&XsmpServer::on_sms_error_handler_cb); IceSetIOErrorHandler(&XsmpServer::on_ice_io_error_handler_cb); -- 2.27.0