diff --git a/7.1.275 b/7.1.275
new file mode 100644
index 0000000..8ed7130
--- /dev/null
+++ b/7.1.275
@@ -0,0 +1,1541 @@
+To: vim-dev@vim.org
+Subject: Patch 7.1.275
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.275 (extra)
+Problem:    Mac: ATSUI and 'antialias' don't work properly together.
+Solution:   Fix this and the input method. (Jjgod Jiang)
+Files:	    src/vim.h, src/gui_mac.c
+
+
+*** ../vim-7.1.274/src/vim.h	Wed Feb 20 12:22:59 2008
+--- src/vim.h	Wed Mar 12 13:18:58 2008
+***************
+*** 461,468 ****
+  /*
+   * Check input method control.
+   */
+! #if defined(FEAT_XIM) || \
+!     (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)))
+  # define USE_IM_CONTROL
+  #endif
+  
+--- 461,469 ----
+  /*
+   * Check input method control.
+   */
+! #if defined(FEAT_XIM) \
+!     || (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) \
+!     || defined(FEAT_GUI_MAC)
+  # define USE_IM_CONTROL
+  #endif
+  
+*** ../vim-7.1.274/src/gui_mac.c	Sat Sep 29 13:15:29 2007
+--- src/gui_mac.c	Wed Mar 12 13:40:57 2008
+***************
+*** 59,65 ****
+--- 59,91 ----
+  
+  #ifdef MACOS_CONVERT
+  # define USE_CARBONKEYHANDLER
++ 
++ static int im_is_active = FALSE;
++ #if 0
++ static int im_start_row = 0;
++ static int im_start_col = 0;
++ #endif
++ 
++ #define NR_ELEMS(x)	(sizeof(x) / sizeof(x[0]))
++ 
++ static TSMDocumentID gTSMDocument;
++ 
++ static 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,143 ****
+--- 166,176 ----
+  
+  #ifdef MACOS_CONVERT
+  # define USE_ATSUI_DRAWING
++ int	    p_macatsui_last;
+  ATSUStyle   gFontStyle;
++ # ifdef FEAT_MBYTE
++ ATSUStyle   gWideFontStyle;
++ # endif
+  Boolean	    gIsFontFallbackSet;
+  #endif
+  
+***************
+*** 265,270 ****
+--- 298,308 ----
+  static WindowRef drawer = NULL; // TODO: put into gui.h
+  #endif
+  
++ #ifdef USE_ATSUI_DRAWING
++ static void gui_mac_set_font_attributes(GuiFont font);
++ static void gui_mac_dispose_atsui_style(void);
++ #endif
++ 
+  /*
+   * ------------------------------------------------------------
+   * Conversion Utility
+***************
+*** 1935,1946 ****
+      /* Dim scrollbars */
+      if (whichWindow == gui.VimWindow)
+      {
+!         ControlRef rootControl;
+!         GetRootControl(gui.VimWindow, &rootControl);
+!         if ((event->modifiers) & activeFlag)
+!             ActivateControl(rootControl);
+!         else
+!             DeactivateControl(rootControl);
+      }
+  
+      /* Activate */
+--- 1973,1984 ----
+      /* Dim scrollbars */
+      if (whichWindow == gui.VimWindow)
+      {
+! 	ControlRef rootControl;
+! 	GetRootControl(gui.VimWindow, &rootControl);
+! 	if ((event->modifiers) & activeFlag)
+! 	    ActivateControl(rootControl);
+! 	else
+! 	    DeactivateControl(rootControl);
+      }
+  
+      /* Activate */
+***************
+*** 1976,1990 ****
+   * Handle the key
+   */
+  #ifdef USE_CARBONKEYHANDLER
+  
+! 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(
+  	EventHandlerCallRef nextHandler,
+! 	EventRef theEvent,
+! 	void *data)
+  {
+      /* Multibyte-friendly key event handler */
+      OSStatus	err = -1;
+--- 2014,2100 ----
+   * 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_unicode_key_event(
+  	EventHandlerCallRef nextHandler,
+! 	EventRef	    theEvent)
+  {
+      /* Multibyte-friendly key event handler */
+      OSStatus	err = -1;
+***************
+*** 2000,2006 ****
+      char_u	*to = NULL;
+      Boolean	isSpecial = FALSE;
+      int		i;
+!     EventRef keyEvent;
+  
+      /* Mask the mouse (as per user setting) */
+      if (p_mh)
+--- 2110,2116 ----
+      char_u	*to = NULL;
+      Boolean	isSpecial = FALSE;
+      int		i;
+!     EventRef	keyEvent;
+  
+      /* Mask the mouse (as per user setting) */
+      if (p_mh)
+***************
+*** 2008,2046 ****
+  
+      /* Don't use the keys when the dialog wants them. */
+      if (dialog_busy)
+!         return eventNotHandledErr;
+  
+      if (noErr != GetEventParameter(theEvent, kEventParamTextInputSendText,
+!                 typeUnicodeText, NULL, 0, &actualSize, NULL))
+!         return eventNotHandledErr;
+  
+      text = (UniChar *)alloc(actualSize);
+      if (!text)
+!         return eventNotHandledErr;
+  
+      err = GetEventParameter(theEvent, kEventParamTextInputSendText,
+!             typeUnicodeText, NULL, actualSize, NULL, text);
+      require_noerr(err, done);
+  
+      err = GetEventParameter(theEvent, kEventParamTextInputSendKeyboardEvent,
+!             typeEventRef, NULL, sizeof(EventRef), NULL, &keyEvent);
+      require_noerr(err, done);
+  
+      err = GetEventParameter(keyEvent, kEventParamKeyModifiers,
+!             typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
+      require_noerr(err, done);
+  
+      err = GetEventParameter(keyEvent, kEventParamKeyCode,
+!             typeUInt32, NULL, sizeof(UInt32), NULL, &key_sym);
+      require_noerr(err, done);
+  
+      err = GetEventParameter(keyEvent, kEventParamKeyMacCharCodes,
+!             typeChar, NULL, sizeof(char), NULL, &charcode);
+      require_noerr(err, done);
+  
+  #ifndef USE_CMD_KEY
+      if (modifiers & cmdKey)
+!         goto done;  /* Let system handle Cmd+... */
+  #endif
+  
+      key_char = charcode;
+--- 2118,2156 ----
+  
+      /* Don't use the keys when the dialog wants them. */
+      if (dialog_busy)
+! 	return eventNotHandledErr;
+  
+      if (noErr != GetEventParameter(theEvent, kEventParamTextInputSendText,
+! 		typeUnicodeText, NULL, 0, &actualSize, NULL))
+! 	return eventNotHandledErr;
+  
+      text = (UniChar *)alloc(actualSize);
+      if (!text)
+! 	return eventNotHandledErr;
+  
+      err = GetEventParameter(theEvent, kEventParamTextInputSendText,
+! 	    typeUnicodeText, NULL, actualSize, NULL, text);
+      require_noerr(err, done);
+  
+      err = GetEventParameter(theEvent, kEventParamTextInputSendKeyboardEvent,
+! 	    typeEventRef, NULL, sizeof(EventRef), NULL, &keyEvent);
+      require_noerr(err, done);
+  
+      err = GetEventParameter(keyEvent, kEventParamKeyModifiers,
+! 	    typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
+      require_noerr(err, done);
+  
+      err = GetEventParameter(keyEvent, kEventParamKeyCode,
+! 	    typeUInt32, NULL, sizeof(UInt32), NULL, &key_sym);
+      require_noerr(err, done);
+  
+      err = GetEventParameter(keyEvent, kEventParamKeyMacCharCodes,
+! 	    typeChar, NULL, sizeof(char), NULL, &charcode);
+      require_noerr(err, done);
+  
+  #ifndef USE_CMD_KEY
+      if (modifiers & cmdKey)
+! 	goto done;  /* Let system handle Cmd+... */
+  #endif
+  
+      key_char = charcode;
+***************
+*** 2048,2131 ****
+  
+      /* Find the special key (eg., for cursor keys) */
+      if (actualSize <= sizeof(UniChar) &&
+!             ((text[0] < 0x20) || (text[0] == 0x7f)))
+      {
+!         for (i = 0; special_keys[i].key_sym != (KeySym)0; ++i)
+!             if (special_keys[i].key_sym == key_sym)
+!             {
+!                 key_char = TO_SPECIAL(special_keys[i].vim_code0,
+!                         special_keys[i].vim_code1);
+!                 key_char = simplify_key(key_char,
+!                         (int *)&vimModifiers);
+!                 isSpecial = TRUE;
+!                 break;
+!             }
+      }
+  
+      /* Intercept CMD-. and CTRL-c */
+      if (((modifiers & controlKey) && key_char == 'c') ||
+!             ((modifiers & cmdKey) && key_char == '.'))
+!         got_int = TRUE;
+  
+      if (!isSpecial)
+      {
+!         /* remove SHIFT for keys that are already shifted, e.g.,
+!          * '(' and '*' */
+!         if (key_char < 0x100 && !isalpha(key_char) && isprint(key_char))
+!             vimModifiers &= ~MOD_MASK_SHIFT;
+! 
+!         /* remove CTRL from keys that already have it */
+!         if (key_char < 0x20)
+!             vimModifiers &= ~MOD_MASK_CTRL;
+! 
+!         /* don't process unicode characters here */
+!         if (!IS_SPECIAL(key_char))
+!         {
+!             /* Following code to simplify and consolidate vimModifiers
+!              * taken liberally from gui_w48.c */
+!             key_char = simplify_key(key_char, (int *)&vimModifiers);
+! 
+!             /* Interpret META, include SHIFT, etc. */
+!             key_char = extract_modifiers(key_char, (int *)&vimModifiers);
+!             if (key_char == CSI)
+!                 key_char = K_CSI;
+! 
+!             if (IS_SPECIAL(key_char))
+!                 isSpecial = TRUE;
+!         }
+      }
+  
+      if (vimModifiers)
+      {
+!         result[len++] = CSI;
+!         result[len++] = KS_MODIFIER;
+!         result[len++] = vimModifiers;
+      }
+  
+      if (isSpecial && IS_SPECIAL(key_char))
+      {
+!         result[len++] = CSI;
+!         result[len++] = K_SECOND(key_char);
+!         result[len++] = K_THIRD(key_char);
+      }
+      else
+      {
+!         encLen = actualSize;
+!         to = mac_utf16_to_enc(text, actualSize, &encLen);
+!         if (to)
+!         {
+!             /* This is basically add_to_input_buf_csi() */
+!             for (i = 0; i < encLen && len < (INLINE_KEY_BUFFER_SIZE-1); ++i)
+!             {
+!                 result[len++] = to[i];
+!                 if (to[i] == CSI)
+!                 {
+!                     result[len++] = KS_EXTRA;
+!                     result[len++] = (int)KE_CSI;
+!                 }
+!             }
+!             vim_free(to);
+!         }
+      }
+  
+      add_to_input_buf(result, len);
+--- 2158,2241 ----
+  
+      /* Find the special key (eg., for cursor keys) */
+      if (actualSize <= sizeof(UniChar) &&
+! 	    ((text[0] < 0x20) || (text[0] == 0x7f)))
+      {
+! 	for (i = 0; special_keys[i].key_sym != (KeySym)0; ++i)
+! 	    if (special_keys[i].key_sym == key_sym)
+! 	    {
+! 		key_char = TO_SPECIAL(special_keys[i].vim_code0,
+! 			special_keys[i].vim_code1);
+! 		key_char = simplify_key(key_char,
+! 			(int *)&vimModifiers);
+! 		isSpecial = TRUE;
+! 		break;
+! 	    }
+      }
+  
+      /* Intercept CMD-. and CTRL-c */
+      if (((modifiers & controlKey) && key_char == 'c') ||
+! 	    ((modifiers & cmdKey) && key_char == '.'))
+! 	got_int = TRUE;
+  
+      if (!isSpecial)
+      {
+! 	/* remove SHIFT for keys that are already shifted, e.g.,
+! 	 * '(' and '*' */
+! 	if (key_char < 0x100 && !isalpha(key_char) && isprint(key_char))
+! 	    vimModifiers &= ~MOD_MASK_SHIFT;
+! 
+! 	/* remove CTRL from keys that already have it */
+! 	if (key_char < 0x20)
+! 	    vimModifiers &= ~MOD_MASK_CTRL;
+! 
+! 	/* don't process unicode characters here */
+! 	if (!IS_SPECIAL(key_char))
+! 	{
+! 	    /* Following code to simplify and consolidate vimModifiers
+! 	     * taken liberally from gui_w48.c */
+! 	    key_char = simplify_key(key_char, (int *)&vimModifiers);
+! 
+! 	    /* Interpret META, include SHIFT, etc. */
+! 	    key_char = extract_modifiers(key_char, (int *)&vimModifiers);
+! 	    if (key_char == CSI)
+! 		key_char = K_CSI;
+! 
+! 	    if (IS_SPECIAL(key_char))
+! 		isSpecial = TRUE;
+! 	}
+      }
+  
+      if (vimModifiers)
+      {
+! 	result[len++] = CSI;
+! 	result[len++] = KS_MODIFIER;
+! 	result[len++] = vimModifiers;
+      }
+  
+      if (isSpecial && IS_SPECIAL(key_char))
+      {
+! 	result[len++] = CSI;
+! 	result[len++] = K_SECOND(key_char);
+! 	result[len++] = K_THIRD(key_char);
+      }
+      else
+      {
+! 	encLen = actualSize;
+! 	to = mac_utf16_to_enc(text, actualSize, &encLen);
+! 	if (to)
+! 	{
+! 	    /* This is basically add_to_input_buf_csi() */
+! 	    for (i = 0; i < encLen && len < (INLINE_KEY_BUFFER_SIZE-1); ++i)
+! 	    {
+! 		result[len++] = to[i];
+! 		if (to[i] == CSI)
+! 		{
+! 		    result[len++] = KS_EXTRA;
+! 		    result[len++] = (int)KE_CSI;
+! 		}
+! 	    }
+! 	    vim_free(to);
+! 	}
+      }
+  
+      add_to_input_buf(result, len);
+***************
+*** 2135,2144 ****
+      vim_free(text);
+      if (err == noErr)
+      {
+!         /* Fake event to wake up WNE (required to get
+!          * key repeat working */
+!         PostEvent(keyUp, 0);
+!         return noErr;
+      }
+  
+      return eventNotHandledErr;
+--- 2245,2254 ----
+      vim_free(text);
+      if (err == noErr)
+      {
+! 	/* Fake event to wake up WNE (required to get
+! 	 * key repeat working */
+! 	PostEvent(keyUp, 0);
+! 	return noErr;
+      }
+  
+      return eventNotHandledErr;
+***************
+*** 2334,2340 ****
+      /* prevent that the vim window size changes if it's activated by a
+         click into the tab pane */
+      if (whichWindow == drawer)
+!         return;
+  #endif
+  
+      switch (thePart)
+--- 2444,2450 ----
+      /* prevent that the vim window size changes if it's activated by a
+         click into the tab pane */
+      if (whichWindow == drawer)
+! 	return;
+  #endif
+  
+      switch (thePart)
+***************
+*** 2569,2579 ****
+      if (IsShowContextualMenuClick(event))
+      {
+  # if 0
+!         gui_mac_handle_contextual_menu(event);
+  # else
+!         gui_mac_doMouseDownEvent(event);
+  # endif
+!         return;
+      }
+  
+      /* Handle normal event */
+--- 2679,2689 ----
+      if (IsShowContextualMenuClick(event))
+      {
+  # if 0
+! 	gui_mac_handle_contextual_menu(event);
+  # else
+! 	gui_mac_doMouseDownEvent(event);
+  # endif
+! 	return;
+      }
+  
+      /* Handle normal event */
+***************
+*** 2832,2838 ****
+  # else
+      /* OSErr GetApplicationBundleFSSpec(FSSpecPtr theFSSpecPtr)
+       * of TN2015
+-      * This technic remove the ../Contents/MacOS/etc part
+       */
+      (void)GetCurrentProcess(&psn);
+      /* if (err != noErr) return err; */
+--- 2942,2947 ----
+***************
+*** 2933,2942 ****
+      /* TODO: Move most of this stuff toward gui_mch_init */
+      Rect	windRect;
+      MenuHandle	pomme;
+-     EventTypeSpec   eventTypeSpec;
+      EventHandlerRef mouseWheelHandlerRef;
+  #ifdef USE_CARBONKEYHANDLER
+!     EventHandlerRef keyEventHandlerRef;
+  #endif
+      ControlRef rootControl;
+  
+--- 3042,3050 ----
+      /* TODO: Move most of this stuff toward gui_mch_init */
+      Rect	windRect;
+      MenuHandle	pomme;
+      EventHandlerRef mouseWheelHandlerRef;
+  #ifdef USE_CARBONKEYHANDLER
+!     EventTypeSpec   eventTypeSpec;
+  #endif
+      ControlRef rootControl;
+  
+***************
+*** 3042,3057 ****
+      }
+  
+  #ifdef USE_CARBONKEYHANDLER
+!     eventTypeSpec.eventClass = kEventClassTextInput;
+!     eventTypeSpec.eventKind = kEventUnicodeForKeyEvent;
+!     keyEventHandlerUPP = NewEventHandlerUPP(gui_mac_doKeyEventCarbon);
+!     if (noErr != InstallApplicationEventHandler(keyEventHandlerUPP, 1,
+! 		&eventTypeSpec, NULL, &keyEventHandlerRef))
+      {
+- 	keyEventHandlerRef = NULL;
+  	DisposeEventHandlerUPP(keyEventHandlerUPP);
+  	keyEventHandlerUPP = NULL;
+      }
+  #endif
+  
+  /*
+--- 3150,3196 ----
+      }
+  
+  #ifdef USE_CARBONKEYHANDLER
+!     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))
+      {
+  	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,3112 ****
+--- 3246,3264 ----
+      return OK;
+  }
+  
++ #ifdef USE_ATSUI_DRAWING
++     static void
++ gui_mac_dispose_atsui_style(void)
++ {
++     if (p_macatsui && gFontStyle)
++ 	ATSUDisposeStyle(gFontStyle);
++ #ifdef FEAT_MBYTE
++     if (p_macatsui && gWideFontStyle)
++ 	ATSUDisposeStyle(gWideFontStyle);
++ #endif
++ }
++ #endif
++ 
+      void
+  gui_mch_exit(int rc)
+  {
+***************
+*** 3122,3129 ****
+  	DisposeEventHandlerUPP(mouseWheelHandlerUPP);
+  
+  #ifdef USE_ATSUI_DRAWING
+!     if (p_macatsui && gFontStyle)
+! 	ATSUDisposeStyle(gFontStyle);
+  #endif
+  
+      /* Exit to shell? */
+--- 3274,3286 ----
+  	DisposeEventHandlerUPP(mouseWheelHandlerUPP);
+  
+  #ifdef USE_ATSUI_DRAWING
+!     gui_mac_dispose_atsui_style();
+! #endif
+! 
+! #ifdef USE_CARBONKEYHANDLER
+!     FixTSMDocument(gTSMDocument);
+!     DeactivateTSMDocument(gTSMDocument);
+!     DeleteTSMDocument(gTSMDocument);
+  #endif
+  
+      /* Exit to shell? */
+***************
+*** 3263,3268 ****
+--- 3420,3445 ----
+      return selected_font;
+  }
+  
++ #ifdef USE_ATSUI_DRAWING
++     static void
++ gui_mac_create_atsui_style(void)
++ {
++     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,3290 ****
+      char_u	used_font_name[512];
+  
+  #ifdef USE_ATSUI_DRAWING
+!     if (p_macatsui && gFontStyle == NULL)
+!     {
+! 	if (ATSUCreateStyle(&gFontStyle) != noErr)
+! 	    gFontStyle = NULL;
+!     }
+  #endif
+  
+      if (font_name == NULL)
+--- 3457,3463 ----
+      char_u	used_font_name[512];
+  
+  #ifdef USE_ATSUI_DRAWING
+!     gui_mac_create_atsui_style();
+  #endif
+  
+      if (font_name == NULL)
+***************
+*** 3348,3396 ****
+      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;
+! 	    }
+! 	}
+!     }
+  #endif
+  
+      return OK;
+--- 3521,3528 ----
+      gui.char_height = font_info.ascent + font_info.descent + p_linespace;
+  
+  #ifdef USE_ATSUI_DRAWING
+      if (p_macatsui && gFontStyle)
+! 	gui_mac_set_font_attributes(font);
+  #endif
+  
+      return OK;
+***************
+*** 3447,3452 ****
+--- 3579,3646 ----
+  }
+  #endif
+  
++ #ifdef USE_ATSUI_DRAWING
++     static 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,3518 ****
+  #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 (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;
+! 	    }
+! 	}
+! 
+      }
+  
+      if (p_macatsui && !gIsFontFallbackSet)
+--- 3650,3668 ----
+  #ifdef USE_ATSUI_DRAWING
+      GuiFont			currFont;
+      ByteCount			actualFontByteCount;
+  
+      if (p_macatsui && gFontStyle)
+      {
+  	/* Avoid setting same font again */
+! 	if (ATSUGetAttribute(gFontStyle, kATSUMaxATSUITagValue + 1,
+! 		    sizeof(font), &currFont, &actualFontByteCount) == noErr
+! 		&& actualFontByteCount == (sizeof font))
+  	{
+  	    if (currFont == font)
+  		return;
+  	}
+  
+! 	gui_mac_set_font_attributes(font);
+      }
+  
+      if (p_macatsui && !gIsFontFallbackSet)
+***************
+*** 3536,3542 ****
+  			&fallbackFonts,
+  			NULL) == noErr)
+  	    {
+! 		ATSUSetFontFallbacks((sizeof fallbackFonts)/sizeof(ATSUFontID), &fallbackFonts, kATSUSequentialFallbacksPreferred);
+  	    }
+  /*
+  	ATSUAttributeValuePtr fallbackValues[] = { };
+--- 3686,3694 ----
+  			&fallbackFonts,
+  			NULL) == noErr)
+  	    {
+! 		ATSUSetFontFallbacks((sizeof fallbackFonts)/sizeof(ATSUFontID),
+! 				     &fallbackFonts,
+! 				     kATSUSequentialFallbacksPreferred);
+  	    }
+  /*
+  	ATSUAttributeValuePtr fallbackValues[] = { };
+***************
+*** 3921,3927 ****
+  
+      /* - ATSUI automatically antialiases text (Someone)
+       * - for some reason it does not work... (Jussi) */
+! 
+      /*
+       * When antialiasing we're using srcOr mode, we have to clear the block
+       * before drawing the text.
+--- 4073,4082 ----
+  
+      /* - 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,3990 ****
+      }
+  
+      {
+- 	/* Use old-style, non-antialiased QuickDraw text rendering. */
+  	TextMode(srcCopy);
+  	TextFace(normal);
+  
+!     /*  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)
+  	{
+! 	    ATSUSetTransientFontMatching(textLayout, TRUE);
+  
+! 	    ATSUDrawText(textLayout,
+! 		    kATSUFromTextBeginning, kATSUToTextEnd,
+! 		    kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc);
+  
+  	    ATSUDisposeTextLayout(textLayout);
+  	}
+      }
+  
+      if (flags & DRAW_UNDERC)
+--- 4111,4232 ----
+      }
+  
+      {
+  	TextMode(srcCopy);
+  	TextFace(normal);
+  
+! 	/*  SelectFont(hdc, gui.currFont); */
+  	if (flags & DRAW_TRANSP)
+  	{
+  	    TextMode(srcOr);
+  	}
+  
+  	MoveTo(TEXT_X(col), TEXT_Y(row));
+  
+! 	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)
+! 	{
+! 	    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); */
+! 
+! 	    /* 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);
++ 	    }
++ 
++ 	    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,4003 ****
+--- 4240,4252 ----
+  gui_mch_draw_string(int row, int col, char_u *s, int len, int flags)
+  {
+  #if defined(USE_ATSUI_DRAWING)
++     if (p_macatsui == 0 && p_macatsui_last != 0)
++ 	/* switch from macatsui to nomacatsui */
++ 	gui_mac_dispose_atsui_style();
++     else if (p_macatsui != 0 && p_macatsui_last == 0)
++ 	/* switch from nomacatsui to macatsui */
++ 	gui_mac_create_atsui_style();
++ 
+      if (p_macatsui)
+  	draw_string_ATSUI(row, col, s, len, flags);
+      else
+***************
+*** 4228,4239 ****
+  	 */
+  	/* TODO: reduce wtime accordinly???  */
+  	if (wtime > -1)
+! 	    sleeppyTick = 60*wtime/1000;
+  	else
+  	    sleeppyTick = 32767;
+  	if (WaitNextEventWrp(mask, &event, sleeppyTick, dragRgn))
+  	{
+! 		gui_mac_handle_event(&event);
+  	    if (input_available())
+  	    {
+  		allow_scrollbar = FALSE;
+--- 4477,4489 ----
+  	 */
+  	/* TODO: reduce wtime accordinly???  */
+  	if (wtime > -1)
+! 	    sleeppyTick = 60 * wtime / 1000;
+  	else
+  	    sleeppyTick = 32767;
++ 
+  	if (WaitNextEventWrp(mask, &event, sleeppyTick, dragRgn))
+  	{
+! 	    gui_mac_handle_event(&event);
+  	    if (input_available())
+  	    {
+  		allow_scrollbar = FALSE;
+***************
+*** 6031,6037 ****
+  #endif
+  }
+  
+! #if defined(USE_IM_CONTROL) || defined(PROTO)
+  /*
+   * Input Method Control functions.
+   */
+--- 6346,6352 ----
+  #endif
+  }
+  
+! #if (defined(USE_IM_CONTROL) || defined(PROTO)) && defined(USE_CARBONKEYHANDLER)
+  /*
+   * Input Method Control functions.
+   */
+***************
+*** 6042,6048 ****
+--- 6357,6427 ----
+      void
+  im_set_position(int row, int col)
+  {
++ #if 0
+      /* TODO: Implement me! */
++     im_start_row = row;
++     im_start_col = col;
++ #endif
++ }
++ 
++ static ScriptLanguageRecord gTSLWindow;
++ static ScriptLanguageRecord gTSLInsert;
++ static ScriptLanguageRecord gTSLDefault = { 0, 0 };
++ 
++ static Component	     gTSCWindow;
++ static Component	     gTSCInsert;
++ static Component	     gTSCDefault;
++ 
++ static int		     im_initialized = 0;
++ 
++     static 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,6057 ****
+      void
+  im_set_active(int active)
+  {
+!     KeyScript(active ? smKeySysScript : smKeyRoman);
+  }
+  
+  /*
+--- 6430,6486 ----
+      void
+  im_set_active(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 = &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,6068 ****
+      int
+  im_get_status(void)
+  {
+!     SInt32 script = GetScriptManagerVariable(smKeyScript);
+!     return (script != smRoman
+! 	    && script == GetScriptManagerVariable(smSysScript)) ? 1 : 0;
+  }
+  
+  #endif /* defined(USE_IM_CONTROL) || defined(PROTO) */
+--- 6489,6498 ----
+      int
+  im_get_status(void)
+  {
+!     if (! gui.in_use)
+! 	return 0;
+! 
+!     return im_is_active;
+  }
+  
+  #endif /* defined(USE_IM_CONTROL) || defined(PROTO) */
+***************
+*** 6118,6124 ****
+      int		numTabs = 0;
+  
+      for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
+!         ++numTabs;
+      return numTabs;
+  }
+  
+--- 6548,6554 ----
+      int		numTabs = 0;
+  
+      for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
+! 	++numTabs;
+      return numTabs;
+  }
+  
+***************
+*** 6126,6133 ****
+      static OSStatus
+  dbItemDataCallback(ControlRef browser,
+  	DataBrowserItemID itemID,
+!         DataBrowserPropertyID property /* column id */,
+!         DataBrowserItemDataRef itemData,
+  	Boolean changeValue)
+  {
+      OSStatus status = noErr;
+--- 6556,6563 ----
+      static OSStatus
+  dbItemDataCallback(ControlRef browser,
+  	DataBrowserItemID itemID,
+! 	DataBrowserPropertyID property /* column id */,
+! 	DataBrowserItemDataRef itemData,
+  	Boolean changeValue)
+  {
+      OSStatus status = noErr;
+***************
+*** 6170,6178 ****
+      static void
+  dbGetContextualMenuCallback(ControlRef browser,
+  	MenuRef *menu,
+!         UInt32 *helpType,
+  	CFStringRef *helpItemString,
+!         AEDesc *selection)
+  {
+      // on mac os 9: kCMHelpItemNoHelp, but it's not the same
+      *helpType = kCMHelpItemRemoveHelp; // OS X only ;-)
+--- 6600,6608 ----
+      static void
+  dbGetContextualMenuCallback(ControlRef browser,
+  	MenuRef *menu,
+! 	UInt32 *helpType,
+  	CFStringRef *helpItemString,
+! 	AEDesc *selection)
+  {
+      // on mac os 9: kCMHelpItemNoHelp, but it's not the same
+      *helpType = kCMHelpItemRemoveHelp; // OS X only ;-)
+***************
+*** 6395,6403 ****
+  gui_mch_show_tabline(int showit)
+  {
+      if (showit == 0)
+!         CloseDrawer(drawer, true);
+      else
+!         OpenDrawer(drawer, kWindowEdgeRight, true);
+  }
+  
+  /*
+--- 6825,6833 ----
+  gui_mch_show_tabline(int showit)
+  {
+      if (showit == 0)
+! 	CloseDrawer(drawer, true);
+      else
+! 	OpenDrawer(drawer, kWindowEdgeRight, true);
+  }
+  
+  /*
+***************
+*** 6425,6435 ****
+      // adjust data browser
+      if (tabLabels != NULL)
+      {
+!         int i;
+  
+!         for (i = 0; i < tabLabelsSize; ++i)
+!             CFRelease(tabLabels[i]);
+!         free(tabLabels);
+      }
+      tabLabels = (CFStringRef *)malloc(numTabs * sizeof(CFStringRef));
+      tabLabelsSize = numTabs;
+--- 6855,6865 ----
+      // adjust data browser
+      if (tabLabels != NULL)
+      {
+! 	int i;
+  
+! 	for (i = 0; i < tabLabelsSize; ++i)
+! 	    CFRelease(tabLabels[i]);
+! 	free(tabLabels);
+      }
+      tabLabels = (CFStringRef *)malloc(numTabs * sizeof(CFStringRef));
+      tabLabelsSize = numTabs;
+***************
+*** 6438,6444 ****
+      {
+  	if (tp == curtab)
+  	    curtabidx = nr;
+!         tabLabels[nr-1] = getTabLabel(tp);
+      }
+  
+      RemoveDataBrowserItems(dataBrowser, kDataBrowserNoItem, 0, NULL,
+--- 6868,6874 ----
+      {
+  	if (tp == curtab)
+  	    curtabidx = nr;
+! 	tabLabels[nr-1] = getTabLabel(tp);
+      }
+  
+      RemoveDataBrowserItems(dataBrowser, kDataBrowserNoItem, 0, NULL,
+*** ../vim-7.1.274/src/version.c	Wed Mar 12 13:45:34 2008
+--- src/version.c	Wed Mar 12 14:31:37 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+  {   /* Add new patch number below this line */
++ /**/
++     275,
+  /**/
+
+-- 
+hundred-and-one symptoms of being an internet addict:
+115. You are late picking up your kid from school and try to explain
+     to the teacher you were stuck in Web traffic.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
+///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\        download, build and distribute -- http://www.A-A-P.org        ///
+ \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///