Skip to content

Commit ab16a5e

Browse files
fix(focus): update focus policy handling for Wayland and clipboard interactions
- Improved focus policy logic for fullscreen windows in Wayland and Treeland modes, ensuring proper focus behavior for screenshot and recording functionalities. - Enhanced clipboard handling by checking for the presence of the clipboard daemon, allowing for better confirmation of data transfer to the clipboard. - Updated comments for clarity regarding focus policy changes and clipboard signal handling. bug: https://pms.uniontech.com/bug-view-357249.html
1 parent 8eb791c commit ab16a5e

1 file changed

Lines changed: 17 additions & 9 deletions

File tree

src/main_window.cpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -407,15 +407,18 @@ void MainWindow::initAttributes()
407407
// Qt::WindowStaysOnTopHint: 通知窗口系统该窗口应位于所有其他窗口之上。请注意,在 X11 上的某些窗口管理器上,您还必须传递
408408
// Qt::X11BypassWindowManagerHint 以使此标志正常工作。 Qt::X11BypassWindowManagerHint : 完全绕过窗口管理器。
409409
if (Utils::isWaylandMode || Utils::isTreelandMode) {
410-
// 1070焦点策略管理比1060严格,作为全屏窗口的截图录屏设置了无焦点属性后,窗管不会在设置为获取焦点
411-
// 因此在1070截图录屏截图录屏需要获取焦点,不然应用内快捷键无法响应。
412-
if (DSysInfo::minorVersion().toInt() >= 1070) {
410+
// V20(1070+)/V25社区版 焦点策略更严格:全屏窗口设置了无焦点属性后,窗管不会再设置为获取焦点,
411+
// 因此截图录屏需要获取焦点,不然应用内快捷键无法响应。
412+
const int minor = DSysInfo::minorVersion().toInt();
413+
const bool isNewFocusPolicy = minor >= 1070
414+
|| DSysInfo::uosEditionType() == DSysInfo::UosCommunity;
415+
if (isNewFocusPolicy) {
413416
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
414417
} else {
415418
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::WindowDoesNotAcceptFocus);
416419
}
417420
if (this->windowHandle()) {
418-
if (DSysInfo::minorVersion().toInt() >= 1070) {
421+
if (isNewFocusPolicy) {
419422
this->windowHandle()->setProperty("_d_dwayland_window-type", "override");
420423
} else {
421424
this->windowHandle()->setProperty("_d_dwayland_window-type", "onScreenDisplay"); // 窗管层级在1060和1070有所区别,兼容适配bug254705-275661
@@ -2646,8 +2649,11 @@ void MainWindow::save2Clipboard(const QPixmap &pix)
26462649
quality = 60;
26472650
}
26482651
if (Utils::is3rdInterfaceStart == false) {
2649-
if (DSysInfo::minorVersion().toInt() >= 1070) {
2650-
// check if save to clipboard finished
2652+
const int minor = DSysInfo::minorVersion().toInt();
2653+
const bool hasClipboardDaemon = minor >= 1070
2654+
|| DSysInfo::uosEditionType() == DSysInfo::UosCommunity;
2655+
if (hasClipboardDaemon) {
2656+
// 连接 dde-clipboard-daemon 的 dataComing 信号,用于确认数据已被剪贴板服务接管
26512657
const QString ClipboardSignal = QStringLiteral("dataComing");
26522658
qCInfo(dsrApp) << "Connecting the clipboard feedback signal..."
26532659
<< "\nClipboardService: " << CLIPBOARD_NAME << "\nClipboardPath: " << CLIPBOARD_PATH
@@ -2719,13 +2725,15 @@ void MainWindow::save2Clipboard(const QPixmap &pix)
27192725
qCDebug(dsrApp) << "Whether the data passed to the clipboard is empty? " << t_imageData->imageData().isNull();
27202726
}
27212727

2722-
if (DSysInfo::minorVersion().toInt() >= 1070) {
2728+
if (hasClipboardDaemon) {
27232729
if (!Utils::isWaylandMode) {
27242730
this->hide(); // 隐藏主界面
27252731
}
2726-
//根据图片大小动态计算等待时间,如果数据还没有传递到剪切板,则退出程序
2732+
// 等待 dde-clipboard-daemon 通过 dataComing 信号确认已接管数据
2733+
// 超时后仍退出,避免无限阻塞
27272734
int waitSeconds = getWaitTimeByImageSize(pix);
27282735
time_t endTime = time(nullptr) + waitSeconds;
2736+
m_isSaveClipboard = false;
27292737
qCInfo(dsrApp) << "Start Wait" << waitSeconds << "s for data to be saved to the clipboard..." << endTime;
27302738
time_t lastTime = 0;
27312739
while (1) {
@@ -6366,7 +6374,7 @@ void MainWindow::onLockScreenEvent(QDBusMessage msg)
63666374
void MainWindow::onSaveClipboardComing(const QByteArray &msg)
63676375
{
63686376
Q_UNUSED(msg);
6369-
qCInfo(dsrApp) << "Received data transfer to the clipboard complete signal!";
6377+
qCWarning(dsrApp) << "Received dataComing signal from clipboard daemon";
63706378
emit saveClipboardComing();
63716379
m_isSaveClipboard = true;
63726380
}

0 commit comments

Comments
 (0)