diff --git a/src/daemon/keymap_patch.c b/src/daemon/keymap_patch.c index 1051dae5..b6e6a21c 100644 --- a/src/daemon/keymap_patch.c +++ b/src/daemon/keymap_patch.c @@ -90,6 +90,11 @@ keypatch k70tklpatch[] = { { 1, "logo", 1, KEY_NONE }, }; +keypatch k70propatch[] = { + { 114, "lock", 114, KEY_CORSAIR }, + { 138, "logo", 138, KEY_NONE }, +}; + #define ADD_PATCH(vendor, product, patch) \ { (vendor), (product), (patch), sizeof(patch)/sizeof(*patch) } @@ -113,6 +118,7 @@ static const keypatches mappatches[] = { ADD_PATCH(V_CORSAIR, P_K100_MECHANICAL, k100patch), ADD_PATCH(V_CORSAIR, P_K100_OPTICAL_VARIANT, k100patch), ADD_PATCH(V_CORSAIR, P_K70_TKL, k70tklpatch), + ADD_PATCH(V_CORSAIR, P_K70_PRO, k70propatch) }; #define KEYPATCHES_LEN sizeof(mappatches)/sizeof(*mappatches) diff --git a/src/daemon/led_bragi.c b/src/daemon/led_bragi.c index a6ca5756..9afd3d2c 100644 --- a/src/daemon/led_bragi.c +++ b/src/daemon/led_bragi.c @@ -47,6 +47,7 @@ static inline size_t bragi_led_count(usbdevice* kb){ LED_CASE_K(P_K65_MINI, 123); LED_CASE_K(P_K70_TKL, 193); LED_CASE_K(P_MM700, 3); + LED_CASE_K(P_K70_PRO, 193); default: ckb_err("Unknown product 0x%hx", kb->product); return 0; diff --git a/src/daemon/usb.c b/src/daemon/usb.c index 21e57d9b..192e4ce5 100644 --- a/src/daemon/usb.c +++ b/src/daemon/usb.c @@ -75,6 +75,7 @@ const device_desc models[] = { { V_CORSAIR, P_K70_MK2SE, }, { V_CORSAIR, P_K70_MK2LP, }, { V_CORSAIR, P_K70_TKL, }, + { V_CORSAIR, P_K70_PRO, }, { V_CORSAIR, P_K90_LEGACY, }, { V_CORSAIR, P_K95, }, { V_CORSAIR, P_K95_LEGACY, }, @@ -206,6 +207,8 @@ const char* product_str(ushort product){ return "k70mk2"; if(product == P_K70_TKL) return "k70tkl"; + if(product == P_K70_PRO) + return "k70pro"; if(product == P_K68 || product == P_K68_NRGB) return "k68"; if(product == P_K65 || product == P_K65_LEGACY || product == P_K65_LUX || product == P_K65_RFIRE) diff --git a/src/daemon/usb.h b/src/daemon/usb.h index 824ddc11..b11b1ad7 100644 --- a/src/daemon/usb.h +++ b/src/daemon/usb.h @@ -90,7 +90,8 @@ #define P_K70_MK2SE 0x1b6b #define P_K70_MK2LP 0x1b55 #define P_K70_TKL 0x1b73 -#define IS_K70(kb) ((kb)->vendor == V_CORSAIR && ((kb)->product == P_K70 || (kb)->product == P_K70_LEGACY || (kb)->product == P_K70_RFIRE || (kb)->product == P_K70_RFIRE_NRGB || (kb)->product == P_K70_LUX || (kb)->product == P_K70_LUX_NRGB || (kb)->product == P_K70_MK2 || (kb)->product == P_K70_MK2SE || (kb)->product == P_K70_MK2LP || (kb)->product == P_K70_TKL)) +#define P_K70_PRO 0x1bb3 +#define IS_K70(kb) ((kb)->vendor == V_CORSAIR && ((kb)->product == P_K70 || (kb)->product == P_K70_LEGACY || (kb)->product == P_K70_RFIRE || (kb)->product == P_K70_RFIRE_NRGB || (kb)->product == P_K70_LUX || (kb)->product == P_K70_LUX_NRGB || (kb)->product == P_K70_MK2 || (kb)->product == P_K70_MK2SE || (kb)->product == P_K70_MK2LP || (kb)->product == P_K70_TKL || (kb)->product == P_K70_PRO)) // The Legacy K90 behaves like a Legacy K95. #define P_K90_LEGACY 0x1b02 @@ -298,10 +299,10 @@ const char* product_str(ushort product); clock_nanosleep(CLOCK_MONOTONIC, 0, &(struct timespec) {.tv_nsec = 30000000}, NULL) // This should be removed in the future when we implement autodetection -#define USES_BRAGI(vendor, product) ((vendor) == (V_CORSAIR) && ((product) == (P_M55_RGB_PRO) || (product) == (P_IRONCLAW_W_U) || (product) == (P_IRONCLAW_W_D) || (product) == (P_K95_PLATINUM_XT) || (product) == (P_DARK_CORE_RGB_PRO_SE) || (product) == (P_DARK_CORE_RGB_PRO_SE_WL) || (product) == P_HARPOON_WL_U || (product) == P_HARPOON_WL_D || (product) == P_K57_U || (product) == P_K57_D || (product) == P_KATAR_PRO_XT || (product) == P_KATAR_PRO || (product) == P_K60_PRO_RGB || (product) == P_K60_PRO_RGB_LP || (product) == P_K60_PRO_RGB_SE || (product) == P_K60_PRO_MONO || (product) == P_K60_PRO_TKL || (product) == P_K55_PRO || (product) == P_K55_PRO_XT || (product) == (P_DARK_CORE_RGB_PRO) || (product) == (P_DARK_CORE_RGB_PRO_WL) || (product) == P_GENERIC_BRAGI_DONGLE || (product) == P_K100_OPTICAL || (product) == P_K100_MECHANICAL || (product) == P_K100_OPTICAL_VARIANT || (product) == P_K65_MINI || (product) == P_K70_TKL || (product) == P_MM700)) +#define USES_BRAGI(vendor, product) ((vendor) == (V_CORSAIR) && ((product) == (P_M55_RGB_PRO) || (product) == (P_IRONCLAW_W_U) || (product) == (P_IRONCLAW_W_D) || (product) == (P_K95_PLATINUM_XT) || (product) == (P_DARK_CORE_RGB_PRO_SE) || (product) == (P_DARK_CORE_RGB_PRO_SE_WL) || (product) == P_HARPOON_WL_U || (product) == P_HARPOON_WL_D || (product) == P_K57_U || (product) == P_K57_D || (product) == P_KATAR_PRO_XT || (product) == P_KATAR_PRO || (product) == P_K60_PRO_RGB || (product) == P_K60_PRO_RGB_LP || (product) == P_K60_PRO_RGB_SE || (product) == P_K60_PRO_MONO || (product) == P_K60_PRO_TKL || (product) == P_K55_PRO || (product) == P_K55_PRO_XT || (product) == (P_DARK_CORE_RGB_PRO) || (product) == (P_DARK_CORE_RGB_PRO_WL) || (product) == P_GENERIC_BRAGI_DONGLE || (product) == P_K100_OPTICAL || (product) == P_K100_MECHANICAL || (product) == P_K100_OPTICAL_VARIANT || (product) == P_K65_MINI || (product) == P_K70_TKL || (product) == P_MM700 || (product) == P_K70_PRO)) // Devices that use bragi jumbo packets (1024 bytes) -#define USES_BRAGI_JUMBO(vendor, product) ((vendor) == (V_CORSAIR) && ((product) == P_K100_OPTICAL || (product) == P_K100_MECHANICAL || (product) == P_K100_OPTICAL_VARIANT || (product) == P_K65_MINI || (product) == P_K70_TKL)) +#define USES_BRAGI_JUMBO(vendor, product) ((vendor) == (V_CORSAIR) && ((product) == P_K100_OPTICAL || (product) == P_K100_MECHANICAL || (product) == P_K100_OPTICAL_VARIANT || (product) == P_K65_MINI || (product) == P_K70_TKL || (product) == P_K70_PRO)) // Used for devices that have the scroll wheel packet in the hardware hid packet only #define SW_PKT_HAS_NO_WHEEL(kb) ((kb)->vendor == V_CORSAIR && ((kb)->product == P_M55_RGB_PRO || (kb)->product == P_KATAR_PRO_XT || (kb)->product == P_KATAR_PRO)) diff --git a/src/daemon/usb_bragi.c b/src/daemon/usb_bragi.c index 03a292d4..6db6e5ea 100644 --- a/src/daemon/usb_bragi.c +++ b/src/daemon/usb_bragi.c @@ -36,6 +36,7 @@ void bragi_fill_input_eps(usbdevice* kb) case P_K100_MECHANICAL: case P_K65_MINI: case P_K70_TKL: + case P_K70_PRO: kb->bragi_out_ep = 0x1; kb->bragi_in_ep = 0x82; break; diff --git a/src/gui/keymap.cpp b/src/gui/keymap.cpp index eac0a3ed..f37ff8dd 100644 --- a/src/gui/keymap.cpp +++ b/src/gui/keymap.cpp @@ -882,6 +882,30 @@ static QHash getMap(KeyMap::Model model, KeyMap::Layout layout){ map["voldn"].x -= 10; break; } + case KeyMap::K70_PRO:{ + // Same as K70 MK2 but right Windows key is a function key + map = getMap(KeyMap::K70MK2, layout); + + map["fn"] = KStrafeKeys[3]; + map["fn"].x = map["rwin"].x; + map.remove("rwin"); + + // these keys are all the way to left + map["profswitch"].x = 0; + map["light"].x = 9; + map["lock"].x = 18; + + // these keys are all the way to the right + map["mute"].x += 10; + map["volup"].x += 10; + map["voldn"].x += 10; + + map["logo"] = {nullptr, "Logo", "logo", 128, 0, NS, true, false}; + map.remove("m3"); + map.remove("g11"); + + break; + } case KeyMap::K70_TKL:{ // Same width as the K63 but with a top row more like the K70 map = getMap(KeyMap::K63, layout); @@ -1669,6 +1693,8 @@ KeyMap::Model KeyMap::getModel(const QString& name){ return K100; if(lower == "k65_mini") return K65_MINI; + if(lower == "k70pro") + return K70_PRO; return NO_MODEL; } @@ -1754,6 +1780,8 @@ QString KeyMap::getModel(KeyMap::Model model){ return "k100"; case K65_MINI: return "k65_mini"; + case K70_PRO: + return "k70pro"; default: return ""; } @@ -1785,6 +1813,7 @@ int KeyMap::modelWidth(Model model){ return K68_WIDTH; case K70: case K70MK2: + case K70_PRO: return K70_WIDTH; case K95: case K95L: @@ -1840,6 +1869,7 @@ int KeyMap::modelHeight(Model model){ case K68: case K70: case K70MK2: + case K70_PRO: case K70_TKL: case K95: case K95L: diff --git a/src/gui/keymap.h b/src/gui/keymap.h index 9f79127b..ab504e03 100644 --- a/src/gui/keymap.h +++ b/src/gui/keymap.h @@ -92,6 +92,7 @@ public: K65_MINI, K70_TKL, MM700, + K70_PRO, _MODEL_MAX }; // Key layouts (ordered alphabetically by name) diff --git a/src/gui/keywidget.cpp b/src/gui/keywidget.cpp index 635f2617..85a95a7a 100644 --- a/src/gui/keywidget.cpp +++ b/src/gui/keywidget.cpp @@ -384,7 +384,7 @@ void KeyWidget::paintGL(){ painter.setOpacity(0.7); } } - if(((model != KeyMap::STRAFE && model != KeyMap::K95P && model != KeyMap::K100 && model != KeyMap::K70MK2 && model != KeyMap::STRAFE_MK2 && model != KeyMap::K70_TKL) && (!strcmp(key.name, "mr") || !strcmp(key.name, "m1") || !strcmp(key.name, "m2") || !strcmp(key.name, "m3") + if(((model != KeyMap::STRAFE && model != KeyMap::K95P && model != KeyMap::K100 && model != KeyMap::K70MK2 && model != KeyMap::STRAFE_MK2 && model != KeyMap::K70_TKL && model != KeyMap::K70_PRO) && (!strcmp(key.name, "mr") || !strcmp(key.name, "m1") || !strcmp(key.name, "m2") || !strcmp(key.name, "m3") || !strcmp(key.name, "light") || !strcmp(key.name, "lock") || !strcmp(key.name, "lghtpgm") || (model == KeyMap::K65 && !strcmp(key.name, "mute")))) || !strcmp(key.name, "ctrlwheelb")){ // Not all devices have circular buttons @@ -439,7 +439,7 @@ void KeyWidget::paintGL(){ drawTopLeftCorner(&painter, x, y, w, h, drawInfoScale); } else painter.drawRect(QRectF(x * drawInfoScale, y * drawInfoScale, w * drawInfoScale, h * drawInfoScale)); - } else if ((model == KeyMap::K70MK2 || model == KeyMap::STRAFE_MK2 || model == KeyMap::K70_TKL) && key.friendlyName().startsWith("Logo")) { + } else if ((model == KeyMap::K70MK2 || model == KeyMap::STRAFE_MK2 || model == KeyMap::K70_TKL || model == KeyMap::K70_PRO) && key.friendlyName().startsWith("Logo")) { w += 10.f; x -= 5.f; painter.drawRect(QRectF(x * drawInfoScale, y * drawInfoScale, w * drawInfoScale, h * drawInfoScale));