summaryrefslogtreecommitdiffstats
path: root/client/screen.h
diff options
context:
space:
mode:
authorYaniv Kamay <ykamay@redhat.com>2009-09-19 21:25:46 +0300
committerYaniv Kamay <ykamay@redhat.com>2009-10-14 15:06:41 +0200
commitc1b79eb035fa158fb2ac3bc8e559809611070016 (patch)
tree3348dd749a700dedf87c9b16fe8be77c62928df8 /client/screen.h
downloadspice-c1b79eb035fa158fb2ac3bc8e559809611070016.tar.gz
spice-c1b79eb035fa158fb2ac3bc8e559809611070016.tar.xz
spice-c1b79eb035fa158fb2ac3bc8e559809611070016.zip
fresh start
Diffstat (limited to 'client/screen.h')
-rw-r--r--client/screen.h181
1 files changed, 181 insertions, 0 deletions
diff --git a/client/screen.h b/client/screen.h
new file mode 100644
index 00000000..761ae244
--- /dev/null
+++ b/client/screen.h
@@ -0,0 +1,181 @@
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of
+ the License, or (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _H_SCREEN
+#define _H_SCREEN
+
+#include "common.h"
+#include "region.h"
+#include "red_key.h"
+#include "GL/gl.h"
+
+#include "red_window.h"
+#include "platform.h"
+#include "events_loop.h"
+#include "threads.h"
+
+class Application;
+class ScreenLayer;
+class Monitor;
+
+enum {
+ SCREEN_LAYER_DISPLAY,
+ SCREEN_LAYER_CURSOR,
+ SCREEN_LAYER_GUI,
+};
+
+class RedScreen: public RedWindow::Listener {
+public:
+ RedScreen(Application& owner, int id, const std::wstring& name, int width, int height);
+
+ RedScreen* ref();
+ void unref();
+
+ void attach_layer(ScreenLayer& layer);
+ void detach_layer(ScreenLayer& layer);
+ void set_mode(int width, int height, int depth);
+ void set_name(const std::wstring& name);
+ uint64_t invalidate(const Rect& rect, bool urgent);
+ void invalidate(const QRegion &region);
+ void relase_inputs();
+ void capture_inputs();
+ bool is_captured() { return _captured;}
+ bool intercepts_sys_key() { return _key_interception;}
+ Point get_size() { return _size;}
+ bool has_monitor() { return _monitor != 0;}
+ void set_monitor(Monitor *monitor) { _monitor = monitor;}
+ Monitor* get_monitor() { return _monitor;}
+ RedWindow* get_window() { return &_window;}
+ void set_cursor(CursorData* cursor);
+ void exit_full_screen();
+ void minimize();
+ void show(bool activate, RedScreen* pos);
+ void show_full_screen();
+ void position_full_screen(const Point& position);
+ void hide();
+ void show();
+ void activate();
+ void external_show();
+
+ int get_id() { return _id;}
+ int get_screen_id();
+
+#ifdef USE_OGL
+ void untouch_context();
+ bool need_recreate_context_gl();
+#endif
+ void set_update_interrupt_trigger(EventsLoop::Trigger *trigger);
+ bool update_by_interrupt();
+ void interrupt_update();
+ void set_type_gl();
+ void unset_type_gl();
+
+ void update();
+
+private:
+ friend void periodic_update_proc(void *opaque, TimerID timer);
+ friend class UpdateEvent;
+
+ virtual ~RedScreen();
+ void create_composit_area();
+
+ void destroy_composit_area();
+ void erase_background(RedDrawable& dc, const QRegion& region);
+ void notify_new_size();
+ void adjust_window_rect(int x, int y);
+ void save_position();
+ bool is_out_of_sync() { return _out_of_sync;}
+ void __show_full_screen();
+
+ bool _invalidate(const Rect& rect, bool urgent, uint64_t& update_mark);
+ void begin_update(QRegion& direct_rgn, QRegion& composit_rgn, QRegion& frame_rgn);
+ void update_composit(QRegion& composit_rgn);
+ void draw_direct(RedDrawable& win_dc, QRegion& direct_rgn, QRegion& composit_rgn,
+ QRegion& frame_rgn);
+ void activate_timer();
+ void update_done();
+ void periodic_update();
+ bool is_dirty() {return !region_is_empty(&_dirty_region);}
+ void composit_to_screen(RedDrawable& win_dc, const QRegion& region);
+
+ void reset_mouse_pos();
+ bool mouse_is_captured() { return _captured;}
+ void update_active_cursor();
+
+ virtual void on_exposed_rect(const Rect& area);
+ virtual void on_mouse_motion(int x, int y, unsigned int buttons_state);
+ virtual void on_key_press(RedKey key);
+ virtual void on_key_release(RedKey key);
+ virtual void on_button_press(RedButton button, unsigned int buttons_state);
+ virtual void on_button_release(RedButton button, unsigned int buttons_state);
+ virtual void on_deactivate();
+ virtual void on_activate();
+ virtual void on_pointer_enter();
+ virtual void on_pointer_leave();
+ virtual void on_start_key_interception() { _key_interception = true;}
+ virtual void on_stop_key_interception() { _key_interception = false;}
+ virtual void enter_modal_loop();
+ virtual void exit_modal_loop();
+
+ virtual void pre_migrate();
+ virtual void post_migrate();
+
+private:
+ Application& _owner;
+ int _id;
+ int _refs;
+ std::wstring _name;
+ RedWindow _window;
+ std::vector<ScreenLayer*> _layes;
+ QRegion _dirty_region;
+ RecurciveMutex _update_lock;
+ bool _active;
+ bool _captured;
+ bool _full_screen;
+ bool _out_of_sync;
+ bool _frame_area;
+ bool _cursor_visible;
+ bool _periodic_update;
+ bool _key_interception;
+ bool _update_by_timer;
+ int _forec_update_timer;
+ TimerID _update_timer;
+ RedDrawable* _composit_area;
+ uint64_t _update_mark;
+
+ Point _size;
+ Point _origin;
+ Point _mouse_anchor_point;
+ Point _save_pos;
+ Monitor* _monitor;
+
+ LocalCursor* _default_cursor;
+ LocalCursor* _active_cursor;
+ LocalCursor* _inactive_cursor;
+
+ enum PointerLocation {
+ POINTER_IN_ACTIVE_AREA,
+ POINTER_IN_FRAME_AREA,
+ POINTER_OUTSIDE_WINDOW,
+ };
+ PointerLocation _pointer_location;
+ int _pixel_format_index;
+ EventsLoop::Trigger *_update_interrupt_trigger;
+};
+
+#endif
+