diff --git a/simpledisplay.d b/simpledisplay.d index 81e6d7d..3178bfe 100644 --- a/simpledisplay.d +++ b/simpledisplay.d @@ -5605,12 +5605,7 @@ class Timer { mapping[fd] = this; - itimerspec value; - value.it_value.tv_sec = cast(int) (intervalInMilliseconds / 1000); - value.it_value.tv_nsec = (intervalInMilliseconds % 1000) * 1000_000; - - value.it_interval.tv_sec = cast(int) (intervalInMilliseconds / 1000); - value.it_interval.tv_nsec = (intervalInMilliseconds % 1000) * 1000_000; + itimerspec value = makeItimerspec(intervalInMilliseconds); if(timerfd_settime(fd, 0, &value, null) == -1) throw new Exception("couldn't make pulse timer"); @@ -5683,7 +5678,6 @@ class Timer { } } - void changeTime(int intervalInMilliseconds) { this.intervalInMilliseconds = intervalInMilliseconds; @@ -5696,6 +5690,15 @@ class Timer { if(handle is null || !SetWaitableTimer(handle, cast(LARGE_INTEGER*)&initialTime, intervalInMilliseconds, &timerCallback, handle, false)) throw new WindowsApiException("couldn't change pulse timer", GetLastError()); } + } else version(linux) { + import core.sys.linux.timerfd; + + itimerspec value = makeItimerspec(intervalInMilliseconds); + if(timerfd_settime(fd, 0, &value, null) == -1) { + throw new Exception("couldn't change pulse timer"); + } + } else { + assert(false, "Timer.changeTime(int) is not implemented for this platform"); } } @@ -5706,6 +5709,21 @@ class Timer { int lastEventLoopRoundTriggered; + version(linux) { + static auto makeItimerspec(int intervalInMilliseconds) { + import core.sys.linux.timerfd; + + itimerspec value; + value.it_value.tv_sec = cast(int) (intervalInMilliseconds / 1000); + value.it_value.tv_nsec = (intervalInMilliseconds % 1000) * 1000_000; + + value.it_interval.tv_sec = cast(int) (intervalInMilliseconds / 1000); + value.it_interval.tv_nsec = (intervalInMilliseconds % 1000) * 1000_000; + + return value; + } + } + void trigger() { version(linux) { import unix = core.sys.posix.unistd;