* xterm.h (struct x_display_info): Add invisible_cursor.

(struct x_output): Add current_cursor.

* xterm.c (XTtoggle_invisible_pointer): New function.
(x_define_frame_cursor): Don't define cursor if invisible or the
same as before.  Set current_cursor.
(x_create_terminal): Set toggle_invisible_pointer_hook.

* xfns.c (make_invisible_cursor): New function.
(x_set_mouse_color): Call make_invisible_cursor.
Set current_cursor.
(x_window): Set current_cursor.

* termhooks.h (struct terminal): Add toggle_invisible_pointer_hook.

* keyboard.c (command_loop_1): Call frame_make_pointer_invisible after
inserting a character.
(read_avail_input): Call frame_make_pointer_visible.

* frame.c (Vmake_pointer_invisible): New variable.
(frame_make_pointer_invisible, frame_make_pointer_visible): New
functions.
(syms_of_frame): DEFVAR make-pointer-invisible, initialize to Qt.

* frame.h: Declare frame_make_pointer_invisible and
frame_make_pointer_visible.
(struct frame): Add pointer_invisible.

* cus-start.el (all): Added make-pointer-invisible.
This commit is contained in:
Jan Djärv 2009-07-03 11:07:02 +00:00
parent 2e9b968b28
commit e044e4fcd5
11 changed files with 153 additions and 6 deletions

View file

@ -38,6 +38,9 @@ frame parameter fullscreen makes the Emacs frame maximized.
+++
** New frame parameter sticky makes Emacs frames sticky in virtual desktops.
** The pointer now becomes invisible when typing.
Customize make-pointer-invisible to turn it off.
* Changes in Specialized Modes and Packages in Emacs 23.2

View file

@ -1,3 +1,7 @@
2009-07-03 Jan Djärv <jan.h.d@swipnet.se>
* cus-start.el (all): Added make-pointer-invisible.
2009-07-03 Jay Belanger <jay.p.belanger@gmail.com>
* calc-math.el (math-use-emacs-fn): Make sure that the number is

View file

@ -179,6 +179,7 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of
(const :tag "always shown" t)
(other :tag "hidden by keypress" 1))
"22.1")
(make-pointer-invisible mouse boolean "23.2")
;; fringe.c
(overflow-newline-into-fringe fringe boolean)
;; indent.c

View file

@ -1,3 +1,33 @@
2009-07-03 Jan Djärv <jan.h.d@swipnet.se>
* xterm.h (struct x_display_info): Add invisible_cursor.
(struct x_output): Add current_cursor.
* xterm.c (XTtoggle_invisible_pointer): New function.
(x_define_frame_cursor): Don't define cursor if invisible or the
same as before. Set current_cursor.
(x_create_terminal): Set toggle_invisible_pointer_hook.
* xfns.c (make_invisible_cursor): New function.
(x_set_mouse_color): Call make_invisible_cursor.
Set current_cursor.
(x_window): Set current_cursor.
* termhooks.h (struct terminal): Add toggle_invisible_pointer_hook.
* keyboard.c (command_loop_1): Call frame_make_pointer_invisible after
inserting a character.
(read_avail_input): Call frame_make_pointer_visible.
* frame.c (Vmake_pointer_invisible): New variable.
(frame_make_pointer_invisible, frame_make_pointer_visible): New
functions.
(syms_of_frame): DEFVAR make-pointer-invisible, initialize to Qt.
* frame.h: Declare frame_make_pointer_invisible and
frame_make_pointer_visible.
(struct frame): Add pointer_invisible.
2009-07-02 Jan Djärv <jan.h.d@swipnet.se>
* gtkutil.c (xg_frame_set_char_size): Do set width/height if the

View file

@ -52,6 +52,9 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#endif
/* If we shall make pointer invisible when typing or not. */
Lisp_Object Vmake_pointer_invisible;
#ifdef HAVE_WINDOW_SYSTEM
/* The name we're using in resource queries. Most often "emacs". */
@ -4350,6 +4353,37 @@ x_figure_window_size (f, parms, toolbar_p)
#endif /* HAVE_WINDOW_SYSTEM */
void
frame_make_pointer_invisible ()
{
if (! NILP (Vmake_pointer_invisible))
{
struct frame *f = SELECTED_FRAME ();
if (f && !f->pointer_invisible
&& FRAME_TERMINAL (f)->toggle_invisible_pointer_hook)
{
f->mouse_moved = 0;
FRAME_TERMINAL (f)->toggle_invisible_pointer_hook (f, 1);
f->pointer_invisible = 1;
}
}
}
void
frame_make_pointer_visible ()
{
/* 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 = SELECTED_FRAME ();
if (f && f->pointer_invisible && f->mouse_moved
&& FRAME_TERMINAL (f)->toggle_invisible_pointer_hook)
{
FRAME_TERMINAL (f)->toggle_invisible_pointer_hook (f, 0);
f->pointer_invisible = 0;
}
}
/***********************************************************************
@ -4552,6 +4586,11 @@ is over the clickable text. However, the mouse shape still indicates
when the mouse is over clickable text. */);
Vmouse_highlight = Qt;
DEFVAR_LISP ("make-pointer-invisible", &Vmake_pointer_invisible,
doc: /* If non-nil, make pointer invisible while typing.
The pointer becomes visible again when the mouse is moved. */);
Vmake_pointer_invisible = Qt;
DEFVAR_LISP ("delete-frame-functions", &Vdelete_frame_functions,
doc: /* Functions to be run before deleting a frame.
The functions are run with one arg, the frame to be deleted.

View file

@ -440,6 +440,9 @@ struct frame
since the last time we checked. */
unsigned char mouse_moved :1;
/* Nonzero means that the pointer is invisible. */
unsigned char pointer_invisible :1;
/* If can_have_scroll_bars is non-zero, this is non-zero if we should
actually display them on this frame. */
enum vertical_scroll_bar_type vertical_scroll_bar_type;
@ -830,6 +833,8 @@ extern struct frame *make_frame_without_minibuffer P_ ((Lisp_Object,
Lisp_Object));
#endif /* HAVE_WINDOW_SYSTEM */
extern int other_visible_frames P_ ((struct frame *));
extern void frame_make_pointer_invisible P_ ((void));
extern void frame_make_pointer_visible P_ ((void));
extern Lisp_Object Vframe_list;
extern Lisp_Object Vdefault_frame_alist;
@ -1110,7 +1115,7 @@ extern Lisp_Object Vframe_alpha_lower_limit;
extern void x_set_alpha P_ ((struct frame *, Lisp_Object, Lisp_Object));
extern void validate_x_resource_name P_ ((void));
extern Lisp_Object display_x_get_resource (Display_Info *,
Lisp_Object attribute,
Lisp_Object class,

View file

@ -1867,6 +1867,8 @@ command_loop_1 ()
if (value == 2)
nonundocount = 0;
frame_make_pointer_invisible ();
if (! NILP (Vpost_command_hook))
/* Put this before calling adjust_point_for_property
so it will only get called once in any case. */
@ -7134,6 +7136,8 @@ read_avail_input (expected)
if (err && !nread)
nread = -1;
frame_make_pointer_visible ();
return nread;
}

View file

@ -427,6 +427,7 @@ struct terminal
void (*delete_glyphs_hook) P_ ((struct frame *, int));
void (*ring_bell_hook) P_ ((struct frame *f));
void (*toggle_invisible_pointer_hook) P_ ((struct frame *f, int invisible));
void (*reset_terminal_modes_hook) P_ ((struct terminal *));
void (*set_terminal_modes_hook) P_ ((struct terminal *));

View file

@ -941,6 +941,35 @@ x_set_background_color (f, arg, oldval)
}
}
static Cursor
make_invisible_cursor (f)
struct frame *f;
{
Display *dpy = FRAME_X_DISPLAY (f);
static char const no_data[] = { 0 };
Pixmap pix;
XColor col;
Cursor c;
x_catch_errors (dpy);
pix = XCreateBitmapFromData (dpy, FRAME_X_DISPLAY_INFO (f)->root_window,
no_data, 1, 1);
if (! x_had_errors_p (dpy) && pix != None)
{
col.pixel = 0;
col.red = col.green = col.blue = 0;
col.flags = DoRed | DoGreen | DoBlue;
c = XCreatePixmapCursor (dpy, pix, pix, &col, &col, 0, 0);
if (x_had_errors_p (dpy) || c == None)
c = 0;
XFreePixmap (dpy, pix);
}
x_uncatch_errors ();
return c;
}
void
x_set_mouse_color (f, arg, oldval)
struct frame *f;
@ -1046,8 +1075,12 @@ x_set_mouse_color (f, arg, oldval)
}
if (FRAME_X_WINDOW (f) != 0)
XDefineCursor (dpy, FRAME_X_WINDOW (f), cursor);
XDefineCursor (dpy, FRAME_X_WINDOW (f),
f->output_data.x->current_cursor = cursor);
if (FRAME_X_DISPLAY_INFO (f)->invisible_cursor == 0)
FRAME_X_DISPLAY_INFO (f)->invisible_cursor = make_invisible_cursor (f);
if (cursor != x->text_cursor
&& x->text_cursor != 0)
XFreeCursor (dpy, x->text_cursor);
@ -2671,7 +2704,7 @@ x_window (f, window_prompting, minibuffer_only)
}
XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
f->output_data.x->text_cursor);
f->output.x->current_cursor = f->output_data.x->text_cursor);
UNBLOCK_INPUT;
@ -2816,7 +2849,7 @@ x_window (f)
}
XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
f->output_data.x->text_cursor);
f->output.x->current_cursor = f->output_data.x->text_cursor);
UNBLOCK_INPUT;

View file

@ -3128,6 +3128,25 @@ XTflash (f)
#endif /* defined (HAVE_TIMEVAL) && defined (HAVE_SELECT) */
static void
XTtoggle_invisible_pointer (f, invisible)
FRAME_PTR f;
int invisible;
{
BLOCK_INPUT;
if (invisible)
{
if (FRAME_X_DISPLAY_INFO (f)->invisible_cursor != 0)
XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
FRAME_X_DISPLAY_INFO (f)->invisible_cursor);
}
else
XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
f->output_data.x->current_cursor);
UNBLOCK_INPUT;
}
/* Make audible bell. */
void
@ -4568,7 +4587,7 @@ x_create_toolkit_scroll_bar (f, bar)
/* Set the cursor to an arrow. I didn't find a resource to do that.
And I'm wondering why it hasn't an arrow cursor by default. */
XDefineCursor (XtDisplay (widget), XtWindow (widget),
f->output_data.x->nontext_cursor);
f->output_data.x->nontext_cursor);
#else /* !USE_MOTIF i.e. use Xaw */
@ -7344,7 +7363,10 @@ x_define_frame_cursor (f, cursor)
struct frame *f;
Cursor cursor;
{
XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), cursor);
if (!f->pointer_invisible
&& f->output_data.x->current_cursor != cursor)
XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), cursor);
f->output_data.x->current_cursor = cursor;
}
@ -10657,6 +10679,7 @@ x_create_terminal (struct x_display_info *dpyinfo)
terminal->ins_del_lines_hook = x_ins_del_lines;
terminal->delete_glyphs_hook = x_delete_glyphs;
terminal->ring_bell_hook = XTring_bell;
terminal->toggle_invisible_pointer_hook = XTtoggle_invisible_pointer;
terminal->reset_terminal_modes_hook = XTreset_terminal_modes;
terminal->set_terminal_modes_hook = XTset_terminal_modes;
terminal->update_begin_hook = x_update_begin;

View file

@ -166,6 +166,9 @@ struct x_display_info
/* The cursor to use for vertical scroll bars. */
Cursor vertical_scroll_bar_cursor;
/* The invisible cursor used for pointer blanking. */
Cursor invisible_cursor;
#ifdef USE_GTK
/* The GDK cursor for scroll bars and popup menus. */
GdkCursor *xg_cursor;
@ -522,6 +525,7 @@ struct x_output
Cursor hand_cursor;
Cursor hourglass_cursor;
Cursor horizontal_drag_cursor;
Cursor current_cursor;
/* Window whose cursor is hourglass_cursor. This window is temporarily
mapped to display an hourglass cursor. */