1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-02-09 01:05:39 -08:00

Improve window manager user time reporting mode switching

* src/xterm.c (x_display_set_last_user_time): Stop periodically
checking for user time window support.
(x_update_frame_user_time_window): New function.
(handle_one_xevent): Call it on toplevel ReparentNotify if the
frame has been visible at least once.

* src/xterm.h (struct x_display_info): Remove
`last_user_check_time'.
This commit is contained in:
Po Lu 2022-06-17 10:57:42 +08:00
parent 61a312ba0c
commit a8cf6567dd
2 changed files with 72 additions and 59 deletions

View file

@ -6915,7 +6915,6 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time)
{
#ifndef USE_GTK
struct frame *focus_frame = dpyinfo->x_focus_frame;
struct x_output *output;
#endif
#ifdef ENABLE_CHECKING
@ -6925,56 +6924,6 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time)
dpyinfo->last_user_time = time;
#ifndef USE_GTK
if (focus_frame
&& (dpyinfo->last_user_time
> (dpyinfo->last_user_check_time + 2000)))
{
output = FRAME_X_OUTPUT (focus_frame);
if (!x_wm_supports (focus_frame,
dpyinfo->Xatom_net_wm_user_time_window))
{
if (output->user_time_window == None)
output->user_time_window = FRAME_OUTER_WINDOW (focus_frame);
else if (output->user_time_window != FRAME_OUTER_WINDOW (focus_frame))
{
XDestroyWindow (dpyinfo->display,
output->user_time_window);
XDeleteProperty (dpyinfo->display,
FRAME_OUTER_WINDOW (focus_frame),
dpyinfo->Xatom_net_wm_user_time_window);
output->user_time_window = FRAME_OUTER_WINDOW (focus_frame);
}
}
else
{
if (output->user_time_window == FRAME_OUTER_WINDOW (focus_frame)
|| output->user_time_window == None)
{
XSetWindowAttributes attrs;
memset (&attrs, 0, sizeof attrs);
output->user_time_window
= XCreateWindow (dpyinfo->display,
FRAME_X_WINDOW (focus_frame),
-1, -1, 1, 1, 0, 0, InputOnly,
CopyFromParent, 0, &attrs);
XDeleteProperty (dpyinfo->display,
FRAME_OUTER_WINDOW (focus_frame),
dpyinfo->Xatom_net_wm_user_time);
XChangeProperty (dpyinfo->display,
FRAME_OUTER_WINDOW (focus_frame),
dpyinfo->Xatom_net_wm_user_time_window,
XA_WINDOW, 32, PropModeReplace,
(unsigned char *) &output->user_time_window,
1);
}
}
dpyinfo->last_user_check_time = time;
}
if (focus_frame)
{
while (FRAME_PARENT_FRAME (focus_frame))
@ -6990,6 +6939,57 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time)
#endif
}
/* Not needed on GTK because GTK handles reporting the user time
itself. */
#ifndef USE_GTK
static void
x_update_frame_user_time_window (struct frame *f)
{
struct x_output *output;
struct x_display_info *dpyinfo;
XSetWindowAttributes attrs;
output = FRAME_X_OUTPUT (f);
dpyinfo = FRAME_DISPLAY_INFO (f);
if (!x_wm_supports (f, dpyinfo->Xatom_net_wm_user_time_window))
{
if (output->user_time_window == None)
output->user_time_window = FRAME_OUTER_WINDOW (f);
else if (output->user_time_window != FRAME_OUTER_WINDOW (f))
{
XDestroyWindow (dpyinfo->display,
output->user_time_window);
XDeleteProperty (dpyinfo->display,
FRAME_OUTER_WINDOW (f),
dpyinfo->Xatom_net_wm_user_time_window);
output->user_time_window = FRAME_OUTER_WINDOW (f);
}
}
else
{
if (output->user_time_window == FRAME_OUTER_WINDOW (f)
|| output->user_time_window == None)
{
memset (&attrs, 0, sizeof attrs);
output->user_time_window
= XCreateWindow (dpyinfo->display, FRAME_X_WINDOW (f),
-1, -1, 1, 1, 0, 0, InputOnly,
CopyFromParent, 0, &attrs);
XDeleteProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f),
dpyinfo->Xatom_net_wm_user_time);
XChangeProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f),
dpyinfo->Xatom_net_wm_user_time_window,
XA_WINDOW, 32, PropModeReplace,
(unsigned char *) &output->user_time_window, 1);
}
}
}
#endif
void
x_set_last_user_time_from_lisp (struct x_display_info *dpyinfo,
Time time)
@ -16914,8 +16914,26 @@ handle_one_xevent (struct x_display_info *dpyinfo,
{
/* Maybe we shouldn't set this for child frames ?? */
f->output_data.x->parent_desc = event->xreparent.parent;
if (!FRAME_PARENT_FRAME (f))
x_real_positions (f, &f->left_pos, &f->top_pos);
{
x_real_positions (f, &f->left_pos, &f->top_pos);
/* Perhaps reparented due to a WM restart. Reset this. */
FRAME_DISPLAY_INFO (f)->wm_type = X_WMTYPE_UNKNOWN;
FRAME_DISPLAY_INFO (f)->net_supported_window = 0;
#ifndef USE_GTK
/* The window manager could have restarted and the new
window manager might not support user time windows,
so update what is used accordingly.
Note that this doesn't handle changes between
non-reparenting window managers. */
if (FRAME_X_OUTPUT (f)->has_been_visible)
x_update_frame_user_time_window (f);
#endif
}
else
{
Window root;
@ -16928,10 +16946,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
unblock_input ();
}
/* Perhaps reparented due to a WM restart. Reset this. */
FRAME_DISPLAY_INFO (f)->wm_type = X_WMTYPE_UNKNOWN;
FRAME_DISPLAY_INFO (f)->net_supported_window = 0;
x_set_frame_alpha (f);
}
goto OTHER;

View file

@ -495,9 +495,8 @@ struct x_display_info
struct scroll_bar *last_mouse_scroll_bar;
/* Time of last user interaction as returned in X events on this
display, and time where WM support for `_NET_WM_USER_TIME_WINDOW'
was last checked. */
Time last_user_time, last_user_check_time;
display. */
Time last_user_time;
/* Position where the mouse was last time we reported a motion.
This is a position on last_mouse_motion_frame. */