diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2023-10-19 11:00:30 +0200 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2023-10-19 11:00:30 +0200 |
| commit | ff7958e57a1b4e163fb05015dea7ba35e09055ee (patch) | |
| tree | 3b2f307a56a8887c20c3c3f73af8ecbf26f1cc8c | |
| parent | c1d9376934182201f45db2bf6941ae4f766a2918 (diff) | |
Fix "Keyboard sometimes stops working after Ctrl/+ or Ctrl/-" (#794)
| -rw-r--r-- | src/Fl_Screen_Driver.cxx | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/src/Fl_Screen_Driver.cxx b/src/Fl_Screen_Driver.cxx index a98577e19..89d2c0b91 100644 --- a/src/Fl_Screen_Driver.cxx +++ b/src/Fl_Screen_Driver.cxx @@ -439,17 +439,20 @@ void Fl_Screen_Driver::transient_scale_display(float f, int nscreen) win->user_data((void*)&transient_scale_display); // prevent this window from being rescaled later win->set_output(); win->set_non_modal(); - Fl_Window_Driver::driver(win)->screen_num(nscreen); - Fl_Window_Driver::driver(win)->force_position(1); WinAndTracker *data = new WinAndTracker; data->win = win; Fl_Widget *widget = Fl::focus(); data->tracker = (widget ? new Fl_Widget_Tracker(widget) : NULL); + if (widget) { // make transient a centered child of focussed window + Fl_Window *top = widget->top_window(); + win->position((top->w() - win->w()) / 2, (top->h() - win->h()) / 2); + top->add(win); + } else { // center transient on display + Fl_Window_Driver::driver(win)->screen_num(nscreen); + Fl_Window_Driver::driver(win)->force_position(1); + } win->show(); Fl::add_timeout(1, (Fl_Timeout_Handler)del_transient_window, data); // delete after 1 sec - win->wait_for_expose(); - Fl::flush(); - Fl::check(); } // respond to Ctrl-'+' and Ctrl-'-' and Ctrl-'0' (Ctrl-'=' is same as Ctrl-'+') by rescaling all windows @@ -499,14 +502,9 @@ int Fl_Screen_Driver::scale_handler(int event) f = scaling_values[i]; } if (f == old_f) return 1; - static bool in_use = false; - if (!in_use) { // avoid recursive use (see issue #794) - in_use = true; - screen_dr->rescale_all_windows_from_screen(screen, f * initial_scale); - Fl_Screen_Driver::transient_scale_display(f, screen); - Fl::handle(FL_ZOOM_EVENT, NULL); - in_use = false; - } + screen_dr->rescale_all_windows_from_screen(screen, f * initial_scale); + Fl_Screen_Driver::transient_scale_display(f, screen); + Fl::handle(FL_ZOOM_EVENT, NULL); return 1; } return 0; |
