Xlib : BadWindow



  • Hallo,
    ich lerne gerade die Benutzung der Xlib und habe dabei ein Tutorial quasi abgetippt, jedoch erhalte ich einen Fehler, bei welchem ich keine Lösung weiß, vor allem da die Bibliothek Neuland für mich ist, hier der Code :

    #include <stdio.h>
    #include <iostream>
    #include <X11/Xlib.h>
    
    #define WIN_TITLE "Test"
    
    int main() {
    
    	Display * display;
    	Window window_id;
    
    	display = XOpenDisplay(NULL);
    	if(display == NULL) {
    		std::cout << "Unable to open display" << std::endl;
    	}
    	XStoreName(display, window_id, WIN_TITLE);
    
    	window_id = XCreateSimpleWindow(display, RootWindow(display, 0), 1, 1, 500, 500, 0, BlackPixel (display, 0), BlackPixel(display, 0));
    	XMapWindow(display, window_id);
    	XFlush(display);
    
    	// Hier beginnt der Code Fehler zu produzieren	
    
    	XSelectInput(display, window_id, KeyPressMask);
    	XEvent event;
    
    	while(true) {
    		while(XPending(display) > 0) {
    			XNextEvent(display, &event);
    			switch(event.type) {
    				case KeyPress:
    					std::cout << "Test" << std::endl;
    					break;
    			}
    		}	
    	}
    
    	return 0;
    }
    

    Die Stelle ab der der Fehler entsteht habe ich mal makiert, der Fehler lautet :

    X Error of failed request: BadWindow (invalid Window parameter)
    Major opcode of failed request: 18 (X_ChangeProperty)
    Resource id in failed request: 0x3b5ec8d0
    Serial number of failed request: 7
    Current serial number in output stream: 10

    Ich hoffe auf eure Hilfe, vielen Dank im vorraus.



  • Wer sagt Dir, daß die Bildschirmnummer 0 ist. Hole sie Dir lieber mit DefaultScreen.

    Diese Nummer übergibst Du dann an RootWindow und BlackPixel.

    Natürlich solltest Du auch die fensterid prüfen.
    Mfg Martin



  • Habe den Code nun so abgeändert, jedoch bleibt das Problem bestehen, hat sonst noch jmd eine Idee ? :

    #include <stdio.h>
    #include <iostream>
    #include <X11/Xlib.h>
    
    #define WIN_TITLE "Test"
    
    int main() {
    
        Display * display;
        Window window_id;
    
        display = XOpenDisplay(NULL);
        if(display == NULL) {
            std::cout << "Unable to open display" << std::endl;
        }
        XStoreName(display, window_id, WIN_TITLE);
    
        window_id = XCreateSimpleWindow(display,
    	 RootWindow(display, DefaultScreen(display)),
    	 0, 0, 500, 500, 0,
    	 BlackPixel (display, DefaultScreen(display)),
    	 BlackPixel(display, DefaultScreen(display)));
    
        XMapWindow(display, window_id);
        XFlush(display);
    
        // Hier beginnt der Code Fehler zu produzieren 
    
        XSelectInput(display, window_id, KeyPressMask);
        XEvent event;
    
        while(true) {
            while(XPending(display) > 0) {
                XNextEvent(display, &event);
                switch(event.type) {
                    case KeyPress:
                        std::cout << "Test" << std::endl;
                        break;
                }
            }  
        }
    
        return 0;
    }
    


  • Lass den Aufruf von XPending weg, XNextEvent blockiert eh bis zum nächsten Event.

    Versuche auch herauszufinden, welche Funktion, Dir den BadWindow liefert.

    Mfg Martin



  • Übersetze es mit -Wall und sorge dafür das es keine Warnings mehr gibt.



  • Danke für den Tipp mit -Wall, kannte dies noch nicht, somit habe ich herraus bekommen das es an

    XStoreName(display, window_id, WIN_TITLE);
    

    lag, danke nochmals an alle.

    Mfg



  • Wav0r schrieb:

    Danke für den Tipp mit -Wall, kannte dies noch nicht, somit habe ich herraus bekommen das es an

    XStoreName(display, window_id, WIN_TITLE);
    

    lag, danke nochmals an alle.

    Mfg

    @simbad 👍


Anmelden zum Antworten