当前位置: 首页 > news >正文

XReparentWindow踩坑分析

        X11是Linux发行系统中广泛采用的显示协议,各个系统基本上都支持XLib库,作为底层接口,XReparentWindow接口的功能就是重新设置父窗口,注意这个可以跨进程设置父窗口,例如将已经运行的进程的父窗口设置自己的程序Wid,即可将第三方进程嵌入到自己的程序窗口中,自己用这个接口写了一段代码,在UOS上运行的正常,后面跑在Kylin 4.0.2和V10上,程序出现了一些难以琢磨的情况,嵌入的程序无法focus,查阅到qt的container容器可以完成这个功能,查阅了qt4和qt5的源码,发先程序嵌入确实不是简简单单的XReparentWindow调用,后续还涉及到各种消息转发操作,后续学习。

bool QX11EmbedContainer::eventFilter(QObject *o, QEvent *event)
{Q_D(QX11EmbedContainer);switch (event->type()) {case QEvent::KeyPress:// Forward any keypresses to our client.if (o == this && d->client) {lastKeyEvent.window = d->client;XSendEvent(x11Info().display(), d->client, false, KeyPressMask, (XEvent *) &lastKeyEvent);return true;}break;case QEvent::KeyRelease:// Forward any keyreleases to our client.if (o == this && d->client) {lastKeyEvent.window = d->client;XSendEvent(x11Info().display(), d->client, false, KeyReleaseMask, (XEvent *) &lastKeyEvent);return true;}break;case QEvent::WindowActivate:// When our container window is activated, we pass the// activation message on to our client. Note that X input// focus is set to our focus proxy. We want to intercept all// keypresses.if (o == window() && d->client) {if (d->clientIsXEmbed) {sendXEmbedMessage(d->client, x11Info().display(), XEMBED_WINDOW_ACTIVATE);} else {d->checkGrab();if (hasFocus())XSetInputFocus(x11Info().display(), d->client, XRevertToParent, x11Time());}if (!d->isEmbedded())d->moveInputToProxy();}break;case QEvent::WindowDeactivate:// When our container window is deactivated, we pass the// deactivation message to our client.if (o == window() && d->client) {if (d->clientIsXEmbed)sendXEmbedMessage(d->client, x11Info().display(), XEMBED_WINDOW_DEACTIVATE);elsed->checkGrab();}break;case QEvent::FocusIn:// When receiving FocusIn events generated by Tab or Backtab,// we pass focus on to our client. Any mouse activity is sent// directly to the client, and it will ask us for focus with// XEMBED_REQUEST_FOCUS.if (o == this && d->client) {if (!d->isEmbedded())d->activeContainer = this;if (d->clientIsXEmbed) {if (!d->isEmbedded())d->moveInputToProxy();QFocusEvent *fe = (QFocusEvent *)event;switch (fe->reason()) {case Qt::TabFocusReason:sendXEmbedMessage(d->client, x11Info().display(), XEMBED_FOCUS_IN, XEMBED_FOCUS_FIRST);break;case Qt::BacktabFocusReason:sendXEmbedMessage(d->client, x11Info().display(), XEMBED_FOCUS_IN, XEMBED_FOCUS_LAST);break;default:sendXEmbedMessage(d->client, x11Info().display(), XEMBED_FOCUS_IN, XEMBED_FOCUS_CURRENT);break;}} else {d->checkGrab();XSetInputFocus(x11Info().display(), d->client, XRevertToParent, x11Time());}}break;case QEvent::FocusOut: {// When receiving a FocusOut, we ask our client to remove its// focus.if (o == this && d->client) {if (!d->isEmbedded()) {d->activeContainer = 0;if (isActiveWindow())d->moveInputToProxy();}if (d->clientIsXEmbed) {QFocusEvent *fe = (QFocusEvent *)event;if (o == this && d->client && fe->reason() != Qt::ActiveWindowFocusReason)sendXEmbedMessage(d->client, x11Info().display(), XEMBED_FOCUS_OUT);} else {d->checkGrab();}}}break;case QEvent::Close: {if (o == this && d->client) {// Unmap the client and reparent it to the root window.// Wait until the messages have been processed. Then ask// the window manager to delete the window.XUnmapWindow(x11Info().display(), d->client);XReparentWindow(x11Info().display(), d->client, x11Info().appRootWindow(x11Info().screen()), 0, 0);XSync(x11Info().display(), false);XEvent ev;memset(&ev, 0, sizeof(ev));ev.xclient.type = ClientMessage;ev.xclient.window = d->client;ev.xclient.message_type = ATOM(WM_PROTOCOLS);ev.xclient.format = 32;ev.xclient.data.s[0] = ATOM(WM_DELETE_WINDOW);XSendEvent(x11Info().display(), d->client, false, NoEventMask, &ev);XFlush(x11Info().display());d->client = 0;d->clientIsXEmbed = false;d->wmMinimumSizeHint = QSize();updateGeometry();setEnabled(false);update();emit clientClosed();}}default:break;}return QWidget::eventFilter(o, event);
}

        麒麟系统和WPS软件,qt4的QXEmbedContainer和qt5 createContainer嵌入wps时显示空白,慢慢研究解决方案去。

相关文章:

XReparentWindow踩坑分析

X11是Linux发行系统中广泛采用的显示协议,各个系统基本上都支持XLib库,作为底层接口,XReparentWindow接口的功能就是重新设置父窗口,注意这个可以跨进程设置父窗口,例如将已经运行的进程的父窗口设置自己的程序Wid&…...

OpenAI动荡,将走向何方、GPT5或许将近、毒舌AI轻松破防网友、最新版 GPT-4o AI 模型得满分 | AGI视界周刊第 4 期

AI 视界周刊由战场小包维护,每周一更新,包含热点聚焦、应用破局、学术前沿、社区热议、智见交锋、跨界 AI、企业动态和争议 AI 八大板块,后续板块划分和内容撰写在周刊迭代过程中持续优化,欢迎大家提出建议。 欢迎大家来到《AI 视…...

RCE---无字母数字webshell

<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); } 分析代码&#xff1a;传参不大于35&…...

有意思的漏洞复现与分析一

目录 一、Linux命令长度限制突破方法 1.在二进制漏洞利用中&#xff0c;某师傅遇到可控数据只有8字节的情况&#xff0c;去掉字符 串尾的\0&#xff0c;限制在7个字符。 一、Linux命令长度限制突破方法 1.在二进制漏洞利用中&#xff0c;某师傅遇到可控数据只有8字节的情况&a…...

力扣题解(按身高排序)

2418. 按身高排序 给你一个字符串数组 names &#xff0c;和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i&#xff0c;names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 思路&…...

Redis的六种淘汰策略详解

Redis作为一种高性能的键值对存储系统&#xff0c;其数据全部存储在内存中&#xff0c;因此内存管理对Redis的性能至关重要。当Redis的内存使用达到上限时&#xff0c;就需要通过淘汰策略来释放内存空间&#xff0c;以便存储新的数据。Redis提供了六种不同的淘汰策略&#xff0…...

vue3中 ref 和 reactive 的区别

相同&#xff1a;均是声明响应式对象。且声明的响应式对象是深层的 1. 数据类型不同&#xff1a;ref用于包装JavaScript基本类型的数据&#xff08;如字符串、数字、布尔值等&#xff09;&#xff0c;而reactive可以用于包装JavaScript对象和数组等复杂类型的数据。 2.访问方式…...

《单例模式的深度解读:实现方式、破坏情况与利弊权衡》

单例模式 一、单例模式的定义 ​ 单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的软件设计模式&#xff0c;确保一个类只有一个实例存在&#xff0c;并提供一个全局访问点来获取该实例。 二、单例模式的实现方式 ​ 1.懒汉式单例 public class LazySingle…...

010607电压源和电流源受控源

电源的理论部分 1.6电压源和电流源1.理想电压源&#xff1a; 1.6电压源和电流源 1.理想电压源&#xff1a; 其两端电压总能保持定值或一定的时间函数&#xff0c;其值与流过它的电流i无关的元件叫理想电压源。 电路符号&#xff1a;中间与导线直通的圆圈 电压源&#xff1a…...

快乐数求解

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c…...

运维高级内容--为端口做标记、制定调度规则

rs: yum install mod_ssl -y #安装mod_ssl模块 让rs支持https systemctl restart http lvs: cd /boot/ ls less config-5.14.0-427.13.1.el9_4.x86_64 ipvsadm -A -t 192.168.0.200:80 -s rr ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1 #轮询调度一次…...

后端Web之HTTP协议基础介绍

目录 1.HTTP概念 2.HTTP请求协议 3.HTTP响应协议 4.HTTP协议解析 1.HTTP概念 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是万维网数据通信的基础&#xff0c;允许将超…...

深入解析Nginx限流策略:如何高效控制访问频率

摘要&#xff1a;本文将详细介绍Nginx限流模块的使用方法&#xff0c;包括基于IP地址的限流、基于并发连接的限流以及如何应对突发流量。通过实际案例&#xff0c;帮助读者掌握Nginx限流策略&#xff0c;确保服务器在高并发场景下的稳定运行。 一、引言 在高并发场景下&#x…...

锂电池剩余寿命预测 | Matlab基于Transformer-GRU的锂电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于Transformer-GRU的锂电池剩余寿命预测&#xff0c;Transformer结合门控循环单元。 Matlab基于Transformer-GRU的锂电池剩余寿命预测&#xff08;单变量&#xff09; 运行环境Matlab2023b及以上。 首先从…...

深入理解Spring的IOC容器与依赖注入

深入理解Spring的IOC容器与依赖注入 引言 Spring框架的核心功能之一就是它的IOC容器&#xff0c;它为开发人员提供了强大的依赖管理和控制反转的能力。本文将详细介绍Spring的IOC容器以及依赖注入的基本概念和实现方式&#xff0c;并通过示例展示如何在实际项目中应用这些技术…...

Qt读写sysfs

本文介绍Qt读写sysfs。 在嵌入式Linux系统上开发Qt应用程序&#xff0c;经常会涉及到外设的控制&#xff0c;比如GPIO&#xff0c;PWM的控制&#xff0c;Linux环境下可以像操作文件一样操作它们&#xff0c;这通常会涉及到sysfs的读写。本文以读写GPIO为例&#xff0c;简要介绍…...

实景三维:解锁地理信息新维度,引领未来城市智慧之钥

在这个信息爆炸与科技日新月异的时代&#xff0c;地理信息与遥感技术正以前所未有的速度改变我们认知世界的方式。在推动“实景三维平台”这一前沿科技的构建上&#xff0c;它不仅是地理信息的立体呈现&#xff0c;更是智慧城市的基石&#xff0c;打开了通往未来城市规划、管理…...

汽车免拆诊断案例 | 2010款劳斯莱斯古斯特车中央信息显示屏提示传动系统故障

故障现象  一辆2010款劳斯莱斯古斯特车&#xff0c;搭载N74发动机&#xff0c;累计行驶里程约为11万km。车主反映&#xff0c;起动发动机后组合仪表和中央信息显示屏均提示传动系统故障。用故障检测仪检测&#xff0c;发现发动机控制模块2&#xff08;DME2&#xff09;中存储…...

监督学习和无监督学习是什么?

监督学习和无监督学习是机器学习中的两种基本学习方式&#xff0c;它们在处理数据和训练模型时有着显著的区别。 监督学习 定义&#xff1a; 监督学习是指利用一组已知类别的样本&#xff08;即标记的数据&#xff09;来调整分类器的参数&#xff0c;使其达到所要求性能的过程…...

YII2的errorHandler.errorAction失效原因

<?phpreturn [components => [errorHandler => [errorAction => site/error,],] ]; 这段配置存在错误,导致错误处理无法生效。为了解决这个问题,我们需要对配置进行优化。 代码查看:yii\web\ErrorHandler::renderException <?phpprotected function ren…...

前端 SEO 优化与图片 SEO 优化的关系是什么_如何利用前端框架进行 SEO 优化

前端 SEO 优化与图片 SEO 优化的关系是什么&#xff1f; 在当今的互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了任何网站想要获得高流量的关键步骤。前端 SEO 优化与图片 SEO 优化在这其中扮演着至关重要的角色。尽管它们看起来独立存在&#xff…...

AI辅助开发:让快马AI为你的clawhub skill添加智能标签与内容摘要

今天想和大家分享一个最近在做的项目优化——如何用AI给clawhub技能平台添加智能标签和内容摘要功能。作为一个开发者社区&#xff0c;clawhub上每天都有大量技能分享&#xff0c;但手动打标签和写摘要实在太费时间了。正好发现InsCode(快马)平台内置了多种AI模型&#xff0c;就…...

【AHC】async-http-client 的请求队列是在哪里维护的?排队机制如何工作?

async-http-client 的请求队列是在哪里维护的?排队机制如何工作? 作者:九师兄 发布时间:2026年02月05日 问题引入:Flink 作业因“隐形队列”堆积导致 OOM 某日,我们负责的 实时埋点日志上报系统(基于 Flink 1.17 + async-http-client 3.0.5)突然出现 容器内存溢出(O…...

猫抓浏览器扩展:从零开始的网页资源嗅探完全指南

猫抓浏览器扩展&#xff1a;从零开始的网页资源嗅探完全指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页上的精彩视频无法保存而烦恼…...

聚类算法效果评估实战:从轮廓系数到CH分数,手把手教你选对指标

聚类算法效果评估实战&#xff1a;从轮廓系数到CH分数&#xff0c;手把手教你选对指标 在数据科学项目中&#xff0c;聚类分析常常是探索性数据分析的重要环节。无论是客户分群、异常检测还是特征工程&#xff0c;我们都需要面对一个关键问题&#xff1a;如何客观评价聚类结果的…...

PCB模块化设计进阶:晶体晶振布局布线的高效抗干扰策略

1. 晶体晶振在PCB设计中的核心地位 晶体和晶振是数字电路的心脏&#xff0c;它们产生的时钟信号就像交响乐团的指挥&#xff0c;决定了整个系统运行的节奏。我在设计高速PCB时&#xff0c;曾经遇到过因为时钟信号不稳定导致整个系统频繁崩溃的情况&#xff0c;后来排查发现就是…...

AI+经济学:当因果推断遇上强化学习,如何重塑政策与市场?

AI经济学&#xff1a;当因果推断遇上强化学习&#xff0c;如何重塑政策与市场&#xff1f;当经济学家还在为模型的假设争论不休时&#xff0c;AI已经学会了从数据洪流中直接“阅读”经济的脉搏。这不是替代&#xff0c;而是一场工具箱的全面升级。引言 在数字经济时代&#xff…...

Starry Night Art Gallery实战案例:小红书爆款插画AI生成流程

Starry Night Art Gallery实战案例&#xff1a;小红书爆款插画AI生成流程 1. 引言&#xff1a;当AI艺术遇上小红书爆款 如果你在小红书上刷到过那些点赞过万、充满梦幻色彩的插画作品&#xff0c;可能会好奇&#xff1a;这些画风独特、细节精美的作品&#xff0c;到底是怎么创…...

MATLAB代码:考虑绿证交易与综合需求响应的综合能源系统优化调度“注意:引号内文字为返回的标题

MATLAB代码&#xff1a;计及绿证交易和综合需求响应的综合能源系统优化调度 关键词&#xff1a;绿证交易 综合需求响应 综合能源系统 优化调度 仿真平台: matlabyalmipcplex 主要内容&#xff1a;代码针对综合能源系统低碳运行和源荷互动&#xff0c;考虑可再生能源电力消纳责…...

MusicFree歌单导入终极指南:如何快速迁移你的音乐收藏

MusicFree歌单导入终极指南&#xff1a;如何快速迁移你的音乐收藏 【免费下载链接】MusicFree 插件化、定制化、无广告的免费音乐播放器 项目地址: https://gitcode.com/maotoumao/MusicFree 你是否厌倦了在不同音乐平台之间切换时&#xff0c;精心整理的音乐收藏总是被…...