tui-cs/Terminal.Gui · error · ArgumentException

MouseHoldRepeat only accepts null, Pressed, Released or Clic

Error message

MouseHoldRepeat only accepts null, Pressed, Released or Clicked mouse flags.

What it means

The MouseHoldRepeat property enables auto-repeat behavior for a mouse button held down. It only accepts null (disabled), or a single MouseFlags value from the Pressed, Released, or Clicked families (Left/Middle/Right variants of each). Any value outside these four families (e.g. wheel, button4, or a bare modifier flag) is rejected because the repeat timer can only fire on a concrete button-press lifecycle event.

Source

Thrown at Terminal.Gui/ViewBase/Mouse/View.Mouse.cs:333

            {
                bool isPressed = (value.Value & (MouseFlags.LeftButtonPressed | MouseFlags.MiddleButtonPressed | MouseFlags.RightButtonPressed)) != 0;
                bool isReleased = (value.Value & (MouseFlags.LeftButtonReleased | MouseFlags.MiddleButtonReleased | MouseFlags.RightButtonReleased)) != 0;

                bool isClicked = (value.Value
                                  & (MouseFlags.LeftButtonClicked
                                     | MouseFlags.MiddleButtonClicked
                                     | MouseFlags.RightButtonClicked
                                     | MouseFlags.LeftButtonDoubleClicked
                                     | MouseFlags.MiddleButtonDoubleClicked
                                     | MouseFlags.RightButtonDoubleClicked
                                     | MouseFlags.LeftButtonTripleClicked
                                     | MouseFlags.MiddleButtonTripleClicked
                                     | MouseFlags.RightButtonTripleClicked))
                                 != 0;

                if (!isReleased && !isPressed && !isClicked)
                {
                    throw new ArgumentException (@"MouseHoldRepeat only accepts null, Pressed, Released or Clicked mouse flags.", nameof (value));
                }
            }

            CWPPropertyHelper.ChangeProperty (this,
                                              ref field,
                                              value,
                                              OnMouseHoldRepeatChanging,
                                              MouseHoldRepeatChanging,
                                              DoWork,
                                              OnMouseHoldRepeatChanged,
                                              MouseHoldRepeatChanged,
                                              out _);

            return;

            void DoWork (MouseFlags? newValue)
            {
                if (newValue.HasValue)

View on GitHub (pinned to 2e47b11478)

Solutions

  1. Use a single Clicked or Pressed flag from one button family, e.g. MouseFlags.LeftButtonClicked.
  2. Pass null to disable the repeat timer entirely.
  3. If you need wheel-based scrolling, bind a mouse handler via MouseBindings instead of MouseHoldRepeat.

Example fix

// before
view.MouseHoldRepeat = MouseFlags.WheeledUp;
// after
view.MouseHoldRepeat = MouseFlags.LeftButtonPressed;
Defensive patterns

Strategy: validation

Validate before calling

static MouseFlags? ValidHoldRepeat (MouseFlags? f) =>
    f is null || (((int)f.Value & 0b111) != 0) ? f : null;
// then: view.MouseHoldRepeat = ValidHoldRepeat(myFlags) ?? throw new ArgumentException("bad flags");

Type guard

static bool IsValidMouseHoldRepeat (MouseFlags? f) =>
    f is null || (f.Value & (MouseFlags.LeftButtonPressed | MouseFlags.MiddleButtonPressed |
        MouseFlags.RightButtonPressed | MouseFlags.LeftButtonReleased | MouseFlags.MiddleButtonReleased |
        MouseFlags.RightButtonReleased | MouseFlags.LeftButtonClicked | MouseFlags.MiddleButtonClicked |
        MouseFlags.RightButtonClicked | MouseFlags.LeftButtonDoubleClicked | MouseFlags.MiddleButtonDoubleClicked |
        MouseFlags.RightButtonDoubleClicked | MouseFlags.LeftButtonTripleClicked | MouseFlags.MiddleButtonTripleClicked |
        MouseFlags.RightButtonTripleClicked)) != 0;

Prevention

When it happens

Trigger: Setting view.MouseHoldRepeat to MouseFlags.WheeledUp, MouseFlags.WheeledDown, MouseFlags.Button1Clicked combined with a bare flag like MouseFlags.ButtonShift, or any MouseFlags value that does not include at least one of LeftButtonPressed/Released/Clicked (or the Middle/Right equivalents).

Common situations: Porting a v1 scroll handler that used wheel events for auto-repeat; passing a flags enum built by OR-ing multiple button families; forgetting the property models a single hold gesture, not an arbitrary binding.

Related errors


AI-assisted analysis of tui-cs/Terminal.Gui@2e47b11478 (2026-08-13). Data as JSON: /api/errors/009dc24275cf84cf. Report an issue: GitHub.