Index: uspace/lib/gui/canvas.c
===================================================================
--- uspace/lib/gui/canvas.c	(revision fa24efa71b4a16342f94d5f63ee75d9242a727c6)
+++ uspace/lib/gui/canvas.c	(revision d65be39ddf1f6260963a5f1157e7baedaad1f17c)
@@ -105,5 +105,7 @@
 static void canvas_handle_keyboard_event(widget_t *widget, kbd_event_t event)
 {
-	/* No-op */
+	canvas_t *canvas = (canvas_t *) widget;
+	
+	sig_send(&canvas->keyboard_event, &event);
 }
 
@@ -142,4 +144,13 @@
 }
 
+bool update_canvas(canvas_t *canvas, surface_t *surface)
+{
+	if (surface != NULL)
+		canvas->surface = surface;
+	
+	canvas_repaint(&canvas->widget);
+	return true;
+}
+
 canvas_t *create_canvas(widget_t *parent, sysarg_t width, sysarg_t height,
     surface_t *surface)
Index: uspace/lib/gui/canvas.h
===================================================================
--- uspace/lib/gui/canvas.h	(revision fa24efa71b4a16342f94d5f63ee75d9242a727c6)
+++ uspace/lib/gui/canvas.h	(revision d65be39ddf1f6260963a5f1157e7baedaad1f17c)
@@ -42,4 +42,5 @@
 #include <surface.h>
 #include "widget.h"
+#include "connection.h"
 
 typedef struct {
@@ -48,4 +49,5 @@
 	sysarg_t height;
 	surface_t *surface;
+	signal_t keyboard_event;
 } canvas_t;
 
@@ -53,4 +55,5 @@
     surface_t *);
 extern canvas_t *create_canvas(widget_t *, sysarg_t, sysarg_t, surface_t *);
+extern bool update_canvas(canvas_t *, surface_t *);
 extern void deinit_canvas(canvas_t *);
 
