[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Proposal: Only highlight mouse-face when mouse is moved
From: |
Kim F. Storm |
Subject: |
Re: Proposal: Only highlight mouse-face when mouse is moved |
Date: |
15 Feb 2002 23:27:07 +0100 |
User-agent: |
Gnus/5.09 (Gnus v5.9.0) Emacs/21.2.50 |
"Eli Zaretskii" <address@hidden> writes:
> > Have any of you actually tried the patch I posted yesterday?
>
> I cannot try it because you only posted a patch that's specific to X,
> and I don't have an X installation here.
Here is a complete patch (except for NEWS and ChangeLog) which also
(attempts to) work for the w32 and msdos ports -- neither of which I
can test myself.
So I'd really appreciate some help testing (and evaluating) this.
Index: src/frame.c
===================================================================
RCS file: /cvs/emacs/src/frame.c,v
retrieving revision 1.279
diff -c -r1.279 frame.c
*** src/frame.c 14 Jan 2002 13:47:02 -0000 1.279
--- src/frame.c 15 Feb 2002 21:50:25 -0000
***************
*** 79,84 ****
--- 79,85 ----
Lisp_Object Vterminal_frame;
Lisp_Object Vdefault_frame_alist;
Lisp_Object Vmouse_position_function;
+ Lisp_Object Vmouse_highlight;
static void
set_menu_bar_lines_1 (window, n)
***************
*** 2534,2539 ****
--- 2535,2548 ----
This abnormal hook exists for the benefit of packages like `xt-mouse.el'
which need to do mouse handling at the Lisp level. */);
Vmouse_position_function = Qnil;
+
+ DEFVAR_LISP ("mouse-highlight", &Vmouse_highlight,
+ doc: /* If non-nil, clickable text is highlighted when mouse is
over it.
+ If the value is an integer, highlighting is only shown after moving the
+ mouse, while keyboard input turns off the highlight even when the mouse
+ is over the clickable text. However, the mouse shape still indicates
+ when the mouse is over clickable text. */);
+ Vmouse_highlight = make_number (1);
DEFVAR_KBOARD ("default-minibuffer-frame", Vdefault_minibuffer_frame,
doc: /* Minibufferless frames use this frame's minibuffer.
Index: src/frame.h
===================================================================
RCS file: /cvs/emacs/src/frame.h,v
retrieving revision 1.94
diff -c -r1.94 frame.h
*** src/frame.h 1 Dec 2001 01:14:09 -0000 1.94
--- src/frame.h 15 Feb 2002 21:50:25 -0000
***************
*** 661,666 ****
--- 661,668 ----
extern Lisp_Object Vdefault_frame_alist;
extern Lisp_Object Vterminal_frame;
+
+ extern Lisp_Object Vmouse_highlight;
/* Device-independent scroll bar stuff. */
Index: src/msdos.c
===================================================================
RCS file: /cvs/emacs/src/msdos.c,v
retrieving revision 1.160
diff -c -r1.160 msdos.c
*** src/msdos.c 11 Feb 2002 07:14:56 -0000 1.160
--- src/msdos.c 15 Feb 2002 21:50:26 -0000
***************
*** 1181,1189 ****
Mouse Highlight (and friends..)
************************************************************************/
- /* This is used for debugging, to turn off note_mouse_highlight. */
- int disable_mouse_highlight;
-
/* If non-nil, dos_rawgetc generates an event to display that string.
(The display is done in keyboard.c:read_char, by calling
show_help_echo.) */
--- 1181,1186 ----
***************
*** 1235,1240 ****
--- 1232,1240 ----
/* There's no sense to do anything if the mouse face isn't realized. */
if (hl > 0)
{
+ if (dpyinfo->mouse_face_hidden)
+ goto set_cursor_shape;
+
fp = FACE_FROM_ID (SELECTED_FRAME(), dpyinfo->mouse_face_face_id);
if (!fp)
goto set_cursor_shape;
***************
*** 1489,1495 ****
if (mouse_preempted)
return;
! if (disable_mouse_highlight
|| !f->glyphs_initialized_p)
return;
--- 1489,1495 ----
if (mouse_preempted)
return;
! if (NILP (Vmouse_highlight)
|| !f->glyphs_initialized_p)
return;
***************
*** 2584,2589 ****
--- 2584,2590 ----
the_only_x_display.display_info.mouse_face_mouse_x =
the_only_x_display.display_info.mouse_face_mouse_y = 0;
the_only_x_display.display_info.mouse_face_defer = 0;
+ the_only_x_display.display_info.mouse_face_hidden = 0;
init_frame_faces (sf);
***************
*** 3154,3159 ****
--- 3155,3161 ----
{
struct input_event event;
union REGS regs;
+ struct display_info *dpyinfo = FRAME_X_DISPLAY_INFO (SELECTED_FRAME());
#ifndef HAVE_X_WINDOWS
/* Maybe put the cursor where it should be. */
***************
*** 3363,3369 ****
make_event:
if (code == 0)
continue;
!
if (code >= 0x100)
event.kind = non_ascii_keystroke;
else
--- 3365,3377 ----
make_event:
if (code == 0)
continue;
!
! if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight))
! {
! dpyinfo->mouse_face_hidden = 1;
! clear_mouse_face (dpyinfo);
! }
!
if (code >= 0x100)
event.kind = non_ascii_keystroke;
else
***************
*** 3388,3393 ****
--- 3396,3407 ----
might need to update mouse highlight. */
if (mouse_last_x != mouse_prev_x || mouse_last_y != mouse_prev_y)
{
+ if (dpyinfo->mouse_face_hidden)
+ {
+ dpyinfo->mouse_face_hidden = 0;
+ clear_mouse_face (dpyinfo);
+ }
+
previous_help_echo = help_echo;
help_echo = help_echo_object = help_echo_window = Qnil;
help_echo_pos = -1;
***************
*** 3429,3435 ****
if (mouse_button_count == 2 && but < 2)
{
int x2, y2; /* don't clobber original coordinates */
-
/* If only one button is pressed, wait 100 msec and
check again. This way, Speedy Gonzales isn't
punished, while the slow get their chance. */
--- 3443,3448 ----
***************
*** 3473,3479 ****
else
return ((prev_get_char = dos_rawgetc ()) != -1);
}
-
/* Read a key. Return -1 if no key is ready. */
dos_keyread ()
--- 3486,3491 ----
Index: src/msdos.h
===================================================================
RCS file: /cvs/emacs/src/msdos.h,v
retrieving revision 1.23
diff -c -r1.23 msdos.h
*** src/msdos.h 30 Oct 2001 15:32:26 -0000 1.23
--- src/msdos.h 15 Feb 2002 21:50:26 -0000
***************
*** 80,85 ****
--- 80,88 ----
/* Nonzero means defer mouse-motion highlighting. */
int mouse_face_defer;
+
+ /* Nonzero means that the mouse highlight should not be shown. */
+ int mouse_face_hidden;
};
/* This is a cut-down version of the one in xterm.h, which see. */
Index: src/w32term.c
===================================================================
RCS file: /cvs/emacs/src/w32term.c,v
retrieving revision 1.141
diff -c -r1.141 w32term.c
*** src/w32term.c 6 Feb 2002 20:57:44 -0000 1.141
--- src/w32term.c 15 Feb 2002 21:50:29 -0000
***************
*** 6314,6324 ****
}
}
- /* This is used for debugging, to turn off note_mouse_highlight. */
-
- int disable_mouse_highlight;
-
-
/************************************************************************
Mouse Face
--- 6314,6319 ----
***************
*** 6535,6541 ****
if (popup_activated ())
return;
! if (disable_mouse_highlight
|| !f->glyphs_initialized_p)
return;
--- 6530,6536 ----
if (popup_activated ())
return;
! if (NILP (Vmouse_highlight)
|| !f->glyphs_initialized_p)
return;
***************
*** 7444,7449 ****
--- 7439,7446 ----
if (/* If window is in the process of being destroyed, don't bother
to do anything. */
w->current_matrix != NULL
+ /* Don't update mouse highlight if hidden */
+ && (draw != DRAW_MOUSE_FACE || !dpyinfo->mouse_face_hidden)
/* Recognize when we are called to operate on rows that don't exist
anymore. This can happen when a window is split. */
&& dpyinfo->mouse_face_end_row < w->current_matrix->nrows)
***************
*** 8642,8647 ****
--- 8639,8650 ----
if (f && !f->iconified)
{
+ if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight))
+ {
+ dpyinfo->mouse_face_hidden = 1;
+ clear_mouse_face (dpyinfo);
+ }
+
if (temp_index == sizeof temp_buffer / sizeof (short))
temp_index = 0;
temp_buffer[temp_index++] = msg.msg.wParam;
***************
*** 8663,8668 ****
--- 8666,8677 ----
if (f && !f->iconified)
{
+ if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight))
+ {
+ dpyinfo->mouse_face_hidden = 1;
+ clear_mouse_face (dpyinfo);
+ }
+
if (temp_index == sizeof temp_buffer / sizeof (short))
temp_index = 0;
temp_buffer[temp_index++] = msg.msg.wParam;
***************
*** 8689,8694 ****
--- 8698,8709 ----
else
f = x_window_to_frame (dpyinfo, msg.msg.hwnd);
+ if (dpyinfo->mouse_face_hidden)
+ {
+ dpyinfo->mouse_face_hidden = 0;
+ clear_mouse_face (dpyinfo);
+ }
+
if (f)
note_mouse_movement (f, &msg.msg);
else
***************
*** 10852,10857 ****
--- 10867,10873 ----
dpyinfo->mouse_face_face_id = DEFAULT_FACE_ID;
dpyinfo->mouse_face_window = Qnil;
dpyinfo->mouse_face_overlay = Qnil;
+ dpyinfo->mouse_face_hidden = 0;
/* TODO: dpyinfo->gray */
}
Index: src/w32term.h
===================================================================
RCS file: /cvs/emacs/src/w32term.h,v
retrieving revision 1.42
diff -c -r1.42 w32term.h
*** src/w32term.h 20 Jan 2002 23:10:35 -0000 1.42
--- src/w32term.h 15 Feb 2002 21:50:29 -0000
***************
*** 195,200 ****
--- 195,203 ----
/* Nonzero means defer mouse-motion highlighting. */
int mouse_face_defer;
+ /* Nonzero means that the mouse highlight should not be shown. */
+ int mouse_face_hidden;
+
int mouse_face_image_state;
char *w32_id_name;
Index: src/xterm.c
===================================================================
RCS file: /cvs/emacs/src/xterm.c,v
retrieving revision 1.704
diff -c -r1.704 xterm.c
*** src/xterm.c 15 Feb 2002 09:36:05 -0000 1.704
--- src/xterm.c 15 Feb 2002 21:50:33 -0000
***************
*** 6662,6672 ****
}
}
- /* This is used for debugging, to turn off note_mouse_highlight. */
-
- int disable_mouse_highlight;
-
-
/************************************************************************
Mouse Face
--- 6662,6667 ----
***************
*** 6884,6890 ****
return;
#endif
! if (disable_mouse_highlight
|| !f->glyphs_initialized_p)
return;
--- 6879,6885 ----
return;
#endif
! if (NILP (Vmouse_highlight)
|| !f->glyphs_initialized_p)
return;
***************
*** 7790,7795 ****
--- 7785,7792 ----
if (/* If window is in the process of being destroyed, don't bother
to do anything. */
w->current_matrix != NULL
+ /* Don't update mouse highlight if hidden */
+ && (draw != DRAW_MOUSE_FACE || !dpyinfo->mouse_face_hidden)
/* Recognize when we are called to operate on rows that don't exist
anymore. This can happen when a window is split. */
&& dpyinfo->mouse_face_end_row < w->current_matrix->nrows)
***************
*** 10430,10435 ****
--- 10427,10438 ----
case KeyPress:
f = x_any_window_to_frame (dpyinfo, event.xkey.window);
+ if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight))
+ {
+ dpyinfo->mouse_face_hidden = 1;
+ clear_mouse_face (dpyinfo);
+ }
+
#if defined USE_MOTIF && defined USE_TOOLKIT_SCROLL_BARS
if (f == 0)
{
***************
*** 10842,10847 ****
--- 10845,10856 ----
else
f = x_window_to_frame (dpyinfo, event.xmotion.window);
+ if (dpyinfo->mouse_face_hidden)
+ {
+ dpyinfo->mouse_face_hidden = 0;
+ clear_mouse_face (dpyinfo);
+ }
+
if (f)
note_mouse_movement (f, &event.xmotion);
else
***************
*** 14656,14661 ****
--- 14665,14671 ----
dpyinfo->mouse_face_overlay = Qnil;
dpyinfo->mouse_face_mouse_x = dpyinfo->mouse_face_mouse_y = 0;
dpyinfo->mouse_face_defer = 0;
+ dpyinfo->mouse_face_hidden = 0;
dpyinfo->x_focus_frame = 0;
dpyinfo->x_focus_event_frame = 0;
dpyinfo->x_highlight_frame = 0;
Index: src/xterm.h
===================================================================
RCS file: /cvs/emacs/src/xterm.h,v
retrieving revision 1.126
diff -c -r1.126 xterm.h
*** src/xterm.h 27 Jan 2002 16:44:10 -0000 1.126
--- src/xterm.h 15 Feb 2002 21:50:33 -0000
***************
*** 223,228 ****
--- 223,231 ----
/* Nonzero means defer mouse-motion highlighting. */
int mouse_face_defer;
+ /* Nonzero means that the mouse highlight should not be shown. */
+ int mouse_face_hidden;
+
int mouse_face_image_state;
char *x_id_name;
--
Kim F. Storm <address@hidden> http://www.cua.dk
Re: Proposal: Only highlight mouse-face when mouse is moved, Richard Stallman, 2002/02/13
- Re: Proposal: Only highlight mouse-face when mouse is moved, Kim F. Storm, 2002/02/14
- Re: Proposal: Only highlight mouse-face when mouse is moved, Richard Stallman, 2002/02/15
- Re: Proposal: Only highlight mouse-face when mouse is moved, Eli Zaretskii, 2002/02/15
- Re: Proposal: Only highlight mouse-face when mouse is moved, Kim F. Storm, 2002/02/15
- Re: Proposal: Only highlight mouse-face when mouse is moved, Eli Zaretskii, 2002/02/15
- Re: Proposal: Only highlight mouse-face when mouse is moved,
Kim F. Storm <=
- Re: Proposal: Only highlight mouse-face when mouse is moved, Eli Zaretskii, 2002/02/16
- Re: Proposal: Only highlight mouse-face when mouse is moved, Richard Stallman, 2002/02/16
- Re: Proposal: Only highlight mouse-face when mouse is moved, Eli Zaretskii, 2002/02/17
- Re: Proposal: Only highlight mouse-face when mouse is moved, Richard Stallman, 2002/02/17
Re: Proposal: Only highlight mouse-face when mouse is moved, Kim F. Storm, 2002/02/16
Re: Proposal: Only highlight mouse-face when mouse is moved, Stefan Monnier, 2002/02/14