MiniLibX(mlx)에서 hook의 의미는 특정 이벤트가 발생했을 때 실행될 함수를 등록하는 메커니즘을 말합니다. 이는 프로그램의 이벤트 처리 시스템의 핵심 부분입니다.
hook의 주요 특징과 용도는 다음과 같습니다:
이벤트 감지: 키보드 입력, 마우스 클릭, 창 노출 등의 이벤트를 감지합니ㄷㅏ.
콜백 함수 등록: 특정 이벤트가 발생했을 때 실행될 사용자 정의 함수를 등록합니다
이벤트-함수 연결: 등록된 함수는 해당 이벤트가 발생할 때마다 자동으로 호출됩니다
프로그램 흐름 제어: 이벤트 기반 프로그래밍을 가능하게 하여, 사용자 상호작용에 반응하는 프로그램을 만들 수 있습니다
다양한 hook 종류: 키보드(mlx_key_hook), 마우스(mlx_mouse_hook), 화면 노출(mlx_expose_hook) 등 다양한 이벤트에 대한 hook 함수가 존재합니다
루프 내 실행: mlx_loop 함수 내에서 등록된 hook 함수들이 실행되며, 이벤트가 발생할 때마다 해당 함수가 호출됩니다
hook 시스템을 통해 개발자는 사용자 입력이나 시스템 이벤트에 반응하는 인터랙티브한 그래픽 프로그램을 만들 수 있습니다. 이는 MiniLibX를 사용하는 프로젝트에서 사용자 상호작용을 구현하는 핵심 메커니즘입니다
int mlx_key_hook(t_win_list *win, int (*funct)(), void *param)
{ win->hooks[KeyRelease].hook = funct;
win->hooks[KeyRelease].param = param;
win->hooks[KeyRelease].mask = KeyReleaseMask; }
에서 KeyReleaseMask는 X11 윈도우 시스템에서 정의된 이벤트 마스크 상수입니다. 이 상수는 X11 라이브러리의 헤더 파일에서 정의되며, 일반적으로 X11/X.h 파일에 포함되어 있습니다14.
KeyReleaseMask의 정의는 다음과 같습니다:
#define KeyReleaseMask (1L<<1)
이 마스크는 키 릴리스(키를 뗄 때) 이벤트를 감지하기 위해 사용됩니다. MiniLibX 라이브러리는 X11 시스템을 기반으로 하기 때문에, 이 상수를 그대로 사용하고 있습니다.
mlx_key_hook 함수에서 KeyReleaseMask를 사용하는 이유는 다음과 같습니다:
이벤트 필터링: X11 서버에게 키 릴리스 이벤트만을 클라이언트 프로그램으로 전송하도록 지시합니다
이벤트 식별: 프로그램 내에서 키 릴리스 이벤트를 식별하고 처리하는 데 사용됩니다.
MiniLibX는 X11의 저수준 이벤트 처리를 추상화하여 사용하기 쉽게 만들었지만, 내부적으로는 여전히 X11의 이벤트 시스템을 사용하고 있습니다. 따라서 KeyReleaseMask와 같은 X11 상수들이 MiniLibX 코드 내에서 사용되고 있는 것입니다
#define KeyReleaseMask (1L<<1)는 X11 윈도우 시스템에서 사용되는 이벤트 마스크 정의입니다. 이 정의의 의미를 상세히 설명하겠습니다:
- 매크로 정의:
#define은 C 전처리기 지시문으로, KeyReleaseMask라는 상수를 정의합니다. - 비트 시프트 연산:
(1L<<1)은 비트 시프트 연산을 나타냅니다. 1L(long 정수 1)을 왼쪽으로 1비트 시프트합니다. - 결과 값:
이 연산의 결과는 2입니다. 이진수로 표현하면 10(2)가 됩니다. - 의미:
KeyReleaseMask는 키보드 키가 떼어질 때(release) 발생하는 이벤트를 나타냅니다. - 사용 목적:
이 마스크는 프로그램이 키 릴리스 이벤트를 감지하고자 할 때 사용됩니다. - 이벤트 필터링:
XSelectInput 함수나 mlx_hook 함수에서 이 마스크를 사용하여 키 릴리스 이벤트만을 선택적으로 받을 수 있습니다. - 비트 마스크 시스템:
X11은 여러 이벤트 타입을 비트 마스크 시스템으로 관리합니다. 각 마스크는 2의 거듭제곱 값을 가집니다. - 다른 마스크와의 조합:
비트 OR 연산자(|)를 사용하여 여러 마스크를 조합할 수 있습니다. 예: KeyPressMask | KeyReleaseMask - 성능 최적화:
비트 마스크 시스템은 여러 플래그를 효율적으로 저장하고 처리할 수 있게 해줍니다.
이 정의는 X11 기반 그래픽 라이브러리(예: MiniLibX)에서 키보드 입력을 처리할 때 중요한 역할을 합니다
그리고 KeyPressMask는 #define KeyPressMask (1L<<0)로 정의되어 있습니다179. 이는 1을 이진수로 왼쪽으로 0비트 시프트한 것과 같으며, 결과적으로 1이 됩니다.
이 정의는 X11 윈도우 시스템에서 사용되는 이벤트 마스크의 일부입니다. KeyPressMask는 키보드의 키가 눌렸을 때 발생하는 이벤트를 나타냅니다. 이 마스크를 사용하면 프로그램이 키 누름 이벤트에 관심이 있다는 것을 X 서버에 알릴 수 있습니다.
이벤트 마스크 시스템은 비트 단위 연산을 사용하여 여러 이벤트 타입을 효율적으로 조합할 수 있게 해줍니다. 예를 들어, 키 누름과 키 해제 이벤트를 모두 받고 싶다면 KeyPressMask | KeyReleaseMask와 같이 사용할 수 있습니다.
'C Language' 카테고리의 다른 글
execve함수 설명 (0) | 2025.01.23 |
---|---|
부모 자식 프로세스 fork pid pipe 코드 (0) | 2025.01.23 |
MiniLibx의 키보드 입력 처리와 렌더링 처리 (0) | 2025.01.22 |
3d 와이어프레임 모델 구조체 설명 (0) | 2025.01.22 |
MiniLibX 라이브러리의 t_win_list 구조체 설명 (0) | 2025.01.22 |