9·1免费网站CAD入口:设计师的效率加速器,创意无限的数字殿堂

核心内容摘要

母爱孽子缘:胡秀英的结局,是一场宿命的轮回还是人性的拷问?
国产精品,匠心独运:引领消费新浪潮

松下纱荣子在线:解锁你的专属次元,开启无限可能

前言在现代Linux桌面开发中高效、低延迟的输入事件处理至关重要。

XCB作为X11协议的现代化接口不仅提供更优的性能还通过其无状态、异步的设计为输入监听带来了革命性的改进。

本文将深入探讨如何使用XCB实现高性能的全局键盘鼠标输入监听构建响应灵敏的桌面应用。

X11输入事件系统架构略基础键鼠事件监听XCB原生事件同样不支持键盘鼠标的全局监听因此同样选择通过额外的扩展来实现监听。

1 键码解析由于XCB库没有提供完整的键盘映射函数而事件KeyCode和修饰符状态与X11完全一样因此直接使用X11的转换函数即可。

高级键鼠事件监听

1 XInput扩展intmain(){xcb_connection_t*connxcb_connect(NULL,NULL);if(xcb_connection_has_error(conn)){fprintf(stderr,XCB连接失败\n);return-1;}xcb_prefetch_extension_data(conn,xcb_input_id);autorecord_extxcb_get_extension_data(conn,xcb_input_id);if(!record_ext||!record_ext-present){fprintf(stderr,XInput 扩展不可用\n);return-1;}autorootxcb_setup_roots_iterator(xcb_get_setup(conn)).data-root;structxcb_input_event_mask_extend{xcb_input_event_mask_t header;unsignedmask;}event_mask{XCB_INPUT_DEVICE_ALL,1,XCB_INPUT_XI_EVENT_MASK_KEY_PRESS|XCB_INPUT_XI_EVENT_MASK_BUTTON_PRESS};xcb_input_xi_select_events(conn,root,1,(constxcb_input_event_mask_t*)event_mask);xcb_flush(conn);while(

{std::unique_ptrxcb_generic_event_tevent(xcb_wait_for_event(conn));if(event-response_type!XCB_GE_GENERIC){continue;}switch(((xcb_ge_generic_event_t*)event.get())-event_type){caseXCB_KEY_PRESS:{autokey_event(xcb_input_key_press_event_t*)event.get();printf( Mouse Button Press \n);printf( Button: %d\n,key_event-detail);printf( Root Coordinates: (%f, %f)\n,key_event-root_x16,key_event-root_y

;}break;caseXCB_BUTTON_PRESS:{autobtn_event(xcb_input_button_press_event_t*)event.get();printf( Key Press \n);printf( Key: %d\n,btn_event-detail);printf( Mask: %d\n,btn_event-mods.effective);}break;}}xcb_disconnect(conn);return0;}

2 Record扩展intmain(){xcb_connection_t*connectionxcb_connect(NULL,NULL);if(xcb_connection_has_error(connection)){fprintf(stderr,XCB连接失败\n);return-1;}xcb_prefetch_extension_data(connection,xcb_record_id);constxcb_query_extension_reply_t*record_extxcb_get_extension_data(connection,xcb_record_id);if(!record_ext||!record_ext-present){fprintf(stderr,RECORD 扩展不可用\n);return-1;}xcb_record_client_spec_t clientsXCB_RECORD_CS_ALL_CLIENTS;xcb_record_context_t contextxcb_generate_id(connection);xcb_record_range_t range;memset(range,0,sizeof(range));range.device_events.firstXCB_KEY_PRESS;range.device_events.lastXCB_BUTTON_PRESS;xcb_void_cookie_t create_cookiexcb_record_create_context(connection,context,0,1,1,clients,range);xcb_flush(connection);xcb_record_enable_context_cookie_t enable_cookiexcb_record_enable_context(connection,context);std::unique_ptrxcb_record_enable_context_reply_treply;while(

{reply.reset(xcb_record_enable_context_reply(connection,enable_cookie,NULL));uint8_t*dataxcb_record_enable_context_data(reply.get());intlenxcb_record_enable_context_data_length(reply.get());xcb_generic_event_t*event(xcb_generic_event_t*)data;while((uint8_t*)eventdatalen){switch(event-response_type~0x

{caseXCB_BUTTON_PRESS:{autobtn_event(xcb_button_press_event_t*)event;printf( Mouse Button Press \n);printf( Button: %d\n,btn_event-detail);printf( Root Coordinates: (%f, %f)\n,btn_event-root_x,btn_event-root_y);}break;caseXCB_KEY_PRESS:{autokey_event(xcb_key_press_event_t*)event;printf( Key Press \n);printf( Key: %d\n,key_event-detail);printf( Mask: %d\n,key_event-state);}break;}event1;}}xcb_disconnect(connection);return0;}结语虽然XInput和Record都是同步阻塞的但是XInput直接调用xcb_wait_for_event等待事件到来而Record则依赖底层的xcb_wait_for_reply响应请求。

由于XInput可以通过xcb_send_event模拟事件来唤醒xcb_wait_for_event而xcb_wait_for_reply目前暂未找到合适的方法因此更推荐使用XInput。

飞机杯教室动漫第2季全集在线观看-飞机杯教室动漫第2季全集在线观看应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123