* The L-shaped "enter" key can now also be drawn almost right (uses
BControlLook plus some clipping to do its magic). * Fixed scancode only mode of the keyboard layout view. * Fixed filter thanks to Rene. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29712 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
c31467186f
commit
a869d32e0c
@ -9,6 +9,7 @@
|
||||
#include <Bitmap.h>
|
||||
#include <ControlLook.h>
|
||||
#include <LayoutUtils.h>
|
||||
#include <Region.h>
|
||||
#include <Window.h>
|
||||
|
||||
#include "Keymap.h"
|
||||
@ -145,8 +146,7 @@ KeyboardLayoutView::MouseUp(BPoint point)
|
||||
if (key != NULL) {
|
||||
fKeyState[key->code / 8] &= ~(1 << (7 - (key->code & 7)));
|
||||
|
||||
if (fKeymap != NULL && _HandleDeadKey(key->code, fModifiers)
|
||||
&& fDeadKey != 0)
|
||||
if (_HandleDeadKey(key->code, fModifiers) && fDeadKey != 0)
|
||||
return;
|
||||
|
||||
_InvalidateKey(key);
|
||||
@ -376,6 +376,17 @@ KeyboardLayoutView::_LayoutKeyboard()
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
KeyboardLayoutView::_DrawKeyButton(BView* view, BRect rect, BRect updateRect,
|
||||
rgb_color base, bool pressed)
|
||||
{
|
||||
be_control_look->DrawButtonFrame(view, rect, updateRect, base,
|
||||
pressed ? BControlLook::B_ACTIVATED : 0);
|
||||
be_control_look->DrawButtonBackground(view, rect, updateRect,
|
||||
base, pressed ? BControlLook::B_ACTIVATED : 0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
KeyboardLayoutView::_DrawKey(BView* view, BRect updateRect, const Key* key,
|
||||
BRect rect, bool pressed)
|
||||
@ -383,7 +394,7 @@ KeyboardLayoutView::_DrawKey(BView* view, BRect updateRect, const Key* key,
|
||||
rgb_color base = key->dark ? kDarkColor : kBrightColor;
|
||||
key_kind keyKind = kNormalKey;
|
||||
int32 deadKey = 0;
|
||||
bool secondDeadKey;
|
||||
bool secondDeadKey = false;
|
||||
|
||||
char text[32];
|
||||
if (fKeymap != NULL) {
|
||||
@ -404,31 +415,52 @@ KeyboardLayoutView::_DrawKey(BView* view, BRect updateRect, const Key* key,
|
||||
base = kDeadKeyColor;
|
||||
|
||||
if (key->shape == kRectangleKeyShape) {
|
||||
be_control_look->DrawButtonFrame(view, rect, updateRect, base,
|
||||
pressed ? BControlLook::B_ACTIVATED : 0);
|
||||
be_control_look->DrawButtonBackground(view, rect, updateRect,
|
||||
base, pressed ? BControlLook::B_ACTIVATED : 0);
|
||||
_DrawKeyButton(view, rect, updateRect, base, pressed);
|
||||
|
||||
// TODO: make font size depend on key size!
|
||||
rect.InsetBy(1, 1);
|
||||
|
||||
be_control_look->DrawLabel(view, text, rect, updateRect,
|
||||
base, 0, BAlignment(B_ALIGN_CENTER, B_ALIGN_MIDDLE));
|
||||
} else if (key->shape == kEnterKeyShape) {
|
||||
// TODO: make better!
|
||||
rect.bottom -= 20;
|
||||
be_control_look->DrawButtonBackground(view, rect, updateRect,
|
||||
base, 0, BControlLook::B_LEFT_BORDER
|
||||
| BControlLook::B_RIGHT_BORDER
|
||||
| BControlLook::B_TOP_BORDER);
|
||||
BRegion region(rect);
|
||||
BRect originalRect = rect;
|
||||
BRect missingRect = rect;
|
||||
// TODO: for some reason, this does not always equal the bottom of
|
||||
// the other keys...
|
||||
missingRect.top = floorf(rect.bottom - fGap + 2
|
||||
- fLayout->DefaultKeySize().height * fFactor);
|
||||
missingRect.right = floorf(missingRect.left
|
||||
+ (key->frame.Width() - key->second_row) * fFactor - fGap - 2);
|
||||
region.Exclude(missingRect);
|
||||
ConstrainClippingRegion(®ion);
|
||||
|
||||
rect = _FrameFor(key);
|
||||
rect.top += 20;
|
||||
rect.left += 10;
|
||||
be_control_look->DrawButtonBackground(view, rect, updateRect,
|
||||
base, 0, BControlLook::B_LEFT_BORDER
|
||||
| BControlLook::B_RIGHT_BORDER
|
||||
| BControlLook::B_BOTTOM_BORDER);
|
||||
_DrawKeyButton(view, rect, updateRect, base, pressed);
|
||||
|
||||
rect.left = missingRect.right;
|
||||
be_control_look->DrawLabel(view, text, rect, updateRect,
|
||||
base, 0, BAlignment(B_ALIGN_CENTER, B_ALIGN_MIDDLE));
|
||||
|
||||
missingRect.right--;
|
||||
missingRect.top -= 2;
|
||||
region.Set(missingRect);
|
||||
ConstrainClippingRegion(®ion);
|
||||
|
||||
rect = originalRect;
|
||||
rect.bottom = missingRect.top + 2;
|
||||
_DrawKeyButton(view, rect, updateRect, base, pressed);
|
||||
|
||||
missingRect.left = missingRect.right;
|
||||
missingRect.right++;
|
||||
missingRect.top += 2;
|
||||
region.Set(missingRect);
|
||||
ConstrainClippingRegion(®ion);
|
||||
|
||||
rect = originalRect;
|
||||
rect.left = missingRect.right - 2;
|
||||
rect.top = missingRect.top - 2;
|
||||
_DrawKeyButton(view, rect, updateRect, base, pressed);
|
||||
|
||||
ConstrainClippingRegion(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -620,13 +652,15 @@ KeyboardLayoutView::_InvalidateKey(const Key* key)
|
||||
|
||||
|
||||
/*! Updates the fDeadKey member, and invalidates the view if needed.
|
||||
fKeymap must be valid when calling this method.
|
||||
|
||||
\return true if the view has been invalidated.
|
||||
*/
|
||||
bool
|
||||
KeyboardLayoutView::_HandleDeadKey(int32 key, int32 modifiers)
|
||||
{
|
||||
if (fKeymap == NULL)
|
||||
return false;
|
||||
|
||||
int32 deadKey = fKeymap->IsDeadKey(key, modifiers);
|
||||
if (fDeadKey != deadKey) {
|
||||
Invalidate();
|
||||
@ -660,6 +694,9 @@ KeyboardLayoutView::_KeyChanged(const BMessage* message)
|
||||
if (message->what == B_KEY_DOWN || message->what == B_UNMAPPED_KEY_DOWN) {
|
||||
if (_HandleDeadKey(key, fModifiers))
|
||||
checkSingle = false;
|
||||
|
||||
if (_KeyForCode(key) == NULL)
|
||||
printf("no key for code %ld\n", key);
|
||||
}
|
||||
|
||||
for (int32 i = 0; i < 16; i++) {
|
||||
@ -709,12 +746,10 @@ BRect
|
||||
KeyboardLayoutView::_FrameFor(BRect keyFrame)
|
||||
{
|
||||
BRect rect;
|
||||
rect.left = keyFrame.left * fFactor;
|
||||
rect.right = (keyFrame.right - keyFrame.left) * fFactor + rect.left
|
||||
- fGap - 1;
|
||||
rect.top = keyFrame.top * fFactor;
|
||||
rect.bottom = (keyFrame.bottom - keyFrame.top) * fFactor + rect.top
|
||||
- fGap - 1;
|
||||
rect.left = ceilf(keyFrame.left * fFactor);
|
||||
rect.right = floorf((keyFrame.Width()) * fFactor + rect.left - fGap - 1);
|
||||
rect.top = ceilf(keyFrame.top * fFactor);
|
||||
rect.bottom = floorf((keyFrame.Height()) * fFactor + rect.top - fGap - 1);
|
||||
rect.OffsetBy(fOffset);
|
||||
|
||||
return rect;
|
||||
|
@ -51,6 +51,8 @@ private:
|
||||
};
|
||||
|
||||
void _LayoutKeyboard();
|
||||
void _DrawKeyButton(BView* view, BRect rect,
|
||||
BRect updateRect, rgb_color base, bool pressed);
|
||||
void _DrawKey(BView* view, BRect updateRect,
|
||||
const Key* key, BRect frame, bool pressed);
|
||||
const char* _SpecialKeyLabel(const key_map& map, uint32 code);
|
||||
|
@ -504,6 +504,9 @@ Keymap::_Offset(uint32 keyCode, uint32 modifiers, uint32* _table)
|
||||
int32 offset;
|
||||
uint32 table;
|
||||
|
||||
if (keyCode >= 128)
|
||||
return -1;
|
||||
|
||||
switch (modifiers & kModifierKeys) {
|
||||
case B_SHIFT_KEY:
|
||||
offset = fKeys.shift_map[keyCode];
|
||||
|
@ -83,10 +83,8 @@ KeymapWindow::KeymapWindow()
|
||||
|
||||
fKeyboardLayoutView->SetTarget(fTextControl->TextView());
|
||||
fTextControl->MakeFocus();
|
||||
AddCommonFilter(new KeymapMessageFilter(B_PROGRAMMED_DELIVERY, B_ANY_SOURCE,
|
||||
&fCurrentMap));
|
||||
// TODO: this does not work for some reason, investigate!
|
||||
// fTextControl->AddFilter(fTextFilter);
|
||||
fTextControl->TextView()->AddFilter(new KeymapMessageFilter(
|
||||
B_PROGRAMMED_DELIVERY, B_ANY_SOURCE, &fCurrentMap));
|
||||
|
||||
_UpdateButtons();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user