summaryrefslogtreecommitdiffstats
path: root/layout/xul/nsRepeatService.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layout/xul/nsRepeatService.cpp')
-rw-r--r--layout/xul/nsRepeatService.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/layout/xul/nsRepeatService.cpp b/layout/xul/nsRepeatService.cpp
new file mode 100644
index 000000000..919763d4d
--- /dev/null
+++ b/layout/xul/nsRepeatService.cpp
@@ -0,0 +1,86 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//
+// Eric Vaughan
+// Netscape Communications
+//
+// See documentation in associated header file
+//
+
+#include "nsRepeatService.h"
+#include "nsIServiceManager.h"
+
+nsRepeatService* nsRepeatService::gInstance = nullptr;
+
+nsRepeatService::nsRepeatService()
+: mCallback(nullptr), mCallbackData(nullptr)
+{
+}
+
+nsRepeatService::~nsRepeatService()
+{
+ NS_ASSERTION(!mCallback && !mCallbackData, "Callback was not removed before shutdown");
+}
+
+nsRepeatService*
+nsRepeatService::GetInstance()
+{
+ if (!gInstance) {
+ gInstance = new nsRepeatService();
+ NS_IF_ADDREF(gInstance);
+ }
+ return gInstance;
+}
+
+/*static*/ void
+nsRepeatService::Shutdown()
+{
+ NS_IF_RELEASE(gInstance);
+}
+
+void nsRepeatService::Start(Callback aCallback, void* aCallbackData,
+ uint32_t aInitialDelay)
+{
+ NS_PRECONDITION(aCallback != nullptr, "null ptr");
+
+ mCallback = aCallback;
+ mCallbackData = aCallbackData;
+ nsresult rv;
+ mRepeatTimer = do_CreateInstance("@mozilla.org/timer;1", &rv);
+
+ if (NS_SUCCEEDED(rv)) {
+ mRepeatTimer->InitWithCallback(this, aInitialDelay, nsITimer::TYPE_ONE_SHOT);
+ }
+}
+
+void nsRepeatService::Stop(Callback aCallback, void* aCallbackData)
+{
+ if (mCallback != aCallback || mCallbackData != aCallbackData)
+ return;
+
+ //printf("Stopping repeat timer\n");
+ if (mRepeatTimer) {
+ mRepeatTimer->Cancel();
+ mRepeatTimer = nullptr;
+ }
+ mCallback = nullptr;
+ mCallbackData = nullptr;
+}
+
+NS_IMETHODIMP nsRepeatService::Notify(nsITimer *timer)
+{
+ // do callback
+ if (mCallback)
+ mCallback(mCallbackData);
+
+ // start timer again.
+ if (mRepeatTimer) {
+ mRepeatTimer->InitWithCallback(this, REPEAT_DELAY, nsITimer::TYPE_ONE_SHOT);
+ }
+ return NS_OK;
+}
+
+NS_IMPL_ISUPPORTS(nsRepeatService, nsITimerCallback)