簡體   English   中英

Xlib多個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)這樣的多路復用系統調用進行真正的單事件循環 (您不應嵌套兩個循環)。

我建議使用真實的工具箱(如QtGTK ),它將為您提供復雜的事件循環( 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.

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