]> icculus.org git repositories - btb/d2x.git/blob - arch/ggi/event.c
remove rcs tags
[btb/d2x.git] / arch / ggi / event.c
1 /*
2  *
3  * GGI Event related stuff
4  *
5  *
6  */
7
8 #ifdef HAVE_CONFIG_H
9 #include <conf.h>
10 #endif
11
12 #include <stdio.h>
13 #include <sys/time.h>
14 #include <ggi/gii.h>
15 #include <string.h>
16 #include "event.h"
17 #include "error.h"
18 #include "fix.h"
19
20 static int initialised=0;
21
22 #ifdef GGI_VIDEO
23 #include <ggi/ggi.h>
24 extern ggi_visual_t *screenvis;
25 #endif
26 gii_input_t inputs;
27
28 extern void keyboard_handler(int key, ubyte state);
29 extern void mouse_handler_button(int button, ubyte state);
30 extern void mouse_handler_relative(int x, int y);
31 extern void mouse_handler_absolute(int x, int y);
32
33 void event_poll()
34 {
35         int n;
36         struct timeval tv;
37         gii_event event;
38
39         if (!initialised)
40                 event_init();
41         if (inputs==NULL)
42                 return;
43 //              Error("GII error: no inputs (perhaps you need to set GII_INPUT env var)\n");
44
45         tv.tv_sec = 0;
46         tv.tv_usec = 0;
47
48         giiEventPoll(inputs, emAll, &tv);
49         
50         n = giiEventsQueued(inputs, emAll);
51         
52         while (n-- > 0) 
53         {
54                 giiEventRead(inputs, &event, emAll);
55                 switch (event.any.type)
56                 {
57                         case evKeyPress:
58                                 keyboard_handler(event.key.label, 1);
59                                 break;
60                         case evKeyRelease:
61                                 keyboard_handler(event.key.label, 0);
62                                 break;
63                         case evPtrAbsolute:
64                                 mouse_handler_absolute(event.pmove.x, event.pmove.y);
65                                 break;
66                         case evPtrRelative:
67                                 mouse_handler_relative(event.pmove.x, event.pmove.y);
68                                 break;
69                         case evPtrButtonPress:
70                                 mouse_handler_button(event.pbutton.button - 1, 1);
71                                 break;
72                         case evPtrButtonRelease:
73                                 mouse_handler_button(event.pbutton.button - 1, 0);
74                                 break;
75                 }
76         }
77 }
78
79 void event_close()
80 {
81 #ifndef GGI_VIDEO
82         if (inputs)
83                 giiClose(inputs);
84 #endif
85         giiExit();
86 }
87
88 #ifdef GII_XWIN
89 int gii_xwin_initialized=0;
90 #include <ggi/input/xwin.h>
91 //void lock_nothing(void){return;}
92 void init_gii_xwin(Display *disp,Window win){
93         printf("gii xwin %i %i\n",initialised,gii_xwin_initialized);
94         if (!initialised)
95                 event_init();
96         if (gii_xwin_initialized){
97                 gii_event ev;
98                 gii_xwin_cmddata_setparam *giiargs=(gii_xwin_cmddata_setparam *) &ev.cmd.data;
99                 memset(&ev,0,sizeof(gii_cmd_nodata_event)+sizeof(gii_xwin_cmddata_setparam));
100                 ev.cmd.code=GII_CMDCODE_XWINSETPARAM;
101                 ev.any.type = evCommand;
102                 ev.any.size=sizeof(gii_cmd_nodata_event)+sizeof(gii_xwin_cmddata_setparam);
103                 giiargs->win=win;
104                 giiargs->ptralwaysrel=1;
105                 giiEventSend(inputs,&ev);
106         }else{
107                 gii_input_t inputs2;
108                 gii_inputxwin_arg giiargs;
109                 memset(&giiargs,0,sizeof(giiargs));
110                 giiargs.disp=disp;
111                 giiargs.win=win;
112                 giiargs.ptralwaysrel=1;
113                 //giiargs.gglock=lock_nothing;
114                 inputs2=giiOpen("xwin",&giiargs,NULL);
115                 if (inputs2){
116                         gii_xwin_initialized=1;
117                         if (inputs)
118                                 inputs=giiJoinInputs(inputs,inputs2);
119                         else
120                                 inputs=inputs2;
121                 }
122         }
123 }
124 #endif
125
126 int event_init()
127 {
128         if (!initialised){
129                 giiInit();
130 #ifdef GGI_VIDEO
131                 inputs = ggiJoinInputs(screenvis, NULL);
132 #else
133                 inputs=giiOpen(NULL);
134 #endif
135                 initialised = 1;
136                 atexit(event_close);
137         }
138         return 0;
139 }