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