summaryrefslogtreecommitdiff
path: root/src/drivers/Wayland
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/Wayland')
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.H3
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx42
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx2
3 files changed, 33 insertions, 14 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.H b/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.H
index 0fac14877..a7622fc1c 100644
--- a/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.H
+++ b/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.H
@@ -32,13 +32,13 @@ private:
static EGLDisplay egl_display;
struct wl_egl_window *egl_window;
EGLSurface egl_surface;
+ bool need_swap;
Fl_Wayland_Gl_Window_Driver(Fl_Gl_Window *win);
float pixels_per_unit() FL_OVERRIDE;
void make_current_before() FL_OVERRIDE;
int mode_(int m, const int *a) FL_OVERRIDE;
void swap_buffers() FL_OVERRIDE;
void resize(int is_a_resize, int w, int h) FL_OVERRIDE;
- void after_resize() FL_OVERRIDE;
char swap_type() FL_OVERRIDE;
void swap_interval(int) FL_OVERRIDE;
int swap_interval() const FL_OVERRIDE;
@@ -52,6 +52,7 @@ private:
void gl_visual(Fl_Gl_Choice *c) FL_OVERRIDE;
void init();
public:
+ static void surface_frame_done(void *data, struct wl_callback *cb, uint32_t time);
//virtual bool need_scissor() { return true; } // CONTROL_LEAKING_SUB_GL_WINDOWS
//void apply_scissor(); // CONTROL_LEAKING_SUB_GL_WINDOWS
};
diff --git a/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx
index 4817562de..18be68168 100644
--- a/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx
@@ -76,6 +76,7 @@ Fl_Wayland_Gl_Window_Driver::Fl_Wayland_Gl_Window_Driver(Fl_Gl_Window *win) :
if (egl_display == EGL_NO_DISPLAY) init();
egl_window = NULL;
egl_surface = NULL;
+ need_swap = false;
}
@@ -300,6 +301,23 @@ int Fl_Wayland_Gl_Window_Driver::mode_(int m, const int *a) {
}
+void Fl_Wayland_Gl_Window_Driver::surface_frame_done(void *data, struct wl_callback *cb, uint32_t time) {
+ Fl_Wayland_Gl_Window_Driver *gl_dr = (Fl_Wayland_Gl_Window_Driver *)data;
+ wl_callback_destroy(cb);
+ struct wld_window *window = fl_wl_xid(gl_dr->pWindow);
+ window->frame_cb = NULL;
+ if (gl_dr->need_swap) {
+ eglSwapBuffers(Fl_Wayland_Gl_Window_Driver::egl_display, gl_dr->egl_surface);
+ gl_dr->need_swap = false;
+ }
+}
+
+
+static const struct wl_callback_listener surface_frame_listener = {
+ .done = Fl_Wayland_Gl_Window_Driver::surface_frame_done,
+};
+
+
void Fl_Wayland_Gl_Window_Driver::swap_buffers() {
if (overlay()) {
static bool overlay_buffer = true;
@@ -333,14 +351,21 @@ void Fl_Wayland_Gl_Window_Driver::swap_buffers() {
}
if (egl_surface) {
- if (pWindow->parent()) { // issue #967
+ Fl_Window *parent = pWindow->parent() ? pWindow->window() : NULL;
+ struct wld_window *parent_xid = parent ? fl_wl_xid(parent) : NULL;
+ if (parent_xid) { // issue #967
struct wld_window *xid = fl_wl_xid(pWindow);
- if (xid->frame_cb) return;
- xid->frame_cb = wl_surface_frame(xid->wl_surface);
- wl_callback_add_listener(xid->frame_cb, Fl_Wayland_Graphics_Driver::p_surface_frame_listener,
- xid);
+ if (xid->frame_cb) {
+ need_swap = true;
+ return;
+ }
+ if (!parent_xid->frame_cb) {
+ xid->frame_cb = wl_surface_frame(xid->wl_surface);
+ wl_callback_add_listener(xid->frame_cb, &surface_frame_listener, this);
+ }
}
eglSwapBuffers(Fl_Wayland_Gl_Window_Driver::egl_display, egl_surface);
+ need_swap = false;
}
}
@@ -406,13 +431,6 @@ void Fl_Wayland_Gl_Window_Driver::resize(int is_a_resize, int W, int H) {
}*/
}
-void Fl_Wayland_Gl_Window_Driver::after_resize() {
- Fl_Window *parent = (pWindow->parent() ? pWindow->window() : NULL);
- struct wld_window *xid = (parent ? fl_wl_xid(parent) : NULL);
- if (xid && !xid->frame_cb) {
- eglSwapBuffers(Fl_Wayland_Gl_Window_Driver::egl_display, egl_surface);
- }
-}
char Fl_Wayland_Gl_Window_Driver::swap_type() {
return copy;
diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index 6c7da19fe..1af97ebf5 100644
--- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
@@ -1517,7 +1517,6 @@ void Fl_Wayland_Window_Driver::makeWindow()
wait_for_expose_value = 0;
pWindow->border(0);
checkSubwindowFrame(); // make sure subwindow doesn't leak outside parent
- if (can_expand_outside_parent_) parent->covered = true; // for #1307
} else { // a window without decoration
new_window->kind = UNFRAMED;
@@ -1926,6 +1925,7 @@ void Fl_Wayland_Window_Driver::resize(int X, int Y, int W, int H) {
if (fl_win->subsurface) wl_subsurface_set_position(fl_win->subsurface, X * f, Y * f);
if (!parent_xid->buffer->wl_buffer || parent_xid->buffer->draw_buffer_needs_commit) {
if (!parent_xid->frame_cb) Fl_Wayland_Graphics_Driver::buffer_commit(parent_xid);
+ else wl_surface_commit(parent_xid->wl_surface);
} else {
if (!parent_xid->frame_cb) {
// Use the frame callback mechanism applied to the object's parent window