31 #include "RConfigure.h"
53 ClassImp(TGLEventHandler);
58 TGLEventHandler::TGLEventHandler(TGWindow *w, TObject *obj) :
59 TGEventHandler (
"TGLEventHandler", w, obj),
60 fGLViewer ((TGLViewer *)obj),
63 fLastMouseOverPos (-1, -1),
64 fLastMouseOverShape (0),
68 fIgnoreButtonUp (kFALSE),
69 fInPointerGrab (kFALSE),
70 fMouseTimerRunning (kFALSE),
71 fTooltipShown (kFALSE),
73 fTooltipPixelTolerance (3),
74 fSecSelType(TGLViewer::kOnRequest),
75 fDoInternalSelection(kTRUE),
76 fViewerCentricControls(kFALSE)
78 fMouseTimer =
new TTimer(
this, 80);
79 fTooltip =
new TGToolTip(0, 0,
"", 650);
81 fViewerCentricControls = gEnv->GetValue(
"OpenGL.EventHandler.ViewerCentricControls", 0) != 0;
82 fArrowKeyFactor = gEnv->GetValue(
"OpenGL.EventHandler.ArrowKeyFactor", 1.0);
83 fMouseDragFactor = gEnv->GetValue(
"OpenGL.EventHandler.MouseDragFactor", 1.0);
84 fMouseWheelFactor = gEnv->GetValue(
"OpenGL.EventHandler.MouseWheelFactor", 1.0);
90 TGLEventHandler::~TGLEventHandler()
99 void TGLEventHandler::GrabMouse()
103 gVirtualX->GrabPointer(fGLViewer->GetGLWidget()->GetId(),
104 kButtonPressMask | kButtonReleaseMask | kPointerMotionMask,
105 kNone, kNone, kTRUE, kFALSE);
106 fInPointerGrab = kTRUE;
113 void TGLEventHandler::UnGrabMouse()
117 gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);
118 fInPointerGrab = kFALSE;
127 void TGLEventHandler::SelectForClicked(Event_t *event)
129 fGLViewer->RequestSelect(fLastPos.fX, fLastPos.fY);
131 TGLLogicalShape *lshp = fGLViewer->fSelRec.GetLogShape();
132 TObject *obj = fGLViewer->fSelRec.GetObject();
135 if (lshp && (event->fState & kKeyMod1Mask || (fSecSelType == TGLViewer::kOnRequest && lshp->AlwaysSecondarySelect())))
137 fGLViewer->RequestSecondarySelect(fLastPos.fX, fLastPos.fY);
138 fGLViewer->fSecSelRec.SetMultiple(event->fState & kKeyControlMask);
140 lshp->ProcessSelection(*fGLViewer->fRnrCtx, fGLViewer->fSecSelRec);
142 switch (fGLViewer->fSecSelRec.GetSecSelResult())
144 case TGLSelectRecord::kEnteringSelection:
145 fGLViewer->Clicked(obj, event->fCode, event->fState);
147 case TGLSelectRecord::kLeavingSelection:
148 fGLViewer->UnClicked(obj, event->fCode, event->fState);
150 case TGLSelectRecord::kModifyingInternalSelection:
151 fGLViewer->ReClicked(obj, event->fCode, event->fState);
159 fGLViewer->Clicked(obj);
160 fGLViewer->Clicked(obj, event->fCode, event->fState);
169 void TGLEventHandler::SelectForMouseOver()
171 fGLViewer->RequestSelect(fLastPos.fX, fLastPos.fY);
173 TGLPhysicalShape *pshp = fGLViewer->fSelRec.GetPhysShape();
174 TGLLogicalShape *lshp = fGLViewer->fSelRec.GetLogShape();
175 TObject *obj = fGLViewer->fSelRec.GetObject();
177 if (lshp && (fSecSelType == TGLViewer::kOnRequest && lshp->AlwaysSecondarySelect()))
179 fGLViewer->RequestSecondarySelect(fLastPos.fX, fLastPos.fY);
180 fGLViewer->fSecSelRec.SetMultiple(kFALSE);
181 fGLViewer->fSecSelRec.SetHighlight(kTRUE);
183 lshp->ProcessSelection(*fGLViewer->fRnrCtx, fGLViewer->fSecSelRec);
185 fGLViewer->fSecSelRec.SetHighlight(kFALSE);
187 switch (fGLViewer->fSecSelRec.GetSecSelResult())
189 case TGLSelectRecord::kEnteringSelection:
190 fGLViewer->MouseOver(obj, fLastEventState);
192 case TGLSelectRecord::kModifyingInternalSelection:
193 fGLViewer->ReMouseOver(obj, fLastEventState);
195 case TGLSelectRecord::kLeavingSelection:
196 fGLViewer->UnMouseOver(obj, fLastEventState);
202 else if (fLastMouseOverShape != pshp)
204 fGLViewer->MouseOver(pshp);
205 fGLViewer->MouseOver(pshp, fLastEventState);
206 fGLViewer->MouseOver(obj, fLastEventState);
208 fLastMouseOverShape = pshp;
209 fLastMouseOverPos = fLastPos;
219 void TGLEventHandler::ExecuteEvent(Int_t event, Int_t px, Int_t py)
239 Event_t eventSt = { kOtherEvent, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
240 kFALSE, 0, 0, {0, 0, 0, 0, 0} };
244 eventSt.fXRoot = eventSt.fYRoot = 0;
246 if (event != kKeyPress) {
247 eventSt.fY -= Int_t((1 - gPad->GetHNDC() - gPad->GetYlowNDC()) * gPad->GetWh());
248 eventSt.fX -= Int_t(gPad->GetXlowNDC() * gPad->GetWw());
249 eventSt.fXRoot = eventSt.fX;
250 eventSt.fYRoot = eventSt.fY;
255 eventSt.fCode = kMouseMotion;
256 eventSt.fType = kMotionNotify;
257 HandleMotion(&eventSt);
262 eventSt.fCode = kButton1;
263 eventSt.fType =
event == kButton1Down ? kButtonPress:kButtonRelease;
264 HandleButton(&eventSt);
270 eventSt.fCode = kButton2;
271 eventSt.fType =
event == kButton2Down ? kButtonPress:kButtonRelease;
272 HandleButton(&eventSt);
277 eventSt.fState = kKeyShiftMask;
278 eventSt.fCode = kButton1;
279 eventSt.fType = kButtonPress;
280 HandleButton(&eventSt);
285 eventSt.fCode = kButton3;
286 eventSt.fType = kButtonRelease;
287 HandleButton(&eventSt);
294 eventSt.fCode =
event == kButton1Double ? kButton1 :
event == kButton2Double ? kButton2 : kButton3;
295 eventSt.fType = kButtonDoubleClick;
296 HandleDoubleClick(&eventSt);
304 eventSt.fCode =
event == kButton1Motion ? kButton1 :
event == kButton2Motion ? kButton2 : kButton3;
305 eventSt.fType = kMotionNotify;
306 HandleMotion(&eventSt);
311 eventSt.fType = kGKeyPress;
317 if (fGLViewer->CurrentCamera().Zoom(+50, kFALSE, kFALSE)) {
318 if (fGLViewer->fGLDevice != -1) {
319 gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
320 gVirtualX->SetDrawMode(TVirtualX::kCopy);
322 fGLViewer->RequestDraw();
326 if (fGLViewer->CurrentCamera().Zoom(-50, kFALSE, kFALSE)) {
327 if (fGLViewer->fGLDevice != -1) {
328 gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
329 gVirtualX->SetDrawMode(TVirtualX::kCopy);
331 fGLViewer->RequestDraw();
335 eventSt.fState = kKeyShiftMask;
336 eventSt.fCode = kButton1;
337 eventSt.fType = kButtonPress;
338 HandleButton(&eventSt);
351 Bool_t TGLEventHandler::HandleEvent(Event_t *event)
353 if (event->fType == kFocusIn) {
354 if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
355 Error(
"TGLEventHandler::HandleEvent",
"active drag-action at focus-in.");
356 fGLViewer->fDragAction = TGLViewer::kDragNone;
360 if (event->fType == kFocusOut) {
361 if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
362 Warning(
"TGLEventHandler::HandleEvent",
"drag-action active at focus-out.");
363 fGLViewer->fDragAction = TGLViewer::kDragNone;
376 Bool_t TGLEventHandler::HandleFocusChange(Event_t *event)
378 fGLViewer->MouseIdle(0, 0, 0);
379 if (event->fType == kFocusIn) {
380 if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
381 Error(
"TGLEventHandler::HandleFocusChange",
"active drag-action at focus-in.");
382 fGLViewer->fDragAction = TGLViewer::kDragNone;
385 fGLViewer->Activated();
387 if (event->fType == kFocusOut) {
388 if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
389 Warning(
"TGLEventHandler::HandleFocusChange",
"drag-action active at focus-out.");
390 fGLViewer->fDragAction = TGLViewer::kDragNone;
403 Bool_t TGLEventHandler::HandleCrossing(Event_t *event)
406 if (event->fCode != 0) {
410 fGLViewer->MouseIdle(0, 0, 0);
411 if (event->fType == kEnterNotify) {
412 if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
413 Error(
"TGLEventHandler::HandleCrossing",
"active drag-action at enter-notify.");
414 fGLViewer->fDragAction = TGLViewer::kDragNone;
418 fGLViewer->Activated();
420 if (event->fType == kLeaveNotify) {
421 if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
422 Warning(
"TGLEventHandler::HandleCrossing",
"drag-action active at leave-notify.");
423 fGLViewer->fDragAction = TGLViewer::kDragNone;
435 Bool_t TGLEventHandler::HandleButton(Event_t * event)
437 if (fGLViewer->IsLocked()) {
439 Info(
"TGLEventHandler::HandleButton",
"ignored - viewer is %s",
440 fGLViewer->LockName(fGLViewer->CurrentLock()));
446 if (event->fCode > kButton3)
452 if (event->fType == kButtonRelease)
454 Bool_t redraw = kFALSE;
456 Int_t zoom = TMath::Nint(fMouseWheelFactor * ControlValue(50));
460 redraw = fGLViewer->CurrentCamera().Zoom(zoom, kFALSE, kFALSE);
464 redraw = fGLViewer->CurrentCamera().Zoom(-zoom, kFALSE, kFALSE);
473 fGLViewer->fRedrawTimer->RequestDraw(10, TGLRnrCtx::kLODMed);
480 if (fActiveButtonID && event->fCode != fActiveButtonID)
486 fActiveButtonID =
event->fCode;
489 #if defined(R__HAS_COCOA)
491 if (event->fCode == kButton1 && event->fState & kKeyMod2Mask)
493 event->fCode =
event->fState & kKeyMod1Mask ? kButton3 : kButton2;
498 if (event->fType == kButtonPress)
502 fGLViewer->MouseIdle(0, 0, 0);
504 fButtonPushPos.fX =
event->fX;
505 fButtonPushPos.fY =
event->fY;
507 if (fGLViewer->GetPushAction() != TGLViewer::kPushStd)
509 fGLViewer->RequestSelect(event->fX, event->fY);
510 if (fGLViewer->fSelRec.GetN() > 0)
512 TGLVector3 v(event->fX, event->fY, 0.5*fGLViewer->fSelRec.GetMinZ());
513 fGLViewer->CurrentCamera().WindowToViewport(v);
514 v = fGLViewer->CurrentCamera().ViewportToWorld(v);
515 if (fGLViewer->GetPushAction() == TGLViewer::kPushCamCenter)
517 fGLViewer->CurrentCamera().SetExternalCenter(kTRUE);
518 fGLViewer->CurrentCamera().SetCenterVec(v.X(), v.Y(), v.Z());
522 TGLSelectRecord& rec = fGLViewer->GetSelRec();
523 TObject* obj = rec.GetObject();
524 TGLRect& vp = fGLViewer->CurrentCamera().RefViewport();
525 Int_t x =
event->fX, y =
event->fY;
526 TGLUtil::PointToViewport(x, y);
527 new TGLAnnotation(fGLViewer, obj->GetTitle(),
529 1 - y * 1.0f/vp.Height(), v);
532 fGLViewer->RequestDraw();
537 Bool_t handled = kFALSE;
539 if (fGLViewer->fDragAction == TGLViewer::kDragNone && fGLViewer->fCurrentOvlElm)
542 TGLUtil::PointToViewport(e.fX, e.fY);
543 if (fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, &e))
546 fGLViewer->fDragAction = TGLViewer::kDragOverlay;
547 fGLViewer->RequestDraw();
553 switch (event->fCode)
558 fGLViewer->fDragAction = TGLViewer::kDragCameraRotate;
561 fMouseTimer->TurnOff();
562 fMouseTimer->Reset();
569 fGLViewer->fDragAction = TGLViewer::kDragCameraTruck;
575 fGLViewer->fDragAction = TGLViewer::kDragCameraDolly;
582 else if (event->fType == kButtonRelease)
592 Warning(
"TGLEventHandler::HandleButton",
"Unexpected button-release.");
597 fIgnoreButtonUp = kFALSE;
601 if (fGLViewer->GetPushAction() != TGLViewer::kPushStd)
604 fGLViewer->fPushAction = TGLViewer::kPushStd;
605 fGLViewer->RefreshPadEditor(fGLViewer);
608 else if (fGLViewer->fDragAction == TGLViewer::kDragOverlay && fGLViewer->fCurrentOvlElm)
611 TGLUtil::PointToViewport(e.fX, e.fY);
612 fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, &e);
613 fGLViewer->OverlayDragFinished();
614 if (fGLViewer->RequestOverlaySelect(event->fX, event->fY))
615 fGLViewer->RequestDraw();
617 else if (fGLViewer->fDragAction >= TGLViewer::kDragCameraRotate &&
618 fGLViewer->fDragAction <= TGLViewer::kDragCameraDolly)
620 fGLViewer->RequestDraw(TGLRnrCtx::kLODHigh);
623 fGLViewer->fDragAction = TGLViewer::kDragNone;
625 if (fGLViewer->fGLDevice != -1)
627 gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kFALSE);
630 if (event->fX == fButtonPushPos.fX && event->fY == fButtonPushPos.fY)
632 if (event->fCode == kButton1)
634 if (event->fState & kKeyShiftMask && fDoInternalSelection)
636 if (fGLViewer->RequestSelect(event->fX, event->fY))
638 fGLViewer->ApplySelection();
643 SelectForClicked(event);
646 else if (event->fCode == kButton3)
650 gVirtualX->TranslateCoordinates(fGLViewer->fGLWidget->GetId(), gClient->GetDefaultRoot()->GetId(),
651 event->fX,
event->fY, x, y, childdum);
653 fGLViewer->RequestSelect(event->fX, event->fY);
655 PopupContextMenu(fGLViewer->fSelRec.GetPhysShape(), event, x, y);
659 if (event->fCode == kButton1 && fMouseTimer)
661 fMouseTimer->TurnOn();
671 Bool_t TGLEventHandler::HandleDoubleClick(Event_t *event)
673 if (fGLViewer->IsLocked()) {
675 Info(
"TGLEventHandler::HandleDoubleClick",
"ignored - viewer is %s",
676 fGLViewer->LockName(fGLViewer->CurrentLock()));
681 if (event->fCode > 3)
687 fActiveButtonID =
event->fCode;
690 fGLViewer->MouseIdle(0, 0, 0);
691 if (event->fCode == kButton1)
693 fGLViewer->DoubleClicked();
694 if (fGLViewer->GetSelected() == 0)
695 fGLViewer->SelectionChanged();
703 Bool_t TGLEventHandler::HandleConfigureNotify(Event_t *event)
705 if (fGLViewer->IsLocked())
708 Info(
"TGLEventHandler::HandleConfigureNotify",
"ignored - viewer is %s",
709 fGLViewer->LockName(fGLViewer->CurrentLock()));
715 Int_t x =
event->fX, y =
event->fY, w =
event->fWidth, h =
event->fHeight;
716 TGLUtil::PointToViewport(x, y, w, h);
717 fGLViewer->SetViewport(x, y, w, h);
718 fGLViewer->fRedrawTimer->RequestDraw(10, TGLRnrCtx::kLODMed);
726 Bool_t TGLEventHandler::HandleExpose(Event_t * event)
728 if (event->fCount != 0)
return kTRUE;
730 if (fGLViewer->IsLocked()) {
732 Info(
"TGLViewer::HandleExpose",
"ignored - viewer is %s",
733 fGLViewer->LockName(fGLViewer->CurrentLock()));
738 fGLViewer->fRedrawTimer->RequestDraw(20, TGLRnrCtx::kLODHigh);
745 Bool_t TGLEventHandler::HandleKey(Event_t *event)
748 if (event->fType == kKeyRelease)
754 fLastEventState =
event->fState;
756 fGLViewer->MouseIdle(0, 0, 0);
757 if (fGLViewer->IsLocked()) {
759 Info(
"TGLEventHandler::HandleKey",
"ignored - viewer is %s",
760 fGLViewer->LockName(fGLViewer->CurrentLock()));
768 if (fGLViewer->fGLDevice == -1)
769 gVirtualX->LookupString(event, tmp,
sizeof(tmp), keysym);
771 keysym =
event->fCode;
772 fGLViewer->fRnrCtx->SetEventKeySym(keysym);
774 Bool_t handled = kFALSE;
775 Bool_t redraw = kFALSE;
777 if (fGLViewer->fCurrentOvlElm)
780 TGLUtil::PointToViewport(e.fX, e.fY);
781 if (fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, &e))
790 const Bool_t mod1 =
event->fState & kKeyControlMask;
791 const Bool_t mod2 =
event->fState & kKeyShiftMask;
793 const Int_t shift = TMath::Nint(fArrowKeyFactor * ControlValue(10));
799 fGLViewer->SetStyle(TGLRnrCtx::kFill);
804 fGLViewer->SwitchColorSet();
809 fGLViewer->SetStyle(TGLRnrCtx::kWireFrame);
814 fGLViewer->SetStyle(TGLRnrCtx::kOutline);
819 fGLViewer->RequestSelect(fLastPos.fX, fLastPos.fY);
820 fGLViewer->MouseIdle(fGLViewer->fSelRec.GetPhysShape(), (UInt_t)fLastPos.fX, (UInt_t)fLastPos.fY);
826 fArcBall = ! fArcBall;
831 redraw = fGLViewer->CurrentCamera().Dolly(shift, mod1, mod2);
836 redraw = fGLViewer->CurrentCamera().Dolly(-shift, mod1, mod2);
839 redraw = fGLViewer->CurrentCamera().Truck(0, shift, mod1, mod2);
842 redraw = fGLViewer->CurrentCamera().Truck(0, -shift, mod1, mod2);
845 redraw = fGLViewer->CurrentCamera().Truck(-shift, 0, mod1, mod2);
848 redraw = fGLViewer->CurrentCamera().Truck(shift, 0, mod1, mod2);
852 TGLCamera &cam = fGLViewer->CurrentCamera();
853 cam.SetExternalCenter(!cam.GetExternalCenter());
854 fGLViewer->RefreshPadEditor(fGLViewer);
856 fGLViewer->ResetCurrentCamera();
863 fGLViewer->fDebugMode = !fGLViewer->fDebugMode;
865 Info(
"OpenGL viewer debug mode : ", fGLViewer->fDebugMode ?
"ON" :
"OFF");
869 if (fGLViewer->fDebugMode) {
870 Info(
"OpenGL viewer FORCED rebuild",
" ");
871 fGLViewer->UpdateScene();
878 if (fGLViewer->fGLDevice != -1)
879 gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
880 fGLViewer->RequestDraw();
889 Bool_t TGLEventHandler::HandleMotion(Event_t * event)
891 fGLViewer->MouseIdle(0, 0, 0);
892 if (fGLViewer->IsLocked()) {
894 Info(
"TGLEventHandler::HandleMotion",
"ignored - viewer is %s",
895 fGLViewer->LockName(fGLViewer->CurrentLock()));
900 Bool_t processed = kFALSE, changed = kFALSE;
901 Short_t lod = TGLRnrCtx::kLODMed;
904 Int_t xDelta = TMath::Nint(fMouseDragFactor * ControlValue(event->fX - fLastPos.fX));
905 Int_t yDelta = TMath::Nint(fMouseDragFactor * ControlValue(event->fY - fLastPos.fY));
906 Bool_t mod1 =
event->fState & kKeyControlMask;
907 Bool_t mod2 =
event->fState & kKeyShiftMask;
908 TGLUtil::PointToViewport(xDelta, yDelta);
910 if (fMouseTimerRunning) StopMouseTimer();
913 ( TMath::Abs(event->fXRoot - fTooltipPos.fX) > fTooltipPixelTolerance ||
914 TMath::Abs(event->fYRoot - fTooltipPos.fY) > fTooltipPixelTolerance ))
919 if (fGLViewer->fDragAction == TGLViewer::kDragNone)
921 if (fGLViewer->fRedrawTimer->IsPending()) {
923 Info(
"TGLEventHandler::HandleMotion",
"Redraw pending, ignoring.");
926 changed = fGLViewer->RequestOverlaySelect(event->fX, event->fY);
927 if (fGLViewer->fCurrentOvlElm)
930 TGLUtil::PointToViewport(e.fX, e.fY);
931 processed = fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, &e);
933 lod = TGLRnrCtx::kLODHigh;
934 if ( ! processed && ! fMouseTimerRunning)
937 else if (fGLViewer->fDragAction == TGLViewer::kDragCameraRotate)
939 processed = Rotate(xDelta, yDelta, mod1, mod2);
941 else if (fGLViewer->fDragAction == TGLViewer::kDragCameraTruck)
943 processed = fGLViewer->CurrentCamera().Truck(xDelta, -yDelta, mod1, mod2);
945 else if (fGLViewer->fDragAction == TGLViewer::kDragCameraDolly)
947 processed = fGLViewer->CurrentCamera().Dolly(yDelta - xDelta, mod1, mod2);
949 else if (fGLViewer->fDragAction == TGLViewer::kDragOverlay)
951 if (fGLViewer->fCurrentOvlElm) {
953 TGLUtil::PointToViewport(e.fX, e.fY);
954 processed = fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, &e);
958 fLastPos.fX =
event->fX;
959 fLastPos.fY =
event->fY;
961 fLastGlobalPos.fX =
event->fXRoot;
962 fLastGlobalPos.fY =
event->fYRoot;
964 if (processed || changed) {
965 if (fGLViewer->fGLDevice != -1) {
966 gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
967 gVirtualX->SetDrawMode(TVirtualX::kCopy);
970 fGLViewer->RequestDraw(lod);
979 Bool_t TGLEventHandler::Rotate(Int_t xDelta, Int_t yDelta, Bool_t mod1, Bool_t mod2)
981 TGLCamera &cam = fGLViewer->CurrentCamera();
982 if (fArcBall)
return cam.RotateArcBall(xDelta, -yDelta, mod1, mod2);
983 else return cam.Rotate (xDelta, -yDelta, mod1, mod2);
989 Bool_t TGLEventHandler::HandleTimer(TTimer *t)
991 if (t != fMouseTimer)
return kFALSE;
993 fMouseTimerRunning = kFALSE;
995 if (fGLViewer->fRedrawTimer->IsPending()) {
997 Info(
"TGLEventHandler::HandleTimer",
"Redraw pending, ignoring.");
1001 if (fGLViewer->fDragAction == TGLViewer::kDragNone)
1003 if (fLastMouseOverPos != fLastPos)
1005 SelectForMouseOver();
1014 void TGLEventHandler::StartMouseTimer()
1016 fMouseTimer->Start(-1, kTRUE);
1017 fMouseTimerRunning = kTRUE;
1023 void TGLEventHandler::StopMouseTimer()
1025 fMouseTimerRunning = kFALSE;
1026 fMouseTimer->Stop();
1033 void TGLEventHandler::ClearMouseOver()
1035 fLastMouseOverPos.fX = fLastMouseOverPos.fY = -1;
1036 fLastMouseOverShape = 0;
1037 fGLViewer->MouseOver(fLastMouseOverShape);
1038 fGLViewer->MouseOver(fLastMouseOverShape, fLastEventState);
1039 fGLViewer->MouseOver((TObject*)0, fLastEventState);
1041 fGLViewer->ClearCurrentOvlElm();
1047 void TGLEventHandler::Repaint()
1049 if (fGLViewer->IsLocked()) {
1051 Info(
"TGLViewer::HandleExpose",
"ignored - viewer is %s",
1052 fGLViewer->LockName(fGLViewer->CurrentLock()));
1056 fGLViewer->fRedrawTimer->RequestDraw(20, TGLRnrCtx::kLODHigh);
1062 void TGLEventHandler::PopupContextMenu(TGLPhysicalShape* pshp, Event_t * ,
1065 if (!fGLViewer->fContextMenu)
1067 fGLViewer->fContextMenu =
new TContextMenu(
"glcm",
"GL Viewer Context Menu");
1072 fActiveButtonID = 0;
1075 pshp->InvokeContextMenu(*fGLViewer->fContextMenu, gx, gy);
1089 void TGLEventHandler::TriggerTooltip(
const char* text)
1091 static UInt_t screenW = 0, screenH = 0;
1092 fTooltipPos = fLastGlobalPos;
1093 fTooltipShown = kTRUE;
1094 fTooltip->SetText(text);
1095 Int_t x = fTooltipPos.fX + 16, y = fTooltipPos.fY + 16;
1096 if (screenW == 0 || screenH == 0) {
1097 screenW = gClient->GetDisplayWidth();
1098 screenH = gClient->GetDisplayHeight();
1100 if (x + 5 + fTooltip->GetWidth() > screenW) {
1101 x = screenW - fTooltip->GetWidth() - 5;
1102 if (y + 5 + fTooltip->GetHeight() > screenH) {
1103 y -= (25 + fTooltip->GetHeight());
1106 if (y + 5 + fTooltip->GetHeight() > screenH) {
1107 y = screenH - fTooltip->GetHeight() - 10;
1109 fTooltip->SetPosition(x, y);
1116 void TGLEventHandler::RemoveTooltip()
1119 fTooltipShown = kFALSE;
1125 void TGLEventHandler::SetMouseOverSelectDelay(Int_t ms)
1127 fMouseTimer->SetTime(ms);
1133 void TGLEventHandler::SetMouseOverTooltipDelay(Int_t ms)
1135 fTooltip->SetDelay(ms);