본문 바로가기

C Language

MiniLibX 에서 hook, KeyPressMask KeyReleaseMask의 의미

 

이벤트 훅이 정의된 구조체

 

 

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 윈도우 시스템에서 사용되는 이벤트 마스크 정의입니다. 이 정의의 의미를 상세히 설명하겠습니다:

  1. 매크로 정의:
    #define은 C 전처리기 지시문으로, KeyReleaseMask라는 상수를 정의합니다.
  2. 비트 시프트 연산:
    (1L<<1)은 비트 시프트 연산을 나타냅니다. 1L(long 정수 1)을 왼쪽으로 1비트 시프트합니다.
  3. 결과 값:
    이 연산의 결과는 2입니다. 이진수로 표현하면 10(2)가 됩니다.
  4. 의미:
    KeyReleaseMask는 키보드 키가 떼어질 때(release) 발생하는 이벤트를 나타냅니다.
  5. 사용 목적:
    이 마스크는 프로그램이 키 릴리스 이벤트를 감지하고자 할 때 사용됩니다.
  6. 이벤트 필터링:
    XSelectInput 함수나 mlx_hook 함수에서 이 마스크를 사용하여 키 릴리스 이벤트만을 선택적으로 받을 수 있습니다.
  7. 비트 마스크 시스템:
    X11은 여러 이벤트 타입을 비트 마스크 시스템으로 관리합니다. 각 마스크는 2의 거듭제곱 값을 가집니다.
  8. 다른 마스크와의 조합:
    비트 OR 연산자(|)를 사용하여 여러 마스크를 조합할 수 있습니다. 예: KeyPressMask | KeyReleaseMask
  9. 성능 최적화:
    비트 마스크 시스템은 여러 플래그를 효율적으로 저장하고 처리할 수 있게 해줍니다.

이 정의는 X11 기반 그래픽 라이브러리(예: MiniLibX)에서 키보드 입력을 처리할 때 중요한 역할을 합니다

 

그리고 KeyPressMask는 #define KeyPressMask (1L<<0)로 정의되어 있습니다179. 이는 1을 이진수로 왼쪽으로 0비트 시프트한 것과 같으며, 결과적으로 1이 됩니다.
이 정의는 X11 윈도우 시스템에서 사용되는 이벤트 마스크의 일부입니다. KeyPressMask는 키보드의 키가 눌렸을 때 발생하는 이벤트를 나타냅니다. 이 마스크를 사용하면 프로그램이 키 누름 이벤트에 관심이 있다는 것을 X 서버에 알릴 수 있습니다.
이벤트 마스크 시스템은 비트 단위 연산을 사용하여 여러 이벤트 타입을 효율적으로 조합할 수 있게 해줍니다. 예를 들어, 키 누름과 키 해제 이벤트를 모두 받고 싶다면 KeyPressMask | KeyReleaseMask와 같이 사용할 수 있습니다.