ROOT logo
// @(#)root/gl:$Id$
// Author:  Timur Pocheptsov, Jun 2007

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TGLWidget
#define ROOT_TGLWidget

#include <utility>
#include <memory>
#include <set>

#ifndef ROOT_TGLContext
#include "TGLContext.h"
#endif
#ifndef ROOT_TVirtualGL
#include "TVirtualGL.h"
#endif
#ifndef ROOT_TGLFormat
#include "TGLFormat.h"
#endif
#ifndef ROOT_TGFrame
#include "TGFrame.h"
#endif

class TGLWidget;
class TGEventHandler;

class TGLWidget : public TGFrame, public TGLPaintDevice
{
   friend class TGLContext;

private:
   TGLContext                       *fGLContext;
   //fInnerData is for X11 - <dpy, visualInfo> pair.
   std::pair<void *, void *>         fInnerData;
   Int_t                             fWindowIndex;

   TGLFormat                         fGLFormat;
   //fFromCtor checks that SetFormat was called only from ctor.
   Bool_t                            fFromInit;

   std::set<TGLContext *>            fValidContexts;

   TGEventHandler                   *fEventHandler;

public:
   static TGLWidget* CreateDummy();

   static TGLWidget* Create(const TGWindow* parent, Bool_t selectInput,
             Bool_t shareDefault, const TGLPaintDevice *shareDevice,
             UInt_t width, UInt_t height);

   static TGLWidget* Create(const TGLFormat &format,
             const TGWindow* parent, Bool_t selectInput,
             Bool_t shareDefault, const TGLPaintDevice *shareDevice,
             UInt_t width, UInt_t height);

   ~TGLWidget();

   virtual void      InitGL();
   virtual void      PaintGL();

   Bool_t            MakeCurrent();
   Bool_t            ClearCurrent();
   void              SwapBuffers();
   const TGLContext *GetContext()const;

   const  TGLFormat *GetPixelFormat()const;

   //This function is public _ONLY_ for calls
   //via gInterpreter. Do not call it directly.
   void              SetFormat();
   //To repaint gl-widget without GUI events.
   void              ExtractViewport(Int_t *vp)const;

   TGEventHandler   *GetEventHandler() const { return fEventHandler; }
   void              SetEventHandler(TGEventHandler *eh);

   Bool_t HandleButton(Event_t *ev);
   Bool_t HandleDoubleClick(Event_t *ev);
   Bool_t HandleConfigureNotify(Event_t *ev);
   Bool_t HandleKey(Event_t *ev);
   Bool_t HandleMotion(Event_t *ev);
   Bool_t HandleFocusChange(Event_t *);
   Bool_t HandleCrossing(Event_t *);

   void   DoRedraw();

private:
   TGLWidget(const TGLWidget &);              // Not implemented.
   TGLWidget &operator = (const TGLWidget &); // Not implemented.

protected:
   TGLWidget(Window_t glw, const TGWindow* parent, Bool_t selectInput);

   static Window_t CreateWindow(const TGWindow* parent, const TGLFormat &format,
                                UInt_t width, UInt_t height,
                                std::pair<void *, void *>& innerData);

   void AddContext(TGLContext *ctx);
   void RemoveContext(TGLContext *ctx);

   std::pair<void *, void *> GetInnerData()const;

   ClassDef(TGLWidget, 0); //Window (widget) version of TGLPaintDevice
};

#endif
 TGLWidget.h:1
 TGLWidget.h:2
 TGLWidget.h:3
 TGLWidget.h:4
 TGLWidget.h:5
 TGLWidget.h:6
 TGLWidget.h:7
 TGLWidget.h:8
 TGLWidget.h:9
 TGLWidget.h:10
 TGLWidget.h:11
 TGLWidget.h:12
 TGLWidget.h:13
 TGLWidget.h:14
 TGLWidget.h:15
 TGLWidget.h:16
 TGLWidget.h:17
 TGLWidget.h:18
 TGLWidget.h:19
 TGLWidget.h:20
 TGLWidget.h:21
 TGLWidget.h:22
 TGLWidget.h:23
 TGLWidget.h:24
 TGLWidget.h:25
 TGLWidget.h:26
 TGLWidget.h:27
 TGLWidget.h:28
 TGLWidget.h:29
 TGLWidget.h:30
 TGLWidget.h:31
 TGLWidget.h:32
 TGLWidget.h:33
 TGLWidget.h:34
 TGLWidget.h:35
 TGLWidget.h:36
 TGLWidget.h:37
 TGLWidget.h:38
 TGLWidget.h:39
 TGLWidget.h:40
 TGLWidget.h:41
 TGLWidget.h:42
 TGLWidget.h:43
 TGLWidget.h:44
 TGLWidget.h:45
 TGLWidget.h:46
 TGLWidget.h:47
 TGLWidget.h:48
 TGLWidget.h:49
 TGLWidget.h:50
 TGLWidget.h:51
 TGLWidget.h:52
 TGLWidget.h:53
 TGLWidget.h:54
 TGLWidget.h:55
 TGLWidget.h:56
 TGLWidget.h:57
 TGLWidget.h:58
 TGLWidget.h:59
 TGLWidget.h:60
 TGLWidget.h:61
 TGLWidget.h:62
 TGLWidget.h:63
 TGLWidget.h:64
 TGLWidget.h:65
 TGLWidget.h:66
 TGLWidget.h:67
 TGLWidget.h:68
 TGLWidget.h:69
 TGLWidget.h:70
 TGLWidget.h:71
 TGLWidget.h:72
 TGLWidget.h:73
 TGLWidget.h:74
 TGLWidget.h:75
 TGLWidget.h:76
 TGLWidget.h:77
 TGLWidget.h:78
 TGLWidget.h:79
 TGLWidget.h:80
 TGLWidget.h:81
 TGLWidget.h:82
 TGLWidget.h:83
 TGLWidget.h:84
 TGLWidget.h:85
 TGLWidget.h:86
 TGLWidget.h:87
 TGLWidget.h:88
 TGLWidget.h:89
 TGLWidget.h:90
 TGLWidget.h:91
 TGLWidget.h:92
 TGLWidget.h:93
 TGLWidget.h:94
 TGLWidget.h:95
 TGLWidget.h:96
 TGLWidget.h:97
 TGLWidget.h:98
 TGLWidget.h:99
 TGLWidget.h:100
 TGLWidget.h:101
 TGLWidget.h:102
 TGLWidget.h:103
 TGLWidget.h:104
 TGLWidget.h:105
 TGLWidget.h:106
 TGLWidget.h:107
 TGLWidget.h:108
 TGLWidget.h:109
 TGLWidget.h:110
 TGLWidget.h:111
 TGLWidget.h:112
 TGLWidget.h:113
 TGLWidget.h:114
 TGLWidget.h:115