Index: uspace/srv/hid/input/generic/input.c
===================================================================
--- uspace/srv/hid/input/generic/input.c	(revision 8486c070d3e8193fcd8774597aa3c3438d3ba2c9)
+++ uspace/srv/hid/input/generic/input.c	(revision f66ca57f67fa0ea52c699112f4682f74c09f6bb9)
@@ -189,4 +189,15 @@
 	}
 	async_exchange_end(exch);
+}
+
+/** Mouse pointer has moved in absolute mode. */
+void mouse_push_event_abs_move(mouse_dev_t *mdev, unsigned int x, unsigned int y,
+    unsigned int max_x, unsigned int max_y)
+{
+	if (max_x && max_y) {
+		async_exch_t *exch = async_exchange_begin(client_sess);
+		async_msg_4(exch, INPUT_EVENT_ABS_MOVE, x, y, max_x, max_y);
+		async_exchange_end(exch);
+	}
 }
 
Index: uspace/srv/hid/input/include/mouse.h
===================================================================
--- uspace/srv/hid/input/include/mouse.h	(revision 8486c070d3e8193fcd8774597aa3c3438d3ba2c9)
+++ uspace/srv/hid/input/include/mouse.h	(revision f66ca57f67fa0ea52c699112f4682f74c09f6bb9)
@@ -63,4 +63,6 @@
 extern void mouse_push_data(mouse_dev_t *, sysarg_t);
 extern void mouse_push_event_move(mouse_dev_t *, int, int, int);
+extern void mouse_push_event_abs_move(mouse_dev_t *, unsigned int, unsigned int,
+    unsigned int, unsigned int);
 extern void mouse_push_event_button(mouse_dev_t *, int, int);
 
Index: uspace/srv/hid/input/proto/mousedev.c
===================================================================
--- uspace/srv/hid/input/proto/mousedev.c	(revision 8486c070d3e8193fcd8774597aa3c3438d3ba2c9)
+++ uspace/srv/hid/input/proto/mousedev.c	(revision f66ca57f67fa0ea52c699112f4682f74c09f6bb9)
@@ -96,4 +96,10 @@
 			retval = EOK;
 			break;
+		case MOUSEEV_ABS_MOVE_EVENT:
+			mouse_push_event_abs_move(mousedev->mouse_dev,
+				IPC_GET_ARG1(call), IPC_GET_ARG2(call),
+				IPC_GET_ARG3(call), IPC_GET_ARG4(call));
+			retval = EOK;
+			break;
 		case MOUSEEV_BUTTON_EVENT:
 			mouse_push_event_button(mousedev->mouse_dev,
