Fixes Excel scroll-of-death problem: earlier select-loop failed to call xwin_process_events
when the queue was non-zero but the X11 socket was empty. git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@118 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
parent
7e7527302c
commit
65ec7634d9
29
xwin.c
29
xwin.c
@ -517,6 +517,7 @@ toggle_fullscreen()
|
||||
XFreePixmap(display, pixmap);
|
||||
}
|
||||
|
||||
/* Process all events in Xlib queue */
|
||||
static void
|
||||
xwin_process_events()
|
||||
{
|
||||
@ -530,15 +531,6 @@ xwin_process_events()
|
||||
char str[256];
|
||||
Status status;
|
||||
|
||||
/* Refresh keyboard mapping if it has changed. This is important for
|
||||
Xvnc, since it allocates keycodes dynamically */
|
||||
if (XCheckTypedEvent(display, MappingNotify, &xevent))
|
||||
{
|
||||
if (xevent.xmapping.request == MappingKeyboard
|
||||
|| xevent.xmapping.request == MappingModifier)
|
||||
XRefreshKeyboardMapping(&xevent.xmapping);
|
||||
}
|
||||
|
||||
while (XCheckMaskEvent(display, ~0, &xevent))
|
||||
{
|
||||
if (enable_compose && (XFilterEvent(&xevent, None) == True))
|
||||
@ -651,6 +643,15 @@ xwin_process_events()
|
||||
xevent.xexpose.height,
|
||||
xevent.xexpose.x, xevent.xexpose.y);
|
||||
break;
|
||||
|
||||
case MappingNotify:
|
||||
/* Refresh keyboard mapping if it has changed. This is important for
|
||||
Xvnc, since it allocates keycodes dynamically */
|
||||
if (xevent.xmapping.request == MappingKeyboard
|
||||
|| xevent.xmapping.request == MappingModifier)
|
||||
XRefreshKeyboardMapping(&xevent.xmapping);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -660,11 +661,15 @@ ui_select(int rdp_socket)
|
||||
{
|
||||
int n = (rdp_socket > x_socket) ? rdp_socket + 1 : x_socket + 1;
|
||||
fd_set rfds;
|
||||
XEvent xevent;
|
||||
|
||||
FD_ZERO(&rfds);
|
||||
|
||||
while (True)
|
||||
{
|
||||
/* Process any events already in queue */
|
||||
xwin_process_events();
|
||||
|
||||
FD_ZERO(&rfds);
|
||||
FD_SET(rdp_socket, &rfds);
|
||||
if (display != NULL)
|
||||
@ -683,7 +688,11 @@ ui_select(int rdp_socket)
|
||||
}
|
||||
|
||||
if (FD_ISSET(x_socket, &rfds))
|
||||
xwin_process_events();
|
||||
{
|
||||
/* Move new events from socket to queue */
|
||||
XPeekEvent(display, &xevent);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (FD_ISSET(rdp_socket, &rfds))
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user