From 1c196e12aabeaf163a901befb1cc3e2eb4585740 Mon Sep 17 00:00:00 2001 From: "munkyu.im" Date: Mon, 10 Sep 2012 10:34:51 +0900 Subject: [PATCH] [Title]input: host mouse wheel support [Type]Enhancement [Module] [Priority] [CQ#] [Redmine#]5614 [Problem] [Cause] [Solution] [TestCase] --- input.c | 26 +++++++++++++-- tizen/src/emul_state.h | 2 ++ .../src/org/tizen/emulator/skin/EmulatorSkin.java | 28 ++++++++++++++++ .../tizen/emulator/skin/comm/ICommunicator.java | 4 ++- tizen/src/skin/maruskin_operation.c | 38 ++++++++++++++++++---- 5 files changed, 88 insertions(+), 10 deletions(-) diff --git a/input.c b/input.c index 37c88c7..8087d76 100644 --- a/input.c +++ b/input.c @@ -28,6 +28,9 @@ #include "console.h" #include "error.h" #include "qmp-commands.h" +#include "tizen/src/debug_ch.h" + +MULTI_DEBUG_CHANNEL(tizen, input); static QEMUPutKBDEvent *qemu_put_kbd_event; static void *qemu_put_kbd_event_opaque; @@ -181,12 +184,31 @@ void kbd_mouse_event(int dx, int dy, int dz, int buttons_state) if (QTAILQ_EMPTY(&mouse_handlers)) { return; } - +#if defined (CONFIG_MARU) + QTAILQ_FOREACH(entry, &mouse_handlers, node) { + /* if mouse event is wheelup ,wheeldown or move + then go to ps2 mouse event(index == 0) */ + if((buttons_state > 3 && entry->index == 0)) { + INFO("input device: %s, event: %d\n", entry->qemu_put_mouse_event_name, buttons_state); + buttons_state = 0; + mouse_event = entry->qemu_put_mouse_event; + mouse_event_opaque = entry->qemu_put_mouse_event_opaque; + break; + } + } + /* other events(mouse up, down and drag), go to touch screen */ + if(!entry) { + entry = QTAILQ_FIRST(&mouse_handlers); + mouse_event = entry->qemu_put_mouse_event; + mouse_event_opaque = entry->qemu_put_mouse_event_opaque; + INFO("input device: %s, event: %d\n", entry->qemu_put_mouse_event_name, buttons_state); + } +#else entry = QTAILQ_FIRST(&mouse_handlers); mouse_event = entry->qemu_put_mouse_event; mouse_event_opaque = entry->qemu_put_mouse_event_opaque; - +#endif if (mouse_event) { if (entry->qemu_put_mouse_event_absolute) { width = 0x7fff; diff --git a/tizen/src/emul_state.h b/tizen/src/emul_state.h index 2018f8a..fd982ec 100644 --- a/tizen/src/emul_state.h +++ b/tizen/src/emul_state.h @@ -50,6 +50,8 @@ enum { MOUSE_DOWN = 1, MOUSE_UP = 2, MOUSE_DRAG = 3, + MOUSE_WHEELUP = 4, + MOUSE_WHEELDOWN = 5, }; /* keep it consistent with emulator-skin definition */ diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java index a29540a..ce52474 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java @@ -52,6 +52,7 @@ import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.MouseTrackAdapter; import org.eclipse.swt.events.MouseTrackListener; +import org.eclipse.swt.events.MouseWheelListener; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; @@ -175,6 +176,7 @@ public class EmulatorSkin { //private DragDetectListener canvasDragDetectListener; private MouseMoveListener canvasMouseMoveListener; private MouseListener canvasMouseListener; + private MouseWheelListener canvasMouseWheelListener; private KeyListener canvasKeyListener; private MenuDetectListener canvasMenuDetectListener; @@ -891,6 +893,29 @@ public class EmulatorSkin { }; canvas.addMouseListener( canvasMouseListener ); + canvasMouseWheelListener = new MouseWheelListener() { + + @Override + public void mouseScrolled(MouseEvent e) { + int[] geometry = SkinUtil.convertMouseGeometry( e.x, e.y, currentLcdWidth, currentLcdHeight, + currentScale, currentAngle ); + logger.info( "mousewheel in LCD" + " x:" + geometry[0] + " y:" + geometry[1] + " value:" + e.count); + int eventType; + + if(e.count < 0) + eventType = MouseEventType.WHEELDOWN.value(); + else + eventType = MouseEventType.WHEELUP.value(); + + MouseEventData mouseEventData = new MouseEventData( MouseButtonType.WHEEL.value(), eventType, + e.x, e.y, geometry[0], geometry[1], e.count ); + communicator.sendToQEMU( SendCommand.SEND_MOUSE_EVENT, mouseEventData ); + } + }; + + canvas.addMouseWheelListener( canvasMouseWheelListener ); + + canvasKeyListener = new KeyListener() { @@ -999,6 +1024,9 @@ public class EmulatorSkin { if ( null != canvasMenuDetectListener ) { lcdCanvas.removeMenuDetectListener( canvasMenuDetectListener ); } + if ( null != canvasMouseWheelListener ) { + lcdCanvas.removeMouseWheelListener( canvasMouseWheelListener ); + } } diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/ICommunicator.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/ICommunicator.java index efd80c2..79405c5 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/ICommunicator.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/ICommunicator.java @@ -91,7 +91,9 @@ public interface ICommunicator extends Runnable { public enum MouseEventType { DOWN( (short)1 ), UP( (short)2 ), - DRAG( (short)3 ); + DRAG( (short)3 ), + WHEELUP( (short)4 ), + WHEELDOWN( (short)5 ); private short value; MouseEventType( short value ) { diff --git a/tizen/src/skin/maruskin_operation.c b/tizen/src/skin/maruskin_operation.c index 88d4929..68fe7c7 100644 --- a/tizen/src/skin/maruskin_operation.c +++ b/tizen/src/skin/maruskin_operation.c @@ -68,6 +68,7 @@ MULTI_DEBUG_CHANNEL(qemu, skin_operation); #define TIMEOUT_FOR_SHUTDOWN 10 // seconds static int requested_shutdown_qemu_gracefully = 0; +static int guest_x, guest_y = 0; static void* run_timed_shutdown_thread(void* args); static void send_to_emuld(const char* request_type, int request_size, const char* send_buf, int buf_size); @@ -105,14 +106,37 @@ void do_mouse_event(int button_type, int event_type, #endif /* single touch */ - if (MOUSE_DOWN == event_type || MOUSE_DRAG == event_type) { - kbd_mouse_event(x, y, z, 1); - } else if (MOUSE_UP == event_type) { - kbd_mouse_event(x, y, z, 0); - } else { - ERR("undefined mouse event type:%d\n", event_type); + switch(event_type) { + case MOUSE_DOWN: + case MOUSE_DRAG: + guest_x = x; + guest_y = y; + kbd_mouse_event(x, y, z, 1); + TRACE("mouse_event event_type:%d, origin:(%d, %d), x:%d, y:%d, z:%d\n\n", + event_type, origin_x, origin_y, x, y, z); + break; + case MOUSE_UP: + guest_x = x; + guest_y = y; + kbd_mouse_event(x, y, z, 0); + TRACE("mouse_event event_type:%d, origin:(%d, %d), x:%d, y:%d, z:%d\n\n", + event_type, origin_x, origin_y, x, y, z); + break; + case MOUSE_WHEELUP: + case MOUSE_WHEELDOWN: + x -= guest_x; + y -= guest_y; + guest_x += x; + guest_y += y; + kbd_mouse_event(x, y, -z, event_type); + TRACE("mouse_event event_type:%d, origin:(%d, %d), x:%d, y:%d, z:%d\n\n", + event_type, origin_x, origin_y, x, y, z); + break; + default: + ERR("undefined mouse event type passed:%d\n", event_type); + break; } - + #if 0 #ifdef CONFIG_WIN32 Sleep(1); -- 2.7.4