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)#ifndef CONTENT_RENDERER_MOUSE_LOCK_DISPATCHER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_RENDERER_MOUSE_LOCK_DISPATCHER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebMouseEvent; 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace blink 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT MouseLockDispatcher { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseLockDispatcher(); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MouseLockDispatcher(); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class LockTarget { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~LockTarget() {} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A mouse lock request was pending and this reports success or failure. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnLockMouseACK(bool succeeded) = 0; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A mouse lock was in place, but has been lost. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseLockLost() = 0; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A mouse lock is enabled and mouse events are being delievered. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HandleMouseLockedInputEvent( 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMouseEvent& event) = 0; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Locks the mouse to the |target|. If true is returned, an asynchronous 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response to target->OnLockMouseACK() will follow. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool LockMouse(LockTarget* target); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request to unlock the mouse. An asynchronous response to 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // target->OnMouseLockLost() will follow. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnlockMouse(LockTarget* target); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clears out the reference to the |target| because it has or is being 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroyed. Unlocks if locked. The pointer will not be accessed. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnLockTargetDestroyed(LockTarget* target); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsMouseLockedTo(LockTarget* target); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow lock target to consumed a mouse event, if it does return true. 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool WillHandleMouseEvent(const blink::WebMouseEvent& event); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subclasses or users have to call these methods to report mouse lock events 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the browser. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnLockMouseACK(bool succeeded); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnMouseLockLost(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subclasses must implement these methods to send mouse lock requests to the 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SendLockMouseRequest(bool unlocked_by_target) = 0; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SendUnlockMouseRequest() = 0; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool MouseLockedOrPendingAction() const { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_locked_ || pending_lock_request_ || pending_unlock_request_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool mouse_locked_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If both |pending_lock_request_| and |pending_unlock_request_| are true, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it means a lock request was sent before an unlock request and we haven't 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // received responses for them. The logic in LockMouse() makes sure that a 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lock request won't be sent when there is a pending unlock request. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool pending_lock_request_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool pending_unlock_request_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used when locking to indicate when a target application has voluntarily 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unlocked and desires to relock the mouse. If the mouse is unlocked due 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to ESC being pressed by the user, this will be false 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool unlocked_by_target_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |target_| is the pending or current owner of mouse lock. We retain a non 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // owning reference here that must be cleared by |OnLockTargetDestroyed| 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when it is destroyed. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LockTarget* target_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MouseLockDispatcher); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_RENDERER_MOUSE_LOCK_DISPATCHER_H_ 88