static int windows_wminput_poll(ManyMouseEvent *ev) { MSG Msg; /* run the queue for WM_INPUT messages, etc ... */ int found = 0; /* ...favor existing events in the queue... */ pEnterCriticalSection(&mutex); if (input_events_read != input_events_write) /* no events if equal. */ { CopyMemory(ev, &input_events[input_events_read], sizeof (*ev)); input_events_read = ((input_events_read + 1) % MAX_EVENTS); found = 1; } /* if */ pLeaveCriticalSection(&mutex); if (!found) { /* pump Windows for new hardware events... */ while (pPeekMessageA(&Msg, raw_hwnd, 0, 0, PM_REMOVE)) { pTranslateMessage(&Msg); pDispatchMessageA(&Msg); } /* while */ /* In case something new came in, give it to the app... */ pEnterCriticalSection(&mutex); if (input_events_read != input_events_write) /* no events if equal. */ { CopyMemory(ev, &input_events[input_events_read], sizeof (*ev)); input_events_read = ((input_events_read + 1) % MAX_EVENTS); found = 1; } /* if */ pLeaveCriticalSection(&mutex); } /* if */ /* * Check for disconnects if queue is totally empty and Windows didn't * report anything new at this time. This ensures that we don't send a * disconnect event through ManyMouse and then later give a valid * event to the app for a device that is now missing. */ if (!found) found = check_for_disconnects(ev); return(found); } /* windows_wminput_poll */
// Получение копии настроек // Копия делает из-за возможной работы в мультипоточной среде. // Чтобы не делать защиту общих данных там, где их используют, // делаем защиту только при загрузке и получении копии. DebugReportSettings* DebugReportGetSettings() { DebugReportSettings* result = NULL; // При чтении защищаемся от изменения текущего DbgRptSettings pEnterCriticalSection(&DbgRptCs); if (DbgRptSettings == &DbgRptSettingDefault) { DebugReportLoadSettings(); } result = DebugReportAllocSettings(DbgRptSettings->Enabled, DbgRptSettings->StatPrefix, DbgRptSettings->StatUrl); pLeaveCriticalSection(&DbgRptCs); return result; }
// Загрузка настроек из реестра в структуру настроек. // Учитывается возможность работы в мультипоточной среде. void DebugReportLoadSettings() { string ParamList; bool ParamListLoaded = DebugReportLoadParamList(&ParamList); DBGRPTDBG("DebugReportLoadSettings", "DebugReportLoadParamList() result=%d (ParamList='%s').", ParamListLoaded, ParamList.t_str()); string PlugName = GetCommandParamByIndex(ParamList.t_str(), 0); string StatPrefix = GetCommandParamByIndex(ParamList.t_str(), 1); string StatUrl = GetCommandParamByIndex(ParamList.t_str(), 2); DBGRPTDBG("DebugReportLoadSettings", "Parsing arguments results: PlugName='%s' StatPrefix='%s' StatUrl='%s'", PlugName.t_str(), StatPrefix.t_str(), StatUrl.t_str() ); DebugReportSettings* NewSettings = CreateStruct(DebugReportSettings); DebugReportSettings* OldSettings = NULL; // Если хотя бы один пустой параметр - то это означает что они неверно заданы // и стука не включен. NewSettings->Enabled = (StatPrefix.Length() > 0) && (StatUrl.Length() > 0); // URL приходит без символа начала параметров // Поскольку раньше URL был с таки символом - просто добавляем его по умолчанию. StatUrl += "?"; NewSettings->StatPrefix = STR::New(StatPrefix.t_str()); NewSettings->StatUrl = STR::New(StatUrl.t_str()); // При замене необходимо защитить DbgRptSettings, потому что его могут читать где-то pEnterCriticalSection(&DbgRptCs); OldSettings = DbgRptSettings; DbgRptSettings = NewSettings; pLeaveCriticalSection(&DbgRptCs); DebugReportFreeSettings(OldSettings); }
void inline Request::Unlock(PRequestList List) { if (List != NULL) pLeaveCriticalSection(List->Lock); }
static void queue_from_rawinput(const RAWINPUT *raw) { int i; const RAWINPUTHEADER *header = &raw->header; const RAWMOUSE *mouse = &raw->data.mouse; ManyMouseEvent event; if (raw->header.dwType != RIM_TYPEMOUSE) return; for (i = 0; i < available_mice; i++) /* find the device for event. */ { if (mice[i].handle == header->hDevice) break; } /* for */ if (i == available_mice) return; /* not found?! */ /* * RAWINPUT packs a bunch of events into one, so we split it up into * a bunch of ManyMouseEvents here and store them in an internal queue. * Then ManyMouse_PollEvent() just shuffles items off that queue * without any complicated processing. */ event.device = i; pEnterCriticalSection(&mutex); if (mouse->usFlags & MOUSE_MOVE_ABSOLUTE) { /* !!! FIXME: How do we get the min and max values for absmotion? */ event.type = MANYMOUSE_EVENT_ABSMOTION; event.item = 0; event.value = mouse->lLastX; queue_event(&event); event.item = 1; event.value = mouse->lLastY; queue_event(&event); } /* if */ else /*if (mouse->usFlags & MOUSE_MOVE_RELATIVE)*/ { event.type = MANYMOUSE_EVENT_RELMOTION; if (mouse->lLastX != 0) { event.item = 0; event.value = mouse->lLastX; queue_event(&event); } /* if */ if (mouse->lLastY != 0) { event.item = 1; event.value = mouse->lLastY; queue_event(&event); } /* if */ } /* else if */ event.type = MANYMOUSE_EVENT_BUTTON; #define QUEUE_BUTTON(x) { \ if (mouse->usButtonFlags & RI_MOUSE_BUTTON_##x##_DOWN) { \ event.item = x-1; \ event.value = 1; \ queue_event(&event); \ } \ if (mouse->usButtonFlags & RI_MOUSE_BUTTON_##x##_UP) { \ event.item = x-1; \ event.value = 0; \ queue_event(&event); \ } \ } QUEUE_BUTTON(1); QUEUE_BUTTON(2); QUEUE_BUTTON(3); QUEUE_BUTTON(4); QUEUE_BUTTON(5); #undef QUEUE_BUTTON if (mouse->usButtonFlags & RI_MOUSE_WHEEL) { if (mouse->usButtonData != 0) /* !!! FIXME: can this ever be zero? */ { event.type = MANYMOUSE_EVENT_SCROLL; event.item = 0; /* !!! FIXME: horizontal wheel? */ event.value = ( ((SHORT) mouse->usButtonData) > 0) ? 1 : -1; queue_event(&event); } /* if */ } /* if */ pLeaveCriticalSection(&mutex); } /* queue_from_rawinput */