merge
diff --git a/src/cmd/devdraw/osx-screen.c b/src/cmd/devdraw/osx-screen.c
index 8939ee3..dc2fb09 100644
--- a/src/cmd/devdraw/osx-screen.c
+++ b/src/cmd/devdraw/osx-screen.c
@@ -29,7 +29,9 @@
 
 struct {
 	char *label;
+	int newlabel;
 	char *winsize;
+	QLock labellock;
 
 	Rectangle fullscreenr;
 	Rectangle screenr;
@@ -88,7 +90,7 @@
 {
 	if(label == nil)
 		label = "gnot a label";
-	osx.label = label;
+	osx.label = strdup(label);
 	osx.winsize = winsize;
 	if(osx.screenimage == nil){
 		screeninit();
@@ -244,6 +246,14 @@
 {
 	OSStatus result;
 
+	if(osx.newlabel) {
+		// dummy message so we update the label
+		qlock(&osx.labellock);
+		setlabel(osx.label);
+		osx.newlabel = 0;
+		qunlock(&osx.labellock);
+	}
+
 	result = CallNextEventHandler(next, event);
 
 	switch(GetEventClass(event)){
@@ -828,6 +838,36 @@
 	CFRelease(cs);
 }
 
+void
+kicklabel(char *label)
+{
+	char *p;
+
+	p = strdup(label);
+	if(p == nil)
+		return;
+	qlock(&osx.labellock);
+	free(osx.label);
+	osx.newlabel = 1;
+	osx.label = p;
+	qunlock(&osx.labellock);
+	
+	// TODO(rsc): It would be great to send an OS X event to the
+	// event handling loop to force the update of the label,
+	// but I cannot manage to do this.
+	//	int i;
+	//	EventRef ev;
+	/*
+	ev = 0;
+	i = CreateEvent(nil, kEventClassApplication, 0, 0, 0, &ev);
+	if(i != 0)
+		fprint(2, "CreateEvent: %d\n", i);
+	i = SendEventToEventTarget(ev, GetUserFocusEventTarget());
+	if(i != 0)
+		fprint(2, "SendEventToEventTarget %p: %d\n", ev, i);
+	*/
+}
+
 static void
 seticon(void)
 {
diff --git a/src/cmd/devdraw/osx-screen.h b/src/cmd/devdraw/osx-screen.h
index 5220468..f50d8df 100644
--- a/src/cmd/devdraw/osx-screen.h
+++ b/src/cmd/devdraw/osx-screen.h
@@ -12,6 +12,7 @@
 
 void	mousetrack(int, int, int, int);
 void	keystroke(int);
+void	kicklabel(char*);
 
 extern	Rectangle mouserect;
 extern	int	mouseresized;
diff --git a/src/cmd/devdraw/osx-srv.c b/src/cmd/devdraw/osx-srv.c
index 10baf0f..ae14ba1 100644
--- a/src/cmd/devdraw/osx-srv.c
+++ b/src/cmd/devdraw/osx-srv.c
@@ -238,7 +238,7 @@
 		break;
 
 	case Tlabel:
-		setlabel(m->label);
+		kicklabel(m->label);
 		replymsg(m);
 		break;