15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/client/key_event_mapper.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/proto/event.pb.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEventMapper::KeyEventMapper() { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEventMapper::KeyEventMapper(InputStub* stub) : protocol::InputFilter(stub) { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEventMapper::~KeyEventMapper() { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyEventMapper::SetTrapCallback(KeyTrapCallback callback) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trap_callback = callback; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyEventMapper::TrapKey(uint32 usb_keycode, bool trap_key) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (trap_key) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trapped_keys.insert(usb_keycode); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trapped_keys.erase(usb_keycode); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyEventMapper::RemapKey(uint32 in_usb_keycode, uint32 out_usb_keycode) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (in_usb_keycode == out_usb_keycode) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mapped_keys.erase(in_usb_keycode); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mapped_keys[in_usb_keycode] = out_usb_keycode; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyEventMapper::InjectKeyEvent(const protocol::KeyEvent& event) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.has_usb_keycode()) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deliver trapped keys to the callback, not the next stub. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!trap_callback.is_null() && event.has_pressed() && 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (trapped_keys.find(event.usb_keycode()) != trapped_keys.end())) { 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch trap_callback.Run(event); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Re-map mapped keys to the new value before passing them on. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<uint32,uint32>::iterator mapped = 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mapped_keys.find(event.usb_keycode()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mapped != mapped_keys.end()) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protocol::KeyEvent new_event(event); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_event.set_usb_keycode(mapped->second); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputFilter::InjectKeyEvent(new_event); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputFilter::InjectKeyEvent(event); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 64