| 160 | }; |
| 161 | |
| 162 | static void keytoscancode(int key, bool release) |
| 163 | { |
| 164 | int v = 0x40; |
| 165 | int q = 0x00; |
| 166 | int mask = release ? 0x80 : 0x00; |
| 167 | for (int i = 0; kbtable[i].ascii; i++) { |
| 168 | if (kbtable[i].ascii == key) { |
| 169 | v = kbtable[i].code; |
| 170 | q = kbtable[i].qual; |
| 171 | break; |
| 172 | } |
| 173 | } |
| 174 | v |= mask; |
| 175 | v = (v << 1) | (v >> 7); |
| 176 | q |= mask; |
| 177 | if (release) { |
| 178 | record_key(v, false); |
| 179 | if (q & 0x7f) { |
| 180 | q = (q << 1) | (q >> 7); |
| 181 | record_key(q, false); |
| 182 | } |
| 183 | } else { |
| 184 | if (q & 0x7f) { |
| 185 | q = (q << 1) | (q >> 7); |
| 186 | record_key(q, false); |
| 187 | } |
| 188 | record_key(v, false); |
| 189 | } |
| 190 | } |
| 191 | |
| 192 | // delay injection, some programs don't like too fast key events |
| 193 | static bool can_inject(void) |
no test coverage detected