1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50:
51: import ;
52: import ;
53: import ;
54: import ;
55: import ;
56: import ;
57: import ;
58: import ;
59: import ;
60: import ;
61:
62:
68: public class XEventPump
69: implements Runnable
70: {
71:
72:
75: private Display display;
76:
77:
81: private HashMap windows;
82:
83:
88: private int drag;
89:
90:
95: XEventPump(Display d)
96: {
97: display = d;
98: windows = new HashMap();
99: drag = -1;
100: Thread t = new Thread(this);
101: t.start();
102: }
103:
104:
108: public void run()
109: {
110: while (display.connected)
111: {
112: try
113: {
114: Event xEvent = display.next_event();
115: handleEvent(xEvent);
116: }
117: catch (ThreadDeath death)
118: {
119:
120: return;
121: }
122: catch (Throwable x)
123: {
124: System.err.println("Exception during event dispatch:");
125: x.printStackTrace(System.err);
126: }
127: }
128: }
129:
130:
137: void registerWindow(gnu.x11.Window xWindow, Window awtWindow)
138: {
139: if (XToolkit.DEBUG)
140: System.err.println("registering window id: " + xWindow.id);
141: windows.put(new Integer(xWindow.id), awtWindow);
142: }
143:
144: void unregisterWindow(gnu.x11.Window xWindow)
145: {
146: windows.remove(new Integer(xWindow.id));
147: }
148:
149: private void handleEvent(Event xEvent)
150: {
151: Integer key = new Integer(xEvent.window_id());;
152: Window awtWindow = (Window) windows.get(key);
153:
154: if (XToolkit.DEBUG)
155: System.err.println("fetched event: " + xEvent);
156: switch (xEvent.code())
157: {
158: case ButtonPress.CODE:
159: ButtonPress bp = (ButtonPress) xEvent;
160:
161: int button = bp.detail();
162: drag = button;
163: MouseEvent mp = new MouseEvent(awtWindow, MouseEvent.MOUSE_PRESSED,
164: System.currentTimeMillis(), 0,
165: bp.event_x(), bp.event_y(),
166: 1, false, button);
167: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mp);
168: break;
169: case ButtonRelease.CODE:
170: ButtonRelease br = (ButtonRelease) xEvent;
171: drag = -1;
172: MouseEvent mr = new MouseEvent(awtWindow, MouseEvent.MOUSE_RELEASED,
173: System.currentTimeMillis(), 0,
174: br.event_x(), br.event_y(),
175: 1, false, br.detail());
176: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mr);
177: break;
178: case MotionNotify.CODE:
179: MotionNotify mn = (MotionNotify) xEvent;
180: MouseEvent mm;
181: if (drag == -1)
182: {
183: mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_MOVED,
184: System.currentTimeMillis(), 0,
185: mn.event_x(), mn.event_y(),
186: 1, false);
187: }
188: else
189: {
190: mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_DRAGGED,
191: System.currentTimeMillis(), 0,
192: mn.event_x(), mn.event_y(),
193: 1, false);
194: }
195: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mm);
196: break;
197: case ConfigureNotify.CODE:
198: ConfigureNotify c = (ConfigureNotify) xEvent;
199: if (XToolkit.DEBUG)
200: System.err.println("resize request for window id: " + key);
201:
202:
203: if (c.width() != awtWindow.getWidth()
204: || c.height() != awtWindow.getHeight())
205: {
206: if (XToolkit.DEBUG)
207: System.err.println("Setting size on AWT window: " + c.width()
208: + ", " + c.height() + ", " + awtWindow.getWidth()
209: + ", " + awtWindow.getHeight());
210: ((XWindowPeer) awtWindow.getPeer()).callback = true;
211: awtWindow.setSize(c.width(), c.height());
212: ((XWindowPeer) awtWindow.getPeer()).callback = false;
213: }
214: break;
215: case Expose.CODE:
216: Expose exp = (Expose) xEvent;
217: if (XToolkit.DEBUG)
218: System.err.println("expose request for window id: " + key);
219: Rectangle r = new Rectangle(exp.x(), exp.y(), exp.width(),
220: exp.height());
221:
222:
223: Graphics g = awtWindow.getGraphics();
224: g.clearRect(r.x, r.y, r.width, r.height);
225: g.dispose();
226: PaintEvent pev = new PaintEvent(awtWindow, PaintEvent.PAINT, r);
227: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(pev);
228: break;
229: case KeyPress.CODE:
230: case KeyRelease.CODE:
231: handleKeyEvent(xEvent, awtWindow);
232: break;
233: default:
234: if (XToolkit.DEBUG)
235: System.err.println("Unhandled X event: " + xEvent);
236: }
237: }
238:
239:
245: private void handleKeyEvent(Event xEvent, Window awtWindow)
246: {
247: Input keyEvent = (Input) xEvent;
248: int xKeyCode = keyEvent.detail();
249: int xMods = keyEvent.state();
250: int keyCode = KeyboardMapping.mapToKeyCode(xEvent.display.input, xKeyCode,
251: xMods);
252: char keyChar = KeyboardMapping.mapToKeyChar(xEvent.display.input, xKeyCode,
253: xMods);
254: if (XToolkit.DEBUG)
255: System.err.println("XEventPump.handleKeyEvent: " + xKeyCode + ", "
256: + xMods + ": " + ((int) keyChar) + ", " + keyCode);
257: int awtMods = KeyboardMapping.mapModifiers(xMods);
258: long when = System.currentTimeMillis();
259: KeyEvent ke;
260: if (keyEvent.code() == KeyPress.CODE)
261: {
262: ke = new KeyEvent(awtWindow, KeyEvent.KEY_PRESSED, when,
263: awtMods, keyCode,
264: KeyEvent.CHAR_UNDEFINED);
265: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ke);
266: if (keyChar != KeyEvent.CHAR_UNDEFINED)
267: {
268: ke = new KeyEvent(awtWindow, KeyEvent.KEY_TYPED, when,
269: awtMods, KeyEvent.VK_UNDEFINED,
270: keyChar);
271: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ke);
272: }
273:
274: }
275: else
276: {
277: ke = new KeyEvent(awtWindow, KeyEvent.KEY_RELEASED, when,
278: awtMods, keyCode,
279: KeyEvent.CHAR_UNDEFINED);
280: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ke);
281: }
282:
283: }
284:
285:
286: }