aboutsummaryrefslogtreecommitdiffstats
path: root/src/macterm.c
diff options
context:
space:
mode:
authorMiles Bader2005-06-15 23:32:15 +0000
committerMiles Bader2005-06-15 23:32:15 +0000
commit2092fd2b3339ac097e1b27643b70211dcb0b4e95 (patch)
tree7f2307bbb82c7f111678885f871d88d44c870d4e /src/macterm.c
parent8786f9fffda045f818e622bddd9c85249dfb9ff7 (diff)
parenta4bf534f1eb1dcb2048f5deeff783c23059e3924 (diff)
downloademacs-2092fd2b3339ac097e1b27643b70211dcb0b4e95.tar.gz
emacs-2092fd2b3339ac097e1b27643b70211dcb0b4e95.zip
Revision: miles@gnu.org--gnu-2005/emacs--unicode--0--patch-63
Merge from emacs--cvs-trunk--0 Patches applied: * emacs--cvs-trunk--0 (patch 358-423) - Update from CVS - Remove "-face" suffix from widget faces - Remove "-face" suffix from custom faces - Remove "-face" suffix from change-log faces - Remove "-face" suffix from compilation faces - Remove "-face" suffix from diff-mode faces - lisp/longlines.el (longlines-visible-face): Face removed - Remove "-face" suffix from woman faces - Remove "-face" suffix from whitespace-highlight face - Remove "-face" suffix from ruler-mode faces - Remove "-face" suffix from show-paren faces - Remove "-face" suffix from log-view faces - Remove "-face" suffix from smerge faces - Remove "-face" suffix from show-tabs faces - Remove "-face" suffix from highlight-changes faces - Remove "-face" suffix from and downcase info faces - Remove "-face" suffix from pcvs faces - Update uses of renamed pcvs faces - Tweak ChangeLog - Remove "-face" suffix from strokes-char face - Remove "-face" suffix from compare-windows face - Remove "-face" suffix from calendar faces - Remove "-face" suffix from diary-button face - Remove "-face" suffix from testcover faces - Remove "-face" suffix from viper faces - Remove "-face" suffix from org faces - Remove "-face" suffix from sgml-namespace face - Remove "-face" suffix from table-cell face - Remove "-face" suffix from tex-mode faces - Remove "-face" suffix from texinfo-heading face - Remove "-face" suffix from flyspell faces - Remove "-face" suffix from gomoku faces - Remove "-face" suffix from mpuz faces - Merge from gnus--rel--5.10 - Remove "-face" suffix from Buffer-menu-buffer face - Remove "-face" suffix from antlr-mode faces - Remove "-face" suffix from ebrowse faces - Remove "-face" suffix from flymake faces - Remove "-face" suffix from idlwave faces - Remove "-face" suffix from sh-script faces - Remove "-face" suffix from vhdl-mode faces - Remove "-face" suffix from which-func face - Remove "-face" suffix from cperl-mode faces - Remove "-face" suffix from ld-script faces - Fix cperl-mode font-lock problem - Tweak which-func face * gnus--rel--5.10 (patch 80-82) - Merge from emacs--cvs-trunk--0 - Update from CVS
Diffstat (limited to 'src/macterm.c')
-rw-r--r--src/macterm.c314
1 files changed, 190 insertions, 124 deletions
diff --git a/src/macterm.c b/src/macterm.c
index dd48d43a039..cef213024fa 100644
--- a/src/macterm.c
+++ b/src/macterm.c
@@ -2002,33 +2002,37 @@ static void
2002mac_compute_glyph_string_overhangs (s) 2002mac_compute_glyph_string_overhangs (s)
2003 struct glyph_string *s; 2003 struct glyph_string *s;
2004{ 2004{
2005 Rect r; 2005 if (s->cmp == NULL
2006 MacFontStruct *font = s->font; 2006 && s->first_glyph->type == CHAR_GLYPH)
2007
2008 TextFont (font->mac_fontnum);
2009 TextSize (font->mac_fontsize);
2010 TextFace (font->mac_fontface);
2011
2012 if (s->two_byte_p)
2013 QDTextBounds (s->nchars * 2, (char *)s->char2b, &r);
2014 else
2015 { 2007 {
2016 int i; 2008 Rect r;
2017 char *buf = xmalloc (s->nchars); 2009 MacFontStruct *font = s->font;
2018 2010
2019 if (buf == NULL) 2011 TextFont (font->mac_fontnum);
2020 SetRect (&r, 0, 0, 0, 0); 2012 TextSize (font->mac_fontsize);
2013 TextFace (font->mac_fontface);
2014
2015 if (s->two_byte_p)
2016 QDTextBounds (s->nchars * 2, (char *)s->char2b, &r);
2021 else 2017 else
2022 { 2018 {
2023 for (i = 0; i < s->nchars; ++i) 2019 int i;
2024 buf[i] = s->char2b[i].byte2; 2020 char *buf = xmalloc (s->nchars);
2025 QDTextBounds (s->nchars, buf, &r); 2021
2026 xfree (buf); 2022 if (buf == NULL)
2023 SetRect (&r, 0, 0, 0, 0);
2024 else
2025 {
2026 for (i = 0; i < s->nchars; ++i)
2027 buf[i] = s->char2b[i].byte2;
2028 QDTextBounds (s->nchars, buf, &r);
2029 xfree (buf);
2030 }
2027 } 2031 }
2028 }
2029 2032
2030 s->right_overhang = r.right > s->width ? r.right - s->width : 0; 2033 s->right_overhang = r.right > s->width ? r.right - s->width : 0;
2031 s->left_overhang = r.left < 0 ? -r.left : 0; 2034 s->left_overhang = r.left < 0 ? -r.left : 0;
2035 }
2032} 2036}
2033 2037
2034 2038
@@ -7495,6 +7499,11 @@ Lisp_Object Vmac_pass_command_to_system;
7495/* If Non-nil, the Mac "Control" key is passed on to the Mac Toolbox 7499/* If Non-nil, the Mac "Control" key is passed on to the Mac Toolbox
7496 for processing before Emacs sees it. */ 7500 for processing before Emacs sees it. */
7497Lisp_Object Vmac_pass_control_to_system; 7501Lisp_Object Vmac_pass_control_to_system;
7502
7503/* Points to the variable `inev' in the function XTread_socket. It is
7504 used for passing an input event to the function back from a Carbon
7505 event handler. */
7506static struct input_event *read_socket_inev = NULL;
7498#endif 7507#endif
7499 7508
7500/* Set in term/mac-win.el to indicate that event loop can now generate 7509/* Set in term/mac-win.el to indicate that event loop can now generate
@@ -7627,45 +7636,79 @@ mac_get_mouse_btn (EventRef ref)
7627 7636
7628/* Normally, ConvertEventRefToEventRecord will correctly handle all 7637/* Normally, ConvertEventRefToEventRecord will correctly handle all
7629 events. However the click of the mouse wheel is not converted to a 7638 events. However the click of the mouse wheel is not converted to a
7630 mouseDown or mouseUp event. This calls ConvertEventRef, but then 7639 mouseDown or mouseUp event. Likewise for dead key down events.
7631 checks to see if it is a mouse up or down carbon event that has not 7640 This calls ConvertEventRef, but then checks to see if it is a mouse
7632 been converted, and if so, converts it by hand (to be picked up in 7641 up/down, or a dead key down carbon event that has not been
7633 the XTread_socket loop). */ 7642 converted, and if so, converts it by hand (to be picked up in the
7643 XTread_socket loop). */
7634static Boolean mac_convert_event_ref (EventRef eventRef, EventRecord *eventRec) 7644static Boolean mac_convert_event_ref (EventRef eventRef, EventRecord *eventRec)
7635{ 7645{
7636 Boolean result = ConvertEventRefToEventRecord (eventRef, eventRec); 7646 Boolean result = ConvertEventRefToEventRecord (eventRef, eventRec);
7637 /* Do special case for mouse wheel button. */ 7647
7638 if (!result && GetEventClass (eventRef) == kEventClassMouse) 7648 if (result)
7649 return result;
7650
7651 switch (GetEventClass (eventRef))
7639 { 7652 {
7640 UInt32 kind = GetEventKind (eventRef); 7653 case kEventClassMouse:
7641 if (kind == kEventMouseDown && !(eventRec->what == mouseDown)) 7654 switch (GetEventKind (eventRef))
7642 { 7655 {
7656 case kEventMouseDown:
7643 eventRec->what = mouseDown; 7657 eventRec->what = mouseDown;
7644 result=1; 7658 result = 1;
7645 } 7659 break;
7646 if (kind == kEventMouseUp && !(eventRec->what == mouseUp)) 7660
7647 { 7661 case kEventMouseUp:
7648 eventRec->what = mouseUp; 7662 eventRec->what = mouseUp;
7649 result=1; 7663 result = 1;
7664 break;
7665
7666 default:
7667 break;
7650 } 7668 }
7651 if (result) 7669
7670 case kEventClassKeyboard:
7671 switch (GetEventKind (eventRef))
7652 { 7672 {
7653 /* Need where and when. */ 7673 case kEventRawKeyDown:
7654 UInt32 mods; 7674 {
7655 GetEventParameter (eventRef, kEventParamMouseLocation, 7675 unsigned char char_codes;
7656 typeQDPoint, NULL, sizeof (Point), 7676 UInt32 key_code;
7657 NULL, &eventRec->where); 7677
7658 /* Use two step process because new event modifiers are 7678 eventRec->what = keyDown;
7659 32-bit and old are 16-bit. Currently, only loss is 7679 GetEventParameter (eventRef, kEventParamKeyMacCharCodes, typeChar,
7660 NumLock & Fn. */ 7680 NULL, sizeof (char), NULL, &char_codes);
7661 GetEventParameter (eventRef, kEventParamKeyModifiers, 7681 GetEventParameter (eventRef, kEventParamKeyCode, typeUInt32,
7662 typeUInt32, NULL, sizeof (UInt32), 7682 NULL, sizeof (UInt32), NULL, &key_code);
7663 NULL, &mods); 7683 eventRec->message = char_codes | ((key_code & 0xff) << 8);
7664 eventRec->modifiers = mods; 7684 result = 1;
7665 7685 }
7666 eventRec->when = EventTimeToTicks (GetEventTime (eventRef)); 7686 break;
7687
7688 default:
7689 break;
7667 } 7690 }
7691
7692 default:
7693 break;
7668 } 7694 }
7695
7696 if (result)
7697 {
7698 /* Need where and when. */
7699 UInt32 mods;
7700
7701 GetEventParameter (eventRef, kEventParamMouseLocation, typeQDPoint,
7702 NULL, sizeof (Point), NULL, &eventRec->where);
7703 /* Use two step process because new event modifiers are 32-bit
7704 and old are 16-bit. Currently, only loss is NumLock & Fn. */
7705 GetEventParameter (eventRef, kEventParamKeyModifiers, typeUInt32,
7706 NULL, sizeof (UInt32), NULL, &mods);
7707 eventRec->modifiers = mods;
7708
7709 eventRec->when = EventTimeToTicks (GetEventTime (eventRef));
7710 }
7711
7669 return result; 7712 return result;
7670} 7713}
7671 7714
@@ -8235,8 +8278,7 @@ mac_handle_command_event (next_handler, event, data)
8235} 8278}
8236 8279
8237static OSErr 8280static OSErr
8238init_command_handler (window) 8281init_command_handler ()
8239 WindowPtr window;
8240{ 8282{
8241 OSErr err = noErr; 8283 OSErr err = noErr;
8242 EventTypeSpec specs[] = {{kEventClassCommand, kEventCommandProcess}}; 8284 EventTypeSpec specs[] = {{kEventClassCommand, kEventCommandProcess}};
@@ -8321,6 +8363,68 @@ mac_handle_window_event (next_handler, event, data)
8321 8363
8322 return eventNotHandledErr; 8364 return eventNotHandledErr;
8323} 8365}
8366
8367static pascal OSStatus
8368mac_handle_mouse_event (next_handler, event, data)
8369 EventHandlerCallRef next_handler;
8370 EventRef event;
8371 void *data;
8372{
8373 OSStatus result;
8374
8375 switch (GetEventKind (event))
8376 {
8377 case kEventMouseWheelMoved:
8378 {
8379 WindowPtr wp;
8380 struct frame *f;
8381 EventMouseWheelAxis axis;
8382 SInt32 delta;
8383 Point point;
8384
8385 result = CallNextEventHandler (next_handler, event);
8386 if (result != eventNotHandledErr || read_socket_inev == NULL)
8387 return result;
8388
8389 GetEventParameter (event, kEventParamWindowRef, typeWindowRef,
8390 NULL, sizeof (WindowRef), NULL, &wp);
8391 f = mac_window_to_frame (wp);
8392 if (f != mac_focus_frame (&one_mac_display_info))
8393 break;
8394
8395 GetEventParameter (event, kEventParamMouseWheelAxis,
8396 typeMouseWheelAxis, NULL,
8397 sizeof (EventMouseWheelAxis), NULL, &axis);
8398 if (axis != kEventMouseWheelAxisY)
8399 break;
8400
8401 GetEventParameter (event, kEventParamMouseWheelDelta, typeSInt32,
8402 NULL, sizeof (SInt32), NULL, &delta);
8403 GetEventParameter (event, kEventParamMouseLocation, typeQDPoint,
8404 NULL, sizeof (Point), NULL, &point);
8405 read_socket_inev->kind = WHEEL_EVENT;
8406 read_socket_inev->code = 0;
8407 read_socket_inev->modifiers =
8408 (mac_event_to_emacs_modifiers (event)
8409 | ((delta < 0) ? down_modifier : up_modifier));
8410 SetPortWindowPort (wp);
8411 GlobalToLocal (&point);
8412 XSETINT (read_socket_inev->x, point.h);
8413 XSETINT (read_socket_inev->y, point.v);
8414 XSETFRAME (read_socket_inev->frame_or_window, f);
8415 read_socket_inev->timestamp =
8416 EventTimeToTicks (GetEventTime (event)) * (1000/60);
8417
8418 return noErr;
8419 }
8420 break;
8421
8422 default:
8423 break;
8424 }
8425
8426 return eventNotHandledErr;
8427}
8324#endif /* USE_CARBON_EVENTS */ 8428#endif /* USE_CARBON_EVENTS */
8325 8429
8326 8430
@@ -8330,16 +8434,24 @@ install_window_handler (window)
8330{ 8434{
8331 OSErr err = noErr; 8435 OSErr err = noErr;
8332#if USE_CARBON_EVENTS 8436#if USE_CARBON_EVENTS
8333 EventTypeSpec specs[] = {{kEventClassWindow, kEventWindowUpdate}, 8437 EventTypeSpec specs_window[] =
8334 {kEventClassWindow, kEventWindowBoundsChanging}}; 8438 {{kEventClassWindow, kEventWindowUpdate},
8335 static EventHandlerUPP handle_window_event_UPP = NULL; 8439 {kEventClassWindow, kEventWindowBoundsChanging}};
8336 8440 EventTypeSpec specs_mouse[] = {{kEventClassMouse, kEventMouseWheelMoved}};
8337 if (handle_window_event_UPP == NULL) 8441 static EventHandlerUPP handle_window_eventUPP = NULL;
8338 handle_window_event_UPP = NewEventHandlerUPP (mac_handle_window_event); 8442 static EventHandlerUPP handle_mouse_eventUPP = NULL;
8339 8443
8340 err = InstallWindowEventHandler (window, handle_window_event_UPP, 8444 if (handle_window_eventUPP == NULL)
8341 GetEventTypeCount (specs), specs, 8445 handle_window_eventUPP = NewEventHandlerUPP (mac_handle_window_event);
8342 NULL, NULL); 8446 if (handle_mouse_eventUPP == NULL)
8447 handle_mouse_eventUPP = NewEventHandlerUPP (mac_handle_mouse_event);
8448 err = InstallWindowEventHandler (window, handle_window_eventUPP,
8449 GetEventTypeCount (specs_window),
8450 specs_window, NULL, NULL);
8451 if (err == noErr)
8452 err = InstallWindowEventHandler (window, handle_mouse_eventUPP,
8453 GetEventTypeCount (specs_mouse),
8454 specs_mouse, NULL, NULL);
8343#endif 8455#endif
8344#if TARGET_API_MAC_CARBON 8456#if TARGET_API_MAC_CARBON
8345 if (mac_do_track_dragUPP == NULL) 8457 if (mac_do_track_dragUPP == NULL)
@@ -8891,68 +9003,19 @@ XTread_socket (sd, expected, hold_quit)
8891#if USE_CARBON_EVENTS 9003#if USE_CARBON_EVENTS
8892 /* Handle new events */ 9004 /* Handle new events */
8893 if (!mac_convert_event_ref (eventRef, &er)) 9005 if (!mac_convert_event_ref (eventRef, &er))
8894 switch (GetEventClass (eventRef)) 9006 {
8895 { 9007 /* There used to be a handler for the kEventMouseWheelMoved
8896 case kEventClassWindow: 9008 event here. But as of Mac OS X 10.4, this kind of event
8897 if (GetEventKind (eventRef) == kEventWindowBoundsChanged) 9009 is not directly posted to the main event queue by
8898 { 9010 two-finger scrolling on the trackpad. Instead, some
8899 WindowPtr window_ptr; 9011 private event is posted and it is converted to a wheel
8900 GetEventParameter(eventRef, kEventParamDirectObject, 9012 event by the default handler for the application target.
8901 typeWindowRef, NULL, sizeof(WindowPtr), 9013 The converted one can be received by a Carbon event
8902 NULL, &window_ptr); 9014 handler installed on a window target. */
8903 f = mac_window_to_frame (window_ptr); 9015 read_socket_inev = &inev;
8904 if (f && !f->async_iconified) 9016 SendEventToEventTarget (eventRef, toolbox_dispatcher);
8905 x_real_positions (f, &f->left_pos, &f->top_pos); 9017 read_socket_inev = NULL;
8906 SendEventToEventTarget (eventRef, toolbox_dispatcher); 9018 }
8907 }
8908 break;
8909 case kEventClassMouse:
8910 if (GetEventKind (eventRef) == kEventMouseWheelMoved)
8911 {
8912 SInt32 delta;
8913 Point point;
8914 struct frame *f = mac_focus_frame (dpyinfo);
8915 WindowPtr window_ptr;
8916
8917#if 0
8918 if (dpyinfo->x_focus_frame == NULL)
8919 {
8920 /* Beep if wheel move occurs when all the frames
8921 are invisible. */
8922 SysBeep(1);
8923 break;
8924 }
8925#endif
8926
8927 GetEventParameter(eventRef, kEventParamMouseWheelDelta,
8928 typeSInt32, NULL, sizeof (SInt32),
8929 NULL, &delta);
8930 GetEventParameter(eventRef, kEventParamMouseLocation,
8931 typeQDPoint, NULL, sizeof (Point),
8932 NULL, &point);
8933 inev.kind = WHEEL_EVENT;
8934 inev.code = 0;
8935 inev.modifiers = (mac_event_to_emacs_modifiers (eventRef)
8936 | ((delta < 0) ? down_modifier
8937 : up_modifier));
8938 window_ptr = FRAME_MAC_WINDOW (f);
8939 SetPortWindowPort (window_ptr);
8940 GlobalToLocal (&point);
8941 XSETINT (inev.x, point.h);
8942 XSETINT (inev.y, point.v);
8943 XSETFRAME (inev.frame_or_window,
8944 mac_window_to_frame (window_ptr));
8945 inev.timestamp = EventTimeToTicks (GetEventTime (eventRef))*(1000/60);
8946 }
8947 else
8948 SendEventToEventTarget (eventRef, toolbox_dispatcher);
8949
8950 break;
8951
8952 default:
8953 /* Send the event to the appropriate receiver. */
8954 SendEventToEventTarget (eventRef, toolbox_dispatcher);
8955 }
8956 else 9019 else
8957#endif /* USE_CARBON_EVENTS */ 9020#endif /* USE_CARBON_EVENTS */
8958 switch (er.what) 9021 switch (er.what)
@@ -9388,7 +9451,10 @@ XTread_socket (sd, expected, hold_quit)
9388 if ((!NILP (Vmac_pass_command_to_system) 9451 if ((!NILP (Vmac_pass_command_to_system)
9389 || !(er.modifiers & cmdKey)) 9452 || !(er.modifiers & cmdKey))
9390 && (!NILP (Vmac_pass_control_to_system) 9453 && (!NILP (Vmac_pass_control_to_system)
9391 || !(er.modifiers & controlKey))) 9454 || !(er.modifiers & controlKey))
9455 && (!NILP (Vmac_command_key_is_meta)
9456 && NILP (Vmac_option_modifier)
9457 || !(er.modifiers & optionKey)))
9392 if (SendEventToEventTarget (eventRef, toolbox_dispatcher) 9458 if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
9393 != eventNotHandledErr) 9459 != eventNotHandledErr)
9394 break; 9460 break;