Fix problem where you need mouse activity to unlock some 16 bits thread with multi-threaded apps.
diff --git a/windows/x11drv/event.c b/windows/x11drv/event.c index c12a205..a032932 100644 --- a/windows/x11drv/event.c +++ b/windows/x11drv/event.c
@@ -16,6 +16,7 @@ #include <assert.h> #include <string.h> +#include <unistd.h> #include "callback.h" #include "class.h" #include "clipboard.h" @@ -67,6 +68,7 @@ static fd_set __event_io_set[3]; static int __event_max_fd = 0; static int __event_x_connection = 0; +static int __wakeup_pipe[2]; static const char * const event_names[] = { @@ -119,6 +121,20 @@ __event_max_fd = __event_x_connection = ConnectionNumber(display); FD_SET( __event_x_connection, &__event_io_set[EVENT_IO_READ] ); + + /* this pipe is used to be able to wake-up the scheduler(WaitNetEvent) by + a 32 bit thread, this will become obsolete when the input thread will be + implemented */ + pipe(__wakeup_pipe); + + /* make the pipe non-blocking */ + fcntl(__wakeup_pipe[0], F_SETFL, O_NONBLOCK); + fcntl(__wakeup_pipe[1], F_SETFL, O_NONBLOCK); + + FD_SET( __wakeup_pipe[0], &__event_io_set[EVENT_IO_READ] ); + if (__wakeup_pipe[0] > __event_max_fd) + __event_max_fd = __wakeup_pipe[0]; + __event_max_fd++; return TRUE; } @@ -155,6 +171,26 @@ return FALSE; } + +/*********************************************************************** + * EVENT_ReadWakeUpPipe + * + * Empty the wake up pipe + */ +void EVENT_ReadWakeUpPipe(void) +{ + char tmpBuf[10]; + ssize_t ret; + + EnterCriticalSection(&X11DRV_CritSection); + + /* Flush the wake-up pipe, it's just dummy data for waking-up this + thread. This will be obsolete when the input thread will be done */ + while ( (ret = read(__wakeup_pipe[0], &tmpBuf, 10)) == 10 ); + + LeaveCriticalSection(&X11DRV_CritSection); +} + /*********************************************************************** * X11DRV_EVENT_WaitNetEvent * @@ -209,6 +245,7 @@ num_pending = select( __event_max_fd, &io_set[EVENT_IO_READ], &io_set[EVENT_IO_WRITE], &io_set[EVENT_IO_EXCEPT], &timeout ); + if ( num_pending == 0) { /* Timeout or error */ @@ -217,6 +254,14 @@ } #endif /* CONFIG_IPC */ + /* Flush the wake-up pipe, it's just dummy data for waking-up this + thread. This will be obsolete when the input thread will be done */ + if ( FD_ISSET( __wakeup_pipe[0], &io_set[EVENT_IO_READ] ) ) + { + num_pending--; + EVENT_ReadWakeUpPipe(); + } + /* Winsock asynchronous services */ if( FD_ISSET( __event_x_connection, &io_set[EVENT_IO_READ]) ) @@ -234,10 +279,24 @@ else if(!pending) { /* Wait for X11 input. */ fd_set set; + int max_fd; FD_ZERO(&set); FD_SET(__event_x_connection, &set); - select(__event_x_connection + 1, &set, 0, 0, 0 ); + + /* wait on wake-up pipe also */ + FD_SET(__wakeup_pipe[0], &set); + if (__event_x_connection > __wakeup_pipe[0]) + max_fd = __event_x_connection + 1; + else + max_fd = __wakeup_pipe[0] + 1; + + select(max_fd, &set, 0, 0, 0 ); + + /* Flush the wake-up pipe, it's just dummy data for waking-up this + thread. This will be obsolete when the input thread will be done */ + if ( FD_ISSET( __wakeup_pipe[0], &set ) ) + EVENT_ReadWakeUpPipe(); } /* Process current X event (and possibly others that occurred in the meantime) */ @@ -1057,7 +1116,8 @@ if( !lpDragInfo || !spDragInfo ) return; TSXQueryPointer( display, X11DRV_WND_GetXWindow(pWnd), &w_aux_root, &w_aux_child, - &x, &y, &u.pt_aux.x, &u.pt_aux.y, (unsigned int*)&aux_long); + &x, &y, (int *) &u.pt_aux.x, (int *) &u.pt_aux.y, + (unsigned int*)&aux_long); lpDragInfo->hScope = pWnd->hwndSelf; lpDragInfo->pt.x = (INT16)x; lpDragInfo->pt.y = (INT16)y; @@ -1079,7 +1139,7 @@ { TSXGetWindowProperty( display, DefaultRootWindow(display), dndSelection, 0, 65535, FALSE, - AnyPropertyType, &u.atom_aux, &u.pt_aux.y, + AnyPropertyType, &u.atom_aux, (int *) &u.pt_aux.y, &data_length, &aux_long, &p_data); if( !aux_long && p_data) /* don't bother if > 64K */ @@ -1364,4 +1424,16 @@ return TSXPending(display); } +/********************************************************************** + * X11DRV_EVENT_WakeUp + */ +void X11DRV_EVENT_WakeUp(void) +{ + /* wake-up EVENT_WaitNetEvent function, a 32 bit thread post an event + for a 16 bit task */ + if (write (__wakeup_pipe[1], "A", 1) != 1) + ERR(event, "unable to write in wakeup_pipe\n"); +} + + #endif /* !defined(X_DISPLAY_MISSING) */
diff --git a/windows/x11drv/init.c b/windows/x11drv/init.c index 31358d7..e7ac2db 100644 --- a/windows/x11drv/init.c +++ b/windows/x11drv/init.c
@@ -42,7 +42,8 @@ X11DRV_EVENT_QueryPointer, X11DRV_EVENT_DummyMotionNotify, X11DRV_EVENT_Pending, - X11DRV_EVENT_IsUserIdle + X11DRV_EVENT_IsUserIdle, + X11DRV_EVENT_WakeUp }; KEYBOARD_DRIVER X11DRV_KEYBOARD_Driver =