summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--etc/NEWS3
-rw-r--r--lisp/ChangeLog4
-rw-r--r--lisp/cus-start.el1
-rw-r--r--src/ChangeLog30
-rw-r--r--src/frame.c39
-rw-r--r--src/frame.h7
-rw-r--r--src/keyboard.c4
-rw-r--r--src/termhooks.h1
-rw-r--r--src/xfns.c39
-rw-r--r--src/xterm.c27
-rw-r--r--src/xterm.h4
11 files changed, 153 insertions, 6 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 041d773c5fb..16beaa406d0 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -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
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 126d0df81b4..72a512967b1 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -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
diff --git a/lisp/cus-start.el b/lisp/cus-start.el
index 09a0a93b103..11b03887ac0 100644
--- a/lisp/cus-start.el
+++ b/lisp/cus-start.el
@@ -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
diff --git a/src/ChangeLog b/src/ChangeLog
index 52764078844..5f852a75496 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -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
diff --git a/src/frame.c b/src/frame.c
index 506a4225a93..fa50d8752df 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -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.
diff --git a/src/frame.h b/src/frame.h
index 205141ec830..9fc326b6f1a 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -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,
diff --git a/src/keyboard.c b/src/keyboard.c
index 55862e1da33..b8714a393ec 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -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;
}
diff --git a/src/termhooks.h b/src/termhooks.h
index 33d89674273..bd9b4ec4575 100644
--- a/src/termhooks.h
+++ b/src/termhooks.h
@@ -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 *));
diff --git a/src/xfns.c b/src/xfns.c
index 9036ff171fa..237b1c911ee 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -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;
diff --git a/src/xterm.c b/src/xterm.c
index 77dc48f9a64..c034faaec2e 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -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;
diff --git a/src/xterm.h b/src/xterm.h
index 3c738861af4..0ab19fdd8dc 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -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. */