[WPE][GTK] Bump minimum versions of GLib, GTK, libsoup, ATK, GStreamer, and Cairo
[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     m_phase = gdk_event_is_scroll_stop_event(reinterpret_cast<GdkEvent*>(event)) ?
97         PlatformWheelEventPhaseEnded :
98         PlatformWheelEventPhaseChanged;
99 #endif // ENABLE(ASYNC_SCROLLING)
100
101     gdouble x, y, rootX, rootY;
102     gdk_event_get_coords(reinterpret_cast<GdkEvent*>(event), &x, &y);
103     gdk_event_get_root_coords(reinterpret_cast<GdkEvent*>(event), &rootX, &rootY);
104
105     m_position = IntPoint(static_cast<int>(x), static_cast<int>(y));
106     m_globalPosition = IntPoint(static_cast<int>(rootX), static_cast<int>(rootY));
107     m_granularity = ScrollByPixelWheelEvent;
108     m_directionInvertedFromDevice = false;
109
110     // FIXME: retrieve the user setting for the number of lines to scroll on each wheel event
111     m_deltaX *= static_cast<float>(Scrollbar::pixelsPerLineStep());
112     m_deltaY *= static_cast<float>(Scrollbar::pixelsPerLineStep());
113 }
114
115 } // namespace WebCore