- if (has_ghost_in_row(r)) {
- /* Keep track of whether ghosted status has changed for
- * debugging. But don't update matrix_prev until un-ghosted, or
- * the last key would be lost.
- */
- if (debug_matrix && matrix_ghost[r] != matrix_row) {
- matrix_print();
- }
- matrix_ghost[r] = matrix_row;
- continue;
- }
- matrix_ghost[r] = matrix_row;
-#endif
- if (debug_matrix) matrix_print();
- for (uint8_t c = 0; c < MATRIX_COLS; c++) {
- if (matrix_change & ((matrix_row_t)1<<c)) {
- action_exec((keyevent_t){
- .key = (keypos_t){ .row = r, .col = c },
- .pressed = (matrix_row & ((matrix_row_t)1<<c)),
- .time = (timer_read() | 1) /* time should not be 0 */
- });
- // record a processed key
- matrix_prev[r] ^= ((matrix_row_t)1<<c);
- // process a key per task call
- goto MATRIX_LOOP_END;
+ if (has_ghost_in_row(r, matrix_row)) { continue; }
+#endif
+ if (debug_matrix) matrix_print();
+ for (uint8_t c = 0; c < MATRIX_COLS; c++) {
+ if (matrix_change & ((matrix_row_t)1<<c)) {
+ action_exec((keyevent_t){
+ .key = (keypos_t){ .row = r, .col = c },
+ .pressed = (matrix_row & ((matrix_row_t)1<<c)),
+ .time = (timer_read() | 1) /* time should not be 0 */
+ });
+ // record a processed key
+ matrix_prev[r] ^= ((matrix_row_t)1<<c);
+#ifdef QMK_KEYS_PER_SCAN
+ // only jump out if we have processed "enough" keys.
+ if (++keys_processed >= QMK_KEYS_PER_SCAN)
+#endif
+ // process a key per task call
+ goto MATRIX_LOOP_END;
+ }