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 [emacs-unicode-2]


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/src/macterm.c [emacs-unicode-2]
Date: Mon, 28 Jun 2004 03:56:09 -0400

Index: emacs/src/macterm.c
diff -c emacs/src/macterm.c:1.47.2.2 emacs/src/macterm.c:1.47.2.3
*** emacs/src/macterm.c:1.47.2.2        Fri Apr 16 12:50:48 2004
--- emacs/src/macterm.c Mon Jun 28 07:29:22 2004
***************
*** 53,59 ****
  #if defined (__MRC__) || (__MSL__ >= 0x6000)
  #include <ControlDefinitions.h>
  #endif
- #include <Gestalt.h>
  
  #if __profile__
  #include <profiler.h>
--- 53,58 ----
***************
*** 196,209 ****
  
  static Time last_mouse_movement_time;
  
- enum mouse_tracking_type {
-   mouse_tracking_none,
-   mouse_tracking_mouse_movement,
-   mouse_tracking_scroll_bar
- };
- 
- enum mouse_tracking_type mouse_tracking_in_progress = mouse_tracking_none;
- 
  struct scroll_bar *tracked_scroll_bar = NULL;
  
  /* Incremented by XTread_socket whenever it really tries to read
--- 195,200 ----
***************
*** 294,300 ****
  
  static int is_emacs_window (WindowPtr);
  
- extern int image_ascent (struct image *, struct face *);
  int x_bitmap_icon (struct frame *, Lisp_Object);
  void x_make_frame_visible (struct frame *);
  
--- 285,290 ----
***************
*** 311,317 ****
       Display *display;                /* not used */
       Pixmap pixmap;
  {
!   DisposeGWorld (pixmap); 
  }
  
  
--- 301,307 ----
       Display *display;                /* not used */
       Pixmap pixmap;
  {
!   DisposeGWorld (pixmap);
  }
  
  
***************
*** 365,375 ****
       GC gc;
       int x1, y1, x2, y2;
  {
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (w));
! #else
!   SetPort (w);
! #endif
  
    mac_set_colors (gc);
  
--- 355,361 ----
       GC gc;
       int x1, y1, x2, y2;
  {
!   SetPortWindowPort (w);
  
    mac_set_colors (gc);
  
***************
*** 384,389 ****
--- 370,379 ----
       GC gc;
       int x1, y1, x2, y2;
  {
+   CGrafPtr old_port;
+   GDHandle old_gdh;
+ 
+   GetGWorld (&old_port, &old_gdh);
    SetGWorld (p, NULL);
  
    mac_set_colors (gc);
***************
*** 392,397 ****
--- 382,389 ----
    MoveTo (x1, y1);
    LineTo (x2, y2);
    UnlockPixels (GetGWorldPixMap (p));
+ 
+   SetGWorld (old_port, old_gdh);
  }
  
  /* Mac version of XClearArea.  */
***************
*** 411,421 ****
    xgc.foreground = mwp->x_compatible.foreground_pixel;
    xgc.background = mwp->x_compatible.background_pixel;
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (w));
! #else
!   SetPort (w);
! #endif
  
    mac_set_colors (&xgc);
    SetRect (&r, x, y, x + width, y + height);
--- 403,409 ----
    xgc.foreground = mwp->x_compatible.foreground_pixel;
    xgc.background = mwp->x_compatible.background_pixel;
  
!   SetPortWindowPort (w);
  
    mac_set_colors (&xgc);
    SetRect (&r, x, y, x + width, y + height);
***************
*** 436,446 ****
    xgc.foreground = mwp->x_compatible.foreground_pixel;
    xgc.background = mwp->x_compatible.background_pixel;
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (w));
! #else
!   SetPort (w);
! #endif
  
    mac_set_colors (&xgc);
  
--- 424,430 ----
    xgc.foreground = mwp->x_compatible.foreground_pixel;
    xgc.background = mwp->x_compatible.background_pixel;
  
!   SetPortWindowPort (w);
  
    mac_set_colors (&xgc);
  
***************
*** 475,485 ****
    bitmap.baseAddr = (char *)bits;
    SetRect (&(bitmap.bounds), 0, 0, width, height);
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (w));
! #else
!   SetPort (w);
! #endif
  
    mac_set_colors (gc);
    SetRect (&r, x, y, x + width, y + height);
--- 459,465 ----
    bitmap.baseAddr = (char *)bits;
    SetRect (&(bitmap.bounds), 0, 0, width, height);
  
!   SetPortWindowPort (w);
  
    mac_set_colors (gc);
    SetRect (&r, x, y, x + width, y + height);
***************
*** 504,514 ****
       WindowPtr w;
       Rect *r;
  {
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (w));
! #else
!   SetPort (w);
! #endif
  
    ClipRect (r);
  }
--- 484,490 ----
       WindowPtr w;
       Rect *r;
  {
!   SetPortWindowPort (w);
  
    ClipRect (r);
  }
***************
*** 523,533 ****
  {
    Rect r;
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (w));
! #else
!   SetPort (w);
! #endif
  
    SetRect (&r, -32767, -32767, 32767, 32767);
    ClipRect (&r);
--- 499,505 ----
  {
    Rect r;
  
!   SetPortWindowPort (w);
  
    SetRect (&r, -32767, -32767, 32767, 32767);
    ClipRect (&r);
***************
*** 596,606 ****
    Rect r;
    QDErr err;
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (w));
! #else
!   SetPort (w);
! #endif
  
    SetRect (&r, 0, 0, width, height);
    err = NewGWorld (&pixmap, depth, &r, NULL, NULL, 0);
--- 568,574 ----
    Rect r;
    QDErr err;
  
!   SetPortWindowPort (w);
  
    SetRect (&r, 0, 0, width, height);
    err = NewGWorld (&pixmap, depth, &r, NULL, NULL, 0);
***************
*** 621,631 ****
--- 589,602 ----
  {
    Pixmap pixmap;
    BitMap bitmap;
+   CGrafPtr old_port;
+   GDHandle old_gdh;
  
    pixmap = XCreatePixmap (display, w, width, height, depth);
    if (pixmap == NULL)
      return NULL;
  
+   GetGWorld (&old_port, &old_gdh);
    SetGWorld (pixmap, NULL);
    mac_create_bitmap_from_bitmap_data (&bitmap, data, width, height);
    mac_set_forecolor (fg);
***************
*** 639,644 ****
--- 610,616 ----
            &bitmap.bounds, &bitmap.bounds, srcCopy, 0);
  #endif /* not TARGET_API_MAC_CARBON */
    UnlockPixels (GetGWorldPixMap (pixmap));
+   SetGWorld (old_port, old_gdh);
    mac_free_bitmap (&bitmap);
  
    return pixmap;
***************
*** 657,667 ****
  {
    Rect r;
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (w));
! #else
!   SetPort (w);
! #endif
  
    mac_set_colors (gc);
    SetRect (&r, x, y, x + width, y + height);
--- 629,635 ----
  {
    Rect r;
  
!   SetPortWindowPort (w);
  
    mac_set_colors (gc);
    SetRect (&r, x, y, x + width, y + height);
***************
*** 678,685 ****
--- 646,656 ----
       int x, y;
       unsigned int width, height;
  {
+   CGrafPtr old_port;
+   GDHandle old_gdh;
    Rect r;
  
+   GetGWorld (&old_port, &old_gdh);
    SetGWorld (p, NULL);
    mac_set_colors (gc);
    SetRect (&r, x, y, x + width, y + height);
***************
*** 687,692 ****
--- 658,665 ----
    LockPixels (GetGWorldPixMap (p));
    PaintRect (&r); /* using foreground color of gc */
    UnlockPixels (GetGWorldPixMap (p));
+ 
+   SetGWorld (old_port, old_gdh);
  }
  
  
***************
*** 702,712 ****
  {
    Rect r;
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (w));
! #else
!   SetPort (w);
! #endif
  
    mac_set_colors (gc);
    SetRect (&r, x, y, x + width + 1, y + height + 1);
--- 675,681 ----
  {
    Rect r;
  
!   SetPortWindowPort (w);
  
    mac_set_colors (gc);
    SetRect (&r, x, y, x + width + 1, y + height + 1);
***************
*** 725,732 ****
--- 694,704 ----
       int x, y;
       unsigned int width, height;
  {
+   CGrafPtr old_port;
+   GDHandle old_gdh;
    Rect r;
  
+   GetGWorld (&old_port, &old_gdh);
    SetGWorld (p, NULL);
    mac_set_colors (gc);
    SetRect (&r, x, y, x + width + 1, y + height + 1);
***************
*** 734,739 ****
--- 706,713 ----
    LockPixels (GetGWorldPixMap (p));
    FrameRect (&r); /* using foreground color of gc */
    UnlockPixels (GetGWorldPixMap (p));
+ 
+   SetGWorld (old_port, old_gdh);
  }
  
  
***************
*** 747,757 ****
       char *buf;
       int nchars, mode, bytes_per_char;
  {
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (w));
! #else
!   SetPort (w);
! #endif
  
    mac_set_colors (gc);
  
--- 721,727 ----
       char *buf;
       int nchars, mode, bytes_per_char;
  {
!   SetPortWindowPort (w);
  
    mac_set_colors (gc);
  
***************
*** 842,852 ****
  {
    Rect src_r, dest_r;
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (dest));
! #else
!   SetPort (dest);
! #endif
  
    SetRect (&src_r, src_x, src_y, src_x + width, src_y + height);
    SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height);
--- 812,818 ----
  {
    Rect src_r, dest_r;
  
!   SetPortWindowPort (dest);
  
    SetRect (&src_r, src_x, src_y, src_x + width, src_y + height);
    SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height);
***************
*** 882,892 ****
  {
    Rect src_r, dest_r;
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (dest));
! #else
!   SetPort (dest);
! #endif
  
    SetRect (&src_r, src_x, src_y, src_x + width, src_y + height);
    SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height);
--- 848,854 ----
  {
    Rect src_r, dest_r;
  
!   SetPortWindowPort (dest);
  
    SetRect (&src_r, src_x, src_y, src_x + width, src_y + height);
    SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height);
***************
*** 946,952 ****
    SetRect (&src_r, src_x, src_y, src_x + width, src_y + height);
    SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height);
  
!   SetPort (GetWindowPort (w));
  
    ForeColor (blackColor);
    BackColor (whiteColor);
--- 908,914 ----
    SetRect (&src_r, src_x, src_y, src_x + width, src_y + height);
    SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height);
  
!   SetPortWindowPort (w);
  
    ForeColor (blackColor);
    BackColor (whiteColor);
***************
*** 1004,1011 ****
--- 966,976 ----
       unsigned int width, height;
       int dest_x, dest_y;
  {
+   CGrafPtr old_port;
+   GDHandle old_gdh;
    Rect src_r, dest_r;
  
+   GetGWorld (&old_port, &old_gdh);
    SetGWorld (dest, NULL);
    ForeColor (blackColor);
    BackColor (whiteColor);
***************
*** 1024,1029 ****
--- 989,996 ----
  #endif /* not TARGET_API_MAC_CARBON */
    UnlockPixels (GetGWorldPixMap (dest));
    UnlockPixels (GetGWorldPixMap (src));
+ 
+   SetGWorld (old_port, old_gdh);
  }
  
  
***************
*** 1037,1044 ****
--- 1004,1014 ----
       unsigned int width, height;
       int dest_x, dest_y;
  {
+   CGrafPtr old_port;
+   GDHandle old_gdh;
    Rect src_r, dest_r;
  
+   GetGWorld (&old_port, &old_gdh);
    SetGWorld (dest, NULL);
    ForeColor (blackColor);
    BackColor (whiteColor);
***************
*** 1059,1064 ****
--- 1029,1036 ----
    UnlockPixels (GetGWorldPixMap (dest));
    UnlockPixels (GetGWorldPixMap (mask));
    UnlockPixels (GetGWorldPixMap (src));
+ 
+   SetGWorld (old_port, old_gdh);
  }
  
  
***************
*** 1181,1187 ****
        FOR_EACH_FRAME (rest, frame)
        x_flush (XFRAME (frame));
      }
!   else if (FRAME_X_P (f))
      XFlush (FRAME_MAC_DISPLAY (f));
    UNBLOCK_INPUT;
  #endif /* TARGET_API_MAC_CARBON */
--- 1153,1159 ----
        FOR_EACH_FRAME (rest, frame)
        x_flush (XFRAME (frame));
      }
!   else if (FRAME_MAC_P (f))
      XFlush (FRAME_MAC_DISPLAY (f));
    UNBLOCK_INPUT;
  #endif /* TARGET_API_MAC_CARBON */
***************
*** 1261,1267 ****
        {
          int i;
  
!           for (i = 0; i < w->desired_matrix->nrows; ++i)
            if (MATRIX_ROW_ENABLED_P (w->desired_matrix, i))
              break;
  
--- 1233,1239 ----
        {
          int i;
  
!         for (i = 0; i < w->desired_matrix->nrows; ++i)
            if (MATRIX_ROW_ENABLED_P (w->desired_matrix, i))
              break;
  
***************
*** 1283,1289 ****
       int x, y0, y1;
  {
    struct frame *f = XFRAME (WINDOW_FRAME (w));
!   
    XDrawLine (FRAME_MAC_DISPLAY (f), FRAME_MAC_WINDOW (f),
             f->output_data.mac->normal_gc, x, y0, x, y1);
  }
--- 1255,1261 ----
       int x, y0, y1;
  {
    struct frame *f = XFRAME (WINDOW_FRAME (w));
! 
    XDrawLine (FRAME_MAC_DISPLAY (f), FRAME_MAC_WINDOW (f),
             f->output_data.mac->normal_gc, x, y0, x, y1);
  }
***************
*** 1356,1366 ****
    /* Reset the background color of Mac OS Window to that of the frame after
       update so that it is used by Mac Toolbox to clear the update region 
before
       an update event is generated.  */
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (FRAME_MAC_WINDOW (f)));
! #else
!   SetPort (FRAME_MAC_WINDOW (f));
! #endif
  
    mac_set_backcolor (FRAME_BACKGROUND_PIXEL (f));
  
--- 1328,1334 ----
    /* Reset the background color of Mac OS Window to that of the frame after
       update so that it is used by Mac Toolbox to clear the update region 
before
       an update event is generated.  */
!   SetPortWindowPort (FRAME_MAC_WINDOW (f));
  
    mac_set_backcolor (FRAME_BACKGROUND_PIXEL (f));
  
***************
*** 1381,1387 ****
  XTframe_up_to_date (f)
       struct frame *f;
  {
!   if (FRAME_X_P (f))
      {
        struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f);
  
--- 1349,1355 ----
  XTframe_up_to_date (f)
       struct frame *f;
  {
!   if (FRAME_MAC_P (f))
      {
        struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f);
  
***************
*** 1525,1531 ****
                        : face->foreground);
        gcv.background = face->background;
  
!       mac_draw_bitmap (display, window, &gcv, p->x, p->y, 
                       p->wd, p->h, bits, p->overlay_p);
      }
  
--- 1493,1499 ----
                        : face->foreground);
        gcv.background = face->background;
  
!       mac_draw_bitmap (display, window, &gcv, p->x, p->y,
                       p->wd, p->h, bits, p->overlay_p);
      }
  
***************
*** 1759,1765 ****
  static void x_clear_glyph_string_rect P_ ((struct glyph_string *, int,
                                           int, int, int));
  static void x_draw_relief_rect P_ ((struct frame *, int, int, int, int,
!                                   int, int, int, int, Rect *));
  static void x_draw_box_rect P_ ((struct glyph_string *, int, int, int, int,
                                 int, int, int, Rect *));
  
--- 1727,1734 ----
  static void x_clear_glyph_string_rect P_ ((struct glyph_string *, int,
                                           int, int, int));
  static void x_draw_relief_rect P_ ((struct frame *, int, int, int, int,
!                                   int, int, int, int, int, int,
!                                   Rect *));
  static void x_draw_box_rect P_ ((struct glyph_string *, int, int, int, int,
                                 int, int, int, Rect *));
  
***************
*** 2483,2491 ****
  
  static void
  x_draw_relief_rect (f, left_x, top_y, right_x, bottom_y, width,
!                   raised_p, left_p, right_p, clip_rect)
       struct frame *f;
!      int left_x, top_y, right_x, bottom_y, width, left_p, right_p, raised_p;
       Rect *clip_rect;
  {
    Display *dpy = FRAME_MAC_DISPLAY (f);
--- 2452,2461 ----
  
  static void
  x_draw_relief_rect (f, left_x, top_y, right_x, bottom_y, width,
!                   raised_p, top_p, bot_p, left_p, right_p, clip_rect)
       struct frame *f;
!      int left_x, top_y, right_x, bottom_y, width;
!      int top_p, bot_p, left_p, right_p, raised_p;
       Rect *clip_rect;
  {
    Display *dpy = FRAME_MAC_DISPLAY (f);
***************
*** 2500,2509 ****
    mac_set_clip_rectangle (dpy, window, clip_rect);
  
    /* Top.  */
!   for (i = 0; i < width; ++i)
!     XDrawLine (dpy, window, gc,
!              left_x + i * left_p, top_y + i,
!              right_x - i * right_p, top_y + i);
  
    /* Left.  */
    if (left_p)
--- 2470,2480 ----
    mac_set_clip_rectangle (dpy, window, clip_rect);
  
    /* Top.  */
!   if (top_p)
!     for (i = 0; i < width; ++i)
!       XDrawLine (dpy, window, gc,
!                left_x + i * left_p, top_y + i,
!                right_x - i * right_p, top_y + i);
  
    /* Left.  */
    if (left_p)
***************
*** 2520,2529 ****
                          clip_rect);
  
    /* Bottom.  */
!   for (i = 0; i < width; ++i)
!     XDrawLine (dpy, window, gc,
!              left_x + i * left_p, bottom_y - i,
!              right_x - i * right_p, bottom_y - i);
  
    /* Right.  */
    if (right_p)
--- 2491,2501 ----
                          clip_rect);
  
    /* Bottom.  */
!   if (bot_p)
!     for (i = 0; i < width; ++i)
!       XDrawLine (dpy, window, gc,
!                left_x + i * left_p, bottom_y - i,
!                right_x - i * right_p, bottom_y - i);
  
    /* Right.  */
    if (right_p)
***************
*** 2629,2635 ****
      {
        x_setup_relief_colors (s);
        x_draw_relief_rect (s->f, left_x, top_y, right_x, bottom_y,
!                         width, raised_p, left_p, right_p, &clip_rect);
      }
  }
  
--- 2601,2607 ----
      {
        x_setup_relief_colors (s);
        x_draw_relief_rect (s->f, left_x, top_y, right_x, bottom_y,
!                         width, raised_p, 1, 1, left_p, right_p, &clip_rect);
      }
  }
  
***************
*** 2640,2660 ****
  x_draw_image_foreground (s)
       struct glyph_string *s;
  {
!   int x;
!   int y = s->ybase - image_ascent (s->img, s->face);
  
    /* If first glyph of S has a left box line, start drawing it to the
       right of that line.  */
    if (s->face->box != FACE_NO_BOX
!       && s->first_glyph->left_box_line_p)
!     x = s->x + abs (s->face->box_line_width);
!   else
!     x = s->x;
  
    /* If there is a margin around the image, adjust x- and y-position
       by that margin.  */
!   x += s->img->hmargin;
!   y += s->img->vmargin;
  
    if (s->img->pixmap)
      {
--- 2612,2633 ----
  x_draw_image_foreground (s)
       struct glyph_string *s;
  {
!   int x = s->x;
!   int y = s->ybase - image_ascent (s->img, s->face, &s->slice);
  
    /* If first glyph of S has a left box line, start drawing it to the
       right of that line.  */
    if (s->face->box != FACE_NO_BOX
!       && s->first_glyph->left_box_line_p
!       && s->slice.x == 0)
!     x += abs (s->face->box_line_width);
  
    /* If there is a margin around the image, adjust x- and y-position
       by that margin.  */
!   if (s->slice.x == 0)
!     x += s->img->hmargin;
!   if (s->slice.y == 0)
!     y += s->img->vmargin;
  
    if (s->img->pixmap)
      {
***************
*** 2667,2677 ****
          CONVERT_TO_XRECT (clip_rect, nr);
          image_rect.x = x;
          image_rect.y = y;
!         image_rect.width = s->img->width;
!         image_rect.height = s->img->height;
          if (x_intersect_rectangles (&clip_rect, &image_rect, &r))
            mac_copy_area_with_mask (s->display, s->img->pixmap, s->img->mask,
!                                    s->window, s->gc, r.x - x, r.y - y,
                                     r.width, r.height, r.x, r.y);
        }
        else
--- 2640,2651 ----
          CONVERT_TO_XRECT (clip_rect, nr);
          image_rect.x = x;
          image_rect.y = y;
!         image_rect.width = s->slice.width;
!         image_rect.height = s->slice.height;
          if (x_intersect_rectangles (&clip_rect, &image_rect, &r))
            mac_copy_area_with_mask (s->display, s->img->pixmap, s->img->mask,
!                                    s->window, s->gc,
!                                    s->slice.x + r.x - x, s->slice.y + r.y - y,
                                     r.width, r.height, r.x, r.y);
        }
        else
***************
*** 2683,2693 ****
          CONVERT_TO_XRECT (clip_rect, nr);
          image_rect.x = x;
          image_rect.y = y;
!         image_rect.width = s->img->width;
!         image_rect.height = s->img->height;
          if (x_intersect_rectangles (&clip_rect, &image_rect, &r))
            mac_copy_area (s->display, s->img->pixmap, s->window, s->gc,
!                          r.x - x, r.y - y, r.width, r.height, r.x, r.y);
  
          /* When the image has a mask, we can expect that at
             least part of a mouse highlight or a block cursor will
--- 2657,2668 ----
          CONVERT_TO_XRECT (clip_rect, nr);
          image_rect.x = x;
          image_rect.y = y;
!         image_rect.width = s->slice.width;
!         image_rect.height = s->slice.height;
          if (x_intersect_rectangles (&clip_rect, &image_rect, &r))
            mac_copy_area (s->display, s->img->pixmap, s->window, s->gc,
!                          s->slice.x + r.x - x, s->slice.y + r.y - y,
!                          r.width, r.height, r.x, r.y);
  
          /* When the image has a mask, we can expect that at
             least part of a mouse highlight or a block cursor will
***************
*** 2699,2713 ****
            {
              int r = s->img->relief;
              if (r < 0) r = -r;
!             mac_draw_rectangle (s->display, s->window, s->gc, x - r, y - r,
!                                 s->img->width + r*2 - 1, s->img->height + r*2 
- 1);
            }
        }
      }
    else
      /* Draw a rectangle if image could not be loaded.  */
      mac_draw_rectangle (s->display, s->window, s->gc, x, y,
!                     s->img->width - 1, s->img->height - 1);
  }
  
  
--- 2674,2690 ----
            {
              int r = s->img->relief;
              if (r < 0) r = -r;
!             mac_draw_rectangle (s->display, s->window, s->gc,
!                                 x - r, y - r,
!                                 s->slice.width + r*2 - 1,
!                                 s->slice.height + r*2 - 1);
            }
        }
      }
    else
      /* Draw a rectangle if image could not be loaded.  */
      mac_draw_rectangle (s->display, s->window, s->gc, x, y,
!                       s->slice.width - 1, s->slice.height - 1);
  }
  
  
***************
*** 2719,2739 ****
  {
    int x0, y0, x1, y1, thick, raised_p;
    Rect r;
!   int x;
!   int y = s->ybase - image_ascent (s->img, s->face);
  
    /* If first glyph of S has a left box line, start drawing it to the
       right of that line.  */
    if (s->face->box != FACE_NO_BOX
!       && s->first_glyph->left_box_line_p)
!     x = s->x + abs (s->face->box_line_width);
!   else
!     x = s->x;
  
    /* If there is a margin around the image, adjust x- and y-position
       by that margin.  */
!   x += s->img->hmargin;
!   y += s->img->vmargin;
  
    if (s->hl == DRAW_IMAGE_SUNKEN
        || s->hl == DRAW_IMAGE_RAISED)
--- 2696,2717 ----
  {
    int x0, y0, x1, y1, thick, raised_p;
    Rect r;
!   int x = s->x;
!   int y = s->ybase - image_ascent (s->img, s->face, &s->slice);
  
    /* If first glyph of S has a left box line, start drawing it to the
       right of that line.  */
    if (s->face->box != FACE_NO_BOX
!       && s->first_glyph->left_box_line_p
!       && s->slice.x == 0)
!     x += abs (s->face->box_line_width);
  
    /* If there is a margin around the image, adjust x- and y-position
       by that margin.  */
!   if (s->slice.x == 0)
!     x += s->img->hmargin;
!   if (s->slice.y == 0)
!     y += s->img->vmargin;
  
    if (s->hl == DRAW_IMAGE_SUNKEN
        || s->hl == DRAW_IMAGE_RAISED)
***************
*** 2749,2760 ****
  
    x0 = x - thick;
    y0 = y - thick;
!   x1 = x + s->img->width + thick - 1;
!   y1 = y + s->img->height + thick - 1;
  
    x_setup_relief_colors (s);
    get_glyph_string_clip_rect (s, &r);
!   x_draw_relief_rect (s->f, x0, y0, x1, y1, thick, raised_p, 1, 1, &r);
  }
  
  
--- 2727,2743 ----
  
    x0 = x - thick;
    y0 = y - thick;
!   x1 = x + s->slice.width + thick - 1;
!   y1 = y + s->slice.height + thick - 1;
  
    x_setup_relief_colors (s);
    get_glyph_string_clip_rect (s, &r);
!   x_draw_relief_rect (s->f, x0, y0, x1, y1, thick, raised_p,
!                     s->slice.y == 0,
!                     s->slice.y + s->slice.height == s->img->height,
!                     s->slice.x == 0,
!                     s->slice.x + s->slice.width == s->img->width,
!                     &r);
  }
  
  
***************
*** 2765,2797 ****
       struct glyph_string *s;
       Pixmap pixmap;
  {
!   int x;
!   int y = s->ybase - s->y - image_ascent (s->img, s->face);
  
    /* If first glyph of S has a left box line, start drawing it to the
       right of that line.  */
    if (s->face->box != FACE_NO_BOX
!       && s->first_glyph->left_box_line_p)
!     x = abs (s->face->box_line_width);
!   else
!     x = 0;
  
    /* If there is a margin around the image, adjust x- and y-position
       by that margin.  */
!   x += s->img->hmargin;
!   y += s->img->vmargin;
  
    if (s->img->pixmap)
      {
        if (s->img->mask)
        mac_copy_area_with_mask_to_pixmap (s->display, s->img->pixmap,
                                           s->img->mask, pixmap, s->gc,
!                                          0, 0, s->img->width, s->img->height,
                                           x, y);
        else
        {
          mac_copy_area_to_pixmap (s->display, s->img->pixmap, pixmap, s->gc,
!                              0, 0, s->img->width, s->img->height, x, y);
  
          /* When the image has a mask, we can expect that at
             least part of a mouse highlight or a block cursor will
--- 2748,2784 ----
       struct glyph_string *s;
       Pixmap pixmap;
  {
!   int x = 0;
!   int y = s->ybase - s->y - image_ascent (s->img, s->face, &s->slice);
  
    /* If first glyph of S has a left box line, start drawing it to the
       right of that line.  */
    if (s->face->box != FACE_NO_BOX
!       && s->first_glyph->left_box_line_p
!       && s->slice.x == 0)
!     x += abs (s->face->box_line_width);
  
    /* If there is a margin around the image, adjust x- and y-position
       by that margin.  */
!   if (s->slice.x == 0)
!     x += s->img->hmargin;
!   if (s->slice.y == 0)
!     y += s->img->vmargin;
  
    if (s->img->pixmap)
      {
        if (s->img->mask)
        mac_copy_area_with_mask_to_pixmap (s->display, s->img->pixmap,
                                           s->img->mask, pixmap, s->gc,
!                                          s->slice.x, s->slice.y,
!                                          s->slice.width, s->slice.height,
                                           x, y);
        else
        {
          mac_copy_area_to_pixmap (s->display, s->img->pixmap, pixmap, s->gc,
!                                  s->slice.x, s->slice.y,
!                                  s->slice.width, s->slice.height,
!                                  x, y);
  
          /* When the image has a mask, we can expect that at
             least part of a mouse highlight or a block cursor will
***************
*** 2804,2818 ****
              int r = s->img->relief;
              if (r < 0) r = -r;
              mac_draw_rectangle (s->display, s->window, s->gc, x - r, y - r,
!                                 s->img->width + r*2 - 1,
!                                 s->img->height + r*2 - 1);
            }
        }
      }
    else
      /* Draw a rectangle if image could not be loaded.  */
      mac_draw_rectangle_to_pixmap (s->display, pixmap, s->gc, x, y,
!                                 s->img->width - 1, s->img->height - 1);
  }
  
  
--- 2791,2805 ----
              int r = s->img->relief;
              if (r < 0) r = -r;
              mac_draw_rectangle (s->display, s->window, s->gc, x - r, y - r,
!                                 s->slice.width + r*2 - 1,
!                                 s->slice.height + r*2 - 1);
            }
        }
      }
    else
      /* Draw a rectangle if image could not be loaded.  */
      mac_draw_rectangle_to_pixmap (s->display, pixmap, s->gc, x, y,
!                                 s->slice.width - 1, s->slice.height - 1);
  }
  
  
***************
*** 2869,2887 ****
       taller than image or if image has a clip mask to reduce
       flickering.  */
    s->stippled_p = s->face->stipple != 0;
!   if (height > s->img->height
        || s->img->hmargin
        || s->img->vmargin
        || s->img->mask
        || s->img->pixmap == 0
        || s->width != s->background_width)
      {
!       if (box_line_hwidth && s->first_glyph->left_box_line_p)
!       x = s->x + box_line_hwidth;
!       else
!       x = s->x;
! 
!       y = s->y + box_line_vwidth;
  
        if (s->img->mask)
        {
--- 2856,2876 ----
       taller than image or if image has a clip mask to reduce
       flickering.  */
    s->stippled_p = s->face->stipple != 0;
!   if (height > s->slice.height
        || s->img->hmargin
        || s->img->vmargin
        || s->img->mask
        || s->img->pixmap == 0
        || s->width != s->background_width)
      {
!       x = s->x;
!       if (s->first_glyph->left_box_line_p
!         && s->slice.x == 0)
!       x += box_line_hwidth;
! 
!       y = s->y;
!       if (s->slice.y == 0)
!       y += box_line_vwidth;
  
        if (s->img->mask)
        {
***************
*** 3695,3705 ****
  
    mouseLoc = event->where;
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (FRAME_MAC_WINDOW (f)));
! #else
!   SetPort (FRAME_MAC_WINDOW (f));
! #endif
  
    GlobalToLocal (&mouseLoc);
    XSETINT (result->x, mouseLoc.h);
--- 3684,3690 ----
  
    mouseLoc = event->where;
  
!   SetPortWindowPort (FRAME_MAC_WINDOW (f));
  
    GlobalToLocal (&mouseLoc);
    XSETINT (result->x, mouseLoc.h);
***************
*** 3728,3733 ****
--- 3713,3719 ----
       FRAME_PTR frame;
       Point *pos;
  {
+   struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (frame);
  #if TARGET_API_MAC_CARBON
    Rect r;
  #endif
***************
*** 3742,3750 ****
    if (!PtInRect (*pos, &FRAME_MAC_WINDOW (frame)->portRect))
  #endif
      {
!       frame->mouse_moved = 1;
!       last_mouse_scroll_bar = Qnil;
!       note_mouse_highlight (frame, -1, -1);
      }
    /* Has the mouse moved off the glyph it was on at the last sighting?  */
    else if (pos->h < last_mouse_glyph.left
--- 3728,3744 ----
    if (!PtInRect (*pos, &FRAME_MAC_WINDOW (frame)->portRect))
  #endif
      {
!       if (frame == dpyinfo->mouse_face_mouse_frame)
!       /* This case corresponds to LeaveNotify in X11.  */
!       {
!         /* If we move outside the frame, then we're certainly no
!            longer on any text in the frame.  */
!         clear_mouse_face (dpyinfo);
!         dpyinfo->mouse_face_mouse_frame = 0;
!         if (!dpyinfo->grabbed)
!           rif->define_frame_cursor (frame,
!                                     frame->output_data.mac->nontext_cursor);
!       }
      }
    /* Has the mouse moved off the glyph it was on at the last sighting?  */
    else if (pos->h < last_mouse_glyph.left
***************
*** 3842,3848 ****
  
            /* 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);
--- 3836,3842 ----
  
            /* 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);
***************
*** 3892,3897 ****
--- 3886,3908 ----
  }
  
  
+ static WindowPtr
+ mac_front_window ()
+ {
+ #if TARGET_API_MAC_CARBON
+   return GetFrontWindowOfClass (kDocumentWindowClass, true);
+ #else
+   WindowPtr front_window = FrontWindow ();
+ 
+   if (tip_window && front_window == tip_window)
+     return GetNextWindow (front_window);
+   else
+     return front_window;
+ #endif
+ }
+ 
+ #define mac_window_to_frame(wp) (((mac_output *) GetWRefCon (wp))->mFP)
+ 
  /* Return the current position of the mouse.
     *fp should be a frame which indicates which display to ask about.
  
***************
*** 3923,3934 ****
  {
    Point mouse_pos;
    int ignore1, ignore2;
!   WindowPtr wp = FrontWindow ();
    struct frame *f;
    Lisp_Object frame, tail;
  
    if (is_emacs_window(wp))
!     f = ((mac_output *) GetWRefCon (wp))->mFP;
  
    BLOCK_INPUT;
  
--- 3934,3945 ----
  {
    Point mouse_pos;
    int ignore1, ignore2;
!   WindowPtr wp = mac_front_window ();
    struct frame *f;
    Lisp_Object frame, tail;
  
    if (is_emacs_window(wp))
!     f = mac_window_to_frame (wp);
  
    BLOCK_INPUT;
  
***************
*** 3942,3952 ****
  
        last_mouse_scroll_bar = Qnil;
  
! #if TARGET_API_MAC_CARBON
!       SetPort (GetWindowPort (wp));
! #else
!       SetPort (wp);
! #endif
  
        GetMouse (&mouse_pos);
  
--- 3953,3959 ----
  
        last_mouse_scroll_bar = Qnil;
  
!       SetPortWindowPort (wp);
  
        GetMouse (&mouse_pos);
  
***************
*** 3984,3990 ****
    if (button_event->what == mouseDown)
      handle_tool_bar_click (f, x, y, 1, 0);
    else
!     handle_tool_bar_click (f, x, y, 0, 
                           x_mac_to_emacs_modifiers (FRAME_MAC_DISPLAY_INFO (f),
                                                     button_event->modifiers));
  }
--- 3991,3997 ----
    if (button_event->what == mouseDown)
      handle_tool_bar_click (f, x, y, 1, 0);
    else
!     handle_tool_bar_click (f, x, y, 0,
                           x_mac_to_emacs_modifiers (FRAME_MAC_DISPLAY_INFO (f),
                                                     button_event->modifiers));
  }
***************
*** 4441,4446 ****
--- 4448,4455 ----
       EventRecord *er;
       struct input_event *bufp;
  {
+   int win_y, top_range;
+ 
    if (! GC_WINDOWP (bar->window))
      abort ();
  
***************
*** 4475,4480 ****
--- 4484,4507 ----
        bufp->part = scroll_bar_handle;
        break;
      }
+ 
+   win_y = XINT (bufp->y) - XINT (bar->top);
+   top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (0/*dummy*/, XINT (bar->height));
+ 
+   win_y -= VERTICAL_SCROLL_BAR_TOP_BORDER;
+ 
+   win_y -= 24;
+ 
+   if (! NILP (bar->dragging))
+     win_y -= XINT (bar->dragging);
+ 
+   if (win_y < 0)
+     win_y = 0;
+   if (win_y > top_range)
+     win_y = top_range;
+ 
+   XSETINT (bufp->x, win_y);
+   XSETINT (bufp->y, top_range);
  }
  
  
***************
*** 4524,4539 ****
       unsigned long *time;
  {
    struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar);
!   WindowPtr wp = FrontWindow ();
    Point mouse_pos;
!   struct frame *f = ((mac_output *) GetWRefCon (wp))->mFP;
    int win_y, top_range;
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (wp));
! #else
!   SetPort (wp);
! #endif
  
    GetMouse (&mouse_pos);
  
--- 4551,4562 ----
       unsigned long *time;
  {
    struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar);
!   WindowPtr wp = mac_front_window ();
    Point mouse_pos;
!   struct frame *f = mac_window_to_frame (wp);
    int win_y, top_range;
  
!   SetPortWindowPort (wp);
  
    GetMouse (&mouse_pos);
  
***************
*** 4645,4651 ****
    /* Compute the proper height and ascent of the rectangle, based
       on the actual glyph.  Using the full height of the row looks
       bad when there are tall images on that row.  */
!   h = max (FRAME_LINE_HEIGHT (f), cursor_glyph->ascent + 
cursor_glyph->descent);
    if (h < row->height)
      y += row->ascent /* - w->phys_cursor_ascent */ + cursor_glyph->descent - 
h;
    h--;
--- 4668,4675 ----
    /* Compute the proper height and ascent of the rectangle, based
       on the actual glyph.  Using the full height of the row looks
       bad when there are tall images on that row.  */
!   h = max (min (FRAME_LINE_HEIGHT (f), row->height),
!          cursor_glyph->ascent + cursor_glyph->descent);
    if (h < row->height)
      y += row->ascent /* - w->phys_cursor_ascent */ + cursor_glyph->descent - 
h;
    h--;
***************
*** 4759,4765 ****
       struct frame *f;
       Cursor cursor;
  {
!   /* MAC TODO */
  }
  
  
--- 4783,4793 ----
       struct frame *f;
       Cursor cursor;
  {
! #if TARGET_API_MAC_CARBON
!   SetThemeCursor (cursor);
! #else
!   SetCursor (*cursor);
! #endif
  }
  
  
***************
*** 4933,4939 ****
    if (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) > 0)
      {
        int wid = FRAME_COLUMN_WIDTH (f);
!       FRAME_CONFIG_SCROLL_BAR_COLS (f) 
        = (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) + wid-1) / wid;
      }
    else
--- 4961,4967 ----
    if (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) > 0)
      {
        int wid = FRAME_COLUMN_WIDTH (f);
!       FRAME_CONFIG_SCROLL_BAR_COLS (f)
        = (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) + wid-1) / wid;
      }
    else
***************
*** 5027,5037 ****
        GrafPtr savePort;
        GetPort (&savePort);
  
! #if TARGET_API_MAC_CARBON
!       SetPort (GetWindowPort (FRAME_MAC_WINDOW (f)));
! #else
!       SetPort (FRAME_MAC_WINDOW (f));
! #endif
  
  #if TARGET_API_MAC_CARBON
        {
--- 5055,5061 ----
        GrafPtr savePort;
        GetPort (&savePort);
  
!       SetPortWindowPort (FRAME_MAC_WINDOW (f));
  
  #if TARGET_API_MAC_CARBON
        {
***************
*** 5406,5415 ****
       struct frame *f;
  {
    struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f);
  
    BLOCK_INPUT;
  
!   DisposeWindow (FRAME_MAC_WINDOW (f));
  
    free_frame_menubar (f);
  
--- 5430,5444 ----
       struct frame *f;
  {
    struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f);
+   WindowPtr wp = FRAME_MAC_WINDOW (f);
  
    BLOCK_INPUT;
  
!   DisposeWindow (wp);
!   if (wp == tip_window)
!     /* Neither WaitNextEvent nor ReceiveNextEvent receives `window
!        closed' event.  So we reset tip_window here.  */
!     tip_window = NULL;
  
    free_frame_menubar (f);
  
***************
*** 5826,5832 ****
        break;
      case smKorean:
        coding_system = Qeuc_kr;
!       break;        
      default:
        return;
      }
--- 5855,5861 ----
        break;
      case smKorean:
        coding_system = Qeuc_kr;
!       break;
      default:
        return;
      }
***************
*** 6277,6283 ****
          if (fast_string_match (pattern_regex, fontname) >= 0)
            {
              font_list = Fcons (fontname, font_list);
!             
              n_fonts++;
              if (maxnames > 0 && n_fonts >= maxnames)
                break;
--- 6306,6312 ----
          if (fast_string_match (pattern_regex, fontname) >= 0)
            {
              font_list = Fcons (fontname, font_list);
! 
              n_fonts++;
              if (maxnames > 0 && n_fonts >= maxnames)
                break;
***************
*** 6933,6938 ****
--- 6962,6972 ----
  
  Point saved_menu_event_location;
  
+ #if !TARGET_API_MAC_CARBON
+ /* Place holder for the default arrow cursor.  */
+ CursPtr arrow_cursor;
+ #endif
+ 
  /* Apple Events */
  static void init_required_apple_events (void);
  static pascal OSErr
***************
*** 6982,6993 ****
  mac_get_emulated_btn ( UInt32 modifiers )
  {
    int result = 0;
!   if (Vmac_emulate_three_button_mouse != Qnil) {
!     int cmdIs3 = (Vmac_emulate_three_button_mouse != Qreverse);
      if (modifiers & controlKey)
        result = cmdIs3 ? 2 : 1;
      else if (modifiers & optionKey)
!       result = cmdIs3 ? 1 : 2;      
    }
    return result;
  }
--- 7016,7027 ----
  mac_get_emulated_btn ( UInt32 modifiers )
  {
    int result = 0;
!   if (!NILP (Vmac_emulate_three_button_mouse)) {
!     int cmdIs3 = !EQ (Vmac_emulate_three_button_mouse, Qreverse);
      if (modifiers & controlKey)
        result = cmdIs3 ? 2 : 1;
      else if (modifiers & optionKey)
!       result = cmdIs3 ? 1 : 2;
    }
    return result;
  }
***************
*** 7001,7007 ****
    UInt32 mods = 0;
    GetEventParameter (eventRef, kEventParamKeyModifiers, typeUInt32, NULL,
                    sizeof (UInt32), NULL, &mods);
!   if (Vmac_emulate_three_button_mouse != Qnil &&
        GetEventClass(eventRef) == kEventClassMouse)
      {
        mods &= ~(optionKey & cmdKey);
--- 7035,7041 ----
    UInt32 mods = 0;
    GetEventParameter (eventRef, kEventParamKeyModifiers, typeUInt32, NULL,
                    sizeof (UInt32), NULL, &mods);
!   if (!NILP (Vmac_emulate_three_button_mouse) &&
        GetEventClass(eventRef) == kEventClassMouse)
      {
        mods &= ~(optionKey & cmdKey);
***************
*** 7020,7026 ****
    switch (result)
      {
      case kEventMouseButtonPrimary:
!       if (Vmac_emulate_three_button_mouse == Qnil) 
        return 0;
        else {
        UInt32 mods = 0;
--- 7054,7060 ----
    switch (result)
      {
      case kEventMouseButtonPrimary:
!       if (NILP (Vmac_emulate_three_button_mouse))
        return 0;
        else {
        UInt32 mods = 0;
***************
*** 7119,7124 ****
--- 7153,7160 ----
    InitCursor ();
  
  #if !TARGET_API_MAC_CARBON
+   arrow_cursor = &qd.arrow;
+ 
    /* set up some extra stack space for use by emacs */
    SetApplLimit ((Ptr) ((long) GetApplLimit () - EXTRA_STACK_ALLOC));
  
***************
*** 7147,7154 ****
  static void
  do_window_update (WindowPtr win)
  {
!   struct mac_output *mwp = (mac_output *) GetWRefCon (win);
!   struct frame *f = mwp->mFP;
  
    if (f)
      {
--- 7183,7194 ----
  static void
  do_window_update (WindowPtr win)
  {
!   struct frame *f = mac_window_to_frame (win);
! 
!   if (win == tip_window)
!     /* The tooltip has been drawn already.  Avoid the
!        SET_FRAME_GARBAGED below.  */
!     return;
  
    if (f)
      {
***************
*** 7199,7211 ****
  static void
  do_window_activate (WindowPtr win)
  {
-   mac_output *mwp;
    struct frame *f;
  
    if (is_emacs_window (win))
      {
!       mwp = (mac_output *) GetWRefCon (win);
!       f = mwp->mFP;
  
        if (f)
        {
--- 7239,7249 ----
  static void
  do_window_activate (WindowPtr win)
  {
    struct frame *f;
  
    if (is_emacs_window (win))
      {
!       f = mac_window_to_frame (win);
  
        if (f)
        {
***************
*** 7218,7230 ****
  static void
  do_window_deactivate (WindowPtr win)
  {
-   mac_output *mwp;
    struct frame *f;
  
    if (is_emacs_window (win))
      {
!       mwp = (mac_output *) GetWRefCon (win);
!       f = mwp->mFP;
  
        if (f == FRAME_MAC_DISPLAY_INFO (f)->x_focus_frame)
        {
--- 7256,7266 ----
  static void
  do_window_deactivate (WindowPtr win)
  {
    struct frame *f;
  
    if (is_emacs_window (win))
      {
!       f = mac_window_to_frame (win);
  
        if (f == FRAME_MAC_DISPLAY_INFO (f)->x_focus_frame)
        {
***************
*** 7238,7251 ****
  do_app_resume ()
  {
    WindowPtr wp;
-   mac_output *mwp;
    struct frame *f;
  
!   wp = FrontWindow();
    if (is_emacs_window (wp))
      {
!       mwp = (mac_output *) GetWRefCon (wp);
!       f = mwp->mFP;
  
        if (f)
        {
--- 7274,7285 ----
  do_app_resume ()
  {
    WindowPtr wp;
    struct frame *f;
  
!   wp = mac_front_window ();
    if (is_emacs_window (wp))
      {
!       f = mac_window_to_frame (wp);
  
        if (f)
        {
***************
*** 7262,7275 ****
  do_app_suspend ()
  {
    WindowPtr wp;
-   mac_output *mwp;
    struct frame *f;
  
!   wp = FrontWindow();
    if (is_emacs_window (wp))
      {
!       mwp = (mac_output *) GetWRefCon (wp);
!       f = mwp->mFP;
  
        if (f == FRAME_MAC_DISPLAY_INFO (f)->x_focus_frame)
        {
--- 7296,7307 ----
  do_app_suspend ()
  {
    WindowPtr wp;
    struct frame *f;
  
!   wp = mac_front_window ();
    if (is_emacs_window (wp))
      {
!       f = mac_window_to_frame (wp);
  
        if (f == FRAME_MAC_DISPLAY_INFO (f)->x_focus_frame)
        {
***************
*** 7284,7350 ****
  
  
  static void
! do_mouse_moved (Point mouse_pos)
  {
!   WindowPtr wp = FrontWindow ();
!   struct frame *f;
  
    if (is_emacs_window (wp))
      {
!       f = ((mac_output *) GetWRefCon (wp))->mFP;
! 
! #if TARGET_API_MAC_CARBON
!       SetPort (GetWindowPort (wp));
! #else
!       SetPort (wp);
! #endif
  
!       GlobalToLocal (&mouse_pos);
  
!       note_mouse_movement (f, &mouse_pos);
!     }
! }
  
  
! static void
! do_os_event (EventRecord *erp)
! {
!   switch((erp->message >> 24) & 0x000000FF)
!     {
!     case suspendResumeMessage:
!       if((erp->message & resumeFlag) == 1)
!       do_app_resume ();
        else
!       do_app_suspend ();
!       break;
! 
!     case mouseMovedMessage:
!       do_mouse_moved (erp->where);
!       break;
      }
  }
  
- static void
- do_events (EventRecord *erp)
- {
-   switch (erp->what)
-     {
-     case updateEvt:
-       do_window_update ((WindowPtr) erp->message);
-       break;
- 
-     case osEvt:
-       do_os_event (erp);
-       break;
- 
-     case activateEvt:
-       if ((erp->modifiers & activeFlag) != 0)
-       do_window_activate ((WindowPtr) erp->message);
-       else
-       do_window_deactivate ((WindowPtr) erp->message);
-       break;
-     }
- }
  
  static void
  do_apple_menu (SInt16 menu_item)
--- 7316,7353 ----
  
  
  static void
! do_mouse_moved (mouse_pos, f)
!      Point mouse_pos;
!      FRAME_PTR *f;
  {
!   WindowPtr wp = mac_front_window ();
!   struct x_display_info *dpyinfo;
  
    if (is_emacs_window (wp))
      {
!       *f = mac_window_to_frame (wp);
!       dpyinfo = FRAME_MAC_DISPLAY_INFO (*f);
  
!       if (dpyinfo->mouse_face_hidden)
!       {
!         dpyinfo->mouse_face_hidden = 0;
!         clear_mouse_face (dpyinfo);
!       }
  
!       SetPortWindowPort (wp);
  
+       GlobalToLocal (&mouse_pos);
  
!       if (dpyinfo->grabbed && tracked_scroll_bar)
!       x_scroll_bar_note_movement (tracked_scroll_bar,
!                                   mouse_pos.v
!                                   - XINT (tracked_scroll_bar->top),
!                                   TickCount() * (1000 / 60));
        else
!       note_mouse_movement (*f, &mouse_pos);
      }
  }
  
  
  static void
  do_apple_menu (SInt16 menu_item)
***************
*** 7382,7389 ****
  
      default:
        {
!         WindowPtr wp = FrontWindow ();
!         struct frame *f = ((mac_output *) GetWRefCon (wp))->mFP;
          MenuHandle menu = GetMenuHandle (menu_id);
          if (menu)
            {
--- 7385,7391 ----
  
      default:
        {
!         struct frame *f = mac_window_to_frame (mac_front_window ());
          MenuHandle menu = GetMenuHandle (menu_id);
          if (menu)
            {
***************
*** 7408,7415 ****
    long grow_size;
    Rect limit_rect;
    int rows, columns;
!   mac_output *mwp = (mac_output *) GetWRefCon (w);
!   struct frame *f = mwp->mFP;
  
    SetRect(&limit_rect, MIN_DOC_SIZE, MIN_DOC_SIZE, MAX_DOC_SIZE, 
MAX_DOC_SIZE);
  
--- 7410,7416 ----
    long grow_size;
    Rect limit_rect;
    int rows, columns;
!   struct frame *f = mac_window_to_frame (w);
  
    SetRect(&limit_rect, MIN_DOC_SIZE, MIN_DOC_SIZE, MAX_DOC_SIZE, 
MAX_DOC_SIZE);
  
***************
*** 7438,7453 ****
    Rect zoom_rect, port_rect;
    Point top_left;
    int w_title_height, columns, rows, width, height, dummy, x, y;
!   mac_output *mwp = (mac_output *) GetWRefCon (w);
!   struct frame *f = mwp->mFP;
  
    GetPort (&save_port);
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (w));
! #else
!   SetPort (w);
! #endif
  
    /* Clear window to avoid flicker.  */
  #if TARGET_API_MAC_CARBON
--- 7439,7449 ----
    Rect zoom_rect, port_rect;
    Point top_left;
    int w_title_height, columns, rows, width, height, dummy, x, y;
!   struct frame *f = mac_window_to_frame (w);
  
    GetPort (&save_port);
  
!   SetPortWindowPort (w);
  
    /* Clear window to avoid flicker.  */
  #if TARGET_API_MAC_CARBON
***************
*** 7500,7506 ****
      }
  #endif /* not TARGET_API_MAC_CARBON */
  
!   ZoomWindow (w, zoom_in_or_out, w == FrontWindow ());
  
    /* retrieve window size and update application values */
  #if TARGET_API_MAC_CARBON
--- 7496,7502 ----
      }
  #endif /* not TARGET_API_MAC_CARBON */
  
!   ZoomWindow (w, zoom_in_or_out, w == mac_front_window ());
  
    /* retrieve window size and update application values */
  #if TARGET_API_MAC_CARBON
***************
*** 7510,7516 ****
  #endif
    rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, port_rect.bottom - 
port_rect.top);
    columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, port_rect.right - 
port_rect.left);
!   x_set_window_size (mwp->mFP, 0, columns, rows);
  
    SetPort (save_port);
  }
--- 7506,7512 ----
  #endif
    rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, port_rect.bottom - 
port_rect.top);
    columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, port_rect.right - 
port_rect.left);
!   x_set_window_size (f, 0, columns, rows);
  
    SetPort (save_port);
  }
***************
*** 7841,7848 ****
      {
        struct input_event event;
        Lisp_Object frame;
!       struct frame *f = ((mac_output *) GetWRefCon(window))->mFP;
!       SetPort (GetWindowPort (window));
        GlobalToLocal (&mouse);
  
        event.kind = DRAG_N_DROP_EVENT;
--- 7837,7844 ----
      {
        struct input_event event;
        Lisp_Object frame;
!       struct frame *f = mac_window_to_frame (window);
!       SetPortWindowPort (window);
        GlobalToLocal (&mouse);
  
        event.kind = DRAG_N_DROP_EVENT;
***************
*** 8016,8041 ****
  /* Emacs calls this whenever it wants to read an input event from the
     user. */
  int
! XTread_socket (int sd, int expected, struct input_event *hold_quit)
  {
    struct input_event inev;
    int count = 0;
  #if USE_CARBON_EVENTS
-   OSStatus rneResult;
    EventRef eventRef;
!   EventMouseButton mouseBtn;
  #endif
    EventRecord er;
!   int the_modifiers;
!   EventMask event_mask;
  
- #if 0
    if (interrupt_input_blocked)
      {
        interrupt_input_pending = 1;
        return -1;
      }
- #endif
  
    interrupt_input_pending = 0;
    BLOCK_INPUT;
--- 8012,8037 ----
  /* Emacs calls this whenever it wants to read an input event from the
     user. */
  int
! XTread_socket (sd, expected, hold_quit)
!      int sd, expected;
!      struct input_event *hold_quit;
  {
    struct input_event inev;
    int count = 0;
  #if USE_CARBON_EVENTS
    EventRef eventRef;
!   EventTargetRef toolbox_dispatcher = GetEventDispatcherTarget ();
! #else
!   EventMask event_mask;
  #endif
    EventRecord er;
!   struct mac_display_info *dpyinfo = &one_mac_display_info;
  
    if (interrupt_input_blocked)
      {
        interrupt_input_pending = 1;
        return -1;
      }
  
    interrupt_input_pending = 0;
    BLOCK_INPUT;
***************
*** 8057,8082 ****
    if (terminate_flag)
      Fkill_emacs (make_number (1));
  
!   /* It is necessary to set this (additional) argument slot of an
!      event to nil because keyboard.c protects incompletely processed
!      event from being garbage collected by placing them in the
!      kbd_buffer_gcpro vector.  */
!   EVENT_INIT (inev);
!   inev.kind = NO_EVENT;
!   inev.arg = Qnil;
! 
    event_mask = everyEvent;
    if (NILP (Fboundp (Qmac_ready_for_drag_n_drop)))
      event_mask -= highLevelEventMask;
  
  #if USE_CARBON_EVENTS
-   rneResult = ReceiveNextEvent (0, NULL,
-                               expected
-                               ? TicksToEventTime (app_sleep_time)
-                               : 0,
-                               kEventRemoveFromQueue, &eventRef);
-   if (!rneResult)
-     {
        /* Handle new events */
        if (!mac_convert_event_ref (eventRef, &er))
        switch (GetEventClass (eventRef))
--- 8053,8085 ----
    if (terminate_flag)
      Fkill_emacs (make_number (1));
  
! #if !USE_CARBON_EVENTS
    event_mask = everyEvent;
    if (NILP (Fboundp (Qmac_ready_for_drag_n_drop)))
      event_mask -= highLevelEventMask;
  
+   while (WaitNextEvent (event_mask, &er,
+                       (expected ? app_sleep_time : 0L), NULL))
+ #else
+   while (!ReceiveNextEvent (0, NULL,
+                           (expected ? TicksToEventTime (app_sleep_time) : 0),
+                           kEventRemoveFromQueue, &eventRef))
+ #endif /* !USE_CARBON_EVENTS */
+     {
+       int do_help = 0;
+       struct frame *f;
+ 
+       expected = 0;
+ 
+       /* It is necessary to set this (additional) argument slot of an
+        event to nil because keyboard.c protects incompletely
+        processed event from being garbage collected by placing them
+        in the kbd_buffer_gcpro vector.  */
+       EVENT_INIT (inev);
+       inev.kind = NO_EVENT;
+       inev.arg = Qnil;
+ 
  #if USE_CARBON_EVENTS
        /* Handle new events */
        if (!mac_convert_event_ref (eventRef, &er))
        switch (GetEventClass (eventRef))
***************
*** 8086,8098 ****
              {
                SInt32 delta;
                Point point;
!               WindowPtr window_ptr = FrontNonFloatingWindow ();
!               struct mac_output *mwp = (mac_output *) GetWRefCon (window_ptr);
                if (!IsValidWindowPtr (window_ptr))
                  {
                    SysBeep(1);
!                   UNBLOCK_INPUT;
!                   return 0;
                  }
  
                GetEventParameter(eventRef, kEventParamMouseWheelDelta,
--- 8089,8100 ----
              {
                SInt32 delta;
                Point point;
!               WindowPtr window_ptr = mac_front_window ();
! 
                if (!IsValidWindowPtr (window_ptr))
                  {
                    SysBeep(1);
!                   break;
                  }
  
                GetEventParameter(eventRef, kEventParamMouseWheelDelta,
***************
*** 8103,8559 ****
                                  NULL, &point);
                inev.kind = WHEEL_EVENT;
                inev.code = 0;
!               inev.modifiers = (mac_event_to_emacs_modifiers(eventRef)
                                  | ((delta < 0) ? down_modifier
                                     : up_modifier));
!               SetPort (GetWindowPort (window_ptr));
                GlobalToLocal (&point);
                XSETINT (inev.x, point.h);
                XSETINT (inev.y, point.v);
!               XSETFRAME (inev.frame_or_window, mwp->mFP);
                inev.timestamp = EventTimeToTicks (GetEventTime 
(eventRef))*(1000/60);
              }
            else
!             SendEventToEventTarget (eventRef, GetEventDispatcherTarget ());
  
            break;
          default:
            /* Send the event to the appropriate receiver.  */
!           SendEventToEventTarget (eventRef, GetEventDispatcherTarget ());
          }
        else
- #else
-   if (WaitNextEvent (event_mask, &er, (expected ? app_sleep_time : 0L), NULL))
  #endif /* USE_CARBON_EVENTS */
!     switch (er.what)
!       {
!       case mouseDown:
!       case mouseUp:
        {
!         WindowPtr window_ptr = FrontWindow ();
!         SInt16 part_code;
  
  #if USE_CARBON_EVENTS
!         /* This is needed to send mouse events like aqua window buttons
!            to the correct handler.  */
!         if (eventNotHandledErr != SendEventToEventTarget (eventRef, 
GetEventDispatcherTarget ())) {
!           break;
!         }
  
!         if (!is_emacs_window(window_ptr))
!           break;
  #endif
  
!           if (mouse_tracking_in_progress == mouse_tracking_scroll_bar
!             && er.what == mouseUp)
!             {
!             struct mac_output *mwp = (mac_output *) GetWRefCon (window_ptr);
!             Point mouse_loc = er.where;
  
!             /* Convert to local coordinates of new window.  */
  #if TARGET_API_MAC_CARBON
!               SetPort (GetWindowPort (window_ptr));
  #else
!               SetPort (window_ptr);
  #endif
  
-             GlobalToLocal (&mouse_loc);
- 
  #if USE_CARBON_EVENTS
!             inev.code = mac_get_mouse_btn (eventRef);
  #else
!             inev.code = mac_get_emulate_btn (er.modifiers);
  #endif
!               inev.kind = SCROLL_BAR_CLICK_EVENT;
!               inev.frame_or_window = tracked_scroll_bar->window;
!               inev.part = scroll_bar_handle;
! #if USE_CARBON_EVENTS
!             inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
  #else
!             inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
  #endif
!               inev.modifiers |= up_modifier;
!             inev.timestamp = er.when * (1000 / 60);
!               /* ticks to milliseconds */
! 
!               XSETINT (inev.x, tracked_scroll_bar->left + 2);
!               XSETINT (inev.y, mouse_loc.v - 24);
!               tracked_scroll_bar->dragging = Qnil;
!               mouse_tracking_in_progress = mouse_tracking_none;
!               tracked_scroll_bar = NULL;
!               break;
!             }
  
!         part_code = FindWindow (er.where, &window_ptr);
  
!         switch (part_code)
!           {
!           case inMenuBar:
!             if (er.what == mouseDown)  
!               {
!                 struct frame *f = ((mac_output *)
!                                    GetWRefCon (FrontWindow ()))->mFP;
!                 saved_menu_event_location = er.where;
!                 inev.kind = MENU_BAR_ACTIVATE_EVENT;
!                 XSETFRAME (inev.frame_or_window, f);
!               }
!             break;
  
!           case inContent:
!             if (window_ptr != FrontWindow ())
!               SelectWindow (window_ptr);
!             else
!               {
!                 SInt16 control_part_code;
!                 ControlHandle ch;
!                 struct mac_output *mwp = (mac_output *)
!                   GetWRefCon (window_ptr);
!                 Point mouse_loc = er.where;
  
!                 /* convert to local coordinates of new window */
! #if TARGET_API_MAC_CARBON
!                   SetPort (GetWindowPort (window_ptr));
! #else
!                   SetPort (window_ptr);
! #endif
  
!                 GlobalToLocal (&mouse_loc);
! #if TARGET_API_MAC_CARBON
!                 ch = FindControlUnderMouse (mouse_loc, window_ptr,
!                                             &control_part_code);
! #else
!                 control_part_code = FindControl (mouse_loc, window_ptr, &ch);
! #endif
  
! #if USE_CARBON_EVENTS
!                 inev.code = mac_get_mouse_btn (eventRef);
! #else
!                 inev.code = mac_get_emulate_btn (er.modifiers);
! #endif
!                 XSETINT (inev.x, mouse_loc.h);
!                 XSETINT (inev.y, mouse_loc.v);
!                 inev.timestamp = er.when * (1000 / 60);
!                   /* ticks to milliseconds */
  
! #if TARGET_API_MAC_CARBON
!                 if (ch != 0)
! #else
!                 if (control_part_code != 0)
! #endif
!                   {
!                     struct scroll_bar *bar = (struct scroll_bar *)
!                       GetControlReference (ch);
!                     x_scroll_bar_handle_click (bar, control_part_code, &er,
!                                                &inev);
!                     if (er.what == mouseDown
!                         && control_part_code == kControlIndicatorPart)
!                       {
!                         mouse_tracking_in_progress
!                           = mouse_tracking_scroll_bar;
!                         tracked_scroll_bar = bar;
!                       }
!                     else
!                       {
!                         mouse_tracking_in_progress = mouse_tracking_none;
!                         tracked_scroll_bar = NULL;
!                       }
!                   }
!                 else
!                   {
!                     Lisp_Object window;
! 
!                     XSETFRAME (inev.frame_or_window, mwp->mFP);
!                     if (er.what == mouseDown)
!                       mouse_tracking_in_progress
!                         = mouse_tracking_mouse_movement;
!                     else
!                       mouse_tracking_in_progress = mouse_tracking_none;
!                     window = window_from_coordinates (mwp->mFP, inev.x, 
inev.y, 0, 0, 0, 1);
!                     
!                     if (EQ (window, mwp->mFP->tool_bar_window))
!                       {
!                         if (er.what == mouseDown)
!                           handle_tool_bar_click (mwp->mFP, inev.x, inev.y, 1, 
0);
!                         else
!                           handle_tool_bar_click (mwp->mFP, inev.x, inev.y, 0,
  #if USE_CARBON_EVENTS
!                                                  mac_event_to_emacs_modifiers 
(eventRef)
! #else
!                                                  er.modifiers
  #endif
!                                                  );
!                         break;
!                       }
!                     else
!                       inev.kind = MOUSE_CLICK_EVENT;
!                   }
  
  #if USE_CARBON_EVENTS
!                 inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
! #else
!                 inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
  #endif
! 
!                 switch (er.what)
!                   {
!                   case mouseDown:
!                     inev.modifiers |= down_modifier;
!                     break;
!                   case mouseUp:
!                     inev.modifiers |= up_modifier;
!                     break;
!                   }
!               }
              break;
  
!           case inDrag:
! #if TARGET_API_MAC_CARBON
!               if (er.what == mouseDown)  
!               {
!                 BitMap bm;
!                 
!                 GetQDGlobalsScreenBits (&bm);
!                 DragWindow (window_ptr, er.where, &bm.bounds);
!               }
! #else /* not TARGET_API_MAC_CARBON */
!             DragWindow (window_ptr, er.where, &qd.screenBits.bounds);
! #endif /* not TARGET_API_MAC_CARBON */
              break;
  
!           case inGoAway:
!             if (TrackGoAway (window_ptr, er.where))
!               {
!                 inev.kind = DELETE_WINDOW_EVENT;
!                 XSETFRAME (inev.frame_or_window,
!                            ((mac_output *) GetWRefCon (window_ptr))->mFP);
!               }
              break;
  
!           /* window resize handling added --ben */
!           case inGrow:
!               if (er.what == mouseDown)  
!               {
!                 do_grow_window(window_ptr, &er);
!                 break;
!               }
  
!           /* window zoom handling added --ben */
!           case inZoomIn:
!           case inZoomOut:
!             if (TrackBox (window_ptr, er.where, part_code))
!               do_zoom_window (window_ptr, part_code);
!             break;
  
!           default:
!             break;
!           }
!       }
!       break;
  
!       case updateEvt:
!       case osEvt:
!       case activateEvt:
! #if USE_CARBON_EVENTS
!       if (eventNotHandledErr == SendEventToEventTarget (eventRef, 
GetEventDispatcherTarget ()))
! #endif
!       do_events (&er);
!       break;
  
!       case keyDown:
!       case autoKey:
!       {
!         int keycode = (er.message & keyCodeMask) >> 8;
!         int xkeysym;
  
  #if USE_CARBON_EVENTS
!         /* When using Carbon Events, we need to pass raw keyboard events
!            to the TSM ourselves.  If TSM handles it, it will pass back
!            noErr, otherwise it will pass back "eventNotHandledErr" and
!            we can process it normally.   */
!         if ((!NILP (Vmac_pass_command_to_system)
!              || !(er.modifiers & cmdKey))
!             && (!NILP (Vmac_pass_control_to_system)
!                 || !(er.modifiers & controlKey)))
!           {
!             OSStatus err;
!             err = SendEventToEventTarget (eventRef,
!                                           GetEventDispatcherTarget ());
!             if (err != eventNotHandledErr)
                break;
-           }
  #endif
  
!         if (!IsValidWindowPtr (FrontNonFloatingWindow ()))
!           {
!             SysBeep (1);
!             UNBLOCK_INPUT;
!             return 0;
!           }
! 
!         ObscureCursor ();
! 
!         if (keycode_to_xkeysym (keycode, &xkeysym))
!           {
!             inev.code = 0xff00 | xkeysym;
!             inev.kind = NON_ASCII_KEYSTROKE_EVENT;
!           }
!         else
!           {
!             if (er.modifiers & (controlKey |
!                                 (NILP (Vmac_command_key_is_meta) ? optionKey
!                                  : cmdKey)))
!               {
!                 /* This code comes from Keyboard Resource, Appendix
!                    C of IM - Text.  This is necessary since shift is
!                    ignored in KCHR table translation when option or
!                    command is pressed.  It also does not translate
!                    correctly control-shift chars like C-% so mask off
!                    shift here also */
!                 int new_modifiers = er.modifiers & 0xe600;
!                 /* mask off option and command */
!                 int new_keycode = keycode | new_modifiers;
!                 Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache);
!                 unsigned long some_state = 0;
!                 inev.code = KeyTranslate (kchr_ptr, new_keycode,
!                                           &some_state) & 0xff;
!               }
!             else
!               inev.code = er.message & charCodeMask;
!             inev.kind = ASCII_KEYSTROKE_EVENT;
!           }
!       }
  
!       /* If variable mac-convert-keyboard-input-to-latin-1 is non-nil,
!          convert non-ASCII characters typed at the Mac keyboard
!          (presumed to be in the Mac Roman encoding) to iso-latin-1
!          encoding before they are passed to Emacs.  This enables the
!          Mac keyboard to be used to enter non-ASCII iso-latin-1
!          characters directly.  */
!       if (mac_keyboard_text_encoding != kTextEncodingMacRoman
!           && inev.kind == ASCII_KEYSTROKE_EVENT && inev.code >= 128)
!         {
!           static TECObjectRef converter = NULL;
!           OSStatus the_err = noErr;
!           OSStatus convert_status = noErr;
  
!           if (converter ==  NULL)
              {
!               the_err = TECCreateConverter (&converter,
!                                             kTextEncodingMacRoman,
!                                             mac_keyboard_text_encoding);
!               current_mac_keyboard_text_encoding
!                 = mac_keyboard_text_encoding;
              }
!           else if (mac_keyboard_text_encoding
!                    != current_mac_keyboard_text_encoding)
              {
!               /* Free the converter for the current encoding before
!                  creating a new one.  */
!               TECDisposeConverter (converter);
!               the_err = TECCreateConverter (&converter,
!                                             kTextEncodingMacRoman,
!                                             mac_keyboard_text_encoding);
!               current_mac_keyboard_text_encoding
!                 = mac_keyboard_text_encoding;
              }
! 
!           if (the_err == noErr)
              {
!               unsigned char ch = inev.code;
!               ByteCount actual_input_length, actual_output_length;
!               unsigned char outch;
! 
!               convert_status = TECConvertText (converter, &ch, 1,
!                                                &actual_input_length,
!                                                &outch, 1,
!                                                &actual_output_length);
!               if (convert_status == noErr
!                   && actual_input_length == 1
!                   && actual_output_length == 1)
!                 inev.code = outch;
              }
          }
  
  #if USE_CARBON_EVENTS
!       inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
  #else
!       inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
  #endif
  
!       {
!         mac_output *mwp
!           = (mac_output *) GetWRefCon (FrontNonFloatingWindow ());
!         XSETFRAME (inev.frame_or_window, mwp->mFP);
!       }
! 
!       inev.timestamp = er.when * (1000 / 60);  /* ticks to milliseconds */
!       break;
! 
!       case kHighLevelEvent:
!         drag_and_drop_file_list = Qnil;
  
!         AEProcessAppleEvent(&er);
  
!         /* Build a DRAG_N_DROP_EVENT type event as is done in
!            constuct_drag_n_drop in w32term.c.  */
!         if (!NILP (drag_and_drop_file_list))
!           {
!             struct frame *f = NULL;
!             WindowPtr wp;
!             Lisp_Object frame;
  
!             wp = FrontNonFloatingWindow ();
  
!           if (!wp)
!             {
!               struct frame *f = XFRAME (XCAR (Vframe_list));
!               CollapseWindow (FRAME_MAC_WINDOW (f), false);
!               wp = FrontNonFloatingWindow ();
!             }
  
!             if (wp && is_emacs_window(wp))
!               f = ((mac_output *) GetWRefCon (wp))->mFP;
  
!             inev.kind = DRAG_N_DROP_EVENT;
!             inev.code = 0;
!             inev.timestamp = er.when * (1000 / 60);
              /* ticks to milliseconds */
  #if USE_CARBON_EVENTS
!           inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
  #else
!           inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
  #endif
  
!             XSETINT (inev.x, 0);
!             XSETINT (inev.y, 0);
  
!             XSETFRAME (frame, f);
!             inev.frame_or_window = Fcons (frame, drag_and_drop_file_list);
  
!             /* Regardless of whether Emacs was suspended or in the
!                foreground, ask it to redraw its entire screen.
!                Otherwise parts of the screen can be left in an
!                inconsistent state.  */
!             if (wp)
  #if TARGET_API_MAC_CARBON
!             {
!               Rect r;
  
!               GetWindowPortBounds (wp, &r);
!               InvalWindowRect (wp, &r);
!             }
  #else /* not TARGET_API_MAC_CARBON */
!               InvalRect (&(wp->portRect));
  #endif /* not TARGET_API_MAC_CARBON */
!           }
!       default:
!       break;
!       }
  #if USE_CARBON_EVENTS
        ReleaseEvent (eventRef);
-     }
  #endif
  
    /* If the focus was just given to an autoraising frame,
       raise it now.  */
    /* ??? This ought to be able to handle more than one such frame.  */
--- 8105,8661 ----
                                  NULL, &point);
                inev.kind = WHEEL_EVENT;
                inev.code = 0;
!               inev.modifiers = (mac_event_to_emacs_modifiers (eventRef)
                                  | ((delta < 0) ? down_modifier
                                     : up_modifier));
!               SetPortWindowPort (window_ptr);
                GlobalToLocal (&point);
                XSETINT (inev.x, point.h);
                XSETINT (inev.y, point.v);
!               XSETFRAME (inev.frame_or_window,
!                          mac_window_to_frame (window_ptr));
                inev.timestamp = EventTimeToTicks (GetEventTime 
(eventRef))*(1000/60);
              }
            else
!             SendEventToEventTarget (eventRef, toolbox_dispatcher);
  
            break;
          default:
            /* Send the event to the appropriate receiver.  */
!           SendEventToEventTarget (eventRef, toolbox_dispatcher);
          }
        else
  #endif /* USE_CARBON_EVENTS */
!       switch (er.what)
        {
!       case mouseDown:
!       case mouseUp:
!         {
!           WindowPtr window_ptr;
!           SInt16 part_code;
!           int tool_bar_p = 0;
! 
!           if (dpyinfo->grabbed && last_mouse_frame
!               && FRAME_LIVE_P (last_mouse_frame))
!             {
!               window_ptr = FRAME_MAC_WINDOW (last_mouse_frame);
!               part_code = inContent;
!             }
!           else
!             {
!               window_ptr = FrontWindow ();
!               if (tip_window && window_ptr == tip_window)
!                 {
!                   HideWindow (tip_window);
!                   window_ptr = FrontWindow ();
!                 }
  
  #if USE_CARBON_EVENTS
!               /* This is needed to send mouse events like aqua
!                  window buttons to the correct handler.  */
!               if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
!                   != eventNotHandledErr)
!                 break;
  
!               if (!is_emacs_window (window_ptr))
!                 break;
  #endif
+               part_code = FindWindow (er.where, &window_ptr);
+             }
+ 
+           switch (part_code)
+             {
+             case inMenuBar:
+               if (er.what == mouseDown)
+                 {
+                   f = mac_window_to_frame (mac_front_window ());
+                   saved_menu_event_location = er.where;
+                   inev.kind = MENU_BAR_ACTIVATE_EVENT;
+                   XSETFRAME (inev.frame_or_window, f);
+                 }
+               break;
  
!             case inContent:
!               if (window_ptr != mac_front_window ())
!                 SelectWindow (window_ptr);
!               else
!                 {
!                   SInt16 control_part_code;
!                   ControlHandle ch;
!                   Point mouse_loc = er.where;
  
!                   f = mac_window_to_frame (window_ptr);
!                   /* convert to local coordinates of new window */
!                   SetPortWindowPort (window_ptr);
! 
!                   GlobalToLocal (&mouse_loc);
  #if TARGET_API_MAC_CARBON
!                   ch = FindControlUnderMouse (mouse_loc, window_ptr,
!                                               &control_part_code);
  #else
!                   control_part_code = FindControl (mouse_loc, window_ptr,
!                                                    &ch);
  #endif
  
  #if USE_CARBON_EVENTS
!                   inev.code = mac_get_mouse_btn (eventRef);
!                   inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
  #else
!                   inev.code = mac_get_emulated_btn (er.modifiers);
!                   inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
  #endif
!                   XSETINT (inev.x, mouse_loc.h);
!                   XSETINT (inev.y, mouse_loc.v);
!                   inev.timestamp = er.when * (1000 / 60);
!                   /* ticks to milliseconds */
! 
!                   if (dpyinfo->grabbed && tracked_scroll_bar
! #if TARGET_API_MAC_CARBON
!                       || ch != 0
  #else
!                       || control_part_code != 0
  #endif
!                       )
!                     {
!                       struct scroll_bar *bar;
! 
!                       if (dpyinfo->grabbed && tracked_scroll_bar)
!                         {
!                           bar = tracked_scroll_bar;
!                           control_part_code = kControlIndicatorPart;
!                         }
!                       else
!                         bar = (struct scroll_bar *) GetControlReference (ch);
!                       x_scroll_bar_handle_click (bar, control_part_code,
!                                                  &er, &inev);
!                       if (er.what == mouseDown
!                           && control_part_code == kControlIndicatorPart)
!                         tracked_scroll_bar = bar;
!                       else
!                         tracked_scroll_bar = NULL;
!                     }
!                   else
!                     {
!                       Lisp_Object window;
!                       int x = mouse_loc.h;
!                       int y = mouse_loc.v;
! 
!                       window = window_from_coordinates (f, x, y, 0, 0, 0, 1);
!                       if (EQ (window, f->tool_bar_window))
!                         {
!                           if (er.what == mouseDown)
!                             handle_tool_bar_click (f, x, y, 1, 0);
!                           else
!                             handle_tool_bar_click (f, x, y, 0,
!                                                    inev.modifiers);
!                           tool_bar_p = 1;
!                         }
!                       else
!                         {
!                           XSETFRAME (inev.frame_or_window, f);
!                           inev.kind = MOUSE_CLICK_EVENT;
!                         }
!                     }
! 
!                   if (er.what == mouseDown)
!                     {
!                       dpyinfo->grabbed |= (1 << inev.code);
!                       last_mouse_frame = f;
!                       /* Ignore any mouse motion that happened
!                          before this event; any subsequent
!                          mouse-movement Emacs events should reflect
!                          only motion after the ButtonPress.  */
!                       if (f != 0)
!                         f->mouse_moved = 0;
! 
!                       if (!tool_bar_p)
!                         last_tool_bar_item = -1;
!                     }
!                   else
!                     {
!                       if (dpyinfo->grabbed & (1 << inev.code) == 0)
!                         /* If a button is released though it was not
!                            previously pressed, that would be because
!                            of multi-button emulation.  */
!                         dpyinfo->grabbed = 0;
!                       else
!                         dpyinfo->grabbed &= ~(1 << inev.code);
!                     }
! 
!                   switch (er.what)
!                     {
!                     case mouseDown:
!                       inev.modifiers |= down_modifier;
!                       break;
!                     case mouseUp:
!                       inev.modifiers |= up_modifier;
!                       break;
!                     }
!                 }
!               break;
  
!             case inDrag:
! #if TARGET_API_MAC_CARBON
!               if (er.what == mouseDown)
!                 {
!                   BitMap bm;
  
!                   GetQDGlobalsScreenBits (&bm);
!                   DragWindow (window_ptr, er.where, &bm.bounds);
!                 }
! #else /* not TARGET_API_MAC_CARBON */
!               DragWindow (window_ptr, er.where, &qd.screenBits.bounds);
! #endif /* not TARGET_API_MAC_CARBON */
!               break;
  
!             case inGoAway:
!               if (TrackGoAway (window_ptr, er.where))
!                 {
!                   inev.kind = DELETE_WINDOW_EVENT;
!                   XSETFRAME (inev.frame_or_window,
!                              mac_window_to_frame (window_ptr));
!                 }
!               break;
  
!               /* window resize handling added --ben */
!             case inGrow:
!               if (er.what == mouseDown)
!                 {
!                   do_grow_window(window_ptr, &er);
!                   break;
!                 }
  
!               /* window zoom handling added --ben */
!             case inZoomIn:
!             case inZoomOut:
!               if (TrackBox (window_ptr, er.where, part_code))
!                 do_zoom_window (window_ptr, part_code);
!               break;
  
!             default:
!               break;
!             }
!         }
!         break;
  
!       case updateEvt:
  #if USE_CARBON_EVENTS
!         if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
!             != eventNotHandledErr)
!           break;
  #endif
!         do_window_update ((WindowPtr) er.message);
!         break;
  
+       case osEvt:
  #if USE_CARBON_EVENTS
!         if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
!             != eventNotHandledErr)
!           break;
  #endif
!         switch ((er.message >> 24) & 0x000000FF)
!           {
!           case suspendResumeMessage:
!             if ((er.message & resumeFlag) == 1)
!               do_app_resume ();
!             else
!               do_app_suspend ();
              break;
  
!           case mouseMovedMessage:
!             previous_help_echo_string = help_echo_string;
!             help_echo_string = help_echo_object = help_echo_window = Qnil;
!             help_echo_pos = -1;
! 
!             do_mouse_moved (er.where, &f);
! 
!             /* If the contents of the global variable
!                help_echo_string has changed, generate a
!                HELP_EVENT.  */
!             if (!NILP (help_echo_string) || !NILP (previous_help_echo_string))
!               do_help = 1;
              break;
+           }
+         break;
+ 
+       case activateEvt:
+         {
+           WindowPtr window_ptr = (WindowPtr) er.message;
  
! #if USE_CARBON_EVENTS
!           if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
!               != eventNotHandledErr)
              break;
+ #endif
+           if (window_ptr == tip_window)
+             {
+               HideWindow (tip_window);
+               break;
+             }
  
!           if ((er.modifiers & activeFlag) != 0)
!             {
!               Point mouse_loc = er.where;
  
!               do_window_activate (window_ptr);
  
!               SetPortWindowPort (window_ptr);
!               GlobalToLocal (&mouse_loc);
!               /* activateEvt counts as mouse movement,
!                  so update things that depend on mouse position.  */
!               note_mouse_movement (mac_window_to_frame (window_ptr),
!                                    &mouse_loc);
!             }
!           else
!             {
!               do_window_deactivate (window_ptr);
  
!               f = mac_window_to_frame (window_ptr);
!               if (f == dpyinfo->mouse_face_mouse_frame)
!                 {
!                   /* If we move outside the frame, then we're
!                      certainly no longer on any text in the
!                      frame.  */
!                   clear_mouse_face (dpyinfo);
!                   dpyinfo->mouse_face_mouse_frame = 0;
!                 }
  
!               /* Generate a nil HELP_EVENT to cancel a help-echo.
!                  Do it only if there's something to cancel.
!                  Otherwise, the startup message is cleared when the
!                  mouse leaves the frame.  */
!               if (any_help_event_p)
!                 do_help = -1;
!             }
!         }
!         break;
! 
!       case keyDown:
!       case autoKey:
!         {
!           int keycode = (er.message & keyCodeMask) >> 8;
!           int xkeysym;
  
  #if USE_CARBON_EVENTS
!           /* When using Carbon Events, we need to pass raw keyboard
!              events to the TSM ourselves.  If TSM handles it, it
!              will pass back noErr, otherwise it will pass back
!              "eventNotHandledErr" and we can process it
!              normally.  */
!           if ((!NILP (Vmac_pass_command_to_system)
!                || !(er.modifiers & cmdKey))
!               && (!NILP (Vmac_pass_control_to_system)
!                   || !(er.modifiers & controlKey)))
!             if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
!                 != eventNotHandledErr)
                break;
  #endif
  
! #if TARGET_API_MAC_CARBON
!           if (!IsValidWindowPtr (mac_front_window ()))
!             {
!               SysBeep (1);
!               break;
!             }
! #endif
  
!           ObscureCursor ();
  
!           if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight))
              {
!               clear_mouse_face (dpyinfo);
!               dpyinfo->mouse_face_hidden = 1;
              }
! 
!           if (keycode_to_xkeysym (keycode, &xkeysym))
              {
!               inev.code = 0xff00 | xkeysym;
!               inev.kind = NON_ASCII_KEYSTROKE_EVENT;
              }
!           else
              {
!               if (er.modifiers & (controlKey |
!                                   (NILP (Vmac_command_key_is_meta) ? optionKey
!                                    : cmdKey)))
!                 {
!                   /* This code comes from Keyboard Resource,
!                      Appendix C of IM - Text.  This is necessary
!                      since shift is ignored in KCHR table
!                      translation when option or command is pressed.
!                      It also does not translate correctly
!                      control-shift chars like C-% so mask off shift
!                      here also */
!                   int new_modifiers = er.modifiers & 0xe600;
!                   /* mask off option and command */
!                   int new_keycode = keycode | new_modifiers;
!                   Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache);
!                   unsigned long some_state = 0;
!                   inev.code = KeyTranslate (kchr_ptr, new_keycode,
!                                             &some_state) & 0xff;
!                 }
!               else
!                 inev.code = er.message & charCodeMask;
!               inev.kind = ASCII_KEYSTROKE_EVENT;
              }
          }
  
+         /* If variable mac-convert-keyboard-input-to-latin-1 is
+            non-nil, convert non-ASCII characters typed at the Mac
+            keyboard (presumed to be in the Mac Roman encoding) to
+            iso-latin-1 encoding before they are passed to Emacs.
+            This enables the Mac keyboard to be used to enter
+            non-ASCII iso-latin-1 characters directly.  */
+         if (mac_keyboard_text_encoding != kTextEncodingMacRoman
+             && inev.kind == ASCII_KEYSTROKE_EVENT && inev.code >= 128)
+           {
+             static TECObjectRef converter = NULL;
+             OSStatus the_err = noErr;
+             OSStatus convert_status = noErr;
+ 
+             if (converter ==  NULL)
+               {
+                 the_err = TECCreateConverter (&converter,
+                                               kTextEncodingMacRoman,
+                                               mac_keyboard_text_encoding);
+                 current_mac_keyboard_text_encoding
+                   = mac_keyboard_text_encoding;
+               }
+             else if (mac_keyboard_text_encoding
+                      != current_mac_keyboard_text_encoding)
+               {
+                 /* Free the converter for the current encoding
+                    before creating a new one.  */
+                 TECDisposeConverter (converter);
+                 the_err = TECCreateConverter (&converter,
+                                               kTextEncodingMacRoman,
+                                               mac_keyboard_text_encoding);
+                 current_mac_keyboard_text_encoding
+                   = mac_keyboard_text_encoding;
+               }
+ 
+             if (the_err == noErr)
+               {
+                 unsigned char ch = inev.code;
+                 ByteCount actual_input_length, actual_output_length;
+                 unsigned char outch;
+ 
+                 convert_status = TECConvertText (converter, &ch, 1,
+                                                  &actual_input_length,
+                                                  &outch, 1,
+                                                  &actual_output_length);
+                 if (convert_status == noErr
+                     && actual_input_length == 1
+                     && actual_output_length == 1)
+                   inev.code = outch;
+               }
+           }
+ 
  #if USE_CARBON_EVENTS
!         inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
  #else
!         inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
  #endif
+         XSETFRAME (inev.frame_or_window,
+                    mac_window_to_frame (mac_front_window ()));
+         inev.timestamp = er.when * (1000 / 60);  /* ticks to milliseconds */
+         break;
  
!       case kHighLevelEvent:
!         drag_and_drop_file_list = Qnil;
  
!         AEProcessAppleEvent(&er);
  
!         /* Build a DRAG_N_DROP_EVENT type event as is done in
!            constuct_drag_n_drop in w32term.c.  */
!         if (!NILP (drag_and_drop_file_list))
!           {
!             struct frame *f = NULL;
!             WindowPtr wp;
!             Lisp_Object frame;
  
!             wp = mac_front_window ();
  
!             if (!wp)
!               {
!                 struct frame *f = XFRAME (XCAR (Vframe_list));
!                 CollapseWindow (FRAME_MAC_WINDOW (f), false);
!                 wp = mac_front_window ();
!               }
  
!             if (wp && is_emacs_window (wp))
!               f = mac_window_to_frame (wp);
  
!             inev.kind = DRAG_N_DROP_EVENT;
!             inev.code = 0;
!             inev.timestamp = er.when * (1000 / 60);
              /* ticks to milliseconds */
  #if USE_CARBON_EVENTS
!             inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
  #else
!             inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
  #endif
  
!             XSETINT (inev.x, 0);
!             XSETINT (inev.y, 0);
  
!             XSETFRAME (frame, f);
!             inev.frame_or_window = Fcons (frame, drag_and_drop_file_list);
  
!             /* Regardless of whether Emacs was suspended or in the
!                foreground, ask it to redraw its entire screen.
!                Otherwise parts of the screen can be left in an
!                inconsistent state.  */
!             if (wp)
  #if TARGET_API_MAC_CARBON
!               {
!                 Rect r;
  
!                 GetWindowPortBounds (wp, &r);
!                 InvalWindowRect (wp, &r);
!               }
  #else /* not TARGET_API_MAC_CARBON */
!                 InvalRect (&(wp->portRect));
  #endif /* not TARGET_API_MAC_CARBON */
!           }
!       default:
!         break;
!       }
  #if USE_CARBON_EVENTS
        ReleaseEvent (eventRef);
  #endif
  
+       if (inev.kind != NO_EVENT)
+       {
+         kbd_buffer_store_event_hold (&inev, hold_quit);
+         count++;
+       }
+ 
+       if (do_help
+         && !(hold_quit && hold_quit->kind != NO_EVENT))
+       {
+         Lisp_Object frame;
+ 
+         if (f)
+           XSETFRAME (frame, f);
+         else
+           frame = Qnil;
+ 
+         if (do_help > 0)
+           {
+             any_help_event_p = 1;
+             gen_help_event (help_echo_string, frame, help_echo_window,
+                             help_echo_object, help_echo_pos);
+           }
+         else
+           {
+             help_echo_string = Qnil;
+             gen_help_event (Qnil, frame, Qnil, Qnil, 0);
+           }
+         count++;
+       }
+ 
+     }
+ 
    /* If the focus was just given to an autoraising frame,
       raise it now.  */
    /* ??? This ought to be able to handle more than one such frame.  */
***************
*** 8567,8624 ****
    check_alarm ();  /* simulate the handling of a SIGALRM */
  #endif
  
-   {
-     static Point old_mouse_pos = { -1, -1 };
- 
-     if (app_is_suspended)
-       {
-         old_mouse_pos.h = -1;
-         old_mouse_pos.v = -1;
-       }
-     else
-       {
-         Point mouse_pos;
-         WindowPtr wp;
-         struct frame *f;
-         Lisp_Object bar;
-         struct scroll_bar *sb;
- 
-         wp = FrontWindow ();
-       if (is_emacs_window (wp))
-         {
-           f = ((mac_output *) GetWRefCon (wp))->mFP;
- 
- #if TARGET_API_MAC_CARBON
-           SetPort (GetWindowPort (wp));
- #else
-           SetPort (wp);
- #endif
- 
-           GetMouse (&mouse_pos);
- 
-           if (!EqualPt (mouse_pos, old_mouse_pos))
-             {
-               if (mouse_tracking_in_progress == mouse_tracking_scroll_bar
-                   && tracked_scroll_bar)
-                 x_scroll_bar_note_movement (tracked_scroll_bar,
-                                             mouse_pos.v
-                                             - XINT (tracked_scroll_bar->top),
-                                             TickCount() * (1000 / 60));
-               else
-                 note_mouse_movement (f, &mouse_pos);
- 
-               old_mouse_pos = mouse_pos;
-             }
-         }
-       }
-   }
- 
-   if (inev.kind != NO_EVENT)
-     {
-       kbd_buffer_store_event_hold (&inev, hold_quit);
-       count++;
-     }
- 
    UNBLOCK_INPUT;
    return count;
  }
--- 8669,8674 ----
***************
*** 8647,8653 ****
     ROWS Macintosh window, using font with name FONTNAME and size
     FONTSIZE.  */
  void
! NewMacWindow (FRAME_PTR fp)
  {
    mac_output *mwp;
  #if TARGET_API_MAC_CARBON
--- 8697,8703 ----
     ROWS Macintosh window, using font with name FONTNAME and size
     FONTSIZE.  */
  void
! make_mac_frame (FRAME_PTR fp)
  {
    mac_output *mwp;
  #if TARGET_API_MAC_CARBON
***************
*** 8666,8698 ****
        making_terminal_window = 0;
      }
    else
!     if (!(mwp->mWP = GetNewCWindow (WINDOW_RESOURCE, NULL, (WindowPtr) -1)))
!       abort ();
  
    SetWRefCon (mwp->mWP, (long) mwp);
      /* so that update events can find this mac_output struct */
    mwp->mFP = fp;  /* point back to emacs frame */
  
! #if TARGET_API_MAC_CARBON
!   SetPort (GetWindowPort (mwp->mWP));
! #else
!   SetPort (mwp->mWP);
! #endif
! 
!   mwp->fontset = -1;
  
    SizeWindow (mwp->mWP, FRAME_PIXEL_WIDTH (fp), FRAME_PIXEL_HEIGHT (fp), 
false);
-   ShowWindow (mwp->mWP);
- 
  }
  
  
  void
! make_mac_frame (struct frame *f)
  {
!   FRAME_DESIRED_CURSOR (f) = FILLED_BOX_CURSOR;
  
!   NewMacWindow(f);
  
    f->output_data.mac->cursor_pixel = 0;
    f->output_data.mac->border_pixel = 0x00ff00;
--- 8716,8767 ----
        making_terminal_window = 0;
      }
    else
!     {
! #if TARGET_API_MAC_CARBON
!       Rect r;
! 
!       SetRect (&r, 0, 0, 1, 1);
!       if (CreateNewWindow (kDocumentWindowClass,
!                          kWindowStandardDocumentAttributes
!                          /* | kWindowToolbarButtonAttribute */,
!                          &r, &mwp->mWP) != noErr)
! #else
!       if (!(mwp->mWP = GetNewCWindow (WINDOW_RESOURCE, NULL, (WindowPtr) -1)))
! #endif
!       abort ();
!     }
  
    SetWRefCon (mwp->mWP, (long) mwp);
      /* so that update events can find this mac_output struct */
    mwp->mFP = fp;  /* point back to emacs frame */
  
!   SetPortWindowPort (mwp->mWP);
  
    SizeWindow (mwp->mWP, FRAME_PIXEL_WIDTH (fp), FRAME_PIXEL_HEIGHT (fp), 
false);
  }
  
  
  void
! make_mac_terminal_frame (struct frame *f)
  {
!   Lisp_Object frame;
  
!   XSETFRAME (frame, f);
! 
!   f->output_method = output_mac;
!   f->output_data.mac = (struct mac_output *)
!     xmalloc (sizeof (struct mac_output));
!   bzero (f->output_data.mac, sizeof (struct mac_output));
! 
!   XSETFRAME (FRAME_KBOARD (f)->Vdefault_minibuffer_frame, f);
! 
!   FRAME_COLS (f) = 96;
!   FRAME_LINES (f) = 4;
! 
!   FRAME_CAN_HAVE_SCROLL_BARS (f) = 1;
!   FRAME_VERTICAL_SCROLL_BAR_TYPE (f) = vertical_scroll_bar_right;
! 
!   FRAME_DESIRED_CURSOR (f) = FILLED_BOX_CURSOR;
  
    f->output_data.mac->cursor_pixel = 0;
    f->output_data.mac->border_pixel = 0x00ff00;
***************
*** 8700,8707 ****
    f->output_data.mac->cursor_foreground_pixel = 0x0000ff;
  
    FRAME_FONTSET (f) = -1;
-   f->output_data.mac->scroll_bar_foreground_pixel = -1;
-   f->output_data.mac->scroll_bar_background_pixel = -1;
    f->output_data.mac->explicit_parent = 0;
    f->left_pos = 4;
    f->top_pos = 4;
--- 8769,8774 ----
***************
*** 8709,8745 ****
  
    f->internal_border_width = 0;
  
-   f->output_method = output_mac;
- 
    f->auto_raise = 1;
    f->auto_lower = 1;
  
    f->new_text_cols = 0;
    f->new_text_lines = 0;
- }
- 
- void
- make_mac_terminal_frame (struct frame *f)
- {
-   Lisp_Object frame;
- 
-   XSETFRAME (frame, f);
- 
-   f->output_method = output_mac;
-   f->output_data.mac = (struct mac_output *)
-     xmalloc (sizeof (struct mac_output));
-   bzero (f->output_data.mac, sizeof (struct mac_output));
-   FRAME_FONTSET (f) = -1;
-   f->output_data.mac->scroll_bar_foreground_pixel = -1;
-   f->output_data.mac->scroll_bar_background_pixel = -1;
- 
-   XSETFRAME (FRAME_KBOARD (f)->Vdefault_minibuffer_frame, f);
- 
-   FRAME_COLS (f) = 96;
-   FRAME_LINES (f) = 4;
- 
-   FRAME_CAN_HAVE_SCROLL_BARS (f) = 1;
-   FRAME_VERTICAL_SCROLL_BAR_TYPE (f) = vertical_scroll_bar_right;
  
    make_mac_frame (f);
  
--- 8776,8786 ----
***************
*** 8757,8762 ****
--- 8798,8805 ----
    Fmodify_frame_parameters (frame,
                              Fcons (Fcons (Qbackground_color,
                                            build_string ("white")), Qnil));
+ 
+   ShowWindow (f->output_data.mac->mWP);
  }
  
  
***************
*** 8797,8806 ****
--- 8840,8855 ----
    dpyinfo->resx = 75.0;
    dpyinfo->resy = 75.0;
    dpyinfo->color_p = TestDeviceAttribute (main_device_handle, gdDevType);
+ #ifdef MAC_OSX
+   /* HasDepth returns true if it is possible to have a 32 bit display,
+      but this may not be what is actually used.  Mac OSX can do better.  */
+   dpyinfo->n_planes = CGDisplayBitsPerPixel (CGMainDisplayID ());
+ #else
    for (dpyinfo->n_planes = 32; dpyinfo->n_planes > 0; dpyinfo->n_planes >>= 1)
      if (HasDepth (main_device_handle, dpyinfo->n_planes,
                  gdDevType, dpyinfo->color_p))
        break;
+ #endif
    dpyinfo->height = (**main_device_handle).gdRect.bottom;
    dpyinfo->width = (**main_device_handle).gdRect.right;
    dpyinfo->grabbed = 0;
***************
*** 8811,8816 ****
--- 8860,8867 ----
    dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_end_col = -1;
    dpyinfo->mouse_face_face_id = DEFAULT_FACE_ID;
    dpyinfo->mouse_face_window = Qnil;
+   dpyinfo->mouse_face_overlay = Qnil;
+   dpyinfo->mouse_face_hidden = 0;
  }
  
  struct mac_display_info *
***************
*** 8959,8980 ****
    mac_determine_quit_char_modifiers ();
  
    /* Fill the queue with events */
    ReceiveNextEvent (0, NULL, kEventDurationNoWait, false, &event);
    event = FindSpecificEventInQueue (GetMainEventQueue (), quit_char_comp,
                                    NULL);
    if (event)
      {
        struct input_event e;
!       struct mac_output *mwp =
!       (mac_output *) GetWRefCon (FrontNonFloatingWindow ());
        /* Use an input_event to emulate what the interrupt handler does. */
        EVENT_INIT (e);
        e.kind = ASCII_KEYSTROKE_EVENT;
        e.code = quit_char;
!       e.arg = NULL;
        e.modifiers = NULL;
        e.timestamp = EventTimeToTicks (GetEventTime (event)) * (1000/60);
!       XSETFRAME (e.frame_or_window, mwp->mFP);
        /* Remove event from queue to prevent looping. */
        RemoveEventFromQueue (GetMainEventQueue (), event);
        ReleaseEvent (event);
--- 9010,9032 ----
    mac_determine_quit_char_modifiers ();
  
    /* Fill the queue with events */
+   BLOCK_INPUT;
    ReceiveNextEvent (0, NULL, kEventDurationNoWait, false, &event);
    event = FindSpecificEventInQueue (GetMainEventQueue (), quit_char_comp,
                                    NULL);
+   UNBLOCK_INPUT;
    if (event)
      {
        struct input_event e;
! 
        /* Use an input_event to emulate what the interrupt handler does. */
        EVENT_INIT (e);
        e.kind = ASCII_KEYSTROKE_EVENT;
        e.code = quit_char;
!       e.arg = Qnil;
        e.modifiers = NULL;
        e.timestamp = EventTimeToTicks (GetEventTime (event)) * (1000/60);
!       XSETFRAME (e.frame_or_window, mac_window_to_frame (mac_front_window 
()));
        /* Remove event from queue to prevent looping. */
        RemoveEventFromQueue (GetMainEventQueue (), event);
        ReleaseEvent (event);
***************
*** 9185,9194 ****
            useful for non-standard keyboard layouts.  */);
    Vmac_reverse_ctrl_meta = Qnil;
  
!   DEFVAR_LISP ("mac-emulate-three-button-mouse", 
               &Vmac_emulate_three_button_mouse,
      doc: /* t means that when the option-key is held down while pressing the
!     mouse button, the click will register as mouse-2 and while the 
      command-key is held down, the click will register as mouse-3.
      'reverse means that the the option-key will register for mouse-3
      and the command-key will register for mouse-2.  nil means that
--- 9237,9246 ----
            useful for non-standard keyboard layouts.  */);
    Vmac_reverse_ctrl_meta = Qnil;
  
!   DEFVAR_LISP ("mac-emulate-three-button-mouse",
               &Vmac_emulate_three_button_mouse,
      doc: /* t means that when the option-key is held down while pressing the
!     mouse button, the click will register as mouse-2 and while the
      command-key is held down, the click will register as mouse-3.
      'reverse means that the the option-key will register for mouse-3
      and the command-key will register for mouse-2.  nil means that




reply via email to

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