2016-07-08 5 views
-1

Я пытаюсь закрыть последнее используемое окно (одно прямо под текущим окном в порядке укладки). К сожалению, XQueryTree segfaults по какой-то причине.Ошибка сегментации в 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:

Если вам нужен тестовый пример:

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

Я серьезно сомневаюсь, что вы обнажая здесь обеспечивает [MCVE ], даже украшенный всеми этими тегами. –

+0

Я имею в виду, это довольно лаконично. Также тривиально проверять, работает ли оно или нет - просто вызовите 'closeLastWindow()' – AnimatedRNG

+0

Нет! Настала ваша очередь предоставить тестовый пример. Нет, просто позволяю мне каким-то образом воспроизвести его. Вы уже запустили этот код в отладчике? –

ответ

0

В _return параметры нужно куда-то идти. Вы не можете просто передать в неинициализированными указателей, необходимо выделить для хранения XQueryTree для записи результатов в.

Итак ...

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

Если вы посмотрите на свой код, это именно то, что я опубликовал. Пожалуйста, отредактируйте. Я объявил переменную Window и передал ее адрес. –

+0

@DavidThomas Это неправильная вещь. Не редактирование. – user4581301

+0

Код, который вы опубликовали, делает именно это. –