changeset 53329:9c540a878edf

(buffer_posn_from_coords): Fix calculation of dy for image glyph using image's ascent. (mode_line_string): Return image glyph as object clicked on. Adjust y0 for image glyph using image's ascent.
author Kim F. Storm <storm@cua.dk>
date Sun, 28 Dec 2003 00:10:12 +0000
parents dc1470f3ebd7
children 2dfa97148836
files src/dispnew.c
diffstat 1 files changed, 39 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/dispnew.c	Sun Dec 28 00:09:49 2003 +0000
+++ b/src/dispnew.c	Sun Dec 28 00:10:12 2003 +0000
@@ -5702,8 +5702,6 @@
   struct it it;
   struct buffer *old_current_buffer = current_buffer;
   struct text_pos startp;
-  struct glyph_row *row;
-  struct image *img;
   int x0, x1;
 
   current_buffer = XBUFFER (w->buffer);
@@ -5716,25 +5714,44 @@
   move_it_to (&it, -1, x0 + it.first_visible_x, *y, -1,
 	      MOVE_TO_X | MOVE_TO_Y);
 
-  /* Add extra (default width) columns if clicked after EOL. */
-  x1 = max(0, it.current_x + it.pixel_width - it.first_visible_x);
-  if (x0 > x1)
-    it.hpos += (x0 - x1) / WINDOW_FRAME_COLUMN_WIDTH (w);
-
   current_buffer = old_current_buffer;
 
   *dx = x0 + it.first_visible_x - it.current_x;
   *dy = *y - it.current_y;
 
+  *object =  w->buffer;
+
 #ifdef HAVE_WINDOW_SYSTEM
-  if (it.what == IT_IMAGE
-      && (img = IMAGE_FROM_ID (it.f, it.image_id)) != NULL
-      && !NILP (img->spec))
-    *object = img->spec;
+  if (it.what == IT_IMAGE)
+    {
+      struct image *img;
+      if ((img = IMAGE_FROM_ID (it.f, it.image_id)) != NULL
+	  && !NILP (img->spec))
+	{
+	  struct glyph_row *row = MATRIX_ROW (w->current_matrix, it.vpos);
+	  struct glyph *glyph;
+
+	  if (it.hpos < row->used[TEXT_AREA]
+	      && (glyph = row->glyphs[TEXT_AREA] + it.hpos,
+		  glyph->type == IMAGE_GLYPH))
+	    {
+	      *dy -= row->ascent - glyph->ascent;
+	      *object = img->spec;
+	    }
+	}
+    }
   else
 #endif
-    *object = STRINGP (it.string) ? it.string : w->buffer;
+    if (STRINGP (it.string))
+      *object = it.string;
+
   *pos = it.current;
+
+  /* Add extra (default width) columns if clicked after EOL. */
+  x1 = max(0, it.current_x + it.pixel_width - it.first_visible_x);
+  if (x0 > x1)
+    it.hpos += (x0 - x1) / WINDOW_FRAME_COLUMN_WIDTH (w);
+
   *x = it.hpos;
   *y = it.vpos;
 }
@@ -5854,6 +5871,16 @@
 	{
 	  string = glyph->object;
 	  *charpos = glyph->charpos;
+#ifdef HAVE_WINDOW_SYSTEM
+	  if (glyph->type == IMAGE_GLYPH)
+	    {
+	      struct image *img;
+	      img = IMAGE_FROM_ID (WINDOW_XFRAME (w), glyph->u.img_id);
+	      if (img != NULL)
+		string = img->spec;
+	      y0 -= row->ascent - glyph->ascent;
+	    }
+#endif
 	}
       else
 	/* Add extra (default width) columns if clicked after EOL. */