![](/img/trans.png)
[英]My xlib code can listen to keyboard events but it fails for some windows
[英]Xlib multiple windows events handling
我是xlib的新手。 我有一個程序,它有兩個顯示器和兩個窗口。 我的問題是,當用戶調整窗口大小時,內容消失了。
當一個人可以在其上繪制時,兩個窗口都將轉動。 輪到每個窗口,我都有while循環來獲取事件並進行處理。 我的問題是,如果我嘗試使用XNextEvent()監聽非活動窗口的事件,則該程序將隨機運行。 我粘貼了下面的while循環之一。
我真的很感謝您的幫助。
while(drawThings2) {
XNextEvent( dpy2, & e2 );// Get event
switch( e2.type ){
case ButtonPress :
switch( e2.xbutton.button ){
case Button1 :
//Start drawing
break;
case Button2 :
case Button3 :
break;
}
break;
case ButtonRelease :
switch( e2.xbutton.button ){
case Button1 :
//Draw things
break;
}
break;
case MotionNotify :
if( drawing && (e2.xmotion.state & Button1Mask) )
{
//Draw things
}
break;
case Expose :
if( e2.xexpose.count >= 0 )
{
//Redraw content if current window is resized by user
}
break;
}
if(XCheckWindowEvent( dpy, w, ExposureMask, & e )>0)
{
//Redraw the second window's content if the second window is resized by user
}
}
您需要多路復用來自兩個X11 Display
-s的輸入(和輸出)。 換句話說,您需要使用像poll(2)這樣的多路復用系統調用進行真正的單事件循環 (您不應嵌套兩個循環)。
我建議使用真實的工具箱(如Qt或GTK ),它將為您提供復雜的事件循環( Qt中的QApplication及其exec ,Gtk中的gtk_main ;這兩個工具箱都為它們的事件循環提供了許多較低層的接口)。
如果要保留原始Xlib調用(這很麻煩 ),請輪詢兩個顯示文件描述符(通過XConnectionNumber獲得),然后使用XPeekEvent(3) (在可讀文件描述符上)。
有關帶poll
的事件循環的示例,請參見此答案 (並使其適應您的需求)。
感謝您的幫助! 我將開始學習Qt。
我通過使用一個大的while循環解決了我的問題。 在while循環中,每個顯示都有兩個if(XPending(display))。 該程序非常簡單,所以我回答了一個簡單的答案,而且我是大一新生,所以我不太了解投票的過程。 這是我的解決方案:
while( !Finished ){
//If drawing to display1
if(XPending(dpy)) {
XEvent e;
XNextEvent( dpy, & e ); // Get event
switch( e.type ){
case ButtonPress :
switch( e.xbutton.button ){
case Button1 :
//Start drawing
break;
case Button2 :
case Button3 :
break;
}
break;
case ButtonRelease :
switch( e.xbutton.button ){
case Button1 :
//Draw things
break;
}
break;
case MotionNotify :
if( drawing && (e.xmotion.state & Button1Mask) )
{
//Draw things
}
break;
case Expose :
if( e.xexpose.count == 0 ) {
//Redraw content if current window is resized by user
}
break;
}//switch
}//if
else if(XPending(display2)) { //if drawing to display2
//same things as display1 but changed to display2
}
}//while
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.