diff --git a/qt/inc/TQtClientFilter.h b/qt/inc/TQtClientFilter.h index 16b18baf36be079517506ce57b5bce14c111144e..ee58f0e7d3d2d0362279d96bc58ddc2b22a1bee7 100644 --- a/qt/inc/TQtClientFilter.h +++ b/qt/inc/TQtClientFilter.h @@ -1,4 +1,4 @@ -// @(#)root/qt:$Name: $:$Id: TQtClientFilter.h,v 1.29 2006/03/15 19:18:48 fine Exp $ +// @(#)root/qt:$Name: $:$Id: TQtClientFilter.h,v 1.7 2006/03/24 15:31:10 antcheva Exp $ // Author: Valeri Fine 21/01/2002 /************************************************************************* @@ -83,6 +83,7 @@ protected: static TQtPointerGrabber *fgGrabber; protected: bool eventFilter( QObject *o, QEvent *e ); + void AddKeyEvent( const QKeyEvent &event, TQtClientWidget *widget); TQtEventQueue *Queue(); void SetKeyGrabber(TQtClientWidget *grabber) { fKeyGrabber = grabber;} void UnSetKeyGrabber(TQtClientWidget *grabber) { if (fKeyGrabber == grabber) fKeyGrabber = 0; } diff --git a/qt/src/GQtGUI.cxx b/qt/src/GQtGUI.cxx index f2ac10e3e5ceb1e987ac74233b46cf204cbb6d07..04fba30352096bfca1e7e1a5fa28c0191ba0473e 100644 --- a/qt/src/GQtGUI.cxx +++ b/qt/src/GQtGUI.cxx @@ -1,4 +1,4 @@ -// @(#)root/qt:$Name: $:$Id: GQtGUI.cxx,v 1.25 2006/05/30 07:06:50 antcheva Exp $ +// @(#)root/qt:$Name: $:$Id: GQtGUI.cxx,v 1.26 2006/06/28 09:30:58 antcheva Exp $ // Author: Valeri Fine 23/01/2003 /************************************************************************* @@ -336,7 +336,7 @@ const QtGContext &QtGContext::Copy(const GCValues_t &gval) break; #endif /* QT_VERSION */ } - DumpROp(fROp); + // DumpROp(fROp); // fprintf(stderr," kGCFunction: fROp = %x\n",fROp ); } else { // Fons said this must be like this. 4/07/2003 Valeri Fine @@ -1831,15 +1831,11 @@ void TGQt::SendEvent(Window_t id, Event_t *ev) // request for all possible modifier combinations (including the combination of no modifiers). if (id == kNone) return; - // fprintf(stderr,"TQt::GrabKey has no QT-based implementation yet: %p %d %c %x \n",((TQtClientWidget*)wid(id)), keycode,keycode,modifier); + if (grab ) { - wid(id)->setActiveWindow(); - SetInputFocus(id); ((TQtClientWidget*)wid(id))->SetKeyMask(keycode,modifier); - // wid(id)->grabKeyboard(); } else { ((TQtClientWidget*)wid(id))->UnSetKeyMask(keycode,modifier); - // wid(id)->releaseKeyboard(); } } //______________________________________________________________________________ diff --git a/qt/src/TQtClientFilter.cxx b/qt/src/TQtClientFilter.cxx index d59315e9f35262dc3c902b77b9c3071105dc9c28..a4df37238fad8f4b3cc757a6c4e7bf2722c7e56e 100644 --- a/qt/src/TQtClientFilter.cxx +++ b/qt/src/TQtClientFilter.cxx @@ -1,4 +1,4 @@ -// @(#)root/qt:$Name: $:$Id: TQtClientFilter.cxx,v 1.16 2005/12/15 06:10:37 brun Exp $ +// @(#)root/qt:$Name: $:$Id: TQtClientFilter.cxx,v 1.17 2006/03/24 15:31:10 antcheva Exp $ // Author: Valeri Fine 21/01/2002 /************************************************************************* @@ -242,6 +242,7 @@ static inline UInt_t MapKeySym(const QKeyEvent &qev) //______________________________________________________________________________________ static inline void MapEvent(const QKeyEvent &qev, Event_t &ev) { + ev.fType = qev.type() == QEvent::KeyPress ? kGKeyPress : kKeyRelease; ev.fCode = MapKeySym(qev); ev.fState = MapModifierState(qev.state()); ev.fCount = qev.count(); @@ -345,6 +346,33 @@ static inline QWidget *widgetAt(int x, int y) w = w ? w->childAt(w->mapFromGlobal(QPoint(x, y ) ), TRUE ) : 0; return w; } +//______________________________________________________________________________ +void TQtClientFilter::AddKeyEvent( const QKeyEvent &keyEvent, TQtClientWidget *frame) +{ + // Map and and to the ROOT event queue Qt KeyBoard event mapped to the ROOT Event_t + // For "dest" widget + if (frame) { + Event_t &event = *new Event_t; + memset( &event,0,sizeof(Event_t)); + QPaintDevice *paintDev = (QPaintDevice *)frame; + event.fWindow = TGQt::rootwid(paintDev); + + event.fSendEvent = keyEvent.spontaneous(); + event.fTime = QTime::currentTime().msec (); + event.fX = frame->x(); + event.fY = frame->y(); + event.fWidth = frame->width(); // width and + event.fHeight = frame->height(); // height excluding the frame + + QPoint pointRoot = frame->mapToGlobal(QPoint(0,0)); + event.fXRoot = pointRoot.x(); + event.fYRoot = pointRoot.y(); + MapEvent(keyEvent,event); + + fRootEventQueue->enqueue(&event); + } +} + //______________________________________________________________________________ bool TQtClientFilter::SelectGrab(Event_t &event, UInt_t selectEventMask,QMouseEvent &mouse) { @@ -487,42 +515,21 @@ bool TQtClientFilter::eventFilter( QObject *qWidget, QEvent *e ){ // grabSelectEvent = IsGrabSelected(selectEventMask); break; case QEvent::KeyPress: // key pressed - event.fType = kGKeyPress; keyEvent = (QKeyEvent *)e; MapEvent(*keyEvent,event); selectEventMask |= kKeyPressMask; - { - TQtClientWidget *grabber = 0; - if (fKeyGrabber) grabber = fKeyGrabber->IsKeyGrabbed(event); - if (!grabber) grabber = frame-> IsKeyGrabbed(event); - if (grabber) { - grabber->GrabEvent(event,false); - grabSelectEvent = kTRUE; // to be revised later, It was: grabEvent = kTRUE; - ((QKeyEvent *)e)->accept(); - } else { - ((QKeyEvent *)e)->ignore(); - } + ((QKeyEvent *)e)->accept(); + // fprintf(stderr, " accepted: case QEvent::KeyPress: <%c><%d>: frame = %x; grabber = %x grabbed = %d\n",event.fCode,event.fCode,TGQt::wid(frame), TGQt::wid(grabber),grabEvent); - // fprintf(stderr, " QEvent::KeyPress: <%s>: key = %d, key_f=%d\n",(const char *)keyEvent->text(),keyEvent->key(),Qt::Key_F); + // fprintf(stderr, " QEvent::KeyPress: <%s>: key = %d, key_f=%d, frame = %p\n",(const char *)keyEvent->text(),keyEvent->key(),Qt::Key_F,frame); // fprintf(stderr, " QEvent::KeyPress: Current focus %p\n",(QPaintDevice *) qApp->focusWidget () ); // fprintf(stderr, "---------------\n\n"); - } break; case QEvent::KeyRelease: // key released - event.fType = kKeyRelease; keyEvent = (QKeyEvent *)e; MapEvent(*keyEvent,event); selectEventMask |= kKeyReleaseMask; - { - TQtClientWidget *grabber = frame->IsKeyGrabbed(event); - if (grabber) { - grabber->GrabEvent(event,false); - grabSelectEvent = kTRUE; // to be revised later, It was: grabEvent = kTRUE; - ((QKeyEvent *)e)->accept(); - } else { - ((QKeyEvent *)e)->ignore(); - } - } + ((QKeyEvent *)e)->accept(); break; case QEvent::FocusIn: // keyboard focus received focusEvent = (QFocusEvent *)e; diff --git a/qt/src/TQtClientWidget.cxx b/qt/src/TQtClientWidget.cxx index f509af334e607545472b2731ec4d286d023df863..803429382656e8f1f4ac64e7fff770eb89056fde 100644 --- a/qt/src/TQtClientWidget.cxx +++ b/qt/src/TQtClientWidget.cxx @@ -1,4 +1,4 @@ -// @(#)root/qt:$Name: $:$Id: TQtClientWidget.cxx,v 1.11 2006/03/24 15:31:10 antcheva Exp $ +// @(#)root/qt:$Name: $:$Id: TQtClientWidget.cxx,v 1.12 2006/05/08 13:16:56 antcheva Exp $ // Author: Valeri Fine 21/01/2002 /************************************************************************* @@ -236,24 +236,20 @@ Bool_t TQtClientWidget::SetKeyMask(Int_t keycode, UInt_t modifier, int insert) // +1 - insert Bool_t found = kTRUE; int key[5]= {0,0,0,0,0}; + int ikeys = 0; int index = 0; if (keycode) { if (modifier & kAnyModifier) assert(!(modifier & kAnyModifier)); else { -#if QT_VERSION < 0x40000 - if (modifier & kKeyShiftMask) key[index++] = SHIFT; - if (modifier & kKeyLockMask) key[index++] = META; - if (modifier & kKeyControlMask) key[index++] = CTRL; - if (modifier & kKeyMod1Mask) key[index++] = ALT; -#else /* QT_VERSION */ - if (modifier & kKeyShiftMask) key[index++] = Qt::SHIFT; - if (modifier & kKeyLockMask) key[index++] = Qt::META; - if (modifier & kKeyControlMask) key[index++] = Qt::CTRL; - if (modifier & kKeyMod1Mask) key[index++] = Qt::ALT; -#endif /* QT_VERSION */ + if (modifier & kKeyShiftMask) { key[index++] = Qt::SHIFT; ikeys += Qt::SHIFT;} + if (modifier & kKeyLockMask) { key[index++] = Qt::META; ikeys += Qt::META; } + if (modifier & kKeyControlMask) { key[index++] = Qt::CTRL; ikeys += Qt::CTRL; } + if (modifier & kKeyMod1Mask) { key[index++] = Qt::ALT; ikeys += Qt::ALT; } } - key[index++] = Qt::UNICODE_ACCEL + keycode; + key[index++] = Qt::UNICODE_ACCEL + keycode; ikeys += Qt::UNICODE_ACCEL + keycode; } + QKeySequence keys(ikeys); + assert(index<=4); switch (insert) { case kInsert: @@ -264,41 +260,35 @@ Bool_t TQtClientWidget::SetKeyMask(Int_t keycode, UInt_t modifier, int insert) #else /* QT_VERSION */ fGrabbedKey = new Q3Accel(this); #endif /* QT_VERSION */ - // connect(fGrabbedKey,SIGNAL(activated ( int )),this,SLOT(Accelerate(int))); + connect(fGrabbedKey,SIGNAL(activated ( int )),this,SLOT(Accelerate(int))); } - QKeySequence keys(key[0],key[1],key[2],key[3]); if (fGrabbedKey->findKey(keys) == -1) { - /* int itemId = &*/ fGrabbedKey->insertItem(keys,fGrabbedKey->count()+1); - // fprintf(stderr,"+%p: TQtClientWidget::SetKeyMask modifier=%d keycode \'%c\' %d, evail=%d \n", TGQt::wid(this), modifier, keycode ,fGrabbedKey->count() - // , fGrabbedKey->isEnabled() ); +// int itemId = + fGrabbedKey->insertItem(keys); +// fprintf(stderr,"+%p: TQtClientWidget::SetKeyMask modifier =%d keycode = \'%c\' item=%d enable=%d\n", TGQt::wid(this), modifier, keycode ,itemId +// , fGrabbedKey->isEnabled() ); } - TQtClientFilter *f = gQt->QClientFilter(); - f->SetKeyGrabber(this); } break; case kRemove: if (!fGrabbedKey) break; if (keycode) { - int id = fGrabbedKey->findKey(QKeySequence(key[0],key[1],key[2],key[3])); - // fprintf(stderr,"-%p: TQtClientWidget::SetKeyMask modifier=%d keycode \'%c\' %d\n", this, modifier, keycode ,id); - if (id != -1) fGrabbedKey->removeItem(id); + int id = fGrabbedKey->findKey(keys); + if (id != -1) { fGrabbedKey->removeItem(id); } if (fGrabbedKey->count() == 0) { delete fGrabbedKey; fGrabbedKey = 0; - TQtClientFilter *f = gQt->QClientFilter(); - f->UnSetKeyGrabber(this); } } else { // keycode ==0 - means delete all accelerators // fprintf(stderr,"-%p: TQtClientWidget::SetKeyMask modifier=%d keycode \'%c\' \n", this, modifier, keycode); delete fGrabbedKey; fGrabbedKey = 0; - TQtClientFilter *f = gQt->QClientFilter(); - f->UnSetKeyGrabber(this); } break; case kTestKey: if (fGrabbedKey) { - found = (fGrabbedKey->findKey(QKeySequence(key[0],key[1],key[2],key[3])) != -1); - // fprintf(stderr,"\n+%p:testing TQtClientWidget::SetKeyMask modifier=%d keycode \'%c\' found=%d \n", TGQt::wid(this), modifier, keycode ,found); +// found = (fGrabbedKey->findKey(QKeySequence(key[0],key[1],key[2],key[3])) != -1); + found = (fGrabbedKey->findKey(keys) != -1); + // fprintf(stderr,"\n+%p:testing TQtClientWidget::SetKeyMask modifier=%d keycode \'%c\' found=%d \n", TGQt::wid(this), modifier, keycode ,found); } break; @@ -339,24 +329,26 @@ void TQtClientWidget::Accelerate(int id) int l = key.count(); int keycode = key[l-1]; uint state =0; - for (int i=0; i < l;i++) { - switch (key[i]) { + #if QT_VERSION < 0x40000 - case SHIFT: state |= Qt::ShiftButton; break; - case META: state |= Qt::MetaButton; break; - case CTRL: state |= Qt::ControlButton; break; - case ALT: state |= Qt::AltButton; break; + if (keycode & Qt::SHIFT) state |= Qt::ShiftButton; + if (keycode & Qt::META) state |= Qt::MetaButton; + if (keycode & Qt::CTRL) state |= Qt::ControlButton; + if (keycode & Qt::ALT) state |= Qt::AltButton; #else /* QT_VERSION */ - case Qt::SHIFT: state |= Qt::ShiftModifier; break; - case Qt::META: state |= Qt::MetaModifier; break; - case Qt::CTRL: state |= Qt::ControlModifier; break; - case Qt::ALT: state |= Qt::AltModifier; break; + if (keycode & Qt::SHIFT) state |= Qt::ShiftModifier; + if (keycode & Qt::META) state |= Qt::MetaModifier; + if (keycode & Qt::CTRL) state |= Qt::ControlModifier; + if (keycode & Qt::ALT) state |= Qt::AltModifier; #endif /* QT_VERSION */ - }; - } + + // Create ROOT event QKeyEvent ac(QEvent::KeyPress,keycode,keycode,state); - fprintf(stderr,"TQtClientWidget::Accelerate %c\n", keycode); - QApplication::sendEvent( this, &ac ); + // call Event filter directly + TQtClientFilter *f = gQt->QClientFilter(); + if (f) f->AddKeyEvent(ac,this); + QKeyEvent acRelease(QEvent::KeyRelease,keycode,keycode,state); + if (f) f->AddKeyEvent(acRelease,this); } //______________________________________________________________________________ void TQtClientWidget::Disconnect()