Improvements for the window focus

This commit is contained in:
Markus Gans 2016-07-25 23:50:57 +02:00
parent 4ba7af7cdc
commit cb468c59d2
6 changed files with 66 additions and 84 deletions

View File

@ -1,4 +1,7 @@
2016-07-23 Markus Gans <guru.mail@muenster.de>
2016-07-25 Markus Gans <guru.mail@muenster.de>
* Improvements for the window focus
2016-07-24 Markus Gans <guru.mail@muenster.de>
* Add missing null pointer check in FOptiAttr before dereferencing
* Remove callbacks and accelerator keys from FDialogListMenu
on closing of a dialog window

View File

@ -399,14 +399,22 @@ void FApplication::processKeyboardEvent()
accpt = processDialogSwitchAccelerator();
// windows keyboard accelerator
FWidget* window = static_cast<FWidget*>(active_window);
if ( ! accpt )
{
FWidget* window = static_cast<FWidget*>(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);
}

View File

@ -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();

View File

@ -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)
{

View File

@ -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

View File

@ -301,16 +301,11 @@ void FMenuItem::cb_switchToDialog (FWidget*, void* data_ptr)
{
FDialog* win = static_cast<FDialog*>(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);
}
}