나는 학습을 위해 매우 간단한 창 관리자를 만들려고합니다. 나는 C
과 xcb
라이브러리를 사용하고 있습니다. 새 응용 프로그램이 시작되면 이벤트를 가져 오려고합니다.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 이벤트를 모두 얻는 올바른 방법은 무엇입니까?
매핑 이벤트 중 하나가 발생 했습니까? –
@JoachimPileborg 의견을 보내 주셔서 감사합니다. 나는 다른 WM의 코드에서 비슷한 것을 읽었 기 때문에 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY를 사용해 보았습니다. 그러나 결코 이벤트 루프에서 XCB_MAP_REQUEST 또는 XCB_MAP_NOTIFY 이벤트를 얻지 못했습니다. 좀 더 많은 정보로 내 게시물을 업데이트했습니다. – Carlito
나는 올해 초 Python과 XCB에서 매우 간단한 창 관리자를 만들었습니다. 'XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY' 외에도'XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT'와'XCB_EVENT_MASK_STRUCTURE_NOTIFY'도있었습니다. –