|
Many paths through the code are necessary to support -resize by the user with the mouse -program-asked resize -GUI rescaling -sub-windows -OS control of admissible window sizes and positions
-fullscreen button of the title bar
I attach what I believe is a fix:
--
You received this message because you are subscribed to the Google Groups "fltk.coredev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to fltkcoredev+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/fltkcoredev/07338395-0dc9-481d-b092-5fbb85442d2bn%40googlegroups.com.
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm
index 2c130f5da..a3573caf0 100644
--- a/src/Fl_cocoa.mm
+++ b/src/Fl_cocoa.mm
@@ -1221,7 +1221,10 @@ - (void)windowDidMove:(NSNotification *)notif
main_screen_height = CGDisplayBounds(CGMainDisplayID()).size.height;
int X, Y;
CocoatoFLTK(window, X, Y);
- if (window->x() != X || window->y() != Y) window->position(X, Y);
+ if (window->x() != X || window->y() != Y) {
+ if (!Fl_Cocoa_Window_Driver::driver(window)->through_resize())
+ window->position(X, Y);
+ }
update_e_xy_and_e_xy_root(nsw);
// at least since MacOS 10.9: OS moves subwindows contained in a moved window
// setSubwindowFrame is no longer necessary.
@@ -1244,7 +1247,10 @@ - (void)view_did_resize:(NSNotification *)notif
float s = Fl::screen_driver()->scale(window->screen_num());
NSRect r = [view frame];
Fl_Cocoa_Window_Driver::driver(window)->view_resized(1);
- window->resize(X, Y, lround(r.size.width/s), lround(r.size.height/s));
+ if (Fl_Cocoa_Window_Driver::driver(window)->through_resize())
+ Fl_Cocoa_Window_Driver::driver(window)->resize(X, Y, lround(r.size.width/s), lround(r.size.height/s));
+ else
+ window->resize(X, Y, lround(r.size.width/s), lround(r.size.height/s));
Fl_Cocoa_Window_Driver::driver(window)->view_resized(0);
update_e_xy_and_e_xy_root(nsw);
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14
@@ -3327,9 +3333,10 @@ static void restore_window_title_and_icon(Fl_Window *pWindow, NSImage *icon) {
if (view_resized() || !visible_r()) {
pWindow->Fl_Group::resize(X, Y, W, H);
if (!pWindow->shown()) pWindow->init_sizes();
- } else {
+ } else if(!through_resize()) {
NSPoint pt = FLTKtoCocoa(pWindow, X, Y, H);
FLWindow *xid = fl_xid(pWindow);
+ through_resize(1);
if (W != w() || H != h() || Fl_Window::is_a_rescale()) {
NSRect r;
float s = Fl::screen_driver()->scale(screen_num());
@@ -3348,9 +3355,10 @@ static void restore_window_title_and_icon(Fl_Window *pWindow, NSImage *icon) {
else {
if (pWindow->parent()) starting_moved_window = pWindow;
[xid setFrameOrigin:pt]; // set cocoa coords to FLTK position
- x(X); y(Y); // useful when frame did not move but X or Y changed
+ x(X); y(Y);
if (pWindow->parent()) starting_moved_window = NULL;
}
+ through_resize(0);
}
}
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
index 970d78839..6f0f11d3f 100644
--- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
+++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
@@ -100,6 +100,8 @@ public:
void changed_resolution(bool);// sets whether window just moved to display with another resolution
bool view_resized(); // did window's view receive [FLView view_did_resize] message?
void view_resized(bool b); // sets whether window's view received [FLView view_did_resize] message
+ bool through_resize(); // did Fl_Window::resize() run already
+ void through_resize(bool b); // set whether Fl_Window::resize() run already
CGRect* subRect() { return subRect_; } // getter
void subRect(CGRect *r) { subRect_ = r; } // setter
static void destroy(FLWindow*);
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
index 1b6205ceb..f9ba65683 100644
--- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
+++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
@@ -262,6 +262,7 @@ int Fl_Cocoa_Window_Driver::scroll(int src_x, int src_y, int src_w, int src_h, i
static const unsigned mapped_mask = 1;
static const unsigned changed_mask = 2;
static const unsigned view_resized_mask = 4;
+static const unsigned through_resize_mask = 8;
bool Fl_Cocoa_Window_Driver::mapped_to_retina() {
return window_flags_ & mapped_mask;
@@ -290,6 +291,15 @@ void Fl_Cocoa_Window_Driver::view_resized(bool b) {
else window_flags_ &= ~view_resized_mask;
}
+bool Fl_Cocoa_Window_Driver::through_resize() {
+ return window_flags_ & through_resize_mask;
+}
+
+void Fl_Cocoa_Window_Driver::through_resize(bool b) {
+ if (b) window_flags_ |= through_resize_mask;
+ else window_flags_ &= ~through_resize_mask;
+}
+
// clip the graphics context to rounded corners
void Fl_Cocoa_Window_Driver::clip_to_rounded_corners(CGContextRef gc, int w, int h) {
[ Direct Link to Message ] | |