Home | History | Annotate | Download | only in mouse_lock
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <cmath>
      6 
      7 #include "ppapi/c/ppb_fullscreen.h"
      8 #include "ppapi/c/ppb_input_event.h"
      9 #include "ppapi/cpp/completion_callback.h"
     10 #include "ppapi/cpp/fullscreen.h"
     11 #include "ppapi/cpp/graphics_2d.h"
     12 #include "ppapi/cpp/image_data.h"
     13 #include "ppapi/cpp/input_event.h"
     14 #include "ppapi/cpp/instance.h"
     15 #include "ppapi/cpp/module.h"
     16 #include "ppapi/cpp/mouse_lock.h"
     17 #include "ppapi/cpp/rect.h"
     18 #include "ppapi/cpp/size.h"
     19 #include "ppapi/cpp/var.h"
     20 #include "ppapi/utility/completion_callback_factory.h"
     21 
     22 #ifdef _MSC_VER
     23 // Allow 'this' in initializer list
     24 #pragma warning(disable : 4355)
     25 #endif
     26 
     27 class MouseLockInstance : public pp::Instance, public pp::MouseLock {
     28  public:
     29   explicit MouseLockInstance(PP_Instance instance)
     30       : pp::Instance(instance),
     31         pp::MouseLock(this),
     32         mouse_locked_(false),
     33         waiting_for_flush_completion_(false),
     34         callback_factory_(this),
     35         fullscreen_(this),
     36         is_context_bound_(false),
     37         was_fullscreen_(false),
     38         background_scanline_(NULL) {}
     39   virtual ~MouseLockInstance();
     40 
     41   // Called by the browser when the NaCl module is loaded and all ready to go.
     42   virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]);
     43 
     44   // Called by the browser to handle incoming input events.
     45   virtual bool HandleInputEvent(const pp::InputEvent& event);
     46 
     47   // Called whenever the in-browser window changes size.
     48   virtual void DidChangeView(const pp::View& view);
     49 
     50   // Called by the browser when mouselock is lost.  This happens when the NaCl
     51   // module exits fullscreen mode.
     52   virtual void MouseLockLost();
     53 
     54  private:
     55   // Return the Cartesian distance between two points.
     56   double GetDistance(int point_1_x,
     57                      int point_1_y,
     58                      int point_2_x,
     59                      int point_2_y) {
     60     return sqrt(pow(static_cast<double>(point_1_x - point_2_x), 2) +
     61                 pow(static_cast<double>(point_1_y - point_2_y), 2));
     62   }
     63 
     64   // Called when mouse lock has been acquired.  Used as a callback to
     65   // pp::MouseLock.LockMouse().
     66   void DidLockMouse(int32_t result);
     67 
     68   // Called when the 2D context has been flushed to the browser window.  Used
     69   // as a callback to pp::Graphics2D.Flush().
     70   void DidFlush(int32_t result);
     71 
     72   // Creates a new paint buffer, paints it then flush it to the 2D context.  If
     73   // a flush is pending, this does nothing.
     74   void Paint();
     75 
     76   // Create a new pp::ImageData and paint the graphics that represent the mouse
     77   // movement in it.  Return the new pp::ImageData.
     78   pp::ImageData PaintImage(const pp::Size& size);
     79 
     80   // Fill the image with the background color.
     81   void ClearToBackground(pp::ImageData* image);
     82 
     83   void DrawCenterSpot(pp::ImageData* image, uint32_t spot_color);
     84 
     85   void DrawNeedle(pp::ImageData* image, uint32_t needle_color);
     86 
     87   // Print the printf-style format to the "console" via PostMessage.
     88   void Log(const char* format, ...);
     89 
     90   pp::Size size_;
     91 
     92   bool mouse_locked_;
     93   pp::Point mouse_movement_;
     94   bool waiting_for_flush_completion_;
     95   pp::CompletionCallbackFactory<MouseLockInstance> callback_factory_;
     96 
     97   pp::Fullscreen fullscreen_;
     98   pp::Graphics2D device_context_;
     99   bool is_context_bound_;
    100   bool was_fullscreen_;
    101   uint32_t* background_scanline_;
    102 };
    103