diff options
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.go | 65 |
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 } } } |