Zrythm
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
event_manager.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2019-2022 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
13#ifndef __GUI_BACKEND_EVENT_MANAGER_H__
14#define __GUI_BACKEND_EVENT_MANAGER_H__
15
16#include "utils/backtrace.h"
17#include "utils/mpmc_queue.h"
18#include "utils/object_pool.h"
19
20#include <glib.h>
21
22typedef struct Zrythm Zrythm;
23typedef struct ZEvent ZEvent;
24
66
67#define EVENT_MANAGER (ZRYTHM->event_manager)
68
70#define EVENT_QUEUE (EVENT_MANAGER->mqueue)
71
72#define EVENT_MANAGER_MAX_EVENTS 4000
73
74#define event_queue_push_back_event(q, x) \
75 mpmc_queue_push_back (q, (void *) x)
76
77#define event_queue_dequeue_event(q, x) \
78 mpmc_queue_dequeue (q, (void *) x)
79
83#define EVENTS_PUSH(et, _arg) \
84 if ( \
85 ZRYTHM_HAVE_UI && EVENT_MANAGER && EVENT_QUEUE \
86 && (!PROJECT || !AUDIO_ENGINE || !AUDIO_ENGINE->exporting) \
87 && EVENT_MANAGER->process_source_id) \
88 { \
89 ZEvent * _ev = (ZEvent *) object_pool_get ( \
90 EVENT_MANAGER->obj_pool); \
91 _ev->file = __FILE__; \
92 _ev->func = __func__; \
93 _ev->lineno = __LINE__; \
94 _ev->type = (et); \
95 _ev->arg = (void *) (_arg); \
96 if ( \
97 zrythm_app->gtk_thread \
98 == g_thread_self () /* skip backtrace for now */ \
99 && false) \
100 { \
101 _ev->backtrace = backtrace_get ("", 40, false); \
102 } \
103 /* don't print events that are called \
104 * continuously */ \
105 if ( \
106 (et) != ET_PLAYHEAD_POS_CHANGED \
107 && g_thread_self () == zrythm_app->gtk_thread) \
108 { \
109 g_debug ( \
110 "pushing UI event " #et " (%s:%d)", __func__, \
111 __LINE__); \
112 } \
113 event_queue_push_back_event (EVENT_QUEUE, _ev); \
114 }
115
116/* runs the event logic now */
117#define EVENTS_PUSH_NOW(et, _arg) \
118 if ( \
119 ZRYTHM_HAVE_UI && EVENT_MANAGER && EVENT_QUEUE \
120 && zrythm_app->gtk_thread == g_thread_self () \
121 && (!PROJECT || !AUDIO_ENGINE || !AUDIO_ENGINE->exporting) \
122 && EVENT_MANAGER->process_source_id) \
123 { \
124 ZEvent * _ev = (ZEvent *) object_pool_get ( \
125 EVENT_MANAGER->obj_pool); \
126 _ev->file = __FILE__; \
127 _ev->func = __func__; \
128 _ev->lineno = __LINE__; \
129 _ev->type = et; \
130 _ev->arg = (void *) _arg; \
131 if (/* skip backtrace for now */ \
132 false) \
133 { \
134 _ev->backtrace = backtrace_get ("", 40, false); \
135 } \
136 /* don't print events that are called \
137 * continuously */ \
138 if (et != ET_PLAYHEAD_POS_CHANGED) \
139 { \
140 g_debug ( \
141 "processing UI event now " #et " (%s:%d)", \
142 __func__, __LINE__); \
143 } \
144 event_manager_process_event (EVENT_MANAGER, _ev); \
145 object_pool_return (EVENT_MANAGER->obj_pool, _ev); \
146 }
147
154event_manager_new (void);
155
159void
161
165void
167
174void
176
182void
184
189void
191 EventManager * self,
192 void * obj);
193
194void
195event_manager_free (EventManager * self);
196
201#endif
Backtrace utils.
void event_manager_process_event(EventManager *self, ZEvent *ev)
Processes the given event.
void event_manager_process_now(EventManager *self)
Processes the events now.
void event_manager_start_events(EventManager *self)
Starts accepting events.
EventManager * event_manager_new(void)
Creates the event queue and starts the event loop.
void event_manager_stop_events(EventManager *self)
Stops events from getting fired.
void event_manager_remove_events_for_obj(EventManager *self, void *obj)
Removes events where the arg matches the given object.
Multiple Producer Multiple Consumer lock-free queue.
Thread-safe object pool implementation.
Event manager for the UI.
guint process_source_id
ID of the event processing source func.
bool pending_soft_recalc
A soft recalculation of the routing graph is pending.
ObjectPool * obj_pool
Object pool of event structs to avoid real time allocation.
GPtrArray * events_arr
Events array to use during processing.
MPMCQueue * mqueue
Event queue, mainly for GUI events.
Multiple Producer Multiple Consumer lock-free queue.
Definition mpmc_queue.h:69
A Zrythm event.
Definition event.h:455
To be used throughout the program.
Definition zrythm.h:190