* Fixed drawing the L-shaped enter key; the clipping was constrained on the

wrong view since I added offscreen drawing.
* Added a description of the keyboard layout language; it's unlikely to
  undergo much changes anymore now.
* Added a few comments for stippi :-)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29921 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2009-04-05 08:34:32 +00:00
parent ab89b2f0c9
commit c066660256
4 changed files with 63 additions and 7 deletions
+49
View File
@@ -154,6 +154,50 @@ KeyboardLayout::Load(entry_ref& ref)
void void
KeyboardLayout::SetDefault() KeyboardLayout::SetDefault()
{ {
// The keyboard layout description language defines the position,
// size, shape, and scancodes of the keys on the keyboard, row by
// row.
// You can define variables that are substituted in the row
// descriptions. Variables are always prefixed with a '$' symbol.
// On top level, only two different terms are accepted: value pairs,
// and row descriptions.
// Value pairs are in the form "<name> = <value>". There are only two
// predefined names at this moment "name" that specifies the name of
// a layout, and "default-size" that specifies the size of keys when
// no specific size is given. Also, variables can be specified this
// way.
// Row descriptions are embedded in the '[' and ']' brackets.
// The first term within a row is the position of the row, written as
// "<x>,<y>;" - the delimiter between terms/keys is usually the
// semi-colon. After the initial position, key descriptions are expected
// until the row is closed with a ']'.
// A key description is of the form "<shape>:<scancodes>", where <shape>
// is combined of the shape of the character, and its size, written as
// "<kind><width>,<height>[,<second-row-width>]".
// The kind can either be 'r' (the default, can also be omitted) for
// rectangular keys, or 'l' for the enter key. Additionally, you can use
// the 'd' character to mark dark keys. The size can be omitted completely,
// in which case the defined "default-size" is used. The default size is
// also used to determine the height of the first row of the enter key;
// the "<second-row-width>" specifier is only valid for enter keys, too.
// The scancodes can be written in different ways:
// 1) "+<count>": adds <count> keys, the scancodes will be used relative
// to the previous keys.
// 2) "<first>-<last>": keys are added for scancode <first> to scancode
// <last>.
// 3) "<first>+<count>": one key with the <first> scancode is added, plus
// <count> ones with relative scancode from that one.
// Finally, you can also define LED indicator. Those can be made instead
// of a key, it accepts a size, but no shape modifiers. Also, instead of
// a scancode, the name of the modifer is given, currently only the
// following are allowed: "led-num", "led-caps", and "led-scroll".
// See for examples in the default layout below.
#if 1 #if 1
static const char* kDefaultLayout104 = "name = Generic 104-key\n" static const char* kDefaultLayout104 = "name = Generic 104-key\n"
// Size shortcuts // Size shortcuts
@@ -573,6 +617,7 @@ KeyboardLayout::_GetShape(const parse_state& state, const char* data, Key& key)
} }
/*! Returns the term delimiter expected in a certain parse mode. */
const char* const char*
KeyboardLayout::_Delimiter(parse_mode mode) KeyboardLayout::_Delimiter(parse_mode mode)
{ {
@@ -677,6 +722,10 @@ KeyboardLayout::_ParseTerm(const parse_state& state, const char*& data,
} }
/*! Initializes the keyboard layout from the data given.
The string has to be a valid keyboard layout description, otherwise
an error is returned.
*/
status_t status_t
KeyboardLayout::_InitFrom(const char* data) KeyboardLayout::_InitFrom(const char* data)
{ {
+1
View File
@@ -28,6 +28,7 @@ struct Key {
key_shape shape; key_shape shape;
BRect frame; BRect frame;
float second_row; float second_row;
// this is the width of the second row of a kEnterKeyShape key
bool dark; bool dark;
}; };
@@ -538,14 +538,15 @@ KeyboardLayoutView::_DrawKey(BView* view, BRect updateRect, const Key* key,
BRegion region(rect); BRegion region(rect);
BRect originalRect = rect; BRect originalRect = rect;
BRect missingRect = rect; BRect missingRect = rect;
// TODO: for some reason, this does not always equal the bottom of // TODO: for some reason, this does not always equal the bottom of
// the other keys... // the other keys...
missingRect.top = floorf(rect.bottom - fGap + 2 missingRect.top = floorf(rect.top
- fLayout->DefaultKeySize().height * fFactor); + fLayout->DefaultKeySize().height * fFactor - fGap - 1);
missingRect.right = floorf(missingRect.left missingRect.right = floorf(missingRect.left
+ (key->frame.Width() - key->second_row) * fFactor - fGap - 2); + (key->frame.Width() - key->second_row) * fFactor - fGap - 2);
region.Exclude(missingRect); region.Exclude(missingRect);
ConstrainClippingRegion(&region); view->ConstrainClippingRegion(&region);
_DrawKeyButton(view, rect, updateRect, base, background, pressed); _DrawKeyButton(view, rect, updateRect, base, background, pressed);
@@ -556,7 +557,7 @@ KeyboardLayoutView::_DrawKey(BView* view, BRect updateRect, const Key* key,
missingRect.right--; missingRect.right--;
missingRect.top -= 2; missingRect.top -= 2;
region.Set(missingRect); region.Set(missingRect);
ConstrainClippingRegion(&region); view->ConstrainClippingRegion(&region);
rect = originalRect; rect = originalRect;
rect.bottom = missingRect.top + 2; rect.bottom = missingRect.top + 2;
@@ -566,14 +567,14 @@ KeyboardLayoutView::_DrawKey(BView* view, BRect updateRect, const Key* key,
missingRect.right++; missingRect.right++;
missingRect.top += 2; missingRect.top += 2;
region.Set(missingRect); region.Set(missingRect);
ConstrainClippingRegion(&region); view->ConstrainClippingRegion(&region);
rect = originalRect; rect = originalRect;
rect.left = missingRect.right - 2; rect.left = missingRect.right - 2;
rect.top = missingRect.top - 2; rect.top = missingRect.top - 2;
_DrawKeyButton(view, rect, updateRect, base, background, pressed); _DrawKeyButton(view, rect, updateRect, base, background, pressed);
ConstrainClippingRegion(NULL); view->ConstrainClippingRegion(NULL);
} }
} }
@@ -3,6 +3,11 @@
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
/*! This class implements a filter that applies a certain keymap to
the keyboard input.
It's used to be able to make keymap changes live within the
application.
*/
#include "KeymapMessageFilter.h" #include "KeymapMessageFilter.h"