2012-10-15 2 views
2

나는 학습을 위해 매우 간단한 창 관리자를 만들려고합니다. 나는 Cxcb 라이브러리를 사용하고 있습니다. 새 응용 프로그램이 시작되면 이벤트를 가져 오려고합니다.XCB를 사용하여 새 응용 프로그램을 시작할 때 이벤트를받는 방법

지금은 마우스와 키보드 이벤트를받을 수있는 루트 창을 만듭니다. 창 상단에 컬러 바를 그립니다. enter 키를 누르면 xterm이 fork 및 execvp를 사용하여 시작됩니다. 이 모든 것이 훌륭하게 작동합니다.

xterm (또는 생각하는 응용 프로그램)이 실행되면 바 (x = 0, y = 0)의 맨 위에 그려집니다. 조금 아래로 이동하고 싶습니다 (x = 0, y = 16). xcb_configure_window을 사용하여 창을 이동하는 방법을 알고 있다고 생각합니다. 그러나 새로 출시 된 응용 프로그램에 대한 이벤트를 얻는 방법을 모르겠습니다.

편집 : 후
나는 다음과 같은 결론에 온 장난 일부 :
이 같은 내 부모 창을 만드는 경우 :

xcb_window_t window_root = screen->root; 
uint32_t mask = 0;  
uint32_t values[2]; 
mask = XCB_CW_EVENT_MASK; 
values[0] = XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY; 
xcb_change_window_attributes_checked(connection, window_root, mask, values); 
xcb_flush(connection); 

나는 새로운 단말기를 생성 할 때 나는 XCB_CREATE_NOTIFY을 받게됩니다 . 그러나 XCB_EVENT_MASK_EXPOSE 이벤트에 "가입하지"않았기 때문에 아무것도 화면에 그릴 수 없습니다. 나는이에 값 [0] 라인을 변경하는 경우 : 난 아직 생성 이벤트를 수신하지만, 프로그램이 나의 막대가 그려되지 않습니다, 시동시 노출 이벤트가 즉시 호출되지 않습니다

values[0] = XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_EXPOSURE; 

. 하지만 새로운 터미널을 시작하자마자 폭로 이벤트가 발생하지만 초기 드로잉은 발생하지 않습니다. 부모 창을 만드는

내 오래된 방법이었다

xcb_window_t window = xcb_generate_id(connection); 
uint32_t mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; 
uint32_t values[2] = {screen->white_pixel, XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY }; 
xcb_create_window(connection, 0, window, screen->root, 0, 0, screen->width_in_pixels, screen->height_in_pixels, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, mask, values); 
xcb_map_window(connection, window); 

이 흰색 배경을 그리고는 즉시 XCB_EVENT_MASK_EXPOSURE 이벤트를 얻을 수 있기 때문에, 내 색상 막대를 그릴 것입니다. 그러나 XCB_CREATE_NOTIFY 이벤트는 발생하지 않습니다.

그래서 XCB_CREATE_NOTIFY 이벤트와 XCB_EVENT_MASK_EXPOSURE 이벤트를 모두 얻는 올바른 방법은 무엇입니까?

+0

매핑 이벤트 중 하나가 발생 했습니까? –

+0

@JoachimPileborg 의견을 보내 주셔서 감사합니다. 나는 다른 WM의 코드에서 비슷한 것을 읽었 기 때문에 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY를 사용해 보았습니다. 그러나 결코 이벤트 루프에서 XCB_MAP_REQUEST 또는 XCB_MAP_NOTIFY 이벤트를 얻지 못했습니다. 좀 더 많은 정보로 내 게시물을 업데이트했습니다. – Carlito

+0

나는 올해 초 Python과 XCB에서 매우 간단한 창 관리자를 만들었습니다. 'XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY' 외에도'XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT'와'XCB_EVENT_MASK_STRUCTURE_NOTIFY'도있었습니다. –

답변

3

나는 어리 석었고 나는 그것을 고쳤다.

나는 새로운 터미널을 시작한 후에 만 ​​이벤트를 노출한다고 생각했습니다. 그러나 이벤트 루프를 시작하기 전에 내 술집과 배경을 그리지는 못했지만 루프를 내 루프로 그렸습니다. 그래서 새로운 터미널이 시작될 때, expose 이벤트가 호출되고, 막대와 배경이 나타납니다.

이제 이벤트 루프 전에 드로잉 기능을 배치 했으므로 모든 기능이 작동해야합니다. 나는이 갈 권리/가장 좋은 방법이면 모르겠지만, 나중에 참조 할 수 있도록, 당신의 루트 화면을 만들려면 다음을 사용

xcb_window_t window_root = screen->root; 
uint32_t mask = 0;  
uint32_t values[2]; 
mask = XCB_CW_EVENT_MASK; 
values[0] = XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY; 
xcb_change_window_attributes_checked(connection, window_root, mask, values); 
xcb_flush(connection); 

이벤트를 노출 얻을 것이다, 그리고 새로 도입 된 프로그램이 나타납니다 XCB_CREATE_NOTIFY 이벤트.

관련 문제