/*********************************************************************** * MsgWaitForMultipleObjectsEx (MACDRV.@) */ DWORD CDECL macdrv_MsgWaitForMultipleObjectsEx(DWORD count, const HANDLE *handles, DWORD timeout, DWORD mask, DWORD flags) { DWORD ret; struct macdrv_thread_data *data = macdrv_thread_data(); macdrv_event_mask event_mask = get_event_mask(mask); TRACE("count %d, handles %p, timeout %u, mask %x, flags %x\n", count, handles, timeout, mask, flags); if (!data) { if (!count && !timeout) return WAIT_TIMEOUT; return WaitForMultipleObjectsEx(count, handles, flags & MWMO_WAITALL, timeout, flags & MWMO_ALERTABLE); } if (data->current_event && data->current_event->type != QUERY_EVENT && data->current_event->type != QUERY_EVENT_NO_PREEMPT_WAIT && data->current_event->type != APP_QUIT_REQUESTED && data->current_event->type != WINDOW_DRAG_BEGIN) event_mask = 0; /* don't process nested events */ if (process_events(data->queue, event_mask)) ret = count - 1; else if (count || timeout) { ret = WaitForMultipleObjectsEx(count, handles, flags & MWMO_WAITALL, timeout, flags & MWMO_ALERTABLE); if (ret == count - 1) process_events(data->queue, event_mask); } else ret = WAIT_TIMEOUT; return ret; }
void default_pointer_handler(XEvent *ev) { XEvent tmp; Window win_pressed; WThing *t; bool mouse_grab_held=FALSE; if(grab_held()) return; win_pressed=ev->xbutton.window; if(!handle_button_press(&ev->xbutton)) return; mouse_grab_held=TRUE; while(mouse_grab_held){ XFlush(wglobal.dpy); get_event_mask(ev, GRAB_EV_MASK); switch(ev->type){ CASE_EVENT(ButtonRelease) if(handle_button_release(&(ev->xbutton))){ ungrab_kb_ptr(); mouse_grab_held=FALSE; } break; CASE_EVENT(MotionNotify) handle_pointer_motion(&(ev->xmotion)); break; CASE_EVENT(Expose) handle_expose(&(ev->xexpose)); break; } } }