【问题标题】:Assign user data to x11/xcb window将用户数据分配给 x11/xcb 窗口
【发布时间】:2020-11-10 07:37:20
【问题描述】:

Windows 等平台允许我们将自定义数据分配给窗口。使用 WinAPI,可以调用SetWindowLongPtr 将自定义数据分配给窗口。使用 AppKit,可以扩展他对 NSWindowDelegate 的实现,它被分配给一个窗口,并带有所需的数据。

xcb 中是否有等价物?

到目前为止,我尝试过......

  • 创建一个映射,将窗口 ID 映射到用户数据。
  • 将自定义属性/原子分配给窗口,其中包含指向我的数据的指针/索引。

我认为这两种方法都不是很好,因此我想知道是否有内置方法来实现我所需要的。尤其是后者,因为我不知道如何确保我的属性不会与 WM 定义的其他属性发生冲突。


TL;DR:如何在 xcb 中使用自定义数据注释窗口?

【问题讨论】:

  • 喜欢另一个进程读取?
  • 不,对于同一个过程。
  • 那么,窗口 id 的地图对我来说似乎更干净。

标签: c x11 c11 xcb


【解决方案1】:

我不了解 xcb,但我以前在 X windows 中所做的事情就是这样。假设有一个存储数据的结构

struct CustomData
{
     ...
} custom;

为标签中的指针分配空间时,添加 sizeof(void*)。假设标签是 Fred。

const char* tag = "Fred";
size_t tag_len = strlen(tag) + 1;
Custom* custom_ptr = &custom;
size_t ptr_len = sizeof(Custom_ptr);
char* label = (char*) malloc(taglen + sizeof(void*));
strcpy(label, tag);
// Add pointer to custom
memcpy(&label[taglen], &custom_ptr, ptr_len);
XtSetValue(w, XtNLabel, label);

然后取回值

char* label;
Arg warg[16];
XtSetArg(warg[0], XtNLabel, &label); 
XtGetValues(w, warg, 1);
size_t taglen = strlen(label) + 1;
Custom* custom_ptr;
memcpy(&custom_ptr, &label[taglen], sizeof(custom_ptr));

但那是在 80 年代中期,在 STL 发明之前。现在,我就像@Ry 所说的那样——创建一个小部件 ID 和数据的地图。

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 2021-01-26
    • 2018-11-30
    • 2021-04-08
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2019-11-30
    相关资源
    最近更新 更多