diff --git a/Source/Engine/Platform/SDL/SDLPlatform.cpp b/Source/Engine/Platform/SDL/SDLPlatform.cpp index da6929b65..c7f00778e 100644 --- a/Source/Engine/Platform/SDL/SDLPlatform.cpp +++ b/Source/Engine/Platform/SDL/SDLPlatform.cpp @@ -50,10 +50,12 @@ bool SDLPlatform::Init() #endif #if PLATFORM_LINUX - // TODO: This should be read from the platform configuration (needed for desktop icon handling) + // The name follows the .desktop entry specification, this is used to get a fallback icon on Wayland: + // https://specifications.freedesktop.org/desktop-entry-spec/latest/file-naming.html #if USE_EDITOR SDL_SetHint(SDL_HINT_APP_ID, StringAnsi("com.FlaxEngine.FlaxEditor").Get()); #else + // TODO: This should be read from the platform configuration (needed for desktop icon handling) SDL_SetHint(SDL_HINT_APP_ID, StringAnsi("com.FlaxEngine.FlaxGame").Get()); #endif #else diff --git a/Source/Engine/Platform/SDL/SDLWindow.cpp b/Source/Engine/Platform/SDL/SDLWindow.cpp index 4abbc3463..6879d0659 100644 --- a/Source/Engine/Platform/SDL/SDLWindow.cpp +++ b/Source/Engine/Platform/SDL/SDLWindow.cpp @@ -5,16 +5,23 @@ #include "SDLWindow.h" #include "SDLInput.h" #include "Engine/Core/Log.h" +#include "Engine/Core/Math/Color32.h" #include "Engine/Core/Math/Math.h" #include "Engine/Core/Math/Rectangle.h" -#include "Engine/Engine/Engine.h" +#include "Engine/Engine/Globals.h" #include "Engine/Graphics/GPUDevice.h" #include "Engine/Graphics/GPUSwapChain.h" #include "Engine/Graphics/RenderTask.h" +#include "Engine/Graphics/Textures/TextureData.h" #include "Engine/Input/Input.h" #include "Engine/Input/Keyboard.h" #include "Engine/Input/Mouse.h" +#include "Engine/Platform/FileSystem.h" #include "Engine/Platform/WindowsManager.h" +#if PLATFORM_LINUX +#define COMPILE_WITH_TEXTURE_TOOL 1 // FIXME +#include "Engine/Tools/TextureTool/TextureTool.h" +#endif #define NOGDI #include @@ -212,6 +219,27 @@ SDLWindow::SDLWindow(const CreateWindowSettings& settings) if (SDLPlatform::UsesX11() && _settings.AllowInput) SDL_StartTextInput(_window); #endif + +#if PLATFORM_LINUX && COMPILE_WITH_TEXTURE_TOOL + // Ensure windows other than the main window have some kind of icon + static SDL_Surface* surface = nullptr; + static Array colorData; + if (surface == nullptr) + { + const String iconPath = Globals::BinariesFolder / TEXT("Logo.png"); + if (FileSystem::FileExists(iconPath)) + { + TextureData icon; + if (!TextureTool::ImportTexture(iconPath, icon)) + { + icon.GetPixels(colorData); + surface = SDL_CreateSurfaceFrom(icon.Width, icon.Height, SDL_PIXELFORMAT_ABGR8888, colorData.Get(), sizeof(Color32) * icon.Width); + } + } + } + if (surface != nullptr) + SDL_SetWindowIcon(_window, surface); +#endif } SDL_Window* SDLWindow::GetSDLWindow() const @@ -966,5 +994,15 @@ void SDLWindow::UpdateCursor() SDL_SetCursor(Cursors[index]); } +void SDLWindow::SetIcon(TextureData& icon) +{ + Array colorData; + icon.GetPixels(colorData); + SDL_Surface* surface = SDL_CreateSurfaceFrom(icon.Width, icon.Height, SDL_PIXELFORMAT_ABGR8888, colorData.Get(), sizeof(Color32) * icon.Width); + + SDL_SetWindowIcon(_window, surface); + SDL_free(surface); +} + #endif diff --git a/Source/Engine/Platform/SDL/SDLWindow.h b/Source/Engine/Platform/SDL/SDLWindow.h index 70b9ff354..3c3f02f26 100644 --- a/Source/Engine/Platform/SDL/SDLWindow.h +++ b/Source/Engine/Platform/SDL/SDLWindow.h @@ -106,6 +106,7 @@ public: void EndClippingCursor() override; void SetMousePosition(const Float2& position) const override; void SetCursor(CursorType type) override; + void SetIcon(TextureData& icon) override; #if USE_EDITOR && PLATFORM_WINDOWS // [IUnknown]