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