wayland: A bunch of clipboard safety fixes. Also removed Wayland_get_data_device because it was a pointless getter function.
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
diff --git a/src/video/wayland/SDL_waylandclipboard.c b/src/video/wayland/SDL_waylandclipboard.c
index 551f603..30c89fd 100644
--- a/src/video/wayland/SDL_waylandclipboard.c
+++ b/src/video/wayland/SDL_waylandclipboard.c
@@ -37,19 +37,20 @@ Wayland_SetClipboardText(_THIS, const char *text)
status = SDL_SetError("Video driver uninitialized");
} else {
video_data = _this->driverdata;
- /* TODO: Support more than one seat */
- data_device = Wayland_get_data_device(video_data->input);
- if (text[0] != '\0') {
- SDL_WaylandDataSource* source = Wayland_data_source_create(_this);
- Wayland_data_source_add_data(source, TEXT_MIME, text,
- strlen(text) + 1);
-
- status = Wayland_data_device_set_selection(data_device, source);
- if (status != 0) {
- Wayland_data_source_destroy(source);
+ if (video_data->input != NULL && video_data->input->data_device != NULL) {
+ data_device = video_data->input->data_device;
+ if (text[0] != '\0') {
+ SDL_WaylandDataSource* source = Wayland_data_source_create(_this);
+ Wayland_data_source_add_data(source, TEXT_MIME, text,
+ strlen(text) + 1);
+
+ status = Wayland_data_device_set_selection(data_device, source);
+ if (status != 0) {
+ Wayland_data_source_destroy(source);
+ }
+ } else {
+ status = Wayland_data_device_clear_selection(data_device);
}
- } else {
- status = Wayland_data_device_clear_selection(data_device);
}
}
@@ -71,20 +72,21 @@ Wayland_GetClipboardText(_THIS)
SDL_SetError("Video driver uninitialized");
} else {
video_data = _this->driverdata;
- /* TODO: Support more than one seat */
- data_device = Wayland_get_data_device(video_data->input);
- if (data_device->selection_offer != NULL) {
- buffer = Wayland_data_offer_receive(data_device->selection_offer,
- &length, TEXT_MIME, SDL_TRUE);
- if (length > 0) {
- text = (char*) buffer;
- }
- } else if (data_device->selection_source != NULL) {
- buffer = Wayland_data_source_get_data(data_device->selection_source,
- &length, TEXT_MIME, SDL_TRUE);
- if (length > 0) {
- text = (char*) buffer;
- }
+ if (video_data->input != NULL && video_data->input->data_device != NULL) {
+ data_device = video_data->input->data_device;
+ if (data_device->selection_offer != NULL) {
+ buffer = Wayland_data_offer_receive(data_device->selection_offer,
+ &length, TEXT_MIME, SDL_TRUE);
+ if (length > 0) {
+ text = (char*) buffer;
+ }
+ } else if (data_device->selection_source != NULL) {
+ buffer = Wayland_data_source_get_data(data_device->selection_source,
+ &length, TEXT_MIME, SDL_TRUE);
+ if (length > 0) {
+ text = (char*) buffer;
+ }
+ }
}
}
@@ -106,13 +108,15 @@ Wayland_HasClipboardText(_THIS)
SDL_SetError("Video driver uninitialized");
} else {
video_data = _this->driverdata;
- data_device = Wayland_get_data_device(video_data->input);
- if (data_device != NULL && Wayland_data_offer_has_mime(
- data_device->selection_offer, TEXT_MIME)) {
- result = SDL_TRUE;
- } else if(data_device != NULL && Wayland_data_source_has_mime(
- data_device->selection_source, TEXT_MIME)) {
- result = SDL_TRUE;
+ if (video_data->input != NULL && video_data->input->data_device != NULL) {
+ data_device = video_data->input->data_device;
+ if (Wayland_data_offer_has_mime(
+ data_device->selection_offer, TEXT_MIME)) {
+ result = SDL_TRUE;
+ } else if (Wayland_data_source_has_mime(
+ data_device->selection_source, TEXT_MIME)) {
+ result = SDL_TRUE;
+ }
}
}
return result;
diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
index 08c1866..ef4f2cc 100644
--- a/src/video/wayland/SDL_waylandevents.c
+++ b/src/video/wayland/SDL_waylandevents.c
@@ -1192,15 +1192,6 @@ void Wayland_display_destroy_input(SDL_VideoData *d)
d->input = NULL;
}
-SDL_WaylandDataDevice* Wayland_get_data_device(struct SDL_WaylandInput *input)
-{
- if (input == NULL) {
- return NULL;
- }
-
- return input->data_device;
-}
-
/* !!! FIXME: just merge these into display_handle_global(). */
void Wayland_display_add_relative_pointer_manager(SDL_VideoData *d, uint32_t id)
{
diff --git a/src/video/wayland/SDL_waylandevents_c.h b/src/video/wayland/SDL_waylandevents_c.h
index 720608b..ac4fcce 100644
--- a/src/video/wayland/SDL_waylandevents_c.h
+++ b/src/video/wayland/SDL_waylandevents_c.h
@@ -85,8 +85,6 @@ extern void Wayland_add_data_device_manager(SDL_VideoData *d, uint32_t id, uint3
extern void Wayland_display_add_input(SDL_VideoData *d, uint32_t id, uint32_t version);
extern void Wayland_display_destroy_input(SDL_VideoData *d);
-extern SDL_WaylandDataDevice* Wayland_get_data_device(struct SDL_WaylandInput *input);
-
extern void Wayland_display_add_pointer_constraints(SDL_VideoData *d, uint32_t id);
extern void Wayland_display_destroy_pointer_constraints(SDL_VideoData *d);