news 2026/5/1 5:03:38

linux 使用Xcb监听窗口

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux 使用Xcb监听窗口

前言

在Linux桌面开发领域,XCB(X C Binding)作为Xlib的现代化替代品,正逐渐成为X11编程的主流选择。
与传统Xlib相比,XCB提供了更小的内存占用、更好的性能、直接的协议访问以及出色的异步支持。
本文将深入探讨如何使用XCB进行高效窗口事件监听,构建响应迅速的桌面应用。

XCB vs Xlib:为何选择XCB?

1.1 核心优势对比
特性XlibXCB优势
架构同步、有状态异步、无状态更好的并发性
内存占用较高极低适合资源受限环境
延迟隐藏优秀减少等待时间
线程安全需要锁原生支持简化多线程编程
协议扩展间接访问直接访问更精细的控制

Xcb 窗口监听实现

2.1 建立连接
#include<xcb/xcb.h>#include<stdio.h>#include<stdlib.h>intmain(){xcb_conn_t*conn=xcb_connect(NULL,NULL);if(xcb_conn_has_error(conn)){fprintf(stderr,"XCB连接失败\n");return-1;}autoroot=xcb_setup_roots_iterator(xcb_get_setup(conn)).data->root;printf("XCB连接成功\n");printf("根窗口 ID: %lu\n",root);// ...xcb_disconnect(conn);return0;}
2.2 监听窗口事件
uint32_tmask=XCB_EVENT_MASK_PROPERTY_CHANGE|XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY;xcb_change_window_attributes(conn.get(),root,XCB_CW_EVENT_MASK,&mask);// 等待请求完成xcb_flush(conn.get());while(1){std::unique_ptr<xcb_generic_event_t>event(xcb_wait_for_event(conn));switch(event->response_type&~0x80){caseXCB_PROPERTY_NOTIFY:break;caseXCB_CONFIGURE_NOTIFY:break;default:break;}}
2.3 获取窗口属性信息
voidprint_window_info(xcb_connection_t*conn,xcb_window_t window){// 获取窗口标题xcb_atom_t atom=get_intern_atom(conn,strlen("_NET_WM_NAME"),"_NET_WM_NAME");autocookie=xcb_get_property(conn,0,window,atom,XCB_GET_PROPERTY_TYPE_ANY,0,(~0u));std::unique_ptr<xcb_get_property_reply_t>reply(xcb_get_property_reply(conn,cookie,NULL));if(reply){printf("窗口标题: %s\n",(char*)xcb_get_property_value(reply.get()));}// 获取窗口进程xcb_atom_t atom_pid=get_intern_atom(conn,strlen("_NET_WM_PID"),"_NET_WM_PID");xcb_get_property_cookie_t cookie=xcb_get_property(conn,0,window,atom_pid,XCB_ATOM_CARDINAL,0,1);std::unique_ptr<xcb_get_property_reply_t>reply(xcb_get_property_reply(conn,cookie,NULL));if(reply){printf("所属进程: %d\n",*((pid_t*)xcb_get_property_value(reply.get())));}// 获取窗口尺寸xcb_get_geometry_cookie_t geom_cookie=xcb_get_geometry(conn,window);std::unique_ptr<xcb_get_geometry_reply_t>geom(xcb_get_geometry_reply(conn,geom_cookie,nullptr));if(geom){// 获取窗口属性xcb_window_t root=xcb_setup_roots_iterator(xcb_get_setup(conn)).data->root;// 转换坐标:从窗口局部坐标 (0,0) 到根窗口坐标xcb_translate_coordinates_cookie_t trans_cookie=xcb_translate_coordinates(conn,window,root,0,0);std::unique_ptr<xcb_translate_coordinates_reply_t>trans(xcb_translate_coordinates_reply(conn,trans_cookie,nullptr));if(trans){printf("位置: %dx%d 大小: %dx%d\n",trans->dst_x,trans->dst_y,geom->width,geom->height);}}}

高级监听功能

3.1 监听活动窗口
uint32_tmask=XCB_EVENT_MASK_PROPERTY_CHANGE;// 监听窗口属性和子窗口结构变化xcb_change_window_attributes(conn,root,XCB_CW_EVENT_MASK,&mask);// 监听活动窗口IDxcb_atom_t active_window_atom=get_intern_atom(conn,strlen("_NET_ACTIVE_WINDOW"),"_NET_ACTIVE_WINDOW");while(1){std::unique_ptr<xcb_generic_event_t>event(xcb_wait_for_event(conn));uint8_ttype=event->response_type&~0x80;if(type==XCB_PROPERTY_NOTIFY){xcb_property_notify_event_t*prop=(xcb_property_notify_event_t*)event.get();if(prop->atom==active_window_atom){xcb_get_property_cookie_t cookie=xcb_get_property(connection,0,root,active_window_atom,XCB_ATOM_WINDOW,0,1);std::unique_ptr<xcb_get_property_reply_t>reply(xcb_get_property_reply(connection,cookie,NULL));if(reply){printf("活动窗口变更: %lu\n",*((xcb_window_t*)xcb_get_property_value(reply.get())));}}}}
3.2 监听窗口属性变化
uint32_tmask=XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY;// 监听子窗口结构变化xcb_change_window_attributes(conn,root,XCB_CW_EVENT_MASK,&mask);while(1){std::unique_ptr<xcb_generic_event_t>event(xcb_wait_for_event(conn));uint8_ttype=event->response_type&~0x80;if(type==XCB_CONFIGURE_NOTIFY){// 这里存在X11一样的问题xcb_configure_notify_event_t*conf=(xcb_configure_notify_event_t*)event.get();printf("窗口大小/位置变化: ID=%lu, %dx%d @ %d,%d\n",conf->window,conf->width,conf->height,conf->x,conf->y);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:36:38

复杂推理任务协调中元控制器的决策优化研究

复杂推理任务协调中元控制器的决策优化研究 关键词:复杂推理任务、元控制器、决策优化、推理协调、智能决策 摘要:本文聚焦于复杂推理任务协调过程中元控制器的决策优化问题。首先介绍了研究的背景、目的、预期读者等内容。详细阐述了元控制器的核心概念、相关联系及架构,给…

作者头像 李华
网站建设 2026/5/1 4:53:39

自然语言处理在AI原生应用中的7个关键技术解析

自然语言处理在AI原生应用中的7个关键技术解析 关键词&#xff1a;自然语言处理&#xff08;NLP&#xff09;、AI原生应用、预训练模型、多模态融合、上下文学习、意图识别、低资源学习 摘要&#xff1a;AI原生应用&#xff08;AI-Native Apps&#xff09;是指从底层架构到核心…

作者头像 李华
网站建设 2026/5/1 8:37:52

Java全栈开发工程师面试实战:从基础到高阶的全面考察

Java全栈开发工程师面试实战&#xff1a;从基础到高阶的全面考察 一、开场与基本信息 面试官&#xff1a;你好&#xff0c;欢迎来到我们公司的面试环节。我是今天的面试官&#xff0c;主要负责技术部分的考察。你叫什么名字&#xff1f; 应聘者&#xff1a;您好&#xff0c;我叫…

作者头像 李华