// @(#)root/gl:$Id$
// Author: Bertrand Bellenot   29/01/2008

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGLEventHandler                                                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


#include "TGLEventHandler.h"
#include "TGEventHandler.h"
#include "TGLViewer.h"
#include "TGLWidget.h"
#include "TGWindow.h"
#include "TPoint.h"
#include "TVirtualPad.h" // Remove when pad removed - use signal
#include "TVirtualX.h"
#include "TGClient.h"
#include "TVirtualGL.h"
#include "TGLOverlay.h"
#include "TGLLogicalShape.h"
#include "TGLPhysicalShape.h"
#include "TContextMenu.h"
#include "TGToolTip.h"
#include "KeySymbols.h"
#include "TGLAnnotation.h"
#include "TEnv.h"
#include "TMath.h"
#include "RConfigure.h"

//______________________________________________________________________________
//
// Base-class and default implementation of event-handler for TGLViewer.
//
// This allows for complete disentanglement of GL-viewer from GUI
// event handling. Further, alternative event-handlers can easily be
// designed and set at run-time.
//
// The signals about object being selected or hovered above are
// emitted via the TGLViewer itself.
//
// The following rootrc settings influence the behaviour:
// OpenGL.EventHandler.ViewerCentricControls:  1
// OpenGL.EventHandler.ArrowKeyFactor:        -1.0
// OpenGL.EventHandler.MouseDragFactor:       -1.0
// OpenGL.EventHandler.MouseWheelFactor:      -1.0


ClassImp(TGLEventHandler);

//______________________________________________________________________________
TGLEventHandler::TGLEventHandler(TGWindow *w, TObject *obj) :
   TGEventHandler      ("TGLEventHandler", w, obj),
   fGLViewer           ((TGLViewer *)obj),
   fMouseTimer         (0),
   fLastPos            (-1, -1),
   fLastMouseOverPos   (-1, -1),
   fLastMouseOverShape (0),
   fTooltip            (0),
   fActiveButtonID     (0),
   fLastEventState     (0),
   fIgnoreButtonUp     (kFALSE),
   fInPointerGrab      (kFALSE),
   fMouseTimerRunning  (kFALSE),
   fTooltipShown       (kFALSE),
   fArcBall            (kFALSE),
   fTooltipPixelTolerance (3),
   fSecSelType(TGLViewer::kOnRequest),
   fDoInternalSelection(kTRUE),
   fViewerCentricControls(kFALSE)
{
   // Constructor.

   fMouseTimer = new TTimer(this, 80);
   fTooltip    = new TGToolTip(0, 0, "", 650);
   fTooltip->Hide();
   fViewerCentricControls = gEnv->GetValue("OpenGL.EventHandler.ViewerCentricControls", 0) != 0;
   fArrowKeyFactor   = gEnv->GetValue("OpenGL.EventHandler.ArrowKeyFactor",   1.0);
   fMouseDragFactor  = gEnv->GetValue("OpenGL.EventHandler.MouseDragFactor",  1.0);
   fMouseWheelFactor = gEnv->GetValue("OpenGL.EventHandler.MouseWheelFactor", 1.0);
}

//______________________________________________________________________________
TGLEventHandler::~TGLEventHandler()
{
   // Destructor.

   delete fMouseTimer;
   delete fTooltip;
}

//______________________________________________________________________________
void TGLEventHandler::GrabMouse()
{
   // Acquire mouse grab.

   if (!fInPointerGrab)
   {
      gVirtualX->GrabPointer(fGLViewer->GetGLWidget()->GetId(),
                             kButtonPressMask | kButtonReleaseMask | kPointerMotionMask,
                             kNone, kNone, kTRUE, kFALSE);
      fInPointerGrab = kTRUE;
   }
}

//______________________________________________________________________________
void TGLEventHandler::UnGrabMouse()
{
   // Release mouse grab.

   if (fInPointerGrab)
   {
      gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);
      fInPointerGrab = kFALSE;
   }
}

//______________________________________________________________________________
void TGLEventHandler::SelectForClicked(Event_t *event)
{
   // Run selection (optionally with on secondary selection) and emit
   // corresponding Clicked() signals.
   // Protected method.

   fGLViewer->RequestSelect(fLastPos.fX, fLastPos.fY);

   TGLLogicalShape  *lshp = fGLViewer->fSelRec.GetLogShape();
   TObject          *obj  = fGLViewer->fSelRec.GetObject();
      
   // secondary selection
   if (lshp && (event->fState & kKeyMod1Mask || (fSecSelType == TGLViewer::kOnRequest && lshp->AlwaysSecondarySelect())))
   {
      fGLViewer->RequestSecondarySelect(fLastPos.fX, fLastPos.fY);
      fGLViewer->fSecSelRec.SetMultiple(event->fState & kKeyControlMask);

      lshp->ProcessSelection(*fGLViewer->fRnrCtx, fGLViewer->fSecSelRec);

      switch (fGLViewer->fSecSelRec.GetSecSelResult())
      {
         case TGLSelectRecord::kEnteringSelection:
            fGLViewer->Clicked(obj, event->fCode, event->fState);
            break;
         case TGLSelectRecord::kLeavingSelection:
            fGLViewer->UnClicked(obj, event->fCode, event->fState);
            break;
         case TGLSelectRecord::kModifyingInternalSelection:
            fGLViewer->ReClicked(obj, event->fCode, event->fState);
            break;
         default:
            break;
      }
   }
   else
   {
      fGLViewer->Clicked(obj);
      fGLViewer->Clicked(obj, event->fCode, event->fState);
   }
}

//______________________________________________________________________________
void TGLEventHandler::SelectForMouseOver()
{
   // Run selection (optionally with on secondary selection) and emit
   // corresponding MouseOver() signals.
   // Protected method.

   fGLViewer->RequestSelect(fLastPos.fX, fLastPos.fY);

   TGLPhysicalShape *pshp = fGLViewer->fSelRec.GetPhysShape();
   TGLLogicalShape  *lshp = fGLViewer->fSelRec.GetLogShape();
   TObject          *obj  = fGLViewer->fSelRec.GetObject();

   if (lshp && (fSecSelType == TGLViewer::kOnRequest && lshp->AlwaysSecondarySelect()))
   {
      fGLViewer->RequestSecondarySelect(fLastPos.fX, fLastPos.fY);
      fGLViewer->fSecSelRec.SetMultiple(kFALSE);
      fGLViewer->fSecSelRec.SetHighlight(kTRUE);

      lshp->ProcessSelection(*fGLViewer->fRnrCtx, fGLViewer->fSecSelRec);

      fGLViewer->fSecSelRec.SetHighlight(kFALSE);

      switch (fGLViewer->fSecSelRec.GetSecSelResult())
      {
         case TGLSelectRecord::kEnteringSelection:
            fGLViewer->MouseOver(obj, fLastEventState);
            break;
         case TGLSelectRecord::kModifyingInternalSelection:
            fGLViewer->ReMouseOver(obj, fLastEventState);
            break;
         case TGLSelectRecord::kLeavingSelection:
            fGLViewer->UnMouseOver(obj, fLastEventState);
            break;
         default:
            break;
      }
   }
   else if (fLastMouseOverShape != pshp)
   {
      fGLViewer->MouseOver(pshp);
      fGLViewer->MouseOver(pshp, fLastEventState);
      fGLViewer->MouseOver(obj,  fLastEventState);
   }
   fLastMouseOverShape = pshp;
   fLastMouseOverPos   = fLastPos;
}

//==============================================================================

//______________________________________________________________________________
void TGLEventHandler::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
   // Process event of type 'event' - one of EEventType types,
   // occuring at window location px, py
   // This is provided for use when embedding GL viewer into pad

   /*enum EEventType {
   kNoEvent       =  0,
   kButton1Down   =  1, kButton2Down   =  2, kButton3Down   =  3, kKeyDown  =  4,
   kButton1Up     = 11, kButton2Up     = 12, kButton3Up     = 13, kKeyUp    = 14,
   kButton1Motion = 21, kButton2Motion = 22, kButton3Motion = 23, kKeyPress = 24,
   kButton1Locate = 41, kButton2Locate = 42, kButton3Locate = 43,
   kMouseMotion   = 51, kMouseEnter    = 52, kMouseLeave    = 53,
   kButton1Double = 61, kButton2Double = 62, kButton3Double = 63

   enum EGEventType {
   kGKeyPress, kKeyRelease, kButtonPress, kButtonRelease,
   kMotionNotify, kEnterNotify, kLeaveNotify, kFocusIn, kFocusOut,
   kExpose, kConfigureNotify, kMapNotify, kUnmapNotify, kDestroyNotify,
   kClientMessage, kSelectionClear, kSelectionRequest, kSelectionNotify,
   kColormapNotify, kButtonDoubleClick, kOtherEvent*/

   // Map our event EEventType (base/inc/Buttons.h) back to Event_t (base/inc/GuiTypes.h)
   // structure, and call appropriate HandleXyzz() function
   Event_t eventSt = { kOtherEvent, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                       kFALSE, 0, 0, {0, 0, 0, 0, 0} };
   eventSt.fX = px;
   eventSt.fY = py;
   eventSt.fState = 0;
   eventSt.fXRoot = eventSt.fYRoot = 0;

   if (event != kKeyPress) {
      eventSt.fY -= Int_t((1 - gPad->GetHNDC() - gPad->GetYlowNDC()) * gPad->GetWh());
      eventSt.fX -= Int_t(gPad->GetXlowNDC() * gPad->GetWw());
      eventSt.fXRoot = eventSt.fX;
      eventSt.fYRoot = eventSt.fY;
   }

   switch (event) {
      case kMouseMotion:
         eventSt.fCode = kMouseMotion;
         eventSt.fType = kMotionNotify;
         HandleMotion(&eventSt);
         break;
      case kButton1Down:
      case kButton1Up:
      {
         eventSt.fCode = kButton1;
         eventSt.fType = event == kButton1Down ? kButtonPress:kButtonRelease;
         HandleButton(&eventSt);
      }
      break;
      case kButton2Down:
      case kButton2Up:
      {
         eventSt.fCode = kButton2;
         eventSt.fType = event == kButton2Down ? kButtonPress:kButtonRelease;
         HandleButton(&eventSt);
      }
      break;
      case kButton3Down:
      {
         eventSt.fState = kKeyShiftMask;
         eventSt.fCode = kButton1;
         eventSt.fType = kButtonPress;
         HandleButton(&eventSt);
      }
      break;
      case kButton3Up:
      {
         eventSt.fCode = kButton3;
         eventSt.fType = kButtonRelease;//event == kButton3Down ? kButtonPress:kButtonRelease;
         HandleButton(&eventSt);
      }
      break;
      case kButton1Double:
      case kButton2Double:
      case kButton3Double:
      {
         eventSt.fCode = kButton1Double ? kButton1 : kButton2Double ? kButton2 : kButton3;
         eventSt.fType = kButtonDoubleClick;
         HandleDoubleClick(&eventSt);
      }
      break;
      case kButton1Motion:
      case kButton2Motion:
      case kButton3Motion:
      {

         eventSt.fCode = event == kButton1Motion ? kButton1 : event == kButton2Motion ? kButton2 : kButton3;
         eventSt.fType = kMotionNotify;
         HandleMotion(&eventSt);
      }
      break;
      case kKeyPress: // We only care about full key 'presses' not individual down/up
      {
         eventSt.fType = kGKeyPress;
         eventSt.fCode = py; // px contains key code - need modifiers from somewhere
         HandleKey(&eventSt);
      }
      break;
      case 6://trick :)
         if (fGLViewer->CurrentCamera().Zoom(+50, kFALSE, kFALSE)) { //TODO : val static const somewhere
            if (fGLViewer->fGLDevice != -1) {
               gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
               gVirtualX->SetDrawMode(TVirtualX::kCopy);
            }
            fGLViewer->RequestDraw();
         }
         break;
      case 5://trick :)
         if (fGLViewer->CurrentCamera().Zoom(-50, kFALSE, kFALSE)) { //TODO : val static const somewhere
            if (fGLViewer->fGLDevice != -1) {
               gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
               gVirtualX->SetDrawMode(TVirtualX::kCopy);
            }
            fGLViewer->RequestDraw();
         }
         break;
      case 7://trick :)
         eventSt.fState = kKeyShiftMask;
         eventSt.fCode = kButton1;
         eventSt.fType = kButtonPress;
         HandleButton(&eventSt);
         break;
      default:
      {
        // Error("TGLEventHandler::ExecuteEvent", "invalid event type");
      }
   }
}

//______________________________________________________________________________
Bool_t TGLEventHandler::HandleEvent(Event_t *event)
{
   // Handle generic Event_t type 'event' - provided to catch focus changes
   // and terminate any interaction in viewer.

   if (event->fType == kFocusIn) {
      if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
         Error("TGLEventHandler::HandleEvent", "active drag-action at focus-in.");
         fGLViewer->fDragAction = TGLViewer::kDragNone;
      }
      StartMouseTimer();
   }
   if (event->fType == kFocusOut) {
      if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
         Warning("TGLEventHandler::HandleEvent", "drag-action active at focus-out.");
         fGLViewer->fDragAction = TGLViewer::kDragNone;
      }
      StopMouseTimer();
      ClearMouseOver();
   }

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGLEventHandler::HandleFocusChange(Event_t *event)
{
   // Handle generic Event_t type 'event' - provided to catch focus changes
   // and terminate any interaction in viewer.

   fGLViewer->MouseIdle(0, 0, 0);
   if (event->fType == kFocusIn) {
      if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
         Error("TGLEventHandler::HandleFocusChange", "active drag-action at focus-in.");
         fGLViewer->fDragAction = TGLViewer::kDragNone;
      }
      StartMouseTimer();
      fGLViewer->Activated();
   }
   if (event->fType == kFocusOut) {
      if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
         Warning("TGLEventHandler::HandleFocusChange", "drag-action active at focus-out.");
         fGLViewer->fDragAction = TGLViewer::kDragNone;
      }
      StopMouseTimer();
      ClearMouseOver();
   }

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGLEventHandler::HandleCrossing(Event_t *event)
{
   // Handle generic Event_t type 'event' - provided to catch focus changes
   // and terminate any interaction in viewer.

   // Ignore grab and ungrab events.
   if (event->fCode != 0) {
      return kTRUE;
   }

   fGLViewer->MouseIdle(0, 0, 0);
   if (event->fType == kEnterNotify) {
      if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
         Error("TGLEventHandler::HandleCrossing", "active drag-action at enter-notify.");
         fGLViewer->fDragAction = TGLViewer::kDragNone;
      }
      StartMouseTimer();
      // Maybe, maybe not...
      fGLViewer->Activated();
   }
   if (event->fType == kLeaveNotify) {
      if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
         Warning("TGLEventHandler::HandleCrossing", "drag-action active at leave-notify.");
         fGLViewer->fDragAction = TGLViewer::kDragNone;
      }
      StopMouseTimer();
      ClearMouseOver();
   }

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGLEventHandler::HandleButton(Event_t * event)
{
   // Handle mouse button 'event'.

   if (fGLViewer->IsLocked()) {
      if (gDebug>2) {
         Info("TGLEventHandler::HandleButton", "ignored - viewer is %s",
              fGLViewer->LockName(fGLViewer->CurrentLock()));
      }
      return kFALSE;
   }

   // Handle mouse-wheel events first.
   if (event->fCode > kButton3)
   {
      // On Win32 only button release events come for mouse wheel.
      // Note: Modifiers (ctrl/shift) disabled as fState doesn't seem to
      // have correct modifier flags with mouse wheel under Windows.

      if (event->fType == kButtonRelease)
      {
         Bool_t redraw = kFALSE;

         Int_t zoom = TMath::Nint(fMouseWheelFactor * ControlValue(50));
         switch(event->fCode)
         {
            case kButton5: // Zoom out (dolly or adjust camera FOV).
               redraw = fGLViewer->CurrentCamera().Zoom(zoom, kFALSE, kFALSE);
               break;

            case kButton4: // Zoom in (dolly or adjust camera FOV).
               redraw = fGLViewer->CurrentCamera().Zoom(-zoom, kFALSE, kFALSE);
               break;

            case kButton6:
            case kButton7: // Ignore for now.
               break;
         }

         if (redraw)
            fGLViewer->fRedrawTimer->RequestDraw(10, TGLRnrCtx::kLODMed);
      }
      return kTRUE;
   }

   // Now we know we have Button 1 -> 3.
   // Allow a single action/button down/up pairing - block others
   if (fActiveButtonID && event->fCode != fActiveButtonID)
   {
      return kTRUE;
   }
   else
   {
      fActiveButtonID = event->fCode;
   }

#if defined(R__HAS_COCOA)
   // On osx/cocoa use cmd modifier for mouse-2 and cmd-alt for mouse-3.
   if (event->fCode == kButton1 && event->fState & kKeyMod2Mask)
   {
      event->fCode = event->fState & kKeyMod1Mask ? kButton3 : kButton2;
   }
#endif

   // Button DOWN
   if (event->fType == kButtonPress)
   {
      GrabMouse();

      fGLViewer->MouseIdle(0, 0, 0);

      fButtonPushPos.fX = event->fX;
      fButtonPushPos.fY = event->fY;

      if (fGLViewer->GetPushAction() != TGLViewer::kPushStd)
      {
         fGLViewer->RequestSelect(event->fX, event->fY);
         if (fGLViewer->fSelRec.GetN() > 0)
         {
            TGLVector3 v(event->fX, event->fY, 0.5*fGLViewer->fSelRec.GetMinZ());
            fGLViewer->CurrentCamera().WindowToViewport(v);
            v = fGLViewer->CurrentCamera().ViewportToWorld(v);
            if (fGLViewer->GetPushAction() == TGLViewer::kPushCamCenter)
            {
               fGLViewer->CurrentCamera().SetExternalCenter(kTRUE);
               fGLViewer->CurrentCamera().SetCenterVec(v.X(), v.Y(), v.Z());
            }
            else
            {
               TGLSelectRecord& rec = fGLViewer->GetSelRec();
               TObject* obj = rec.GetObject();
               TGLRect& vp = fGLViewer->CurrentCamera().RefViewport();
               Int_t    x = event->fX, y = event->fY;
               TGLUtil::PointToViewport(x, y);
               new TGLAnnotation(fGLViewer, obj->GetTitle(),
                                 x * 1.0f/vp.Width(),
                                 1 - y * 1.0f/vp.Height(), v);
            }

            fGLViewer->RequestDraw();
         }
         return kTRUE;
      }

      Bool_t handled = kFALSE;

      if (fGLViewer->fDragAction == TGLViewer::kDragNone && fGLViewer->fCurrentOvlElm)
      {
         Event_t e = *event;
         TGLUtil::PointToViewport(e.fX, e.fY);
         if (fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, &e))
         {
            handled     = kTRUE;
            fGLViewer->fDragAction = TGLViewer::kDragOverlay;
            fGLViewer->RequestDraw();
         }
      }

      if ( ! handled)
      {
         switch (event->fCode)
         {
            // LEFT mouse button
            case kButton1:
            {
               fGLViewer->fDragAction = TGLViewer::kDragCameraRotate;
               if (fMouseTimer)
               {
                  fMouseTimer->TurnOff();
                  fMouseTimer->Reset();
               }
               break;
            }
            // MIDDLE mouse button
            case kButton2:
            {
               fGLViewer->fDragAction = TGLViewer::kDragCameraTruck;
               break;
            }
            // RIGHT mouse button
            case kButton3:
            {
               fGLViewer->fDragAction = TGLViewer::kDragCameraDolly;
               break;
            }
         }
      }
   }
   // Button UP
   else if (event->fType == kButtonRelease)
   {
      fActiveButtonID = 0;

      if (fInPointerGrab)
      {
         UnGrabMouse();
      }
      else
      {
         Warning("TGLEventHandler::HandleButton", "Unexpected button-release.");
      }

      if (fIgnoreButtonUp)
      {
         fIgnoreButtonUp = kFALSE;
         return kTRUE;
      }

      if (fGLViewer->GetPushAction() != TGLViewer::kPushStd)
      {
         // This should be 'tool' dependant.
         fGLViewer->fPushAction = TGLViewer::kPushStd;
         fGLViewer->RefreshPadEditor(fGLViewer);
         return kTRUE;
      }
      else if (fGLViewer->fDragAction == TGLViewer::kDragOverlay && fGLViewer->fCurrentOvlElm)
      {
         Event_t e = *event;
         TGLUtil::PointToViewport(e.fX, e.fY);
         fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, &e);
         fGLViewer->OverlayDragFinished();
         if (fGLViewer->RequestOverlaySelect(event->fX, event->fY))
            fGLViewer->RequestDraw();
      }
      else if (fGLViewer->fDragAction >= TGLViewer::kDragCameraRotate &&
               fGLViewer->fDragAction <= TGLViewer::kDragCameraDolly)
      {
         fGLViewer->RequestDraw(TGLRnrCtx::kLODHigh);
      }

      fGLViewer->fDragAction = TGLViewer::kDragNone;

      if (fGLViewer->fGLDevice != -1)
      {
         gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kFALSE);
      }

      if (event->fX == fButtonPushPos.fX && event->fY == fButtonPushPos.fY)
      {
         if (event->fCode == kButton1)
         {
            if (event->fState & kKeyShiftMask && fDoInternalSelection)
            {
               if (fGLViewer->RequestSelect(event->fX, event->fY))
               {
                  fGLViewer->ApplySelection();
               }
            }
            else
            {
               SelectForClicked(event);
            }
         }
         else if (event->fCode == kButton3)
         {
            Int_t    x, y;
            Window_t childdum;
            gVirtualX->TranslateCoordinates(fGLViewer->fGLWidget->GetId(), gClient->GetDefaultRoot()->GetId(),
                                            event->fX, event->fY, x, y, childdum);

            fGLViewer->RequestSelect(event->fX, event->fY);

            PopupContextMenu(fGLViewer->fSelRec.GetPhysShape(), event, x, y);
         }
      }

      if (event->fCode == kButton1 && fMouseTimer)
      {
         fMouseTimer->TurnOn();
      }
   }

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGLEventHandler::HandleDoubleClick(Event_t *event)
{
   // Handle mouse double click 'event'.

   if (fGLViewer->IsLocked()) {
      if (gDebug>3) {
         Info("TGLEventHandler::HandleDoubleClick", "ignored - viewer is %s",
            fGLViewer->LockName(fGLViewer->CurrentLock()));
      }
      return kFALSE;
   }

   if (event->fCode > 3)
      return kTRUE;

   if (fActiveButtonID)
      return kTRUE;

   fActiveButtonID = event->fCode;
   GrabMouse();

   fGLViewer->MouseIdle(0, 0, 0);
   if (event->fCode == kButton1)
   {
      fGLViewer->DoubleClicked();
      if (fGLViewer->GetSelected() == 0)
         fGLViewer->SelectionChanged();
   }
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGLEventHandler::HandleConfigureNotify(Event_t *event)
{
   // Handle configure notify 'event' - a window resize/movement.

   if (fGLViewer->IsLocked())
   {
      if (gDebug > 0) {
         Info("TGLEventHandler::HandleConfigureNotify", "ignored - viewer is %s",
            fGLViewer->LockName(fGLViewer->CurrentLock()));
      }
      return kFALSE;
   }
   if (event)
   {
      Int_t x = event->fX, y = event->fY, w = event->fWidth, h = event->fHeight;
      TGLUtil::PointToViewport(x, y, w, h);
      fGLViewer->SetViewport(x, y, w, h);
      fGLViewer->fRedrawTimer->RequestDraw(10, TGLRnrCtx::kLODMed);
   }
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGLEventHandler::HandleExpose(Event_t * event)
{
   // Handle window expose 'event' - show.

   if (event->fCount != 0) return kTRUE;

   if (fGLViewer->IsLocked()) {
      if (gDebug > 0) {
         Info("TGLViewer::HandleExpose", "ignored - viewer is %s",
            fGLViewer->LockName(fGLViewer->CurrentLock()));
      }
      return kFALSE;
   }

   fGLViewer->fRedrawTimer->RequestDraw(20, TGLRnrCtx::kLODHigh);
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGLEventHandler::HandleKey(Event_t *event)
{
   // Handle keyboard 'event'.

   // We only handle key-press events.
   if (event->fType == kKeyRelease)
      return kTRUE;

   if (fTooltipShown)
      fTooltip->Hide();

   fLastEventState = event->fState;

   fGLViewer->MouseIdle(0, 0, 0);
   if (fGLViewer->IsLocked()) {
      if (gDebug>3) {
         Info("TGLEventHandler::HandleKey", "ignored - viewer is %s",
              fGLViewer->LockName(fGLViewer->CurrentLock()));
      }
      return kFALSE;
   }

   char tmp[10] = {0};
   UInt_t keysym = 0;

   if (fGLViewer->fGLDevice == -1)
      gVirtualX->LookupString(event, tmp, sizeof(tmp), keysym);
   else
      keysym = event->fCode;
   fGLViewer->fRnrCtx->SetEventKeySym(keysym);

   Bool_t handled = kFALSE;
   Bool_t redraw  = kFALSE;

   if (fGLViewer->fCurrentOvlElm)
   {
      Event_t e = *event;
      TGLUtil::PointToViewport(e.fX, e.fY);
      if (fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, &e))
      {
         handled = kTRUE;
         redraw  = kTRUE;
      }
   }

   if ( ! handled)
   {
      const Bool_t mod1 = event->fState & kKeyControlMask;
      const Bool_t mod2 = event->fState & kKeyShiftMask;

      const Int_t shift = TMath::Nint(fArrowKeyFactor * ControlValue(10));

      switch (keysym)
      {
         case kKey_R:
         case kKey_r:
            fGLViewer->SetStyle(TGLRnrCtx::kFill);
            redraw = kTRUE;
            break;
         case kKey_E:
         case kKey_e:
            fGLViewer->SwitchColorSet();
            redraw = kTRUE;
            break;
         case kKey_W:
         case kKey_w:
            fGLViewer->SetStyle(TGLRnrCtx::kWireFrame);
            redraw = kTRUE;
            break;
         case kKey_T:
         case kKey_t:
            fGLViewer->SetStyle(TGLRnrCtx::kOutline);
            redraw = kTRUE;
            break;

         case kKey_F1:
            fGLViewer->RequestSelect(fLastPos.fX, fLastPos.fY);
            fGLViewer->MouseIdle(fGLViewer->fSelRec.GetPhysShape(), (UInt_t)fLastPos.fX, (UInt_t)fLastPos.fY);
            break;

            // Camera
         case kKey_A:
         case kKey_a:
            fArcBall = ! fArcBall;
            break;
         case kKey_Plus:
         case kKey_J:
         case kKey_j:
            redraw = fGLViewer->CurrentCamera().Dolly(shift, mod1, mod2);
            break;
         case kKey_Minus:
         case kKey_K:
         case kKey_k:
            redraw = fGLViewer->CurrentCamera().Dolly(-shift, mod1, mod2);
            break;
         case kKey_Up:
            redraw = fGLViewer->CurrentCamera().Truck(0, shift, mod1, mod2);
            break;
         case kKey_Down:
            redraw = fGLViewer->CurrentCamera().Truck(0, -shift, mod1, mod2);
            break;
         case kKey_Left:
            redraw = fGLViewer->CurrentCamera().Truck(-shift, 0, mod1, mod2);
            break;
         case kKey_Right:
            redraw = fGLViewer->CurrentCamera().Truck(shift, 0, mod1, mod2);
            break;
         case kKey_Home:
            if (mod1) {
               TGLCamera &cam = fGLViewer->CurrentCamera();
               cam.SetExternalCenter(!cam.GetExternalCenter());
               fGLViewer->RefreshPadEditor(fGLViewer);
            } else {
               fGLViewer->ResetCurrentCamera();
            }
            redraw = kTRUE;
            break;

            // Toggle debugging mode
         case kKey_d:
            fGLViewer->fDebugMode = !fGLViewer->fDebugMode;
            redraw = kTRUE;
            Info("OpenGL viewer debug mode : ", fGLViewer->fDebugMode ? "ON" : "OFF");
            break;
            // Forced rebuild for debugging mode
         case kKey_D:
            if (fGLViewer->fDebugMode) {
               Info("OpenGL viewer FORCED rebuild", " ");
               fGLViewer->UpdateScene();
            }
         default:;
      } // switch
   }

   if (redraw) {
      if (fGLViewer->fGLDevice != -1)
         gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
      fGLViewer->RequestDraw();
   }

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGLEventHandler::HandleMotion(Event_t * event)
{
   // Handle mouse motion 'event'.

   fGLViewer->MouseIdle(0, 0, 0);
   if (fGLViewer->IsLocked()) {
      if (gDebug>3) {
         Info("TGLEventHandler::HandleMotion", "ignored - viewer is %s",
              fGLViewer->LockName(fGLViewer->CurrentLock()));
      }
      return kFALSE;
   }

   Bool_t processed = kFALSE, changed = kFALSE;
   Short_t lod = TGLRnrCtx::kLODMed;

   // Camera interface requires GL coords - Y inverted
   Int_t  xDelta = TMath::Nint(fMouseDragFactor * ControlValue(event->fX - fLastPos.fX));
   Int_t  yDelta = TMath::Nint(fMouseDragFactor * ControlValue(event->fY - fLastPos.fY));
   Bool_t mod1   = event->fState & kKeyControlMask;
   Bool_t mod2   = event->fState & kKeyShiftMask;
   TGLUtil::PointToViewport(xDelta, yDelta);

   if (fMouseTimerRunning) StopMouseTimer();

   if (fTooltipShown &&
       ( TMath::Abs(event->fXRoot - fTooltipPos.fX) > fTooltipPixelTolerance ||
         TMath::Abs(event->fYRoot - fTooltipPos.fY) > fTooltipPixelTolerance ))
   {
      RemoveTooltip();
   }

   if (fGLViewer->fDragAction == TGLViewer::kDragNone)
   {
      if (fGLViewer->fRedrawTimer->IsPending()) {
         if (gDebug > 2)
            Info("TGLEventHandler::HandleMotion", "Redraw pending, ignoring.");
         return kTRUE;
      }
      changed = fGLViewer->RequestOverlaySelect(event->fX, event->fY);
      if (fGLViewer->fCurrentOvlElm)
      {
         Event_t e = *event;
         TGLUtil::PointToViewport(e.fX, e.fY);
         processed = fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, &e);
      }
      lod = TGLRnrCtx::kLODHigh;
      if ( ! processed && ! fMouseTimerRunning)
         StartMouseTimer();
   }
   else if (fGLViewer->fDragAction == TGLViewer::kDragCameraRotate)
   {
      processed = Rotate(xDelta, yDelta, mod1, mod2);
   }
   else if (fGLViewer->fDragAction == TGLViewer::kDragCameraTruck)
   {
      processed = fGLViewer->CurrentCamera().Truck(xDelta, -yDelta, mod1, mod2);
   }
   else if (fGLViewer->fDragAction == TGLViewer::kDragCameraDolly)
   {
      processed = fGLViewer->CurrentCamera().Dolly(yDelta - xDelta, mod1, mod2);
   }
   else if (fGLViewer->fDragAction == TGLViewer::kDragOverlay)
   {
      if (fGLViewer->fCurrentOvlElm) {
         Event_t e = *event;
         TGLUtil::PointToViewport(e.fX, e.fY);
         processed = fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, &e);
      }
   }

   fLastPos.fX = event->fX;
   fLastPos.fY = event->fY;

   fLastGlobalPos.fX = event->fXRoot;
   fLastGlobalPos.fY = event->fYRoot;

   if (processed || changed) {
      if (fGLViewer->fGLDevice != -1) {
         gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
         gVirtualX->SetDrawMode(TVirtualX::kCopy);
      }

      fGLViewer->RequestDraw(lod);
   }

   return processed;
}

//______________________________________________________________________________
Bool_t TGLEventHandler::Rotate(Int_t xDelta, Int_t yDelta, Bool_t mod1, Bool_t mod2)
{
   // Method to handle action TGLViewer::kDragCameraRotate.

   TGLCamera &cam = fGLViewer->CurrentCamera();
   if (fArcBall) return cam.RotateArcBall(xDelta, -yDelta, mod1, mod2);
   else          return cam.Rotate       (xDelta, -yDelta, mod1, mod2);
}

//______________________________________________________________________________
Bool_t TGLEventHandler::HandleTimer(TTimer *t)
{
   // If mouse delay timer times out emit signal.

   if (t != fMouseTimer) return kFALSE;

   fMouseTimerRunning = kFALSE;

   if (fGLViewer->fRedrawTimer->IsPending()) {
      if (gDebug > 2)
         Info("TGLEventHandler::HandleTimer", "Redraw pending, ignoring.");
      return kTRUE;
   }

   if (fGLViewer->fDragAction == TGLViewer::kDragNone)
   {
      if (fLastMouseOverPos != fLastPos)
      {
         SelectForMouseOver();
      }
   }
   return kTRUE;
}

//______________________________________________________________________________
void TGLEventHandler::StartMouseTimer()
{
   // Start mouse timer in single-shot mode.

   fMouseTimer->Start(-1, kTRUE);
   fMouseTimerRunning = kTRUE;
}

//______________________________________________________________________________
void TGLEventHandler::StopMouseTimer()
{
   // Make sure mouse timers are not running.

   fMouseTimerRunning = kFALSE;
   fMouseTimer->Stop();
}

//______________________________________________________________________________
void TGLEventHandler::ClearMouseOver()
{
   // Clear mouse-over state and emit mouse-over signals.
   // Current overlay element is also told the mouse has left.

   fLastMouseOverPos.fX = fLastMouseOverPos.fY = -1;
   fLastMouseOverShape = 0;
   fGLViewer->MouseOver(fLastMouseOverShape);
   fGLViewer->MouseOver(fLastMouseOverShape, fLastEventState);
   fGLViewer->MouseOver((TObject*)0, fLastEventState);

   fGLViewer->ClearCurrentOvlElm();
}

//______________________________________________________________________________
void TGLEventHandler::Repaint()
{
   // Handle window expose 'event' - show.

   if (fGLViewer->IsLocked()) {
      if (gDebug > 0) {
         Info("TGLViewer::HandleExpose", "ignored - viewer is %s",
            fGLViewer->LockName(fGLViewer->CurrentLock()));
      }
      return;
   }
   fGLViewer->fRedrawTimer->RequestDraw(20, TGLRnrCtx::kLODHigh);
}

//______________________________________________________________________________
void TGLEventHandler::PopupContextMenu(TGLPhysicalShape* pshp, Event_t * /*event*/,
                                       Int_t gx, Int_t gy)
{
   // Popup context menu.

   if (!fGLViewer->fContextMenu)
   {
      fGLViewer->fContextMenu = new TContextMenu("glcm", "GL Viewer Context Menu");
   }

   if (pshp)
   {
      fActiveButtonID = 0;
      UnGrabMouse();

      pshp->InvokeContextMenu(*fGLViewer->fContextMenu, gx, gy);
   }

   // This is dangerous ... should have special menu, probably even
   // tool / context specific.
   // else 
   // {
   //    fGLViewer->fContextMenu->Popup(x, y, fGLViewer);
   // }
}

//______________________________________________________________________________
void TGLEventHandler::TriggerTooltip(const char* text)
{
   // Trigger display of tooltip.

   static UInt_t screenW = 0, screenH = 0;
   fTooltipPos   = fLastGlobalPos;
   fTooltipShown = kTRUE;
   fTooltip->SetText(text);
   Int_t x = fTooltipPos.fX + 16, y = fTooltipPos.fY + 16;
   if (screenW == 0 || screenH == 0) {
      screenW = gClient->GetDisplayWidth();
      screenH = gClient->GetDisplayHeight();
   }
   if (x + 5 + fTooltip->GetWidth() > screenW) {
      x = screenW - fTooltip->GetWidth() - 5;
      if (y + 5 + fTooltip->GetHeight() > screenH) {
         y -= (25 + fTooltip->GetHeight());
      }
   }
   if (y + 5 + fTooltip->GetHeight() > screenH) {
      y = screenH - fTooltip->GetHeight() - 10;
   }
   fTooltip->SetPosition(x, y);
   fTooltip->Reset();
}

//______________________________________________________________________________
void TGLEventHandler::RemoveTooltip()
{
   // Hide the tooltip.

   fTooltip->Hide();
   fTooltipShown = kFALSE;
}

//______________________________________________________________________________
void TGLEventHandler::SetMouseOverSelectDelay(Int_t ms)
{
   // Set delay of mouse-over probe (highlight).

   fMouseTimer->SetTime(ms);
}

//______________________________________________________________________________
void TGLEventHandler::SetMouseOverTooltipDelay(Int_t ms)
{
   // Set delay of tooltip timer.

   fTooltip->SetDelay(ms);
}
 TGLEventHandler.cxx:1
 TGLEventHandler.cxx:2
 TGLEventHandler.cxx:3
 TGLEventHandler.cxx:4
 TGLEventHandler.cxx:5
 TGLEventHandler.cxx:6
 TGLEventHandler.cxx:7
 TGLEventHandler.cxx:8
 TGLEventHandler.cxx:9
 TGLEventHandler.cxx:10
 TGLEventHandler.cxx:11
 TGLEventHandler.cxx:12
 TGLEventHandler.cxx:13
 TGLEventHandler.cxx:14
 TGLEventHandler.cxx:15
 TGLEventHandler.cxx:16
 TGLEventHandler.cxx:17
 TGLEventHandler.cxx:18
 TGLEventHandler.cxx:19
 TGLEventHandler.cxx:20
 TGLEventHandler.cxx:21
 TGLEventHandler.cxx:22
 TGLEventHandler.cxx:23
 TGLEventHandler.cxx:24
 TGLEventHandler.cxx:25
 TGLEventHandler.cxx:26
 TGLEventHandler.cxx:27
 TGLEventHandler.cxx:28
 TGLEventHandler.cxx:29
 TGLEventHandler.cxx:30
 TGLEventHandler.cxx:31
 TGLEventHandler.cxx:32
 TGLEventHandler.cxx:33
 TGLEventHandler.cxx:34
 TGLEventHandler.cxx:35
 TGLEventHandler.cxx:36
 TGLEventHandler.cxx:37
 TGLEventHandler.cxx:38
 TGLEventHandler.cxx:39
 TGLEventHandler.cxx:40
 TGLEventHandler.cxx:41
 TGLEventHandler.cxx:42
 TGLEventHandler.cxx:43
 TGLEventHandler.cxx:44
 TGLEventHandler.cxx:45
 TGLEventHandler.cxx:46
 TGLEventHandler.cxx:47
 TGLEventHandler.cxx:48
 TGLEventHandler.cxx:49
 TGLEventHandler.cxx:50
 TGLEventHandler.cxx:51
 TGLEventHandler.cxx:52
 TGLEventHandler.cxx:53
 TGLEventHandler.cxx:54
 TGLEventHandler.cxx:55
 TGLEventHandler.cxx:56
 TGLEventHandler.cxx:57
 TGLEventHandler.cxx:58
 TGLEventHandler.cxx:59
 TGLEventHandler.cxx:60
 TGLEventHandler.cxx:61
 TGLEventHandler.cxx:62
 TGLEventHandler.cxx:63
 TGLEventHandler.cxx:64
 TGLEventHandler.cxx:65
 TGLEventHandler.cxx:66
 TGLEventHandler.cxx:67
 TGLEventHandler.cxx:68
 TGLEventHandler.cxx:69
 TGLEventHandler.cxx:70
 TGLEventHandler.cxx:71
 TGLEventHandler.cxx:72
 TGLEventHandler.cxx:73
 TGLEventHandler.cxx:74
 TGLEventHandler.cxx:75
 TGLEventHandler.cxx:76
 TGLEventHandler.cxx:77
 TGLEventHandler.cxx:78
 TGLEventHandler.cxx:79
 TGLEventHandler.cxx:80
 TGLEventHandler.cxx:81
 TGLEventHandler.cxx:82
 TGLEventHandler.cxx:83
 TGLEventHandler.cxx:84
 TGLEventHandler.cxx:85
 TGLEventHandler.cxx:86
 TGLEventHandler.cxx:87
 TGLEventHandler.cxx:88
 TGLEventHandler.cxx:89
 TGLEventHandler.cxx:90
 TGLEventHandler.cxx:91
 TGLEventHandler.cxx:92
 TGLEventHandler.cxx:93
 TGLEventHandler.cxx:94
 TGLEventHandler.cxx:95
 TGLEventHandler.cxx:96
 TGLEventHandler.cxx:97
 TGLEventHandler.cxx:98
 TGLEventHandler.cxx:99
 TGLEventHandler.cxx:100
 TGLEventHandler.cxx:101
 TGLEventHandler.cxx:102
 TGLEventHandler.cxx:103
 TGLEventHandler.cxx:104
 TGLEventHandler.cxx:105
 TGLEventHandler.cxx:106
 TGLEventHandler.cxx:107
 TGLEventHandler.cxx:108
 TGLEventHandler.cxx:109
 TGLEventHandler.cxx:110
 TGLEventHandler.cxx:111
 TGLEventHandler.cxx:112
 TGLEventHandler.cxx:113
 TGLEventHandler.cxx:114
 TGLEventHandler.cxx:115
 TGLEventHandler.cxx:116
 TGLEventHandler.cxx:117
 TGLEventHandler.cxx:118
 TGLEventHandler.cxx:119
 TGLEventHandler.cxx:120
 TGLEventHandler.cxx:121
 TGLEventHandler.cxx:122
 TGLEventHandler.cxx:123
 TGLEventHandler.cxx:124
 TGLEventHandler.cxx:125
 TGLEventHandler.cxx:126
 TGLEventHandler.cxx:127
 TGLEventHandler.cxx:128
 TGLEventHandler.cxx:129
 TGLEventHandler.cxx:130
 TGLEventHandler.cxx:131
 TGLEventHandler.cxx:132
 TGLEventHandler.cxx:133
 TGLEventHandler.cxx:134
 TGLEventHandler.cxx:135
 TGLEventHandler.cxx:136
 TGLEventHandler.cxx:137
 TGLEventHandler.cxx:138
 TGLEventHandler.cxx:139
 TGLEventHandler.cxx:140
 TGLEventHandler.cxx:141
 TGLEventHandler.cxx:142
 TGLEventHandler.cxx:143
 TGLEventHandler.cxx:144
 TGLEventHandler.cxx:145
 TGLEventHandler.cxx:146
 TGLEventHandler.cxx:147
 TGLEventHandler.cxx:148
 TGLEventHandler.cxx:149
 TGLEventHandler.cxx:150
 TGLEventHandler.cxx:151
 TGLEventHandler.cxx:152
 TGLEventHandler.cxx:153
 TGLEventHandler.cxx:154
 TGLEventHandler.cxx:155
 TGLEventHandler.cxx:156
 TGLEventHandler.cxx:157
 TGLEventHandler.cxx:158
 TGLEventHandler.cxx:159
 TGLEventHandler.cxx:160
 TGLEventHandler.cxx:161
 TGLEventHandler.cxx:162
 TGLEventHandler.cxx:163
 TGLEventHandler.cxx:164
 TGLEventHandler.cxx:165
 TGLEventHandler.cxx:166
 TGLEventHandler.cxx:167
 TGLEventHandler.cxx:168
 TGLEventHandler.cxx:169
 TGLEventHandler.cxx:170
 TGLEventHandler.cxx:171
 TGLEventHandler.cxx:172
 TGLEventHandler.cxx:173
 TGLEventHandler.cxx:174
 TGLEventHandler.cxx:175
 TGLEventHandler.cxx:176
 TGLEventHandler.cxx:177
 TGLEventHandler.cxx:178
 TGLEventHandler.cxx:179
 TGLEventHandler.cxx:180
 TGLEventHandler.cxx:181
 TGLEventHandler.cxx:182
 TGLEventHandler.cxx:183
 TGLEventHandler.cxx:184
 TGLEventHandler.cxx:185
 TGLEventHandler.cxx:186
 TGLEventHandler.cxx:187
 TGLEventHandler.cxx:188
 TGLEventHandler.cxx:189
 TGLEventHandler.cxx:190
 TGLEventHandler.cxx:191
 TGLEventHandler.cxx:192
 TGLEventHandler.cxx:193
 TGLEventHandler.cxx:194
 TGLEventHandler.cxx:195
 TGLEventHandler.cxx:196
 TGLEventHandler.cxx:197
 TGLEventHandler.cxx:198
 TGLEventHandler.cxx:199
 TGLEventHandler.cxx:200
 TGLEventHandler.cxx:201
 TGLEventHandler.cxx:202
 TGLEventHandler.cxx:203
 TGLEventHandler.cxx:204
 TGLEventHandler.cxx:205
 TGLEventHandler.cxx:206
 TGLEventHandler.cxx:207
 TGLEventHandler.cxx:208
 TGLEventHandler.cxx:209
 TGLEventHandler.cxx:210
 TGLEventHandler.cxx:211
 TGLEventHandler.cxx:212
 TGLEventHandler.cxx:213
 TGLEventHandler.cxx:214
 TGLEventHandler.cxx:215
 TGLEventHandler.cxx:216
 TGLEventHandler.cxx:217
 TGLEventHandler.cxx:218
 TGLEventHandler.cxx:219
 TGLEventHandler.cxx:220
 TGLEventHandler.cxx:221
 TGLEventHandler.cxx:222
 TGLEventHandler.cxx:223
 TGLEventHandler.cxx:224
 TGLEventHandler.cxx:225
 TGLEventHandler.cxx:226
 TGLEventHandler.cxx:227
 TGLEventHandler.cxx:228
 TGLEventHandler.cxx:229
 TGLEventHandler.cxx:230
 TGLEventHandler.cxx:231
 TGLEventHandler.cxx:232
 TGLEventHandler.cxx:233
 TGLEventHandler.cxx:234
 TGLEventHandler.cxx:235
 TGLEventHandler.cxx:236
 TGLEventHandler.cxx:237
 TGLEventHandler.cxx:238
 TGLEventHandler.cxx:239
 TGLEventHandler.cxx:240
 TGLEventHandler.cxx:241
 TGLEventHandler.cxx:242
 TGLEventHandler.cxx:243
 TGLEventHandler.cxx:244
 TGLEventHandler.cxx:245
 TGLEventHandler.cxx:246
 TGLEventHandler.cxx:247
 TGLEventHandler.cxx:248
 TGLEventHandler.cxx:249
 TGLEventHandler.cxx:250
 TGLEventHandler.cxx:251
 TGLEventHandler.cxx:252
 TGLEventHandler.cxx:253
 TGLEventHandler.cxx:254
 TGLEventHandler.cxx:255
 TGLEventHandler.cxx:256
 TGLEventHandler.cxx:257
 TGLEventHandler.cxx:258
 TGLEventHandler.cxx:259
 TGLEventHandler.cxx:260
 TGLEventHandler.cxx:261
 TGLEventHandler.cxx:262
 TGLEventHandler.cxx:263
 TGLEventHandler.cxx:264
 TGLEventHandler.cxx:265
 TGLEventHandler.cxx:266
 TGLEventHandler.cxx:267
 TGLEventHandler.cxx:268
 TGLEventHandler.cxx:269
 TGLEventHandler.cxx:270
 TGLEventHandler.cxx:271
 TGLEventHandler.cxx:272
 TGLEventHandler.cxx:273
 TGLEventHandler.cxx:274
 TGLEventHandler.cxx:275
 TGLEventHandler.cxx:276
 TGLEventHandler.cxx:277
 TGLEventHandler.cxx:278
 TGLEventHandler.cxx:279
 TGLEventHandler.cxx:280
 TGLEventHandler.cxx:281
 TGLEventHandler.cxx:282
 TGLEventHandler.cxx:283
 TGLEventHandler.cxx:284
 TGLEventHandler.cxx:285
 TGLEventHandler.cxx:286
 TGLEventHandler.cxx:287
 TGLEventHandler.cxx:288
 TGLEventHandler.cxx:289
 TGLEventHandler.cxx:290
 TGLEventHandler.cxx:291
 TGLEventHandler.cxx:292
 TGLEventHandler.cxx:293
 TGLEventHandler.cxx:294
 TGLEventHandler.cxx:295
 TGLEventHandler.cxx:296
 TGLEventHandler.cxx:297
 TGLEventHandler.cxx:298
 TGLEventHandler.cxx:299
 TGLEventHandler.cxx:300
 TGLEventHandler.cxx:301
 TGLEventHandler.cxx:302
 TGLEventHandler.cxx:303
 TGLEventHandler.cxx:304
 TGLEventHandler.cxx:305
 TGLEventHandler.cxx:306
 TGLEventHandler.cxx:307
 TGLEventHandler.cxx:308
 TGLEventHandler.cxx:309
 TGLEventHandler.cxx:310
 TGLEventHandler.cxx:311
 TGLEventHandler.cxx:312
 TGLEventHandler.cxx:313
 TGLEventHandler.cxx:314
 TGLEventHandler.cxx:315
 TGLEventHandler.cxx:316
 TGLEventHandler.cxx:317
 TGLEventHandler.cxx:318
 TGLEventHandler.cxx:319
 TGLEventHandler.cxx:320
 TGLEventHandler.cxx:321
 TGLEventHandler.cxx:322
 TGLEventHandler.cxx:323
 TGLEventHandler.cxx:324
 TGLEventHandler.cxx:325
 TGLEventHandler.cxx:326
 TGLEventHandler.cxx:327
 TGLEventHandler.cxx:328
 TGLEventHandler.cxx:329
 TGLEventHandler.cxx:330
 TGLEventHandler.cxx:331
 TGLEventHandler.cxx:332
 TGLEventHandler.cxx:333
 TGLEventHandler.cxx:334
 TGLEventHandler.cxx:335
 TGLEventHandler.cxx:336
 TGLEventHandler.cxx:337
 TGLEventHandler.cxx:338
 TGLEventHandler.cxx:339
 TGLEventHandler.cxx:340
 TGLEventHandler.cxx:341
 TGLEventHandler.cxx:342
 TGLEventHandler.cxx:343
 TGLEventHandler.cxx:344
 TGLEventHandler.cxx:345
 TGLEventHandler.cxx:346
 TGLEventHandler.cxx:347
 TGLEventHandler.cxx:348
 TGLEventHandler.cxx:349
 TGLEventHandler.cxx:350
 TGLEventHandler.cxx:351
 TGLEventHandler.cxx:352
 TGLEventHandler.cxx:353
 TGLEventHandler.cxx:354
 TGLEventHandler.cxx:355
 TGLEventHandler.cxx:356
 TGLEventHandler.cxx:357
 TGLEventHandler.cxx:358
 TGLEventHandler.cxx:359
 TGLEventHandler.cxx:360
 TGLEventHandler.cxx:361
 TGLEventHandler.cxx:362
 TGLEventHandler.cxx:363
 TGLEventHandler.cxx:364
 TGLEventHandler.cxx:365
 TGLEventHandler.cxx:366
 TGLEventHandler.cxx:367
 TGLEventHandler.cxx:368
 TGLEventHandler.cxx:369
 TGLEventHandler.cxx:370
 TGLEventHandler.cxx:371
 TGLEventHandler.cxx:372
 TGLEventHandler.cxx:373
 TGLEventHandler.cxx:374
 TGLEventHandler.cxx:375
 TGLEventHandler.cxx:376
 TGLEventHandler.cxx:377
 TGLEventHandler.cxx:378
 TGLEventHandler.cxx:379
 TGLEventHandler.cxx:380
 TGLEventHandler.cxx:381
 TGLEventHandler.cxx:382
 TGLEventHandler.cxx:383
 TGLEventHandler.cxx:384
 TGLEventHandler.cxx:385
 TGLEventHandler.cxx:386
 TGLEventHandler.cxx:387
 TGLEventHandler.cxx:388
 TGLEventHandler.cxx:389
 TGLEventHandler.cxx:390
 TGLEventHandler.cxx:391
 TGLEventHandler.cxx:392
 TGLEventHandler.cxx:393
 TGLEventHandler.cxx:394
 TGLEventHandler.cxx:395
 TGLEventHandler.cxx:396
 TGLEventHandler.cxx:397
 TGLEventHandler.cxx:398
 TGLEventHandler.cxx:399
 TGLEventHandler.cxx:400
 TGLEventHandler.cxx:401
 TGLEventHandler.cxx:402
 TGLEventHandler.cxx:403
 TGLEventHandler.cxx:404
 TGLEventHandler.cxx:405
 TGLEventHandler.cxx:406
 TGLEventHandler.cxx:407
 TGLEventHandler.cxx:408
 TGLEventHandler.cxx:409
 TGLEventHandler.cxx:410
 TGLEventHandler.cxx:411
 TGLEventHandler.cxx:412
 TGLEventHandler.cxx:413
 TGLEventHandler.cxx:414
 TGLEventHandler.cxx:415
 TGLEventHandler.cxx:416
 TGLEventHandler.cxx:417
 TGLEventHandler.cxx:418
 TGLEventHandler.cxx:419
 TGLEventHandler.cxx:420
 TGLEventHandler.cxx:421
 TGLEventHandler.cxx:422
 TGLEventHandler.cxx:423
 TGLEventHandler.cxx:424
 TGLEventHandler.cxx:425
 TGLEventHandler.cxx:426
 TGLEventHandler.cxx:427
 TGLEventHandler.cxx:428
 TGLEventHandler.cxx:429
 TGLEventHandler.cxx:430
 TGLEventHandler.cxx:431
 TGLEventHandler.cxx:432
 TGLEventHandler.cxx:433
 TGLEventHandler.cxx:434
 TGLEventHandler.cxx:435
 TGLEventHandler.cxx:436
 TGLEventHandler.cxx:437
 TGLEventHandler.cxx:438
 TGLEventHandler.cxx:439
 TGLEventHandler.cxx:440
 TGLEventHandler.cxx:441
 TGLEventHandler.cxx:442
 TGLEventHandler.cxx:443
 TGLEventHandler.cxx:444
 TGLEventHandler.cxx:445
 TGLEventHandler.cxx:446
 TGLEventHandler.cxx:447
 TGLEventHandler.cxx:448
 TGLEventHandler.cxx:449
 TGLEventHandler.cxx:450
 TGLEventHandler.cxx:451
 TGLEventHandler.cxx:452
 TGLEventHandler.cxx:453
 TGLEventHandler.cxx:454
 TGLEventHandler.cxx:455
 TGLEventHandler.cxx:456
 TGLEventHandler.cxx:457
 TGLEventHandler.cxx:458
 TGLEventHandler.cxx:459
 TGLEventHandler.cxx:460
 TGLEventHandler.cxx:461
 TGLEventHandler.cxx:462
 TGLEventHandler.cxx:463
 TGLEventHandler.cxx:464
 TGLEventHandler.cxx:465
 TGLEventHandler.cxx:466
 TGLEventHandler.cxx:467
 TGLEventHandler.cxx:468
 TGLEventHandler.cxx:469
 TGLEventHandler.cxx:470
 TGLEventHandler.cxx:471
 TGLEventHandler.cxx:472
 TGLEventHandler.cxx:473
 TGLEventHandler.cxx:474
 TGLEventHandler.cxx:475
 TGLEventHandler.cxx:476
 TGLEventHandler.cxx:477
 TGLEventHandler.cxx:478
 TGLEventHandler.cxx:479
 TGLEventHandler.cxx:480
 TGLEventHandler.cxx:481
 TGLEventHandler.cxx:482
 TGLEventHandler.cxx:483
 TGLEventHandler.cxx:484
 TGLEventHandler.cxx:485
 TGLEventHandler.cxx:486
 TGLEventHandler.cxx:487
 TGLEventHandler.cxx:488
 TGLEventHandler.cxx:489
 TGLEventHandler.cxx:490
 TGLEventHandler.cxx:491
 TGLEventHandler.cxx:492
 TGLEventHandler.cxx:493
 TGLEventHandler.cxx:494
 TGLEventHandler.cxx:495
 TGLEventHandler.cxx:496
 TGLEventHandler.cxx:497
 TGLEventHandler.cxx:498
 TGLEventHandler.cxx:499
 TGLEventHandler.cxx:500
 TGLEventHandler.cxx:501
 TGLEventHandler.cxx:502
 TGLEventHandler.cxx:503
 TGLEventHandler.cxx:504
 TGLEventHandler.cxx:505
 TGLEventHandler.cxx:506
 TGLEventHandler.cxx:507
 TGLEventHandler.cxx:508
 TGLEventHandler.cxx:509
 TGLEventHandler.cxx:510
 TGLEventHandler.cxx:511
 TGLEventHandler.cxx:512
 TGLEventHandler.cxx:513
 TGLEventHandler.cxx:514
 TGLEventHandler.cxx:515
 TGLEventHandler.cxx:516
 TGLEventHandler.cxx:517
 TGLEventHandler.cxx:518
 TGLEventHandler.cxx:519
 TGLEventHandler.cxx:520
 TGLEventHandler.cxx:521
 TGLEventHandler.cxx:522
 TGLEventHandler.cxx:523
 TGLEventHandler.cxx:524
 TGLEventHandler.cxx:525
 TGLEventHandler.cxx:526
 TGLEventHandler.cxx:527
 TGLEventHandler.cxx:528
 TGLEventHandler.cxx:529
 TGLEventHandler.cxx:530
 TGLEventHandler.cxx:531
 TGLEventHandler.cxx:532
 TGLEventHandler.cxx:533
 TGLEventHandler.cxx:534
 TGLEventHandler.cxx:535
 TGLEventHandler.cxx:536
 TGLEventHandler.cxx:537
 TGLEventHandler.cxx:538
 TGLEventHandler.cxx:539
 TGLEventHandler.cxx:540
 TGLEventHandler.cxx:541
 TGLEventHandler.cxx:542
 TGLEventHandler.cxx:543
 TGLEventHandler.cxx:544
 TGLEventHandler.cxx:545
 TGLEventHandler.cxx:546
 TGLEventHandler.cxx:547
 TGLEventHandler.cxx:548
 TGLEventHandler.cxx:549
 TGLEventHandler.cxx:550
 TGLEventHandler.cxx:551
 TGLEventHandler.cxx:552
 TGLEventHandler.cxx:553
 TGLEventHandler.cxx:554
 TGLEventHandler.cxx:555
 TGLEventHandler.cxx:556
 TGLEventHandler.cxx:557
 TGLEventHandler.cxx:558
 TGLEventHandler.cxx:559
 TGLEventHandler.cxx:560
 TGLEventHandler.cxx:561
 TGLEventHandler.cxx:562
 TGLEventHandler.cxx:563
 TGLEventHandler.cxx:564
 TGLEventHandler.cxx:565
 TGLEventHandler.cxx:566
 TGLEventHandler.cxx:567
 TGLEventHandler.cxx:568
 TGLEventHandler.cxx:569
 TGLEventHandler.cxx:570
 TGLEventHandler.cxx:571
 TGLEventHandler.cxx:572
 TGLEventHandler.cxx:573
 TGLEventHandler.cxx:574
 TGLEventHandler.cxx:575
 TGLEventHandler.cxx:576
 TGLEventHandler.cxx:577
 TGLEventHandler.cxx:578
 TGLEventHandler.cxx:579
 TGLEventHandler.cxx:580
 TGLEventHandler.cxx:581
 TGLEventHandler.cxx:582
 TGLEventHandler.cxx:583
 TGLEventHandler.cxx:584
 TGLEventHandler.cxx:585
 TGLEventHandler.cxx:586
 TGLEventHandler.cxx:587
 TGLEventHandler.cxx:588
 TGLEventHandler.cxx:589
 TGLEventHandler.cxx:590
 TGLEventHandler.cxx:591
 TGLEventHandler.cxx:592
 TGLEventHandler.cxx:593
 TGLEventHandler.cxx:594
 TGLEventHandler.cxx:595
 TGLEventHandler.cxx:596
 TGLEventHandler.cxx:597
 TGLEventHandler.cxx:598
 TGLEventHandler.cxx:599
 TGLEventHandler.cxx:600
 TGLEventHandler.cxx:601
 TGLEventHandler.cxx:602
 TGLEventHandler.cxx:603
 TGLEventHandler.cxx:604
 TGLEventHandler.cxx:605
 TGLEventHandler.cxx:606
 TGLEventHandler.cxx:607
 TGLEventHandler.cxx:608
 TGLEventHandler.cxx:609
 TGLEventHandler.cxx:610
 TGLEventHandler.cxx:611
 TGLEventHandler.cxx:612
 TGLEventHandler.cxx:613
 TGLEventHandler.cxx:614
 TGLEventHandler.cxx:615
 TGLEventHandler.cxx:616
 TGLEventHandler.cxx:617
 TGLEventHandler.cxx:618
 TGLEventHandler.cxx:619
 TGLEventHandler.cxx:620
 TGLEventHandler.cxx:621
 TGLEventHandler.cxx:622
 TGLEventHandler.cxx:623
 TGLEventHandler.cxx:624
 TGLEventHandler.cxx:625
 TGLEventHandler.cxx:626
 TGLEventHandler.cxx:627
 TGLEventHandler.cxx:628
 TGLEventHandler.cxx:629
 TGLEventHandler.cxx:630
 TGLEventHandler.cxx:631
 TGLEventHandler.cxx:632
 TGLEventHandler.cxx:633
 TGLEventHandler.cxx:634
 TGLEventHandler.cxx:635
 TGLEventHandler.cxx:636
 TGLEventHandler.cxx:637
 TGLEventHandler.cxx:638
 TGLEventHandler.cxx:639
 TGLEventHandler.cxx:640
 TGLEventHandler.cxx:641
 TGLEventHandler.cxx:642
 TGLEventHandler.cxx:643
 TGLEventHandler.cxx:644
 TGLEventHandler.cxx:645
 TGLEventHandler.cxx:646
 TGLEventHandler.cxx:647
 TGLEventHandler.cxx:648
 TGLEventHandler.cxx:649
 TGLEventHandler.cxx:650
 TGLEventHandler.cxx:651
 TGLEventHandler.cxx:652
 TGLEventHandler.cxx:653
 TGLEventHandler.cxx:654
 TGLEventHandler.cxx:655
 TGLEventHandler.cxx:656
 TGLEventHandler.cxx:657
 TGLEventHandler.cxx:658
 TGLEventHandler.cxx:659
 TGLEventHandler.cxx:660
 TGLEventHandler.cxx:661
 TGLEventHandler.cxx:662
 TGLEventHandler.cxx:663
 TGLEventHandler.cxx:664
 TGLEventHandler.cxx:665
 TGLEventHandler.cxx:666
 TGLEventHandler.cxx:667
 TGLEventHandler.cxx:668
 TGLEventHandler.cxx:669
 TGLEventHandler.cxx:670
 TGLEventHandler.cxx:671
 TGLEventHandler.cxx:672
 TGLEventHandler.cxx:673
 TGLEventHandler.cxx:674
 TGLEventHandler.cxx:675
 TGLEventHandler.cxx:676
 TGLEventHandler.cxx:677
 TGLEventHandler.cxx:678
 TGLEventHandler.cxx:679
 TGLEventHandler.cxx:680
 TGLEventHandler.cxx:681
 TGLEventHandler.cxx:682
 TGLEventHandler.cxx:683
 TGLEventHandler.cxx:684
 TGLEventHandler.cxx:685
 TGLEventHandler.cxx:686
 TGLEventHandler.cxx:687
 TGLEventHandler.cxx:688
 TGLEventHandler.cxx:689
 TGLEventHandler.cxx:690
 TGLEventHandler.cxx:691
 TGLEventHandler.cxx:692
 TGLEventHandler.cxx:693
 TGLEventHandler.cxx:694
 TGLEventHandler.cxx:695
 TGLEventHandler.cxx:696
 TGLEventHandler.cxx:697
 TGLEventHandler.cxx:698
 TGLEventHandler.cxx:699
 TGLEventHandler.cxx:700
 TGLEventHandler.cxx:701
 TGLEventHandler.cxx:702
 TGLEventHandler.cxx:703
 TGLEventHandler.cxx:704
 TGLEventHandler.cxx:705
 TGLEventHandler.cxx:706
 TGLEventHandler.cxx:707
 TGLEventHandler.cxx:708
 TGLEventHandler.cxx:709
 TGLEventHandler.cxx:710
 TGLEventHandler.cxx:711
 TGLEventHandler.cxx:712
 TGLEventHandler.cxx:713
 TGLEventHandler.cxx:714
 TGLEventHandler.cxx:715
 TGLEventHandler.cxx:716
 TGLEventHandler.cxx:717
 TGLEventHandler.cxx:718
 TGLEventHandler.cxx:719
 TGLEventHandler.cxx:720
 TGLEventHandler.cxx:721
 TGLEventHandler.cxx:722
 TGLEventHandler.cxx:723
 TGLEventHandler.cxx:724
 TGLEventHandler.cxx:725
 TGLEventHandler.cxx:726
 TGLEventHandler.cxx:727
 TGLEventHandler.cxx:728
 TGLEventHandler.cxx:729
 TGLEventHandler.cxx:730
 TGLEventHandler.cxx:731
 TGLEventHandler.cxx:732
 TGLEventHandler.cxx:733
 TGLEventHandler.cxx:734
 TGLEventHandler.cxx:735
 TGLEventHandler.cxx:736
 TGLEventHandler.cxx:737
 TGLEventHandler.cxx:738
 TGLEventHandler.cxx:739
 TGLEventHandler.cxx:740
 TGLEventHandler.cxx:741
 TGLEventHandler.cxx:742
 TGLEventHandler.cxx:743
 TGLEventHandler.cxx:744
 TGLEventHandler.cxx:745
 TGLEventHandler.cxx:746
 TGLEventHandler.cxx:747
 TGLEventHandler.cxx:748
 TGLEventHandler.cxx:749
 TGLEventHandler.cxx:750
 TGLEventHandler.cxx:751
 TGLEventHandler.cxx:752
 TGLEventHandler.cxx:753
 TGLEventHandler.cxx:754
 TGLEventHandler.cxx:755
 TGLEventHandler.cxx:756
 TGLEventHandler.cxx:757
 TGLEventHandler.cxx:758
 TGLEventHandler.cxx:759
 TGLEventHandler.cxx:760
 TGLEventHandler.cxx:761
 TGLEventHandler.cxx:762
 TGLEventHandler.cxx:763
 TGLEventHandler.cxx:764
 TGLEventHandler.cxx:765
 TGLEventHandler.cxx:766
 TGLEventHandler.cxx:767
 TGLEventHandler.cxx:768
 TGLEventHandler.cxx:769
 TGLEventHandler.cxx:770
 TGLEventHandler.cxx:771
 TGLEventHandler.cxx:772
 TGLEventHandler.cxx:773
 TGLEventHandler.cxx:774
 TGLEventHandler.cxx:775
 TGLEventHandler.cxx:776
 TGLEventHandler.cxx:777
 TGLEventHandler.cxx:778
 TGLEventHandler.cxx:779
 TGLEventHandler.cxx:780
 TGLEventHandler.cxx:781
 TGLEventHandler.cxx:782
 TGLEventHandler.cxx:783
 TGLEventHandler.cxx:784
 TGLEventHandler.cxx:785
 TGLEventHandler.cxx:786
 TGLEventHandler.cxx:787
 TGLEventHandler.cxx:788
 TGLEventHandler.cxx:789
 TGLEventHandler.cxx:790
 TGLEventHandler.cxx:791
 TGLEventHandler.cxx:792
 TGLEventHandler.cxx:793
 TGLEventHandler.cxx:794
 TGLEventHandler.cxx:795
 TGLEventHandler.cxx:796
 TGLEventHandler.cxx:797
 TGLEventHandler.cxx:798
 TGLEventHandler.cxx:799
 TGLEventHandler.cxx:800
 TGLEventHandler.cxx:801
 TGLEventHandler.cxx:802
 TGLEventHandler.cxx:803
 TGLEventHandler.cxx:804
 TGLEventHandler.cxx:805
 TGLEventHandler.cxx:806
 TGLEventHandler.cxx:807
 TGLEventHandler.cxx:808
 TGLEventHandler.cxx:809
 TGLEventHandler.cxx:810
 TGLEventHandler.cxx:811
 TGLEventHandler.cxx:812
 TGLEventHandler.cxx:813
 TGLEventHandler.cxx:814
 TGLEventHandler.cxx:815
 TGLEventHandler.cxx:816
 TGLEventHandler.cxx:817
 TGLEventHandler.cxx:818
 TGLEventHandler.cxx:819
 TGLEventHandler.cxx:820
 TGLEventHandler.cxx:821
 TGLEventHandler.cxx:822
 TGLEventHandler.cxx:823
 TGLEventHandler.cxx:824
 TGLEventHandler.cxx:825
 TGLEventHandler.cxx:826
 TGLEventHandler.cxx:827
 TGLEventHandler.cxx:828
 TGLEventHandler.cxx:829
 TGLEventHandler.cxx:830
 TGLEventHandler.cxx:831
 TGLEventHandler.cxx:832
 TGLEventHandler.cxx:833
 TGLEventHandler.cxx:834
 TGLEventHandler.cxx:835
 TGLEventHandler.cxx:836
 TGLEventHandler.cxx:837
 TGLEventHandler.cxx:838
 TGLEventHandler.cxx:839
 TGLEventHandler.cxx:840
 TGLEventHandler.cxx:841
 TGLEventHandler.cxx:842
 TGLEventHandler.cxx:843
 TGLEventHandler.cxx:844
 TGLEventHandler.cxx:845
 TGLEventHandler.cxx:846
 TGLEventHandler.cxx:847
 TGLEventHandler.cxx:848
 TGLEventHandler.cxx:849
 TGLEventHandler.cxx:850
 TGLEventHandler.cxx:851
 TGLEventHandler.cxx:852
 TGLEventHandler.cxx:853
 TGLEventHandler.cxx:854
 TGLEventHandler.cxx:855
 TGLEventHandler.cxx:856
 TGLEventHandler.cxx:857
 TGLEventHandler.cxx:858
 TGLEventHandler.cxx:859
 TGLEventHandler.cxx:860
 TGLEventHandler.cxx:861
 TGLEventHandler.cxx:862
 TGLEventHandler.cxx:863
 TGLEventHandler.cxx:864
 TGLEventHandler.cxx:865
 TGLEventHandler.cxx:866
 TGLEventHandler.cxx:867
 TGLEventHandler.cxx:868
 TGLEventHandler.cxx:869
 TGLEventHandler.cxx:870
 TGLEventHandler.cxx:871
 TGLEventHandler.cxx:872
 TGLEventHandler.cxx:873
 TGLEventHandler.cxx:874
 TGLEventHandler.cxx:875
 TGLEventHandler.cxx:876
 TGLEventHandler.cxx:877
 TGLEventHandler.cxx:878
 TGLEventHandler.cxx:879
 TGLEventHandler.cxx:880
 TGLEventHandler.cxx:881
 TGLEventHandler.cxx:882
 TGLEventHandler.cxx:883
 TGLEventHandler.cxx:884
 TGLEventHandler.cxx:885
 TGLEventHandler.cxx:886
 TGLEventHandler.cxx:887
 TGLEventHandler.cxx:888
 TGLEventHandler.cxx:889
 TGLEventHandler.cxx:890
 TGLEventHandler.cxx:891
 TGLEventHandler.cxx:892
 TGLEventHandler.cxx:893
 TGLEventHandler.cxx:894
 TGLEventHandler.cxx:895
 TGLEventHandler.cxx:896
 TGLEventHandler.cxx:897
 TGLEventHandler.cxx:898
 TGLEventHandler.cxx:899
 TGLEventHandler.cxx:900
 TGLEventHandler.cxx:901
 TGLEventHandler.cxx:902
 TGLEventHandler.cxx:903
 TGLEventHandler.cxx:904
 TGLEventHandler.cxx:905
 TGLEventHandler.cxx:906
 TGLEventHandler.cxx:907
 TGLEventHandler.cxx:908
 TGLEventHandler.cxx:909
 TGLEventHandler.cxx:910
 TGLEventHandler.cxx:911
 TGLEventHandler.cxx:912
 TGLEventHandler.cxx:913
 TGLEventHandler.cxx:914
 TGLEventHandler.cxx:915
 TGLEventHandler.cxx:916
 TGLEventHandler.cxx:917
 TGLEventHandler.cxx:918
 TGLEventHandler.cxx:919
 TGLEventHandler.cxx:920
 TGLEventHandler.cxx:921
 TGLEventHandler.cxx:922
 TGLEventHandler.cxx:923
 TGLEventHandler.cxx:924
 TGLEventHandler.cxx:925
 TGLEventHandler.cxx:926
 TGLEventHandler.cxx:927
 TGLEventHandler.cxx:928
 TGLEventHandler.cxx:929
 TGLEventHandler.cxx:930
 TGLEventHandler.cxx:931
 TGLEventHandler.cxx:932
 TGLEventHandler.cxx:933
 TGLEventHandler.cxx:934
 TGLEventHandler.cxx:935
 TGLEventHandler.cxx:936
 TGLEventHandler.cxx:937
 TGLEventHandler.cxx:938
 TGLEventHandler.cxx:939
 TGLEventHandler.cxx:940
 TGLEventHandler.cxx:941
 TGLEventHandler.cxx:942
 TGLEventHandler.cxx:943
 TGLEventHandler.cxx:944
 TGLEventHandler.cxx:945
 TGLEventHandler.cxx:946
 TGLEventHandler.cxx:947
 TGLEventHandler.cxx:948
 TGLEventHandler.cxx:949
 TGLEventHandler.cxx:950
 TGLEventHandler.cxx:951
 TGLEventHandler.cxx:952
 TGLEventHandler.cxx:953
 TGLEventHandler.cxx:954
 TGLEventHandler.cxx:955
 TGLEventHandler.cxx:956
 TGLEventHandler.cxx:957
 TGLEventHandler.cxx:958
 TGLEventHandler.cxx:959
 TGLEventHandler.cxx:960
 TGLEventHandler.cxx:961
 TGLEventHandler.cxx:962
 TGLEventHandler.cxx:963
 TGLEventHandler.cxx:964
 TGLEventHandler.cxx:965
 TGLEventHandler.cxx:966
 TGLEventHandler.cxx:967
 TGLEventHandler.cxx:968
 TGLEventHandler.cxx:969
 TGLEventHandler.cxx:970
 TGLEventHandler.cxx:971
 TGLEventHandler.cxx:972
 TGLEventHandler.cxx:973
 TGLEventHandler.cxx:974
 TGLEventHandler.cxx:975
 TGLEventHandler.cxx:976
 TGLEventHandler.cxx:977
 TGLEventHandler.cxx:978
 TGLEventHandler.cxx:979
 TGLEventHandler.cxx:980
 TGLEventHandler.cxx:981
 TGLEventHandler.cxx:982
 TGLEventHandler.cxx:983
 TGLEventHandler.cxx:984
 TGLEventHandler.cxx:985
 TGLEventHandler.cxx:986
 TGLEventHandler.cxx:987
 TGLEventHandler.cxx:988
 TGLEventHandler.cxx:989
 TGLEventHandler.cxx:990
 TGLEventHandler.cxx:991
 TGLEventHandler.cxx:992
 TGLEventHandler.cxx:993
 TGLEventHandler.cxx:994
 TGLEventHandler.cxx:995
 TGLEventHandler.cxx:996
 TGLEventHandler.cxx:997
 TGLEventHandler.cxx:998
 TGLEventHandler.cxx:999
 TGLEventHandler.cxx:1000
 TGLEventHandler.cxx:1001
 TGLEventHandler.cxx:1002
 TGLEventHandler.cxx:1003
 TGLEventHandler.cxx:1004
 TGLEventHandler.cxx:1005
 TGLEventHandler.cxx:1006
 TGLEventHandler.cxx:1007
 TGLEventHandler.cxx:1008
 TGLEventHandler.cxx:1009
 TGLEventHandler.cxx:1010
 TGLEventHandler.cxx:1011
 TGLEventHandler.cxx:1012
 TGLEventHandler.cxx:1013
 TGLEventHandler.cxx:1014
 TGLEventHandler.cxx:1015
 TGLEventHandler.cxx:1016
 TGLEventHandler.cxx:1017
 TGLEventHandler.cxx:1018
 TGLEventHandler.cxx:1019
 TGLEventHandler.cxx:1020
 TGLEventHandler.cxx:1021
 TGLEventHandler.cxx:1022
 TGLEventHandler.cxx:1023
 TGLEventHandler.cxx:1024
 TGLEventHandler.cxx:1025
 TGLEventHandler.cxx:1026
 TGLEventHandler.cxx:1027
 TGLEventHandler.cxx:1028
 TGLEventHandler.cxx:1029
 TGLEventHandler.cxx:1030
 TGLEventHandler.cxx:1031
 TGLEventHandler.cxx:1032
 TGLEventHandler.cxx:1033
 TGLEventHandler.cxx:1034
 TGLEventHandler.cxx:1035
 TGLEventHandler.cxx:1036
 TGLEventHandler.cxx:1037
 TGLEventHandler.cxx:1038
 TGLEventHandler.cxx:1039
 TGLEventHandler.cxx:1040
 TGLEventHandler.cxx:1041
 TGLEventHandler.cxx:1042
 TGLEventHandler.cxx:1043
 TGLEventHandler.cxx:1044
 TGLEventHandler.cxx:1045
 TGLEventHandler.cxx:1046
 TGLEventHandler.cxx:1047
 TGLEventHandler.cxx:1048
 TGLEventHandler.cxx:1049
 TGLEventHandler.cxx:1050
 TGLEventHandler.cxx:1051
 TGLEventHandler.cxx:1052
 TGLEventHandler.cxx:1053
 TGLEventHandler.cxx:1054
 TGLEventHandler.cxx:1055
 TGLEventHandler.cxx:1056
 TGLEventHandler.cxx:1057
 TGLEventHandler.cxx:1058
 TGLEventHandler.cxx:1059
 TGLEventHandler.cxx:1060
 TGLEventHandler.cxx:1061
 TGLEventHandler.cxx:1062
 TGLEventHandler.cxx:1063
 TGLEventHandler.cxx:1064
 TGLEventHandler.cxx:1065
 TGLEventHandler.cxx:1066
 TGLEventHandler.cxx:1067
 TGLEventHandler.cxx:1068
 TGLEventHandler.cxx:1069
 TGLEventHandler.cxx:1070
 TGLEventHandler.cxx:1071
 TGLEventHandler.cxx:1072
 TGLEventHandler.cxx:1073
 TGLEventHandler.cxx:1074
 TGLEventHandler.cxx:1075
 TGLEventHandler.cxx:1076
 TGLEventHandler.cxx:1077
 TGLEventHandler.cxx:1078
 TGLEventHandler.cxx:1079
 TGLEventHandler.cxx:1080
 TGLEventHandler.cxx:1081
 TGLEventHandler.cxx:1082
 TGLEventHandler.cxx:1083
 TGLEventHandler.cxx:1084
 TGLEventHandler.cxx:1085
 TGLEventHandler.cxx:1086
 TGLEventHandler.cxx:1087
 TGLEventHandler.cxx:1088
 TGLEventHandler.cxx:1089
 TGLEventHandler.cxx:1090
 TGLEventHandler.cxx:1091
 TGLEventHandler.cxx:1092
 TGLEventHandler.cxx:1093
 TGLEventHandler.cxx:1094
 TGLEventHandler.cxx:1095
 TGLEventHandler.cxx:1096
 TGLEventHandler.cxx:1097
 TGLEventHandler.cxx:1098
 TGLEventHandler.cxx:1099
 TGLEventHandler.cxx:1100
 TGLEventHandler.cxx:1101
 TGLEventHandler.cxx:1102
 TGLEventHandler.cxx:1103
 TGLEventHandler.cxx:1104
 TGLEventHandler.cxx:1105
 TGLEventHandler.cxx:1106
 TGLEventHandler.cxx:1107
 TGLEventHandler.cxx:1108
 TGLEventHandler.cxx:1109
 TGLEventHandler.cxx:1110
 TGLEventHandler.cxx:1111
 TGLEventHandler.cxx:1112
 TGLEventHandler.cxx:1113
 TGLEventHandler.cxx:1114
 TGLEventHandler.cxx:1115
 TGLEventHandler.cxx:1116
 TGLEventHandler.cxx:1117
 TGLEventHandler.cxx:1118
 TGLEventHandler.cxx:1119
 TGLEventHandler.cxx:1120
 TGLEventHandler.cxx:1121
 TGLEventHandler.cxx:1122
 TGLEventHandler.cxx:1123
 TGLEventHandler.cxx:1124
 TGLEventHandler.cxx:1125
 TGLEventHandler.cxx:1126
 TGLEventHandler.cxx:1127
 TGLEventHandler.cxx:1128
 TGLEventHandler.cxx:1129
 TGLEventHandler.cxx:1130
 TGLEventHandler.cxx:1131
 TGLEventHandler.cxx:1132
 TGLEventHandler.cxx:1133
 TGLEventHandler.cxx:1134
 TGLEventHandler.cxx:1135
 TGLEventHandler.cxx:1136
 TGLEventHandler.cxx:1137
 TGLEventHandler.cxx:1138
 TGLEventHandler.cxx:1139
 TGLEventHandler.cxx:1140
 TGLEventHandler.cxx:1141