[kwin_wayland] Hold the currently entered Surface in Pointer

This commit is contained in:
Martin Gräßlin 2014-08-22 11:17:16 +02:00
parent 94654a12dd
commit 9bde3bf0ce
2 changed files with 29 additions and 4 deletions

View file

@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#include "pointer.h"
#include "surface.h"
#include <QPointF>
@ -37,6 +38,7 @@ const wl_pointer_listener Pointer::s_listener = {
Pointer::Pointer(QObject *parent)
: QObject(parent)
, m_pointer(nullptr)
, m_enteredSurface(nullptr)
{
}
@ -65,18 +67,29 @@ void Pointer::setup(wl_pointer *pointer)
void Pointer::enterCallback(void *data, wl_pointer *pointer, uint32_t serial, wl_surface *surface,
wl_fixed_t sx, wl_fixed_t sy)
{
Q_UNUSED(surface)
Pointer *p = reinterpret_cast<Pointer*>(data);
Q_ASSERT(p->m_pointer == pointer);
emit p->entered(serial, QPointF(wl_fixed_to_double(sx), wl_fixed_to_double(sy)));
p->enter(serial, surface, QPointF(wl_fixed_to_double(sx), wl_fixed_to_double(sy)));
}
void Pointer::enter(uint32_t serial, wl_surface *surface, const QPointF &relativeToSurface)
{
m_enteredSurface = Surface::get(surface);
emit entered(serial, relativeToSurface);
}
void Pointer::leaveCallback(void *data, wl_pointer *pointer, uint32_t serial, wl_surface *surface)
{
Q_UNUSED(surface)
Pointer *p = reinterpret_cast<Pointer*>(data);
Q_ASSERT(p->m_pointer == pointer);
emit p->left(serial);
Q_ASSERT(*(p->m_enteredSurface) == surface);
p->leave(serial);
}
void Pointer::leave(uint32_t serial)
{
m_enteredSurface = nullptr;
emit left(serial);
}
void Pointer::motionCallback(void *data, wl_pointer *pointer, uint32_t time, wl_fixed_t sx, wl_fixed_t sy)

View file

@ -28,6 +28,8 @@ namespace KWin
namespace Wayland
{
class Surface;
class Pointer : public QObject
{
Q_OBJECT
@ -49,6 +51,13 @@ public:
void setup(wl_pointer *pointer);
void release();
Surface *enteredSurface() const {
return m_enteredSurface;
}
Surface *enteredSurface(){
return m_enteredSurface;
}
operator wl_pointer*() {
return m_pointer;
}
@ -72,7 +81,10 @@ Q_SIGNALS:
void axisChanged(quint32 time, Axis axis, qreal delta);
private:
void enter(uint32_t serial, wl_surface *surface, const QPointF &relativeToSurface);
void leave(uint32_t serial);
wl_pointer *m_pointer;
Surface *m_enteredSurface;
static const wl_pointer_listener s_listener;
};