2013-06-11 36 views
1

通過一些窗口,我需要訪問該類別的人本window屬於恢復,網絡和書籍,XSaveContext一些searchs後XNextEvent(display,&e)XFindContext看起來是有用的,但我沒有找到任何使用的例子。所以讓我們嘗試:Linux下C++的xlib,如何使用XSaveContext和XFindContext(例如提供)

我有一個class Metallica,我想保存Metallica object的ADRESS當constructorXContext被稱爲:

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

水晶球:您正在存儲一個指向在堆棧上創建(然後銷燬)的Metallica的指針。另外,應該是'EnterSandMan'和'MasterOfPuppets'。我衷心贊同這個可變的命名約定。 – Casey

+0

爲「水晶球」:它是有道理的,但'Metallica'對象沒有被破壞,實際上,它沒有被動態聲明,因此我不必破壞它。對於凱西,我希望拉爾斯不會起訴我......當我的胃充滿時,我會添加更多的代碼 –

+0

我會避免使用Xlib,並嘗試使用一些更高級別的工具包,如Qt .... –

回答

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; 
} 
相關問題