2
* Copyright © 2014 Canonical Ltd.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License version 3,
6
* as published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU Lesser General Public License for more details.
13
* You should have received a copy of the GNU Lesser General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Authored by: Robert Carr <robert.carr@canonical.com>
19
#define MIR_LOG_COMPONENT "event-access"
21
#include "mir/event_type_to_string.h"
24
#include "mir_toolkit/events/event.h"
25
#include "mir/events/event_private.h"
27
#include "mir_toolkit/events/surface_event.h"
28
#include "mir_toolkit/events/resize_event.h"
29
#include "mir_toolkit/events/prompt_session_event.h"
30
#include "mir_toolkit/events/orientation_event.h"
35
namespace ml = mir::logging;
39
template <typename EventType>
40
void expect_event_type(EventType const* ev, MirEventType t)
44
mir::log_critical("Expected " + mir::event_type_to_string(t) + " but event is of type " +
45
mir::event_type_to_string(ev->type));
51
std::string mir::event_type_to_string(MirEventType t)
55
case mir_event_type_key:
56
return "mir_event_type_key";
57
case mir_event_type_motion:
58
return "mir_event_type_motion";
59
case mir_event_type_surface:
60
return "mir_event_type_surface";
61
case mir_event_type_resize:
62
return "mir_event_type_resize";
63
case mir_event_type_prompt_session_state_change:
64
return "mir_event_type_prompt_session_state_change";
65
case mir_event_type_orientation:
66
return "mir_event_type_orientation";
67
case mir_event_type_close_surface:
68
return "mir_event_type_close_surface";
69
case mir_event_type_input:
70
return "mir_event_type_input";
77
MirEventType mir_event_get_type(MirEvent const* ev)
81
case mir_event_type_key:
82
case mir_event_type_motion:
83
return mir_event_type_input;
89
MirInputEvent const* mir_event_get_input_event(MirEvent const* ev)
91
if (ev->type != mir_event_type_key && ev->type != mir_event_type_motion)
93
mir::log_critical("Expected input event but event is of type " +
94
mir::event_type_to_string(ev->type));
98
return reinterpret_cast<MirInputEvent const*>(ev);
101
MirSurfaceEvent const* mir_event_get_surface_event(MirEvent const* ev)
103
expect_event_type(ev, mir_event_type_surface);
108
MirResizeEvent const* mir_event_get_resize_event(MirEvent const* ev)
110
expect_event_type(ev, mir_event_type_resize);
115
MirPromptSessionEvent const* mir_event_get_prompt_session_event(MirEvent const* ev)
117
expect_event_type(ev, mir_event_type_prompt_session_state_change);
119
return &ev->prompt_session;
122
MirOrientationEvent const* mir_event_get_orientation_event(MirEvent const* ev)
124
expect_event_type(ev, mir_event_type_orientation);
126
return &ev->orientation;
129
MirCloseSurfaceEvent const* mir_event_get_close_surface_event(MirEvent const* ev)
131
expect_event_type(ev, mir_event_type_close_surface);
133
return &ev->close_surface;
136
MirKeymapEvent const* mir_event_get_keymap_event(MirEvent const* ev)
138
expect_event_type(ev, mir_event_type_keymap);
143
/* Surface event accessors */
145
MirSurfaceAttrib mir_surface_event_get_attribute(MirSurfaceEvent const* ev)
147
expect_event_type(ev, mir_event_type_surface);
152
int mir_surface_event_get_attribute_value(MirSurfaceEvent const* ev)
154
expect_event_type(ev, mir_event_type_surface);
159
/* Resize event accessors */
161
int mir_resize_event_get_width(MirResizeEvent const* ev)
163
expect_event_type(ev, mir_event_type_resize);
167
int mir_resize_event_get_height(MirResizeEvent const* ev)
169
expect_event_type(ev, mir_event_type_resize);
173
/* Prompt session event accessors */
175
MirPromptSessionState mir_prompt_session_event_get_state(MirPromptSessionEvent const* ev)
177
expect_event_type(ev, mir_event_type_prompt_session_state_change);
178
return ev->new_state;
181
/* Orientation event accessors */
183
MirOrientation mir_orientation_event_get_direction(MirOrientationEvent const* ev)
185
expect_event_type(ev, mir_event_type_orientation);
186
return ev->direction;
189
/* Keymap event accessors */
191
void mir_keymap_event_get_rules(MirKeymapEvent const* ev, xkb_rule_names *out_names)
193
expect_event_type(ev, mir_event_type_keymap);
194
*out_names = ev->rules;
197
// TODO: Until we opaquify the MirEvent structure and add
198
// a ref count ref is implemented as copy.
199
MirEvent const* mir_event_ref(MirEvent const* ev)
201
MirEvent *new_ev = new MirEvent;
202
memcpy(new_ev, ev, sizeof(MirEvent));
206
void mir_event_unref(MirEvent const* ev)
208
delete const_cast<MirEvent*>(ev);