1/*
2 * Copyright (C) 2020-2022 The opuntiaOS Project Authors.
3 * + Contributed by Nikita Melekhin <nimelehin@gmail.com>
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#include <libui/App.h>
10#include <libui/ClientDecoder.h>
11#include <libui/Event.h>
12
13namespace UI {
14
15ClientDecoder::ClientDecoder()
16 : m_event_loop(LFoundation::EventLoop::the())
17{
18}
19
20std::unique_ptr<Message> ClientDecoder::handle(MouseMoveMessage& msg)
21{
22 if (App::the().window().id() == msg.win_id()) {
23 m_event_loop.add(App::the().window(), new MouseEvent(msg.x(), msg.y()));
24 }
25 return nullptr;
26}
27
28std::unique_ptr<Message> ClientDecoder::handle(MouseActionMessage& msg)
29{
30 if (App::the().window().id() == msg.win_id()) {
31 m_event_loop.add(App::the().window(), new MouseActionEvent((MouseActionType)msg.type(), msg.x(), msg.y()));
32 }
33 return nullptr;
34}
35
36std::unique_ptr<Message> ClientDecoder::handle(MouseLeaveMessage& msg)
37{
38 if (App::the().window().id() == msg.win_id()) {
39 m_event_loop.add(App::the().window(), new MouseLeaveEvent(msg.x(), msg.y()));
40 }
41 return nullptr;
42}
43
44std::unique_ptr<Message> ClientDecoder::handle(MouseWheelMessage& msg)
45{
46 if (App::the().window().id() == msg.win_id()) {
47 m_event_loop.add(App::the().window(), new MouseWheelEvent(msg.x(), msg.y(), msg.wheel_data()));
48 }
49 return nullptr;
50}
51
52std::unique_ptr<Message> ClientDecoder::handle(KeyboardMessage& msg)
53{
54 if (App::the().window().id() == msg.win_id()) {
55 // Checking if the key is down or up
56 if (msg.kbd_key() >> 31) {
57 uint32_t key = msg.kbd_key();
58 key &= 0x7FFFFFFF;
59 m_event_loop.add(App::the().window(), new KeyUpEvent(key));
60 } else {
61 m_event_loop.add(App::the().window(), new KeyDownEvent(msg.kbd_key()));
62 }
63 }
64 return nullptr;
65}
66
67std::unique_ptr<Message> ClientDecoder::handle(DisplayMessage& msg)
68{
69 m_event_loop.add(App::the().window(), new DisplayEvent(msg.rect()));
70 return nullptr;
71}
72
73std::unique_ptr<Message> ClientDecoder::handle(WindowCloseRequestMessage& msg)
74{
75 // TODO: Currently we support only 1 window per app.
76 if (App::the().window().id() == msg.win_id()) {
77 m_event_loop.add(App::the(), new WindowCloseRequestEvent(msg.win_id()));
78 }
79 return nullptr;
80}
81
82std::unique_ptr<Message> ClientDecoder::handle(ResizeMessage& msg)
83{
84 if (App::the().window().id() == msg.win_id()) {
85 m_event_loop.add(App::the().window(), new ResizeEvent(msg.win_id(), msg.rect()));
86 }
87 return nullptr;
88}
89
90std::unique_ptr<Message> ClientDecoder::handle(MenuBarActionMessage& msg)
91{
92 if (App::the().window().id() == msg.win_id()) {
93 m_event_loop.add(App::the().window(), new MenuBarActionEvent(msg.win_id(), msg.menu_id(), msg.item_id()));
94 }
95 return nullptr;
96}
97
98std::unique_ptr<Message> ClientDecoder::handle(PopupActionMessage& msg)
99{
100 if (App::the().window().id() == msg.win_id()) {
101 m_event_loop.add(App::the().window(), new PopupActionEvent(msg.win_id(), msg.menu_id(), msg.item_id()));
102 }
103 return nullptr;
104}
105
106// Notifiers
107std::unique_ptr<Message> ClientDecoder::handle(NotifyWindowCreateMessage& msg)
108{
109 if (App::the().window().id() == msg.win_id()) {
110 m_event_loop.add(App::the().window(), new NotifyWindowCreateEvent(msg.bundle_id().move_string(), msg.icon_path().move_string(), msg.changed_window_id(), msg.changed_window_type()));
111 }
112 return nullptr;
113}
114
115std::unique_ptr<Message> ClientDecoder::handle(NotifyWindowStatusChangedMessage& msg)
116{
117 if (App::the().window().id() == msg.win_id()) {
118 m_event_loop.add(App::the().window(), new NotifyWindowStatusChangedEvent(msg.changed_window_id(), msg.type()));
119 }
120 return nullptr;
121}
122
123std::unique_ptr<Message> ClientDecoder::handle(NotifyWindowIconChangedMessage& msg)
124{
125 if (App::the().window().id() == msg.win_id()) {
126 m_event_loop.add(App::the().window(), new NotifyWindowIconChangedEvent(msg.changed_window_id(), msg.icon_path().move_string()));
127 }
128 return nullptr;
129}
130
131std::unique_ptr<Message> ClientDecoder::handle(NotifyWindowTitleChangedMessage& msg)
132{
133 if (App::the().window().id() == msg.win_id()) {
134 m_event_loop.add(App::the().window(), new NotifyWindowTitleChangedEvent(msg.changed_window_id(), msg.title().move_string()));
135 }
136 return nullptr;
137}
138
139} // namespace UI