1

XNextEvent(display,&e)一部のウィンドウから返されたために、これwindowが属するクラスにアクセスする必要があります。Web や本で検索した後、XSaveContextXFindContextは便利に見えますが、使用例は見つかりませんでした。それでは試してみましょう:

がで呼び出されたときに、class Metallicaのアドレスを保存したいと思います。Metallica objectconstructorXContext

class Metallica{
  private:
    Window window;
    int i;
    .
    .
  public:
    Metallica(...,int j, XContext *context){
      .
      .
      i=j;
      //XSaveContext(display, this->window, *context, this); // don't work
      XSaveContext(display, this->window, *context, XPointer(this));
      .
      .
      void MasterOfPuppet(){
        cout << i << endl;
      };
      void FadeToBlack(){
        cout << "OK" << endl;
      };
    };

};

だから今、私のxeventループで、1つのMetallicaオブジェクトのアドレスを取得したいのですが、

// at the declaration area :
// XContext Metallica_Context;
// XPointer *XPointerToOneMetallicaObject;

XFindContext(display,
             e.xany.window,
             Metallica_Context,
             XPointerToOneMetallicaObject );

Metallica *SandMan = (Metallica*)(*XPointerToOneMetallicaObject);

SandMan->FadeToBlack();    // no problem
SandMan->MasterOfPuppet(); // return a segmentation fault

だから私は何か間違ったことをしますが、何ですか?

4

1 に答える 1

0

XFindContext()パラメータを呼び出すe.xany.windowと、「任意の」ウィンドウから呼び出すことができるため、 によって作成されたものでなくてもMetallica、呼び出すMasterOfPuppet()とたわごとが発生します...呼び出しを保護する必要があります。それだけです!

さて、ここに基本的な(私は呼び出しを保護しませんが、この場合はたわごとをしません)作業コード(このコードは、使用方法を確認するXContextために使用できます、幸運なことに...):

//g++ test.cc -lX11
#include<iostream>
#include<unistd.h>
#include<X11/Xlib.h>
#include<X11/Xutil.h>

Display *display;


class Metallica{
  private:
    Window window;
    int i;

  public:
    Metallica(int j, XContext *context){
      i=j;
      this->window = XCreateSimpleWindow(display,DefaultRootWindow(display),100,100,100,100,0,0,0);
      XSelectInput(display, this->window, ExposureMask|ButtonReleaseMask|KeyReleaseMask);
      XMapWindow(display,this->window);
      XSaveContext(display, this->window, *context, XPointer(this));
    };
    void MasterOfPuppet(){
      std::cout << i << std::endl;
    };
    void FadeToBlack(){
      std::cout << "ok" << std::endl;
    };
};

int main(){
  XContext Metallica_context;
  XPointer *XPointerToOneMetallicaObject;
  XEvent e;
  int DoNotStop=1;

  display = XOpenDisplay(0);

  Metallica OneMetallicaObject(2,&Metallica_context);
  Metallica *SandMan;

  while(DoNotStop){
    XNextEvent(display, &e);
    switch(e.type){
    case Expose : XFlush(display); break;
    case ButtonRelease : XFindContext(display,e.xany.window,Metallica_context,XPointerToOneMetallicaObject);
                         SandMan = (Metallica*)(*XPointerToOneMetallicaObject);
                         SandMan->MasterOfPuppet();
                         break;
    case KeyRelease    : DoNotStop=0; break;
    }
  }

  return 0;
}
于 2013-06-12T02:04:58.993 に答える