diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2023-10-23 11:15:04 +0200 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2023-10-23 11:15:04 +0200 |
| commit | 39a157a7dd83e1626c9f67e0b09d6deb23aa7c76 (patch) | |
| tree | 1d293a1dea40a80bbbb80e8dbea011b7ae51769b /src/Fl_Screen_Driver.cxx | |
| parent | 17baeceb7ab90251f99c7909eb9eeca92aec5a05 (diff) | |
Wayland: implement transient scale factor windows as popups
as discussed in issue #794.
Also, fix for macOS the use of the FL_FOCUS event for these transient windows
Diffstat (limited to 'src/Fl_Screen_Driver.cxx')
| -rw-r--r-- | src/Fl_Screen_Driver.cxx | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/Fl_Screen_Driver.cxx b/src/Fl_Screen_Driver.cxx index 78d598d13..1bcd54727 100644 --- a/src/Fl_Screen_Driver.cxx +++ b/src/Fl_Screen_Driver.cxx @@ -390,14 +390,14 @@ struct WinAndTracker { static void del_transient_window(WinAndTracker *data) { delete (Fl_Image*)data->win->shape(); - Fl::delete_widget(data->win); + delete data->win; if (data->tracker) { if (data->tracker->exists()) { data->tracker->widget()->take_focus(); } delete data->tracker; } - delete data; + data->win = NULL; } void Fl_Screen_Driver::transient_scale_display(float f, int nscreen) @@ -440,12 +440,18 @@ void Fl_Screen_Driver::transient_scale_display(float f, int nscreen) 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; + static WinAndTracker data = {NULL, NULL}; + if (data.win) { + Fl::remove_timeout((Fl_Timeout_Handler)del_transient_window); + delete data.win; + } + data.win = win; Fl_Widget *widget = Fl::focus(); - data->tracker = (widget ? new Fl_Widget_Tracker(widget) : NULL); + if (!widget) widget = Fl::first_window(); + data.tracker = (widget ? new Fl_Widget_Tracker(widget) : NULL); win->show(); - Fl::add_timeout(1, (Fl_Timeout_Handler)del_transient_window, data); // delete after 1 sec + // delete transient win after 1 sec + Fl::add_timeout(1, (Fl_Timeout_Handler)del_transient_window, &data); } // respond to Ctrl-'+' and Ctrl-'-' and Ctrl-'0' (Ctrl-'=' is same as Ctrl-'+') by rescaling all windows |
