@@ -1443,13 +1443,13 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed
14431443 }
14441444
14451445 /* Track modifiers */
1446- if (keysym == 0xFFE3 || keysym == 0xFFE4 )
1446+ if (keysym == GUAC_TERMINAL_KEY_CTRL_L || keysym == GUAC_TERMINAL_KEY_CTRL_R )
14471447 term -> mod_ctrl = pressed ;
1448- else if (keysym == 0xFFE7 || keysym == 0xFFE8 )
1448+ else if (keysym == GUAC_TERMINAL_KEY_META_L || keysym == GUAC_TERMINAL_KEY_META_R )
14491449 term -> mod_meta = pressed ;
1450- else if (keysym == 0xFFE9 || keysym == 0xFFEA )
1450+ else if (keysym == GUAC_TERMINAL_KEY_ALT_L || keysym == GUAC_TERMINAL_KEY_ALT_R )
14511451 term -> mod_alt = pressed ;
1452- else if (keysym == 0xFFE1 || keysym == 0xFFE2 )
1452+ else if (keysym == GUAC_TERMINAL_KEY_SHIFT_L || keysym == GUAC_TERMINAL_KEY_SHIFT_R )
14531453 term -> mod_shift = pressed ;
14541454
14551455 /* If key pressed */
@@ -1472,37 +1472,37 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed
14721472 if (term -> mod_shift ) {
14731473
14741474 /* Home */
1475- if (keysym == 0xFF50 || keysym == 0xFF95 ) {
1475+ if (keysym == GUAC_TERMINAL_KEY_HOME || keysym == GUAC_TERMINAL_KEY_KP_HOME ) {
14761476 guac_terminal_scroll_display_up (term , term -> max_scrollback );
14771477 return 0 ;
14781478 }
14791479
14801480 /* End */
1481- if (keysym == 0xFF57 || keysym == 0xFF9C ) {
1481+ if (keysym == GUAC_TERMINAL_KEY_END || keysym == GUAC_TERMINAL_KEY_KP_END ) {
14821482 guac_terminal_scroll_display_down (term , term -> max_scrollback );
14831483 return 0 ;
14841484 }
14851485
14861486 /* Page up */
1487- if (keysym == 0xFF55 ) {
1487+ if (keysym == GUAC_TERMINAL_KEY_PAGEUP || keysym == GUAC_TERMINAL_KEY_KP_PAGEUP ) {
14881488 guac_terminal_scroll_display_up (term , term -> term_height );
14891489 return 0 ;
14901490 }
14911491
14921492 /* Page down */
1493- if (keysym == 0xFF56 ) {
1493+ if (keysym == GUAC_TERMINAL_KEY_PAGEDOWN || keysym == GUAC_TERMINAL_KEY_KP_PAGEDOWN ) {
14941494 guac_terminal_scroll_display_down (term , term -> term_height );
14951495 return 0 ;
14961496 }
14971497
14981498 /* Up */
1499- if (keysym == 0xFF52 || keysym == 0xFF97 ) {
1499+ if (keysym == GUAC_TERMINAL_KEY_UP || keysym == GUAC_TERMINAL_KEY_KP_UP ) {
15001500 guac_terminal_scroll_display_up (term , 1 );
15011501 return 0 ;
15021502 }
15031503
15041504 /* Down */
1505- if (keysym == 0xFF54 || keysym == 0xFF99 ) {
1505+ if (keysym == GUAC_TERMINAL_KEY_DOWN || keysym == GUAC_TERMINAL_KEY_KP_DOWN ) {
15061506 guac_terminal_scroll_display_down (term , 1 );
15071507 return 0 ;
15081508 }
@@ -1515,7 +1515,7 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed
15151515
15161516 /* If alt being held, also send escape character */
15171517 if (term -> mod_alt )
1518- guac_terminal_send_string (term , "\x1B" );
1518+ guac_terminal_send_string (term , GUAC_TERMINAL_ASCII_ESCAPE );
15191519
15201520 /* Translate Ctrl+letter to control code */
15211521 if (term -> mod_ctrl ) {
@@ -1543,20 +1543,20 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed
15431543 data = (char ) (keysym - '3' + 0x1B );
15441544
15451545 /* CTRL+Left: return to previous word */
1546- else if (keysym == 0xFF51 || keysym == 0xFF96 )
1547- return guac_terminal_send_string (term , "\033[1;5D" );
1546+ else if (keysym == GUAC_TERMINAL_KEY_LEFT || keysym == GUAC_TERMINAL_KEY_KP_LEFT )
1547+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_PREV_WORD );
15481548
15491549 /* CTRL+Right: go to next word */
1550- else if (keysym == 0xFF53 || keysym == 0xFF98 )
1551- return guac_terminal_send_string (term , "\033[1;5C" );
1550+ else if (keysym == GUAC_TERMINAL_KEY_RIGHT || keysym == GUAC_TERMINAL_KEY_KP_RIGHT )
1551+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_NEXT_WORD );
15521552
15531553 /* CTRL+Backspace: remove word (map to CTRL+w) */
1554- else if (keysym == 0xFF08 )
1554+ else if (keysym == GUAC_TERMINAL_KEY_BACKSPACE )
15551555 data = (char ) 23 ;
15561556
15571557 /* CTRL+Supr: remove word to right */
1558- else if (keysym == 0xFFFF )
1559- return guac_terminal_send_string (term , "\033D" );
1558+ else if (keysym == GUAC_TERMINAL_KEY_DELETE || keysym == GUAC_TERMINAL_KEY_KP_DELETE )
1559+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_DELETE_WORD );
15601560
15611561 /* Otherwise ignore */
15621562 else
@@ -1627,36 +1627,82 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed
16271627 else {
16281628
16291629 /* Backspace can vary based on configuration of terminal by client. */
1630- if (keysym == 0xFF08 ) {
1630+ if (keysym == GUAC_TERMINAL_KEY_BACKSPACE ) {
16311631 char backspace_str [] = { term -> backspace , '\0' };
16321632 return guac_terminal_send_string (term , backspace_str );
16331633 }
1634- if (keysym == 0xFF09 || keysym == 0xFF89 ) return guac_terminal_send_string (term , "\x09" ); /* Tab */
1635- if (keysym == 0xFF0D || keysym == 0xFF8D ) return guac_terminal_send_string (term , "\x0D" ); /* Enter */
1636- if (keysym == 0xFF1B ) return guac_terminal_send_string (term , "\x1B" ); /* Esc */
16371634
1638- if (keysym == 0xFF50 || keysym == 0xFF95 ) return guac_terminal_send_string (term , "\x1B[1~" ); /* Home */
1635+ /* Tab */
1636+ if (keysym == GUAC_TERMINAL_KEY_TAB || keysym == GUAC_TERMINAL_KEY_KP_TAB )
1637+ return guac_terminal_send_string (term , GUAC_TERMINAL_ASCII_TAB );
1638+
1639+ /* Enter */
1640+ if (keysym == GUAC_TERMINAL_KEY_ENTER || keysym == GUAC_TERMINAL_KEY_KP_ENTER )
1641+ return guac_terminal_send_string (term , GUAC_TERMINAL_ASCII_CR );
1642+
1643+ /* Esc */
1644+ if (keysym == GUAC_TERMINAL_KEY_ESCAPE )
1645+ return guac_terminal_send_string (term , GUAC_TERMINAL_ASCII_ESCAPE );
1646+
1647+ /* Home */
1648+ if (keysym == GUAC_TERMINAL_KEY_HOME || keysym == GUAC_TERMINAL_KEY_KP_HOME )
1649+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_HOME );
16391650
16401651 /* Arrow keys w/ application cursor */
16411652 if (term -> application_cursor_keys ) {
1642- if (keysym == 0xFF51 || keysym == 0xFF96 ) return guac_terminal_send_string (term , "\x1BOD" ); /* Left */
1643- if (keysym == 0xFF52 || keysym == 0xFF97 ) return guac_terminal_send_string (term , "\x1BOA" ); /* Up */
1644- if (keysym == 0xFF53 || keysym == 0xFF98 ) return guac_terminal_send_string (term , "\x1BOC" ); /* Right */
1645- if (keysym == 0xFF54 || keysym == 0xFF99 ) return guac_terminal_send_string (term , "\x1BOB" ); /* Down */
1653+
1654+ /* Left */
1655+ if (keysym == GUAC_TERMINAL_KEY_LEFT || keysym == GUAC_TERMINAL_KEY_KP_LEFT )
1656+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_APP_CURSOR_LEFT );
1657+
1658+ /* Up */
1659+ if (keysym == GUAC_TERMINAL_KEY_UP || keysym == GUAC_TERMINAL_KEY_KP_UP )
1660+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_APP_CURSOR_UP );
1661+
1662+ /* Right */
1663+ if (keysym == GUAC_TERMINAL_KEY_RIGHT || keysym == GUAC_TERMINAL_KEY_KP_RIGHT )
1664+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_APP_CURSOR_RIGHT );
1665+
1666+ /* Down */
1667+ if (keysym == GUAC_TERMINAL_KEY_DOWN || keysym == GUAC_TERMINAL_KEY_KP_DOWN )
1668+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_APP_CURSOR_DOWN );
16461669 }
16471670 else {
1648- if (keysym == 0xFF51 || keysym == 0xFF96 ) return guac_terminal_send_string (term , "\x1B[D" ); /* Left */
1649- if (keysym == 0xFF52 || keysym == 0xFF97 ) return guac_terminal_send_string (term , "\x1B[A" ); /* Up */
1650- if (keysym == 0xFF53 || keysym == 0xFF98 ) return guac_terminal_send_string (term , "\x1B[C" ); /* Right */
1651- if (keysym == 0xFF54 || keysym == 0xFF99 ) return guac_terminal_send_string (term , "\x1B[B" ); /* Down */
1671+
1672+ /* Left */
1673+ if (keysym == GUAC_TERMINAL_KEY_LEFT || keysym == GUAC_TERMINAL_KEY_KP_LEFT )
1674+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_CURSOR_LEFT );
1675+
1676+ /* Up */
1677+ if (keysym == GUAC_TERMINAL_KEY_UP || keysym == GUAC_TERMINAL_KEY_KP_UP )
1678+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_CURSOR_UP );
1679+
1680+ /* Right */
1681+ if (keysym == GUAC_TERMINAL_KEY_RIGHT || keysym == GUAC_TERMINAL_KEY_KP_RIGHT )
1682+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_CURSOR_RIGHT );
1683+
1684+ /* Down */
1685+ if (keysym == GUAC_TERMINAL_KEY_DOWN || keysym == GUAC_TERMINAL_KEY_KP_DOWN )
1686+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_CURSOR_DOWN );
16521687 }
16531688
1654- if ( keysym == 0xFF55 || keysym == 0xFF9A ) return guac_terminal_send_string ( term , "\x1B[5~" ); /* Page up */
1655- if (keysym == 0xFF56 || keysym == 0xFF9B ) return guac_terminal_send_string ( term , "\x1B[6~" ); /* Page down */
1656- if ( keysym == 0xFF57 || keysym == 0xFF9C ) return guac_terminal_send_string (term , "\x1B[4~" ); /* End */
1689+ /* Page up */
1690+ if (keysym == GUAC_TERMINAL_KEY_PAGEUP || keysym == GUAC_TERMINAL_KEY_KP_PAGEUP )
1691+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_PAGEUP );
16571692
1658- if (keysym == 0xFF63 || keysym == 0xFF9E ) return guac_terminal_send_string (term , "\x1B[2~" ); /* Insert */
1693+ /* Page down */
1694+ if (keysym == GUAC_TERMINAL_KEY_PAGEDOWN || keysym == GUAC_TERMINAL_KEY_KP_PAGEDOWN )
1695+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_PAGEDOWN );
16591696
1697+ /* End */
1698+ if (keysym == GUAC_TERMINAL_KEY_END || keysym == GUAC_TERMINAL_KEY_KP_END )
1699+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_END );
1700+
1701+ /* Insert */
1702+ if (keysym == GUAC_TERMINAL_KEY_INSERT || keysym == GUAC_TERMINAL_KEY_KP_INSERT )
1703+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_INSERT );
1704+
1705+ /* F1 */
16601706 if (term -> func_keys_and_keypad == GUAC_TERMINAL_FUNC_KEYS_AND_KEYPAD_VT100 ) {
16611707 /* https://vt100.net/docs/vt100-ug/chapter3.html */
16621708 if (keysym == 0xFFBE || keysym == 0xFF91 ) return guac_terminal_send_string (term , "\x1BOP" ); /* F1 */
@@ -1667,22 +1713,57 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed
16671713 if (keysym == 0xFFC2 ) return guac_terminal_send_string (term , "\x1B[15~" ); /* F5 */
16681714 }
16691715 else {
1670- if (keysym == 0xFFBE || keysym == 0xFF91 ) return guac_terminal_send_string (term , "\x1B[[A" ); /* F1 */
1671- if (keysym == 0xFFBF || keysym == 0xFF92 ) return guac_terminal_send_string (term , "\x1B[[B" ); /* F2 */
1672- if (keysym == 0xFFC0 || keysym == 0xFF93 ) return guac_terminal_send_string (term , "\x1B[[C" ); /* F3 */
1673- if (keysym == 0xFFC1 || keysym == 0xFF94 ) return guac_terminal_send_string (term , "\x1B[[D" ); /* F4 */
1674- if (keysym == 0xFFC2 ) return guac_terminal_send_string (term , "\x1B[[E" ); /* F5 */
1716+ if (keysym == GUAC_TERMINAL_KEY_F1 || keysym == GUAC_TERMINAL_KEY_KP_F1 )
1717+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F1 );
1718+
1719+ /* F2 */
1720+ if (keysym == GUAC_TERMINAL_KEY_F2 || keysym == GUAC_TERMINAL_KEY_KP_F2 )
1721+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F2 );
1722+
1723+ /* F3 */
1724+ if (keysym == GUAC_TERMINAL_KEY_F3 || keysym == GUAC_TERMINAL_KEY_KP_F3 )
1725+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F3 );
1726+
1727+ /* F4 */
1728+ if (keysym == GUAC_TERMINAL_KEY_F4 || keysym == GUAC_TERMINAL_KEY_KP_F4 )
1729+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F4 );
1730+
1731+ /* F5 */
1732+ if (keysym == GUAC_TERMINAL_KEY_F5 )
1733+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F5 );
1734+
16751735 }
1736+ /* F6 */
1737+ if (keysym == GUAC_TERMINAL_KEY_F6 )
1738+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F6 );
1739+
1740+ /* F7 */
1741+ if (keysym == GUAC_TERMINAL_KEY_F7 )
1742+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F7 );
1743+
1744+ /* F8 */
1745+ if (keysym == GUAC_TERMINAL_KEY_F8 )
1746+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F8 );
1747+
1748+ /* F9 */
1749+ if (keysym == GUAC_TERMINAL_KEY_F9 )
1750+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F9 );
1751+
1752+ /* F10 */
1753+ if (keysym == GUAC_TERMINAL_KEY_F10 )
1754+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F10 );
1755+
1756+ /* F11 */
1757+ if (keysym == GUAC_TERMINAL_KEY_F11 )
1758+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F11 );
16761759
1677- if (keysym == 0xFFC3 ) return guac_terminal_send_string (term , "\x1B[17~" ); /* F6 */
1678- if (keysym == 0xFFC4 ) return guac_terminal_send_string (term , "\x1B[18~" ); /* F7 */
1679- if (keysym == 0xFFC5 ) return guac_terminal_send_string (term , "\x1B[19~" ); /* F8 */
1680- if (keysym == 0xFFC6 ) return guac_terminal_send_string (term , "\x1B[20~" ); /* F9 */
1681- if (keysym == 0xFFC7 ) return guac_terminal_send_string (term , "\x1B[21~" ); /* F10 */
1682- if (keysym == 0xFFC8 ) return guac_terminal_send_string (term , "\x1B[22~" ); /* F11 */
1683- if (keysym == 0xFFC9 ) return guac_terminal_send_string (term , "\x1B[23~" ); /* F12 */
1760+ /* F12 */
1761+ if (keysym == GUAC_TERMINAL_KEY_F12 )
1762+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_F12 );
16841763
1685- if (keysym == 0xFFFF || keysym == 0xFF9F ) return guac_terminal_send_string (term , "\x1B[3~" ); /* Delete */
1764+ /* Delete */
1765+ if (keysym == GUAC_TERMINAL_KEY_DELETE || keysym == GUAC_TERMINAL_KEY_KP_DELETE )
1766+ return guac_terminal_send_string (term , GUAC_TERMINAL_ESC_SEQ_DELETE );
16861767
16871768 /* Ignore unknown keys */
16881769 guac_client_log (term -> client , GUAC_LOG_DEBUG ,
0 commit comments