int main()
{
void *mlx_ptr;
void *win_ptr;
mlx_ptr = mlx_init();
win_ptr = mlx_new_window(mlx_ptr, 500, 500, "mlx_test");
mlx_loop(mlx_ptr);
}
검은 화면이 만들어진다.
mlx_new_window(mlx_ptr, 500, 500, "mlx_test");
에서 500은 각각 x, y 해상도이고,
다음 " "안에 들어가는 것은 만들어진 화면의 이름을 나타낸다.
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values
이 사이트를 보면
The Esc (Escape) key. Typically used as an exit, cancel, or "escape this operation" button. Historically, the Escape character was used to signal the start of a special control sequence of characters called an "escape sequence."
라고 설명하는 부분을 보면 window에서 esc는 0x1B를 나타내고, linux에서는 0xFF1B를 나타낸다.
그래서 코드를
void *mlx_ptr;
void *win_ptr;
int press_esc_key(int key, void *p)
{
if (key == 0xFF1B)
exit(0);
}
int main()
{
mlx_ptr = mlx_init();
win_ptr = mlx_new_window(mlx_ptr, 500, 500, "mlx_test");
mlx_key_hook(win_ptr, press_esc_key, win_ptr);
mlx_loop(mlx_ptr);
}
이렇게 작성했을 때 esc를 누르면 화면이 ctrl+c를 누르지 않아도 종료된다.
단, 이렇게 exit(0)으로 화면을 끄게 하면 창이 3개를 띄웠다고 했을 때 다 종료된다.
그래서 화면을 선택해서 끄게 하려면
int mlx_destroy_window(void *mlx_ptr, void *win_ptr);
이 함수를 사용한다.
마지만 이러한 함수만을 사용하여 창을 끄면 완전히 프로그램이 종료되지 않고 창만 닫으므로 완전이 종료하고 싶을 때 exit(0)을 사용해야 한다.
원 함수: int mlx_key_hook ( void *win_ptr, int (*funct_ptr)(), void *param );
실제 사용 시: mlx_key_hook(win_ptr,key_check,0);
int key_check(int key,void *p)
{
printf("Key in Win : %d\n",key);
if (key==0xFF1B) //esc를 누르면 종료
exit(0);
}
원 함수: int mlx_mouse_hook ( void *win_ptr, int (*funct_ptr)(), void *param );
실제 사용 시: mlx_mouse_hook(win,mouse_button,0);
int mouse_button(int button,int x,int y, void *p)
{
printf("Mouse_button in Win, button %d at %dx%d.\n",button,x,y);
}
원 함수: int mlx_hook(void *win_ptr, int x_event, int x_mask, int (*funct)(), void *param);
실제 사용 시: mlx_hook(win, MotionNotify, PointerMotionMask, mouse_pos, 0);
int mouse_pos(int x,int y, void *p)
{
printf("Mouse moving in Win, at %dx%d.\n",x,y);
}
https://tronche.com/gui/x/xlib/events/processing-overview.html#PointerMotionHintMask
이 사이트를 보면 아래와 같은 내용이 나온다.
PointerMotionMask
클라이언트 애플리케이션은 포인터 버튼의 상태에 관계 없이 MotionNotify 이벤트를 수신합니다.
원 함수: int mlx_pixel_put ( void *mlx_ptr, void *win_ptr, int x, int y, int color );
실제 사용 시: mlx_pixel_put(mlx,win,x,y,color);
int color_map(void *win,int w,int h)
{
int x;
int y;
int color;
x = w;
while (x--)
{
y = h;
while (y--)
{
color = (x*255)/w+((((w-x)*255)/w)<<16)+(((y*255)/h)<<8);
mlx_pixel_put(mlx,win,x,y,color);
}
}
}
원 함수: int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string);
실제 사용 시: mlx_string_put(mlx,win,5, 20, 0xFF99FF,"String input");