93efbc65147019ec5cf1c211b7c92e10c78b9d75
[WebKit-https.git] / Source / WebCore / platform / gtk / PlatformWheelEventGtk.cpp
1 /*
2  * Copyright (C) 2006 Apple Inc.  All rights reserved.
3  * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include "config.h"
29 #include "PlatformWheelEvent.h"
30
31 #include "FloatPoint.h"
32 #include "GtkUtilities.h"
33 #include "PlatformKeyboardEvent.h"
34 #include "Scrollbar.h"
35 #include <gdk/gdk.h>
36 #include <gtk/gtk.h>
37 #include <wtf/WallTime.h>
38
39 namespace WebCore {
40
41 // Keep this in sync with the other platform event constructors
42 PlatformWheelEvent::PlatformWheelEvent(GdkEventScroll* event)
43 {
44     static const float delta = 1;
45     GdkModifierType state;
46
47     m_type = PlatformEvent::Wheel;
48     m_timestamp = wallTimeForEvent(event);
49     gdk_event_get_state(reinterpret_cast<GdkEvent*>(event), &state);
50
51     if (state & GDK_SHIFT_MASK)
52         m_modifiers.add(Modifier::ShiftKey);
53     if (state & GDK_CONTROL_MASK)
54         m_modifiers.add(Modifier::ControlKey);
55     if (state & GDK_MOD1_MASK)
56         m_modifiers.add(Modifier::AltKey);
57     if (state & GDK_META_MASK)
58         m_modifiers.add(Modifier::MetaKey);
59     if (PlatformKeyboardEvent::modifiersContainCapsLock(state))
60         m_modifiers.add(PlatformEvent::Modifier::CapsLockKey);
61
62     m_deltaX = 0;
63     m_deltaY = 0;
64     GdkScrollDirection direction;
65     if (!gdk_event_get_scroll_direction(reinterpret_cast<GdkEvent*>(event), &direction)) {
66         gdouble deltaX, deltaY;
67         if (gdk_event_get_scroll_deltas(reinterpret_cast<GdkEvent*>(event), &deltaX, &deltaY)) {
68             m_deltaX = -deltaX;
69             m_deltaY = -deltaY;
70         }
71     }
72
73     // Docs say an upwards scroll (away from the user) has a positive delta
74     if (!m_deltaX && !m_deltaY) {
75         switch (direction) {
76         case GDK_SCROLL_UP:
77             m_deltaY = delta;
78             break;
79         case GDK_SCROLL_DOWN:
80             m_deltaY = -delta;
81             break;
82         case GDK_SCROLL_LEFT:
83             m_deltaX = delta;
84             break;
85         case GDK_SCROLL_RIGHT:
86             m_deltaX = -delta;
87             break;
88         default:
89             ASSERT_NOT_REACHED();
90         }
91     }
92     m_wheelTicksX = m_deltaX;
93     m_wheelTicksY = m_deltaY;
94
95 #if ENABLE(ASYNC_SCROLLING)
96 #if GTK_CHECK_VERSION(3, 20, 0)
97     m_phase = gdk_event_is_scroll_stop_event(reinterpret_cast<GdkEvent*>(event)) ?
98         PlatformWheelEventPhaseEnded :
99         PlatformWheelEventPhaseChanged;
100 #else
101     m_phase = direction == GDK_SCROLL_SMOOTH && !m_deltaX && !m_deltaY ?
102         PlatformWheelEventPhaseEnded :
103         PlatformWheelEventPhaseChanged;
104 #endif
105 #endif // ENABLE(ASYNC_SCROLLING)
106
107     gdouble x, y, rootX, rootY;
108     gdk_event_get_coords(reinterpret_cast<GdkEvent*>(event), &x, &y);
109     gdk_event_get_root_coords(reinterpret_cast<GdkEvent*>(event), &rootX, &rootY);
110
111     m_position = IntPoint(static_cast<int>(x), static_cast<int>(y));
112     m_globalPosition = IntPoint(static_cast<int>(rootX), static_cast<int>(rootY));
113     m_granularity = ScrollByPixelWheelEvent;
114     m_directionInvertedFromDevice = false;
115
116     // FIXME: retrieve the user setting for the number of lines to scroll on each wheel event
117     m_deltaX *= static_cast<float>(Scrollbar::pixelsPerLineStep());
118     m_deltaY *= static_cast<float>(Scrollbar::pixelsPerLineStep());
119 }
120
121 } // namespace WebCore