diff options
| -rw-r--r-- | FL/Fl_Window_Driver.H | 5 | ||||
| -rw-r--r-- | src/Fl_Double_Window.cxx | 2 | ||||
| -rw-r--r-- | src/Fl_Gl_Window.cxx | 3 | ||||
| -rw-r--r-- | src/Fl_Group.cxx | 3 | ||||
| -rw-r--r-- | src/Fl_Window_Driver.cxx | 22 | ||||
| -rw-r--r-- | src/Fl_win32.cxx | 4 | ||||
| -rw-r--r-- | src/Fl_x.cxx | 4 |
7 files changed, 24 insertions, 19 deletions
diff --git a/FL/Fl_Window_Driver.H b/FL/Fl_Window_Driver.H index 3035b330b..1ce201370 100644 --- a/FL/Fl_Window_Driver.H +++ b/FL/Fl_Window_Driver.H @@ -44,13 +44,16 @@ class FL_EXPORT Fl_Window_Driver { friend class Fl_Window; friend class Fl_X; + friend class Fl_Group; + friend class Fl_Gl_Window; + friend class Fl_Double_Window; protected: Fl_Window *pWindow; struct shape_data_type; shape_data_type *shape_data_; ///< non-null means the window has a non-rectangular shape void flush_Fl_Window(); // accessor to protected Fl_Window::flush() - + static bool in_resize_after_scale_change; public: Fl_Window_Driver(Fl_Window *); virtual ~Fl_Window_Driver(); diff --git a/src/Fl_Double_Window.cxx b/src/Fl_Double_Window.cxx index bd62d3563..06b6e2b1b 100644 --- a/src/Fl_Double_Window.cxx +++ b/src/Fl_Double_Window.cxx @@ -55,7 +55,7 @@ void Fl_Double_Window::resize(int X,int Y,int W,int H) { int oh = h(); Fl_Window::resize(X,Y,W,H); Fl_X *myi = Fl_X::i(this); - if (myi && driver()->other_xid && (ow < w() || oh < h())) + if (myi && driver()->other_xid && (ow < w() || oh < h() || Fl_Window_Driver::in_resize_after_scale_change)) driver()->destroy_double_buffer(); } diff --git a/src/Fl_Gl_Window.cxx b/src/Fl_Gl_Window.cxx index 22e81e946..fc5a7748d 100644 --- a/src/Fl_Gl_Window.cxx +++ b/src/Fl_Gl_Window.cxx @@ -24,6 +24,7 @@ extern int fl_gl_load_plugin; #include <FL/gl.h> #include <FL/Fl_Gl_Window.H> #include <FL/Fl_Gl_Window_Driver.H> +#include <FL/Fl_Window_Driver.H> #include <stdlib.h> #include <FL/fl_utf8.h> # if (HAVE_DLSYM && HAVE_DLFCN_H) @@ -260,7 +261,7 @@ void Fl_Gl_Window::resize(int X,int Y,int W,int H) { // printf("Fl_Gl_Window::resize(X=%d, Y=%d, W=%d, H=%d)\n", X, Y, W, H); // printf("current: x()=%d, y()=%d, w()=%d, h()=%d\n", x(), y(), w(), h()); - int is_a_resize = (W != Fl_Widget::w() || H != Fl_Widget::h()); + int is_a_resize = (W != Fl_Widget::w() || H != Fl_Widget::h() || Fl_Window_Driver::in_resize_after_scale_change); if (is_a_resize) valid(0); pGlWindowDriver->resize(is_a_resize, W, H); Fl_Window::resize(X,Y,W,H); diff --git a/src/Fl_Group.cxx b/src/Fl_Group.cxx index 34049a53d..f359152f5 100644 --- a/src/Fl_Group.cxx +++ b/src/Fl_Group.cxx @@ -25,6 +25,7 @@ #include <FL/Fl.H> #include <FL/Fl_Group.H> #include <FL/Fl_Window.H> +#include <FL/Fl_Window_Driver.H> #include <FL/fl_draw.H> #include <stdlib.h> @@ -699,7 +700,7 @@ void Fl_Group::resize(int X, int Y, int W, int H) { Fl_Widget::resize(X,Y,W,H); // make new xywh values visible for children - if (!resizable() || (dw==0 && dh==0) ) { + if ((!resizable() || (dw==0 && dh==0 )) && !Fl_Window_Driver::in_resize_after_scale_change) { if (!as_window()) { Fl_Widget*const* a = array(); diff --git a/src/Fl_Window_Driver.cxx b/src/Fl_Window_Driver.cxx index 07fbef967..f294a50cb 100644 --- a/src/Fl_Window_Driver.cxx +++ b/src/Fl_Window_Driver.cxx @@ -260,21 +260,21 @@ int Fl_Window_Driver::screen_num() { return Fl::screen_num(x(), y(), w(), h()); } +bool Fl_Window_Driver::in_resize_after_scale_change = false; + void Fl_Window_Driver::resize_after_scale_change(int ns, float old_f, float new_f) { - int oldx = pWindow->x(), oldy = pWindow->y(); - fl_uintptr_t current = current_cursor(); - pWindow->hide(); screen_num(ns); - pWindow->position(oldx*old_f/new_f, oldy*old_f/new_f); - force_position(1); + Fl_Graphics_Driver::default_driver().scale(new_f); + int W, H; if (pWindow->fullscreen_active()) { - pWindow->size(pWindow->w() * old_f/new_f, pWindow->h() * old_f/new_f); + W = pWindow->w() * old_f/new_f; H = pWindow->h() * old_f/new_f; + } else { + W = pWindow->w(); H = pWindow->h(); } - Fl_Graphics_Driver::default_driver().scale(new_f); - pWindow->show(); - reuse_cursor(current); - reuse_icons(); -//extern FILE*LOG;fprintf(LOG,"ns=%d old_f%.2f new_f=%.2f\n",ns,old_f,new_f);fflush(LOG); + in_resize_after_scale_change = true; + pWindow->resize(pWindow->x()*old_f/new_f, pWindow->y()*old_f/new_f, W, H); + size_range(); + in_resize_after_scale_change = false; } // diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx index f1ca65e61..34c428eb7 100644 --- a/src/Fl_win32.cxx +++ b/src/Fl_win32.cxx @@ -1679,10 +1679,10 @@ int Fl_WinAPI_Window_Driver::fake_X_wm(int &X,int &Y, int &bt,int &bx, int &by) void Fl_WinAPI_Window_Driver::resize(int X,int Y,int W,int H) { UINT flags = SWP_NOSENDCHANGING | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER; - int is_a_resize = (W != w() || H != h()); + int is_a_resize = (W != w() || H != h() || in_resize_after_scale_change); int resize_from_program = (pWindow != resize_bug_fix); if (!resize_from_program) resize_bug_fix = 0; - if (X != x() || Y != y()) { + if (X != x() || Y != y() || in_resize_after_scale_change) { force_position(1); } else { if (!is_a_resize) return; diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index f81ceff9f..8733f1d7b 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -2106,8 +2106,8 @@ fprintf(stderr,"\n");*/ //////////////////////////////////////////////////////////////// void Fl_X11_Window_Driver::resize(int X,int Y,int W,int H) { - int is_a_move = (X != x() || Y != y()); - int is_a_resize = (W != w() || H != h()); + int is_a_move = (X != x() || Y != y() || in_resize_after_scale_change); + int is_a_resize = (W != w() || H != h() || in_resize_after_scale_change); int resize_from_program = (pWindow != resize_bug_fix); if (!resize_from_program) resize_bug_fix = 0; if (is_a_move && resize_from_program) force_position(1); |
