WIP: testing IME text editing
This commit is a test for IME text editing. For CJK text editing you may need to use a font that support CHK characters like: https://github.com/be5invis/Sarasa-Gothic Currently on windows we receive no text editing events.
This commit is contained in:
parent
9fb166d3cc
commit
f5cc91e400
|
@ -309,6 +309,29 @@ function DocView:on_text_input(text)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function DocView:draw_ime_text_editing(text, start, len)
|
||||||
|
local line, col = self.doc:get_selection()
|
||||||
|
local x, y = self:get_line_screen_position(line)
|
||||||
|
x = x + get_col_x_offset(line, col)
|
||||||
|
local default_font = self:get_font()
|
||||||
|
local subpixel_scale = default_font:subpixel_scale()
|
||||||
|
local tx, ty = subpixel_scale * x, y + self:get_line_text_y_offset()
|
||||||
|
renderer.draw_text_subpixel(default_font, text, tx, ty, style.text)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function DocView:on_ime_text_editing(text, start, len)
|
||||||
|
local line, col = self.doc:get_selection()
|
||||||
|
local x, y = self:get_line_screen_position(line)
|
||||||
|
x = x + get_col_x_offset(line, col)
|
||||||
|
local h = self:get_line_height()
|
||||||
|
local w = self:get_font():get_width(5)
|
||||||
|
system.set_ime_input_rect(x, y, w, h)
|
||||||
|
|
||||||
|
core.root_view:defer_draw(draw_ime_text_editing, self, text, start, len)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function DocView:update()
|
function DocView:update()
|
||||||
-- scroll to make caret visible and reset blink timer if it moved
|
-- scroll to make caret visible and reset blink timer if it moved
|
||||||
local line, col = self.doc:get_selection()
|
local line, col = self.doc:get_selection()
|
||||||
|
|
|
@ -954,6 +954,9 @@ function core.on_event(type, ...)
|
||||||
end
|
end
|
||||||
elseif type == "focuslost" then
|
elseif type == "focuslost" then
|
||||||
core.root_view:on_focus_lost(...)
|
core.root_view:on_focus_lost(...)
|
||||||
|
elseif type == "textediting" then
|
||||||
|
core.root_view:on_ime_text_editing(...)
|
||||||
|
did_keymap = keymap.on_key_pressed(...)
|
||||||
elseif type == "quit" then
|
elseif type == "quit" then
|
||||||
core.quit()
|
core.quit()
|
||||||
end
|
end
|
||||||
|
|
|
@ -1033,6 +1033,11 @@ function RootView:on_focus_lost(...)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function RootView:on_ime_text_editing(...)
|
||||||
|
core.active_view:on_ime_text_editing(...)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function RootView:interpolate_drag_overlay(overlay)
|
function RootView:interpolate_drag_overlay(overlay)
|
||||||
self:move_towards(overlay, "x", overlay.to.x)
|
self:move_towards(overlay, "x", overlay.to.x)
|
||||||
self:move_towards(overlay, "y", overlay.to.y)
|
self:move_towards(overlay, "y", overlay.to.y)
|
||||||
|
|
|
@ -102,6 +102,9 @@ function View:on_text_input(text)
|
||||||
-- no-op
|
-- no-op
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- no-op
|
||||||
|
View.on_ime_text_editing = View.on_text_input
|
||||||
|
|
||||||
|
|
||||||
function View:on_mouse_wheel(y)
|
function View:on_mouse_wheel(y)
|
||||||
if self.scrollable then
|
if self.scrollable then
|
||||||
|
|
|
@ -193,6 +193,14 @@ top:
|
||||||
lua_pushstring(L, get_key_name(&e, buf));
|
lua_pushstring(L, get_key_name(&e, buf));
|
||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
|
case SDL_TEXTEDITING:
|
||||||
|
fprintf(stderr, "textediting: %s (%d, %d)\n", e.edit.text, e.edit.start, e.edit.length); fflush(stderr);
|
||||||
|
lua_pushstring(L, "textediting");
|
||||||
|
lua_pushstring(L, e.edit.text);
|
||||||
|
lua_pushnumber(L, e.edit.start);
|
||||||
|
lua_pushnumber(L, e.edit.length);
|
||||||
|
return 4;
|
||||||
|
|
||||||
case SDL_TEXTINPUT:
|
case SDL_TEXTINPUT:
|
||||||
lua_pushstring(L, "textinput");
|
lua_pushstring(L, "textinput");
|
||||||
lua_pushstring(L, e.text.text);
|
lua_pushstring(L, e.text.text);
|
||||||
|
@ -652,6 +660,16 @@ static int f_set_window_opacity(lua_State *L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int f_set_ime_input_rect(lua_State *L) {
|
||||||
|
SDL_Rect r;
|
||||||
|
r.x = luaL_checkinteger(L, 1);
|
||||||
|
r.y = luaL_checkinteger(L, 2);
|
||||||
|
r.w = luaL_checkinteger(L, 3);
|
||||||
|
r.h = luaL_checkinteger(L, 4);
|
||||||
|
SDL_SetTextInputRect(&r);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const luaL_Reg lib[] = {
|
static const luaL_Reg lib[] = {
|
||||||
{ "poll_event", f_poll_event },
|
{ "poll_event", f_poll_event },
|
||||||
{ "wait_event", f_wait_event },
|
{ "wait_event", f_wait_event },
|
||||||
|
@ -678,6 +696,7 @@ static const luaL_Reg lib[] = {
|
||||||
{ "exec", f_exec },
|
{ "exec", f_exec },
|
||||||
{ "fuzzy_match", f_fuzzy_match },
|
{ "fuzzy_match", f_fuzzy_match },
|
||||||
{ "set_window_opacity", f_set_window_opacity },
|
{ "set_window_opacity", f_set_window_opacity },
|
||||||
|
{ "set_ime_input_rect", f_set_ime_input_rect },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue