de1a8dc23e1a12328137a289ac7cb6700a434042
[WebKit-https.git] / Source / WebCore / platform / gtk / PlatformMouseEventGtk.cpp
1 /*
2 * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 #include "config.h"
28 #include "PlatformMouseEvent.h"
29
30 #include "GtkUtilities.h"
31 #include "PlatformKeyboardEvent.h"
32 #include <gdk/gdk.h>
33 #include <wtf/Assertions.h>
34
35 namespace WebCore {
36
37 // FIXME: Would be even better to figure out which modifier is Alt instead of always using GDK_MOD1_MASK.
38
39 // Keep this in sync with the other platform event constructors
40 PlatformMouseEvent::PlatformMouseEvent(GdkEventButton* event)
41 {
42     gdouble x, y;
43     gdk_event_get_coords(reinterpret_cast<GdkEvent*>(event), &x, &y);
44     gdouble rootX, rootY;
45     gdk_event_get_root_coords(reinterpret_cast<GdkEvent*>(event), &rootX, &rootY);
46     GdkModifierType state;
47     gdk_event_get_state(reinterpret_cast<GdkEvent*>(event), &state);
48     guint button;
49     gdk_event_get_button(reinterpret_cast<GdkEvent*>(event), &button);
50
51     m_timestamp = wallTimeForEvent(event);
52     m_position = IntPoint(static_cast<int>(x), static_cast<int>(y));
53     m_globalPosition = IntPoint(static_cast<int>(rootX), static_cast<int>(rootY));
54     m_button = NoButton;
55     m_clickCount = 0;
56     m_modifierFlags = 0;
57
58     if (state & GDK_SHIFT_MASK)
59         m_modifiers.add(PlatformEvent::Modifier::ShiftKey);
60     if (state & GDK_CONTROL_MASK)
61         m_modifiers.add(PlatformEvent::Modifier::ControlKey);
62     if (state & GDK_MOD1_MASK)
63         m_modifiers.add(PlatformEvent::Modifier::AltKey);
64     if (state & GDK_META_MASK)
65         m_modifiers.add(PlatformEvent::Modifier::MetaKey);
66     if (PlatformKeyboardEvent::modifiersContainCapsLock(state))
67         m_modifiers.add(PlatformEvent::Modifier::CapsLockKey);
68
69 #if GTK_CHECK_VERSION(3, 10, 0)
70     GdkEventType type = gdk_event_get_event_type(reinterpret_cast<GdkEvent*>(event));
71 #else
72     GdkEventType type = event->type;
73 #endif
74
75     switch (type) {
76     case GDK_BUTTON_PRESS:
77     case GDK_2BUTTON_PRESS:
78     case GDK_3BUTTON_PRESS:
79     case GDK_BUTTON_RELEASE:
80         m_type = PlatformEvent::MousePressed;
81         if (type == GDK_BUTTON_RELEASE) {
82             m_type = PlatformEvent::MouseReleased;
83             m_clickCount = 0;
84         } else if (type == GDK_BUTTON_PRESS)
85             m_clickCount = 1;
86         else if (type == GDK_2BUTTON_PRESS)
87             m_clickCount = 2;
88         else if (type == GDK_3BUTTON_PRESS)
89             m_clickCount = 3;
90
91         if (button == 1)
92             m_button = LeftButton;
93         else if (button == 2)
94             m_button = MiddleButton;
95         else if (button == 3)
96             m_button = RightButton;
97         break;
98
99     default:
100         ASSERT_NOT_REACHED();
101     };
102 }
103
104 PlatformMouseEvent::PlatformMouseEvent(GdkEventMotion* motion)
105 {
106     gdouble x, y, rootX, rootY;
107     GdkModifierType state;
108     gdk_event_get_coords(reinterpret_cast<GdkEvent*>(motion), &x, &y);
109     gdk_event_get_root_coords(reinterpret_cast<GdkEvent*>(motion), &rootX, &rootY);
110     gdk_event_get_state(reinterpret_cast<GdkEvent*>(motion), &state);
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_timestamp = wallTimeForEvent(motion);
114     m_button = NoButton;
115     m_clickCount = 0;
116     m_modifierFlags = 0;
117
118     if (state & GDK_SHIFT_MASK)
119         m_modifiers.add(PlatformEvent::Modifier::ShiftKey);
120     if (state & GDK_CONTROL_MASK)
121         m_modifiers.add(PlatformEvent::Modifier::ControlKey);
122     if (state & GDK_MOD1_MASK)
123         m_modifiers.add(PlatformEvent::Modifier::AltKey);
124     if (state & GDK_META_MASK)
125         m_modifiers.add(PlatformEvent::Modifier::MetaKey);
126     if (PlatformKeyboardEvent::modifiersContainCapsLock(state))
127         m_modifiers.add(PlatformEvent::Modifier::CapsLockKey);
128
129 #if GTK_CHECK_VERSION(3, 10, 0)
130     GdkEventType type = gdk_event_get_event_type(reinterpret_cast<GdkEvent*>(motion));
131 #else
132     GdkEventType type = motion->type;
133 #endif
134
135     switch (type) {
136     case GDK_MOTION_NOTIFY:
137         m_type = PlatformEvent::MouseMoved;
138         m_button = NoButton;
139         m_clickCount = 0;
140         break;
141     default:
142         ASSERT_NOT_REACHED();
143     };
144
145     if (state & GDK_BUTTON1_MASK)
146         m_button = LeftButton;
147     else if (state & GDK_BUTTON2_MASK)
148         m_button = MiddleButton;
149     else if (state & GDK_BUTTON3_MASK)
150         m_button = RightButton;
151 }
152 }