From 9a694ab26717d7819c8202f44d6c1c1d75f469b0 Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Mon, 24 Dec 2018 18:11:16 +0100 Subject: [PATCH] New event FUserEvent for user-defined events --- ChangeLog | 4 + examples/checklist.cpp | 2 + examples/choice.cpp | 2 +- examples/listbox.cpp | 2 + examples/listview.cpp | 2 + examples/menu.cpp | 2 + examples/mouse.cpp | 6 ++ examples/scrollview.cpp | 2 + examples/term-attributes.cpp | 2 + examples/timer.cpp | 2 +- examples/transparent.cpp | 4 + examples/treeview.cpp | 2 + examples/ui.cpp | 6 ++ examples/watch.cpp | 2 + examples/windows.cpp | 4 + src/fapplication.cpp | 137 ++++++++++++++-------------- src/fbutton.cpp | 2 +- src/fdialog.cpp | 6 +- src/fevent.cpp | 58 +++++++++--- src/fmenu.cpp | 2 +- src/fmenuitem.cpp | 2 +- src/fobject.cpp | 36 +++++--- src/ftooltip.cpp | 2 +- src/fvterm.cpp | 2 +- src/fwidget.cpp | 5 +- src/fwindow.cpp | 2 +- src/include/final/emptyfstring.h | 1 + src/include/final/fapplication.h | 124 ++++++++++++------------- src/include/final/fbutton.h | 2 + src/include/final/fbuttongroup.h | 2 + src/include/final/fc.h | 3 +- src/include/final/fcheckbox.h | 2 + src/include/final/fcheckmenuitem.h | 2 + src/include/final/fdialog.h | 2 + src/include/final/fdialoglistmenu.h | 2 + src/include/final/fevent.h | 65 +++++++++---- src/include/final/ffiledialog.h | 1 + src/include/final/fkeyboard.h | 2 + src/include/final/flabel.h | 2 + src/include/final/flineedit.h | 2 + src/include/final/flistbox.h | 2 + src/include/final/flistview.h | 2 + src/include/final/fmenu.h | 2 + src/include/final/fmenubar.h | 2 + src/include/final/fmenuitem.h | 2 + src/include/final/fmenulist.h | 2 + src/include/final/fobject.h | 7 +- src/include/final/foptiattr.h | 2 + src/include/final/fradiobutton.h | 2 + src/include/final/fradiomenuitem.h | 2 + src/include/final/fscrollbar.h | 2 + src/include/final/fscrollview.h | 2 + src/include/final/fstatusbar.h | 4 + src/include/final/fswitch.h | 2 + src/include/final/fterm.h | 2 + src/include/final/ftermbuffer.h | 1 + src/include/final/ftermdata.h | 2 + src/include/final/ftermdebugdata.h | 2 + src/include/final/ftermfreebsd.h | 2 + src/include/final/ftermlinux.h | 2 + src/include/final/ftermopenbsd.h | 2 + src/include/final/ftextview.h | 2 + src/include/final/ftogglebutton.h | 2 + src/include/final/ftooltip.h | 2 + src/include/final/fvterm.h | 2 + src/include/final/fwidget.h | 2 + src/include/final/fwindow.h | 2 + test/fobject-test.cpp | 88 +++++++++++++++++- 68 files changed, 459 insertions(+), 199 deletions(-) diff --git a/ChangeLog b/ChangeLog index 20a8c37b..14d11e6b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2018-12-24 Markus Gans + * Events can not only be sent to FWidgets, but also to FObjects + * New event FUserEvent for user-defined events + 2018-12-19 Markus Gans * Use of smart pointers * Add a "memory management" Chapter into the first steps document diff --git a/examples/checklist.cpp b/examples/checklist.cpp index e76d9c1d..db41c5d7 100644 --- a/examples/checklist.cpp +++ b/examples/checklist.cpp @@ -40,8 +40,10 @@ class CheckList : public finalcut::FDialog public: // Constructor explicit CheckList (finalcut::FWidget* = nullptr); + // Disable copy constructor CheckList (const CheckList&) = delete; + // Destructor ~CheckList(); diff --git a/examples/choice.cpp b/examples/choice.cpp index ada500b6..ad7cdfd6 100644 --- a/examples/choice.cpp +++ b/examples/choice.cpp @@ -113,7 +113,7 @@ int main (int argc, char* argv[]) checkButtonGroup.setGeometry (2, 1, 16, 7); // Create radio buttons - std::vector os (9); + std::vector os(9); populateChoice (os, checkButtonGroup); // Set the radio button geometry diff --git a/examples/listbox.cpp b/examples/listbox.cpp index d3786218..88e1f747 100644 --- a/examples/listbox.cpp +++ b/examples/listbox.cpp @@ -78,8 +78,10 @@ class Listbox : public finalcut::FDialog public: // Constructor explicit Listbox (FWidget* = nullptr); + // Disable copy constructor Listbox (const Listbox&) = delete; + // Destructor ~Listbox(); diff --git a/examples/listview.cpp b/examples/listview.cpp index fa61f19a..39571d37 100644 --- a/examples/listview.cpp +++ b/examples/listview.cpp @@ -40,8 +40,10 @@ class Listview : public finalcut::FDialog public: // Constructor explicit Listview (finalcut::FWidget* = nullptr); + // Disable copy constructor Listview (const Listview&) = delete; + // Destructor ~Listview(); diff --git a/examples/menu.cpp b/examples/menu.cpp index bf1e0017..dde19e35 100644 --- a/examples/menu.cpp +++ b/examples/menu.cpp @@ -35,8 +35,10 @@ class Menu : public finalcut::FDialog public: // Constructor explicit Menu (finalcut::FWidget* = nullptr); + // Disable copy constructor Menu (const Menu&) = delete; + // Destructor ~Menu(); diff --git a/examples/mouse.cpp b/examples/mouse.cpp index 31257ded..a4f13506 100644 --- a/examples/mouse.cpp +++ b/examples/mouse.cpp @@ -35,8 +35,10 @@ class ColorChooser : public finalcut::FWidget public: // Constructor explicit ColorChooser (finalcut::FWidget* = nullptr); + // Disable copy constructor ColorChooser (const ColorChooser&) = delete; + // Destructor ~ColorChooser(); @@ -171,8 +173,10 @@ class Brushes : public finalcut::FWidget public: // Constructor explicit Brushes (finalcut::FWidget* = nullptr); + // Disable copy constructor Brushes (const Brushes&) = delete; + // Destructor ~Brushes(); @@ -309,8 +313,10 @@ class MouseDraw : public finalcut::FDialog // Constructor explicit MouseDraw (finalcut::FWidget* = nullptr); + // Disable copy constructor MouseDraw (const MouseDraw&) = delete; + // Destructor ~MouseDraw(); diff --git a/examples/scrollview.cpp b/examples/scrollview.cpp index d5319711..9ba2ef4d 100644 --- a/examples/scrollview.cpp +++ b/examples/scrollview.cpp @@ -35,8 +35,10 @@ class Scrollview : public finalcut::FScrollView public: // Constructor explicit Scrollview (finalcut::FWidget* = nullptr); + // Disable copy constructor Scrollview (const Scrollview&) = delete; + // Destructor ~Scrollview (); diff --git a/examples/term-attributes.cpp b/examples/term-attributes.cpp index ddb58d4a..7a770a5b 100644 --- a/examples/term-attributes.cpp +++ b/examples/term-attributes.cpp @@ -36,8 +36,10 @@ class AttribDlg : public finalcut::FDialog public: // Constructor explicit AttribDlg (finalcut::FWidget* = nullptr); + // Disable copy constructor AttribDlg (const AttribDlg&) = delete; + // Destructor ~AttribDlg(); diff --git a/examples/timer.cpp b/examples/timer.cpp index 18e269bd..51600f7d 100644 --- a/examples/timer.cpp +++ b/examples/timer.cpp @@ -70,7 +70,7 @@ void Timer::draw() void Timer::onTimer (finalcut::FTimerEvent* ev) { bool is_last_line = false; - int timer_id = ev->timerId(); + int timer_id = ev->getTimerId(); if ( getPrintPos().getY() == int(getDesktopHeight()) ) is_last_line = true; diff --git a/examples/transparent.cpp b/examples/transparent.cpp index fefa2cb0..b364e796 100644 --- a/examples/transparent.cpp +++ b/examples/transparent.cpp @@ -44,8 +44,10 @@ class Transparent : public finalcut::FDialog // Constructor explicit Transparent ( finalcut::FWidget* = nullptr , trans_type = transparent ); + // Disable copy constructor Transparent (const Transparent&) = delete; + // Destructor ~Transparent(); @@ -151,8 +153,10 @@ class MainWindow : public finalcut::FDialog public: // Constructor explicit MainWindow (finalcut::FWidget* = nullptr); + // Disable copy constructor MainWindow (const MainWindow&) = delete; + // Destructor ~MainWindow(); diff --git a/examples/treeview.cpp b/examples/treeview.cpp index de63588f..6cb1f2b4 100644 --- a/examples/treeview.cpp +++ b/examples/treeview.cpp @@ -115,8 +115,10 @@ class Treeview : public finalcut::FDialog public: // Constructor explicit Treeview (finalcut::FWidget* = nullptr); + // Disable copy constructor Treeview (const Treeview&) = delete; + // Destructor ~Treeview(); diff --git a/examples/ui.cpp b/examples/ui.cpp index 068771c2..2c5cefe0 100644 --- a/examples/ui.cpp +++ b/examples/ui.cpp @@ -39,8 +39,10 @@ class ProgressDialog : public finalcut::FDialog public: // Constructor explicit ProgressDialog (finalcut::FWidget* = nullptr); + // Disable copy constructor ProgressDialog (const ProgressDialog&) = delete; + // Destructor ~ProgressDialog(); @@ -182,8 +184,10 @@ class TextWindow : public finalcut::FDialog public: // Constructor explicit TextWindow (finalcut::FWidget* = nullptr); + // Disable copy constructor TextWindow (const TextWindow&) = delete; + // Destructor ~TextWindow(); @@ -250,8 +254,10 @@ class MyDialog : public finalcut::FDialog public: // Constructor explicit MyDialog (finalcut::FWidget* = nullptr); + // Disable copy constructor MyDialog (const MyDialog&) = delete; + // Destructor ~MyDialog(); diff --git a/examples/watch.cpp b/examples/watch.cpp index fcb4ed2e..e5c13d40 100644 --- a/examples/watch.cpp +++ b/examples/watch.cpp @@ -36,8 +36,10 @@ class Watch : public finalcut::FDialog public: // Constructor explicit Watch (finalcut::FWidget* = nullptr); + // Disable copy constructor Watch (const Watch&) = delete; + // Destructor ~Watch(); diff --git a/examples/windows.cpp b/examples/windows.cpp index 87d2b818..534f0ce2 100644 --- a/examples/windows.cpp +++ b/examples/windows.cpp @@ -36,8 +36,10 @@ class SmallWindow : public finalcut::FDialog public: // Constructor explicit SmallWindow (finalcut::FWidget* = nullptr); + // Disable copy constructor SmallWindow (const SmallWindow&) = delete; + // Destructor ~SmallWindow(); @@ -165,8 +167,10 @@ class Window : public finalcut::FDialog public: // Constructor explicit Window (finalcut::FWidget* = nullptr); + // Disable copy constructor Window (const Window&) = delete; + // Destructor ~Window(); diff --git a/src/fapplication.cpp b/src/fapplication.cpp index 4f683db5..04d928eb 100644 --- a/src/fapplication.cpp +++ b/src/fapplication.cpp @@ -90,9 +90,9 @@ FApplication::~FApplication() // destructor // public methods of FApplication //---------------------------------------------------------------------- -FWidget* FApplication::getApplicationObject() +FApplication* FApplication::getApplicationObject() { - return static_cast(app_object); + return app_object; } //---------------------------------------------------------------------- @@ -167,59 +167,56 @@ bool FApplication::sendEvent ( const FObject* receiver if ( ! receiver ) return false; - if ( ! receiver->isWidget() ) - return false; - - const auto r_widget = static_cast(receiver); - auto widget = const_cast(r_widget); - - if ( modal_dialogs > 0 ) + if ( receiver->isWidget() ) { - const FWidget* window; + const auto r_widget = static_cast(receiver); + auto widget = const_cast(r_widget); - if ( widget->isWindowWidget() ) - window = widget; - else - window = FWindow::getWindowWidget(widget); - - // block events for widgets in non modal windows - if ( window - && ! window->getFlags().modal - && ! window->isMenuWidget() ) + if ( modal_dialogs > 0 ) { - switch ( event->type() ) - { - case fc::KeyPress_Event: - case fc::KeyUp_Event: - case fc::KeyDown_Event: - case fc::MouseDown_Event: - case fc::MouseUp_Event: - case fc::MouseDoubleClick_Event: - case fc::MouseWheel_Event: - case fc::MouseMove_Event: - case fc::FocusIn_Event: - case fc::FocusOut_Event: - case fc::Accelerator_Event: - return false; + const FWidget* window; - default: - break; + if ( widget->isWindowWidget() ) + window = widget; + else + window = FWindow::getWindowWidget(widget); + + // block events for widgets in non modal windows + if ( window + && ! window->getFlags().modal + && ! window->isMenuWidget() ) + { + switch ( event->type() ) + { + case fc::KeyPress_Event: + case fc::KeyUp_Event: + case fc::KeyDown_Event: + case fc::MouseDown_Event: + case fc::MouseUp_Event: + case fc::MouseDoubleClick_Event: + case fc::MouseWheel_Event: + case fc::MouseMove_Event: + case fc::FocusIn_Event: + case fc::FocusOut_Event: + case fc::Accelerator_Event: + return false; + + default: + break; + } } } + + // Throw away mouse events for disabled widgets + if ( event->type() >= fc::MouseDown_Event + && event->type() <= fc::MouseMove_Event + && ! widget->isEnabled() ) + return false; } - // Throw away mouse events for disabled widgets - if ( event->type() >= fc::MouseDown_Event - && event->type() <= fc::MouseMove_Event - && ! widget->isEnabled() ) - return false; - - // For access to a protected base class member - auto const_w = static_cast(widget); - auto w = const_cast(const_w); - // Sends event event directly to receiver - return w->event(const_cast(event)); + auto r = const_cast(receiver); + return r->event(const_cast(event)); } //---------------------------------------------------------------------- @@ -359,7 +356,7 @@ void FApplication::closeConfirmationDialog (FWidget* w, FCloseEvent* ev) void FApplication::init (long key_time, long dblclick_time) { // Initialize keyboard - keyboard = getKeyboard(); + keyboard = FVTerm::getKeyboard(); // Set the keyboard keypress timeout if ( keyboard ) @@ -374,7 +371,7 @@ void FApplication::init (long key_time, long dblclick_time) } // Initialize mouse control - mouse = getMouseControl(); + mouse = FVTerm::getMouseControl(); // Set stdin number for a gpm-mouse if ( mouse ) @@ -626,7 +623,7 @@ inline bool FApplication::sendKeyUpEvent (FWidget* widget) //---------------------------------------------------------------------- inline void FApplication::sendKeyboardAccelerator() { - if ( getOpenMenu() ) + if ( FWidget::getOpenMenu() ) return; // Switch to a specific dialog with Meta + 1..9 @@ -760,7 +757,7 @@ bool FApplication::getMouseEvent() //---------------------------------------------------------------------- FWidget*& FApplication::determineClickedWidget() { - FWidget*& clicked = getClickedWidget(); + FWidget*& clicked = FWidget::getClickedWidget(); if ( clicked ) return clicked; @@ -812,7 +809,7 @@ void FApplication::closeOpenMenu() { // Close the open menu - auto openmenu = getOpenMenu(); + auto openmenu = FWidget::getOpenMenu(); auto menu = static_cast(openmenu); if ( ! openmenu || ( mouse && mouse->isMoved()) ) @@ -840,11 +837,11 @@ void FApplication::closeOpenMenu() menu->hideSuperMenus(); // No widget was been clicked and the menu is no dialog menu - if ( ! (getClickedWidget() || is_window_menu) ) + if ( ! (FWidget::getClickedWidget() || is_window_menu) ) FWindow::switchToPrevWindow(this); - if ( getStatusBar() ) - getStatusBar()->drawMessage(); + if ( FWidget::getStatusBar() ) + FWidget::getStatusBar()->drawMessage(); updateTerminal(); flush_out(); @@ -855,8 +852,8 @@ void FApplication::unselectMenubarItems() { // Unselect the menu bar items - auto openmenu = getOpenMenu(); - auto menu_bar = getMenuBar(); + auto openmenu = FWidget::getOpenMenu(); + auto menu_bar = FWidget::getMenuBar(); if ( openmenu || (mouse && mouse->isMoved()) ) return; @@ -872,20 +869,20 @@ void FApplication::unselectMenubarItems() const FPoint& mouse_position = mouse->getPos(); - if ( ! getMenuBar()->getTermGeometry().contains(mouse_position) ) + if ( ! menu_bar->getTermGeometry().contains(mouse_position) ) { - if ( getStatusBar() ) - getStatusBar()->clearMessage(); + if ( FWidget::getStatusBar() ) + FWidget::getStatusBar()->clearMessage(); - getMenuBar()->resetMenu(); - getMenuBar()->redraw(); + menu_bar->resetMenu(); + menu_bar->redraw(); // No widget was been clicked - if ( ! getClickedWidget() ) + if ( ! FWidget::getClickedWidget() ) FWindow::switchToPrevWindow(this); - if ( getStatusBar() ) - getStatusBar()->drawMessage(); + if ( FWidget::getStatusBar() ) + FWidget::getStatusBar()->drawMessage(); updateTerminal(); flush_out(); @@ -895,7 +892,7 @@ void FApplication::unselectMenubarItems() //---------------------------------------------------------------------- void FApplication::sendMouseEvent() { - auto clicked = getClickedWidget(); + auto clicked = FWidget::getClickedWidget(); if ( ! clicked ) return; @@ -941,7 +938,7 @@ void FApplication::sendMouseMoveEvent ( const FPoint& widgetMousePos if ( ! mouse ) return; - auto clicked = getClickedWidget(); + auto clicked = FWidget::getClickedWidget(); if ( mouse->isLeftButtonPressed() ) { @@ -979,7 +976,7 @@ void FApplication::sendMouseLeftClickEvent ( const FPoint& widgetMousePos if ( ! mouse ) return; - auto clicked = getClickedWidget(); + auto clicked = FWidget::getClickedWidget(); if ( mouse->isLeftButtonDoubleClick() ) { @@ -1021,7 +1018,7 @@ void FApplication::sendMouseRightClickEvent ( const FPoint& widgetMousePos if ( ! mouse ) return; - auto clicked = getClickedWidget(); + auto clicked = FWidget::getClickedWidget(); if ( mouse->isRightButtonPressed() ) { @@ -1055,7 +1052,7 @@ void FApplication::sendMouseMiddleClickEvent ( const FPoint& widgetMousePos if ( ! mouse ) return; - auto clicked = getClickedWidget(); + auto clicked = FWidget::getClickedWidget(); if ( mouse->isMiddleButtonPressed() ) { @@ -1094,7 +1091,7 @@ void FApplication::sendWheelEvent ( const FPoint& widgetMousePos if ( ! mouse ) return; - auto clicked = getClickedWidget(); + auto clicked = FWidget::getClickedWidget(); if ( mouse->isWheelUp() ) { diff --git a/src/fbutton.cpp b/src/fbutton.cpp index c18916f9..a9b3d650 100644 --- a/src/fbutton.cpp +++ b/src/fbutton.cpp @@ -342,7 +342,7 @@ void FButton::onMouseMove (FMouseEvent* ev) //---------------------------------------------------------------------- void FButton::onTimer (FTimerEvent* ev) { - delTimer(ev->timerId()); + delTimer(ev->getTimerId()); setUp(); } diff --git a/src/fdialog.cpp b/src/fdialog.cpp index 12a22a29..fbb14cfb 100644 --- a/src/fdialog.cpp +++ b/src/fdialog.cpp @@ -50,7 +50,7 @@ FDialog::FDialog (const FString& txt, FWidget* parent) //---------------------------------------------------------------------- FDialog::~FDialog() // destructor { - auto fapp = static_cast(getRootWidget()); + auto fapp = FApplication::getApplicationObject(); bool is_quit = fapp->isQuit(); delete dialog_menu; dgl_menuitem = nullptr; @@ -130,7 +130,7 @@ void FDialog::show() if ( isModal() ) { - auto fapp = static_cast(getRootWidget()); + auto fapp = FApplication::getApplicationObject(); fapp->enter_loop(); if ( this == getMainWidget() ) @@ -145,7 +145,7 @@ void FDialog::hide() if ( isModal() ) { - auto fapp = static_cast(getRootWidget()); + auto fapp = FApplication::getApplicationObject(); fapp->exit_loop(); } } diff --git a/src/fevent.cpp b/src/fevent.cpp index 455b6c73..21d36d83 100644 --- a/src/fevent.cpp +++ b/src/fevent.cpp @@ -31,7 +31,7 @@ namespace finalcut // class FEvent //---------------------------------------------------------------------- -FEvent::FEvent(int ev_type) // constructor +FEvent::FEvent (fc::events ev_type) // constructor : t{ev_type} { } @@ -40,7 +40,7 @@ FEvent::~FEvent() // destructor { } //---------------------------------------------------------------------- -int FEvent::type() const +fc::events FEvent::type() const { return t; } @@ -48,7 +48,7 @@ int FEvent::type() const // class FKeyEvent //---------------------------------------------------------------------- -FKeyEvent::FKeyEvent (int ev_type, FKey key_num) // constructor +FKeyEvent::FKeyEvent (fc::events ev_type, FKey key_num) // constructor : FEvent(ev_type) , k{key_num} { } @@ -78,7 +78,7 @@ void FKeyEvent::ignore() // class FMouseEvent //---------------------------------------------------------------------- -FMouseEvent::FMouseEvent ( int ev_type // constructor +FMouseEvent::FMouseEvent ( fc::events ev_type // constructor , const FPoint& pos , const FPoint& termPos , int button ) @@ -89,7 +89,7 @@ FMouseEvent::FMouseEvent ( int ev_type // constructor { } //---------------------------------------------------------------------- -FMouseEvent::FMouseEvent ( int ev_type // constructor +FMouseEvent::FMouseEvent ( fc::events ev_type // constructor , const FPoint& pos , int button ) : FMouseEvent(ev_type, pos, FPoint(), button) @@ -132,7 +132,7 @@ int FMouseEvent::getButton() const // class FWheelEvent //---------------------------------------------------------------------- -FWheelEvent::FWheelEvent ( int ev_type // constructor +FWheelEvent::FWheelEvent ( fc::events ev_type // constructor , const FPoint& pos , const FPoint& termPos , int wheel ) @@ -143,7 +143,7 @@ FWheelEvent::FWheelEvent ( int ev_type // constructor { } //---------------------------------------------------------------------- -FWheelEvent::FWheelEvent ( int ev_type // constructor +FWheelEvent::FWheelEvent ( fc::events ev_type // constructor , const FPoint& pos , int wheel ) : FWheelEvent(ev_type, pos, FPoint(), wheel) @@ -186,7 +186,7 @@ int FWheelEvent::getWheel() const // class FFocusEvent //---------------------------------------------------------------------- -FFocusEvent::FFocusEvent (int ev_type) // constructor +FFocusEvent::FFocusEvent (fc::events ev_type) // constructor : FEvent(ev_type) { } @@ -231,7 +231,7 @@ void FFocusEvent::ignore() // class FAccelEvent //---------------------------------------------------------------------- -FAccelEvent::FAccelEvent(int ev_type, void* focused) // constructor +FAccelEvent::FAccelEvent (fc::events ev_type, void* focused) // constructor : FEvent(ev_type) , focus_widget{focused} { } @@ -261,7 +261,7 @@ void FAccelEvent::ignore() // class FResizeEvent //---------------------------------------------------------------------- -FResizeEvent::FResizeEvent(int ev_type) // constructor +FResizeEvent::FResizeEvent (fc::events ev_type) // constructor : FEvent(ev_type) { } @@ -286,7 +286,7 @@ void FResizeEvent::ignore() // class FShowEvent //---------------------------------------------------------------------- -FShowEvent::FShowEvent(int ev_type) // constructor +FShowEvent::FShowEvent (fc::events ev_type) // constructor : FEvent(ev_type) { } @@ -294,11 +294,12 @@ FShowEvent::FShowEvent(int ev_type) // constructor FShowEvent::~FShowEvent() // destructor { } + //---------------------------------------------------------------------- // class FHideEvent //---------------------------------------------------------------------- -FHideEvent::FHideEvent(int ev_type) // constructor +FHideEvent::FHideEvent (fc::events ev_type) // constructor : FEvent(ev_type) { } @@ -306,11 +307,12 @@ FHideEvent::FHideEvent(int ev_type) // constructor FHideEvent::~FHideEvent() // destructor { } + //---------------------------------------------------------------------- // class FCloseEvent //---------------------------------------------------------------------- -FCloseEvent::FCloseEvent(int ev_type) // constructor +FCloseEvent::FCloseEvent (fc::events ev_type) // constructor : FEvent(ev_type) { } @@ -335,7 +337,7 @@ void FCloseEvent::ignore() // class FTimerEvent //---------------------------------------------------------------------- -FTimerEvent::FTimerEvent(int ev_type, int timer_id) // constructor +FTimerEvent::FTimerEvent (fc::events ev_type, int timer_id) // constructor : FEvent(ev_type) , id{timer_id} { } @@ -345,7 +347,33 @@ FTimerEvent::~FTimerEvent() // destructor { } //---------------------------------------------------------------------- -int FTimerEvent::timerId() const +int FTimerEvent::getTimerId() const { return id; } + +//---------------------------------------------------------------------- +// class FUserEvent +//---------------------------------------------------------------------- + +FUserEvent::FUserEvent (fc::events ev_type, int user_event_id) // constructor + : FEvent(ev_type) + , uid{user_event_id} +{ } + +//---------------------------------------------------------------------- +FUserEvent::~FUserEvent() // destructor +{ } + +//---------------------------------------------------------------------- +int FUserEvent::getUserId() const +{ return uid; } + +//---------------------------------------------------------------------- +FUserEvent::data_ptr FUserEvent::getData() const +{ return data_pointer; } + +//---------------------------------------------------------------------- +void FUserEvent::setData (data_ptr data) +{ data_pointer = data; } + } // namespace finalcut diff --git a/src/fmenu.cpp b/src/fmenu.cpp index 025e0c75..cb857bf2 100644 --- a/src/fmenu.cpp +++ b/src/fmenu.cpp @@ -53,7 +53,7 @@ FMenu::FMenu (const FString& txt, FWidget* parent) //---------------------------------------------------------------------- FMenu::~FMenu() // destructor { - auto fapp = static_cast(getRootWidget()); + auto fapp = FApplication::getApplicationObject(); if ( ! fapp->isQuit() ) switchToPrevWindow(this); // Switch to previous window diff --git a/src/fmenuitem.cpp b/src/fmenuitem.cpp index b4655c67..1af5d98b 100644 --- a/src/fmenuitem.cpp +++ b/src/fmenuitem.cpp @@ -732,7 +732,7 @@ void FMenuItem::cb_switchToDialog (FWidget*, data_ptr data) void FMenuItem::cb_destroyDialog (FWidget* widget, data_ptr) { auto win = static_cast(widget); - auto fapp = static_cast(getRootWidget()); + auto fapp = FApplication::getApplicationObject(); if ( win && fapp ) { diff --git a/src/fobject.cpp b/src/fobject.cpp index 1cd9797a..44647561 100644 --- a/src/fobject.cpp +++ b/src/fobject.cpp @@ -166,6 +166,26 @@ void FObject::delChild (FObject* obj) } } +//---------------------------------------------------------------------- +bool FObject::event (FEvent* ev) +{ + // Receives events on this object + + if ( ev->type() == fc::Timer_Event ) + { + onTimer ( static_cast(ev) ); + return true; + } + + if ( ev->type() == fc::User_Event ) + { + onUserEvent ( static_cast(ev) ); + return true; + } + + return false; +} + //---------------------------------------------------------------------- void FObject::getCurrentTime (timeval* time) { @@ -341,21 +361,11 @@ bool FObject::delAllTimer() // protected methods of FObject //---------------------------------------------------------------------- -bool FObject::event (FEvent* ev) -{ - // Receives events on this object - - if ( ev->type() == fc::Timer_Event ) - { - onTimer ( const_cast(static_cast(ev)) ); - return true; - } - - return false; -} +void FObject::onTimer (FTimerEvent*) +{ } //---------------------------------------------------------------------- -void FObject::onTimer (FTimerEvent*) +void FObject::onUserEvent (FUserEvent*) { } //---------------------------------------------------------------------- diff --git a/src/ftooltip.cpp b/src/ftooltip.cpp index 37730216..d9416b8f 100644 --- a/src/ftooltip.cpp +++ b/src/ftooltip.cpp @@ -49,7 +49,7 @@ FToolTip::FToolTip (const FString& txt, FWidget* parent) //---------------------------------------------------------------------- FToolTip::~FToolTip() // destructor { - auto fapp = static_cast(getRootWidget()); + auto fapp = FApplication::getApplicationObject(); if ( fapp->isQuit() ) return; diff --git a/src/fvterm.cpp b/src/fvterm.cpp index 253223c4..ac50d8a0 100644 --- a/src/fvterm.cpp +++ b/src/fvterm.cpp @@ -240,7 +240,7 @@ void FVTerm::updateTerminal() // Updates pending changes to the terminal if ( stop_terminal_updates - || static_cast(init_object)->isQuit() ) + || FApplication::getApplicationObject()->isQuit() ) return; if ( ! force_terminal_update ) diff --git a/src/fwidget.cpp b/src/fwidget.cpp index 48d1c332..c768567b 100644 --- a/src/fwidget.cpp +++ b/src/fwidget.cpp @@ -1436,8 +1436,7 @@ void FWidget::drawBorder (int x1, int y1, int x2, int y2) //---------------------------------------------------------------------- void FWidget::quit() { - auto app_object = FApplication::getApplicationObject(); - auto fapp = static_cast(app_object); + auto fapp = FApplication::getApplicationObject(); fapp->exit(0); } @@ -2340,7 +2339,7 @@ void FWidget::setColorTheme() wc.set16ColorTheme(); if ( isKdeTerminal() ) - wc.term_bg = fc::SteelBlue3; + wc.term_bg = fc::SkyBlue2; } } diff --git a/src/fwindow.cpp b/src/fwindow.cpp index 8da3fe00..fc437d14 100644 --- a/src/fwindow.cpp +++ b/src/fwindow.cpp @@ -51,7 +51,7 @@ FWindow::FWindow(FWidget* parent) //---------------------------------------------------------------------- FWindow::~FWindow() // destructor { - auto fapp = static_cast(getRootWidget()); + auto fapp = FApplication::getApplicationObject(); if ( previous_window == this ) previous_window = nullptr; diff --git a/src/include/final/emptyfstring.h b/src/include/final/emptyfstring.h index 4424e00b..804ba570 100644 --- a/src/include/final/emptyfstring.h +++ b/src/include/final/emptyfstring.h @@ -47,6 +47,7 @@ class emptyFString public: // Constructors emptyFString() = default; + // Disable copy constructor emptyFString (const emptyFString&) = delete; diff --git a/src/include/final/fapplication.h b/src/include/final/fapplication.h index 7a0385e6..6c2cced0 100644 --- a/src/include/final/fapplication.h +++ b/src/include/final/fapplication.h @@ -85,8 +85,10 @@ class FApplication : public FWidget public: // Constructor FApplication (const int&, char*[], bool = false); + // Disable copy constructor FApplication (const FApplication&) = delete; + // Destructor virtual ~FApplication(); @@ -94,35 +96,35 @@ class FApplication : public FWidget FApplication& operator = (const FApplication&) = delete; // Accessors - const char* getClassName() const; - int getArgc() const; - char** getArgv() const; - static FWidget* getApplicationObject(); + const char* getClassName() const; + int getArgc() const; + char** getArgv() const; + static FApplication* getApplicationObject(); // Inquiry - static bool isQuit(); + static bool isQuit(); // Methods - int exec(); // run - int enter_loop(); - void exit_loop(); - static void exit (int = 0); - void quit(); - static bool sendEvent (const FObject*, const FEvent*); - static void queueEvent (const FObject*, const FEvent*); - static void sendQueuedEvents (); - static bool eventInQueue(); - static bool removeQueuedEvent (const FObject*); - FWidget* processParameters (const int&, char*[]); - static void showParameterUsage () + int exec(); // run + int enter_loop(); + void exit_loop(); + static void exit (int = 0); + void quit(); + static bool sendEvent (const FObject*, const FEvent*); + static void queueEvent (const FObject*, const FEvent*); + static void sendQueuedEvents (); + static bool eventInQueue(); + static bool removeQueuedEvent (const FObject*); + FWidget* processParameters (const int&, char*[]); + static void showParameterUsage () #if defined(__clang__) || defined(__GNUC__) __attribute__((noreturn)) #endif ; - static void closeConfirmationDialog (FWidget*, FCloseEvent*); + static void closeConfirmationDialog (FWidget*, FCloseEvent*); // Callback method - void cb_exitApp (FWidget*, data_ptr); + void cb_exitApp (FWidget*, FWidget::data_ptr); private: // Typedefs and Enumerations @@ -134,47 +136,47 @@ class FApplication : public FWidget static const int NEED_MORE_DATA = -1; // parseKeyString return value // Methods - void init (long, long); - void cmd_options (const int&, char*[]); - void findKeyboardWidget(); - bool isKeyPressed(); - void keyPressed(); - void keyReleased(); - void escapeKeyPressed(); - void performKeyboardAction(); - void sendEscapeKeyPressEvent(); - bool sendKeyDownEvent (FWidget*); - bool sendKeyPressEvent (FWidget*); - bool sendKeyUpEvent (FWidget*); - void sendKeyboardAccelerator(); - void processKeyboardEvent(); - bool processDialogSwitchAccelerator(); - bool processAccelerator (const FWidget*&); - bool getMouseEvent(); - FWidget*& determineClickedWidget(); - void unsetMoveSizeMode(); - void closeOpenMenu(); - void unselectMenubarItems(); - void sendMouseEvent(); - void sendMouseMoveEvent ( const FPoint& - , const FPoint& - , int ); - void sendMouseLeftClickEvent ( const FPoint& - , const FPoint& - , int ); - void sendMouseRightClickEvent ( const FPoint& - , const FPoint& - , int ); - void sendMouseMiddleClickEvent ( const FPoint& - , const FPoint& - , int ); - void sendWheelEvent (const FPoint&, const FPoint&); - void processMouseEvent(); - void processResizeEvent(); - void processCloseWidget(); - bool processNextEvent(); - virtual void performTimerAction ( const FObject* - , const FEvent* ); + void init (long, long); + void cmd_options (const int&, char*[]); + void findKeyboardWidget(); + bool isKeyPressed(); + void keyPressed(); + void keyReleased(); + void escapeKeyPressed(); + void performKeyboardAction(); + void sendEscapeKeyPressEvent(); + bool sendKeyDownEvent (FWidget*); + bool sendKeyPressEvent (FWidget*); + bool sendKeyUpEvent (FWidget*); + void sendKeyboardAccelerator(); + void processKeyboardEvent(); + bool processDialogSwitchAccelerator(); + bool processAccelerator (const FWidget*&); + bool getMouseEvent(); + FWidget*& determineClickedWidget(); + void unsetMoveSizeMode(); + void closeOpenMenu(); + void unselectMenubarItems(); + void sendMouseEvent(); + void sendMouseMoveEvent ( const FPoint& + , const FPoint& + , int ); + void sendMouseLeftClickEvent ( const FPoint& + , const FPoint& + , int ); + void sendMouseRightClickEvent ( const FPoint& + , const FPoint& + , int ); + void sendMouseMiddleClickEvent ( const FPoint& + , const FPoint& + , int ); + void sendWheelEvent (const FPoint&, const FPoint&); + void processMouseEvent(); + void processResizeEvent(); + void processCloseWidget(); + bool processNextEvent(); + virtual void performTimerAction ( const FObject* + , const FEvent* ); // Data Members int app_argc; @@ -207,7 +209,7 @@ inline char** FApplication::getArgv() const { return app_argv; } //---------------------------------------------------------------------- -inline void FApplication::cb_exitApp (FWidget*, data_ptr) +inline void FApplication::cb_exitApp (FWidget*, FWidget::data_ptr) { close(); } } // namespace finalcut diff --git a/src/include/final/fbutton.h b/src/include/final/fbutton.h index 54615675..9862d644 100644 --- a/src/include/final/fbutton.h +++ b/src/include/final/fbutton.h @@ -70,8 +70,10 @@ class FButton : public FWidget // Constructors explicit FButton (FWidget* = nullptr); explicit FButton (const FString&, FWidget* = nullptr); + // Disable copy constructor FButton (const FButton&) = delete; + // Destructor virtual ~FButton(); diff --git a/src/include/final/fbuttongroup.h b/src/include/final/fbuttongroup.h index 7b360f06..08a572b6 100644 --- a/src/include/final/fbuttongroup.h +++ b/src/include/final/fbuttongroup.h @@ -74,8 +74,10 @@ class FButtonGroup : public FScrollView // Constructors explicit FButtonGroup (FWidget* = nullptr); explicit FButtonGroup (const FString&, FWidget* = nullptr); + // Disable copy constructor FButtonGroup (const FButtonGroup&) = delete; + // Destructor virtual ~FButtonGroup(); diff --git a/src/include/final/fc.h b/src/include/final/fc.h index ffa276e9..3f6d9cda 100644 --- a/src/include/final/fc.h +++ b/src/include/final/fc.h @@ -78,7 +78,8 @@ enum events Show_Event, // widget is shown Hide_Event, // widget is hidden Close_Event, // widget close - Timer_Event // timer event occur + Timer_Event, // timer event occur + User_Event // user defined event }; // Internal character encoding diff --git a/src/include/final/fcheckbox.h b/src/include/final/fcheckbox.h index cd3a2e3f..9ddde465 100644 --- a/src/include/final/fcheckbox.h +++ b/src/include/final/fcheckbox.h @@ -75,8 +75,10 @@ class FCheckBox : public FToggleButton // Constructors explicit FCheckBox (FWidget* = nullptr); explicit FCheckBox (const FString&, FWidget* = nullptr); + // Disable copy constructor FCheckBox (const FCheckBox&) = delete; + // Destructor virtual ~FCheckBox(); diff --git a/src/include/final/fcheckmenuitem.h b/src/include/final/fcheckmenuitem.h index 0ade8bf8..5564bd10 100644 --- a/src/include/final/fcheckmenuitem.h +++ b/src/include/final/fcheckmenuitem.h @@ -75,8 +75,10 @@ class FCheckMenuItem : public FMenuItem // Constructors explicit FCheckMenuItem (FWidget* = nullptr); explicit FCheckMenuItem (const FString&, FWidget* = nullptr); + // Disable copy constructor FCheckMenuItem (const FCheckMenuItem&) = delete; + // Destructor virtual ~FCheckMenuItem(); diff --git a/src/include/final/fdialog.h b/src/include/final/fdialog.h index 278b9345..86e74c8b 100644 --- a/src/include/final/fdialog.h +++ b/src/include/final/fdialog.h @@ -89,8 +89,10 @@ class FDialog : public FWindow // Constructors explicit FDialog (FWidget* = nullptr); explicit FDialog (const FString&, FWidget* = nullptr); + // Disable copy constructor FDialog (const FDialog&) = delete; + // Destructor virtual ~FDialog(); diff --git a/src/include/final/fdialoglistmenu.h b/src/include/final/fdialoglistmenu.h index 54188492..d97b28b7 100644 --- a/src/include/final/fdialoglistmenu.h +++ b/src/include/final/fdialoglistmenu.h @@ -81,8 +81,10 @@ class FDialogListMenu : public FMenu // Constructors explicit FDialogListMenu (FWidget* = nullptr); explicit FDialogListMenu (const FString&, FWidget* = nullptr); + // Disable copy constructor FDialogListMenu (const FDialogListMenu&) = delete; + // Destructor virtual ~FDialogListMenu(); diff --git a/src/include/final/fevent.h b/src/include/final/fevent.h index b0a5ba55..d77b4428 100644 --- a/src/include/final/fevent.h +++ b/src/include/final/fevent.h @@ -93,12 +93,12 @@ class FEvent // event base class { public: FEvent() = default; - explicit FEvent(int); + explicit FEvent(fc::events); virtual ~FEvent(); - int type() const; + fc::events type() const; protected: - int t{fc::None_Event}; + fc::events t{fc::None_Event}; }; #pragma pack(pop) @@ -115,7 +115,7 @@ class FKeyEvent : public FEvent // keyboard event { public: FKeyEvent() = default; - FKeyEvent (int, FKey); + FKeyEvent (fc::events, FKey); ~FKeyEvent(); FKey key() const; @@ -142,8 +142,8 @@ class FMouseEvent : public FEvent // mouse event { public: FMouseEvent() = default; - FMouseEvent (int, const FPoint&, const FPoint&, int); - FMouseEvent (int, const FPoint&, int); + FMouseEvent (fc::events, const FPoint&, const FPoint&, int); + FMouseEvent (fc::events, const FPoint&, int); ~FMouseEvent(); const FPoint& getPos() const; @@ -174,8 +174,8 @@ class FWheelEvent : public FEvent // wheel event { public: FWheelEvent() = default; - FWheelEvent (int, const FPoint&, int); - FWheelEvent (int, const FPoint&, const FPoint&, int); + FWheelEvent (fc::events, const FPoint&, int); + FWheelEvent (fc::events, const FPoint&, const FPoint&, int); ~FWheelEvent(); const FPoint& getPos() const; @@ -206,7 +206,7 @@ class FFocusEvent : public FEvent // focus event { public: FFocusEvent() = default; - explicit FFocusEvent (int); + explicit FFocusEvent (fc::events); ~FFocusEvent(); bool gotFocus() const; @@ -235,7 +235,7 @@ class FAccelEvent : public FEvent // focus event { public: FAccelEvent() = default; - FAccelEvent (int, void*); + FAccelEvent (fc::events, void*); FAccelEvent (const FAccelEvent&) = delete; ~FAccelEvent(); FAccelEvent& operator = (const FAccelEvent&) = delete; @@ -261,7 +261,7 @@ class FResizeEvent : public FEvent // resize event { public: FResizeEvent() = default; - explicit FResizeEvent (int); + explicit FResizeEvent (fc::events); ~FResizeEvent(); bool isAccepted() const; @@ -273,7 +273,6 @@ class FResizeEvent : public FEvent // resize event }; - //---------------------------------------------------------------------- // class FShowEvent //---------------------------------------------------------------------- @@ -282,12 +281,11 @@ class FShowEvent : public FEvent // show event { public: FShowEvent() = default; - explicit FShowEvent (int); + explicit FShowEvent (fc::events); ~FShowEvent(); }; - //---------------------------------------------------------------------- // class FHideEvent //---------------------------------------------------------------------- @@ -296,12 +294,11 @@ class FHideEvent : public FEvent // hide event { public: FHideEvent() = default; - explicit FHideEvent (int); + explicit FHideEvent (fc::events); ~FHideEvent(); }; - //---------------------------------------------------------------------- // class FCloseEvent //---------------------------------------------------------------------- @@ -310,7 +307,7 @@ class FCloseEvent : public FEvent // close event { public: FCloseEvent() = default; - explicit FCloseEvent(int); + explicit FCloseEvent(fc::events); ~FCloseEvent(); bool isAccepted() const; @@ -322,7 +319,6 @@ class FCloseEvent : public FEvent // close event }; - //---------------------------------------------------------------------- // class FTimerEvent //---------------------------------------------------------------------- @@ -334,10 +330,10 @@ class FTimerEvent : public FEvent // timer event { public: FTimerEvent() = default; - FTimerEvent(int, int); + FTimerEvent (fc::events, int); ~FTimerEvent(); - int timerId() const; + int getTimerId() const; protected: int id; @@ -345,6 +341,35 @@ class FTimerEvent : public FEvent // timer event #pragma pack(pop) + +//---------------------------------------------------------------------- +// class FUserEvent +//---------------------------------------------------------------------- + +#pragma pack(push) +#pragma pack(1) + +class FUserEvent : public FEvent // timer event +{ + public: + // Typedef + typedef void* data_ptr; + + FUserEvent() = default; + FUserEvent (fc::events, int); + ~FUserEvent(); + + int getUserId() const; + data_ptr getData() const; + void setData (data_ptr); + + protected: + int uid; + data_ptr data_pointer{nullptr}; +}; + +#pragma pack(pop) + } // namespace finalcut #endif // FEVENT_H diff --git a/src/include/final/ffiledialog.h b/src/include/final/ffiledialog.h index 93e04361..847b8c6b 100644 --- a/src/include/final/ffiledialog.h +++ b/src/include/final/ffiledialog.h @@ -108,6 +108,7 @@ class FFileDialog : public FDialog , const FString& , DialogType = FFileDialog::Open , FWidget* = nullptr ); + // Destructor virtual ~FFileDialog(); diff --git a/src/include/final/fkeyboard.h b/src/include/final/fkeyboard.h index 791fb2f1..2f5447d0 100644 --- a/src/include/final/fkeyboard.h +++ b/src/include/final/fkeyboard.h @@ -92,8 +92,10 @@ class FKeyboard // Constructor FKeyboard(); + // Disable copy constructor FKeyboard (const FKeyboard&) = delete; + // Destructor virtual ~FKeyboard(); diff --git a/src/include/final/flabel.h b/src/include/final/flabel.h index a58b9fa7..05d97d70 100644 --- a/src/include/final/flabel.h +++ b/src/include/final/flabel.h @@ -75,8 +75,10 @@ class FLabel : public FWidget // Constructor explicit FLabel (FWidget* = nullptr); explicit FLabel (const FString&, FWidget* = nullptr); + // Disable copy constructor FLabel (const FLabel&) = delete; + // Destructor virtual ~FLabel(); diff --git a/src/include/final/flineedit.h b/src/include/final/flineedit.h index 843c8c6e..85c93531 100644 --- a/src/include/final/flineedit.h +++ b/src/include/final/flineedit.h @@ -78,8 +78,10 @@ class FLineEdit : public FWidget // Constructor explicit FLineEdit (FWidget* = nullptr); explicit FLineEdit (const FString&, FWidget* = nullptr); + // Disable copy constructor FLineEdit (const FLineEdit&) = delete; + // Destructor virtual ~FLineEdit(); diff --git a/src/include/final/flistbox.h b/src/include/final/flistbox.h index 44544a04..470cb1d7 100644 --- a/src/include/final/flistbox.h +++ b/src/include/final/flistbox.h @@ -151,8 +151,10 @@ class FListBox : public FWidget FListBox (Iterator, Iterator, InsertConverter, FWidget* = nullptr); template FListBox (Container, LazyConverter, FWidget* = nullptr); + // Disable copy constructor FListBox (const FListBox&) = delete; + // Destructor virtual ~FListBox(); diff --git a/src/include/final/flistview.h b/src/include/final/flistview.h index 9c079876..62ef82ba 100644 --- a/src/include/final/flistview.h +++ b/src/include/final/flistview.h @@ -273,8 +273,10 @@ class FListView : public FWidget // Constructor explicit FListView (FWidget* = nullptr); + // Disable copy constructor FListView (const FListView&) = delete; + // Destructor virtual ~FListView(); diff --git a/src/include/final/fmenu.h b/src/include/final/fmenu.h index 47e46220..6caced8e 100644 --- a/src/include/final/fmenu.h +++ b/src/include/final/fmenu.h @@ -80,8 +80,10 @@ class FMenu : public FWindow, public FMenuList // Constructor explicit FMenu (FWidget* = nullptr); explicit FMenu (const FString&, FWidget* = nullptr); + // Disable copy constructor FMenu (const FMenu&) = delete; + // Destructor virtual ~FMenu(); diff --git a/src/include/final/fmenubar.h b/src/include/final/fmenubar.h index 6ec16b32..ad81f927 100644 --- a/src/include/final/fmenubar.h +++ b/src/include/final/fmenubar.h @@ -78,8 +78,10 @@ class FMenuBar : public FWindow, public FMenuList public: // Constructor explicit FMenuBar (FWidget* = nullptr); + // Disable copy constructor FMenuBar (const FMenuBar&) = delete; + // Destructor virtual ~FMenuBar(); diff --git a/src/include/final/fmenuitem.h b/src/include/final/fmenuitem.h index 6522afd2..c96b9a34 100644 --- a/src/include/final/fmenuitem.h +++ b/src/include/final/fmenuitem.h @@ -85,8 +85,10 @@ class FMenuItem : public FWidget explicit FMenuItem (FWidget* = nullptr); explicit FMenuItem (const FString&, FWidget* = nullptr); FMenuItem (FKey, const FString&, FWidget* = nullptr); + // Disable copy constructor FMenuItem (const FMenuItem&) = delete; + // Destructor virtual ~FMenuItem(); diff --git a/src/include/final/fmenulist.h b/src/include/final/fmenulist.h index 96a29e36..aa5b9da2 100644 --- a/src/include/final/fmenulist.h +++ b/src/include/final/fmenulist.h @@ -63,8 +63,10 @@ class FMenuList public: // Constructor FMenuList() = default; + // Disable copy constructor FMenuList (const FMenuList&) = delete; + // Destructor virtual ~FMenuList(); diff --git a/src/include/final/fobject.h b/src/include/final/fobject.h index 3fdff2f3..135e090c 100644 --- a/src/include/final/fobject.h +++ b/src/include/final/fobject.h @@ -73,8 +73,10 @@ class FObject // Constructor explicit FObject (FObject* = nullptr); + // Disable copy constructor FObject (const FObject&) = delete; + // Destructor virtual ~FObject(); @@ -107,6 +109,9 @@ class FObject void addChild (FObject*); void delChild (FObject*); + // Event handler + virtual bool event (FEvent*); + // Timer methods static void getCurrentTime (timeval*); static bool isTimeout (timeval*, long); @@ -138,8 +143,8 @@ class FObject uInt processTimerEvent(); // Event handler - virtual bool event (FEvent*); virtual void onTimer (FTimerEvent*); + virtual void onUserEvent (FUserEvent*); private: // Method diff --git a/src/include/final/foptiattr.h b/src/include/final/foptiattr.h index 5bc240f7..d8a6484b 100644 --- a/src/include/final/foptiattr.h +++ b/src/include/final/foptiattr.h @@ -157,8 +157,10 @@ class FOptiAttr // Constructor FOptiAttr(); + // Disable copy constructor FOptiAttr (const FOptiAttr&) = delete; + // Destructor virtual ~FOptiAttr(); diff --git a/src/include/final/fradiobutton.h b/src/include/final/fradiobutton.h index c6a43dc2..e4eea135 100644 --- a/src/include/final/fradiobutton.h +++ b/src/include/final/fradiobutton.h @@ -75,8 +75,10 @@ class FRadioButton : public FToggleButton // Constructors explicit FRadioButton (FWidget* = nullptr); explicit FRadioButton (const FString&, FWidget* = nullptr); + // Disable copy constructor FRadioButton (const FRadioButton&) = delete; + // Destructor virtual ~FRadioButton(); diff --git a/src/include/final/fradiomenuitem.h b/src/include/final/fradiomenuitem.h index a2e9e123..400791cf 100644 --- a/src/include/final/fradiomenuitem.h +++ b/src/include/final/fradiomenuitem.h @@ -75,8 +75,10 @@ class FRadioMenuItem : public FMenuItem // Constructors explicit FRadioMenuItem (FWidget* = nullptr); explicit FRadioMenuItem (const FString&, FWidget* = nullptr); + // Disable copy constructor FRadioMenuItem (const FRadioMenuItem&) = delete; + // Destructor virtual ~FRadioMenuItem(); diff --git a/src/include/final/fscrollbar.h b/src/include/final/fscrollbar.h index 1914f08e..a66ddc9b 100644 --- a/src/include/final/fscrollbar.h +++ b/src/include/final/fscrollbar.h @@ -86,8 +86,10 @@ class FScrollbar : public FWidget // Constructors explicit FScrollbar (FWidget* = nullptr); explicit FScrollbar (int = fc::vertical, FWidget* = nullptr); + // Disable copy constructor FScrollbar (const FScrollbar&) = delete; + // Destructor virtual ~FScrollbar(); diff --git a/src/include/final/fscrollview.h b/src/include/final/fscrollview.h index 07977f1a..78dc4f97 100644 --- a/src/include/final/fscrollview.h +++ b/src/include/final/fscrollview.h @@ -76,8 +76,10 @@ class FScrollView : public FWidget // Constructor explicit FScrollView (FWidget* = nullptr); + // Disable copy constructor FScrollView (const FScrollView&) = delete; + // Destructor virtual ~FScrollView(); diff --git a/src/include/final/fstatusbar.h b/src/include/final/fstatusbar.h index a0f401c5..6fa2d8b7 100644 --- a/src/include/final/fstatusbar.h +++ b/src/include/final/fstatusbar.h @@ -82,8 +82,10 @@ class FStatusKey : public FWidget // Constructors explicit FStatusKey (FWidget* = nullptr); FStatusKey (FKey, const FString&, FWidget* = nullptr); + // Disable copy constructor FStatusKey (const FStatusKey&) = delete; + // Destructor virtual ~FStatusKey(); @@ -193,8 +195,10 @@ class FStatusBar : public FWindow public: // Constructor explicit FStatusBar (FWidget* = nullptr); + // Disable copy constructor FStatusBar (const FStatusBar&) = delete; + // Destructor virtual ~FStatusBar(); diff --git a/src/include/final/fswitch.h b/src/include/final/fswitch.h index 8175f2e3..9800f368 100644 --- a/src/include/final/fswitch.h +++ b/src/include/final/fswitch.h @@ -75,8 +75,10 @@ class FSwitch : public FToggleButton // Constructors explicit FSwitch (FWidget* = nullptr); explicit FSwitch (const FString&, FWidget* = nullptr); + // Disable copy constructor FSwitch (const FSwitch&) = delete; + // Destructor virtual ~FSwitch(); diff --git a/src/include/final/fterm.h b/src/include/final/fterm.h index ee213fb4..8025149a 100644 --- a/src/include/final/fterm.h +++ b/src/include/final/fterm.h @@ -161,8 +161,10 @@ class FTerm // Constructor explicit FTerm (bool = false); + // Disable copy constructor FTerm (const FTerm&) = delete; + // Destructor virtual ~FTerm(); diff --git a/src/include/final/ftermbuffer.h b/src/include/final/ftermbuffer.h index ee3be368..8b66f6df 100644 --- a/src/include/final/ftermbuffer.h +++ b/src/include/final/ftermbuffer.h @@ -60,6 +60,7 @@ class FTermBuffer // Constructor FTermBuffer() = default; + // Destructor virtual ~FTermBuffer(); diff --git a/src/include/final/ftermdata.h b/src/include/final/ftermdata.h index f5a8067c..f1179644 100644 --- a/src/include/final/ftermdata.h +++ b/src/include/final/ftermdata.h @@ -61,8 +61,10 @@ class FTermData // Constructors FTermData() = default; + // Disable copy constructor FTermData (const FTermData&) = delete; + // Destructor ~FTermData() = default; diff --git a/src/include/final/ftermdebugdata.h b/src/include/final/ftermdebugdata.h index b54d1aa8..392846a4 100644 --- a/src/include/final/ftermdebugdata.h +++ b/src/include/final/ftermdebugdata.h @@ -48,8 +48,10 @@ class FTermDebugData public: // Constructors FTermDebugData() = default; + // Disable copy constructor FTermDebugData (const FTermDebugData&) = delete; + // Destructor ~FTermDebugData() = default; diff --git a/src/include/final/ftermfreebsd.h b/src/include/final/ftermfreebsd.h index b6e5f47e..359731a8 100644 --- a/src/include/final/ftermfreebsd.h +++ b/src/include/final/ftermfreebsd.h @@ -64,8 +64,10 @@ class FTermFreeBSD // Constructors FTermFreeBSD() = default; + // Disable copy constructor FTermFreeBSD (const FTermFreeBSD&) = delete; + // Destructor virtual ~FTermFreeBSD() = default; diff --git a/src/include/final/ftermlinux.h b/src/include/final/ftermlinux.h index 9783c60d..87d8b961 100644 --- a/src/include/final/ftermlinux.h +++ b/src/include/final/ftermlinux.h @@ -71,8 +71,10 @@ class FTermLinux public: // Constructors FTermLinux() = default; + // Disable copy constructor FTermLinux (const FTermLinux&) = delete; + // Destructor virtual ~FTermLinux(); diff --git a/src/include/final/ftermopenbsd.h b/src/include/final/ftermopenbsd.h index 32262004..93427eb9 100644 --- a/src/include/final/ftermopenbsd.h +++ b/src/include/final/ftermopenbsd.h @@ -57,8 +57,10 @@ class FTermOpenBSD public: // Constructors FTermOpenBSD() = default; + // Disable copy constructor FTermOpenBSD (const FTermOpenBSD&) = delete; + // Destructor virtual ~FTermOpenBSD() = default; diff --git a/src/include/final/ftextview.h b/src/include/final/ftextview.h index 535e8058..015335b2 100644 --- a/src/include/final/ftextview.h +++ b/src/include/final/ftextview.h @@ -78,8 +78,10 @@ class FTextView : public FWidget // Constructor explicit FTextView (FWidget* = nullptr); + // Disable copy constructor FTextView (const FTextView&) = delete; + // Destructor virtual ~FTextView(); diff --git a/src/include/final/ftogglebutton.h b/src/include/final/ftogglebutton.h index 4b1556a7..d3b4c18a 100644 --- a/src/include/final/ftogglebutton.h +++ b/src/include/final/ftogglebutton.h @@ -76,8 +76,10 @@ class FToggleButton : public FWidget // Constructors explicit FToggleButton (FWidget* = nullptr); explicit FToggleButton (const FString&, FWidget* = nullptr); + // Disable copy constructor FToggleButton (const FToggleButton&) = delete; + // Destructor virtual ~FToggleButton(); diff --git a/src/include/final/ftooltip.h b/src/include/final/ftooltip.h index 06e18141..b83e8f1e 100644 --- a/src/include/final/ftooltip.h +++ b/src/include/final/ftooltip.h @@ -77,8 +77,10 @@ class FToolTip : public FWindow // Constructor explicit FToolTip (FWidget* = nullptr); explicit FToolTip (const FString&, FWidget* = nullptr); + // Disable copy constructor FToolTip (const FToolTip&) = delete; + // Destructor virtual ~FToolTip (); diff --git a/src/include/final/fvterm.h b/src/include/final/fvterm.h index 47e59dcb..0e3d3dbd 100644 --- a/src/include/final/fvterm.h +++ b/src/include/final/fvterm.h @@ -118,8 +118,10 @@ class FVTerm // Constructor explicit FVTerm (bool, bool = false); + // Disable copy constructor FVTerm (const FVTerm&) = delete; + // Destructor virtual ~FVTerm(); diff --git a/src/include/final/fwidget.h b/src/include/final/fwidget.h index 566c88e4..a509878d 100644 --- a/src/include/final/fwidget.h +++ b/src/include/final/fwidget.h @@ -167,8 +167,10 @@ class FWidget : public FVTerm, public FObject // Constructor explicit FWidget (FWidget* = nullptr, bool = false); + // Disable copy constructor FWidget (const FWidget&) = delete; + // Destructor virtual ~FWidget(); diff --git a/src/include/final/fwindow.h b/src/include/final/fwindow.h index 3aa04e88..186a1592 100644 --- a/src/include/final/fwindow.h +++ b/src/include/final/fwindow.h @@ -83,8 +83,10 @@ class FWindow : public FWidget // Constructor explicit FWindow (FWidget* = nullptr); + // Disable copy constructor FWindow (const FWindow&) = delete; + // Destructor virtual ~FWindow (); diff --git a/test/fobject-test.cpp b/test/fobject-test.cpp index c40e0c2f..4a14aa4e 100644 --- a/test/fobject-test.cpp +++ b/test/fobject-test.cpp @@ -82,6 +82,62 @@ class FObject_protected : public finalcut::FObject }; #pragma pack(pop) +//---------------------------------------------------------------------- +#pragma pack(push) +#pragma pack(1) + +class FObject_timer : public finalcut::FObject +{ + public: + FObject_timer() + { } + + int getValue() const + { + return value; + } + + protected: + virtual void onTimer (finalcut::FTimerEvent* ev) + { + if ( ev->getTimerId() == 1 ) + value++; + } + + private: + // Data Member + int value{0}; +}; +#pragma pack(pop) + +//---------------------------------------------------------------------- +#pragma pack(push) +#pragma pack(1) + +class FObject_userEvent : public finalcut::FObject +{ + public: + FObject_userEvent() + { } + + int getValue() const + { + return value; + } + + protected: + virtual void onUserEvent (finalcut::FUserEvent* ev) + { + if ( ev->getUserId() == 42 ) + value = *(static_cast(ev->getData())); + } + + private: + // Data Member + int value{0}; +}; +#pragma pack(pop) + //---------------------------------------------------------------------- // class FObjectTest @@ -108,6 +164,7 @@ class FObjectTest : public CPPUNIT_NS::TestFixture void timeTest(); void timerTest(); void performTimerActionTest(); + void userEventTest(); private: // Adds code needed to register the test suite @@ -125,6 +182,7 @@ class FObjectTest : public CPPUNIT_NS::TestFixture CPPUNIT_TEST (timeTest); CPPUNIT_TEST (timerTest); CPPUNIT_TEST (performTimerActionTest); + CPPUNIT_TEST (userEventTest); // End of test suite definition CPPUNIT_TEST_SUITE_END(); @@ -494,14 +552,14 @@ void FObjectTest::timerTest() //---------------------------------------------------------------------- void FObjectTest::performTimerActionTest() { - FObject_protected t; + FObject_protected t1; uInt num_events = 0; uInt loop = 0; - t.addTimer(100); + t1.addTimer(100); while ( loop < 10 ) { - num_events += t.processEvent(); + num_events += t1.processEvent(); // Wait 100 ms nanosleep ((const struct timespec[]){{0, 100000000L}}, NULL); loop++; @@ -509,7 +567,29 @@ void FObjectTest::performTimerActionTest() CPPUNIT_ASSERT ( loop == 10 ); CPPUNIT_ASSERT ( num_events == 9 ); - CPPUNIT_ASSERT ( t.count == 9 ); + CPPUNIT_ASSERT ( t1.count == 9 ); + + FObject_timer t2; + CPPUNIT_ASSERT ( t2.getValue() == 0 ); + finalcut::FTimerEvent timer_ev (finalcut::fc::Timer_Event, 1); + + for (int x = 0; x < 10; x++) + finalcut::FApplication::sendEvent (&t2, &timer_ev); + + CPPUNIT_ASSERT ( t2.getValue() == 10 ); +} + +//---------------------------------------------------------------------- +void FObjectTest::userEventTest() +{ + FObject_userEvent user; + CPPUNIT_ASSERT ( user.getValue() == 0 ); + + int n = 9; + finalcut::FUserEvent user_ev (finalcut::fc::User_Event, 42); + user_ev.setData( (void*)(&n) ); + finalcut::FApplication::sendEvent (&user, &user_ev); + CPPUNIT_ASSERT ( user.getValue() == 9 ); } // Put the test suite in the registry