diff --git a/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp b/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp index 269172b775..b24f5b0833 100644 --- a/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp +++ b/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp @@ -357,17 +357,6 @@ const uint32 at_keycode_map[] = { FILE *KeyboardInputDevice::sLogFile = NULL; -struct keyboard_device { - KeyboardInputDevice *owner; - input_device_ref device_ref; - char path[B_PATH_NAME_LENGTH]; - int fd; - thread_id device_watcher; - kb_settings settings; - bool active; - bool isAT; -}; - extern "C" BInputServerDevice * instantiate_input_device() @@ -407,17 +396,33 @@ KeyboardInputDevice::InitFromSettings(void *cookie, uint32 opcode) keyboard_device *device = (keyboard_device *)cookie; - if (get_key_repeat_rate(&device->settings.key_repeat_rate) != B_OK) - LOG_ERR("error when get_key_repeat_rate\n"); - else - if (ioctl(device->fd, kSetKeyRepeatRate, &device->settings.key_repeat_rate)!=B_OK) - LOG_ERR("error when kSetKeyRepeatRate, fd:%li\n", device->fd); + if (opcode == 0 + || opcode == B_KEY_REPEAT_RATE_CHANGED) { + if (get_key_repeat_rate(&device->settings.key_repeat_rate) != B_OK) + LOG_ERR("error when get_key_repeat_rate\n"); + else + if (ioctl(device->fd, kSetKeyRepeatRate, &device->settings.key_repeat_rate)!=B_OK) + LOG_ERR("error when kSetKeyRepeatRate, fd:%li\n", device->fd); + } + + if (opcode == 0 + || opcode == B_KEY_REPEAT_DELAY_CHANGED) { + + if (get_key_repeat_delay(&device->settings.key_repeat_delay) != B_OK) + LOG_ERR("error when get_key_repeat_delay\n"); + else + if (ioctl(device->fd, kSetKeyRepeatDelay, &device->settings.key_repeat_delay)!=B_OK) + LOG_ERR("error when kSetKeyRepeatDelay, fd:%li\n", device->fd); + } + + if (opcode == 0 + || opcode == B_KEY_MAP_CHANGED + || opcode == B_KEY_LOCKS_CHANGED) { + fKeymap.LoadCurrent(); + SetLeds(device); + device->modifiers = fKeymap.Locks(); + } - if (get_key_repeat_delay(&device->settings.key_repeat_delay) != B_OK) - LOG_ERR("error when get_key_repeat_delay\n"); - else - if (ioctl(device->fd, kSetKeyRepeatDelay, &device->settings.key_repeat_delay)!=B_OK) - LOG_ERR("error when kSetKeyRepeatDelay, fd:%li\n", device->fd); return B_OK; } @@ -592,7 +597,6 @@ KeyboardInputDevice::DeviceWatcher(void *arg) CALLED(); keyboard_device *dev = (keyboard_device *)arg; uint8 buffer[16]; - uint32 currentModifiers = 0; uint8 activeDeadKey = 0; Keymap *keymap = &dev->owner->fKeymap; uint32 lastKeyCode = 0; @@ -669,13 +673,13 @@ KeyboardInputDevice::DeviceWatcher(void *arg) BMessage *msg = new BMessage; msg->AddInt64("when", timestamp); msg->what = B_MODIFIERS_CHANGED; - msg->AddInt32("be:old_modifiers", currentModifiers); + msg->AddInt32("be:old_modifiers", dev->modifiers); if ((is_keydown && !(modifiers & (B_CAPS_LOCK | B_NUM_LOCK | B_SCROLL_LOCK))) - || (is_keydown && !(currentModifiers & modifiers))) - currentModifiers |= modifiers; + || (is_keydown && !(dev->modifiers & modifiers))) + dev->modifiers |= modifiers; else - currentModifiers &= !modifiers; - msg->AddInt32("modifiers", currentModifiers); + dev->modifiers &= !modifiers; + msg->AddInt32("modifiers", dev->modifiers); msg->AddData("states", B_UINT8_TYPE, states, 16); if (dev->owner->EnqueueMessage(msg)!=B_OK) delete msg; @@ -686,13 +690,13 @@ KeyboardInputDevice::DeviceWatcher(void *arg) uint8 newDeadKey = 0; if (activeDeadKey == 0) { - newDeadKey = keymap->IsDeadKey(keycode, currentModifiers); + newDeadKey = keymap->IsDeadKey(keycode, dev->modifiers); } // new dead key behaviour /*if (newDeadKey == 0) { - keymap->GetChars(keycode, currentModifiers, activeDeadKey, &str, &numBytes); + keymap->GetChars(keycode, dev->modifiers, activeDeadKey, &str, &numBytes); keymap->GetChars(keycode, 0, 0, &str2, &numBytes2); } @@ -701,7 +705,7 @@ KeyboardInputDevice::DeviceWatcher(void *arg) // R5-like dead key behaviour if (newDeadKey == 0) { - keymap->GetChars(keycode, currentModifiers, activeDeadKey, &str, &numBytes); + keymap->GetChars(keycode, dev->modifiers, activeDeadKey, &str, &numBytes); keymap->GetChars(keycode, 0, 0, &str2, &numBytes2); BMessage *msg = new BMessage; @@ -712,7 +716,7 @@ KeyboardInputDevice::DeviceWatcher(void *arg) msg->AddInt64("when", timestamp); msg->AddInt32("key", keycode); - msg->AddInt32("modifiers", currentModifiers); + msg->AddInt32("modifiers", dev->modifiers); msg->AddData("states", B_UINT8_TYPE, states, 16); if (numBytes>0) { for (int i=0; ifd<0) + return; + + uint32 locks = device->owner->fKeymap.Locks(); + char lock_io[3]; + memset(lock_io, 0, sizeof(lock_io)); + if (locks & B_NUM_LOCK) + lock_io[0] = 1; + if (locks & B_CAPS_LOCK) + lock_io[1] = 1; + if (locks & B_SCROLL_LOCK) + lock_io[2] = 1; + + ioctl(device->fd, kSetLeds, &lock_io); +} \ No newline at end of file diff --git a/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.h b/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.h index 96f27c3333..bddc968c2f 100644 --- a/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.h +++ b/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.h @@ -33,6 +33,20 @@ #include #include "kb_mouse_driver.h" +class KeyboardInputDevice; + +struct keyboard_device { + KeyboardInputDevice *owner; + input_device_ref device_ref; + char path[B_PATH_NAME_LENGTH]; + int fd; + thread_id device_watcher; + kb_settings settings; + bool active; + bool isAT; + uint32 modifiers; +}; + class KeyboardInputDevice : public BInputServerDevice { public: @@ -59,6 +73,8 @@ private: static int32 DeviceWatcher(void *arg); static char *GetShortName(const char *longName); + void SetLeds(keyboard_device *device); + BList fDevices; Keymap fKeymap; }; diff --git a/src/add-ons/input_server/devices/keyboard/Keymap.cpp b/src/add-ons/input_server/devices/keyboard/Keymap.cpp index d65ea15107..8a5f38a6fe 100644 --- a/src/add-ons/input_server/devices/keyboard/Keymap.cpp +++ b/src/add-ons/input_server/devices/keyboard/Keymap.cpp @@ -354,3 +354,18 @@ Keymap::GetChars(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey, char** c (*chars)[*numBytes] = 0; } + + +status_t +Keymap::LoadCurrent() +{ + key_map *keys = NULL; + get_key_map(&keys, &fChars); + if (!keys) { + fprintf(stderr, "error while getting current keymap!\n"); + return B_ERROR; + } + memcpy(&fKeys, keys, sizeof(fKeys)); + delete keys; + return B_OK; +} \ No newline at end of file diff --git a/src/add-ons/input_server/devices/keyboard/Keymap.h b/src/add-ons/input_server/devices/keyboard/Keymap.h index c10e193904..18c3031ee1 100644 --- a/src/add-ons/input_server/devices/keyboard/Keymap.h +++ b/src/add-ons/input_server/devices/keyboard/Keymap.h @@ -29,10 +29,11 @@ public: uint8 IsDeadKey(uint32 keyCode, uint32 modifiers); bool IsDeadSecondKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey); void GetChars(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey, char** chars, int32* numBytes); + uint32 Locks() { return fKeys.lock_settings; }; + status_t LoadCurrent(); private: char *fChars; key_map fKeys; - //uint32 fCharsSize; };