簡體   English   中英

抓住指針時使用XSendEvent發送事件

[英]Sending an event using XSendEvent when a pointer is grabbed

我為compiz窗口管理器開發了一個插件。 我想繪制一個轉換后的窗口紋理並將事件發送到該窗口。 當一個轉換后的窗口是渲染器時,我抓住指針來控制所有xevent,compiz函數的主要部分抓住了指針,如下所示:

 status = XGrabPointer (privateScreen.dpy, privateScreen.eventManager.getGrabWindow(), true,
                        POINTER_GRAB_MASK,
                        GrabModeAsync, GrabModeAsync,
                        privateScreen.rootWindow(), cursor,
                        CurrentTime);

抓住指針后,我將重新計算按鈕的按下坐標,然后使用XSendEvent將事件發送到目標窗口。 它適用於Google chrome窗口或簡單的xwindow應用程序,如下所示: 鏈接不幸的是,它對於執行OpenGL渲染的窗口無法正常工作-我已經測試了SDL和GLFW。 這樣的窗口接收點擊事件,但具有與XSendEvent中指定的參數不同的參數(xbutton.x_root,xbutton.y_root,xbutton.x,xbutton.y)。 每次發送事件時,這些參數都包含相同的值,這似乎是調用xgrabpointer之前的鼠標位置。 如果沒有抓住指針,則將正確接收事件(來自XSendEvent)。 xsendevent,xgrabpointer和執行OpenGL渲染的窗口之間必須存在某些特定的關系。 此外,客戶端(Windows)的實現可能會有所不同,因為我的代碼不僅不適用於特定的Windows,還是我做錯了?

EDIT1

讓我們考慮以下示例:我有一個全屏窗口,然后可以使用一個插件繪制轉換后的窗口紋理(例如比例轉換(0.5、0.5、1.0)),但是X11仍然看到一個全屏窗口,因此當我單擊轉換后的紋理事件之外的區域轉到窗口。 當我在插件中抓取指針時,我是所有事件的唯一接收者,然后我可以根據我的窗口變形重新計算坐標,並將其發送到窗口。

Edit2當我使用Freeglut時,抓住指針后,所有事件都會正確發送到目標窗口。 庫實現之間必須有一些區別。

OpenGL不關心輸入事件,它只是繪制東西,甚至不知道X11或指針事件是什么。

SDL和GLFW在其窗口設置中都必須這樣做。

但是我不知道為什么您要抓住所有指針? X Composite擴展是構建Compiz和其他合成WM的基礎,已經具有用於指針輸入轉換的專用API,請參見http://www.x.org/archive/X11R7.5/doc/compositeproto/compositeproto .txt RedirectCoordinateTransformCoordinate 您應該使用這些函數,而不要弄亂獲取指針。 抓住指針是一個非常非常糟糕的主意。

好的,似乎我鏈接的X復合擴展名的副本(我在計算機上擁有)是一個較早的草稿,其中仍然包含RedirectCoordinate。 有一個較新的版本(不幸的是,它的頭部帶有相同的日期-WTF?)已刪除了坐標重定向。

在處理MouseMotion事件時,SDL更新鼠標位置。 它不使用存儲在ButtonPress事件中的坐標。 當窗口管理器抓住指針並將ButtonPress事件發送到SDL窗口時,接收器內部的鼠標位置不會更新。 這是示例解決方案(以下代碼應添加到SDL_x11events.c中ButtonPress標簽之后的部分:

if(xevent.xany.send_event)
{
     SDL_Mouse *mouse = SDL_GetMouse();
     mouse->x = xevent.xbutton.x;
     mouse->y = xevent.xbutton.y;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM