捕获Xlib中的按钮事件,然后将事件传递给客户端

时间:2017-09-18 21:09:33

标签: c x11 xlib xorg

我正在做一个窗口管理器,主要是作为练习,我遇到了问题。我希望能够将单击的窗口提升到堆栈顶部。目前,我在Button1和ControlMask上使用XGrabButton来允许移动窗口,当我按住Ctrl键并单击窗口时,可以实现所需的效果。但是,如果我在Button1上使用带有AnyModifier的XGrabButton,虽然我正在寻找效果,但我无法再通过鼠标按钮与客户端窗口(突出显示文本等)进行交互。我已经尝试抓住EnterNotify上的按钮,然后在窗口抬起后立即取消按钮,但这似乎没有效果,窗口管理器就好像我从来没有抓过按钮一样。

我的程序仍然相对较小,所以这里是代码:

d={
     "Date": 2017,
     "count": 88,
     "demographics":  [
                    {
           "key": "age",
           "value": "20-30"
        },
                    {
           "key": "education",
           "value": 'bachelor'
        },
                    {
           "key": "income",
           "value": "70-80"
        },
                    {
           "key": "location",
           "value": "USA"
        }
        ]
}

df=pd.DataFrame(d)

A=(df.demographics.apply(pd.Series).T.loc['value'].to_frame().\
    set_index(df.demographics.apply(pd.Series).T.loc['key']).T).\
       rename_axis(None,1).reset_index(drop=True)


pd.concat([df.drop('demographics',1).loc[0].to_frame().T,A],1)
    Out[273]: 
       Date  count    age education income location
    0  2017     88  20-30  bachelor  70-80      USA

我也试过使用XSendEvent,但根据我从中得到的结果,我不认为我理解它应该做得很好。我是Xlib编程的新手,所以非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

我有完全一样的问题。原始问题中的评论有所帮助,但还没有完全解决,它们缺少重要的细节(前面的要点1)。最终I found the hint here解决了它。

  1. 同步获取事件(通知GrabModeSync的名称为pointer_mode
XGrabButton(dis, FOCUS_BUTTON, AnyModifier, root, False, BUTTONMASK, GrabModeSync, GrabModeAsync, None, None);
  1. 使用XAllowEventsXsync来传递效果
XAllowEvents(display, ReplayPointer, ev->xbutton.time);
XSync(display, 0);