daemon, gui: Consolidate keyname length in project

This commit fixes incorrect behavior of the 'w' key which was linked to
the "ctrlwheelcw" event, because the keyname was read in 10 character
chunks.

Create a consolidated macro, with a large enough limit to allow all
currently relevant keys. Replace all custom keyname lengths with this
macro. Ensure that relevant sscanf() calls use an appropriate string
version of this length (minus one for the trailing '\0').

CKB_KEYNAME_MAX in animation.h still needs to be kept in sync manually
due to it being a standalone header.
This commit is contained in:
Karl Fleischmann
2026-05-22 17:51:42 +03:00
committed by Tasos Sahanidis
parent b95f3b272d
commit 46f2f08e76
6 changed files with 23 additions and 13 deletions
+9
View File
@@ -18,3 +18,12 @@
#define CKB_NEXT_COPYRIGHT_YEAR "${ckb-next_COPYRIGHT_YEAR}"
#cmakedefine ckb_next_VERSION_IS_RELEASE
#define CKB_NEXT_DESCRIPTION "Open Source Driver for Corsair devices."
#include <assert.h>
// Number of characters allowed for key names.
#define N_KEYNAME_LENGTH 40
#define N_KEYNAME_STRLEN 39
#define N_KEYNAME_STR_REAL(x) #x
#define N_KEYNAME_STR(x) N_KEYNAME_STR_REAL(x)
#define N_SCANF_KEYNAME N_KEYNAME_STR(N_KEYNAME_STRLEN)
static_assert((N_KEYNAME_LENGTH == N_KEYNAME_STRLEN + 1), "N_KEYNAME_LENGTH must be 1 greater than N_KEYNAME_STRLEN");
+2 -2
View File
@@ -332,8 +332,8 @@ int readcmd(usbdevice* kb, char* line){
}
// Scan the left side for key names and run the requested command
int position = 0, field = 0;
char keyname[11] = { 0 };
while(position < left && sscanf(word + position, "%10[^:,]%n", keyname, &field) == 1){
char keyname[N_KEYNAME_LENGTH] = { 0 };
while(position < left && sscanf(word + position, "%"N_SCANF_KEYNAME"[^:,]%n", keyname, &field) == 1){
uint keycode;
if(!strcmp(keyname, "all")){
// Set all keys
+7 -6
View File
@@ -645,8 +645,8 @@ static void _cmd_macro(usbmode* mode, const char* keys, const char* assignment,
int empty = 1;
int left = strlen(keys), right = strlen(assignment);
int position = 0, field = 0;
char keyname[40];
while(position < left && sscanf(keys + position, "%10[^+]%n", keyname, &field) == 1){
char keyname[N_KEYNAME_LENGTH];
while(position < left && sscanf(keys + position, "%"N_SCANF_KEYNAME"[^+]%n", keyname, &field) == 1){
// Find this key in the keymap
for(unsigned i = 0; i < N_KEYS_INPUT; i++){
if(kb->keymap[i].name && !strcmp(keyname, kb->keymap[i].name)){
@@ -673,7 +673,7 @@ static void _cmd_macro(usbmode* mode, const char* keys, const char* assignment,
position = 0;
field = 0;
// max action = old 11 chars plus 12 chars which is the max 32-bit unsigned int 4294967295 size * 2 + 1 for range underscore
while(position < right && sscanf(assignment + position, "%36[^,]%n", keyname, &field) == 1){
while(position < right && sscanf(assignment + position, "%"N_SCANF_KEYNAME"[^,]%n", keyname, &field) == 1){
if(!strcmp(keyname, "clear"))
break;
@@ -682,12 +682,13 @@ static void _cmd_macro(usbmode* mode, const char* keys, const char* assignment,
int64_t long_delay_range = 0;
uint32_t delay = UINT32_MAX; // computed delay value. UINT32_MAX means use the default value.
uint32_t delay_range = 0;
char real_keyname[12]; // temp to hold the left side (key) of the <key>=<delay>
int scan_matches = sscanf(keyname, "%11[^=]=%"SCNd64"_%"SCNd64, real_keyname, &long_delay, &long_delay_range);
char real_keyname[N_KEYNAME_LENGTH]; // temp to hold the left side (key) of the <key>=<delay>
int scan_matches = sscanf(keyname, "%"N_SCANF_KEYNAME"[^=]=%"SCNd64"_%"SCNd64, real_keyname, &long_delay, &long_delay_range);
if (scan_matches == 2 || scan_matches == 3) {
if (0 <= long_delay && long_delay < UINT32_MAX) {
delay = (uint32_t)long_delay;
strcpy(keyname, real_keyname); // keyname[40], real_keyname[12]
static_assert(sizeof(keyname) >= sizeof(real_keyname), "");
strcpy(keyname, real_keyname);
if(0 < long_delay_range && long_delay_range < UINT32_MAX
&& long_delay_range > long_delay) {
delay_range = (uint32_t)long_delay_range;
+2 -2
View File
@@ -157,13 +157,13 @@ char* printrgb(const lighting* light, const usbdevice* kb){
b[i] = mb[k];
}
// Make a buffer to track key names and to filter out duplicates
char names[N_KEYS_EXTENDED][11];
char names[N_KEYS_EXTENDED][N_KEYNAME_LENGTH];
for(int i = 0; i < N_KEYS_EXTENDED; i++){
const char* name = kb->keymap[i].name;
if(kb->keymap[i].led < 0 || !has_key(name, kb))
names[i][0] = 0;
else
strncpy(names[i], name, 11);
strncpy(names[i], name, N_KEYNAME_LENGTH);
}
// Check to make sure these aren't all the same color
int same = 1;
+2 -2
View File
@@ -447,9 +447,9 @@ void AnimScript::readProcess(){
}
if(line.startsWith("argb ")){
// Add a color to the buffer
char keyName[31];
char keyName[N_KEYNAME_LENGTH];
QRgb keyColor = 0;
if(sscanf(line, "argb %30s %x", keyName, &keyColor) != 2)
if(sscanf(line, "argb %" N_SCANF_KEYNAME "s %x", keyName, &keyColor) != 2)
continue;
QRgb* inMap = _colorBuffer.colorForName(keyName);
if(!inMap)
@@ -127,7 +127,7 @@
#define CKB_REAL_ANGLE(angle) fmod((-(angle) + 90.) * M_PI / 180. + M_PI * 2., M_PI * 2.)
// Key definition
#define CKB_KEYNAME_MAX 12
#define CKB_KEYNAME_MAX 40
typedef struct {
char name[CKB_KEYNAME_MAX+1];
int x, y;