1 // @(#)root/base:$Id$ 2 // Author: Fons Rademakers 3/12/95 3 4 /************************************************************************* 5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. * 6 * All rights reserved. * 7 * * 8 * For the licensing terms see $ROOTSYS/LICENSE. * 9 * For the list of contributors see $ROOTSYS/README/CREDITS. * 10 *************************************************************************/ 11 12 #ifndef ROOT_TVirtualX 13 #define ROOT_TVirtualX 14 15 16 ////////////////////////////////////////////////////////////////////////// 17 // // 18 // TVirtualX // 19 // // 20 // Semi-Abstract base class defining a generic interface to the // 21 // underlying, low level, graphics system (X11, Win32, MacOS). // 22 // An instance of TVirtualX itself defines a batch interface to the // 23 // graphics system. // 24 // // 25 ////////////////////////////////////////////////////////////////////////// 26 27 #include <utility> 28 #include <vector> 29 30 #ifndef ROOT_TNamed 31 #include "TNamed.h" 32 #endif 33 #ifndef ROOT_TAttLine 34 #include "TAttLine.h" 35 #endif 36 #ifndef ROOT_TAttFill 37 #include "TAttFill.h" 38 #endif 39 #ifndef ROOT_TAttText 40 #include "TAttText.h" 41 #endif 42 #ifndef ROOT_TAttMarker 43 #include "TAttMarker.h" 44 #endif 45 #ifndef ROOT_GuiTypes 46 #include "GuiTypes.h" 47 #endif 48 49 50 // WM Atoms are initialized in TGClient 51 R__EXTERN Atom_t gWM_DELETE_WINDOW; 52 R__EXTERN Atom_t gMOTIF_WM_HINTS; 53 R__EXTERN Atom_t gROOT_MESSAGE; 54 55 const int kNumCursors = 19; 56 enum ECursor { kBottomLeft, kBottomRight, kTopLeft, kTopRight, 57 kBottomSide, kLeftSide, kTopSide, kRightSide, 58 kMove, kCross, kArrowHor, kArrowVer, kHand, kRotate, 59 kPointer, kArrowRight, kCaret, kWatch, kNoDrop }; 60 61 class TPoint; 62 class TString; 63 class TGWin32Command; 64 #ifdef __cplusplus 65 class GLUtesselator; 66 #else 67 extern "C" { struct GLUtesselator; } 68 #endif 69 70 class TVirtualX : public TNamed, public TAttLine, public TAttFill, public TAttText, public TAttMarker { 71 72 public: 73 enum EDrawMode { kCopy = 1, kXor, kInvert }; 74 enum EBoxMode { kHollow, kFilled }; 75 enum ETextMode { kClear, kOpaque }; 76 enum ETextSetMode { kCheck, kLoad }; 77 78 protected: 79 EDrawMode fDrawMode; //Drawing mode 80 81 public: 82 TVirtualX(): fDrawMode() { } 83 TVirtualX(const char *name, const char *title); 84 virtual ~TVirtualX() { } 85 86 virtual Bool_t Init(void *display=0); 87 virtual void ClearWindow(); 88 virtual void ClosePixmap(); 89 virtual void CloseWindow(); 90 virtual void CopyPixmap(Int_t wid, Int_t xpos, Int_t ypos); 91 virtual void CreateOpenGLContext(Int_t wid=0); 92 virtual void DeleteOpenGLContext(Int_t wid=0); 93 94 //---- OpenGL related stuff, required only with R__HAS_COCOA ---- 95 virtual Double_t GetOpenGLScalingFactor(); 96 virtual Window_t CreateOpenGLWindow(Window_t parentID, UInt_t width, UInt_t height, const std::vector<std::pair<UInt_t, Int_t> > &format); 97 virtual Handle_t CreateOpenGLContext(Window_t windowID, Handle_t sharedContext); 98 virtual Bool_t MakeOpenGLContextCurrent(Handle_t ctx, Window_t windowID); 99 virtual Handle_t GetCurrentOpenGLContext(); 100 virtual void FlushOpenGLBuffer(Handle_t ctx); 101 102 virtual void DrawBox(Int_t x1, Int_t y1, Int_t x2, Int_t y2, EBoxMode mode); 103 virtual void DrawCellArray(Int_t x1, Int_t y1, Int_t x2, Int_t y2, 104 Int_t nx, Int_t ny, Int_t *ic); 105 virtual void DrawFillArea(Int_t n, TPoint *xy); 106 virtual void DrawLine(Int_t x1, Int_t y1, Int_t x2, Int_t y2); 107 virtual void DrawPolyLine(Int_t n, TPoint *xy); 108 virtual void DrawPolyMarker(Int_t n, TPoint *xy); 109 virtual void DrawText(Int_t x, Int_t y, Float_t angle, Float_t mgn, const char *text, 110 ETextMode mode); 111 virtual void DrawText(Int_t x, Int_t y, Float_t angle, Float_t mgn, const wchar_t *text, 112 ETextMode mode); 113 virtual UInt_t ExecCommand(TGWin32Command *code); 114 virtual void GetCharacterUp(Float_t &chupx, Float_t &chupy); 115 EDrawMode GetDrawMode() { return fDrawMode; } 116 virtual Int_t GetDoubleBuffer(Int_t wid); 117 virtual void GetGeometry(Int_t wid, Int_t &x, Int_t &y, UInt_t &w, UInt_t &h); 118 virtual const char *DisplayName(const char * = 0); 119 virtual Handle_t GetNativeEvent() const; 120 virtual ULong_t GetPixel(Color_t cindex); 121 virtual void GetPlanes(Int_t &nplanes); 122 virtual void GetRGB(Int_t index, Float_t &r, Float_t &g, Float_t &b); 123 virtual void GetTextExtent(UInt_t &w, UInt_t &h, char *mess); 124 virtual void GetTextExtent(UInt_t &w, UInt_t &h, wchar_t *mess); 125 virtual Int_t GetFontAscent() const; 126 virtual Int_t GetFontAscent(const char *mess) const; 127 virtual Int_t GetFontDescent() const; 128 virtual Int_t GetFontDescent(const char *mess) const; 129 virtual Float_t GetTextMagnitude(); 130 virtual Window_t GetWindowID(Int_t wid); 131 virtual Bool_t HasTTFonts() const; 132 virtual Int_t InitWindow(ULong_t window); 133 virtual Int_t AddWindow(ULong_t qwid, UInt_t w, UInt_t h); 134 virtual Int_t AddPixmap(ULong_t pixid, UInt_t w, UInt_t h); 135 virtual void RemoveWindow(ULong_t qwid); 136 virtual void MoveWindow(Int_t wid, Int_t x, Int_t y); 137 virtual Int_t OpenPixmap(UInt_t w, UInt_t h); 138 virtual void QueryPointer(Int_t &ix, Int_t &iy); 139 virtual Pixmap_t ReadGIF(Int_t x0, Int_t y0, const char *file, Window_t id=0); 140 virtual Int_t RequestLocator(Int_t mode, Int_t ctyp, Int_t &x, Int_t &y); 141 virtual Int_t RequestString(Int_t x, Int_t y, char *text); 142 virtual void RescaleWindow(Int_t wid, UInt_t w, UInt_t h); 143 virtual Int_t ResizePixmap(Int_t wid, UInt_t w, UInt_t h); 144 virtual void ResizeWindow(Int_t wid); 145 virtual void SelectWindow(Int_t wid); 146 virtual void SelectPixmap(Int_t qpixid); 147 virtual void SetCharacterUp(Float_t chupx, Float_t chupy); 148 virtual void SetClipOFF(Int_t wid); 149 virtual void SetClipRegion(Int_t wid, Int_t x, Int_t y, UInt_t w, UInt_t h); 150 virtual void SetCursor(Int_t win, ECursor cursor); 151 virtual void SetDoubleBuffer(Int_t wid, Int_t mode); 152 virtual void SetDoubleBufferOFF(); 153 virtual void SetDoubleBufferON(); 154 virtual void SetDrawMode(EDrawMode mode); 155 virtual void SetFillColor(Color_t cindex); 156 virtual void SetFillStyle(Style_t style); 157 virtual void SetLineColor(Color_t cindex); 158 virtual void SetLineType(Int_t n, Int_t *dash); 159 virtual void SetLineStyle(Style_t linestyle); 160 virtual void SetLineWidth(Width_t width); 161 virtual void SetMarkerColor(Color_t cindex); 162 virtual void SetMarkerSize(Float_t markersize); 163 virtual void SetMarkerStyle(Style_t markerstyle); 164 virtual void SetOpacity(Int_t percent); 165 virtual void SetRGB(Int_t cindex, Float_t r, Float_t g, Float_t b); 166 virtual void SetTextAlign(Short_t talign=11); 167 virtual void SetTextColor(Color_t cindex); 168 virtual Int_t SetTextFont(char *fontname, ETextSetMode mode); 169 virtual void SetTextFont(Font_t fontnumber); 170 virtual void SetTextMagnitude(Float_t mgn); 171 virtual void SetTextSize(Float_t textsize); 172 virtual void Sync(Int_t mode); 173 virtual void UpdateWindow(Int_t mode); 174 virtual void Warp(Int_t ix, Int_t iy, Window_t id = 0); 175 virtual Int_t WriteGIF(char *name); 176 virtual void WritePixmap(Int_t wid, UInt_t w, UInt_t h, char *pxname); 177 virtual Window_t GetCurrentWindow() const; 178 virtual Int_t SupportsExtension(const char *ext) const; 179 180 //---- Methods used for GUI ----- 181 virtual void GetWindowAttributes(Window_t id, WindowAttributes_t &attr); 182 virtual void MapWindow(Window_t id); 183 virtual void MapSubwindows(Window_t id); 184 virtual void MapRaised(Window_t id); 185 virtual void UnmapWindow(Window_t id); 186 virtual void DestroyWindow(Window_t id); 187 virtual void DestroySubwindows(Window_t id); 188 virtual void RaiseWindow(Window_t id); 189 virtual void LowerWindow(Window_t id); 190 virtual void MoveWindow(Window_t id, Int_t x, Int_t y); 191 virtual void MoveResizeWindow(Window_t id, Int_t x, Int_t y, UInt_t w, UInt_t h); 192 virtual void ResizeWindow(Window_t id, UInt_t w, UInt_t h); 193 virtual void IconifyWindow(Window_t id); 194 virtual Bool_t NeedRedraw(ULong_t tgwindow, Bool_t force); 195 virtual void ReparentWindow(Window_t id, Window_t pid, Int_t x, Int_t y); 196 virtual void SetWindowBackground(Window_t id, ULong_t color); 197 virtual void SetWindowBackgroundPixmap(Window_t id, Pixmap_t pxm); 198 virtual Window_t CreateWindow(Window_t parent, Int_t x, Int_t y, 199 UInt_t w, UInt_t h, UInt_t border, 200 Int_t depth, UInt_t clss, 201 void *visual, SetWindowAttributes_t *attr, 202 UInt_t wtype); 203 virtual Int_t OpenDisplay(const char *dpyName); 204 virtual void CloseDisplay(); 205 virtual Display_t GetDisplay() const; 206 virtual Visual_t GetVisual() const; 207 virtual Int_t GetScreen() const; 208 virtual Int_t GetDepth() const; 209 virtual UInt_t ScreenWidthMM() const; 210 virtual Colormap_t GetColormap() const; 211 virtual Atom_t InternAtom(const char *atom_name, Bool_t only_if_exist); 212 virtual Window_t GetDefaultRootWindow() const; 213 virtual Window_t GetParent(Window_t id) const; 214 virtual FontStruct_t LoadQueryFont(const char *font_name); 215 virtual FontH_t GetFontHandle(FontStruct_t fs); 216 virtual void DeleteFont(FontStruct_t fs); 217 virtual GContext_t CreateGC(Drawable_t id, GCValues_t *gval); 218 virtual void ChangeGC(GContext_t gc, GCValues_t *gval); 219 virtual void CopyGC(GContext_t org, GContext_t dest, Mask_t mask); 220 virtual void DeleteGC(GContext_t gc); 221 virtual Cursor_t CreateCursor(ECursor cursor); 222 virtual void SetCursor(Window_t id, Cursor_t curid); 223 virtual Pixmap_t CreatePixmap(Drawable_t id, UInt_t w, UInt_t h); 224 virtual Pixmap_t CreatePixmap(Drawable_t id, const char *bitmap, UInt_t width, 225 UInt_t height, ULong_t forecolor, ULong_t backcolor, 226 Int_t depth); 227 virtual Pixmap_t CreateBitmap(Drawable_t id, const char *bitmap, 228 UInt_t width, UInt_t height); 229 virtual void DeletePixmap(Pixmap_t pmap); 230 virtual Bool_t CreatePictureFromFile(Drawable_t id, const char *filename, 231 Pixmap_t &pict, Pixmap_t &pict_mask, 232 PictureAttributes_t &attr); 233 virtual Bool_t CreatePictureFromData(Drawable_t id, char **data, 234 Pixmap_t &pict, Pixmap_t &pict_mask, 235 PictureAttributes_t &attr); 236 virtual Pixmap_t CreatePixmapFromData(unsigned char *bits, UInt_t width, UInt_t height); 237 virtual Bool_t ReadPictureDataFromFile(const char *filename, char ***ret_data); 238 virtual void DeletePictureData(void *data); 239 virtual void SetDashes(GContext_t gc, Int_t offset, const char *dash_list, 240 Int_t n); 241 virtual Bool_t ParseColor(Colormap_t cmap, const char *cname, ColorStruct_t &color); 242 virtual Bool_t AllocColor(Colormap_t cmap, ColorStruct_t &color); 243 virtual void QueryColor(Colormap_t cmap, ColorStruct_t &color); 244 virtual void FreeColor(Colormap_t cmap, ULong_t pixel); 245 virtual Int_t EventsPending(); 246 virtual void NextEvent(Event_t &event); 247 virtual void Bell(Int_t percent); 248 virtual void CopyArea(Drawable_t src, Drawable_t dest, GContext_t gc, 249 Int_t src_x, Int_t src_y, UInt_t width, 250 UInt_t height, Int_t dest_x, Int_t dest_y); 251 virtual void ChangeWindowAttributes(Window_t id, SetWindowAttributes_t *attr); 252 virtual void ChangeProperty(Window_t id, Atom_t property, Atom_t type, 253 UChar_t *data, Int_t len); 254 virtual void DrawLine(Drawable_t id, GContext_t gc, Int_t x1, Int_t y1, Int_t x2, Int_t y2); 255 virtual void ClearArea(Window_t id, Int_t x, Int_t y, UInt_t w, UInt_t h); 256 virtual Bool_t CheckEvent(Window_t id, EGEventType type, Event_t &ev); 257 virtual void SendEvent(Window_t id, Event_t *ev); 258 virtual void DispatchClientMessage(UInt_t messageID); 259 virtual void WMDeleteNotify(Window_t id); 260 virtual void SetKeyAutoRepeat(Bool_t on = kTRUE); 261 virtual void GrabKey(Window_t id, Int_t keycode, UInt_t modifier, Bool_t grab = kTRUE); 262 virtual void GrabButton(Window_t id, EMouseButton button, UInt_t modifier, 263 UInt_t evmask, Window_t confine, Cursor_t cursor, 264 Bool_t grab = kTRUE); 265 virtual void GrabPointer(Window_t id, UInt_t evmask, Window_t confine, 266 Cursor_t cursor, Bool_t grab = kTRUE, 267 Bool_t owner_events = kTRUE); 268 virtual void SetWindowName(Window_t id, char *name); 269 virtual void SetIconName(Window_t id, char *name); 270 virtual void SetIconPixmap(Window_t id, Pixmap_t pix); 271 virtual void SetClassHints(Window_t id, char *className, char *resourceName); 272 virtual void SetMWMHints(Window_t id, UInt_t value, UInt_t funcs, UInt_t input); 273 virtual void SetWMPosition(Window_t id, Int_t x, Int_t y); 274 virtual void SetWMSize(Window_t id, UInt_t w, UInt_t h); 275 virtual void SetWMSizeHints(Window_t id, UInt_t wmin, UInt_t hmin, 276 UInt_t wmax, UInt_t hmax, UInt_t winc, UInt_t hinc); 277 virtual void SetWMState(Window_t id, EInitialState state); 278 virtual void SetWMTransientHint(Window_t id, Window_t main_id); 279 virtual void DrawString(Drawable_t id, GContext_t gc, Int_t x, Int_t y, 280 const char *s, Int_t len); 281 virtual Int_t TextWidth(FontStruct_t font, const char *s, Int_t len); 282 virtual void GetFontProperties(FontStruct_t font, Int_t &max_ascent, Int_t &max_descent); 283 virtual void GetGCValues(GContext_t gc, GCValues_t &gval); 284 virtual FontStruct_t GetFontStruct(FontH_t fh); 285 virtual void FreeFontStruct(FontStruct_t fs); 286 virtual void ClearWindow(Window_t id); 287 virtual Int_t KeysymToKeycode(UInt_t keysym); 288 virtual void FillRectangle(Drawable_t id, GContext_t gc, Int_t x, Int_t y, 289 UInt_t w, UInt_t h); 290 virtual void DrawRectangle(Drawable_t id, GContext_t gc, Int_t x, Int_t y, 291 UInt_t w, UInt_t h); 292 virtual void DrawSegments(Drawable_t id, GContext_t gc, Segment_t *seg, Int_t nseg); 293 virtual void SelectInput(Window_t id, UInt_t evmask); 294 virtual Window_t GetInputFocus(); 295 virtual void SetInputFocus(Window_t id); 296 virtual Window_t GetPrimarySelectionOwner(); 297 virtual void SetPrimarySelectionOwner(Window_t id); 298 virtual void ConvertPrimarySelection(Window_t id, Atom_t clipboard, Time_t when); 299 virtual void LookupString(Event_t *event, char *buf, Int_t buflen, UInt_t &keysym); 300 virtual void GetPasteBuffer(Window_t id, Atom_t atom, TString &text, Int_t &nchar, 301 Bool_t del); 302 virtual void TranslateCoordinates(Window_t src, Window_t dest, Int_t src_x,Int_t src_y, 303 Int_t &dest_x, Int_t &dest_y, Window_t &child); 304 virtual void GetWindowSize(Drawable_t id, Int_t &x, Int_t &y, UInt_t &w, UInt_t &h); 305 virtual void FillPolygon(Window_t id, GContext_t gc, Point_t *points, Int_t npnt); 306 virtual void QueryPointer(Window_t id, Window_t &rootw, Window_t &childw, 307 Int_t &root_x, Int_t &root_y, Int_t &win_x, 308 Int_t &win_y, UInt_t &mask); 309 virtual void SetForeground(GContext_t gc, ULong_t foreground); 310 virtual void SetClipRectangles(GContext_t gc, Int_t x, Int_t y, Rectangle_t *recs, Int_t n); 311 virtual void Update(Int_t mode = 0); 312 virtual Region_t CreateRegion(); 313 virtual void DestroyRegion(Region_t reg); 314 virtual void UnionRectWithRegion(Rectangle_t *rect, Region_t src, Region_t dest); 315 virtual Region_t PolygonRegion(Point_t *points, Int_t np, Bool_t winding); 316 virtual void UnionRegion(Region_t rega, Region_t regb, Region_t result); 317 virtual void IntersectRegion(Region_t rega, Region_t regb, Region_t result); 318 virtual void SubtractRegion(Region_t rega, Region_t regb, Region_t result); 319 virtual void XorRegion(Region_t rega, Region_t regb, Region_t result); 320 virtual Bool_t EmptyRegion(Region_t reg); 321 virtual Bool_t PointInRegion(Int_t x, Int_t y, Region_t reg); 322 virtual Bool_t EqualRegion(Region_t rega, Region_t regb); 323 virtual void GetRegionBox(Region_t reg, Rectangle_t *rect); 324 virtual char **ListFonts(const char *fontname, Int_t max, Int_t &count); 325 virtual void FreeFontNames(char **fontlist); 326 virtual Drawable_t CreateImage(UInt_t width, UInt_t height); 327 virtual void GetImageSize(Drawable_t id, UInt_t &width, UInt_t &height); 328 virtual void PutPixel(Drawable_t id, Int_t x, Int_t y, ULong_t pixel); 329 virtual void PutImage(Drawable_t id, GContext_t gc, Drawable_t img, Int_t dx, Int_t dy, 330 Int_t x, Int_t y, UInt_t w, UInt_t h); 331 virtual void DeleteImage(Drawable_t img); 332 virtual unsigned char *GetColorBits(Drawable_t wid, Int_t x = 0, Int_t y = 0, UInt_t w = 0, UInt_t h = 0); 333 virtual void ShapeCombineMask(Window_t id, Int_t x, Int_t y, Pixmap_t mask); 334 335 //---- Drag and Drop ----- 336 virtual void DeleteProperty(Window_t, Atom_t&); 337 virtual Int_t GetProperty(Window_t, Atom_t, Long_t, Long_t, Bool_t, Atom_t, 338 Atom_t*, Int_t*, ULong_t*, ULong_t*, unsigned char**); 339 virtual void ChangeActivePointerGrab(Window_t, UInt_t, Cursor_t); 340 virtual void ConvertSelection(Window_t, Atom_t&, Atom_t&, Atom_t&, Time_t&); 341 virtual Bool_t SetSelectionOwner(Window_t, Atom_t&); 342 virtual void ChangeProperties(Window_t id, Atom_t property, Atom_t type, 343 Int_t format, UChar_t *data, Int_t len); 344 virtual void SetDNDAware(Window_t, Atom_t *); 345 virtual void SetTypeList(Window_t win, Atom_t prop, Atom_t *typelist); 346 virtual Window_t FindRWindow(Window_t win, Window_t dragwin, Window_t input, int x, int y, int maxd); 347 virtual Bool_t IsDNDAware(Window_t win, Atom_t *typelist); 348 349 virtual void BeginModalSessionFor(Window_t window); 350 351 virtual Bool_t IsCmdThread() const { return kTRUE; } 352 353 static TVirtualX *&Instance(); 354 355 ClassDef(TVirtualX,0) //ABC defining a generic interface to graphics system 356 }; 357 358 #ifndef __CINT__ 359 #define gVirtualX (TVirtualX::Instance()) 360 R__EXTERN TVirtualX *(*gPtr2VirtualX)(); 361 #endif 362 R__EXTERN TVirtualX *gGXBatch; 363 364 #endif 365