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