input_server: Notify apps of new key map

Define a new message, B_KEY_MAP_LOADED, that is broadcast to applications by
the Input Server each time a key map is loaded. This allows apps that cache
key-map data to know when their copy has become stale.

Change InputServer::HandleGetSetKeyMap() so it returns an error in the event
loading even the system (fallback) key map fails.

Change-Id: Icc6c884f695ca59c687d83c680bb2fb467dd90cc
Reviewed-on: https://review.haiku-os.org/c/haiku/+/1741
Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
Simon South
2019-08-27 06:49:37 +00:00
committed by Stephan Aßmus
parent 19f8517fc3
commit b9d9c282fd
2 changed files with 17 additions and 4 deletions
+1
View File
@@ -38,6 +38,7 @@ enum {
B_KEY_UP = '_KYU', B_KEY_UP = '_KYU',
B_UNMAPPED_KEY_DOWN = '_UKD', B_UNMAPPED_KEY_DOWN = '_UKD',
B_UNMAPPED_KEY_UP = '_UKU', B_UNMAPPED_KEY_UP = '_UKU',
B_KEY_MAP_LOADED = '_KML',
B_LAYOUT_WINDOW = '_LAY', B_LAYOUT_WINDOW = '_LAY',
B_MODIFIERS_CHANGED = '_MCH', B_MODIFIERS_CHANGED = '_MCH',
B_MINIMIZE = '_WMN', B_MINIMIZE = '_WMN',
+16 -4
View File
@@ -932,21 +932,33 @@ InputServer::HandleGetSetKeyMap(BMessage* message, BMessage* reply)
{ {
CALLED(); CALLED();
status_t status;
if (message->what == IS_GET_KEY_MAP) { if (message->what == IS_GET_KEY_MAP) {
status_t status = reply->AddData("keymap", B_ANY_TYPE, &fKeys, sizeof(fKeys)); status = reply->AddData("keymap", B_ANY_TYPE, &fKeys, sizeof(fKeys));
if (status == B_OK) if (status == B_OK)
status = reply->AddData("key_buffer", B_ANY_TYPE, fChars, fCharsSize); status = reply->AddData("key_buffer", B_ANY_TYPE, fChars, fCharsSize);
return status; return status;
} }
if (_LoadKeymap() != B_OK) status = _LoadKeymap();
_LoadSystemKeymap(); if (status != B_OK) {
status = _LoadSystemKeymap();
if (status != B_OK)
return status;
}
BMessage msg(IS_CONTROL_DEVICES); BMessage msg(IS_CONTROL_DEVICES);
msg.AddInt32("type", B_KEYBOARD_DEVICE); msg.AddInt32("type", B_KEYBOARD_DEVICE);
msg.AddInt32("code", B_KEY_MAP_CHANGED); msg.AddInt32("code", B_KEY_MAP_CHANGED);
return fAddOnManager->PostMessage(&msg); status = fAddOnManager->PostMessage(&msg);
if (status == B_OK) {
BMessage appMsg(B_KEY_MAP_LOADED);
be_roster->Broadcast(&appMsg);
}
return status;
} }