opuntiaOS - an operating system targeting x86 and ARMv7
at master 4.4 kB view raw
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