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