emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Mouse information in xterm.


From: Ergus
Subject: Re: Mouse information in xterm.
Date: Mon, 14 Sep 2020 20:13:11 +0200

On Mon, Sep 14, 2020 at 08:34:43PM +0300, Eli Zaretskii wrote:
Date: Mon, 14 Sep 2020 18:27:10 +0200
From: Ergus <spacibba@aol.com>
Cc: emacs-devel@gnu.org

The menu part is just how I observed the issue. The problem is somewhere
else; handle_one_term_event is never called (at least for me) either
when moving the cursor, or the mouse or clicking here and there. So the
variables last_mouse_x and last_mouse_y are not updated.

So far I observe that handle_one_term_event is called in a single place
in the code, but the condition to enter the "if" around is never true at
least for me.

I tried to create the x-dialog from the scratch buffer. The code works
as expected in gui, but in xterm I see this problem.

I just tried this in xterm:

(x-popup-dialog t '("Dialog" "Value1" "Value"))

And the dialog appears either in (0,0) or in the center of the screen,
but not related with the mouse or cursor positions.

There is another function that updated last_mouse_x and last_mouse_y,
but all it's code is commented.

I'm sorry, I still don't understand what are the issues that bother
you.  Are you trying to pop up a menu from the minibuffer, as in the
above x-popup-dialog call?  And all the rest of your questions are
just your attempt to understand why x-popup-dialog doesn't work as you
expected?  Or are you after something else?

IOW, let me be blunt and ask why do you care what are last_mouse_x and
last_mouse_y, and which code sets them?


Hi Eli:

When we call x-popup-dialog with t as the first parameter. The function
x_popup_menu_1 tries to get the cursor/mouse position calling
term_mouse_position. (As the documentation says)

The issue is that term_mouse_position always report (0,0) as the current
position independently of the cursor and mouse actual positions because
it just copies the values in last_mouse_x and last_mouse_y which are
zero because nobody updated them, see.

```
static void
term_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
                     enum scroll_bar_part *part, Lisp_Object *x,
                     Lisp_Object *y, Time *timeptr)
{
  *fp = SELECTED_FRAME ();
  (*fp)->mouse_moved = 0;

  *bar_window = Qnil;
  *part = scroll_bar_above_handle;

  XSETINT (*x, last_mouse_x);
  XSETINT (*y, last_mouse_y);
  *timeptr = current_Time ();
}
```

I tried the code I sent you before in a normal buffer with C-x C-e and
it works as expected in gui. The problem is terminal specific because of
what I explain.

The only function that modifies those variable is:

```
static bool
term_mouse_movement (struct frame *frame, Gpm_Event *event)
{
  /* Has the mouse moved off the glyph it was on at the last sighting?  */
  if (event->x != last_mouse_x || event->y != last_mouse_y)
    {
      frame->mouse_moved = 1;
      note_mouse_highlight (frame, event->x, event->y);
      /* Remember which glyph we're now on.  */
      last_mouse_x = event->x;
      last_mouse_y = event->y;
      return 1;
    }
  return 0;
}
```

which is called in this stack:

term_mouse_movement
handle_one_term_event
tty_read_avail_input

tty_read_avail_input has a condition

if (gpm_tty == tty)

that in my case always prevent to call handle_one_term_event. I tried
typing, moving the mouse, clicking, with all the buttons and the break
point never crosses the it.

So I am not sure when is supposed to be called handle_one_term_event to
update the position values.

The other function touching those variables should be term_mouse_moveto
in term.c but all it's internal code is commented.

It is called in set-mouse-position.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]