rework key input handling, add more script events for UI and implement console history

This commit is contained in:
Eduardo Bart 2011-08-28 18:32:24 -03:00
parent 7242dfc9ee
commit 8aadea2a96
12 changed files with 494 additions and 314 deletions

1
TODO
View File

@ -4,4 +4,3 @@ hotkeys events in lua
make password text edit hidden make password text edit hidden
load modules from zip packages load modules from zip packages
ip/host/rsa configuration ip/host/rsa configuration
console history

View File

@ -5,6 +5,8 @@ local logLocked = false
local commandEnv = createEnvironment() local commandEnv = createEnvironment()
local maxLines = 80 local maxLines = 80
local numLines = 0 local numLines = 0
local commandHistory = { }
local currentHistoryIndex = 0
function Console.onLog(level, message, time) function Console.onLog(level, message, time)
-- avoid logging while reporting logs (would cause a infinite loop) -- avoid logging while reporting logs (would cause a infinite loop)
@ -47,9 +49,41 @@ function Console.addLine(text, color)
end end
end end
function Console.navigateCommand(step)
local numCommands = #commandHistory
if numCommands > 0 then
currentHistoryIndex = math.min(math.max(currentHistoryIndex + step, 0), numCommands)
local commandLineEdit = console:getChildById('commandLineEdit')
if currentHistoryIndex > 0 then
local command = commandHistory[numCommands - currentHistoryIndex + 1]
commandLineEdit:setText(command)
else
commandLineEdit:clearText()
end
end
end
function Console.create() function Console.create()
console = UI.loadAndDisplay("/console/console.otui") console = UI.loadAndDisplay("/console/console.otui")
console:hide() console:hide()
console.onKeyPress = function(self, keyCode, keyChar, keyboardModifiers)
if keyboardModifiers == KeyboardNoModifier then
if keyCode == KeyReturn or keyCode == keyEnter then
local commandLineEdit = console:getChildById('commandLineEdit')
local command = commandLineEdit:getText()
Console.executeCommand(command)
commandLineEdit:clearText()
return true
elseif keyCode == KeyUp then
Console.navigateCommand(1)
return true
elseif keyCode == KeyDown then
Console.navigateCommand(-1)
return true
end
end
return false
end
Logger.setOnLog(Console.onLog) Logger.setOnLog(Console.onLog)
Logger.fireOldMessages() Logger.fireOldMessages()
@ -72,6 +106,8 @@ function Console.hide()
end end
function Console.executeCommand(command) function Console.executeCommand(command)
currentHistoryIndex = 0
table.insert(commandHistory, command)
Console.addLine(">> " .. command, "#ffffff") Console.addLine(">> " .. command, "#ffffff")
local func, err = loadstring(command, "@") local func, err = loadstring(command, "@")
if func then if func then

View File

@ -23,14 +23,9 @@ RectPanel
text: >> text: >>
UILineEdit UILineEdit
id: commandBox id: commandLineEdit
height: 16 height: 16
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: commandSymbolLabel.right anchors.left: commandSymbolLabel.right
anchors.right: parent.right anchors.right: parent.right
font: terminus-14px-bold font: terminus-14px-bold
onAction: |
function(self)
Console.executeCommand(self:getText())
self:clearText()
end

View File

@ -16,3 +16,118 @@ LogFatal = 4
ActiveFocusReason = 2 ActiveFocusReason = 2
EmptyFunction = function() end EmptyFunction = function() end
-- KeyCodes
KeyUnknown = 0
KeyEscape = 1
KeyTab = 2
KeyBackspace = 3
KeyReturn = 4
KeyEnter = 5
KeyInsert = 6
KeyDelete = 7
KeyPause = 8
KeyPrintScreen = 9
KeyHome = 10
KeyEnd = 11
KeyPageUp = 12
KeyPageDown = 13
KeyUp = 14
KeyDown = 15
KeyLeft = 16
KeyRight = 17
KeyNumLock = 18
KeyScrollLock = 19
KeyCapsLock = 20
KeyCtrl = 21
KeyShift = 22
KeyAlt = 23
KeyAltGr = 24
KeyMeta = 25
KeyMenu = 26
KeySpace = 32 -- ' '
KeyExclamation = 33 -- !
KeyQuote = 34 -- "
KeyNumberSign = 35 -- #
KeyDollar = 36 -- $
KeyPercent = 37 -- %
KeyAmpersand = 38 -- &
KeyApostrophe = 39 -- '
KeyLeftParen = 40 -- (
KeyRightParen = 41 -- )
KeyAsterisk = 42 -- *
KeyPlus = 43 -- +
KeyComma = 44 --
KeyMinus = 45 -- -
KeyPeriod = 46 -- .
KeySlash = 47 -- /
Key0 = 48 -- 0
Key1 = 49 -- 1
Key2 = 50 -- 2
Key3 = 51 -- 3
Key4 = 52 -- 4
Key5 = 53 -- 5
Key6 = 54 -- 6
Key7 = 55 -- 7
Key8 = 56 -- 8
Key9 = 57 -- 9
KeyColon = 58 -- :
KeySemicolon = 59 -- ;
KeyLess = 60 -- <
KeyEqual = 61 -- =
KeyGreater = 62 -- >
KeyQuestion = 63 -- ?
KeyAtSign = 64 -- @
KeyA = 65 -- a
KeyB = 66 -- b
KeyC = 67 -- c
KeyD = 68 -- d
KeyE = 69 -- e
KeyF = 70 -- f
KeyG = 71 -- g
KeyH = 72 -- h
KeyI = 73 -- i
KeyJ = 74 -- j
KeyK = 75 -- k
KeyL = 76 -- l
KeyM = 77 -- m
KeyN = 78 -- n
KeyO = 79 -- o
KeyP = 80 -- p
KeyQ = 81 -- q
KeyR = 82 -- r
KeyS = 83 -- s
KeyT = 84 -- t
KeyU = 85 -- u
KeyV = 86 -- v
KeyW = 87 -- w
KeyX = 88 -- x
KeyY = 89 -- y
KeyZ = 90 -- z
KeyLeftBracket = 91 -- [
KeyBackslash = 92 -- '\'
KeyRightBracket = 93 -- ]
KeyCaret = 94 -- ^
KeyUnderscore = 95 -- _
KeyGrave = 96 -- `
KeyLeftCurly = 123 -- {
KeyBar = 124 -- |
KeyRightCurly = 125 -- }
KeyTilde = 126 -- ~
KeyF1 = 128
KeyF2 = 129
KeyF3 = 130
KeyF4 = 131
KeyF5 = 132
KeyF6 = 134
KeyF7 = 135
KeyF8 = 136
KeyF9 = 137
KeyF10 = 138
KeyF11 = 139
KeyF12 = 140
KeyboardNoModifier = 0
KeyboardCtrlModifier = 1
KeyboardAltModifier = 2
KeyboardShiftModifier = 4

View File

@ -0,0 +1,14 @@
function string:split(sep)
local t = { }
local function helper(word)
table.insert(t, word)
return ""
end
if not self:gsub("%w+", helper):find("%S") then
return t
end
end
function string:starts(start)
return self:sub(1, #start) == start
end

View File

@ -0,0 +1,34 @@
function table.dump(t, depth)
if not depth then depth = 0 end
for k,v in pairs(t) do
str = string.rep(' ', depth * 2) .. k .. ': '
if type(v) ~= "table" then
print(str .. v)
else
print(str)
table.dump(v, depth+1)
end
end
end
function table.copy(t)
local res = {}
for k,v in pairs(t) do
res[k] = v
end
return res
end
function table.selective_copy(t, keys)
local res = { }
for i,v in ipairs(keys) do
res[v] = t[v]
end
return res
end
function table.merge(t, src)
for k,v in pairs(src) do
t[k] = v
end
end

View File

@ -49,6 +49,117 @@ namespace Fw
lightGray = 0xffc0c0c0 lightGray = 0xffc0c0c0
}; };
enum Key : uint8 {
KeyUnknown = 0,
KeyEscape = 1,
KeyTab = 2,
KeyBackspace = 3,
KeyReturn = 4,
KeyEnter = 5,
KeyInsert = 6,
KeyDelete = 7,
KeyPause = 8,
KeyPrintScreen = 9,
KeyHome = 10,
KeyEnd = 11,
KeyPageUp = 12,
KeyPageDown = 13,
KeyUp = 14,
KeyDown = 15,
KeyLeft = 16,
KeyRight = 17,
KeyNumLock = 18,
KeyScrollLock = 19,
KeyCapsLock = 20,
KeyCtrl = 21,
KeyShift = 22,
KeyAlt = 23,
KeyAltGr = 24,
KeyMeta = 25,
KeyMenu = 26,
KeySpace = 32, // ' '
KeyExclamation = 33, // !
KeyQuote = 34, // "
KeyNumberSign = 35, // #
KeyDollar = 36, // $
KeyPercent = 37, // %
KeyAmpersand = 38, // &
KeyApostrophe = 39, // '
KeyLeftParen = 40, // (
KeyRightParen = 41, // )
KeyAsterisk = 42, // *
KeyPlus = 43, // +
KeyComma = 44, // ,
KeyMinus = 45, // -
KeyPeriod = 46, // .
KeySlash = 47, // /
Key0 = 48, // 0
Key1 = 49, // 1
Key2 = 50, // 2
Key3 = 51, // 3
Key4 = 52, // 4
Key5 = 53, // 5
Key6 = 54, // 6
Key7 = 55, // 7
Key8 = 56, // 8
Key9 = 57, // 9
KeyColon = 58, // :
KeySemicolon = 59, // ;
KeyLess = 60, // <
KeyEqual = 61, // =
KeyGreater = 62, // >
KeyQuestion = 63, // ?
KeyAtSign = 64, // @
KeyA = 65, // a
KeyB = 66, // b
KeyC = 67, // c
KeyD = 68, // d
KeyE = 69, // e
KeyF = 70, // f
KeyG = 71, // g
KeyH = 72, // h
KeyI = 73, // i
KeyJ = 74, // j
KeyK = 75, // k
KeyL = 76, // l
KeyM = 77, // m
KeyN = 78, // n
KeyO = 79, // o
KeyP = 80, // p
KeyQ = 81, // q
KeyR = 82, // r
KeyS = 83, // s
KeyT = 84, // t
KeyU = 85, // u
KeyV = 86, // v
KeyW = 87, // w
KeyX = 88, // x
KeyY = 89, // y
KeyZ = 90, // z
KeyLeftBracket = 91, // [
KeyBackslash = 92, // '\'
KeyRightBracket = 93, // ]
KeyCaret = 94, // ^
KeyUnderscore = 95, // _
KeyGrave = 96, // `
KeyLeftCurly = 123, // {
KeyBar = 124, // |
KeyRightCurly = 125, // }
KeyTilde = 126, // ~
KeyF1 = 128,
KeyF2 = 129,
KeyF3 = 130,
KeyF4 = 131,
KeyF5 = 132,
KeyF6 = 134,
KeyF7 = 135,
KeyF8 = 136,
KeyF9 = 137,
KeyF10 = 138,
KeyF11 = 139,
KeyF12 = 140
};
enum LogLevel { enum LogLevel {
LogDebug = 0, LogDebug = 0,
LogInfo, LogInfo,

View File

@ -25,155 +25,6 @@
#include <framework/global.h> #include <framework/global.h>
//TODO: move the next enums to const.h
enum InputKeyCode {
KC_UNKNOWN = 0x00,
KC_ESCAPE = 0x01,
KC_1 = 0x02,
KC_2 = 0x03,
KC_3 = 0x04,
KC_4 = 0x05,
KC_5 = 0x06,
KC_6 = 0x07,
KC_7 = 0x08,
KC_8 = 0x09,
KC_9 = 0x0A,
KC_0 = 0x0B,
KC_MINUS = 0x0C, // - on main keyboard
KC_EQUALS = 0x0D,
KC_BACK = 0x0E, // backspace
KC_TAB = 0x0F,
KC_Q = 0x10,
KC_W = 0x11,
KC_E = 0x12,
KC_R = 0x13,
KC_T = 0x14,
KC_Y = 0x15,
KC_U = 0x16,
KC_I = 0x17,
KC_O = 0x18,
KC_P = 0x19,
KC_LBRACKET = 0x1A,
KC_RBRACKET = 0x1B,
KC_RETURN = 0x1C, // Enter on main keyboard
KC_LCONTROL = 0x1D,
KC_A = 0x1E,
KC_S = 0x1F,
KC_D = 0x20,
KC_F = 0x21,
KC_G = 0x22,
KC_H = 0x23,
KC_J = 0x24,
KC_K = 0x25,
KC_L = 0x26,
KC_SEMICOLON = 0x27,
KC_APOSTROPHE = 0x28,
KC_GRAVE = 0x29, // accent
KC_LSHIFT = 0x2A,
KC_BACKSLASH = 0x2B,
KC_Z = 0x2C,
KC_X = 0x2D,
KC_C = 0x2E,
KC_V = 0x2F,
KC_B = 0x30,
KC_N = 0x31,
KC_M = 0x32,
KC_COMMA = 0x33,
KC_PERIOD = 0x34, // . on main keyboard
KC_SLASH = 0x35, // / on main keyboard
KC_RSHIFT = 0x36,
KC_MULTIPLY = 0x37, // * on numeric keypad
KC_LALT = 0x38, // left Alt
KC_SPACE = 0x39,
KC_CAPITAL = 0x3A,
KC_F1 = 0x3B,
KC_F2 = 0x3C,
KC_F3 = 0x3D,
KC_F4 = 0x3E,
KC_F5 = 0x3F,
KC_F6 = 0x40,
KC_F7 = 0x41,
KC_F8 = 0x42,
KC_F9 = 0x43,
KC_F10 = 0x44,
KC_NUMLOCK = 0x45,
KC_SCROLL = 0x46, // Scroll Lock
KC_NUMPAD7 = 0x47,
KC_NUMPAD8 = 0x48,
KC_NUMPAD9 = 0x49,
KC_SUBTRACT = 0x4A, // - on numeric keypad
KC_NUMPAD4 = 0x4B,
KC_NUMPAD5 = 0x4C,
KC_NUMPAD6 = 0x4D,
KC_ADD = 0x4E, // + on numeric keypad
KC_NUMPAD1 = 0x4F,
KC_NUMPAD2 = 0x50,
KC_NUMPAD3 = 0x51,
KC_NUMPAD0 = 0x52,
KC_DECIMAL = 0x53, // . on numeric keypad
KC_OEM_102 = 0x56, // < > | on UK/Germany keyboards
KC_F11 = 0x57,
KC_F12 = 0x58,
KC_F13 = 0x64, // (NEC PC98)
KC_F14 = 0x65, // (NEC PC98)
KC_F15 = 0x66, // (NEC PC98)
KC_KANA = 0x70, // (Japanese keyboard)
KC_ABNT_C1 = 0x73, // / ? on Portugese (Brazilian) keyboards
KC_CONVERT = 0x79, // (Japanese keyboard)
KC_NOCONVERT = 0x7B, // (Japanese keyboard)
KC_YEN = 0x7D, // (Japanese keyboard)
KC_ABNT_C2 = 0x7E, // Numpad . on Portugese (Brazilian) keyboards
KC_NUMPADEQUALS= 0x8D, // = on numeric keypad (NEC PC98)
KC_PREVTRACK = 0x90, // Previous Track (KC_CIRCUMFLEX on Japanese keyboard)
KC_AT = 0x91, // (NEC PC98)
KC_COLON = 0x92, // (NEC PC98)
KC_UNDERLINE = 0x93, // (NEC PC98)
KC_KANJI = 0x94, // (Japanese keyboard)
KC_STOP = 0x95, // (NEC PC98)
KC_AX = 0x96, // (Japan AX)
KC_UNLABELED = 0x97, // (J3100)
KC_NEXTTRACK = 0x99, // Next Track
KC_NUMPADENTER = 0x9C, // Enter on numeric keypad
KC_RCONTROL = 0x9D,
KC_MUTE = 0xA0, // Mute
KC_CALCULATOR = 0xA1, // Calculator
KC_PLAYPAUSE = 0xA2, // Play / Pause
KC_MEDIASTOP = 0xA4, // Media Stop
KC_VOLUMEDOWN = 0xAE, // Volume -
KC_VOLUMEUP = 0xB0, // Volume +
KC_WEBHOME = 0xB2, // Web home
KC_NUMPADCOMMA = 0xB3, // , on numeric keypad (NEC PC98)
KC_DIVIDE = 0xB5, // / on numeric keypad
KC_SYSRQ = 0xB7,
KC_RALT = 0xB8, // right Alt
KC_PAUSE = 0xC5, // Pause
KC_HOME = 0xC7, // Home on arrow keypad
KC_UP = 0xC8, // UpArrow on arrow keypad
KC_PGUP = 0xC9, // PgUp on arrow keypad
KC_LEFT = 0xCB, // LeftArrow on arrow keypad
KC_RIGHT = 0xCD, // RightArrow on arrow keypad
KC_END = 0xCF, // End on arrow keypad
KC_DOWN = 0xD0, // DownArrow on arrow keypad
KC_PGDOWN = 0xD1, // PgDn on arrow keypad
KC_INSERT = 0xD2, // Insert on arrow keypad
KC_DELETE = 0xD3, // Delete on arrow keypad
KC_LWIN = 0xDB, // Left Windows key
KC_RWIN = 0xDC, // Right Windows key
KC_APPS = 0xDD, // AppMenu key
KC_POWER = 0xDE, // System Power
KC_SLEEP = 0xDF, // System Sleep
KC_WAKE = 0xE3, // System Wake
KC_WEBSEARCH = 0xE5, // Web Search
KC_WEBFAVORITES= 0xE6, // Web Favorites
KC_WEBREFRESH = 0xE7, // Web Refresh
KC_WEBSTOP = 0xE8, // Web Stop
KC_WEBFORWARD = 0xE9, // Web Forward
KC_WEBBACK = 0xEA, // Web Back
KC_MYCOMPUTER = 0xEB, // My Computer
KC_MAIL = 0xEC, // Mail
KC_MEDIASELECT = 0xED // Media Select
};
enum PlatformEventType { enum PlatformEventType {
EventNone = 0, EventNone = 0,
EventMouseAction = 1, EventMouseAction = 1,
@ -203,7 +54,7 @@ struct PlatformEvent {
Point mousePos; Point mousePos;
Point mouseMoved; Point mouseMoved;
char keychar; char keychar;
uchar keycode; Fw::Key keycode;
bool ctrl; bool ctrl;
bool shift; bool shift;
bool alt; bool alt;

View File

@ -62,7 +62,7 @@ struct X11PlatformPrivate {
int y; int y;
int lastTicks; int lastTicks;
std::string clipboardText; std::string clipboardText;
std::map<int, uchar> keyMap; std::map<int, Fw::Key> keyMap;
PlatformEvent inputEvent; PlatformEvent inputEvent;
} x11; } x11;
@ -89,145 +89,154 @@ void Platform::init(PlatformListener* platformListener, const char *appName)
x11.maximizeOnFirstShow = false; x11.maximizeOnFirstShow = false;
m_listener = platformListener; m_listener = platformListener;
// setup keymap x11.keyMap[XK_Escape] = Fw::KeyEscape;
x11.keyMap[XK_1] = KC_1; x11.keyMap[XK_Tab] = Fw::KeyTab;
x11.keyMap[XK_2] = KC_2; x11.keyMap[XK_Return] = Fw::KeyReturn;
x11.keyMap[XK_3] = KC_3; x11.keyMap[XK_BackSpace] = Fw::KeyBackspace;
x11.keyMap[XK_4] = KC_4;
x11.keyMap[XK_5] = KC_5;
x11.keyMap[XK_6] = KC_6;
x11.keyMap[XK_7] = KC_7;
x11.keyMap[XK_8] = KC_8;
x11.keyMap[XK_9] = KC_9;
x11.keyMap[XK_0] = KC_0;
x11.keyMap[XK_BackSpace] = KC_BACK; x11.keyMap[XK_Page_Up] = Fw::KeyPageUp;
x11.keyMap[XK_Page_Down] = Fw::KeyPageDown;
x11.keyMap[XK_Home] = Fw::KeyHome;
x11.keyMap[XK_End] = Fw::KeyEnd;
x11.keyMap[XK_Insert] = Fw::KeyInsert;
x11.keyMap[XK_Delete] = Fw::KeyDelete;
x11.keyMap[XK_minus] = KC_MINUS; x11.keyMap[XK_Up] = Fw::KeyUp;
x11.keyMap[XK_equal] = KC_EQUALS; x11.keyMap[XK_Down] = Fw::KeyDown;
x11.keyMap[XK_space] = KC_SPACE; x11.keyMap[XK_Left] = Fw::KeyLeft;
x11.keyMap[XK_comma] = KC_COMMA; x11.keyMap[XK_Right] = Fw::KeyRight;
x11.keyMap[XK_period] = KC_PERIOD;
x11.keyMap[XK_backslash] = KC_BACKSLASH; x11.keyMap[XK_Num_Lock] = Fw::KeyNumLock;
x11.keyMap[XK_slash] = KC_SLASH; x11.keyMap[XK_Scroll_Lock] = Fw::KeyScrollLock;
x11.keyMap[XK_bracketleft] = KC_LBRACKET; x11.keyMap[XK_Caps_Lock] = Fw::KeyCapsLock;
x11.keyMap[XK_bracketright] = KC_RBRACKET; x11.keyMap[XK_Print] = Fw::KeyPrintScreen;
x11.keyMap[XK_Pause] = Fw::KeyPause;
x11.keyMap[XK_Escape] = KC_ESCAPE; x11.keyMap[XK_Control_L] = Fw::KeyCtrl;
x11.keyMap[XK_Caps_Lock] = KC_CAPITAL; x11.keyMap[XK_Control_R] = Fw::KeyCtrl;
x11.keyMap[XK_Shift_R] = Fw::KeyShift;
x11.keyMap[XK_Shift_L] = Fw::KeyShift;
x11.keyMap[XK_Alt_R] = Fw::KeyAlt;
x11.keyMap[XK_Alt_L] = Fw::KeyAltGr;
x11.keyMap[XK_Meta_L] = Fw::KeyMeta;
x11.keyMap[XK_Meta_R] = Fw::KeyMeta;
x11.keyMap[XK_Menu] = Fw::KeyMenu;
x11.keyMap[XK_Tab] = KC_TAB; // ascii characters
x11.keyMap[XK_Return] = KC_RETURN; x11.keyMap[XK_space] = Fw::KeySpace;
x11.keyMap[XK_Control_L] = KC_LCONTROL; x11.keyMap[XK_exclam] = Fw::KeyExclamation;
x11.keyMap[XK_Control_R] = KC_RCONTROL; x11.keyMap[XK_quotedbl] = Fw::KeyQuote;
x11.keyMap[XK_numbersign] = Fw::KeyNumberSign;
x11.keyMap[XK_colon] = KC_COLON; x11.keyMap[XK_dollar] = Fw::KeyDollar;
x11.keyMap[XK_semicolon] = KC_SEMICOLON; x11.keyMap[XK_percent] = Fw::KeyPercent;
x11.keyMap[XK_apostrophe] = KC_APOSTROPHE; x11.keyMap[XK_ampersand] = Fw::KeyAmpersand;
x11.keyMap[XK_grave] = KC_GRAVE; x11.keyMap[XK_apostrophe] = Fw::KeyApostrophe;
x11.keyMap[XK_parenleft] = Fw::KeyLeftParen;
x11.keyMap[XK_b] = KC_B; x11.keyMap[XK_parenright] = Fw::KeyRightParen;
x11.keyMap[XK_a] = KC_A; x11.keyMap[XK_asterisk] = Fw::KeyAsterisk;
x11.keyMap[XK_c] = KC_C; x11.keyMap[XK_plus] = Fw::KeyPlus;
x11.keyMap[XK_d] = KC_D; x11.keyMap[XK_comma] = Fw::KeyComma;
x11.keyMap[XK_e] = KC_E; x11.keyMap[XK_minus] = Fw::KeyMinus;
x11.keyMap[XK_f] = KC_F; x11.keyMap[XK_period] = Fw::KeyPeriod;
x11.keyMap[XK_g] = KC_G; x11.keyMap[XK_slash] = Fw::KeySlash;
x11.keyMap[XK_h] = KC_H; x11.keyMap[XK_1] = Fw::Key1;
x11.keyMap[XK_i] = KC_I; x11.keyMap[XK_2] = Fw::Key2;
x11.keyMap[XK_j] = KC_J; x11.keyMap[XK_3] = Fw::Key3;
x11.keyMap[XK_k] = KC_K; x11.keyMap[XK_4] = Fw::Key4;
x11.keyMap[XK_l] = KC_L; x11.keyMap[XK_5] = Fw::Key5;
x11.keyMap[XK_m] = KC_M; x11.keyMap[XK_6] = Fw::Key6;
x11.keyMap[XK_n] = KC_N; x11.keyMap[XK_7] = Fw::Key7;
x11.keyMap[XK_o] = KC_O; x11.keyMap[XK_8] = Fw::Key8;
x11.keyMap[XK_p] = KC_P; x11.keyMap[XK_9] = Fw::Key9;
x11.keyMap[XK_q] = KC_Q; x11.keyMap[XK_0] = Fw::Key0;
x11.keyMap[XK_r] = KC_R; x11.keyMap[XK_colon] = Fw::KeyColon;
x11.keyMap[XK_s] = KC_S; x11.keyMap[XK_semicolon] = Fw::KeySemicolon;
x11.keyMap[XK_t] = KC_T; x11.keyMap[XK_less] = Fw::KeyLess;
x11.keyMap[XK_u] = KC_U; x11.keyMap[XK_equal] = Fw::KeyEqual;
x11.keyMap[XK_v] = KC_V; x11.keyMap[XK_greater] = Fw::KeyGreater;
x11.keyMap[XK_w] = KC_W; x11.keyMap[XK_question] = Fw::KeyQuestion;
x11.keyMap[XK_x] = KC_X; x11.keyMap[XK_at] = Fw::KeyAtSign;
x11.keyMap[XK_y] = KC_Y; x11.keyMap[XK_a] = Fw::KeyA;
x11.keyMap[XK_z] = KC_Z; x11.keyMap[XK_b] = Fw::KeyB;
x11.keyMap[XK_c] = Fw::KeyC;
x11.keyMap[XK_F1] = KC_F1; x11.keyMap[XK_d] = Fw::KeyD;
x11.keyMap[XK_F2] = KC_F2; x11.keyMap[XK_e] = Fw::KeyE;
x11.keyMap[XK_F3] = KC_F3; x11.keyMap[XK_f] = Fw::KeyF;
x11.keyMap[XK_F4] = KC_F4; x11.keyMap[XK_g] = Fw::KeyG;
x11.keyMap[XK_F5] = KC_F5; x11.keyMap[XK_h] = Fw::KeyH;
x11.keyMap[XK_F6] = KC_F6; x11.keyMap[XK_i] = Fw::KeyI;
x11.keyMap[XK_F7] = KC_F7; x11.keyMap[XK_j] = Fw::KeyJ;
x11.keyMap[XK_F8] = KC_F8; x11.keyMap[XK_k] = Fw::KeyK;
x11.keyMap[XK_F9] = KC_F9; x11.keyMap[XK_l] = Fw::KeyL;
x11.keyMap[XK_F10] = KC_F10; x11.keyMap[XK_m] = Fw::KeyM;
x11.keyMap[XK_F11] = KC_F11; x11.keyMap[XK_n] = Fw::KeyN;
x11.keyMap[XK_F12] = KC_F12; x11.keyMap[XK_o] = Fw::KeyO;
x11.keyMap[XK_F13] = KC_F13; x11.keyMap[XK_p] = Fw::KeyP;
x11.keyMap[XK_F14] = KC_F14; x11.keyMap[XK_q] = Fw::KeyQ;
x11.keyMap[XK_F15] = KC_F15; x11.keyMap[XK_r] = Fw::KeyR;
x11.keyMap[XK_s] = Fw::KeyS;
x11.keyMap[XK_t] = Fw::KeyT;
x11.keyMap[XK_u] = Fw::KeyU;
x11.keyMap[XK_v] = Fw::KeyV;
x11.keyMap[XK_w] = Fw::KeyW;
x11.keyMap[XK_x] = Fw::KeyX;
x11.keyMap[XK_y] = Fw::KeyY;
x11.keyMap[XK_z] = Fw::KeyZ;
x11.keyMap[XK_bracketleft] = Fw::KeyLeftBracket;
x11.keyMap[XK_backslash] = Fw::KeyBackslash;
x11.keyMap[XK_bracketright] = Fw::KeyRightBracket;
x11.keyMap[XK_asciicircum] = Fw::KeyCaret;
x11.keyMap[XK_underscore] = Fw::KeyUnderscore;
x11.keyMap[XK_grave] = Fw::KeyGrave;
x11.keyMap[XK_braceleft] = Fw::KeyLeftCurly;
x11.keyMap[XK_bar] = Fw::KeyBar;
x11.keyMap[XK_braceright] = Fw::KeyRightCurly;
x11.keyMap[XK_asciitilde] = Fw::KeyTilde;
// keypad // keypad
x11.keyMap[XK_KP_0] = KC_NUMPAD0; x11.keyMap[XK_KP_Add] = Fw::KeyPlus;
x11.keyMap[XK_KP_1] = KC_NUMPAD1; x11.keyMap[XK_KP_Subtract] = Fw::KeyMinus;
x11.keyMap[XK_KP_2] = KC_NUMPAD2; x11.keyMap[XK_KP_Decimal] = Fw::KeyPeriod;
x11.keyMap[XK_KP_3] = KC_NUMPAD3; x11.keyMap[XK_KP_Divide] = Fw::KeySlash;
x11.keyMap[XK_KP_4] = KC_NUMPAD4; x11.keyMap[XK_KP_Multiply] = Fw::KeyAsterisk;
x11.keyMap[XK_KP_5] = KC_NUMPAD5; x11.keyMap[XK_KP_Enter] = Fw::KeyEnter;
x11.keyMap[XK_KP_6] = KC_NUMPAD6;
x11.keyMap[XK_KP_7] = KC_NUMPAD7;
x11.keyMap[XK_KP_8] = KC_NUMPAD8;
x11.keyMap[XK_KP_9] = KC_NUMPAD9;
x11.keyMap[XK_KP_Add] = KC_ADD;
x11.keyMap[XK_KP_Subtract] = KC_SUBTRACT;
x11.keyMap[XK_KP_Decimal] = KC_DECIMAL;
x11.keyMap[XK_KP_Equal] = KC_NUMPADEQUALS;
x11.keyMap[XK_KP_Divide] = KC_DIVIDE;
x11.keyMap[XK_KP_Multiply] = KC_MULTIPLY;
x11.keyMap[XK_KP_Enter] = KC_RETURN;
// keypad with numlock off // keypad with numlock off
x11.keyMap[XK_KP_Home] = KC_NUMPAD7; x11.keyMap[XK_KP_Up] = Fw::KeyUp;
x11.keyMap[XK_KP_Up] = KC_NUMPAD8; x11.keyMap[XK_KP_Down] = Fw::KeyDown;
x11.keyMap[XK_KP_Page_Up] = KC_NUMPAD9; x11.keyMap[XK_KP_Left] = Fw::KeyLeft;
x11.keyMap[XK_KP_Left] = KC_NUMPAD4; x11.keyMap[XK_KP_Right] = Fw::KeyRight;
x11.keyMap[XK_KP_Begin] = KC_NUMPAD5; x11.keyMap[XK_KP_Page_Up] = Fw::KeyPageUp;
x11.keyMap[XK_KP_Right] = KC_NUMPAD6; x11.keyMap[XK_KP_Page_Down] = Fw::KeyPageDown;
x11.keyMap[XK_KP_End] = KC_NUMPAD1; x11.keyMap[XK_KP_Home] = Fw::KeyHome;
x11.keyMap[XK_KP_Down] = KC_NUMPAD2; x11.keyMap[XK_KP_End] = Fw::KeyEnd;
x11.keyMap[XK_KP_Page_Down] = KC_NUMPAD3; x11.keyMap[XK_KP_Insert] = Fw::KeyInsert;
x11.keyMap[XK_KP_Insert] = KC_NUMPAD0; x11.keyMap[XK_KP_Delete] = Fw::KeyDelete;
x11.keyMap[XK_KP_Delete] = KC_DECIMAL;
x11.keyMap[XK_Up] = KC_UP; // keypad with numlock on
x11.keyMap[XK_Down] = KC_DOWN; x11.keyMap[XK_KP_0] = Fw::Key0;
x11.keyMap[XK_Left] = KC_LEFT; x11.keyMap[XK_KP_1] = Fw::Key1;
x11.keyMap[XK_Right] = KC_RIGHT; x11.keyMap[XK_KP_2] = Fw::Key2;
x11.keyMap[XK_KP_3] = Fw::Key3;
x11.keyMap[XK_KP_4] = Fw::Key4;
x11.keyMap[XK_KP_5] = Fw::Key5;
x11.keyMap[XK_KP_6] = Fw::Key6;
x11.keyMap[XK_KP_7] = Fw::Key7;
x11.keyMap[XK_KP_8] = Fw::Key8;
x11.keyMap[XK_KP_9] = Fw::Key9;
x11.keyMap[XK_Page_Up] = KC_PGUP; x11.keyMap[XK_F1] = Fw::KeyF1;
x11.keyMap[XK_Page_Down] = KC_PGDOWN; x11.keyMap[XK_F2] = Fw::KeyF2;
x11.keyMap[XK_Home] = KC_HOME; x11.keyMap[XK_F3] = Fw::KeyF3;
x11.keyMap[XK_End] = KC_END; x11.keyMap[XK_F4] = Fw::KeyF4;
x11.keyMap[XK_F5] = Fw::KeyF5;
x11.keyMap[XK_Num_Lock] = KC_NUMLOCK; x11.keyMap[XK_F6] = Fw::KeyF6;
x11.keyMap[XK_Print] = KC_SYSRQ; x11.keyMap[XK_F7] = Fw::KeyF7;
x11.keyMap[XK_Scroll_Lock] = KC_SCROLL; x11.keyMap[XK_F8] = Fw::KeyF8;
x11.keyMap[XK_Pause] = KC_PAUSE; x11.keyMap[XK_F9] = Fw::KeyF9;
x11.keyMap[XK_F10] = Fw::KeyF10;
x11.keyMap[XK_Shift_R] = KC_RSHIFT; x11.keyMap[XK_F11] = Fw::KeyF11;
x11.keyMap[XK_Shift_L] = KC_LSHIFT; x11.keyMap[XK_F12] = Fw::KeyF12;
x11.keyMap[XK_Alt_R] = KC_RALT;
x11.keyMap[XK_Alt_L] = KC_LALT;
x11.keyMap[XK_Insert] = KC_INSERT;
x11.keyMap[XK_Delete] = KC_DELETE;
x11.keyMap[XK_Super_L] = KC_LWIN;
x11.keyMap[XK_Super_R] = KC_RWIN;
x11.keyMap[XK_Menu] = KC_APPS;
// try to set a latin1 locales otherwise fallback to standard C locale // try to set a latin1 locales otherwise fallback to standard C locale
static char locales[][32] = { "en_US.iso88591", "iso88591", "en_US", "C" }; static char locales[][32] = { "en_US.iso88591", "iso88591", "en_US", "C" };
@ -369,12 +378,12 @@ void Platform::poll()
if(x11.keyMap.find(keysym) != x11.keyMap.end()) if(x11.keyMap.find(keysym) != x11.keyMap.end())
inputEvent.keycode = x11.keyMap[keysym]; inputEvent.keycode = x11.keyMap[keysym];
else else
inputEvent.keycode = KC_UNKNOWN; inputEvent.keycode = Fw::KeyUnknown;
inputEvent.keycode = x11.keyMap[keysym]; inputEvent.keycode = x11.keyMap[keysym];
inputEvent.type = (event.type == KeyPress) ? EventKeyDown : EventKeyUp; inputEvent.type = (event.type == KeyPress) ? EventKeyDown : EventKeyUp;
if(inputEvent.keycode != KC_UNKNOWN || inputEvent.keychar != 0) if(inputEvent.keycode != Fw::KeyUnknown || inputEvent.keychar != 0)
m_listener->onPlatformEvent(inputEvent); m_listener->onPlatformEvent(inputEvent);
break; break;
} }

View File

@ -235,10 +235,8 @@ void UILineEdit::setText(const std::string& text)
{ {
if(m_text != text) { if(m_text != text) {
m_text = text; m_text = text;
if(m_cursorPos >= 0) { m_cursorPos = text.length();
m_cursorPos = 0; blinkCursor();
blinkCursor();
}
update(); update();
} }
} }
@ -391,24 +389,24 @@ void UILineEdit::onFocusChange(bool focused, Fw::FocusReason reason)
bool UILineEdit::onKeyPress(uchar keyCode, char keyChar, int keyboardModifiers) bool UILineEdit::onKeyPress(uchar keyCode, char keyChar, int keyboardModifiers)
{ {
if(keyCode == KC_DELETE) // erase right character if(keyCode == Fw::KeyDelete) // erase right character
removeCharacter(true); removeCharacter(true);
else if(keyCode == KC_BACK) // erase left character { else if(keyCode == Fw::KeyBackspace) // erase left character {
removeCharacter(false); removeCharacter(false);
else if(keyCode == KC_RIGHT) // move cursor right else if(keyCode == Fw::KeyRight) // move cursor right
moveCursor(true); moveCursor(true);
else if(keyCode == KC_LEFT) // move cursor left else if(keyCode == Fw::KeyLeft) // move cursor left
moveCursor(false); moveCursor(false);
else if(keyCode == KC_HOME) // move cursor to first character else if(keyCode == Fw::KeyHome) // move cursor to first character
setCursorPos(0); setCursorPos(0);
else if(keyCode == KC_END) // move cursor to last character else if(keyCode == Fw::KeyEnd) // move cursor to last character
setCursorPos(m_text.length()); setCursorPos(m_text.length());
else if(keyCode == KC_V && keyboardModifiers == Fw::KeyboardCtrlModifier) else if(keyCode == Fw::KeyV && keyboardModifiers == Fw::KeyboardCtrlModifier)
appendText(g_platform.getClipboardText()); appendText(g_platform.getClipboardText());
else if(keyCode == KC_TAB) { else if(keyCode == Fw::KeyTab) {
if(UIWidgetPtr parent = getParent()) if(UIWidgetPtr parent = getParent())
parent->focusNextChild(Fw::TabFocusReason); parent->focusNextChild(Fw::TabFocusReason);
} else if(keyCode == KC_RETURN) { } else if(keyCode == Fw::KeyReturn || keyCode == Fw::KeyEnter) {
if(m_onAction) if(m_onAction)
m_onAction(); m_onAction();
} else if(keyChar != 0) } else if(keyChar != 0)

View File

@ -750,21 +750,24 @@ void UIWidget::onStyleApply(const OTMLNodePtr& styleNode)
void UIWidget::onGeometryUpdate(const Rect& oldRect, const Rect& newRect) void UIWidget::onGeometryUpdate(const Rect& oldRect, const Rect& newRect)
{ {
callLuaField("onGeometryUpdate", oldRect, newRect);
} }
void UIWidget::onFocusChange(bool focused, Fw::FocusReason reason) void UIWidget::onFocusChange(bool focused, Fw::FocusReason reason)
{ {
callLuaField("onHoverChange", focused, reason);
} }
void UIWidget::onHoverChange(bool hovered) void UIWidget::onHoverChange(bool hovered)
{ {
callLuaField("onHoverChange", hovered);
} }
bool UIWidget::onKeyPress(uchar keyCode, char keyChar, int keyboardModifiers) bool UIWidget::onKeyPress(uchar keyCode, char keyChar, int keyboardModifiers)
{ {
if(callLuaField<bool>("onKeyPress", keyCode, keyChar, keyboardModifiers))
return true;
// do a backup of children list, because it may change while looping it // do a backup of children list, because it may change while looping it
UIWidgetList children; UIWidgetList children;
for(const UIWidgetPtr& child : m_children) { for(const UIWidgetPtr& child : m_children) {
@ -787,6 +790,9 @@ bool UIWidget::onKeyPress(uchar keyCode, char keyChar, int keyboardModifiers)
bool UIWidget::onKeyRelease(uchar keyCode, char keyChar, int keyboardModifiers) bool UIWidget::onKeyRelease(uchar keyCode, char keyChar, int keyboardModifiers)
{ {
if(callLuaField<bool>("onKeyRelease", keyCode, keyChar, keyboardModifiers))
return true;
// do a backup of children list, because it may change while looping it // do a backup of children list, because it may change while looping it
UIWidgetList children; UIWidgetList children;
for(const UIWidgetPtr& child : m_children) { for(const UIWidgetPtr& child : m_children) {
@ -809,6 +815,9 @@ bool UIWidget::onKeyRelease(uchar keyCode, char keyChar, int keyboardModifiers)
bool UIWidget::onMousePress(const Point& mousePos, Fw::MouseButton button) bool UIWidget::onMousePress(const Point& mousePos, Fw::MouseButton button)
{ {
if(callLuaField<bool>("onMousePress", mousePos, button))
return true;
// do a backup of children list, because it may change while looping it // do a backup of children list, because it may change while looping it
UIWidgetList children; UIWidgetList children;
for(const UIWidgetPtr& child : m_children) { for(const UIWidgetPtr& child : m_children) {
@ -840,6 +849,9 @@ bool UIWidget::onMousePress(const Point& mousePos, Fw::MouseButton button)
bool UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button) bool UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button)
{ {
if(callLuaField<bool>("onMouseRelease", mousePos, button))
return true;
// do a backup of children list, because it may change while looping it // do a backup of children list, because it may change while looping it
UIWidgetList children; UIWidgetList children;
for(const UIWidgetPtr& child : m_children) { for(const UIWidgetPtr& child : m_children) {
@ -866,6 +878,9 @@ bool UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button)
bool UIWidget::onMouseMove(const Point& mousePos, const Point& mouseMoved) bool UIWidget::onMouseMove(const Point& mousePos, const Point& mouseMoved)
{ {
if(callLuaField<bool>("onMouseMove", mousePos, mouseMoved))
return true;
// do a backup of children list, because it may change while looping it // do a backup of children list, because it may change while looping it
UIWidgetList children; UIWidgetList children;
for(const UIWidgetPtr& child : m_children) { for(const UIWidgetPtr& child : m_children) {
@ -887,6 +902,9 @@ bool UIWidget::onMouseMove(const Point& mousePos, const Point& mouseMoved)
bool UIWidget::onMouseWheel(const Point& mousePos, Fw::MouseWheelDirection direction) bool UIWidget::onMouseWheel(const Point& mousePos, Fw::MouseWheelDirection direction)
{ {
if(callLuaField<bool>("onMouseWheel", mousePos, direction))
return true;
// do a backup of children list, because it may change while looping it // do a backup of children list, because it may change while looping it
UIWidgetList children; UIWidgetList children;
for(const UIWidgetPtr& child : m_children) { for(const UIWidgetPtr& child : m_children) {

View File

@ -294,25 +294,25 @@ void OTClient::onPlatformEvent(const PlatformEvent& event)
if(event.type == EventKeyDown) { if(event.type == EventKeyDown) {
if(!event.ctrl && !event.alt && !event.shift) { if(!event.ctrl && !event.alt && !event.shift) {
if(event.keycode == KC_UP) if(event.keycode == Fw::KeyUp)
g_game.walk(Otc::North); g_game.walk(Otc::North);
else if(event.keycode == KC_RIGHT) else if(event.keycode == Fw::KeyRight)
g_game.walk(Otc::East); g_game.walk(Otc::East);
else if(event.keycode == KC_DOWN) else if(event.keycode == Fw::KeyDown)
g_game.walk(Otc::South); g_game.walk(Otc::South);
else if(event.keycode == KC_LEFT) else if(event.keycode == Fw::KeyLeft)
g_game.walk(Otc::West); g_game.walk(Otc::West);
} }
else if(event.ctrl && !event.alt && !event.shift) { else if(event.ctrl && !event.alt && !event.shift) {
if(event.keycode == KC_UP) if(event.keycode == Fw::KeyUp)
g_game.turn(Otc::North); g_game.turn(Otc::North);
else if(event.keycode == KC_RIGHT) else if(event.keycode == Fw::KeyRight)
g_game.turn(Otc::East); g_game.turn(Otc::East);
else if(event.keycode == KC_DOWN) else if(event.keycode == Fw::KeyDown)
g_game.turn(Otc::South); g_game.turn(Otc::South);
else if(event.keycode == KC_LEFT) else if(event.keycode == Fw::KeyLeft)
g_game.turn(Otc::West); g_game.turn(Otc::West);
else if(event.keycode == KC_APOSTROPHE) { else if(event.keycode == Fw::KeyApostrophe) {
// TODO: move these events to lua // TODO: move these events to lua
UIWidgetPtr console = g_ui.getRootWidget()->getChildById("consolePanel"); UIWidgetPtr console = g_ui.getRootWidget()->getChildById("consolePanel");
if(!console->isExplicitlyVisible()) { if(!console->isExplicitlyVisible()) {