some linux work from summer
Some checks failed
Build Android / Game (Android, Release ARM64) (push) Has been cancelled
Build iOS / Game (iOS, Release ARM64) (push) Has been cancelled
Build Linux / Editor (Linux, Development x64) (push) Has been cancelled
Build Linux / Game (Linux, Release x64) (push) Has been cancelled
Build macOS / Editor (Mac, Development ARM64) (push) Has been cancelled
Build macOS / Game (Mac, Release ARM64) (push) Has been cancelled
Build Windows / Editor (Windows, Development x64) (push) Has been cancelled
Build Windows / Game (Windows, Release x64) (push) Has been cancelled
Cooker / Cook (Mac) (push) Has been cancelled
Tests / Tests (Linux) (push) Has been cancelled
Tests / Tests (Windows) (push) Has been cancelled
Some checks failed
Build Android / Game (Android, Release ARM64) (push) Has been cancelled
Build iOS / Game (iOS, Release ARM64) (push) Has been cancelled
Build Linux / Editor (Linux, Development x64) (push) Has been cancelled
Build Linux / Game (Linux, Release x64) (push) Has been cancelled
Build macOS / Editor (Mac, Development ARM64) (push) Has been cancelled
Build macOS / Game (Mac, Release ARM64) (push) Has been cancelled
Build Windows / Editor (Windows, Development x64) (push) Has been cancelled
Build Windows / Game (Windows, Release x64) (push) Has been cancelled
Cooker / Cook (Mac) (push) Has been cancelled
Tests / Tests (Linux) (push) Has been cancelled
Tests / Tests (Windows) (push) Has been cancelled
This commit is contained in:
@@ -14,4 +14,4 @@ bash ./Development/Scripts/Linux/CallBuildTool.sh --genproject "$@"
|
||||
# Build bindings for all editor configurations
|
||||
echo Building C# bindings...
|
||||
# TODO: Detect the correct architecture here
|
||||
Binaries/Tools/Flax.Build -build -BuildBindingsOnly -arch=x64 -platform=Linux --buildTargets=FlaxEditor
|
||||
#Binaries/Tools/Flax.Build -build -BuildBindingsOnly -arch=x64 -platform=Linux --buildTargets=FlaxEditor
|
||||
|
||||
@@ -20,6 +20,6 @@
|
||||
#define PLATFORM_DESKTOP 1
|
||||
#define PLATFORM_CACHE_LINE_SIZE 128
|
||||
#define PLATFORM_HAS_HEADLESS_MODE 1
|
||||
#define PLATFORM_DEBUG_BREAK __asm__ volatile("int $0x03")
|
||||
#define PLATFORM_DEBUG_BREAK __asm volatile("int $0x03")
|
||||
|
||||
#endif
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <SDL3/SDL_video.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <poll.h>
|
||||
#include <wayland/xdg-shell.h>
|
||||
#include <wayland/xdg-toplevel-drag-v1.h>
|
||||
|
||||
@@ -81,6 +82,8 @@ public:
|
||||
|
||||
namespace WaylandImpl
|
||||
{
|
||||
bool DraggingActive = false;
|
||||
bool DraggingWindow = false;
|
||||
wl_display* WaylandDisplay = nullptr;
|
||||
int64 DragOverFlag = 0;
|
||||
int64 Serial = 0;
|
||||
@@ -88,7 +91,11 @@ namespace WaylandImpl
|
||||
{
|
||||
[](void* data, wl_pointer* wl_pointer, uint32_t serial, wl_surface* surface, wl_fixed_t surface_x, wl_fixed_t surface_y) { }, // Enter event
|
||||
[](void* data, wl_pointer* wl_pointer, uint32_t serial, wl_surface* surface) { }, // Leave event
|
||||
[](void* data, wl_pointer* wl_pointer, uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y) { }, // Motion event
|
||||
[](void* data, wl_pointer* wl_pointer, uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y)
|
||||
{
|
||||
//if (DraggingActive && DraggingWindow)
|
||||
// LOG(Info, "point {} {}", surface_x, surface_y);
|
||||
}, // Motion event
|
||||
[](void* data, wl_pointer* wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) // Button event
|
||||
{
|
||||
// Store the serial for upcoming drag-and-drop action
|
||||
@@ -138,26 +145,86 @@ namespace WaylandImpl
|
||||
else if (interfaceStr == "wl_data_device_manager")
|
||||
DataDeviceManager = static_cast<wl_data_device_manager*>(wl_registry_bind(registry, id, &wl_data_device_manager_interface, Math::Min(3U, version)));
|
||||
},
|
||||
[] (void* data, wl_registry* registry, uint32 id) { }, // Announce global remove event
|
||||
[](void* data, wl_registry* registry, uint32 id) { }, // Announce global remove event
|
||||
};
|
||||
|
||||
wl_data_offer* DataOffer = nullptr; // The last accepted offer
|
||||
StringAnsi DataOfferAcceptedOffer = StringAnsi::Empty;
|
||||
wl_data_offer_listener DataOfferListener =
|
||||
{
|
||||
[](void* data, wl_data_offer* id, const char* mime_type)
|
||||
{
|
||||
LOG(Info, "mime: {}", String(mime_type));
|
||||
if (StringAnsi(mime_type) == "text/plain" && DataOfferAcceptedOffer.IsEmpty())
|
||||
DataOfferAcceptedOffer = mime_type;
|
||||
else if (StringAnsi(mime_type) == "flaxengine/window")
|
||||
DataOfferAcceptedOffer = mime_type;
|
||||
}, // Offer event
|
||||
[](void* data, wl_data_offer* id, uint32_t source_actions)
|
||||
{
|
||||
LOG(Info, "source actions?");
|
||||
}, // Source Actions event
|
||||
[](void* data, wl_data_offer* id, uint32_t dnd_action)
|
||||
{
|
||||
LOG(Info, "dnd actions?");
|
||||
}, // DnD Action event
|
||||
};
|
||||
|
||||
Float2 LastDropPosition = Float2::Zero;
|
||||
StringView DraggingData = nullptr;
|
||||
StringAnsi DraggingData2 = nullptr;
|
||||
|
||||
wl_data_offer* SelectionOffer = nullptr;
|
||||
wl_data_device_listener DataDeviceListener =
|
||||
{
|
||||
[](void* data, wl_data_device* data_device, wl_data_offer* id) { }, // Data offer event
|
||||
[](void* data, wl_data_device* data_device, wl_data_offer* id)
|
||||
{
|
||||
LOG(Info, "device offer?");
|
||||
DataOfferAcceptedOffer = StringAnsi::Empty;
|
||||
wl_data_offer_add_listener(id, &DataOfferListener, nullptr);
|
||||
|
||||
}, // Data offer event
|
||||
[](void* data, wl_data_device* data_device, uint32 serial, wl_surface* surface, wl_fixed_t x, wl_fixed_t y, wl_data_offer* id) // Enter event
|
||||
{
|
||||
DataOffer = id;
|
||||
|
||||
SDLWindow* sourceWindow = (SDLWindow*)data;
|
||||
if (sourceWindow == nullptr && surface != nullptr)
|
||||
{
|
||||
WindowsManager::WindowsLocker.Lock();
|
||||
for (auto win : WindowsManager::Windows)
|
||||
{
|
||||
auto sdlWindow = win->GetSDLWindow();
|
||||
wl_surface* windowSurface = static_cast<wl_surface*>(SDL_GetPointerProperty(SDL_GetWindowProperties(sdlWindow), SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER, nullptr));
|
||||
if (windowSurface == surface)
|
||||
{
|
||||
sourceWindow = win;
|
||||
break;
|
||||
}
|
||||
}
|
||||
WindowsManager::WindowsLocker.Unlock();
|
||||
wl_data_device_set_user_data(data_device, sourceWindow);
|
||||
}
|
||||
if (sourceWindow != nullptr)
|
||||
{
|
||||
if (!DataOfferAcceptedOffer.IsEmpty())
|
||||
wl_data_offer_accept(DataOffer, serial, DataOfferAcceptedOffer.Get());
|
||||
|
||||
// Let them know that we support the following action at this given point
|
||||
wl_data_offer_set_actions(id, WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE, WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE);
|
||||
wl_data_offer_set_actions(DataOffer, WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY, WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY);
|
||||
|
||||
LastDropPosition = Float2(x / 256.0f, y / 256.0f);
|
||||
SDL_Event dropEvent = { 0 };
|
||||
dropEvent.drop.type = SDL_EVENT_DROP_BEGIN;
|
||||
dropEvent.drop.windowID = SDL_GetWindowID(sourceWindow->GetSDLWindow());
|
||||
dropEvent.drop.timestamp = SDL_GetTicksNS();
|
||||
dropEvent.drop.x = LastDropPosition.X;
|
||||
dropEvent.drop.y = LastDropPosition.Y;
|
||||
SDL_PushEvent(&dropEvent);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG(Info, "window was null, no action");
|
||||
wl_data_offer_set_actions(id, WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE, WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE);
|
||||
}
|
||||
},
|
||||
@@ -165,10 +232,59 @@ namespace WaylandImpl
|
||||
{
|
||||
// The cursor left the surface area
|
||||
if (DataOffer != nullptr)
|
||||
{
|
||||
wl_data_offer_destroy(DataOffer);
|
||||
DataOffer = nullptr;
|
||||
DataOffer = nullptr;
|
||||
|
||||
SDLWindow* sourceWindow = (SDLWindow*)data;
|
||||
SDLWindow* sourceWindow2 = (SDLWindow*)wl_data_device_get_user_data(data_device);
|
||||
if (sourceWindow != sourceWindow2)
|
||||
sourceWindow = sourceWindow;
|
||||
if (sourceWindow != nullptr)
|
||||
{
|
||||
SDLWindow* sourceWindow = (SDLWindow*)data;
|
||||
SDL_Event dropEvent = { 0 };
|
||||
dropEvent.drop.type = SDL_EVENT_DROP_COMPLETE;
|
||||
dropEvent.drop.windowID = SDL_GetWindowID(sourceWindow->GetSDLWindow());
|
||||
dropEvent.drop.timestamp = SDL_GetTicksNS();
|
||||
dropEvent.drop.x = LastDropPosition.X;
|
||||
dropEvent.drop.y = LastDropPosition.Y;
|
||||
SDL_PushEvent(&dropEvent);
|
||||
}
|
||||
else
|
||||
LOG(Info, "window was null");
|
||||
}
|
||||
|
||||
wl_data_device_set_user_data(data_device, nullptr);
|
||||
},
|
||||
[](void* data, wl_data_device* data_device, uint32_t time, wl_fixed_t x, wl_fixed_t y) // Motion event
|
||||
{
|
||||
/*if (DataOffer != nullptr)
|
||||
LOG(Info, "offered motion");
|
||||
else
|
||||
LOG(Info, "NO VALID OFFER motion");*/
|
||||
|
||||
SDLWindow* sourceWindow = (SDLWindow*)data;
|
||||
SDLWindow* sourceWindow2 = (SDLWindow*)wl_data_device_get_user_data(data_device);
|
||||
if (sourceWindow != sourceWindow2)
|
||||
sourceWindow = sourceWindow;
|
||||
|
||||
if (sourceWindow != nullptr)
|
||||
{
|
||||
LastDropPosition = Float2(x / 256.0f, y / 256.0f);
|
||||
//Input::Mouse->OnMouseMove(mousePos, sourceWindow);
|
||||
|
||||
SDL_Event dropEvent = { 0 };
|
||||
dropEvent.drop.type = SDL_EVENT_DROP_POSITION;
|
||||
dropEvent.drop.windowID = SDL_GetWindowID(sourceWindow->GetSDLWindow());
|
||||
dropEvent.drop.timestamp = SDL_GetTicksNS();
|
||||
dropEvent.drop.x = LastDropPosition.X;
|
||||
dropEvent.drop.y = LastDropPosition.Y;
|
||||
SDL_PushEvent(&dropEvent);
|
||||
}
|
||||
else
|
||||
LOG(Info, "window was null");
|
||||
},
|
||||
[](void* data, wl_data_device* data_device, uint32_t time, wl_fixed_t x, wl_fixed_t y) { }, // Motion event
|
||||
[](void* data, wl_data_device* data_device) // Drop event
|
||||
{
|
||||
// The drop is accepted
|
||||
@@ -177,13 +293,37 @@ namespace WaylandImpl
|
||||
wl_data_offer_finish(DataOffer);
|
||||
wl_data_offer_destroy(DataOffer);
|
||||
DataOffer = nullptr;
|
||||
|
||||
{
|
||||
SDLWindow* sourceWindow = (SDLWindow*)data;
|
||||
SDL_Event dropEvent = { 0 };
|
||||
dropEvent.drop.type = SDL_EVENT_DROP_TEXT;
|
||||
dropEvent.drop.windowID = SDL_GetWindowID(sourceWindow->GetSDLWindow());
|
||||
dropEvent.drop.timestamp = SDL_GetTicksNS();
|
||||
dropEvent.drop.x = LastDropPosition.X;
|
||||
dropEvent.drop.y = LastDropPosition.Y;
|
||||
dropEvent.drop.data = DraggingData2.Get();
|
||||
SDL_PushEvent(&dropEvent);
|
||||
}
|
||||
{
|
||||
SDLWindow* sourceWindow = (SDLWindow*)data;
|
||||
SDL_Event dropEvent = { 0 };
|
||||
dropEvent.drop.type = SDL_EVENT_DROP_COMPLETE;
|
||||
dropEvent.drop.windowID = SDL_GetWindowID(sourceWindow->GetSDLWindow());
|
||||
dropEvent.drop.timestamp = SDL_GetTicksNS();
|
||||
dropEvent.drop.x = LastDropPosition.X;
|
||||
dropEvent.drop.y = LastDropPosition.Y;
|
||||
SDL_PushEvent(&dropEvent);
|
||||
}
|
||||
}
|
||||
},
|
||||
[](void* data, wl_data_device* data_device, wl_data_offer* id) // Selection event
|
||||
{
|
||||
// Clipboard: We can read the clipboard content
|
||||
if (SelectionOffer != nullptr)
|
||||
{
|
||||
wl_data_offer_destroy(SelectionOffer);
|
||||
}
|
||||
SelectionOffer = id;
|
||||
},
|
||||
};
|
||||
@@ -211,7 +351,9 @@ namespace WaylandImpl
|
||||
IGuiData* inputData = static_cast<IGuiData*>(data);
|
||||
Platform::AtomicStore(&WaylandImpl::DragOverFlag, 1);
|
||||
},
|
||||
[](void* data, wl_data_source* source) { }, // DnD drop performed event
|
||||
[](void* data, wl_data_source* source)
|
||||
{
|
||||
}, // DnD drop performed event
|
||||
[](void* data, wl_data_source* source) // DnD Finished event
|
||||
{
|
||||
// The destination has finally accepted the last given dnd_action
|
||||
@@ -220,18 +362,20 @@ namespace WaylandImpl
|
||||
IGuiData* inputData = static_cast<IGuiData*>(data);
|
||||
Platform::AtomicStore(&WaylandImpl::DragOverFlag, 1);
|
||||
},
|
||||
[](void* data, wl_data_source* source, uint32_t dnd_action) { }, // Action event
|
||||
[](void* data, wl_data_source* source, uint32_t dnd_action)
|
||||
{
|
||||
|
||||
}, // Action event
|
||||
};
|
||||
|
||||
wl_data_device* DataDevice = nullptr;
|
||||
wl_event_queue* EventQueue = nullptr;
|
||||
wl_data_device_manager* WrappedDataDeviceManager = nullptr;
|
||||
wl_data_device* WrappedDataDevice = nullptr;
|
||||
bool DraggingActive = false;
|
||||
bool DraggingWindow = false;
|
||||
StringView DraggingData = nullptr;
|
||||
class DragDropJob : public ThreadPoolTask
|
||||
{
|
||||
private:
|
||||
LinuxDropTextData textData;
|
||||
public:
|
||||
int64 StartFlag = 0;
|
||||
int64 WaitFlag = 0;
|
||||
@@ -240,6 +384,7 @@ namespace WaylandImpl
|
||||
SDLWindow* DragSourceWindow = nullptr;
|
||||
Float2 DragOffset = Float2::Zero;
|
||||
uint32 DragSerial = 0;
|
||||
|
||||
|
||||
// [ThreadPoolTask]
|
||||
bool Run() override
|
||||
@@ -263,15 +408,20 @@ namespace WaylandImpl
|
||||
WrappedDataDeviceManager = static_cast<wl_data_device_manager*>(wl_proxy_create_wrapper(DataDeviceManager));
|
||||
wl_proxy_set_queue(reinterpret_cast<wl_proxy*>(WrappedDataDeviceManager), EventQueue);
|
||||
|
||||
DataDevice = wl_data_device_manager_get_data_device(WrappedDataDeviceManager, Seat);
|
||||
wl_data_device_add_listener(DataDevice, &DataDeviceListener, nullptr);
|
||||
wl_display_roundtrip(WaylandDisplay);
|
||||
wl_data_device_set_user_data(DataDevice, dragWindow ? DragSourceWindow : Window);
|
||||
|
||||
WrappedDataDevice = static_cast<wl_data_device*>(wl_proxy_create_wrapper(DataDevice));
|
||||
wl_proxy_set_queue(reinterpret_cast<wl_proxy*>(WrappedDataDevice), EventQueue);
|
||||
//if (!dragWindow)
|
||||
{
|
||||
DataDevice = wl_data_device_manager_get_data_device(WrappedDataDeviceManager, Seat);
|
||||
wl_data_device_add_listener(DataDevice, &DataDeviceListener, nullptr);
|
||||
//wl_display_roundtrip(WaylandDisplay);
|
||||
|
||||
WrappedDataDevice = static_cast<wl_data_device*>(wl_proxy_create_wrapper(DataDevice));
|
||||
wl_proxy_set_queue(reinterpret_cast<wl_proxy*>(WrappedDataDevice), EventQueue);
|
||||
}
|
||||
}
|
||||
|
||||
//wl_data_device_set_user_data(DataDevice, dragWindow ? DragSourceWindow : Window);
|
||||
LOG(Info, "POPULATED");
|
||||
|
||||
// Offer data for consumption, the data source is destroyed elsewhere
|
||||
wl_data_source* dataSource = wl_data_device_manager_create_data_source(WrappedDataDeviceManager);
|
||||
wl_data_source* wrappedDataSource = (wl_data_source*)wl_proxy_create_wrapper(dataSource);
|
||||
@@ -288,8 +438,8 @@ namespace WaylandImpl
|
||||
wl_data_source_offer(dataSource, "text/plain;charset=utf-8");
|
||||
wl_data_source_set_actions(dataSource, WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE | WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY);
|
||||
}
|
||||
LinuxDropTextData textData;
|
||||
textData.Text = *DraggingData;
|
||||
DraggingData2 = StringAnsi(DraggingData);
|
||||
wl_data_source_add_listener(dataSource, &DataSourceListener, &textData);
|
||||
|
||||
// Begin dragging operation
|
||||
@@ -326,8 +476,8 @@ namespace WaylandImpl
|
||||
}
|
||||
}
|
||||
|
||||
if (wl_display_roundtrip_queue(WaylandDisplay, EventQueue) == -1)
|
||||
LOG(Warning, "wl_display_roundtrip_queue failed, errno: {}", errno);
|
||||
if (wl_display_roundtrip_queue(WaylandDisplay, EventQueue) == -1) { }
|
||||
//LOG(Warning, "wl_display_roundtrip_queue failed, errno: {}", errno);
|
||||
}
|
||||
|
||||
if (toplevelDrag != nullptr)
|
||||
@@ -347,6 +497,9 @@ namespace WaylandImpl
|
||||
|
||||
Platform::AtomicStore(&DragOverFlag, 1);
|
||||
|
||||
wl_data_device_set_user_data(DataDevice, nullptr);
|
||||
LOG(Info, "CLEARED");
|
||||
|
||||
if (wrappedDataSource != nullptr)
|
||||
wl_proxy_wrapper_destroy(wrappedDataSource);
|
||||
|
||||
@@ -357,10 +510,10 @@ namespace WaylandImpl
|
||||
}
|
||||
|
||||
// We can't release the queue immediately due to some resources being still used for a while
|
||||
/*if (WaylandQueue != nullptr)
|
||||
/*if (EventQueue != nullptr)
|
||||
{
|
||||
wl_event_queue_destroy(WaylandQueue);
|
||||
WaylandQueue = nullptr;
|
||||
wl_event_queue_destroy(EventQueue);
|
||||
EventQueue = nullptr;
|
||||
}*/
|
||||
|
||||
return false;
|
||||
@@ -1052,6 +1205,29 @@ DragDropEffect Window::DoDragDropX11(const StringView& data)
|
||||
|
||||
void SDLPlatform::PreHandleEvents()
|
||||
{
|
||||
if (WaylandImpl::EventQueue != nullptr && !WaylandImpl::DraggingActive)
|
||||
{
|
||||
//wl_display_flush(WaylandImpl::WaylandDisplay);
|
||||
while (wl_display_prepare_read_queue(WaylandImpl::WaylandDisplay, WaylandImpl::EventQueue) != 0)
|
||||
wl_display_dispatch_queue_pending(WaylandImpl::WaylandDisplay, WaylandImpl::EventQueue);
|
||||
wl_display_flush(WaylandImpl::WaylandDisplay);
|
||||
|
||||
//while (wl_display_prepare_read_queue(WaylandImpl::WaylandDisplay, WaylandImpl::EventQueue) == 0)
|
||||
{
|
||||
pollfd query = { wl_display_get_fd(WaylandImpl::WaylandDisplay), POLLIN, 0 };
|
||||
auto ret = poll(&query, 1, 0);
|
||||
if (ret <= 0)
|
||||
{
|
||||
wl_display_cancel_read(WaylandImpl::WaylandDisplay);
|
||||
//break;
|
||||
}
|
||||
else
|
||||
wl_display_read_events(WaylandImpl::WaylandDisplay);
|
||||
//wl_display_dispatch_queue_pending(WaylandImpl::WaylandDisplay, WaylandImpl::EventQueue);
|
||||
}
|
||||
//wl_display_flush(WaylandImpl::WaylandDisplay);
|
||||
wl_display_dispatch_queue_pending(WaylandImpl::WaylandDisplay, WaylandImpl::EventQueue);
|
||||
}
|
||||
}
|
||||
|
||||
void SDLPlatform::PostHandleEvents()
|
||||
@@ -1105,7 +1281,7 @@ bool SDLWindow::HandleEventInternal(SDL_Event& event)
|
||||
case SDL_EVENT_MOUSE_BUTTON_UP:
|
||||
case SDL_EVENT_MOUSE_MOTION:
|
||||
{
|
||||
if (SDLPlatform::UsesWayland() && WaylandImpl::DraggingActive)
|
||||
if (WaylandImpl::DraggingActive)
|
||||
{
|
||||
// Ignore mouse events in dragged window
|
||||
return true;
|
||||
@@ -1137,6 +1313,8 @@ bool SDLWindow::HandleEventInternal(SDL_Event& event)
|
||||
LinuxDropTextData textData;
|
||||
LinuxDropFilesData filesData;
|
||||
|
||||
LOG(Info, "drop event");
|
||||
|
||||
if (WaylandImpl::DraggingActive && (event.type == SDL_EVENT_DROP_BEGIN || event.type == SDL_EVENT_DROP_POSITION))
|
||||
{
|
||||
// We don't have the window dragging data during these events...
|
||||
@@ -1144,6 +1322,14 @@ bool SDLWindow::HandleEventInternal(SDL_Event& event)
|
||||
}
|
||||
textData.Text = text;
|
||||
|
||||
/*if (WaylandImpl::DraggingActive && event.type == SDL_EVENT_DROP_POSITION)
|
||||
{
|
||||
|
||||
Input::Mouse->OnMouseMove(mousePos, this);
|
||||
|
||||
LOG(Info, "mouse {}", mousePos);
|
||||
}*/
|
||||
|
||||
if (event.type == SDL_EVENT_DROP_BEGIN)
|
||||
{
|
||||
// We don't know the type of dragged data at this point, so call the events for both types
|
||||
@@ -1154,6 +1340,8 @@ bool SDLWindow::HandleEventInternal(SDL_Event& event)
|
||||
}
|
||||
else if (event.type == SDL_EVENT_DROP_POSITION)
|
||||
{
|
||||
LOG(Info, "drop pos");
|
||||
// While dragging external data or windows, we can track the mouse position.
|
||||
Input::Mouse->OnMouseMove(ClientToScreen(mousePos), this);
|
||||
|
||||
// We don't know the type of dragged data at this point, so call the events for both types
|
||||
@@ -1696,6 +1884,15 @@ void SDLPlatform::SetHighDpiAwarenessEnabled(bool enable)
|
||||
base::SetHighDpiAwarenessEnabled(enable);
|
||||
}
|
||||
|
||||
bool SDLPlatform::GetHasFocus()
|
||||
{
|
||||
// We need to be focused in order to report mouse positions from dragging events
|
||||
if (WaylandImpl::DraggingActive)
|
||||
return true;
|
||||
|
||||
return base::GetHasFocus();
|
||||
}
|
||||
|
||||
bool SDLPlatform::UsesWindows()
|
||||
{
|
||||
return false;
|
||||
|
||||
@@ -248,6 +248,15 @@ void SDLPlatform::OpenUrl(const StringView& url)
|
||||
SDL_OpenURL(urlStr.GetText());
|
||||
}
|
||||
|
||||
#if !PLATFORM_LINUX
|
||||
|
||||
bool SDLPlatform::GetHasFocus()
|
||||
{
|
||||
return base::GetHasFocus();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Float2 SDLPlatform::GetMousePosition()
|
||||
{
|
||||
#if PLATFORM_LINUX
|
||||
|
||||
@@ -80,6 +80,7 @@ public:
|
||||
static int32 GetDpi();
|
||||
static String GetUserLocaleName();
|
||||
static void OpenUrl(const StringView& url);
|
||||
static bool GetHasFocus();
|
||||
static Float2 GetMousePosition();
|
||||
static void SetMousePosition(const Float2& pos);
|
||||
static Float2 GetDesktopSize();
|
||||
|
||||
@@ -246,6 +246,7 @@ namespace Flax.Build
|
||||
args.Add("/unsafe");
|
||||
args.Add("/fullpaths");
|
||||
args.Add("/filealign:512");
|
||||
args.Add("/reportanalyzer");
|
||||
#if USE_NETCORE
|
||||
args.Add($"/langversion:{dotnetSdk.CSharpLanguageVersion}");
|
||||
args.Add(string.Format("/nullable:{0}", buildOptions.ScriptingAPI.CSharpNullableReferences.ToString().ToLowerInvariant()));
|
||||
|
||||
@@ -186,6 +186,8 @@ namespace Flax.Build
|
||||
|
||||
// Find system-installed SDK
|
||||
string dotnetPath = Environment.GetEnvironmentVariable("DOTNET_ROOT");
|
||||
if (dotnetPath != null && !Directory.Exists(dotnetPath))
|
||||
dotnetPath = null;
|
||||
string rid, ridFallback, arch;
|
||||
IEnumerable<string> dotnetSdkVersions = null, dotnetRuntimeVersions = null;
|
||||
switch (architecture)
|
||||
@@ -226,10 +228,11 @@ namespace Flax.Build
|
||||
}
|
||||
case TargetPlatform.Linux:
|
||||
{
|
||||
// TODO
|
||||
rid = $"linux-{arch}";
|
||||
ridFallback = Utilities.ReadProcessOutput("dotnet", "--info").Split('\n').FirstOrDefault(x => x.StartsWith(" RID:"), "").Replace("RID:", "").Trim();
|
||||
if (string.IsNullOrEmpty(dotnetPath))
|
||||
dotnetPath ??= SearchForDotnetLocationLinux();
|
||||
dotnetPath = SearchForDotnetLocationLinux();
|
||||
break;
|
||||
}
|
||||
case TargetPlatform.Mac:
|
||||
@@ -576,6 +579,7 @@ namespace Flax.Build
|
||||
return "/usr/lib/dotnet";
|
||||
if (Environment.GetEnvironmentVariable("PATH") is string globalBinPath) // Searching for dotnet binary
|
||||
return globalBinPath.Split(':').FirstOrDefault(x => File.Exists(Path.Combine(x, "dotnet")));
|
||||
Log.Warning("dotnet path find returned null");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Flax.Build;
|
||||
@@ -42,6 +43,8 @@ namespace Flax.Deps.Dependencies
|
||||
/// <inheritdoc />
|
||||
public override void Build(BuildOptions options)
|
||||
{
|
||||
int concurrency = Math.Min(Math.Max(1, (int)(Environment.ProcessorCount * Configuration.ConcurrencyProcessorScale)), Configuration.MaxConcurrency);
|
||||
|
||||
var root = options.IntermediateFolder;
|
||||
var moduleFilename = "assimp.Build.cs";
|
||||
string configHeaderFilePath = null;
|
||||
@@ -131,7 +134,7 @@ namespace Flax.Deps.Dependencies
|
||||
|
||||
// Build for Linux
|
||||
RunCmake(root, platform, TargetArchitecture.x64, " -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF " + globalConfig, envVars);
|
||||
Utilities.Run("make", null, null, root, Utilities.RunOptions.ThrowExceptionOnError, envVars);
|
||||
Utilities.Run("make", $"-j{concurrency}", null, root, Utilities.RunOptions.ThrowExceptionOnError, envVars);
|
||||
configHeaderFilePath = Path.Combine(root, "include", "assimp", "config.h");
|
||||
var depsFolder = GetThirdPartyFolder(options, platform, TargetArchitecture.x64);
|
||||
Utilities.FileCopy(Path.Combine(root, "lib", "libassimp.a"), Path.Combine(depsFolder, "libassimp.a"));
|
||||
@@ -143,7 +146,7 @@ namespace Flax.Deps.Dependencies
|
||||
foreach (var architecture in new[] { TargetArchitecture.x64, TargetArchitecture.ARM64 })
|
||||
{
|
||||
RunCmake(root, platform, architecture, " -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF " + globalConfig);
|
||||
Utilities.Run("make", null, null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
Utilities.Run("make", $"-j{concurrency}", null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
configHeaderFilePath = Path.Combine(root, "include", "assimp", "config.h");
|
||||
var depsFolder = GetThirdPartyFolder(options, platform, architecture);
|
||||
Utilities.FileCopy(Path.Combine(root, "lib", "libassimp.a"), Path.Combine(depsFolder, "libassimp.a"));
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
@@ -184,6 +185,8 @@ namespace Flax.Deps.Dependencies
|
||||
break;
|
||||
}
|
||||
}
|
||||
int concurrency = Math.Min(Math.Max(1, (int)(Environment.ProcessorCount * Configuration.ConcurrencyProcessorScale)), Configuration.MaxConcurrency);
|
||||
envVars.Add("CMAKE_BUILD_PARALLEL_LEVEL", concurrency.ToString());
|
||||
|
||||
// Print the NvCloth version
|
||||
Log.Info($"Building {File.ReadAllLines(Path.Combine(root, "README.md"))[0].Trim()} to {platform} {architecture}");
|
||||
|
||||
@@ -304,8 +304,11 @@ namespace Flax.Deps.Dependencies
|
||||
}
|
||||
break;
|
||||
case TargetPlatform.Linux:
|
||||
Utilities.Run("make", null, null, Path.Combine(projectGenDir, "compiler", "linux-" + configuration), Utilities.RunOptions.ConsoleLogOutput);
|
||||
{
|
||||
int concurrency = Math.Min(Math.Max(1, (int)(Environment.ProcessorCount * Configuration.ConcurrencyProcessorScale)), Configuration.MaxConcurrency);
|
||||
Utilities.Run("make", $"-j{concurrency}", null, Path.Combine(projectGenDir, "compiler", "linux-" + configuration), Utilities.RunOptions.ConsoleLogOutput);
|
||||
break;
|
||||
}
|
||||
case TargetPlatform.Mac:
|
||||
Utilities.Run("xcodebuild", "-project PhysXSDK.xcodeproj -alltargets -configuration " + configuration, null, Path.Combine(projectGenDir, "compiler", preset), Utilities.RunOptions.ConsoleLogOutput);
|
||||
break;
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace Flax.Deps.Dependencies
|
||||
public override void Build(BuildOptions options)
|
||||
{
|
||||
string root = options.IntermediateFolder;
|
||||
string configuration = "Release";
|
||||
string configuration = "Debug";
|
||||
bool buildStatic = true;
|
||||
var configs = new string[]
|
||||
{
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
@@ -44,6 +45,8 @@ namespace Flax.Deps.Dependencies
|
||||
/// <inheritdoc />
|
||||
public override void Build(BuildOptions options)
|
||||
{
|
||||
int concurrency = Math.Min(Math.Max(1, (int)(Environment.ProcessorCount * Configuration.ConcurrencyProcessorScale)), Configuration.MaxConcurrency);
|
||||
|
||||
var root = options.IntermediateFolder;
|
||||
var packagePath = Path.Combine(root, "package.zip");
|
||||
var configuration = "Release";
|
||||
@@ -112,7 +115,7 @@ namespace Flax.Deps.Dependencies
|
||||
SetupDirectory(buildDir, true);
|
||||
Utilities.Run("chmod", "+x configure", null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
Utilities.Run(Path.Combine(root, "configure"), string.Join(" ", settings) + " --prefix=\"" + buildDir + "\"", null, root, Utilities.RunOptions.ThrowExceptionOnError, envVars);
|
||||
Utilities.Run("make", null, null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
Utilities.Run("make", $"-j{concurrency}", null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
Utilities.Run("make", "install", null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
var depsFolder = GetThirdPartyFolder(options, platform, TargetArchitecture.x64);
|
||||
var filename = "libcurl.a";
|
||||
@@ -156,7 +159,7 @@ namespace Flax.Deps.Dependencies
|
||||
Utilities.Run("chmod", "+x configure", null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
Utilities.Run("chmod", "+x install-sh", null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
Utilities.Run(Path.Combine(root, "configure"), string.Join(" ", settings) + " --host=" + archName + " --prefix=\"" + buildDir + "\"", null, root, Utilities.RunOptions.ThrowExceptionOnError, envVars);
|
||||
Utilities.Run("make", null, null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
Utilities.Run("make", $"-j{concurrency}", null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
Utilities.Run("make", "install", null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
var depsFolder = GetThirdPartyFolder(options, platform, architecture);
|
||||
var filename = "libcurl.a";
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
@@ -52,6 +53,8 @@ namespace Flax.Deps.Dependencies
|
||||
/// <inheritdoc />
|
||||
public override void Build(BuildOptions options)
|
||||
{
|
||||
int concurrency = Math.Min(Math.Max(1, (int)(Environment.ProcessorCount * Configuration.ConcurrencyProcessorScale)), Configuration.MaxConcurrency);
|
||||
|
||||
var root = options.IntermediateFolder;
|
||||
var packagePath = Path.Combine(root, "package.zip");
|
||||
var filesToKeep = new[]
|
||||
@@ -61,7 +64,7 @@ namespace Flax.Deps.Dependencies
|
||||
|
||||
// Get the source
|
||||
if (!File.Exists(packagePath))
|
||||
Downloader.DownloadFileFromUrlToPath("https://sourceforge.net/projects/freetype/files/freetype2/2.13.2/ft2132.zip/download", packagePath);
|
||||
Downloader.DownloadFileFromUrlToPath("https://sourceforge.net/projects/freetype/files/freetype2/2.13.3/ft2133.zip/download", packagePath);
|
||||
using (ZipArchive archive = ZipFile.Open(packagePath, ZipArchiveMode.Read))
|
||||
{
|
||||
var newRoot = Path.Combine(root, archive.Entries.First().FullName);
|
||||
@@ -117,15 +120,18 @@ namespace Flax.Deps.Dependencies
|
||||
var envVars = new Dictionary<string, string>
|
||||
{
|
||||
{ "CC", "clang-" + Configuration.LinuxClangMinVer },
|
||||
{ "CC_FOR_BUILD", "clang-" + Configuration.LinuxClangMinVer }
|
||||
{ "CC_FOR_BUILD", "clang-" + Configuration.LinuxClangMinVer },
|
||||
{ "CMAKE_BUILD_PARALLEL_LEVEL", concurrency.ToString() },
|
||||
};
|
||||
|
||||
|
||||
// Fix scripts
|
||||
Utilities.Run("sed", "-i -e \'s/\r$//\' autogen.sh", null, root, Utilities.RunOptions.ThrowExceptionOnError, envVars);
|
||||
Utilities.Run("sed", "-i -e \'s/\r$//\' configure", null, root, Utilities.RunOptions.ThrowExceptionOnError, envVars);
|
||||
Log.Warning("fixing");
|
||||
Utilities.Run("sed", "-i 's/abc$//' autogen.sh", null, root, Utilities.RunOptions.ThrowExceptionOnError, envVars);
|
||||
Utilities.Run("sed", "-i 's/abc$//' configure", null, root, Utilities.RunOptions.ThrowExceptionOnError, envVars);
|
||||
Utilities.Run("chmod", "+x autogen.sh", null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
Utilities.Run("chmod", "+x configure", null, root, Utilities.RunOptions.ThrowExceptionOnError);
|
||||
|
||||
Log.Warning("running");
|
||||
Utilities.Run(Path.Combine(root, "autogen.sh"), null, null, root, Utilities.RunOptions.Default, envVars);
|
||||
|
||||
// Disable using libpng even if it's found on the system
|
||||
@@ -234,7 +240,7 @@ namespace Flax.Deps.Dependencies
|
||||
{
|
||||
SetupDirectory(buildDir, true);
|
||||
RunCmake(buildDir, platform, architecture, ".. -DCMAKE_BUILD_TYPE=Release");
|
||||
BuildCmake(buildDir);
|
||||
BuildCmake(buildDir, envVars: new Dictionary<string, string>() { {"CMAKE_BUILD_PARALLEL_LEVEL", concurrency.ToString()} });
|
||||
var depsFolder = GetThirdPartyFolder(options, platform, architecture);
|
||||
Utilities.FileCopy(Path.Combine(buildDir, libraryFileName), Path.Combine(depsFolder, libraryFileName));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using Flax.Build;
|
||||
|
||||
@@ -41,6 +42,8 @@ namespace Flax.Deps.Dependencies
|
||||
/// <inheritdoc />
|
||||
public override void Build(BuildOptions options)
|
||||
{
|
||||
int concurrency = Math.Min(Math.Max(1, (int)(Environment.ProcessorCount * Configuration.ConcurrencyProcessorScale)), Configuration.MaxConcurrency);
|
||||
|
||||
var root = options.IntermediateFolder;
|
||||
var installDir = Path.Combine(root, "install");
|
||||
var configuration = "Release";
|
||||
@@ -111,7 +114,7 @@ namespace Flax.Deps.Dependencies
|
||||
// Build for Linux
|
||||
RunCmake(root, platform, TargetArchitecture.x64, cmakeArgs);
|
||||
Utilities.Run("cmake", string.Format("--build . --config {0} --target install", configuration), null, buildDir, Utilities.RunOptions.ConsoleLogOutput);
|
||||
Utilities.Run("make", null, null, root, Utilities.RunOptions.ConsoleLogOutput);
|
||||
Utilities.Run("make", $"-j{concurrency}", null, root, Utilities.RunOptions.ConsoleLogOutput);
|
||||
var depsFolder = GetThirdPartyFolder(options, platform, TargetArchitecture.x64);
|
||||
foreach (var file in outputFiles)
|
||||
{
|
||||
@@ -142,7 +145,7 @@ namespace Flax.Deps.Dependencies
|
||||
{
|
||||
RunCmake(root, platform, architecture, cmakeArgs);
|
||||
Utilities.Run("cmake", string.Format("--build . --config {0} --target install", configuration), null, buildDir, Utilities.RunOptions.ConsoleLogOutput);
|
||||
Utilities.Run("make", null, null, root, Utilities.RunOptions.ConsoleLogOutput);
|
||||
Utilities.Run("make", $"-j{concurrency}", null, root, Utilities.RunOptions.ConsoleLogOutput);
|
||||
var depsFolder = GetThirdPartyFolder(options, platform, architecture);
|
||||
foreach (var file in outputFiles)
|
||||
{
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace Flax.Build
|
||||
/// Specifies the minimum Clang compiler version to use on Linux (eg. 10).
|
||||
/// </summary>
|
||||
[CommandLine("linuxClangMinVer", "<version>", "Specifies the minimum Clang compiler version to use on Linux (eg. 10).")]
|
||||
public static string LinuxClangMinVer = "13";
|
||||
public static string LinuxClangMinVer = "14";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -103,8 +103,13 @@ namespace Flax.Build.Platforms
|
||||
StripPath = UnixPlatform.Which("strip");
|
||||
ObjcopyPath = UnixPlatform.Which("objcopy");
|
||||
|
||||
LdPath = UnixPlatform.Which("ld.lld");
|
||||
LdKind = "lld";
|
||||
//LdPath = UnixPlatform.Which("ld.mold");
|
||||
//LdKind = "mold";
|
||||
if (LdPath == null)
|
||||
{
|
||||
LdPath = UnixPlatform.Which("ld.lld");
|
||||
LdKind = "lld";
|
||||
}
|
||||
if (LdPath == null)
|
||||
{
|
||||
LdPath = UnixPlatform.Which("ld.gold");
|
||||
|
||||
Reference in New Issue
Block a user