=== modified file 'src/cmds.c' --- src/cmds.c 2014-03-04 03:14:11 +0000 +++ src/cmds.c 2014-05-28 03:08:40 +0000 @@ -315,7 +315,7 @@ int val = internal_self_insert (character, XFASTINT (n)); if (val == 2) nonundocount = 0; - frame_make_pointer_invisible (); + frame_make_pointer_invisible (SELECTED_FRAME ()); } return Qnil; === modified file 'src/frame.c' --- src/frame.c 2014-04-03 20:46:04 +0000 +++ src/frame.c 2014-05-28 03:49:01 +0000 @@ -4373,16 +4373,11 @@ #endif /* HAVE_WINDOW_SYSTEM */ void -frame_make_pointer_invisible (void) +frame_make_pointer_invisible (struct frame *f) { if (! NILP (Vmake_pointer_invisible)) { - struct frame *f; - if (!FRAMEP (selected_frame) || !FRAME_LIVE_P (XFRAME (selected_frame))) - return; - - f = SELECTED_FRAME (); - if (f && !f->pointer_invisible + if (f && FRAME_LIVE_P (f) && !f->pointer_invisible && FRAME_TERMINAL (f)->toggle_invisible_pointer_hook) { f->mouse_moved = 0; @@ -4393,17 +4388,11 @@ } void -frame_make_pointer_visible (void) +frame_make_pointer_visible (struct frame *f) { /* We don't check Vmake_pointer_invisible here in case the pointer was invisible when Vmake_pointer_invisible was set to nil. */ - struct frame *f; - - if (!FRAMEP (selected_frame) || !FRAME_LIVE_P (XFRAME (selected_frame))) - return; - - f = SELECTED_FRAME (); - if (f && f->pointer_invisible && f->mouse_moved + if (f && FRAME_LIVE_P (f) && f->pointer_invisible && f->mouse_moved && FRAME_TERMINAL (f)->toggle_invisible_pointer_hook) { FRAME_TERMINAL (f)->toggle_invisible_pointer_hook (f, 0); === modified file 'src/frame.h' --- src/frame.h 2014-04-04 16:59:50 +0000 +++ src/frame.h 2014-05-28 03:08:21 +0000 @@ -995,8 +995,8 @@ #endif /* HAVE_WINDOW_SYSTEM */ extern bool window_system_available (struct frame *); extern void check_window_system (struct frame *); -extern void frame_make_pointer_invisible (void); -extern void frame_make_pointer_visible (void); +extern void frame_make_pointer_invisible (struct frame *); +extern void frame_make_pointer_visible (struct frame *); extern Lisp_Object delete_frame (Lisp_Object, Lisp_Object); extern Lisp_Object Vframe_list; === modified file 'src/keyboard.c' --- src/keyboard.c 2014-05-28 00:50:44 +0000 +++ src/keyboard.c 2014-05-28 04:05:53 +0000 @@ -6877,6 +6877,20 @@ } } + /* If there was no error, make sure the cursor + is visible for all frames on this terminal. */ + if (nr >= 0) + { + Lisp_Object tail, frame; + + FOR_EACH_FRAME (tail, frame) + { + struct frame *f = XFRAME (frame); + if (FRAME_TERMINAL (f) == t) + frame_make_pointer_visible (f); + } + } + if (hold_quit.kind != NO_EVENT) kbd_buffer_store_event (&hold_quit); } @@ -6887,8 +6901,6 @@ if (err && !nread) nread = -1; - frame_make_pointer_visible (); - return nread; } === modified file 'src/xterm.c' --- src/xterm.c 2014-05-14 13:55:37 +0000 +++ src/xterm.c 2014-05-28 04:10:30 +0000 @@ -9233,6 +9233,10 @@ commands to the X server. */ if (dpyinfo->display) { + /* Always exit with visible pointer to avoid weird issue + with Xfixes (Bug#17609). */ + FRAME_DISPLAY_INFO (f)->toggle_visible_pointer (f, 0); + /* We must free faces before destroying windows because some font-driver (e.g. xft) access a window while finishing a face. */