diff --git a/ChangeLog b/ChangeLog index fc097e89..e8c9d785 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2021-06-16 Markus Gans + * Converted the internal timer from timeval + to std::chrono::time_point + 2021-06-06 Markus Gans * Bug fixing in FString and FTermDetection * FTermDetection now has clean code by using FString instead of char* diff --git a/build.sh b/build.sh index aa92582a..e16baffc 100755 --- a/build.sh +++ b/build.sh @@ -43,7 +43,7 @@ fi # Build commands case "$1" in "--release"|"release") - if ! ./configure --prefix="$PREFIX" CXXFLAGS="-O3" # "-fno-rtti" + if ! ./configure --prefix="$PREFIX" CXXFLAGS="-O3" # "-flto -fno-rtti" then echo "${RED}Configure failed!${NORMAL}" 1>&2 exit 255 diff --git a/examples/watch.cpp b/examples/watch.cpp index f75a769a..5623ecd1 100644 --- a/examples/watch.cpp +++ b/examples/watch.cpp @@ -110,15 +110,14 @@ Watch::Watch (FWidget* parent) void Watch::printTime() { finalcut::FString str{}; - std::tm now{}; - - const std::time_t t = std::time(nullptr); // get current time - localtime_r(&t, &now); + using namespace std::chrono; + auto now = system_clock::to_time_t(system_clock::now()); + auto lt = *localtime(&now); if ( sec ) - str.sprintf("%02d:%02d:%02d", now.tm_hour, now.tm_min, now.tm_sec); + str.sprintf("%02d:%02d:%02d", lt.tm_hour, lt.tm_min, lt.tm_sec); else - str.sprintf("%02d:%02d ", now.tm_hour, now.tm_min); + str.sprintf("%02d:%02d ", lt.tm_hour, lt.tm_min); time_str = str; time_str.redraw(); diff --git a/finalcut.spec.in b/finalcut.spec.in index 7a3b9868..ed98257a 100644 --- a/finalcut.spec.in +++ b/finalcut.spec.in @@ -103,7 +103,7 @@ Special X11 bitmap font used by FINAL CUT to display graphic objects. %build autoreconf -vif -export CPPFLAGS="%{optflags} -Wall -Wextra -Wpedantic" +export CPPFLAGS="%{optflags} -Wall -Wextra -Wpedantic -flto" %ifnarch %ix86 x86_64 export CPPFLAGS="$CPPFLAGS -Wno-error=unused-parameter" %endif diff --git a/src/fapplication.cpp b/src/fapplication.cpp index 3d8a3b11..0fb51420 100644 --- a/src/fapplication.cpp +++ b/src/fapplication.cpp @@ -72,7 +72,7 @@ int FApplication::loop_level {0}; // event loop level int FApplication::quit_code {EXIT_SUCCESS}; bool FApplication::quit_now {false}; uInt64 FApplication::next_event_wait {5000}; // 5 ms (200 Hz) -struct timeval FApplication::time_last_event {}; +TimeValue FApplication::time_last_event {}; //---------------------------------------------------------------------- @@ -392,8 +392,7 @@ void FApplication::init() setMaxChildren(1); // Initialize the last event time - time_last_event.tv_sec = 0; - time_last_event.tv_usec = 0; + time_last_event = TimeValue{}; // Initialize keyboard auto& keyboard = FTerm::getFKeyboard(); @@ -858,7 +857,7 @@ void FApplication::queuingMouseInput() const return; auto& keyboard = FTerm::getFKeyboard(); - struct timeval* time_keypressed = keyboard.getKeyPressedTime(); + auto time_keypressed = keyboard.getKeyPressedTime(); mouse.processEvent (time_keypressed); keyboard.hasUnprocessedInput() = mouse.hasUnprocessedInput(); mouse.clearEvent(); @@ -1308,7 +1307,7 @@ bool FApplication::processNextEvent() if ( is_timeout || hasDataInQueue() ) { - FObject::getCurrentTime (&time_last_event); + time_last_event = FObject::getCurrentTime(); queuingKeyboardInput(); queuingMouseInput(); processKeyboardEvent(); @@ -1401,7 +1400,7 @@ bool FApplication::isEventProcessable ( FObject* receiver //---------------------------------------------------------------------- bool FApplication::isNextEventTimeout() { - return FObject::isTimeout (&time_last_event, next_event_wait); + return FObject::isTimeout (time_last_event, next_event_wait); } diff --git a/src/fkeyboard.cpp b/src/fkeyboard.cpp index 78260726..26c25b9d 100644 --- a/src/fkeyboard.cpp +++ b/src/fkeyboard.cpp @@ -51,7 +51,7 @@ uInt64 FKeyboard::key_timeout{100000}; // 100 ms (10 Hz) uInt64 FKeyboard::read_blocking_time{100000}; // 100 ms (10 Hz) uInt64 FKeyboard::read_blocking_time_short{5000}; // 5 ms (200 Hz) bool FKeyboard::non_blocking_input_support{true}; -struct timeval FKeyboard::time_keypressed{}; +TimeValue FKeyboard::time_keypressed{}; //---------------------------------------------------------------------- @@ -63,8 +63,7 @@ struct timeval FKeyboard::time_keypressed{}; FKeyboard::FKeyboard() { // Initialize keyboard values - time_keypressed.tv_sec = 0; - time_keypressed.tv_usec = 0; + time_keypressed = TimeValue{}; // Set to epoch time // Get the stdin file status flags stdin_status_flags = fcntl(FTermios::getStdIn(), F_GETFL); @@ -392,7 +391,7 @@ inline FKey FKeyboard::getSingleKey() //---------------------------------------------------------------------- inline bool FKeyboard::isKeypressTimeout() { - return FObject::isTimeout (&time_keypressed, key_timeout); + return FObject::isTimeout (time_keypressed, key_timeout); } //---------------------------------------------------------------------- @@ -457,7 +456,7 @@ inline ssize_t FKeyboard::readKey() void FKeyboard::parseKeyBuffer() { ssize_t bytesread{}; - FObject::getCurrentTime (&time_keypressed); + time_keypressed = FObject::getCurrentTime(); while ( (bytesread = readKey()) > 0 ) { diff --git a/src/fmouse.cpp b/src/fmouse.cpp index c4e2a711..64a06689 100644 --- a/src/fmouse.cpp +++ b/src/fmouse.cpp @@ -196,37 +196,37 @@ FString FMouse::getClassName() const } //---------------------------------------------------------------------- -inline void FMouse::clearEvent() +void FMouse::clearEvent() { mouse_event_occurred = false; } //---------------------------------------------------------------------- -inline void FMouse::setMaxWidth (uInt16 x_max) +void FMouse::setMaxWidth (uInt16 x_max) { max_width = x_max; } //---------------------------------------------------------------------- -inline void FMouse::setMaxHeight (uInt16 y_max) +void FMouse::setMaxHeight (uInt16 y_max) { max_height = y_max; } //---------------------------------------------------------------------- -inline void FMouse::setDblclickInterval (const uInt64 timeout) +void FMouse::setDblclickInterval (const uInt64 timeout) { dblclick_interval = timeout; } //---------------------------------------------------------------------- -inline bool FMouse::hasEvent() const +bool FMouse::hasEvent() const { return mouse_event_occurred; } //---------------------------------------------------------------------- -inline bool FMouse::hasUnprocessedInput() const +bool FMouse::hasUnprocessedInput() const { return unprocessed_buffer_data; } @@ -234,7 +234,7 @@ inline bool FMouse::hasUnprocessedInput() const // protected methods of FMouse //---------------------------------------------------------------------- -inline const FPoint& FMouse::getNewPos() const +const FPoint& FMouse::getNewPos() const { return new_mouse_position; } @@ -258,9 +258,9 @@ uInt64 FMouse::getDblclickInterval() const } //---------------------------------------------------------------------- -timeval* FMouse::getMousePressedTime() +TimeValue FMouse::getMousePressedTime() { - return &time_mousepressed; + return time_mousepressed; } //---------------------------------------------------------------------- @@ -276,16 +276,15 @@ void FMouse::setPending (bool is_pending) } //---------------------------------------------------------------------- -void FMouse::setMousePressedTime (const timeval* time) +void FMouse::setMousePressedTime (const TimeValue& time) { - time_mousepressed = *time; + time_mousepressed = time; } //---------------------------------------------------------------------- void FMouse::resetMousePressedTime() { - time_mousepressed.tv_sec = 0; - time_mousepressed.tv_usec = 0; + time_mousepressed = TimeValue{}; // Set to epoch time } //---------------------------------------------------------------------- @@ -295,7 +294,7 @@ void FMouse::setEvent() } //---------------------------------------------------------------------- -bool FMouse::isDblclickTimeout (const timeval* time) const +bool FMouse::isDblclickTimeout (const TimeValue& time) const { return FObject::isTimeout (time, dblclick_interval); } @@ -341,7 +340,7 @@ void FMouseGPM::setRawData (FKeyboard::keybuffer&) } //---------------------------------------------------------------------- -void FMouseGPM::processEvent (struct timeval*) +void FMouseGPM::processEvent (const TimeValue&) { clearButtonState(); @@ -582,7 +581,7 @@ void FMouseX11::setRawData (FKeyboard::keybuffer& fifo_buf) } //---------------------------------------------------------------------- -void FMouseX11::processEvent (struct timeval* time) +void FMouseX11::processEvent (const TimeValue& time) { // Parse and interpret the X11 xterm mouse string @@ -641,7 +640,7 @@ void FMouseX11::setMoveState (const FPoint& mouse_position, int btn) } //---------------------------------------------------------------------- -void FMouseX11::setButtonState (const int btn, const struct timeval* time) +void FMouseX11::setButtonState (const int btn, const TimeValue& time) { // Get the x11 mouse button state @@ -765,7 +764,7 @@ void FMouseSGR::setRawData (FKeyboard::keybuffer& fifo_buf) } //---------------------------------------------------------------------- -void FMouseSGR::processEvent (struct timeval* time) +void FMouseSGR::processEvent (const TimeValue& time) { const auto& mouse_position = getPos(); uInt16 x{0}; @@ -867,7 +866,7 @@ void FMouseSGR::setMoveState (const FPoint& mouse_position, int btn) //---------------------------------------------------------------------- void FMouseSGR::setPressedButtonState ( const int btn - , const struct timeval* time ) + , const TimeValue& time ) { // Gets the extended x11 mouse mode (SGR) status for pressed buttons @@ -995,7 +994,7 @@ void FMouseUrxvt::setRawData (FKeyboard::keybuffer& fifo_buf) } //---------------------------------------------------------------------- -void FMouseUrxvt::processEvent (struct timeval* time) +void FMouseUrxvt::processEvent (const TimeValue& time) { // Parse and interpret the X11 xterm mouse string (Urxvt-Mode) @@ -1122,7 +1121,7 @@ void FMouseUrxvt::setMoveState (const FPoint& mouse_position, int btn) } //---------------------------------------------------------------------- -void FMouseUrxvt::setButtonState (const int btn, const struct timeval* time) +void FMouseUrxvt::setButtonState (const int btn, const TimeValue& time) { // Get the urxvt mouse button state @@ -1561,7 +1560,7 @@ void FMouseControl::processQueuedInput() } //---------------------------------------------------------------------- -void FMouseControl::processEvent (struct timeval* time) +void FMouseControl::processEvent (const TimeValue& time) { auto mtype = getMouseWithData(); auto mouse_object = mouse_protocol[mtype].get(); diff --git a/src/fobject.cpp b/src/fobject.cpp index 4b09b063..260c9c82 100644 --- a/src/fobject.cpp +++ b/src/fobject.cpp @@ -3,7 +3,7 @@ * * * This file is part of the FINAL CUT widget toolkit * * * -* Copyright 2015-2020 Markus Gans * +* Copyright 2015-2021 Markus Gans * * * * FINAL CUT is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -21,6 +21,7 @@ ***********************************************************************/ #include +#include #include "final/fevent.h" #include "final/fc.h" @@ -29,8 +30,17 @@ namespace finalcut { -// static class attributes -bool FObject::timer_modify_lock; +namespace internal +{ + +struct var +{ + static std::mutex timer_mutex; +}; + +std::mutex var::timer_mutex{}; + +} // namespace internal //---------------------------------------------------------------------- @@ -44,8 +54,6 @@ FObject::FObject (FObject* parent) { if ( parent ) // add object to parent parent->addChild(this); - else - timer_modify_lock = false; } //---------------------------------------------------------------------- @@ -179,54 +187,24 @@ bool FObject::event (FEvent* ev) } //---------------------------------------------------------------------- -void FObject::getCurrentTime (timeval* time) +TimeValue FObject::getCurrentTime() { - // Get the current time as timeval struct - - gettimeofday(time, nullptr); - - // NTP fix - while ( time->tv_usec >= 1000000 ) - { - time->tv_usec -= 1000000; - time->tv_sec++; - } - - while ( time->tv_usec < 0 ) - { - if ( time->tv_sec > 0 ) - { - time->tv_usec += 1000000; - time->tv_sec--; - } - else - { - time->tv_usec = 0; - break; - } - } + return system_clock::now(); // Get the current time } //---------------------------------------------------------------------- -bool FObject::isTimeout (const timeval* time, uInt64 timeout) +bool FObject::isTimeout (const TimeValue& time, uInt64 timeout) { - // Checks whether the specified time span (timeout in µs) has elapse + // Checks whether the specified time span (timeout in µs) has elapsed - struct timeval now{}; - struct timeval diff{}; + const auto now = getCurrentTime(); - FObject::getCurrentTime(&now); - diff.tv_sec = now.tv_sec - time->tv_sec; - diff.tv_usec = now.tv_usec - time->tv_usec; + if ( now < time ) + return false; - if ( diff.tv_usec < 0 ) - { - diff.tv_sec--; - diff.tv_usec += 1000000; - } - - const auto diff_usec = uInt64((diff.tv_sec * 1000000) + diff.tv_usec); - return ( diff_usec > timeout ); + const auto diff = now - time; + const auto diff_usec = uInt64(duration_cast(diff).count()); + return diff_usec > timeout; } //---------------------------------------------------------------------- @@ -235,10 +213,8 @@ int FObject::addTimer (int interval) // Create a timer and returns the timer identifier number // (interval in ms) - timeval time_interval{}; - timeval currentTime{}; int id{1}; - timer_modify_lock = true; + std::lock_guard lock_guard(internal::var::timer_mutex); auto& timer_list = globalTimerList(); // find an unused timer id @@ -262,10 +238,8 @@ int FObject::addTimer (int interval) if ( id <= 0 || id > int(timer_list->size() + 1) ) return 0; - time_interval.tv_sec = interval / 1000; - time_interval.tv_usec = (interval % 1000) * 1000; - getCurrentTime (¤tTime); - timeval timeout = currentTime + time_interval; + const auto time_interval = milliseconds(interval); + const auto timeout = getCurrentTime() + time_interval; FTimerData t{ id, time_interval, timeout, this }; // insert in list sorted by timeout @@ -276,7 +250,6 @@ int FObject::addTimer (int interval) ++iter; timer_list->insert (iter, t); - timer_modify_lock = false; return id; } @@ -288,7 +261,7 @@ bool FObject::delTimer (int id) const if ( id <= 0 ) return false; - timer_modify_lock = true; + std::lock_guard lock_guard(internal::var::timer_mutex); auto& timer_list = globalTimerList(); auto iter = timer_list->begin(); const auto& last = timer_list->end(); @@ -299,11 +272,9 @@ bool FObject::delTimer (int id) const if ( iter != last ) { timer_list->erase(iter); - timer_modify_lock = false; return true; } - timer_modify_lock = false; return false; } @@ -312,6 +283,7 @@ bool FObject::delOwnTimers() const { // Deletes all timers of this object + std::lock_guard lock_guard(internal::var::timer_mutex); auto& timer_list = globalTimerList(); if ( ! timer_list ) @@ -320,7 +292,6 @@ bool FObject::delOwnTimers() const if ( timer_list->empty() ) return false; - timer_modify_lock = true; auto iter = timer_list->begin(); while ( iter != timer_list->end() ) @@ -331,7 +302,6 @@ bool FObject::delOwnTimers() const ++iter; } - timer_modify_lock = false; return true; } @@ -340,6 +310,7 @@ bool FObject::delAllTimers() const { // Deletes all timers of all objects + std::lock_guard lock_guard(internal::var::timer_mutex); auto& timer_list = globalTimerList(); if ( ! timer_list ) @@ -348,10 +319,8 @@ bool FObject::delAllTimers() const if ( timer_list->empty() ) return false; - timer_modify_lock = true; timer_list->clear(); timer_list->shrink_to_fit(); - timer_modify_lock = false; return true; } @@ -374,21 +343,19 @@ void FObject::onUserEvent (FUserEvent*) //---------------------------------------------------------------------- uInt FObject::processTimerEvent() { - timeval currentTime{}; uInt activated{0}; + auto currentTime = getCurrentTime(); - getCurrentTime (¤tTime); - - if ( isTimerInUpdating() ) + if ( ! internal::var::timer_mutex.try_lock() ) return 0; auto& timer_list = globalTimerList(); - if ( ! timer_list ) - return 0; - - if ( timer_list->empty() ) + if ( ! timer_list || timer_list->empty() ) + { + internal::var::timer_mutex.unlock(); return 0; + } for (auto&& timer : *timer_list) { @@ -402,13 +369,14 @@ uInt FObject::processTimerEvent() if ( timer.timeout < currentTime ) timer.timeout = currentTime + timer.interval; - if ( timer.interval.tv_usec > 0 || timer.interval.tv_sec > 0 ) + if ( timer.interval > microseconds(0) ) activated++; FTimerEvent t_ev(Event::Timer, timer.id); performTimerAction (timer.object, &t_ev); } + internal::var::timer_mutex.unlock(); return activated; } diff --git a/src/fvterm.cpp b/src/fvterm.cpp index d378663d..5844ecda 100644 --- a/src/fvterm.cpp +++ b/src/fvterm.cpp @@ -61,14 +61,12 @@ bool FVTerm::force_terminal_update{false}; uInt64 FVTerm::flush_wait{MIN_FLUSH_WAIT}; uInt64 FVTerm::flush_average{MIN_FLUSH_WAIT}; uInt64 FVTerm::flush_median{MIN_FLUSH_WAIT}; -uInt64 FVTerm::term_size_check_timeout{500000}; // 500 ms uInt FVTerm::erase_char_length{}; uInt FVTerm::repeat_char_length{}; uInt FVTerm::clr_bol_length{}; uInt FVTerm::clr_eol_length{}; uInt FVTerm::cursor_address_length{}; -struct timeval FVTerm::time_last_flush{}; -struct timeval FVTerm::last_term_size_check{}; +TimeValue FVTerm::time_last_flush{}; const FVTerm* FVTerm::init_object{nullptr}; FVTerm::FTermArea* FVTerm::vterm{nullptr}; FVTerm::FTermArea* FVTerm::vdesktop{nullptr}; @@ -603,7 +601,7 @@ void FVTerm::flush() const std::fflush(stdout); auto& mouse = FTerm::getFMouseControl(); mouse.drawPointer(); - FObject::getCurrentTime (&time_last_flush); + time_last_flush = FObject::getCurrentTime(); } @@ -1876,11 +1874,8 @@ void FVTerm::init() vdesktop->visible = true; active_area = vdesktop; - // Initialize the flush and last terminal size check time - time_last_flush.tv_sec = 0; - time_last_flush.tv_usec = 0; - last_term_size_check.tv_sec = 0; - last_term_size_check.tv_usec = 0; + // Initialize the last flush time + time_last_flush = TimeValue{}; } //---------------------------------------------------------------------- @@ -2879,33 +2874,13 @@ bool FVTerm::isInsideTerminal (const FPoint& pos) const return false; } -//---------------------------------------------------------------------- -inline bool FVTerm::isTermSizeChanged() const -{ - if ( ! isTermSizeCheckTimeout() ) - return false; - - FObject::getCurrentTime (&last_term_size_check); - auto& fterm_data = FTerm::getFTermData(); - const auto& old_term_geometry = fterm_data.getTermGeometry(); - FTerm::detectTermSize(); - auto term_geometry = fterm_data.getTermGeometry(); - term_geometry.move (-1, -1); - - if ( old_term_geometry.getSize() != term_geometry.getSize() ) - return true; - - return false; -} - //---------------------------------------------------------------------- inline void FVTerm::flushTimeAdjustment() const { - timeval now; - FObject::getCurrentTime(&now); - timeval diff = now - time_last_flush; + const auto now = FObject::getCurrentTime(); + const auto diff = now - time_last_flush; - if ( diff.tv_sec > 0 || diff.tv_usec > 400000 ) + if ( diff > milliseconds(400) ) { flush_wait = MIN_FLUSH_WAIT; // Reset to minimum values after 400 ms flush_average = MIN_FLUSH_WAIT; @@ -2913,7 +2888,7 @@ inline void FVTerm::flushTimeAdjustment() const } else { - auto usec = uInt64(diff.tv_usec); + auto usec = uInt64(duration_cast(diff).count()); if ( usec < MIN_FLUSH_WAIT ) usec = MIN_FLUSH_WAIT; @@ -2947,13 +2922,7 @@ inline void FVTerm::flushTimeAdjustment() const //---------------------------------------------------------------------- inline bool FVTerm::isFlushTimeout() { - return FObject::isTimeout (&time_last_flush, flush_wait); -} - -//---------------------------------------------------------------------- -inline bool FVTerm::isTermSizeCheckTimeout() -{ - return FObject::isTimeout (&last_term_size_check, term_size_check_timeout); + return FObject::isTimeout (time_last_flush, flush_wait); } //---------------------------------------------------------------------- diff --git a/src/include/final/fapplication.h b/src/include/final/fapplication.h index ca4aa8a5..c7684ac6 100644 --- a/src/include/final/fapplication.h +++ b/src/include/final/fapplication.h @@ -3,7 +3,7 @@ * * * This file is part of the FINAL CUT widget toolkit * * * -* Copyright 2013-2020 Markus Gans * +* Copyright 2013-2021 Markus Gans * * * * FINAL CUT is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -238,7 +238,7 @@ class FApplication : public FWidget FWidget* clicked_widget{}; FEventQueue event_queue{}; static uInt64 next_event_wait; - static timeval time_last_event; + static TimeValue time_last_event; static int loop_level; static int quit_code; static bool quit_now; diff --git a/src/include/final/fkeyboard.h b/src/include/final/fkeyboard.h index 42df7eef..b2b47ddb 100644 --- a/src/include/final/fkeyboard.h +++ b/src/include/final/fkeyboard.h @@ -108,7 +108,7 @@ class FKeyboard final FKey getKey() const; FString getKeyName (const FKey) const; keybuffer& getKeyBuffer(); - timeval* getKeyPressedTime(); + TimeValue getKeyPressedTime(); static uInt64 getKeypressTimeout(); static uInt64 getReadBlockingTime(); @@ -179,7 +179,7 @@ class FKeyboard final FKeyboardCommand escape_key_cmd{}; FKeyboardCommand mouse_tracking_cmd{}; - static timeval time_keypressed; + static TimeValue time_keypressed; static uInt64 read_blocking_time; static uInt64 read_blocking_time_short; static uInt64 key_timeout; @@ -214,8 +214,8 @@ inline FKeyboard::keybuffer& FKeyboard::getKeyBuffer() { return fifo_buf; } //---------------------------------------------------------------------- -inline timeval* FKeyboard::getKeyPressedTime() -{ return &time_keypressed; } +inline TimeValue FKeyboard::getKeyPressedTime() +{ return time_keypressed; } //---------------------------------------------------------------------- inline uInt64 FKeyboard::getKeypressTimeout() diff --git a/src/include/final/flogger.h b/src/include/final/flogger.h index a6119327..2e811a2a 100644 --- a/src/include/final/flogger.h +++ b/src/include/final/flogger.h @@ -72,23 +72,23 @@ class FLogger : public FLog ~FLogger() noexcept override; // Methods - FString getClassName() const override; - void info (const std::string&) override; - void warn (const std::string&) override; - void error (const std::string&) override; - void debug (const std::string&) override; - void flush() override; - void setOutputStream (const std::ostream&) override; - void setLineEnding (LineEnding) override; - void enableTimestamp() override; - void disableTimestamp() override; + FString getClassName() const override; + void info (const std::string&) override; + void warn (const std::string&) override; + void error (const std::string&) override; + void debug (const std::string&) override; + void flush() override; + void setOutputStream (const std::ostream&) override; + void setLineEnding (LineEnding) override; + void enableTimestamp() override; + void disableTimestamp() override; private: // Methods - void newlineReplace (std::string&, const std::string&) const; - std::string getTimeString() const; - std::string getEOL() const; - void printLogLine (const std::string&); + void newlineReplace (std::string&, const std::string&) const; + std::string getTimeString() const; + std::string getEOL() const; + void printLogLine (const std::string&); // Data member bool timestamp{false}; diff --git a/src/include/final/fmouse.h b/src/include/final/fmouse.h index 042aca59..203234b7 100644 --- a/src/include/final/fmouse.h +++ b/src/include/final/fmouse.h @@ -201,7 +201,7 @@ class FMouse : public FMouseData template static FMouse* createMouseObject (); virtual void setRawData (FKeyboard::keybuffer&) = 0; - virtual void processEvent (struct timeval*) = 0; + virtual void processEvent (const TimeValue&) = 0; protected: // Accessors @@ -209,17 +209,17 @@ class FMouse : public FMouseData uInt16 getMaxWidth() const; uInt16 getMaxHeight() const; uInt64 getDblclickInterval() const; - timeval* getMousePressedTime(); + TimeValue getMousePressedTime(); // Mutator void setNewPos (int, int); void setPending (bool = true); void setEvent(); - void setMousePressedTime (const timeval*); + void setMousePressedTime (const TimeValue&); void resetMousePressedTime(); // Inquiry - bool isDblclickTimeout (const timeval*) const; + bool isDblclickTimeout (const TimeValue&) const; private: // Data members @@ -228,7 +228,7 @@ class FMouse : public FMouseData uInt16 max_width{80}; uInt16 max_height{25}; uInt64 dblclick_interval{500000}; // 500 ms - struct timeval time_mousepressed{}; + TimeValue time_mousepressed{}; FPoint new_mouse_position{}; }; @@ -263,7 +263,7 @@ class FMouseGPM final : public FMouse // Methods void setRawData (FKeyboard::keybuffer&) override; - void processEvent (struct timeval*) override; + void processEvent (const TimeValue&) override; bool gpmMouse (bool = true); bool enableGpmMouse(); bool disableGpmMouse(); @@ -321,7 +321,7 @@ class FMouseX11 final : public FMouse // Methods void setRawData (FKeyboard::keybuffer&) override; - void processEvent (struct timeval*) override; + void processEvent (const TimeValue&) override; private: // Enumeration @@ -351,7 +351,7 @@ class FMouseX11 final : public FMouse // Methods void setKeyState (int); void setMoveState (const FPoint&, int); - void setButtonState (const int, const struct timeval*); + void setButtonState (const int, const TimeValue&); // Data member char x11_mouse[MOUSE_BUF_SIZE]{'\0'}; @@ -374,7 +374,7 @@ class FMouseSGR final : public FMouse // Methods void setRawData (FKeyboard::keybuffer&) override; - void processEvent (struct timeval*) override; + void processEvent (const TimeValue&) override; private: // Enumeration @@ -403,7 +403,7 @@ class FMouseSGR final : public FMouse // Methods void setKeyState (int); void setMoveState (const FPoint&, int); - void setPressedButtonState (const int, const struct timeval*); + void setPressedButtonState (const int, const TimeValue&); void setReleasedButtonState (const int); // Data members @@ -427,7 +427,7 @@ class FMouseUrxvt final : public FMouse // Methods void setRawData (FKeyboard::keybuffer&) override; - void processEvent (struct timeval*) override; + void processEvent (const TimeValue&) override; private: // Enumeration @@ -457,7 +457,7 @@ class FMouseUrxvt final : public FMouse // Methods void setKeyState (int); void setMoveState (const FPoint&, int); - void setButtonState (const int, const struct timeval*); + void setButtonState (const int, const TimeValue&); // Data members char urxvt_mouse[MOUSE_BUF_SIZE]{'\0'}; @@ -543,7 +543,7 @@ class FMouseControl void disable(); virtual void setRawData ( FMouse::MouseType , FKeyboard::keybuffer& ); - virtual void processEvent (struct timeval* time); + virtual void processEvent (const TimeValue&); void processQueuedInput(); bool getGpmKeyPressed (bool = true); void drawPointer(); diff --git a/src/include/final/fobject.h b/src/include/final/fobject.h index 663b8528..bc54464f 100644 --- a/src/include/final/fobject.h +++ b/src/include/final/fobject.h @@ -44,15 +44,24 @@ #include // need for gettimeofday #include #include +#include #include #include #include #include "final/fstring.h" +#include "final/ftypes.h" namespace finalcut { +using std::chrono::duration_cast; +using std::chrono::seconds; +using std::chrono::milliseconds; +using std::chrono::microseconds; +using std::chrono::system_clock; +using std::chrono::time_point; + // class forward declaration class FEvent; class FKeyEvent; @@ -122,7 +131,6 @@ class FObject bool isDirectChild (const FObject*) const; bool isWidget() const; bool isInstanceOf (const FString&) const; - bool isTimerInUpdating() const; // Methods void removeParent(); @@ -134,8 +142,8 @@ class FObject virtual bool event (FEvent*); // Timer methods - static void getCurrentTime (timeval*); - static bool isTimeout (const timeval*, uInt64); + static TimeValue getCurrentTime(); + static bool isTimeout (const TimeValue&, uInt64); int addTimer (int); bool delTimer (int) const; bool delOwnTimers() const; @@ -144,10 +152,10 @@ class FObject protected: struct FTimerData { - int id; - timeval interval; - timeval timeout; - FObject* object; + int id; + milliseconds interval; + TimeValue timeout; + FObject* object; }; // Using-declaration @@ -178,7 +186,6 @@ class FObject std::size_t max_children{UNLIMITED}; bool has_parent{false}; bool widget_object{false}; - static bool timer_modify_lock; }; @@ -262,10 +269,6 @@ inline bool FObject::isWidget() const inline bool FObject::isInstanceOf (const FString& classname) const { return classname == getClassName(); } -//---------------------------------------------------------------------- -inline bool FObject::isTimerInUpdating() const -{ return timer_modify_lock; } - //---------------------------------------------------------------------- inline FObject::FTimerList* FObject::getTimerList() const { return globalTimerList().get(); } @@ -274,61 +277,6 @@ inline FObject::FTimerList* FObject::getTimerList() const inline void FObject::setWidgetProperty (bool property) { widget_object = property; } - -//---------------------------------------------------------------------- -// Operator functions for timeval -//---------------------------------------------------------------------- - -static inline timeval operator + (const timeval& t1, const timeval& t2) -{ - timeval tmp{}; - tmp.tv_sec = t1.tv_sec + t2.tv_sec; - - if ( (tmp.tv_usec = t1.tv_usec + t2.tv_usec) >= 1000000 ) - { - tmp.tv_sec++; - tmp.tv_usec -= 1000000; - } - - return tmp; -} - -//---------------------------------------------------------------------- -static inline timeval operator - (const timeval& t1, const timeval& t2) -{ - timeval tmp{}; - tmp.tv_sec = t1.tv_sec - t2.tv_sec; - - if ( (tmp.tv_usec = t1.tv_usec - t2.tv_usec) < 0 ) - { - tmp.tv_sec--; - tmp.tv_usec += 1000000; - } - - return tmp; -} - -//---------------------------------------------------------------------- -static inline timeval& operator += (timeval& t1, const timeval& t2) -{ - t1.tv_sec += t2.tv_sec; - - if ( (t1.tv_usec += t2.tv_usec) >= 1000000 ) - { - t1.tv_sec++; - t1.tv_usec -= 1000000; - } - - return t1; -} - -//---------------------------------------------------------------------- -static inline bool operator < (const timeval& t1, const timeval& t2) -{ - return (t1.tv_sec < t2.tv_sec) - || (t1.tv_sec == t2.tv_sec && t1.tv_usec < t2.tv_usec); -} - } // namespace finalcut #endif // FOBJECT_H diff --git a/src/include/final/ftypes.h b/src/include/final/ftypes.h index e5324b5b..02dab549 100644 --- a/src/include/final/ftypes.h +++ b/src/include/final/ftypes.h @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -51,25 +52,25 @@ << " in " \ << __func__ << std::endl // ; -using uChar = unsigned char; -using uShort = unsigned short; -using uInt = unsigned int; -using uLong = unsigned long; -using uInt8 = std::uint8_t; -using uInt16 = std::uint16_t; -using uInt32 = std::uint32_t; -using uInt64 = std::uint64_t; +using uChar = unsigned char; +using uShort = unsigned short; +using uInt = unsigned int; +using uLong = unsigned long; +using uInt8 = std::uint8_t; +using uInt16 = std::uint16_t; +using uInt32 = std::uint32_t; +using uInt64 = std::uint64_t; -using sInt = signed int; -using sLong = signed long; -using sInt8 = std::int8_t; -using sInt16 = std::int16_t; -using sInt32 = std::int32_t; -using sInt64 = std::int64_t; +using sInt = signed int; +using sLong = signed long; +using sInt8 = std::int8_t; +using sInt16 = std::int16_t; +using sInt32 = std::int32_t; +using sInt64 = std::int64_t; -using lDouble = long double; - -using FCall = std::function; +using lDouble = long double; +using TimeValue = std::chrono::time_point; +using FCall = std::function; namespace finalcut { @@ -125,10 +126,10 @@ constexpr std::reverse_iterator make_reverse_iterator (Iter iter) return std::reverse_iterator(iter); } -template -constexpr std::size_t stringLength (T&& array) +template +constexpr std::size_t stringLength (const CharT* s) { - return std::string(std::forward(array)).length(); + return std::char_traits::length(s); } using charSubstitution = std::unordered_map; diff --git a/src/include/final/fvterm.h b/src/include/final/fvterm.h index 075d337b..cc7df440 100644 --- a/src/include/final/fvterm.h +++ b/src/include/final/fvterm.h @@ -418,10 +418,8 @@ class FVTerm bool updateTerminalLine (uInt) const; bool updateTerminalCursor() const; bool isInsideTerminal (const FPoint&) const; - bool isTermSizeChanged() const; void flushTimeAdjustment() const; static bool isFlushTimeout(); - static bool isTermSizeCheckTimeout(); static bool hasPendingUpdates (const FTermArea*); static void markAsPrinted (uInt, uInt); static void markAsPrinted (uInt, uInt, uInt); @@ -453,8 +451,7 @@ class FVTerm static FChar next_attribute; static FChar s_ch; // shadow character static FChar i_ch; // inherit background character - static timeval time_last_flush; - static timeval last_term_size_check; + static TimeValue time_last_flush; static bool draw_completed; static bool combined_char_support; static bool no_terminal_updates; @@ -462,7 +459,6 @@ class FVTerm static uInt64 flush_wait; static uInt64 flush_average; static uInt64 flush_median; - static uInt64 term_size_check_timeout; static uInt erase_char_length; static uInt repeat_char_length; static uInt clr_bol_length; diff --git a/test/fkeyboard-test.cpp b/test/fkeyboard-test.cpp index 373fcfd6..573f8d36 100644 --- a/test/fkeyboard-test.cpp +++ b/test/fkeyboard-test.cpp @@ -3,7 +3,7 @@ * * * This file is part of the FINAL CUT widget toolkit * * * -* Copyright 2018-2020 Markus Gans * +* Copyright 2018-2021 Markus Gans * * * * FINAL CUT is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -373,9 +373,11 @@ void FKeyboardTest::noArgumentTest() CPPUNIT_ASSERT ( sum == 0 ); - timeval* time = keyboard->getKeyPressedTime(); - CPPUNIT_ASSERT ( time->tv_sec == 0); - CPPUNIT_ASSERT ( time->tv_usec == 0); + auto time = keyboard->getKeyPressedTime(); + auto duration_s = std::chrono::duration_cast(time.time_since_epoch()); + auto duration_us = std::chrono::duration_cast(time.time_since_epoch()); + CPPUNIT_ASSERT ( duration_s.count() == 0); + CPPUNIT_ASSERT ( duration_us.count() == 0); CPPUNIT_ASSERT ( ! keyboard->hasUnprocessedInput() ); CPPUNIT_ASSERT ( ! keyboard->isKeyPressed() ); diff --git a/test/fmouse-test.cpp b/test/fmouse-test.cpp index de53edd4..5225afe4 100644 --- a/test/fmouse-test.cpp +++ b/test/fmouse-test.cpp @@ -3,7 +3,7 @@ * * * This file is part of the FINAL CUT widget toolkit * * * -* Copyright 2018-2020 Markus Gans * +* Copyright 2018-2021 Markus Gans * * * * FINAL CUT is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -40,13 +40,13 @@ namespace test class FMouse_protected : public finalcut::FMouse { public: - virtual bool hasData() + bool hasData() override { return true; } - virtual void setRawData (finalcut::FKeyboard::keybuffer&) + void setRawData (finalcut::FKeyboard::keybuffer&) override { } - virtual void processEvent (struct timeval*) + void processEvent (const TimeValue&) override { } uInt16 getMaxWidth() @@ -59,7 +59,7 @@ class FMouse_protected : public finalcut::FMouse return finalcut::FMouse::getMaxHeight(); } - const finalcut::FPoint& getNewMousePosition() + const finalcut::FPoint& getNewMousePosition() const { return finalcut::FMouse::getNewPos(); } @@ -69,7 +69,7 @@ class FMouse_protected : public finalcut::FMouse return finalcut::FMouse::getDblclickInterval(); } - bool isDblclickTimeout (timeval* t) + bool isDblclickTimeout (const TimeValue& t) { return finalcut::FMouse::isDblclickTimeout(t); } @@ -199,24 +199,24 @@ void FMouseTest::doubleClickTest() test::FMouse_protected mouse; CPPUNIT_ASSERT ( mouse.getDblclickInterval() == 500000 ); // 500 ms - timeval tv = { 0, 0 }; - CPPUNIT_ASSERT ( mouse.isDblclickTimeout(&tv) ); + TimeValue tv = {}; + CPPUNIT_ASSERT ( mouse.isDblclickTimeout(tv) ); - finalcut::FObject::getCurrentTime(&tv); - CPPUNIT_ASSERT ( ! mouse.isDblclickTimeout(&tv) ); + tv = finalcut::FObject::getCurrentTime(); + CPPUNIT_ASSERT ( ! mouse.isDblclickTimeout(tv) ); - tv.tv_sec--; // Minus one second - CPPUNIT_ASSERT ( mouse.isDblclickTimeout(&tv) ); + tv -= std::chrono::seconds(1); // Minus one second + CPPUNIT_ASSERT ( mouse.isDblclickTimeout(tv) ); mouse.setDblclickInterval(1000000); - finalcut::FObject::getCurrentTime(&tv); - CPPUNIT_ASSERT ( ! mouse.isDblclickTimeout(&tv) ); + tv = finalcut::FObject::getCurrentTime(); + CPPUNIT_ASSERT ( ! mouse.isDblclickTimeout(tv) ); - timeval tv_delta = { 0, 500000 }; - tv = tv - tv_delta; - CPPUNIT_ASSERT ( ! mouse.isDblclickTimeout(&tv) ); - tv = tv - tv_delta; - CPPUNIT_ASSERT ( mouse.isDblclickTimeout(&tv) ); + auto tv_delta = std::chrono::microseconds(500000); + tv -= tv_delta; + CPPUNIT_ASSERT ( ! mouse.isDblclickTimeout(tv) ); + tv -= tv_delta; + CPPUNIT_ASSERT ( mouse.isDblclickTimeout(tv) ); } //---------------------------------------------------------------------- @@ -266,9 +266,8 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( x11_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( std::strcmp(rawdata1, "@@") == 0 ); - timeval tv; - finalcut::FObject::getCurrentTime(&tv); - x11_mouse.processEvent (&tv); + auto tv = finalcut::FObject::getCurrentTime(); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( x11_mouse.getPos() == finalcut::FPoint(48, 18) ); CPPUNIT_ASSERT ( x11_mouse.hasEvent() ); @@ -290,7 +289,7 @@ void FMouseTest::x11MouseTest() finalcut::FKeyboard::keybuffer raw = \ { 0x1b, '[', 'M', 0x23, 0x50, 0x32 }; x11_mouse.setRawData (raw); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasEvent() ); // Left mouse button pressed @@ -299,7 +298,7 @@ void FMouseTest::x11MouseTest() x11_mouse.setRawData (rawdata2); CPPUNIT_ASSERT ( x11_mouse.hasData() ); CPPUNIT_ASSERT ( ! x11_mouse.hasUnprocessedInput() ); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.getPos() == finalcut::FPoint(1, 1) ); CPPUNIT_ASSERT ( x11_mouse.hasEvent() ); @@ -324,7 +323,7 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( x11_mouse.hasData() ); CPPUNIT_ASSERT ( ! x11_mouse.hasUnprocessedInput() ); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.getPos() == finalcut::FPoint(1, 1) ); CPPUNIT_ASSERT ( x11_mouse.hasEvent() ); @@ -349,8 +348,8 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( x11_mouse.hasData() ); CPPUNIT_ASSERT ( ! x11_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - x11_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.getPos() == finalcut::FPoint(1, 1) ); CPPUNIT_ASSERT ( x11_mouse.hasEvent() ); @@ -377,8 +376,8 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - x11_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.getPos() == finalcut::FPoint(1, 1) ); CPPUNIT_ASSERT ( x11_mouse.hasEvent() ); @@ -397,7 +396,7 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( ! x11_mouse.isMoved() ); x11_mouse.setRawData (rawdata5); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( ! x11_mouse.isMiddleButtonPressed() ); CPPUNIT_ASSERT ( x11_mouse.isMiddleButtonReleased() ); @@ -410,8 +409,8 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - x11_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.getPos() == finalcut::FPoint(1, 1) ); CPPUNIT_ASSERT ( x11_mouse.hasEvent() ); @@ -430,7 +429,7 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( ! x11_mouse.isMoved() ); x11_mouse.setRawData (rawdata6); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( ! x11_mouse.isRightButtonPressed() ); CPPUNIT_ASSERT ( x11_mouse.isRightButtonReleased() ); @@ -443,8 +442,8 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - x11_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.getPos() == finalcut::FPoint(80, 25) ); CPPUNIT_ASSERT ( x11_mouse.hasEvent() ); @@ -463,7 +462,7 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( ! x11_mouse.isMoved() ); x11_mouse.setRawData (rawdata7); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( x11_mouse.isWheelDown() ); @@ -476,8 +475,8 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - x11_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.getPos() == finalcut::FPoint(1, 1) ); CPPUNIT_ASSERT ( x11_mouse.hasEvent() ); @@ -496,12 +495,12 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( ! x11_mouse.isMoved() ); x11_mouse.setRawData (rawdata8); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( x11_mouse.getPos() == finalcut::FPoint(3, 5) ); CPPUNIT_ASSERT ( x11_mouse.isMoved() ); x11_mouse.setRawData (rawdata8); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( x11_mouse.getPos() == finalcut::FPoint(3, 5) ); CPPUNIT_ASSERT ( ! x11_mouse.isMoved() ); @@ -515,8 +514,8 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - x11_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! x11_mouse.hasData() ); CPPUNIT_ASSERT ( x11_mouse.getPos() == finalcut::FPoint(16, 32) ); CPPUNIT_ASSERT ( x11_mouse.hasEvent() ); @@ -535,21 +534,21 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( ! x11_mouse.isMoved() ); x11_mouse.setRawData (rawdata9); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( x11_mouse.isLeftButtonPressed() ); CPPUNIT_ASSERT ( ! x11_mouse.isShiftKeyPressed() ); CPPUNIT_ASSERT ( ! x11_mouse.isControlKeyPressed() ); CPPUNIT_ASSERT ( x11_mouse.isMetaKeyPressed() ); x11_mouse.setRawData (rawdata9); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( x11_mouse.isLeftButtonPressed() ); CPPUNIT_ASSERT ( ! x11_mouse.isShiftKeyPressed() ); CPPUNIT_ASSERT ( x11_mouse.isControlKeyPressed() ); CPPUNIT_ASSERT ( ! x11_mouse.isMetaKeyPressed() ); x11_mouse.setRawData (rawdata9); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( x11_mouse.isLeftButtonPressed() ); CPPUNIT_ASSERT ( x11_mouse.isShiftKeyPressed() ); CPPUNIT_ASSERT ( x11_mouse.isControlKeyPressed() ); @@ -560,7 +559,7 @@ void FMouseTest::x11MouseTest() { 0x1b, '[', 'M', 0x20, 0x7f, 0x3f }; x11_mouse.setRawData (rawdata10); CPPUNIT_ASSERT ( x11_mouse.hasData() ); - x11_mouse.processEvent (&tv); + x11_mouse.processEvent (tv); CPPUNIT_ASSERT ( x11_mouse.hasEvent() ); x11_mouse.clearEvent(); CPPUNIT_ASSERT ( ! x11_mouse.hasEvent() ); @@ -581,9 +580,8 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( sgr_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( std::strcmp(rawdata1, "@@") == 0 ); - timeval tv; - finalcut::FObject::getCurrentTime(&tv); - sgr_mouse.processEvent (&tv); + auto tv = finalcut::FObject::getCurrentTime(); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( sgr_mouse.getPos() == finalcut::FPoint(73, 4) ); CPPUNIT_ASSERT ( sgr_mouse.hasEvent() ); @@ -605,7 +603,7 @@ void FMouseTest::sgrMouseTest() finalcut::FKeyboard::keybuffer raw = \ { 0x1b, '[', '<', '0', ';', '7', '3', ';', '4', 'M' }; sgr_mouse.setRawData (raw); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasEvent() ); // Left mouse button released @@ -615,7 +613,7 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( sgr_mouse.hasData() ); CPPUNIT_ASSERT ( ! sgr_mouse.hasUnprocessedInput() ); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.getPos() == finalcut::FPoint(73, 4) ); CPPUNIT_ASSERT ( sgr_mouse.hasEvent() ); @@ -640,8 +638,8 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( sgr_mouse.hasData() ); CPPUNIT_ASSERT ( ! sgr_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - sgr_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.getPos() == finalcut::FPoint(73, 4) ); CPPUNIT_ASSERT ( sgr_mouse.hasEvent() ); @@ -667,8 +665,8 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - sgr_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.getPos() == finalcut::FPoint(1, 1) ); CPPUNIT_ASSERT ( sgr_mouse.hasEvent() ); @@ -687,7 +685,7 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( ! sgr_mouse.isMoved() ); sgr_mouse.setRawData (rawdata5); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( ! sgr_mouse.isMiddleButtonPressed() ); CPPUNIT_ASSERT ( sgr_mouse.isMiddleButtonReleased() ); @@ -700,8 +698,8 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - sgr_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.getPos() == finalcut::FPoint(3, 3) ); CPPUNIT_ASSERT ( sgr_mouse.hasEvent() ); @@ -720,7 +718,7 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( ! sgr_mouse.isMoved() ); sgr_mouse.setRawData (rawdata6); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( sgr_mouse.getPos() == finalcut::FPoint(3, 4) ); CPPUNIT_ASSERT ( ! sgr_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( ! sgr_mouse.isRightButtonPressed() ); @@ -734,8 +732,8 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - sgr_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.getPos() == finalcut::FPoint(4, 9) ); CPPUNIT_ASSERT ( sgr_mouse.hasEvent() ); @@ -754,7 +752,7 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( ! sgr_mouse.isMoved() ); sgr_mouse.setRawData (rawdata7); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( sgr_mouse.isWheelDown() ); @@ -767,8 +765,8 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - sgr_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.getPos() == finalcut::FPoint(1, 2) ); CPPUNIT_ASSERT ( sgr_mouse.hasEvent() ); @@ -787,12 +785,12 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( ! sgr_mouse.isMoved() ); sgr_mouse.setRawData (rawdata8); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( sgr_mouse.getPos() == finalcut::FPoint(2, 3) ); CPPUNIT_ASSERT ( sgr_mouse.isMoved() ); sgr_mouse.setRawData (rawdata8); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( sgr_mouse.getPos() == finalcut::FPoint(3, 4) ); CPPUNIT_ASSERT ( ! sgr_mouse.isMoved() ); @@ -806,8 +804,8 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - sgr_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasData() ); CPPUNIT_ASSERT ( sgr_mouse.getPos() == finalcut::FPoint(5, 5) ); CPPUNIT_ASSERT ( sgr_mouse.hasEvent() ); @@ -826,21 +824,21 @@ void FMouseTest::sgrMouseTest() CPPUNIT_ASSERT ( ! sgr_mouse.isMoved() ); sgr_mouse.setRawData (rawdata9); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( sgr_mouse.isLeftButtonPressed() ); CPPUNIT_ASSERT ( ! sgr_mouse.isShiftKeyPressed() ); CPPUNIT_ASSERT ( ! sgr_mouse.isControlKeyPressed() ); CPPUNIT_ASSERT ( sgr_mouse.isMetaKeyPressed() ); sgr_mouse.setRawData (rawdata9); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( sgr_mouse.isLeftButtonPressed() ); CPPUNIT_ASSERT ( ! sgr_mouse.isShiftKeyPressed() ); CPPUNIT_ASSERT ( sgr_mouse.isControlKeyPressed() ); CPPUNIT_ASSERT ( ! sgr_mouse.isMetaKeyPressed() ); sgr_mouse.setRawData (rawdata9); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( sgr_mouse.isLeftButtonPressed() ); CPPUNIT_ASSERT ( sgr_mouse.isShiftKeyPressed() ); CPPUNIT_ASSERT ( sgr_mouse.isControlKeyPressed() ); @@ -851,7 +849,7 @@ void FMouseTest::sgrMouseTest() { 0x1b, '[', '<', '2', ';', '1', ';', '1', 'M' }; sgr_mouse.setRawData (rawdata10); CPPUNIT_ASSERT ( sgr_mouse.hasData() ); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( sgr_mouse.hasEvent() ); sgr_mouse.clearEvent(); CPPUNIT_ASSERT ( ! sgr_mouse.hasEvent() ); @@ -863,17 +861,17 @@ void FMouseTest::sgrMouseTest() , 0x1b, '[', '<', '6', ';', '5', ';', '@', 'M', '@' }; sgr_mouse.setRawData (rawdata11); CPPUNIT_ASSERT ( sgr_mouse.hasData() ); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasEvent() ); sgr_mouse.setRawData (rawdata11); CPPUNIT_ASSERT ( sgr_mouse.hasData() ); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasEvent() ); sgr_mouse.setRawData (rawdata11); CPPUNIT_ASSERT ( sgr_mouse.hasData() ); - sgr_mouse.processEvent (&tv); + sgr_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! sgr_mouse.hasEvent() ); CPPUNIT_ASSERT ( sgr_mouse.hasUnprocessedInput() ); @@ -895,9 +893,8 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( urxvt_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( std::strcmp(rawdata1, "@@") == 0 ); - timeval tv; - finalcut::FObject::getCurrentTime(&tv); - urxvt_mouse.processEvent (&tv); + auto tv = finalcut::FObject::getCurrentTime(); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(49, 6) ); CPPUNIT_ASSERT ( urxvt_mouse.hasEvent() ); CPPUNIT_ASSERT ( urxvt_mouse.isLeftButtonPressed() ); @@ -918,7 +915,7 @@ void FMouseTest::urxvtMouseTest() finalcut::FKeyboard::keybuffer raw = \ { 0x1b, '[', '3', '2', ';', '4', '9', ';', '6', 'M' }; urxvt_mouse.setRawData (raw); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasEvent() ); // Left mouse button released @@ -928,7 +925,7 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( ! urxvt_mouse.hasUnprocessedInput() ); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(49, 6) ); CPPUNIT_ASSERT ( urxvt_mouse.hasEvent() ); @@ -953,8 +950,8 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( ! urxvt_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - urxvt_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(49, 6) ); CPPUNIT_ASSERT ( urxvt_mouse.hasEvent() ); @@ -980,8 +977,8 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - urxvt_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(1, 1) ); CPPUNIT_ASSERT ( urxvt_mouse.hasEvent() ); @@ -1000,7 +997,7 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( ! urxvt_mouse.isMoved() ); urxvt_mouse.setRawData (rawdata5); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( ! urxvt_mouse.isMiddleButtonPressed() ); CPPUNIT_ASSERT ( urxvt_mouse.isMiddleButtonReleased() ); @@ -1013,8 +1010,8 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - urxvt_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(3, 3) ); CPPUNIT_ASSERT ( urxvt_mouse.hasEvent() ); @@ -1033,7 +1030,7 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( ! urxvt_mouse.isMoved() ); urxvt_mouse.setRawData (rawdata6); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(3, 4) ); CPPUNIT_ASSERT ( ! urxvt_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( ! urxvt_mouse.isRightButtonPressed() ); @@ -1047,8 +1044,8 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - urxvt_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(4, 9) ); CPPUNIT_ASSERT ( urxvt_mouse.hasEvent() ); @@ -1067,7 +1064,7 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( ! urxvt_mouse.isMoved() ); urxvt_mouse.setRawData (rawdata7); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasUnprocessedInput() ); CPPUNIT_ASSERT ( urxvt_mouse.isWheelDown() ); @@ -1080,8 +1077,8 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - urxvt_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(1, 2) ); CPPUNIT_ASSERT ( urxvt_mouse.hasEvent() ); @@ -1100,12 +1097,12 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( ! urxvt_mouse.isMoved() ); urxvt_mouse.setRawData (rawdata8); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(2, 3) ); CPPUNIT_ASSERT ( urxvt_mouse.isMoved() ); urxvt_mouse.setRawData (rawdata8); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(3, 4) ); CPPUNIT_ASSERT ( ! urxvt_mouse.isMoved() ); @@ -1119,8 +1116,8 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - urxvt_mouse.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(5, 5) ); CPPUNIT_ASSERT ( urxvt_mouse.hasEvent() ); @@ -1139,21 +1136,21 @@ void FMouseTest::urxvtMouseTest() CPPUNIT_ASSERT ( ! urxvt_mouse.isMoved() ); urxvt_mouse.setRawData (rawdata9); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( urxvt_mouse.isLeftButtonPressed() ); CPPUNIT_ASSERT ( ! urxvt_mouse.isShiftKeyPressed() ); CPPUNIT_ASSERT ( ! urxvt_mouse.isControlKeyPressed() ); CPPUNIT_ASSERT ( urxvt_mouse.isMetaKeyPressed() ); urxvt_mouse.setRawData (rawdata9); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( urxvt_mouse.isLeftButtonPressed() ); CPPUNIT_ASSERT ( ! urxvt_mouse.isShiftKeyPressed() ); CPPUNIT_ASSERT ( urxvt_mouse.isControlKeyPressed() ); CPPUNIT_ASSERT ( ! urxvt_mouse.isMetaKeyPressed() ); urxvt_mouse.setRawData (rawdata9); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( urxvt_mouse.isLeftButtonPressed() ); CPPUNIT_ASSERT ( urxvt_mouse.isShiftKeyPressed() ); CPPUNIT_ASSERT ( urxvt_mouse.isControlKeyPressed() ); @@ -1164,7 +1161,7 @@ void FMouseTest::urxvtMouseTest() { 0x1b, '[', '3', '2', ';', '1', ';', '1', 'M' }; urxvt_mouse.setRawData (rawdata10); CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( urxvt_mouse.hasEvent() ); urxvt_mouse.clearEvent(); CPPUNIT_ASSERT ( ! urxvt_mouse.hasEvent() ); @@ -1176,17 +1173,17 @@ void FMouseTest::urxvtMouseTest() , 0x1b, '[', '3', '4', ';', '5', ';', '@', 'M', '@' }; urxvt_mouse.setRawData (rawdata11); CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasEvent() ); urxvt_mouse.setRawData (rawdata11); CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasEvent() ); urxvt_mouse.setRawData (rawdata11); CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasEvent() ); CPPUNIT_ASSERT ( urxvt_mouse.hasUnprocessedInput() ); @@ -1199,7 +1196,7 @@ void FMouseTest::urxvtMouseTest() urxvt_mouse.setRawData (rawdata12); CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.hasUnprocessedInput() ); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() != finalcut::FPoint(-5, 5) ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(1, 5) ); @@ -1207,7 +1204,7 @@ void FMouseTest::urxvtMouseTest() urxvt_mouse.setRawData (rawdata12); CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() != finalcut::FPoint(3, -3) ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(3, 1) ); @@ -1220,7 +1217,7 @@ void FMouseTest::urxvtMouseTest() { 0x1b, '[', '3', '2', ';', '7', '0', ';', '2', '5', 'M' }; urxvt_mouse.setRawData (rawdata13); CPPUNIT_ASSERT ( urxvt_mouse.hasData() ); - urxvt_mouse.processEvent (&tv); + urxvt_mouse.processEvent (tv); CPPUNIT_ASSERT ( ! urxvt_mouse.hasData() ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() != finalcut::FPoint(70, 25) ); CPPUNIT_ASSERT ( urxvt_mouse.getPos() == finalcut::FPoint(40, 20) ); @@ -1271,9 +1268,8 @@ void FMouseTest::mouseControlTest() CPPUNIT_ASSERT ( mouse_control.hasData() ); CPPUNIT_ASSERT ( mouse_control.hasUnprocessedInput() ); - timeval tv; - finalcut::FObject::getCurrentTime(&tv); - mouse_control.processEvent (&tv); + auto tv = finalcut::FObject::getCurrentTime(); + mouse_control.processEvent (tv); CPPUNIT_ASSERT ( ! mouse_control.hasData() ); CPPUNIT_ASSERT ( mouse_control.getPos() == finalcut::FPoint(5, 8) ); CPPUNIT_ASSERT ( mouse_control.hasEvent() ); @@ -1293,7 +1289,7 @@ void FMouseTest::mouseControlTest() CPPUNIT_ASSERT ( mouse_control.hasUnprocessedInput() ); mouse_control.setRawData (finalcut::FMouse::MouseType::X11, rawdata1); - mouse_control.processEvent (&tv); + mouse_control.processEvent (tv); CPPUNIT_ASSERT ( ! mouse_control.hasUnprocessedInput() ); CPPUNIT_ASSERT ( ! mouse_control.isLeftButtonPressed() ); CPPUNIT_ASSERT ( mouse_control.isLeftButtonReleased() ); @@ -1306,8 +1302,8 @@ void FMouseTest::mouseControlTest() mouse_control.setRawData (finalcut::FMouse::MouseType::Sgr, rawdata2); CPPUNIT_ASSERT ( mouse_control.hasData() ); CPPUNIT_ASSERT ( mouse_control.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - mouse_control.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + mouse_control.processEvent (tv); CPPUNIT_ASSERT ( ! mouse_control.hasData() ); CPPUNIT_ASSERT ( mouse_control.getPos() == finalcut::FPoint(1, 1) ); CPPUNIT_ASSERT ( mouse_control.hasEvent() ); @@ -1326,7 +1322,7 @@ void FMouseTest::mouseControlTest() CPPUNIT_ASSERT ( ! mouse_control.isMoved() ); mouse_control.setRawData (finalcut::FMouse::MouseType::Sgr, rawdata2); - mouse_control.processEvent (&tv); + mouse_control.processEvent (tv); CPPUNIT_ASSERT ( ! mouse_control.hasUnprocessedInput() ); CPPUNIT_ASSERT ( ! mouse_control.isMiddleButtonPressed() ); CPPUNIT_ASSERT ( mouse_control.isMiddleButtonReleased() ); @@ -1337,8 +1333,8 @@ void FMouseTest::mouseControlTest() mouse_control.setRawData (finalcut::FMouse::MouseType::Urxvt, rawdata3); CPPUNIT_ASSERT ( mouse_control.hasData() ); CPPUNIT_ASSERT ( mouse_control.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - mouse_control.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + mouse_control.processEvent (tv); CPPUNIT_ASSERT ( ! mouse_control.hasData() ); CPPUNIT_ASSERT ( mouse_control.getPos() == finalcut::FPoint(3, 3) ); CPPUNIT_ASSERT ( mouse_control.hasEvent() ); @@ -1357,7 +1353,7 @@ void FMouseTest::mouseControlTest() CPPUNIT_ASSERT ( ! mouse_control.isMoved() ); mouse_control.setRawData (finalcut::FMouse::MouseType::Urxvt, rawdata3); - mouse_control.processEvent (&tv); + mouse_control.processEvent (tv); CPPUNIT_ASSERT ( mouse_control.getPos() == finalcut::FPoint(3, 4) ); CPPUNIT_ASSERT ( ! mouse_control.hasUnprocessedInput() ); CPPUNIT_ASSERT ( ! mouse_control.isRightButtonPressed() ); @@ -1370,8 +1366,8 @@ void FMouseTest::mouseControlTest() mouse_control.setRawData (finalcut::FMouse::MouseType::X11, rawdata4); CPPUNIT_ASSERT ( mouse_control.hasData() ); CPPUNIT_ASSERT ( mouse_control.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - mouse_control.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + mouse_control.processEvent (tv); CPPUNIT_ASSERT ( ! mouse_control.hasData() ); CPPUNIT_ASSERT ( mouse_control.getPos() == finalcut::FPoint(80, 25) ); CPPUNIT_ASSERT ( mouse_control.hasEvent() ); @@ -1390,7 +1386,7 @@ void FMouseTest::mouseControlTest() CPPUNIT_ASSERT ( ! mouse_control.isMoved() ); mouse_control.setRawData (finalcut::FMouse::MouseType::X11, rawdata4); - mouse_control.processEvent (&tv); + mouse_control.processEvent (tv); CPPUNIT_ASSERT ( ! mouse_control.hasUnprocessedInput() ); CPPUNIT_ASSERT ( mouse_control.isWheelDown() ); @@ -1402,8 +1398,8 @@ void FMouseTest::mouseControlTest() mouse_control.setRawData (finalcut::FMouse::MouseType::Sgr, rawdata5); CPPUNIT_ASSERT ( mouse_control.hasData() ); CPPUNIT_ASSERT ( mouse_control.hasUnprocessedInput() ); - finalcut::FObject::getCurrentTime(&tv); - mouse_control.processEvent (&tv); + tv = finalcut::FObject::getCurrentTime(); + mouse_control.processEvent (tv); CPPUNIT_ASSERT ( ! mouse_control.hasData() ); CPPUNIT_ASSERT ( mouse_control.getPos() == finalcut::FPoint(1, 2) ); CPPUNIT_ASSERT ( mouse_control.hasEvent() ); @@ -1422,12 +1418,12 @@ void FMouseTest::mouseControlTest() CPPUNIT_ASSERT ( ! mouse_control.isMoved() ); mouse_control.setRawData (finalcut::FMouse::MouseType::Sgr, rawdata5); - mouse_control.processEvent (&tv); + mouse_control.processEvent (tv); CPPUNIT_ASSERT ( mouse_control.getPos() == finalcut::FPoint(2, 3) ); CPPUNIT_ASSERT ( mouse_control.isMoved() ); mouse_control.setRawData (finalcut::FMouse::MouseType::Sgr, rawdata5); - mouse_control.processEvent (&tv); + mouse_control.processEvent (tv); CPPUNIT_ASSERT ( mouse_control.getPos() == finalcut::FPoint(3, 4) ); CPPUNIT_ASSERT ( ! mouse_control.isMoved() ); diff --git a/test/fobject-test.cpp b/test/fobject-test.cpp index 282e2088..ca4414ab 100644 --- a/test/fobject-test.cpp +++ b/test/fobject-test.cpp @@ -3,7 +3,7 @@ * * * This file is part of the FINAL CUT widget toolkit * * * -* Copyright 2018-2020 Markus Gans * +* Copyright 2018-2021 Markus Gans * * * * FINAL CUT is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -216,7 +216,6 @@ void FObjectTest::noArgumentTest() CPPUNIT_ASSERT ( ! o1.isDirectChild(&o2) ); CPPUNIT_ASSERT ( ! o1.isWidget() ); CPPUNIT_ASSERT ( o1.isInstanceOf("FObject") ); - CPPUNIT_ASSERT ( ! o1.isTimerInUpdating() ); test::FObject_protected t; auto ev = new finalcut::FEvent(finalcut::Event::None); @@ -287,7 +286,6 @@ void FObjectTest::childObjectTest() CPPUNIT_ASSERT ( ! c1->isDirectChild(c7) ); CPPUNIT_ASSERT ( ! c1->isWidget() ); CPPUNIT_ASSERT ( c1->isInstanceOf("FObject") ); - CPPUNIT_ASSERT ( ! c1->isTimerInUpdating() ); } //---------------------------------------------------------------------- @@ -553,15 +551,16 @@ void FObjectTest::iteratorTest() //---------------------------------------------------------------------- void FObjectTest::timeTest() { - struct timeval time1; + TimeValue time1{}; uInt64 timeout = 750000; // 750 ms - finalcut::FObject::getCurrentTime(&time1); - CPPUNIT_ASSERT ( ! finalcut::FObject::isTimeout (&time1, timeout) ); + time1 = finalcut::FObject::getCurrentTime(); + CPPUNIT_ASSERT ( ! finalcut::FObject::isTimeout (time1, timeout) ); sleep(1); - CPPUNIT_ASSERT ( finalcut::FObject::isTimeout (&time1, timeout) ); - time1.tv_sec = 300; - time1.tv_usec = 2000000; // > 1000000 µs to test diff underflow - CPPUNIT_ASSERT ( finalcut::FObject::isTimeout (&time1, timeout) ); + CPPUNIT_ASSERT ( finalcut::FObject::isTimeout (time1, timeout) ); + time1 = TimeValue{} + + std::chrono::seconds(300) + + std::chrono::microseconds(2000000); + CPPUNIT_ASSERT ( finalcut::FObject::isTimeout (time1, timeout) ); } //---------------------------------------------------------------------- @@ -622,19 +621,20 @@ void FObjectTest::timerTest() CPPUNIT_ASSERT ( t1.getTimerList()->size() == 0 ); CPPUNIT_ASSERT ( t2.getTimerList()->size() == 0 ); - timeval tv1 = { 1321006271, 0 }; - timeval tv2 = { 27166271, 0 }; - timeval tv_sum = tv1 + tv2; - CPPUNIT_ASSERT ( tv_sum.tv_sec == 1348172542 ); - CPPUNIT_ASSERT ( tv_sum.tv_usec == 0 ); + auto tv1 = TimeValue{} + std::chrono::seconds(1321006271); + auto tv2 = TimeValue{} + std::chrono::seconds(27166271); + auto tv2_duration = std::chrono::duration_cast(tv2.time_since_epoch()); + auto tv_sum = tv1 + tv2_duration; + auto sec_sum = std::chrono::duration_cast(tv_sum.time_since_epoch()).count(); + CPPUNIT_ASSERT ( sec_sum == 1348172542 ); - timeval tv_difference = tv1 - tv2; - CPPUNIT_ASSERT ( tv_difference.tv_sec == 1293840000 ); - CPPUNIT_ASSERT ( tv_difference.tv_usec == 0 ); + auto tv_difference = tv1 - tv2_duration; + auto sec_difference = std::chrono::duration_cast(tv_difference.time_since_epoch()).count(); + CPPUNIT_ASSERT ( sec_difference == 1293840000 ); - tv_sum += tv2; - CPPUNIT_ASSERT ( tv_sum.tv_sec == 1375338813 ); - CPPUNIT_ASSERT ( tv_sum.tv_usec == 0 ); + tv_sum += tv2_duration; + sec_sum = std::chrono::duration_cast(tv_sum.time_since_epoch()).count(); + CPPUNIT_ASSERT ( sec_sum == 1375338813 ); CPPUNIT_ASSERT ( tv2 < tv1 ); CPPUNIT_ASSERT ( ! (tv1 < tv2) ); @@ -645,21 +645,37 @@ void FObjectTest::timerTest() CPPUNIT_ASSERT ( tv_difference < tv_sum ); CPPUNIT_ASSERT ( ! (tv_sum < tv_difference) ); - tv1.tv_usec = tv2.tv_usec = 600000; - tv_sum = tv1 + tv2; - CPPUNIT_ASSERT ( tv_sum.tv_sec == 1348172543 ); - CPPUNIT_ASSERT ( tv_sum.tv_usec == 200000 ); + tv1 += std::chrono::microseconds(600000); + tv2 += std::chrono::microseconds(600000); + tv2_duration = std::chrono::duration_cast(tv2.time_since_epoch()); + tv_sum = tv1 + tv2_duration; + auto s_sum = std::chrono::duration_cast(tv_sum.time_since_epoch()).count(); + CPPUNIT_ASSERT ( s_sum == 1348172542 ); + auto us_sum = ( std::chrono::duration_cast(tv_sum.time_since_epoch()) + - std::chrono::seconds(1348172542) ).count(); + CPPUNIT_ASSERT ( us_sum == 600000 ); - tv1.tv_usec = 654321; - tv2.tv_usec = 123456; - tv_difference = tv1 - tv2; - CPPUNIT_ASSERT ( tv_difference.tv_sec == 1293840000 ); - CPPUNIT_ASSERT ( tv_difference.tv_usec == 530865 ); + auto tv1_sec = std::chrono::duration_cast(tv1.time_since_epoch()); + auto tv2_sec = std::chrono::duration_cast(tv2.time_since_epoch()); + tv1 = TimeValue{} + tv1_sec + std::chrono::microseconds(654321); + tv2 = TimeValue{} + tv2_sec + std::chrono::microseconds(123456); + auto tv2_duration_ms = std::chrono::duration_cast(tv2.time_since_epoch()); + tv_difference = tv1 - tv2_duration_ms; + sec_difference = std::chrono::duration_cast(tv_difference.time_since_epoch()).count(); + CPPUNIT_ASSERT ( sec_difference == 1293840000 ); + auto usec_difference = ( std::chrono::duration_cast(tv_difference.time_since_epoch()) + - std::chrono::seconds(1293840000) ).count(); + CPPUNIT_ASSERT ( usec_difference == 530865 ); - tv2.tv_usec = 999888; - tv_sum += tv2; - CPPUNIT_ASSERT ( tv_sum.tv_sec == 1375338815 ); - CPPUNIT_ASSERT ( tv_sum.tv_usec == 199888 ); + tv2_sec = std::chrono::duration_cast(tv2.time_since_epoch()); + tv2 = TimeValue{} + tv2_sec + std::chrono::microseconds(999888); + auto tv2_duration2 = std::chrono::duration_cast(tv2.time_since_epoch()); + tv_sum += tv2_duration2; + s_sum = std::chrono::duration_cast(tv_sum.time_since_epoch()).count(); + CPPUNIT_ASSERT ( s_sum == 1375338814 ); + us_sum = ( std::chrono::duration_cast(tv_sum.time_since_epoch()) + - std::chrono::seconds(1375338814) ).count(); + CPPUNIT_ASSERT ( us_sum == 599888 ); CPPUNIT_ASSERT ( tv2 < tv1 ); CPPUNIT_ASSERT ( ! (tv1 < tv2) );