diff --git a/headers/private/input/InputServerTypes.h b/headers/private/input/InputServerTypes.h index 7ccec544d4..68377e7851 100644 --- a/headers/private/input/InputServerTypes.h +++ b/headers/private/input/InputServerTypes.h @@ -14,6 +14,7 @@ #define IS_SET_KEY_REPEAT_DELAY 'Isrd' #define IS_GET_KEY_INFO 'Igki' #define IS_GET_MODIFIERS 'Igmd' +#define IS_GET_MODIFIER_KEY 'Igmk' #define IS_SET_MODIFIER_KEY 'Ismk' #define IS_SET_KEYBOARD_LOCKS 'Iskl' #define IS_GET_MOUSE_SPEED 'Igms' diff --git a/src/kits/interface/InterfaceDefs.cpp b/src/kits/interface/InterfaceDefs.cpp index a402401dc9..c096fbb9b7 100644 --- a/src/kits/interface/InterfaceDefs.cpp +++ b/src/kits/interface/InterfaceDefs.cpp @@ -376,12 +376,10 @@ get_mouse_type(int32 *type) BMessage command(IS_GET_MOUSE_TYPE); BMessage reply; - _control_input_server_(&command, &reply); - - if (reply.FindInt32("mouse_type", type) != B_OK) - return B_ERROR; - - return B_OK; + status_t err = _control_input_server_(&command, &reply); + if (err != B_OK) + return err; + return reply.FindInt32("mouse_type", type); } @@ -391,7 +389,9 @@ set_mouse_type(int32 type) BMessage command(IS_SET_MOUSE_TYPE); BMessage reply; - command.AddInt32("mouse_type", type); + status_t err = command.AddInt32("mouse_type", type); + if (err != B_OK) + return err; return _control_input_server_(&command, &reply); } @@ -404,10 +404,11 @@ get_mouse_map(mouse_map *map) const void *data = 0; ssize_t count; - _control_input_server_(&command, &reply); - - if (reply.FindData("mousemap", B_RAW_TYPE, &data, &count) != B_OK) - return B_ERROR; + status_t err = _control_input_server_(&command, &reply); + if (err == B_OK) + err = reply.FindData("mousemap", B_RAW_TYPE, &data, &count); + if (err != B_OK) + return err; memcpy(map, data, count); @@ -421,7 +422,9 @@ set_mouse_map(mouse_map *map) BMessage command(IS_SET_MOUSE_MAP); BMessage reply; - command.AddData("mousemap", B_RAW_TYPE, map, sizeof(mouse_map)); + status_t err = command.AddData("mousemap", B_RAW_TYPE, map, sizeof(mouse_map)); + if (err != B_OK) + return err; return _control_input_server_(&command, &reply); } @@ -432,8 +435,10 @@ get_click_speed(bigtime_t *speed) BMessage command(IS_GET_CLICK_SPEED); BMessage reply; - _control_input_server_(&command, &reply); - + status_t err = _control_input_server_(&command, &reply); + if (err != B_OK) + return err; + if (reply.FindInt64("speed", speed) != B_OK) *speed = 500000; @@ -457,8 +462,10 @@ get_mouse_speed(int32 *speed) BMessage command(IS_GET_MOUSE_SPEED); BMessage reply; - _control_input_server_(&command, &reply); - + status_t err = _control_input_server_(&command, &reply); + if (err != B_OK) + return err; + if (reply.FindInt32("speed", speed) != B_OK) *speed = 65536; @@ -637,13 +644,34 @@ get_keyboard_id(uint16 *id) _control_input_server_(&command, &reply); - reply.FindInt16("id", (int16 *)&kid); + status_t err = reply.FindInt16("id", (int16 *)&kid); + if (err != B_OK) + return err; *id = kid; return B_OK; } +status_t +get_modifier_key(uint32 modifier, uint32 *key) +{ + BMessage command(IS_GET_MODIFIER_KEY); + BMessage reply; + uint32 rkey; + + command.AddInt32("modifier", modifier); + _control_input_server_(&command, &reply); + + status_t err = reply.FindInt32("key", (int32 *) &rkey); + if (err != B_OK) + return err; + *key = rkey; + + return B_OK; +} + + void set_modifier_key(uint32 modifier, uint32 key) { diff --git a/src/servers/input/InputServer.cpp b/src/servers/input/InputServer.cpp index c921a13e01..44823cba15 100644 --- a/src/servers/input/InputServer.cpp +++ b/src/servers/input/InputServer.cpp @@ -520,6 +520,9 @@ InputServer::MessageReceived(BMessage* message) case IS_GET_MODIFIERS: status = HandleGetModifiers(message, &reply); break; + case IS_GET_MODIFIER_KEY: + status = HandleGetModifierKey(message, &reply); + break; case IS_SET_MODIFIER_KEY: status = HandleSetModifierKey(message, &reply); break; @@ -722,6 +725,43 @@ InputServer::HandleGetModifiers(BMessage* message, BMessage* reply) } +status_t +InputServer::HandleGetModifierKey(BMessage* message, BMessage* reply) +{ + int32 modifier; + + if (message->FindInt32("modifier", &modifier) == B_OK) { + switch (modifier) { + case B_CAPS_LOCK: + return reply->AddInt32("key", fKeys.caps_key); + case B_NUM_LOCK: + return reply->AddInt32("key", fKeys.num_key); + case B_SCROLL_LOCK: + return reply->AddInt32("key", fKeys.scroll_key); + case B_LEFT_SHIFT_KEY: + return reply->AddInt32("key", fKeys.left_shift_key); + case B_RIGHT_SHIFT_KEY: + return reply->AddInt32("key", fKeys.right_shift_key); + case B_LEFT_COMMAND_KEY: + return reply->AddInt32("key", fKeys.left_command_key); + case B_RIGHT_COMMAND_KEY: + return reply->AddInt32("key", fKeys.right_command_key); + case B_LEFT_CONTROL_KEY: + return reply->AddInt32("key", fKeys.left_control_key); + case B_RIGHT_CONTROL_KEY: + return reply->AddInt32("key", fKeys.right_control_key); + case B_LEFT_OPTION_KEY: + return reply->AddInt32("key", fKeys.left_option_key); + case B_RIGHT_OPTION_KEY: + return reply->AddInt32("key", fKeys.right_option_key); + case B_MENU_KEY: + return reply->AddInt32("key", fKeys.menu_key); + } + } + return B_ERROR; +} + + status_t InputServer::HandleSetModifierKey(BMessage* message, BMessage* reply) { diff --git a/src/servers/input/InputServer.h b/src/servers/input/InputServer.h index 7e5c05e428..dfba62e7c7 100644 --- a/src/servers/input/InputServer.h +++ b/src/servers/input/InputServer.h @@ -131,6 +131,7 @@ class InputServer : public BApplication { status_t HandleGetSetKeyRepeatDelay(BMessage* message, BMessage* reply); status_t HandleGetKeyInfo(BMessage* message, BMessage* reply); status_t HandleGetModifiers(BMessage* message, BMessage* reply); + status_t HandleGetModifierKey(BMessage* message, BMessage* reply); status_t HandleSetModifierKey(BMessage* message, BMessage* reply); status_t HandleSetKeyboardLocks(BMessage* message, BMessage* reply); status_t HandleGetSetMouseSpeed(BMessage* message, BMessage* reply);