/ minilibx-linux / mlx_loop.c
mlx_loop.c
 1  /*
 2  ** mlx_loop.c for MiniLibX in 
 3  ** 
 4  ** Made by Charlie Root
 5  ** Login   <ol@epitech.net>
 6  ** 
 7  ** Started on  Wed Aug  2 18:58:11 2000 Charlie Root
 8  ** Last update Fri Sep 30 14:47:41 2005 Olivier Crouzet
 9  */
10  
11  
12  #include	"mlx_int.h"
13  
14  extern int	(*(mlx_int_param_event[]))();
15  
16  static int	win_count(t_xvar *xvar)
17  {
18  	int			i;
19  	t_win_list	*win;
20  
21  	i = 0;
22  	win = xvar->win_list;
23  	while (win)
24  	{
25  		win = win->next;
26  		++i;
27  	}
28  	return (i);
29  }
30  
31  int			mlx_loop_end(t_xvar *xvar)
32  {
33  	xvar->end_loop = 1;
34  	return (1);
35  }
36  
37  int			mlx_loop(t_xvar *xvar)
38  {
39  	XEvent		ev;
40  	t_win_list	*win;
41  
42  	mlx_int_set_win_event_mask(xvar);
43  	xvar->do_flush = 0;
44  	while (win_count(xvar) && !xvar->end_loop)
45  	{
46  		while (!xvar->end_loop && (!xvar->loop_hook || XPending(xvar->display)))
47  		{
48  			XNextEvent(xvar->display,&ev);
49  			win = xvar->win_list;
50  			while (win && (win->window!=ev.xany.window))
51  				win = win->next;
52  
53  			if (win && ev.type == ClientMessage && ev.xclient.message_type == xvar->wm_protocols && ev.xclient.data.l[0] == xvar->wm_delete_window && win->hooks[DestroyNotify].hook)
54  				win->hooks[DestroyNotify].hook(win->hooks[DestroyNotify].param);
55  			if (win && ev.type < MLX_MAX_EVENT && win->hooks[ev.type].hook)
56  				mlx_int_param_event[ev.type](xvar, &ev, win);
57  		}
58  		XSync(xvar->display, False);
59  		if (xvar->loop_hook)
60  			xvar->loop_hook(xvar->loop_param);
61  	}
62  	return (0);
63  }