|
@@ -1534,6 +1534,8 @@ static void dataOfferHandleOffer(void* userData,
|
|
{
|
|
{
|
|
if (strcmp(mimeType, "text/plain;charset=utf-8") == 0)
|
|
if (strcmp(mimeType, "text/plain;charset=utf-8") == 0)
|
|
_glfw.wl.offers[i].text_plain_utf8 = GLFW_TRUE;
|
|
_glfw.wl.offers[i].text_plain_utf8 = GLFW_TRUE;
|
|
|
|
+ else if (strcmp(mimeType, "text/uri-list") == 0)
|
|
|
|
+ _glfw.wl.offers[i].text_uri_list = GLFW_TRUE;
|
|
|
|
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -1572,24 +1574,53 @@ static void dataDeviceHandleEnter(void* userData,
|
|
wl_fixed_t y,
|
|
wl_fixed_t y,
|
|
struct wl_data_offer* offer)
|
|
struct wl_data_offer* offer)
|
|
{
|
|
{
|
|
|
|
+ if (_glfw.wl.dragOffer)
|
|
|
|
+ {
|
|
|
|
+ wl_data_offer_destroy(_glfw.wl.dragOffer);
|
|
|
|
+ _glfw.wl.dragOffer = NULL;
|
|
|
|
+ _glfw.wl.dragFocus = NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
for (unsigned int i = 0; i < _glfw.wl.offerCount; i++)
|
|
for (unsigned int i = 0; i < _glfw.wl.offerCount; i++)
|
|
{
|
|
{
|
|
if (_glfw.wl.offers[i].offer == offer)
|
|
if (_glfw.wl.offers[i].offer == offer)
|
|
{
|
|
{
|
|
|
|
+ _GLFWwindow* window = NULL;
|
|
|
|
+
|
|
|
|
+ if (surface)
|
|
|
|
+ window = wl_surface_get_user_data(surface);
|
|
|
|
+
|
|
|
|
+ if (window && _glfw.wl.offers[i].text_uri_list)
|
|
|
|
+ {
|
|
|
|
+ _glfw.wl.dragOffer = offer;
|
|
|
|
+ _glfw.wl.dragFocus = window;
|
|
|
|
+ _glfw.wl.dragSerial = serial;
|
|
|
|
+ }
|
|
|
|
+
|
|
_glfw.wl.offers[i] = _glfw.wl.offers[_glfw.wl.offerCount - 1];
|
|
_glfw.wl.offers[i] = _glfw.wl.offers[_glfw.wl.offerCount - 1];
|
|
_glfw.wl.offerCount--;
|
|
_glfw.wl.offerCount--;
|
|
-
|
|
|
|
- // We don't yet handle drag and drop
|
|
|
|
- wl_data_offer_accept(offer, serial, NULL);
|
|
|
|
- wl_data_offer_destroy(offer);
|
|
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (_glfw.wl.dragOffer)
|
|
|
|
+ wl_data_offer_accept(offer, serial, "text/uri-list");
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ wl_data_offer_accept(offer, serial, NULL);
|
|
|
|
+ wl_data_offer_destroy(offer);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
static void dataDeviceHandleLeave(void* userData,
|
|
static void dataDeviceHandleLeave(void* userData,
|
|
struct wl_data_device* device)
|
|
struct wl_data_device* device)
|
|
{
|
|
{
|
|
|
|
+ if (_glfw.wl.dragOffer)
|
|
|
|
+ {
|
|
|
|
+ wl_data_offer_destroy(_glfw.wl.dragOffer);
|
|
|
|
+ _glfw.wl.dragOffer = NULL;
|
|
|
|
+ _glfw.wl.dragFocus = NULL;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
static void dataDeviceHandleMotion(void* userData,
|
|
static void dataDeviceHandleMotion(void* userData,
|
|
@@ -1603,6 +1634,24 @@ static void dataDeviceHandleMotion(void* userData,
|
|
static void dataDeviceHandleDrop(void* userData,
|
|
static void dataDeviceHandleDrop(void* userData,
|
|
struct wl_data_device* device)
|
|
struct wl_data_device* device)
|
|
{
|
|
{
|
|
|
|
+ if (!_glfw.wl.dragOffer)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ char* string = readDataOfferAsString(_glfw.wl.dragOffer, "text/uri-list");
|
|
|
|
+ if (string)
|
|
|
|
+ {
|
|
|
|
+ int count;
|
|
|
|
+ char** paths = _glfwParseUriList(string, &count);
|
|
|
|
+ if (paths)
|
|
|
|
+ _glfwInputDrop(_glfw.wl.dragFocus, count, (const char**) paths);
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < count; i++)
|
|
|
|
+ _glfw_free(paths[i]);
|
|
|
|
+
|
|
|
|
+ _glfw_free(paths);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ _glfw_free(string);
|
|
}
|
|
}
|
|
|
|
|
|
static void dataDeviceHandleSelection(void* userData,
|
|
static void dataDeviceHandleSelection(void* userData,
|