|
| 1 | +// Copyright 2019-2026 CERN and copyright holders of ALICE O2. |
| 2 | +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. |
| 3 | +// All rights not expressly granted are reserved. |
| 4 | +// |
| 5 | +// This software is distributed under the terms of the GNU General Public |
| 6 | +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". |
| 7 | +// |
| 8 | +// In applying this license CERN does not waive the privileges and immunities |
| 9 | +// granted to it by virtue of its status as an Intergovernmental Organization |
| 10 | +// or submit itself to any jurisdiction. |
| 11 | + |
| 12 | +/// \file GPUDisplayFrontendKeyTranslation.cxx |
| 13 | +/// \author David Rohr |
| 14 | + |
| 15 | +#include "GPUDisplayFrontend.h" |
| 16 | +#include <utility> |
| 17 | + |
| 18 | +using namespace o2::gpu; |
| 19 | + |
| 20 | +static constexpr uint64_t encodeSequence(const char* s) // As encoded by the console: first character in the lowest byte |
| 21 | +{ |
| 22 | + uint64_t retVal = 0; |
| 23 | + for (uint32_t i = 0; i < 8 && s[i]; i++) { |
| 24 | + retVal |= (uint64_t)(uint8_t)s[i] << (8 * i); |
| 25 | + } |
| 26 | + return retVal; |
| 27 | +} |
| 28 | + |
| 29 | +int32_t GPUDisplayFrontend::translateExternalKey(uint32_t translationMode, uint64_t extendedKey) |
| 30 | +{ |
| 31 | + if (translationMode == 1) { |
| 32 | + // Console escape sequences, characters after the ESC: VT100 / xterm, cursor keys also in application mode (O instead of [), F1 to F5 also of rxvt ([11~) and the Linux console ([[A), with SHIFT of xterm (;2) and rxvt ([a, $) |
| 33 | + static constexpr std::pair<const char*, int32_t> sequences[] = { |
| 34 | + {"[A", KEY_UP}, |
| 35 | + {"[B", KEY_DOWN}, |
| 36 | + {"[C", KEY_RIGHT}, |
| 37 | + {"[D", KEY_LEFT}, |
| 38 | + {"OA", KEY_UP}, |
| 39 | + {"OB", KEY_DOWN}, |
| 40 | + {"OC", KEY_RIGHT}, |
| 41 | + {"OD", KEY_LEFT}, |
| 42 | + {"[H", KEY_HOME}, |
| 43 | + {"[F", KEY_END}, |
| 44 | + {"OH", KEY_HOME}, |
| 45 | + {"OF", KEY_END}, |
| 46 | + {"[1~", KEY_HOME}, |
| 47 | + {"[4~", KEY_END}, |
| 48 | + {"[7~", KEY_HOME}, |
| 49 | + {"[8~", KEY_END}, |
| 50 | + {"[2~", KEY_INSERT}, |
| 51 | + {"[5~", KEY_PAGEUP}, |
| 52 | + {"[6~", KEY_PAGEDOWN}, |
| 53 | + {"OP", KEY_F1}, |
| 54 | + {"OQ", KEY_F2}, |
| 55 | + {"OR", KEY_F3}, |
| 56 | + {"OS", KEY_F4}, |
| 57 | + {"[11~", KEY_F1}, |
| 58 | + {"[12~", KEY_F2}, |
| 59 | + {"[13~", KEY_F3}, |
| 60 | + {"[14~", KEY_F4}, |
| 61 | + {"[[A", KEY_F1}, |
| 62 | + {"[[B", KEY_F2}, |
| 63 | + {"[[C", KEY_F3}, |
| 64 | + {"[[D", KEY_F4}, |
| 65 | + {"[[E", KEY_F5}, |
| 66 | + {"[15~", KEY_F5}, |
| 67 | + {"[17~", KEY_F6}, |
| 68 | + {"[18~", KEY_F7}, |
| 69 | + {"[19~", KEY_F8}, |
| 70 | + {"[20~", KEY_F9}, |
| 71 | + {"[21~", KEY_F10}, |
| 72 | + {"[23~", KEY_F11}, |
| 73 | + {"[24~", KEY_F12}, |
| 74 | + {"[1;2A", KEY_UP + SPECIAL_KEYS_SHIFTED}, |
| 75 | + {"[1;2B", KEY_DOWN + SPECIAL_KEYS_SHIFTED}, |
| 76 | + {"[1;2C", KEY_RIGHT + SPECIAL_KEYS_SHIFTED}, |
| 77 | + {"[1;2D", KEY_LEFT + SPECIAL_KEYS_SHIFTED}, |
| 78 | + {"[1;2H", KEY_HOME + SPECIAL_KEYS_SHIFTED}, |
| 79 | + {"[1;2F", KEY_END + SPECIAL_KEYS_SHIFTED}, |
| 80 | + {"[2;2~", KEY_INSERT + SPECIAL_KEYS_SHIFTED}, |
| 81 | + {"[5;2~", KEY_PAGEUP + SPECIAL_KEYS_SHIFTED}, |
| 82 | + {"[6;2~", KEY_PAGEDOWN + SPECIAL_KEYS_SHIFTED}, |
| 83 | + {"[a", KEY_UP + SPECIAL_KEYS_SHIFTED}, |
| 84 | + {"[b", KEY_DOWN + SPECIAL_KEYS_SHIFTED}, |
| 85 | + {"[c", KEY_RIGHT + SPECIAL_KEYS_SHIFTED}, |
| 86 | + {"[d", KEY_LEFT + SPECIAL_KEYS_SHIFTED}, |
| 87 | + {"[7$", KEY_HOME + SPECIAL_KEYS_SHIFTED}, |
| 88 | + {"[8$", KEY_END + SPECIAL_KEYS_SHIFTED}, |
| 89 | + {"[2$", KEY_INSERT + SPECIAL_KEYS_SHIFTED}, |
| 90 | + {"[5$", KEY_PAGEUP + SPECIAL_KEYS_SHIFTED}, |
| 91 | + {"[6$", KEY_PAGEDOWN + SPECIAL_KEYS_SHIFTED}, |
| 92 | + {"[1;2P", KEY_F1 + SPECIAL_KEYS_SHIFTED}, |
| 93 | + {"[1;2Q", KEY_F2 + SPECIAL_KEYS_SHIFTED}, |
| 94 | + {"[1;2R", KEY_F3 + SPECIAL_KEYS_SHIFTED}, |
| 95 | + {"[1;2S", KEY_F4 + SPECIAL_KEYS_SHIFTED}, |
| 96 | + {"[15;2~", KEY_F5 + SPECIAL_KEYS_SHIFTED}, |
| 97 | + {"[17;2~", KEY_F6 + SPECIAL_KEYS_SHIFTED}, |
| 98 | + {"[18;2~", KEY_F7 + SPECIAL_KEYS_SHIFTED}, |
| 99 | + {"[19;2~", KEY_F8 + SPECIAL_KEYS_SHIFTED}, |
| 100 | + {"[20;2~", KEY_F9 + SPECIAL_KEYS_SHIFTED}, |
| 101 | + {"[21;2~", KEY_F10 + SPECIAL_KEYS_SHIFTED}, |
| 102 | + {"[23;2~", KEY_F11 + SPECIAL_KEYS_SHIFTED}, |
| 103 | + {"[24;2~", KEY_F12 + SPECIAL_KEYS_SHIFTED}, |
| 104 | + }; |
| 105 | + for (const auto& [sequence, key] : sequences) { |
| 106 | + if (encodeSequence(sequence) == extendedKey) { |
| 107 | + return key; |
| 108 | + } |
| 109 | + } |
| 110 | + } |
| 111 | + return -1; |
| 112 | +} |
0 commit comments