* Ensure that we don't clear a combined B_*_KEY as long as one of the

B_{LEFT|RIGHT}_*_KEYs is pressed for shift, command, control and option.
  This fixes bug #3841.
* Only send a B_MODIFIERS_CHANGED message when the modifiers actually changed.
* Minor simplification to only check for the lock keys once.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30538 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Lotz 2009-05-01 18:43:57 +00:00
parent ce6115a180
commit c8d10a521f

View File

@ -649,12 +649,14 @@ KeyboardDevice::_ControlThread()
ctrlAltDelPressed = true;
}
if (ctrlAltDelPressed) {
if (fOwner->fTeamMonitorWindow != NULL) {
BMessage message(kMsgCtrlAltDelPressed);
message.AddBool("key down", isKeyDown);
fOwner->fTeamMonitorWindow->PostMessage(&message);
}
if (!isKeyDown)
ctrlAltDelPressed = false;
}
@ -662,31 +664,45 @@ KeyboardDevice::_ControlThread()
BAutolock lock(fKeymapLock);
uint32 modifiers = fKeymap.Modifier(keycode);
if (modifiers
&& (!(modifiers & (B_CAPS_LOCK | B_NUM_LOCK | B_SCROLL_LOCK))
|| isKeyDown)) {
BMessage* msg = new BMessage;
if (msg == NULL)
continue;
bool isLock
= (modifiers & (B_CAPS_LOCK | B_NUM_LOCK | B_SCROLL_LOCK)) != 0;
if (modifiers != 0 && (!isLock || isKeyDown)) {
uint32 oldModifiers = fModifiers;
msg->AddInt64("when", timestamp);
msg->what = B_MODIFIERS_CHANGED;
msg->AddInt32("be:old_modifiers", fModifiers);
if ((isKeyDown && !(modifiers & (B_CAPS_LOCK | B_NUM_LOCK | B_SCROLL_LOCK)))
if ((isKeyDown && !isLock)
|| (isKeyDown && !(fModifiers & modifiers)))
fModifiers |= modifiers;
else
else {
fModifiers &= ~modifiers;
msg->AddInt32("modifiers", fModifiers);
msg->AddData("states", B_UINT8_TYPE, states, 16);
// ensure that we don't clear a combined B_*_KEY when still
// one of the individual B_{LEFT|RIGHT}_*_KEY is pressed
if (fModifiers & (B_LEFT_SHIFT_KEY | B_RIGHT_SHIFT_KEY))
fModifiers |= B_SHIFT_KEY;
if (fModifiers & (B_LEFT_COMMAND_KEY | B_RIGHT_COMMAND_KEY))
fModifiers |= B_COMMAND_KEY;
if (fModifiers & (B_LEFT_CONTROL_KEY | B_RIGHT_CONTROL_KEY))
fModifiers |= B_CONTROL_KEY;
if (fModifiers & (B_LEFT_OPTION_KEY | B_RIGHT_OPTION_KEY))
fModifiers |= B_OPTION_KEY;
}
if (fOwner->EnqueueMessage(msg) != B_OK)
delete msg;
if (fModifiers != oldModifiers) {
BMessage* message = new BMessage(B_MODIFIERS_CHANGED);
if (message == NULL)
continue;
if (modifiers & (B_CAPS_LOCK | B_NUM_LOCK | B_SCROLL_LOCK))
_UpdateLEDs();
message->AddInt64("when", timestamp);
message->AddInt32("be:old_modifiers", oldModifiers);
message->AddInt32("modifiers", fModifiers);
message->AddData("states", B_UINT8_TYPE, states, 16);
if (fOwner->EnqueueMessage(message) != B_OK)
delete message;
if (isLock)
_UpdateLEDs();
}
}
uint8 newDeadKey = 0;