ladybird/LibGUI/GEvent.h

244 lines
5.6 KiB
C
Raw Normal View History

2018-10-10 16:12:38 +03:00
#pragma once
2019-01-20 01:49:56 +03:00
#include <SharedGraphics/Point.h>
#include <SharedGraphics/Rect.h>
#include <AK/AKString.h>
#include <AK/Types.h>
#include <AK/WeakPtr.h>
#include <Kernel/KeyCode.h>
#include <LibGUI/GWindowType.h>
2018-10-10 16:12:38 +03:00
class GObject;
class GEvent {
2018-10-10 16:12:38 +03:00
public:
enum Type {
Invalid = 0,
Quit,
Show,
Hide,
Paint,
Resize,
2018-10-10 16:12:38 +03:00
MouseMove,
MouseDown,
MouseUp,
Enter,
Leave,
2018-10-10 16:12:38 +03:00
KeyDown,
KeyUp,
2018-10-12 13:18:59 +03:00
Timer,
DeferredDestroy,
WindowEntered,
WindowLeft,
WindowBecameInactive,
WindowBecameActive,
FocusIn,
FocusOut,
WindowCloseRequest,
ChildAdded,
ChildRemoved,
2019-04-03 22:03:12 +03:00
WM_WindowRemoved,
WM_WindowStateChanged,
2018-10-10 16:12:38 +03:00
};
GEvent() { }
explicit GEvent(Type type) : m_type(type) { }
virtual ~GEvent() { }
2018-10-10 16:12:38 +03:00
Type type() const { return m_type; }
bool is_mouse_event() const { return m_type == MouseMove || m_type == MouseDown || m_type == MouseUp; }
bool is_key_event() const { return m_type == KeyUp || m_type == KeyDown; }
bool is_paint_event() const { return m_type == Paint; }
2018-10-12 02:20:06 +03:00
2018-10-10 16:12:38 +03:00
private:
Type m_type { Invalid };
};
2019-04-03 22:03:12 +03:00
class GWMEvent : public GEvent {
public:
GWMEvent(Type type, int client_id, int window_id)
: GEvent(type)
, m_client_id(client_id)
, m_window_id(window_id)
{
}
int client_id() const { return m_client_id; }
int window_id() const { return m_window_id; }
private:
int m_client_id { -1 };
int m_window_id { -1 };
};
class GWMWindowRemovedEvent : public GWMEvent {
public:
GWMWindowRemovedEvent(int client_id, int window_id)
: GWMEvent(GEvent::Type::WM_WindowRemoved, client_id, window_id)
{
}
};
class GWMWindowStateChangedEvent : public GWMEvent {
public:
GWMWindowStateChangedEvent(int client_id, int window_id, const String& title, const Rect& rect, bool is_active, GWindowType window_type, bool is_minimized)
2019-04-03 22:03:12 +03:00
: GWMEvent(GEvent::Type::WM_WindowStateChanged, client_id, window_id)
, m_title(title)
, m_rect(rect)
, m_active(is_active)
, m_window_type(window_type)
, m_minimized(is_minimized)
2019-04-03 22:03:12 +03:00
{
}
String title() const { return m_title; }
Rect rect() const { return m_rect; }
bool is_active() const { return m_active; }
GWindowType window_type() const { return m_window_type; }
bool is_minimized() const { return m_minimized; }
2019-04-03 22:03:12 +03:00
private:
String m_title;
Rect m_rect;
bool m_active;
GWindowType m_window_type;
bool m_minimized;
2019-04-03 22:03:12 +03:00
};
class QuitEvent final : public GEvent {
2018-10-10 16:12:38 +03:00
public:
QuitEvent()
: GEvent(GEvent::Quit)
2018-10-10 16:12:38 +03:00
{
}
};
class GPaintEvent final : public GEvent {
2018-10-10 16:12:38 +03:00
public:
explicit GPaintEvent(const Rect& rect, const Size& window_size = Size())
: GEvent(GEvent::Paint)
, m_rect(rect)
, m_window_size(window_size)
2018-10-10 16:12:38 +03:00
{
}
Rect rect() const { return m_rect; }
Size window_size() const { return m_window_size; }
private:
Rect m_rect;
Size m_window_size;
2018-10-10 16:12:38 +03:00
};
class GResizeEvent final : public GEvent {
public:
explicit GResizeEvent(const Size& old_size, const Size& size)
: GEvent(GEvent::Resize)
, m_old_size(old_size)
, m_size(size)
{
}
const Size& old_size() const { return m_old_size; }
const Size& size() const { return m_size; }
private:
Size m_old_size;
Size m_size;
};
class GShowEvent final : public GEvent {
2018-10-10 16:12:38 +03:00
public:
GShowEvent()
: GEvent(GEvent::Show)
2018-10-10 16:12:38 +03:00
{
}
};
class GHideEvent final : public GEvent {
2018-10-10 16:12:38 +03:00
public:
GHideEvent()
: GEvent(GEvent::Hide)
2018-10-10 16:12:38 +03:00
{
}
};
enum GMouseButton : byte {
2018-10-10 16:12:38 +03:00
None = 0,
Left = 1,
Right = 2,
Middle = 4,
2018-10-10 16:12:38 +03:00
};
class GKeyEvent final : public GEvent {
2018-10-10 16:12:38 +03:00
public:
GKeyEvent(Type type, int key, byte modifiers)
: GEvent(type)
2018-10-10 16:12:38 +03:00
, m_key(key)
, m_modifiers(modifiers)
2018-10-10 16:12:38 +03:00
{
}
int key() const { return m_key; }
bool ctrl() const { return m_modifiers & Mod_Ctrl; }
bool alt() const { return m_modifiers & Mod_Alt; }
bool shift() const { return m_modifiers & Mod_Shift; }
bool logo() const { return m_modifiers & Mod_Logo; }
byte modifiers() const { return m_modifiers; }
String text() const { return m_text; }
2018-10-10 16:12:38 +03:00
private:
friend class GEventLoop;
2018-10-10 16:12:38 +03:00
int m_key { 0 };
byte m_modifiers { 0 };
String m_text;
2018-10-10 16:12:38 +03:00
};
class GMouseEvent final : public GEvent {
2018-10-10 16:12:38 +03:00
public:
GMouseEvent(Type type, const Point& position, unsigned buttons, GMouseButton button, unsigned modifiers)
: GEvent(type)
, m_position(position)
, m_buttons(buttons)
2018-10-10 16:12:38 +03:00
, m_button(button)
, m_modifiers(modifiers)
2018-10-10 16:12:38 +03:00
{
}
2018-10-12 02:20:06 +03:00
Point position() const { return m_position; }
int x() const { return m_position.x(); }
int y() const { return m_position.y(); }
GMouseButton button() const { return m_button; }
unsigned buttons() const { return m_buttons; }
unsigned modifiers() const { return m_modifiers; }
2018-10-10 16:12:38 +03:00
private:
2018-10-12 02:20:06 +03:00
Point m_position;
unsigned m_buttons { 0 };
GMouseButton m_button { GMouseButton::None };
unsigned m_modifiers { 0 };
2018-10-10 16:12:38 +03:00
};
class GTimerEvent final : public GEvent {
2018-10-12 13:18:59 +03:00
public:
explicit GTimerEvent(int timer_id) : GEvent(GEvent::Timer), m_timer_id(timer_id) { }
~GTimerEvent() { }
int timer_id() const { return m_timer_id; }
private:
int m_timer_id;
2018-10-12 13:18:59 +03:00
};
class GChildEvent final : public GEvent {
public:
GChildEvent(Type, GObject& child);
~GChildEvent();
GObject* child() { return m_child.ptr(); }
const GObject* child() const { return m_child.ptr(); }
private:
WeakPtr<GObject> m_child;
};