summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2023-10-21 09:46:20 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2023-10-21 09:46:20 +0200
commit7a434575acc6cb8121ae790ab94250b331b412f4 (patch)
tree19ec146d1e46ec39e1fb38b7aa17d72daa531037
parent9817536cfd4a9ea8d9bb5ef41580a5ba3d254911 (diff)
Fix "Keyboard sometimes stops working after Ctrl/+ or Ctrl/-" (#794)
-rw-r--r--src/Fl.cxx4
-rw-r--r--src/Fl_Screen_Driver.cxx13
2 files changed, 7 insertions, 10 deletions
diff --git a/src/Fl.cxx b/src/Fl.cxx
index e204a1cd5..94cfff6e8 100644
--- a/src/Fl.cxx
+++ b/src/Fl.cxx
@@ -943,6 +943,10 @@ Fl_Widget* fl_oldfocus; // kludge for Fl_Group...
/**
Sets the widget that will receive FL_KEYBOARD events.
+ Use this function inside the \c handle(int) member function of a widget of yours
+ to give focus to the widget, for example when it receives the FL_FOCUS or the FL_PUSH event.
+ Otherwise, use Fl_Widget::take_focus() to give focus to a widget;
+
If you change Fl::focus(), the previous widget and all
parents (that don't contain the new widget) are sent FL_UNFOCUS
events. Changing the focus does \e not send FL_FOCUS to
diff --git a/src/Fl_Screen_Driver.cxx b/src/Fl_Screen_Driver.cxx
index 89d2c0b91..78d598d13 100644
--- a/src/Fl_Screen_Driver.cxx
+++ b/src/Fl_Screen_Driver.cxx
@@ -393,8 +393,7 @@ static void del_transient_window(WinAndTracker *data) {
Fl::delete_widget(data->win);
if (data->tracker) {
if (data->tracker->exists()) {
- Fl::focus(data->tracker->widget());
- data->tracker->widget()->handle(FL_FOCUS);
+ data->tracker->widget()->take_focus();
}
delete data->tracker;
}
@@ -439,18 +438,12 @@ 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
}