aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/nsf/termbox-go/termbox_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'Godeps/_workspace/src/github.com/nsf/termbox-go/termbox_windows.go')
-rw-r--r--Godeps/_workspace/src/github.com/nsf/termbox-go/termbox_windows.go65
1 files changed, 54 insertions, 11 deletions
diff --git a/Godeps/_workspace/src/github.com/nsf/termbox-go/termbox_windows.go b/Godeps/_workspace/src/github.com/nsf/termbox-go/termbox_windows.go
index f345d0eb0..f7dad7b8a 100644
--- a/Godeps/_workspace/src/github.com/nsf/termbox-go/termbox_windows.go
+++ b/Godeps/_workspace/src/github.com/nsf/termbox-go/termbox_windows.go
@@ -522,8 +522,16 @@ func prepare_diff_messages() {
}
}
+func get_ct(table []word, idx int) word {
+ idx = idx & 0x0F
+ if idx >= len(table) {
+ idx = len(table) - 1
+ }
+ return table[idx]
+}
+
func cell_to_char_info(c Cell) (attr word, wc [2]wchar) {
- attr = color_table_fg[c.Fg&0x0F] | color_table_bg[c.Bg&0x0F]
+ attr = get_ct(color_table_fg, int(c.Fg)) | get_ct(color_table_bg, int(c.Bg))
if c.Fg&AttrReverse|c.Bg&AttrReverse != 0 {
attr = (attr&0xF0)>>4 | (attr&0x0F)<<4
}
@@ -744,7 +752,9 @@ func input_event_producer() {
var r input_record
var err error
var last_button Key
+ var last_button_pressed Key
var last_state = dword(0)
+ var last_x, last_y = -1, -1
handles := []syscall.Handle{in, interrupt}
for {
err = wait_for_multiple_objects(handles)
@@ -782,31 +792,64 @@ func input_event_producer() {
}
case mouse_event:
mr := *(*mouse_event_record)(unsafe.Pointer(&r.event))
-
- // single or double click
+ ev := Event{Type: EventMouse}
switch mr.event_flags {
- case 0:
+ case 0, 2:
+ // single or double click
cur_state := mr.button_state
switch {
case last_state&mouse_lmb == 0 && cur_state&mouse_lmb != 0:
last_button = MouseLeft
+ last_button_pressed = last_button
case last_state&mouse_rmb == 0 && cur_state&mouse_rmb != 0:
last_button = MouseRight
+ last_button_pressed = last_button
case last_state&mouse_mmb == 0 && cur_state&mouse_mmb != 0:
last_button = MouseMiddle
+ last_button_pressed = last_button
+ case last_state&mouse_lmb != 0 && cur_state&mouse_lmb == 0:
+ last_button = MouseRelease
+ case last_state&mouse_rmb != 0 && cur_state&mouse_rmb == 0:
+ last_button = MouseRelease
+ case last_state&mouse_mmb != 0 && cur_state&mouse_mmb == 0:
+ last_button = MouseRelease
default:
last_state = cur_state
continue
}
last_state = cur_state
- fallthrough
- case 2:
- input_comm <- Event{
- Type: EventMouse,
- Key: last_button,
- MouseX: int(mr.mouse_pos.x),
- MouseY: int(mr.mouse_pos.y),
+ ev.Key = last_button
+ last_x, last_y = int(mr.mouse_pos.x), int(mr.mouse_pos.y)
+ ev.MouseX = last_x
+ ev.MouseY = last_y
+ case 1:
+ // mouse motion
+ x, y := int(mr.mouse_pos.x), int(mr.mouse_pos.y)
+ if last_state != 0 && (last_x != x || last_y != y) {
+ ev.Key = last_button_pressed
+ ev.Mod = ModMotion
+ ev.MouseX = x
+ ev.MouseY = y
+ last_x, last_y = x, y
+ } else {
+ ev.Type = EventNone
+ }
+ case 4:
+ // mouse wheel
+ n := int16(mr.button_state >> 16)
+ if n > 0 {
+ ev.Key = MouseWheelUp
+ } else {
+ ev.Key = MouseWheelDown
}
+ last_x, last_y = int(mr.mouse_pos.x), int(mr.mouse_pos.y)
+ ev.MouseX = last_x
+ ev.MouseY = last_y
+ default:
+ ev.Type = EventNone
+ }
+ if ev.Type != EventNone {
+ input_comm <- ev
}
}
}