2016-07-08 18 views
-1

Ich versuche, das zuletzt benutzte Fenster (das Fenster direkt unter dem aktuellen Fenster in der Stapelreihenfolge) zu schließen. Leider segmentiert XQueryTree aus irgendeinem Grund.Segmentation fault auf XQueryTree

#pragma once 

#include <X11/Xlib.h> 
#include <X11/Xutil.h> 

namespace WindowingOperations { 

    inline void closeLastWindow() { 
     Display* dpy = XOpenDisplay(0); 
     Window root = DefaultRootWindow(dpy); 

     Window* root_return; 
     Window* parent_return; 
     Window** children_return; 
     unsigned int* nchildren_return; 

     XQueryTree(dpy, 
        root, 
        root_return, 
        parent_return, 
        children_return, 
        nchildren_return); 

     // Kill the window right after this one 
     if (*nchildren_return > 1) 
      XDestroyWindow(dpy, *children_return[*nchildren_return - 2]); 
    } 
} 

EDIT:

Wenn Sie einen Testfall benötigen:

#include "window_operations.h" 
int main() { 
    WindowingOperations::closeLastWindow(); 
    return 0; 
} 
+0

Ich bezweifle ernsthaft, was Sie aussetzt hier eine [MCVE ], sogar mit all diesen Tags dekoriert. –

+0

Ich meine, das ist ziemlich knapp. Es ist auch trivial zu überprüfen, ob es funktioniert oder nicht - rufen Sie einfach 'closeLastWindow()' – AnimatedRNG

+0

Nein! Sie sind an der Reihe, den Testfall bereitzustellen. Nein, ich lasse es mich irgendwie reproduzieren. Haben Sie diesen Code bereits im Debugger ausgeführt? –

Antwort

0

Die _return Parameter müssen irgendwo gehen. Sie können nicht nur in nicht initialisierten Zeiger passieren, Speicher für XQueryTree zugewiesen werden muss, um die Ergebnisse zu schreiben.

So ...

namespace WindowingOperations { 

    inline void closeLastWindow() { 
     Display* dpy = XOpenDisplay(0); 
     Window root = DefaultRootWindow(dpy); 

    // Allocate storage for the results of XQueryTree. 
     Window root_return; 
     Window parent_return; 
     Window* children_return; 
     unsigned int nchildren_return; 

    // then make the call providing the addresses of the out parameters 
     if (XQueryTree(dpy, 
         root, 
         &root_return, 
         &parent_return, 
         &children_return, 
         &nchildren_return) != 0) 
     { // added if to test for a failed call. results are unchanged if call failed, 
      // so don't use them 

      // Kill the window right after this one 
      if (*nchildren_return > 1) 
       XDestroyWindow(dpy, *children_return[*nchildren_return - 2]); 
     } 
     else 
     { 
      // handle error 
     } 
    } 
} 
+0

Wenn Sie Ihren Code betrachten, ist es genau das, was ich gepostet habe. Bitte redigiere. Ich habe eine Window-Variable deklariert und die Adresse übergeben. –

+0

@DavidThomas Was ist die falsche Sache zu tun. Nicht redigierend. – user4581301

+0

Der Code, den Sie gepostet haben, macht genau das. –