ROOT logo
// @(#)root/gl:$Id: TGLEventHandler.cxx 28197 2009-04-14 13:59:27Z matevz $
// 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"

//______________________________________________________________________________
//
// 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.
//
// This class is still under development.

ClassImp(TGLEventHandler);

//______________________________________________________________________________
TGLEventHandler::TGLEventHandler(const char *name, TGWindow *w, TObject *obj,
                                 const char *title) :
   TGEventHandler(name, w, obj, title),
   fGLViewer           ((TGLViewer *)obj),
   fMouseTimer         (0),
   fLastPos            (-1, -1),
   fLastMouseOverPos   (-1, -1),
   fLastMouseOverShape (0),
   fTooltip            (0),
   fActiveButtonID     (0),
   fLastEventState     (0),
   fInPointerGrab      (kFALSE),
   fMouseTimerRunning  (kFALSE),
   fTooltipShown       (kFALSE),
   fTooltipPixelTolerance (3)
{
   // Constructor.

   fMouseTimer = new TTimer(this, 80);
   fTooltip    = new TGToolTip(0, 0, "", 650);
   fTooltip->Hide();
}

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

   delete fMouseTimer;
   delete fTooltip;
}

//______________________________________________________________________________
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;
   eventSt.fX = px;
   eventSt.fY = py;
   eventSt.fState = 0;

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

   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'.
   static Event_t eventSt = {kOtherEvent, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, kFALSE, 0, 0, {0,0,0,0,0}};

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

   // Button DOWN
   if (event->fType == kButtonPress && event->fCode <= kButton3)
   {
      // Allow a single action/button down/up pairing - block others
      fGLViewer->MouseIdle(0, 0, 0);
      fGLViewer->Activated();
      if (fGLViewer->fDragAction != TGLViewer::kDragNone)
         return kFALSE;
      eventSt.fX = event->fX;
      eventSt.fY = event->fY;
      eventSt.fCode = event->fCode;

      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();
               new TGLAnnotation(fGLViewer, obj->GetTitle(),  eventSt.fX*1.f/vp.Width(),  1 - eventSt.fY*1.f/vp.Height(), v);
            }

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

      Bool_t grabPointer = kFALSE;
      Bool_t handled     = kFALSE;

      // Record active button for release
      fActiveButtonID = event->fCode;

      if (fGLViewer->fDragAction == TGLViewer::kDragNone && fGLViewer->fCurrentOvlElm)
      {
         if (fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, event))
         {
            handled     = kTRUE;
            grabPointer = kTRUE;
            fGLViewer->fDragAction = TGLViewer::kDragOverlay;
            fGLViewer->RequestDraw();
         }
      }
      if ( ! handled)
      {
         switch(event->fCode)
         {
            // LEFT mouse button
            case kButton1:
            {
               if (event->fState & kKeyShiftMask) {
                  if (fGLViewer->RequestSelect(event->fX, event->fY)) {
                     fGLViewer->ApplySelection();
                     handled = kTRUE;
                  } else {
                     fGLViewer->SelectionChanged(); // Just notify clients.
                  }
               } else if (event->fState & kKeyMod1Mask) {
                  fGLViewer->RequestSelect(event->fX, event->fY, kTRUE);
                  if (fGLViewer->fSecSelRec.GetPhysShape() != 0)
                  {
                     TGLLogicalShape& lshape = const_cast<TGLLogicalShape&>
                        (*fGLViewer->fSecSelRec.GetPhysShape()->GetLogical());
                     lshape.ProcessSelection(*fGLViewer->fRnrCtx, fGLViewer->fSecSelRec);
                     handled = kTRUE;
                  }
               }
               if ( ! handled) {
                  fGLViewer->fDragAction = TGLViewer::kDragCameraRotate;
                  grabPointer = kTRUE;
                  if (fMouseTimer) {
                     fMouseTimer->TurnOff();
                     fMouseTimer->Reset();
                  }
               }
               break;
            }
            // MID mouse button
            case kButton2:
            {
               fGLViewer->fDragAction = TGLViewer::kDragCameraTruck;
               grabPointer = kTRUE;
               break;
            }
            // RIGHT mouse button
            case kButton3:
            {
               // Shift + Right mouse - select+context menu
               if (event->fState & kKeyShiftMask)
               {
                  fGLViewer->RequestSelect(event->fX, event->fY);
                  const TGLPhysicalShape * selected = fGLViewer->fSelRec.GetPhysShape();
                  if (selected) {
                     if (!fGLViewer->fContextMenu) {
                        fGLViewer->fContextMenu = new TContextMenu("glcm", "GL Viewer Context Menu");
                     }
                     Int_t    x, y;
                     Window_t childdum;
                     gVirtualX->TranslateCoordinates(fGLViewer->fGLWidget->GetId(),
                                                     gClient->GetDefaultRoot()->GetId(),
                                                     event->fX, event->fY, x, y, childdum);
                     selected->InvokeContextMenu(*fGLViewer->fContextMenu, x, y);
                  }
               } else {
                  fGLViewer->fDragAction = TGLViewer::kDragCameraDolly;
                  grabPointer = kTRUE;
               }
               break;
            }
         }
      }

      if (grabPointer)
      {
         gVirtualX->GrabPointer(fGLViewer->GetGLWidget()->GetId(),
                                kButtonPressMask | kButtonReleaseMask | kPointerMotionMask,
                                kNone, kNone, kTRUE, kFALSE);
         fInPointerGrab = kTRUE;
      }
   }
   // Button UP
   else if (event->fType == kButtonRelease)
   {
      if (fInPointerGrab)
      {
         gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);
         fInPointerGrab = kFALSE;
      }

      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)
      {
         fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, event);
         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);
      }

      // TODO: Check on Linux - on Win32 only see button release events
      // for mouse wheel
      switch(event->fCode) {
         // Buttons 4/5 are mouse wheel
         // Note: Modifiers (ctrl/shift) disabled as fState doesn't seem to
         // have correct modifier flags with mouse wheel under Windows.
         case kButton5: {
            // Zoom out (dolly or adjust camera FOV). TODO : val static const somewhere
            if (fGLViewer->CurrentCamera().Zoom(50, kFALSE, kFALSE))
               fGLViewer->fRedrawTimer->RequestDraw(10, TGLRnrCtx::kLODMed);
            return kTRUE;
            break;
         }
         case kButton4: {
            // Zoom in - adjust camera FOV. TODO : val static const somewhere
            if (fGLViewer->CurrentCamera().Zoom(-50, kFALSE, kFALSE))
               fGLViewer->fRedrawTimer->RequestDraw(10, TGLRnrCtx::kLODMed);
            return kTRUE;
            break;
         }
      }
      fGLViewer->fDragAction = TGLViewer::kDragNone;
      if (fGLViewer->fGLDevice != -1)
      {
         gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kFALSE);
      }
      if ((event->fX == eventSt.fX) &&
          (event->fY == eventSt.fY) &&
          (eventSt.fCode == event->fCode))
      {
         TObject *obj = 0;
         fGLViewer->RequestSelect(fLastPos.fX, fLastPos.fY, kFALSE);
         TGLPhysicalShape *phys_shape = fGLViewer->fSelRec.GetPhysShape();
         if (phys_shape) {
            obj = phys_shape->GetLogical()->GetExternal();
         }
         fGLViewer->Clicked(obj);
         fGLViewer->Clicked(obj, event->fCode, event->fState);
         eventSt.fX = 0;
         eventSt.fY = 0;
         eventSt.fCode = 0;
         eventSt.fState = 0;
      }
      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;
   }

   fGLViewer->MouseIdle(0, 0, 0);
   // Reset interactive camera mode on button double
   // click (unless mouse wheel)
   if (event->fCode != kButton4 && event->fCode != kButton5) {
      if (fGLViewer->fResetCameraOnDoubleClick) {
         fGLViewer->ResetCurrentCamera();
         fGLViewer->RequestDraw();
      }
      fGLViewer->DoubleClicked();
   }
   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)
   {
      fGLViewer->SetViewport(event->fX, event->fY, event->fWidth, event->fHeight);
      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'.

   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 redraw = kFALSE;
   if (fGLViewer->fCurrentOvlElm &&
       fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, event))
   {
      redraw = kTRUE;
   }
   else
   {
      Bool_t mod1 = event->fState & kKeyControlMask;
      Bool_t mod2 = event->fState & kKeyShiftMask;

      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, kFALSE);
            fGLViewer->MouseIdle(fGLViewer->fSelRec.GetPhysShape(), (UInt_t)fLastPos.fX, (UInt_t)fLastPos.fY);
            break;

            // Camera
         case kKey_Plus:
         case kKey_J:
         case kKey_j:
            redraw = fGLViewer->CurrentCamera().Dolly(10, mod1, mod2);
            break;
         case kKey_Minus:
         case kKey_K:
         case kKey_k:
            redraw = fGLViewer->CurrentCamera().Dolly(-10, mod1, mod2);
            break;
         case kKey_Up:
            redraw = fGLViewer->CurrentCamera().Truck(0, 10, mod1, mod2);
            break;
         case kKey_Down:
            redraw = fGLViewer->CurrentCamera().Truck(0, -10, mod1, mod2);
            break;
         case kKey_Left:
            redraw = fGLViewer->CurrentCamera().Truck(-10, 0, mod1, mod2);
            break;
         case kKey_Right:
            redraw = fGLViewer->CurrentCamera().Truck(10, 0, mod1, mod2);
            break;
         case kKey_Home:
            fGLViewer->ResetCurrentCamera();
            redraw = kTRUE;
            break;

            // Toggle debugging mode
         case kKey_D:
         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_Space:
            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 = event->fX - fLastPos.fX;
   Int_t  yDelta = event->fY - fLastPos.fY;
   Bool_t mod1   = event->fState & kKeyControlMask;
   Bool_t mod2   = event->fState & kKeyShiftMask;

   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)
         processed = fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, event);
      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(xDelta, mod1, mod2);
   }
   else if (fGLViewer->fDragAction == TGLViewer::kDragOverlay)
   {
      processed = fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, event);
   }

   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.

   return fGLViewer->CurrentCamera().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)
      {
         fGLViewer->RequestSelect(fLastPos.fX, fLastPos.fY, kFALSE);
         if (fLastMouseOverShape != fGLViewer->fSelRec.GetPhysShape())
         {
            fLastMouseOverShape = fGLViewer->fSelRec.GetPhysShape();
            fGLViewer->MouseOver(fLastMouseOverShape);
            fGLViewer->MouseOver(fLastMouseOverShape, fLastEventState);
         }
         fLastMouseOverPos = fLastPos;
      }
   }
   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->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::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