emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/xdisp.c


From: Masatake YAMATO
Subject: [Emacs-diffs] Changes to emacs/src/xdisp.c
Date: Mon, 23 May 2005 07:19:19 -0400

Index: emacs/src/xdisp.c
diff -c emacs/src/xdisp.c:1.1010 emacs/src/xdisp.c:1.1011
*** emacs/src/xdisp.c:1.1010    Sun May 22 02:53:44 2005
--- emacs/src/xdisp.c   Mon May 23 11:19:17 2005
***************
*** 21236,21246 ****
     position relative to the start of the mode line.  */
  
  static void
! note_mode_line_or_margin_highlight (w, x, y, area)
!      struct window *w;
       int x, y;
       enum window_part area;
  {
    struct frame *f = XFRAME (w->frame);
    Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
    Cursor cursor = FRAME_X_OUTPUT (f)->nontext_cursor;
--- 21236,21247 ----
     position relative to the start of the mode line.  */
  
  static void
! note_mode_line_or_margin_highlight (window, x, y, area)
!      Lisp_Object window;
       int x, y;
       enum window_part area;
  {
+   struct window *w = XWINDOW (window);
    struct frame *f = XFRAME (w->frame);
    Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
    Cursor cursor = FRAME_X_OUTPUT (f)->nontext_cursor;
***************
*** 21249,21257 ****
    Lisp_Object string, object = Qnil;
    Lisp_Object pos, help;
  
    if (area == ON_MODE_LINE || area == ON_HEADER_LINE)
!     string = mode_line_string (w, area, &x, &y, &charpos,
!                              &object, &dx, &dy, &width, &height);
    else
      {
        x -= WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (w);
--- 21250,21287 ----
    Lisp_Object string, object = Qnil;
    Lisp_Object pos, help;
  
+   Lisp_Object mouse_face;
+   int original_x_pixel = x;
+   struct glyph * glyph = NULL;
+   struct glyph_row *row;  
+         
    if (area == ON_MODE_LINE || area == ON_HEADER_LINE)
!     {
!       int x0;
!       struct glyph *end;
! 
!       string = mode_line_string (w, area, &x, &y, &charpos,
!                                &object, &dx, &dy, &width, &height);
! 
!       row = (area == ON_MODE_LINE)? 
!       MATRIX_MODE_LINE_ROW (w->current_matrix):
!       MATRIX_HEADER_LINE_ROW(w->current_matrix);
!       
!       /* Find glyph */
!       if (row->mode_line_p && row->enabled_p)
!       {
!         glyph = row->glyphs[TEXT_AREA];
!         end = glyph + row->used[TEXT_AREA];
!         
!         for (x0 = original_x_pixel; 
!              glyph < end && x0 >= glyph->pixel_width; 
!              ++glyph)
!           x0 -= glyph->pixel_width;
!       
!         if (glyph >= end)
!           glyph = NULL;
!       }
!     }
    else
      {
        x -= WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (w);
***************
*** 21329,21334 ****
--- 21359,21449 ----
          if (!KEYMAPP (map))
            cursor = dpyinfo->vertical_scroll_bar_cursor;
        }
+       
+      /* Change the mouse face according to what is under X/Y.  */
+       mouse_face = Fget_text_property (pos, Qmouse_face, string);
+       if (!NILP (mouse_face)
+         && ((area == ON_MODE_LINE) || (area == ON_HEADER_LINE))
+         && glyph)
+       {
+         Lisp_Object b, e;
+ 
+         struct glyph * tmp_glyph;
+ 
+         int gpos;
+         int gseq_length;
+         int total_pixel_width;
+         int ignore;
+ 
+         if (clear_mouse_face (dpyinfo))
+           cursor = No_Cursor;
+         
+         /* Calculate the position(glyph position: GPOS) of GLYPH in 
+            displayed string. GPOS is different from CHARPOS. 
+            
+            CHARPOS is the position of glyph in internal string
+            object. A mode line string format has structures which
+            is converted to a flatten by emacs lisp interpreter.
+            The internal string is an element of the structures.
+            The displayed string is the flatten string. */
+         for (tmp_glyph = glyph - 1, gpos = 0; 
+              tmp_glyph >= row->glyphs[TEXT_AREA]; 
+              tmp_glyph--, gpos++)
+           {
+             if (tmp_glyph->object != glyph->object)
+               break;
+           }
+ 
+         /* Calculate the lenght(glyph sequence length: GSEQ_LENGTH) of
+            displayed string holding GLYPH. 
+ 
+            GSEQ_LENGTH is different from SCHARS (STRING).
+            SCHARS (STRING) returns the length of the internal string. */
+         for (tmp_glyph = glyph, gseq_length = gpos;
+              tmp_glyph < glyph + row->used[TEXT_AREA];
+              tmp_glyph++, gseq_length++)
+             {
+               if (tmp_glyph->object != glyph->object)
+                 break;
+             }
+         
+         b = Fprevious_single_property_change(make_number (charpos + 1),
+                                              Qmouse_face, string, Qnil);
+         e = Fnext_single_property_change (pos, Qmouse_face, string, Qnil);
+         
+         if (NILP (b))
+           b = make_number (0);
+ 
+         if (NILP (e))
+           e = make_number(gseq_length);
+ 
+         total_pixel_width = 0;
+         for (tmp_glyph = glyph - (gpos - XINT(b)); tmp_glyph != glyph; 
tmp_glyph++)
+           total_pixel_width += tmp_glyph->pixel_width;
+         
+         dpyinfo->mouse_face_beg_col = (x - gpos) + XINT(b);
+         dpyinfo->mouse_face_beg_row = (area == ON_MODE_LINE)? 
+           (w->current_matrix)->nrows - 1: 
+           0;
+ 
+         dpyinfo->mouse_face_beg_x   = original_x_pixel - (total_pixel_width + 
dx);
+         dpyinfo->mouse_face_beg_y   = 0;
+         
+         dpyinfo->mouse_face_end_col = (x - gpos) + XINT(e);
+         dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_beg_row;
+ 
+         dpyinfo->mouse_face_end_x   = 0;
+         dpyinfo->mouse_face_end_y   = 0;
+ 
+         dpyinfo->mouse_face_past_end = 0;
+         dpyinfo->mouse_face_window  = window;
+ 
+         dpyinfo->mouse_face_face_id = face_at_string_position(w, string, 
+                                                               charpos,
+                                                               0, 0, 0, 
&ignore,
+                                                               glyph->face_id, 
1);
+         show_mouse_face (dpyinfo, DRAW_MOUSE_FACE);
+       }
      }
  
    define_frame_cursor1 (f, cursor, pointer);
***************
*** 21409,21415 ****
    if (part == ON_MODE_LINE || part == ON_HEADER_LINE
        || part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
      {
!       note_mode_line_or_margin_highlight (w, x, y, part);
        return;
      }
  
--- 21524,21530 ----
    if (part == ON_MODE_LINE || part == ON_HEADER_LINE
        || part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
      {
!       note_mode_line_or_margin_highlight (window, x, y, part);
        return;
      }
  




reply via email to

[Prev in Thread] Current Thread [Next in Thread]