2015-01-13 4 views
2

x11 통화를 처음 사용합니다._NET_WM_STRUT 및 _NET_WM_STRUT_PARTIAL로 예약 된 데스크톱 공간의 위치 도구 모음

SLED11에서 QT 4.8을 사용하여 사용자 지정 응용 프로그램 도구 모음을 개발 중입니다.

나는 내가 너무 다른 응용 프로그램 창은 그것을 커버 할 수없는 도구 모음 영역을 확보 할 필요가 있음을 이해 일부 포럼을 찾고 X11 호출 (_NET_WM_STRUT 및 _NET_WM_STRUT_PARTIAL)

얻을 예약 된 공간 내 도구 모음의 위치에 문제가 . _NET_WM_STRUT 및 _NET_WM_STRUT_PARTIAL을 (를) 사용했습니다.

내가 공간 확보를 위해 사용하는 코드입니다 :

void ToolbarWindow::dock(int width, int height) 
{ 
    Display *display = QX11Info::display(); 

    int insets[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
    insets[2] = height; 
    insets[8] = 0; 
    insets[9] = width; 

    XChangeProperty(display, 
       winId(), 
       XInternAtom(QX11Info::display(), "_NET_WM_STRUT", False), 
       XA_CARDINAL , 
       32, 
       PropModeReplace, 
       (unsigned char *)&insets, 4); 

    XChangeProperty(display, 
       winId(), 
       XInternAtom(QX11Info::display(), "_NET_WM_STRUT_PARTIAL", False), 
       XA_CARDINAL , 
       32, 
       PropModeReplace, 
       (unsigned char *)&insets, 12); 

} 

을 그리고 난 도구 모음 만들 때 이것은 GUI 컨트롤러 내 전화입니다 :

ToolbarWindow *toolbar = new ToolbarWindow(co); 

toolbar->setGeometry(monitor->getX(), monitor->getY(), monitor->getWidth(), 170); 
toolbar->show(); 

toolbar->dock(monitor->getWidth(), 170); 

내가 볼 것이 있다는 것입니다을 공간이 예약되어 있지만 도구 모음 아래에 예약 된 영역 나타납니다. 하지만 이것은 내가 원하는 것이 아니며 아래에 머물러있는 모든 다른 창들을 가지고 싶습니다 (최대화되었을 때조차도) 그러나 내 도구 모음은 아닙니다 ... 나는 그 공간을 예약 했으므로 그 공간을 채우기를 원합니다 ...

아무도 도와 줄 수 있습니까?

감사합니다.

+0

도구 모음 창에서 xprop을 사용할 때 스트럿 (strut) 속성이 올바른 값으로 표시됩니까? 'XA_CARDINAL' 속성은 ** int가 아닌'long'이어야합니다. –

+0

이 작업을 안정적으로 수행하려면 윈도우가 _NET_WM_TYPE_DOCK * 유형이어야하며 먼저 매핑 한 다음 위치에 놓아야합니다. 그렇지 않으면 WM *가 때때로 자체 스트럿 (strut) 외부에 배치 될 수 있습니다. –

+0

감사합니다. 오늘 _NET_WM_TYPE_DOCK을 (를) 설정하려고합니다. 알려 드리겠습니다. – Lorenzo

답변

0

n.m. ' 대답은 정확합니다.

나는이 안정적으로 작동하려면, 윈도우가 형 _NET_WM_TYPE_DOCK이어야하고 먼저 그렇지 않으면 WM 가끔 밖에서의 배치 스트럿을 소유 할 수있다, 다음지도 위치로 이동해야한다는 것을 발견했다 . - 네.

Atom tmp = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DOCK", False); 
XChangeProperty(display, 
       winId(), 
       XInternAtom(display, "_NET_WM_WINDOW_TYPE", False), 
       XA_ATOM , 
       32, 
       PropModeReplace, 
       (unsigned char *)&tmp, 1); 

고마워 :

이것은 내가 추가 한 코드입니다.