[42cursurs]mlx 튜토리얼 - 입력 이벤트 hooking

이상헌·2020년 9월 26일
0

hooking

후킹(영어: hooking)은 소프트웨어 공학 용어로, 운영 체제나 응용 소프트웨어 등의 각종 컴퓨터 프로그램에서 소프트웨어 구성 요소 간에 발생하는 함수 호출, 메시지, 이벤트 등을 중간에서 바꾸거나 가로채는 명령, 방법, 기술이나 행위를 말한다. 출처: https://ko.wikipedia.org/wiki/%ED%9B%84%ED%82%B9

mlx을 사용하면서 생길 후킹은 마우스 클릭이나 자판 입력을 감지하고 가져온다 생각하자.

key event hooking

#include <mlx.h>

typedef struct  s_vars {
    void        *mlx;
    void        *win;
}               t_vars;

int             close(int keycode, t_vars *vars)// 이벤트 발생시 call될 함수
{
    mlx_destroy_window(vars->mlx, vars->win);//창을 닫는다.
	return 0;
}

int             main(void)
{
    t_vars      vars;

    vars.mlx = mlx_init();
    vars.win = mlx_new_window(vars.mlx, 1920, 1080, "Hello world!");
    mlx_key_hook(vars.win, close, &vars);// 생성된 창에서 key입력 이벤트가 발생 시 close 함수를 실행한다.
    mlx_loop(vars.mlx);
} 

아무 키나 입력하면 생성된 창이 닫히는 예제입니다.

int mlx_key_hook ( void win_ptr, int (funct_ptr)(), void param );
int mlx_mouse_hook ( void
win_ptr, int (funct_ptr)(), void param );
int mlx_expose_hook ( void win_ptr, int (funct_ptr)(), void *param );

이 세가지 함수는 모두 같은 방식으로 작동합니다.

funct_ptr는 이벤트 발생시 당신이 호출하고 싶은 함수를 가리키는 함수 포인터 입니다. 이 할당은
win_ptr에 의해 특정된 윈도우에만 적용됩니다.
param의 주소는 호출될 때마다 전달되고 필요한 매개 변수를 저장하는 데 사용해야합니다.

key or mouse hooking

#include <mlx.h>

typedef struct  s_vars {
        void    *mlx;
        void    *win;
}               t_vars;

int             close(int keycode, t_vars *vars)
{
    mlx_destroy_window(vars->mlx, vars->win);
}

int             main(void)
{
    t_vars    vars;

    vars.mlx = mlx_init();
    vars.win = mlx_new_window(vars.mlx, 1920, 1080, "Hello world!");
    mlx_hook(vars.win, 4, 1L<<0, close, &vars);
    mlx_loop(vars.mlx);
} 

이전 예제와 비슷하지만 마우스 클릭 이벤트를 후킹한다. 이번엔 보다 범용적으로 쓸 수 있는 mlx_hook 함수를 사용했다. 후킹하고자하는 이벤트를 보다 자세하게 명시할 수 있다.

int mlx_hook(void win_ptr, int x_event, int x_mask, int (funct)(), void *param);

x_event에 X11 events라고 mlx에 등록된 이벤트의 번호다. 번호에 대응되는 이벤트를 후킹한다.
x11 events:
02: KeyPress
03: KeyRelease
04: ButtonPress
05: ButtonRelease

funct_ptr는 이벤트 발생시 당신이 호출하고 싶은 함수를 가리키는 함수 포인터 입니다. 이 할당은
win_ptr에 의해 특정된 윈도우에만 적용됩니다.
param의 주소는 호출될 때마다 전달되고 필요한 매개 변수를 저장하는 데 사용해야합니다.

참고:
42wiki
https://yeosong1.github.io/miniRT%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC
42docs
https://harm-smits.github.io/42docs/libs/minilibx/getting_started.html

profile
배고픈 개발자 sayi입니다!

0개의 댓글