To: vim_dev@googlegroups.com Subject: Patch 8.2.0765 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0765 Problem: In the GUI can't use all the modifiers. (Andri Möll) Solution: Do not apply Alt/Meta early, do it later like with the terminal. Avoid the Motif test from crashing. Files: src/gui_gtk_x11.c, src/gui_x11.c, src/gui_mac.c, src/gui_w32.c, src/gui_motif.c *** ../vim-8.2.0764/src/gui_gtk_x11.c 2020-03-27 20:58:33.345005916 +0100 --- src/gui_gtk_x11.c 2020-05-16 13:05:34.961156759 +0200 *************** *** 1212,1250 **** return FALSE; #endif ! // Check for Alt/Meta key (Mod1Mask), but not for a BS, DEL or character ! // that already has the 8th bit set. ! // Don't do this for , that should become K_S_TAB with ALT. ! // Don't do this for double-byte encodings, it turns the char into a lead ! // byte. ! if (len == 1 ! && ((state & GDK_MOD1_MASK) ! #if GTK_CHECK_VERSION(2,10,0) ! || (state & GDK_SUPER_MASK) ! #endif ! ) ! && !(key_sym == GDK_BackSpace || key_sym == GDK_Delete) ! && (string[0] & 0x80) == 0 ! && !(key_sym == GDK_Tab && (state & GDK_SHIFT_MASK)) ! && !enc_dbcs ! ) ! { ! string[0] |= 0x80; ! state &= ~GDK_MOD1_MASK; // don't use it again ! if (enc_utf8) // convert to utf-8 ! { ! string[1] = string[0] & 0xbf; ! string[0] = ((unsigned)string[0] >> 6) + 0xc0; ! if (string[1] == CSI) ! { ! string[2] = KS_EXTRA; ! string[3] = (int)KE_CSI; ! len = 4; ! } ! else ! len = 2; ! } ! } // Check for special keys. Also do this when len == 1 (key has an ASCII // value) to detect backspace, delete and keypad keys. --- 1212,1220 ---- return FALSE; #endif ! // We used to apply Alt/Meta to the key here (Mod1Mask), but that is now ! // done later, the same as it happens for the terminal. Hopefully that ! // works for everybody... // Check for special keys. Also do this when len == 1 (key has an ASCII // value) to detect backspace, delete and keypad keys. *************** *** 1266,1317 **** if (len == 0) // Unrecognized key return TRUE; ! // Special keys (and a few others) may have modifiers. Also when using a ! // double-byte encoding (can't set the 8th bit). ! if (len == -3 || key_sym == GDK_space || key_sym == GDK_Tab ! || key_sym == GDK_Return || key_sym == GDK_Linefeed ! || key_sym == GDK_Escape || key_sym == GDK_KP_Tab ! || key_sym == GDK_ISO_Enter || key_sym == GDK_3270_Enter ! || (enc_dbcs && len == 1 && ((state & GDK_MOD1_MASK) ! #if GTK_CHECK_VERSION(2,10,0) ! || (state & GDK_SUPER_MASK) ! #endif ! ))) ! { ! modifiers = modifiers_gdk2vim(state); ! /* ! * For some keys a shift modifier is translated into another key ! * code. ! */ ! if (len == -3) ! key = TO_SPECIAL(string[1], string[2]); ! else ! key = string[0]; ! ! key = simplify_key(key, &modifiers); ! if (key == CSI) ! key = K_CSI; ! if (IS_SPECIAL(key)) ! { ! string[0] = CSI; ! string[1] = K_SECOND(key); ! string[2] = K_THIRD(key); ! len = 3; ! } ! else ! { ! string[0] = key; ! len = 1; ! } ! if (modifiers != 0) ! { ! string2[0] = CSI; ! string2[1] = KS_MODIFIER; ! string2[2] = modifiers; ! add_to_input_buf(string2, 3); ! } } if (len == 1 && ((string[0] == Ctrl_C && ctrl_c_interrupts) --- 1236,1272 ---- if (len == 0) // Unrecognized key return TRUE; ! // Handle modifiers. ! modifiers = modifiers_gdk2vim(state); ! // For some keys a shift modifier is translated into another key code. ! if (len == -3) ! key = TO_SPECIAL(string[1], string[2]); ! else ! key = string[0]; ! ! key = simplify_key(key, &modifiers); ! if (key == CSI) ! key = K_CSI; ! if (IS_SPECIAL(key)) ! { ! string[0] = CSI; ! string[1] = K_SECOND(key); ! string[2] = K_THIRD(key); ! len = 3; ! } ! else ! { ! string[0] = key; ! len = 1; ! } ! if (modifiers != 0) ! { ! string2[0] = CSI; ! string2[1] = KS_MODIFIER; ! string2[2] = modifiers; ! add_to_input_buf(string2, 3); } if (len == 1 && ((string[0] == Ctrl_C && ctrl_c_interrupts) *** ../vim-8.2.0764/src/gui_x11.c 2020-04-12 19:37:13.514297270 +0200 --- src/gui_x11.c 2020-05-16 13:11:49.171559908 +0200 *************** *** 771,778 **** #else char_u string[4], string2[3]; #endif ! KeySym key_sym, key_sym2; ! int len, len2; int i; int modifiers; int key; --- 771,778 ---- #else char_u string[4], string2[3]; #endif ! KeySym key_sym; ! int len; int i; int modifiers; int key; *************** *** 883,939 **** } #endif ! // Check for Alt/Meta key (Mod1Mask), but not for a BS, DEL or character ! // that already has the 8th bit set. And not when using a double-byte ! // encoding, setting the 8th bit may make it the lead byte of a ! // double-byte character. ! if (len == 1 ! && (ev_press->state & Mod1Mask) ! && !(key_sym == XK_BackSpace || key_sym == XK_Delete) ! && (string[0] & 0x80) == 0 ! && !enc_dbcs) ! { ! #if defined(FEAT_MENU) && defined(FEAT_GUI_MOTIF) ! // Ignore ALT keys when they are used for the menu only ! if (gui.menu_is_active ! && (p_wak[0] == 'y' ! || (p_wak[0] == 'm' && gui_is_menu_shortcut(string[0])))) ! goto theend; ! #endif ! /* ! * Before we set the 8th bit, check to make sure the user doesn't ! * already have a mapping defined for this sequence. We determine this ! * by checking to see if the input would be the same without the ! * Alt/Meta key. ! * Don't do this for , that should become K_S_TAB with ALT. ! */ ! ev_press->state &= ~Mod1Mask; ! len2 = XLookupString(ev_press, (char *)string2, sizeof(string2), ! &key_sym2, NULL); ! if (key_sym2 == XK_space) ! string2[0] = ' '; // Otherwise Meta-Ctrl-Space doesn't work ! if ( len2 == 1 ! && string[0] == string2[0] ! && !(key_sym == XK_Tab && (ev_press->state & ShiftMask))) ! { ! string[0] |= 0x80; ! if (enc_utf8) // convert to utf-8 ! { ! string[1] = string[0] & 0xbf; ! string[0] = ((unsigned)string[0] >> 6) + 0xc0; ! if (string[1] == CSI) ! { ! string[2] = KS_EXTRA; ! string[3] = (int)KE_CSI; ! len = 4; ! } ! else ! len = 2; ! } ! } ! else ! ev_press->state |= Mod1Mask; ! } if (len == 1 && string[0] == CSI) { --- 883,891 ---- } #endif ! // We used to apply Alt/Meta to the key here (Mod1Mask), but that is now ! // done later, the same as it happens for the terminal. Hopefully that ! // works for everybody... if (len == 1 && string[0] == CSI) { *************** *** 963,1016 **** if (len == 0) goto theend; ! // Special keys (and a few others) may have modifiers. Also when using a ! // double-byte encoding (can't set the 8th bit). ! if (len == -3 || key_sym == XK_space || key_sym == XK_Tab ! || key_sym == XK_Return || key_sym == XK_Linefeed ! || key_sym == XK_Escape ! || (enc_dbcs && len == 1 && (ev_press->state & Mod1Mask))) ! { ! modifiers = 0; ! if (ev_press->state & ShiftMask) ! modifiers |= MOD_MASK_SHIFT; ! if (ev_press->state & ControlMask) ! modifiers |= MOD_MASK_CTRL; ! if (ev_press->state & Mod1Mask) ! modifiers |= MOD_MASK_ALT; ! if (ev_press->state & Mod4Mask) ! modifiers |= MOD_MASK_META; ! ! /* ! * For some keys a shift modifier is translated into another key ! * code. ! */ ! if (len == -3) ! key = TO_SPECIAL(string[1], string[2]); ! else ! key = string[0]; ! key = simplify_key(key, &modifiers); ! if (key == CSI) ! key = K_CSI; ! if (IS_SPECIAL(key)) ! { ! string[0] = CSI; ! string[1] = K_SECOND(key); ! string[2] = K_THIRD(key); ! len = 3; ! } ! else ! { ! string[0] = key; ! len = 1; ! } ! if (modifiers != 0) ! { ! string2[0] = CSI; ! string2[1] = KS_MODIFIER; ! string2[2] = modifiers; ! add_to_input_buf(string2, 3); ! } } if (len == 1 && ((string[0] == Ctrl_C && ctrl_c_interrupts) --- 915,961 ---- if (len == 0) goto theend; ! // Handle modifiers. ! modifiers = 0; ! if (ev_press->state & ShiftMask) ! modifiers |= MOD_MASK_SHIFT; ! if (ev_press->state & ControlMask) ! modifiers |= MOD_MASK_CTRL; ! if (ev_press->state & Mod1Mask) ! modifiers |= MOD_MASK_ALT; ! if (ev_press->state & Mod4Mask) ! modifiers |= MOD_MASK_META; ! /* ! * For some keys a shift modifier is translated into another key ! * code. ! */ ! if (len == -3) ! key = TO_SPECIAL(string[1], string[2]); ! else ! key = string[0]; ! key = simplify_key(key, &modifiers); ! if (key == CSI) ! key = K_CSI; ! if (IS_SPECIAL(key)) ! { ! string[0] = CSI; ! string[1] = K_SECOND(key); ! string[2] = K_THIRD(key); ! len = 3; ! } ! else ! { ! string[0] = key; ! len = 1; ! } ! ! if (modifiers != 0) ! { ! string2[0] = CSI; ! string2[1] = KS_MODIFIER; ! string2[2] = modifiers; ! add_to_input_buf(string2, 3); } if (len == 1 && ((string[0] == Ctrl_C && ctrl_c_interrupts) *** ../vim-8.2.0764/src/gui_mac.c 2020-04-12 19:37:13.510297280 +0200 --- src/gui_mac.c 2020-05-16 13:21:04.898548745 +0200 *************** *** 2168,2176 **** // 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, ! TRUE, NULL); if (key_char == CSI) key_char = K_CSI; --- 2168,2176 ---- // taken liberally from gui_w48.c key_char = simplify_key(key_char, (int *)&vimModifiers); ! // Unify modifiers somewhat. No longer use ALT to set the 8th bit. key_char = extract_modifiers(key_char, (int *)&vimModifiers, ! FALSE, NULL); if (key_char == CSI) key_char = K_CSI; *** ../vim-8.2.0764/src/gui_w32.c 2020-04-12 19:37:13.514297270 +0200 --- src/gui_w32.c 2020-05-16 13:20:47.338567448 +0200 *************** *** 847,854 **** if (ch < 0x100 && !isalpha(ch) && isprint(ch)) modifiers &= ~MOD_MASK_SHIFT; ! // Interpret the ALT key as making the key META, include SHIFT, etc. ! ch = extract_modifiers(ch, &modifiers, TRUE, NULL); if (ch == CSI) ch = K_CSI; --- 847,854 ---- if (ch < 0x100 && !isalpha(ch) && isprint(ch)) modifiers &= ~MOD_MASK_SHIFT; ! // Unify modifiers somewhat. No longer use ALT to set the 8th bit. ! ch = extract_modifiers(ch, &modifiers, FALSE, NULL); if (ch == CSI) ch = K_CSI; *** ../vim-8.2.0764/src/gui_motif.c 2020-04-12 19:37:13.510297280 +0200 --- src/gui_motif.c 2020-05-16 13:50:32.551934727 +0200 *************** *** 1238,1245 **** --- 1238,1248 ---- } else { + # if 0 // DISABLED - this causes a crash when running "make test_gui" in + // Test_colorscheme() if (menu->xpm_fname != NULL) XtSetArg(args[n], XmNpixmapFile, menu->xpm_fname); n++; + # endif XtSetArg(args[n], XmNpixmapData, menu->xpm); n++; XtSetArg(args[n], XmNlabelLocation, XmBOTTOM); n++; } *** ../vim-8.2.0764/src/version.c 2020-05-15 23:36:36.910811316 +0200 --- src/version.c 2020-05-16 13:21:24.282528739 +0200 *************** *** 748,749 **** --- 748,751 ---- { /* Add new patch number below this line */ + /**/ + 765, /**/ -- A meeting is an event at which the minutes are kept and the hours are lost. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///