후킹(영어: hooking)은 소프트웨어 공학 용어로, 운영 체제나 응용 소프트웨어 등의 각종 컴퓨터 프로그램에서 소프트웨어 구성 요소 간에 발생하는 함수 호출, 메시지, 이벤트 등을 중간에서 바꾸거나 가로채는 명령, 방법, 기술이나 행위를 말한다. 출처: https://ko.wikipedia.org/wiki/%ED%9B%84%ED%82%B9
mlx을 사용하면서 생길 후킹은 마우스 클릭이나 자판 입력을 감지하고 가져온다 생각하자.
#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의 주소는 호출될 때마다 전달되고 필요한 매개 변수를 저장하는 데 사용해야합니다.
#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