与重新父子关系相关的拖放

问题描述 投票:0回答:1

如何在重定窗口管理器中支持拖放?

看起来如果我使用支持它的应用程序(例如 thunar),然后我将其从一个客户端拖动到另一个客户端,它就会返回。我认为这是因为它试图将其拖动到框架窗口中。我必须支持什么才能使其正常工作? EWMH _NET_CLIENT_LIST 是我的第一个猜测,我很快就会实现它,但我不知道这将如何帮助找到它被拖动到的窗口。

伙计,重新养育孩子可能会很痛苦!现在只有一个人回答,抱歉所有问题;)

x11 xlib xcb
1个回答
0
投票

将客户端窗口重新设置为装饰时,如果窗口不是根的子窗口,则无法可靠地找到这些窗口,并且它们还会丢失它们在根坐标中的位置。有两个标准需要实施,使普通客户端能够拖放。它们并不复杂,您可以在这里阅读它们:

https://tronche.com/gui/x/icccm/sec-4.html

4.1.3.1。 WM_STATE 属性

这将允许客户端找到其他客户端(和他们自己),即使它们不是顶级窗口。例如,即使您单击非客户端装饰,xprop 和 xwininfo 也会找到您的客户端窗口。这是一个例子:

    long data[2];
    data[0] = hidden ? IconicState : NormalState; // NormalState, IconicState, etc.
    data[1] = None;
    XChangeProperty(display, window, XInternAtom(display, "WM_STATE", False), 
                    XA_ATOM, 32, PropModeReplace, (unsigned char *)data, 2);

接下来,您会注意到客户端将失去准确找到根目录中位置以突出显示和删除内容的能力。调整窗口大小可能会解决此问题,但移动窗口会导致此问题。

4.2.3。窗口移动

这将告诉客户他们在根目录中的位置,以便他们可以突出显示拖动项目的放置位置。使用 XSendEvent 发送 XConfigureEvent 事件,其中 x 和 y 位于根坐标中。请务必添加您的装饰所添加的偏移量。

为了研究这个问题,我使用了 xwininfo、xev 和 xprop。我注意到其他窗口管理器允许单击来检索装饰的子窗口。我的WM没有这样做。我分叉了 xprop 并添加了调试输出以了解我缺少的内容,它引导我走向标准。祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.