emacs-diffs
[Top][All Lists]
Advanced

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

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


From: Kim F . Storm
Subject: [Emacs-diffs] Changes to emacs/src/macterm.c
Date: Tue, 11 Oct 2005 18:35:41 -0400

Index: emacs/src/macterm.c
diff -c emacs/src/macterm.c:1.134 emacs/src/macterm.c:1.135
*** emacs/src/macterm.c:1.134   Tue Oct 11 03:35:36 2005
--- emacs/src/macterm.c Tue Oct 11 22:35:40 2005
***************
*** 4190,4195 ****
--- 4190,4197 ----
        frame->mouse_moved = 1;
        last_mouse_scroll_bar = Qnil;
        note_mouse_highlight (frame, pos->h, pos->v);
+       /* Remember which glyph we're now on.  */
+       remember_mouse_glyph (frame, pos->h, pos->v, &last_mouse_glyph);
      }
  }
  
***************
*** 4198,4206 ****
                              Mouse Face
   ************************************************************************/
  
- static int glyph_rect P_ ((struct frame *f, int, int, Rect *));
- 
- 
  /* MAC TODO:  This should be called from somewhere (or removed)  ++KFS */
  
  static void
--- 4200,4205 ----
***************
*** 4214,4323 ****
  }
  
  
- /* Try to determine frame pixel position and size of the glyph under
-    frame pixel coordinates X/Y on frame F .  Return the position and
-    size in *RECT.  Value is non-zero if we could compute these
-    values.  */
- 
- static int
- glyph_rect (f, x, y, rect)
-      struct frame *f;
-      int x, y;
-      Rect *rect;
- {
-   Lisp_Object window;
- 
-   window = window_from_coordinates (f, x, y, 0, &x, &y, 0);
- 
-   if (!NILP (window))
-     {
-       struct window *w = XWINDOW (window);
-       struct glyph_row *r = MATRIX_FIRST_TEXT_ROW (w->current_matrix);
-       struct glyph_row *end = r + w->current_matrix->nrows - 1;
- 
-       for (; r < end && r->enabled_p; ++r)
-       if (r->y <= y && r->y + r->height > y)
-         {
-           /* Found the row at y.  */
-           struct glyph *g = r->glyphs[TEXT_AREA];
-           struct glyph *end = g + r->used[TEXT_AREA];
-           int gx;
- 
-           rect->top = WINDOW_TO_FRAME_PIXEL_Y (w, r->y);
-           rect->bottom = rect->top + r->height;
- 
-           if (x < r->x)
-             {
-               /* x is to the left of the first glyph in the row.  */
-               /* Shouldn't this be a pixel value?
-                  WINDOW_LEFT_EDGE_X (w) seems to be the right value.
-                  ++KFS */
-               rect->left = WINDOW_LEFT_EDGE_COL (w);
-               rect->right = WINDOW_TO_FRAME_PIXEL_X (w, r->x);
-               return 1;
-             }
- 
-           for (gx = r->x; g < end; gx += g->pixel_width, ++g)
-             if (gx <= x && gx + g->pixel_width > x)
-               {
-                 /* x is on a glyph.  */
-                 rect->left = WINDOW_TO_FRAME_PIXEL_X (w, gx);
-                 rect->right = rect->left + g->pixel_width;
-                 return 1;
-               }
- 
-           /* x is to the right of the last glyph in the row.  */
-           rect->left = WINDOW_TO_FRAME_PIXEL_X (w, gx);
-           /* Shouldn't this be a pixel value?
-              WINDOW_RIGHT_EDGE_X (w) seems to be the right value.
-              ++KFS */
-           rect->right = WINDOW_RIGHT_EDGE_COL (w);
-           return 1;
-         }
-     }
- 
-   /* The y is not on any row.  */
-   return 0;
- }
- 
- /* MAC TODO:  This should be called from somewhere (or removed)  ++KFS */
- 
- /* Record the position of the mouse in last_mouse_glyph.  */
- static void
- remember_mouse_glyph (f1, gx, gy)
-      struct frame * f1;
-      int gx, gy;
- {
-   if (!glyph_rect (f1, gx, gy, &last_mouse_glyph))
-     {
-       int width = FRAME_SMALLEST_CHAR_WIDTH (f1);
-       int height = FRAME_SMALLEST_FONT_HEIGHT (f1);
- 
-       /* Arrange for the division in FRAME_PIXEL_X_TO_COL etc. to
-        round down even for negative values.  */
-       if (gx < 0)
-       gx -= width - 1;
-       if (gy < 0)
-       gy -= height - 1;
- #if 0
-       /* This was the original code from XTmouse_position, but it seems
-        to give the position of the glyph diagonally next to the one
-        the mouse is over.  */
-       gx = (gx + width - 1) / width * width;
-       gy = (gy + height - 1) / height * height;
- #else
-       gx = gx / width * width;
-       gy = gy / height * height;
- #endif
- 
-       last_mouse_glyph.left = gx;
-       last_mouse_glyph.top = gy;
-       last_mouse_glyph.right  = gx + width;
-       last_mouse_glyph.bottom = gy + height;
-     }
- }
- 
- 
  static struct frame *
  mac_focus_frame (dpyinfo)
       struct mac_display_info *dpyinfo;
--- 4213,4218 ----
***************
*** 4333,4350 ****
  
  
  /* Return the current position of the mouse.
!    *fp should be a frame which indicates which display to ask about.
  
!    If the mouse movement started in a scroll bar, set *fp, *bar_window,
!    and *part to the frame, window, and scroll bar part that the mouse
!    is over.  Set *x and *y to the portion and whole of the mouse's
     position on the scroll bar.
  
!    If the mouse movement started elsewhere, set *fp to the frame the
!    mouse is on, *bar_window to nil, and *x and *y to the character cell
     the mouse is over.
  
!    Set *time to the server time-stamp for the time at which the mouse
     was at this position.
  
     Don't store anything if we don't have a valid set of values to report.
--- 4228,4245 ----
  
  
  /* Return the current position of the mouse.
!    *FP should be a frame which indicates which display to ask about.
  
!    If the mouse movement started in a scroll bar, set *FP, *BAR_WINDOW,
!    and *PART to the frame, window, and scroll bar part that the mouse
!    is over.  Set *X and *Y to the portion and whole of the mouse's
     position on the scroll bar.
  
!    If the mouse movement started elsewhere, set *FP to the frame the
!    mouse is on, *BAR_WINDOW to nil, and *X and *Y to the character cell
     the mouse is over.
  
!    Set *TIME to the server time-stamp for the time at which the mouse
     was at this position.
  
     Don't store anything if we don't have a valid set of values to report.
***************
*** 4361,4371 ****
       Lisp_Object *x, *y;
       unsigned long *time;
  {
!   Point mouse_pos;
!   int ignore1, ignore2;
!   struct frame *f = mac_focus_frame (FRAME_MAC_DISPLAY_INFO (*fp));
!   WindowPtr wp = FRAME_MAC_WINDOW (f);
!   Lisp_Object frame, tail;
  
    BLOCK_INPUT;
  
--- 4256,4262 ----
       Lisp_Object *x, *y;
       unsigned long *time;
  {
!   FRAME_PTR f1;
  
    BLOCK_INPUT;
  
***************
*** 4373,4397 ****
      x_scroll_bar_report_motion (fp, bar_window, part, x, y, time);
    else
      {
        /* Clear the mouse-moved flag for every frame on this display.  */
        FOR_EACH_FRAME (tail, frame)
!         XFRAME (frame)->mouse_moved = 0;
  
        last_mouse_scroll_bar = Qnil;
  
!       SetPortWindowPort (wp);
! 
!       GetMouse (&mouse_pos);
! 
!       pixel_to_glyph_coords (f, mouse_pos.h, mouse_pos.v, &ignore1, &ignore2,
!                              &last_mouse_glyph, insist);
! 
!       *bar_window = Qnil;
!       *part = scroll_bar_handle;
!       *fp = f;
!       XSETINT (*x, mouse_pos.h);
!       XSETINT (*y, mouse_pos.v);
!       *time = last_mouse_movement_time;
      }
  
    UNBLOCK_INPUT;
--- 4264,4306 ----
      x_scroll_bar_report_motion (fp, bar_window, part, x, y, time);
    else
      {
+       Lisp_Object frame, tail;
+ 
        /* Clear the mouse-moved flag for every frame on this display.  */
        FOR_EACH_FRAME (tail, frame)
!       XFRAME (frame)->mouse_moved = 0;
  
        last_mouse_scroll_bar = Qnil;
  
!       if (FRAME_MAC_DISPLAY_INFO (*fp)->grabbed && last_mouse_frame
!         && FRAME_LIVE_P (last_mouse_frame))
!       f1 = last_mouse_frame;
!       else
!       f1 = mac_focus_frame (FRAME_MAC_DISPLAY_INFO (*fp));
! 
!       if (f1)
!       {
!         /* Ok, we found a frame.  Store all the values.
!            last_mouse_glyph is a rectangle used to reduce the
!            generation of mouse events.  To not miss any motion
!            events, we must divide the frame into rectangles of the
!            size of the smallest character that could be displayed
!            on it, i.e. into the same rectangles that matrices on
!            the frame are divided into.  */
!         Point mouse_pos;
! 
!         SetPortWindowPort (FRAME_MAC_WINDOW (f1));
!         GetMouse (&mouse_pos);
!         remember_mouse_glyph (f1, mouse_pos.h, mouse_pos.v,
!                               &last_mouse_glyph);
! 
!         *bar_window = Qnil;
!         *part = 0;
!         *fp = f1;
!         XSETINT (*x, mouse_pos.h);
!         XSETINT (*y, mouse_pos.v);
!         *time = last_mouse_movement_time;
!       }
      }
  
    UNBLOCK_INPUT;




reply via email to

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