diff options
Diffstat (limited to 'meta/packages/qemu/files/qemu-x-no-sdl.patch')
-rw-r--r-- | meta/packages/qemu/files/qemu-x-no-sdl.patch | 630 |
1 files changed, 630 insertions, 0 deletions
diff --git a/meta/packages/qemu/files/qemu-x-no-sdl.patch b/meta/packages/qemu/files/qemu-x-no-sdl.patch new file mode 100644 index 0000000000..eb00d9806b --- /dev/null +++ b/meta/packages/qemu/files/qemu-x-no-sdl.patch | |||
@@ -0,0 +1,630 @@ | |||
1 | diff -urN qemu-0.8.2/configure qemu-0.8.2-x/configure | ||
2 | --- qemu-0.8.2/configure 2006-07-22 18:23:34.000000000 +0100 | ||
3 | +++ qemu-0.8.2-x/configure 2006-08-24 14:24:33.000000000 +0100 | ||
4 | @@ -492,6 +492,21 @@ | ||
5 | fi # cross compilation | ||
6 | fi # -z $sdl | ||
7 | |||
8 | +########################################## | ||
9 | +# X Probe | ||
10 | + | ||
11 | +x11=no | ||
12 | +if test -z "$sdl" || test "$sdl" = "no"; then | ||
13 | + x11=yes | ||
14 | +fi | ||
15 | + | ||
16 | +if test "$x11" = "yes"; then | ||
17 | + x11=no | ||
18 | + if `pkg-config --exists x11 xext`; then | ||
19 | + x11=yes | ||
20 | + fi | ||
21 | +fi | ||
22 | + | ||
23 | # Check if tools are available to build documentation. | ||
24 | if [ -x "`which texi2html`" ] && [ -x "`which pod2man`" ]; then | ||
25 | build_docs="yes" | ||
26 | @@ -540,6 +555,7 @@ | ||
27 | if test "$sdl" != "no" ; then | ||
28 | echo "SDL static link $sdl_static" | ||
29 | fi | ||
30 | +echo "X11 support $x11" | ||
31 | echo "mingw32 support $mingw32" | ||
32 | echo "Adlib support $adlib" | ||
33 | echo "CoreAudio support $coreaudio" | ||
34 | @@ -748,14 +764,14 @@ | ||
35 | fi | ||
36 | |||
37 | if test "$target_user_only" = "no" -a "$check_gfx" = "yes" \ | ||
38 | - -a "$sdl" = "no" -a "$cocoa" = "no" ; then | ||
39 | + -a "$sdl" = "no" -a "$x11" = "no" -a "$cocoa" = "no" ; then | ||
40 | echo "ERROR: QEMU requires SDL or Cocoa for graphical output" | ||
41 | echo "To build QEMU without graphical output configure with --disable-gfx-check" | ||
42 | echo "Note that this will disable all output from the virtual graphics card." | ||
43 | exit 1; | ||
44 | fi | ||
45 | |||
46 | -#echo "Creating $config_mak, $config_h and $target_dir/Makefile" | ||
47 | +echo "Creating $config_mak, $config_h and $target_dir/Makefile" | ||
48 | |||
49 | mkdir -p $target_dir | ||
50 | mkdir -p $target_dir/fpu | ||
51 | @@ -882,6 +898,14 @@ | ||
52 | fi | ||
53 | fi | ||
54 | |||
55 | +# x11 | ||
56 | +if test "$x11" = "yes"; then | ||
57 | + echo "#define CONFIG_X11 1" >> $config_h | ||
58 | + echo "CONFIG_X11=yes" >> $config_mak | ||
59 | + echo "X11_LIBS=`pkg-config --libs x11 xext`" >> $config_mak | ||
60 | + echo "X11_CFLAGS=`pkg-config --cflags x11 xext`" >> $config_mak | ||
61 | +fi | ||
62 | + | ||
63 | if test "$cocoa" = "yes" ; then | ||
64 | echo "#define CONFIG_COCOA 1" >> $config_h | ||
65 | echo "CONFIG_COCOA=yes" >> $config_mak | ||
66 | diff -urN qemu-0.8.2/Makefile.target qemu-0.8.2-x/Makefile.target | ||
67 | --- qemu-0.8.2/Makefile.target 2006-07-22 18:23:34.000000000 +0100 | ||
68 | +++ qemu-0.8.2-x/Makefile.target 2006-08-23 14:47:17.000000000 +0100 | ||
69 | @@ -376,6 +376,9 @@ | ||
70 | ifdef CONFIG_SDL | ||
71 | VL_OBJS+=sdl.o | ||
72 | endif | ||
73 | +ifdef CONFIG_X11 | ||
74 | +VL_OBJS+=x.o | ||
75 | +endif | ||
76 | VL_OBJS+=vnc.o | ||
77 | ifdef CONFIG_COCOA | ||
78 | VL_OBJS+=cocoa.o | ||
79 | @@ -426,7 +429,7 @@ | ||
80 | endif | ||
81 | |||
82 | $(QEMU_SYSTEM): $(VL_OBJS) libqemu.a | ||
83 | - $(CC) $(VL_LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(COCOA_LIBS) $(VL_LIBS) | ||
84 | + $(CC) $(VL_LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(X11_LIBS) $(COCOA_LIBS) $(VL_LIBS) | ||
85 | |||
86 | cocoa.o: cocoa.m | ||
87 | $(CC) $(CFLAGS) $(DEFINES) -c -o $@ $< | ||
88 | @@ -434,6 +437,10 @@ | ||
89 | sdl.o: sdl.c keymaps.c sdl_keysym.h | ||
90 | $(CC) $(CFLAGS) $(DEFINES) $(SDL_CFLAGS) -c -o $@ $< | ||
91 | |||
92 | +x.o: x.c keymaps.c | ||
93 | + $(CC) $(CFLAGS) $(DEFINES) $(X11_CFLAGS) -c -o $@ $< | ||
94 | + | ||
95 | + | ||
96 | vnc.o: vnc.c keymaps.c sdl_keysym.h vnchextile.h | ||
97 | $(CC) $(CFLAGS) $(DEFINES) -c -o $@ $< | ||
98 | |||
99 | diff -urN qemu-0.8.2/vl.c qemu-0.8.2-x/vl.c | ||
100 | --- qemu-0.8.2/vl.c 2006-07-22 18:23:34.000000000 +0100 | ||
101 | +++ qemu-0.8.2-x/vl.c 2006-09-29 18:58:26.000000000 +0100 | ||
102 | @@ -5217,6 +5217,9 @@ | ||
103 | #ifdef USE_CODE_COPY | ||
104 | "-no-code-copy disable code copy acceleration\n" | ||
105 | #endif | ||
106 | +#if defined(CONFIG_X11) | ||
107 | + "-parent xid Use pre-existing window as qemu output window\n" | ||
108 | +#endif | ||
109 | #ifdef TARGET_I386 | ||
110 | "-std-vga simulate a standard VGA card with VESA Bochs Extensions\n" | ||
111 | " (default is CL-GD5446 PCI VGA)\n" | ||
112 | @@ -5302,6 +5305,8 @@ | ||
113 | QEMU_OPTION_smp, | ||
114 | QEMU_OPTION_vnc, | ||
115 | QEMU_OPTION_no_acpi, | ||
116 | + | ||
117 | + QEMU_OPTION_parent_xid, | ||
118 | }; | ||
119 | |||
120 | typedef struct QEMUOption { | ||
121 | @@ -5361,6 +5366,9 @@ | ||
122 | #if defined(TARGET_PPC) || defined(TARGET_SPARC) | ||
123 | { "g", 1, QEMU_OPTION_g }, | ||
124 | #endif | ||
125 | +#if defined(CONFIG_X11) | ||
126 | + { "parent", HAS_ARG, QEMU_OPTION_parent_xid }, | ||
127 | +#endif | ||
128 | { "localtime", 0, QEMU_OPTION_localtime }, | ||
129 | { "std-vga", 0, QEMU_OPTION_std_vga }, | ||
130 | { "monitor", 1, QEMU_OPTION_monitor }, | ||
131 | @@ -5608,6 +5616,10 @@ | ||
132 | char usb_devices[MAX_USB_CMDLINE][128]; | ||
133 | int usb_devices_index; | ||
134 | |||
135 | +#if defined(CONFIG_X11) | ||
136 | + unsigned long parent_xid = 0; | ||
137 | +#endif | ||
138 | + | ||
139 | LIST_INIT (&vm_change_state_head); | ||
140 | #ifndef _WIN32 | ||
141 | { | ||
142 | @@ -6021,6 +6033,11 @@ | ||
143 | case QEMU_OPTION_no_acpi: | ||
144 | acpi_enabled = 0; | ||
145 | break; | ||
146 | +#if defined(CONFIG_X11) | ||
147 | + case QEMU_OPTION_parent_xid: | ||
148 | + parent_xid = strtol(optarg, NULL, 0); | ||
149 | + break; | ||
150 | +#endif | ||
151 | } | ||
152 | } | ||
153 | } | ||
154 | @@ -6142,6 +6159,8 @@ | ||
155 | sdl_display_init(ds, full_screen); | ||
156 | #elif defined(CONFIG_COCOA) | ||
157 | cocoa_display_init(ds, full_screen); | ||
158 | +#elif defined(CONFIG_X11) | ||
159 | + x_display_init(ds, full_screen, parent_xid); | ||
160 | #else | ||
161 | dumb_display_init(ds); | ||
162 | #endif | ||
163 | diff -urN qemu-0.8.2/vl.h qemu-0.8.2-x/vl.h | ||
164 | --- qemu-0.8.2/vl.h 2006-07-22 18:23:34.000000000 +0100 | ||
165 | +++ qemu-0.8.2-x/vl.h 2006-09-29 18:35:32.000000000 +0100 | ||
166 | @@ -767,6 +767,9 @@ | ||
167 | /* vnc.c */ | ||
168 | void vnc_display_init(DisplayState *ds, int display); | ||
169 | |||
170 | +/* x.c */ | ||
171 | +void x_display_init(DisplayState *ds, int display, unsigned long parent_xid); | ||
172 | + | ||
173 | /* ide.c */ | ||
174 | #define MAX_DISKS 4 | ||
175 | |||
176 | diff -urN qemu-0.8.2/x.c qemu-0.8.2-x/x.c | ||
177 | --- qemu-0.8.2/x.c 1970-01-01 01:00:00.000000000 +0100 | ||
178 | +++ qemu-0.8.2-x/x.c 2006-09-29 18:35:02.000000000 +0100 | ||
179 | @@ -0,0 +1,451 @@ | ||
180 | +#include "vl.h" | ||
181 | + | ||
182 | +#include <X11/Xlib.h> | ||
183 | +#include <X11/Xutil.h> | ||
184 | +#include <X11/Xatom.h> | ||
185 | +#include <X11/keysym.h> | ||
186 | +#include <X11/extensions/XShm.h> | ||
187 | + | ||
188 | +#include <sys/ipc.h> | ||
189 | +#include <sys/shm.h> | ||
190 | + | ||
191 | +typedef struct XHostScreen | ||
192 | +{ | ||
193 | + Display *xdpy; | ||
194 | + int xscreen; | ||
195 | + Visual *xvisual; | ||
196 | + Window xwin, xwinroot; | ||
197 | + GC xgc; | ||
198 | + int xdepth; | ||
199 | + XImage *ximg; | ||
200 | + int xwin_width, xwin_height; | ||
201 | + Bool use_fullscreen; | ||
202 | + Bool have_shm; | ||
203 | + unsigned char *fb_data; | ||
204 | + unsigned long cmap[256]; | ||
205 | + XShmSegmentInfo shminfo; | ||
206 | +} | ||
207 | +XHostScreen; | ||
208 | + | ||
209 | +static XHostScreen *xscreen; | ||
210 | +static int trapped_error_code = 0; | ||
211 | +static int (*old_error_handler) (Display *d, XErrorEvent *e); | ||
212 | + | ||
213 | +static void | ||
214 | +x_update(DisplayState *ds, int x, int y, int w, int h); | ||
215 | + | ||
216 | +static int | ||
217 | +error_handler(Display *display, | ||
218 | + XErrorEvent *error) | ||
219 | +{ | ||
220 | + trapped_error_code = error->error_code; | ||
221 | + return 0; | ||
222 | +} | ||
223 | + | ||
224 | +static void | ||
225 | +x_errors_trap(void) | ||
226 | +{ | ||
227 | + trapped_error_code = 0; | ||
228 | + old_error_handler = XSetErrorHandler(error_handler); | ||
229 | +} | ||
230 | + | ||
231 | +static int | ||
232 | +x_errors_untrap(void) | ||
233 | +{ | ||
234 | + XSetErrorHandler(old_error_handler); | ||
235 | + return trapped_error_code; | ||
236 | +} | ||
237 | + | ||
238 | +static void | ||
239 | +x_update(DisplayState *ds, int x, int y, int w, int h) | ||
240 | +{ | ||
241 | + if (xscreen->have_shm) | ||
242 | + { | ||
243 | + XShmPutImage(xscreen->xdpy, xscreen->xwin, xscreen->xgc, xscreen->ximg, | ||
244 | + x, y, x, y, w, h, False); | ||
245 | + } | ||
246 | + else | ||
247 | + { | ||
248 | + XPutImage(xscreen->xdpy, xscreen->xwin, xscreen->xgc, xscreen->ximg, | ||
249 | + x, y, x, y, w, h); | ||
250 | + } | ||
251 | + | ||
252 | + XSync(xscreen->xdpy, False); | ||
253 | +} | ||
254 | + | ||
255 | +static void | ||
256 | +x_resize(DisplayState *ds, int w, int h) | ||
257 | +{ | ||
258 | + Bool shm_success = False; | ||
259 | + int bitmap_pad; | ||
260 | + XSizeHints *size_hints; | ||
261 | + | ||
262 | + if (xscreen->ximg != NULL) | ||
263 | + { | ||
264 | + if (xscreen->have_shm) | ||
265 | + { | ||
266 | + XShmDetach(xscreen->xdpy, &xscreen->shminfo); | ||
267 | + XDestroyImage (xscreen->ximg); | ||
268 | + shmdt(xscreen->shminfo.shmaddr); | ||
269 | + shmctl(xscreen->shminfo.shmid, IPC_RMID, 0); | ||
270 | + } | ||
271 | + else | ||
272 | + { | ||
273 | + if (xscreen->ximg->data) | ||
274 | + { | ||
275 | + free(xscreen->ximg->data); | ||
276 | + xscreen->ximg->data = NULL; | ||
277 | + } | ||
278 | + | ||
279 | + XDestroyImage(xscreen->ximg); | ||
280 | + } | ||
281 | + } | ||
282 | + | ||
283 | + if (xscreen->have_shm) | ||
284 | + { | ||
285 | + xscreen->ximg = XShmCreateImage(xscreen->xdpy, | ||
286 | + xscreen->xvisual, | ||
287 | + xscreen->xdepth, | ||
288 | + ZPixmap, | ||
289 | + NULL, | ||
290 | + &xscreen->shminfo, | ||
291 | + w, h ); | ||
292 | + | ||
293 | + xscreen->shminfo.shmid | ||
294 | + = shmget(IPC_PRIVATE, | ||
295 | + xscreen->ximg->bytes_per_line * h, | ||
296 | + IPC_CREAT|0777); | ||
297 | + xscreen->shminfo.shmaddr = xscreen->ximg->data | ||
298 | + = shmat(xscreen->shminfo.shmid, 0, 0); | ||
299 | + | ||
300 | + if (xscreen->ximg->data == (char *)-1) | ||
301 | + { | ||
302 | + xscreen->have_shm = False; | ||
303 | + XDestroyImage(xscreen->ximg); | ||
304 | + shmctl(xscreen->shminfo.shmid, IPC_RMID, 0); | ||
305 | + } | ||
306 | + else | ||
307 | + { | ||
308 | + xscreen->shminfo.readOnly = False; | ||
309 | + XShmAttach(xscreen->xdpy, &xscreen->shminfo); | ||
310 | + shm_success = True; | ||
311 | + } | ||
312 | + } | ||
313 | + | ||
314 | + if (!shm_success) | ||
315 | + { | ||
316 | + bitmap_pad = ( xscreen->xdepth > 16 ) ? | ||
317 | + 32 : (( xscreen->xdepth > 8 )? 16 : 8 ); | ||
318 | + | ||
319 | + xscreen->ximg = XCreateImage( xscreen->xdpy, | ||
320 | + xscreen->xvisual, | ||
321 | + xscreen->xdepth, | ||
322 | + ZPixmap, 0, 0, | ||
323 | + w, | ||
324 | + h, | ||
325 | + bitmap_pad, | ||
326 | + 0); | ||
327 | + | ||
328 | + xscreen->ximg->data | ||
329 | + = malloc( xscreen->ximg->bytes_per_line * h ); | ||
330 | + } | ||
331 | + | ||
332 | + XResizeWindow(xscreen->xdpy, xscreen->xwin, w, h); | ||
333 | + | ||
334 | + /* Ask the WM to keep our size static */ | ||
335 | + size_hints = XAllocSizeHints(); | ||
336 | + size_hints->max_width = size_hints->min_width = w; | ||
337 | + size_hints->max_height = size_hints->min_height = h; | ||
338 | + size_hints->flags = PMinSize|PMaxSize; | ||
339 | + XSetWMNormalHints(xscreen->xdpy, xscreen->xwin, size_hints); | ||
340 | + XFree(size_hints); | ||
341 | + | ||
342 | + XMapWindow(xscreen->xdpy, xscreen->xwin); | ||
343 | + | ||
344 | + XSync(xscreen->xdpy, False); | ||
345 | + | ||
346 | + xscreen->xwin_width = w; | ||
347 | + xscreen->xwin_height = h; | ||
348 | + | ||
349 | + if (1) // (ds->depth == xscreen->xdepth) | ||
350 | + { | ||
351 | + ds->data = xscreen->ximg->data; | ||
352 | + } | ||
353 | + else | ||
354 | + { | ||
355 | + xscreen->fb_data = malloc(w*h*(ds->depth>>3)); | ||
356 | + ds->data = xscreen->fb_data; | ||
357 | + } | ||
358 | + | ||
359 | + ds->linesize = xscreen->ximg->bytes_per_line; | ||
360 | + ds->depth = (xscreen->xdepth >= 24) ? 32 : xscreen->xdepth; | ||
361 | + ds->bgr = 0; | ||
362 | + | ||
363 | +#if 0 | ||
364 | + if (ds->depth == 32 && screen->format->Rshift == 0) { | ||
365 | + ds->bgr = 1; | ||
366 | + } else { | ||
367 | + ds->bgr = 0; | ||
368 | + } | ||
369 | +#endif | ||
370 | + | ||
371 | + ds->width = w; | ||
372 | + ds->height = h; | ||
373 | + | ||
374 | +} | ||
375 | + | ||
376 | +static void | ||
377 | +x_refresh(DisplayState *ds) | ||
378 | +{ | ||
379 | + vga_hw_update(); | ||
380 | +} | ||
381 | + | ||
382 | +static int | ||
383 | +x_listen_poll(void *opaque) | ||
384 | +{ | ||
385 | + return XPending(xscreen->xdpy); | ||
386 | +} | ||
387 | + | ||
388 | +static void | ||
389 | +x_grab(void) | ||
390 | +{ | ||
391 | + static Bool grab = False; | ||
392 | + | ||
393 | + if (!grab) | ||
394 | + { | ||
395 | + if (XGrabPointer (xscreen->xdpy, xscreen->xwin, | ||
396 | + True, | ||
397 | + NoEventMask, | ||
398 | + GrabModeAsync, | ||
399 | + GrabModeAsync, | ||
400 | + xscreen->xwin, None, CurrentTime) == 0 | ||
401 | + && XGrabKeyboard (xscreen->xdpy, xscreen->xwin, True, | ||
402 | + GrabModeAsync, | ||
403 | + GrabModeAsync, | ||
404 | + CurrentTime) == 0) | ||
405 | + { | ||
406 | + grab = True; | ||
407 | + XStoreName(xscreen->xdpy, xscreen->xwin, | ||
408 | + "QEmu (ctrl+shift releases mouse and keyboard )"); | ||
409 | + } | ||
410 | + } | ||
411 | + else | ||
412 | + { | ||
413 | + XUngrabPointer (xscreen->xdpy, CurrentTime); | ||
414 | + XUngrabKeyboard (xscreen->xdpy, CurrentTime); | ||
415 | + grab = False; | ||
416 | + XStoreName(xscreen->xdpy, xscreen->xwin, | ||
417 | + "QEmu (ctrl+shift grabs mouse and keyboard )"); | ||
418 | + } | ||
419 | +} | ||
420 | + | ||
421 | +static void | ||
422 | +x_listen_read(void *opaque) | ||
423 | +{ | ||
424 | + XEvent xev; | ||
425 | + DisplayState *ds = opaque; | ||
426 | + Bool grabbed = False; | ||
427 | + static int last_x = 0, last_y = 0, button_state = 0, state; | ||
428 | + | ||
429 | + if (XPending(xscreen->xdpy)) | ||
430 | + { | ||
431 | + XNextEvent(xscreen->xdpy, &xev); | ||
432 | + | ||
433 | + switch (xev.type) | ||
434 | + { | ||
435 | + case EnterNotify: | ||
436 | + case LeaveNotify: | ||
437 | + break; | ||
438 | + case FocusIn: | ||
439 | + if (!kbd_mouse_is_absolute()) | ||
440 | + x_grab(); | ||
441 | + break; | ||
442 | + case FocusOut: | ||
443 | + break; | ||
444 | + case Expose: | ||
445 | + while (XCheckTypedWindowEvent(xscreen->xdpy, xev.xexpose.window, | ||
446 | + Expose, &xev)); | ||
447 | + x_update(ds, 0, 0, | ||
448 | + xscreen->xwin_width, | ||
449 | + xscreen->xwin_height); | ||
450 | + break; | ||
451 | + case KeyRelease: | ||
452 | + if ((XKeycodeToKeysym(xscreen->xdpy, | ||
453 | + xev.xkey.keycode,0) == XK_Shift_L | ||
454 | + || XKeycodeToKeysym(xscreen->xdpy, | ||
455 | + xev.xkey.keycode,0) == XK_Shift_R) | ||
456 | + && (xev.xkey.state & ControlMask)) | ||
457 | + { | ||
458 | + x_grab(); | ||
459 | + break; | ||
460 | + } | ||
461 | + case KeyPress: | ||
462 | + { | ||
463 | + int keycode = xev.xkey.keycode-8; /* X adds 8 to keycode */ | ||
464 | + | ||
465 | + /* FIXME: LUT needed here me thinks */ | ||
466 | + | ||
467 | + if (keycode & 0x80) /* Extended */ | ||
468 | + kbd_put_keycode(0xe0); | ||
469 | + | ||
470 | + if (xev.type == KeyPress) | ||
471 | + kbd_put_keycode(keycode & 0x7f); | ||
472 | + else | ||
473 | + kbd_put_keycode(keycode | 0x80); | ||
474 | + } | ||
475 | + break; | ||
476 | + case ButtonPress: | ||
477 | + case ButtonRelease: | ||
478 | + case MotionNotify: | ||
479 | + { | ||
480 | + int ev_state, ev_x, ev_y, dx, dy; | ||
481 | + | ||
482 | + state = 0; | ||
483 | + | ||
484 | + if (xev.type == MotionNotify) | ||
485 | + { | ||
486 | + ev_state = xev.xmotion.state; | ||
487 | + ev_x = xev.xmotion.x; | ||
488 | + ev_y = xev.xmotion.y; | ||
489 | + | ||
490 | + if (ev_state & Button1Mask) | ||
491 | + state |= MOUSE_EVENT_LBUTTON; | ||
492 | + if (ev_state & Button2Mask) | ||
493 | + state |= MOUSE_EVENT_RBUTTON; | ||
494 | + if (ev_state & Button3Mask) | ||
495 | + state |= MOUSE_EVENT_MBUTTON; | ||
496 | + | ||
497 | + /* Touchscreen dont send motion notifys */ | ||
498 | + if (kbd_mouse_is_absolute() && state == 0) | ||
499 | + break; | ||
500 | + } | ||
501 | + else | ||
502 | + { | ||
503 | + ev_state = xev.xbutton.state; | ||
504 | + ev_x = xev.xbutton.x; | ||
505 | + ev_y = xev.xbutton.y; | ||
506 | + | ||
507 | + if (xev.type == ButtonPress) | ||
508 | + { | ||
509 | + if (xev.xbutton.button == Button1) | ||
510 | + state |= MOUSE_EVENT_LBUTTON; | ||
511 | + if (xev.xbutton.state == Button1) | ||
512 | + state |= MOUSE_EVENT_RBUTTON; | ||
513 | + if (xev.xbutton.state & Button3) | ||
514 | + state |= MOUSE_EVENT_MBUTTON; | ||
515 | + } | ||
516 | + } | ||
517 | + | ||
518 | + if (kbd_mouse_is_absolute()) | ||
519 | + { | ||
520 | + dx = ev_x * 0x7FFF / xscreen->xwin_width; | ||
521 | + dy = ev_y * 0x7FFF / xscreen->xwin_height; | ||
522 | + } | ||
523 | + else | ||
524 | + { | ||
525 | + dx = ev_x - last_x; | ||
526 | + dy = ev_y - last_y; | ||
527 | + } | ||
528 | + | ||
529 | + kbd_mouse_event(dx, dy, 0, state); | ||
530 | + | ||
531 | + last_x = ev_x; | ||
532 | + last_y = ev_y; | ||
533 | + } | ||
534 | + break; | ||
535 | + default: | ||
536 | + break; | ||
537 | + | ||
538 | + } | ||
539 | + } | ||
540 | + return; | ||
541 | +} | ||
542 | + | ||
543 | +void | ||
544 | +x_display_init(DisplayState *ds, int full_screen, unsigned long parent_xid) | ||
545 | +{ | ||
546 | + Cursor empty_cursor; | ||
547 | + Pixmap cursor_pxm; | ||
548 | + XColor col; | ||
549 | + XSetWindowAttributes attr; | ||
550 | + | ||
551 | + xscreen = malloc(sizeof(XHostScreen)); | ||
552 | + memset(xscreen, 0, sizeof(XHostScreen)); | ||
553 | + | ||
554 | + if ((xscreen->xdpy = XOpenDisplay(getenv("DISPLAY"))) == NULL) | ||
555 | + { | ||
556 | + fprintf(stderr, "\nqemu cannot open host display. Is DISPLAY set?\n"); | ||
557 | + exit(-1); | ||
558 | + } | ||
559 | + | ||
560 | + xscreen->xscreen = DefaultScreen(xscreen->xdpy); | ||
561 | + xscreen->xwinroot = RootWindow(xscreen->xdpy, xscreen->xscreen); | ||
562 | + xscreen->xgc = XCreateGC(xscreen->xdpy, xscreen->xwinroot, 0, NULL); | ||
563 | + xscreen->xdepth = DefaultDepth(xscreen->xdpy, xscreen->xscreen); | ||
564 | + xscreen->xvisual = DefaultVisual(xscreen->xdpy, xscreen->xscreen); | ||
565 | + | ||
566 | + attr.event_mask = ButtonPressMask|ButtonReleaseMask|PointerMotionMask | ||
567 | + |KeyPressMask|KeyReleaseMask|ExposureMask | ||
568 | + |FocusChangeMask|EnterWindowMask|LeaveWindowMask; | ||
569 | + | ||
570 | + xscreen->xwin = XCreateWindow(xscreen->xdpy, | ||
571 | + xscreen->xwinroot, | ||
572 | + 0,0,640,480, | ||
573 | + 0, | ||
574 | + CopyFromParent, | ||
575 | + CopyFromParent, | ||
576 | + CopyFromParent, | ||
577 | + CWEventMask, | ||
578 | + &attr); | ||
579 | + | ||
580 | + xscreen->have_shm = True; | ||
581 | + | ||
582 | + if (!XShmQueryExtension(xscreen->xdpy) || getenv("QEMU_X_NO_SHM")) | ||
583 | + { | ||
584 | + xscreen->have_shm = False; | ||
585 | + } | ||
586 | + else | ||
587 | + { | ||
588 | + XShmSegmentInfo shminfo; | ||
589 | + | ||
590 | + shminfo.shmid=shmget(IPC_PRIVATE, 1, IPC_CREAT|0777); | ||
591 | + shminfo.shmaddr=shmat(shminfo.shmid,0,0); | ||
592 | + shminfo.readOnly=True; | ||
593 | + | ||
594 | + x_errors_trap(); | ||
595 | + | ||
596 | + XShmAttach(xscreen->xdpy, &shminfo); | ||
597 | + XSync(xscreen->xdpy, False); | ||
598 | + | ||
599 | + if (x_errors_untrap()) | ||
600 | + { | ||
601 | + fprintf(stderr, "QEmu unable to use SHM XImages\n"); | ||
602 | + xscreen->have_shm = False; | ||
603 | + } | ||
604 | + | ||
605 | + shmdt(shminfo.shmaddr); | ||
606 | + shmctl(shminfo.shmid, IPC_RMID, 0); | ||
607 | + } | ||
608 | + | ||
609 | + if (!kbd_mouse_is_absolute()) | ||
610 | + { | ||
611 | + /* Only hide cursor if were not a touchscreen */ | ||
612 | + cursor_pxm = XCreatePixmap (xscreen->xdpy, xscreen->xwinroot, 1, 1, 1); | ||
613 | + memset (&col, 0, sizeof (col)); | ||
614 | + empty_cursor = XCreatePixmapCursor (xscreen->xdpy, | ||
615 | + cursor_pxm, cursor_pxm, | ||
616 | + &col, &col, 1, 1); | ||
617 | + XDefineCursor (xscreen->xdpy, xscreen->xwin, empty_cursor); | ||
618 | + XFreePixmap (xscreen->xdpy, cursor_pxm); | ||
619 | + } | ||
620 | + | ||
621 | + ds->dpy_update = x_update; | ||
622 | + ds->dpy_resize = x_resize; | ||
623 | + ds->dpy_refresh = x_refresh; | ||
624 | + | ||
625 | + if ((qemu_set_fd_handler2 (ConnectionNumber(xscreen->xdpy), | ||
626 | + x_listen_poll, x_listen_read, NULL, ds)) == -1) | ||
627 | + exit(-1); | ||
628 | + | ||
629 | + x_resize(ds, 640, 480); | ||
630 | +} | ||