void mlx_mouse_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param)
{
[(id)(win_ptr->winid) setEvent:4 andFunc:funct_ptr andParam:param];
}
https://harm-smits.github.io/42docs/libs/minilibx/hooks.html
Hooks
Find code examples, optimization tricks, and much more.
harm-smits.github.io
예도 별반 다를게 없다
음 코드에는 스크롤이 따로 있나?
int get_mouse_button(NSEventType eventtype)
{
switch (eventtype) {
case NSEventTypeLeftMouseDown:
case NSEventTypeLeftMouseUp:
case NSEventTypeLeftMouseDragged:
return 1;
case NSEventTypeRightMouseDown:
case NSEventTypeRightMouseUp:
case NSEventTypeRightMouseDragged:
return 2;
case NSEventTypeOtherMouseDown:
case NSEventTypeOtherMouseUp:
case NSEventTypeOtherMouseDragged:
return 3;
default:
return 0;
}
}
아 드디어 알게 되었다
event_funct을 만들어 넣고 사용하는 방식이다
@interface NSWindowEvent : NSWindow
{
func_t event_funct[MAX_EVENT];
void *(event_param[MAX_EVENT]);
int keyrepeat;
int keyflag;
int size_x;
int size_y;
}
- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param
{
event_funct[event] = func;
event_param[event] = param;
if (event == 6) // motion notify
{
if (func == NULL)
[self setAcceptsMouseMovedEvents:NO];
else
[self setAcceptsMouseMovedEvents:YES];
}
}
이전 글 bonus에 새로 알게된 부분을 적어두었다 좀더 보기 편할것이다
키보드와 마우스 이벤트이다
#include <stdio.h> // printf()
#include <stdlib.h> // exit()
#include "include/mlx.h"
#define X_EVENT_KEY_PRESS 2 // mlx_hook 함수의 두 번째 인자인
#define X_EVENT_KEY_RELEASE 3 // x_event에 들어가는 값
#define KEY_W 13 // MacOS의 키보드 코드들이다.
#define KEY_A 0 //
#define KEY_S 1 // 위에서 부터 차례대로
#define KEY_D 2 //
#define KEY_ESC 53 // 'W' 'A' 'S' 'D' 'ESC'들의 키보드 코드이다.
#define MOUSE_LEFT_BUTTON 1
#define MOUSE_RIGHT_BUTTON 2
#define MOUSE_SCROLL_BUTTON 3
#define MOUSE_SCROLL_UP 4
#define MOUSE_SCROLL_DOWN 5
typedef struct s_param // 키 값을 입력 받고 정해진 동작을 수행했는지
{ // 여부를 판단하기 위해 선언하였다.
int x; // x값
int y; // y값
int z; // y값
void *mlx_ptr;
void *win_ptr;
} t_param;
void param_init(t_param *param) // 구조체 param 초기화 함수
{
param->x = 0;
param->y = 0;
param->z = 0;
param->mlx_ptr = 0;
param->win_ptr = 0;
}
int key_press(int keycode, t_param *param) // 어떤 키가 눌렸는지 판단하고,
{ // 정의된 행동을 수행하는 함수
if (keycode == KEY_W) // W 키를 누르면 param.x값이 1 증가한다.
param->x++;
else if (keycode == KEY_S) // S 키를 누르면 param.x값이 1 감소한다.
param->x--;
else if (keycode == KEY_A) // A 키를 누르면 param.y값이 1 증가한다.
param->y++;
else if (keycode == KEY_D) // D 키를 누르면 param.y값이 1 감소한다.
param->y--;
else if (keycode == KEY_ESC) // ESC 키를 누르면 프로그램 종료
exit(0);
printf("(x, y): (%d, %d)\n", param->x, param->y); // param의 값 확인
return (0);
}
int mouse_event(int keycode, int x, int y, t_param *param) // 어떤 키가 눌렸는지 판단하고,
{ // 정의된 행동을 수행하는 함수
if (keycode == MOUSE_LEFT_BUTTON)
printf("MOUSE_LEFT_BUTTON\n");
else if (keycode == MOUSE_RIGHT_BUTTON)
printf("MOUSE_RIGHT_BUTTON\n");
else if (keycode == MOUSE_SCROLL_BUTTON)
printf("MOUSE_SCROLL_BUTTON\n");
else if (keycode == MOUSE_SCROLL_UP)
{
printf("MOUSE_SCROLL_UP\n");
param->z++;
}
else if (keycode == MOUSE_SCROLL_DOWN)
{
printf("MOUSE_SCROLL_DOWN\n");
param->z--;
}
printf("%d %d %d\n", x, y, param->z);
return (0);
}
int main(void)
{
t_param *param;
param = (t_param *)malloc(sizeof(t_param));
param_init(param);
param->mlx_ptr = mlx_init();
param->win_ptr = mlx_new_window(param->mlx_ptr , 300, 300, "Hello, World!");
printf("======\n");
mlx_key_hook(param->win_ptr, &key_press, param);
mlx_mouse_hook(param->win_ptr, &mouse_event, param);
printf("======\n");
mlx_loop(param->mlx_ptr);
int a = mlx_clear_window(param->mlx_ptr, param->win_ptr);
printf("%d",a);
return (0);
}
//음 이러면 되려나??
이제 드레그 및 키 업 다운에 따른 속성도 해보자
/bonus/
#include <stdio.h> // printf()
#include <stdlib.h> // exit()
#include "include/mlx.h"
#define NOT_USE 0 // 안씀
#define X_EVENT_KEY_PRESS 2 // mlx_hook 함수의 두 번째 인자인
#define X_EVENT_KEY_RELEASE 3 // x_event에 들어가는 값
#define KEY_W 13 // MacOS의 키보드 코드들이다.
#define KEY_A 0 //
#define KEY_S 1 // 위에서 부터 차례대로
#define KEY_D 2 //
#define KEY_ESC 53 // 'W' 'A' 'S' 'D' 'ESC'들의 키보드 코드이다.
#define MOUSE_LEFT_BUTTON 1
#define MOUSE_RIGHT_BUTTON 2
#define MOUSE_SCROLL_BUTTON 3
#define MOUSE_SCROLL_UP 4
#define MOUSE_SCROLL_DOWN 5
typedef struct s_mouse
{
int mouse_keycode;
int x; // x값
int y; // y값
int draw_x; // x값
int draw_y; // y값
} t_mouse;
typedef struct s_param // 키 값을 입력 받고 정해진 동작을 수행했는지
{ // 여부를 판단하기 위해 선언하였다.
int x; // x값
int y; // y값
int z; // y값
t_mouse mouse;
void *mlx_ptr;
void *win_ptr;
} t_param;
int key_press(int keycode, t_param *param) // 어떤 키가 눌렸는지 판단하고,
{ // 정의된 행동을 수행하는 함수
if (keycode == KEY_W) // W 키를 누르면 param.x값이 1 증가한다.
param->x++;
else if (keycode == KEY_S) // S 키를 누르면 param.x값이 1 감소한다.
param->x--;
else if (keycode == KEY_A) // A 키를 누르면 param.y값이 1 증가한다.
param->y++;
else if (keycode == KEY_D) // D 키를 누르면 param.y값이 1 감소한다.
param->y--;
else if (keycode == KEY_ESC) // ESC 키를 누르면 프로그램 종료
exit(0);
printf("(x, y): (%d, %d)\n", param->x, param->y); // param의 값 확인
return (0);
}
int mouse_event_down(int keycode, int x, int y, t_param *param)
{
printf("DOWN_");
if (keycode == MOUSE_LEFT_BUTTON)
printf("MOUSE_LEFT_BUTTON\n");
else if (keycode == MOUSE_RIGHT_BUTTON)
printf("MOUSE_RIGHT_BUTTON\n");
else if (keycode == MOUSE_SCROLL_BUTTON)
printf("MOUSE_SCROLL_BUTTON\n");
else if (keycode == MOUSE_SCROLL_UP)
{
printf("MOUSE_SCROLL_UP\n");
param->z++;
}
else if (keycode == MOUSE_SCROLL_DOWN)
{
printf("MOUSE_SCROLL_DOWN\n");
param->z--;
}
printf("%d %d %d\n", x, y, param->z);
return (0);
}
int mouse_event_up(int keycode, int x, int y, t_param *param)
{
printf("UP_");
if (keycode == MOUSE_LEFT_BUTTON)
printf("MOUSE_LEFT_BUTTON\n");
else if (keycode == MOUSE_RIGHT_BUTTON)
printf("MOUSE_RIGHT_BUTTON\n");
else if (keycode == MOUSE_SCROLL_BUTTON)
printf("MOUSE_SCROLL_BUTTON\n");
else if (keycode == MOUSE_SCROLL_UP) // 아마 이건 작동 안할듯??
printf("MOUSE_SCROLL_UP\n");
else if (keycode == MOUSE_SCROLL_DOWN) // 아마 이건 작동안할듯??
printf("MOUSE_SCROLL_DOWN\n");
printf("%d %d %d\n", x, y, param->z);
return (0);
}
int mouse_event_draw(int x, int y, t_param *param)
{
printf("DRAW_");
printf("key_code : \n");
printf("%d %d %p\n", x, y, param);
return (0);
}
void *ft_memset(void *b, int c, long unsigned int len)
{
unsigned char *ptr;
ptr = (unsigned char *)b;
while (len-- > 0)
*ptr++ = c;
return (b);
}
int main(void)
{
t_param *param;
param = (t_param *)malloc(sizeof(t_param));
ft_memset(param, 0, sizeof(t_param));
param->mlx_ptr = mlx_init();
param->win_ptr = mlx_new_window(param->mlx_ptr , 300, 300, "Hello, World!");
printf("======\n");
mlx_key_hook(param->win_ptr, &key_press, param);
mlx_mouse_hook(param->win_ptr, &mouse_event_down, param);
mlx_hook(param->win_ptr, 5, NOT_USE, &mouse_event_up, param);
mlx_hook(param->win_ptr, 6, NOT_USE, &mouse_event_draw, param);
printf("======\n");
mlx_loop(param->mlx_ptr);
int a = mlx_clear_window(param->mlx_ptr, param->win_ptr);
printf("%d",a);
return (0);
}
//음 이러면 되려나??
이렇게 모든 키값을 입력 받을 준비가 되었다~