gecko-dev/widget/gtk/nsUserIdleServiceGTK.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

56 lines
1.6 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 nsUserIdleServiceGTK_h__
#define nsUserIdleServiceGTK_h__
#include "nsUserIdleService.h"
#ifdef MOZ_X11
# include <X11/Xlib.h>
# include <X11/Xutil.h>
# include <gdk/gdkx.h>
#endif
#ifdef MOZ_X11
typedef struct {
Window window; // Screen saver window
int state; // ScreenSaver(Off,On,Disabled)
int kind; // ScreenSaver(Blanked,Internal,External)
unsigned long til_or_since; // milliseconds since/til screensaver kicks in
unsigned long idle; // milliseconds idle
unsigned long event_mask; // event stuff
} XScreenSaverInfo;
#endif
class nsUserIdleServiceGTK : public nsUserIdleService {
public:
NS_INLINE_DECL_REFCOUNTING_INHERITED(nsUserIdleServiceGTK, nsUserIdleService)
virtual bool PollIdleTime(uint32_t* aIdleTime) override;
static already_AddRefed<nsUserIdleServiceGTK> GetInstance() {
RefPtr<nsUserIdleServiceGTK> idleService =
nsUserIdleService::GetInstance().downcast<nsUserIdleServiceGTK>();
if (!idleService) {
idleService = new nsUserIdleServiceGTK();
}
return idleService.forget();
}
private:
~nsUserIdleServiceGTK();
#ifdef MOZ_X11
XScreenSaverInfo* mXssInfo;
#endif
protected:
nsUserIdleServiceGTK();
};
#endif // nsUserIdleServiceGTK_h__