首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xcb正确窗口大小

xcb正确窗口大小
EN

Stack Overflow用户
提问于 2022-02-03 17:02:27
回答 2查看 181关注 0票数 0

我有一个关于xcb窗口大小的问题,我使用xcb_create_window函数创建了一个窗口

代码语言:javascript
复制
    xcb_create_window(mScreen->connection(),
                  XCB_COPY_FROM_PARENT,
                  mWindow,
                  mScreen->screen()->root,
                  x, // left corner of the window client area
                  y, // upper corner of the window client area
                  width, // width of the client area
                  height, // height of the client area
                  0,
                  XCB_WINDOW_CLASS_INPUT_OUTPUT,
                  mScreen->screen()->root_visual,
                  value_mask,
                  value_list);
    auto reply = XCB_REPLY(xcb_intern_atom, mScreen->connection(), true, strlen("WM_PROTOCOLS"), "WM_PROTOCOLS");
    auto atomDelete = XCB_REPLY(xcb_intern_atom, mScreen->connection(), false, strlen("WM_DELETE_WINDOW"), "WM_DELETE_WINDOW");

    xcb_change_property(mScreen->connection(), XCB_PROP_MODE_REPLACE, mWindow, reply->atom, 4, 32, 1, &atomDelete->atom);
    xcb_change_property(mScreen->connection(), XCB_PROP_MODE_REPLACE, mWindow, XCB_ATOM_WM_NAME, XCB_ATOM_STRING, 8, strlen(windowName), windowName);
    xcb_flush(mScreen->connection());

在Win32 API上,我可以使用AdjustWindowRect函数调整窗口rect,该函数基本上增加了边框和标题大小,以确保客户端窗口具有预期的大小。

我的问题是如何用xcb实现这一点?是否有任何方法来计算所需的附加大小,以确保客户端窗口数据具有预期大小?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-07 07:30:01

以下代码根据Erdal Küük的建议获取窗口的边距:

  • 创建窗口
  • 配置内容(如标题或关闭按钮)
  • 等待属性消息
  • 万一_NET_FRAME_EXTENTS读取数据 uint32_t value_mask,value_list32{};auto windowHandle = xcb_generate_id(xcb_connection());value_mask = XCB_CW_EVENT_MASK;value_list = XCB_EVENT_MASK_PROPERTY_CHANGE;Xcb_create_window(屏幕->connection(),XCB_COPY_FROM_PARENT,windowHandle,screen->root,100,100,100,0,XCB_WINDOW_CLASS_INPUT_OUTPUT,屏幕->根_视觉,value_mask,value_list);auto协议= XCB_REPLY(xcb_intern_atom,screen->connection(),true,strlen("WM_PROTOCOLS"),"WM_PROTOCOLS");auto atomDelete = XCB_REPLY(xcb_intern_atom,screen->connection(),false,strlen("WM_DELETE_WINDOW"),"WM_DELETE_WINDOW");auto atomExtents = XCB_REPLY(xcb_intern_atom,screen->connection(),false,strlen("_NET_FRAME_EXTENTS"),_NET_FRAME_EXTENTS);xcb_change_property(xcb_connection(),XCB_PROP_MODE_REPLACE,windowHandle,协议->原子,XCB_ATOM_ATOM,32,1,原子删除->原子);xcb_change_property(xcb_connection(),XCB_PROP_MODE_REPLACE,windowHandle,XCB_ATOM_WM_NAME,XCB_ATOM_STRING,8,strlen(""),"");xcb_map_window(xcb_connection(),windowHandle);xcb_flush(xcb_connection());xcb_generic_event_t*事件;for (;;) { while ((Event=xcb_poll_for_event(screen->connection(){ switch (事件->response& 0x7f) { case XCB_PROPERTY_NOTIFY:{XCB_PROPERTY_NOTIFY= (const xcb_property_notify_event_t*)事件;如果(propertyNotify->atom原子event>atom){free(事件);goto end;} ==;}默认:断开;}free(事件);}} end: auto = XCB_REPLY(xcb_get_property,xcb_connection(),false,windowHandle,atom,XCB_ATOM_CARDINAL,0,4);if (extends &-data> == XCB_ATOM_CARDINAL && extends >format == 32 && extends>value_len == 4) { uint32_t* data =windowHandle Margins.l= -data;windowMargins.r = data1;windowMargins.t = -data2;windowMargins.b = data3;} xcb_destroy_window(xcb_connection(),windowHandle);
票数 0
EN

Stack Overflow用户

发布于 2022-02-03 17:50:49

扩展窗口管理器提示

范围 (其他根窗口消息)

基本原理:在映射窗口之前,客户端无法计算其窗口框架的大小,但有些工具包需要这些信息。向窗口管理器询问范围的估计是一个可行的解决方案。估计值可能取决于当前主题、字体大小或其他窗口属性。客户端可以通过侦听_NET_FRAME_EXTENTS PropertyNotify事件来跟踪对框架维度的更改。

范围 (应用程序窗口属性)

窗口管理器必须将_NET_FRAME_EXTENTS设置为窗口框架的范围。左、右、上、下是窗口管理器添加的各个边框的宽度。

在这里可以找到一些例子:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70975375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档