From 75249d1504bd0f9a81a4eb425f66fe45f1e8addd Mon Sep 17 00:00:00 2001 From: tanyulong2021 Date: Thu, 29 Jul 2021 17:22:17 +0800 Subject: [PATCH 1/2] fix template with C linkage error --- 0001-fix-template-with-C-linkage-error.patch | 124 +++++++++++++++++++ ukui-window-switch.spec | 7 +- 2 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 0001-fix-template-with-C-linkage-error.patch diff --git a/0001-fix-template-with-C-linkage-error.patch b/0001-fix-template-with-C-linkage-error.patch new file mode 100644 index 0000000..db0b090 --- /dev/null +++ b/0001-fix-template-with-C-linkage-error.patch @@ -0,0 +1,124 @@ +From 11d4ec4827447c058ab3a00f4d37864ed95e1e44 Mon Sep 17 00:00:00 2001 +From: tanyulong +Date: Thu, 29 Jul 2021 15:37:53 +0800 +Subject: [PATCH] fix template with C linkage error + +--- + src/ukws_helper.h | 2 -- + src/ukws_indicator.cpp | 2 -- + src/ukws_manager.cpp | 2 -- + src/ukws_window_box.h | 2 -- + src/ukws_window_info.h | 2 -- + src/ukws_wnck_operator.h | 2 -- + src/ukws_workspace_box.h | 2 -- + 7 files changed, 14 deletions(-) + +diff --git a/src/ukws_helper.h b/src/ukws_helper.h +index 610e91c..59806de 100755 +--- a/src/ukws_helper.h ++++ b/src/ukws_helper.h +@@ -20,10 +20,8 @@ + #ifndef UKWS_HELPER_H + #define UKWS_HELPER_H + +-extern "C" { + #include + #include +-} + + #include + #include +diff --git a/src/ukws_indicator.cpp b/src/ukws_indicator.cpp +index 65805df..f10f857 100755 +--- a/src/ukws_indicator.cpp ++++ b/src/ukws_indicator.cpp +@@ -34,11 +34,9 @@ + #include + #include + +-extern "C" { + #include + #include + #include +-} + + UkwsIndicator::UkwsIndicator(QWidget *parent) : QWidget(parent) + { +diff --git a/src/ukws_manager.cpp b/src/ukws_manager.cpp +index d367af0..e9cffe3 100755 +--- a/src/ukws_manager.cpp ++++ b/src/ukws_manager.cpp +@@ -26,9 +26,7 @@ + #include + #include + +-extern "C" { + #include +-} + + //#define NOT_REG_WINDOW_SWITCH_HOTKEY + //#define NOT_REG_WORKSPACE_VIEW_HOTKEY +diff --git a/src/ukws_window_box.h b/src/ukws_window_box.h +index feb6a4b..d16da93 100755 +--- a/src/ukws_window_box.h ++++ b/src/ukws_window_box.h +@@ -20,10 +20,8 @@ + #ifndef UKWS_WINDOWBOX_H + #define UKWS_WINDOWBOX_H + +-extern "C" { + #define WNCK_I_KNOW_THIS_IS_UNSTABLE + #include +-} + + #include "ukws_window_extra_label.h" + +diff --git a/src/ukws_window_info.h b/src/ukws_window_info.h +index 2c6d4e6..ef590e8 100755 +--- a/src/ukws_window_info.h ++++ b/src/ukws_window_info.h +@@ -20,10 +20,8 @@ + #ifndef UKWS_WINDOW_INFO_H + #define UKWS_WINDOW_INFO_H + +-extern "C" { + #define WNCK_I_KNOW_THIS_IS_UNSTABLE + #include +-} + + #include + #include +diff --git a/src/ukws_wnck_operator.h b/src/ukws_wnck_operator.h +index 6391ad1..d75409e 100755 +--- a/src/ukws_wnck_operator.h ++++ b/src/ukws_wnck_operator.h +@@ -20,10 +20,8 @@ + #ifndef UKWS_WNCK_OPERATOR_H + #define UKWS_WNCK_OPERATOR_H + +-extern "C" { + #define WNCK_I_KNOW_THIS_IS_UNSTABLE + #include +-} + + #include + +diff --git a/src/ukws_workspace_box.h b/src/ukws_workspace_box.h +index 1023ca7..a039e06 100755 +--- a/src/ukws_workspace_box.h ++++ b/src/ukws_workspace_box.h +@@ -20,11 +20,9 @@ + #ifndef UKWSWORKSPACEBOX_H + #define UKWSWORKSPACEBOX_H + +-extern "C" { + #define WNCK_I_KNOW_THIS_IS_UNSTABLE + #include + #include +-} + + #include "ukws_window_extra_label.h" + #include "ukws_wnck_operator.h" +-- +2.27.0 + diff --git a/ukui-window-switch.spec b/ukui-window-switch.spec index 881621c..2d15192 100644 --- a/ukui-window-switch.spec +++ b/ukui-window-switch.spec @@ -1,11 +1,12 @@ %define debug_package %{nil} Name: ukui-window-switch Version: 3.0.1 -Release: 1 +Release: 2 Summary: Front of the window switch License: GPL-2+ BSD-2-clause BSD-3-clause and GPL-2+ URL: http://www.ukui.org Source0: %{name}-%{version}.tar.gz +patch0: 0001-fix-template-with-C-linkage-error.patch BuildRequires: qt5-qtbase-devel BuildRequires: libblkid-devel @@ -25,6 +26,7 @@ Requires: ukwm >= 1.1.0 %prep %setup -q +%patch0 -p1 %build qmake-qt5 @@ -44,6 +46,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/ukui-window-switch/ %changelog +* Tue Jul 29 2021 tanyulong - 3.0.1-2 +- fix template with C linkage error + * Mon Oct 26 2020 douyan - 3.0.1-1 - update to upstream version 3.0.0-1+1103 From 1c73bc2fa9efed7e90eca166f831368ddcd7f832 Mon Sep 17 00:00:00 2001 From: tanyulong2021 Date: Sat, 31 Jul 2021 10:04:52 +0800 Subject: [PATCH 2/2] Fix multi process contention for the DBusName in VNC environment --- ...s-contention-for-the-DBusName-in-VNC.patch | 149 ++++++++++++++++++ ukui-window-switch.spec | 7 +- 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 0002-Fix-multi-process-contention-for-the-DBusName-in-VNC.patch diff --git a/0002-Fix-multi-process-contention-for-the-DBusName-in-VNC.patch b/0002-Fix-multi-process-contention-for-the-DBusName-in-VNC.patch new file mode 100644 index 0000000..4221fc2 --- /dev/null +++ b/0002-Fix-multi-process-contention-for-the-DBusName-in-VNC.patch @@ -0,0 +1,149 @@ +From 4b61607094dc9a9f95e4c83f72ba9a67d99519c4 Mon Sep 17 00:00:00 2001 +From: tanyulong +Date: Sat, 31 Jul 2021 09:56:25 +0800 +Subject: [PATCH] Fix multi process contention for the DBusName in VNC + environment + +--- + src/main.cpp | 59 ++++++++++++++++++++++++++++++++++++++------ + src/ukws_common.h | 4 +++ + src/ukws_manager.cpp | 20 +++++++++------ + 3 files changed, 69 insertions(+), 14 deletions(-) + +diff --git a/src/main.cpp b/src/main.cpp +index ae0442f..4f02dc0 100755 +--- a/src/main.cpp ++++ b/src/main.cpp +@@ -37,6 +37,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -161,18 +162,62 @@ void msgHandler(QtMsgType type, const QMessageLogContext& context, const QString + abort(); + } + ++bool startUkws(QString serviceName) { ++ bool dbusIsReady = false; ++ ++ QProcess *newUkws = new QProcess(); ++ newUkws->setProgram("/usr/bin/ukui-window-switch"); ++ newUkws->setStandardOutputFile("/dev/null"); ++ newUkws->setStandardErrorFile("/dev/null"); ++ newUkws->startDetached(); ++ ++ QTime curTime = QTime::currentTime(); ++ curTime.start(); ++ ++ while (curTime.elapsed() < 1100) { ++ QDBusInterface interface(serviceName, UKWS_DBUS_PATH, UKWS_DBUS_INTERFACE, ++ QDBusConnection::sessionBus()); ++ if (!interface.isValid()) { ++ usleep(250 * 1000); ++ } else { ++ dbusIsReady = true; ++ break; ++ } ++ } ++ ++ if (dbusIsReady) { ++ qInfo() << "ukui-window-switch is started"; ++ return true; ++ } else { ++ qInfo() << "ukui-window-switch start failed"; ++ return false; ++ } ++ ++ return false; ++} ++ + void handleWorkspaceView() + { +- QString object = QString(getenv("DISPLAY")); +- object = object.trimmed().replace(":", "_").replace(".", "_").replace("-", "_"); +- object = "/org/ukui/WindowSwitch/display/" + object; +- QDBusInterface interface("org.ukui.WindowSwitch", object, +- "org.ukui.WindowSwitch", ++ // 根据当前的DISPLAY环境变量构造单独的DBus Name ++ QString serviceName = QString(getenv("DISPLAY")); ++ serviceName = serviceName.trimmed().replace(":", "_").replace(".", "_").replace("-", "_"); ++ if (!serviceName.isEmpty()) ++ serviceName = QString(UKWS_DBUS_NAME_PREFIX) + "." + serviceName; ++ else ++ serviceName = UKWS_DBUS_NAME_PREFIX; ++ qDebug() << "Access DBus:" << serviceName; ++ ++ QDBusInterface interface(serviceName, UKWS_DBUS_PATH, UKWS_DBUS_INTERFACE, + QDBusConnection::sessionBus()); + if (!interface.isValid()) { +- qCritical() << QDBusConnection::sessionBus().lastError().message(); +- exit(1); ++ qDebug() << QDBusConnection::sessionBus().lastError().message(); ++ qInfo() << "Try to start ukui-window-switch"; ++ if (!startUkws(serviceName)) { ++ qCritical() << "Start ukui-window-switch failed"; ++ exit(1); ++ } + } ++ + //调用远程的value方法 + QDBusReply reply = interface.call("handleWorkspace"); + if (reply.isValid()) { +diff --git a/src/ukws_common.h b/src/ukws_common.h +index f3631ef..39c660d 100755 +--- a/src/ukws_common.h ++++ b/src/ukws_common.h +@@ -34,6 +34,10 @@ + #define UKWS_OBJ_NEW_WS_TITLE "new-workspace-title" + #define UKWS_OBJ_NEW_WS_LABEL "new-workspace-label" + ++#define UKWS_DBUS_NAME_PREFIX "org.ukui.WindowSwitch.Display" ++#define UKWS_DBUS_PATH "/org/ukui/WindowSwitch" ++#define UKWS_DBUS_INTERFACE "org.ukui.WindowSwitch" ++ + enum UkwsWidgetShowStatus { + Hidden = 0, + Shown, +diff --git a/src/ukws_manager.cpp b/src/ukws_manager.cpp +index e9cffe3..ecd4f1e 100755 +--- a/src/ukws_manager.cpp ++++ b/src/ukws_manager.cpp +@@ -92,19 +92,25 @@ UkwsManager::UkwsManager(QWidget *parent) : QWidget(parent) + connect(ws, &UkwsWorkspaceManager::isHidden, this, &UkwsManager::hideWorkspace); + // connect(altChecker, &UkwsAltChecker::altReleased, this, &UkwsManager::hideIndicator); + ++ // 根据当前的DISPLAY环境变量构造单独的DBus Name ++ QString serviceName = QString(getenv("DISPLAY")); ++ serviceName = serviceName.trimmed().replace(":", "_").replace(".", "_").replace("-", "_"); ++ if (!serviceName.isEmpty()) ++ serviceName = QString(UKWS_DBUS_NAME_PREFIX) + "." + serviceName; ++ else ++ serviceName = UKWS_DBUS_NAME_PREFIX; ++ qDebug() << "Register DBus Name:" << serviceName; ++ ++ + // 连接session总线 + QDBusConnection connection = QDBusConnection::sessionBus(); + + // 在session总线上为UKWS注册服务 +- if(!connection.registerService("org.ukui.WindowSwitch")) { ++ if(!connection.registerService(serviceName)) { + qCritical() << "Register DBus Service Error:" << connection.lastError().message(); + } +- // 注册org.ukui.WindowSwitch服务的object,把UkwsManager类的所有公共槽函数导出为object的method +- QString object = QString(getenv("DISPLAY")); +- object = object.trimmed().replace(":", "_").replace(".", "_").replace("-", "_"); +- object = "/org/ukui/WindowSwitch/display/" + object; +- qDebug() << "Register DBus:" << object; +- connection.registerObject(object, this, QDBusConnection::ExportAllSlots); ++ connection.registerObject(UKWS_DBUS_PATH, UKWS_DBUS_INTERFACE, ++ this, QDBusConnection::ExportAllSlots); + } + + void UkwsManager::setConfig(UkwsConfig *config) +-- +2.23.0 + diff --git a/ukui-window-switch.spec b/ukui-window-switch.spec index 2d15192..3481d14 100644 --- a/ukui-window-switch.spec +++ b/ukui-window-switch.spec @@ -1,12 +1,13 @@ %define debug_package %{nil} Name: ukui-window-switch Version: 3.0.1 -Release: 2 +Release: 3 Summary: Front of the window switch License: GPL-2+ BSD-2-clause BSD-3-clause and GPL-2+ URL: http://www.ukui.org Source0: %{name}-%{version}.tar.gz patch0: 0001-fix-template-with-C-linkage-error.patch +patch1: 0002-Fix-multi-process-contention-for-the-DBusName-in-VNC.patch BuildRequires: qt5-qtbase-devel BuildRequires: libblkid-devel @@ -27,6 +28,7 @@ Requires: ukwm >= 1.1.0 %prep %setup -q %patch0 -p1 +%patch1 -p1 %build qmake-qt5 @@ -46,6 +48,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/ukui-window-switch/ %changelog +* Sat Jul 31 2021 tanyulong - 3.0.1-3 +- Fix multi process contention for the DBusName in VNC environment + * Tue Jul 29 2021 tanyulong - 3.0.1-2 - fix template with C linkage error