0
0
mirror of https://github.com/vim/vim.git synced 2025-09-29 04:34:16 -04:00

updated for version 7.0-138

This commit is contained in:
Bram Moolenaar
2006-10-17 10:51:57 +00:00
parent b90daee952
commit adcb9497e8
2 changed files with 132 additions and 149 deletions

View File

@@ -2014,7 +2014,7 @@ gui_mac_doKeyEventCarbon(
void *data) void *data)
{ {
/* Multibyte-friendly key event handler */ /* Multibyte-friendly key event handler */
OSStatus e = -1; OSStatus err = -1;
UInt32 actualSize; UInt32 actualSize;
UniChar *text; UniChar *text;
char_u result[INLINE_KEY_BUFFER_SIZE]; char_u result[INLINE_KEY_BUFFER_SIZE];
@@ -2022,174 +2022,153 @@ gui_mac_doKeyEventCarbon(
UInt32 key_sym; UInt32 key_sym;
char charcode; char charcode;
int key_char; int key_char;
UInt32 modifiers; UInt32 modifiers, vimModifiers;
size_t encLen; size_t encLen;
char_u *to = NULL; char_u *to = NULL;
Boolean isSpecial = FALSE; Boolean isSpecial = FALSE;
int i; int i;
EventRef keyEvent;
/* Mask the mouse (as per user setting) */ /* Mask the mouse (as per user setting) */
if (p_mh) if (p_mh)
ObscureCursor(); ObscureCursor();
do /* Don't use the keys when the dialog wants them. */
{ if (dialog_busy)
/* Don't use the keys when the dialog wants them. */ return eventNotHandledErr;
if (dialog_busy)
break;
if (noErr != GetEventParameter(theEvent, kEventParamTextInputSendText, if (noErr != GetEventParameter(theEvent, kEventParamTextInputSendText,
typeUnicodeText, NULL, 0, &actualSize, NULL)) typeUnicodeText, NULL, 0, &actualSize, NULL))
break; return eventNotHandledErr;
text = (UniChar *)alloc(actualSize); text = (UniChar *)alloc(actualSize);
if (!text)
return eventNotHandledErr;
if (text) err = GetEventParameter(theEvent, kEventParamTextInputSendText,
{ typeUnicodeText, NULL, actualSize, NULL, text);
do require_noerr(err, done);
{
if (noErr != GetEventParameter(theEvent,
kEventParamTextInputSendText,
typeUnicodeText, NULL, actualSize, NULL, text))
break;
EventRef keyEvent;
if (noErr != GetEventParameter(theEvent,
kEventParamTextInputSendKeyboardEvent,
typeEventRef, NULL, sizeof(EventRef), NULL, &keyEvent))
break;
if (noErr != GetEventParameter(keyEvent,
kEventParamKeyModifiers,
typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers))
break;
if (noErr != GetEventParameter(keyEvent,
kEventParamKeyCode,
typeUInt32, NULL, sizeof(UInt32), NULL, &key_sym))
break;
if (noErr != GetEventParameter(keyEvent,
kEventParamKeyMacCharCodes,
typeChar, NULL, sizeof(char), NULL, &charcode))
break;
key_char = charcode; err = GetEventParameter(theEvent, kEventParamTextInputSendKeyboardEvent,
typeEventRef, NULL, sizeof(EventRef), NULL, &keyEvent);
require_noerr(err, done);
if (modifiers & controlKey) err = GetEventParameter(keyEvent, kEventParamKeyModifiers,
{ typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
if ((modifiers & ~(controlKey|shiftKey)) == 0 require_noerr(err, done);
&& (key_char == '2' || key_char == '6'))
{
/* CTRL-^ and CTRL-@ don't work in the normal way. */
if (key_char == '2')
key_char = Ctrl_AT;
else
key_char = Ctrl_HAT;
text[0] = (UniChar)key_char; err = GetEventParameter(keyEvent, kEventParamKeyCode,
modifiers = 0; 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);
if (modifiers & cmdKey)
#ifndef USE_CMD_KEY #ifndef USE_CMD_KEY
break; /* Let system handle Cmd+... */ if (modifiers & cmdKey)
#else goto done; /* Let system handle Cmd+... */
{
/* Intercept CMD-. */
if (key_char == '.')
got_int = TRUE;
/* Convert the modifiers */
modifiers = EventModifiers2VimModifiers(modifiers);
/* Following code to simplify and consolidate modifiers
* taken liberally from gui_w48.c */
key_char = simplify_key(key_char, (int *)&modifiers);
/* remove SHIFT for keys that are already shifted, e.g.,
* '(' and '*' */
if (key_char < 0x100 &&
!isalpha(key_char) && isprint(key_char))
modifiers &= ~MOD_MASK_SHIFT;
/* Interpret META, include SHIFT, etc. */
key_char = extract_modifiers(key_char, (int *)&modifiers);
if (key_char == CSI)
key_char = K_CSI;
if (modifiers)
{
result[len++] = CSI;
result[len++] = KS_MODIFIER;
result[len++] = modifiers;
}
isSpecial = TRUE;
}
#endif #endif
else
{
/* 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 *)&modifiers);
isSpecial = TRUE;
break;
}
}
}
if (isSpecial && IS_SPECIAL(key_char)) key_char = charcode;
{ vimModifiers = EventModifiers2VimModifiers(modifiers);
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) /* Find the special key (eg., for cursor keys) */
{ if (actualSize <= sizeof(UniChar) &&
/* This is basically add_to_input_buf_csi() */ ((text[0] < 0x20) || (text[0] == 0x7f)))
for (i = 0; i < encLen && len < (INLINE_KEY_BUFFER_SIZE-1); ++i) {
{ for (i = 0; special_keys[i].key_sym != (KeySym)0; ++i)
result[len++] = to[i]; if (special_keys[i].key_sym == key_sym)
if (to[i] == CSI) {
{ key_char = TO_SPECIAL(special_keys[i].vim_code0,
result[len++] = KS_EXTRA; special_keys[i].vim_code1);
result[len++] = (int)KE_CSI; key_char = simplify_key(key_char,
} (int *)&vimModifiers);
} isSpecial = TRUE;
vim_free(to); break;
} }
add_to_input_buf(result, len);
e = noErr;
}
while (0);
vim_free(text);
if (e == noErr)
{
/* Fake event to wake up WNE (required to get
* key repeat working */
PostEvent(keyUp, 0);
return noErr;
}
}
} }
while (0);
return CallNextEventHandler(nextHandler, theEvent); /* 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);
err = noErr;
done:
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;
} }
#else #else
void void
@@ -5748,7 +5727,8 @@ gui_mch_show_popupmenu(vimmenu_T *menu)
/* TODO: Get the text selection from Vim */ /* TODO: Get the text selection from Vim */
/* Call to Handle Popup */ /* Call to Handle Popup */
status = ContextualMenuSelect(CntxMenu, where, false, kCMHelpItemNoHelp, HelpName, NULL, &CntxType, &CntxMenuID, &CntxMenuItem); status = ContextualMenuSelect(CntxMenu, where, false, kCMHelpItemNoHelp,
HelpName, NULL, &CntxType, &CntxMenuID, &CntxMenuItem);
if (status == noErr) if (status == noErr)
{ {
@@ -5756,7 +5736,8 @@ gui_mch_show_popupmenu(vimmenu_T *menu)
{ {
/* Handle the menu CntxMenuID, CntxMenuItem */ /* Handle the menu CntxMenuID, CntxMenuItem */
/* The submenu can be handle directly by gui_mac_handle_menu */ /* The submenu can be handle directly by gui_mac_handle_menu */
/* But what about the current menu, is the menu changed by ContextualMenuSelect */ /* But what about the current menu, is the menu changed by
* ContextualMenuSelect */
gui_mac_handle_menu((CntxMenuID << 16) + CntxMenuItem); gui_mac_handle_menu((CntxMenuID << 16) + CntxMenuItem);
} }
else if (CntxMenuID == kCMShowHelpSelected) else if (CntxMenuID == kCMShowHelpSelected)

View File

@@ -666,6 +666,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
138,
/**/ /**/
137, 137,
/**/ /**/