From cb468c59d2ca54068ffe1f0046224127bb26742a Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Mon, 25 Jul 2016 23:50:57 +0200 Subject: [PATCH] Improvements for the window focus --- ChangeLog | 5 ++- src/fapp.cpp | 22 +++++++--- src/fapp.h | 2 +- src/fdialog.cpp | 103 +++++++++++++++++----------------------------- src/fdialog.h | 5 ++- src/fmenuitem.cpp | 13 ++---- 6 files changed, 66 insertions(+), 84 deletions(-) diff --git a/ChangeLog b/ChangeLog index d4578f77..6a2c7538 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,7 @@ -2016-07-23 Markus Gans +2016-07-25 Markus Gans + * Improvements for the window focus + +2016-07-24 Markus Gans * Add missing null pointer check in FOptiAttr before dereferencing * Remove callbacks and accelerator keys from FDialogListMenu on closing of a dialog window diff --git a/src/fapp.cpp b/src/fapp.cpp index d04676d3..76b715a8 100644 --- a/src/fapp.cpp +++ b/src/fapp.cpp @@ -399,14 +399,22 @@ void FApplication::processKeyboardEvent() accpt = processDialogSwitchAccelerator(); // windows keyboard accelerator - FWidget* window = static_cast(active_window); + if ( ! accpt ) + { + FWidget* window = static_cast(active_window); - if ( window && ! accpt ) - accpt = processAccelerator (window); + if ( window ) + accpt = processAccelerator (window); + } // global keyboard accelerator if ( ! accpt ) - accpt = processAccelerator (getRootWidget()); + { + FWidget* root_widget = getRootWidget(); + + if ( root_widget ) + accpt = processAccelerator (root_widget); + } } } // end of else } @@ -737,7 +745,7 @@ bool FApplication::processDialogSwitchAccelerator() } //---------------------------------------------------------------------- -bool FApplication::processAccelerator (FWidget* widget) +bool FApplication::processAccelerator (FWidget*& widget) { bool accpt = false; @@ -1480,9 +1488,11 @@ void FApplication::processMouseEvent() , *mouse , fc::LeftButton | key_state ); FWidget* released_widget = clicked_widget; + if ( b_state.right_button != Pressed && b_state.middle_button != Pressed ) clicked_widget = 0; + sendEvent (released_widget, &m_up_ev); } @@ -1501,9 +1511,11 @@ void FApplication::processMouseEvent() , *mouse , fc::RightButton | key_state ); FWidget* released_widget = clicked_widget; + if ( b_state.left_button != Pressed && b_state.middle_button != Pressed ) clicked_widget = 0; + sendEvent (released_widget, &m_up_ev); } diff --git a/src/fapp.h b/src/fapp.h index e9cea50c..4b2cc12a 100644 --- a/src/fapp.h +++ b/src/fapp.h @@ -126,7 +126,7 @@ class FApplication : public FWidget void processKeyboardEvent(); int modifierKeyCorrection (int& key); bool processDialogSwitchAccelerator(); - bool processAccelerator (FWidget*); + bool processAccelerator (FWidget*&); void getX11ButtonState (int); bool parseX11Mouse(); bool parseSGRMouse(); diff --git a/src/fdialog.cpp b/src/fdialog.cpp index 945cb8d9..ac10f81d 100644 --- a/src/fdialog.cpp +++ b/src/fdialog.cpp @@ -582,26 +582,7 @@ void FDialog::onMouseDown (FMouseEvent* ev) has_raised = raiseWindow(); if ( ! isActiveWindow() ) - { - FWidget* old_focus = FWidget::getFocusWidget(); - setActiveWindow(this); - - if ( focus_widget && numOfFocusableChildren() > 1 ) - { - focus_widget->setFocus(); - focus_widget->redraw(); - - if ( old_focus ) - old_focus->redraw(); - } - else if ( old_focus && focusFirstChild() ) - old_focus->redraw(); - - if ( statusBar() ) - statusBar()->drawMessage(); - - updateTerminal(); - } + activateDialog(); if ( has_raised ) redraw(); @@ -635,26 +616,7 @@ void FDialog::onMouseDown (FMouseEvent* ev) if ( mouse_x >= 4 && mouse_x <= width && mouse_y == 1 ) { if ( ! isActiveWindow() ) - { - FWidget* old_focus = FWidget::getFocusWidget(); - setActiveWindow(this); - - if ( focus_widget && numOfFocusableChildren() > 1 ) - { - focus_widget->setFocus(); - focus_widget->redraw(); - - if ( old_focus ) - old_focus->redraw(); - } - else if ( old_focus && focusFirstChild() ) - old_focus->redraw(); - - if ( statusBar() ) - statusBar()->drawMessage(); - - updateTerminal(); - } + activateDialog(); } } @@ -666,26 +628,7 @@ void FDialog::onMouseDown (FMouseEvent* ev) bool has_lowered = lowerWindow(); if ( ! isActiveWindow() ) - { - FWidget* old_focus = FWidget::getFocusWidget(); - setActiveWindow(this); - - if ( focus_widget && numOfFocusableChildren() > 1 ) - { - focus_widget->setFocus(); - focus_widget->redraw(); - - if ( old_focus ) - old_focus->redraw(); - } - else if ( old_focus && focusFirstChild() ) - old_focus->redraw(); - - if ( statusBar() ) - statusBar()->drawMessage(); - - updateTerminal(); - } + activateDialog(); else if ( has_lowered ) updateTerminal(); } @@ -804,15 +747,15 @@ void FDialog::onMouseDoubleClick (FMouseEvent* ev) //---------------------------------------------------------------------- void FDialog::onAccel (FAccelEvent*) { - if ( ! this->isHiddenWindow() && ! this->isActiveWindow() ) + if ( ! isHiddenWindow() && ! isActiveWindow() ) { - FWindow::setActiveWindow(this); - FWindow::raiseWindow (this); + bool has_raised = raiseWindow(); + activateDialog(); - if ( focus_widget ) - focus_widget->setFocus(); + if ( has_raised ) + redraw(); - this->redraw(); + updateTerminal(); } } @@ -1066,6 +1009,34 @@ void FDialog::move (int x, int y) updateTerminal(); } +//---------------------------------------------------------------------- +void FDialog::activateDialog() +{ + FWidget* old_focus = FWidget::getFocusWidget(); + setActiveWindow(this); + + if ( focus_widget && numOfFocusableChildren() > 1 ) + { + focus_widget->setFocus(); + focus_widget->redraw(); + + if ( old_focus ) + old_focus->redraw(); + } + else if ( old_focus ) + { + if ( ! focusFirstChild() ) + old_focus->unsetFocus(); + + old_focus->redraw(); + } + + if ( statusBar() ) + statusBar()->drawMessage(); + + updateTerminal(); +} + //---------------------------------------------------------------------- void FDialog::setWidth (int w, bool adjust) { diff --git a/src/fdialog.h b/src/fdialog.h index 3fc599c8..5ba5a975 100644 --- a/src/fdialog.h +++ b/src/fdialog.h @@ -50,7 +50,7 @@ class FDialog : public FWindow }; private: - FString tb_text; // title bar text + FString tb_text; // title bar text int result_code; bool maximized; FPoint TitleBarClickPos; @@ -93,13 +93,14 @@ class FDialog : public FWindow void onWindowInactive (FEvent*); void onWindowRaised (FEvent*); void onWindowLowered (FEvent*); - + void activateDialog(); void drawDialogShadow(); void show(); void hide(); int exec(); void move (const FPoint&); void move (int, int); + void setWidth (int, bool = true); void setHeight (int, bool = true); // make every setGeometry from FWidget available diff --git a/src/fmenuitem.cpp b/src/fmenuitem.cpp index 4f8d0178..090327c1 100644 --- a/src/fmenuitem.cpp +++ b/src/fmenuitem.cpp @@ -301,16 +301,11 @@ void FMenuItem::cb_switchToDialog (FWidget*, void* data_ptr) { FDialog* win = static_cast(data_ptr); - if ( win && ! win->isHiddenWindow() && ! win->isActiveWindow() ) + if ( win ) { - FWindow::setActiveWindow(win); - FWidget* focus_widget = win->getFocusWidget(); - FWindow::raiseWindow (win); - - if ( focus_widget ) - focus_widget->setFocus(); - - win->redraw(); + FWidget* focus_widget = getFocusWidget(); + FAccelEvent a_ev (fc::Accelerator_Event, focus_widget); + FApplication::sendEvent (win, &a_ev); } }