| 125 | } |
| 126 | |
| 127 | VOID XPointer::UpdatePointer(bool daylight) |
| 128 | { |
| 129 | UINT64 Now; |
| 130 | EFI_STATUS Status; |
| 131 | EFI_SIMPLE_POINTER_STATE tmpState; |
| 132 | EFI_SIMPLE_POINTER_MODE *CurrentMode; |
| 133 | INTN ScreenRelX; |
| 134 | INTN ScreenRelY; |
| 135 | |
| 136 | night = !daylight; |
| 137 | |
| 138 | // Now = gRT->GetTime(&Now, NULL); |
| 139 | Now = AsmReadTsc(); |
| 140 | Status = SimplePointerProtocol->GetState(SimplePointerProtocol, &tmpState); |
| 141 | if (!EFI_ERROR(Status)) { |
| 142 | if (!State.LeftButton && tmpState.LeftButton) // press left |
| 143 | MouseEvent = LeftMouseDown; |
| 144 | else if (!State.RightButton && tmpState.RightButton) // press right |
| 145 | MouseEvent = RightMouseDown; |
| 146 | else if (State.LeftButton && !tmpState.LeftButton) { //release left |
| 147 | // time for double click 500ms into menu |
| 148 | if (TimeDiff(LastClickTime, Now) < gSettings.DoubleClickTime) |
| 149 | MouseEvent = DoubleClick; |
| 150 | else |
| 151 | MouseEvent = LeftClick; |
| 152 | LastClickTime = Now; |
| 153 | } |
| 154 | else if (State.RightButton && !tmpState.RightButton) //release right |
| 155 | MouseEvent = RightClick; |
| 156 | else if (State.RelativeMovementZ > 0) |
| 157 | MouseEvent = ScrollDown; |
| 158 | else if (State.RelativeMovementZ < 0) |
| 159 | MouseEvent = ScrollUp; |
| 160 | else if (State.RelativeMovementX || State.RelativeMovementY) |
| 161 | MouseEvent = MouseMove; |
| 162 | else |
| 163 | MouseEvent = NoEvents; |
| 164 | |
| 165 | CopyMem(&State, &tmpState, sizeof(State)); |
| 166 | CurrentMode = SimplePointerProtocol->Mode; |
| 167 | |
| 168 | ScreenRelX = (UGAWidth * State.RelativeMovementX * gSettings.PointerSpeed / (INTN)CurrentMode->ResolutionX) >> 10; |
| 169 | if (gSettings.PointerMirror) { |
| 170 | newPlace.XPos -= ScreenRelX; |
| 171 | } |
| 172 | else { |
| 173 | newPlace.XPos += ScreenRelX; |
| 174 | } |
| 175 | if (newPlace.XPos < 0) newPlace.XPos = 0; |
| 176 | if (newPlace.XPos > UGAWidth - 1) newPlace.XPos = UGAWidth - 1; |
| 177 | |
| 178 | // YPosPrev = newPlace.YPos; |
| 179 | ScreenRelY = (UGAHeight * State.RelativeMovementY * gSettings.PointerSpeed / (INTN)CurrentMode->ResolutionY) >> 10; |
| 180 | newPlace.YPos += ScreenRelY; |
| 181 | if (newPlace.YPos < 0) newPlace.YPos = 0; |
| 182 | if (newPlace.YPos > UGAHeight - 1) newPlace.YPos = UGAHeight - 1; |
| 183 | |
| 184 | if ( oldPlace != newPlace ) { |
no test coverage detected