add window icon

This commit is contained in:
MihailRis 2024-07-28 23:47:49 +03:00
parent c0ba5be458
commit b021339a8a
4 changed files with 31 additions and 5 deletions

BIN
res/textures/misc/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

@ -64,6 +64,18 @@ inline void create_channel(Engine* engine, std::string name, NumberSetting& sett
}, true)); }, true));
} }
static std::unique_ptr<ImageData> load_icon(const fs::path& resdir) {
try {
auto file = resdir / fs::u8path("textures/misc/icon.png");
if (fs::exists(file)) {
return imageio::read(file.u8string());
}
} catch (const std::exception& err) {
logger.error() << "could not load window icon: " << err.what();
}
return nullptr;
}
Engine::Engine(EngineSettings& settings, SettingsHandler& settingsHandler, EnginePaths* paths) Engine::Engine(EngineSettings& settings, SettingsHandler& settingsHandler, EnginePaths* paths)
: settings(settings), settingsHandler(settingsHandler), paths(paths), : settings(settings), settingsHandler(settingsHandler), paths(paths),
interpreter(std::make_unique<cmd::CommandsInterpreter>()) interpreter(std::make_unique<cmd::CommandsInterpreter>())
@ -71,10 +83,16 @@ Engine::Engine(EngineSettings& settings, SettingsHandler& settingsHandler, Engin
paths->prepare(); paths->prepare();
loadSettings(); loadSettings();
auto resdir = paths->getResources();
controller = std::make_unique<EngineController>(this); controller = std::make_unique<EngineController>(this);
if (Window::initialize(&this->settings.display)){ if (Window::initialize(&this->settings.display)){
throw initialize_error("could not initialize window"); throw initialize_error("could not initialize window");
} }
if (auto icon = load_icon(resdir)) {
icon->flipY();
Window::setIcon(icon.get());
}
loadControls(); loadControls();
audio::initialize(settings.audio.enabled.get()); audio::initialize(settings.audio.enabled.get());
create_channel(this, "master", settings.audio.volumeMaster); create_channel(this, "master", settings.audio.volumeMaster);
@ -99,8 +117,6 @@ Engine::Engine(EngineSettings& settings, SettingsHandler& settingsHandler, Engin
addWorldGenerators(); addWorldGenerators();
scripting::initialize(this); scripting::initialize(this);
auto resdir = paths->getResources();
basePacks = files::read_list(resdir/fs::path("config/builtins.list")); basePacks = files::read_list(resdir/fs::path("config/builtins.list"));
} }
@ -171,7 +187,7 @@ void Engine::mainloop() {
if (!Window::isIconified()) { if (!Window::isIconified()) {
renderFrame(batch); renderFrame(batch);
} }
Window::setFramerate(Window::isIconified() ? 20 : Window::setFramerate(!Window::isIconified() ? 20 :
settings.display.framerate.get()); settings.display.framerate.get());
processPostRunnables(); processPostRunnables();

View File

@ -323,13 +323,13 @@ bool Window::isFullscreen() {
} }
void Window::swapBuffers() { void Window::swapBuffers() {
glfwSwapBuffers(window);
Window::resetScissor();
double currentTime = time(); double currentTime = time();
if (framerate > 0 && currentTime - prevSwap < (1.0 / framerate)) { if (framerate > 0 && currentTime - prevSwap < (1.0 / framerate)) {
std::this_thread::sleep_for(std::chrono::milliseconds( std::this_thread::sleep_for(std::chrono::milliseconds(
static_cast<int>((1.0/framerate - (currentTime-prevSwap))*1000))); static_cast<int>((1.0/framerate - (currentTime-prevSwap))*1000)));
} }
glfwSwapBuffers(window);
Window::resetScissor();
prevSwap = time(); prevSwap = time();
} }
@ -375,3 +375,12 @@ bool Window::tryToMaximize(GLFWwindow* window, GLFWmonitor* monitor) {
workArea.y + (workArea.w - Window::height) / 2 + windowFrame.y / 2); workArea.y + (workArea.w - Window::height) / 2 + windowFrame.y / 2);
return false; return false;
} }
void Window::setIcon(const ImageData* image) {
GLFWimage icon {
static_cast<int>(image->getWidth()),
static_cast<int>(image->getHeight()),
image->getData()
};
glfwSetWindowIcon(window, 1, &icon);
}

View File

@ -55,6 +55,7 @@ public:
static const char* getClipboardText(); static const char* getClipboardText();
static void setClipboardText(const char* text); static void setClipboardText(const char* text);
static DisplaySettings* getSettings(); static DisplaySettings* getSettings();
static void setIcon(const ImageData* image);
static glm::vec2 size() { static glm::vec2 size() {
return glm::vec2(width, height); return glm::vec2(width, height);