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:
parent
61a312ba0c
commit
a8cf6567dd
2 changed files with 72 additions and 59 deletions
126
src/xterm.c
126
src/xterm.c
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue