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
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()
create_setting("camera.fov", "FOV", 1, "°")
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.inertia", "Camera Inertia")
create_checkbox("camera.fov-effects", "Camera FOV Effects")

View File

@ -135,10 +135,11 @@ void Engine::initializeClient() {
if (ENGINE_DEBUG_BUILD) {
menus::create_version_label(*gui);
}
keepAlive(settings.display.fullscreen.observe(
[this](bool value) {
if (value != this->window->isFullscreen()) {
this->window->toggleFullscreen();
keepAlive(settings.display.windowMode.observe(
[this](int value) {
WindowMode mode = static_cast<WindowMode>(value);
if (mode != this->window->getMode()) {
this->window->setMode(mode);
}
},
true
@ -237,7 +238,11 @@ void Engine::updateHotkeys() {
gui->toggleDebug();
}
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("samples", &settings.display.samples);
builder.add("framerate", &settings.display.framerate);
builder.add("fullscreen", &settings.display.fullscreen);
builder.add("limit-fps-iconified", &settings.display.limitFpsIconified);
builder.add("window-mode", &settings.display.windowMode);
builder.section("camera");
builder.add("sensitivity", &settings.camera.sensitivity);

View File

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

View File

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

View File

@ -406,21 +406,28 @@ public:
glfwSetCursor(window, standard_cursors[static_cast<int>(shape)]);
}
void toggleFullscreen() override {
fullscreen = !fullscreen;
void setMode(WindowMode mode) override {
Window::mode = mode;
GLFWmonitor* monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
const GLFWvidmode* glfwMode = glfwGetVideoMode(monitor);
if (input.isCursorLocked()){
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);
glfwSetWindowMonitor(
window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate
);
glfwSetWindowMonitor(window, monitor, 0, 0, width, height, 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 {
glfwSetWindowMonitor(
window,
@ -431,6 +438,8 @@ public:
settings->height.get(),
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());
}
@ -439,8 +448,8 @@ public:
input.setCursorPosition(xPos, yPos);
}
bool isFullscreen() const override {
return fullscreen;
WindowMode getMode() const override {
return mode;
}
void setIcon(const ImageData* image) override {
@ -459,7 +468,7 @@ public:
glViewport(0, 0, width, height);
size = {width, height};
if (!isFullscreen() && !isMaximized()) {
if (mode == WindowMode::WINDOWED && !isMaximized()) {
settings->width.set(width);
settings->height.set(height);
}
@ -542,7 +551,6 @@ public:
private:
GLFWwindow* window;
CursorShape cursor = CursorShape::ARROW;
bool fullscreen = false;
int framerate = -1;
std::stack<glm::vec4> scissorStack;
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) {
auto handler = static_cast<GLFWWindow*>(glfwGetWindowUserPointer(window));
if (handler->isFullscreen() && iconified == 0) {
if (handler->getMode() == WindowMode::FULLSCREEN && iconified == 0) {
GLFWmonitor* monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
glfwSetWindowMonitor(