Two in one:
[blender.git] / source / blender / src / mainqueue.c
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  * 
32  * Just the functions to maintain a central event
33  * queue.
34  */
35
36 #include <stdlib.h>
37 #include <string.h>
38 #include "BIF_mainqueue.h"
39
40 #ifdef HAVE_CONFIG_H
41 #include <config.h>
42 #endif
43
44 typedef struct {
45         unsigned short event;
46         short val;
47         char ascii;
48 } QEvent;
49
50 static QEvent mainqueue[MAXQUEUE];
51 static unsigned int nevents= 0;
52
53 unsigned short mainqread(short *val, char *ascii)
54 {
55         if (nevents) {
56                 nevents--;
57                 
58                 *val= mainqueue[nevents].val;
59                 *ascii= mainqueue[nevents].ascii;
60                 if((*ascii<32)||(*ascii==127)) *ascii=0;
61                 return mainqueue[nevents].event;
62         } else
63                 return 0;
64 }
65
66 void mainqenter(unsigned short event, short val)
67 {
68         mainqenter_ext(event, val, 0);
69 }
70
71 void mainqenter_ext(unsigned short event, short val, char ascii)
72 {
73         if (!event)
74                 return;
75
76         if (nevents<MAXQUEUE) {
77                 memmove(mainqueue+1, mainqueue, sizeof(*mainqueue)*nevents);    
78                 mainqueue[0].event= event;
79                 mainqueue[0].val= val;
80                 mainqueue[0].ascii= ascii;
81                 
82                 nevents++;
83         }
84 }
85
86 void mainqpushback(unsigned short event, short val, char ascii)
87 {
88         if (nevents<MAXQUEUE) {
89                 mainqueue[nevents].event= event;
90                 mainqueue[nevents].val= val;
91                 mainqueue[nevents].ascii= ascii;
92                 nevents++;
93         }
94 }
95
96 unsigned short mainqtest()
97 {
98         if (nevents)
99                 return mainqueue[nevents-1].event;
100         else
101                 return 0;
102 }