From 605765af40831390be93264b36b31fad56907554 Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Fri, 26 Jun 2015 08:28:08 +0200 Subject: [PATCH] Provide invisible mouse pointers on Windows. (Bug#6105) (Bug#12922) * src/w32fns.c (w32_wnd_proc): Handle f->pointer_invisible for WM_SETCURSOR and WM_EMACS_SETCURSOR cases. * src/w32term.c (w32_hide_hourglass): Handle f->pointer_invisible. (w32_toggle_invisible_pointer): New function. (w32_create_terminal): Add w32_toggle_invisible_pointer as toggle_invisible_pointer_hook for this terminal. --- src/w32fns.c | 23 +++++++++++++++++------ src/w32term.c | 25 ++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/w32fns.c b/src/w32fns.c index 5f40729011e..180d326bc98 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -3974,11 +3974,17 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) if (LOWORD (lParam) == HTCLIENT) { f = x_window_to_frame (dpyinfo, hwnd); - if (f && f->output_data.w32->hourglass_p - && !menubar_in_use && !current_popup_menu) - SetCursor (f->output_data.w32->hourglass_cursor); - else if (f) - SetCursor (f->output_data.w32->current_cursor); + if (f) + { + if (f->output_data.w32->hourglass_p + && !menubar_in_use && !current_popup_menu) + SetCursor (f->output_data.w32->hourglass_cursor); + else if (f->pointer_invisible) + SetCursor (NULL); + else + SetCursor (f->output_data.w32->current_cursor); + } + return 0; } goto dflt; @@ -3991,7 +3997,12 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { f->output_data.w32->current_cursor = cursor; if (!f->output_data.w32->hourglass_p) - SetCursor (cursor); + { + if (f->pointer_invisible) + SetCursor (NULL); + else + SetCursor (cursor); + } } return 0; } diff --git a/src/w32term.c b/src/w32term.c index b7c6e13c8a8..7c5f2db3a4c 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -6590,7 +6590,10 @@ w32_hide_hourglass (struct frame *f) struct w32_output *w32 = FRAME_X_OUTPUT (f); w32->hourglass_p = 0; - SetCursor (w32->current_cursor); + if (f->pointer_invisible) + SetCursor (NULL); + else + SetCursor (w32->current_cursor); } /* FIXME: old code did that, but I don't know why. Anyway, @@ -6602,6 +6605,25 @@ w32_arrow_cursor (void) SetCursor (w32_load_cursor (IDC_ARROW)); } +static void +w32_toggle_invisible_pointer (struct frame *f, bool invisible) +{ + block_input (); + + if (f->pointer_invisible != invisible) + { + f->pointer_invisible = invisible; + SET_FRAME_GARBAGED (f); + } + + if (invisible) + SetCursor (NULL); + else + SetCursor (f->output_data.w32->current_cursor); + + unblock_input (); +} + /*********************************************************************** Initialization ***********************************************************************/ @@ -6741,6 +6763,7 @@ w32_create_terminal (struct w32_display_info *dpyinfo) terminal->ins_del_lines_hook = x_ins_del_lines; terminal->delete_glyphs_hook = x_delete_glyphs; terminal->ring_bell_hook = w32_ring_bell; + terminal->toggle_invisible_pointer_hook = w32_toggle_invisible_pointer; terminal->update_begin_hook = x_update_begin; terminal->update_end_hook = x_update_end; terminal->read_socket_hook = w32_read_socket; -- 2.11.4.GIT