changeset 53178:ee96f9f80b61

(make_lispy_position): Add x and y coordinates relative to the current glyph as 7th element of position. If glyph is an image, return it in the object element. (read_key_sequence): Skip checks for keymap property in cases where POSN_STRING is not a string (e.g. an image).
author Kim F. Storm <storm@cua.dk>
date Thu, 27 Nov 2003 21:16:26 +0000
parents 7d958601b1cf
children 388eeb8e7158
files src/keyboard.c
diffstat 1 files changed, 35 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/keyboard.c	Thu Nov 27 21:16:04 2003 +0000
+++ b/src/keyboard.c	Thu Nov 27 21:16:26 2003 +0000
@@ -587,6 +587,7 @@
 Lisp_Object Qmenu_bar;
 extern Lisp_Object Qleft_margin, Qright_margin;
 extern Lisp_Object Qleft_fringe, Qright_fringe;
+extern Lisp_Object Qimage;
 
 Lisp_Object recursive_edit_unwind (), command_loop ();
 Lisp_Object Fthis_command_keys ();
@@ -4983,6 +4984,7 @@
       struct window *w = XWINDOW (window);
       Lisp_Object object = Qnil;
       int textpos = -1, rx = -1, ry = -1;
+      int dx = -1, dy = -1;
 
       /* Set event coordinates to window-relative coordinates
 	 for constructing the Lisp event below.  */
@@ -4998,7 +5000,7 @@
 
 	  posn = part == ON_MODE_LINE ? Qmode_line : Qheader_line;
 	  rx = wx, ry = wy;
-	  string = mode_line_string (w, &rx, &ry, part, &charpos);
+	  string = mode_line_string (w, &rx, &ry, &dx, &dy, part, &charpos);
 	  if (STRINGP (string))
 	    object = Fcons (string, make_number (charpos));
 	  if (w == XWINDOW (selected_window))
@@ -5010,6 +5012,7 @@
 	{
 	  posn = Qvertical_line;
 	  wx = -1;
+	  dx = 0;
 	}
       else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
 	{
@@ -5018,7 +5021,7 @@
 	  
 	  posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin;
 	  rx = wx, ry = wy;
-	  string = marginal_area_string (w, &rx, &ry, part, &charpos);
+	  string = marginal_area_string (w, &rx, &ry, &dx, &dy, part, &charpos);
 	  if (STRINGP (string))
 	    object = Fcons (string, make_number (charpos));
 	}
@@ -5026,19 +5029,29 @@
 	{
 	  posn = (part == ON_LEFT_FRINGE) ? Qleft_fringe : Qright_fringe;
 	  rx = 0;
+	  dx = wx;
+	  if (part == ON_RIGHT_FRINGE)
+	    dx -= (window_box_width (w, LEFT_MARGIN_AREA)
+		   + window_box_width (w, TEXT_AREA)
+		   + (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
+		      ? window_box_width (w, RIGHT_MARGIN_AREA)
+		      : 0));
+	  else if (!WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w))
+	    dx -= window_box_width (w, LEFT_MARGIN_AREA);
 	}
 
       if (textpos < 0)
 	{
 	  Lisp_Object string;
 	  struct display_pos p;
+	  int dx2, dy2;
 	  wx = max (WINDOW_LEFT_MARGIN_WIDTH (w), wx);
-	  buffer_posn_from_coords (w, &wx, &wy, &string, &p);
+	  buffer_posn_from_coords (w, &wx, &wy, &dx2, &dy2, &string, &p);
 	  textpos = CHARPOS (p.pos);
-	  if (rx < 0)
-	    rx = wx;
-	  if (ry < 0)
-	    ry = wy;
+	  if (rx < 0) rx = wx;
+	  if (ry < 0) ry = wy;
+	  if (dx < 0) dx = dx2;
+	  if (dy < 0) dy = dy2;
 
 	  if (NILP (posn))
 	    {
@@ -5046,6 +5059,8 @@
 	      if (STRINGP (string))
 		object = Fcons (string,
 				make_number (CHARPOS (p.string_pos)));
+	      else if (CONSP (string) && EQ (XCAR (string), Qimage))
+		object = string;
 	    }
 	}
 
@@ -5053,7 +5068,9 @@
 			  Fcons (make_number (textpos),
 				 Fcons (Fcons (make_number (rx),
 					       make_number (ry)),
-					Qnil)));
+					Fcons (Fcons (make_number (dx),
+						      make_number (dy)),
+					       Qnil))));
     }
   else if (f != 0)
     {
@@ -8813,6 +8830,7 @@
       if (EVENT_HAS_PARAMETERS (key))
 	{
 	  Lisp_Object kind;
+	  Lisp_Object string;
 
 	  kind = EVENT_HEAD_KIND (EVENT_HEAD (key));
 	  if (EQ (kind, Qmouse_click))
@@ -8929,11 +8947,11 @@
 
 		  /* If on a mode line string with a local keymap,
 		     reconsider the key sequence with that keymap.  */
-		  if (CONSP (POSN_STRING (EVENT_START (key))))
+		  if (string = POSN_STRING (EVENT_START (key)),
+		      (CONSP (string) && STRINGP (XCAR (string))))
 		    {
-		      Lisp_Object string, pos, map, map2;
-
-		      string = POSN_STRING (EVENT_START (key));
+		      Lisp_Object pos, map, map2;
+
 		      pos = XCDR (string);
 		      string = XCAR (string);
                       if (XINT (pos) >= 0
@@ -8952,16 +8970,16 @@
 
 		  goto replay_key;
 		}
-	      else if (CONSP (POSN_STRING (EVENT_START (key)))
-		       && NILP (from_string))
+	      else if (NILP (from_string)
+		       && (string = POSN_STRING (EVENT_START (key)),
+			   (CONSP (string) && STRINGP (XCAR (string)))))
 		{
 		  /* For a click on a string, i.e. overlay string or a
 		     string displayed via the `display' property,
 		     consider `local-map' and `keymap' properties of
 		     that string.  */
-		  Lisp_Object string, pos, map, map2;
-
-		  string = POSN_STRING (EVENT_START (key));
+		  Lisp_Object pos, map, map2;
+
 		  pos = XCDR (string);
 		  string = XCAR (string);
 		  if (XINT (pos) >= 0