nt

A sensible note-taking program
git clone git://git.laack.co/nt.git
Log | Files | Refs | README

mouse.go (4030B)


      1 // Copyright 2020 The TCell Authors
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use file except in compliance with the License.
      5 // You may obtain a copy of the license at
      6 //
      7 //    http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 package tcell
     16 
     17 import (
     18 	"time"
     19 )
     20 
     21 // EventMouse is a mouse event.  It is sent on either mouse up or mouse down
     22 // events.  It is also sent on mouse motion events - if the terminal supports
     23 // it.  We make every effort to ensure that mouse release events are delivered.
     24 // Hence, click drag can be identified by a motion event with the mouse down,
     25 // without any intervening button release.  On some terminals only the initiating
     26 // press and terminating release event will be delivered.
     27 //
     28 // Mouse wheel events, when reported, may appear on their own as individual
     29 // impulses; that is, there will normally not be a release event delivered
     30 // for mouse wheel movements.
     31 //
     32 // Most terminals cannot report the state of more than one button at a time --
     33 // and some cannot report motion events unless a button is pressed.
     34 //
     35 // Applications can inspect the time between events to resolve double or
     36 // triple clicks.
     37 type EventMouse struct {
     38 	t   time.Time
     39 	btn ButtonMask
     40 	mod ModMask
     41 	x   int
     42 	y   int
     43 }
     44 
     45 // When returns the time when this EventMouse was created.
     46 func (ev *EventMouse) When() time.Time {
     47 	return ev.t
     48 }
     49 
     50 // Buttons returns the list of buttons that were pressed or wheel motions.
     51 func (ev *EventMouse) Buttons() ButtonMask {
     52 	return ev.btn
     53 }
     54 
     55 // Modifiers returns a list of keyboard modifiers that were pressed
     56 // with the mouse button(s).
     57 func (ev *EventMouse) Modifiers() ModMask {
     58 	return ev.mod
     59 }
     60 
     61 // Position returns the mouse position in character cells.  The origin
     62 // 0, 0 is at the upper left corner.
     63 func (ev *EventMouse) Position() (int, int) {
     64 	return ev.x, ev.y
     65 }
     66 
     67 // NewEventMouse is used to create a new mouse event.  Applications
     68 // shouldn't need to use this; its mostly for screen implementors.
     69 func NewEventMouse(x, y int, btn ButtonMask, mod ModMask) *EventMouse {
     70 	return &EventMouse{t: time.Now(), x: x, y: y, btn: btn, mod: mod}
     71 }
     72 
     73 // ButtonMask is a mask of mouse buttons and wheel events.  Mouse button presses
     74 // are normally delivered as both press and release events.  Mouse wheel events
     75 // are normally just single impulse events.  Windows supports up to eight
     76 // separate buttons plus all four wheel directions, but XTerm can only support
     77 // mouse buttons 1-3 and wheel up/down.  Its not unheard of for terminals
     78 // to support only one or two buttons (think Macs).  Old terminals, and true
     79 // emulations (such as vt100) won't support mice at all, of course.
     80 type ButtonMask int16
     81 
     82 // These are the actual button values.  Note that tcell version 1.x reversed buttons
     83 // two and three on *nix based terminals.  We use button 1 as the primary, and
     84 // button 2 as the secondary, and button 3 (which is often missing) as the middle.
     85 const (
     86 	Button1 ButtonMask = 1 << iota // Usually the left (primary) mouse button.
     87 	Button2                        // Usually the right (secondary) mouse button.
     88 	Button3                        // Usually the middle mouse button.
     89 	Button4                        // Often a side button (thumb/next).
     90 	Button5                        // Often a side button (thumb/prev).
     91 	Button6
     92 	Button7
     93 	Button8
     94 	WheelUp                   // Wheel motion up/away from user.
     95 	WheelDown                 // Wheel motion down/towards user.
     96 	WheelLeft                 // Wheel motion to left.
     97 	WheelRight                // Wheel motion to right.
     98 	ButtonNone ButtonMask = 0 // No button or wheel events.
     99 
    100 	ButtonPrimary   = Button1
    101 	ButtonSecondary = Button2
    102 	ButtonMiddle    = Button3
    103 )