Index: uspace/srv/hid/compositor/compositor.c
===================================================================
--- uspace/srv/hid/compositor/compositor.c	(revision 1e3ea91748c924fbf2cbe22046f01c20416c283e)
+++ uspace/srv/hid/compositor/compositor.c	(revision 7b64cf068a8ae48732b2dc5199287d283ff347d1)
@@ -139,4 +139,5 @@
 } viewport_t;
 
+static desktop_rect_t viewport_bound_rect;
 static FIBRIL_MUTEX_INITIALIZE(viewport_list_mtx);
 static LIST_INITIALIZE(viewport_list);
@@ -318,4 +319,52 @@
 }
 
+static void comp_restrict_pointers(void)
+{
+	fibril_mutex_lock(&viewport_list_mtx);
+
+	sysarg_t x_res = coord_origin;
+	sysarg_t y_res = coord_origin;
+	sysarg_t w_res = 0;
+	sysarg_t h_res = 0;
+
+	if (!list_empty(&viewport_list)) {
+		viewport_t *vp = (viewport_t *) list_first(&viewport_list);
+		x_res = vp->pos.x;
+		y_res = vp->pos.y;
+		surface_get_resolution(vp->surface, &w_res, &h_res);
+	}
+
+	list_foreach(viewport_list, link) {
+		viewport_t *vp = list_get_instance(link, viewport_t, link);
+		sysarg_t w_vp, h_vp;
+		surface_get_resolution(vp->surface, &w_vp, &h_vp);
+		rectangle_union(
+		    x_res, y_res, w_res, h_res,
+		    vp->pos.x, vp->pos.y, w_vp, h_vp,
+		    &x_res, &y_res, &w_res, &h_res);
+	}
+
+	viewport_bound_rect.x = x_res;
+	viewport_bound_rect.y = y_res;
+	viewport_bound_rect.w = w_res;
+	viewport_bound_rect.h = h_res;
+
+	fibril_mutex_unlock(&viewport_list_mtx);
+
+	fibril_mutex_lock(&pointer_list_mtx);
+
+	list_foreach(pointer_list, link) {
+		pointer_t *ptr = list_get_instance(link, pointer_t, link);
+		ptr->pos.x = ptr->pos.x > viewport_bound_rect.x ? ptr->pos.x : viewport_bound_rect.x;
+		ptr->pos.y = ptr->pos.y > viewport_bound_rect.y ? ptr->pos.y : viewport_bound_rect.y;
+		ptr->pos.x = ptr->pos.x < viewport_bound_rect.x + viewport_bound_rect.w ?
+		    ptr->pos.x : viewport_bound_rect.x + viewport_bound_rect.w;
+		ptr->pos.y = ptr->pos.y < viewport_bound_rect.y + viewport_bound_rect.h ?
+		    ptr->pos.y : viewport_bound_rect.y + viewport_bound_rect.h;
+	}
+
+	fibril_mutex_unlock(&pointer_list_mtx);
+}
+
 static void comp_damage(sysarg_t x_dmg_glob, sysarg_t y_dmg_glob,
     sysarg_t w_dmg_glob, sysarg_t h_dmg_glob)
@@ -929,4 +978,5 @@
 	async_answer_0(iid, EOK);
 
+	comp_restrict_pointers();
 	comp_damage(0, 0, UINT32_MAX, UINT32_MAX);
 }
@@ -974,4 +1024,7 @@
 		fibril_mutex_unlock(&viewport_list_mtx);
 		async_answer_0(iid, EOK);
+
+		comp_restrict_pointers();
+		comp_damage(0, 0, UINT32_MAX, UINT32_MAX);
 	}
 }
@@ -1409,4 +1462,16 @@
 	surface_get_resolution(pointer->cursor.states[pointer->state], 
 	     &cursor_width, &cursor_height);
+	if (pointer->pos.x + dx < viewport_bound_rect.x) {
+		dx = -1 * (pointer->pos.x - viewport_bound_rect.x);
+	}
+	if (pointer->pos.y + dy < viewport_bound_rect.y) {
+		dy = -1 * (pointer->pos.y - viewport_bound_rect.y);
+	}
+	if (pointer->pos.x + dx > viewport_bound_rect.x + viewport_bound_rect.w) {
+		dx = (viewport_bound_rect.x + viewport_bound_rect.w - pointer->pos.x);
+	}
+	if (pointer->pos.y + dy > viewport_bound_rect.y + viewport_bound_rect.h) {
+		dy = (viewport_bound_rect.y + viewport_bound_rect.h - pointer->pos.y);
+	}
 	pointer->pos.x += dx;
 	pointer->pos.y += dy;
@@ -1928,4 +1993,5 @@
 			fibril_mutex_unlock(&viewport_list_mtx);
 
+			comp_restrict_pointers();
 			comp_damage(x, y, width, height);
 		} else {
@@ -2140,5 +2206,6 @@
 		return -1;
 	}
-	
+
+	comp_restrict_pointers();
 	comp_damage(0, 0, UINT32_MAX, UINT32_MAX);
 	
