Check if WM support for NET_WM_USER_TIME_WINDOW changed during updates

* src/xterm.c (x_display_set_last_user_time): Update the user
time window if window manager support changed.

* src/xterm.h (struct x_display_info): New field
`last_user_check_time'.
This commit is contained in:
Po Lu 2022-02-24 20:01:39 +08:00
parent dfe78ccb87
commit 94e59f80b7
2 changed files with 55 additions and 2 deletions

View file

@ -2588,6 +2588,7 @@ 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
@ -2596,6 +2597,56 @@ 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))

View file

@ -459,8 +459,10 @@ struct x_display_info
/* The scroll bar in which the last X motion event occurred. */
struct scroll_bar *last_mouse_scroll_bar;
/* Time of last user interaction as returned in X events on this display. */
Time last_user_time;
/* 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;
/* Position where the mouse was last time we reported a motion.
This is a position on last_mouse_motion_frame. */