22 #include "../../SDL_internal.h"
24 #if SDL_VIDEO_DRIVER_WAYLAND
32 #include "../../core/unix/SDL_poll.h"
40 write_pipe(
int fd,
const void*
buffer,
size_t total_length,
size_t *pos)
43 ssize_t bytes_written = 0;
44 ssize_t
length = total_length - *pos;
48 struct timespec zerotime = {0};
52 sigemptyset(&sig_set);
53 sigaddset(&sig_set, SIGPIPE);
55 #if SDL_THREADS_DISABLED
56 sigprocmask(SIG_BLOCK, &sig_set, &old_sig_set);
58 pthread_sigmask(SIG_BLOCK, &sig_set, &old_sig_set);
63 }
else if (ready < 0) {
70 if (bytes_written > 0) {
71 *pos += bytes_written;
75 sigtimedwait(&sig_set, 0, &zerotime);
77 #if SDL_THREADS_DISABLED
78 sigprocmask(SIG_SETMASK, &old_sig_set,
NULL);
80 pthread_sigmask(SIG_SETMASK, &old_sig_set,
NULL);
87 read_pipe(
int fd,
void**
buffer,
size_t* total_length,
SDL_bool null_terminate)
90 void* output_buffer =
NULL;
92 size_t new_buffer_length = 0;
93 ssize_t bytes_read = 0;
100 }
else if (ready < 0) {
103 bytes_read = read(
fd, temp,
sizeof(temp));
106 if (bytes_read > 0) {
108 *total_length += bytes_read;
111 new_buffer_length = *total_length + 1;
113 new_buffer_length = *total_length;
117 output_buffer =
SDL_malloc(new_buffer_length);
122 if (output_buffer ==
NULL) {
138 #define MIME_LIST_SIZE 4
140 static const char* mime_conversion_list[MIME_LIST_SIZE][2] = {
150 const char *found = mime_type;
155 if (strcmp(mime_conversion_list[
index][0], mime_type) == 0) {
156 found = mime_conversion_list[
index][1];
165 mime_data_list_find(
struct wl_list* list,
166 const char* mime_type)
171 wl_list_for_each(mime_list, list, link) {
172 if (strcmp(mime_list->
mime_type, mime_type) == 0) {
181 mime_data_list_add(
struct wl_list* list,
182 const char* mime_type,
186 size_t mime_type_length = 0;
188 void *internal_buffer =
NULL;
192 if (internal_buffer ==
NULL) {
198 mime_data = mime_data_list_find(list, mime_type);
200 if (mime_data ==
NULL) {
201 mime_data =
SDL_calloc(1,
sizeof(*mime_data));
202 if (mime_data ==
NULL) {
205 WAYLAND_wl_list_insert(list, &(mime_data->
link));
207 mime_type_length = strlen(mime_type) + 1;
221 mime_data->
data = internal_buffer;
231 mime_data_list_free(
struct wl_list *list)
236 wl_list_for_each_safe(mime_data, next, list, link) {
249 const char *mime_type,
int fd)
251 size_t written_bytes = 0;
256 mime_data = mime_data_list_find(&
source->mimes,
263 while (write_pipe(
fd, mime_data->
data, mime_data->
length,
264 &written_bytes) > 0);
266 status = written_bytes;
272 const char *mime_type,
281 const char *mime_type)
286 found = mime_data_list_find(&
source->mimes, mime_type) !=
NULL;
293 size_t *
length,
const char* mime_type,
303 mime_data = mime_data_list_find(&
source->mimes, mime_type);
304 if (mime_data !=
NULL && mime_data->
length > 0) {
323 mime_data_list_free(&
source->mimes);
330 size_t *
length,
const char* mime_type,
343 }
else if (pipe2(pipefd, O_CLOEXEC|O_NONBLOCK) == -1) {
353 while (read_pipe(pipefd[0], &
buffer,
length, null_terminate) > 0);
361 const char* mime_type)
363 return mime_data_list_add(&offer->
mimes, mime_type,
NULL, 0);
369 const char *mime_type)
374 found = mime_data_list_find(&offer->
mimes, mime_type) !=
NULL;
384 mime_data_list_free(&offer->
mimes);
408 size_t num_offers = 0;
411 if (data_device ==
NULL) {
418 wl_list_for_each(mime_data, &(
source->mimes), link) {
424 if (strcmp(mime_conversion_list[
index][1], mime_data->
mime_type) == 0) {
426 mime_conversion_list[
index][0]);
434 if (num_offers == 0) {
456 if (data_device !=
NULL) {
#define SDL_OutOfMemory()
GLsizei GLsizei GLchar * source
GLuint GLsizei GLsizei * length
int SDL_IOReady(int fd, SDL_bool forWrite, int timeoutMS)
SDL_bool Wayland_data_source_has_mime(SDL_WaylandDataSource *source, const char *mime_type)
void * Wayland_data_offer_receive(SDL_WaylandDataOffer *offer, size_t *length, const char *mime_type, SDL_bool null_terminate)
int Wayland_data_device_set_selection(SDL_WaylandDataDevice *device, SDL_WaylandDataSource *source)
void Wayland_data_offer_destroy(SDL_WaylandDataOffer *offer)
ssize_t Wayland_data_source_send(SDL_WaylandDataSource *source, const char *mime_type, int fd)
int Wayland_data_device_clear_selection(SDL_WaylandDataDevice *device)
int Wayland_data_offer_add_mime(SDL_WaylandDataOffer *offer, const char *mime_type)
void Wayland_data_source_destroy(SDL_WaylandDataSource *source)
void * Wayland_data_source_get_data(SDL_WaylandDataSource *source, size_t *length, const char *mime_type, SDL_bool null_terminate)
SDL_bool Wayland_data_offer_has_mime(SDL_WaylandDataOffer *offer, const char *mime_type)
const char * Wayland_convert_mime_type(const char *mime_type)
int Wayland_data_device_set_serial(SDL_WaylandDataDevice *device, uint32_t serial)
int Wayland_data_source_add_data(SDL_WaylandDataSource *source, const char *mime_type, const void *buffer, size_t length)
static void wl_data_device_set_selection(struct wl_data_device *wl_data_device, struct wl_data_source *source, uint32_t serial)
static void wl_data_offer_destroy(struct wl_data_offer *wl_data_offer)
static void wl_data_offer_receive(struct wl_data_offer *wl_data_offer, const char *mime_type, int32_t fd)
static void wl_data_source_offer(struct wl_data_source *wl_data_source, const char *mime_type)
static void wl_data_source_destroy(struct wl_data_source *wl_data_source)
struct wl_display * display
SDL_VideoData * video_data
SDL_WaylandDataSource * selection_source
struct wl_data_device * data_device
uint32_t selection_serial
struct wl_data_offer * offer
struct wl_data_source * source