shiny/driver: (X11) handle mouse.ButtonWheel{Left|Right}; send DirStep.

Also handle mouse.ButtonWheel{Up|Down} for the gldriver X11 flavor.

Change-Id: Ib2fd8ae4ae3ea93a37b0ae1ea40594ce1c3c9b46
Reviewed-on: https://go-review.googlesource.com/24635
Reviewed-by: David Crawshaw <crawshaw@golang.org>
diff --git a/shiny/driver/gldriver/x11.go b/shiny/driver/gldriver/x11.go
index e9b7427..1cc913e 100644
--- a/shiny/driver/gldriver/x11.go
+++ b/shiny/driver/gldriver/x11.go
@@ -216,10 +216,27 @@
 
 	// TODO: should a mouse.Event have a separate MouseModifiers field, for
 	// which buttons are pressed during a mouse move?
+	btn := mouse.Button(button)
+	switch btn {
+	case 4:
+		btn = mouse.ButtonWheelUp
+	case 5:
+		btn = mouse.ButtonWheelDown
+	case 6:
+		btn = mouse.ButtonWheelLeft
+	case 7:
+		btn = mouse.ButtonWheelRight
+	}
+	if btn.IsWheel() {
+		if dir != uint8(mouse.DirPress) {
+			return
+		}
+		dir = uint8(mouse.DirStep)
+	}
 	w.Send(mouse.Event{
 		X:         float32(x),
 		Y:         float32(y),
-		Button:    mouse.Button(button),
+		Button:    btn,
 		Modifiers: x11key.KeyModifiers(state),
 		Direction: mouse.Direction(dir),
 	})
diff --git a/shiny/driver/x11driver/window.go b/shiny/driver/x11driver/window.go
index e056b67..3f5ca90 100644
--- a/shiny/driver/x11driver/window.go
+++ b/shiny/driver/x11driver/window.go
@@ -129,11 +129,21 @@
 	// TODO: should a mouse.Event have a separate MouseModifiers field, for
 	// which buttons are pressed during a mouse move?
 	btn := mouse.Button(b)
-	switch b {
+	switch btn {
 	case 4:
 		btn = mouse.ButtonWheelUp
 	case 5:
 		btn = mouse.ButtonWheelDown
+	case 6:
+		btn = mouse.ButtonWheelLeft
+	case 7:
+		btn = mouse.ButtonWheelRight
+	}
+	if btn.IsWheel() {
+		if dir != mouse.DirPress {
+			return
+		}
+		dir = mouse.DirStep
 	}
 	w.Send(mouse.Event{
 		X:         float32(x),