[WPE][GTK] Bump minimum versions of GLib, GTK, libsoup, ATK, GStreamer, and Cairo
[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     GdkEventType type = gdk_event_get_event_type(reinterpret_cast<GdkEvent*>(event));
70     switch (type) {
71     case GDK_BUTTON_PRESS:
72     case GDK_2BUTTON_PRESS:
73     case GDK_3BUTTON_PRESS:
74     case GDK_BUTTON_RELEASE:
75         m_type = PlatformEvent::MousePressed;
76         if (type == GDK_BUTTON_RELEASE) {
77             m_type = PlatformEvent::MouseReleased;
78             m_clickCount = 0;
79         } else if (type == GDK_BUTTON_PRESS)
80             m_clickCount = 1;
81         else if (type == GDK_2BUTTON_PRESS)
82             m_clickCount = 2;
83         else if (type == GDK_3BUTTON_PRESS)
84             m_clickCount = 3;
85
86         if (button == 1)
87             m_button = LeftButton;
88         else if (button == 2)
89             m_button = MiddleButton;
90         else if (button == 3)
91             m_button = RightButton;
92         break;
93
94     default:
95         ASSERT_NOT_REACHED();
96     };
97 }
98
99 PlatformMouseEvent::PlatformMouseEvent(GdkEventMotion* motion)
100 {
101     gdouble x, y, rootX, rootY;
102     GdkModifierType state;
103     gdk_event_get_coords(reinterpret_cast<GdkEvent*>(motion), &x, &y);
104     gdk_event_get_root_coords(reinterpret_cast<GdkEvent*>(motion), &rootX, &rootY);
105     gdk_event_get_state(reinterpret_cast<GdkEvent*>(motion), &state);
106     m_position = IntPoint(static_cast<int>(x), static_cast<int>(y));
107     m_globalPosition = IntPoint(static_cast<int>(rootX), static_cast<int>(rootY));
108     m_timestamp = wallTimeForEvent(motion);
109     m_button = NoButton;
110     m_clickCount = 0;
111     m_modifierFlags = 0;
112
113     if (state & GDK_SHIFT_MASK)
114         m_modifiers.add(PlatformEvent::Modifier::ShiftKey);
115     if (state & GDK_CONTROL_MASK)
116         m_modifiers.add(PlatformEvent::Modifier::ControlKey);
117     if (state & GDK_MOD1_MASK)
118         m_modifiers.add(PlatformEvent::Modifier::AltKey);
119     if (state & GDK_META_MASK)
120         m_modifiers.add(PlatformEvent::Modifier::MetaKey);
121     if (PlatformKeyboardEvent::modifiersContainCapsLock(state))
122         m_modifiers.add(PlatformEvent::Modifier::CapsLockKey);
123
124     GdkEventType type = gdk_event_get_event_type(reinterpret_cast<GdkEvent*>(motion));
125     switch (type) {
126     case GDK_MOTION_NOTIFY:
127         m_type = PlatformEvent::MouseMoved;
128         m_button = NoButton;
129         m_clickCount = 0;
130         break;
131     default:
132         ASSERT_NOT_REACHED();
133     };
134
135     if (state & GDK_BUTTON1_MASK)
136         m_button = LeftButton;
137     else if (state & GDK_BUTTON2_MASK)
138         m_button = MiddleButton;
139     else if (state & GDK_BUTTON3_MASK)
140         m_button = RightButton;
141 }
142 }