diff options
Diffstat (limited to 'src/macterm.c')
-rw-r--r-- | src/macterm.c | 2124 |
1 files changed, 1159 insertions, 965 deletions
diff --git a/src/macterm.c b/src/macterm.c index 0b8fec3a089..f8c79d1c865 100644 --- a/src/macterm.c +++ b/src/macterm.c @@ -35,12 +35,7 @@ Boston, MA 02110-1301, USA. */ #include <alloca.h> #endif -#if TARGET_API_MAC_CARBON -/* USE_CARBON_EVENTS determines if the Carbon Event Manager is used to - obtain events from the event queue. If set to 0, WaitNextEvent is - used instead. */ -#define USE_CARBON_EVENTS 1 -#else /* not TARGET_API_MAC_CARBON */ +#if !TARGET_API_MAC_CARBON #include <Quickdraw.h> #include <ToolUtils.h> #include <Sound.h> @@ -263,7 +258,7 @@ static void x_scroll_bar_report_motion P_ ((struct frame **, Lisp_Object *, Lisp_Object *, Lisp_Object *, unsigned long *)); -static int is_emacs_window P_ ((WindowPtr)); +static int is_emacs_window P_ ((WindowRef)); static XCharStruct *mac_per_char_metric P_ ((XFontStruct *, XChar2b *, int)); static void XSetFont P_ ((Display *, GC, XFontStruct *)); static struct terminal *mac_create_terminal P_ ((struct mac_display_info *dpyinfo)); @@ -418,7 +413,8 @@ mac_prepare_for_quickdraw (f) static RgnHandle saved_port_clip_region = NULL; static void -mac_begin_clip (gc) +mac_begin_clip (f, gc) + struct frame *f; GC gc; { static RgnHandle new_region = NULL; @@ -428,6 +424,11 @@ mac_begin_clip (gc) if (new_region == NULL) new_region = NewRgn (); +#if USE_CG_DRAWING + mac_prepare_for_quickdraw (f); +#endif + SetPortWindowPort (FRAME_MAC_WINDOW (f)); + if (gc->n_clip_rects) { GetClip (saved_port_clip_region); @@ -447,15 +448,6 @@ mac_end_clip (gc) /* X display function emulation */ -void -XFreePixmap (display, pixmap) - Display *display; /* not used */ - Pixmap pixmap; -{ - DisposeGWorld (pixmap); -} - - /* Mac version of XDrawLine. */ static void @@ -497,11 +489,8 @@ mac_draw_line (f, gc, x1, y1, x2, y2) x2--; } - SetPortWindowPort (FRAME_MAC_WINDOW (f)); - + mac_begin_clip (f, gc); RGBForeColor (GC_FORE_COLOR (gc)); - - mac_begin_clip (gc); MoveTo (x1, y1); LineTo (x2, y2); mac_end_clip (gc); @@ -557,25 +546,25 @@ mac_erase_rectangle (f, gc, x, y, width, height) unsigned int width, height; { #if USE_CG_DRAWING - CGContextRef context; + { + CGContextRef context; - context = mac_begin_cg_clip (f, gc); - CG_SET_FILL_COLOR_WITH_GC_BACKGROUND (context, gc); - CGContextFillRect (context, CGRectMake (x, y, width, height)); - mac_end_cg_clip (f); + context = mac_begin_cg_clip (f, gc); + CG_SET_FILL_COLOR_WITH_GC_BACKGROUND (context, gc); + CGContextFillRect (context, CGRectMake (x, y, width, height)); + mac_end_cg_clip (f); + } #else - Rect r; - - SetPortWindowPort (FRAME_MAC_WINDOW (f)); - - RGBBackColor (GC_BACK_COLOR (gc)); - SetRect (&r, x, y, x + width, y + height); - - mac_begin_clip (gc); - EraseRect (&r); - mac_end_clip (gc); + { + Rect r; - RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); + mac_begin_clip (f, gc); + RGBBackColor (GC_BACK_COLOR (gc)); + SetRect (&r, x, y, x + width, y + height); + EraseRect (&r); + RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); + mac_end_clip (gc); + } #endif } @@ -598,15 +587,17 @@ mac_clear_window (f) struct frame *f; { #if USE_CG_DRAWING - CGContextRef context; - GC gc = FRAME_NORMAL_GC (f); - - context = mac_begin_cg_clip (f, NULL); - CG_SET_FILL_COLOR_WITH_GC_BACKGROUND (context, gc); - CGContextFillRect (context, CGRectMake (0, 0, FRAME_PIXEL_WIDTH (f), - FRAME_PIXEL_HEIGHT (f))); - mac_end_cg_clip (f); -#else + { + CGContextRef context; + GC gc = FRAME_NORMAL_GC (f); + + context = mac_begin_cg_clip (f, NULL); + CG_SET_FILL_COLOR_WITH_GC_BACKGROUND (context, gc); + CGContextFillRect (context, CGRectMake (0, 0, FRAME_PIXEL_WIDTH (f), + FRAME_PIXEL_HEIGHT (f))); + mac_end_cg_clip (f); + } +#else /* !USE_CG_DRAWING */ SetPortWindowPort (FRAME_MAC_WINDOW (f)); RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); @@ -680,13 +671,10 @@ mac_draw_bitmap (f, gc, x, y, width, height, bits, overlay_p) bitmap.baseAddr = (char *)bits; SetRect (&(bitmap.bounds), 0, 0, width, height); - SetPortWindowPort (FRAME_MAC_WINDOW (f)); - + mac_begin_clip (f, gc); RGBForeColor (GC_FORE_COLOR (gc)); RGBBackColor (GC_BACK_COLOR (gc)); SetRect (&r, x, y, x + width, y + height); - - mac_begin_clip (gc); #if TARGET_API_MAC_CARBON { CGrafPtr port; @@ -701,9 +689,8 @@ mac_draw_bitmap (f, gc, x, y, width, height, bits, overlay_p) CopyBits (&bitmap, &(FRAME_MAC_WINDOW (f)->portBits), &(bitmap.bounds), &r, overlay_p ? srcOr : srcCopy, 0); #endif /* not TARGET_API_MAC_CARBON */ - mac_end_clip (gc); - RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); + mac_end_clip (gc); } #endif /* !USE_CG_DRAWING */ @@ -754,8 +741,8 @@ mac_free_bitmap (bitmap) Pixmap XCreatePixmap (display, w, width, height, depth) - Display *display; /* not used */ - WindowPtr w; + Display *display; + WindowRef w; unsigned int width, height; unsigned int depth; { @@ -783,8 +770,8 @@ XCreatePixmap (display, w, width, height, depth) Pixmap XCreatePixmapFromBitmapData (display, w, data, width, height, fg, bg, depth) - Display *display; /* not used */ - WindowPtr w; + Display *display; + WindowRef w; char *data; unsigned int width, height; unsigned long fg, bg; @@ -794,7 +781,7 @@ XCreatePixmapFromBitmapData (display, w, data, width, height, fg, bg, depth) BitMap bitmap; CGrafPtr old_port; GDHandle old_gdh; - static GC gc = NULL; /* not reentrant */ + static GC gc = NULL; if (gc == NULL) gc = XCreateGC (display, w, 0, NULL); @@ -826,6 +813,15 @@ XCreatePixmapFromBitmapData (display, w, data, width, height, fg, bg, depth) } +void +XFreePixmap (display, pixmap) + Display *display; + Pixmap pixmap; +{ + DisposeGWorld (pixmap); +} + + /* Mac replacement for XFillRectangle. */ static void @@ -845,12 +841,9 @@ mac_fill_rectangle (f, gc, x, y, width, height) #else Rect r; - SetPortWindowPort (FRAME_MAC_WINDOW (f)); - + mac_begin_clip (f, gc); RGBForeColor (GC_FORE_COLOR (gc)); SetRect (&r, x, y, x + width, y + height); - - mac_begin_clip (gc); PaintRect (&r); /* using foreground color of gc */ mac_end_clip (gc); #endif @@ -877,18 +870,34 @@ mac_draw_rectangle (f, gc, x, y, width, height) #else Rect r; - SetPortWindowPort (FRAME_MAC_WINDOW (f)); - + mac_begin_clip (f, gc); RGBForeColor (GC_FORE_COLOR (gc)); SetRect (&r, x, y, x + width + 1, y + height + 1); - - mac_begin_clip (gc); FrameRect (&r); /* using foreground color of gc */ mac_end_clip (gc); #endif } +static void +mac_invert_rectangle (f, x, y, width, height) + struct frame *f; + int x, y; + unsigned int width, height; +{ + Rect r; + +#if USE_CG_DRAWING + mac_prepare_for_quickdraw (f); +#endif + SetPortWindowPort (FRAME_MAC_WINDOW (f)); + + SetRect (&r, x, y, x + width, y + height); + + InvertRect (&r); +} + + #if USE_ATSUI static OSStatus atsu_get_text_layout_with_text_ptr (text, text_length, style, text_layout) @@ -898,7 +907,7 @@ atsu_get_text_layout_with_text_ptr (text, text_length, style, text_layout) ATSUTextLayout *text_layout; { OSStatus err; - static ATSUTextLayout saved_text_layout = NULL; /* not reentrant */ + static ATSUTextLayout saved_text_layout = NULL; if (saved_text_layout == NULL) { @@ -925,7 +934,6 @@ atsu_get_text_layout_with_text_ptr (text, text_length, style, text_layout) err = ATSUSetLayoutControls (saved_text_layout, sizeof (tags) / sizeof (tags[0]), tags, sizes, values); - /* XXX: Should we do this? */ if (err == noErr) err = ATSUSetTransientFontMatching (saved_text_layout, true); } @@ -944,224 +952,224 @@ atsu_get_text_layout_with_text_ptr (text, text_length, style, text_layout) *text_layout = saved_text_layout; return err; } -#endif static void -mac_invert_rectangle (f, x, y, width, height) - struct frame *f; - int x, y; - unsigned int width, height; -{ - Rect r; - -#if USE_CG_DRAWING - mac_prepare_for_quickdraw (f); -#endif - SetPortWindowPort (FRAME_MAC_WINDOW (f)); - - SetRect (&r, x, y, x + width, y + height); - - InvertRect (&r); -} - - -static void -mac_draw_string_common (f, gc, x, y, buf, nchars, bg_width, - overstrike_p, bytes_per_char) +mac_draw_image_string_atsui (f, gc, x, y, buf, nchars, bg_width, + overstrike_p, bytes_per_char) struct frame *f; GC gc; int x, y; char *buf; int nchars, bg_width, overstrike_p, bytes_per_char; { - SetPortWindowPort (FRAME_MAC_WINDOW (f)); - -#if USE_ATSUI - if (GC_FONT (gc)->mac_style) - { - OSStatus err; - ATSUTextLayout text_layout; + OSStatus err; + ATSUTextLayout text_layout; - xassert (bytes_per_char == 2); + xassert (bytes_per_char == 2); #ifndef WORDS_BIG_ENDIAN - { - int i; - UniChar *text = (UniChar *)buf; + { + int i; + UniChar *text = (UniChar *)buf; - for (i = 0; i < nchars; i++) - text[i] = EndianU16_BtoN (text[i]); - } + for (i = 0; i < nchars; i++) + text[i] = EndianU16_BtoN (text[i]); + } #endif - err = atsu_get_text_layout_with_text_ptr ((ConstUniCharArrayPtr)buf, - nchars, - GC_FONT (gc)->mac_style, - &text_layout); - if (err != noErr) - return; + err = atsu_get_text_layout_with_text_ptr ((ConstUniCharArrayPtr)buf, + nchars, + GC_FONT (gc)->mac_style, + &text_layout); + if (err != noErr) + return; #ifdef MAC_OSX - if (!mac_use_core_graphics) - { -#endif -#if USE_CG_DRAWING - mac_prepare_for_quickdraw (f); + if (!mac_use_core_graphics) + { #endif - mac_begin_clip (gc); - RGBForeColor (GC_FORE_COLOR (gc)); - if (bg_width) - { - Rect r; + mac_begin_clip (f, gc); + RGBForeColor (GC_FORE_COLOR (gc)); + if (bg_width) + { + Rect r; - SetRect (&r, x, y - FONT_BASE (GC_FONT (gc)), - x + bg_width, y + FONT_DESCENT (GC_FONT (gc))); - RGBBackColor (GC_BACK_COLOR (gc)); - EraseRect (&r); - RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); - } - MoveTo (x, y); + SetRect (&r, x, y - FONT_BASE (GC_FONT (gc)), + x + bg_width, y + FONT_DESCENT (GC_FONT (gc))); + RGBBackColor (GC_BACK_COLOR (gc)); + EraseRect (&r); + RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); + } + MoveTo (x, y); + ATSUDrawText (text_layout, + kATSUFromTextBeginning, kATSUToTextEnd, + kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc); + if (overstrike_p) + { + MoveTo (x + 1, y); ATSUDrawText (text_layout, kATSUFromTextBeginning, kATSUToTextEnd, kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc); - if (overstrike_p) - { - MoveTo (x + 1, y); - ATSUDrawText (text_layout, - kATSUFromTextBeginning, kATSUToTextEnd, - kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc); - } - mac_end_clip (gc); -#ifdef MAC_OSX } - else - { - CGrafPtr port; - static CGContextRef context; - float port_height = FRAME_PIXEL_HEIGHT (f); - static const ATSUAttributeTag tags[] = {kATSUCGContextTag}; - static const ByteCount sizes[] = {sizeof (CGContextRef)}; - static const ATSUAttributeValuePtr values[] = {&context}; + mac_end_clip (gc); +#ifdef MAC_OSX + } + else + { + static CGContextRef context; + float port_height = FRAME_PIXEL_HEIGHT (f); + static const ATSUAttributeTag tags[] = {kATSUCGContextTag}; + static const ByteCount sizes[] = {sizeof (CGContextRef)}; + static const ATSUAttributeValuePtr values[] = {&context}; #if USE_CG_DRAWING - context = mac_begin_cg_clip (f, gc); + context = mac_begin_cg_clip (f, gc); #else - GetPort (&port); - QDBeginCGContext (port, &context); - if (gc->n_clip_rects || bg_width) - { - CGContextTranslateCTM (context, 0, port_height); - CGContextScaleCTM (context, 1, -1); - if (gc->n_clip_rects) - CGContextClipToRects (context, gc->clip_rects, - gc->n_clip_rects); -#endif - if (bg_width) - { - CG_SET_FILL_COLOR_WITH_GC_BACKGROUND (context, gc); - CGContextFillRect - (context, - CGRectMake (x, y - FONT_BASE (GC_FONT (gc)), - bg_width, FONT_HEIGHT (GC_FONT (gc)))); - } - CGContextScaleCTM (context, 1, -1); - CGContextTranslateCTM (context, 0, -port_height); -#if !USE_CG_DRAWING - } + CGrafPtr port; + + GetPort (&port); + QDBeginCGContext (port, &context); + if (gc->n_clip_rects || bg_width) + { + CGContextTranslateCTM (context, 0, port_height); + CGContextScaleCTM (context, 1, -1); + if (gc->n_clip_rects) + CGContextClipToRects (context, gc->clip_rects, + gc->n_clip_rects); #endif - CG_SET_FILL_COLOR_WITH_GC_FOREGROUND (context, gc); - err = ATSUSetLayoutControls (text_layout, - sizeof (tags) / sizeof (tags[0]), - tags, sizes, values); - if (err == noErr) + if (bg_width) { - ATSUDrawText (text_layout, - kATSUFromTextBeginning, kATSUToTextEnd, - Long2Fix (x), Long2Fix (port_height - y)); - if (overstrike_p) - ATSUDrawText (text_layout, - kATSUFromTextBeginning, kATSUToTextEnd, - Long2Fix (x + 1), Long2Fix (port_height - y)); + CG_SET_FILL_COLOR_WITH_GC_BACKGROUND (context, gc); + CGContextFillRect (context, + CGRectMake (x, y - FONT_BASE (GC_FONT (gc)), + bg_width, + FONT_HEIGHT (GC_FONT (gc)))); } + CGContextScaleCTM (context, 1, -1); + CGContextTranslateCTM (context, 0, -port_height); +#if !USE_CG_DRAWING + } +#endif + CG_SET_FILL_COLOR_WITH_GC_FOREGROUND (context, gc); + err = ATSUSetLayoutControls (text_layout, + sizeof (tags) / sizeof (tags[0]), + tags, sizes, values); + if (err == noErr) + { + ATSUDrawText (text_layout, + kATSUFromTextBeginning, kATSUToTextEnd, + Long2Fix (x), Long2Fix (port_height - y)); + if (overstrike_p) + ATSUDrawText (text_layout, + kATSUFromTextBeginning, kATSUToTextEnd, + Long2Fix (x + 1), Long2Fix (port_height - y)); + } #if USE_CG_DRAWING - mac_end_cg_clip (f); - context = NULL; + mac_end_cg_clip (f); + context = NULL; #else - CGContextSynchronize (context); - QDEndCGContext (port, &context); + CGContextSynchronize (context); + QDEndCGContext (port, &context); #endif #if 0 - /* This doesn't work on Mac OS X 10.1. */ - ATSUClearLayoutControls (text_layout, - sizeof (tags) / sizeof (tags[0]), tags); + /* This doesn't work on Mac OS X 10.1. */ + ATSUClearLayoutControls (text_layout, + sizeof (tags) / sizeof (tags[0]), tags); #else - ATSUSetLayoutControls (text_layout, - sizeof (tags) / sizeof (tags[0]), - tags, sizes, values); + ATSUSetLayoutControls (text_layout, + sizeof (tags) / sizeof (tags[0]), + tags, sizes, values); #endif - } -#endif /* MAC_OSX */ } - else +#endif /* MAC_OSX */ +} #endif /* USE_ATSUI */ - { -#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020 - UInt32 savedFlags; - if (mac_use_core_graphics) - savedFlags = SwapQDTextFlags (kQDUseCGTextRendering); + +static void +mac_draw_image_string_qd (f, gc, x, y, buf, nchars, bg_width, + overstrike_p, bytes_per_char) + struct frame *f; + GC gc; + int x, y; + char *buf; + int nchars, bg_width, overstrike_p, bytes_per_char; +{ +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020 + UInt32 savedFlags; #endif -#if USE_CG_DRAWING - mac_prepare_for_quickdraw (f); + + mac_begin_clip (f, gc); +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020 + if (mac_use_core_graphics) + savedFlags = SwapQDTextFlags (kQDUseCGTextRendering); #endif - mac_begin_clip (gc); - RGBForeColor (GC_FORE_COLOR (gc)); + RGBForeColor (GC_FORE_COLOR (gc)); #ifdef MAC_OS8 - if (bg_width) - { - RGBBackColor (GC_BACK_COLOR (gc)); - TextMode (srcCopy); - } - else - TextMode (srcOr); + if (bg_width) + { + RGBBackColor (GC_BACK_COLOR (gc)); + TextMode (srcCopy); + } + else + TextMode (srcOr); #else - /* We prefer not to use srcCopy text transfer mode on Mac OS X - because: - - Screen is double-buffered. (In srcCopy mode, a text is - drawn into an offscreen graphics world first. So - performance gain cannot be expected.) - - It lowers rendering quality. - - Some fonts leave garbage on cursor movement. */ - if (bg_width) - { - Rect r; + /* We prefer not to use srcCopy text transfer mode on Mac OS X + because: + - Screen is double-buffered. (In srcCopy mode, a text is drawn + into an offscreen graphics world first. So performance gain + cannot be expected.) + - It lowers rendering quality. + - Some fonts leave garbage on cursor movement. */ + if (bg_width) + { + Rect r; - RGBBackColor (GC_BACK_COLOR (gc)); - SetRect (&r, x, y - FONT_BASE (GC_FONT (gc)), - x + bg_width, y + FONT_DESCENT (GC_FONT (gc))); - EraseRect (&r); - } - TextMode (srcOr); + RGBBackColor (GC_BACK_COLOR (gc)); + SetRect (&r, x, y - FONT_BASE (GC_FONT (gc)), + x + bg_width, y + FONT_DESCENT (GC_FONT (gc))); + EraseRect (&r); + } + TextMode (srcOr); #endif - TextFont (GC_FONT (gc)->mac_fontnum); - TextSize (GC_FONT (gc)->mac_fontsize); - TextFace (GC_FONT (gc)->mac_fontface); - MoveTo (x, y); + TextFont (GC_FONT (gc)->mac_fontnum); + TextSize (GC_FONT (gc)->mac_fontsize); + TextFace (GC_FONT (gc)->mac_fontface); + MoveTo (x, y); + DrawText (buf, 0, nchars * bytes_per_char); + if (overstrike_p) + { + TextMode (srcOr); + MoveTo (x + 1, y); DrawText (buf, 0, nchars * bytes_per_char); - if (overstrike_p) - { - TextMode (srcOr); - MoveTo (x + 1, y); - DrawText (buf, 0, nchars * bytes_per_char); - } - if (bg_width) - RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); - mac_end_clip (gc); + } + if (bg_width) + RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); + mac_end_clip (gc); #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020 - if (mac_use_core_graphics) - SwapQDTextFlags(savedFlags); + if (mac_use_core_graphics) + SwapQDTextFlags(savedFlags); #endif - } +} + + +static INLINE void +mac_draw_string_common (f, gc, x, y, buf, nchars, bg_width, + overstrike_p, bytes_per_char) + struct frame *f; + GC gc; + int x, y; + char *buf; + int nchars, bg_width, overstrike_p, bytes_per_char; +{ +#if USE_ATSUI + if (GC_FONT (gc)->mac_style) + mac_draw_image_string_atsui (f, gc, x, y, buf, nchars, bg_width, + overstrike_p, bytes_per_char); + else +#endif /* USE_ATSUI */ + mac_draw_image_string_qd (f, gc, x, y, buf, nchars, bg_width, + overstrike_p, bytes_per_char); } @@ -1378,7 +1386,6 @@ mac_draw_image_string_cg (f, gc, x, y, buf, nchars, bg_width, overstrike_p) XChar2b *buf; int nchars, bg_width, overstrike_p; { - CGrafPtr port; float port_height, gx, gy; int i; CGContextRef context; @@ -1388,7 +1395,6 @@ mac_draw_image_string_cg (f, gc, x, y, buf, nchars, bg_width, overstrike_p) if (!mac_use_core_graphics || GC_FONT (gc)->cg_font == NULL) return 0; - port = GetWindowPort (FRAME_MAC_WINDOW (f)); port_height = FRAME_PIXEL_HEIGHT (f); gx = x; gy = port_height - y; @@ -1409,7 +1415,7 @@ mac_draw_image_string_cg (f, gc, x, y, buf, nchars, bg_width, overstrike_p) #if USE_CG_DRAWING context = mac_begin_cg_clip (f, gc); #else - QDBeginCGContext (port, &context); + QDBeginCGContext (GetWindowPort (FRAME_MAC_WINDOW (f)), &context); if (gc->n_clip_rects || bg_width) { CGContextTranslateCTM (context, 0, port_height); @@ -1449,7 +1455,7 @@ mac_draw_image_string_cg (f, gc, x, y, buf, nchars, bg_width, overstrike_p) } } #if MAC_OS_X_VERSION_MIN_REQUIRED == 1020 - else + else /* CGContextShowGlyphsWithAdvances == NULL */ #endif #endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1030 */ #if MAC_OS_X_VERSION_MAX_ALLOWED < 1030 || MAC_OS_X_VERSION_MIN_REQUIRED == 1020 @@ -1467,7 +1473,7 @@ mac_draw_image_string_cg (f, gc, x, y, buf, nchars, bg_width, overstrike_p) mac_end_cg_clip (f); #else CGContextSynchronize (context); - QDEndCGContext (port, &context); + QDEndCGContext (GetWindowPort (FRAME_MAC_WINDOW (f)), &context); #endif return 1; @@ -1489,7 +1495,7 @@ mac_copy_area (src, f, gc, src_x, src_y, width, height, dest_x, dest_y) { Rect src_r, dest_r; - SetPortWindowPort (FRAME_MAC_WINDOW (f)); + mac_begin_clip (f, gc); 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); @@ -1497,7 +1503,6 @@ mac_copy_area (src, f, gc, src_x, src_y, width, height, dest_x, dest_y) ForeColor (blackColor); BackColor (whiteColor); - mac_begin_clip (gc); LockPixels (GetGWorldPixMap (src)); #if TARGET_API_MAC_CARBON { @@ -1515,9 +1520,10 @@ mac_copy_area (src, f, gc, src_x, src_y, width, height, dest_x, dest_y) &src_r, &dest_r, srcCopy, 0); #endif /* not TARGET_API_MAC_CARBON */ UnlockPixels (GetGWorldPixMap (src)); - mac_end_clip (gc); RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); + + mac_end_clip (gc); } @@ -1533,7 +1539,7 @@ mac_copy_area_with_mask (src, mask, f, gc, src_x, src_y, { Rect src_r, dest_r; - SetPortWindowPort (FRAME_MAC_WINDOW (f)); + mac_begin_clip (f, gc); 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); @@ -1541,7 +1547,6 @@ mac_copy_area_with_mask (src, mask, f, gc, src_x, src_y, ForeColor (blackColor); BackColor (whiteColor); - mac_begin_clip (gc); LockPixels (GetGWorldPixMap (src)); LockPixels (GetGWorldPixMap (mask)); #if TARGET_API_MAC_CARBON @@ -1561,9 +1566,10 @@ mac_copy_area_with_mask (src, mask, f, gc, src_x, src_y, #endif /* not TARGET_API_MAC_CARBON */ UnlockPixels (GetGWorldPixMap (mask)); UnlockPixels (GetGWorldPixMap (src)); - mac_end_clip (gc); RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); + + mac_end_clip (gc); } #endif /* !USE_CG_DRAWING */ @@ -1592,9 +1598,9 @@ mac_scroll_area (f, gc, src_x, src_y, width, height, dest_x, dest_y) DisposeRgn (dummy); #else /* not TARGET_API_MAC_CARBON */ Rect src_r, dest_r; - WindowPtr w = FRAME_MAC_WINDOW (f); + WindowRef w = FRAME_MAC_WINDOW (f); - SetPort (w); + mac_begin_clip (f, gc); 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); @@ -1603,11 +1609,11 @@ mac_scroll_area (f, gc, src_x, src_y, width, height, dest_x, dest_y) color mapping in CopyBits. Otherwise, it will be slow. */ ForeColor (blackColor); BackColor (whiteColor); - mac_begin_clip (gc); CopyBits (&(w->portBits), &(w->portBits), &src_r, &dest_r, srcCopy, 0); - mac_end_clip (gc); RGBBackColor (GC_BACK_COLOR (FRAME_NORMAL_GC (f))); + + mac_end_clip (gc); #endif /* not TARGET_API_MAC_CARBON */ } @@ -1852,7 +1858,7 @@ mac_reset_clip_rectangles (display, gc) void XSetWindowBackground (display, w, color) Display *display; - WindowPtr w; + WindowRef w; unsigned long color; { #if !TARGET_API_MAC_CARBON @@ -4368,7 +4374,7 @@ x_detect_focus_change (dpyinfo, event, bufp) { struct frame *frame; - frame = mac_window_to_frame ((WindowPtr) event->message); + frame = mac_window_to_frame ((WindowRef) event->message); if (! frame) return; @@ -4608,8 +4614,14 @@ XTmouse_position (fp, insist, bar_window, part, x, y, time) the frame are divided into. */ Point mouse_pos; +#if TARGET_API_MAC_CARBON + GetGlobalMouse (&mouse_pos); + mouse_pos.h -= f1->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f1); + mouse_pos.v -= f1->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f1); +#else SetPortWindowPort (FRAME_MAC_WINDOW (f1)); GetMouse (&mouse_pos); +#endif remember_mouse_glyph (f1, mouse_pos.h, mouse_pos.v, &last_mouse_glyph); last_mouse_glyph_frame = f1; @@ -4639,14 +4651,14 @@ static OSStatus set_scroll_bar_timer P_ ((EventTimerInterval)); static int control_part_code_to_scroll_bar_part P_ ((ControlPartCode)); static void construct_scroll_bar_click P_ ((struct scroll_bar *, int, struct input_event *)); -static OSStatus get_control_part_bounds P_ ((ControlHandle, ControlPartCode, +static OSStatus get_control_part_bounds P_ ((ControlRef, ControlPartCode, Rect *)); static void x_scroll_bar_handle_press P_ ((struct scroll_bar *, ControlPartCode, Point, struct input_event *)); static void x_scroll_bar_handle_release P_ ((struct scroll_bar *, struct input_event *)); -static void x_scroll_bar_handle_drag P_ ((WindowPtr, struct scroll_bar *, +static void x_scroll_bar_handle_drag P_ ((WindowRef, struct scroll_bar *, Point, struct input_event *)); static void x_set_toolkit_scroll_bar_thumb P_ ((struct scroll_bar *, int, int, int)); @@ -4739,7 +4751,7 @@ construct_scroll_bar_click (bar, part, bufp) static OSStatus get_control_part_bounds (ch, part_code, rect) - ControlHandle ch; + ControlRef ch; ControlPartCode part_code; Rect *rect; { @@ -4769,7 +4781,7 @@ x_scroll_bar_handle_press (bar, part_code, mouse_pos, bufp) if (part != scroll_bar_handle) { construct_scroll_bar_click (bar, part, bufp); - HiliteControl (SCROLL_BAR_CONTROL_HANDLE (bar), part_code); + HiliteControl (SCROLL_BAR_CONTROL_REF (bar), part_code); set_scroll_bar_timer (SCROLL_BAR_FIRST_DELAY); bar->dragging = Qnil; } @@ -4777,7 +4789,7 @@ x_scroll_bar_handle_press (bar, part_code, mouse_pos, bufp) { Rect r; - get_control_part_bounds (SCROLL_BAR_CONTROL_HANDLE (bar), + get_control_part_bounds (SCROLL_BAR_CONTROL_REF (bar), kControlIndicatorPart, &r); XSETINT (bar->dragging, - (mouse_pos.v - r.top) - 1); } @@ -4795,7 +4807,7 @@ x_scroll_bar_handle_release (bar, bufp) || (INTEGERP (bar->dragging) && XINT (bar->dragging) >= 0)) construct_scroll_bar_click (bar, scroll_bar_end_scroll, bufp); - HiliteControl (SCROLL_BAR_CONTROL_HANDLE (bar), 0); + HiliteControl (SCROLL_BAR_CONTROL_REF (bar), 0); set_scroll_bar_timer (kEventDurationForever); last_scroll_bar_part = -1; @@ -4805,19 +4817,19 @@ x_scroll_bar_handle_release (bar, bufp) static void x_scroll_bar_handle_drag (win, bar, mouse_pos, bufp) - WindowPtr win; + WindowRef win; struct scroll_bar *bar; Point mouse_pos; struct input_event *bufp; { - ControlHandle ch = SCROLL_BAR_CONTROL_HANDLE (bar); + ControlRef ch = SCROLL_BAR_CONTROL_REF (bar); if (last_scroll_bar_part == scroll_bar_handle) { int top, top_range; Rect r; - get_control_part_bounds (SCROLL_BAR_CONTROL_HANDLE (bar), + get_control_part_bounds (SCROLL_BAR_CONTROL_REF (bar), kControlIndicatorPart, &r); if (INTEGERP (bar->dragging) && XINT (bar->dragging) < 0) @@ -4865,13 +4877,13 @@ x_scroll_bar_handle_drag (win, bar, mouse_pos, bufp) } if (unhilite_p) - HiliteControl (SCROLL_BAR_CONTROL_HANDLE (bar), 0); + HiliteControl (SCROLL_BAR_CONTROL_REF (bar), 0); else if (part != last_scroll_bar_part || scroll_bar_timer_event_posted_p) { construct_scroll_bar_click (bar, part, bufp); last_scroll_bar_part = part; - HiliteControl (SCROLL_BAR_CONTROL_HANDLE (bar), part_code); + HiliteControl (SCROLL_BAR_CONTROL_REF (bar), part_code); set_scroll_bar_timer (SCROLL_BAR_CONTINUOUS_DELAY); } } @@ -4885,7 +4897,7 @@ x_set_toolkit_scroll_bar_thumb (bar, portion, position, whole) struct scroll_bar *bar; int portion, position, whole; { - ControlHandle ch = SCROLL_BAR_CONTROL_HANDLE (bar); + ControlRef ch = SCROLL_BAR_CONTROL_REF (bar); int value, viewsize, maximum; if (XINT (bar->track_height) == 0) @@ -4944,7 +4956,7 @@ x_scroll_bar_create (w, top, left, width, height, disp_top, disp_height) struct scroll_bar *bar = XSCROLL_BAR (Fmake_vector (make_number (SCROLL_BAR_VEC_SIZE), Qnil)); Rect r; - ControlHandle ch; + ControlRef ch; BLOCK_INPUT; @@ -4968,7 +4980,7 @@ x_scroll_bar_create (w, top, left, width, height, disp_top, disp_height) ch = NewControl (FRAME_MAC_WINDOW (f), &r, "\p", width < disp_height, 0, 0, 0, scrollBarProc, (long) bar); #endif - SET_SCROLL_BAR_CONTROL_HANDLE (bar, ch); + SET_SCROLL_BAR_CONTROL_REF (bar, ch); XSETWINDOW (bar->window, w); XSETINT (bar->top, top); @@ -5018,7 +5030,7 @@ x_scroll_bar_set_handle (bar, start, end, rebuild) int rebuild; { int dragging = ! NILP (bar->dragging); - ControlHandle ch = SCROLL_BAR_CONTROL_HANDLE (bar); + ControlRef ch = SCROLL_BAR_CONTROL_REF (bar); FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height)); int length = end - start; @@ -5087,7 +5099,7 @@ x_scroll_bar_remove (bar) mac_prepare_for_quickdraw (f); #endif /* Destroy the Mac scroll bar control */ - DisposeControl (SCROLL_BAR_CONTROL_HANDLE (bar)); + DisposeControl (SCROLL_BAR_CONTROL_REF (bar)); /* Disassociate this scroll bar from its window. */ XWINDOW (bar->window)->vertical_scroll_bar = Qnil; @@ -5165,10 +5177,10 @@ XTset_vertical_scroll_bar (w, portion, whole, position) else { /* It may just need to be moved and resized. */ - ControlHandle ch; + ControlRef ch; bar = XSCROLL_BAR (w->vertical_scroll_bar); - ch = SCROLL_BAR_CONTROL_HANDLE (bar); + ch = SCROLL_BAR_CONTROL_REF (bar); BLOCK_INPUT; @@ -5224,7 +5236,7 @@ XTset_vertical_scroll_bar (w, portion, whole, position) } else { - ControlHandle ch = SCROLL_BAR_CONTROL_HANDLE (bar); + ControlRef ch = SCROLL_BAR_CONTROL_REF (bar); Rect r0, r1; BLOCK_INPUT; @@ -5501,19 +5513,24 @@ x_scroll_bar_report_motion (fp, bar_window, part, x, y, time) unsigned long *time; { struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar); - ControlHandle ch = SCROLL_BAR_CONTROL_HANDLE (bar); + ControlRef ch = SCROLL_BAR_CONTROL_REF (bar); #if TARGET_API_MAC_CARBON - WindowPtr wp = GetControlOwner (ch); + WindowRef wp = GetControlOwner (ch); #else - WindowPtr wp = (*ch)->contrlOwner; + WindowRef wp = (*ch)->contrlOwner; #endif Point mouse_pos; struct frame *f = mac_window_to_frame (wp); int win_y, top_range; +#if TARGET_API_MAC_CARBON + GetGlobalMouse (&mouse_pos); + mouse_pos.h -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); + mouse_pos.v -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); +#else SetPortWindowPort (wp); - GetMouse (&mouse_pos); +#endif win_y = mouse_pos.v - XINT (bar->top); top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height)); @@ -6141,9 +6158,7 @@ x_set_offset (f, xoff, yoff, change_gravity) ConstrainWindowToScreen (FRAME_MAC_WINDOW (f), kWindowTitleBarRgn, kWindowConstrainMoveRegardlessOfFit | kWindowConstrainAllowPartial, NULL, NULL); -#if USE_CARBON_EVENTS if (!NILP (tip_frame) && XFRAME (tip_frame) == f) -#endif mac_handle_origin_change (f); #else { @@ -6219,7 +6234,7 @@ x_set_window_size (f, change_gravity, cols, rows) SizeWindow (FRAME_MAC_WINDOW (f), pixelwidth, pixelheight, 0); -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON if (!NILP (tip_frame) && f == XFRAME (tip_frame)) #endif mac_handle_size_change (f, pixelwidth, pixelheight); @@ -6266,17 +6281,11 @@ x_set_mouse_pixel_position (f, pix_x, pix_y) int pix_x, pix_y; { #ifdef MAC_OSX - Point p; - CGPoint point; + pix_x += f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); + pix_y += f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); BLOCK_INPUT; - SetPortWindowPort (FRAME_MAC_WINDOW (f)); - p.h = pix_x; - p.v = pix_y; - LocalToGlobal (&p); - point.x = p.h; - point.y = p.v; - CGWarpMouseCursorPosition (point); + CGWarpMouseCursorPosition (CGPointMake (pix_x, pix_y)); UNBLOCK_INPUT; #else #if 0 /* MAC_TODO: LMSetMouseLocation and CursorDeviceMoveTo are non-Carbon */ @@ -6358,7 +6367,7 @@ static void mac_handle_visibility_change (f) struct frame *f; { - WindowPtr wp = FRAME_MAC_WINDOW (f); + WindowRef wp = FRAME_MAC_WINDOW (f); int visible = 0, iconified = 0; struct input_event buf; @@ -6426,32 +6435,7 @@ x_make_frame_visible (f) before the window gets really visible. */ if (! FRAME_ICONIFIED_P (f) && ! f->output_data.mac->asked_for_visible) - { -#if TARGET_API_MAC_CARBON - if (!(FRAME_SIZE_HINTS (f)->flags & (USPosition | PPosition))) - { - struct frame *sf = SELECTED_FRAME (); - if (!FRAME_MAC_P (sf)) - RepositionWindow (FRAME_MAC_WINDOW (f), NULL, - kWindowCenterOnMainScreen); - else - RepositionWindow (FRAME_MAC_WINDOW (f), - FRAME_MAC_WINDOW (sf), -#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020 - kWindowCascadeStartAtParentWindowScreen -#else - kWindowCascadeOnParentWindowScreen -#endif - ); -#if USE_CARBON_EVENTS - if (!NILP (tip_frame) && f == XFRAME (tip_frame)) -#endif - mac_handle_origin_change (f); - } - else -#endif - x_set_offset (f, f->left_pos, f->top_pos, 0); - } + x_set_offset (f, f->left_pos, f->top_pos, 0); f->output_data.mac->asked_for_visible = 1; @@ -6525,18 +6509,20 @@ x_make_frame_invisible (f) BLOCK_INPUT; +#if !TARGET_API_MAC_CARBON /* Before unmapping the window, update the WM_SIZE_HINTS property to claim that the current position of the window is user-specified, rather than program-specified, so that when the window is mapped again, it will be placed at the same location, without forcing the user to position it by hand again (they have already done that once for this window.) */ x_wm_set_size_hint (f, (long) 0, 1); +#endif HideWindow (FRAME_MAC_WINDOW (f)); UNBLOCK_INPUT; -#if !USE_CARBON_EVENTS +#if !TARGET_API_MAC_CARBON mac_handle_visibility_change (f); #endif } @@ -6575,7 +6561,7 @@ x_iconify_frame (f) if (err != noErr) error ("Can't notify window manager of iconification"); -#if !USE_CARBON_EVENTS +#if !TARGET_API_MAC_CARBON mac_handle_visibility_change (f); #endif } @@ -6588,7 +6574,7 @@ x_free_frame_resources (f) struct frame *f; { struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f); - WindowPtr wp = FRAME_MAC_WINDOW (f); + WindowRef wp = FRAME_MAC_WINDOW (f); BLOCK_INPUT; @@ -8723,16 +8709,93 @@ x_find_ccl_program (fontp) possible. */ static int font_panel_shown_p = 0; +extern Lisp_Object Qfont; +static Lisp_Object Qpanel_closed, Qselection; + +static OSStatus mac_store_event_ref_as_apple_event P_ ((AEEventClass, AEEventID, + Lisp_Object, + Lisp_Object, + EventRef, UInt32, + const EventParamName *, + const EventParamType *)); + int mac_font_panel_visible_p () { return font_panel_shown_p && FPIsFontPanelVisible (); } +static pascal OSStatus +mac_handle_font_event (next_handler, event, data) + EventHandlerCallRef next_handler; + EventRef event; + void *data; +{ + OSStatus result, err; + Lisp_Object id_key; + int num_params; + const EventParamName *names; + const EventParamType *types; + static const EventParamName names_sel[] = {kEventParamATSUFontID, + kEventParamATSUFontSize, + kEventParamFMFontFamily, + kEventParamFMFontSize, + kEventParamFontColor}; + static const EventParamType types_sel[] = {typeATSUFontID, + typeATSUSize, + typeFMFontFamily, + typeFMFontSize, + typeFontColor}; + + result = CallNextEventHandler (next_handler, event); + if (result != eventNotHandledErr) + return result; + + switch (GetEventKind (event)) + { + case kEventFontPanelClosed: + id_key = Qpanel_closed; + num_params = 0; + names = NULL; + types = NULL; + break; + + case kEventFontSelection: + id_key = Qselection; + num_params = sizeof (names_sel) / sizeof (names_sel[0]); + names = names_sel; + types = types_sel; + break; + } + + err = mac_store_event_ref_as_apple_event (0, 0, Qfont, id_key, + event, num_params, + names, types); + if (err == noErr) + result = noErr; + + return result; +} + OSStatus mac_show_hide_font_panel () { - font_panel_shown_p = 1; + if (!font_panel_shown_p) + { + OSStatus err; + + static const EventTypeSpec specs[] = + {{kEventClassFont, kEventFontPanelClosed}, + {kEventClassFont, kEventFontSelection}}; + + err = InstallApplicationEventHandler (mac_handle_font_event, + GetEventTypeCount (specs), + specs, NULL, NULL); + if (err != noErr) + return err; + + font_panel_shown_p = 1; + } return FPShowHideFontPanel (); } @@ -8848,7 +8911,7 @@ Lisp_Object Vmac_function_modifier; a three button mouse */ Lisp_Object Vmac_emulate_three_button_mouse; -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON /* Non-zero if the mouse wheel button (i.e. button 4) should map to mouse-2, instead of mouse-3. */ int mac_wheel_button_is_mouse_2; @@ -8873,16 +8936,12 @@ static int mac_screen_config_changed = 0; Point saved_menu_event_location; /* Apple Events */ -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON static Lisp_Object Qhi_command; #ifdef MAC_OSX extern Lisp_Object Qwindow; static Lisp_Object Qtoolbar_switch_mode; #endif -#if USE_MAC_FONT_PANEL -extern Lisp_Object Qfont; -static Lisp_Object Qpanel_closed, Qselection; -#endif #if USE_MAC_TSM static TSMDocumentID tsm_document_id; static Lisp_Object Qtext_input; @@ -8894,7 +8953,7 @@ static Lisp_Object saved_ts_script_language_on_focus; static ScriptLanguageRecord saved_ts_language; static Component saved_ts_component; #endif -#endif +#endif /* TARGET_API_MAC_CARBON */ extern int mac_ready_for_apple_events; extern Lisp_Object Qundefined; extern void init_apple_event_handler P_ ((void)); @@ -8907,20 +8966,15 @@ extern OSErr init_coercion_handler P_ ((void)); extern OSErr install_drag_handler P_ ((WindowRef)); extern void remove_drag_handler P_ ((WindowRef)); +#if TARGET_API_MAC_CARBON /* Showing help echo string during menu tracking */ -extern OSStatus install_menu_target_item_handler P_ ((WindowPtr)); +extern OSStatus install_menu_target_item_handler P_ ((void)); -#if USE_CARBON_EVENTS #ifdef MAC_OSX -extern void init_service_handler (); +extern OSStatus install_service_handler (); static Lisp_Object Qservice, Qpaste, Qperform; #endif - -/* Window Event Handler */ -static pascal OSStatus mac_handle_window_event (EventHandlerCallRef, - EventRef, void *); #endif -OSStatus install_window_handler (WindowPtr); extern void init_emacs_passwd_dir (); extern int emacs_main (int, char **, char **); @@ -9004,7 +9058,7 @@ static const unsigned char fn_keycode_to_keycode_table[] = { #endif /* MAC_OSX */ static int -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON mac_to_emacs_modifiers (UInt32 mods) #else mac_to_emacs_modifiers (EventModifiers mods) @@ -9113,17 +9167,19 @@ mac_quit_char_key_p (modifiers, key_code) } #endif -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON /* Obtains the event modifiers from the event ref and then calls mac_to_emacs_modifiers. */ static int mac_event_to_emacs_modifiers (EventRef eventRef) { - UInt32 mods = 0; + UInt32 mods = 0, class; + GetEventParameter (eventRef, kEventParamKeyModifiers, typeUInt32, NULL, sizeof (UInt32), NULL, &mods); + class = GetEventClass (eventRef); if (!NILP (Vmac_emulate_three_button_mouse) && - GetEventClass(eventRef) == kEventClassMouse) + (class == kEventClassMouse || class == kEventClassCommand)) { mods &= ~(optionKey | cmdKey); } @@ -9262,7 +9318,7 @@ static void do_get_menus (void) { Handle menubar_handle; - MenuHandle menu_handle; + MenuRef menu; menubar_handle = GetNewMBar (128); if(menubar_handle == NULL) @@ -9271,9 +9327,9 @@ do_get_menus (void) DrawMenuBar (); #if !TARGET_API_MAC_CARBON - menu_handle = GetMenuHandle (M_APPLE); - if(menu_handle != NULL) - AppendResMenu (menu_handle,'DRVR'); + menu = GetMenuRef (M_APPLE); + if (menu != NULL) + AppendResMenu (menu, 'DRVR'); else abort (); #endif @@ -9322,7 +9378,7 @@ do_check_ram_size (void) #endif /* MAC_OS8 */ static void -do_window_update (WindowPtr win) +do_window_update (WindowRef win) { struct frame *f = mac_window_to_frame (win); @@ -9367,7 +9423,7 @@ do_window_update (WindowPtr win) } static int -is_emacs_window (WindowPtr win) +is_emacs_window (WindowRef win) { Lisp_Object tail, frame; @@ -9480,7 +9536,7 @@ do_apple_menu (SInt16 menu_item) NoteAlert (ABOUT_ALERT_ID, NULL); else { - GetMenuItemText (GetMenuHandle (M_APPLE), menu_item, item_name); + GetMenuItemText (GetMenuRef (M_APPLE), menu_item, item_name); da_driver_refnum = OpenDeskAcc (item_name); } } @@ -9491,7 +9547,7 @@ do_apple_menu (SInt16 menu_item) static void do_grow_window (w, e) - WindowPtr w; + WindowRef w; const EventRecord *e; { Rect limit_rect; @@ -9543,7 +9599,7 @@ mac_get_ideal_size (f) struct frame *f; { struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f); - WindowPtr w = FRAME_MAC_WINDOW (f); + WindowRef w = FRAME_MAC_WINDOW (f); Point ideal_size; Rect standard_rect; int height, width, columns, rows; @@ -9569,7 +9625,7 @@ mac_get_ideal_size (f) wide (DEFAULT_NUM_COLS) and as tall as will fit on the screen. */ static void -do_zoom_window (WindowPtr w, int zoom_in_or_out) +do_zoom_window (WindowRef w, int zoom_in_or_out) { Rect zoom_rect, port_rect; int width, height; @@ -9632,13 +9688,9 @@ do_zoom_window (WindowPtr w, int zoom_in_or_out) SetPort (save_port); #endif /* not TARGET_API_MAC_CARBON */ -#if !USE_CARBON_EVENTS +#if !TARGET_API_MAC_CARBON /* retrieve window size and update application values */ -#if TARGET_API_MAC_CARBON - GetWindowPortBounds (w, &port_rect); -#else port_rect = w->portRect; -#endif height = port_rect.bottom - port_rect.top; width = port_rect.right - port_rect.left; @@ -9647,6 +9699,210 @@ do_zoom_window (WindowPtr w, int zoom_in_or_out) #endif } +static void +mac_set_unicode_keystroke_event (code, buf) + UniChar code; + struct input_event *buf; +{ + int charset_id, c1, c2; + + if (code < 0x80) + { + buf->kind = ASCII_KEYSTROKE_EVENT; + buf->code = code; + } + else if (code < 0x100) + { + if (code < 0xA0) + charset_id = CHARSET_8_BIT_CONTROL; + else + charset_id = charset_latin_iso8859_1; + buf->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT; + buf->code = MAKE_CHAR (charset_id, code, 0); + } + else + { + if (code < 0x2500) + charset_id = charset_mule_unicode_0100_24ff, + code -= 0x100; + else if (code < 0x33FF) + charset_id = charset_mule_unicode_2500_33ff, + code -= 0x2500; + else if (code >= 0xE000) + charset_id = charset_mule_unicode_e000_ffff, + code -= 0xE000; + c1 = (code / 96) + 32, c2 = (code % 96) + 32; + buf->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT; + buf->code = MAKE_CHAR (charset_id, c1, c2); + } +} + +static void +do_keystroke (action, char_code, key_code, modifiers, timestamp, buf) + EventKind action; + unsigned char char_code; + UInt32 key_code, modifiers; + unsigned long timestamp; + struct input_event *buf; +{ + static SInt16 last_key_script = -1; + SInt16 current_key_script = GetScriptManagerVariable (smKeyScript); + UInt32 mapped_modifiers = mac_mapped_modifiers (modifiers); + +#ifdef MAC_OSX + if (mapped_modifiers & kEventKeyModifierFnMask + && key_code <= 0x7f + && fn_keycode_to_keycode_table[key_code]) + key_code = fn_keycode_to_keycode_table[key_code]; +#endif + + if (key_code <= 0x7f && keycode_to_xkeysym_table[key_code]) + { + buf->kind = NON_ASCII_KEYSTROKE_EVENT; + buf->code = 0xff00 | keycode_to_xkeysym_table[key_code]; +#ifdef MAC_OSX + if (modifiers & kEventKeyModifierFnMask + && key_code <= 0x7f + && fn_keycode_to_keycode_table[key_code] == key_code) + modifiers &= ~kEventKeyModifierFnMask; +#endif + } + else if (mapped_modifiers) + { + /* translate the keycode back to determine the original key */ +#ifdef MAC_OSX + UCKeyboardLayout *uchr_ptr = NULL; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020 + OSStatus err; + KeyboardLayoutRef layout; + + err = KLGetCurrentKeyboardLayout (&layout); + if (err == noErr) + err = KLGetKeyboardLayoutProperty (layout, kKLuchrData, + (const void **) &uchr_ptr); +#else + static SInt16 last_key_layout_id = 0; + static Handle uchr_handle = (Handle)-1; + SInt16 current_key_layout_id = + GetScriptVariable (current_key_script, smScriptKeys); + + if (uchr_handle == (Handle)-1 + || last_key_layout_id != current_key_layout_id) + { + uchr_handle = GetResource ('uchr', current_key_layout_id); + last_key_layout_id = current_key_layout_id; + } + if (uchr_handle) + uchr_ptr = (UCKeyboardLayout *)*uchr_handle; +#endif + + if (uchr_ptr) + { + OSStatus status; + UInt16 key_action = action - keyDown; + UInt32 modifier_key_state = (modifiers & ~mapped_modifiers) >> 8; + UInt32 keyboard_type = LMGetKbdType (); + SInt32 dead_key_state = 0; + UniChar code; + UniCharCount actual_length; + + status = UCKeyTranslate (uchr_ptr, key_code, key_action, + modifier_key_state, keyboard_type, + kUCKeyTranslateNoDeadKeysMask, + &dead_key_state, + 1, &actual_length, &code); + if (status == noErr && actual_length == 1) + mac_set_unicode_keystroke_event (code, buf); + } +#endif /* MAC_OSX */ + + if (buf->kind == NO_EVENT) + { + /* 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. */ + /* Mask off modifier keys that are mapped to some Emacs + modifiers. */ + int new_modifiers = modifiers & ~mapped_modifiers; + /* set high byte of keycode to modifier high byte*/ + int new_key_code = key_code | new_modifiers; + Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache); + unsigned long some_state = 0; + UInt32 new_char_code; + + new_char_code = KeyTranslate (kchr_ptr, new_key_code, &some_state); + if (new_char_code == 0) + /* Seems like a dead key. Append up-stroke. */ + new_char_code = KeyTranslate (kchr_ptr, new_key_code | 0x80, + &some_state); + if (new_char_code) + { + buf->kind = ASCII_KEYSTROKE_EVENT; + buf->code = new_char_code & 0xff; + } + } + } + + if (buf->kind == NO_EVENT) + { + buf->kind = ASCII_KEYSTROKE_EVENT; + buf->code = char_code; + } + + buf->modifiers = mac_to_emacs_modifiers (modifiers); + buf->modifiers |= (extra_keyboard_modifiers + & (meta_modifier | alt_modifier + | hyper_modifier | super_modifier)); + +#if TARGET_API_MAC_CARBON + if (buf->kind == ASCII_KEYSTROKE_EVENT + && buf->code >= 0x80 && buf->modifiers) + { + OSStatus err; + TextEncoding encoding = kTextEncodingMacRoman; + TextToUnicodeInfo ttu_info; + + UpgradeScriptInfoToTextEncoding (current_key_script, + kTextLanguageDontCare, + kTextRegionDontCare, + NULL, &encoding); + err = CreateTextToUnicodeInfoByEncoding (encoding, &ttu_info); + if (err == noErr) + { + UniChar code; + Str255 pstr; + ByteCount unicode_len; + + pstr[0] = 1; + pstr[1] = buf->code; + err = ConvertFromPStringToUnicode (ttu_info, pstr, + sizeof (UniChar), + &unicode_len, &code); + if (err == noErr && unicode_len == sizeof (UniChar)) + mac_set_unicode_keystroke_event (code, buf); + DisposeTextToUnicodeInfo (&ttu_info); + } + } +#endif + + if (buf->kind == ASCII_KEYSTROKE_EVENT + && buf->code >= 0x80 + && last_key_script != current_key_script) + { + struct input_event event; + + EVENT_INIT (event); + event.kind = LANGUAGE_CHANGE_EVENT; + event.arg = Qnil; + event.code = current_key_script; + event.timestamp = timestamp; + kbd_buffer_store_event (&event); + last_key_script = current_key_script; + } +} + void mac_store_apple_event (class, id, desc) Lisp_Object class, id; @@ -9725,54 +9981,49 @@ mac_store_drag_event (window, mouse_pos, modifiers, desc) buf.arg = mac_aedesc_to_lisp (desc); kbd_buffer_store_event (&buf); } -#endif -#if USE_CARBON_EVENTS -static pascal OSStatus -mac_handle_command_event (next_handler, event, data) - EventHandlerCallRef next_handler; +#ifdef MAC_OSX +OSStatus +mac_store_service_event (event) EventRef event; - void *data; { - OSStatus result, err; - HICommand command; - static const EventParamName names[] = - {kEventParamDirectObject, kEventParamKeyModifiers}; - static const EventParamType types[] = - {typeHICommand, typeUInt32}; - int num_params = sizeof (names) / sizeof (names[0]); - - result = CallNextEventHandler (next_handler, event); - if (result != eventNotHandledErr) - return result; + OSStatus err; + Lisp_Object id_key; + int num_params; + const EventParamName *names; + const EventParamType *types; + static const EventParamName names_pfm[] = + {kEventParamServiceMessageName, kEventParamServiceUserData}; + static const EventParamType types_pfm[] = + {typeCFStringRef, typeCFStringRef}; - err = GetEventParameter (event, kEventParamDirectObject, typeHICommand, - NULL, sizeof (HICommand), NULL, &command); + switch (GetEventKind (event)) + { + case kEventServicePaste: + id_key = Qpaste; + num_params = 0; + names = NULL; + types = NULL; + break; - if (err != noErr || command.commandID == 0) - return eventNotHandledErr; + case kEventServicePerform: + id_key = Qperform; + num_params = sizeof (names_pfm) / sizeof (names_pfm[0]); + names = names_pfm; + types = types_pfm; + break; - /* A HI command event is mapped to an Apple event whose event class - symbol is `hi-command' and event ID is its command ID. */ - err = mac_store_event_ref_as_apple_event (0, command.commandID, - Qhi_command, Qnil, - event, num_params, names, types); - return err == noErr ? noErr : eventNotHandledErr; -} + default: + abort (); + } -static OSStatus -init_command_handler () -{ - static const EventTypeSpec specs[] = - {{kEventClassCommand, kEventCommandProcess}}; - static EventHandlerUPP handle_command_eventUPP = NULL; + err = mac_store_event_ref_as_apple_event (0, 0, Qservice, id_key, + event, num_params, + names, types); - if (handle_command_eventUPP == NULL) - handle_command_eventUPP = NewEventHandlerUPP (mac_handle_command_event); - return InstallApplicationEventHandler (handle_command_eventUPP, - GetEventTypeCount (specs), specs, - NULL, NULL); + return err; } +#endif /* MAC_OSX */ static pascal OSStatus mac_handle_window_event (next_handler, event, data) @@ -9780,47 +10031,78 @@ mac_handle_window_event (next_handler, event, data) EventRef event; void *data; { - WindowPtr wp; - OSStatus result, err; + WindowRef wp; + OSStatus err, result = eventNotHandledErr; struct frame *f; UInt32 attributes; XSizeHints *size_hints; err = GetEventParameter (event, kEventParamDirectObject, typeWindowRef, - NULL, sizeof (WindowPtr), NULL, &wp); + NULL, sizeof (WindowRef), NULL, &wp); if (err != noErr) return eventNotHandledErr; f = mac_window_to_frame (wp); switch (GetEventKind (event)) { + /* -- window refresh events -- */ + case kEventWindowUpdate: result = CallNextEventHandler (next_handler, event); if (result != eventNotHandledErr) - return result; + break; do_window_update (wp); - return noErr; + result = noErr; + break; - case kEventWindowGetIdealSize: - result = CallNextEventHandler (next_handler, event); - if (result != eventNotHandledErr) - return result; + /* -- window state change events -- */ - { - Point ideal_size = mac_get_ideal_size (f); + case kEventWindowShowing: + size_hints = FRAME_SIZE_HINTS (f); + if (!(size_hints->flags & (USPosition | PPosition))) + { + struct frame *sf = SELECTED_FRAME (); - err = SetEventParameter (event, kEventParamDimensions, - typeQDPoint, sizeof (Point), &ideal_size); - if (err == noErr) - return noErr; - } + if (!(FRAME_MAC_P (sf))) + RepositionWindow (wp, NULL, kWindowCenterOnMainScreen); + else + { + RepositionWindow (wp, FRAME_MAC_WINDOW (sf), +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020 + kWindowCascadeStartAtParentWindowScreen +#else + kWindowCascadeOnParentWindowScreen +#endif + ); + } + result = noErr; + } + break; + + case kEventWindowHiding: + /* Before unmapping the window, update the WM_SIZE_HINTS + property to claim that the current position of the window is + user-specified, rather than program-specified, so that when + the window is mapped again, it will be placed at the same + location, without forcing the user to position it by hand + again (they have already done that once for this window.) */ + x_wm_set_size_hint (f, (long) 0, 1); + result = noErr; + break; + + case kEventWindowShown: + case kEventWindowHidden: + case kEventWindowCollapsed: + case kEventWindowExpanded: + mac_handle_visibility_change (f); + result = noErr; break; case kEventWindowBoundsChanging: result = CallNextEventHandler (next_handler, event); if (result != eventNotHandledErr) - return result; + break; err = GetEventParameter (event, kEventParamAttributes, typeUInt32, NULL, sizeof (UInt32), NULL, &attributes); @@ -9864,7 +10146,7 @@ mac_handle_window_event (next_handler, event, data) bounds.bottom = bounds.top + height; SetEventParameter (event, kEventParamCurrentBounds, typeQDRectangle, sizeof (Rect), &bounds); - return noErr; + result = noErr; } break; @@ -9895,21 +10177,12 @@ mac_handle_window_event (next_handler, event, data) if (attributes & kWindowBoundsChangeOriginChanged) mac_handle_origin_change (f); - return noErr; - - case kEventWindowShown: - case kEventWindowHidden: - case kEventWindowExpanded: - case kEventWindowCollapsed: - result = CallNextEventHandler (next_handler, event); - - mac_handle_visibility_change (f); - return noErr; - + result = noErr; break; + /* -- window action events -- */ + case kEventWindowClose: - result = CallNextEventHandler (next_handler, event); { struct input_event buf; @@ -9919,11 +10192,26 @@ mac_handle_window_event (next_handler, event, data) buf.arg = Qnil; kbd_buffer_store_event (&buf); } - return noErr; + result = noErr; + break; + + case kEventWindowGetIdealSize: + result = CallNextEventHandler (next_handler, event); + if (result != eventNotHandledErr) + break; + + { + Point ideal_size = mac_get_ideal_size (f); + + err = SetEventParameter (event, kEventParamDimensions, + typeQDPoint, sizeof (Point), &ideal_size); + if (err == noErr) + result = noErr; + } + break; #ifdef MAC_OSX case kEventWindowToolbarSwitchMode: - result = CallNextEventHandler (next_handler, event); { static const EventParamName names[] = {kEventParamDirectObject, kEventParamWindowMouseLocation, @@ -9945,23 +10233,195 @@ mac_handle_window_event (next_handler, event, data) event, num_params, names, types); } - return err == noErr ? noErr : result; + if (err == noErr) + result = noErr; + break; #endif #if USE_MAC_TSM + /* -- window focus events -- */ + case kEventWindowFocusAcquired: - result = CallNextEventHandler (next_handler, event); err = mac_tsm_resume (); - return err == noErr ? noErr : result; + if (err == noErr) + result = noErr; + break; case kEventWindowFocusRelinquish: - result = CallNextEventHandler (next_handler, event); err = mac_tsm_suspend (); - return err == noErr ? noErr : result; + if (err == noErr) + result = noErr; + break; +#endif + + default: + abort (); + } + + return result; +} + +static pascal OSStatus +mac_handle_application_event (next_handler, event, data) + EventHandlerCallRef next_handler; + EventRef event; + void *data; +{ + OSStatus err, result = eventNotHandledErr; + + switch (GetEventKind (event)) + { +#if USE_MAC_TSM + case kEventAppActivated: + err = mac_tsm_resume (); + break; + + case kEventAppDeactivated: + err = mac_tsm_suspend (); + break; #endif + + default: + abort (); } - return eventNotHandledErr; + if (err == noErr) + result = noErr; + + return result; +} + +static pascal OSStatus +mac_handle_keyboard_event (next_handler, event, data) + EventHandlerCallRef next_handler; + EventRef event; + void *data; +{ + OSStatus err, result = eventNotHandledErr; + UInt32 event_kind, key_code, modifiers, mapped_modifiers; + unsigned char char_code; + + event_kind = GetEventKind (event); + switch (event_kind) + { + case kEventRawKeyDown: + case kEventRawKeyRepeat: + case kEventRawKeyUp: + if (read_socket_inev == NULL) + { + result = CallNextEventHandler (next_handler, event); + break; + } + + err = GetEventParameter (event, kEventParamKeyModifiers, + typeUInt32, NULL, + sizeof (UInt32), NULL, &modifiers); + if (err != noErr) + break; + + mapped_modifiers = mac_mapped_modifiers (modifiers); + + /* 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 (!(mapped_modifiers + & ~(mac_pass_command_to_system ? cmdKey : 0) + & ~(mac_pass_control_to_system ? controlKey : 0))) + { + result = CallNextEventHandler (next_handler, event); + if (result != eventNotHandledErr) + break; + } + +#if USE_MAC_TSM + if (read_socket_inev->kind != NO_EVENT) + { + result = noErr; + break; + } +#endif + + if (event_kind == kEventRawKeyUp) + break; + + err = GetEventParameter (event, kEventParamKeyMacCharCodes, + typeChar, NULL, + sizeof (char), NULL, &char_code); + if (err != noErr) + break; + + err = GetEventParameter (event, kEventParamKeyCode, + typeUInt32, NULL, + sizeof (UInt32), NULL, &key_code); + if (err != noErr) + break; + + do_keystroke ((GetEventKind (event) == kEventRawKeyDown + ? keyDown : autoKey), + char_code, key_code, modifiers, + ((unsigned long) + (GetEventTime (event) / kEventDurationMillisecond)), + read_socket_inev); + result = noErr; + break; + + default: + abort (); + } + + return result; +} + +static pascal OSStatus +mac_handle_command_event (next_handler, event, data) + EventHandlerCallRef next_handler; + EventRef event; + void *data; +{ + OSStatus err, result = eventNotHandledErr; + HICommand command; + static const EventParamName names[] = + {kEventParamDirectObject, kEventParamKeyModifiers}; + static const EventParamType types[] = + {typeHICommand, typeUInt32}; + int num_params = sizeof (names) / sizeof (names[0]); + + err = GetEventParameter (event, kEventParamDirectObject, typeHICommand, + NULL, sizeof (HICommand), NULL, &command); + if (err != noErr) + return eventNotHandledErr; + + switch (GetEventKind (event)) + { + case kEventCommandProcess: + result = CallNextEventHandler (next_handler, event); + if (result != eventNotHandledErr) + break; + + err = GetEventParameter (event, kEventParamDirectObject, + typeHICommand, NULL, + sizeof (HICommand), NULL, &command); + + if (err != noErr || command.commandID == 0) + break; + + /* A HI command event is mapped to an Apple event whose event + class symbol is `hi-command' and event ID is its command + ID. */ + err = mac_store_event_ref_as_apple_event (0, command.commandID, + Qhi_command, Qnil, + event, num_params, + names, types); + if (err == noErr) + result = noErr; + break; + + default: + abort (); + } + + return result; } static pascal OSStatus @@ -9970,13 +10430,13 @@ mac_handle_mouse_event (next_handler, event, data) EventRef event; void *data; { - OSStatus result, err; + OSStatus err, result = eventNotHandledErr; switch (GetEventKind (event)) { case kEventMouseWheelMoved: { - WindowPtr wp; + WindowRef wp; struct frame *f; EventMouseWheelAxis axis; SInt32 delta; @@ -9984,15 +10444,14 @@ mac_handle_mouse_event (next_handler, event, data) result = CallNextEventHandler (next_handler, event); if (result != eventNotHandledErr || read_socket_inev == NULL) - return result; + break; + + f = mac_focus_frame (&one_mac_display_info); err = GetEventParameter (event, kEventParamWindowRef, typeWindowRef, NULL, sizeof (WindowRef), NULL, &wp); - if (err != noErr) - break; - - f = mac_window_to_frame (wp); - if (f != mac_focus_frame (&one_mac_display_info)) + if (err != noErr + || wp != FRAME_MAC_WINDOW (f)) break; err = GetEventParameter (event, kEventParamMouseWheelAxis, @@ -10007,8 +10466,8 @@ mac_handle_mouse_event (next_handler, event, data) if (err != noErr) break; - SetPortWindowPort (wp); - GlobalToLocal (&point); + point.h -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); + point.v -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); if (point.h < 0 || point.v < 0 || EQ (window_from_coordinates (f, point.h, point.v, 0, 0, 0, 1), f->tool_bar_window)) @@ -10029,68 +10488,16 @@ mac_handle_mouse_event (next_handler, event, data) XSETINT (read_socket_inev->y, point.v); XSETFRAME (read_socket_inev->frame_or_window, f); - return noErr; + result = noErr; } break; default: - break; - } - - return eventNotHandledErr; -} - -#if USE_MAC_FONT_PANEL -static pascal OSStatus -mac_handle_font_event (next_handler, event, data) - EventHandlerCallRef next_handler; - EventRef event; - void *data; -{ - OSStatus result, err; - Lisp_Object id_key; - int num_params; - const EventParamName *names; - const EventParamType *types; - static const EventParamName names_sel[] = {kEventParamATSUFontID, - kEventParamATSUFontSize, - kEventParamFMFontFamily, - kEventParamFMFontSize, - kEventParamFontColor}; - static const EventParamType types_sel[] = {typeATSUFontID, - typeATSUSize, - typeFMFontFamily, - typeFMFontSize, - typeFontColor}; - - result = CallNextEventHandler (next_handler, event); - if (result != eventNotHandledErr) - return result; - - switch (GetEventKind (event)) - { - case kEventFontPanelClosed: - id_key = Qpanel_closed; - num_params = 0; - names = NULL; - types = NULL; - break; - - case kEventFontSelection: - id_key = Qselection; - num_params = sizeof (names_sel) / sizeof (names_sel[0]); - names = names_sel; - types = types_sel; - break; + abort (); } - err = mac_store_event_ref_as_apple_event (0, 0, Qfont, id_key, - event, num_params, - names, types); - - return err == noErr ? noErr : eventNotHandledErr; + return result; } -#endif #if USE_MAC_TSM static pascal OSStatus @@ -10147,6 +10554,8 @@ mac_handle_text_input_event (next_handler, event, data) typeUnicodeText}; result = CallNextEventHandler (next_handler, event); + if (result != eventNotHandledErr) + return result; switch (GetEventKind (event)) { @@ -10174,7 +10583,7 @@ mac_handle_text_input_event (next_handler, event, data) sizeof (UInt32), NULL, &modifiers); if (err == noErr && mac_mapped_modifiers (modifiers)) /* There're mapped modifier keys. Process it in - XTread_socket. */ + do_keystroke. */ return eventNotHandledErr; if (err == noErr) err = GetEventParameter (kbd_event, kEventParamKeyUnicodes, @@ -10189,7 +10598,7 @@ mac_handle_text_input_event (next_handler, event, data) sizeof (UniChar), NULL, &code); if (err == noErr && code < 0x80) { - /* ASCII character. Process it in XTread_socket. */ + /* ASCII character. Process it in do_keystroke. */ if (read_socket_inev && code >= 0x20 && code <= 0x7e) { UInt32 key_code; @@ -10251,11 +10660,11 @@ mac_handle_text_input_event (next_handler, event, data) } p.h = (WINDOW_TO_FRAME_PIXEL_X (w, w->cursor.x) - + WINDOW_LEFT_FRINGE_WIDTH (w)); + + WINDOW_LEFT_FRINGE_WIDTH (w) + + f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f)); p.v = (WINDOW_TO_FRAME_PIXEL_Y (w, w->cursor.y) - + FONT_BASE (FRAME_FONT (f))); - SetPortWindowPort (FRAME_MAC_WINDOW (f)); - LocalToGlobal (&p); + + FONT_BASE (FRAME_FONT (f)) + + f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f)); err = SetEventParameter (event, kEventParamTextInputReplyPoint, typeQDPoint, sizeof (typeQDPoint), &p); } @@ -10269,146 +10678,155 @@ mac_handle_text_input_event (next_handler, event, data) err = mac_store_event_ref_as_apple_event (0, 0, Qtext_input, id_key, event, num_params, names, types); + if (err == noErr) + result = noErr; - return err == noErr ? noErr : result; + return result; } #endif +#endif /* TARGET_API_MAC_CARBON */ + -#ifdef MAC_OSX OSStatus -mac_store_service_event (event) - EventRef event; +install_window_handler (window) + WindowRef window; { - OSStatus err; - Lisp_Object id_key; - int num_params; - const EventParamName *names; - const EventParamType *types; - static const EventParamName names_pfm[] = - {kEventParamServiceMessageName, kEventParamServiceUserData}; - static const EventParamType types_pfm[] = - {typeCFStringRef, typeCFStringRef}; + OSStatus err = noErr; - switch (GetEventKind (event)) +#if TARGET_API_MAC_CARBON + if (err == noErr) { - case kEventServicePaste: - id_key = Qpaste; - num_params = 0; - names = NULL; - types = NULL; - break; + static const EventTypeSpec specs[] = + { + /* -- window refresh events -- */ + {kEventClassWindow, kEventWindowUpdate}, + /* -- window state change events -- */ + {kEventClassWindow, kEventWindowShowing}, + {kEventClassWindow, kEventWindowHiding}, + {kEventClassWindow, kEventWindowShown}, + {kEventClassWindow, kEventWindowHidden}, + {kEventClassWindow, kEventWindowCollapsed}, + {kEventClassWindow, kEventWindowExpanded}, + {kEventClassWindow, kEventWindowBoundsChanging}, + {kEventClassWindow, kEventWindowBoundsChanged}, + /* -- window action events -- */ + {kEventClassWindow, kEventWindowClose}, + {kEventClassWindow, kEventWindowGetIdealSize}, +#ifdef MAC_OSX + {kEventClassWindow, kEventWindowToolbarSwitchMode}, +#endif +#if USE_MAC_TSM + /* -- window focus events -- */ + {kEventClassWindow, kEventWindowFocusAcquired}, + {kEventClassWindow, kEventWindowFocusRelinquish}, +#endif + }; + static EventHandlerUPP handle_window_eventUPP = NULL; - case kEventServicePerform: - id_key = Qperform; - num_params = sizeof (names_pfm) / sizeof (names_pfm[0]); - names = names_pfm; - types = types_pfm; - break; + if (handle_window_eventUPP == NULL) + handle_window_eventUPP = NewEventHandlerUPP (mac_handle_window_event); - default: - abort (); + err = InstallWindowEventHandler (window, handle_window_eventUPP, + GetEventTypeCount (specs), + specs, NULL, NULL); } +#endif - err = mac_store_event_ref_as_apple_event (0, 0, Qservice, id_key, - event, num_params, - names, types); + if (err == noErr) + err = install_drag_handler (window); return err; } -#endif /* MAC_OSX */ -#endif /* USE_CARBON_EVENTS */ +void +remove_window_handler (window) + WindowRef window; +{ + remove_drag_handler (window); +} -OSStatus -install_window_handler (window) - WindowPtr window; +#if TARGET_API_MAC_CARBON +static OSStatus +install_application_handler () { OSStatus err = noErr; -#if USE_CARBON_EVENTS - static const EventTypeSpec specs_window[] = - {{kEventClassWindow, kEventWindowUpdate}, - {kEventClassWindow, kEventWindowGetIdealSize}, - {kEventClassWindow, kEventWindowBoundsChanging}, - {kEventClassWindow, kEventWindowBoundsChanged}, - {kEventClassWindow, kEventWindowShown}, - {kEventClassWindow, kEventWindowHidden}, - {kEventClassWindow, kEventWindowExpanded}, - {kEventClassWindow, kEventWindowCollapsed}, - {kEventClassWindow, kEventWindowClose}, -#ifdef MAC_OSX - {kEventClassWindow, kEventWindowToolbarSwitchMode}, -#endif -#if USE_MAC_TSM - {kEventClassWindow, kEventWindowFocusAcquired}, - {kEventClassWindow, kEventWindowFocusRelinquish}, -#endif - }; - static const EventTypeSpec specs_mouse[] = - {{kEventClassMouse, kEventMouseWheelMoved}}; - static EventHandlerUPP handle_window_eventUPP = NULL; - static EventHandlerUPP handle_mouse_eventUPP = NULL; -#if USE_MAC_FONT_PANEL - static const EventTypeSpec specs_font[] = - {{kEventClassFont, kEventFontPanelClosed}, - {kEventClassFont, kEventFontSelection}}; - static EventHandlerUPP handle_font_eventUPP = NULL; -#endif -#if USE_MAC_TSM - static const EventTypeSpec specs_text_input[] = - {{kEventClassTextInput, kEventTextInputUpdateActiveInputArea}, - {kEventClassTextInput, kEventTextInputUnicodeForKeyEvent}, - {kEventClassTextInput, kEventTextInputOffsetToPos}}; - static EventHandlerUPP handle_text_input_eventUPP = NULL; -#endif - if (handle_window_eventUPP == NULL) - handle_window_eventUPP = NewEventHandlerUPP (mac_handle_window_event); - if (handle_mouse_eventUPP == NULL) - handle_mouse_eventUPP = NewEventHandlerUPP (mac_handle_mouse_event); -#if USE_MAC_FONT_PANEL - if (handle_font_eventUPP == NULL) - handle_font_eventUPP = NewEventHandlerUPP (mac_handle_font_event); -#endif + if (err == noErr) + { + static const EventTypeSpec specs[] = { #if USE_MAC_TSM - if (handle_text_input_eventUPP == NULL) - handle_text_input_eventUPP = - NewEventHandlerUPP (mac_handle_text_input_event); + {kEventClassApplication, kEventAppActivated}, + {kEventClassApplication, kEventAppDeactivated}, #endif - err = InstallWindowEventHandler (window, handle_window_eventUPP, - GetEventTypeCount (specs_window), - specs_window, NULL, NULL); + }; + + err = InstallApplicationEventHandler (NewEventHandlerUPP + (mac_handle_application_event), + GetEventTypeCount (specs), + specs, NULL, NULL); + } + if (err == noErr) - err = InstallWindowEventHandler (window, handle_mouse_eventUPP, - GetEventTypeCount (specs_mouse), - specs_mouse, NULL, NULL); -#if USE_MAC_FONT_PANEL + { + static const EventTypeSpec specs[] = + {{kEventClassKeyboard, kEventRawKeyDown}, + {kEventClassKeyboard, kEventRawKeyRepeat}, + {kEventClassKeyboard, kEventRawKeyUp}}; + + err = InstallApplicationEventHandler (NewEventHandlerUPP + (mac_handle_keyboard_event), + GetEventTypeCount (specs), + specs, NULL, NULL); + } + if (err == noErr) - err = InstallWindowEventHandler (window, handle_font_eventUPP, - GetEventTypeCount (specs_font), - specs_font, NULL, NULL); -#endif + { + static const EventTypeSpec specs[] = + {{kEventClassCommand, kEventCommandProcess}}; + + err = InstallApplicationEventHandler (NewEventHandlerUPP + (mac_handle_command_event), + GetEventTypeCount (specs), + specs, NULL, NULL); + } + + if (err == noErr) + { + static const EventTypeSpec specs[] = + {{kEventClassMouse, kEventMouseWheelMoved}}; + + err = InstallApplicationEventHandler (NewEventHandlerUPP + (mac_handle_mouse_event), + GetEventTypeCount (specs), + specs, NULL, NULL); + } + #if USE_MAC_TSM if (err == noErr) - err = InstallWindowEventHandler (window, handle_text_input_eventUPP, - GetEventTypeCount (specs_text_input), - specs_text_input, window, NULL); -#endif + { + static const EventTypeSpec spec[] = + {{kEventClassTextInput, kEventTextInputUpdateActiveInputArea}, + {kEventClassTextInput, kEventTextInputUnicodeForKeyEvent}, + {kEventClassTextInput, kEventTextInputOffsetToPos}}; + + err = InstallApplicationEventHandler (NewEventHandlerUPP + (mac_handle_text_input_event), + GetEventTypeCount (spec), + spec, NULL, NULL); + } #endif + if (err == noErr) - err = install_drag_handler (window); + err = install_menu_target_item_handler (); + +#ifdef MAC_OSX if (err == noErr) - err = install_menu_target_item_handler (window); + err = install_service_handler (); +#endif return err; } - -void -remove_window_handler (window) - WindowPtr window; -{ - remove_drag_handler (window); -} - +#endif static pascal void mac_handle_dm_notification (event) @@ -10417,20 +10835,48 @@ mac_handle_dm_notification (event) mac_screen_config_changed = 1; } +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030 +static void +mac_handle_cg_display_reconfig (display, flags, user_info) + CGDirectDisplayID display; + CGDisplayChangeSummaryFlags flags; + void *user_info; +{ + mac_screen_config_changed = 1; +} +#endif + static OSErr init_dm_notification_handler () { - OSErr err; - static DMNotificationUPP handle_dm_notificationUPP = NULL; - ProcessSerialNumber psn; + OSErr err = noErr; - if (handle_dm_notificationUPP == NULL) - handle_dm_notificationUPP = - NewDMNotificationUPP (mac_handle_dm_notification); +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030 +#if MAC_OS_X_VERSION_MIN_REQUIRED == 1020 + if (CGDisplayRegisterReconfigurationCallback != NULL) +#endif + { + CGDisplayRegisterReconfigurationCallback (mac_handle_cg_display_reconfig, + NULL); + } +#if MAC_OS_X_VERSION_MIN_REQUIRED == 1020 + else /* CGDisplayRegisterReconfigurationCallback == NULL */ +#endif +#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1030 */ +#if MAC_OS_X_VERSION_MAX_ALLOWED < 1030 || MAC_OS_X_VERSION_MIN_REQUIRED == 1020 + { + static DMNotificationUPP handle_dm_notificationUPP = NULL; + ProcessSerialNumber psn; - err = GetCurrentProcess (&psn); - if (err == noErr) - err = DMRegisterNotifyProc (handle_dm_notificationUPP, &psn); + if (handle_dm_notificationUPP == NULL) + handle_dm_notificationUPP = + NewDMNotificationUPP (mac_handle_dm_notification); + + err = GetCurrentProcess (&psn); + if (err == noErr) + err = DMRegisterNotifyProc (handle_dm_notificationUPP, &psn); + } +#endif return err; } @@ -10575,7 +11021,7 @@ main (void) } #endif -#if !USE_CARBON_EVENTS +#if !TARGET_API_MAC_CARBON static RgnHandle mouse_region = NULL; Boolean @@ -10612,7 +11058,7 @@ mac_wait_next_event (er, sleep_time, dequeue) er_buf.what = nullEvent; return true; } -#endif /* not USE_CARBON_EVENTS */ +#endif /* not TARGET_API_MAC_CARBON */ #if TARGET_API_MAC_CARBON OSStatus @@ -10646,44 +11092,6 @@ mac_post_mouse_moved_event () return err; } - -static void -mac_set_unicode_keystroke_event (code, buf) - UniChar code; - struct input_event *buf; -{ - int charset_id, c1, c2; - - if (code < 0x80) - { - buf->kind = ASCII_KEYSTROKE_EVENT; - buf->code = code; - } - else if (code < 0x100) - { - if (code < 0xA0) - charset_id = CHARSET_8_BIT_CONTROL; - else - charset_id = charset_latin_iso8859_1; - buf->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT; - buf->code = MAKE_CHAR (charset_id, code, 0); - } - else - { - if (code < 0x2500) - charset_id = charset_mule_unicode_0100_24ff, - code -= 0x100; - else if (code < 0x33FF) - charset_id = charset_mule_unicode_2500_33ff, - code -= 0x2500; - else if (code >= 0xE000) - charset_id = charset_mule_unicode_e000_ffff, - code -= 0xE000; - c1 = (code / 96) + 32, c2 = (code % 96) + 32; - buf->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT; - buf->code = MAKE_CHAR (charset_id, c1, c2); - } -} #endif /* Emacs calls this whenever it wants to read an input event from the @@ -10695,7 +11103,7 @@ XTread_socket (sd, expected, hold_quit) { struct input_event inev; int count = 0; -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON EventRef eventRef; EventTargetRef toolbox_dispatcher; #endif @@ -10716,7 +11124,7 @@ XTread_socket (sd, expected, hold_quit) ++handling_signal; -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON toolbox_dispatcher = GetEventDispatcherTarget (); while ( @@ -10725,9 +11133,9 @@ XTread_socket (sd, expected, hold_quit) #endif !ReceiveNextEvent (0, NULL, kEventDurationNoWait, kEventRemoveFromQueue, &eventRef)) -#else /* !USE_CARBON_EVENTS */ +#else /* !TARGET_API_MAC_CARBON */ while (mac_wait_next_event (&er, 0, true)) -#endif /* !USE_CARBON_EVENTS */ +#endif /* !TARGET_API_MAC_CARBON */ { int do_help = 0; struct frame *f; @@ -10737,44 +11145,33 @@ XTread_socket (sd, expected, hold_quit) inev.kind = NO_EVENT; inev.arg = Qnil; -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON timestamp = GetEventTime (eventRef) / kEventDurationMillisecond; -#else - timestamp = er.when * (1000 / 60); /* ticks to milliseconds */ -#endif -#if USE_CARBON_EVENTS - /* Handle new events */ if (!mac_convert_event_ref (eventRef, &er)) - { - /* There used to be a handler for the kEventMouseWheelMoved - event here. But as of Mac OS X 10.4, this kind of event - is not directly posted to the main event queue by - two-finger scrolling on the trackpad. Instead, some - private event is posted and it is converted to a wheel - event by the default handler for the application target. - The converted one can be received by a Carbon event - handler installed on a window target. */ - read_socket_inev = &inev; - SendEventToEventTarget (eventRef, toolbox_dispatcher); - read_socket_inev = NULL; - } - else -#endif /* USE_CARBON_EVENTS */ + goto OTHER; +#else /* !TARGET_API_MAC_CARBON */ + timestamp = er.when * (1000 / 60); /* ticks to milliseconds */ +#endif /* !TARGET_API_MAC_CARBON */ + switch (er.what) { case mouseDown: case mouseUp: { - WindowPtr window_ptr; + WindowRef window_ptr; ControlPartCode part_code; int tool_bar_p = 0; -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON + OSStatus err; + /* This is needed to send mouse events like aqua window buttons to the correct handler. */ - if (SendEventToEventTarget (eventRef, toolbox_dispatcher) - != eventNotHandledErr) + read_socket_inev = &inev; + err = SendEventToEventTarget (eventRef, toolbox_dispatcher); + read_socket_inev = NULL; + if (err != eventNotHandledErr) break; #endif last_mouse_glyph_frame = 0; @@ -10822,17 +11219,20 @@ XTread_socket (sd, expected, hold_quit) else { ControlPartCode control_part_code; - ControlHandle ch; - Point mouse_loc = er.where; + ControlRef ch; + Point mouse_loc; #ifdef MAC_OSX ControlKind control_kind; #endif f = mac_window_to_frame (window_ptr); /* convert to local coordinates of new window */ - SetPortWindowPort (window_ptr); - - GlobalToLocal (&mouse_loc); + mouse_loc.h = (er.where.h + - (f->left_pos + + FRAME_OUTER_TO_INNER_DIFF_X (f))); + mouse_loc.v = (er.where.v + - (f->top_pos + + FRAME_OUTER_TO_INNER_DIFF_Y (f))); #if TARGET_API_MAC_CARBON ch = FindControlUnderMouse (mouse_loc, window_ptr, &control_part_code); @@ -10845,7 +11245,7 @@ XTread_socket (sd, expected, hold_quit) &ch); #endif -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON inev.code = mac_get_mouse_btn (eventRef); inev.modifiers = mac_event_to_emacs_modifiers (eventRef); #else @@ -10981,16 +11381,14 @@ XTread_socket (sd, expected, hold_quit) DragWindow (window_ptr, er.where, NULL); #else /* not TARGET_API_MAC_CARBON */ DragWindow (window_ptr, er.where, &qd.screenBits.bounds); -#endif /* not TARGET_API_MAC_CARBON */ /* Update the frame parameters. */ -#if !USE_CARBON_EVENTS { struct frame *f = mac_window_to_frame (window_ptr); if (f && !f->async_iconified) mac_handle_origin_change (f); } -#endif +#endif /* not TARGET_API_MAC_CARBON */ break; case inGoAway: @@ -11020,35 +11418,17 @@ XTread_socket (sd, expected, hold_quit) } break; +#if !TARGET_API_MAC_CARBON case updateEvt: -#if USE_CARBON_EVENTS - if (SendEventToEventTarget (eventRef, toolbox_dispatcher) - != eventNotHandledErr) - break; -#else - do_window_update ((WindowPtr) er.message); -#endif + do_window_update ((WindowRef) er.message); break; +#endif case osEvt: -#if USE_CARBON_EVENTS - if (SendEventToEventTarget (eventRef, toolbox_dispatcher) - != eventNotHandledErr) - break; -#endif switch ((er.message >> 24) & 0x000000FF) { - case suspendResumeMessage: -#if USE_MAC_TSM - if (er.message & resumeFlag) - mac_tsm_resume (); - else - mac_tsm_suspend (); -#endif - break; - case mouseMovedMessage: -#if !USE_CARBON_EVENTS +#if !TARGET_API_MAC_CARBON SetRectRgn (mouse_region, er.where.h, er.where.v, er.where.h + 1, er.where.v + 1); #endif @@ -11069,13 +11449,15 @@ XTread_socket (sd, expected, hold_quit) if (f) { - WindowPtr wp = FRAME_MAC_WINDOW (f); - Point mouse_pos = er.where; - - SetPortWindowPort (wp); - - GlobalToLocal (&mouse_pos); - + WindowRef wp = FRAME_MAC_WINDOW (f); + Point mouse_pos; + + mouse_pos.h = (er.where.h + - (f->left_pos + + FRAME_OUTER_TO_INNER_DIFF_X (f))); + mouse_pos.v = (er.where.v + - (f->top_pos + + FRAME_OUTER_TO_INNER_DIFF_Y (f))); if (dpyinfo->grabbed && tracked_scroll_bar) #ifdef USE_TOOLKIT_SCROLL_BARS x_scroll_bar_handle_drag (wp, tracked_scroll_bar, @@ -11123,18 +11505,16 @@ XTread_socket (sd, expected, hold_quit) if (!NILP (help_echo_string) || !NILP (previous_help_echo_string)) do_help = 1; break; + + default: + goto OTHER; } break; case activateEvt: { - WindowPtr window_ptr = (WindowPtr) er.message; + WindowRef window_ptr = (WindowRef) er.message; -#if USE_CARBON_EVENTS - if (SendEventToEventTarget (eventRef, toolbox_dispatcher) - != eventNotHandledErr) - break; -#endif if (window_ptr == tip_window) { HideWindow (tip_window); @@ -11142,21 +11522,26 @@ XTread_socket (sd, expected, hold_quit) } if (!is_emacs_window (window_ptr)) - break; + goto OTHER; + + f = mac_window_to_frame (window_ptr); if ((er.modifiers & activeFlag) != 0) { /* A window has been activated */ - Point mouse_loc = er.where; + Point mouse_loc; x_detect_focus_change (dpyinfo, &er, &inev); - SetPortWindowPort (window_ptr); - GlobalToLocal (&mouse_loc); + mouse_loc.h = (er.where.h + - (f->left_pos + + FRAME_OUTER_TO_INNER_DIFF_X (f))); + mouse_loc.v = (er.where.v + - (f->top_pos + + FRAME_OUTER_TO_INNER_DIFF_Y (f))); /* Window-activated event counts as mouse movement, so update things that depend on mouse position. */ - note_mouse_movement (mac_window_to_frame (window_ptr), - &mouse_loc); + note_mouse_movement (f, &mouse_loc); } else { @@ -11181,7 +11566,6 @@ XTread_socket (sd, expected, hold_quit) x_detect_focus_change (dpyinfo, &er, &inev); - f = mac_window_to_frame (window_ptr); if (f == dpyinfo->mouse_face_mouse_frame) { /* If we move outside the frame, then we're @@ -11204,218 +11588,26 @@ XTread_socket (sd, expected, hold_quit) case keyDown: case keyUp: case autoKey: - { - int keycode = (er.message & keyCodeMask) >> 8; - static SInt16 last_key_script = -1; - SInt16 current_key_script; - UInt32 modifiers = er.modifiers, mapped_modifiers; + ObscureCursor (); -#if USE_CARBON_EVENTS && defined (MAC_OSX) - GetEventParameter (eventRef, kEventParamKeyModifiers, - typeUInt32, NULL, - sizeof (UInt32), NULL, &modifiers); -#endif - mapped_modifiers = mac_mapped_modifiers (modifiers); - -#if USE_CARBON_EVENTS && (defined (MAC_OSX) || USE_MAC_TSM) - /* 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 (!(mapped_modifiers - & ~(mac_pass_command_to_system ? cmdKey : 0) - & ~(mac_pass_control_to_system ? controlKey : 0))) - { - OSStatus err; - - read_socket_inev = &inev; - err = SendEventToEventTarget (eventRef, toolbox_dispatcher); - read_socket_inev = NULL; - if (err != eventNotHandledErr) - break; - } -#endif - if (er.what == keyUp) - break; - - ObscureCursor (); - - f = mac_focus_frame (dpyinfo); - - if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight) - && !EQ (f->tool_bar_window, dpyinfo->mouse_face_window)) - { - clear_mouse_face (dpyinfo); - dpyinfo->mouse_face_hidden = 1; - } - - current_key_script = GetScriptManagerVariable (smKeyScript); - if (last_key_script != current_key_script) - { - struct input_event event; - - EVENT_INIT (event); - event.kind = LANGUAGE_CHANGE_EVENT; - event.arg = Qnil; - event.code = current_key_script; - event.timestamp = timestamp; - kbd_buffer_store_event (&event); - count++; - last_key_script = current_key_script; - } - -#if USE_MAC_TSM - if (inev.kind != NO_EVENT) - break; -#endif - -#ifdef MAC_OSX - if (mapped_modifiers & kEventKeyModifierFnMask - && keycode <= 0x7f - && fn_keycode_to_keycode_table[keycode]) - keycode = fn_keycode_to_keycode_table[keycode]; -#endif - if (keycode <= 0x7f && keycode_to_xkeysym_table [keycode]) - { - inev.kind = NON_ASCII_KEYSTROKE_EVENT; - inev.code = 0xff00 | keycode_to_xkeysym_table [keycode]; -#ifdef MAC_OSX - if (modifiers & kEventKeyModifierFnMask - && keycode <= 0x7f - && fn_keycode_to_keycode_table[keycode] == keycode) - modifiers &= ~kEventKeyModifierFnMask; -#endif - } - else if (mapped_modifiers) - { - /* translate the keycode back to determine the - original key */ -#ifdef MAC_OSX - UCKeyboardLayout *uchr_ptr = NULL; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020 - OSStatus err; - KeyboardLayoutRef layout; - - err = KLGetCurrentKeyboardLayout (&layout); - if (err == noErr) - KLGetKeyboardLayoutProperty (layout, kKLuchrData, - (const void **) &uchr_ptr); -#else - static SInt16 last_key_layout_id = 0; - static Handle uchr_handle = (Handle)-1; - SInt16 current_key_layout_id = - GetScriptVariable (current_key_script, smScriptKeys); - - if (uchr_handle == (Handle)-1 - || last_key_layout_id != current_key_layout_id) - { - uchr_handle = GetResource ('uchr', current_key_layout_id); - last_key_layout_id = current_key_layout_id; - } - if (uchr_handle) - uchr_ptr = (UCKeyboardLayout *)*uchr_handle; -#endif - - if (uchr_ptr) - { - OSStatus status; - UInt16 key_action = er.what - keyDown; - UInt32 modifier_key_state = - (modifiers & ~mapped_modifiers) >> 8; - UInt32 keyboard_type = LMGetKbdType (); - SInt32 dead_key_state = 0; - UniChar code; - UniCharCount actual_length; - - status = UCKeyTranslate (uchr_ptr, - keycode, key_action, - modifier_key_state, - keyboard_type, - kUCKeyTranslateNoDeadKeysMask, - &dead_key_state, - 1, &actual_length, &code); - if (status == noErr && actual_length == 1) - mac_set_unicode_keystroke_event (code, &inev); - } -#endif /* MAC_OSX */ - - if (inev.kind == NO_EVENT) - { - /* 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. */ - /* Mask off modifier keys that are mapped to some - Emacs modifiers. */ - int new_modifiers = er.modifiers & ~mapped_modifiers; - /* set high byte of keycode to modifier high byte*/ - int new_keycode = keycode | new_modifiers; - Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache); - unsigned long some_state = 0; - UInt32 new_char_code; - - new_char_code = KeyTranslate (kchr_ptr, new_keycode, - &some_state); - if (new_char_code == 0) - /* Seems like a dead key. Append up-stroke. */ - new_char_code = KeyTranslate (kchr_ptr, - new_keycode | 0x80, - &some_state); - if (new_char_code) - { - inev.kind = ASCII_KEYSTROKE_EVENT; - inev.code = new_char_code & 0xff; - } - } - } - - if (inev.kind == NO_EVENT) - { - inev.kind = ASCII_KEYSTROKE_EVENT; - inev.code = er.message & charCodeMask; - } - - inev.modifiers = mac_to_emacs_modifiers (modifiers); - inev.modifiers |= (extra_keyboard_modifiers - & (meta_modifier | alt_modifier - | hyper_modifier | super_modifier)); - XSETFRAME (inev.frame_or_window, f); + f = mac_focus_frame (dpyinfo); + XSETFRAME (inev.frame_or_window, f); + /* If mouse-highlight is an integer, input clears out mouse + highlighting. */ + if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight) + && !EQ (f->tool_bar_window, dpyinfo->mouse_face_window)) + { + clear_mouse_face (dpyinfo); + dpyinfo->mouse_face_hidden = 1; + } #if TARGET_API_MAC_CARBON - if (inev.kind == ASCII_KEYSTROKE_EVENT - && inev.code >= 0x80 && inev.modifiers) - { - OSStatus err; - TextEncoding encoding = kTextEncodingMacRoman; - TextToUnicodeInfo ttu_info; - - UpgradeScriptInfoToTextEncoding (current_key_script, - kTextLanguageDontCare, - kTextRegionDontCare, - NULL, &encoding); - err = CreateTextToUnicodeInfoByEncoding (encoding, &ttu_info); - if (err == noErr) - { - UniChar code; - Str255 pstr; - ByteCount unicode_len; - - pstr[0] = 1; - pstr[1] = inev.code; - err = ConvertFromPStringToUnicode (ttu_info, pstr, - sizeof (UniChar), - &unicode_len, &code); - if (err == noErr && unicode_len == sizeof (UniChar)) - mac_set_unicode_keystroke_event (code, &inev); - DisposeTextToUnicodeInfo (&ttu_info); - } - } + goto OTHER; +#else + do_keystroke (er.what, er.message & charCodeMask, + (er.message & keyCodeMask) >> 8, + er.modifiers, timestamp, &inev); #endif - } break; case kHighLevelEvent: @@ -11423,9 +11615,19 @@ XTread_socket (sd, expected, hold_quit) break; default: + OTHER: +#if TARGET_API_MAC_CARBON + { + OSStatus err; + + read_socket_inev = &inev; + err = SendEventToEventTarget (eventRef, toolbox_dispatcher); + read_socket_inev = NULL; + } +#endif break; } -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON ReleaseEvent (eventRef); #endif @@ -11477,7 +11679,7 @@ XTread_socket (sd, expected, hold_quit) mac_screen_config_changed = 0; } -#if !USE_CARBON_EVENTS +#if !TARGET_API_MAC_CARBON /* Check which frames are still visible. We do this here because there doesn't seem to be any direct notification from the Window Manager that the visibility of a window has changed (at least, @@ -11582,7 +11784,7 @@ make_mac_terminal_frame (struct frame *f) if (!(FRAME_MAC_WINDOW (f) = NewCWindow (NULL, &r, "\p", true, dBoxProc, - (WindowPtr) -1, 1, (long) f->output_data.mac))) + (WindowRef) -1, 1, (long) f->output_data.mac))) abort (); /* so that update events can find this mac_output struct */ f->output_data.mac->mFP = f; /* point back to emacs frame */ @@ -11780,7 +11982,6 @@ init_menu_bar () &menu, &menu_index); if (err == noErr) SetMenuItemCommandKey (menu, menu_index, false, 0); -#if USE_CARBON_EVENTS EnableMenuCommand (NULL, kHICommandPreferences); err = GetIndMenuItemWithCommandID (NULL, kHICommandPreferences, 1, &menu, &menu_index); @@ -11792,10 +11993,9 @@ init_menu_bar () InsertMenuItemTextWithCFString (menu, CFSTR ("About Emacs"), 0, 0, kHICommandAbout); } -#endif /* USE_CARBON_EVENTS */ #else /* !MAC_OSX */ -#if USE_CARBON_EVENTS - SetMenuItemCommandID (GetMenuHandle (M_APPLE), I_ABOUT, kHICommandAbout); +#if TARGET_API_MAC_CARBON + SetMenuItemCommandID (GetMenuRef (M_APPLE), I_ABOUT, kHICommandAbout); #endif #endif } @@ -11929,19 +12129,13 @@ mac_initialize () #if TARGET_API_MAC_CARBON -#if USE_CARBON_EVENTS -#ifdef MAC_OSX - init_service_handler (); -#endif /* MAC_OSX */ - - init_command_handler (); + install_application_handler (); init_menu_bar (); #if USE_MAC_TSM init_tsm (); #endif -#endif /* USE_CARBON_EVENTS */ #ifdef MAC_OSX init_coercion_handler (); @@ -11992,7 +12186,7 @@ syms_of_macterm () Fput (Qhyper, Qmodifier_value, make_number (hyper_modifier)); Fput (Qsuper, Qmodifier_value, make_number (super_modifier)); -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON Qhi_command = intern ("hi-command"); staticpro (&Qhi_command); #ifdef MAC_OSX Qtoolbar_switch_mode = intern ("toolbar-switch-mode"); @@ -12117,7 +12311,7 @@ The symbol `reverse' means that the option-key will register for mouse-3 and the command-key will register for mouse-2. */); Vmac_emulate_three_button_mouse = Qnil; -#if USE_CARBON_EVENTS +#if TARGET_API_MAC_CARBON DEFVAR_BOOL ("mac-wheel-button-is-mouse-2", &mac_wheel_button_is_mouse_2, doc: /* *Non-nil if the wheel button is mouse-2 and the right click mouse-3. Otherwise, the right click will be treated as mouse-2 and the wheel |