[29715] trunk/dports/editors/vim-app
source_changes at macosforge.org
source_changes at macosforge.org
Sat Oct 6 17:19:04 PDT 2007
Revision: 29715
http://trac.macosforge.org/projects/macports/changeset/29715
Author: raimue at macports.org
Date: 2007-10-06 17:19:04 -0700 (Sat, 06 Oct 2007)
Log Message:
-----------
editors/vim-app:
Re-added macatsui patch.
Thanks to Tommi Komulainen!
Modified Paths:
--------------
trunk/dports/editors/vim-app/Portfile
Added Paths:
-----------
trunk/dports/editors/vim-app/files/atsui.patch_mod
Modified: trunk/dports/editors/vim-app/Portfile
===================================================================
--- trunk/dports/editors/vim-app/Portfile 2007-10-06 23:57:12 UTC (rev 29714)
+++ trunk/dports/editors/vim-app/Portfile 2007-10-07 00:19:04 UTC (rev 29715)
@@ -109,12 +109,9 @@
# macatsui: better antialising (experimental)
# see http://wiki.macvim.org/wiki/VimPatches/ATSUI
-# -- doesn't work with 7.1
-#variant macatsui {
-# patch_sites-append macports:.:macatsui
-# patchfiles-append atsui.patch_mod:macatsui
-# checksums-append atsui.patch_mod md5 b0d53c9faa40fa8a43f905dc938d86c9
-#}
+variant macatsui {
+ patchfiles-append atsui.patch_mod
+}
# general vim variants
Added: trunk/dports/editors/vim-app/files/atsui.patch_mod
===================================================================
--- trunk/dports/editors/vim-app/files/atsui.patch_mod (rev 0)
+++ trunk/dports/editors/vim-app/files/atsui.patch_mod 2007-10-07 00:19:04 UTC (rev 29715)
@@ -0,0 +1,852 @@
+--- src/vim.h
++++ src/vim.h
+@@ -462,7 +462,8 @@ typedef unsigned long u8char_T; /* long should be 32 bits or more */
+ * Check input method control.
+ */
+ #if defined(FEAT_XIM) || \
+- (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)))
++ (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) || \
++ defined(FEAT_GUI_MAC)
+ # define USE_IM_CONTROL
+ #endif
+
+--- src/gui_mac.c
++++ src/gui_mac.c
+@@ -59,7 +59,31 @@ SInt32 gMacSystemVersion;
+
+ #ifdef MACOS_CONVERT
+ # define USE_CARBONKEYHANDLER
++
++int im_is_active = FALSE;
++int im_start_row = 0;
++int im_start_col = 0;
++
++#define NR_ELEMS(x) (sizeof(x) / sizeof(x[0]))
++
++TSMDocumentID gTSMDocument;
++
++void im_on_window_switch(int active);
+ static EventHandlerUPP keyEventHandlerUPP = NULL;
++static EventHandlerUPP winEventHandlerUPP = NULL;
++
++static pascal OSStatus gui_mac_handle_window_activate(
++ EventHandlerCallRef nextHandler, EventRef theEvent, void *data);
++
++static pascal OSStatus gui_mac_handle_text_input(
++ EventHandlerCallRef nextHandler, EventRef theEvent, void *data);
++
++static pascal OSStatus gui_mac_update_input_area(
++ EventHandlerCallRef nextHandler, EventRef theEvent);
++
++static pascal OSStatus gui_mac_unicode_key_event(
++ EventHandlerCallRef nextHandler, EventRef theEvent);
++
+ #endif
+
+
+@@ -137,7 +161,11 @@ static struct
+
+ #ifdef MACOS_CONVERT
+ # define USE_ATSUI_DRAWING
++int p_macatsui_last;
+ ATSUStyle gFontStyle;
++#ifdef FEAT_MBYTE
++ATSUStyle gWideFontStyle;
++#endif
+ Boolean gIsFontFallbackSet;
+ #endif
+
+@@ -265,6 +293,12 @@ static void initialise_tabline(void);
+ static WindowRef drawer = NULL; // TODO: put into gui.h
+ #endif
+
++#ifdef USE_ATSUI_DRAWING
++void gui_mac_set_font_attributes(GuiFont font);
++void gui_mac_dispose_atsui_style();
++void gui_mac_create_atsu_style();
++#endif
++
+ /*
+ * ------------------------------------------------------------
+ * Conversion Utility
+@@ -1976,15 +2010,84 @@ gui_mac_doSuspendEvent(EventRecord *event)
+ * Handle the key
+ */
+ #ifdef USE_CARBONKEYHANDLER
++ static pascal OSStatus
++gui_mac_handle_window_activate(
++ EventHandlerCallRef nextHandler,
++ EventRef theEvent, void *data)
++{
++ UInt32 eventClass = GetEventClass(theEvent);
++ UInt32 eventKind = GetEventKind(theEvent);
++
++ if (eventClass == kEventClassWindow)
++ {
++ switch (eventKind)
++ {
++ case kEventWindowActivated:
++#if defined(USE_IM_CONTROL)
++ im_on_window_switch(TRUE);
++#endif
++ return noErr;
++
++ case kEventWindowDeactivated:
++#if defined(USE_IM_CONTROL)
++ im_on_window_switch(FALSE);
++#endif
++ return noErr;
++ }
++ }
++
++ return eventNotHandledErr;
++}
++
++ static pascal OSStatus
++gui_mac_handle_text_input(
++ EventHandlerCallRef nextHandler,
++ EventRef theEvent, void *data)
++{
++ UInt32 eventClass = GetEventClass(theEvent);
++ UInt32 eventKind = GetEventKind(theEvent);
++
++ if (eventClass != kEventClassTextInput)
++ return eventNotHandledErr;
++
++ if ((kEventTextInputUpdateActiveInputArea != eventKind) &&
++ (kEventTextInputUnicodeForKeyEvent != eventKind) &&
++ (kEventTextInputOffsetToPos != eventKind) &&
++ (kEventTextInputPosToOffset != eventKind) &&
++ (kEventTextInputGetSelectedText != eventKind))
++ return eventNotHandledErr;
++
++ switch (eventKind)
++ {
++ case kEventTextInputUpdateActiveInputArea:
++ return gui_mac_update_input_area(nextHandler, theEvent);
++ case kEventTextInputUnicodeForKeyEvent:
++ return gui_mac_unicode_key_event(nextHandler, theEvent);
++
++ case kEventTextInputOffsetToPos:
++ case kEventTextInputPosToOffset:
++ case kEventTextInputGetSelectedText:
++ break;
++ }
++
++ return eventNotHandledErr;
++}
++
++ static pascal
++OSStatus gui_mac_update_input_area(
++ EventHandlerCallRef nextHandler,
++ EventRef theEvent)
++{
++ return eventNotHandledErr;
++}
+
+ static int dialog_busy = FALSE; /* TRUE when gui_mch_dialog() wants the keys */
+
+ # define INLINE_KEY_BUFFER_SIZE 80
+ static pascal OSStatus
+-gui_mac_doKeyEventCarbon(
++gui_mac_unicode_key_event(
+ EventHandlerCallRef nextHandler,
+- EventRef theEvent,
+- void *data)
++ EventRef theEvent)
+ {
+ /* Multibyte-friendly key event handler */
+ OSStatus err = -1;
+@@ -2000,7 +2103,7 @@ gui_mac_doKeyEventCarbon(
+ char_u *to = NULL;
+ Boolean isSpecial = FALSE;
+ int i;
+- EventRef keyEvent;
++ EventRef keyEvent;
+
+ /* Mask the mouse (as per user setting) */
+ if (p_mh)
+@@ -2832,7 +2935,6 @@ gui_mch_prepare(int *argc, char **argv)
+ # else
+ /* OSErr GetApplicationBundleFSSpec(FSSpecPtr theFSSpecPtr)
+ * of TN2015
+- * This technic remove the ../Contents/MacOS/etc part
+ */
+ (void)GetCurrentProcess(&psn);
+ /* if (err != noErr) return err; */
+@@ -2933,10 +3035,9 @@ gui_mch_init(void)
+ /* TODO: Move most of this stuff toward gui_mch_init */
+ Rect windRect;
+ MenuHandle pomme;
+- EventTypeSpec eventTypeSpec;
+ EventHandlerRef mouseWheelHandlerRef;
+ #ifdef USE_CARBONKEYHANDLER
+- EventHandlerRef keyEventHandlerRef;
++ EventTypeSpec eventTypeSpec;
+ #endif
+ ControlRef rootControl;
+
+@@ -3042,16 +3143,47 @@ gui_mch_init(void)
+ }
+
+ #ifdef USE_CARBONKEYHANDLER
+- eventTypeSpec.eventClass = kEventClassTextInput;
+- eventTypeSpec.eventKind = kEventUnicodeForKeyEvent;
+- keyEventHandlerUPP = NewEventHandlerUPP(gui_mac_doKeyEventCarbon);
+- if (noErr != InstallApplicationEventHandler(keyEventHandlerUPP, 1,
+- &eventTypeSpec, NULL, &keyEventHandlerRef))
++ InterfaceTypeList supportedServices = { kUnicodeDocument };
++ NewTSMDocument(1, supportedServices, &gTSMDocument, 0);
++
++ /* We don't support inline input yet, use input window by default */
++ UseInputWindow(gTSMDocument, TRUE);
++
++ /* Should we activate the document by default? */
++ // ActivateTSMDocument(gTSMDocument);
++
++ EventTypeSpec textEventTypes[] = {
++ { kEventClassTextInput, kEventTextInputUpdateActiveInputArea },
++ { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent },
++ { kEventClassTextInput, kEventTextInputPosToOffset },
++ { kEventClassTextInput, kEventTextInputOffsetToPos },
++ };
++
++ keyEventHandlerUPP = NewEventHandlerUPP(gui_mac_handle_text_input);
++ if (noErr != InstallApplicationEventHandler(keyEventHandlerUPP,
++ NR_ELEMS(textEventTypes),
++ textEventTypes, NULL, NULL))
+ {
+- keyEventHandlerRef = NULL;
+ DisposeEventHandlerUPP(keyEventHandlerUPP);
+ keyEventHandlerUPP = NULL;
+ }
++
++ EventTypeSpec windowEventTypes[] = {
++ { kEventClassWindow, kEventWindowActivated },
++ { kEventClassWindow, kEventWindowDeactivated },
++ };
++
++ /* Install window event handler to support TSMDocument activate and
++ * deactivate */
++ winEventHandlerUPP = NewEventHandlerUPP(gui_mac_handle_window_activate);
++ if (noErr != InstallWindowEventHandler(gui.VimWindow,
++ winEventHandlerUPP,
++ NR_ELEMS(windowEventTypes),
++ windowEventTypes, NULL, NULL))
++ {
++ DisposeEventHandlerUPP(winEventHandlerUPP);
++ winEventHandlerUPP = NULL;
++ }
+ #endif
+
+ /*
+@@ -3107,6 +3239,19 @@ gui_mch_open(void)
+ return OK;
+ }
+
++#ifdef USE_ATSUI_DRAWING
++ void
++gui_mac_dispose_atsui_style()
++{
++ if (p_macatsui && gFontStyle)
++ ATSUDisposeStyle(gFontStyle);
++#ifdef FEAT_MBYTE
++ if (p_macatsui && gWideFontStyle)
++ ATSUDisposeStyle(gWideFontStyle);
++#endif
++}
++#endif
++
+ void
+ gui_mch_exit(int rc)
+ {
+@@ -3122,8 +3267,13 @@ gui_mch_exit(int rc)
+ DisposeEventHandlerUPP(mouseWheelHandlerUPP);
+
+ #ifdef USE_ATSUI_DRAWING
+- if (p_macatsui && gFontStyle)
+- ATSUDisposeStyle(gFontStyle);
++ gui_mac_dispose_atsui_style();
++#endif
++
++#ifdef USE_CARBONKEYHANDLER
++ FixTSMDocument(gTSMDocument);
++ DeactivateTSMDocument(gTSMDocument);
++ DeleteTSMDocument(gTSMDocument);
+ #endif
+
+ /* Exit to shell? */
+@@ -3263,6 +3413,26 @@ gui_mac_select_font(char_u *font_name)
+ return selected_font;
+ }
+
++#ifdef USE_ATSUI_DRAWING
++ void
++gui_mac_create_atsui_style()
++{
++ if (p_macatsui && gFontStyle == NULL)
++ {
++ if (ATSUCreateStyle(&gFontStyle) != noErr)
++ gFontStyle = NULL;
++ }
++#ifdef FEAT_MBYTE
++ if (p_macatsui && gWideFontStyle == NULL)
++ {
++ if (ATSUCreateStyle(&gWideFontStyle) != noErr)
++ gWideFontStyle = NULL;
++ }
++#endif
++
++ p_macatsui_last = p_macatsui;
++}
++#endif
+
+ /*
+ * Initialise vim to use the font with the given name. Return FAIL if the font
+@@ -3280,11 +3450,7 @@ gui_mch_init_font(char_u *font_name, int fontset)
+ char_u used_font_name[512];
+
+ #ifdef USE_ATSUI_DRAWING
+- if (p_macatsui && gFontStyle == NULL)
+- {
+- if (ATSUCreateStyle(&gFontStyle) != noErr)
+- gFontStyle = NULL;
+- }
++ gui_mac_create_atsui_style();
+ #endif
+
+ if (font_name == NULL)
+@@ -3348,49 +3514,8 @@ gui_mch_init_font(char_u *font_name, int fontset)
+ gui.char_height = font_info.ascent + font_info.descent + p_linespace;
+
+ #ifdef USE_ATSUI_DRAWING
+- ATSUFontID fontID;
+- Fixed fontSize;
+- ATSStyleRenderingOptions fontOptions;
+-
+ if (p_macatsui && gFontStyle)
+- {
+- fontID = font & 0xFFFF;
+- fontSize = Long2Fix(font >> 16);
+-
+- /* No antialiasing by default (do not attempt to touch antialising
+- * options on pre-Jaguar) */
+- fontOptions =
+- (gMacSystemVersion >= 0x1020) ?
+- kATSStyleNoAntiAliasing :
+- kATSStyleNoOptions;
+-
+- ATSUAttributeTag attribTags[] =
+- {
+- kATSUFontTag, kATSUSizeTag, kATSUStyleRenderingOptionsTag,
+- kATSUMaxATSUITagValue+1
+- };
+- ByteCount attribSizes[] =
+- {
+- sizeof(ATSUFontID), sizeof(Fixed),
+- sizeof(ATSStyleRenderingOptions), sizeof font
+- };
+- ATSUAttributeValuePtr attribValues[] =
+- {
+- &fontID, &fontSize, &fontOptions, &font
+- };
+-
+- /* Convert font id to ATSUFontID */
+- if (FMGetFontFromFontFamilyInstance(fontID, 0, &fontID, NULL) == noErr)
+- {
+- if (ATSUSetAttributes(gFontStyle,
+- (sizeof attribTags)/sizeof(ATSUAttributeTag),
+- attribTags, attribSizes, attribValues) != noErr)
+- {
+- ATSUDisposeStyle(gFontStyle);
+- gFontStyle = NULL;
+- }
+- }
+- }
++ gui_mac_set_font_attributes(font);
+ #endif
+
+ return OK;
+@@ -3447,6 +3572,68 @@ gui_mch_get_fontname(GuiFont font, char_u *name)
+ }
+ #endif
+
++#ifdef USE_ATSUI_DRAWING
++ void
++gui_mac_set_font_attributes(GuiFont font)
++{
++ ATSUFontID fontID;
++ Fixed fontSize;
++ Fixed fontWidth;
++
++ fontID = font & 0xFFFF;
++ fontSize = Long2Fix(font >> 16);
++ fontWidth = Long2Fix(gui.char_width);
++
++ ATSUAttributeTag attribTags[] =
++ {
++ kATSUFontTag, kATSUSizeTag, kATSUImposeWidthTag,
++ kATSUMaxATSUITagValue + 1
++ };
++
++ ByteCount attribSizes[] =
++ {
++ sizeof(ATSUFontID), sizeof(Fixed), sizeof(fontWidth),
++ sizeof(font)
++ };
++
++ ATSUAttributeValuePtr attribValues[] =
++ {
++ &fontID, &fontSize, &fontWidth, &font
++ };
++
++ if (FMGetFontFromFontFamilyInstance(fontID, 0, &fontID, NULL) == noErr)
++ {
++ if (ATSUSetAttributes(gFontStyle,
++ (sizeof attribTags) / sizeof(ATSUAttributeTag),
++ attribTags, attribSizes, attribValues) != noErr)
++ {
++# ifndef NDEBUG
++ fprintf(stderr, "couldn't set font style\n");
++# endif
++ ATSUDisposeStyle(gFontStyle);
++ gFontStyle = NULL;
++ }
++
++#ifdef FEAT_MBYTE
++ if (has_mbyte)
++ {
++ /* FIXME: we should use a more mbyte sensitive way to support
++ * wide font drawing */
++ fontWidth = Long2Fix(gui.char_width * 2);
++
++ if (ATSUSetAttributes(gWideFontStyle,
++ (sizeof attribTags) / sizeof(ATSUAttributeTag),
++ attribTags, attribSizes, attribValues) != noErr)
++ {
++ ATSUDisposeStyle(gWideFontStyle);
++ gWideFontStyle = NULL;
++ }
++ }
++#endif
++ }
++}
++#endif
++
+ /*
+ * Set the current text font.
+ */
+@@ -3456,66 +3643,22 @@ gui_mch_set_font(GuiFont font)
+ #ifdef USE_ATSUI_DRAWING
+ GuiFont currFont;
+ ByteCount actualFontByteCount;
+- ATSUFontID fontID;
+- Fixed fontSize;
+- ATSStyleRenderingOptions fontOptions;
+
+ if (p_macatsui && gFontStyle)
+ {
+ /* Avoid setting same font again */
+- if (ATSUGetAttribute(gFontStyle, kATSUMaxATSUITagValue+1, sizeof font,
+- &currFont, &actualFontByteCount) == noErr &&
+- actualFontByteCount == (sizeof font))
++ if (ATSUGetAttribute(gFontStyle, kATSUMaxATSUITagValue + 1, sizeof(font),
++ &currFont, &actualFontByteCount) == noErr &&
++ actualFontByteCount == (sizeof font))
+ {
+ if (currFont == font)
+ return;
+ }
+
+- fontID = font & 0xFFFF;
+- fontSize = Long2Fix(font >> 16);
+- /* Respect p_antialias setting only for wide font.
+- * The reason for doing this at the moment is a bit complicated,
+- * but it's mainly because a) latin (non-wide) aliased fonts
+- * look bad in OS X 10.3.x and below (due to a bug in ATS), and
+- * b) wide multibyte input does not suffer from that problem. */
+- /*fontOptions =
+- (p_antialias && (font == gui.wide_font)) ?
+- kATSStyleNoOptions : kATSStyleNoAntiAliasing;
+- */
+- /*fontOptions = kATSStyleAntiAliasing;*/
+-
+- ATSUAttributeTag attribTags[] =
+- {
+- kATSUFontTag, kATSUSizeTag, kATSUStyleRenderingOptionsTag,
+- kATSUMaxATSUITagValue+1
+- };
+- ByteCount attribSizes[] =
+- {
+- sizeof(ATSUFontID), sizeof(Fixed),
+- sizeof(ATSStyleRenderingOptions), sizeof font
+- };
+- ATSUAttributeValuePtr attribValues[] =
+- {
+- &fontID, &fontSize, &fontOptions, &font
+- };
+-
+- if (FMGetFontFromFontFamilyInstance(fontID, 0, &fontID, NULL) == noErr)
+- {
+- if (ATSUSetAttributes(gFontStyle,
+- (sizeof attribTags)/sizeof(ATSUAttributeTag),
+- attribTags, attribSizes, attribValues) != noErr)
+- {
+-# ifndef NDEBUG
+- fprintf(stderr, "couldn't set font style\n");
+-# endif
+- ATSUDisposeStyle(gFontStyle);
+- gFontStyle = NULL;
+- }
+- }
+-
++ gui_mac_set_font_attributes(font);
+ }
+
+- if (p_macatsui && !gIsFontFallbackSet)
++ if (p_macatsui && ! gIsFontFallbackSet)
+ {
+ /* Setup automatic font substitution. The user's guifontwide
+ * is tried first, then the system tries other fonts. */
+@@ -3536,7 +3679,9 @@ gui_mch_set_font(GuiFont font)
+ &fallbackFonts,
+ NULL) == noErr)
+ {
+- ATSUSetFontFallbacks((sizeof fallbackFonts)/sizeof(ATSUFontID), &fallbackFonts, kATSUSequentialFallbacksPreferred);
++ ATSUSetFontFallbacks((sizeof fallbackFonts)/sizeof(ATSUFontID),
++ &fallbackFonts,
++ kATSUSequentialFallbacksPreferred);
+ }
+ /*
+ ATSUAttributeValuePtr fallbackValues[] = { };
+@@ -3921,7 +4066,10 @@ draw_string_ATSUI(int row, int col, char_u *s, int len, int flags)
+
+ /* - ATSUI automatically antialiases text (Someone)
+ * - for some reason it does not work... (Jussi) */
+-
++#ifdef MAC_ATSUI_DEBUG
++ fprintf(stderr, "row = %d, col = %d, len = %d: '%c'\n",
++ row, col, len, len == 1 ? s[0] : ' ');
++#endif
+ /*
+ * When antialiasing we're using srcOr mode, we have to clear the block
+ * before drawing the text.
+@@ -3956,35 +4104,120 @@ draw_string_ATSUI(int row, int col, char_u *s, int len, int flags)
+ }
+
+ {
+- /* Use old-style, non-antialiased QuickDraw text rendering. */
+ TextMode(srcCopy);
+ TextFace(normal);
+
+- /* SelectFont(hdc, gui.currFont); */
+-
++ /* SelectFont(hdc, gui.currFont); */
+ if (flags & DRAW_TRANSP)
+ {
+ TextMode(srcOr);
+ }
+
+ MoveTo(TEXT_X(col), TEXT_Y(row));
+- ATSUTextLayout textLayout;
+-
+- if (ATSUCreateTextLayoutWithTextPtr(tofree,
+- kATSUFromTextBeginning, kATSUToTextEnd,
+- utf16_len,
+- (gFontStyle ? 1 : 0), &utf16_len,
+- (gFontStyle ? &gFontStyle : NULL),
+- &textLayout) == noErr)
++
++ if (gFontStyle && flags & DRAW_BOLD)
++ {
++ Boolean attValue = true;
++ ATSUAttributeTag attribTags[] = { kATSUQDBoldfaceTag };
++ ByteCount attribSizes[] = { sizeof(Boolean) };
++ ATSUAttributeValuePtr attribValues[] = { &attValue };
++
++ ATSUSetAttributes(gFontStyle, 1, attribTags, attribSizes, attribValues);
++ }
++
++#ifdef FEAT_MBYTE
++ if (has_mbyte)
+ {
+- ATSUSetTransientFontMatching(textLayout, TRUE);
++ int n, width_in_cell, last_width_in_cell;
++ UniCharArrayOffset offset = 0;
++ UniCharCount yet_to_draw = 0;
++ ATSUTextLayout textLayout;
++ ATSUStyle textStyle;
++
++ last_width_in_cell = 1;
++ ATSUCreateTextLayout(&textLayout);
++ ATSUSetTextPointerLocation(textLayout, tofree,
++ kATSUFromTextBeginning,
++ kATSUToTextEnd, utf16_len);
++ /*
++ ATSUSetRunStyle(textLayout, gFontStyle,
++ kATSUFromTextBeginning, kATSUToTextEnd); */
+
+- ATSUDrawText(textLayout,
+- kATSUFromTextBeginning, kATSUToTextEnd,
+- kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc);
++ /* Compute the length in display cells. */
++ for (n = 0; n < len; n += MB_BYTE2LEN(s[n]))
++ {
++ width_in_cell = (*mb_ptr2cells)(s + n);
++
++ /* probably we are switching from single byte character
++ * to multibyte characters (which requires more than one
++ * cell to draw) */
++ if (width_in_cell != last_width_in_cell)
++ {
++#ifdef MAC_ATSUI_DEBUG
++ fprintf(stderr, "\tn = %2d, (%d-%d), offset = %d, yet_to_draw = %d\n",
++ n, last_width_in_cell, width_in_cell, offset, yet_to_draw);
++#endif
++ textStyle = last_width_in_cell > 1 ? gWideFontStyle : gFontStyle;
++
++ ATSUSetRunStyle(textLayout, textStyle, offset, yet_to_draw);
++ offset += yet_to_draw;
++ yet_to_draw = 0;
++ last_width_in_cell = width_in_cell;
++ }
++
++ yet_to_draw++;
++ }
++
++ if (yet_to_draw)
++ {
++#ifdef MAC_ATSUI_DEBUG
++ fprintf(stderr, "\tn = %2d, (%d-%d), offset = %d, yet_to_draw = %d\n",
++ n, last_width_in_cell, width_in_cell, offset, yet_to_draw);
++#endif
++ /* finish the rest style */
++ textStyle = width_in_cell > 1 ? gWideFontStyle : gFontStyle;
++ ATSUSetRunStyle(textLayout, textStyle, offset, kATSUToTextEnd);
++ }
+
+- ATSUDisposeTextLayout(textLayout);
++ ATSUSetTransientFontMatching(textLayout, TRUE);
++ ATSUDrawText(textLayout,
++ kATSUFromTextBeginning, kATSUToTextEnd,
++ kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc);
++ ATSUDisposeTextLayout(textLayout);
+ }
++ else
++#endif
++ {
++ ATSUTextLayout textLayout;
++
++ if (ATSUCreateTextLayoutWithTextPtr(tofree,
++ kATSUFromTextBeginning, kATSUToTextEnd,
++ utf16_len,
++ (gFontStyle ? 1 : 0), &utf16_len,
++ (gFontStyle ? &gFontStyle : NULL),
++ &textLayout) == noErr)
++ {
++ ATSUSetTransientFontMatching(textLayout, TRUE);
++
++ ATSUDrawText(textLayout,
++ kATSUFromTextBeginning, kATSUToTextEnd,
++ kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc);
++
++ ATSUDisposeTextLayout(textLayout);
++ }
++ }
++
++ /* drawing is done, now reset bold to normal */
++ if (gFontStyle && flags & DRAW_BOLD)
++ {
++ Boolean attValue = false;
++
++ ATSUAttributeTag attribTags[] = { kATSUQDBoldfaceTag };
++ ByteCount attribSizes[] = { sizeof(Boolean) };
++ ATSUAttributeValuePtr attribValues[] = { &attValue };
++
++ ATSUSetAttributes(gFontStyle, 1, attribTags, attribSizes, attribValues);
++ }
+ }
+
+ if (flags & DRAW_UNDERC)
+@@ -3998,6 +4231,14 @@ draw_string_ATSUI(int row, int col, char_u *s, int len, int flags)
+ gui_mch_draw_string(int row, int col, char_u *s, int len, int flags)
+ {
+ #if defined(USE_ATSUI_DRAWING)
++ /* switch from macatsui to nomacatsui */
++ if (p_macatsui == 0 && p_macatsui_last != 0)
++ gui_mac_dispose_atsui_style();
++ else
++ /* switch from nomacatsui to macatsui */
++ if (p_macatsui != 0 && p_macatsui_last == 0)
++ gui_mac_create_atsui_style();
++
+ if (p_macatsui)
+ draw_string_ATSUI(row, col, s, len, flags);
+ else
+@@ -4228,12 +4469,13 @@ gui_mch_wait_for_chars(int wtime)
+ */
+ /* TODO: reduce wtime accordinly??? */
+ if (wtime > -1)
+- sleeppyTick = 60*wtime/1000;
++ sleeppyTick = 60 * wtime / 1000;
+ else
+ sleeppyTick = 32767;
++
+ if (WaitNextEventWrp(mask, &event, sleeppyTick, dragRgn))
+ {
+- gui_mac_handle_event(&event);
++ gui_mac_handle_event(&event);
+ if (input_available())
+ {
+ allow_scrollbar = FALSE;
+@@ -6031,7 +6273,7 @@ char_u *FullPathFromFSSpec_save(FSSpec file)
+ #endif
+ }
+
+-#if defined(USE_IM_CONTROL) || defined(PROTO)
++#if (defined(USE_IM_CONTROL) || defined(PROTO)) && defined(USE_CARBONKEYHANDLER)
+ /*
+ * Input Method Control functions.
+ */
+@@ -6043,6 +6285,68 @@ char_u *FullPathFromFSSpec_save(FSSpec file)
+ im_set_position(int row, int col)
+ {
+ /* TODO: Implement me! */
++ im_start_row = row;
++ im_start_col = col;
++}
++
++ScriptLanguageRecord gTSLWindow;
++ScriptLanguageRecord gTSLInsert;
++ScriptLanguageRecord gTSLDefault = { 0, 0 };
++
++Component gTSCWindow;
++Component gTSCInsert;
++Component gTSCDefault;
++
++int im_initialized = 0;
++
++ void
++im_on_window_switch(int active)
++{
++ ScriptLanguageRecord *slptr = NULL;
++ OSStatus err;
++
++ if (! gui.in_use)
++ return;
++
++ if (im_initialized == 0)
++ {
++ im_initialized = 1;
++
++ /* save default TSM component (should be U.S.) to default */
++ GetDefaultInputMethodOfClass(&gTSCDefault, &gTSLDefault,
++ kKeyboardInputMethodClass);
++ }
++
++ if (active == TRUE)
++ {
++ im_is_active = TRUE;
++ ActivateTSMDocument(gTSMDocument);
++ slptr = &gTSLWindow;
++
++ if (slptr)
++ {
++ err = SetDefaultInputMethodOfClass(gTSCWindow, slptr,
++ kKeyboardInputMethodClass);
++ if (err == noErr)
++ err = SetTextServiceLanguage(slptr);
++
++ if (err == noErr)
++ KeyScript(slptr->fScript | smKeyForceKeyScriptMask);
++ }
++ }
++ else
++ {
++ err = GetTextServiceLanguage(&gTSLWindow);
++ if (err == noErr)
++ slptr = &gTSLWindow;
++
++ if (slptr)
++ GetDefaultInputMethodOfClass(&gTSCWindow, slptr,
++ kKeyboardInputMethodClass);
++
++ im_is_active = FALSE;
++ DeactivateTSMDocument(gTSMDocument);
++ }
+ }
+
+ /*
+@@ -6051,7 +6355,57 @@ im_set_position(int row, int col)
+ void
+ im_set_active(int active)
+ {
+- KeyScript(active ? smKeySysScript : smKeyRoman);
++ ScriptLanguageRecord *slptr = NULL;
++ OSStatus err;
++
++ if (! gui.in_use)
++ return;
++
++ if (im_initialized == 0)
++ {
++ im_initialized = 1;
++
++ /* save default TSM component (should be U.S.) to default */
++ GetDefaultInputMethodOfClass(&gTSCDefault, &gTSLDefault,
++ kKeyboardInputMethodClass);
++ }
++
++ if (active == TRUE)
++ {
++ im_is_active = TRUE;
++ ActivateTSMDocument(gTSMDocument);
++ slptr = &gTSLInsert;
++
++ if (slptr)
++ {
++ err = SetDefaultInputMethodOfClass(gTSCInsert, slptr,
++ kKeyboardInputMethodClass);
++ if (err == noErr)
++ err = SetTextServiceLanguage(slptr);
++
++ if (err == noErr)
++ KeyScript(slptr->fScript | smKeyForceKeyScriptMask);
++ }
++ }
++ else
++ {
++ err = GetTextServiceLanguage(&gTSLInsert);
++ if (err == noErr)
++ slptr = &gTSLInsert;
++
++ if (slptr)
++ GetDefaultInputMethodOfClass(&gTSCInsert, slptr,
++ kKeyboardInputMethodClass);
++
++ /* restore to default when switch to normal mode, so than we could
++ * enter commands easier */
++ SetDefaultInputMethodOfClass(gTSCDefault, &gTSLDefault,
++ kKeyboardInputMethodClass);
++ SetTextServiceLanguage(&gTSLDefault);
++
++ im_is_active = FALSE;
++ DeactivateTSMDocument(gTSMDocument);
++ }
+ }
+
+ /*
+@@ -6060,9 +6414,10 @@ im_set_active(int active)
+ int
+ im_get_status(void)
+ {
+- SInt32 script = GetScriptManagerVariable(smKeyScript);
+- return (script != smRoman
+- && script == GetScriptManagerVariable(smSysScript)) ? 1 : 0;
++ if (! gui.in_use)
++ return 0;
++
++ return im_is_active;
+ }
+
+ #endif /* defined(USE_IM_CONTROL) || defined(PROTO) */
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macports-changes/attachments/20071006/f18f192d/attachment.html
More information about the macports-changes
mailing list