|
@@ -704,6 +704,16 @@ static void dataOfferHandleOffer(void* userData,
|
|
|
struct wl_data_offer* offer,
|
|
|
const char* mimeType)
|
|
|
{
|
|
|
+ for (unsigned int i = 0; i < _glfw.wl.offerCount; i++)
|
|
|
+ {
|
|
|
+ if (_glfw.wl.offers[i].offer == offer)
|
|
|
+ {
|
|
|
+ if (strcmp(mimeType, "text/plain;charset=utf-8") == 0)
|
|
|
+ _glfw.wl.offers[i].text_plain_utf8 = GLFW_TRUE;
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static const struct wl_data_offer_listener dataOfferListener = {
|
|
@@ -714,11 +724,19 @@ static void dataDeviceHandleDataOffer(void* userData,
|
|
|
struct wl_data_device* device,
|
|
|
struct wl_data_offer* offer)
|
|
|
{
|
|
|
- if (_glfw.wl.dataOffer)
|
|
|
- wl_data_offer_destroy(_glfw.wl.dataOffer);
|
|
|
+ _GLFWofferWayland* offers =
|
|
|
+ _glfw_realloc(_glfw.wl.offers, _glfw.wl.offerCount + 1);
|
|
|
+ if (!offers)
|
|
|
+ {
|
|
|
+ _glfwInputError(GLFW_OUT_OF_MEMORY, NULL);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- _glfw.wl.dataOffer = offer;
|
|
|
- wl_data_offer_add_listener(_glfw.wl.dataOffer, &dataOfferListener, NULL);
|
|
|
+ _glfw.wl.offers = offers;
|
|
|
+ _glfw.wl.offerCount++;
|
|
|
+
|
|
|
+ _glfw.wl.offers[_glfw.wl.offerCount - 1] = (_GLFWofferWayland) { offer };
|
|
|
+ wl_data_offer_add_listener(offer, &dataOfferListener, NULL);
|
|
|
}
|
|
|
|
|
|
static void dataDeviceHandleEnter(void* userData,
|
|
@@ -729,6 +747,19 @@ static void dataDeviceHandleEnter(void* userData,
|
|
|
wl_fixed_t y,
|
|
|
struct wl_data_offer* offer)
|
|
|
{
|
|
|
+ for (unsigned int i = 0; i < _glfw.wl.offerCount; i++)
|
|
|
+ {
|
|
|
+ if (_glfw.wl.offers[i].offer == offer)
|
|
|
+ {
|
|
|
+ _glfw.wl.offers[i] = _glfw.wl.offers[_glfw.wl.offerCount - 1];
|
|
|
+ _glfw.wl.offerCount--;
|
|
|
+
|
|
|
+ // We don't yet handle drag and drop
|
|
|
+ wl_data_offer_accept(offer, serial, NULL);
|
|
|
+ wl_data_offer_destroy(offer);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void dataDeviceHandleLeave(void* userData,
|
|
@@ -753,6 +784,26 @@ static void dataDeviceHandleSelection(void* userData,
|
|
|
struct wl_data_device* device,
|
|
|
struct wl_data_offer* offer)
|
|
|
{
|
|
|
+ if (_glfw.wl.selectionOffer)
|
|
|
+ {
|
|
|
+ wl_data_offer_destroy(_glfw.wl.selectionOffer);
|
|
|
+ _glfw.wl.selectionOffer = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (unsigned int i = 0; i < _glfw.wl.offerCount; i++)
|
|
|
+ {
|
|
|
+ if (_glfw.wl.offers[i].offer == offer)
|
|
|
+ {
|
|
|
+ if (_glfw.wl.offers[i].text_plain_utf8)
|
|
|
+ _glfw.wl.selectionOffer = offer;
|
|
|
+ else
|
|
|
+ wl_data_offer_destroy(offer);
|
|
|
+
|
|
|
+ _glfw.wl.offers[i] = _glfw.wl.offers[_glfw.wl.offerCount - 1];
|
|
|
+ _glfw.wl.offerCount--;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static const struct wl_data_device_listener dataDeviceListener = {
|
|
@@ -1409,6 +1460,11 @@ void _glfwTerminateWayland(void)
|
|
|
_glfw.wl.cursor.handle = NULL;
|
|
|
}
|
|
|
|
|
|
+ for (unsigned int i = 0; i < _glfw.wl.offerCount; i++)
|
|
|
+ wl_data_offer_destroy(_glfw.wl.offers[i].offer);
|
|
|
+
|
|
|
+ _glfw_free(_glfw.wl.offers);
|
|
|
+
|
|
|
if (_glfw.wl.cursorSurface)
|
|
|
wl_surface_destroy(_glfw.wl.cursorSurface);
|
|
|
if (_glfw.wl.subcompositor)
|
|
@@ -1423,12 +1479,12 @@ void _glfwTerminateWayland(void)
|
|
|
zxdg_decoration_manager_v1_destroy(_glfw.wl.decorationManager);
|
|
|
if (_glfw.wl.wmBase)
|
|
|
xdg_wm_base_destroy(_glfw.wl.wmBase);
|
|
|
- if (_glfw.wl.dataSource)
|
|
|
- wl_data_source_destroy(_glfw.wl.dataSource);
|
|
|
+ if (_glfw.wl.selectionOffer)
|
|
|
+ wl_data_offer_destroy(_glfw.wl.selectionOffer);
|
|
|
+ if (_glfw.wl.selectionSource)
|
|
|
+ wl_data_source_destroy(_glfw.wl.selectionSource);
|
|
|
if (_glfw.wl.dataDevice)
|
|
|
wl_data_device_destroy(_glfw.wl.dataDevice);
|
|
|
- if (_glfw.wl.dataOffer)
|
|
|
- wl_data_offer_destroy(_glfw.wl.dataOffer);
|
|
|
if (_glfw.wl.dataDeviceManager)
|
|
|
wl_data_device_manager_destroy(_glfw.wl.dataDeviceManager);
|
|
|
if (_glfw.wl.pointer)
|