]> code.delx.au - gnu-emacs/blobdiff - src/keyboard.c
Merge from gnus--devo--0
[gnu-emacs] / src / keyboard.c
index a930fe7428941b4096525610ef7e324cf6e8ee32..6e7bcca3ca3f013e5415ac19b599305f2f81d24e 100644 (file)
@@ -132,6 +132,9 @@ int this_command_key_count_reset;
 Lisp_Object raw_keybuf;
 int raw_keybuf_count;
 
+/* Non-nil if the present key sequence was obtained by shift translation.  */
+Lisp_Object Vthis_command_keys_shift_translated;
+
 #define GROW_RAW_KEYBUF                                                        \
  if (raw_keybuf_count == XVECTOR (raw_keybuf)->size)                   \
    raw_keybuf = larger_vector (raw_keybuf, raw_keybuf_count * 2, Qnil)  \
@@ -154,11 +157,6 @@ extern int message_enable_multibyte;
 
 Lisp_Object Vshow_help_function;
 
-/* If a string, the message displayed before displaying a help-echo
-   in the echo area.  */
-
-Lisp_Object Vpre_help_message;
-
 /* Nonzero means do menu prompting.  */
 
 static int menu_prompting;
@@ -394,6 +392,7 @@ Lisp_Object Vinput_method_previous_message;
 
 /* Non-nil means deactivate the mark at end of this command.  */
 Lisp_Object Vdeactivate_mark;
+Lisp_Object Qdeactivate_mark;
 
 /* Menu bar specified in Lucid Emacs fashion.  */
 
@@ -1648,6 +1647,7 @@ command_loop_1 ()
       Vthis_command = Qnil;
       real_this_command = Qnil;
       Vthis_original_command = Qnil;
+      Vthis_command_keys_shift_translated = Qnil;
 
       /* Read next key sequence; i gets its length.  */
       i = read_key_sequence (keybuf, sizeof keybuf / sizeof keybuf[0],
@@ -1761,7 +1761,9 @@ command_loop_1 ()
 
              /* Recognize some common commands in common situations and
                 do them directly.  */
-             if (EQ (Vthis_command, Qforward_char) && PT < ZV)
+             if (EQ (Vthis_command, Qforward_char) && PT < ZV
+                 && NILP (Vthis_command_keys_shift_translated)
+                 && !CONSP (Vtransient_mark_mode))
                {
                   struct Lisp_Char_Table *dp
                    = window_display_table (XWINDOW (selected_window));
@@ -1801,7 +1803,9 @@ command_loop_1 ()
                    direct_output_forward_char (1);
                  goto directly_done;
                }
-             else if (EQ (Vthis_command, Qbackward_char) && PT > BEGV)
+             else if (EQ (Vthis_command, Qbackward_char) && PT > BEGV
+                      && NILP (Vthis_command_keys_shift_translated)
+                      && !CONSP (Vtransient_mark_mode))
                {
                   struct Lisp_Char_Table *dp
                    = window_display_table (XWINDOW (selected_window));
@@ -1961,25 +1965,16 @@ command_loop_1 ()
 
       if (!NILP (current_buffer->mark_active) && !NILP (Vrun_hooks))
        {
-         /* Setting transient-mark-mode to `only' is a way of
-            turning it on for just one command.  */
-
+         /* In Emacs 22, setting transient-mark-mode to `only' was a
+            way of turning it on for just one command.  This usage is
+            obsolete, but support it anyway.  */
          if (EQ (Vtransient_mark_mode, Qidentity))
            Vtransient_mark_mode = Qnil;
-         if (EQ (Vtransient_mark_mode, Qonly))
+         else if (EQ (Vtransient_mark_mode, Qonly))
            Vtransient_mark_mode = Qidentity;
 
-         if (!NILP (Vdeactivate_mark) && !NILP (Vtransient_mark_mode))
-           {
-             /* We could also call `deactivate'mark'.  */
-             if (EQ (Vtransient_mark_mode, Qlambda))
-               Vtransient_mark_mode = Qnil;
-             else
-               {
-                 current_buffer->mark_active = Qnil;
-                 call1 (Vrun_hooks, intern ("deactivate-mark-hook"));
-               }
-           }
+         if (!NILP (Vdeactivate_mark))
+           call0 (Qdeactivate_mark);
          else if (current_buffer != prev_buffer || MODIFF != prev_modiff)
            call1 (Vrun_hooks, intern ("activate-mark-hook"));
        }
@@ -2031,6 +2026,7 @@ adjust_point_for_property (last_pt, modified)
      can't be usefully combined anyway.  */
   while (check_composition || check_display || check_invisible)
     {
+      /* FIXME: check `intangible'.  */
       if (check_composition
          && PT > BEGV && PT < ZV
          && get_property_and_range (PT, Qcomposition, &val, &beg, &end, Qnil)
@@ -2457,37 +2453,6 @@ show_help_echo (help, window, object, pos, ok_to_overwrite_keystroke_echo)
     {
       if (!NILP (Vshow_help_function))
        call1 (Vshow_help_function, help);
-      else if (/* Don't overwrite minibuffer contents.  */
-              !MINI_WINDOW_P (XWINDOW (selected_window))
-              /* Don't overwrite a keystroke echo.  */
-              && (NILP (echo_message_buffer)
-                  || ok_to_overwrite_keystroke_echo)
-              /* Don't overwrite a prompt.  */
-              && !cursor_in_echo_area)
-       {
-         if (STRINGP (help))
-           {
-             int count = SPECPDL_INDEX ();
-
-             if (!help_echo_showing_p)
-               Vpre_help_message = current_message ();
-
-             specbind (Qmessage_truncate_lines, Qt);
-             message3_nolog (help, SBYTES (help),
-                             STRING_MULTIBYTE (help));
-             unbind_to (count, Qnil);
-           }
-         else if (STRINGP (Vpre_help_message))
-           {
-             message3_nolog (Vpre_help_message,
-                             SBYTES (Vpre_help_message),
-                             STRING_MULTIBYTE (Vpre_help_message));
-             Vpre_help_message = Qnil;
-           }
-         else
-           message (0);
-       }
-
       help_echo_showing_p = STRINGP (help);
     }
 }
@@ -9209,6 +9174,11 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
   /* Likewise, for key_translation_map and input-decode-map.  */
   volatile keyremap keytran, indec;
 
+  /* Non-zero if we are trying to map a key by changing an upper-case
+     letter to lower case, or a shifted function key to an unshifted
+     one. */
+  volatile int shift_translated = 0;
+
   /* If we receive a `switch-frame' or `select-window' event in the middle of
      a key sequence, we put it off for later.
      While we're reading, we keep the event here.  */
@@ -9317,8 +9287,7 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
          defs    = (Lisp_Object *) alloca (2 * sizeof (defs[0]));
          nmaps_allocated = 2;
        }
-      if (!NILP (current_kboard->Voverriding_terminal_local_map))
-       submaps[nmaps++] = current_kboard->Voverriding_terminal_local_map;
+      submaps[nmaps++] = current_kboard->Voverriding_terminal_local_map;
     }
   else if (!NILP (Voverriding_local_map))
     {
@@ -9328,8 +9297,7 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
          defs    = (Lisp_Object *) alloca (2 * sizeof (defs[0]));
          nmaps_allocated = 2;
        }
-      if (!NILP (Voverriding_local_map))
-       submaps[nmaps++] = Voverriding_local_map;
+      submaps[nmaps++] = Voverriding_local_map;
     }
   else
     {
@@ -10127,6 +10095,7 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
             might get translated through function-key-map.  */
          keybuf[t - 1] = new_key;
          mock_input = max (t, mock_input);
+         shift_translated = 1;
 
          goto replay_sequence;
        }
@@ -10168,6 +10137,7 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
                 input-decode-map doesn't need to go through it again.  */
              fkey.start = fkey.end = 0;
              keytran.start = keytran.end = 0;
+             shift_translated = 1;
 
              goto replay_sequence;
            }
@@ -10186,7 +10156,13 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
   if ((dont_downcase_last || first_binding >= nmaps)
       && t > 0
       && t - 1 == original_uppercase_position)
-    keybuf[t - 1] = original_uppercase;
+    {
+      keybuf[t - 1] = original_uppercase;
+      shift_translated = 0;
+    }
+
+  if (shift_translated)
+    Vthis_command_keys_shift_translated = Qt;
 
   /* Occasionally we fabricate events, perhaps by expanding something
      according to function-key-map, or by adding a prefix symbol to a
@@ -10205,8 +10181,6 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
       add_command_key (keybuf[t]);
     }
 
-
-
   UNGCPRO;
   return t;
 }
@@ -11743,9 +11717,6 @@ syms_of_keyboard ()
 {
   pending_funcalls = Qnil;
 
-  Vpre_help_message = Qnil;
-  staticpro (&Vpre_help_message);
-
   Vlispy_mouse_stem = build_string ("mouse");
   staticpro (&Vlispy_mouse_stem);
 
@@ -12100,6 +12071,14 @@ The command can set this variable; whatever is put here
 will be in `last-command' during the following command.  */);
   Vthis_command = Qnil;
 
+  DEFVAR_LISP ("this-command-keys-shift-translated",
+              &Vthis_command_keys_shift_translated,
+              doc: /* Non-nil if the key sequence activating this command was shift-translated.
+Shift-translation occurs when there is no binding for the key sequence
+as entered, but a binding was found by changing an upper-case letter
+to lower-case, or a shifted function key to an unshifted one.  */);
+  Vthis_command_keys_shift_translated = Qnil;
+
   DEFVAR_LISP ("this-original-command", &Vthis_original_command,
               doc: /* The command bound to the current key sequence before remapping.
 It equals `this-command' if the original command was not remapped through
@@ -12256,6 +12235,8 @@ The command loop sets this to nil before each command,
 and tests the value when the command returns.
 Buffer modification stores t in this variable.  */);
   Vdeactivate_mark = Qnil;
+  Qdeactivate_mark = intern ("deactivate-mark");
+  staticpro (&Qdeactivate_mark);
 
   DEFVAR_LISP ("command-hook-internal", &Vcommand_hook_internal,
               doc: /* Temporary storage of pre-command-hook or post-command-hook.  */);