2016-06-01 4 views
4

현재 저는 작은 프로젝트를위한 (C++) 윈도우 클래스를 개발하고 있습니다. 목표는 종속성을 최소한으로 유지하는 것입니다. Win32/WinAPI에 대한 구현은 가정 된 것처럼 작동하지만, Linux/XCB의 경우에는 어려움을 겪고 있습니다.최대화/최소화에 어떤 이벤트가 사용됩니까?

"_NET_WM_STATE"속성을 확인할 수 있지만 문서가 창이 최대화되거나 최소화 될 때 발생하는 이벤트를 지정하지 않는다는 것을 알고 있습니다. 확장 창 관리자 힌트 사양은 이벤트를 정의하지는 않습니다.

그렇다면 최대화/최소화 이벤트를 가로채는 방법은 무엇입니까?

편집 : 내 코드는 기본적으로 그렇게 보이지만 작동하지 않습니다 : 이

// xcb_generic_event_t* msg; 
// xcb_intern_atom_reply_t* wmStateMinimized; 

case XCB_PROPERTY_NOTIFY: { 
    xcb_property_notify_event_t* data{reinterpret_cast<xcb_property_notify_event_t*>(msg)}; 
    if(data->atom == wmStateMinimized->atom) 
     eventQueue.emplace(Event::Minimized); 

} break; 

나는 또한이 (.으로는 작동하지 않습니다, 나는 이하의 조건이 있다면 만난 적이있는 의미) 이벤트가 제공하는 원자를 확인했습니다. 그것들은 'wmStateMinimized'가 제공하는 원자와 다르다. 'wmStateMinimized'의 원자는 창 관리자가 제공한다.

EDIT 2 보통, xcb_property_notify_event_t 는 변경되지 값 그 자체 된 원자를 공급한다. 그래서 만약이 다음과 같아야합니다

if(data->atom == wmState->atom) 

꼭 제대로 값을 검색하는 방법을 알아낼.

+3

최대화/최소화에 대한 특정 이벤트는 없습니다. 속성 변경을 감시하려면 PropertyNotify 이벤트에 가입해야합니다. 이것은 PropertyChangeMask에 의해 제어됩니다. –

+0

감사합니다. 응용 프로그램에서 얻을 수있는 이벤트 코드를 인쇄하여 알아 냈습니다. – Julien

+0

AFAIK, X11에서 최대화 최소화는 창 관리자가 처리했습니다. 필자가 쓴 몇 가지 X11 응용 프로그램에서는 결코 명시 적으로 처리하지 못했습니다. 그러나이 [SO post] (http://stackoverflow.com/questions/4530786/xlib-create-window-in-mimized-or-maximized-state)는 독자가 흥미로울 수 있습니다. – user3078414

답변

4

그래서 3 시간 후에 나는 마침내 그것을 알아 냈습니다.

  • _NET_WM_STATE
  • _NET_WM_STATE_HIDDEN
  • _NET_WM_STATE_MAXIMIZED_VERT
  • _NET_WM_STATE_MAXIMIZED_HORZ
: 이 솔루션 조각은 이미 원자를 조회 한 것으로, 가정

그들은 다음과 같은 원자에 저장되는 :

xcb_atom_t wmState; 
xcb_atom_t wmStateHidden; 
xcb_atom_t wmStateMaxVert; 
xcb_atom_t wmStateMaxHorz; 

이 조각뿐만 아니라 당신이 순서대로 창

XCB_EVENT_MASK_PROPERTY_CHANGE 

을 지정했는지, 가정 않습니다 실제로 속성 변경에 대한 알림을받을 수 있습니다.

case XCB_PROPERTY_NOTIFY: { 
    xcb_property_notify_event_t* data{reinterpret_cast<xcb_property_notify_event_t*>(msg)}; 
    if(data->atom == wmState){ // the WM_STATE property was changed. 
     // Now we need the value. 
     // Therefore I implemented an auxiliary function. 
     if(internal::getAtomValue(connection, window, wmState) == wmStateHidden) 
      // Handle Events here: 
      eventQueue.emplace(Event::Minimized); 
     else{ 
      xcb_atom_t value{internal::getAtomValue(connection, window, wmState)}; 
      if((value == wmStateMaxVert) || (value == wmStateMaxHorz)) 
      // Handle Event here 
      eventQueue.emplace(Event::Maximized); 
     } 
    } 

} break; 

보조 기능 '내부 : getAtomValue'작품을 다음과 같은 :

자, 우리가 지금 이벤트 루프에 척하자

xcb_get_property_cookie_t cookie{xcb_get_property(connection, false, window, atom, XCB_ATOM_ATOM, 0, 32)}; 
xcb_generic_error_t*   err{nullptr}; 
xcb_get_property_reply_t  reply{xcb_get_property_reply(connection, cookie, &err); 
xcb_atom_t*     value{reinterpret_cast<xcb_atom_t*>(xcb_get_property_value(reply))}; 

내가 희망이 솔루션 개념 증거와 정확.XCB와 협력해야하는 모든 사람들을위한 참조 자료로 활용 될 수 있습니다.

P.S .:이 스 니펫은 원래 원본에서 제거되었습니다. 오타가있을 수 있습니다.

+1

오타를 두 번 확인해 주시기 바랍니다. 질문과 답변 모두 중요합니다. 다른 누군가가 귀하의 연구를 발견하고이를 도움이 될 것입니다. 감사. – user3078414

관련 문제