From 818e2b77d141574a8ef8cf50bbe33241206a2ee9 Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Fri, 1 Nov 2024 15:43:18 +0100 Subject: Wayland: Fix issue in maximization of a borderless window (#1099) Also fixes scenarios mixing fullscreen and maximization: - maximize - set fullscreen - unset fullscreen - un-maximize with and without window border. --- src/Fl_Window.cxx | 12 ++++++------ src/Fl_Window_fullscreen.cxx | 13 ++++++++----- src/Fl_cocoa.mm | 7 +++++-- src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx | 2 ++ src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx | 3 +++ 5 files changed, 24 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/Fl_Window.cxx b/src/Fl_Window.cxx index 6ded79b01..c0dad7e37 100644 --- a/src/Fl_Window.cxx +++ b/src/Fl_Window.cxx @@ -954,13 +954,14 @@ fl_uintptr_t Fl_Window::os_id() { return pWindowDriver->os_id();} This function is effective only with a show()'n, resizable, top-level window. Bordered and borderless windows can be used. + Fullscreen windows can't be used. \see Fl_Window::un_maximize(), Fl_Window::maximize_active() */ void Fl_Window::maximize() { - if (!shown() || parent() || !is_resizable() || maximize_active()) return; + if (!shown() || parent() || !is_resizable() || maximize_active() || fullscreen_active()) + return; set_flag(MAXIMIZED); - if (border()) pWindowDriver->maximize(); - else pWindowDriver->Fl_Window_Driver::maximize(); + pWindowDriver->maximize(); } /** @@ -968,10 +969,9 @@ void Fl_Window::maximize() { \see Fl_Window::maximize() */ void Fl_Window::un_maximize() { - if (!shown() || parent() || !is_resizable() || !maximize_active()) return; + if (!shown() || parent() || !is_resizable() || !maximize_active() || fullscreen_active()) return; clear_flag(MAXIMIZED); - if (border()) pWindowDriver->un_maximize(); - else pWindowDriver->Fl_Window_Driver::un_maximize(); + pWindowDriver->un_maximize(); } void Fl_Window::is_maximized_(bool b) { diff --git a/src/Fl_Window_fullscreen.cxx b/src/Fl_Window_fullscreen.cxx index f6919f87c..e464a9fba 100644 --- a/src/Fl_Window_fullscreen.cxx +++ b/src/Fl_Window_fullscreen.cxx @@ -37,10 +37,12 @@ void Fl_Window::border(int b) { */ void Fl_Window::fullscreen() { if (!is_resizable()) return; - no_fullscreen_x = x(); - no_fullscreen_y = y(); - no_fullscreen_w = w(); - no_fullscreen_h = h(); + if (!maximize_active()) { + no_fullscreen_x = x(); + no_fullscreen_y = y(); + no_fullscreen_w = w(); + no_fullscreen_h = h(); + } if (shown() && !(flags() & Fl_Widget::FULLSCREEN)) { pWindowDriver->fullscreen_on(); } else { @@ -54,7 +56,8 @@ void Fl_Window::fullscreen_off(int X,int Y,int W,int H) { } else { clear_flag(FULLSCREEN); } - no_fullscreen_x = no_fullscreen_y = no_fullscreen_w = no_fullscreen_h = 0; + if (!maximize_active()) + no_fullscreen_x = no_fullscreen_y = no_fullscreen_w = no_fullscreen_h = 0; } void Fl_Window::fullscreen_off() { diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index e7e3c8a50..285b3d469 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -3328,12 +3328,14 @@ void Fl_Cocoa_Window_Driver::fullscreen_on() { void Fl_Cocoa_Window_Driver::maximize() { - [fl_xid(pWindow) performZoom:nil]; + if (border()) [fl_xid(pWindow) performZoom:nil]; + else Fl_Window_Driver::maximize(); } void Fl_Cocoa_Window_Driver::un_maximize() { - [fl_xid(pWindow) performZoom:nil]; + if (border()) [fl_xid(pWindow) performZoom:nil]; + else Fl_Window_Driver::un_maximize(); } @@ -3387,6 +3389,7 @@ void Fl_Cocoa_Window_Driver::fullscreen_off(int X, int Y, int W, int H) { [nswin setStyleMask:calc_win_style(pWindow)]; //10.6 restore_window_title_and_icon(pWindow, icon_image); pWindow->resize(X, Y, W, H); + if (pWindow->maximize_active()) Fl_Window_Driver::maximize(); if (has_focus) [nswin makeKeyAndOrderFront:nil]; else [nswin orderFront:nil]; } else diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx index 46df38e6b..79d26a03b 100644 --- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx @@ -2175,10 +2175,12 @@ Fl_Wayland_Plugin *Fl_Wayland_Window_Driver::gl_plugin() { void Fl_Wayland_Window_Driver::maximize() { struct wld_window *xid = (struct wld_window *)Fl_X::flx(pWindow)->xid; if (xid->kind == DECORATED) libdecor_frame_set_maximized(xid->frame); + else Fl_Window_Driver::maximize(); } void Fl_Wayland_Window_Driver::un_maximize() { struct wld_window *xid = (struct wld_window *)Fl_X::flx(pWindow)->xid; if (xid->kind == DECORATED) libdecor_frame_unset_maximized(xid->frame); + else Fl_Window_Driver::un_maximize(); } diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx index f6ad0bcad..b930719a6 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx +++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx @@ -610,6 +610,7 @@ void Fl_WinAPI_Window_Driver::fullscreen_off(int X, int Y, int W, int H) { scaledW += bx*2; scaledH += by*2+bt; SetWindowLong(fl_xid(pWindow), GWL_STYLE, style); + if (pWindow->maximize_active()) return this->maximize(); SetWindowPos(fl_xid(pWindow), 0, scaledX, scaledY, scaledW, scaledH, SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED); Fl::handle(FL_FULLSCREEN, pWindow); @@ -617,10 +618,12 @@ void Fl_WinAPI_Window_Driver::fullscreen_off(int X, int Y, int W, int H) { void Fl_WinAPI_Window_Driver::maximize() { + if (!border()) return Fl_Window_Driver::maximize(); ShowWindow(fl_xid(pWindow), SW_SHOWMAXIMIZED); } void Fl_WinAPI_Window_Driver::un_maximize() { + if (!border()) return Fl_Window_Driver::un_maximize(); ShowWindow(fl_xid(pWindow), SW_SHOWNORMAL); } -- cgit v1.2.3