Skip to content

Commit c6235e1

Browse files
committed
add alt/ctrl/shift bind modifiers
1 parent e91dfed commit c6235e1

File tree

2 files changed

+225
-40
lines changed

2 files changed

+225
-40
lines changed

codemp/client/cl_keys.cpp

Lines changed: 216 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,14 +1027,71 @@ void Key_SetBinding( int keynum, const char *binding ) {
10271027
return;
10281028

10291029
// free old bindings
1030-
if ( kg.keys[keynames[keynum].upper].binding ) {
1031-
Z_Free( kg.keys[keynames[keynum].upper].binding );
1032-
kg.keys[keynames[keynum].upper].binding = NULL;
1030+
if ( kg.keys[keynames[keynum].upper].binding[BINDINGMOD_NONE] ) {
1031+
Z_Free( kg.keys[keynames[keynum].upper].binding[BINDINGMOD_NONE] );
1032+
kg.keys[keynames[keynum].upper].binding[BINDINGMOD_NONE] = NULL;
10331033
}
10341034

10351035
// allocate memory for new binding
10361036
if ( binding )
1037-
kg.keys[keynames[keynum].upper].binding = CopyString( binding );
1037+
kg.keys[keynames[keynum].upper].binding[BINDINGMOD_NONE] = CopyString( binding );
1038+
1039+
// consider this like modifying an archived cvar, so the
1040+
// file write will be triggered at the next oportunity
1041+
cvar_modifiedFlags |= CVAR_ARCHIVE;
1042+
}
1043+
1044+
void Key_SetBindingAlt(int keynum, const char *binding) {
1045+
if (keynum < 0 || keynum >= MAX_KEYS || keynum == A_ALT || keynum == A_ALT2)
1046+
return;
1047+
1048+
// free old bindings
1049+
if (kg.keys[keynames[keynum].upper].binding[BINDINGMOD_ALT]) {
1050+
Z_Free(kg.keys[keynames[keynum].upper].binding[BINDINGMOD_ALT]);
1051+
kg.keys[keynames[keynum].upper].binding[BINDINGMOD_ALT] = NULL;
1052+
}
1053+
1054+
// allocate memory for new binding
1055+
if (binding)
1056+
kg.keys[keynames[keynum].upper].binding[BINDINGMOD_ALT] = CopyString(binding);
1057+
1058+
// consider this like modifying an archived cvar, so the
1059+
// file write will be triggered at the next oportunity
1060+
cvar_modifiedFlags |= CVAR_ARCHIVE;
1061+
}
1062+
1063+
void Key_SetBindingCtrl(int keynum, const char *binding) {
1064+
if (keynum < 0 || keynum >= MAX_KEYS || keynum == A_CTRL || keynum == A_CTRL2)
1065+
return;
1066+
1067+
// free old bindings
1068+
if (kg.keys[keynames[keynum].upper].binding[BINDINGMOD_CTRL]) {
1069+
Z_Free(kg.keys[keynames[keynum].upper].binding[BINDINGMOD_CTRL]);
1070+
kg.keys[keynames[keynum].upper].binding[BINDINGMOD_CTRL] = NULL;
1071+
}
1072+
1073+
// allocate memory for new binding
1074+
if (binding)
1075+
kg.keys[keynames[keynum].upper].binding[BINDINGMOD_CTRL] = CopyString(binding);
1076+
1077+
// consider this like modifying an archived cvar, so the
1078+
// file write will be triggered at the next oportunity
1079+
cvar_modifiedFlags |= CVAR_ARCHIVE;
1080+
}
1081+
1082+
void Key_SetBindingShift(int keynum, const char *binding) {
1083+
if (keynum < 0 || keynum >= MAX_KEYS || keynum == A_SHIFT || keynum == A_SHIFT2)
1084+
return;
1085+
1086+
// free old bindings
1087+
if (kg.keys[keynames[keynum].upper].binding[BINDINGMOD_SHIFT]) {
1088+
Z_Free(kg.keys[keynames[keynum].upper].binding[BINDINGMOD_SHIFT]);
1089+
kg.keys[keynames[keynum].upper].binding[BINDINGMOD_SHIFT] = NULL;
1090+
}
1091+
1092+
// allocate memory for new binding
1093+
if (binding)
1094+
kg.keys[keynames[keynum].upper].binding[BINDINGMOD_SHIFT] = CopyString(binding);
10381095

10391096
// consider this like modifying an archived cvar, so the
10401097
// file write will be triggered at the next oportunity
@@ -1050,7 +1107,7 @@ char *Key_GetBinding( int keynum ) {
10501107
if ( keynum < 0 || keynum >= MAX_KEYS )
10511108
return "";
10521109

1053-
return kg.keys[keynum].binding;
1110+
return kg.keys[keynum].binding[BINDINGMOD_NONE];
10541111
}
10551112

10561113
/*
@@ -1061,7 +1118,7 @@ Key_GetKey
10611118
int Key_GetKey( const char *binding ) {
10621119
if ( binding ) {
10631120
for ( int i=0; i<MAX_KEYS; i++ ) {
1064-
if ( kg.keys[i].binding && !Q_stricmp( binding, kg.keys[i].binding ) )
1121+
if ( kg.keys[i].binding[BINDINGMOD_NONE] && !Q_stricmp( binding, kg.keys[i].binding[BINDINGMOD_NONE] ) )
10651122
return i;
10661123
}
10671124
}
@@ -1074,19 +1131,47 @@ int Key_GetKey( const char *binding ) {
10741131
Key_Unbind_f
10751132
===================
10761133
*/
1134+
10771135
void Key_Unbind_f( void ) {
10781136
if ( Cmd_Argc() != 2 ) {
1079-
Com_Printf( "unbind <key> : remove commands from a key\n" );
1137+
Com_Printf( "unbind <key> : remove commands from a key\noptionally use ctrl+, shift+, or alt+ key modifier\n" );
10801138
return;
10811139
}
10821140

1083-
int b = Key_StringToKeynum( Cmd_Argv( 1 ) );
1141+
char *keyStr = Cmd_Argv(1);
1142+
int len = strlen(Cmd_Argv(1));
1143+
bindingModifier_t mod = BINDINGMOD_NONE;
1144+
if (!Q_stricmpn(Cmd_Argv(1), "alt+", 4) && len > 4) {
1145+
keyStr += 4;
1146+
mod = BINDINGMOD_ALT;
1147+
}
1148+
if (!Q_stricmpn(Cmd_Argv(1), "ctrl+", 5) && len > 5) {
1149+
keyStr += 5;
1150+
mod = BINDINGMOD_CTRL;
1151+
}
1152+
else if (!Q_stricmpn(Cmd_Argv(1), "shift+", 6) && len > 6) {
1153+
keyStr += 6;
1154+
mod = BINDINGMOD_SHIFT;
1155+
}
1156+
1157+
int b = Key_StringToKeynum( keyStr );
10841158
if ( b == -1 ) {
1085-
Com_Printf( "\"%s\" isn't a valid key\n", Cmd_Argv( 1 ) );
1159+
Com_Printf( "\"%s\" isn't a valid key\n", keyStr );
1160+
return;
1161+
}
1162+
if (((b == A_ALT || b == A_ALT2) && mod == BINDINGMOD_ALT) ||
1163+
((b == A_CTRL || b == A_CTRL2) && mod == BINDINGMOD_CTRL) ||
1164+
((b == A_SHIFT || b == A_SHIFT2) && mod == BINDINGMOD_SHIFT)) {
1165+
Com_Printf("\"%s\" isn't a valid key combination\n", Cmd_Argv(1));
10861166
return;
10871167
}
10881168

1089-
Key_SetBinding( b, "" );
1169+
switch (mod) {
1170+
case BINDINGMOD_ALT: Key_SetBindingAlt(b, ""); break;
1171+
case BINDINGMOD_CTRL: Key_SetBindingCtrl(b, ""); break;
1172+
case BINDINGMOD_SHIFT: Key_SetBindingShift(b, ""); break;
1173+
default: Key_SetBinding(b, ""); break;
1174+
}
10901175
}
10911176

10921177
/*
@@ -1096,8 +1181,14 @@ Key_Unbindall_f
10961181
*/
10971182
void Key_Unbindall_f( void ) {
10981183
for ( int i=0; i<MAX_KEYS; i++ ) {
1099-
if ( kg.keys[i].binding )
1184+
if ( kg.keys[i].binding[BINDINGMOD_NONE] )
11001185
Key_SetBinding( i, "" );
1186+
if (kg.keys[i].binding[BINDINGMOD_ALT])
1187+
Key_SetBindingAlt(i, "");
1188+
if (kg.keys[i].binding[BINDINGMOD_CTRL])
1189+
Key_SetBindingCtrl(i, "");
1190+
if (kg.keys[i].binding[BINDINGMOD_SHIFT])
1191+
Key_SetBindingShift(i, "");
11011192
}
11021193
}
11031194

@@ -1110,25 +1201,73 @@ void Key_Bind_f( void ) {
11101201
int c = Cmd_Argc();
11111202

11121203
if ( c < 2 ) {
1113-
Com_Printf( "bind <key> [command] : attach a command to a key\n" );
1204+
Com_Printf( "bind <key> [command] : attach a command to a key\noptionally use ctrl+, shift+, or alt+ key modifier" );
11141205
return;
11151206
}
11161207

1117-
int b = Key_StringToKeynum( Cmd_Argv( 1 ) );
1208+
char *keyStr = Cmd_Argv(1);
1209+
int len = strlen(Cmd_Argv(1));
1210+
bindingModifier_t mod = BINDINGMOD_NONE;
1211+
if (!Q_stricmpn(Cmd_Argv(1), "alt+", 4) && len > 4) {
1212+
keyStr += 4;
1213+
mod = BINDINGMOD_ALT;
1214+
}
1215+
if (!Q_stricmpn(Cmd_Argv(1), "ctrl+", 5) && len > 5) {
1216+
keyStr += 5;
1217+
mod = BINDINGMOD_CTRL;
1218+
}
1219+
else if (!Q_stricmpn(Cmd_Argv(1), "shift+", 6) && len > 6) {
1220+
keyStr += 6;
1221+
mod = BINDINGMOD_SHIFT;
1222+
}
1223+
1224+
int b = Key_StringToKeynum( keyStr );
11181225
if ( b == -1 ) {
1119-
Com_Printf( "\"%s\" isn't a valid key\n", Cmd_Argv( 1 ) );
1226+
Com_Printf( "\"%s\" isn't a valid key\n", keyStr );
1227+
return;
1228+
}
1229+
if (((b == A_ALT || b == A_ALT2) && mod == BINDINGMOD_ALT) ||
1230+
((b == A_CTRL || b == A_CTRL2) && mod == BINDINGMOD_CTRL) ||
1231+
((b == A_SHIFT || b == A_SHIFT2) && mod == BINDINGMOD_SHIFT)) {
1232+
Com_Printf("\"%s\" isn't a valid key combination\n", Cmd_Argv(1));
11201233
return;
11211234
}
11221235

11231236
if ( c == 2 ) {
1124-
if ( kg.keys[b].binding && kg.keys[b].binding[0] )
1125-
Com_Printf( S_COLOR_GREY "Bind " S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToString( b ), kg.keys[b].binding );
1126-
else
1127-
Com_Printf( "\"%s\" is not bound\n", Key_KeynumToString( b ) );
1237+
if (!mod) {
1238+
if (VALIDSTRING(kg.keys[b].binding[BINDINGMOD_NONE]))
1239+
Com_Printf(S_COLOR_GREY "Bind " S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToString(b), kg.keys[b].binding[BINDINGMOD_NONE]);
1240+
else
1241+
Com_Printf("\"%s\" is not bound\n", Key_KeynumToString(b));
1242+
}
1243+
1244+
if ((!mod || mod == BINDINGMOD_ALT)) {
1245+
if (VALIDSTRING(kg.keys[b].binding[BINDINGMOD_ALT]))
1246+
Com_Printf(S_COLOR_GREY "Bind " S_COLOR_WHITE "Alt+%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToString(b), kg.keys[b].binding[BINDINGMOD_ALT]);
1247+
else if (mod) // only explicity tell them it's not bound if they requested this modifier
1248+
Com_Printf("\"Alt+%s\" is not bound\n", Key_KeynumToString(b));
1249+
}
1250+
if ((!mod || mod == BINDINGMOD_CTRL)) {
1251+
if (VALIDSTRING(kg.keys[b].binding[BINDINGMOD_CTRL]))
1252+
Com_Printf(S_COLOR_GREY "Bind " S_COLOR_WHITE "Ctrl+%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToString(b), kg.keys[b].binding[BINDINGMOD_CTRL]);
1253+
else if (mod) // only explicity tell them it's not bound if they requested this modifier
1254+
Com_Printf("\"Ctrl+%s\" is not bound\n", Key_KeynumToString(b));
1255+
}
1256+
if ((!mod || mod == BINDINGMOD_SHIFT)) {
1257+
if (VALIDSTRING(kg.keys[b].binding[BINDINGMOD_SHIFT]))
1258+
Com_Printf(S_COLOR_GREY "Bind " S_COLOR_WHITE "Shift+%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToString(b), kg.keys[b].binding[BINDINGMOD_SHIFT]);
1259+
else if (mod) // only explicity tell them it's not bound if they requested this modifier
1260+
Com_Printf("\"Shift+%s\" is not bound\n", Key_KeynumToString(b));
1261+
}
11281262
return;
11291263
}
11301264

1131-
Key_SetBinding( b, Cmd_ArgsFrom( 2 ) );
1265+
switch (mod) {
1266+
case BINDINGMOD_ALT: Key_SetBindingAlt(b, Cmd_ArgsFrom(2)); break;
1267+
case BINDINGMOD_CTRL: Key_SetBindingCtrl(b, Cmd_ArgsFrom(2)); break;
1268+
case BINDINGMOD_SHIFT: Key_SetBindingShift(b, Cmd_ArgsFrom(2)); break;
1269+
default: Key_SetBinding(b, Cmd_ArgsFrom(2)); break;
1270+
}
11321271
}
11331272

11341273
/*
@@ -1141,14 +1280,34 @@ Writes lines containing "bind key value"
11411280
void Key_WriteBindings( fileHandle_t f ) {
11421281
FS_Printf( f, "unbindall\n" );
11431282
for ( size_t i=0; i<MAX_KEYS; i++ ) {
1144-
if ( kg.keys[i].binding && kg.keys[i].binding[0] ) {
1145-
const char *name = Key_KeynumToString( i );
1146-
1283+
const char *name = Key_KeynumToString(i);
1284+
if ( VALIDSTRING(kg.keys[i].binding[BINDINGMOD_NONE]) ) {
11471285
// handle the escape character nicely
11481286
if ( !strcmp( name, "\\" ) )
1149-
FS_Printf( f, "bind \"\\\" \"%s\"\n", kg.keys[i].binding );
1287+
FS_Printf( f, "bind \"\\\" \"%s\"\n", kg.keys[i].binding[BINDINGMOD_NONE] );
1288+
else
1289+
FS_Printf( f, "bind \"%s\" \"%s\"\n", name, kg.keys[i].binding[BINDINGMOD_NONE] );
1290+
}
1291+
if (VALIDSTRING(kg.keys[i].binding[BINDINGMOD_ALT])) {
1292+
// handle the escape character nicely
1293+
if (!strcmp(name, "\\"))
1294+
FS_Printf(f, "bind \"ALT+\\\" \"%s\"\n", kg.keys[i].binding[BINDINGMOD_ALT]);
1295+
else
1296+
FS_Printf(f, "bind \"ALT+%s\" \"%s\"\n", name, kg.keys[i].binding[BINDINGMOD_ALT]);
1297+
}
1298+
if (VALIDSTRING(kg.keys[i].binding[BINDINGMOD_CTRL])) {
1299+
// handle the escape character nicely
1300+
if (!strcmp(name, "\\"))
1301+
FS_Printf(f, "bind \"CTRL+\\\" \"%s\"\n", kg.keys[i].binding[BINDINGMOD_CTRL]);
11501302
else
1151-
FS_Printf( f, "bind \"%s\" \"%s\"\n", name, kg.keys[i].binding );
1303+
FS_Printf(f, "bind \"CTRL+%s\" \"%s\"\n", name, kg.keys[i].binding[BINDINGMOD_CTRL]);
1304+
}
1305+
if (VALIDSTRING(kg.keys[i].binding[BINDINGMOD_SHIFT])) {
1306+
// handle the escape character nicely
1307+
if (!strcmp(name, "\\"))
1308+
FS_Printf(f, "bind \"SHIFT+\\\" \"%s\"\n", kg.keys[i].binding[BINDINGMOD_SHIFT]);
1309+
else
1310+
FS_Printf(f, "bind \"SHIFT+%s\" \"%s\"\n", name, kg.keys[i].binding[BINDINGMOD_SHIFT]);
11521311
}
11531312
}
11541313
}
@@ -1161,8 +1320,14 @@ Key_Bindlist_f
11611320
*/
11621321
void Key_Bindlist_f( void ) {
11631322
for ( size_t i=0; i<MAX_KEYS; i++ ) {
1164-
if ( kg.keys[i].binding && kg.keys[i].binding[0] )
1165-
Com_Printf( S_COLOR_GREY "Key " S_COLOR_WHITE "%s (%s) = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToAscii( i ), Key_KeynumToString( i ), kg.keys[i].binding );
1323+
if ( VALIDSTRING(kg.keys[i].binding[BINDINGMOD_NONE]) )
1324+
Com_Printf( S_COLOR_GREY "Key " S_COLOR_WHITE "%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToString( i ), kg.keys[i].binding[BINDINGMOD_NONE] );
1325+
if (VALIDSTRING(kg.keys[i].binding[BINDINGMOD_ALT]))
1326+
Com_Printf(S_COLOR_GREY "Key " S_COLOR_WHITE "Alt+%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToString(i), kg.keys[i].binding[BINDINGMOD_ALT]);
1327+
if (VALIDSTRING(kg.keys[i].binding[BINDINGMOD_CTRL]))
1328+
Com_Printf(S_COLOR_GREY "Key " S_COLOR_WHITE "Ctrl+%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToString(i), kg.keys[i].binding[BINDINGMOD_CTRL]);
1329+
if (VALIDSTRING(kg.keys[i].binding[BINDINGMOD_SHIFT]))
1330+
Com_Printf(S_COLOR_GREY "Key " S_COLOR_WHITE "Shift+%s = " S_COLOR_GREY "\"" S_COLOR_WHITE "%s" S_COLOR_GREY "\"" S_COLOR_WHITE "\n", Key_KeynumToString(i), kg.keys[i].binding[BINDINGMOD_SHIFT]);
11661331
}
11671332
}
11681333

@@ -1267,25 +1432,37 @@ void CL_ParseBinding( int key, qboolean down, unsigned time )
12671432

12681433
// for rshift/ralt/rctrl, prefer the specific rshift/rctrl/ralt bind if
12691434
// it exists; otherwise, fallback to the generic shift/ctrl/alt bind
1270-
const char *binding;
1271-
int genericKey = 0;
1435+
const char *binding = NULL;
1436+
qkey_t *keyPtr = &kg.keys[keynames[key].upper];
1437+
qkey_t *genericKeyPtr = NULL;
12721438
switch (key) {
1273-
case A_SHIFT2: genericKey = A_SHIFT; break;
1274-
case A_CTRL2: genericKey = A_CTRL; break;
1275-
case A_ALT2: genericKey = A_ALT; break;
1439+
case A_ALT2: genericKeyPtr = &kg.keys[keynames[A_ALT].upper]; break;
1440+
case A_CTRL2: genericKeyPtr = &kg.keys[keynames[A_CTRL].upper]; break;
1441+
case A_SHIFT2: genericKeyPtr = &kg.keys[keynames[A_SHIFT].upper]; break;
12761442
}
1277-
if (genericKey) {
1278-
if (VALIDSTRING(kg.keys[keynames[key].upper].binding))
1279-
binding = kg.keys[keynames[key].upper].binding;
1443+
1444+
if (VALIDSTRING(keyPtr->binding[BINDINGMOD_ALT]) && (kg.keys[A_ALT].down /*|| kg.keys[A_ALT2].down*/) && key != A_ALT && key != A_ALT2)
1445+
binding = keyPtr->binding[BINDINGMOD_ALT];
1446+
else if (VALIDSTRING(keyPtr->binding[BINDINGMOD_CTRL]) && (kg.keys[A_CTRL].down /*|| kg.keys[A_CTRL2].down*/) && key != A_CTRL && key != A_CTRL2)
1447+
binding = keyPtr->binding[BINDINGMOD_CTRL];
1448+
else if (VALIDSTRING(keyPtr->binding[BINDINGMOD_SHIFT]) && (kg.keys[A_SHIFT].down /*|| kg.keys[A_SHIFT2].down*/) && key != A_SHIFT && key != A_SHIFT2)
1449+
binding = keyPtr->binding[BINDINGMOD_SHIFT];
1450+
else
1451+
binding = keyPtr->binding[BINDINGMOD_NONE];
1452+
1453+
if (!VALIDSTRING(binding) && genericKeyPtr) {
1454+
if (VALIDSTRING(genericKeyPtr->binding[BINDINGMOD_ALT]) && (kg.keys[A_ALT].down /*|| kg.keys[A_ALT2].down*/) && key != A_ALT && key != A_ALT2)
1455+
binding = genericKeyPtr->binding[BINDINGMOD_ALT];
1456+
else if (VALIDSTRING(genericKeyPtr->binding[BINDINGMOD_CTRL]) && (kg.keys[A_CTRL].down /*|| kg.keys[A_CTRL2].down*/) && key != A_CTRL && key != A_CTRL2)
1457+
binding = genericKeyPtr->binding[BINDINGMOD_CTRL];
1458+
else if (VALIDSTRING(genericKeyPtr->binding[BINDINGMOD_SHIFT]) && (kg.keys[A_SHIFT].down /*|| kg.keys[A_SHIFT2].down*/) && key != A_SHIFT && key != A_SHIFT2)
1459+
binding = genericKeyPtr->binding[BINDINGMOD_SHIFT];
12801460
else
1281-
binding = kg.keys[keynames[genericKey].upper].binding;
1282-
}
1283-
else {
1284-
binding = kg.keys[keynames[key].upper].binding;
1461+
binding = genericKeyPtr->binding[BINDINGMOD_NONE];
12851462
}
1286-
12871463
if (!VALIDSTRING(binding))
12881464
return;
1465+
12891466
Q_strncpyz(buf, binding, sizeof(buf));
12901467

12911468
// run all bind commands if console, ui, etc aren't reading keys

codemp/client/keys.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,18 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
2525

2626
#include "ui/keycodes.h"
2727

28+
typedef enum bindingModifier_s {
29+
BINDINGMOD_NONE = 0,
30+
BINDINGMOD_ALT,
31+
BINDINGMOD_CTRL,
32+
BINDINGMOD_SHIFT,
33+
NUM_BINDINGMODS
34+
} bindingModifier_t;
35+
2836
typedef struct qkey_s {
2937
qboolean down;
3038
int repeats; // if > 1, it is autorepeating
31-
char *binding;
39+
char *binding[NUM_BINDINGMODS];
3240
} qkey_t;
3341

3442
typedef struct keyGlobals_s {

0 commit comments

Comments
 (0)