From 1c6ca86bc5ff245aafeaeda8ae4cc1836f60b58c Mon Sep 17 00:00:00 2001 From: otya128 Date: Tue, 4 Jul 2017 20:01:09 +0900 Subject: [PATCH] IME --- SMILEBASIC/console.d | 54 ++++++++++++++++++++++++++++++++++++++ SMILEBASIC/petitcomputer.d | 31 +++++++++++++++------- 2 files changed, 76 insertions(+), 9 deletions(-) diff --git a/SMILEBASIC/console.d b/SMILEBASIC/console.d index 1ee1375..05c59b0 100644 --- a/SMILEBASIC/console.d +++ b/SMILEBASIC/console.d @@ -138,6 +138,21 @@ class Console backColors[petitcom.displaynum] = value; } + struct IMEditInfo + { + wstring editingText; + int start; + int length; + } + IMEditInfo imEditInfo; + void setIMEditInfo(wstring e, int s, int l) + { + imEditInfo.editingText = e; + imEditInfo.start = s; + imEditInfo.length = l; + writefln("%s,%s,%s", e, s, l); + } + bool showCursor; bool animationCursor; FontRect[] fontTable = new FontRect[65536]; @@ -377,6 +392,24 @@ class Console glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); + if (i == 0 && !imEditInfo.editingText.empty) + { + foreach (j, c; imEditInfo.editingText) + { + ConsoleCharacter cc; + cc.character = c; + cc.z = -256; + if (imEditInfo.start <= j && (imEditInfo.start + imEditInfo.length > j || imEditInfo.length == 0)) + { + cc.foreColor = 10; + } + else + { + cc.foreColor = 1; + } + drawCharacter(j, CSRYs[0], cc); + } + } for(int y = 0; y < consoleHeight; y++) for(int x = 0; x < consoleWidth; x++) { @@ -385,6 +418,27 @@ class Console glEnd(); glDisable(GL_TEXTURE_2D); glBegin(GL_QUADS); + + if (i == 0 && !imEditInfo.editingText.empty) + { + foreach (j, c; imEditInfo.editingText) + { + auto x = j, y = CSRYs[0]; + auto back = consoleColorGL[15]; + if (imEditInfo.start <= j && (imEditInfo.start + imEditInfo.length > j || imEditInfo.length == 0)) + { + back = consoleColorGL[1]; + } + if(back) + { + glColor4ubv(cast(ubyte*)&back); + glVertex3f(x * 8, y * 8 + 8, -256); + glVertex3f(x * 8, y * 8, -256); + glVertex3f(x * 8 + 8, y * 8, -256); + glVertex3f(x * 8 + 8, y * 8 + 8, -256); + } + } + } for(int y = 0; y < consoleHeight; y++) for(int x = 0; x < consoleWidth; x++) { diff --git a/SMILEBASIC/petitcomputer.d b/SMILEBASIC/petitcomputer.d index 0c43b5c..58e021e 100644 --- a/SMILEBASIC/petitcomputer.d +++ b/SMILEBASIC/petitcomputer.d @@ -739,12 +739,12 @@ class PetitComputer bool renderprofile = false; try { - version(Windows) + /*version(Windows) { auto imm32 = LoadLibraryA("imm32.dll".toStringz); ImmDisableIME ImmDisableIME = cast(ImmDisableIME)GetProcAddress(imm32, "ImmDisableIME".toStringz); if(ImmDisableIME) ImmDisableIME(0); - } + }*/ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); window = SDL_CreateWindow("SMILEBASIC", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 400, 240, @@ -808,7 +808,7 @@ class PetitComputer console.initGRPF(); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glEnable(GL_DEPTH_TEST); - version(Windows) + /*version(Windows) { SDL_SysWMinfo wm; if(SDL_GetWindowWMInfo(window, &wm)) @@ -819,7 +819,7 @@ class PetitComputer auto c = ImmAssociateContext(wm.info.win.window, null); } } - } + }*/ int loopcnt; DerelictGL3.reload(); console.GRPF.createBuffer(); @@ -926,6 +926,7 @@ class PetitComputer } maincntRender++; updateSticks(); + bool isReturnKeyPressed;//for IM while (SDL_PollEvent(&event)) { switch (event.type) @@ -984,15 +985,25 @@ class PetitComputer } if(key == SDLK_RETURN) { - sendKey('\u000D'); + isReturnKeyPressed = true; } } break; - case SDL_TEXTINPUT: - auto text = event.text.text[0..event.text.text.indexOf('\0')].to!wstring; - foreach(wchar key; text) + case SDL_TEXTEDITING: { - sendKey(key); + auto text = event.edit.text[0..event.text.text.indexOf('\0')].to!wstring; + console.setIMEditInfo(text, event.edit.start, event.edit.length); + break; + } + case SDL_TEXTINPUT: + { + console.setIMEditInfo("", 0, 0); + auto text = event.text.text[0..event.text.text.indexOf('\0')].to!wstring; + foreach(wchar key; text) + { + sendKey(key); + } + isReturnKeyPressed = false; } break; case SDL_MOUSEWHEEL: @@ -1041,6 +1052,8 @@ class PetitComputer break; } } + if (isReturnKeyPressed) + sendKey('\u000D'); long delay = (1000/60) - (cast(long)SDL_GetTicks() - profile); if(delay > 0) SDL_Delay(cast(uint)delay);