aboutsummaryrefslogtreecommitdiffstats
path: root/minilibx-linux
diff options
context:
space:
mode:
authorJozanLeClerc <bousset.rudy@gmail.com>2020-04-19 17:07:43 +0200
committerJozanLeClerc <bousset.rudy@gmail.com>2020-04-19 17:07:43 +0200
commite1bfcaeafa05079eb3b52182366056eada63ef1e (patch)
tree77d20c4c02844de5600353600b41562ec4b481eb /minilibx-linux
parentchanges (diff)
download42-cub3d-e1bfcaeafa05079eb3b52182366056eada63ef1e.tar.gz
42-cub3d-e1bfcaeafa05079eb3b52182366056eada63ef1e.tar.bz2
42-cub3d-e1bfcaeafa05079eb3b52182366056eada63ef1e.tar.xz
42-cub3d-e1bfcaeafa05079eb3b52182366056eada63ef1e.tar.zst
42-cub3d-e1bfcaeafa05079eb3b52182366056eada63ef1e.zip
Minilibx update
Diffstat (limited to 'minilibx-linux')
-rw-r--r--minilibx-linux/Makefile.gen4
-rw-r--r--minilibx-linux/Makefile.mk4
-rw-r--r--minilibx-linux/mlx.h2
-rw-r--r--minilibx-linux/mlx_init.c113
-rw-r--r--minilibx-linux/mlx_int.h166
-rw-r--r--minilibx-linux/mlx_loop.c36
-rw-r--r--minilibx-linux/mlx_new_window.c73
-rw-r--r--minilibx-linux/mlx_screen_size.c13
8 files changed, 219 insertions, 192 deletions
diff --git a/minilibx-linux/Makefile.gen b/minilibx-linux/Makefile.gen
index 156687c..a96eb91 100644
--- a/minilibx-linux/Makefile.gen
+++ b/minilibx-linux/Makefile.gen
@@ -28,7 +28,7 @@ SRC = mlx_init.c mlx_new_window.c mlx_pixel_put.c mlx_loop.c \
mlx_put_image_to_window.c mlx_get_color_value.c mlx_clear_window.c \
mlx_xpm.c mlx_int_str_to_wordtab.c mlx_destroy_window.c \
mlx_int_param_event.c mlx_int_set_win_event_mask.c mlx_hook.c \
- mlx_rgb.c mlx_destroy_image.c
+ mlx_rgb.c mlx_destroy_image.c mlx_screen_size.c
OBJ =$(SRC:.c=.o)
CFLAGS = -O3 -I$(INC)
@@ -44,4 +44,4 @@ do_cp :
clean :
- rm -f $(OBJ) $(NAME) *~ core *.core
+ rm -f $(OBJ) $(NAME) libmlx_$(HT).a *~ core *.core
diff --git a/minilibx-linux/Makefile.mk b/minilibx-linux/Makefile.mk
index f05fd6c..4ebc26d 100644
--- a/minilibx-linux/Makefile.mk
+++ b/minilibx-linux/Makefile.mk
@@ -28,7 +28,7 @@ SRC = mlx_init.c mlx_new_window.c mlx_pixel_put.c mlx_loop.c \
mlx_put_image_to_window.c mlx_get_color_value.c mlx_clear_window.c \
mlx_xpm.c mlx_int_str_to_wordtab.c mlx_destroy_window.c \
mlx_int_param_event.c mlx_int_set_win_event_mask.c mlx_hook.c \
- mlx_rgb.c mlx_destroy_image.c
+ mlx_rgb.c mlx_destroy_image.c mlx_screen_size.c
OBJ =$(SRC:.c=.o)
CFLAGS = -O3 -I$(INC)
@@ -44,4 +44,4 @@ do_cp :
clean :
- rm -f $(OBJ) $(NAME) *~ core *.core
+ rm -f $(OBJ) $(NAME) libmlx_$(HT).a *~ core *.core
diff --git a/minilibx-linux/mlx.h b/minilibx-linux/mlx.h
index 25991a1..af6af12 100644
--- a/minilibx-linux/mlx.h
+++ b/minilibx-linux/mlx.h
@@ -126,4 +126,6 @@ int mlx_do_key_autorepeatoff(void *mlx_ptr);
int mlx_do_key_autorepeaton(void *mlx_ptr);
int mlx_do_sync(void *mlx_ptr);
+int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey);
+
#endif /* MLX_H */
diff --git a/minilibx-linux/mlx_init.c b/minilibx-linux/mlx_init.c
index 7a8db8f..a99e46b 100644
--- a/minilibx-linux/mlx_init.c
+++ b/minilibx-linux/mlx_init.c
@@ -13,79 +13,80 @@
-void *mlx_init()
+void *mlx_init()
{
- t_xvar *xvar;
-
- if (!(xvar = malloc(sizeof(*xvar))) || (xvar->display = XOpenDisplay(""))==0)
- return ((void *)0);
- xvar->screen = DefaultScreen(xvar->display);
- xvar->root = DefaultRootWindow(xvar->display);
- xvar->cmap = DefaultColormap(xvar->display,xvar->screen);
- xvar->depth = DefaultDepth(xvar->display,xvar->screen);
- if (mlx_int_get_visual(xvar)==-1)
- {
- printf(ERR_NO_TRUECOLOR);
- exit(1);
- }
- xvar->win_list = 0;
- xvar->loop_hook = 0;
- xvar->loop_param = (void *)0;
- xvar->do_flush = 1;
- mlx_int_deal_shm(xvar);
- if (xvar->private_cmap)
- xvar->cmap = XCreateColormap(xvar->display,xvar->root,
+ t_xvar *xvar;
+
+ if (!(xvar = malloc(sizeof(*xvar))) || (xvar->display = XOpenDisplay(""))==0)
+ return ((void *)0);
+ xvar->screen = DefaultScreen(xvar->display);
+ xvar->root = DefaultRootWindow(xvar->display);
+ xvar->cmap = DefaultColormap(xvar->display,xvar->screen);
+ xvar->depth = DefaultDepth(xvar->display,xvar->screen);
+ if (mlx_int_get_visual(xvar)==-1)
+ {
+ printf(ERR_NO_TRUECOLOR);
+ exit(1);
+ }
+ xvar->win_list = 0;
+ xvar->loop_hook = 0;
+ xvar->loop_param = (void *)0;
+ xvar->do_flush = 1;
+ xvar->wm_delete_window = XInternAtom (xvar->display, "WM_DELETE_WINDOW", False);
+ mlx_int_deal_shm(xvar);
+ if (xvar->private_cmap)
+ xvar->cmap = XCreateColormap(xvar->display,xvar->root,
xvar->visual,AllocNone);
- mlx_int_rgb_conversion(xvar);
- return (xvar);
+ mlx_int_rgb_conversion(xvar);
+ return (xvar);
}
/*
-** pshm_format of -1 : Not XYBitmap|XYPixmap|ZPixmap
+** pshm_format of -1 : Not XYBitmap|XYPixmap|ZPixmap
** alpha libX need a check of the DISPLAY env var, or shm is allowed
** in remote Xserver connections.
*/
-int mlx_int_deal_shm(t_xvar *xvar)
+int mlx_int_deal_shm(t_xvar *xvar)
{
- int use_pshm;
- int bidon;
- char *dpy;
- char buff[33];
+ int use_pshm;
+ int bidon;
+ char *dpy;
+ char buff[33];
- xvar->use_xshm = XShmQueryVersion(xvar->display,&bidon,&bidon,&(use_pshm));
- if (xvar->use_xshm && use_pshm)
- xvar->pshm_format = XShmPixmapFormat(xvar->display);
- else
- xvar->pshm_format = -1;
- gethostname(buff,32);
- dpy = getenv(ENV_DISPLAY);
- if (dpy && strlen(dpy) && *dpy!=':' && strncmp(dpy,buff,strlen(buff)) &&
- strncmp(dpy,LOCALHOST,strlen(LOCALHOST)) )
- {
- xvar->pshm_format = -1;
- xvar->use_xshm = 0;
- }
+ xvar->use_xshm = XShmQueryVersion(xvar->display,&bidon,&bidon,&(use_pshm));
+ if (xvar->use_xshm && use_pshm)
+ xvar->pshm_format = XShmPixmapFormat(xvar->display);
+ else
+ xvar->pshm_format = -1;
+ gethostname(buff,32);
+ dpy = getenv(ENV_DISPLAY);
+ if (dpy && strlen(dpy) && *dpy!=':' && strncmp(dpy,buff,strlen(buff)) &&
+ strncmp(dpy,LOCALHOST,strlen(LOCALHOST)) )
+ {
+ xvar->pshm_format = -1;
+ xvar->use_xshm = 0;
+ }
}
/*
** TrueColor Visual is needed to have *_mask correctly set
*/
-int mlx_int_rgb_conversion(t_xvar *xvar)
+int mlx_int_rgb_conversion(t_xvar *xvar)
{
- bzero(xvar->decrgb,sizeof(int)*6);
- while (!(xvar->visual->red_mask&1))
- { xvar->visual->red_mask >>= 1; xvar->decrgb[0] ++; }
- while (xvar->visual->red_mask&1)
- { xvar->visual->red_mask >>= 1; xvar->decrgb[1] ++; }
- while (!(xvar->visual->green_mask&1))
- { xvar->visual->green_mask >>= 1; xvar->decrgb[2] ++; }
- while (xvar->visual->green_mask&1)
- { xvar->visual->green_mask >>= 1; xvar->decrgb[3] ++; }
- while (!(xvar->visual->blue_mask&1))
- { xvar->visual->blue_mask >>= 1; xvar->decrgb[4] ++; }
- while (xvar->visual->blue_mask&1)
- { xvar->visual->blue_mask >>= 1; xvar->decrgb[5] ++; }
+ bzero(xvar->decrgb,sizeof(int)*6);
+ while (!(xvar->visual->red_mask&1))
+ { xvar->visual->red_mask >>= 1; xvar->decrgb[0] ++; }
+ while (xvar->visual->red_mask&1)
+ { xvar->visual->red_mask >>= 1; xvar->decrgb[1] ++; }
+ while (!(xvar->visual->green_mask&1))
+ { xvar->visual->green_mask >>= 1; xvar->decrgb[2] ++; }
+ while (xvar->visual->green_mask&1)
+ { xvar->visual->green_mask >>= 1; xvar->decrgb[3] ++; }
+ while (!(xvar->visual->blue_mask&1))
+ { xvar->visual->blue_mask >>= 1; xvar->decrgb[4] ++; }
+ while (xvar->visual->blue_mask&1)
+ { xvar->visual->blue_mask >>= 1; xvar->decrgb[5] ++; }
}
diff --git a/minilibx-linux/mlx_int.h b/minilibx-linux/mlx_int.h
index 4349f5f..a43fd1b 100644
--- a/minilibx-linux/mlx_int.h
+++ b/minilibx-linux/mlx_int.h
@@ -14,112 +14,118 @@
** Internal settings for MiniLibX
*/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <X11/extensions/XShm.h>
+#ifndef MLX_INT_H
+
+# define MLX_INT_H
+
+# include <stdlib.h>
+# include <stdio.h>
+# include <string.h>
+# include <unistd.h>
+# include <fcntl.h>
+# include <sys/mman.h>
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+# include <sys/ipc.h>
+# include <sys/shm.h>
+# include <X11/extensions/XShm.h>
/* #include <X11/xpm.h> */
-#define MLX_TYPE_SHM_PIXMAP 3
-#define MLX_TYPE_SHM 2
-#define MLX_TYPE_XIMAGE 1
+# define MLX_TYPE_SHM_PIXMAP 3
+# define MLX_TYPE_SHM 2
+# define MLX_TYPE_XIMAGE 1
-#define MLX_MAX_EVENT LASTEvent
+# define MLX_MAX_EVENT LASTEvent
-#define ENV_DISPLAY "DISPLAY"
-#define LOCALHOST "localhost"
-#define ERR_NO_TRUECOLOR "MinilibX Error : No TrueColor Visual available.\n"
-#define WARN_SHM_ATTACH "MinilibX Warning : X server can't attach shared memory.\n"
+# define ENV_DISPLAY "DISPLAY"
+# define LOCALHOST "localhost"
+# define ERR_NO_TRUECOLOR "MinilibX Error : No TrueColor Visual available.\n"
+# define WARN_SHM_ATTACH "MinilibX Warning : X server can't attach shared memory.\n"
typedef struct s_xpm_col
{
- int name;
- int col;
-} t_xpm_col;
+ int name;
+ int col;
+} t_xpm_col;
struct s_col_name
{
- char *name;
- int color;
+ char *name;
+ int color;
};
typedef struct s_event_list
{
- int mask;
- int (*hook)();
- void *param;
-} t_event_list;
+ int mask;
+ int (*hook)();
+ void *param;
+} t_event_list;
typedef struct s_win_list
{
- Window window;
- GC gc;
- struct s_win_list *next;
- int (*mouse_hook)();
- int (*key_hook)();
- int (*expose_hook)();
- void *mouse_param;
- void *key_param;
- void *expose_param;
- t_event_list hooks[MLX_MAX_EVENT];
-} t_win_list;
+ Window window;
+ GC gc;
+ struct s_win_list *next;
+ int (*mouse_hook)();
+ int (*key_hook)();
+ int (*expose_hook)();
+ void *mouse_param;
+ void *key_param;
+ void *expose_param;
+ t_event_list hooks[MLX_MAX_EVENT];
+} t_win_list;
typedef struct s_img
{
- XImage *image;
- Pixmap pix;
- GC gc;
- int size_line;
- int bpp;
- int width;
- int height;
- int type;
- int format;
- char *data;
- XShmSegmentInfo shm;
-} t_img;
+ XImage *image;
+ Pixmap pix;
+ GC gc;
+ int size_line;
+ int bpp;
+ int width;
+ int height;
+ int type;
+ int format;
+ char *data;
+ XShmSegmentInfo shm;
+} t_img;
typedef struct s_xvar
{
- Display *display;
- Window root;
- int screen;
- int depth;
- Visual *visual;
- Colormap cmap;
- int private_cmap;
- t_win_list *win_list;
- int (*loop_hook)();
- void *loop_param;
- int use_xshm;
- int pshm_format;
- int do_flush;
- int decrgb[6];
-} t_xvar;
-
-
-int mlx_int_do_nothing();
-int mlx_int_get_good_color();
-int mlx_int_find_in_pcm();
-int mlx_int_anti_resize_win();
-int mlx_int_wait_first_expose();
-int mlx_int_rgb_conversion();
-int mlx_int_deal_shm();
-void *mlx_int_new_xshm_image();
-char **mlx_int_str_to_wordtab();
-void *mlx_new_image();
-int shm_att_pb();
+ Display *display;
+ Window root;
+ int screen;
+ int depth;
+ Visual *visual;
+ Colormap cmap;
+ int private_cmap;
+ t_win_list *win_list;
+ int (*loop_hook)();
+ void *loop_param;
+ int use_xshm;
+ int pshm_format;
+ int do_flush;
+ int decrgb[6];
+ Atom wm_delete_window;
+} t_xvar;
+
+
+int mlx_int_do_nothing();
+int mlx_int_get_good_color();
+int mlx_int_find_in_pcm();
+int mlx_int_anti_resize_win();
+int mlx_int_wait_first_expose();
+int mlx_int_rgb_conversion();
+int mlx_int_deal_shm();
+void *mlx_int_new_xshm_image();
+char **mlx_int_str_to_wordtab();
+void *mlx_new_image();
+int shm_att_pb();
+
+#endif
diff --git a/minilibx-linux/mlx_loop.c b/minilibx-linux/mlx_loop.c
index 74af0a5..11b2a41 100644
--- a/minilibx-linux/mlx_loop.c
+++ b/minilibx-linux/mlx_loop.c
@@ -16,23 +16,27 @@ extern int (*(mlx_int_param_event[]))();
int mlx_loop(t_xvar *xvar)
{
- XEvent ev;
- t_win_list *win;
+ XEvent ev;
+ t_win_list *win;
- mlx_int_set_win_event_mask(xvar);
- xvar->do_flush = 0;
- while (42)
- {
- while (!xvar->loop_hook || XPending(xvar->display))
+ mlx_int_set_win_event_mask(xvar);
+ xvar->do_flush = 0;
+ while (42)
{
- XNextEvent(xvar->display,&ev);
- win = xvar->win_list;
- while (win && (win->window!=ev.xany.window))
- win = win->next;
- if (win && ev.type < MLX_MAX_EVENT)
- if (win->hooks[ev.type].hook)
- mlx_int_param_event[ev.type](xvar, &ev, win);
+ while (!xvar->loop_hook || XPending(xvar->display))
+ {
+ XNextEvent(xvar->display,&ev);
+ win = xvar->win_list;
+ while (win && (win->window!=ev.xany.window))
+ win = win->next;
+ if (win && ev.type < MLX_MAX_EVENT)
+ {
+ if (ev.type == ClientMessage && (Atom)ev.xclient.data.l[0] == xvar->wm_delete_window)
+ XDestroyWindow(xvar->display, win->window);
+ if (win->hooks[ev.type].hook)
+ mlx_int_param_event[ev.type](xvar, &ev, win);
+ }
+ }
+ xvar->loop_hook(xvar->loop_param);
}
- xvar->loop_hook(xvar->loop_param);
- }
}
diff --git a/minilibx-linux/mlx_new_window.c b/minilibx-linux/mlx_new_window.c
index 2399cdc..3f05914 100644
--- a/minilibx-linux/mlx_new_window.c
+++ b/minilibx-linux/mlx_new_window.c
@@ -21,41 +21,42 @@
void *mlx_new_window(t_xvar *xvar,int size_x,int size_y,char *title)
{
- t_win_list *new_win;
- XSetWindowAttributes xswa;
- XGCValues xgcv;
+ t_win_list *new_win;
+ XSetWindowAttributes xswa;
+ XGCValues xgcv;
- xswa.background_pixel = 0;
- xswa.border_pixel = -1;
- xswa.colormap = xvar->cmap;
- /*
- xswa.event_mask = ButtonPressMask | ButtonReleaseMask | ExposureMask |
- KeyPressMask | KeyReleaseMask | StructureNotifyMask;
- */
- /* xswa.event_mask = ExposureMask; */
- xswa.event_mask = 0xFFFFFF; /* all events */
- if (!(new_win = malloc(sizeof(*new_win))))
- return ((void *)0);
- new_win->window = XCreateWindow(xvar->display,xvar->root,0,0,size_x,size_y,
- 0,CopyFromParent,InputOutput,xvar->visual,
- CWEventMask|CWBackPixel|CWBorderPixel|
- CWColormap,&xswa);
- mlx_int_anti_resize_win(xvar,new_win->window,size_x,size_y);
- XStoreName(xvar->display,new_win->window,title);
- xgcv.foreground = -1;
- xgcv.function = GXcopy;
- xgcv.plane_mask = AllPlanes;
- new_win->gc = XCreateGC(xvar->display,new_win->window,
- GCFunction|GCPlaneMask|GCForeground,&xgcv);
- new_win->next = xvar->win_list;
- xvar->win_list = new_win;
- /*
- new_win->mouse_hook = mlx_int_do_nothing;
- new_win->key_hook = mlx_int_do_nothing;
- new_win->expose_hook = mlx_int_do_nothing;
- */
- bzero(&(new_win->hooks), sizeof(new_win->hooks));
- XMapRaised(xvar->display,new_win->window);
- mlx_int_wait_first_expose(xvar,new_win->window);
- return (new_win);
+ xswa.background_pixel = 0;
+ xswa.border_pixel = -1;
+ xswa.colormap = xvar->cmap;
+ /*
+ xswa.event_mask = ButtonPressMask | ButtonReleaseMask | ExposureMask |
+ KeyPressMask | KeyReleaseMask | StructureNotifyMask;
+ */
+ /* xswa.event_mask = ExposureMask; */
+ xswa.event_mask = 0xFFFFFF; /* all events */
+ if (!(new_win = malloc(sizeof(*new_win))))
+ return ((void *)0);
+ new_win->window = XCreateWindow(xvar->display,xvar->root,0,0,size_x,size_y,
+ 0,CopyFromParent,InputOutput,xvar->visual,
+ CWEventMask|CWBackPixel|CWBorderPixel|
+ CWColormap,&xswa);
+ mlx_int_anti_resize_win(xvar,new_win->window,size_x,size_y);
+ XStoreName(xvar->display,new_win->window,title);
+ XSetWMProtocols(xvar->display, new_win->window, &(xvar->wm_delete_window), 1);
+ xgcv.foreground = -1;
+ xgcv.function = GXcopy;
+ xgcv.plane_mask = AllPlanes;
+ new_win->gc = XCreateGC(xvar->display,new_win->window,
+ GCFunction|GCPlaneMask|GCForeground,&xgcv);
+ new_win->next = xvar->win_list;
+ xvar->win_list = new_win;
+ /*
+ new_win->mouse_hook = mlx_int_do_nothing;
+ new_win->key_hook = mlx_int_do_nothing;
+ new_win->expose_hook = mlx_int_do_nothing;
+ */
+ bzero(&(new_win->hooks), sizeof(new_win->hooks));
+ XMapRaised(xvar->display,new_win->window);
+ mlx_int_wait_first_expose(xvar,new_win->window);
+ return (new_win);
}
diff --git a/minilibx-linux/mlx_screen_size.c b/minilibx-linux/mlx_screen_size.c
new file mode 100644
index 0000000..835730d
--- /dev/null
+++ b/minilibx-linux/mlx_screen_size.c
@@ -0,0 +1,13 @@
+#include "mlx_int.h"
+
+int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey)
+{
+ XWindowAttributes xwAttr;
+ Status ret;
+ t_xvar *xvar;
+
+ xvar = mlx_ptr;
+ ret = XGetWindowAttributes(xvar->display, xvar->root, &xwAttr);
+ (*sizex) = xwAttr.width;
+ (*sizey) = xwAttr.height;
+}