You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Viewport.h 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
  2. * Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB
  3. *
  4. * This is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This software is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this software; if not, write to the Free Software
  16. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  17. * USA.
  18. */
  19. #ifndef __VIEWPORT_H__
  20. #define __VIEWPORT_H__
  21. #include <map>
  22. #include <FL/Fl.H>
  23. #include <FL/Fl_Widget.H>
  24. #include <FL/Fl_Menu_Button.H>
  25. #include <FL/Fl_RGB_Image.H>
  26. #include <rfb/Rect.h>
  27. #include <rfb/Region.h>
  28. #include <rfb/Timer.h>
  29. #include <rfb/PixelBuffer.h>
  30. #include <rfb/PixelTransformer.h>
  31. #if defined(WIN32)
  32. #include "PlatformPixelBuffer.h"
  33. #elif defined(__APPLE__)
  34. #include "PlatformPixelBuffer.h"
  35. #else
  36. #include "PlatformPixelBuffer.h"
  37. #endif
  38. class CConn;
  39. class Viewport : public Fl_Widget {
  40. public:
  41. Viewport(int w, int h, const rfb::PixelFormat& serverPF, CConn* cc_);
  42. ~Viewport();
  43. // PixelFormat of incoming write operations
  44. void setServerPF(const rfb::PixelFormat& pf);
  45. // Most efficient format (from Viewport's point of view)
  46. const rfb::PixelFormat &getPreferredPF();
  47. // Flush updates to screen
  48. void updateWindow();
  49. // Methods forwarded from CConn
  50. void setName(const char *name);
  51. void setColourMapEntries(int firstColour, int nColours, rdr::U16* rgbs);
  52. void fillRect(const rfb::Rect& r, rfb::Pixel pix) {
  53. if (pixelTrans) {
  54. rfb::Pixel pix2;
  55. pixelTrans->translatePixels(&pix, &pix2, 1);
  56. pix = pix2;
  57. }
  58. frameBuffer->fillRect(r, pix);
  59. damageRect(r);
  60. }
  61. void imageRect(const rfb::Rect& r, void* pixels) {
  62. if (pixelTrans)
  63. pixelTrans->translateRect(pixels, r.width(),
  64. rfb::Rect(0, 0, r.width(), r.height()),
  65. frameBuffer->data, frameBuffer->getStride(),
  66. r.tl);
  67. else
  68. frameBuffer->imageRect(r, pixels);
  69. damageRect(r);
  70. }
  71. void copyRect(const rfb::Rect& r, int srcX, int srcY) {
  72. frameBuffer->copyRect(r, rfb::Point(r.tl.x-srcX, r.tl.y-srcY));
  73. damageRect(r);
  74. }
  75. void setCursor(int width, int height, const rfb::Point& hotspot,
  76. void* data, void* mask);
  77. // Fl_Widget callback methods
  78. void draw();
  79. void resize(int x, int y, int w, int h);
  80. int handle(int event);
  81. private:
  82. void damageRect(const rfb::Rect& r) {
  83. damage.assign_union(rfb::Region(r));
  84. if (!Fl::has_timeout(handleUpdateTimeout, this))
  85. Fl::add_timeout(0.100, handleUpdateTimeout, this);
  86. };
  87. static void handleUpdateTimeout(void *data);
  88. static void handleColourMap(void *data);
  89. static void handleClipboardChange(int source, void *data);
  90. void handlePointerEvent(const rfb::Point& pos, int buttonMask);
  91. static void handlePointerTimeout(void *data);
  92. rdr::U32 translateKeyEvent(int keyCode, int origKeyCode, const char *keyText);
  93. void handleKeyEvent(int keyCode, int origKeyCode, const char *keyText, bool down);
  94. void initContextMenu();
  95. void popupContextMenu();
  96. void setMenuKey();
  97. static void handleOptions(void *data);
  98. private:
  99. CConn* cc;
  100. PlatformPixelBuffer* frameBuffer;
  101. rfb::PixelTransformer *pixelTrans;
  102. rfb::SimpleColourMap colourMap;
  103. rfb::Region damage;
  104. rfb::Point lastPointerPos;
  105. int lastButtonMask;
  106. typedef std::map<int, rdr::U32> DownMap;
  107. DownMap downKeySym;
  108. int menuKeyCode;
  109. Fl_Menu_Button *contextMenu;
  110. Fl_RGB_Image *cursor;
  111. rfb::Point cursorHotspot;
  112. };
  113. #endif