New event FUserEvent for user-defined events

This commit is contained in:
Markus Gans 2018-12-24 18:11:16 +01:00
parent 81a4e72916
commit 9a694ab267
68 changed files with 459 additions and 199 deletions

View File

@ -1,3 +1,7 @@
2018-12-24 Markus Gans <guru.mail@muenster.de>
* Events can not only be sent to FWidgets, but also to FObjects
* New event FUserEvent for user-defined events
2018-12-19 Markus Gans <guru.mail@muenster.de>
* Use of smart pointers
* Add a "memory management" Chapter into the first steps document

View File

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

View File

@ -113,7 +113,7 @@ int main (int argc, char* argv[])
checkButtonGroup.setGeometry (2, 1, 16, 7);
// Create radio buttons
std::vector<FRadioButtonPtr> os (9);
std::vector<FRadioButtonPtr> os(9);
populateChoice (os, checkButtonGroup);
// Set the radio button geometry

View File

@ -78,8 +78,10 @@ class Listbox : public finalcut::FDialog
public:
// Constructor
explicit Listbox (FWidget* = nullptr);
// Disable copy constructor
Listbox (const Listbox&) = delete;
// Destructor
~Listbox();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -90,9 +90,9 @@ FApplication::~FApplication() // destructor
// public methods of FApplication
//----------------------------------------------------------------------
FWidget* FApplication::getApplicationObject()
FApplication* FApplication::getApplicationObject()
{
return static_cast<FWidget*>(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<const FWidget*>(receiver);
auto widget = const_cast<FWidget*>(r_widget);
if ( modal_dialogs > 0 )
if ( receiver->isWidget() )
{
const FWidget* window;
const auto r_widget = static_cast<const FWidget*>(receiver);
auto widget = const_cast<FWidget*>(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<const FApplication*>(widget);
auto w = const_cast<FApplication*>(const_w);
// Sends event event directly to receiver
return w->event(const_cast<FEvent*>(event));
auto r = const_cast<FObject*>(receiver);
return r->event(const_cast<FEvent*>(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<FMenu*>(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() )
{

View File

@ -342,7 +342,7 @@ void FButton::onMouseMove (FMouseEvent* ev)
//----------------------------------------------------------------------
void FButton::onTimer (FTimerEvent* ev)
{
delTimer(ev->timerId());
delTimer(ev->getTimerId());
setUp();
}

View File

@ -50,7 +50,7 @@ FDialog::FDialog (const FString& txt, FWidget* parent)
//----------------------------------------------------------------------
FDialog::~FDialog() // destructor
{
auto fapp = static_cast<FApplication*>(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<FApplication*>(getRootWidget());
auto fapp = FApplication::getApplicationObject();
fapp->enter_loop();
if ( this == getMainWidget() )
@ -145,7 +145,7 @@ void FDialog::hide()
if ( isModal() )
{
auto fapp = static_cast<FApplication*>(getRootWidget());
auto fapp = FApplication::getApplicationObject();
fapp->exit_loop();
}
}

View File

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

View File

@ -53,7 +53,7 @@ FMenu::FMenu (const FString& txt, FWidget* parent)
//----------------------------------------------------------------------
FMenu::~FMenu() // destructor
{
auto fapp = static_cast<FApplication*>(getRootWidget());
auto fapp = FApplication::getApplicationObject();
if ( ! fapp->isQuit() )
switchToPrevWindow(this); // Switch to previous window

View File

@ -732,7 +732,7 @@ void FMenuItem::cb_switchToDialog (FWidget*, data_ptr data)
void FMenuItem::cb_destroyDialog (FWidget* widget, data_ptr)
{
auto win = static_cast<FDialog*>(widget);
auto fapp = static_cast<FApplication*>(getRootWidget());
auto fapp = FApplication::getApplicationObject();
if ( win && fapp )
{

View File

@ -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<FTimerEvent*>(ev) );
return true;
}
if ( ev->type() == fc::User_Event )
{
onUserEvent ( static_cast<FUserEvent*>(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<FTimerEvent*>(static_cast<const FTimerEvent*>(ev)) );
return true;
}
return false;
}
void FObject::onTimer (FTimerEvent*)
{ }
//----------------------------------------------------------------------
void FObject::onTimer (FTimerEvent*)
void FObject::onUserEvent (FUserEvent*)
{ }
//----------------------------------------------------------------------

View File

@ -49,7 +49,7 @@ FToolTip::FToolTip (const FString& txt, FWidget* parent)
//----------------------------------------------------------------------
FToolTip::~FToolTip() // destructor
{
auto fapp = static_cast<FApplication*>(getRootWidget());
auto fapp = FApplication::getApplicationObject();
if ( fapp->isQuit() )
return;

View File

@ -240,7 +240,7 @@ void FVTerm::updateTerminal()
// Updates pending changes to the terminal
if ( stop_terminal_updates
|| static_cast<FApplication*>(init_object)->isQuit() )
|| FApplication::getApplicationObject()->isQuit() )
return;
if ( ! force_terminal_update )

View File

@ -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<FApplication*>(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;
}
}

View File

@ -51,7 +51,7 @@ FWindow::FWindow(FWidget* parent)
//----------------------------------------------------------------------
FWindow::~FWindow() // destructor
{
auto fapp = static_cast<FApplication*>(getRootWidget());
auto fapp = FApplication::getApplicationObject();
if ( previous_window == this )
previous_window = nullptr;

View File

@ -47,6 +47,7 @@ class emptyFString
public:
// Constructors
emptyFString() = default;
// Disable copy constructor
emptyFString (const emptyFString&) = delete;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -108,6 +108,7 @@ class FFileDialog : public FDialog
, const FString&
, DialogType = FFileDialog::Open
, FWidget* = nullptr );
// Destructor
virtual ~FFileDialog();

View File

@ -92,8 +92,10 @@ class FKeyboard
// Constructor
FKeyboard();
// Disable copy constructor
FKeyboard (const FKeyboard&) = delete;
// Destructor
virtual ~FKeyboard();

View File

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

View File

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

View File

@ -151,8 +151,10 @@ class FListBox : public FWidget
FListBox (Iterator, Iterator, InsertConverter, FWidget* = nullptr);
template <typename Container, typename LazyConverter>
FListBox (Container, LazyConverter, FWidget* = nullptr);
// Disable copy constructor
FListBox (const FListBox&) = delete;
// Destructor
virtual ~FListBox();

View File

@ -273,8 +273,10 @@ class FListView : public FWidget
// Constructor
explicit FListView (FWidget* = nullptr);
// Disable copy constructor
FListView (const FListView&) = delete;
// Destructor
virtual ~FListView();

View File

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

View File

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

View File

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

View File

@ -63,8 +63,10 @@ class FMenuList
public:
// Constructor
FMenuList() = default;
// Disable copy constructor
FMenuList (const FMenuList&) = delete;
// Destructor
virtual ~FMenuList();

View File

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

View File

@ -157,8 +157,10 @@ class FOptiAttr
// Constructor
FOptiAttr();
// Disable copy constructor
FOptiAttr (const FOptiAttr&) = delete;
// Destructor
virtual ~FOptiAttr();

View File

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

View File

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

View File

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

View File

@ -76,8 +76,10 @@ class FScrollView : public FWidget
// Constructor
explicit FScrollView (FWidget* = nullptr);
// Disable copy constructor
FScrollView (const FScrollView&) = delete;
// Destructor
virtual ~FScrollView();

View File

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

View File

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

View File

@ -161,8 +161,10 @@ class FTerm
// Constructor
explicit FTerm (bool = false);
// Disable copy constructor
FTerm (const FTerm&) = delete;
// Destructor
virtual ~FTerm();

View File

@ -60,6 +60,7 @@ class FTermBuffer
// Constructor
FTermBuffer() = default;
// Destructor
virtual ~FTermBuffer();

View File

@ -61,8 +61,10 @@ class FTermData
// Constructors
FTermData() = default;
// Disable copy constructor
FTermData (const FTermData&) = delete;
// Destructor
~FTermData() = default;

View File

@ -48,8 +48,10 @@ class FTermDebugData
public:
// Constructors
FTermDebugData() = default;
// Disable copy constructor
FTermDebugData (const FTermDebugData&) = delete;
// Destructor
~FTermDebugData() = default;

View File

@ -64,8 +64,10 @@ class FTermFreeBSD
// Constructors
FTermFreeBSD() = default;
// Disable copy constructor
FTermFreeBSD (const FTermFreeBSD&) = delete;
// Destructor
virtual ~FTermFreeBSD() = default;

View File

@ -71,8 +71,10 @@ class FTermLinux
public:
// Constructors
FTermLinux() = default;
// Disable copy constructor
FTermLinux (const FTermLinux&) = delete;
// Destructor
virtual ~FTermLinux();

View File

@ -57,8 +57,10 @@ class FTermOpenBSD
public:
// Constructors
FTermOpenBSD() = default;
// Disable copy constructor
FTermOpenBSD (const FTermOpenBSD&) = delete;
// Destructor
virtual ~FTermOpenBSD() = default;

View File

@ -78,8 +78,10 @@ class FTextView : public FWidget
// Constructor
explicit FTextView (FWidget* = nullptr);
// Disable copy constructor
FTextView (const FTextView&) = delete;
// Destructor
virtual ~FTextView();

View File

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

View File

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

View File

@ -118,8 +118,10 @@ class FVTerm
// Constructor
explicit FVTerm (bool, bool = false);
// Disable copy constructor
FVTerm (const FVTerm&) = delete;
// Destructor
virtual ~FVTerm();

View File

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

View File

@ -83,8 +83,10 @@ class FWindow : public FWidget
// Constructor
explicit FWindow (FWidget* = nullptr);
// Disable copy constructor
FWindow (const FWindow&) = delete;
// Destructor
virtual ~FWindow ();

View File

@ -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<int*>(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