From bbe2c2ab97b9882738b9ea985b5e1a3f86006999 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Thu, 2 Jan 2020 21:10:40 +0100 Subject: Keyboard.c: fix: handle empty string --- nx-X11/programs/Xserver/hw/nxagent/Keyboard.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c index 0ebaf677b..756613ab1 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c @@ -549,6 +549,12 @@ XkbError: XkbComponentNamesRec names = {0}; char *rules = NULL, *variant = NULL, *options = NULL; /* use xkb default */ + /* handle empty string like the NULL pointer */ + if (nxagentKeyboard && nxagentKeyboard[0] == '\0') + { + SAFE_free(nxagentKeyboard); + } + #ifdef TEST fprintf(stderr, "nxagentKeyboardProc: Using XKB extension.\n"); fprintf(stderr, "nxagentKeyboardProc: nxagentKeyboard is [%s].\n", nxagentKeyboard ? nxagentKeyboard : "NULL"); -- cgit v1.2.3 From 4c8568caa62a83a9e0bf3aa3f5566c7dd2f8062f Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Thu, 2 Jan 2020 21:11:56 +0100 Subject: Keyboard.c: use "\0" instead of "0" --- nx-X11/programs/Xserver/hw/nxagent/Args.c | 6 +++--- nx-X11/programs/Xserver/hw/nxagent/Keyboard.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index 97260d747..ea3c7ae26 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -1496,7 +1496,7 @@ static void nxagentParseOptionString(char *string) if (delimiter) { - *delimiter = 0; + *delimiter = '\0'; } else { @@ -1509,7 +1509,7 @@ static void nxagentParseOptionString(char *string) if (delimiter) { - *delimiter = 0; + *delimiter = '\0'; value = delimiter + 1; } else @@ -1650,7 +1650,7 @@ void nxagentProcessOptionsFile(char * filename) for (offset = 0; (offset < sizeOfFile) && (data[offset] != '\n'); offset++); - data[offset] = 0; + data[offset] = '\0'; nxagentParseOptionString(data); diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c index 756613ab1..d5aae2eae 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c @@ -584,9 +584,9 @@ XkbError: (strcmp(nxagentKeyboard, "query") != 0) && (strcmp(nxagentKeyboard, "clone") != 0)) { - for (i = 0; nxagentKeyboard[i] != '/' && nxagentKeyboard[i] != 0; i++); + for (i = 0; nxagentKeyboard[i] != '/' && nxagentKeyboard[i] != '\0'; i++); - if (nxagentKeyboard[i] == 0 || nxagentKeyboard[i + 1] == 0 || i == 0) + if (nxagentKeyboard[i] == '\0' || nxagentKeyboard[i + 1] == '\0' || i == 0) { ErrorF("Warning: Wrong keyboard type: %s.\n", nxagentKeyboard); goto XkbError; -- cgit v1.2.3 From 15bfec7a52eb7a67c34552b192e9ebc614e27576 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Thu, 2 Jan 2020 21:23:11 +0100 Subject: Keyboard.c: Use __func__ at fprintf calls --- nx-X11/programs/Xserver/hw/nxagent/Keyboard.c | 101 +++++++++++++------------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c index d5aae2eae..391941d56 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c @@ -250,7 +250,7 @@ CARD8 nxagentConvertKeycode(CARD8 k) { #ifdef DEBUG if (k != nxagentConvertedKeycodes[k]) - fprintf(stderr, "nxagentConvertKeycode: converting keycode [%d] to [%d]\n", k, nxagentConvertedKeycodes[k]); + fprintf(stderr, "%s: converting keycode [%d] to [%d]\n", __func__, k, nxagentConvertedKeycodes[k]); #endif return nxagentConvertedKeycodes[k]; @@ -292,7 +292,7 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl) */ #ifdef TEST - fprintf(stderr, "nxagentChangeKeyboardControl: Repeat delay was [%d] interval was [%d].\n", + fprintf(stderr, "%s: Repeat delay was [%d] interval was [%d].\n", __func__, xkbc -> repeat_delay, xkbc -> repeat_interval); #endif @@ -300,7 +300,7 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl) xkbc -> repeat_interval = ~ 0; #ifdef TEST - fprintf(stderr, "nxagentChangeKeyboardControl: Repeat delay is now [%d] interval is now [%d].\n", + fprintf(stderr, "%s: Repeat delay is now [%d] interval is now [%d].\n", __func__, xkbc -> repeat_delay, xkbc -> repeat_interval); #endif } @@ -318,7 +318,7 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl) XKeyboardControl values; #ifdef TEST - fprintf(stderr, "nxagentChangeKeyboardControl: WARNING! Propagating changes to keyboard settings.\n"); + fprintf(stderr, "%s: WARNING! Propagating changes to keyboard settings.\n", __func__); #endif value_mask = KBKeyClickPercent | @@ -363,7 +363,7 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl) } #ifdef TEST - fprintf(stderr, "nxagentChangeKeyboardControl: WARNING! Not propagating changes to keyboard settings.\n"); + fprintf(stderr, "%s: WARNING! Not propagating changes to keyboard settings.\n", __func__); #endif } @@ -387,7 +387,7 @@ int nxagentKeyboardProc(DeviceIntPtr pDev, int onoff) case DEVICE_INIT: #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: Called for [DEVICE_INIT].\n"); + fprintf(stderr, "%s: Called for [DEVICE_INIT].\n", __func__); #endif if (NXDisplayError(nxagentDisplay) == 1) @@ -397,7 +397,7 @@ int nxagentKeyboardProc(DeviceIntPtr pDev, int onoff) #ifdef WATCH - fprintf(stderr, "nxagentKeyboardProc: Watchpoint 9.\n"); + fprintf(stderr, "%s: Watchpoint 9.\n", __func__); /* Reply Total Cached Bits In Bits Out Bits/Reply Ratio @@ -421,7 +421,7 @@ N/A XkbDfltRepeatInterval = ~ 0; #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: Set repeat delay to [%d] interval to [%d].\n", + fprintf(stderr, "%s: Set repeat delay to [%d] interval to [%d].\n", __func__, XkbDfltRepeatDelay, XkbDfltRepeatInterval); #endif @@ -517,13 +517,13 @@ N/A if (noXkbExtension) { #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: No XKB extension.\n"); + fprintf(stderr, "%s: No XKB extension.\n", __func__); #endif XkbError: #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: XKB error.\n"); + fprintf(stderr, "%s: XKB error.\n", __func__); #endif #endif @@ -540,7 +540,7 @@ XkbError: nxagentBell, nxagentChangeKeyboardControl); #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: InitKeyboardDeviceStruct returns [%d].\n", ret); + fprintf(stderr, "%s: InitKeyboardDeviceStruct returns [%d].\n", __func__, ret); } #endif @@ -556,8 +556,8 @@ XkbError: } #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: Using XKB extension.\n"); - fprintf(stderr, "nxagentKeyboardProc: nxagentKeyboard is [%s].\n", nxagentKeyboard ? nxagentKeyboard : "NULL"); + fprintf(stderr, "%s: Using XKB extension.\n", __func__); + fprintf(stderr, "%s: nxagentKeyboard is [%s].\n", __func__, validateString(nxagentKeyboard)); #endif if (nxagentX2go && nxagentKeyboard && (strcmp(nxagentKeyboard, "null/null") == 0)) @@ -635,8 +635,8 @@ XkbError: if (strcmp(model, "pc105") == 0) { #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: WARNING! Keyboard model 'pc105' unsupported on Solaris.\n"); - fprintf(stderr, "nxagentKeyboardProc: WARNING! Forcing keyboard model to 'pc104'.\n"); + fprintf(stderr, "%s: WARNING! Keyboard model 'pc105' unsupported on Solaris.\n", __func__); + fprintf(stderr, "%s: WARNING! Forcing keyboard model to 'pc104'.\n", __func__); #endif strcpy(model, "pc104"); @@ -647,13 +647,13 @@ XkbError: else { #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: Using default keyboard: model [%s] layout [%s].\n", + fprintf(stderr, "%s: Using default keyboard: model [%s] layout [%s].\n", __func__, model?model:"(default)", layout?layout:"(default)"); #endif } #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: Init XKB extension.\n"); + fprintf(stderr, "%s: Init XKB extension.\n", __func__); #endif if (nxagentRemoteRules && nxagentRemoteModel) @@ -720,13 +720,13 @@ XkbError: #ifdef TEST else { - fprintf(stderr, "nxagentKeyboardProc: No current keyboard.\n"); + fprintf(stderr, "%s: No current keyboard.\n", __func__); } #endif #ifdef DEBUG - fprintf(stderr, "nxagentKeyboardProc: Going to set rules and init device: " - "[rules='%s',model='%s',layout='%s',variant='%s',options='%s'].\n", + fprintf(stderr, "%s: Going to set rules and init device: " + "[rules='%s',model='%s',layout='%s',variant='%s',options='%s'].\n", __func__, rules?rules:"(default)", model?model:"(default)", layout?layout:"(default)", variant?variant:"(default)", options?options:"(default)"); #endif @@ -767,7 +767,7 @@ XkbError: #ifdef WATCH - fprintf(stderr, "nxagentKeyboardProc: Watchpoint 10.\n"); + fprintf(stderr, "%s: Watchpoint 10.\n", __func__); /* Reply Total Cached Bits In Bits Out Bits/Reply Ratio @@ -791,7 +791,7 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio case DEVICE_ON: #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: Called for [DEVICE_ON].\n"); + fprintf(stderr, "%s: Called for [DEVICE_ON].\n", __func__); #endif if (NXDisplayError(nxagentDisplay) == 1) @@ -801,7 +801,7 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio #ifdef WATCH - fprintf(stderr, "nxagentKeyboardProc: Watchpoint 11.\n"); + fprintf(stderr, "%s: Watchpoint 11.\n", __func__); /* Reply Total Cached Bits In Bits Out Bits/Reply Ratio @@ -820,7 +820,7 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio case DEVICE_OFF: #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: Called for [DEVICE_OFF].\n"); + fprintf(stderr, "%s: Called for [DEVICE_OFF].\n", __func__); #endif if (NXDisplayError(nxagentDisplay) == 1) @@ -834,7 +834,7 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio case DEVICE_CLOSE: #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: Called for [DEVICE_CLOSE].\n"); + fprintf(stderr, "%s: Called for [DEVICE_CLOSE].\n", __func__); #endif break; @@ -934,14 +934,14 @@ int nxagentResetKeyboard(void) savedBellDuration = inputInfo.keyboard -> kbdfeed -> ctrl.bell_duration; #ifdef TEST - fprintf(stderr, "nxagentResetKeyboard: bellPercent [%d] bellPitch [%d] bellDuration [%d].\n", + fprintf(stderr, "%s: bellPercent [%d] bellPitch [%d] bellDuration [%d].\n", __func__, savedBellPercent, savedBellPitch, savedBellDuration); #endif if (!(devBackup = calloc(1, sizeof(DeviceIntRec)))) { #ifdef PANIC - fprintf(stderr, "nxagentResetKeyboard: PANIC! Can't allocate backup structure.\n"); + fprintf(stderr, "%s: PANIC! Can't allocate backup structure.\n", __func__); #endif } @@ -992,7 +992,7 @@ int nxagentResetKeyboard(void) else { #ifdef WARNING - fprintf(stderr, "nxagentResetKeyboard: Can't initialize the keyboard device.\n"); + fprintf(stderr, "%s: Can't initialize the keyboard device.\n", __func__); #endif nxagentRestoreKeyboardDeviceData(devBackup, dev); @@ -1046,9 +1046,8 @@ void nxagentCheckRemoteKeycodes(void) nxagentNumLockKeycode = XKeysymToKeycode(nxagentDisplay, XK_Num_Lock); #ifdef DEBUG - fprintf(stderr, "nxagentCheckRemoteKeycodes: Remote keycodes: CapsLock " - "[%d] NumLock [%d].\n", nxagentCapsLockKeycode, - nxagentNumLockKeycode); + fprintf(stderr, "%s: Remote keycodes: CapsLock [%d] NumLock [%d].\n", __func__, + nxagentCapsLockKeycode,nxagentNumLockKeycode); #endif } @@ -1057,7 +1056,7 @@ static int nxagentSaveKeyboardDeviceData(DeviceIntPtr dev, DeviceIntPtr devBacku if (!devBackup) { #ifdef PANIC - fprintf(stderr, "nxagentSaveKeyboardDeviceData: PANIC! Pointer to backup structure is null.\n"); + fprintf(stderr, "%s: PANIC! Pointer to backup structure is null.\n", __func__); #endif return -1; @@ -1068,7 +1067,7 @@ static int nxagentSaveKeyboardDeviceData(DeviceIntPtr dev, DeviceIntPtr devBacku devBackup -> kbdfeed = dev -> kbdfeed; #ifdef DEBUG - fprintf(stderr, "nxagentSaveKeyboardDeviceData: Saved device data.\n"); + fprintf(stderr, "%s: Saved device data.\n", __func__); #endif return 1; @@ -1079,7 +1078,7 @@ static int nxagentRestoreKeyboardDeviceData(DeviceIntPtr devBackup, DeviceIntPtr if (!devBackup) { #ifdef PANIC - fprintf(stderr, "nxagentRestoreKeyboardDeviceData: PANIC! Pointer to backup structure is null.\n"); + fprintf(stderr, "%s: PANIC! Pointer to backup structure is null.\n", __func__); #endif return -1; @@ -1090,7 +1089,7 @@ static int nxagentRestoreKeyboardDeviceData(DeviceIntPtr devBackup, DeviceIntPtr dev -> kbdfeed = devBackup -> kbdfeed; #ifdef DEBUG - fprintf(stderr, "nxagentRestoreKeyboardDeviceData: Restored device data.\n"); + fprintf(stderr, "%s: Restored device data.\n", __func__); #endif return 1; @@ -1102,7 +1101,7 @@ static int nxagentFreeKeyboardDeviceData(DeviceIntPtr dev) if (!dev) { #ifdef PANIC - fprintf(stderr, "nxagentFreeKeyboardDeviceData: PANIC! Pointer to device structure is null.\n"); + fprintf(stderr, "%s: PANIC! Pointer to device structure is null.\n", __func__); #endif return -1; @@ -1144,7 +1143,7 @@ static int nxagentFreeKeyboardDeviceData(DeviceIntPtr dev) } #ifdef DEBUG - fprintf(stderr, "nxagentFreeKeyboardDeviceData: Freed device data.\n"); + fprintf(stderr, "%s: Freed device data.\n", __func__); #endif return 1; @@ -1158,7 +1157,7 @@ int ProcXkbInhibited(register ClientPtr client) unsigned char minorop; #ifdef TEST - fprintf(stderr, "ProcXkbInhibited: Called.\n"); + fprintf(stderr, "%s: Called.\n", __func__); #endif majorop = ((xReq *)client->requestBuffer)->reqType; @@ -1166,7 +1165,7 @@ int ProcXkbInhibited(register ClientPtr client) #ifdef PANIC if (majorop != (unsigned char)nxagentXkbWrapper.base) { - fprintf(stderr, "ProcXkbInhibited: MAJOROP is [%d] but should be [%d].\n", + fprintf(stderr, "%s: MAJOROP is [%d] but should be [%d].\n", __func__, majorop, nxagentXkbWrapper.base); } #endif @@ -1174,7 +1173,7 @@ int ProcXkbInhibited(register ClientPtr client) minorop = *((unsigned char *) client->requestBuffer + 1); #ifdef TEST - fprintf(stderr, "ProcXkbInhibited: MAJOROP is [%d] MINOROP is [%d].\n", + fprintf(stderr, "%s: MAJOROP is [%d] MINOROP is [%d].\n", __func__, majorop, minorop); #endif @@ -1229,13 +1228,13 @@ void nxagentInitXkbWrapper(void) ExtensionEntry * extension; #ifdef TEST - fprintf(stderr, "nxagentInitXkbWrapper: Called.\n"); + fprintf(stderr, "%s: Called.\n", __func__); #endif if (!nxagentOption(InhibitXkb)) { #ifdef TEST - fprintf(stderr, "nxagentInitXkbWrapper: Nothing to do.\n"); + fprintf(stderr, "%s: Nothing to do.\n", __func__); #endif return; @@ -1252,7 +1251,7 @@ void nxagentInitXkbWrapper(void) nxagentXkbWrapper.SProcXkbDispatchBackup = NULL; #ifdef TEST - fprintf(stderr, "nxagentInitXkbWrapper: base [%d] eventBase [%d] errorBase [%d].\n", + fprintf(stderr, "%s: base [%d] eventBase [%d] errorBase [%d].\n", __func__, extension -> base, extension -> eventBase, extension -> errorBase); #endif } @@ -1261,7 +1260,7 @@ void nxagentInitXkbWrapper(void) nxagentXkbWrapper.base = -1; #ifdef TEST - fprintf(stderr, "nxagentInitXkbWrapper: XKEYBOARD extension not found.\n"); + fprintf(stderr, "%s: XKEYBOARD extension not found.\n", __func__); #endif } } @@ -1269,7 +1268,7 @@ void nxagentInitXkbWrapper(void) void nxagentDisableXkbExtension(void) { #ifdef TEST - fprintf(stderr, "nxagentDisableXkbExtension: Called.\n"); + fprintf(stderr, "%s: Called.\n", __func__); #endif if (nxagentXkbWrapper.base > 0) @@ -1283,7 +1282,7 @@ void nxagentDisableXkbExtension(void) #ifdef TEST else { - fprintf(stderr, "nxagentDisableXkbExtension: Nothing to be done for ProcXkbDispatch.\n"); + fprintf(stderr, "%s: Nothing to be done for ProcXkbDispatch.\n", __func__); } #endif @@ -1296,7 +1295,7 @@ void nxagentDisableXkbExtension(void) #ifdef TEST else { - fprintf(stderr, "nxagentDisableXkbExtension: Nothing to be done for SProcXkbDispatch.\n"); + fprintf(stderr, "%s: Nothing to be done for SProcXkbDispatch.\n", __func__); } #endif } @@ -1305,7 +1304,7 @@ void nxagentDisableXkbExtension(void) void nxagentEnableXkbExtension(void) { #ifdef TEST - fprintf(stderr, "nxagentEnableXkbExtension: Called.\n"); + fprintf(stderr, "%s: Called.\n", __func__); #endif if (nxagentXkbWrapper.base > 0) @@ -1319,7 +1318,7 @@ void nxagentEnableXkbExtension(void) #ifdef TEST else { - fprintf(stderr, "nxagentEnableXkbExtension: Nothing to be done for ProcXkbDispatch.\n"); + fprintf(stderr, "%s: Nothing to be done for ProcXkbDispatch.\n", __func__); } #endif @@ -1332,7 +1331,7 @@ void nxagentEnableXkbExtension(void) #ifdef TEST else { - fprintf(stderr, "nxagentEnableXkbExtension: Nothing to be done for SProcXkbDispatch.\n"); + fprintf(stderr, "%s: Nothing to be done for SProcXkbDispatch.\n", __func__); } #endif } @@ -1353,7 +1352,7 @@ void nxagentTuneXkbWrapper(void) if (!nxagentOption(InhibitXkb)) { #ifdef TEST - fprintf(stderr, "nxagentTuneXkbWrapper: Nothing to do.\n"); + fprintf(stderr, "%s: Nothing to do.\n", __func__); #endif return; -- cgit v1.2.3 From 8fa4d842d482a61cfe63cb2ca1459e48214fac34 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Thu, 2 Jan 2020 22:15:06 +0100 Subject: Keyboard.c: scope cleanups --- nx-X11/programs/Xserver/hw/nxagent/Keyboard.c | 130 +++++++++++--------------- 1 file changed, 54 insertions(+), 76 deletions(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c index 391941d56..90a4262d7 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c @@ -276,13 +276,10 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl) { #ifdef XKB - XkbSrvInfoPtr xkbi; - XkbControlsPtr xkbc; - if (!noXkbExtension) { - xkbi = pDev -> key -> xkbInfo; - xkbc = xkbi -> desc -> ctrls; + XkbSrvInfoPtr xkbi = pDev -> key -> xkbInfo; + XkbControlsPtr xkbc = xkbi -> desc -> ctrls; /* * We want to prevent agent generating auto-repeated @@ -314,22 +311,21 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl) if (nxagentOption(DeviceControl)) { - unsigned long value_mask; - XKeyboardControl values; - #ifdef TEST fprintf(stderr, "%s: WARNING! Propagating changes to keyboard settings.\n", __func__); #endif - value_mask = KBKeyClickPercent | - KBBellPercent | - KBBellPitch | - KBBellDuration; + unsigned long value_mask = KBKeyClickPercent | + KBBellPercent | + KBBellPitch | + KBBellDuration; - values.key_click_percent = ctrl->click; - values.bell_percent = ctrl->bell; - values.bell_pitch = ctrl->bell_pitch; - values.bell_duration = ctrl->bell_duration; + XKeyboardControl values = { + .key_click_percent = ctrl->click, + .bell_percent = ctrl->bell, + .bell_pitch = ctrl->bell_pitch, + .bell_duration = ctrl->bell_duration, + }; /* * Don't propagate the auto repeat mode. It is forced to be @@ -369,13 +365,10 @@ void nxagentChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl) int nxagentKeyboardProc(DeviceIntPtr pDev, int onoff) { - XModifierKeymap *modifier_keymap; KeySym *keymap; int mapWidth; int min_keycode, max_keycode; - KeySymsRec keySyms; CARD8 modmap[MAP_LENGTH]; - int i, j; XKeyboardState values; #ifdef XKB char *model = NULL, *layout = NULL; @@ -425,7 +418,7 @@ N/A XkbDfltRepeatDelay, XkbDfltRepeatInterval); #endif - modifier_keymap = XGetModifierMapping(nxagentDisplay); + XModifierKeymap *modifier_keymap = XGetModifierMapping(nxagentDisplay); if (modifier_keymap == NULL) { @@ -435,9 +428,7 @@ N/A XDisplayKeycodes(nxagentDisplay, &min_keycode, &max_keycode); #ifdef _XSERVER64 { - KeySym64 *keymap64; - int len; - keymap64 = XGetKeyboardMapping(nxagentDisplay, + KeySym64 *keymap64 = XGetKeyboardMapping(nxagentDisplay, min_keycode, max_keycode - min_keycode + 1, &mapWidth); @@ -448,9 +439,9 @@ N/A return -1; } - len = (max_keycode - min_keycode + 1) * mapWidth; + int len = (max_keycode - min_keycode + 1) * mapWidth; keymap = (KeySym *)malloc(len * sizeof(KeySym)); - for(i = 0; i < len; ++i) + for(int i = 0; i < len; ++i) { keymap[i] = keymap64[i]; } @@ -479,9 +470,9 @@ N/A nxagentNumlockMask = 0; memset(modmap, 0, sizeof(modmap)); - for (j = 0; j < 8; j++) + for (int j = 0; j < 8; j++) { - for(i = 0; i < modifier_keymap->max_keypermod; i++) + for(int i = 0; i < modifier_keymap->max_keypermod; i++) { CARD8 keycode; if ((keycode = @@ -503,10 +494,12 @@ N/A nxagentCheckRemoteKeycodes(); - keySyms.minKeyCode = min_keycode; - keySyms.maxKeyCode = max_keycode; - keySyms.mapWidth = mapWidth; - keySyms.map = keymap; + KeySymsRec keySyms = { + .minKeyCode = min_keycode, + .maxKeyCode = max_keycode, + .mapWidth = mapWidth, + .map = keymap, + }; #ifdef XKB if (!nxagentGetRemoteXkbExtension()) @@ -584,6 +577,7 @@ XkbError: (strcmp(nxagentKeyboard, "query") != 0) && (strcmp(nxagentKeyboard, "clone") != 0)) { + int i; for (i = 0; nxagentKeyboard[i] != '/' && nxagentKeyboard[i] != '\0'; i++); if (nxagentKeyboard[i] == '\0' || nxagentKeyboard[i + 1] == '\0' || i == 0) @@ -663,7 +657,6 @@ XkbError: __func__, nxagentRemoteRules, nxagentRemoteModel, nxagentRemoteLayout, nxagentRemoteVariant, nxagentRemoteOptions); #endif - /* Only setup keycode conversion if we are NOT in clone mode */ if (nxagentKeyboard && (strcmp(nxagentKeyboard, "clone") == 0)) { @@ -877,7 +870,6 @@ void nxagentNotifyKeyboardChanges(int oldMinKeycode, int oldMaxKeycode) #endif - int i; xEvent event = {0}; event.u.u.type = MappingNotify; @@ -890,7 +882,7 @@ void nxagentNotifyKeyboardChanges(int oldMinKeycode, int oldMaxKeycode) * 0 is the server client */ - for (i = 1; i < currentMaxClients; i++) + for (int i = 1; i < currentMaxClients; i++) { if (clients[i] && clients[i] -> clientState == ClientStateRunning) { @@ -912,14 +904,9 @@ int nxagentResetKeyboard(void) DeviceIntPtr dev = inputInfo.keyboard; DeviceIntPtr devBackup; - int result; int oldMinKeycode = 8; int oldMaxKeycode = 255; - int savedBellPercent; - int savedBellPitch; - int savedBellDuration; - if (NXDisplayError(nxagentDisplay) == 1) { return 0; @@ -929,9 +916,9 @@ int nxagentResetKeyboard(void) * Save bell settings. */ - savedBellPercent = inputInfo.keyboard -> kbdfeed -> ctrl.bell; - savedBellPitch = inputInfo.keyboard -> kbdfeed -> ctrl.bell_pitch; - savedBellDuration = inputInfo.keyboard -> kbdfeed -> ctrl.bell_duration; + int savedBellPercent = inputInfo.keyboard -> kbdfeed -> ctrl.bell; + int savedBellPitch = inputInfo.keyboard -> kbdfeed -> ctrl.bell_pitch; + int savedBellDuration = inputInfo.keyboard -> kbdfeed -> ctrl.bell_duration; #ifdef TEST fprintf(stderr, "%s: bellPercent [%d] bellPitch [%d] bellDuration [%d].\n", __func__, @@ -968,7 +955,7 @@ int nxagentResetKeyboard(void) nxagentTuneXkbWrapper(); #endif - result = (*inputInfo.keyboard -> deviceProc)(inputInfo.keyboard, DEVICE_INIT); + int result = (*inputInfo.keyboard -> deviceProc)(inputInfo.keyboard, DEVICE_INIT); if (result == Success && inputInfo.keyboard -> key != NULL) { @@ -1037,7 +1024,6 @@ void nxagentCheckModifierMasks(CARD8 keycode, int j) { nxagentCapsMask |= 1 << j; } - } void nxagentCheckRemoteKeycodes(void) @@ -1153,14 +1139,11 @@ static int nxagentFreeKeyboardDeviceData(DeviceIntPtr dev) int ProcXkbInhibited(register ClientPtr client) { - unsigned char majorop; - unsigned char minorop; - #ifdef TEST fprintf(stderr, "%s: Called.\n", __func__); #endif - majorop = ((xReq *)client->requestBuffer)->reqType; + unsigned char majorop = ((xReq *)client->requestBuffer)->reqType; #ifdef PANIC if (majorop != (unsigned char)nxagentXkbWrapper.base) @@ -1170,7 +1153,7 @@ int ProcXkbInhibited(register ClientPtr client) } #endif - minorop = *((unsigned char *) client->requestBuffer + 1); + unsigned char minorop = *((unsigned char *) client->requestBuffer + 1); #ifdef TEST fprintf(stderr, "%s: MAJOROP is [%d] MINOROP is [%d].\n", __func__, @@ -1379,34 +1362,29 @@ void nxagentXkbClearNames(void) static void nxagentXkbGetNames(void) { - Atom atom; - #ifdef _XSERVER64 - Atom64 type; - #else - Atom type; - #endif - int format; - unsigned long n; - unsigned long after; - char *data; - char *name; - Status result; - if (nxagentRemoteRules) return; - atom = XInternAtom(nxagentDisplay, "_XKB_RULES_NAMES", 1); + Atom atom = XInternAtom(nxagentDisplay, "_XKB_RULES_NAMES", 1); if (atom == 0) { return; } - data = name = NULL; + #ifdef _XSERVER64 + Atom64 type; + #else + Atom type; + #endif + int format; + unsigned long n; + unsigned long after; + char *data = NULL; - result = XGetWindowProperty(nxagentDisplay, DefaultRootWindow(nxagentDisplay), - atom, 0, 256, 0, XA_STRING, &type, &format, - &n, &after, (unsigned char **)&data); + Status result = XGetWindowProperty(nxagentDisplay, DefaultRootWindow(nxagentDisplay), + atom, 0, 256, 0, XA_STRING, &type, &format, + &n, &after, (unsigned char **)&data); if (result != Success || !data) { @@ -1422,7 +1400,7 @@ static void nxagentXkbGetNames(void) } } - name = data; + char *name = data; if (name < data + n) { @@ -1594,17 +1572,17 @@ void nxagentKeycodeConversionSetup(void) Bool nxagentGetRemoteXkbExtension(void) { - Bool result; - nxagentXkbInfo.Opcode = nxagentXkbInfo.EventBase = nxagentXkbInfo.ErrorBase = nxagentXkbInfo.MajorVersion = nxagentXkbInfo.MinorVersion = -1; nxagentXkbClearNames(); - if ((result = XkbQueryExtension(nxagentDisplay, - &nxagentXkbInfo.Opcode, - &nxagentXkbInfo.EventBase, - &nxagentXkbInfo.ErrorBase, - &nxagentXkbInfo.MajorVersion, - &nxagentXkbInfo.MinorVersion))) + Bool result = XkbQueryExtension(nxagentDisplay, + &nxagentXkbInfo.Opcode, + &nxagentXkbInfo.EventBase, + &nxagentXkbInfo.ErrorBase, + &nxagentXkbInfo.MajorVersion, + &nxagentXkbInfo.MinorVersion); + + if (result) { nxagentXkbGetNames(); } -- cgit v1.2.3 From ee3afe303fc35b98e5f674efc91fdeb2183dfcb5 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Thu, 2 Jan 2020 23:16:13 +0100 Subject: Args.c: fix: do not modify options string This resulted in a garbled option string on reconnect where everything after the first '=' was lost! --- nx-X11/programs/Xserver/hw/nxagent/Args.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index ea3c7ae26..1bfec1798 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -1488,11 +1488,17 @@ static void nxagentParseOptionString(char *string) char *value = NULL; char *option = NULL; + /* + * we must not modify string, but strtok will insert \0. So let's + * work with a copy + */ + char *dup = strdup(string); + /* * Remove the port specification. */ - char *delimiter = rindex(string, ':'); + char *delimiter = rindex(dup, ':'); if (delimiter) { @@ -1503,7 +1509,7 @@ static void nxagentParseOptionString(char *string) fprintf(stderr, "Warning: Option file doesn't contain a port specification.\n"); } - while ((option = strtok(option ? NULL : string, ","))) + while ((option = strtok(option ? NULL : dup, ","))) { delimiter = rindex(option, '='); @@ -1519,6 +1525,7 @@ static void nxagentParseOptionString(char *string) nxagentParseSingleOption(option, value); } + SAFE_free(dup); } void nxagentProcessOptions(char * string) -- cgit v1.2.3 From 925f58992064b41019c24fa012fa4cd88eb513fd Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Thu, 2 Jan 2020 23:17:04 +0100 Subject: Args.c: do not parse nx/nx marker as option slight optimization --- nx-X11/programs/Xserver/hw/nxagent/Args.c | 41 ++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index 1bfec1798..155f40f66 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -1528,6 +1528,30 @@ static void nxagentParseOptionString(char *string) SAFE_free(dup); } +char *nxagentSkipNXMarker(char *string) +{ + if (strncasecmp(string, "nx/nx,", 6) == 0 || + strncasecmp(string, "nx/nx:", 6) == 0) + { + #ifdef DEBUG + fprintf(stderr, "%s: skipping [%6.6s]\n", __func__, string); + #endif + return string + 6; + } + else if (strncasecmp(string, "nx,", 3) == 0 || + strncasecmp(string, "nx:", 3) == 0) + { + #ifdef DEBUG + fprintf(stderr, "%s: skipping [%3.3s]\n", __func__, string); + #endif + return string + 3; + } + else + { + return string; + } +} + void nxagentProcessOptions(char * string) { if (!string) @@ -1540,15 +1564,10 @@ void nxagentProcessOptions(char * string) /* if the "filename" starts with an nx marker treat it as an option _string_ instead of a filename */ - if (strncasecmp(string, "nx/nx,", 6) == 0 || - strncasecmp(string, "nx/nx:", 6) == 0) + char *skipped = nxagentSkipNXMarker(string); + if (skipped != string) { - nxagentParseOptionString(string + 6); - } - else if (strncasecmp(string, "nx,", 3) == 0 || - strncasecmp(string, "nx:", 3) == 0) - { - nxagentParseOptionString(string + 3); + nxagentParseOptionString(skipped); } else { @@ -1659,7 +1678,11 @@ void nxagentProcessOptionsFile(char * filename) data[offset] = '\0'; - nxagentParseOptionString(data); + #ifdef DEBUG + fprintf(stderr, "%s: first line of options file [%s]\n", __func__, data); + #endif + + nxagentParseOptionString(nxagentSkipNXMarker(data)); nxagentProcessOptionsFileExit: -- cgit v1.2.3 From 69443952be6e3ae340b034d9ab158a919c68bb55 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Thu, 2 Jan 2020 23:37:24 +0100 Subject: Args.c: more debug output --- nx-X11/programs/Xserver/hw/nxagent/Args.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index 155f40f66..804c6e91e 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -1502,6 +1502,9 @@ static void nxagentParseOptionString(char *string) if (delimiter) { + #ifdef DEBUG + fprintf(stderr, "%s: stripping port specification [%s]\n", __func__, delimiter); + #endif *delimiter = '\0'; } else -- cgit v1.2.3 From a59020b1d4c7a7b23cae328067b589a2aa1d787f Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Fri, 3 Jan 2020 00:20:49 +0100 Subject: nxagent: central check for keyboard clone mode --- nx-X11/programs/Xserver/hw/nxagent/Args.c | 15 ++++++++++++++- nx-X11/programs/Xserver/hw/nxagent/Keyboard.c | 8 -------- nx-X11/programs/Xserver/hw/nxagent/Reconnect.c | 9 --------- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index 804c6e91e..339c6d85b 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -687,7 +687,20 @@ int ddxProcessArgument(int argc, char *argv[], int i) { SAFE_free(nxagentKeyboard); - nxagentKeyboard = strdup(argv[i]); + if (nxagentX2go && strcmp(argv[i], "null/null") == 0) + { + #ifdef TEST + fprintf(stderr, "%s: changing nxagentKeyboard from [null/null] to [clone].\n", __func__); + #endif + + SAFE_free(nxagentKeyboard); + nxagentKeyboard = strdup("clone"); + } + else + { + nxagentKeyboard = strdup(argv[i]); + } + if (nxagentKeyboard == NULL) { FatalError("malloc failed"); diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c index 90a4262d7..c6756b1cc 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c @@ -553,14 +553,6 @@ XkbError: fprintf(stderr, "%s: nxagentKeyboard is [%s].\n", __func__, validateString(nxagentKeyboard)); #endif - if (nxagentX2go && nxagentKeyboard && (strcmp(nxagentKeyboard, "null/null") == 0)) - { - #ifdef TEST - fprintf(stderr, "%s: changing nxagentKeyboard from [null/null] to [clone].\n", __func__); - #endif - SAFE_free(nxagentKeyboard); - nxagentKeyboard = strdup("clone"); - } /* from nxagent changelog: diff --git a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c index e29fc3200..69a3011f9 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c @@ -458,15 +458,6 @@ Bool nxagentReconnectSession(void) nxagentProcessOptions(nxagentOptionsFilenameOrString); - if (nxagentKeyboard && (strcmp(nxagentKeyboard, "null/null") == 0)) - { - #ifdef TEST - fprintf(stderr, "nxagentReconnect: changing nxagentKeyboard from [null/null] to [clone].\n"); - #endif - - SAFE_free(nxagentKeyboard); - nxagentKeyboard = strdup("clone"); - } if (nxagentReconnectDisplay(reconnectLossyLevel[DISPLAY_STEP]) == 0) { -- cgit v1.2.3 From 6f390f8207689b1b807048ef39ca956978472e32 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Fri, 3 Jan 2020 01:01:24 +0100 Subject: nxagent: remove additional keyboard handling from Reconnect.c At reconnect we check if a keyboard reset is required. If so, we are calling the corresponding code from Keyboard.c. No explicit keyboard code in Reconnect.c required. fixes ArcticaProject/nx-libs#886 --- nx-X11/programs/Xserver/hw/nxagent/Keyboard.c | 13 +++++++-- nx-X11/programs/Xserver/hw/nxagent/Reconnect.c | 39 +++++++++++++++----------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c index c6756b1cc..a79052080 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c @@ -649,7 +649,6 @@ XkbError: __func__, nxagentRemoteRules, nxagentRemoteModel, nxagentRemoteLayout, nxagentRemoteVariant, nxagentRemoteOptions); #endif - /* Only setup keycode conversion if we are NOT in clone mode */ if (nxagentKeyboard && (strcmp(nxagentKeyboard, "clone") == 0)) { SAFE_free(rules); rules = strdup(nxagentRemoteRules); @@ -657,7 +656,15 @@ XkbError: SAFE_free(layout); layout = strdup(nxagentRemoteLayout); SAFE_free(variant); variant = strdup(nxagentRemoteVariant); SAFE_free(options); options = strdup(nxagentRemoteOptions); - /* + + /* Only setup keycode conversion if we are NOT in clone mode */ + #ifdef DEBUG + fprintf(stderr, "%s: nxagentKeyboard is [%s] - disabling keycode conversion.\n", __func__, + nxagentKeyboard); + #endif + nxagentChangeOption(KeycodeConversion, KeycodeConversionOff); + + /* * when cloning we do not want X2Go to set the keyboard * via a keyboard file generated by nxagent. The defined * method for switching that off is the creation of a dir @@ -670,7 +677,6 @@ XkbError: } else { - nxagentKeycodeConversionSetup(); /* * Keyboard has always been tricky with nxagent. For that * reason X2Go offers "auto" keyboard configuration. You can @@ -688,6 +694,7 @@ XkbError: nxagentWriteKeyboardFile(nxagentRemoteRules, nxagentRemoteModel, nxagentRemoteLayout, nxagentRemoteVariant, nxagentRemoteOptions); } } + nxagentKeycodeConversionSetup(); } #ifdef DEBUG else diff --git a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c index 69a3011f9..5ff0c6506 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c @@ -599,29 +599,34 @@ Bool nxagentReconnectSession(void) nxagentOldKeyboard = NULL; } - if (nxagentOption(ResetKeyboardAtResume) == 1 && - (nxagentKeyboard == NULL || nxagentOldKeyboard == NULL || - strcmp(nxagentKeyboard, nxagentOldKeyboard) != 0 || - strcmp(nxagentKeyboard, "query") == 0 || - strcmp(nxagentKeyboard, "clone") == 0)) + /* Reset the keyboard only if we detect any changes. */ + if (nxagentOption(ResetKeyboardAtResume) == 1) { - if (nxagentResetKeyboard() == 0) + if (nxagentKeyboard == NULL || nxagentOldKeyboard == NULL || + strcmp(nxagentKeyboard, nxagentOldKeyboard) != 0 || + strcmp(nxagentKeyboard, "query") == 0 || + strcmp(nxagentKeyboard, "clone") == 0) { - #ifdef WARNING - if (nxagentVerbose == 1) + if (nxagentResetKeyboard() == 0) { - fprintf(stderr, "nxagentReconnectSession: Failed to reset keyboard device.\n"); - } - #endif + #ifdef WARNING + if (nxagentVerbose == 1) + { + fprintf(stderr, "%s: Failed to reset keyboard device.\n", __func__); + } + #endif - failedStep = WINDOW_STEP; + failedStep = WINDOW_STEP; - goto nxagentReconnectError; + goto nxagentReconnectError; + } + } + else + { + #ifdef DEBUG + fprintf(stderr, "%s: keyboard unchanged - skipping keyboard reset.\n", __func__); + #endif } - } - else - { - nxagentKeycodeConversionSetup(); } nxagentXkbState.Initialized = 0; -- cgit v1.2.3