Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Xlib多窗口事件处理_C++_Linux_Xlib_X11 - Fatal编程技术网

C++ Xlib多窗口事件处理

C++ Xlib多窗口事件处理,c++,linux,xlib,x11,C++,Linux,Xlib,X11,我是xlib的新手。我有一个程序,它有两个显示器和两个窗口。我的问题是,当用户调整窗口大小时,内容就会消失 两扇窗户都有转弯处,可以在上面画画。我为每个窗口的轮次设置了while循环,以获取事件并处理它们。我的问题是,如果我尝试使用XNextEvent()侦听非活动窗口的事件,程序将随机工作。我在下面粘贴了一个while循环 我非常感谢你的帮助 while(drawThings2) { XNextEvent( dpy2, & e2 );// Get event switch(

我是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
显示器
-s多路传输输入(和输出)。换句话说,您需要一个真正的使用多路复用系统调用的单循环,如(您不应该嵌套两个循环)

我建议使用一个真正的工具包(比如or),它将为您提供一个复杂的事件循环(以及它在Qt和Gtk中的版本;这两个工具包都为它们的事件循环提供了许多低级接口)

如果您想继续使用原始Xlib调用(这很痛苦),请轮询两个显示文件描述符(通过获取),然后使用(在可读文件描述符上)


有关使用
轮询的事件循环的示例,请参见(并根据您的需要进行调整)。

谢谢您的帮助!我将开始学习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

通用工具包是否支持使用多个显示器?使用GTK,您可能需要使用较低级别的GdkDisplay&GdkVisual&GdkWindow。一种可能是使用单独的线程,每个线程处理一个显示器连接。