Re: [ROOT] arrow key and HandleInput

From: Fons Rademakers (Fons.Rademakers@cern.ch)
Date: Wed Apr 04 2001 - 15:52:20 MEST


Hi Olivier, Valeriy,

  I made the needed changes in TRoot(Embedded)Canvas::HandleContainerKey()
(now in CVS). The following works fine:

//------ olivier.C
void printKey(Int_t event, Int_t key, Int_t keysym)
{
   // print key and keysym

   TCanvas *c = (TCanvas *) gTQSender;
   if(event != kKeyPress) return;
   printf("symbol = %c (%x)\n", key, keysym);
   switch ((EKeySym)keysym) {
      case kKey_Left:
         cout<<"left arrow"<<endl;
         break;
      case kKey_Right:
         cout<<"rightarrow"<<endl;
         break;
      case kKey_Down:
         cout<<"down arrow"<<endl;
         break;
      case kKey_Up:
         cout<<"up arrow"<<endl;
         break;
   }
}

void olivier()
{
   // Create canvas and connect ProcessedEvent() signal to printKey() slot.

   TCanvas *c1 = new TCanvas("c1", "Test of Canvas Event Signal",900, 500);
   c1->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)", 0, 0,
               "printKey(Int_t,Int_t,Int_t)");
}


root[] .x olivier.C


Cheers, Fons.



Valeriy Onuchin wrote:
> 
>  Hi Olivier, Fons,
> the simplest way to handle canvas events(key,mouse ..) is using signal/slots
> check the code below:
> 
> ---------------------------- olivier.C ------------------------------
> //___________________________________________________________________
> void printKey(Int_t event,Int_t keysym)
> {
>    //  print event type and current cursor position
> 
>    TCanvas *c = (TCanvas *) gTQSender;
>    if(event != kKeyPress) return;
>    printf("symbol = %c\n",keysym);
> }
> 
> //___________________________________________________________________
> void olivier()
> {
>    //
> 
>    TCanvas *c1 = new TCanvas("c1", "Test of Canvas Event Signal",900, 500);
>    c1->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",0,0,"printKey(Int_t,Int_t)");
> }
> 
> ---------------------------- olivier.C ---------------------------------
> 
> try it by:
> 
> root[].x olivier.C
> 
> Unfortunately that does not work for special symbols ( up,down,.. )
> I think it can be easily extended by modification of
> 
> Bool_t TRootCanvas::HandleContainerMotion(Event_t *event)
> {
> // ...
>  fCanvas->HandleInput(kKeyPress, str[0], keysym); // was fCanvas->HandleInput(kKeyPress, str[0], 0);
> // ...
> }
> 
> Regards.    Valeriy
> 
> Olivier Meplan wrote:
> 
> > Valeriy Onuchin wrote:
> >
> > >   Hi Oliver,
> > > check tetris game in $ROOTSYS/test/.
> > > It has exactly what you want. THT.
> > >
> > > Regards.    Valeriy
> >
> > Hi Valeriy,
> > Thanks for your answer. I send you a small  code ; could you tell me if
> > there is a way to do the same thing in a shorter way...because I find it
> > quite complicated for very simple things...
> > Thanks
> > Best Regards,
> > Olivier
> > ------------
> >
> > #include <iostream.h>
> >
> > #include <TROOT.h>
> > #include <TApplication.h>
> > #include <TRootCanvas.h>
> > #include <TCanvas.h>
> > #include <TVirtualX.h>
> > #include <KeySymbols.h>
> >
> > class MyWin : public TCanvas,TGFrame
> > {
> >  public:
> >  MyWin();
> >  void HandleInput(EEventType event, Int_t px, Int_t py);
> >  Bool_t HandleKey(Event_t *event);
> > };
> >
> > MyWin::MyWin():TCanvas("c","",400,400),TGFrame(gClient->GetRoot(),0,0)
> > {
> >
> >  TRootCanvas *main_frame=(TRootCanvas*)GetCanvasImp();
> >  main_frame->BindKey(this,
> > gVirtualX->KeysymToKeycode(kKey_Up),kAnyModifier);
> >  main_frame->BindKey(this,
> > gVirtualX->KeysymToKeycode(kKey_Left),kAnyModifier);
> >  main_frame->BindKey(this,
> > gVirtualX->KeysymToKeycode(kKey_Right),kAnyModifier);
> >  main_frame->BindKey(this,
> > gVirtualX->KeysymToKeycode(kKey_Down),kAnyModifier);
> > }
> > Bool_t MyWin::HandleKey(Event_t *event)
> > {
> >    char tmp[2];
> >    UInt_t keysym;
> >    gVirtualX->LookupString(event, tmp, sizeof(tmp), keysym);
> >
> >    if (event->fType == kGKeyPress) {
> >       switch ((EKeySym)keysym) {
> >          case kKey_Left:
> >      cout<<"left arrow"<<endl;
> >             break;
> >          case kKey_Right:
> >             cout<<"rightarrow"<<endl;
> >             break;
> >          case kKey_Down:
> >             cout<<"down arrow"<<endl;
> >             break;
> >          case kKey_Up:
> >             cout<<"up arrow"<<endl;
> >             break;
> >          default:
> >             return kTRUE;
> >       }
> >    }
> >    return kTRUE;
> > }
> > void MyWin::HandleInput(EEventType event, Int_t px, Int_t py)
> > {
> >  TCanvas::HandleInput(event,px,py);
> >  switch (event)
> >  {
> >
> >   case kButton1Down:
> >    cout<<"left clic"<<endl;
> >    break;
> >   case kButton3Down:
> >    cout<<"right clic"<<endl;
> >    break;
> >   case kKeyPress:
> >     cout<<"the key pressed is : "<<char(px)<<endl;
> >     break;
> >     }
> >
> > }
> > int main(int argc, char **argv)
> > {
> >    TROOT root("root","tttt");
> >    TApplication TheApp("TheApp",&argc, argv);
> >    MyWin *mywin=new MyWin();
> >    TheApp.Run();
> >    return 0;
> > }

-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7677910



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:41 MET