Subject: bug#76805: 31.0.50; [PATH] Fix Emacs uses 100% CPU after switching graphic frame to inactive

From: Po Lu <[email-masked]>
Date: Sun, 09 Mar 2025 21:58:38 +0800

Eli Zaretskii <[email-masked]> writes:

>> From: Lin Sun <[email-masked]>
>> Date: Fri, 7 Mar 2025 08:17:31 +0000
>> 
>> Emacs sometimes takes 100% CPU after I switch emacs graphic frame to inactive.
>> This patch will fix the issue.
>> 
>> Reproduce steps:
>> 1. Build Emacs with gtk3 and xinput2 on Ubuntu 22.04.
>> 2. (setq x-use-fast-mouse-position 'really-fast) in early-init.el.
>> 3. On a windows-host start a X11 server, and ssh -XY
>> ubuntu-host:emacs to Start emacs with X11 forwared-frame, and open
>> emacs "src/eval.c", enable the show-paren-mode in emacs.
>> 4. On the windows host, move the mouse out of emacs-graphic frame
>> first, the move the mouse in emacs-graphic frame and click.
>> 5. On the windows host, switch the emacs-graphic frame to inactive (switch a native windows app to active).
>> Repeat steps 4,5 sometimes the emacs will takes 100% CPU.
>> 
>> The issue won't happen if set the x-use-fast-mouse-position to `t` or `nil` instead of the 'really-fast.
>> 
>> According to my debugging and tracking the variables, I found that
>> 1. the xterm.c:21710 will let "dpyinfo->last_mouse_motion_frame = NULL;", then 
>> 2. later calls `x_fast_mouse_position` will no chance to let "XX->mouse_moved = false", then 
>> 3. the function some_mouse_moved() in keyboard.c always return true; then
>> 4. the function timer_start_idle() in keyboard.c will be called again and again, which leads 100% CPU usage.
>> 
>> As contrast when setting the x-use-fast-mouse-position to `t`, the
>> "XX->mouse_moved = false;" always run, then the issue won't happen.
>> 
>> Please help review the patch. Thanks
>
> Thanks.
>
> Po Lu, any comments?

I'll investigate this issue tomorrow.  Thank you for reporting it.