Index: uspace/lib/clui/tinput.c
===================================================================
--- uspace/lib/clui/tinput.c	(revision 07b7c48db097d0b27a33d03332ecd39ea551a2b9)
+++ uspace/lib/clui/tinput.c	(revision 3f06dae84ce91fe16bc8e73eb9b8545daf76d452)
@@ -45,4 +45,5 @@
 #define LIN_TO_COL(ti, lpos) ((lpos) % ((ti)->con_cols))
 #define LIN_TO_ROW(ti, lpos) ((lpos) / ((ti)->con_cols))
+#define LIN_POS(ti, col, row) ((col) + (row) * (ti)->con_cols)
 
 /** Seek direction */
@@ -383,4 +384,21 @@
 }
 
+static void tinput_seek_scrpos(tinput_t *ti, int col, int line, bool shift_held)
+{
+	unsigned lpos;
+	tinput_pre_seek(ti, shift_held);
+
+	lpos = LIN_POS(ti, col, line);
+
+	if (lpos > ti->text_coord)
+		ti->pos = lpos -  ti->text_coord;
+	else
+		ti->pos = 0;
+	if (ti->pos > ti->nc)
+		ti->pos = ti->nc;
+
+	tinput_post_seek(ti, shift_held);
+}
+
 static void tinput_seek_max(tinput_t *ti, seek_dir_t dir, bool shift_held)
 {
@@ -787,4 +805,37 @@
 }
 
+/** Handle key press event. */
+static void tinput_key_press(tinput_t *ti, kbd_event_t *kev)
+{
+	if (((kev->mods & KM_CTRL) != 0) &&
+	    ((kev->mods & (KM_ALT | KM_SHIFT)) == 0))
+		tinput_key_ctrl(ti, kev);
+	
+	if (((kev->mods & KM_SHIFT) != 0) &&
+	    ((kev->mods & (KM_CTRL | KM_ALT)) == 0))
+		tinput_key_shift(ti, kev);
+	
+	if (((kev->mods & KM_CTRL) != 0) &&
+	    ((kev->mods & KM_SHIFT) != 0) &&
+	    ((kev->mods & KM_ALT) == 0))
+		tinput_key_ctrl_shift(ti, kev);
+	
+	if ((kev->mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0)
+		tinput_key_unmod(ti, kev);
+	
+	if (kev->c >= ' ') {
+		tinput_sel_delete(ti);
+		tinput_insert_char(ti, kev->c);
+	}
+}
+
+/** Position event */
+static void tinput_pos(tinput_t *ti, pos_event_t *ev)
+{
+	if (ev->type == POS_PRESS) {
+		tinput_seek_scrpos(ti, ev->hpos, ev->vpos, false);
+	}
+}
+
 /** Read in one line of input.
  *
@@ -820,28 +871,12 @@
 			return EIO;
 		
-		if (ev.type != CEV_KEY || ev.ev.key.type != KEY_PRESS)
-			continue;
-		
-		kbd_event_t *kev = &ev.ev.key;
-		
-		if (((kev->mods & KM_CTRL) != 0) &&
-		    ((kev->mods & (KM_ALT | KM_SHIFT)) == 0))
-			tinput_key_ctrl(ti, kev);
-		
-		if (((kev->mods & KM_SHIFT) != 0) &&
-		    ((kev->mods & (KM_CTRL | KM_ALT)) == 0))
-			tinput_key_shift(ti, kev);
-		
-		if (((kev->mods & KM_CTRL) != 0) &&
-		    ((kev->mods & KM_SHIFT) != 0) &&
-		    ((kev->mods & KM_ALT) == 0))
-			tinput_key_ctrl_shift(ti, kev);
-		
-		if ((kev->mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0)
-			tinput_key_unmod(ti, kev);
-		
-		if (kev->c >= ' ') {
-			tinput_sel_delete(ti);
-			tinput_insert_char(ti, kev->c);
+		switch (ev.type) {
+		case CEV_KEY:
+			if (ev.ev.key.type == KEY_PRESS)
+				tinput_key_press(ti, &ev.ev.key);
+			break;
+		case CEV_POS:
+			tinput_pos(ti, &ev.ev.pos);
+			break;
 		}
 	}
