/*
Copyright (C) 2009 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see .
*/
#ifndef _H_CURSOR_CHANNEL
#define _H_CURSOR_CHANNEL
#include "red_channel.h"
#include "cache.hpp"
#include "cursor.h"
#include "screen_layer.h"
class ChannelFactory;
class CursorChannel;
class DisplayChannel;
class CursorCacheTreat {
public:
static inline CursorData* get(CursorData* cursor)
{
return cursor->ref();
}
static inline void release(CursorData* cursor)
{
cursor->unref();
}
static const char* name() { return "cursor";}
};
typedef Cache CursorCache;
class CursorChannel: public RedChannel, public ScreenLayer {
public:
CursorChannel(RedClient& client, uint32_t id);
virtual ~CursorChannel();
static ChannelFactory& Factory();
void on_mouse_mode_change();
void attach_display(DisplayChannel* channel);
void detach_display();
protected:
virtual void on_connect();
virtual void on_disconnect();
private:
static void create_native_cursor(CursorData* cursor);
void update_display_cursor();
void set_cursor(SpiceCursor& red_cursor, int data_size, int x, int y, bool visible);
void remove_cursor();
virtual void copy_pixels(const QRegion& dest_region, RedDrawable& dest_dc);
void handle_init(RedPeer::InMessage* message);
void handle_reset(RedPeer::InMessage* message);
void handle_cursor_set(RedPeer::InMessage* message);
void handle_cursor_move(RedPeer::InMessage* message);
void handle_cursor_hide(RedPeer::InMessage* message);
void handle_cursor_trail(RedPeer::InMessage* message);
void handle_inval_one(RedPeer::InMessage* message);
void handle_inval_all(RedPeer::InMessage* message);
friend class AttachDispayEvent;
friend class CursorUpdateEvent;
private:
CursorCache _cursor_cache;
CursorData* _cursor;
SpicePoint _hot_pos;
SpiceRect _cursor_rect;
Mutex _update_lock;
bool _cursor_visible;
DisplayChannel* _display_channel;
};
#endif