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