...

Source file src/github.com/gdamore/tcell/v2/mouse.go

Documentation: github.com/gdamore/tcell/v2

     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  )
   104  

View as plain text