kiran-session-guard/0005-fix-Locker-VirtualKeyboard-unlock-interface-calls-on.patch

203 lines
6.8 KiB
Diff
Raw Normal View History

From c3472c9d50c5fb40f49d3de3d03d4d812bb48959 Mon Sep 17 00:00:00 2001
From: liuxinhao <liuxinhao@kylinsec.com.cn>
Date: Thu, 8 Dec 2022 10:56:20 +0800
Subject: [PATCH 5/6] fix(Locker VirtualKeyboard): unlock interface calls
onboard, and the onboard process cycle is consistent with the unlock
interface
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 解锁界面调用onboard,onboard进程周期和解锁界面一致,避免出现解锁后onboard进程不退出和kiran-screensaver同一生存周期的问题
---
lib/common-widgets/virtual-keyboard.cpp | 8 ++--
lib/common-widgets/virtual-keyboard.h | 8 ++--
screensaver-dialog/src/plugin.cpp | 8 ----
screensaver-dialog/src/screensaver-dialog.cpp | 37 +++++++++++--------
screensaver-dialog/src/screensaver-dialog.h | 4 ++
5 files changed, 33 insertions(+), 32 deletions(-)
diff --git a/lib/common-widgets/virtual-keyboard.cpp b/lib/common-widgets/virtual-keyboard.cpp
index a6921af..4e39e54 100644
--- a/lib/common-widgets/virtual-keyboard.cpp
+++ b/lib/common-widgets/virtual-keyboard.cpp
@@ -78,7 +78,7 @@ bool VirtualKeyboard::init(QWidget *parent)
}
xid = stdoutput.toULongLong();
-
+ KLOG_DEBUG() << "foreign virtual keyboard window id:" << xid;
foreignWindow = QWindow::fromWinId(xid);
foreignWindow->setFlag(Qt::ForeignWindow);
m_keyboardWidget = QWidget::createWindowContainer(foreignWindow, nullptr);
@@ -113,15 +113,15 @@ void VirtualKeyboard::showAdjustSize(QWidget *parent)
if (parent == nullptr)
{
KLOG_WARNING() << "VirtualKeyboard::showAdjustSize parent can't be nullptr";
+ return;
}
KLOG_DEBUG() << "VirtualKeyboard::showAdjustSize" << parent->objectName();
m_keyboardWidget->hide();
- QRect parentRect = parent->geometry();
m_keyboardWidget->setParent(parent);
+ QRect parentRect = parent->geometry();
QSize keyboardSize(parentRect.width()*ONBOARD_WIDTH_FACTOR,parentRect.height()*ONBOARD_HEIGHT_FACTOR);
-
m_keyboardWidget->resize(parentRect.width()*ONBOARD_WIDTH_FACTOR, parentRect.height()*ONBOARD_HEIGHT_FACTOR);
m_keyboardWidget->move((parentRect.width() - keyboardSize.width()) / 2, parentRect.height() - keyboardSize.height());
m_keyboardWidget->show();
@@ -170,4 +170,4 @@ VirtualKeyboard::VirtualKeyboard(QObject *parent)
void VirtualKeyboard::slotReadyReadStandardOutput()
{
-}
+}
\ No newline at end of file
diff --git a/lib/common-widgets/virtual-keyboard.h b/lib/common-widgets/virtual-keyboard.h
index 31ca7c7..72d8134 100644
--- a/lib/common-widgets/virtual-keyboard.h
+++ b/lib/common-widgets/virtual-keyboard.h
@@ -21,9 +21,11 @@ class VirtualKeyboard : public QObject
{
Q_OBJECT
public:
- static VirtualKeyboard *instance();
+ explicit VirtualKeyboard(QObject *parent = nullptr);
~VirtualKeyboard();
+ static VirtualKeyboard *instance();
+
bool init(QWidget *parent = nullptr);
void hide();
bool isVisible();
@@ -34,13 +36,11 @@ public:
public slots:
void slot_finished(int exitCode, QProcess::ExitStatus exitStatus);
-private:
- explicit VirtualKeyboard(QObject *parent = nullptr);
-
private slots:
void slotReadyReadStandardOutput();
private:
QWidget * m_keyboardWidget;
QProcess *m_process;
+ QWidget *m_keyboardEmbed = nullptr;
};
diff --git a/screensaver-dialog/src/plugin.cpp b/screensaver-dialog/src/plugin.cpp
index 8699d3c..7c435de 100644
--- a/screensaver-dialog/src/plugin.cpp
+++ b/screensaver-dialog/src/plugin.cpp
@@ -46,14 +46,6 @@ int KSPlugin::init(Interface* ksInterface)
{
KLOG_WARNING() << "can't load kiran-screensaver-dialog translator";
}
-
-#ifdef VIRTUAL_KEYBOARD
- if( !VirtualKeyboard::instance()->init() )
- {
- KLOG_WARNING() << "init virtual keyboard failed!";
- }
-#endif
-
return 0;
}
diff --git a/screensaver-dialog/src/screensaver-dialog.cpp b/screensaver-dialog/src/screensaver-dialog.cpp
index 3ab7d19..2f1634e 100644
--- a/screensaver-dialog/src/screensaver-dialog.cpp
+++ b/screensaver-dialog/src/screensaver-dialog.cpp
@@ -101,7 +101,17 @@ ScreenSaverDialog::ScreenSaverDialog(Kiran::ScreenSaver::Interface* ksInterface,
ScreenSaverDialog::~ScreenSaverDialog()
{
- delete ui;
+#ifdef VIRTUAL_KEYBOARD
+ if( m_keyboard )
+ {
+ auto keyboardWidget = m_keyboard->getKeyboard();
+ if (m_keyboard->getKeyboard() && m_keyboard->getKeyboard()->parentWidget()==this)
+ {
+ m_keyboard->getKeyboard()->setParent(nullptr);
+ }
+ }
+#endif
+ delete ui;
}
QWidget *ScreenSaverDialog::get_widget_ptr()
@@ -274,17 +284,23 @@ void ScreenSaverDialog::initUI()
m_authProxy->respond(ui->promptEdit->getText());
});
+
#ifdef VIRTUAL_KEYBOARD
+ m_keyboard = new VirtualKeyboard(this);
+
+ if (!m_keyboard->init())
+ {
+ KLOG_WARNING() << "init virtual keyboard failed!";
+ }
connect(ui->btn_keyboard, &QToolButton::pressed, this, [this] {
- VirtualKeyboard *keyboard = VirtualKeyboard::instance();
- if (keyboard->isVisible())
+ if (m_keyboard->isVisible())
{
- keyboard->hide();
+ m_keyboard->hide();
}
else
{
//虚拟键盘通过传入的父窗口调整大小并进行显示
- keyboard->showAdjustSize(this);
+ m_keyboard->showAdjustSize(this);
}
this->window()->windowHandle()->setKeyboardGrabEnabled(true);
});
@@ -560,17 +576,6 @@ void ScreenSaverDialog::startAuth()
void ScreenSaverDialog::closeEvent(QCloseEvent *event)
{
-#ifdef VIRTUAL_KEYBOARD
- //在关闭时若虚拟键盘的副窗口设置为当前窗口的话,则更改父窗口,避免释放相关X资源导致onboard释放出错导致onboard崩溃
- if (VirtualKeyboard::instance()->getKeyboard())
- {
- if (VirtualKeyboard::instance()->getKeyboard()->parentWidget() == this)
- {
- KLOG_DEBUG() << "keyboard reparent";
- VirtualKeyboard::instance()->getKeyboard()->setParent(nullptr);
- }
- }
-#endif
QWidget::closeEvent(event);
}
diff --git a/screensaver-dialog/src/screensaver-dialog.h b/screensaver-dialog/src/screensaver-dialog.h
index fe7a899..f166841 100644
--- a/screensaver-dialog/src/screensaver-dialog.h
+++ b/screensaver-dialog/src/screensaver-dialog.h
@@ -37,6 +37,7 @@ class Interface;
class QMenu;
class AuthProxy;
+class VirtualKeyboard;
class ScreenSaverDialog : public QWidget, public Kiran::ScreenSaver::LockerInterface
{
Q_OBJECT
@@ -112,6 +113,9 @@ private:
Kiran::AuthType m_authType = Kiran::AUTH_TYPE_PASSWD;
bool m_havePrompt = false;
QString m_userName;
+#ifdef VIRTUAL_KEYBOARD
+ VirtualKeyboard *m_keyboard = nullptr;
+#endif
};
#endif // WIDGET_H
--
2.33.0