[GTK] Add initial gestures support
[WebKit-https.git] / Source / WebKit2 / UIProcess / gtk / GestureController.h
1 /*
2  * Copyright (C) 2014 Igalia S.L.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef GestureController_h
27 #define GestureController_h
28
29 #if HAVE(GTK_GESTURES)
30
31 #include <WebCore/FloatPoint.h>
32 #include <wtf/Noncopyable.h>
33 #include <wtf/gobject/GMainLoopSource.h>
34 #include <wtf/gobject/GRefPtr.h>
35
36 typedef union _GdkEvent GdkEvent;
37 typedef struct _GdkEventSequence GdkEventSequence;
38 typedef struct _GtkGesture GtkGesture;
39
40 namespace WebKit {
41 class WebPageProxy;
42
43 class GestureController {
44     WTF_MAKE_NONCOPYABLE(GestureController);
45
46 public:
47     GestureController(WebPageProxy&);
48
49     bool isProcessingGestures() const;
50     bool handleEvent(const GdkEvent*);
51
52 private:
53     class Gesture {
54     public:
55         bool isActive() const;
56         void handleEvent(const GdkEvent*);
57
58     protected:
59         Gesture(GtkGesture*, WebPageProxy&);
60
61         GRefPtr<GtkGesture> m_gesture;
62         WebPageProxy& m_page;
63     };
64
65     class DragGesture final : public Gesture {
66     public:
67         DragGesture(WebPageProxy&);
68
69     private:
70         void handleDrag(const GdkEvent*, double x, double y);
71         void handleTap(const GdkEvent*);
72
73         static void begin(DragGesture*, double x, double y, GtkGesture*);
74         static void update(DragGesture*, double x, double y, GtkGesture*);
75         static void end(DragGesture*, GdkEventSequence*, GtkGesture*);
76
77         WebCore::FloatPoint m_start;
78         WebCore::FloatPoint m_offset;
79         GMainLoopSource m_longPressTimeout;
80         GRefPtr<GtkGesture> m_longPress;
81         bool m_inDrag;
82     };
83
84     class ZoomGesture final : public Gesture {
85     public:
86         ZoomGesture(WebPageProxy&);
87
88     private:
89         static void begin(ZoomGesture*, GdkEventSequence*, GtkGesture*);
90         static void scaleChanged(ZoomGesture*, double scale, GtkGesture*);
91
92         gdouble m_initialScale;
93         gdouble m_scale;
94         WebCore::IntPoint m_point;
95         GMainLoopSource m_idle;
96     };
97
98     DragGesture m_dragGesture;
99     ZoomGesture m_zoomGesture;
100 };
101
102 } // namespace WebKit
103
104 #endif // HAVE(GTK_GESTURES)
105
106 #endif // GestureController_h