/* * X events handling functions * * Copyright 1993 Alexandre Julliard * */ #include #include "message.h" #include "winsock.h" #include "debugtools.h" DECLARE_DEBUG_CHANNEL(event) /**********************************************************************/ EVENT_DRIVER *EVENT_Driver = NULL; /* EVENT_WaitNetEvent() master fd sets */ static fd_set __event_io_set[3]; static int __event_max_fd = 0; static int __wakeup_pipe[2]; /*********************************************************************** * EVENT_Init * * Initialize network IO. */ BOOL EVENT_Init(void) { int i; for( i = 0; i < 3; i++ ) FD_ZERO( __event_io_set + i ); /* 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] ); __event_max_fd = __wakeup_pipe[0]; __event_max_fd++; return EVENT_Driver->pInit(); } /*********************************************************************** * EVENT_AddIO */ void EVENT_AddIO(int fd, unsigned io_type) { FD_SET( fd, &__event_io_set[io_type] ); if( __event_max_fd <= fd ) __event_max_fd = fd + 1; } /*********************************************************************** * EVENT_DeleteIO */ void EVENT_DeleteIO(int fd, unsigned io_type) { FD_CLR( fd, &__event_io_set[io_type] ); } /*********************************************************************** * EVENT_WakeUp * * Wake up the scheduler (EVENT_WaitNetEvent). Use by 32 bit thread * when thew want signaled an event to a 16 bit task. This function * will become obsolete when an Asynchronous thread will be implemented */ void EVENT_WakeUp(void) { if (write (__wakeup_pipe[1], "A", 1) != 1) ERR_(event)("unable to write in wakeup_pipe\n"); } /*********************************************************************** * EVENT_ReadWakeUpPipe * * Empty the wake up pipe */ void EVENT_ReadWakeUpPipe(void) { char tmpBuf[10]; ssize_t ret; /* 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 ); } /*********************************************************************** * EVENT_WaitNetEvent * * Sleep until a network event arrives, or until woken. */ void EVENT_WaitNetEvent( void ) { int num_pending; fd_set io_set[3]; memcpy( io_set, __event_io_set, sizeof(io_set) ); num_pending = select( __event_max_fd, &io_set[EVENT_IO_READ], &io_set[EVENT_IO_WRITE], &io_set[EVENT_IO_EXCEPT], NULL ); if ( num_pending == -1 ) { /* Error - signal, invalid arguments, out of memory */ return; } /* 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 */ WINSOCK_HandleIO( &__event_max_fd, num_pending, io_set, __event_io_set ); } /*********************************************************************** * EVENT_Synchronize * * Synchronize with the X server. Should not be used too often. */ void EVENT_Synchronize( BOOL bProcessEvents ) { EVENT_Driver->pSynchronize( bProcessEvents ); } /********************************************************************** * EVENT_CheckFocus */ BOOL EVENT_CheckFocus(void) { return EVENT_Driver->pCheckFocus(); } /*********************************************************************** * EVENT_QueryPointer */ BOOL EVENT_QueryPointer(DWORD *posX, DWORD *posY, DWORD *state) { return EVENT_Driver->pQueryPointer(posX, posY, state); } /*********************************************************************** * EVENT_DummyMotionNotify * * Generate a dummy MotionNotify event. Used to force a WM_SETCURSOR message. */ void EVENT_DummyMotionNotify(void) { EVENT_Driver->pDummyMotionNotify(); }