mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-12-22 09:39:43 +01:00
Add selection background to IME rendering
Decided to implement it anyway since the broken behavior (selection length always being 0, at least on Windows) may get fixed later in SDL, so let's do it right in one go.
This commit is contained in:
parent
8b8f827b70
commit
9ec8d8b637
3 changed files with 60 additions and 0 deletions
|
@ -4,6 +4,7 @@
|
||||||
#include "Font.h"
|
#include "Font.h"
|
||||||
#include "Graphics.h"
|
#include "Graphics.h"
|
||||||
#include "KeyPoll.h"
|
#include "KeyPoll.h"
|
||||||
|
#include "UTF8.h"
|
||||||
|
|
||||||
static bool render_done = false;
|
static bool render_done = false;
|
||||||
static SDL_Rect imebox;
|
static SDL_Rect imebox;
|
||||||
|
@ -31,6 +32,53 @@ void ime_render(void)
|
||||||
|
|
||||||
graphics.fill_rect(&imebox_border, 128, 128, 128);
|
graphics.fill_rect(&imebox_border, 128, 128, 128);
|
||||||
graphics.fill_rect(&imebox, 0, 0, 0);
|
graphics.fill_rect(&imebox, 0, 0, 0);
|
||||||
|
|
||||||
|
if (key.imebuffer_length > 0)
|
||||||
|
{
|
||||||
|
/* Also show a selection, so we need to know where and how long it is...
|
||||||
|
* Because SDL gives us the number of "characters" (so, codepoints)... */
|
||||||
|
const char* imebuffer_ptr = key.imebuffer.c_str();
|
||||||
|
const char* sel_start_ptr = imebuffer_ptr;
|
||||||
|
for (int i = 0; i < key.imebuffer_start; i++)
|
||||||
|
{
|
||||||
|
if (UTF8_next(&sel_start_ptr) == 0)
|
||||||
|
{
|
||||||
|
// Already past the '\0'...
|
||||||
|
sel_start_ptr--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const char* sel_end_ptr = sel_start_ptr;
|
||||||
|
for (int i = 0; i < key.imebuffer_length; i++)
|
||||||
|
{
|
||||||
|
if (UTF8_next(&sel_end_ptr) == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
size_t before_sel_nbytes = sel_start_ptr - imebuffer_ptr;
|
||||||
|
size_t in_sel_nbytes = sel_end_ptr - sel_start_ptr;
|
||||||
|
char* before_sel = (char*) SDL_malloc(before_sel_nbytes + 1);
|
||||||
|
char* in_sel = (char*) SDL_malloc(in_sel_nbytes + 1);
|
||||||
|
if (before_sel != NULL && in_sel != NULL)
|
||||||
|
{
|
||||||
|
SDL_memcpy(before_sel, imebuffer_ptr, before_sel_nbytes);
|
||||||
|
before_sel[before_sel_nbytes] = '\0';
|
||||||
|
SDL_memcpy(in_sel, sel_start_ptr, in_sel_nbytes);
|
||||||
|
in_sel[in_sel_nbytes] = '\0';
|
||||||
|
|
||||||
|
int before_sel_pixels = font::len(PR_FONT_LEVEL, before_sel);
|
||||||
|
int in_sel_pixels = font::len(PR_FONT_LEVEL, in_sel);
|
||||||
|
|
||||||
|
SDL_Rect selrect = imebox;
|
||||||
|
selrect.x += before_sel_pixels + 1;
|
||||||
|
selrect.w = in_sel_pixels;
|
||||||
|
graphics.fill_rect(&selrect, 128, 64, 0);
|
||||||
|
}
|
||||||
|
SDL_free(before_sel);
|
||||||
|
SDL_free(in_sel);
|
||||||
|
}
|
||||||
|
|
||||||
font::print(PR_FONT_LEVEL | PR_CJK_LOW, imebox.x + 1, imebox.y + 1, key.imebuffer, 255, 255, 255);
|
font::print(PR_FONT_LEVEL | PR_CJK_LOW, imebox.x + 1, imebox.y + 1, key.imebuffer, 255, 255, 255);
|
||||||
|
|
||||||
render_done = true;
|
render_done = true;
|
||||||
|
|
|
@ -52,6 +52,8 @@ KeyPoll::KeyPoll(void)
|
||||||
|
|
||||||
keybuffer = "";
|
keybuffer = "";
|
||||||
imebuffer = "";
|
imebuffer = "";
|
||||||
|
imebuffer_start = 0;
|
||||||
|
imebuffer_length = 0;
|
||||||
leftbutton=0; rightbutton=0; middlebutton=0;
|
leftbutton=0; rightbutton=0; middlebutton=0;
|
||||||
mousex = 0;
|
mousex = 0;
|
||||||
mousey = 0;
|
mousey = 0;
|
||||||
|
@ -67,6 +69,8 @@ void KeyPoll::enabletextentry(void)
|
||||||
{
|
{
|
||||||
keybuffer = "";
|
keybuffer = "";
|
||||||
imebuffer = "";
|
imebuffer = "";
|
||||||
|
imebuffer_start = 0;
|
||||||
|
imebuffer_length = 0;
|
||||||
SDL_StartTextInput();
|
SDL_StartTextInput();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,6 +78,8 @@ void KeyPoll::disabletextentry(void)
|
||||||
{
|
{
|
||||||
SDL_StopTextInput();
|
SDL_StopTextInput();
|
||||||
imebuffer = "";
|
imebuffer = "";
|
||||||
|
imebuffer_start = 0;
|
||||||
|
imebuffer_length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KeyPoll::textentry(void)
|
bool KeyPoll::textentry(void)
|
||||||
|
@ -326,9 +332,13 @@ void KeyPoll::Poll(void)
|
||||||
break;
|
break;
|
||||||
case SDL_TEXTEDITING:
|
case SDL_TEXTEDITING:
|
||||||
imebuffer = evt.edit.text;
|
imebuffer = evt.edit.text;
|
||||||
|
imebuffer_start = evt.edit.start;
|
||||||
|
imebuffer_length = evt.edit.length;
|
||||||
break;
|
break;
|
||||||
case SDL_TEXTEDITING_EXT:
|
case SDL_TEXTEDITING_EXT:
|
||||||
imebuffer = evt.editExt.text;
|
imebuffer = evt.editExt.text;
|
||||||
|
imebuffer_start = evt.editExt.start;
|
||||||
|
imebuffer_length = evt.editExt.length;
|
||||||
SDL_free(evt.editExt.text);
|
SDL_free(evt.editExt.text);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,8 @@ public:
|
||||||
bool pressedbackspace;
|
bool pressedbackspace;
|
||||||
std::string keybuffer;
|
std::string keybuffer;
|
||||||
std::string imebuffer;
|
std::string imebuffer;
|
||||||
|
int imebuffer_start;
|
||||||
|
int imebuffer_length;
|
||||||
|
|
||||||
bool linealreadyemptykludge;
|
bool linealreadyemptykludge;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue