summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibCore/Event.h
blob: 164580b0c7c0055e8bb053bcd187537d8bedd4b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
 * Copyright (c) 2022, the SerenityOS developers.
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#pragma once

#include <AK/Function.h>
#include <AK/String.h>
#include <AK/Types.h>
#include <AK/WeakPtr.h>
#include <LibCore/DeferredInvocationContext.h>
#include <LibCore/Forward.h>

namespace Core {

class Event {
public:
    enum Type {
        Invalid = 0,
        Quit,
        Timer,
        NotifierRead,
        NotifierWrite,
        DeferredInvoke,
        ChildAdded,
        ChildRemoved,
        Custom,
    };

    Event() = default;
    explicit Event(unsigned type)
        : m_type(type)
    {
    }
    virtual ~Event() = default;

    unsigned type() const { return m_type; }

    bool is_accepted() const { return m_accepted; }
    void accept() { m_accepted = true; }
    void ignore() { m_accepted = false; }

private:
    unsigned m_type { Type::Invalid };
    bool m_accepted { true };
};

class DeferredInvocationEvent : public Event {
    friend class EventLoop;

public:
    DeferredInvocationEvent(NonnullRefPtr<DeferredInvocationContext> context, Function<void()> invokee)
        : Event(Event::Type::DeferredInvoke)
        , m_context(move(context))
        , m_invokee(move(invokee))
    {
    }

private:
    NonnullRefPtr<DeferredInvocationContext> m_context;
    Function<void()> m_invokee;
};

class TimerEvent final : public Event {
public:
    explicit TimerEvent(int timer_id)
        : Event(Event::Timer)
        , m_timer_id(timer_id)
    {
    }
    ~TimerEvent() = default;

    int timer_id() const { return m_timer_id; }

private:
    int m_timer_id;
};

class NotifierReadEvent final : public Event {
public:
    explicit NotifierReadEvent(int fd)
        : Event(Event::NotifierRead)
        , m_fd(fd)
    {
    }
    ~NotifierReadEvent() = default;

    int fd() const { return m_fd; }

private:
    int m_fd;
};

class NotifierWriteEvent final : public Event {
public:
    explicit NotifierWriteEvent(int fd)
        : Event(Event::NotifierWrite)
        , m_fd(fd)
    {
    }
    ~NotifierWriteEvent() = default;

    int fd() const { return m_fd; }

private:
    int m_fd;
};

class ChildEvent final : public Event {
public:
    ChildEvent(Type, Object& child, Object* insertion_before_child = nullptr);
    ~ChildEvent() = default;

    Object* child();
    const Object* child() const;

    Object* insertion_before_child();
    const Object* insertion_before_child() const;

private:
    WeakPtr<Object> m_child;
    WeakPtr<Object> m_insertion_before_child;
};

class CustomEvent : public Event {
public:
    CustomEvent(int custom_type)
        : Event(Event::Type::Custom)
        , m_custom_type(custom_type)
    {
    }
    ~CustomEvent() = default;

    int custom_type() const { return m_custom_type; }

private:
    int m_custom_type { 0 };
};

}