linux c ++ xlib,如何使用XSaveContext和XFindContext(示例提供)

时间:2013-06-11 21:27:28

标签: c++ linux xlib

某些窗口返回的XNextEvent(display,&e)

我需要访问此window所属的类,在对网络和图书进行一些搜索后XSaveContextXFindContext看起来很有用,但我没有找到任何使用的例子。所以让我们试试:

我有一个class Metallica,我希望在Metallica object中调用constructor时保存XContext的地址:

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循环中,我希望得到一个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

所以我做错了什么,但是什么?

1 个答案:

答案 0 :(得分:0)

我发现错误的地方,当我致电XFindContext()时,参数e.xany.window可以被'任意'窗口调用,所以即使不是Metallica,也可以调用{{} 1}}做什么...所以我需要保护它的呼叫!

好吧,这里有一个基本的(我不保护呼叫,但在这种情况下,不做屎)工作代码(您可以使用此代码查看如何使用MasterOfPuppet(),幸运的是......):

XContext