summaryrefslogtreecommitdiff
path: root/src/Fl_Screen_Driver.cxx
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2023-10-23 11:15:04 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2023-10-23 11:15:04 +0200
commit39a157a7dd83e1626c9f67e0b09d6deb23aa7c76 (patch)
tree1d293a1dea40a80bbbb80e8dbea011b7ae51769b /src/Fl_Screen_Driver.cxx
parent17baeceb7ab90251f99c7909eb9eeca92aec5a05 (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.cxx18
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