Add borderless window mode (from tasks) (#630)

This commit is contained in:
ChancellorIkseew 2025-10-01 06:53:15 +10:00 committed by GitHub
parent 06e65911a3
commit b30b19e836
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 53 additions and 25 deletions

View File

@ -53,10 +53,18 @@ function create_checkbox(id, name, tooltip)
)) ))
end end
function create_selectbox(id, name, tooltip)
tooltip = tooltip or ''
document.root:add(string.format(
"<selectbox consumer='function(x) core.set_setting(\"%s\", x) end' checked='%s' tooltip='%s'>%s</checkbox>",
id, core.str_setting(id), gui.str(tooltip, "settings"), gui.str(name, "settings")
))
end
function on_open() function on_open()
create_setting("camera.fov", "FOV", 1, "°") create_setting("camera.fov", "FOV", 1, "°")
create_setting("display.framerate", "Framerate", 1, "", "", true) create_setting("display.framerate", "Framerate", 1, "", "", true)
create_checkbox("display.fullscreen", "Fullscreen") --create_checkbox("display.fullscreen", "Fullscreen")
create_checkbox("camera.shaking", "Camera Shaking") create_checkbox("camera.shaking", "Camera Shaking")
create_checkbox("camera.inertia", "Camera Inertia") create_checkbox("camera.inertia", "Camera Inertia")
create_checkbox("camera.fov-effects", "Camera FOV Effects") create_checkbox("camera.fov-effects", "Camera FOV Effects")

View File

@ -135,10 +135,11 @@ void Engine::initializeClient() {
if (ENGINE_DEBUG_BUILD) { if (ENGINE_DEBUG_BUILD) {
menus::create_version_label(*gui); menus::create_version_label(*gui);
} }
keepAlive(settings.display.fullscreen.observe( keepAlive(settings.display.windowMode.observe(
[this](bool value) { [this](int value) {
if (value != this->window->isFullscreen()) { WindowMode mode = static_cast<WindowMode>(value);
this->window->toggleFullscreen(); if (mode != this->window->getMode()) {
this->window->setMode(mode);
} }
}, },
true true
@ -237,7 +238,11 @@ void Engine::updateHotkeys() {
gui->toggleDebug(); gui->toggleDebug();
} }
if (input->jpressed(Keycode::F11)) { if (input->jpressed(Keycode::F11)) {
settings.display.fullscreen.toggle(); if (settings.display.windowMode.get() != static_cast<int>(WindowMode::FULLSCREEN)) {
settings.display.windowMode.set(static_cast<int>(WindowMode::FULLSCREEN));
} else {
settings.display.windowMode.set(static_cast<int>(WindowMode::WINDOWED));
}
} }
} }

View File

@ -49,8 +49,8 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) {
builder.add("height", &settings.display.height); builder.add("height", &settings.display.height);
builder.add("samples", &settings.display.samples); builder.add("samples", &settings.display.samples);
builder.add("framerate", &settings.display.framerate); builder.add("framerate", &settings.display.framerate);
builder.add("fullscreen", &settings.display.fullscreen);
builder.add("limit-fps-iconified", &settings.display.limitFpsIconified); builder.add("limit-fps-iconified", &settings.display.limitFpsIconified);
builder.add("window-mode", &settings.display.windowMode);
builder.section("camera"); builder.section("camera");
builder.add("sensitivity", &settings.camera.sensitivity); builder.add("sensitivity", &settings.camera.sensitivity);

View File

@ -19,8 +19,8 @@ struct AudioSettings {
}; };
struct DisplaySettings { struct DisplaySettings {
/// @brief Is window in full screen mode /// @brief Window mode (windowed/fullscreen/borderless)
FlagSetting fullscreen {false}; IntegerSetting windowMode {0, 0, 2};
/// @brief Window width (pixels) /// @brief Window width (pixels)
IntegerSetting width {1280}; IntegerSetting width {1280};
/// @brief Window height (pixels) /// @brief Window height (pixels)

View File

@ -10,6 +10,12 @@ class ImageData;
class Input; class Input;
struct DisplaySettings; struct DisplaySettings;
enum class WindowMode {
WINDOWED,
FULLSCREEN,
BORDERLESS
};
class Window { class Window {
public: public:
Window(glm::ivec2 size) : size(std::move(size)) {} Window(glm::ivec2 size) : size(std::move(size)) {}
@ -25,8 +31,8 @@ public:
virtual void setShouldClose(bool flag) = 0; virtual void setShouldClose(bool flag) = 0;
virtual void setCursor(CursorShape shape) = 0; virtual void setCursor(CursorShape shape) = 0;
virtual void toggleFullscreen() = 0; virtual void setMode(WindowMode mode) = 0;
virtual bool isFullscreen() const = 0; virtual WindowMode getMode() const = 0;
virtual void setIcon(const ImageData* image) = 0; virtual void setIcon(const ImageData* image) = 0;
@ -51,6 +57,7 @@ public:
> initialize(DisplaySettings* settings, std::string title); > initialize(DisplaySettings* settings, std::string title);
protected: protected:
glm::ivec2 size; glm::ivec2 size;
WindowMode mode = WindowMode::WINDOWED;
}; };
namespace display { namespace display {

View File

@ -406,21 +406,28 @@ public:
glfwSetCursor(window, standard_cursors[static_cast<int>(shape)]); glfwSetCursor(window, standard_cursors[static_cast<int>(shape)]);
} }
void toggleFullscreen() override { void setMode(WindowMode mode) override {
fullscreen = !fullscreen; Window::mode = mode;
GLFWmonitor* monitor = glfwGetPrimaryMonitor(); GLFWmonitor* monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor); const GLFWvidmode* glfwMode = glfwGetVideoMode(monitor);
if (input.isCursorLocked()){ if (input.isCursorLocked()){
input.toggleCursor(); input.toggleCursor();
} }
if (fullscreen) { if (mode == WindowMode::FULLSCREEN) {
const int width = glfwMode->width;
const int height = glfwMode->height;
const int refreshRate = glfwMode->refreshRate;
glfwGetWindowPos(window, &posX, &posY); glfwGetWindowPos(window, &posX, &posY);
glfwSetWindowMonitor( glfwSetWindowMonitor(window, monitor, 0, 0, width, height, refreshRate);
window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate }
); else if(mode == WindowMode::BORDERLESS) {
glfwGetWindowPos(window, &posX, &posY);
glfwSetWindowAttrib(window, GLFW_DECORATED, GLFW_FALSE);
glfwSetWindowAttrib(window, GLFW_RESIZABLE, GLFW_FALSE);
glfwSetWindowSize(window, glfwMode->width, glfwMode->height);
glfwSetWindowPos(window, 0, 0);
} else { } else {
glfwSetWindowMonitor( glfwSetWindowMonitor(
window, window,
@ -431,6 +438,8 @@ public:
settings->height.get(), settings->height.get(),
GLFW_DONT_CARE GLFW_DONT_CARE
); );
glfwSetWindowAttrib(window, GLFW_DECORATED, GLFW_TRUE);
glfwSetWindowAttrib(window, GLFW_RESIZABLE, GLFW_TRUE);
window_size_callback(window, settings->width.get(), settings->height.get()); window_size_callback(window, settings->width.get(), settings->height.get());
} }
@ -439,8 +448,8 @@ public:
input.setCursorPosition(xPos, yPos); input.setCursorPosition(xPos, yPos);
} }
bool isFullscreen() const override { WindowMode getMode() const override {
return fullscreen; return mode;
} }
void setIcon(const ImageData* image) override { void setIcon(const ImageData* image) override {
@ -459,7 +468,7 @@ public:
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
size = {width, height}; size = {width, height};
if (!isFullscreen() && !isMaximized()) { if (mode == WindowMode::WINDOWED && !isMaximized()) {
settings->width.set(width); settings->width.set(width);
settings->height.set(height); settings->height.set(height);
} }
@ -542,7 +551,6 @@ public:
private: private:
GLFWwindow* window; GLFWwindow* window;
CursorShape cursor = CursorShape::ARROW; CursorShape cursor = CursorShape::ARROW;
bool fullscreen = false;
int framerate = -1; int framerate = -1;
std::stack<glm::vec4> scissorStack; std::stack<glm::vec4> scissorStack;
glm::vec4 scissorArea; glm::vec4 scissorArea;
@ -600,7 +608,7 @@ static void cursor_pos_callback(GLFWwindow* window, double xpos, double ypos) {
static void iconify_callback(GLFWwindow* window, int iconified) { static void iconify_callback(GLFWwindow* window, int iconified) {
auto handler = static_cast<GLFWWindow*>(glfwGetWindowUserPointer(window)); auto handler = static_cast<GLFWWindow*>(glfwGetWindowUserPointer(window));
if (handler->isFullscreen() && iconified == 0) { if (handler->getMode() == WindowMode::FULLSCREEN && iconified == 0) {
GLFWmonitor* monitor = glfwGetPrimaryMonitor(); GLFWmonitor* monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor); const GLFWvidmode* mode = glfwGetVideoMode(monitor);
glfwSetWindowMonitor( glfwSetWindowMonitor(