20#include <freerdp/config.h>
30#include <freerdp/log.h>
31#define TAG SERVER_TAG("mac")
34static int mf_is_event_set(mfEventQueue* event_queue)
38 struct timeval time = WINPR_C_ARRAY_INIT;
41 FD_SET(event_queue->pipe_fd[0], &rfds);
42 num_set = select(event_queue->pipe_fd[0] + 1, &rfds, 0, 0, &time);
44 return (num_set == 1);
47static void mf_signal_event(mfEventQueue* event_queue)
51 length = write(event_queue->pipe_fd[1],
"sig", 4);
54 WLog_ERR(TAG,
"mf_signal_event: error");
57static void mf_set_event(mfEventQueue* event_queue)
61 length = write(event_queue->pipe_fd[1],
"sig", 4);
64 WLog_ERR(TAG,
"mf_set_event: error");
67static void mf_clear_events(mfEventQueue* event_queue)
71 while (mf_is_event_set(event_queue))
73 length = read(event_queue->pipe_fd[0], &length, 4);
76 WLog_ERR(TAG,
"mf_clear_event: error");
80static void mf_clear_event(mfEventQueue* event_queue)
84 length = read(event_queue->pipe_fd[0], &length, 4);
87 WLog_ERR(TAG,
"mf_clear_event: error");
90void mf_event_push(mfEventQueue* event_queue, mfEvent* event)
92 pthread_mutex_lock(&(event_queue->mutex));
94 if (event_queue->count >= event_queue->size)
96 event_queue->size *= 2;
98 (mfEvent**)realloc((
void*)event_queue->events,
sizeof(mfEvent*) * event_queue->size);
101 event_queue->events[(event_queue->count)++] = event;
103 pthread_mutex_unlock(&(event_queue->mutex));
105 mf_set_event(event_queue);
108mfEvent* mf_event_peek(mfEventQueue* event_queue)
112 pthread_mutex_lock(&(event_queue->mutex));
114 if (event_queue->count < 1)
117 event = event_queue->events[0];
119 pthread_mutex_unlock(&(event_queue->mutex));
124mfEvent* mf_event_pop(mfEventQueue* event_queue)
128 pthread_mutex_lock(&(event_queue->mutex));
130 if (event_queue->count < 1)
134 mf_clear_event(event_queue);
136 event = event_queue->events[0];
137 (event_queue->count)--;
139 memmove(&event_queue->events[0], &event_queue->events[1], event_queue->count *
sizeof(
void*));
141 pthread_mutex_unlock(&(event_queue->mutex));
146mfEventRegion* mf_event_region_new(
int x,
int y,
int width,
int height)
148 mfEventRegion* event_region = malloc(
sizeof(mfEventRegion));
150 if (event_region !=
nullptr)
154 event_region->width = width;
155 event_region->height = height;
161void mf_event_region_free(mfEventRegion* event_region)
166mfEvent* mf_event_new(
int type)
168 mfEvent*
event = malloc(
sizeof(mfEvent));
175void mf_event_free(mfEvent* event)
180mfEventQueue* mf_event_queue_new()
182 mfEventQueue* event_queue = malloc(
sizeof(mfEventQueue));
184 if (event_queue !=
nullptr)
186 event_queue->pipe_fd[0] = -1;
187 event_queue->pipe_fd[1] = -1;
189 event_queue->size = 16;
190 event_queue->count = 0;
191 event_queue->events = (mfEvent**)malloc(
sizeof(mfEvent*) * event_queue->size);
193 if (pipe(event_queue->pipe_fd) < 0)
199 pthread_mutex_init(&(event_queue->mutex),
nullptr);
205void mf_event_queue_free(mfEventQueue* event_queue)
207 if (event_queue->pipe_fd[0] != -1)
209 close(event_queue->pipe_fd[0]);
210 event_queue->pipe_fd[0] = -1;
213 if (event_queue->pipe_fd[1] != -1)
215 close(event_queue->pipe_fd[1]);
216 event_queue->pipe_fd[1] = -1;
219 pthread_mutex_destroy(&(event_queue->mutex));