comparison src/macterm.c @ 55851:f1d6a507dcfd

Support Tooltips with the Carbon emacs port. Some code cleanup using helper macros.
author Steven Tamm <steventamm@mac.com>
date Sun, 30 May 2004 00:18:41 +0000
parents 21f88361795c
children 5e784b2ea638 9fb10038ca55
comparison
equal deleted inserted replaced
55850:63ca25eb73a1 55851:f1d6a507dcfd
51 #include <LowMem.h> 51 #include <LowMem.h>
52 #include <Controls.h> 52 #include <Controls.h>
53 #if defined (__MRC__) || (__MSL__ >= 0x6000) 53 #if defined (__MRC__) || (__MSL__ >= 0x6000)
54 #include <ControlDefinitions.h> 54 #include <ControlDefinitions.h>
55 #endif 55 #endif
56 #include <Gestalt.h>
57 56
58 #if __profile__ 57 #if __profile__
59 #include <profiler.h> 58 #include <profiler.h>
60 #endif 59 #endif
61 #endif /* not MAC_OSX */ 60 #endif /* not MAC_OSX */
193 along with the position query. So, we just keep track of the time 192 along with the position query. So, we just keep track of the time
194 of the last movement we received, and return that in hopes that 193 of the last movement we received, and return that in hopes that
195 it's somewhat accurate. */ 194 it's somewhat accurate. */
196 195
197 static Time last_mouse_movement_time; 196 static Time last_mouse_movement_time;
198
199 enum mouse_tracking_type {
200 mouse_tracking_none,
201 mouse_tracking_mouse_movement,
202 mouse_tracking_scroll_bar
203 };
204
205 enum mouse_tracking_type mouse_tracking_in_progress = mouse_tracking_none;
206 197
207 struct scroll_bar *tracked_scroll_bar = NULL; 198 struct scroll_bar *tracked_scroll_bar = NULL;
208 199
209 /* Incremented by XTread_socket whenever it really tries to read 200 /* Incremented by XTread_socket whenever it really tries to read
210 events. */ 201 events. */
362 Display *display; 353 Display *display;
363 WindowPtr w; 354 WindowPtr w;
364 GC gc; 355 GC gc;
365 int x1, y1, x2, y2; 356 int x1, y1, x2, y2;
366 { 357 {
367 #if TARGET_API_MAC_CARBON 358 SetPortWindowPort (w);
368 SetPort (GetWindowPort (w));
369 #else
370 SetPort (w);
371 #endif
372 359
373 mac_set_colors (gc); 360 mac_set_colors (gc);
374 361
375 MoveTo (x1, y1); 362 MoveTo (x1, y1);
376 LineTo (x2, y2); 363 LineTo (x2, y2);
414 XGCValues xgc; 401 XGCValues xgc;
415 402
416 xgc.foreground = mwp->x_compatible.foreground_pixel; 403 xgc.foreground = mwp->x_compatible.foreground_pixel;
417 xgc.background = mwp->x_compatible.background_pixel; 404 xgc.background = mwp->x_compatible.background_pixel;
418 405
419 #if TARGET_API_MAC_CARBON 406 SetPortWindowPort (w);
420 SetPort (GetWindowPort (w));
421 #else
422 SetPort (w);
423 #endif
424 407
425 mac_set_colors (&xgc); 408 mac_set_colors (&xgc);
426 SetRect (&r, x, y, x + width, y + height); 409 SetRect (&r, x, y, x + width, y + height);
427 410
428 EraseRect (&r); 411 EraseRect (&r);
439 XGCValues xgc; 422 XGCValues xgc;
440 423
441 xgc.foreground = mwp->x_compatible.foreground_pixel; 424 xgc.foreground = mwp->x_compatible.foreground_pixel;
442 xgc.background = mwp->x_compatible.background_pixel; 425 xgc.background = mwp->x_compatible.background_pixel;
443 426
444 #if TARGET_API_MAC_CARBON 427 SetPortWindowPort (w);
445 SetPort (GetWindowPort (w));
446 #else
447 SetPort (w);
448 #endif
449 428
450 mac_set_colors (&xgc); 429 mac_set_colors (&xgc);
451 430
452 #if TARGET_API_MAC_CARBON 431 #if TARGET_API_MAC_CARBON
453 { 432 {
478 457
479 bitmap.rowBytes = sizeof(unsigned short); 458 bitmap.rowBytes = sizeof(unsigned short);
480 bitmap.baseAddr = (char *)bits; 459 bitmap.baseAddr = (char *)bits;
481 SetRect (&(bitmap.bounds), 0, 0, width, height); 460 SetRect (&(bitmap.bounds), 0, 0, width, height);
482 461
483 #if TARGET_API_MAC_CARBON 462 SetPortWindowPort (w);
484 SetPort (GetWindowPort (w));
485 #else
486 SetPort (w);
487 #endif
488 463
489 mac_set_colors (gc); 464 mac_set_colors (gc);
490 SetRect (&r, x, y, x + width, y + height); 465 SetRect (&r, x, y, x + width, y + height);
491 466
492 #if TARGET_API_MAC_CARBON 467 #if TARGET_API_MAC_CARBON
507 mac_set_clip_rectangle (display, w, r) 482 mac_set_clip_rectangle (display, w, r)
508 Display *display; 483 Display *display;
509 WindowPtr w; 484 WindowPtr w;
510 Rect *r; 485 Rect *r;
511 { 486 {
512 #if TARGET_API_MAC_CARBON 487 SetPortWindowPort (w);
513 SetPort (GetWindowPort (w));
514 #else
515 SetPort (w);
516 #endif
517 488
518 ClipRect (r); 489 ClipRect (r);
519 } 490 }
520 491
521 492
526 Display *display; 497 Display *display;
527 WindowPtr w; 498 WindowPtr w;
528 { 499 {
529 Rect r; 500 Rect r;
530 501
531 #if TARGET_API_MAC_CARBON 502 SetPortWindowPort (w);
532 SetPort (GetWindowPort (w));
533 #else
534 SetPort (w);
535 #endif
536 503
537 SetRect (&r, -32767, -32767, 32767, 32767); 504 SetRect (&r, -32767, -32767, 32767, 32767);
538 ClipRect (&r); 505 ClipRect (&r);
539 } 506 }
540 507
599 { 566 {
600 Pixmap pixmap; 567 Pixmap pixmap;
601 Rect r; 568 Rect r;
602 QDErr err; 569 QDErr err;
603 570
604 #if TARGET_API_MAC_CARBON 571 SetPortWindowPort (w);
605 SetPort (GetWindowPort (w));
606 #else
607 SetPort (w);
608 #endif
609 572
610 SetRect (&r, 0, 0, width, height); 573 SetRect (&r, 0, 0, width, height);
611 err = NewGWorld (&pixmap, depth, &r, NULL, NULL, 0); 574 err = NewGWorld (&pixmap, depth, &r, NULL, NULL, 0);
612 if (err != noErr) 575 if (err != noErr)
613 return NULL; 576 return NULL;
664 int x, y; 627 int x, y;
665 unsigned int width, height; 628 unsigned int width, height;
666 { 629 {
667 Rect r; 630 Rect r;
668 631
669 #if TARGET_API_MAC_CARBON 632 SetPortWindowPort (w);
670 SetPort (GetWindowPort (w));
671 #else
672 SetPort (w);
673 #endif
674 633
675 mac_set_colors (gc); 634 mac_set_colors (gc);
676 SetRect (&r, x, y, x + width, y + height); 635 SetRect (&r, x, y, x + width, y + height);
677 636
678 PaintRect (&r); /* using foreground color of gc */ 637 PaintRect (&r); /* using foreground color of gc */
714 int x, y; 673 int x, y;
715 unsigned int width, height; 674 unsigned int width, height;
716 { 675 {
717 Rect r; 676 Rect r;
718 677
719 #if TARGET_API_MAC_CARBON 678 SetPortWindowPort (w);
720 SetPort (GetWindowPort (w));
721 #else
722 SetPort (w);
723 #endif
724 679
725 mac_set_colors (gc); 680 mac_set_colors (gc);
726 SetRect (&r, x, y, x + width + 1, y + height + 1); 681 SetRect (&r, x, y, x + width + 1, y + height + 1);
727 682
728 FrameRect (&r); /* using foreground color of gc */ 683 FrameRect (&r); /* using foreground color of gc */
764 GC gc; 719 GC gc;
765 int x, y; 720 int x, y;
766 char *buf; 721 char *buf;
767 int nchars, mode, bytes_per_char; 722 int nchars, mode, bytes_per_char;
768 { 723 {
769 #if TARGET_API_MAC_CARBON 724 SetPortWindowPort (w);
770 SetPort (GetWindowPort (w));
771 #else
772 SetPort (w);
773 #endif
774 725
775 mac_set_colors (gc); 726 mac_set_colors (gc);
776 727
777 TextFont (gc->font->mac_fontnum); 728 TextFont (gc->font->mac_fontnum);
778 TextSize (gc->font->mac_fontsize); 729 TextSize (gc->font->mac_fontsize);
859 unsigned int width, height; 810 unsigned int width, height;
860 int dest_x, dest_y; 811 int dest_x, dest_y;
861 { 812 {
862 Rect src_r, dest_r; 813 Rect src_r, dest_r;
863 814
864 #if TARGET_API_MAC_CARBON 815 SetPortWindowPort (dest);
865 SetPort (GetWindowPort (dest));
866 #else
867 SetPort (dest);
868 #endif
869 816
870 SetRect (&src_r, src_x, src_y, src_x + width, src_y + height); 817 SetRect (&src_r, src_x, src_y, src_x + width, src_y + height);
871 SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height); 818 SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height);
872 819
873 ForeColor (blackColor); 820 ForeColor (blackColor);
899 unsigned int width, height; 846 unsigned int width, height;
900 int dest_x, dest_y; 847 int dest_x, dest_y;
901 { 848 {
902 Rect src_r, dest_r; 849 Rect src_r, dest_r;
903 850
904 #if TARGET_API_MAC_CARBON 851 SetPortWindowPort (dest);
905 SetPort (GetWindowPort (dest));
906 #else
907 SetPort (dest);
908 #endif
909 852
910 SetRect (&src_r, src_x, src_y, src_x + width, src_y + height); 853 SetRect (&src_r, src_x, src_y, src_x + width, src_y + height);
911 SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height); 854 SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height);
912 855
913 ForeColor (blackColor); 856 ForeColor (blackColor);
963 Rect gw_r, src_r, dest_r; 906 Rect gw_r, src_r, dest_r;
964 907
965 SetRect (&src_r, src_x, src_y, src_x + width, src_y + height); 908 SetRect (&src_r, src_x, src_y, src_x + width, src_y + height);
966 SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height); 909 SetRect (&dest_r, dest_x, dest_y, dest_x + width, dest_y + height);
967 910
968 SetPort (GetWindowPort (w)); 911 SetPortWindowPort (w);
969 912
970 ForeColor (blackColor); 913 ForeColor (blackColor);
971 BackColor (whiteColor); 914 BackColor (whiteColor);
972 915
973 LockPortBits (GetWindowPort (w)); 916 LockPortBits (GetWindowPort (w));
1288 if (!NILP (display_info->mouse_face_window) 1231 if (!NILP (display_info->mouse_face_window)
1289 && w == XWINDOW (display_info->mouse_face_window)) 1232 && w == XWINDOW (display_info->mouse_face_window))
1290 { 1233 {
1291 int i; 1234 int i;
1292 1235
1293 for (i = 0; i < w->desired_matrix->nrows; ++i) 1236 for (i = 0; i < w->desired_matrix->nrows; ++i)
1294 if (MATRIX_ROW_ENABLED_P (w->desired_matrix, i)) 1237 if (MATRIX_ROW_ENABLED_P (w->desired_matrix, i))
1295 break; 1238 break;
1296 1239
1297 if (i < w->desired_matrix->nrows) 1240 if (i < w->desired_matrix->nrows)
1298 clear_mouse_face (display_info); 1241 clear_mouse_face (display_info);
1383 struct frame *f; 1326 struct frame *f;
1384 { 1327 {
1385 /* Reset the background color of Mac OS Window to that of the frame after 1328 /* Reset the background color of Mac OS Window to that of the frame after
1386 update so that it is used by Mac Toolbox to clear the update region before 1329 update so that it is used by Mac Toolbox to clear the update region before
1387 an update event is generated. */ 1330 an update event is generated. */
1388 #if TARGET_API_MAC_CARBON 1331 SetPortWindowPort (FRAME_MAC_WINDOW (f));
1389 SetPort (GetWindowPort (FRAME_MAC_WINDOW (f)));
1390 #else
1391 SetPort (FRAME_MAC_WINDOW (f));
1392 #endif
1393 1332
1394 mac_set_backcolor (FRAME_BACKGROUND_PIXEL (f)); 1333 mac_set_backcolor (FRAME_BACKGROUND_PIXEL (f));
1395 1334
1396 /* Mouse highlight may be displayed again. */ 1335 /* Mouse highlight may be displayed again. */
1397 FRAME_MAC_DISPLAY_INFO (f)->mouse_face_defer = 0; 1336 FRAME_MAC_DISPLAY_INFO (f)->mouse_face_defer = 0;
3743 result->timestamp = event->when; 3682 result->timestamp = event->when;
3744 result->modifiers = event->what == mouseDown ? down_modifier : up_modifier; 3683 result->modifiers = event->what == mouseDown ? down_modifier : up_modifier;
3745 3684
3746 mouseLoc = event->where; 3685 mouseLoc = event->where;
3747 3686
3748 #if TARGET_API_MAC_CARBON 3687 SetPortWindowPort (FRAME_MAC_WINDOW (f));
3749 SetPort (GetWindowPort (FRAME_MAC_WINDOW (f)));
3750 #else
3751 SetPort (FRAME_MAC_WINDOW (f));
3752 #endif
3753 3688
3754 GlobalToLocal (&mouseLoc); 3689 GlobalToLocal (&mouseLoc);
3755 XSETINT (result->x, mouseLoc.h); 3690 XSETINT (result->x, mouseLoc.h);
3756 XSETINT (result->y, mouseLoc.v); 3691 XSETINT (result->y, mouseLoc.v);
3757 3692
3776 static void 3711 static void
3777 note_mouse_movement (frame, pos) 3712 note_mouse_movement (frame, pos)
3778 FRAME_PTR frame; 3713 FRAME_PTR frame;
3779 Point *pos; 3714 Point *pos;
3780 { 3715 {
3716 struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (frame);
3781 #if TARGET_API_MAC_CARBON 3717 #if TARGET_API_MAC_CARBON
3782 Rect r; 3718 Rect r;
3783 #endif 3719 #endif
3784 3720
3785 last_mouse_movement_time = TickCount () * (1000 / 60); /* to milliseconds */ 3721 last_mouse_movement_time = TickCount () * (1000 / 60); /* to milliseconds */
3790 if (!PtInRect (*pos, GetWindowPortBounds (FRAME_MAC_WINDOW (frame), &r))) 3726 if (!PtInRect (*pos, GetWindowPortBounds (FRAME_MAC_WINDOW (frame), &r)))
3791 #else 3727 #else
3792 if (!PtInRect (*pos, &FRAME_MAC_WINDOW (frame)->portRect)) 3728 if (!PtInRect (*pos, &FRAME_MAC_WINDOW (frame)->portRect))
3793 #endif 3729 #endif
3794 { 3730 {
3795 frame->mouse_moved = 1; 3731 if (frame == dpyinfo->mouse_face_mouse_frame)
3796 last_mouse_scroll_bar = Qnil; 3732 /* This case corresponds to LeaveNotify in X11. */
3797 note_mouse_highlight (frame, -1, -1); 3733 {
3734 /* If we move outside the frame, then we're certainly no
3735 longer on any text in the frame. */
3736 clear_mouse_face (dpyinfo);
3737 dpyinfo->mouse_face_mouse_frame = 0;
3738 if (!dpyinfo->grabbed)
3739 rif->define_frame_cursor (frame,
3740 frame->output_data.mac->nontext_cursor);
3741 }
3798 } 3742 }
3799 /* Has the mouse moved off the glyph it was on at the last sighting? */ 3743 /* Has the mouse moved off the glyph it was on at the last sighting? */
3800 else if (pos->h < last_mouse_glyph.left 3744 else if (pos->h < last_mouse_glyph.left
3801 || pos->h >= last_mouse_glyph.right 3745 || pos->h >= last_mouse_glyph.right
3802 || pos->v < last_mouse_glyph.top 3746 || pos->v < last_mouse_glyph.top
3940 last_mouse_glyph.bottom = gy + height; 3884 last_mouse_glyph.bottom = gy + height;
3941 } 3885 }
3942 } 3886 }
3943 3887
3944 3888
3889 static WindowPtr
3890 mac_front_window ()
3891 {
3892 #if TARGET_API_MAC_CARBON
3893 return GetFrontWindowOfClass (kDocumentWindowClass, true);
3894 #else
3895 WindowPtr front_window = FrontWindow ();
3896
3897 if (tip_window && front_window == tip_window)
3898 return GetNextWindow (front_window);
3899 else
3900 return front_window;
3901 #endif
3902 }
3903
3904 #define mac_window_to_frame(wp) (((mac_output *) GetWRefCon (wp))->mFP)
3905
3945 /* Return the current position of the mouse. 3906 /* Return the current position of the mouse.
3946 *fp should be a frame which indicates which display to ask about. 3907 *fp should be a frame which indicates which display to ask about.
3947 3908
3948 If the mouse movement started in a scroll bar, set *fp, *bar_window, 3909 If the mouse movement started in a scroll bar, set *fp, *bar_window,
3949 and *part to the frame, window, and scroll bar part that the mouse 3910 and *part to the frame, window, and scroll bar part that the mouse
3971 Lisp_Object *x, *y; 3932 Lisp_Object *x, *y;
3972 unsigned long *time; 3933 unsigned long *time;
3973 { 3934 {
3974 Point mouse_pos; 3935 Point mouse_pos;
3975 int ignore1, ignore2; 3936 int ignore1, ignore2;
3976 WindowPtr wp = FrontWindow (); 3937 WindowPtr wp = mac_front_window ();
3977 struct frame *f; 3938 struct frame *f;
3978 Lisp_Object frame, tail; 3939 Lisp_Object frame, tail;
3979 3940
3980 if (is_emacs_window(wp)) 3941 if (is_emacs_window(wp))
3981 f = ((mac_output *) GetWRefCon (wp))->mFP; 3942 f = mac_window_to_frame (wp);
3982 3943
3983 BLOCK_INPUT; 3944 BLOCK_INPUT;
3984 3945
3985 if (! NILP (last_mouse_scroll_bar) && insist == 0) 3946 if (! NILP (last_mouse_scroll_bar) && insist == 0)
3986 x_scroll_bar_report_motion (fp, bar_window, part, x, y, time); 3947 x_scroll_bar_report_motion (fp, bar_window, part, x, y, time);
3990 FOR_EACH_FRAME (tail, frame) 3951 FOR_EACH_FRAME (tail, frame)
3991 XFRAME (frame)->mouse_moved = 0; 3952 XFRAME (frame)->mouse_moved = 0;
3992 3953
3993 last_mouse_scroll_bar = Qnil; 3954 last_mouse_scroll_bar = Qnil;
3994 3955
3995 #if TARGET_API_MAC_CARBON 3956 SetPortWindowPort (wp);
3996 SetPort (GetWindowPort (wp));
3997 #else
3998 SetPort (wp);
3999 #endif
4000 3957
4001 GetMouse (&mouse_pos); 3958 GetMouse (&mouse_pos);
4002 3959
4003 pixel_to_glyph_coords (f, mouse_pos.h, mouse_pos.v, &ignore1, &ignore2, 3960 pixel_to_glyph_coords (f, mouse_pos.h, mouse_pos.v, &ignore1, &ignore2,
4004 &last_mouse_glyph, insist); 3961 &last_mouse_glyph, insist);
4489 struct scroll_bar *bar; 4446 struct scroll_bar *bar;
4490 int part_code; 4447 int part_code;
4491 EventRecord *er; 4448 EventRecord *er;
4492 struct input_event *bufp; 4449 struct input_event *bufp;
4493 { 4450 {
4451 int win_y, top_range;
4452
4494 if (! GC_WINDOWP (bar->window)) 4453 if (! GC_WINDOWP (bar->window))
4495 abort (); 4454 abort ();
4496 4455
4497 bufp->kind = SCROLL_BAR_CLICK_EVENT; 4456 bufp->kind = SCROLL_BAR_CLICK_EVENT;
4498 bufp->frame_or_window = bar->window; 4457 bufp->frame_or_window = bar->window;
4523 bar->dragging = make_number (0); 4482 bar->dragging = make_number (0);
4524 XSETVECTOR (last_mouse_scroll_bar, bar); 4483 XSETVECTOR (last_mouse_scroll_bar, bar);
4525 bufp->part = scroll_bar_handle; 4484 bufp->part = scroll_bar_handle;
4526 break; 4485 break;
4527 } 4486 }
4487
4488 win_y = XINT (bufp->y) - XINT (bar->top);
4489 top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (0/*dummy*/, XINT (bar->height));
4490
4491 win_y -= VERTICAL_SCROLL_BAR_TOP_BORDER;
4492
4493 win_y -= 24;
4494
4495 if (! NILP (bar->dragging))
4496 win_y -= XINT (bar->dragging);
4497
4498 if (win_y < 0)
4499 win_y = 0;
4500 if (win_y > top_range)
4501 win_y = top_range;
4502
4503 XSETINT (bufp->x, win_y);
4504 XSETINT (bufp->y, top_range);
4528 } 4505 }
4529 4506
4530 4507
4531 /* Handle some mouse motion while someone is dragging the scroll bar. 4508 /* Handle some mouse motion while someone is dragging the scroll bar.
4532 4509
4572 enum scroll_bar_part *part; 4549 enum scroll_bar_part *part;
4573 Lisp_Object *x, *y; 4550 Lisp_Object *x, *y;
4574 unsigned long *time; 4551 unsigned long *time;
4575 { 4552 {
4576 struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar); 4553 struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar);
4577 WindowPtr wp = FrontWindow (); 4554 WindowPtr wp = mac_front_window ();
4578 Point mouse_pos; 4555 Point mouse_pos;
4579 struct frame *f = ((mac_output *) GetWRefCon (wp))->mFP; 4556 struct frame *f = mac_window_to_frame (wp);
4580 int win_y, top_range; 4557 int win_y, top_range;
4581 4558
4582 #if TARGET_API_MAC_CARBON 4559 SetPortWindowPort (wp);
4583 SetPort (GetWindowPort (wp));
4584 #else
4585 SetPort (wp);
4586 #endif
4587 4560
4588 GetMouse (&mouse_pos); 4561 GetMouse (&mouse_pos);
4589 4562
4590 win_y = mouse_pos.v - XINT (bar->top); 4563 win_y = mouse_pos.v - XINT (bar->top);
4591 top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height)); 4564 top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height));
4808 static void 4781 static void
4809 mac_define_frame_cursor (f, cursor) 4782 mac_define_frame_cursor (f, cursor)
4810 struct frame *f; 4783 struct frame *f;
4811 Cursor cursor; 4784 Cursor cursor;
4812 { 4785 {
4813 /* MAC TODO */ 4786 #if TARGET_API_MAC_CARBON
4787 SetThemeCursor (cursor);
4788 #else
4789 SetCursor (*cursor);
4790 #endif
4814 } 4791 }
4815 4792
4816 4793
4817 /* RIF: Clear area on frame F. */ 4794 /* RIF: Clear area on frame F. */
4818 4795
5076 if (f->output_data.mac->parent_desc != FRAME_MAC_DISPLAY_INFO (f)->root_window) 5053 if (f->output_data.mac->parent_desc != FRAME_MAC_DISPLAY_INFO (f)->root_window)
5077 { 5054 {
5078 GrafPtr savePort; 5055 GrafPtr savePort;
5079 GetPort (&savePort); 5056 GetPort (&savePort);
5080 5057
5081 #if TARGET_API_MAC_CARBON 5058 SetPortWindowPort (FRAME_MAC_WINDOW (f));
5082 SetPort (GetWindowPort (FRAME_MAC_WINDOW (f)));
5083 #else
5084 SetPort (FRAME_MAC_WINDOW (f));
5085 #endif
5086 5059
5087 #if TARGET_API_MAC_CARBON 5060 #if TARGET_API_MAC_CARBON
5088 { 5061 {
5089 Rect r; 5062 Rect r;
5090 5063
5455 void 5428 void
5456 x_free_frame_resources (f) 5429 x_free_frame_resources (f)
5457 struct frame *f; 5430 struct frame *f;
5458 { 5431 {
5459 struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f); 5432 struct mac_display_info *dpyinfo = FRAME_MAC_DISPLAY_INFO (f);
5433 WindowPtr wp = FRAME_MAC_WINDOW (f);
5460 5434
5461 BLOCK_INPUT; 5435 BLOCK_INPUT;
5462 5436
5463 DisposeWindow (FRAME_MAC_WINDOW (f)); 5437 DisposeWindow (wp);
5438 if (wp == tip_window)
5439 /* Neither WaitNextEvent nor ReceiveNextEvent receives `window
5440 closed' event. So we reset tip_window here. */
5441 tip_window = NULL;
5464 5442
5465 free_frame_menubar (f); 5443 free_frame_menubar (f);
5466 5444
5467 if (FRAME_FACE_CACHE (f)) 5445 if (FRAME_FACE_CACHE (f))
5468 free_frame_faces (f); 5446 free_frame_faces (f);
6982 6960
6983 Lisp_Object drag_and_drop_file_list; 6961 Lisp_Object drag_and_drop_file_list;
6984 6962
6985 Point saved_menu_event_location; 6963 Point saved_menu_event_location;
6986 6964
6965 #if !TARGET_API_MAC_CARBON
6966 /* Place holder for the default arrow cursor. */
6967 CursPtr arrow_cursor;
6968 #endif
6969
6987 /* Apple Events */ 6970 /* Apple Events */
6988 static void init_required_apple_events (void); 6971 static void init_required_apple_events (void);
6989 static pascal OSErr 6972 static pascal OSErr
6990 do_ae_open_application (const AppleEvent *, AppleEvent *, long); 6973 do_ae_open_application (const AppleEvent *, AppleEvent *, long);
6991 static pascal OSErr 6974 static pascal OSErr
7168 InitDialogs (NULL); 7151 InitDialogs (NULL);
7169 #endif /* !TARGET_API_MAC_CARBON */ 7152 #endif /* !TARGET_API_MAC_CARBON */
7170 InitCursor (); 7153 InitCursor ();
7171 7154
7172 #if !TARGET_API_MAC_CARBON 7155 #if !TARGET_API_MAC_CARBON
7156 arrow_cursor = &qd.arrow;
7157
7173 /* set up some extra stack space for use by emacs */ 7158 /* set up some extra stack space for use by emacs */
7174 SetApplLimit ((Ptr) ((long) GetApplLimit () - EXTRA_STACK_ALLOC)); 7159 SetApplLimit ((Ptr) ((long) GetApplLimit () - EXTRA_STACK_ALLOC));
7175 7160
7176 /* MaxApplZone must be called for AppleScript to execute more 7161 /* MaxApplZone must be called for AppleScript to execute more
7177 complicated scripts */ 7162 complicated scripts */
7196 } 7181 }
7197 7182
7198 static void 7183 static void
7199 do_window_update (WindowPtr win) 7184 do_window_update (WindowPtr win)
7200 { 7185 {
7201 struct mac_output *mwp = (mac_output *) GetWRefCon (win); 7186 struct frame *f = mac_window_to_frame (win);
7202 struct frame *f = mwp->mFP; 7187
7188 if (win == tip_window)
7189 /* The tooltip has been drawn already. Avoid the
7190 SET_FRAME_GARBAGED below. */
7191 return;
7203 7192
7204 if (f) 7193 if (f)
7205 { 7194 {
7206 if (f->async_visible == 0) 7195 if (f->async_visible == 0)
7207 { 7196 {
7248 } 7237 }
7249 7238
7250 static void 7239 static void
7251 do_window_activate (WindowPtr win) 7240 do_window_activate (WindowPtr win)
7252 { 7241 {
7253 mac_output *mwp;
7254 struct frame *f; 7242 struct frame *f;
7255 7243
7256 if (is_emacs_window (win)) 7244 if (is_emacs_window (win))
7257 { 7245 {
7258 mwp = (mac_output *) GetWRefCon (win); 7246 f = mac_window_to_frame (win);
7259 f = mwp->mFP;
7260 7247
7261 if (f) 7248 if (f)
7262 { 7249 {
7263 x_new_focus_frame (FRAME_MAC_DISPLAY_INFO (f), f); 7250 x_new_focus_frame (FRAME_MAC_DISPLAY_INFO (f), f);
7264 activate_scroll_bars (f); 7251 activate_scroll_bars (f);
7267 } 7254 }
7268 7255
7269 static void 7256 static void
7270 do_window_deactivate (WindowPtr win) 7257 do_window_deactivate (WindowPtr win)
7271 { 7258 {
7272 mac_output *mwp;
7273 struct frame *f; 7259 struct frame *f;
7274 7260
7275 if (is_emacs_window (win)) 7261 if (is_emacs_window (win))
7276 { 7262 {
7277 mwp = (mac_output *) GetWRefCon (win); 7263 f = mac_window_to_frame (win);
7278 f = mwp->mFP;
7279 7264
7280 if (f == FRAME_MAC_DISPLAY_INFO (f)->x_focus_frame) 7265 if (f == FRAME_MAC_DISPLAY_INFO (f)->x_focus_frame)
7281 { 7266 {
7282 x_new_focus_frame (FRAME_MAC_DISPLAY_INFO (f), 0); 7267 x_new_focus_frame (FRAME_MAC_DISPLAY_INFO (f), 0);
7283 deactivate_scroll_bars (f); 7268 deactivate_scroll_bars (f);
7287 7272
7288 static void 7273 static void
7289 do_app_resume () 7274 do_app_resume ()
7290 { 7275 {
7291 WindowPtr wp; 7276 WindowPtr wp;
7292 mac_output *mwp;
7293 struct frame *f; 7277 struct frame *f;
7294 7278
7295 wp = FrontWindow(); 7279 wp = mac_front_window ();
7296 if (is_emacs_window (wp)) 7280 if (is_emacs_window (wp))
7297 { 7281 {
7298 mwp = (mac_output *) GetWRefCon (wp); 7282 f = mac_window_to_frame (wp);
7299 f = mwp->mFP;
7300 7283
7301 if (f) 7284 if (f)
7302 { 7285 {
7303 x_new_focus_frame (FRAME_MAC_DISPLAY_INFO (f), f); 7286 x_new_focus_frame (FRAME_MAC_DISPLAY_INFO (f), f);
7304 activate_scroll_bars (f); 7287 activate_scroll_bars (f);
7311 7294
7312 static void 7295 static void
7313 do_app_suspend () 7296 do_app_suspend ()
7314 { 7297 {
7315 WindowPtr wp; 7298 WindowPtr wp;
7316 mac_output *mwp;
7317 struct frame *f; 7299 struct frame *f;
7318 7300
7319 wp = FrontWindow(); 7301 wp = mac_front_window ();
7320 if (is_emacs_window (wp)) 7302 if (is_emacs_window (wp))
7321 { 7303 {
7322 mwp = (mac_output *) GetWRefCon (wp); 7304 f = mac_window_to_frame (wp);
7323 f = mwp->mFP;
7324 7305
7325 if (f == FRAME_MAC_DISPLAY_INFO (f)->x_focus_frame) 7306 if (f == FRAME_MAC_DISPLAY_INFO (f)->x_focus_frame)
7326 { 7307 {
7327 x_new_focus_frame (FRAME_MAC_DISPLAY_INFO (f), 0); 7308 x_new_focus_frame (FRAME_MAC_DISPLAY_INFO (f), 0);
7328 deactivate_scroll_bars (f); 7309 deactivate_scroll_bars (f);
7333 app_sleep_time = WNE_SLEEP_AT_SUSPEND; 7314 app_sleep_time = WNE_SLEEP_AT_SUSPEND;
7334 } 7315 }
7335 7316
7336 7317
7337 static void 7318 static void
7338 do_mouse_moved (Point mouse_pos) 7319 do_mouse_moved (mouse_pos, f)
7339 { 7320 Point mouse_pos;
7340 WindowPtr wp = FrontWindow (); 7321 FRAME_PTR *f;
7341 struct frame *f; 7322 {
7323 WindowPtr wp = mac_front_window ();
7324 struct x_display_info *dpyinfo;
7342 7325
7343 if (is_emacs_window (wp)) 7326 if (is_emacs_window (wp))
7344 { 7327 {
7345 f = ((mac_output *) GetWRefCon (wp))->mFP; 7328 *f = mac_window_to_frame (wp);
7346 7329 dpyinfo = FRAME_MAC_DISPLAY_INFO (*f);
7347 #if TARGET_API_MAC_CARBON 7330
7348 SetPort (GetWindowPort (wp)); 7331 if (dpyinfo->mouse_face_hidden)
7349 #else 7332 {
7350 SetPort (wp); 7333 dpyinfo->mouse_face_hidden = 0;
7351 #endif 7334 clear_mouse_face (dpyinfo);
7335 }
7336
7337 SetPortWindowPort (wp);
7352 7338
7353 GlobalToLocal (&mouse_pos); 7339 GlobalToLocal (&mouse_pos);
7354 7340
7355 note_mouse_movement (f, &mouse_pos); 7341 if (dpyinfo->grabbed && tracked_scroll_bar)
7356 } 7342 x_scroll_bar_note_movement (tracked_scroll_bar,
7357 } 7343 mouse_pos.v
7358 7344 - XINT (tracked_scroll_bar->top),
7359 7345 TickCount() * (1000 / 60));
7360 static void
7361 do_os_event (EventRecord *erp)
7362 {
7363 switch((erp->message >> 24) & 0x000000FF)
7364 {
7365 case suspendResumeMessage:
7366 if((erp->message & resumeFlag) == 1)
7367 do_app_resume ();
7368 else 7346 else
7369 do_app_suspend (); 7347 note_mouse_movement (*f, &mouse_pos);
7370 break; 7348 }
7371 7349 }
7372 case mouseMovedMessage: 7350
7373 do_mouse_moved (erp->where);
7374 break;
7375 }
7376 }
7377
7378 static void
7379 do_events (EventRecord *erp)
7380 {
7381 switch (erp->what)
7382 {
7383 case updateEvt:
7384 do_window_update ((WindowPtr) erp->message);
7385 break;
7386
7387 case osEvt:
7388 do_os_event (erp);
7389 break;
7390
7391 case activateEvt:
7392 if ((erp->modifiers & activeFlag) != 0)
7393 do_window_activate ((WindowPtr) erp->message);
7394 else
7395 do_window_deactivate ((WindowPtr) erp->message);
7396 break;
7397 }
7398 }
7399 7351
7400 static void 7352 static void
7401 do_apple_menu (SInt16 menu_item) 7353 do_apple_menu (SInt16 menu_item)
7402 { 7354 {
7403 #if !TARGET_API_MAC_CARBON 7355 #if !TARGET_API_MAC_CARBON
7431 do_apple_menu (menu_item); 7383 do_apple_menu (menu_item);
7432 break; 7384 break;
7433 7385
7434 default: 7386 default:
7435 { 7387 {
7436 WindowPtr wp = FrontWindow (); 7388 struct frame *f = mac_window_to_frame (mac_front_window ());
7437 struct frame *f = ((mac_output *) GetWRefCon (wp))->mFP;
7438 MenuHandle menu = GetMenuHandle (menu_id); 7389 MenuHandle menu = GetMenuHandle (menu_id);
7439 if (menu) 7390 if (menu)
7440 { 7391 {
7441 UInt32 refcon; 7392 UInt32 refcon;
7442 7393
7457 do_grow_window (WindowPtr w, EventRecord *e) 7408 do_grow_window (WindowPtr w, EventRecord *e)
7458 { 7409 {
7459 long grow_size; 7410 long grow_size;
7460 Rect limit_rect; 7411 Rect limit_rect;
7461 int rows, columns; 7412 int rows, columns;
7462 mac_output *mwp = (mac_output *) GetWRefCon (w); 7413 struct frame *f = mac_window_to_frame (w);
7463 struct frame *f = mwp->mFP;
7464 7414
7465 SetRect(&limit_rect, MIN_DOC_SIZE, MIN_DOC_SIZE, MAX_DOC_SIZE, MAX_DOC_SIZE); 7415 SetRect(&limit_rect, MIN_DOC_SIZE, MIN_DOC_SIZE, MAX_DOC_SIZE, MAX_DOC_SIZE);
7466 7416
7467 grow_size = GrowWindow (w, e->where, &limit_rect); 7417 grow_size = GrowWindow (w, e->where, &limit_rect);
7468 7418
7487 { 7437 {
7488 GrafPtr save_port; 7438 GrafPtr save_port;
7489 Rect zoom_rect, port_rect; 7439 Rect zoom_rect, port_rect;
7490 Point top_left; 7440 Point top_left;
7491 int w_title_height, columns, rows, width, height, dummy, x, y; 7441 int w_title_height, columns, rows, width, height, dummy, x, y;
7492 mac_output *mwp = (mac_output *) GetWRefCon (w); 7442 struct frame *f = mac_window_to_frame (w);
7493 struct frame *f = mwp->mFP;
7494 7443
7495 GetPort (&save_port); 7444 GetPort (&save_port);
7496 7445
7497 #if TARGET_API_MAC_CARBON 7446 SetPortWindowPort (w);
7498 SetPort (GetWindowPort (w));
7499 #else
7500 SetPort (w);
7501 #endif
7502 7447
7503 /* Clear window to avoid flicker. */ 7448 /* Clear window to avoid flicker. */
7504 #if TARGET_API_MAC_CARBON 7449 #if TARGET_API_MAC_CARBON
7505 { 7450 {
7506 Rect r; 7451 Rect r;
7549 (**((WStateDataHandle) ((WindowPeek) w)->dataHandle)).stdState 7494 (**((WStateDataHandle) ((WindowPeek) w)->dataHandle)).stdState
7550 = zoom_rect; 7495 = zoom_rect;
7551 } 7496 }
7552 #endif /* not TARGET_API_MAC_CARBON */ 7497 #endif /* not TARGET_API_MAC_CARBON */
7553 7498
7554 ZoomWindow (w, zoom_in_or_out, w == FrontWindow ()); 7499 ZoomWindow (w, zoom_in_or_out, w == mac_front_window ());
7555 7500
7556 /* retrieve window size and update application values */ 7501 /* retrieve window size and update application values */
7557 #if TARGET_API_MAC_CARBON 7502 #if TARGET_API_MAC_CARBON
7558 GetWindowPortBounds (w, &port_rect); 7503 GetWindowPortBounds (w, &port_rect);
7559 #else 7504 #else
7560 port_rect = w->portRect; 7505 port_rect = w->portRect;
7561 #endif 7506 #endif
7562 rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, port_rect.bottom - port_rect.top); 7507 rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, port_rect.bottom - port_rect.top);
7563 columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, port_rect.right - port_rect.left); 7508 columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, port_rect.right - port_rect.left);
7564 x_set_window_size (mwp->mFP, 0, columns, rows); 7509 x_set_window_size (f, 0, columns, rows);
7565 7510
7566 SetPort (save_port); 7511 SetPort (save_port);
7567 } 7512 }
7568 7513
7569 /* Initialize Drag And Drop to allow files to be dropped onto emacs frames */ 7514 /* Initialize Drag And Drop to allow files to be dropped onto emacs frames */
7890 the queue like an interrupt using kbd_buffer_store_event. */ 7835 the queue like an interrupt using kbd_buffer_store_event. */
7891 if (!NILP (drag_and_drop_file_list)) 7836 if (!NILP (drag_and_drop_file_list))
7892 { 7837 {
7893 struct input_event event; 7838 struct input_event event;
7894 Lisp_Object frame; 7839 Lisp_Object frame;
7895 struct frame *f = ((mac_output *) GetWRefCon(window))->mFP; 7840 struct frame *f = mac_window_to_frame (window);
7896 SetPort (GetWindowPort (window)); 7841 SetPortWindowPort (window);
7897 GlobalToLocal (&mouse); 7842 GlobalToLocal (&mouse);
7898 7843
7899 event.kind = DRAG_N_DROP_EVENT; 7844 event.kind = DRAG_N_DROP_EVENT;
7900 event.code = 0; 7845 event.code = 0;
7901 event.modifiers = 0; 7846 event.modifiers = 0;
8065 } 8010 }
8066 8011
8067 /* Emacs calls this whenever it wants to read an input event from the 8012 /* Emacs calls this whenever it wants to read an input event from the
8068 user. */ 8013 user. */
8069 int 8014 int
8070 XTread_socket (int sd, int expected, struct input_event *hold_quit) 8015 XTread_socket (sd, expected, hold_quit)
8016 int sd, expected;
8017 struct input_event *hold_quit;
8071 { 8018 {
8072 struct input_event inev; 8019 struct input_event inev;
8073 int count = 0; 8020 int count = 0;
8074 #if USE_CARBON_EVENTS 8021 #if USE_CARBON_EVENTS
8075 OSStatus rneResult;
8076 EventRef eventRef; 8022 EventRef eventRef;
8077 EventMouseButton mouseBtn; 8023 EventTargetRef toolbox_dispatcher = GetEventDispatcherTarget ();
8024 #else
8025 EventMask event_mask;
8078 #endif 8026 #endif
8079 EventRecord er; 8027 EventRecord er;
8080 int the_modifiers; 8028 struct mac_display_info *dpyinfo = &one_mac_display_info;
8081 EventMask event_mask; 8029
8082
8083 #if 0
8084 if (interrupt_input_blocked) 8030 if (interrupt_input_blocked)
8085 { 8031 {
8086 interrupt_input_pending = 1; 8032 interrupt_input_pending = 1;
8087 return -1; 8033 return -1;
8088 } 8034 }
8089 #endif
8090 8035
8091 interrupt_input_pending = 0; 8036 interrupt_input_pending = 0;
8092 BLOCK_INPUT; 8037 BLOCK_INPUT;
8093 8038
8094 /* So people can tell when we have read the available input. */ 8039 /* So people can tell when we have read the available input. */
8106 } 8051 }
8107 8052
8108 if (terminate_flag) 8053 if (terminate_flag)
8109 Fkill_emacs (make_number (1)); 8054 Fkill_emacs (make_number (1));
8110 8055
8111 /* It is necessary to set this (additional) argument slot of an 8056 #if !USE_CARBON_EVENTS
8112 event to nil because keyboard.c protects incompletely processed
8113 event from being garbage collected by placing them in the
8114 kbd_buffer_gcpro vector. */
8115 EVENT_INIT (inev);
8116 inev.kind = NO_EVENT;
8117 inev.arg = Qnil;
8118
8119 event_mask = everyEvent; 8057 event_mask = everyEvent;
8120 if (NILP (Fboundp (Qmac_ready_for_drag_n_drop))) 8058 if (NILP (Fboundp (Qmac_ready_for_drag_n_drop)))
8121 event_mask -= highLevelEventMask; 8059 event_mask -= highLevelEventMask;
8122 8060
8061 while (WaitNextEvent (event_mask, &er,
8062 (expected ? app_sleep_time : 0L), NULL))
8063 #else
8064 while (!ReceiveNextEvent (0, NULL,
8065 (expected ? TicksToEventTime (app_sleep_time) : 0),
8066 kEventRemoveFromQueue, &eventRef))
8067 #endif /* !USE_CARBON_EVENTS */
8068 {
8069 int do_help = 0;
8070 struct frame *f;
8071
8072 expected = 0;
8073
8074 /* It is necessary to set this (additional) argument slot of an
8075 event to nil because keyboard.c protects incompletely
8076 processed event from being garbage collected by placing them
8077 in the kbd_buffer_gcpro vector. */
8078 EVENT_INIT (inev);
8079 inev.kind = NO_EVENT;
8080 inev.arg = Qnil;
8081
8123 #if USE_CARBON_EVENTS 8082 #if USE_CARBON_EVENTS
8124 rneResult = ReceiveNextEvent (0, NULL,
8125 expected
8126 ? TicksToEventTime (app_sleep_time)
8127 : 0,
8128 kEventRemoveFromQueue, &eventRef);
8129 if (!rneResult)
8130 {
8131 /* Handle new events */ 8083 /* Handle new events */
8132 if (!mac_convert_event_ref (eventRef, &er)) 8084 if (!mac_convert_event_ref (eventRef, &er))
8133 switch (GetEventClass (eventRef)) 8085 switch (GetEventClass (eventRef))
8134 { 8086 {
8135 case kEventClassMouse: 8087 case kEventClassMouse:
8136 if (GetEventKind (eventRef) == kEventMouseWheelMoved) 8088 if (GetEventKind (eventRef) == kEventMouseWheelMoved)
8137 { 8089 {
8138 SInt32 delta; 8090 SInt32 delta;
8139 Point point; 8091 Point point;
8140 WindowPtr window_ptr = FrontNonFloatingWindow (); 8092 WindowPtr window_ptr = mac_front_window ();
8141 struct mac_output *mwp = (mac_output *) GetWRefCon (window_ptr); 8093
8142 if (!IsValidWindowPtr (window_ptr)) 8094 if (!IsValidWindowPtr (window_ptr))
8143 { 8095 {
8144 SysBeep(1); 8096 SysBeep(1);
8145 UNBLOCK_INPUT; 8097 break;
8146 return 0;
8147 } 8098 }
8148 8099
8149 GetEventParameter(eventRef, kEventParamMouseWheelDelta, 8100 GetEventParameter(eventRef, kEventParamMouseWheelDelta,
8150 typeSInt32, NULL, sizeof (SInt32), 8101 typeSInt32, NULL, sizeof (SInt32),
8151 NULL, &delta); 8102 NULL, &delta);
8152 GetEventParameter(eventRef, kEventParamMouseLocation, 8103 GetEventParameter(eventRef, kEventParamMouseLocation,
8153 typeQDPoint, NULL, sizeof (Point), 8104 typeQDPoint, NULL, sizeof (Point),
8154 NULL, &point); 8105 NULL, &point);
8155 inev.kind = WHEEL_EVENT; 8106 inev.kind = WHEEL_EVENT;
8156 inev.code = 0; 8107 inev.code = 0;
8157 inev.modifiers = (mac_event_to_emacs_modifiers(eventRef) 8108 inev.modifiers = (mac_event_to_emacs_modifiers (eventRef)
8158 | ((delta < 0) ? down_modifier 8109 | ((delta < 0) ? down_modifier
8159 : up_modifier)); 8110 : up_modifier));
8160 SetPort (GetWindowPort (window_ptr)); 8111 SetPortWindowPort (window_ptr);
8161 GlobalToLocal (&point); 8112 GlobalToLocal (&point);
8162 XSETINT (inev.x, point.h); 8113 XSETINT (inev.x, point.h);
8163 XSETINT (inev.y, point.v); 8114 XSETINT (inev.y, point.v);
8164 XSETFRAME (inev.frame_or_window, mwp->mFP); 8115 XSETFRAME (inev.frame_or_window,
8116 mac_window_to_frame (window_ptr));
8165 inev.timestamp = EventTimeToTicks (GetEventTime (eventRef))*(1000/60); 8117 inev.timestamp = EventTimeToTicks (GetEventTime (eventRef))*(1000/60);
8166 } 8118 }
8167 else 8119 else
8168 SendEventToEventTarget (eventRef, GetEventDispatcherTarget ()); 8120 SendEventToEventTarget (eventRef, toolbox_dispatcher);
8169 8121
8170 break; 8122 break;
8171 default: 8123 default:
8172 /* Send the event to the appropriate receiver. */ 8124 /* Send the event to the appropriate receiver. */
8173 SendEventToEventTarget (eventRef, GetEventDispatcherTarget ()); 8125 SendEventToEventTarget (eventRef, toolbox_dispatcher);
8174 } 8126 }
8175 else 8127 else
8128 #endif /* USE_CARBON_EVENTS */
8129 switch (er.what)
8130 {
8131 case mouseDown:
8132 case mouseUp:
8133 {
8134 WindowPtr window_ptr;
8135 SInt16 part_code;
8136 int tool_bar_p = 0;
8137
8138 if (dpyinfo->grabbed && last_mouse_frame
8139 && FRAME_LIVE_P (last_mouse_frame))
8140 {
8141 window_ptr = FRAME_MAC_WINDOW (last_mouse_frame);
8142 part_code = inContent;
8143 }
8144 else
8145 {
8146 window_ptr = FrontWindow ();
8147 if (tip_window && window_ptr == tip_window)
8148 {
8149 HideWindow (tip_window);
8150 window_ptr = FrontWindow ();
8151 }
8152
8153 #if USE_CARBON_EVENTS
8154 /* This is needed to send mouse events like aqua
8155 window buttons to the correct handler. */
8156 if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
8157 != eventNotHandledErr)
8158 break;
8159
8160 if (!is_emacs_window (window_ptr))
8161 break;
8162 #endif
8163 part_code = FindWindow (er.where, &window_ptr);
8164 }
8165
8166 switch (part_code)
8167 {
8168 case inMenuBar:
8169 if (er.what == mouseDown)
8170 {
8171 f = mac_window_to_frame (mac_front_window ());
8172 saved_menu_event_location = er.where;
8173 inev.kind = MENU_BAR_ACTIVATE_EVENT;
8174 XSETFRAME (inev.frame_or_window, f);
8175 }
8176 break;
8177
8178 case inContent:
8179 if (window_ptr != mac_front_window ())
8180 SelectWindow (window_ptr);
8181 else
8182 {
8183 SInt16 control_part_code;
8184 ControlHandle ch;
8185 Point mouse_loc = er.where;
8186
8187 f = mac_window_to_frame (window_ptr);
8188 /* convert to local coordinates of new window */
8189 SetPortWindowPort (window_ptr);
8190
8191 GlobalToLocal (&mouse_loc);
8192 #if TARGET_API_MAC_CARBON
8193 ch = FindControlUnderMouse (mouse_loc, window_ptr,
8194 &control_part_code);
8176 #else 8195 #else
8177 if (WaitNextEvent (event_mask, &er, (expected ? app_sleep_time : 0L), NULL)) 8196 control_part_code = FindControl (mouse_loc, window_ptr,
8178 #endif /* USE_CARBON_EVENTS */ 8197 &ch);
8179 switch (er.what) 8198 #endif
8180 {
8181 case mouseDown:
8182 case mouseUp:
8183 {
8184 WindowPtr window_ptr = FrontWindow ();
8185 SInt16 part_code;
8186 8199
8187 #if USE_CARBON_EVENTS 8200 #if USE_CARBON_EVENTS
8188 /* This is needed to send mouse events like aqua window buttons 8201 inev.code = mac_get_mouse_btn (eventRef);
8189 to the correct handler. */ 8202 inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
8190 if (eventNotHandledErr != SendEventToEventTarget (eventRef, GetEventDispatcherTarget ())) { 8203 #else
8204 inev.code = mac_get_emulated_btn (er.modifiers);
8205 inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
8206 #endif
8207 XSETINT (inev.x, mouse_loc.h);
8208 XSETINT (inev.y, mouse_loc.v);
8209 inev.timestamp = er.when * (1000 / 60);
8210 /* ticks to milliseconds */
8211
8212 if (dpyinfo->grabbed && tracked_scroll_bar
8213 #if TARGET_API_MAC_CARBON
8214 || ch != 0
8215 #else
8216 || control_part_code != 0
8217 #endif
8218 )
8219 {
8220 struct scroll_bar *bar;
8221
8222 if (dpyinfo->grabbed && tracked_scroll_bar)
8223 {
8224 bar = tracked_scroll_bar;
8225 control_part_code = kControlIndicatorPart;
8226 }
8227 else
8228 bar = (struct scroll_bar *) GetControlReference (ch);
8229 x_scroll_bar_handle_click (bar, control_part_code,
8230 &er, &inev);
8231 if (er.what == mouseDown
8232 && control_part_code == kControlIndicatorPart)
8233 tracked_scroll_bar = bar;
8234 else
8235 tracked_scroll_bar = NULL;
8236 }
8237 else
8238 {
8239 Lisp_Object window;
8240 int x = mouse_loc.h;
8241 int y = mouse_loc.v;
8242
8243 window = window_from_coordinates (f, x, y, 0, 0, 0, 1);
8244 if (EQ (window, f->tool_bar_window))
8245 {
8246 if (er.what == mouseDown)
8247 handle_tool_bar_click (f, x, y, 1, 0);
8248 else
8249 handle_tool_bar_click (f, x, y, 0,
8250 inev.modifiers);
8251 tool_bar_p = 1;
8252 }
8253 else
8254 {
8255 XSETFRAME (inev.frame_or_window, f);
8256 inev.kind = MOUSE_CLICK_EVENT;
8257 }
8258 }
8259
8260 if (er.what == mouseDown)
8261 {
8262 dpyinfo->grabbed |= (1 << inev.code);
8263 last_mouse_frame = f;
8264 /* Ignore any mouse motion that happened
8265 before this event; any subsequent
8266 mouse-movement Emacs events should reflect
8267 only motion after the ButtonPress. */
8268 if (f != 0)
8269 f->mouse_moved = 0;
8270
8271 if (!tool_bar_p)
8272 last_tool_bar_item = -1;
8273 }
8274 else
8275 {
8276 if (dpyinfo->grabbed & (1 << inev.code) == 0)
8277 /* If a button is released though it was not
8278 previously pressed, that would be because
8279 of multi-button emulation. */
8280 dpyinfo->grabbed = 0;
8281 else
8282 dpyinfo->grabbed &= ~(1 << inev.code);
8283 }
8284
8285 switch (er.what)
8286 {
8287 case mouseDown:
8288 inev.modifiers |= down_modifier;
8289 break;
8290 case mouseUp:
8291 inev.modifiers |= up_modifier;
8292 break;
8293 }
8294 }
8295 break;
8296
8297 case inDrag:
8298 #if TARGET_API_MAC_CARBON
8299 if (er.what == mouseDown)
8300 {
8301 BitMap bm;
8302
8303 GetQDGlobalsScreenBits (&bm);
8304 DragWindow (window_ptr, er.where, &bm.bounds);
8305 }
8306 #else /* not TARGET_API_MAC_CARBON */
8307 DragWindow (window_ptr, er.where, &qd.screenBits.bounds);
8308 #endif /* not TARGET_API_MAC_CARBON */
8309 break;
8310
8311 case inGoAway:
8312 if (TrackGoAway (window_ptr, er.where))
8313 {
8314 inev.kind = DELETE_WINDOW_EVENT;
8315 XSETFRAME (inev.frame_or_window,
8316 mac_window_to_frame (window_ptr));
8317 }
8318 break;
8319
8320 /* window resize handling added --ben */
8321 case inGrow:
8322 if (er.what == mouseDown)
8323 {
8324 do_grow_window(window_ptr, &er);
8325 break;
8326 }
8327
8328 /* window zoom handling added --ben */
8329 case inZoomIn:
8330 case inZoomOut:
8331 if (TrackBox (window_ptr, er.where, part_code))
8332 do_zoom_window (window_ptr, part_code);
8333 break;
8334
8335 default:
8336 break;
8337 }
8338 }
8339 break;
8340
8341 case updateEvt:
8342 #if USE_CARBON_EVENTS
8343 if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
8344 != eventNotHandledErr)
8191 break; 8345 break;
8346 #endif
8347 do_window_update ((WindowPtr) er.message);
8348 break;
8349
8350 case osEvt:
8351 #if USE_CARBON_EVENTS
8352 if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
8353 != eventNotHandledErr)
8354 break;
8355 #endif
8356 switch ((er.message >> 24) & 0x000000FF)
8357 {
8358 case suspendResumeMessage:
8359 if ((er.message & resumeFlag) == 1)
8360 do_app_resume ();
8361 else
8362 do_app_suspend ();
8363 break;
8364
8365 case mouseMovedMessage:
8366 previous_help_echo_string = help_echo_string;
8367 help_echo_string = help_echo_object = help_echo_window = Qnil;
8368 help_echo_pos = -1;
8369
8370 do_mouse_moved (er.where, &f);
8371
8372 /* If the contents of the global variable
8373 help_echo_string has changed, generate a
8374 HELP_EVENT. */
8375 if (!NILP (help_echo_string) || !NILP (previous_help_echo_string))
8376 do_help = 1;
8377 break;
8378 }
8379 break;
8380
8381 case activateEvt:
8382 {
8383 WindowPtr window_ptr = (WindowPtr) er.message;
8384
8385 #if USE_CARBON_EVENTS
8386 if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
8387 != eventNotHandledErr)
8388 break;
8389 #endif
8390 if (window_ptr == tip_window)
8391 {
8392 HideWindow (tip_window);
8393 break;
8394 }
8395
8396 if ((er.modifiers & activeFlag) != 0)
8397 {
8398 Point mouse_loc = er.where;
8399
8400 do_window_activate (window_ptr);
8401
8402 SetPortWindowPort (window_ptr);
8403 GlobalToLocal (&mouse_loc);
8404 /* activateEvt counts as mouse movement,
8405 so update things that depend on mouse position. */
8406 note_mouse_movement (mac_window_to_frame (window_ptr),
8407 &mouse_loc);
8408 }
8409 else
8410 {
8411 do_window_deactivate (window_ptr);
8412
8413 f = mac_window_to_frame (window_ptr);
8414 if (f == dpyinfo->mouse_face_mouse_frame)
8415 {
8416 /* If we move outside the frame, then we're
8417 certainly no longer on any text in the
8418 frame. */
8419 clear_mouse_face (dpyinfo);
8420 dpyinfo->mouse_face_mouse_frame = 0;
8421 }
8422
8423 /* Generate a nil HELP_EVENT to cancel a help-echo.
8424 Do it only if there's something to cancel.
8425 Otherwise, the startup message is cleared when the
8426 mouse leaves the frame. */
8427 if (any_help_event_p)
8428 do_help = -1;
8429 }
8192 } 8430 }
8193 8431 break;
8194 if (!is_emacs_window(window_ptr)) 8432
8195 break; 8433 case keyDown:
8196 #endif 8434 case autoKey:
8197 8435 {
8198 if (mouse_tracking_in_progress == mouse_tracking_scroll_bar 8436 int keycode = (er.message & keyCodeMask) >> 8;
8199 && er.what == mouseUp) 8437 int xkeysym;
8200 { 8438
8201 struct mac_output *mwp = (mac_output *) GetWRefCon (window_ptr); 8439 #if USE_CARBON_EVENTS
8202 Point mouse_loc = er.where; 8440 /* When using Carbon Events, we need to pass raw keyboard
8203 8441 events to the TSM ourselves. If TSM handles it, it
8204 /* Convert to local coordinates of new window. */ 8442 will pass back noErr, otherwise it will pass back
8443 "eventNotHandledErr" and we can process it
8444 normally. */
8445 if ((!NILP (Vmac_pass_command_to_system)
8446 || !(er.modifiers & cmdKey))
8447 && (!NILP (Vmac_pass_control_to_system)
8448 || !(er.modifiers & controlKey)))
8449 if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
8450 != eventNotHandledErr)
8451 break;
8452 #endif
8453
8205 #if TARGET_API_MAC_CARBON 8454 #if TARGET_API_MAC_CARBON
8206 SetPort (GetWindowPort (window_ptr)); 8455 if (!IsValidWindowPtr (mac_front_window ()))
8456 {
8457 SysBeep (1);
8458 break;
8459 }
8460 #endif
8461
8462 ObscureCursor ();
8463
8464 if (!dpyinfo->mouse_face_hidden && INTEGERP (Vmouse_highlight))
8465 {
8466 clear_mouse_face (dpyinfo);
8467 dpyinfo->mouse_face_hidden = 1;
8468 }
8469
8470 if (keycode_to_xkeysym (keycode, &xkeysym))
8471 {
8472 inev.code = 0xff00 | xkeysym;
8473 inev.kind = NON_ASCII_KEYSTROKE_EVENT;
8474 }
8475 else
8476 {
8477 if (er.modifiers & (controlKey |
8478 (NILP (Vmac_command_key_is_meta) ? optionKey
8479 : cmdKey)))
8480 {
8481 /* This code comes from Keyboard Resource,
8482 Appendix C of IM - Text. This is necessary
8483 since shift is ignored in KCHR table
8484 translation when option or command is pressed.
8485 It also does not translate correctly
8486 control-shift chars like C-% so mask off shift
8487 here also */
8488 int new_modifiers = er.modifiers & 0xe600;
8489 /* mask off option and command */
8490 int new_keycode = keycode | new_modifiers;
8491 Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache);
8492 unsigned long some_state = 0;
8493 inev.code = KeyTranslate (kchr_ptr, new_keycode,
8494 &some_state) & 0xff;
8495 }
8496 else
8497 inev.code = er.message & charCodeMask;
8498 inev.kind = ASCII_KEYSTROKE_EVENT;
8499 }
8500 }
8501
8502 /* If variable mac-convert-keyboard-input-to-latin-1 is
8503 non-nil, convert non-ASCII characters typed at the Mac
8504 keyboard (presumed to be in the Mac Roman encoding) to
8505 iso-latin-1 encoding before they are passed to Emacs.
8506 This enables the Mac keyboard to be used to enter
8507 non-ASCII iso-latin-1 characters directly. */
8508 if (mac_keyboard_text_encoding != kTextEncodingMacRoman
8509 && inev.kind == ASCII_KEYSTROKE_EVENT && inev.code >= 128)
8510 {
8511 static TECObjectRef converter = NULL;
8512 OSStatus the_err = noErr;
8513 OSStatus convert_status = noErr;
8514
8515 if (converter == NULL)
8516 {
8517 the_err = TECCreateConverter (&converter,
8518 kTextEncodingMacRoman,
8519 mac_keyboard_text_encoding);
8520 current_mac_keyboard_text_encoding
8521 = mac_keyboard_text_encoding;
8522 }
8523 else if (mac_keyboard_text_encoding
8524 != current_mac_keyboard_text_encoding)
8525 {
8526 /* Free the converter for the current encoding
8527 before creating a new one. */
8528 TECDisposeConverter (converter);
8529 the_err = TECCreateConverter (&converter,
8530 kTextEncodingMacRoman,
8531 mac_keyboard_text_encoding);
8532 current_mac_keyboard_text_encoding
8533 = mac_keyboard_text_encoding;
8534 }
8535
8536 if (the_err == noErr)
8537 {
8538 unsigned char ch = inev.code;
8539 ByteCount actual_input_length, actual_output_length;
8540 unsigned char outch;
8541
8542 convert_status = TECConvertText (converter, &ch, 1,
8543 &actual_input_length,
8544 &outch, 1,
8545 &actual_output_length);
8546 if (convert_status == noErr
8547 && actual_input_length == 1
8548 && actual_output_length == 1)
8549 inev.code = outch;
8550 }
8551 }
8552
8553 #if USE_CARBON_EVENTS
8554 inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
8207 #else 8555 #else
8208 SetPort (window_ptr); 8556 inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
8209 #endif 8557 #endif
8210 8558 XSETFRAME (inev.frame_or_window,
8211 GlobalToLocal (&mouse_loc); 8559 mac_window_to_frame (mac_front_window ()));
8212 8560 inev.timestamp = er.when * (1000 / 60); /* ticks to milliseconds */
8213 #if USE_CARBON_EVENTS 8561 break;
8214 inev.code = mac_get_mouse_btn (eventRef); 8562
8215 #else 8563 case kHighLevelEvent:
8216 inev.code = mac_get_emulate_btn (er.modifiers); 8564 drag_and_drop_file_list = Qnil;
8217 #endif 8565
8218 inev.kind = SCROLL_BAR_CLICK_EVENT; 8566 AEProcessAppleEvent(&er);
8219 inev.frame_or_window = tracked_scroll_bar->window; 8567
8220 inev.part = scroll_bar_handle; 8568 /* Build a DRAG_N_DROP_EVENT type event as is done in
8569 constuct_drag_n_drop in w32term.c. */
8570 if (!NILP (drag_and_drop_file_list))
8571 {
8572 struct frame *f = NULL;
8573 WindowPtr wp;
8574 Lisp_Object frame;
8575
8576 wp = mac_front_window ();
8577
8578 if (!wp)
8579 {
8580 struct frame *f = XFRAME (XCAR (Vframe_list));
8581 CollapseWindow (FRAME_MAC_WINDOW (f), false);
8582 wp = mac_front_window ();
8583 }
8584
8585 if (wp && is_emacs_window (wp))
8586 f = mac_window_to_frame (wp);
8587
8588 inev.kind = DRAG_N_DROP_EVENT;
8589 inev.code = 0;
8590 inev.timestamp = er.when * (1000 / 60);
8591 /* ticks to milliseconds */
8221 #if USE_CARBON_EVENTS 8592 #if USE_CARBON_EVENTS
8222 inev.modifiers = mac_event_to_emacs_modifiers (eventRef); 8593 inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
8223 #else 8594 #else
8224 inev.modifiers = mac_to_emacs_modifiers (er.modifiers); 8595 inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
8225 #endif 8596 #endif
8226 inev.modifiers |= up_modifier; 8597
8227 inev.timestamp = er.when * (1000 / 60); 8598 XSETINT (inev.x, 0);
8228 /* ticks to milliseconds */ 8599 XSETINT (inev.y, 0);
8229 8600
8230 XSETINT (inev.x, XFASTINT (tracked_scroll_bar->left) + 2); 8601 XSETFRAME (frame, f);
8231 XSETINT (inev.y, mouse_loc.v - 24); 8602 inev.frame_or_window = Fcons (frame, drag_and_drop_file_list);
8232 tracked_scroll_bar->dragging = Qnil; 8603
8233 mouse_tracking_in_progress = mouse_tracking_none; 8604 /* Regardless of whether Emacs was suspended or in the
8234 tracked_scroll_bar = NULL; 8605 foreground, ask it to redraw its entire screen.
8235 break; 8606 Otherwise parts of the screen can be left in an
8236 } 8607 inconsistent state. */
8237 8608 if (wp)
8238 part_code = FindWindow (er.where, &window_ptr); 8609 #if TARGET_API_MAC_CARBON
8239
8240 switch (part_code)
8241 {
8242 case inMenuBar:
8243 if (er.what == mouseDown)
8244 { 8610 {
8245 struct frame *f = ((mac_output *) 8611 Rect r;
8246 GetWRefCon (FrontWindow ()))->mFP; 8612
8247 saved_menu_event_location = er.where; 8613 GetWindowPortBounds (wp, &r);
8248 inev.kind = MENU_BAR_ACTIVATE_EVENT; 8614 InvalWindowRect (wp, &r);
8249 XSETFRAME (inev.frame_or_window, f);
8250 }
8251 break;
8252
8253 case inContent:
8254 if (window_ptr != FrontWindow ())
8255 SelectWindow (window_ptr);
8256 else
8257 {
8258 SInt16 control_part_code;
8259 ControlHandle ch;
8260 struct mac_output *mwp = (mac_output *)
8261 GetWRefCon (window_ptr);
8262 Point mouse_loc = er.where;
8263
8264 /* convert to local coordinates of new window */
8265 #if TARGET_API_MAC_CARBON
8266 SetPort (GetWindowPort (window_ptr));
8267 #else
8268 SetPort (window_ptr);
8269 #endif
8270
8271 GlobalToLocal (&mouse_loc);
8272 #if TARGET_API_MAC_CARBON
8273 ch = FindControlUnderMouse (mouse_loc, window_ptr,
8274 &control_part_code);
8275 #else
8276 control_part_code = FindControl (mouse_loc, window_ptr, &ch);
8277 #endif
8278
8279 #if USE_CARBON_EVENTS
8280 inev.code = mac_get_mouse_btn (eventRef);
8281 #else
8282 inev.code = mac_get_emulate_btn (er.modifiers);
8283 #endif
8284 XSETINT (inev.x, mouse_loc.h);
8285 XSETINT (inev.y, mouse_loc.v);
8286 inev.timestamp = er.when * (1000 / 60);
8287 /* ticks to milliseconds */
8288
8289 #if TARGET_API_MAC_CARBON
8290 if (ch != 0)
8291 #else
8292 if (control_part_code != 0)
8293 #endif
8294 {
8295 struct scroll_bar *bar = (struct scroll_bar *)
8296 GetControlReference (ch);
8297 x_scroll_bar_handle_click (bar, control_part_code, &er,
8298 &inev);
8299 if (er.what == mouseDown
8300 && control_part_code == kControlIndicatorPart)
8301 {
8302 mouse_tracking_in_progress
8303 = mouse_tracking_scroll_bar;
8304 tracked_scroll_bar = bar;
8305 }
8306 else
8307 {
8308 mouse_tracking_in_progress = mouse_tracking_none;
8309 tracked_scroll_bar = NULL;
8310 }
8311 }
8312 else
8313 {
8314 Lisp_Object window;
8315 int x = mouse_loc.h;
8316 int y = mouse_loc.v;
8317
8318 XSETFRAME (inev.frame_or_window, mwp->mFP);
8319 if (er.what == mouseDown)
8320 mouse_tracking_in_progress
8321 = mouse_tracking_mouse_movement;
8322 else
8323 mouse_tracking_in_progress = mouse_tracking_none;
8324 window = window_from_coordinates (mwp->mFP, x, y, 0, 0, 0, 1);
8325
8326 if (EQ (window, mwp->mFP->tool_bar_window))
8327 {
8328 if (er.what == mouseDown)
8329 handle_tool_bar_click (mwp->mFP, x, y, 1, 0);
8330 else
8331 handle_tool_bar_click (mwp->mFP, x, y, 0,
8332 #if USE_CARBON_EVENTS
8333 mac_event_to_emacs_modifiers (eventRef)
8334 #else
8335 er.modifiers
8336 #endif
8337 );
8338 break;
8339 }
8340 else
8341 inev.kind = MOUSE_CLICK_EVENT;
8342 }
8343
8344 #if USE_CARBON_EVENTS
8345 inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
8346 #else
8347 inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
8348 #endif
8349
8350 switch (er.what)
8351 {
8352 case mouseDown:
8353 inev.modifiers |= down_modifier;
8354 break;
8355 case mouseUp:
8356 inev.modifiers |= up_modifier;
8357 break;
8358 }
8359 }
8360 break;
8361
8362 case inDrag:
8363 #if TARGET_API_MAC_CARBON
8364 if (er.what == mouseDown)
8365 {
8366 BitMap bm;
8367
8368 GetQDGlobalsScreenBits (&bm);
8369 DragWindow (window_ptr, er.where, &bm.bounds);
8370 } 8615 }
8371 #else /* not TARGET_API_MAC_CARBON */ 8616 #else /* not TARGET_API_MAC_CARBON */
8372 DragWindow (window_ptr, er.where, &qd.screenBits.bounds); 8617 InvalRect (&(wp->portRect));
8373 #endif /* not TARGET_API_MAC_CARBON */ 8618 #endif /* not TARGET_API_MAC_CARBON */
8374 break;
8375
8376 case inGoAway:
8377 if (TrackGoAway (window_ptr, er.where))
8378 {
8379 inev.kind = DELETE_WINDOW_EVENT;
8380 XSETFRAME (inev.frame_or_window,
8381 ((mac_output *) GetWRefCon (window_ptr))->mFP);
8382 }
8383 break;
8384
8385 /* window resize handling added --ben */
8386 case inGrow:
8387 if (er.what == mouseDown)
8388 {
8389 do_grow_window(window_ptr, &er);
8390 break;
8391 }
8392
8393 /* window zoom handling added --ben */
8394 case inZoomIn:
8395 case inZoomOut:
8396 if (TrackBox (window_ptr, er.where, part_code))
8397 do_zoom_window (window_ptr, part_code);
8398 break;
8399
8400 default:
8401 break;
8402 } 8619 }
8620 default:
8621 break;
8403 } 8622 }
8404 break;
8405
8406 case updateEvt:
8407 case osEvt:
8408 case activateEvt:
8409 #if USE_CARBON_EVENTS 8623 #if USE_CARBON_EVENTS
8410 if (eventNotHandledErr == SendEventToEventTarget (eventRef, GetEventDispatcherTarget ())) 8624 ReleaseEvent (eventRef);
8411 #endif 8625 #endif
8412 do_events (&er); 8626
8413 break; 8627 if (inev.kind != NO_EVENT)
8414
8415 case keyDown:
8416 case autoKey:
8417 { 8628 {
8418 int keycode = (er.message & keyCodeMask) >> 8; 8629 kbd_buffer_store_event_hold (&inev, hold_quit);
8419 int xkeysym; 8630 count++;
8420 8631 }
8421 #if USE_CARBON_EVENTS 8632
8422 /* When using Carbon Events, we need to pass raw keyboard events 8633 if (do_help
8423 to the TSM ourselves. If TSM handles it, it will pass back 8634 && !(hold_quit && hold_quit->kind != NO_EVENT))
8424 noErr, otherwise it will pass back "eventNotHandledErr" and 8635 {
8425 we can process it normally. */ 8636 Lisp_Object frame;
8426 if ((!NILP (Vmac_pass_command_to_system) 8637
8427 || !(er.modifiers & cmdKey)) 8638 if (f)
8428 && (!NILP (Vmac_pass_control_to_system) 8639 XSETFRAME (frame, f);
8429 || !(er.modifiers & controlKey))) 8640 else
8641 frame = Qnil;
8642
8643 if (do_help > 0)
8430 { 8644 {
8431 OSStatus err; 8645 any_help_event_p = 1;
8432 err = SendEventToEventTarget (eventRef, 8646 gen_help_event (help_echo_string, frame, help_echo_window,
8433 GetEventDispatcherTarget ()); 8647 help_echo_object, help_echo_pos);
8434 if (err != eventNotHandledErr)
8435 break;
8436 }
8437 #endif
8438
8439 if (!IsValidWindowPtr (FrontNonFloatingWindow ()))
8440 {
8441 SysBeep (1);
8442 UNBLOCK_INPUT;
8443 return 0;
8444 }
8445
8446 ObscureCursor ();
8447
8448 if (keycode_to_xkeysym (keycode, &xkeysym))
8449 {
8450 inev.code = 0xff00 | xkeysym;
8451 inev.kind = NON_ASCII_KEYSTROKE_EVENT;
8452 } 8648 }
8453 else 8649 else
8454 { 8650 {
8455 if (er.modifiers & (controlKey | 8651 help_echo_string = Qnil;
8456 (NILP (Vmac_command_key_is_meta) ? optionKey 8652 gen_help_event (Qnil, frame, Qnil, Qnil, 0);
8457 : cmdKey)))
8458 {
8459 /* This code comes from Keyboard Resource, Appendix
8460 C of IM - Text. This is necessary since shift is
8461 ignored in KCHR table translation when option or
8462 command is pressed. It also does not translate
8463 correctly control-shift chars like C-% so mask off
8464 shift here also */
8465 int new_modifiers = er.modifiers & 0xe600;
8466 /* mask off option and command */
8467 int new_keycode = keycode | new_modifiers;
8468 Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache);
8469 unsigned long some_state = 0;
8470 inev.code = KeyTranslate (kchr_ptr, new_keycode,
8471 &some_state) & 0xff;
8472 }
8473 else
8474 inev.code = er.message & charCodeMask;
8475 inev.kind = ASCII_KEYSTROKE_EVENT;
8476 } 8653 }
8654 count++;
8477 } 8655 }
8478 8656
8479 /* If variable mac-convert-keyboard-input-to-latin-1 is non-nil, 8657 }
8480 convert non-ASCII characters typed at the Mac keyboard
8481 (presumed to be in the Mac Roman encoding) to iso-latin-1
8482 encoding before they are passed to Emacs. This enables the
8483 Mac keyboard to be used to enter non-ASCII iso-latin-1
8484 characters directly. */
8485 if (mac_keyboard_text_encoding != kTextEncodingMacRoman
8486 && inev.kind == ASCII_KEYSTROKE_EVENT && inev.code >= 128)
8487 {
8488 static TECObjectRef converter = NULL;
8489 OSStatus the_err = noErr;
8490 OSStatus convert_status = noErr;
8491
8492 if (converter == NULL)
8493 {
8494 the_err = TECCreateConverter (&converter,
8495 kTextEncodingMacRoman,
8496 mac_keyboard_text_encoding);
8497 current_mac_keyboard_text_encoding
8498 = mac_keyboard_text_encoding;
8499 }
8500 else if (mac_keyboard_text_encoding
8501 != current_mac_keyboard_text_encoding)
8502 {
8503 /* Free the converter for the current encoding before
8504 creating a new one. */
8505 TECDisposeConverter (converter);
8506 the_err = TECCreateConverter (&converter,
8507 kTextEncodingMacRoman,
8508 mac_keyboard_text_encoding);
8509 current_mac_keyboard_text_encoding
8510 = mac_keyboard_text_encoding;
8511 }
8512
8513 if (the_err == noErr)
8514 {
8515 unsigned char ch = inev.code;
8516 ByteCount actual_input_length, actual_output_length;
8517 unsigned char outch;
8518
8519 convert_status = TECConvertText (converter, &ch, 1,
8520 &actual_input_length,
8521 &outch, 1,
8522 &actual_output_length);
8523 if (convert_status == noErr
8524 && actual_input_length == 1
8525 && actual_output_length == 1)
8526 inev.code = outch;
8527 }
8528 }
8529
8530 #if USE_CARBON_EVENTS
8531 inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
8532 #else
8533 inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
8534 #endif
8535
8536 {
8537 mac_output *mwp
8538 = (mac_output *) GetWRefCon (FrontNonFloatingWindow ());
8539 XSETFRAME (inev.frame_or_window, mwp->mFP);
8540 }
8541
8542 inev.timestamp = er.when * (1000 / 60); /* ticks to milliseconds */
8543 break;
8544
8545 case kHighLevelEvent:
8546 drag_and_drop_file_list = Qnil;
8547
8548 AEProcessAppleEvent(&er);
8549
8550 /* Build a DRAG_N_DROP_EVENT type event as is done in
8551 constuct_drag_n_drop in w32term.c. */
8552 if (!NILP (drag_and_drop_file_list))
8553 {
8554 struct frame *f = NULL;
8555 WindowPtr wp;
8556 Lisp_Object frame;
8557
8558 wp = FrontNonFloatingWindow ();
8559
8560 if (!wp)
8561 {
8562 struct frame *f = XFRAME (XCAR (Vframe_list));
8563 CollapseWindow (FRAME_MAC_WINDOW (f), false);
8564 wp = FrontNonFloatingWindow ();
8565 }
8566
8567 if (wp && is_emacs_window(wp))
8568 f = ((mac_output *) GetWRefCon (wp))->mFP;
8569
8570 inev.kind = DRAG_N_DROP_EVENT;
8571 inev.code = 0;
8572 inev.timestamp = er.when * (1000 / 60);
8573 /* ticks to milliseconds */
8574 #if USE_CARBON_EVENTS
8575 inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
8576 #else
8577 inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
8578 #endif
8579
8580 XSETINT (inev.x, 0);
8581 XSETINT (inev.y, 0);
8582
8583 XSETFRAME (frame, f);
8584 inev.frame_or_window = Fcons (frame, drag_and_drop_file_list);
8585
8586 /* Regardless of whether Emacs was suspended or in the
8587 foreground, ask it to redraw its entire screen.
8588 Otherwise parts of the screen can be left in an
8589 inconsistent state. */
8590 if (wp)
8591 #if TARGET_API_MAC_CARBON
8592 {
8593 Rect r;
8594
8595 GetWindowPortBounds (wp, &r);
8596 InvalWindowRect (wp, &r);
8597 }
8598 #else /* not TARGET_API_MAC_CARBON */
8599 InvalRect (&(wp->portRect));
8600 #endif /* not TARGET_API_MAC_CARBON */
8601 }
8602 default:
8603 break;
8604 }
8605 #if USE_CARBON_EVENTS
8606 ReleaseEvent (eventRef);
8607 }
8608 #endif
8609 8658
8610 /* If the focus was just given to an autoraising frame, 8659 /* If the focus was just given to an autoraising frame,
8611 raise it now. */ 8660 raise it now. */
8612 /* ??? This ought to be able to handle more than one such frame. */ 8661 /* ??? This ought to be able to handle more than one such frame. */
8613 if (pending_autoraise_frame) 8662 if (pending_autoraise_frame)
8617 } 8666 }
8618 8667
8619 #if !TARGET_API_MAC_CARBON 8668 #if !TARGET_API_MAC_CARBON
8620 check_alarm (); /* simulate the handling of a SIGALRM */ 8669 check_alarm (); /* simulate the handling of a SIGALRM */
8621 #endif 8670 #endif
8622
8623 {
8624 static Point old_mouse_pos = { -1, -1 };
8625
8626 if (app_is_suspended)
8627 {
8628 old_mouse_pos.h = -1;
8629 old_mouse_pos.v = -1;
8630 }
8631 else
8632 {
8633 Point mouse_pos;
8634 WindowPtr wp;
8635 struct frame *f;
8636 Lisp_Object bar;
8637 struct scroll_bar *sb;
8638
8639 wp = FrontWindow ();
8640 if (is_emacs_window (wp))
8641 {
8642 f = ((mac_output *) GetWRefCon (wp))->mFP;
8643
8644 #if TARGET_API_MAC_CARBON
8645 SetPort (GetWindowPort (wp));
8646 #else
8647 SetPort (wp);
8648 #endif
8649
8650 GetMouse (&mouse_pos);
8651
8652 if (!EqualPt (mouse_pos, old_mouse_pos))
8653 {
8654 if (mouse_tracking_in_progress == mouse_tracking_scroll_bar
8655 && tracked_scroll_bar)
8656 x_scroll_bar_note_movement (tracked_scroll_bar,
8657 mouse_pos.v
8658 - XINT (tracked_scroll_bar->top),
8659 TickCount() * (1000 / 60));
8660 else
8661 note_mouse_movement (f, &mouse_pos);
8662
8663 old_mouse_pos = mouse_pos;
8664 }
8665 }
8666 }
8667 }
8668
8669 if (inev.kind != NO_EVENT)
8670 {
8671 kbd_buffer_store_event_hold (&inev, hold_quit);
8672 count++;
8673 }
8674 8671
8675 UNBLOCK_INPUT; 8672 UNBLOCK_INPUT;
8676 return count; 8673 return count;
8677 } 8674 }
8678 8675
8698 8695
8699 /* Initialize the struct pointed to by MW to represent a new COLS x 8696 /* Initialize the struct pointed to by MW to represent a new COLS x
8700 ROWS Macintosh window, using font with name FONTNAME and size 8697 ROWS Macintosh window, using font with name FONTNAME and size
8701 FONTSIZE. */ 8698 FONTSIZE. */
8702 void 8699 void
8703 NewMacWindow (FRAME_PTR fp) 8700 make_mac_frame (FRAME_PTR fp)
8704 { 8701 {
8705 mac_output *mwp; 8702 mac_output *mwp;
8706 #if TARGET_API_MAC_CARBON 8703 #if TARGET_API_MAC_CARBON
8707 static int making_terminal_window = 0; 8704 static int making_terminal_window = 0;
8708 #else 8705 #else
8717 (WindowPtr) -1))) 8714 (WindowPtr) -1)))
8718 abort (); 8715 abort ();
8719 making_terminal_window = 0; 8716 making_terminal_window = 0;
8720 } 8717 }
8721 else 8718 else
8722 if (!(mwp->mWP = GetNewCWindow (WINDOW_RESOURCE, NULL, (WindowPtr) -1))) 8719 {
8723 abort (); 8720 #if TARGET_API_MAC_CARBON
8721 Rect r;
8722
8723 SetRect (&r, 0, 0, 1, 1);
8724 if (CreateNewWindow (kDocumentWindowClass,
8725 kWindowStandardDocumentAttributes
8726 /* | kWindowToolbarButtonAttribute */,
8727 &r, &mwp->mWP) != noErr)
8728 #else
8729 if (!(mwp->mWP = GetNewCWindow (WINDOW_RESOURCE, NULL, (WindowPtr) -1)))
8730 #endif
8731 abort ();
8732 }
8724 8733
8725 SetWRefCon (mwp->mWP, (long) mwp); 8734 SetWRefCon (mwp->mWP, (long) mwp);
8726 /* so that update events can find this mac_output struct */ 8735 /* so that update events can find this mac_output struct */
8727 mwp->mFP = fp; /* point back to emacs frame */ 8736 mwp->mFP = fp; /* point back to emacs frame */
8728 8737
8729 #if TARGET_API_MAC_CARBON 8738 SetPortWindowPort (mwp->mWP);
8730 SetPort (GetWindowPort (mwp->mWP));
8731 #else
8732 SetPort (mwp->mWP);
8733 #endif
8734
8735 mwp->fontset = -1;
8736 8739
8737 SizeWindow (mwp->mWP, FRAME_PIXEL_WIDTH (fp), FRAME_PIXEL_HEIGHT (fp), false); 8740 SizeWindow (mwp->mWP, FRAME_PIXEL_WIDTH (fp), FRAME_PIXEL_HEIGHT (fp), false);
8738 ShowWindow (mwp->mWP);
8739
8740 } 8741 }
8741 8742
8742 8743
8743 void 8744 void
8744 make_mac_frame (struct frame *f) 8745 make_mac_terminal_frame (struct frame *f)
8745 { 8746 {
8747 Lisp_Object frame;
8748
8749 XSETFRAME (frame, f);
8750
8751 f->output_method = output_mac;
8752 f->output_data.mac = (struct mac_output *)
8753 xmalloc (sizeof (struct mac_output));
8754 bzero (f->output_data.mac, sizeof (struct mac_output));
8755
8756 XSETFRAME (FRAME_KBOARD (f)->Vdefault_minibuffer_frame, f);
8757
8758 FRAME_COLS (f) = 96;
8759 FRAME_LINES (f) = 4;
8760
8761 FRAME_CAN_HAVE_SCROLL_BARS (f) = 1;
8762 FRAME_VERTICAL_SCROLL_BAR_TYPE (f) = vertical_scroll_bar_right;
8763
8746 FRAME_DESIRED_CURSOR (f) = FILLED_BOX_CURSOR; 8764 FRAME_DESIRED_CURSOR (f) = FILLED_BOX_CURSOR;
8747
8748 NewMacWindow(f);
8749 8765
8750 f->output_data.mac->cursor_pixel = 0; 8766 f->output_data.mac->cursor_pixel = 0;
8751 f->output_data.mac->border_pixel = 0x00ff00; 8767 f->output_data.mac->border_pixel = 0x00ff00;
8752 f->output_data.mac->mouse_pixel = 0xff00ff; 8768 f->output_data.mac->mouse_pixel = 0xff00ff;
8753 f->output_data.mac->cursor_foreground_pixel = 0x0000ff; 8769 f->output_data.mac->cursor_foreground_pixel = 0x0000ff;
8754 8770
8755 FRAME_FONTSET (f) = -1; 8771 FRAME_FONTSET (f) = -1;
8756 f->output_data.mac->scroll_bar_foreground_pixel = -1;
8757 f->output_data.mac->scroll_bar_background_pixel = -1;
8758 f->output_data.mac->explicit_parent = 0; 8772 f->output_data.mac->explicit_parent = 0;
8759 f->left_pos = 4; 8773 f->left_pos = 4;
8760 f->top_pos = 4; 8774 f->top_pos = 4;
8761 f->border_width = 0; 8775 f->border_width = 0;
8762 8776
8763 f->internal_border_width = 0; 8777 f->internal_border_width = 0;
8764 8778
8765 f->output_method = output_mac;
8766
8767 f->auto_raise = 1; 8779 f->auto_raise = 1;
8768 f->auto_lower = 1; 8780 f->auto_lower = 1;
8769 8781
8770 f->new_text_cols = 0; 8782 f->new_text_cols = 0;
8771 f->new_text_lines = 0; 8783 f->new_text_lines = 0;
8772 }
8773
8774 void
8775 make_mac_terminal_frame (struct frame *f)
8776 {
8777 Lisp_Object frame;
8778
8779 XSETFRAME (frame, f);
8780
8781 f->output_method = output_mac;
8782 f->output_data.mac = (struct mac_output *)
8783 xmalloc (sizeof (struct mac_output));
8784 bzero (f->output_data.mac, sizeof (struct mac_output));
8785 FRAME_FONTSET (f) = -1;
8786 f->output_data.mac->scroll_bar_foreground_pixel = -1;
8787 f->output_data.mac->scroll_bar_background_pixel = -1;
8788
8789 XSETFRAME (FRAME_KBOARD (f)->Vdefault_minibuffer_frame, f);
8790
8791 FRAME_COLS (f) = 96;
8792 FRAME_LINES (f) = 4;
8793
8794 FRAME_CAN_HAVE_SCROLL_BARS (f) = 1;
8795 FRAME_VERTICAL_SCROLL_BAR_TYPE (f) = vertical_scroll_bar_right;
8796 8784
8797 make_mac_frame (f); 8785 make_mac_frame (f);
8798 8786
8799 x_make_gc (f); 8787 x_make_gc (f);
8800 8788
8808 Fcons (Fcons (Qforeground_color, 8796 Fcons (Fcons (Qforeground_color,
8809 build_string ("black")), Qnil)); 8797 build_string ("black")), Qnil));
8810 Fmodify_frame_parameters (frame, 8798 Fmodify_frame_parameters (frame,
8811 Fcons (Fcons (Qbackground_color, 8799 Fcons (Fcons (Qbackground_color,
8812 build_string ("white")), Qnil)); 8800 build_string ("white")), Qnil));
8801
8802 ShowWindow (f->output_data.mac->mWP);
8813 } 8803 }
8814 8804
8815 8805
8816 /*********************************************************************** 8806 /***********************************************************************
8817 Initialization 8807 Initialization
8862 8852
8863 dpyinfo->mouse_face_beg_row = dpyinfo->mouse_face_beg_col = -1; 8853 dpyinfo->mouse_face_beg_row = dpyinfo->mouse_face_beg_col = -1;
8864 dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_end_col = -1; 8854 dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_end_col = -1;
8865 dpyinfo->mouse_face_face_id = DEFAULT_FACE_ID; 8855 dpyinfo->mouse_face_face_id = DEFAULT_FACE_ID;
8866 dpyinfo->mouse_face_window = Qnil; 8856 dpyinfo->mouse_face_window = Qnil;
8857 dpyinfo->mouse_face_overlay = Qnil;
8858 dpyinfo->mouse_face_hidden = 0;
8867 } 8859 }
8868 8860
8869 struct mac_display_info * 8861 struct mac_display_info *
8870 mac_term_init (display_name, xrm_option, resource_name) 8862 mac_term_init (display_name, xrm_option, resource_name)
8871 Lisp_Object display_name; 8863 Lisp_Object display_name;
9018 NULL); 9010 NULL);
9019 UNBLOCK_INPUT; 9011 UNBLOCK_INPUT;
9020 if (event) 9012 if (event)
9021 { 9013 {
9022 struct input_event e; 9014 struct input_event e;
9023 struct mac_output *mwp = 9015
9024 (mac_output *) GetWRefCon (FrontNonFloatingWindow ());
9025 /* Use an input_event to emulate what the interrupt handler does. */ 9016 /* Use an input_event to emulate what the interrupt handler does. */
9026 EVENT_INIT (e); 9017 EVENT_INIT (e);
9027 e.kind = ASCII_KEYSTROKE_EVENT; 9018 e.kind = ASCII_KEYSTROKE_EVENT;
9028 e.code = quit_char; 9019 e.code = quit_char;
9029 e.arg = Qnil; 9020 e.arg = Qnil;
9030 e.modifiers = NULL; 9021 e.modifiers = NULL;
9031 e.timestamp = EventTimeToTicks (GetEventTime (event)) * (1000/60); 9022 e.timestamp = EventTimeToTicks (GetEventTime (event)) * (1000/60);
9032 XSETFRAME (e.frame_or_window, mwp->mFP); 9023 XSETFRAME (e.frame_or_window, mac_window_to_frame (mac_front_window ()));
9033 /* Remove event from queue to prevent looping. */ 9024 /* Remove event from queue to prevent looping. */
9034 RemoveEventFromQueue (GetMainEventQueue (), event); 9025 RemoveEventFromQueue (GetMainEventQueue (), event);
9035 ReleaseEvent (event); 9026 ReleaseEvent (event);
9036 kbd_buffer_store_event (&e); 9027 kbd_buffer_store_event (&e);
9037 } 9028 }