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]); 
    } 
} 

편집 :

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

내가 심각하게 의심의 여지 당신이 여기에 노출하는 것은 [MCVE 제공 ] 심지어 모든 태그로 꾸며져 있습니다. –

+0

이 말은 상당히 간결합니다. 그것이 작동하는지 아닌지를 체크하는 것은 또한 사소한 일입니다 - 단지 closeLastWindow()를 호출하십시오 – AnimatedRNG

+0

Nope! 테스트 케이스를 제공 할 차례입니다. 그냥 어떻게 든 그것을 재현하게하지 마라. 이미 디버거에서 해당 코드를 실행 했습니까? –

답변

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

게시 한 코드가 정확하게 해당합니다. –