[server] Add a static OutputInterface::get(wl_resource*)

Allows to retrieve the OutputInterface* for a given native wl_resource.
To support this we need to track the resources bound for each Output.
This commit is contained in:
Martin Gräßlin 2015-08-31 14:43:09 +02:00
parent 4b9ee54d66
commit 9d6df1f92a
2 changed files with 33 additions and 0 deletions

View file

@ -21,6 +21,8 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
#include "global_p.h" #include "global_p.h"
#include "display.h" #include "display.h"
#include <QVector>
#include <wayland-server.h> #include <wayland-server.h>
namespace KWayland namespace KWayland
@ -38,6 +40,7 @@ public:
uint32_t version; uint32_t version;
}; };
Private(OutputInterface *q, Display *d); Private(OutputInterface *q, Display *d);
~Private();
void sendMode(wl_resource *resource, const Mode &mode); void sendMode(wl_resource *resource, const Mode &mode);
void sendDone(const ResourceData &data); void sendDone(const ResourceData &data);
void updateGeometry(); void updateGeometry();
@ -53,6 +56,8 @@ public:
QList<Mode> modes; QList<Mode> modes;
QList<ResourceData> resources; QList<ResourceData> resources;
static OutputInterface *get(wl_resource *native);
private: private:
static void unbind(wl_resource *resource); static void unbind(wl_resource *resource);
void bind(wl_client *client, uint32_t version, uint32_t id) override; void bind(wl_client *client, uint32_t version, uint32_t id) override;
@ -62,12 +67,33 @@ private:
void sendScale(const ResourceData &data); void sendScale(const ResourceData &data);
OutputInterface *q; OutputInterface *q;
static QVector<Private*> s_privates;
}; };
QVector<OutputInterface::Private*> OutputInterface::Private::s_privates;
OutputInterface::Private::Private(OutputInterface *q, Display *d) OutputInterface::Private::Private(OutputInterface *q, Display *d)
: Global::Private(d, &wl_output_interface, s_version) : Global::Private(d, &wl_output_interface, s_version)
, q(q) , q(q)
{ {
s_privates << this;
}
OutputInterface::Private::~Private()
{
s_privates.removeAll(this);
}
OutputInterface *OutputInterface::Private::get(wl_resource *native)
{
for (auto it = s_privates.constBegin(); it != s_privates.constEnd(); ++it) {
const auto &resources = (*it)->resources;
auto rit = std::find_if(resources.begin(), resources.end(), [native] (const ResourceData &data) { return data.resource == native; });
if (rit != resources.end()) {
return (*it)->q;
}
}
return nullptr;
} }
OutputInterface::OutputInterface(Display *display, QObject *parent) OutputInterface::OutputInterface(Display *display, QObject *parent)
@ -432,6 +458,11 @@ QList< OutputInterface::Mode > OutputInterface::modes() const
return d->modes; return d->modes;
} }
OutputInterface *OutputInterface::get(wl_resource* native)
{
return Private::get(native);
}
OutputInterface::Private *OutputInterface::d_func() const OutputInterface::Private *OutputInterface::d_func() const
{ {
return reinterpret_cast<Private*>(d.data()); return reinterpret_cast<Private*>(d.data());

View file

@ -100,6 +100,8 @@ public:
void addMode(const QSize &size, ModeFlags flags = ModeFlags(), int refreshRate = 60000); void addMode(const QSize &size, ModeFlags flags = ModeFlags(), int refreshRate = 60000);
void setCurrentMode(const QSize &size, int refreshRate = 60000); void setCurrentMode(const QSize &size, int refreshRate = 60000);
static OutputInterface *get(wl_resource *native);
Q_SIGNALS: Q_SIGNALS:
void physicalSizeChanged(const QSize&); void physicalSizeChanged(const QSize&);
void globalPositionChanged(const QPoint&); void globalPositionChanged(const QPoint&);