2012-12-09 4 views
2

이 C 함수는 많은 창 관리자에서 창 장식을 사용하거나 사용하지 않도록 설정할 수 있습니다. 'mode'가 'd'이면 창은 장식을 숨기고 그렇지 않으면 'mode'가 'D'이면 창에 표시됩니다.X11 창에 장식이 있는지 감지합니다.

void window_tune_decorations(Display *disp, Window win, char mode) { 
    long hints[5] = { 2, 0, 0, 0, 0}; 
    Atom motif_hints = XInternAtom(disp, "_MOTIF_WM_HINTS", False); 

    switch (mode) { 
     case 'D': 
      hints[2] = 1; 
      /* fall through */ 
     case 'd': 
      XChangeProperty(disp, win, motif_hints, motif_hints, 32, PropModeReplace, (unsigned char *)hints, 5); 
      break; 
     default: 
      fputs("Invalid mode.\n", stderr); 
    } 
} 

"토글 모드"를 구현하고 싶습니다. 그래서 내 질문에, 거기에 Windows가 장식되어 있는지 감지하는 방법은 무엇입니까? _MOTIF_WM_HINTS와 함께 XGetWindowProperty를 사용했지만 출력을 해석하는 방법을 모르겠습니다.

답변

2

XGetWindowProperty에서 얻은 데이터는 사용자가 데이터를 해석 할 때와 동일한 방법으로 해석합니다 (XChangeProperty).

_MOTIF_WM_HINTS의 경우 5 long 또는 아마도 struct MwmHints (syn. MotifWmHints)의 배열입니다. 구조체는 5 long 필드이고, 또 하나는 #define d 비트 플래그입니다. Motif 윈도우 매니저에서 상속 받았지만, 요즘 Motif와 라이브러리를 보관하지 않기 때문에 구조체가 여러 곳으로 복사됩니다 (나쁜 습관이긴하지만 모든 사람들이 그것을하고 있습니다). Gnome 및 다른 여러 장소의 xprops.h에서 정의를 찾을 수 있습니다. 그것을 'net'에서 찾아 코드에 복사하거나, 이미 의존하고있는 include 파일에서 찾거나 그냥 정의를보고 여러분이 선택한 배열 인 5 long을 계속 사용하십시오.

오른쪽 필드에서 올바른 플래그를 확인해야합니다. 장식의 경우, 윈도우가 우선 무시 (override-redirect)되는지 먼저 확인하십시오. 그것이 있으면 장식되지 않고 (분명히) 장식을 더할 수 없습니다. 창 관리자가 실행되고 있지 않으면 장식도되어 있으므로이 경우에도 꾸미기를 추가 할 수 없습니다.

그렇지 않으면 창에 속성이 전혀없는 경우 (XGetWindowProperty 집합 type-) 사용자가 장식했다고 가정 할 수 있습니다.

속성이 있고 MWM_HINTS_DECORATIONS 비트가 flags에 설정된 경우 필드에 지정된 장식이 비트 값으로 MWM_DECOR_*입니다. 필드가 0이 아니면 일부 데코레이션이 있습니다. AFAIK가 MWM_HINTS_DECORATIONS으로 설정되어 있지 않으면 창이 놀라 울 정도로 장식되어 있습니다. 그러나이 테스트를 직접 해보십시오. 기억이 안나고 X11 머신이 없어서 확인할 수 없습니다.

당연히 일부 창 관리자는 _MOTIF_WM_HINTS (예 : Motif 이전의 것들)을 사용하지 않습니다. 그 중 하나가있는 경우이 방법으로 장식을 확인하거나 설정할 수 없습니다.

XFree(hints)을 잊지 마세요.

관련 문제