gecko-dev/widget/GfxInfoCollector.h
Emilio Cobos Álvarez 31d3fcdb9b Bug 1767172 - Remove custom screen info handling from GfxInfo, use ScreenManager for that. r=jrmuizel,handyman,stransky
This removes a bunch of custom code from GfxInfo to obtain screen
information, and instead collects that screen information in
ScreenManager.

This, apart of removing duplicated code, has the extra benefit of
reporting multi-monitor information on GTK (and potentially in the
future reporting scale and refresh rate properly as well, I've kept the
telemetry as it was on that regard).

Differential Revision: https://phabricator.services.mozilla.com/D145178
2022-05-06 23:37:25 +00:00

89 lines
2.2 KiB
C++

/* vim: se cin sw=2 ts=2 et : */
/* -*- 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/. */
#ifndef __mozilla_widget_GfxInfoCollector_h__
#define __mozilla_widget_GfxInfoCollector_h__
#include "mozilla/Attributes.h"
#include "nsStringFwd.h"
#include "js/RootingAPI.h"
namespace mozilla {
namespace widget {
/* this is handy wrapper around JSAPI to make it more pleasant to use.
* We collect the JSAPI errors and so that callers don't need to */
class MOZ_STACK_CLASS InfoObject {
friend class GfxInfoBase;
public:
void DefineProperty(const char* name, int value);
void DefineProperty(const char* name, const nsAString& value);
void DefineProperty(const char* name, const char* value);
private:
// We need to ensure that this object lives on the stack so that GC sees it
// properly
explicit InfoObject(JSContext* aCx);
InfoObject(InfoObject&);
JSContext* mCx;
JS::Rooted<JSObject*> mObj;
bool mOk;
};
/*
Here's an example usage:
class Foo {
Foo::Foo() : mInfoCollector(this, &Foo::GetAweseomeness) {}
void GetAwesomeness(InfoObject &obj) {
obj.DefineProperty("awesome", mAwesome);
}
int mAwesome;
GfxInfoCollector<Foo> mInfoCollector;
}
This will define a property on the object
returned from calling getInfo() on a
GfxInfo object. e.g.
gfxInfo = Cc["@mozilla.org/gfx/info;1"].getService(Ci.nsIGfxInfo);
info = gfxInfo.getInfo();
if (info.awesome)
alert(info.awesome);
*/
class GfxInfoCollectorBase {
public:
GfxInfoCollectorBase();
virtual void GetInfo(InfoObject& obj) = 0;
virtual ~GfxInfoCollectorBase();
};
template <class T>
class GfxInfoCollector : public GfxInfoCollectorBase {
public:
GfxInfoCollector(T* aPointer, void (T::*aFunc)(InfoObject& obj))
: mPointer(aPointer), mFunc(aFunc) {}
virtual void GetInfo(InfoObject& obj) override { (mPointer->*mFunc)(obj); }
protected:
T* mPointer;
void (T::*mFunc)(InfoObject& obj);
};
} // namespace widget
} // namespace mozilla
#endif