From cf749f2dd03a7e04395d9b6862cc11a22c76fb9d Mon Sep 17 00:00:00 2001 From: lalalademaxiya1 <66767061+lalalademaxiya1@users.noreply.github.com> Date: Thu, 13 Oct 2022 02:33:44 +0800 Subject: Keychron q3 (#16912) Co-authored-by: Joel Challis Co-authored-by: Drashna Jaelre Co-authored-by: Ryan Co-authored-by: Nick Brassel Co-authored-by: Cesar Rojas Co-authored-by: lokher Co-authored-by: Adam Karim Co-authored-by: bootstrapper Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- keyboards/keychron/common/keychron_common.c | 97 +++++++++++++++++++++++++++++ keyboards/keychron/common/keychron_common.h | 47 ++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 keyboards/keychron/common/keychron_common.c create mode 100644 keyboards/keychron/common/keychron_common.h (limited to 'keyboards/keychron/common') diff --git a/keyboards/keychron/common/keychron_common.c b/keyboards/keychron/common/keychron_common.c new file mode 100644 index 0000000000..d3c1294fe9 --- /dev/null +++ b/keyboards/keychron/common/keychron_common.c @@ -0,0 +1,97 @@ +/* Copyright 2022 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H +#include "keychron_common.h" + +bool is_siri_active = false; +uint32_t siri_timer = 0; + +key_combination_t key_comb_list[4] = { + {2, {KC_LWIN, KC_TAB}}, + {2, {KC_LWIN, KC_E}}, + {3, {KC_LSFT, KC_LCMD, KC_4}}, + {2, {KC_LWIN, KC_C}} +}; + +static uint8_t mac_keycode[4] = { KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD }; + +void housekeeping_task_keychron(void) { + if (is_siri_active) { + if (sync_timer_elapsed32(siri_timer) >= 500) { + unregister_code(KC_LCMD); + unregister_code(KC_SPACE); + is_siri_active = false; + } + } +} + +bool process_record_keychron(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LOPTN: + case KC_ROPTN: + case KC_LCMMD: + case KC_RCMMD: + if (record->event.pressed) { + register_code(mac_keycode[keycode - KC_LOPTN]); + } else { + unregister_code(mac_keycode[keycode - KC_LOPTN]); + } + return false; // Skip all further processing of this key + case KC_SIRI: + if (record->event.pressed) { + if (!is_siri_active) { + is_siri_active = true; + register_code(KC_LCMD); + register_code(KC_SPACE); + } + siri_timer = sync_timer_read32(); + } else { + // Do something else when release + } + return false; // Skip all further processing of this key + case KC_TASK: + case KC_FLXP: + case KC_SNAP: + case KC_CRTA: + if (record->event.pressed) { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + register_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } else { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/common/keychron_common.h b/keyboards/keychron/common/keychron_common.h new file mode 100644 index 0000000000..0bcbf951db --- /dev/null +++ b/keyboards/keychron/common/keychron_common.h @@ -0,0 +1,47 @@ +/* Copyright 2022 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "stdint.h" +#include "quantum_keycodes.h" + +enum custom_keycodes { + KC_MISSION_CONTROL = SAFE_RANGE, + KC_LAUNCHPAD, + KC_LOPTN, + KC_ROPTN, + KC_LCMMD, + KC_RCMMD, + KC_SIRI, + KC_TASK_VIEW, + KC_FILE_EXPLORER, + KC_SCREEN_SHOT, + KC_CORTANA +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK KC_TASK_VIEW +#define KC_FLXP KC_FILE_EXPLORER +#define KC_SNAP KC_SCREEN_SHOT +#define KC_CRTA KC_CORTANA + +typedef struct PACKED { + uint8_t len; + uint8_t keycode[3]; +} key_combination_t; + +void housekeeping_task_keychron(void); +bool process_record_keychron(uint16_t keycode, keyrecord_t *record); -- cgit v1.2.3