gecko-dev/widget/windows/nsUserIdleServiceWin.h
Florian Quèze d7356251cd Bug 1768920 - Avoid polling every 5 seconds in nsUserIdleService, r=dthayer,geckoview-reviewers,owlish.
This changes the behavior in a few ways:
- the 'active' notification is now only fired when a new user event has been received by Firefox, rather than by any application on the entire system.
- the 'active' notification will fire immediately when Firefox receives a new event. Before the patch is was fired within 5s of the user returning on some plateforms (eg. Mac) and immediately on some other platforms that already called ResetIdleTimeout (windows, gtk, android). I'm not sure if these existing calls to ResetIdleTimeout are really needed, nor if they add significant overhead.
- when an idle observer has been notified of 'idle', it won't be notified again until Firefox receives events. Before the patch, if the user used other applications while Firefox was in the background, we would keep sending active and idle notifications to our idle observers. This behavior was probably initially intended when the nsUserIdleService was introduced to support the use case of instant messaging clients, but doesn't seem to match the expectations of the existing consumers of the service.

Differential Revision: https://phabricator.services.mozilla.com/D166306
2023-01-16 19:53:33 +00:00

43 lines
1.3 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:expandtab:shiftwidth=4:tabstop=4:
*/
/* 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/. */
#ifndef nsUserIdleServiceWin_h__
#define nsUserIdleServiceWin_h__
#include "nsUserIdleService.h"
/* NOTE: Compare of GetTickCount() could overflow. This corrects for
* overflow situations.
***/
#ifndef SAFE_COMPARE_EVEN_WITH_WRAPPING
# define SAFE_COMPARE_EVEN_WITH_WRAPPING(A, B) \
(((int)((long)A - (long)B) & 0xFFFFFFFF))
#endif
class nsUserIdleServiceWin : public nsUserIdleService {
public:
NS_INLINE_DECL_REFCOUNTING_INHERITED(nsUserIdleServiceWin, nsUserIdleService)
bool PollIdleTime(uint32_t* aIdleTime) override;
static already_AddRefed<nsUserIdleServiceWin> GetInstance() {
RefPtr<nsUserIdleServiceWin> idleService =
nsUserIdleService::GetInstance().downcast<nsUserIdleServiceWin>();
if (!idleService) {
idleService = new nsUserIdleServiceWin();
}
return idleService.forget();
}
protected:
nsUserIdleServiceWin() {}
virtual ~nsUserIdleServiceWin() {}
};
#endif // nsUserIdleServiceWin_h__