aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/gui')
-rw-r--r--src/platform/gui/sdl/OpenGLRenderer.cpp6
-rw-r--r--src/platform/gui/sdl/Window.cpp48
2 files changed, 40 insertions, 14 deletions
diff --git a/src/platform/gui/sdl/OpenGLRenderer.cpp b/src/platform/gui/sdl/OpenGLRenderer.cpp
index dbd59db2..ae5ff957 100644
--- a/src/platform/gui/sdl/OpenGLRenderer.cpp
+++ b/src/platform/gui/sdl/OpenGLRenderer.cpp
@@ -114,10 +114,6 @@ SdlOpenGLRenderer::SdlOpenGLRenderer(SdlWindow* window, int width, int height) {
}
SdlOpenGLRenderer::~SdlOpenGLRenderer() {
- glad_gl_context_.DeleteBuffers(1, &gl_vertex_buffer_);
- glad_gl_context_.DeleteBuffers(1, &gl_element_buffer_);
- glad_gl_context_.DeleteTextures(1, &gl_texture_);
-
if (cairo_) {
cairo_destroy(cairo_);
cairo_ = nullptr;
@@ -216,7 +212,7 @@ GLuint SdlOpenGLRenderer::CreateGLProgram() {
auto check_program = [this](std::string_view name, GLuint program) {
int success;
char infoLog[512];
- glad_gl_context_.GetProgramiv(program, GL_COMPILE_STATUS, &success);
+ glad_gl_context_.GetProgramiv(program, GL_LINK_STATUS, &success);
if (!success) {
glad_gl_context_.GetProgramInfoLog(program, 512, nullptr, infoLog);
CruLogError(kLogTag, "Failed to link OpenGL {} program: {}", name,
diff --git a/src/platform/gui/sdl/Window.cpp b/src/platform/gui/sdl/Window.cpp
index e5de9310..d301efa9 100644
--- a/src/platform/gui/sdl/Window.cpp
+++ b/src/platform/gui/sdl/Window.cpp
@@ -1,5 +1,5 @@
#include "cru/platform/gui/sdl/Window.h"
-#include "cru/base/Base.h"
+#include "cru/base/log/Logger.h"
#include "cru/platform/Base.h"
#include "cru/platform/GraphicsBase.h"
#include "cru/platform/graphics/NullPainter.h"
@@ -21,9 +21,16 @@
namespace cru::platform::gui::sdl {
+namespace {
+bool IsWayland() {
+ return SDL_GetCurrentVideoDriver() == std::string_view("wayland");
+}
+} // namespace
+
SdlWindow::SdlWindow(SdlUiApplication* application)
: application_(application),
sdl_window_(nullptr),
+ sdl_is_popup_(false),
sdl_window_id_(0),
client_rect_(100, 100, 400, 200),
parent_(nullptr) {
@@ -237,12 +244,22 @@ void SdlWindow::DoCreateWindow() {
flags |= SDL_WINDOW_OPENGL;
#endif
- if (style_.Has(WindowStyleFlags::NoCaptionAndBorder)) {
+ auto no_border = style_.Has(WindowStyleFlags::NoCaptionAndBorder);
+ if (no_border) {
flags |= SDL_WINDOW_BORDERLESS;
}
- sdl_window_ = SDL_CreateWindow(title_.c_str(), client_rect_.width,
- client_rect_.height, flags);
+ if (no_border && parent_ && parent_->sdl_window_) {
+ flags |= SDL_WINDOW_POPUP_MENU;
+ sdl_window_ = SDL_CreatePopupWindow(parent_->sdl_window_, client_rect_.left,
+ client_rect_.top, client_rect_.width,
+ client_rect_.height, flags);
+ sdl_is_popup_ = true;
+ } else {
+ sdl_window_ = SDL_CreateWindow(title_.c_str(), client_rect_.width,
+ client_rect_.height, flags);
+ sdl_is_popup_ = false;
+ }
if (!sdl_window_) {
throw SdlException("Failed to create window.");
@@ -255,10 +272,16 @@ void SdlWindow::DoCreateWindow() {
CreateEvent_.Raise(nullptr);
- CheckSdlReturn(
- SDL_SetWindowPosition(sdl_window_, client_rect_.left, client_rect_.top));
+ if (!IsWayland() || sdl_is_popup_) {
+ CheckSdlReturn(SDL_SetWindowPosition(sdl_window_, client_rect_.left,
+ client_rect_.top));
+ }
+
+ if (!IsWayland() || !sdl_is_popup_) {
+ CheckSdlReturn(SDL_SetWindowParent(
+ sdl_window_, parent_ == nullptr ? nullptr : parent_->sdl_window_));
+ }
- DoUpdateParent();
DoUpdateCursor();
#ifdef __unix
@@ -270,8 +293,15 @@ void SdlWindow::DoCreateWindow() {
void SdlWindow::DoUpdateClientRect() {
assert(sdl_window_);
- CheckSdlReturn(
- SDL_SetWindowPosition(sdl_window_, client_rect_.left, client_rect_.top));
+
+ if (!IsWayland() || sdl_is_popup_) {
+ CheckSdlReturn(SDL_SetWindowPosition(sdl_window_, client_rect_.left,
+ client_rect_.top));
+ } else {
+ CruLogWarn(kLogTag,
+ "Wayland doesn't support set position of non-popup window.");
+ }
+
CheckSdlReturn(
SDL_SetWindowSize(sdl_window_, client_rect_.width, client_rect_.height));
CheckSdlReturn(SDL_SyncWindow(sdl_window_));