Fix Scaling window up/down also scales X/Y position on secondary displays only (#925)

This commit is contained in:
ManoloFLTK 2024-03-04 16:25:45 +01:00
parent 7777a503ad
commit a0ff3f6f5c
4 changed files with 9 additions and 10 deletions

View File

@ -2274,9 +2274,9 @@ void Fl::screen_scale(int n, float factor) {
if (!capability || n < 0 || n >= Fl::screen_count()) return;
if (capability == Fl_Screen_Driver::SYSTEMWIDE_APP_SCALING) {
for (int s = 0; s < Fl::screen_count(); s++) {
Fl::screen_driver()->rescale_all_windows_from_screen(s, factor);
Fl::screen_driver()->rescale_all_windows_from_screen(s, factor, factor);
}
} else Fl::screen_driver()->rescale_all_windows_from_screen(n, factor);
} else Fl::screen_driver()->rescale_all_windows_from_screen(n, factor, factor);
}
/**

View File

@ -219,7 +219,7 @@ public:
// compute dimensions of an Fl_Offscreen
virtual void offscreen_size(Fl_Offscreen, int &/*width*/, int &/*height*/) {}
void rescale_all_windows_from_screen(int screen, float f);
void rescale_all_windows_from_screen(int screen, float f, float old_f);
static void transient_scale_display(float f, int nscreen);
// need export to fltk_gl.so because used in glut_compatibility.cxx
static FL_EXPORT int scale_handler(int event);

View File

@ -376,10 +376,8 @@ int Fl_Screen_Driver::input_widget_handle_key(int key, unsigned mods, unsigned s
}
void Fl_Screen_Driver::rescale_all_windows_from_screen(int screen, float f)
void Fl_Screen_Driver::rescale_all_windows_from_screen(int screen, float f, float old_f)
{
float old_f = this->scale(screen);
//if (f == old_f) return;
this->scale(screen, f);
Fl_Graphics_Driver *d = Fl_Display_Device::display_device()->driver();
d->scale(f);
@ -542,11 +540,12 @@ int Fl_Screen_Driver::scale_handler(int event)
}
if (f == old_f) return 1;
if (screen_dr->rescalable() == SYSTEMWIDE_APP_SCALING) {
float old_f = screen_dr->scale(0);
for (int i = 0; i < Fl::screen_count(); i++) {
screen_dr->rescale_all_windows_from_screen(i, f * initial_scale);
screen_dr->rescale_all_windows_from_screen(i, f * initial_scale, old_f);
}
} else {
screen_dr->rescale_all_windows_from_screen(screen, f * initial_scale);
screen_dr->rescale_all_windows_from_screen(screen, f * initial_scale, screen_dr->scale(screen));
}
Fl_Screen_Driver::transient_scale_display(f, screen);
Fl::handle(FL_ZOOM_EVENT, NULL);

View File

@ -1205,7 +1205,7 @@ static void react_to_screen_reconfiguration() {
float new_scale = Fl::screen_driver()->scale(0);
for (int screen = 0; screen < Fl::screen_count(); screen++) {
Fl::screen_driver()->scale(screen, 1);
Fl::screen_driver()->rescale_all_windows_from_screen(screen, new_scale);
Fl::screen_driver()->rescale_all_windows_from_screen(screen, new_scale, 1);
}
}
delete[] scales;
@ -1227,7 +1227,7 @@ static void after_display_rescale(float *p_current_xft_dpi) {
*p_current_xft_dpi = dpi;
float f = dpi/96.;
for (int i = 0; i < Fl::screen_count(); i++)
Fl::screen_driver()->rescale_all_windows_from_screen(i, f);
Fl::screen_driver()->rescale_all_windows_from_screen(i, f, f);
}
}
break;