diff -ur st-0.3.orig/st.c st-0.3/st.c
--- st-0.3.orig/st.c	2012-11-02 20:09:49.000000000 +0100
+++ st-0.3/st.c	2013-01-25 00:19:09.011493964 +0100
@@ -117,7 +117,8 @@
 	MODE_MOUSEMOTION = 64,
 	MODE_MOUSE       = 32|64,
 	MODE_REVERSE     = 128,
-	MODE_KBDLOCK     = 256
+	MODE_KBDLOCK     = 256,
+	MODE_MOUSESGR    = 512
 };
 
 enum escape_state {
@@ -617,7 +618,8 @@
 	int y = Y2ROW(e->xbutton.y);
 	int button = e->xbutton.button;
 	int state = e->xbutton.state;
-	char buf[] = { '\033', '[', 'M', 0, 32+x+1, 32+y+1 };
+	char buf[40];
+	int len = 0;
 	static int ob, ox, oy;
 
 	/* from urxvt */
@@ -626,7 +628,7 @@
 			return;
 		button = ob + 32;
 		ox = x, oy = y;
-	} else if(e->xbutton.type == ButtonRelease || button == AnyButton) {
+	} else if(!IS_SET(MODE_MOUSESGR) && (e->xbutton.type == ButtonRelease || button == AnyButton)) {
 		button = 3;
 	} else {
 		button -= Button1;
@@ -638,11 +640,17 @@
 		}
 	}
 
-	buf[3] = 32 + button + (state & ShiftMask ? 4 : 0)
+	button += (state & ShiftMask ? 4 : 0)
 		+ (state & Mod4Mask    ? 8  : 0)
 		+ (state & ControlMask ? 16 : 0);
 
-	ttywrite(buf, sizeof(buf));
+	if(IS_SET(MODE_MOUSESGR)) {
+		len = sprintf(buf, "\033[<%d;%d;%d%c", button, x+1, y+1, e->xbutton.type == ButtonRelease ? 'm' : 'M');
+	} else if(x < 223 && y < 223) {
+		len = sprintf(buf, "\033[M%c%c%c", 32+button, 32+x+1, 32+y+1);
+	}
+
+	ttywrite(buf, len);
 }
 
 void
@@ -1454,6 +1462,9 @@
 			case 1002:
 				MODBIT(term.mode, set, MODE_MOUSEMOTION);
 				break;
+			case 1006: /* Allow mouse coordinates above 223 */
+				MODBIT(term.mode, set, MODE_MOUSESGR);
+				break;
 			case 1049: /* = 1047 and 1048 */
 			case 47:
 			case 1047:
