Fix multibytes character display
Fix key repeat git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8404 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
91c56b1c29
commit
2cca927fe5
@ -52,7 +52,7 @@ print_key( char *chars, int32 offset )
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Keymap::GetChars(int32 keyCode, uint32 modifiers, char **chars)
|
Keymap::GetChars(uint32 keyCode, uint32 modifiers, char **chars, int32 *numBytes)
|
||||||
{
|
{
|
||||||
int32 offset = 0;
|
int32 offset = 0;
|
||||||
switch (modifiers & 0xff) {
|
switch (modifiers & 0xff) {
|
||||||
@ -67,9 +67,9 @@ Keymap::GetChars(int32 keyCode, uint32 modifiers, char **chars)
|
|||||||
case B_CONTROL_KEY: offset = fKeys.control_map[keyCode]; break;
|
case B_CONTROL_KEY: offset = fKeys.control_map[keyCode]; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int size = fChars[offset++];
|
*numBytes = fChars[offset++];
|
||||||
|
|
||||||
switch( size ) {
|
switch( *numBytes ) {
|
||||||
case 0:
|
case 0:
|
||||||
// Not mapped
|
// Not mapped
|
||||||
*chars = NULL;
|
*chars = NULL;
|
||||||
@ -77,9 +77,9 @@ Keymap::GetChars(int32 keyCode, uint32 modifiers, char **chars)
|
|||||||
default:
|
default:
|
||||||
// 1-, 2-, 3-, or 4-byte UTF-8 character
|
// 1-, 2-, 3-, or 4-byte UTF-8 character
|
||||||
{
|
{
|
||||||
char *str = *chars = new char[size + 1];
|
char *str = *chars = new char[*numBytes + 1];
|
||||||
strncpy(str, &(fChars[offset]), size );
|
strncpy(str, &(fChars[offset]), *numBytes );
|
||||||
str[size] = 0;
|
str[*numBytes] = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -140,3 +140,22 @@ Keymap::Load(entry_ref &ref)
|
|||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Keymap::IsModifierKey(uint32 keyCode)
|
||||||
|
{
|
||||||
|
if ((keyCode == fKeys.caps_key)
|
||||||
|
|| (keyCode == fKeys.num_key)
|
||||||
|
|| (keyCode == fKeys.left_shift_key)
|
||||||
|
|| (keyCode == fKeys.right_shift_key)
|
||||||
|
|| (keyCode == fKeys.left_command_key)
|
||||||
|
|| (keyCode == fKeys.right_command_key)
|
||||||
|
|| (keyCode == fKeys.left_control_key)
|
||||||
|
|| (keyCode == fKeys.right_control_key)
|
||||||
|
|| (keyCode == fKeys.left_option_key)
|
||||||
|
|| (keyCode == fKeys.right_option_key)
|
||||||
|
|| (keyCode == fKeys.menu_key))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -24,7 +24,8 @@ class Keymap
|
|||||||
public:
|
public:
|
||||||
status_t Load(entry_ref &ref);
|
status_t Load(entry_ref &ref);
|
||||||
void DumpKeymap();
|
void DumpKeymap();
|
||||||
void GetChars(int32 keyCode, uint32 modifiers, char **chars);
|
void GetChars(uint32 keyCode, uint32 modifiers, char **chars, int32 *numBytes);
|
||||||
|
bool IsModifierKey(uint32 keyCode);
|
||||||
private:
|
private:
|
||||||
char *fChars;
|
char *fChars;
|
||||||
key_map fKeys;
|
key_map fKeys;
|
||||||
|
@ -725,6 +725,7 @@ MapView::AttachedToWindow()
|
|||||||
{
|
{
|
||||||
SetEventMask(B_KEYBOARD_EVENTS, B_NO_POINTER_HISTORY);
|
SetEventMask(B_KEYBOARD_EVENTS, B_NO_POINTER_HISTORY);
|
||||||
fTextView->SetViewColor(255,255,255);
|
fTextView->SetViewColor(255,255,255);
|
||||||
|
fTextView->SetStylable(true);
|
||||||
BView::AttachedToWindow();
|
BView::AttachedToWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1157,7 +1158,8 @@ MapView::DrawKey(int32 keyCode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char *str;
|
char *str;
|
||||||
fCurrentMap->GetChars(keyCode, fOldKeyInfo.modifiers, &str);
|
int32 numBytes;
|
||||||
|
fCurrentMap->GetChars(keyCode, fOldKeyInfo.modifiers, &str, &numBytes);
|
||||||
if (str) {
|
if (str) {
|
||||||
bool hasGlyphs;
|
bool hasGlyphs;
|
||||||
fCurrentFont.GetHasGlyphs(str, 1, &hasGlyphs);
|
fCurrentFont.GetHasGlyphs(str, 1, &hasGlyphs);
|
||||||
@ -1223,13 +1225,29 @@ MapView::MessageReceived(BMessage *msg)
|
|||||||
DrawKey(keyCode);
|
DrawKey(keyCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keyCode<0)
|
||||||
|
for (int8 i=0; i<16; i++) {
|
||||||
|
uint8 stbits = states[i];
|
||||||
|
for (int8 j=7; stbits; j--,stbits>>=1)
|
||||||
|
if (stbits & 1) {
|
||||||
|
keyCode = i*8 + j;
|
||||||
|
if (!fCurrentMap->IsModifierKey(keyCode)) {
|
||||||
|
i = 16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (Window()->IsActive() && keyCode >= 0
|
|
||||||
|
if (Window()->IsActive()
|
||||||
&& msg->what == B_KEY_DOWN) {
|
&& msg->what == B_KEY_DOWN) {
|
||||||
fTextView->MakeFocus();
|
fTextView->MakeFocus();
|
||||||
char *str;
|
char *str;
|
||||||
fCurrentMap->GetChars(keyCode, fOldKeyInfo.modifiers, &str);
|
int32 numBytes;
|
||||||
fTextView->FakeKeyDown(str, 1);
|
fCurrentMap->GetChars(keyCode, fOldKeyInfo.modifiers, &str, &numBytes);
|
||||||
|
if (numBytes>0)
|
||||||
|
fTextView->FakeKeyDown(str, numBytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1255,3 +1273,29 @@ MapView::KeyUp(const char* bytes, int32 numBytes)
|
|||||||
{
|
{
|
||||||
MessageReceived(Window()->CurrentMessage());
|
MessageReceived(Window()->CurrentMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
MapView::MouseDown(BPoint point)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MapView::MouseUp(BPoint point)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MapView::MouseMoved(BPoint point, uint32 transit, const BMessage *msg)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MapView::SetFontFamily(const font_family family)
|
||||||
|
{
|
||||||
|
fCurrentFont.SetFamilyAndStyle(family, NULL);
|
||||||
|
fTextView->SetFont(&fCurrentFont);
|
||||||
|
};
|
||||||
|
@ -39,7 +39,10 @@ public:
|
|||||||
void KeyDown(const char* bytes, int32 numBytes);
|
void KeyDown(const char* bytes, int32 numBytes);
|
||||||
void KeyUp(const char* bytes, int32 numBytes);
|
void KeyUp(const char* bytes, int32 numBytes);
|
||||||
void MessageReceived(BMessage *msg);
|
void MessageReceived(BMessage *msg);
|
||||||
void SetFontFamily(const font_family family) {fCurrentFont.SetFamilyAndStyle(family, NULL); };
|
void SetFontFamily(const font_family family);
|
||||||
|
void MouseDown(BPoint point);
|
||||||
|
void MouseUp(BPoint point);
|
||||||
|
void MouseMoved(BPoint point, uint32 transit, const BMessage *msg);
|
||||||
private:
|
private:
|
||||||
key_info fOldKeyInfo;
|
key_info fOldKeyInfo;
|
||||||
BRect fKeysRect[128];
|
BRect fKeysRect[128];
|
||||||
@ -70,7 +73,6 @@ protected:
|
|||||||
|
|
||||||
BMenuBar *AddMenuBar();
|
BMenuBar *AddMenuBar();
|
||||||
void AddMaps(BView *placeholderView);
|
void AddMaps(BView *placeholderView);
|
||||||
//KeymapListItem* ItemFromEntry( BEntry *entry );
|
|
||||||
void UseKeymap();
|
void UseKeymap();
|
||||||
|
|
||||||
void FillSystemMaps();
|
void FillSystemMaps();
|
||||||
|
Loading…
Reference in New Issue
Block a user