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 thread = new Thread(this, "X Event Pump");
101: thread.setDaemon(true);
102: thread.start();
103: }
104:
105:
109: public void run()
110: {
111: while (display.connected)
112: {
113: try
114: {
115: Event xEvent = display.next_event();
116: handleEvent(xEvent);
117: }
118: catch (ThreadDeath death)
119: {
120:
121: return;
122: }
123: catch (Throwable x)
124: {
125: System.err.println("Exception during event dispatch:");
126: x.printStackTrace(System.err);
127: }
128: }
129: }
130:
131:
138: void registerWindow(gnu.x11.Window xWindow, Window awtWindow)
139: {
140: if (XToolkit.DEBUG)
141: System.err.println("registering window id: " + xWindow.id);
142: windows.put(new Integer(xWindow.id), awtWindow);
143: }
144:
145: void unregisterWindow(gnu.x11.Window xWindow)
146: {
147: windows.remove(new Integer(xWindow.id));
148: }
149:
150: private void handleEvent(Event xEvent)
151: {
152:
153: Integer key = null;
154: Window awtWindow = null;
155:
156: if (XToolkit.DEBUG)
157: System.err.println("fetched event: " + xEvent);
158: switch (xEvent.code())
159: {
160: case ButtonPress.CODE:
161: ButtonPress bp = (ButtonPress) xEvent;
162: key= new Integer(bp.event_window_id);
163: awtWindow = (Window) windows.get(key);
164:
165: int button = bp.detail();
166:
167:
168: if (button >= gnu.x11.Input.BUTTON3)
169: button = 0;
170: drag = button;
171:
172: MouseEvent mp = new MouseEvent(awtWindow, MouseEvent.MOUSE_PRESSED,
173: System.currentTimeMillis(),
174: KeyboardMapping.mapModifiers(bp.state()) | buttonToModifier(button),
175: bp.event_x(), bp.event_y(),
176: 1, false, button);
177: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mp);
178: break;
179: case ButtonRelease.CODE:
180: ButtonRelease br = (ButtonRelease) xEvent;
181: key= new Integer(br.event_window_id);
182: awtWindow = (Window) windows.get(key);
183:
184: button = br.detail();
185:
186: if (button >= gnu.x11.Input.BUTTON3)
187: button = 0;
188: drag = -1;
189: MouseEvent mr = new MouseEvent(awtWindow, MouseEvent.MOUSE_RELEASED,
190: System.currentTimeMillis(),
191: KeyboardMapping.mapModifiers(br.state()) | buttonToModifier(button),
192: br.event_x(), br.event_y(),
193: 1, false, button);
194: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mr);
195: break;
196: case MotionNotify.CODE:
197: MotionNotify mn = (MotionNotify) xEvent;
198: key= new Integer(mn.event_window_id);
199: awtWindow = (Window) windows.get(key);
200:
201: MouseEvent mm;
202: if (drag == -1)
203: {
204: mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_MOVED,
205: System.currentTimeMillis(), 0,
206: mn.event_x(), mn.event_y(),
207: 1, false);
208: }
209: else
210: {
211: mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_DRAGGED,
212: System.currentTimeMillis(), 0,
213: mn.event_x(), mn.event_y(),
214: 1, false);
215: }
216: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mm);
217: break;
218: case ConfigureNotify.CODE:
219: key= new Integer(((ConfigureNotify) xEvent).event_window_id);
220: awtWindow = (Window) windows.get(key);
221: ConfigureNotify c = (ConfigureNotify) xEvent;
222: if (XToolkit.DEBUG)
223: System.err.println("resize request for window id: " + key);
224:
225:
226: if (c.width() != awtWindow.getWidth()
227: || c.height() != awtWindow.getHeight())
228: {
229: if (XToolkit.DEBUG)
230: System.err.println("Setting size on AWT window: " + c.width()
231: + ", " + c.height() + ", " + awtWindow.getWidth()
232: + ", " + awtWindow.getHeight());
233: ((XWindowPeer) awtWindow.getPeer()).callback = true;
234: awtWindow.setSize(c.width(), c.height());
235: ((XWindowPeer) awtWindow.getPeer()).callback = false;
236: }
237: break;
238: case Expose.CODE:
239: key= new Integer(((Expose) xEvent).window_id);
240: awtWindow = (Window) windows.get(key);
241: Expose exp = (Expose) xEvent;
242: if (XToolkit.DEBUG)
243: System.err.println("expose request for window id: " + key);
244: Rectangle r = new Rectangle(exp.x(), exp.y(), exp.width(),
245: exp.height());
246:
247:
248: Graphics g = awtWindow.getGraphics();
249: g.clearRect(r.x, r.y, r.width, r.height);
250: g.dispose();
251: PaintEvent pev = new PaintEvent(awtWindow, PaintEvent.PAINT, r);
252: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(pev);
253: break;
254: case KeyPress.CODE:
255: case KeyRelease.CODE:
256: key = new Integer(((Input) xEvent).event_window_id);
257: awtWindow = (Window) windows.get(key);
258: handleKeyEvent(xEvent, awtWindow);
259: break;
260: default:
261: if (XToolkit.DEBUG)
262: System.err.println("Unhandled X event: " + xEvent);
263: }
264: }
265:
266:
272: private void handleKeyEvent(Event xEvent, Window awtWindow)
273: {
274: Input keyEvent = (Input) xEvent;
275: int xKeyCode = keyEvent.detail();
276: int xMods = keyEvent.state();
277: int keyCode = KeyboardMapping.mapToKeyCode(xEvent.display.input, xKeyCode,
278: xMods);
279: char keyChar = KeyboardMapping.mapToKeyChar(xEvent.display.input, xKeyCode,
280: xMods);
281: if (XToolkit.DEBUG)
282: System.err.println("XEventPump.handleKeyEvent: " + xKeyCode + ", "
283: + xMods + ": " + ((int) keyChar) + ", " + keyCode);
284: int awtMods = KeyboardMapping.mapModifiers(xMods);
285: long when = System.currentTimeMillis();
286: KeyEvent ke;
287: if (keyEvent.code() == KeyPress.CODE)
288: {
289: ke = new KeyEvent(awtWindow, KeyEvent.KEY_PRESSED, when,
290: awtMods, keyCode,
291: KeyEvent.CHAR_UNDEFINED);
292: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ke);
293: if (keyChar != KeyEvent.CHAR_UNDEFINED)
294: {
295: ke = new KeyEvent(awtWindow, KeyEvent.KEY_TYPED, when,
296: awtMods, KeyEvent.VK_UNDEFINED,
297: keyChar);
298: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ke);
299: }
300:
301: }
302: else
303: {
304: ke = new KeyEvent(awtWindow, KeyEvent.KEY_RELEASED, when,
305: awtMods, keyCode,
306: KeyEvent.CHAR_UNDEFINED);
307: Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ke);
308: }
309:
310: }
311:
312:
316: static int buttonToModifier(int button)
317: {
318: switch (button)
319: {
320: case gnu.x11.Input.BUTTON1:
321: return MouseEvent.BUTTON1_DOWN_MASK | MouseEvent.BUTTON1_MASK;
322: case gnu.x11.Input.BUTTON2:
323: return MouseEvent.BUTTON2_DOWN_MASK | MouseEvent.BUTTON2_MASK;
324: case gnu.x11.Input.BUTTON3:
325: return MouseEvent.BUTTON3_DOWN_MASK | MouseEvent.BUTTON3_MASK;
326: }
327:
328: return 0;
329: }
330:
331: }