Index: uspace/lib/memgfx/src/memgc.c
===================================================================
--- uspace/lib/memgfx/src/memgc.c	(revision 43ffecf4956edbfcfac6657e2f0da6c767e14d3a)
+++ uspace/lib/memgfx/src/memgc.c	(revision 4afb6c91df0d969238da3aab915a9e09020645bf)
@@ -57,4 +57,7 @@
 static errno_t mem_gc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *);
 static errno_t mem_gc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *);
+static errno_t mem_gc_cursor_get_pos(void *, gfx_coord2_t *);
+static errno_t mem_gc_cursor_set_pos(void *, gfx_coord2_t *);
+static errno_t mem_gc_cursor_set_visible(void *, bool);
 static void mem_gc_invalidate_rect(mem_gc_t *, gfx_rect_t *);
 
@@ -67,5 +70,8 @@
 	.bitmap_destroy = mem_gc_bitmap_destroy,
 	.bitmap_render = mem_gc_bitmap_render,
-	.bitmap_get_alloc = mem_gc_bitmap_get_alloc
+	.bitmap_get_alloc = mem_gc_bitmap_get_alloc,
+	.cursor_get_pos = mem_gc_cursor_get_pos,
+	.cursor_set_pos = mem_gc_cursor_set_pos,
+	.cursor_set_visible = mem_gc_cursor_set_visible
 };
 
@@ -152,5 +158,5 @@
 	mem_gc_t *mgc = (mem_gc_t *) arg;
 
-	mgc->update(mgc->cb_arg);
+	mgc->cb->update(mgc->cb_arg);
 	return EOK;
 }
@@ -162,6 +168,6 @@
  * @param rect Bounding rectangle
  * @param alloc Allocation info
- * @param update_cb Function called to update a rectangle
- * @param cb_arg Argument to callback function
+ * @param cb Pointer to memory GC callbacks
+ * @param cb_arg Argument to callback functions
  * @param rgc Place to store pointer to new memory GC
  *
@@ -169,6 +175,5 @@
  */
 errno_t mem_gc_create(gfx_rect_t *rect, gfx_bitmap_alloc_t *alloc,
-    mem_gc_invalidate_cb_t invalidate_cb, mem_gc_update_cb_t update_cb,
-    void *cb_arg, mem_gc_t **rgc)
+    mem_gc_cb_t *cb, void *cb_arg, mem_gc_t **rgc)
 {
 	mem_gc_t *mgc = NULL;
@@ -191,6 +196,5 @@
 	mgc->alloc = *alloc;
 
-	mgc->invalidate = invalidate_cb;
-	mgc->update = update_cb;
+	mgc->cb = cb;
 	mgc->cb_arg = cb_arg;
 
@@ -246,5 +250,5 @@
 static void mem_gc_invalidate_rect(mem_gc_t *mgc, gfx_rect_t *rect)
 {
-	mgc->invalidate(mgc->cb_arg, rect);
+	mgc->cb->invalidate(mgc->cb_arg, rect);
 }
 
@@ -464,4 +468,55 @@
 }
 
+/** Get cursor position on memory GC.
+ *
+ * @param arg Memory GC
+ * @param pos Place to store position
+ *
+ * @return EOK on success or an error code
+ */
+static errno_t mem_gc_cursor_get_pos(void *arg, gfx_coord2_t *pos)
+{
+	mem_gc_t *mgc = (mem_gc_t *) arg;
+
+	if (mgc->cb->cursor_get_pos != NULL)
+		return mgc->cb->cursor_get_pos(mgc->cb_arg, pos);
+	else
+		return ENOTSUP;
+}
+
+/** Set cursor position on memory GC.
+ *
+ * @param arg Memory GC
+ * @param pos New position
+ *
+ * @return EOK on success or an error code
+ */
+static errno_t mem_gc_cursor_set_pos(void *arg, gfx_coord2_t *pos)
+{
+	mem_gc_t *mgc = (mem_gc_t *) arg;
+
+	if (mgc->cb->cursor_set_pos != NULL)
+		return mgc->cb->cursor_set_pos(mgc->cb_arg, pos);
+	else
+		return ENOTSUP;
+}
+
+/** Set cursor visibility on memory GC.
+ *
+ * @param arg Memory GC
+ * @param visible @c true iff cursor should be made visible
+ *
+ * @return EOK on success or an error code
+ */
+static errno_t mem_gc_cursor_set_visible(void *arg, bool visible)
+{
+	mem_gc_t *mgc = (mem_gc_t *) arg;
+
+	if (mgc->cb->cursor_set_visible != NULL)
+		return mgc->cb->cursor_set_visible(mgc->cb_arg, visible);
+	else
+		return ENOTSUP;
+}
+
 /** @}
  */
