terminal: remove built-in keyboard layout handling

Fixes #2757
This commit is contained in:
Norman Feske 2018-04-11 14:40:21 +02:00
parent 8bcf540915
commit 0011dd1623
14 changed files with 97 additions and 439 deletions

View File

@ -1,5 +1,5 @@
content: drivers.config fb_drv.config input_filter.config en_us.chargen \
numlock_remap.config
special.chargen numlock_remap.config
drivers.config numlock_remap.config:
cp $(REP_DIR)/recipes/raw/drivers_managed-pc/$@ $@
@ -7,5 +7,5 @@ drivers.config numlock_remap.config:
fb_drv.config input_filter.config:
cp $(GENODE_DIR)/repos/os/recipes/raw/drivers_interactive-pc/$@ $@
en_us.chargen:
en_us.chargen special.chargen:
cp $(GENODE_DIR)/repos/os/src/server/input_filter/$@ $@

View File

@ -32,6 +32,7 @@
</mod3>
<repeat delay_ms="230" rate_ms="90"/>
<include rom="en_us.chargen"/>
<include rom="special.chargen"/>
</chargen>
</output>
</config>

View File

@ -110,6 +110,7 @@ install_config {
<rom name="input_filter.config"/>
<rom name="en_us.chargen"/>
<rom name="de.chargen"/>
<rom name="special.chargen"/>
<rom name="numlock_remap.config"/>
<rom name="vimrc"/>
<rom name="wlan.config"/>
@ -467,11 +468,9 @@ file copy -force [genode_dir]/repos/gems/run/sculpt/machine.vbox [run_dir]/genod
file copy -force [genode_dir]/repos/gems/recipes/raw/drivers_managed-pc/drivers.config \
[run_dir]/genode/drivers.config
file copy -force [genode_dir]/repos/os/src/server/input_filter/en_us.chargen \
[run_dir]/genode/en_us.chargen
file copy -force [genode_dir]/repos/os/src/server/input_filter/de.chargen \
[run_dir]/genode/de.chargen
foreach file { en_us.chargen de.chargen special.chargen } {
file copy -force [genode_dir]/repos/os/src/server/input_filter/$file \
[run_dir]/genode/$file }
file copy -force [genode_dir]/repos/gems/recipes/raw/drivers_managed-pc/input_filter.config \
[run_dir]/genode/input_filter.config

View File

@ -26,8 +26,6 @@
/* terminal includes */
#include <terminal/decoder.h>
#include <terminal/types.h>
#include <terminal/scancode_tracker.h>
#include <terminal/keymaps.h>
/* local includes */
#include "text_screen_surface.h"
@ -59,10 +57,6 @@ struct Terminal::Main : Character_consumer
Reconstructible<Font_family> _font_family { *_font };
unsigned char *_keymap = Terminal::usenglish_keymap;
unsigned char *_shift = Terminal::usenglish_shift;
unsigned char *_altgr = nullptr;
Color_palette _color_palette { };
void _handle_config();
@ -130,29 +124,11 @@ struct Terminal::Main : Character_consumer
/* create root interface for service */
Root_component _root { _env, _heap, _read_buffer, *this };
/*
* builtin keyboard-layout handling
*
* \deprecated The keyboard layout should be handled by the input-filter
* component.
*/
Constructible<Scancode_tracker> _scancode_tracker { };
/* state needed for key-repeat handling */
unsigned const _repeat_delay = 250;
unsigned const _repeat_rate = 25;
unsigned _repeat_next = 0;
void _handle_input();
Signal_handler<Main> _input_handler {
_env.ep(), *this, &Main::_handle_input };
void _handle_key_repeat(Duration);
Timer::One_shot_timeout<Main> _key_repeat_timeout {
_timer, *this, &Main::_handle_key_repeat };
Main(Env &env) : _env(env)
{
_handle_config();
@ -209,32 +185,6 @@ void Terminal::Main::_handle_config()
_terminal_size = _text_screen_surface->size();
_root.notify_resized(_terminal_size);
_schedule_flush();
/*
* Read keyboard layout from config file
*/
_keymap = Terminal::usenglish_keymap;
_shift = Terminal::usenglish_shift;
_altgr = nullptr;
if (config.has_sub_node("keyboard")) {
if (config.sub_node("keyboard").attribute("layout").has_value("de")) {
_keymap = Terminal::german_keymap;
_shift = Terminal::german_shift;
_altgr = Terminal::german_altgr;
}
if (config.sub_node("keyboard").attribute("layout").has_value("none")) {
_keymap = nullptr;
_shift = nullptr;
_altgr = nullptr;
}
}
if (!_scancode_tracker.constructed())
_scancode_tracker.construct(_keymap, _shift, _altgr, Terminal::control);
}
@ -242,53 +192,61 @@ void Terminal::Main::_handle_input()
{
_input.for_each_event([&] (Input::Event const &event) {
if (event.type() == Input::Event::CHARACTER) {
Input::Event::Utf8 const utf8 = event.utf8();
_read_buffer.add(utf8.b0);
if (utf8.b1) _read_buffer.add(utf8.b1);
if (utf8.b2) _read_buffer.add(utf8.b2);
if (utf8.b3) _read_buffer.add(utf8.b3);
if (event.type() == Input::Event::CHARACTER) {
Input::Event::Utf8 const utf8 = event.utf8();
char const sequence[] { (char)utf8.b0, (char)utf8.b1,
(char)utf8.b2, (char)utf8.b3, 0 };
/* function-key unicodes */
enum {
CODEPOINT_UP = 0xf700, CODEPOINT_DOWN = 0xf701,
CODEPOINT_LEFT = 0xf702, CODEPOINT_RIGHT = 0xf703,
CODEPOINT_F1 = 0xf704, CODEPOINT_F2 = 0xf705,
CODEPOINT_F3 = 0xf706, CODEPOINT_F4 = 0xf707,
CODEPOINT_F5 = 0xf708, CODEPOINT_F6 = 0xf709,
CODEPOINT_F7 = 0xf70a, CODEPOINT_F8 = 0xf70b,
CODEPOINT_F9 = 0xf70c, CODEPOINT_F10 = 0xf70d,
CODEPOINT_F11 = 0xf70e, CODEPOINT_F12 = 0xf70f,
CODEPOINT_HOME = 0xf729, CODEPOINT_INSERT = 0xf727,
CODEPOINT_DELETE = 0xf728, CODEPOINT_END = 0xf72b,
CODEPOINT_PAGEUP = 0xf72c, CODEPOINT_PAGEDOWN = 0xf72d,
};
Codepoint const codepoint = Utf8_ptr(sequence).codepoint();
char const *special_sequence = nullptr;
switch (codepoint.value) {
case CODEPOINT_UP: special_sequence = "\EOA"; break;
case CODEPOINT_DOWN: special_sequence = "\EOB"; break;
case CODEPOINT_LEFT: special_sequence = "\EOD"; break;
case CODEPOINT_RIGHT: special_sequence = "\EOC"; break;
case CODEPOINT_F1: special_sequence = "\EOP"; break;
case CODEPOINT_F2: special_sequence = "\EOQ"; break;
case CODEPOINT_F3: special_sequence = "\EOR"; break;
case CODEPOINT_F4: special_sequence = "\EOS"; break;
case CODEPOINT_F5: special_sequence = "\E[15~"; break;
case CODEPOINT_F6: special_sequence = "\E[17~"; break;
case CODEPOINT_F7: special_sequence = "\E[18~"; break;
case CODEPOINT_F8: special_sequence = "\E[19~"; break;
case CODEPOINT_F9: special_sequence = "\E[20~"; break;
case CODEPOINT_F10: special_sequence = "\E[21~"; break;
case CODEPOINT_F11: special_sequence = "\E[23~"; break;
case CODEPOINT_F12: special_sequence = "\E[24~"; break;
case CODEPOINT_HOME: special_sequence = "\E[1~"; break;
case CODEPOINT_INSERT: special_sequence = "\E[2~"; break;
case CODEPOINT_DELETE: special_sequence = "\E[3~"; break;
case CODEPOINT_END: special_sequence = "\E[4~"; break;
case CODEPOINT_PAGEUP: special_sequence = "\E[5~"; break;
case CODEPOINT_PAGEDOWN: special_sequence = "\E[6~"; break;
};
if (special_sequence)
_read_buffer.add(special_sequence);
else
_read_buffer.add(sequence);
}
/* apply the terminal's built-in character map if configured */
if (!_scancode_tracker.constructed())
return;
bool press = (event.type() == Input::Event::PRESS ? true : false);
bool release = (event.type() == Input::Event::RELEASE ? true : false);
int keycode = event.code();
if (press || release)
_scancode_tracker->submit(keycode, press);
if (press) {
_scancode_tracker->emit_current_character(_read_buffer);
/* setup first key repeat */
_repeat_next = _repeat_delay;
}
if (release)
_repeat_next = 0;
});
if (_repeat_next)
_key_repeat_timeout.schedule(Microseconds{1000*_repeat_next});
}
void Terminal::Main::_handle_key_repeat(Duration)
{
if (_repeat_next) {
/* repeat current character or sequence */
if (_scancode_tracker.constructed())
_scancode_tracker->emit_current_character(_read_buffer);
_repeat_next = _repeat_rate;
}
_handle_input();
}

View File

@ -18,6 +18,7 @@
#include <util/utf8.h>
#include <root/component.h>
#include <terminal_session/terminal_session.h>
#include <terminal/read_buffer.h>
/* local includes */
#include "types.h"

View File

@ -1,127 +0,0 @@
/*
* \brief Key mappings of scancodes to characters
* \author Norman Feske
* \date 2011-06-06
*/
/*
* Copyright (C) 2011-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _TERMINAL__KEYMAPS_H_
#define _TERMINAL__KEYMAPS_H_
namespace Terminal {
enum {
BS = 8,
ESC = 27,
TAB = 9,
LF = 10,
UE = 252, /* 'ü' */
AE = 228, /* 'ä' */
OE = 246, /* 'ö' */
PAR = 167, /* '§' */
DEG = 176, /* '°' */
SS = 223, /* 'ß' */
};
static unsigned char usenglish_keymap[128] = {
0 ,ESC,'1','2','3','4','5','6','7','8','9','0','-','=', BS,TAB,
'q','w','e','r','t','y','u','i','o','p','[',']', LF, 0 ,'a','s',
'd','f','g','h','j','k','l',';','\'','`', 0, '\\' ,'z','x','c','v',
'b','n','m',',','.','/', 0 , 0 , 0 ,' ', 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 ,'7','8','9','-','4','5','6','+','1',
'2','3','0',',', 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
LF, 0 ,'/', 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
};
/**
* Mapping from ASCII value to another ASCII value when shift is pressed
*
* The table does not contain mappings for control characters. The table
* entry 0 corresponds to ASCII value 32.
*/
static unsigned char usenglish_shift[256 - 32] = {
/* 32 */ ' ', 0 , 0, 0 , 0 , 0 , 0 ,'"', 0 , 0 , 0 , 0 ,'<','_','>','?',
/* 48 */ ')','!','@','#','$','%','^','&','*','(', 0 ,':', 0 ,'+', 0 , 0 ,
/* 64 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 80 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,'{','|','}', 0 , 0 ,
/* 96 */ '~','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
/* 112 */ 'P','Q','R','S','T','U','V','W','X','Y','Z', 0 ,'\\', 0 , 0 , 0 ,
};
static unsigned char german_keymap[128] = {
0 ,ESC,'1','2','3','4','5','6','7','8','9','0', SS, 39, BS,TAB,
'q','w','e','r','t','z','u','i','o','p', UE,'+', LF, 0 ,'a','s',
'd','f','g','h','j','k','l', OE, AE,'^', 0 ,'#','y','x','c','v',
'b','n','m',',','.','-', 0 ,'*', 0 ,' ', 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 ,'7','8','9','-','4','5','6','+','1',
'2','3','0',',', 0 , 0 ,'<', 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
LF, 0 ,'/', 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
};
/**
* Mapping from ASCII value to another ASCII value when shift is pressed
*
* The table does not contain mappings for control characters. The table
* entry 0 corresponds to ASCII value 32.
*/
static unsigned char german_shift[256 - 32] = {
/* 32 */ ' ', 0 , 0, 39 , 0 , 0 , 0 ,'`', 0 , 0 , 0 ,'*',';','_',':', 0 ,
/* 48 */ '=','!','"',PAR,'$','%','&','/','(',')', 0 , 0 ,'>', 0 , 0 , 0 ,
/* 64 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 80 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,DEG, 0 ,
/* 96 */ 0 ,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
/* 112 */ 'P','Q','R','S','T','U','V','W','X','Y','Z', 0 , 0 , 0 , 0 , 0 ,
/* 128 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 144 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 160 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 176 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 192 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 208 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,'?',
};
/**
* Mapping from ASCII value to another ASCII value when altgr is pressed
*/
static unsigned char german_altgr[256 - 32] = {
/* 32 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,'~', 0 , 0 , 0 , 0 ,
/* 48 */'}', 0 ,178,179, 0 , 0 , 0 ,'{','[',']', 0 , 0 ,'|', 0 , 0 , 0 ,
/* 64 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 80 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 96 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 112 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 128 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 144 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 160 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 176 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 192 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
/* 208 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,'\\',
};
/**
* Mapping from ASCII value to value reported when control is pressed
*
* The table starts with ASCII value 32.
*/
static unsigned char control[256 - 32] = {
/* 32 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 48 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 64 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 96 */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
/* 112 */ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, 0,
};
}
#endif /* _TERMINAL__KEYMAPS_H_ */

View File

@ -1,204 +0,0 @@
/*
* \brief State machine for translating scan codes to characters
* \author Norman Feske
* \date 2011-06-06
*/
/*
* Copyright (C) 2011-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _TERMINAL__SCANCODE_TRACKER_H_
#define _TERMINAL__SCANCODE_TRACKER_H_
#include <input/keycodes.h>
#include <terminal/read_buffer.h>
namespace Terminal { class Scancode_tracker; }
/**
* State machine that translates keycode sequences to terminal characters
*/
class Terminal::Scancode_tracker
{
private:
/**
* Tables containing the scancode-to-character mapping
*/
unsigned char const *_keymap;
unsigned char const *_shift;
unsigned char const *_altgr;
unsigned char const *_control;
/**
* Current state of modifer keys
*/
bool _mod_shift;
bool _mod_control;
bool _mod_altgr;
/**
* Currently pressed key, or 0 if no normal key (one that can be
* encoded in a single 'char') is pressed
*/
unsigned char _last_character;
/**
* Currently pressed special key (a key that corresponds to an escape
* sequence), or no if no special key is pressed
*/
char const *_last_sequence;
/**
* Convert keycode to terminal character
*/
unsigned char _keycode_to_latin1(int keycode)
{
if (keycode >= 112) return 0;
unsigned ch = _keymap[keycode];
if (ch < 32)
return ch;
/* all ASCII-to-ASCII table start at index 32 */
if (_mod_shift || _mod_control || _mod_altgr) {
ch -= 32;
/*
* 'ch' is guaranteed to be in the range 0..223. So it is safe to
* use it as index into the ASCII-to-ASCII tables.
*/
if (_mod_shift)
return _shift[ch];
if (_mod_control)
return _control[ch];
if (_altgr && _mod_altgr)
return _altgr[ch];
}
return ch;
}
public:
/**
* Constructor
*
* \param keymap table for keycode-to-character mapping
* \param shift table for character-to-character mapping used when
* Shift is pressed
* \param altgr table for character-to-character mapping with AltGr
* is pressed
*/
Scancode_tracker(unsigned char const *keymap,
unsigned char const *shift,
unsigned char const *altgr,
unsigned char const *control)
:
_keymap(keymap),
_shift(shift),
_altgr(altgr),
_control(control),
_mod_shift(false),
_mod_control(false),
_mod_altgr(false),
_last_character(0),
_last_sequence(0)
{ }
/**
* Submit key event to state machine
*
* \param press true on press event, false on release event
*/
void submit(int keycode, bool press)
{
/* track modifier keys */
switch (keycode) {
case Input::KEY_LEFTSHIFT:
case Input::KEY_RIGHTSHIFT:
_mod_shift = press;
break;
case Input::KEY_LEFTCTRL:
case Input::KEY_RIGHTCTRL:
_mod_control = press;
break;
case Input::KEY_RIGHTALT:
_mod_altgr = press;
default:
break;
}
/* reset information about the currently pressed key */
_last_character = 0;
_last_sequence = 0;
if (!press) return;
/* convert key codes to ASCII */
if (_keymap)
_last_character = _keycode_to_latin1(keycode);
/* handle special key to be represented by an escape sequence */
if (!_last_character) {
switch (keycode) {
case Input::KEY_DOWN: _last_sequence = "\EOB"; break;
case Input::KEY_UP: _last_sequence = "\EOA"; break;
case Input::KEY_RIGHT: _last_sequence = "\EOC"; break;
case Input::KEY_LEFT: _last_sequence = "\EOD"; break;
case Input::KEY_HOME: _last_sequence = "\E[1~"; break;
case Input::KEY_INSERT: _last_sequence = "\E[2~"; break;
case Input::KEY_DELETE: _last_sequence = "\E[3~"; break;
case Input::KEY_END: _last_sequence = "\E[4~"; break;
case Input::KEY_PAGEUP: _last_sequence = "\E[5~"; break;
case Input::KEY_PAGEDOWN: _last_sequence = "\E[6~"; break;
case Input::KEY_F1: _last_sequence = "\EOP"; break;
case Input::KEY_F2: _last_sequence = "\EOQ"; break;
case Input::KEY_F3: _last_sequence = "\EOR"; break;
case Input::KEY_F4: _last_sequence = "\EOS"; break;
case Input::KEY_F5: _last_sequence = "\E[15~"; break;
case Input::KEY_F6: _last_sequence = "\E[17~"; break;
case Input::KEY_F7: _last_sequence = "\E[18~"; break;
case Input::KEY_F8: _last_sequence = "\E[19~"; break;
case Input::KEY_F9: _last_sequence = "\E[20~"; break;
case Input::KEY_F10: _last_sequence = "\E[21~"; break;
case Input::KEY_F11: _last_sequence = "\E[23~"; break;
case Input::KEY_F12: _last_sequence = "\E[24~"; break;
}
}
}
/**
* Output currently pressed key to read buffer
*/
void emit_current_character(Read_buffer &read_buffer)
{
if (_last_character)
read_buffer.add(_last_character);
if (_last_sequence)
read_buffer.add(_last_sequence);
}
/**
* Return true if there is a currently pressed key
*/
bool valid() const
{
return (_last_sequence || _last_character);
}
};
#endif /* _TERMINAL__SCANCODE_TRACKER_H_ */

View File

@ -1,7 +1,7 @@
content: drivers.config input_filter.config en_us.chargen
content: drivers.config input_filter.config en_us.chargen special.chargen
drivers.config input_filter.config:
cp $(REP_DIR)/recipes/raw/drivers_interactive-linux/$@ $@
en_us.chargen:
en_us.chargen special.chargen:
cp $(REP_DIR)/src/server/input_filter/$@ $@

View File

@ -20,6 +20,7 @@
</mod3>
<repeat delay_ms="230" rate_ms="90"/>
<include rom="en_us.chargen"/>
<include rom="special.chargen"/>
</chargen>
</output>
</config>

View File

@ -1,7 +1,7 @@
content: drivers.config input_filter.config en_us.chargen
content: drivers.config input_filter.config en_us.chargen special.chargen
drivers.config input_filter.config:
cp $(REP_DIR)/recipes/raw/drivers_interactive-pbxa9/$@ $@
en_us.chargen:
en_us.chargen special.chargen:
cp $(REP_DIR)/src/server/input_filter/$@ $@

View File

@ -20,6 +20,7 @@
</mod3>
<repeat delay_ms="230" rate_ms="90"/>
<include rom="en_us.chargen"/>
<include rom="special.chargen"/>
</chargen>
</output>
</config>

View File

@ -1,7 +1,7 @@
content: drivers.config fb_drv.config input_filter.config en_us.chargen
content: drivers.config fb_drv.config input_filter.config en_us.chargen special.chargen
drivers.config fb_drv.config input_filter.config:
cp $(REP_DIR)/recipes/raw/drivers_interactive-pc/$@ $@
en_us.chargen:
en_us.chargen special.chargen:
cp $(REP_DIR)/src/server/input_filter/$@ $@

View File

@ -24,6 +24,7 @@
</mod3>
<repeat delay_ms="230" rate_ms="90"/>
<include rom="en_us.chargen"/>
<include rom="special.chargen"/>
</chargen>
</output>
</config>

View File

@ -0,0 +1,27 @@
<chargen>
<!-- mappings corresponding to function-key unicodes as defined by Apple -->
<map>
<key name="KEY_UP" b0="239" b1="156" b2="128"/>
<key name="KEY_DOWN" b0="239" b1="156" b2="129"/>
<key name="KEY_LEFT" b0="239" b1="156" b2="130"/>
<key name="KEY_RIGHT" b0="239" b1="156" b2="131"/>
<key name="KEY_F1" b0="239" b1="156" b2="132"/>
<key name="KEY_F2" b0="239" b1="156" b2="133"/>
<key name="KEY_F3" b0="239" b1="156" b2="134"/>
<key name="KEY_F4" b0="239" b1="156" b2="135"/>
<key name="KEY_F5" b0="239" b1="156" b2="136"/>
<key name="KEY_F6" b0="239" b1="156" b2="137"/>
<key name="KEY_F7" b0="239" b1="156" b2="138"/>
<key name="KEY_F8" b0="239" b1="156" b2="139"/>
<key name="KEY_F9" b0="239" b1="156" b2="140"/>
<key name="KEY_F10" b0="239" b1="156" b2="141"/>
<key name="KEY_F11" b0="239" b1="156" b2="142"/>
<key name="KEY_F12" b0="239" b1="156" b2="143"/>
<key name="KEY_HOME" b0="239" b1="156" b2="169"/>
<key name="KEY_INSERT" b0="239" b1="156" b2="167"/>
<key name="KEY_DELETE" b0="239" b1="156" b2="168"/>
<key name="KEY_END" b0="239" b1="156" b2="171"/>
<key name="KEY_PAGEUP" b0="239" b1="156" b2="172"/>
<key name="KEY_PAGEDOWN" b0="239" b1="156" b2="173"/>
</map>
</chargen>