Home | History | Annotate | Download | only in sk_app
      1 /*
      2 * Copyright 2016 Google Inc.
      3 *
      4 * Use of this source code is governed by a BSD-style license that can be
      5 * found in the LICENSE file.
      6 */
      7 
      8 #ifndef Window_DEFINED
      9 #define Window_DEFINED
     10 
     11 #include "DisplayParams.h"
     12 #include "SkRect.h"
     13 #include "SkTouchGesture.h"
     14 #include "SkTypes.h"
     15 #include "SkJSONCPP.h"
     16 
     17 class GrContext;
     18 class SkCanvas;
     19 class SkSurface;
     20 
     21 namespace sk_app {
     22 
     23 class WindowContext;
     24 
     25 class Window {
     26 public:
     27     static Window* CreateNativeWindow(void* platformData);
     28 
     29     virtual ~Window() { this->detach(); }
     30 
     31     virtual void setTitle(const char*) = 0;
     32     virtual void show() = 0;
     33     virtual void setUIState(const Json::Value& state) {}  // do nothing in default
     34 
     35     // Shedules an invalidation event for window if one is not currently pending.
     36     // Make sure that either onPaint or markInvalReceived is called when the client window consumes
     37     // the the inval event. They unset fIsContentInvalided which allow future onInval.
     38     void inval();
     39 
     40     virtual bool scaleContentToFit() const { return false; }
     41     virtual bool supportsContentRect() const { return false; }
     42     virtual SkRect getContentRect() { return SkRect::MakeEmpty(); }
     43 
     44     enum BackendType {
     45         kNativeGL_BackendType,
     46 #ifdef SK_VULKAN
     47         kVulkan_BackendType,
     48 #endif
     49         kRaster_BackendType,
     50 
     51         kLast_BackendType = kRaster_BackendType
     52     };
     53     enum {
     54         kBackendTypeCount = kLast_BackendType + 1
     55     };
     56 
     57     virtual bool attach(BackendType) = 0;
     58     void detach();
     59 
     60     // input handling
     61     enum class Key {
     62         kNONE,    //corresponds to android's UNKNOWN
     63 
     64         kLeftSoftKey,
     65         kRightSoftKey,
     66 
     67         kHome,    //!< the home key - added to match android
     68         kBack,    //!< (CLR)
     69         kSend,    //!< the green (talk) key
     70         kEnd,     //!< the red key
     71 
     72         k0,
     73         k1,
     74         k2,
     75         k3,
     76         k4,
     77         k5,
     78         k6,
     79         k7,
     80         k8,
     81         k9,
     82         kStar,    //!< the * key
     83         kHash,    //!< the # key
     84 
     85         kUp,
     86         kDown,
     87         kLeft,
     88         kRight,
     89 
     90         // Keys needed by ImGui
     91         kTab,
     92         kPageUp,
     93         kPageDown,
     94         kDelete,
     95         kEscape,
     96         kShift,
     97         kCtrl,
     98         kOption, // AKA Alt
     99         kA,
    100         kC,
    101         kV,
    102         kX,
    103         kY,
    104         kZ,
    105 
    106         kOK,      //!< the center key
    107 
    108         kVolUp,   //!< volume up    - match android
    109         kVolDown, //!< volume down  - same
    110         kPower,   //!< power button - same
    111         kCamera,  //!< camera       - same
    112 
    113         kLast = kCamera
    114     };
    115     static const int kKeyCount = static_cast<int>(Key::kLast) + 1;
    116 
    117     enum ModifierKeys {
    118         kShift_ModifierKey = 1 << 0,
    119         kControl_ModifierKey = 1 << 1,
    120         kOption_ModifierKey = 1 << 2,   // same as ALT
    121         kCommand_ModifierKey = 1 << 3,
    122         kFirstPress_ModifierKey = 1 << 4,
    123     };
    124 
    125     enum InputState {
    126         kDown_InputState,
    127         kUp_InputState,
    128         kMove_InputState   // only valid for mouse
    129     };
    130 
    131     // return value of 'true' means 'I have handled this event'
    132     typedef void(*OnBackendCreatedFunc)(void* userData);
    133     typedef bool(*OnCharFunc)(SkUnichar c, uint32_t modifiers, void* userData);
    134     typedef bool(*OnKeyFunc)(Key key, InputState state, uint32_t modifiers, void* userData);
    135     typedef bool(*OnMouseFunc)(int x, int y, InputState state, uint32_t modifiers, void* userData);
    136     typedef bool(*OnMouseWheelFunc)(float delta, uint32_t modifiers, void* userData);
    137     typedef bool(*OnTouchFunc)(intptr_t owner, InputState state, float x, float y, void* userData);
    138     typedef void(*OnUIStateChangedFunc)(
    139             const SkString& stateName, const SkString& stateValue, void* userData);
    140     typedef void(*OnPaintFunc)(SkCanvas*, void* userData);
    141 
    142     void registerBackendCreatedFunc(OnBackendCreatedFunc func, void* userData) {
    143         fBackendCreatedFunc = func;
    144         fBackendCreatedUserData = userData;
    145     }
    146 
    147     void registerCharFunc(OnCharFunc func, void* userData) {
    148         fCharFunc = func;
    149         fCharUserData = userData;
    150     }
    151 
    152     void registerKeyFunc(OnKeyFunc func, void* userData) {
    153         fKeyFunc = func;
    154         fKeyUserData = userData;
    155     }
    156 
    157     void registerMouseFunc(OnMouseFunc func, void* userData) {
    158         fMouseFunc = func;
    159         fMouseUserData = userData;
    160     }
    161 
    162     void registerMouseWheelFunc(OnMouseWheelFunc func, void* userData) {
    163         fMouseWheelFunc = func;
    164         fMouseWheelUserData = userData;
    165     }
    166 
    167     void registerPaintFunc(OnPaintFunc func, void* userData) {
    168         fPaintFunc = func;
    169         fPaintUserData = userData;
    170     }
    171 
    172     void registerTouchFunc(OnTouchFunc func, void* userData) {
    173         fTouchFunc = func;
    174         fTouchUserData = userData;
    175     }
    176 
    177     void registerUIStateChangedFunc(OnUIStateChangedFunc func, void* userData) {
    178         fUIStateChangedFunc = func;
    179         fUIStateChangedUserData = userData;
    180     }
    181 
    182     void onBackendCreated();
    183     bool onChar(SkUnichar c, uint32_t modifiers);
    184     bool onKey(Key key, InputState state, uint32_t modifiers);
    185     bool onMouse(int x, int y, InputState state, uint32_t modifiers);
    186     bool onMouseWheel(float delta, uint32_t modifiers);
    187     bool onTouch(intptr_t owner, InputState state, float x, float y);  // multi-owner = multi-touch
    188     void onUIStateChanged(const SkString& stateName, const SkString& stateValue);
    189     void onPaint();
    190     void onResize(int width, int height);
    191 
    192     int width();
    193     int height();
    194 
    195     virtual const DisplayParams& getRequestedDisplayParams() { return fRequestedDisplayParams; }
    196     virtual void setRequestedDisplayParams(const DisplayParams&);
    197 
    198     // Actual parameters in effect, obtained from the native window.
    199     int sampleCount() const;
    200     int stencilBits() const;
    201 
    202     // Returns null if there is not a GPU backend or if the backend is not yet created.
    203     const GrContext* getGrContext() const;
    204 
    205 protected:
    206     Window();
    207 
    208     OnBackendCreatedFunc   fBackendCreatedFunc;
    209     void*                  fBackendCreatedUserData;
    210     OnCharFunc             fCharFunc;
    211     void*                  fCharUserData;
    212     OnKeyFunc              fKeyFunc;
    213     void*                  fKeyUserData;
    214     OnMouseFunc            fMouseFunc;
    215     void*                  fMouseUserData;
    216     OnMouseWheelFunc       fMouseWheelFunc;
    217     void*                  fMouseWheelUserData;
    218     OnTouchFunc            fTouchFunc;
    219     void*                  fTouchUserData;
    220     OnUIStateChangedFunc   fUIStateChangedFunc;
    221     void*                  fUIStateChangedUserData;
    222     OnPaintFunc            fPaintFunc;
    223     void*                  fPaintUserData;
    224     DisplayParams          fRequestedDisplayParams;
    225 
    226     WindowContext* fWindowContext = nullptr;
    227 
    228     virtual void onInval() = 0;
    229 
    230     // Uncheck fIsContentInvalided to allow future inval/onInval.
    231     void markInvalProcessed();
    232 
    233     bool fIsContentInvalidated = false;  // use this to avoid duplicate invalidate events
    234 };
    235 
    236 }   // namespace sk_app
    237 #endif
    238