bug-texinfo
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] infokeys, scrolling behavior etc.


From: Sergey Poznyakoff
Subject: Re: [PATCH] infokeys, scrolling behavior etc.
Date: Tue, 17 Jul 2007 19:41:03 +0300

Hello,

Following the feedback by Benno, enclosed is the final version of the
patch.

Karl, is it OK to apply?

Regards,
Sergey

ChangeLog:

2007-07-17  Sergey Poznyakoff <address@hidden>

        * doc/info-stnd.texi: Document cursor-movement-scrolls variable.
        Document different spellings of scroll-behaviour variable.
        * info/info-utils.c (info_references_internal): Initialize
        line_number.
        * info/infodoc.c (info_internal_help_text): Update docstrings
        for move-to-next-xref and move-to-prev-xref.
        * info/session.c (forward_move_node_structure)
        (backward_move_node_structure): Return int
        (cursor_movement_scrolls_p): New variable.
        (info_next_line,info_prev_line,info_forward_char,info_backward_char)
        (info_forward_word,info_backward_word): Scroll through the
        entire document if cursor_movement_scrolls_p is set.
        (info_move_to_xref,info_move_to_prev_xref): Return int
        * info/session.h (cursor_movement_scrolls_p): New variable
        * info/variables.h: Likewise
        * info/variables.c (scroll-behavior): Alias for scroll-behaviour
        (cursor-movement-scrolls): New variable.

Index: doc/info-stnd.texi
===================================================================
RCS file: /cvsroot/texinfo/texinfo/doc/info-stnd.texi,v
retrieving revision 1.14
diff -p -u -r1.14 info-stnd.texi
--- doc/info-stnd.texi  15 Jul 2007 17:34:37 -0000      1.14
+++ doc/info-stnd.texi  17 Jul 2007 16:26:36 -0000
@@ -1860,6 +1860,13 @@ window.  There are exceptions to the aut
 windows @samp{*Completions*} and @samp{*Footnotes*} are @emph{not}
 resized through automatic tiling; they remain their original size.
 
address@hidden
address@hidden cursor-movement-scrolls
+Normally, cursor movement commands (@pxref{Cursor Commands}) stop when
+top or bottom of a node is reached.  When this variable is set to
address@hidden, cursor movement commands act as scrolling ones and their
+behavior is controlled by @code{scroll-behavior} variable (see below).
+
 @item errors-ring-bell
 @vindex errors-ring-bell
 When set to @code{On}, errors cause the bell to ring.  The default
@@ -1890,6 +1897,7 @@ character set is in use, and allows you 
 Info, as well as display them.
 
 @item scroll-behavior
address@hidden scroll-behaviour
 @vindex scroll-behavior
 Control what happens when forward scrolling is requested at the end of
 a node, or when backward scrolling is requested at the beginning of a
@@ -1913,6 +1921,9 @@ Simply give up, changing nothing.  If @c
 viewed.
 @end table
 
+This variable normally affects only scrolling commands.
address@hidden, for information on how to widen its scope.
+
 @item scroll-step
 @vindex scroll-step
 The number of lines to scroll when the cursor moves out of the window.
Index: info/info-utils.c
===================================================================
RCS file: /cvsroot/texinfo/texinfo/info/info-utils.c,v
retrieving revision 1.7
diff -p -u -r1.7 info-utils.c
--- info/info-utils.c   1 Jul 2007 21:20:30 -0000       1.7
+++ info/info-utils.c   17 Jul 2007 16:26:37 -0000
@@ -289,7 +289,8 @@ info_references_internal (char *label, S
       strncpy (entry->label, refdef, offset - 1);
       entry->label[offset - 1] = '\0';
       canonicalize_whitespace (entry->label);
-
+      entry->line_number = 0;
+      
       refdef += offset;
       entry->start = start;
       entry->end = refdef - binding->buffer;
Index: info/infodoc.c
===================================================================
RCS file: /cvsroot/texinfo/texinfo/info/infodoc.c,v
retrieving revision 1.12
diff -p -u -r1.12 infodoc.c
--- info/infodoc.c      1 Jul 2007 21:20:30 -0000       1.12
+++ info/infodoc.c      17 Jul 2007 16:26:37 -0000
@@ -58,12 +58,15 @@ static char *info_internal_help_text[] =
               Picking a menu item causes another node to be selected.\n"),
   N_("\\%-10[xref-item]  Follow a cross reference.  Reads name of 
reference.\n"),
   N_("\\%-10[history-node]  Move to the last node seen in this window.\n"),
-  N_("\\%-10[move-to-next-xref]  Skip to next hypertext link within this 
node.\n"),
-  N_("\\%-10[move-to-prev-xref]  Skip to previous hypertext link within this 
node.\n"),
+  N_("\\%-10[move-to-next-xref]  Skip to next hypertext link [*].\n"),
+  N_("\\%-10[move-to-prev-xref]  Skip to previous hypertext link [*].\n"),
   N_("\\%-10[select-reference-this-line]  Follow the hypertext link under 
cursor.\n"),
   N_("\\%-10[dir-node]  Move to the `directory' node.  Equivalent to 
`\\[goto-node] (DIR)'.\n"),
   N_("\\%-10[top-node]  Move to the Top node.  Equivalent to `\\[goto-node] 
Top'.\n"),
   "\n",
+  N_("[*]    Command acts within this node or the entire document, depending 
on\n"
+     "the value of cursor-movement-scrolls variable\n"),
+  "\n",
   N_("Moving within a node:\n\
 ---------------------\n"),
   N_("\\%-10[beginning-of-node]  Go to the beginning of this node.\n"),
Index: info/session.c
===================================================================
RCS file: /cvsroot/texinfo/texinfo/info/session.c,v
retrieving revision 1.19
diff -p -u -r1.19 session.c
--- info/session.c      1 Jul 2007 21:20:31 -0000       1.19
+++ info/session.c      17 Jul 2007 16:26:37 -0000
@@ -604,8 +604,8 @@ move_to_new_line (int old, int new, WIND
       int goal;
 
       if (new >= window->line_count || new < 0)
-        return;
-
+       return;
+      
       goal = window_get_goal_column (window);
       window->goal_column = goal;
 
@@ -615,6 +615,9 @@ move_to_new_line (int old, int new, WIND
     }
 }
 
+static int forward_move_node_structure (WINDOW *window, int behaviour);
+static int backward_move_node_structure (WINDOW *window, int behaviour);
+
 /* Move WINDOW's point down to the next line if possible. */
 DECLARE_INFO_COMMAND (info_next_line, _("Move down to the next line"))
 {
@@ -623,11 +626,27 @@ DECLARE_INFO_COMMAND (info_next_line, _(
   if (count < 0)
     info_prev_line (window, -count, key);
   else
-    {
-      old_line = window_line_of_point (window);
-      new_line = old_line + count;
-      move_to_new_line (old_line, new_line, window);
-    }
+    while (count)
+      {
+       int diff;
+
+       old_line = window_line_of_point (window);
+       diff = window->line_count - old_line;
+       if (diff > count)
+         diff = count;
+
+       count -= diff;
+       new_line = old_line + diff;
+       if (new_line >= window->line_count
+           && cursor_movement_scrolls_p)
+         {
+           if (forward_move_node_structure (window, info_scroll_behaviour))
+             break;
+           move_to_new_line (0, 0, window);
+         }
+       else
+         move_to_new_line (old_line, new_line, window);
+      }
 }
 
 /* Move WINDOW's point up to the previous line if possible. */
@@ -638,11 +657,31 @@ DECLARE_INFO_COMMAND (info_prev_line, _(
   if (count < 0)
     info_next_line (window, -count, key);
   else
-    {
-      old_line = window_line_of_point (window);
-      new_line = old_line - count;
-      move_to_new_line (old_line, new_line, window);
-    }
+    while (count)
+      {
+       int diff;
+       
+       old_line = window_line_of_point (window);
+       diff = old_line + 1;
+       if (diff > count)
+         diff = count;
+       
+       count -= diff;
+       new_line = old_line - diff;
+       
+       if (new_line < 0
+           && cursor_movement_scrolls_p)
+         {
+           if (backward_move_node_structure (window, info_scroll_behaviour))
+             break;
+           if (window->line_count > window->height)
+             set_window_pagetop (window, window->line_count - window->height);
+           move_to_new_line (window->line_count,
+                             window->line_count - 1, window);
+         }
+       else
+         move_to_new_line (old_line, new_line, window);
+      }
 }
 
 /* Move WINDOW's point to the end of the true line. */
@@ -691,11 +730,27 @@ DECLARE_INFO_COMMAND (info_forward_char,
     info_backward_char (window, -count, key);
   else
     {
-      window->point += count;
-
-      if (window->point >= window->node->nodelen)
-        window->point = window->node->nodelen - 1;
-
+      while (count)
+       {
+         int diff = window->node->nodelen - window->point;
+         
+         if (diff > count)
+           diff = count;
+         window->point += diff;
+         count -= diff;
+         if (window->point >= window->node->nodelen)
+           {
+             if (cursor_movement_scrolls_p
+                 && forward_move_node_structure (window,
+                                                 info_scroll_behaviour) == 0)
+               window->point = 0;
+             else
+               {
+                 window->point = window->node->nodelen - 1;
+                 break;
+               }
+           }
+       }
       info_show_point (window);
     }
 }
@@ -707,11 +762,34 @@ DECLARE_INFO_COMMAND (info_backward_char
     info_forward_char (window, -count, key);
   else
     {
-      window->point -= count;
+      while (count)
+       {
+         int diff = count;
 
-      if (window->point < 0)
-        window->point = 0;
+         if (window->point < diff)
+           diff = window->point + 1;
+         
+         window->point -= diff;
+         count -= diff;
 
+         if (window->point < 0)
+           {
+             if (cursor_movement_scrolls_p
+                 && backward_move_node_structure (window,
+                                                  info_scroll_behaviour) == 0)
+               {
+                 window->point = window->node->nodelen - 1;
+                 if (window->line_count > window->height)
+                   set_window_pagetop (window,
+                                       window->line_count - window->height);
+               }
+             else
+               {
+                 window->point = 0;
+                 break;
+               }
+           }
+       }
       info_show_point (window);
     }
 }
@@ -738,8 +816,19 @@ DECLARE_INFO_COMMAND (info_forward_word,
   while (count)
     {
       if (point + 1 >= end)
-        return;
-
+       {
+         if (cursor_movement_scrolls_p
+             && forward_move_node_structure (window,
+                                             info_scroll_behaviour) == 0)
+           {
+             point = 0;
+             buffer = window->node->contents;
+             end = window->node->nodelen;
+           }
+         else
+           return;
+       }
+      
       /* If we are not in a word, move forward until we are in one.
          Then, move forward until we hit a non-alphabetic character. */
       c = buffer[point];
@@ -754,7 +843,20 @@ DECLARE_INFO_COMMAND (info_forward_word,
             }
         }
 
-      if (point >= end) return;
+      if (point >= end)
+       {
+         if (cursor_movement_scrolls_p
+             && forward_move_node_structure (window,
+                                             info_scroll_behaviour) == 0)
+           {
+             point = 0;
+             buffer = window->node->contents;
+             end = window->node->nodelen;
+           }
+         else
+           return;
+       }
+
 
       while (++point < end)
         {
@@ -786,8 +888,21 @@ DECLARE_INFO_COMMAND (info_backward_word
   while (count)
     {
       if (point == 0)
-        break;
-
+       {
+         if (cursor_movement_scrolls_p
+             && backward_move_node_structure (window,
+                                              info_scroll_behaviour) == 0)
+           {
+             if (window->line_count > window->height)
+               set_window_pagetop (window,
+                                   window->line_count - window->height);
+             buffer = window->node->contents;
+             point = window->node->nodelen;
+           }
+         else
+           break;
+       }
+      
       /* Like info_forward_word (), except that we look at the
          characters just before point. */
 
@@ -835,6 +950,9 @@ char *info_scroll_choices[] = {
   "Continuous", "Next Only", "Page Only", (char *)NULL
 };
 
+/* Controls whether scroll-behavior affects line movement commands */
+int cursor_movement_scrolls_p = 0;
+
 /* Default window sizes for scrolling commands.  */
 int default_window_size = -1;  /* meaning 1 window-full */
 int default_scroll_size = -1;  /* meaning half screen size */
@@ -844,19 +962,22 @@ int default_scroll_size = -1;     /* meaning
                             && !is_dir_name (info_parsed_filename)))
 
 /* Move to 1st menu item, Next, Up/Next, or error in this window. */
-static void
+static int
 forward_move_node_structure (WINDOW *window, int behaviour)
 {
   switch (behaviour)
     {
     case IS_PageOnly:
       info_error ((char *) msg_at_node_bottom, NULL, NULL);
-      break;
+      return 1;
 
     case IS_NextOnly:
       info_next_label_of_node (window->node);
       if (!info_parsed_nodename && !info_parsed_filename)
-        info_error ((char *) msg_no_pointer, (char *) _("Next"), NULL);
+       {
+         info_error ((char *) msg_no_pointer, (char *) _("Next"), NULL);
+         return 1;
+       }
       else
         {
           window_message_in_echo_area ((char *) _("Following Next node..."),
@@ -880,7 +1001,7 @@ forward_move_node_structure (WINDOW *win
               window_message_in_echo_area ((char *) _("Selecting first menu 
item..."),
                   NULL, NULL);
               info_menu_digit (window, 1, '1');
-              return;
+              return 0;
             }
         }
 
@@ -892,7 +1013,7 @@ forward_move_node_structure (WINDOW *win
             window_message_in_echo_area ((char *) _("Selecting Next node..."),
                 NULL, NULL);
             info_handle_pointer ("Next", window);
-            return;
+            return 0;
           }
 
         /* Okay, there wasn't a "Next:" for this node.  Move "Up:" until we
@@ -964,7 +1085,7 @@ forward_move_node_structure (WINDOW *win
                      (void *) (long) up_counter, NULL);
 
                   info_handle_pointer ("Next", window);
-                  return;
+                  return 0;
                 }
               else
                 {
@@ -986,28 +1107,33 @@ forward_move_node_structure (WINDOW *win
                   window->flags |= W_UpdateWindow;
                   info_error ((char *) _("No more nodes within this 
document."),
                       NULL, NULL);
+                 return 1;
                 }
             }
         }
         break;
       }
     }
+  return info_error_was_printed; /*FIXME*/
 }
 
 /* Move Prev, Up or error in WINDOW depending on BEHAVIOUR. */
-static void
+static int
 backward_move_node_structure (WINDOW *window, int behaviour)
 {
   switch (behaviour)
     {
     case IS_PageOnly:
       info_error ((char *) msg_at_node_top, NULL, NULL);
-      break;
+      return 1;
 
     case IS_NextOnly:
       info_prev_label_of_node (window->node);
       if (!info_parsed_nodename && !info_parsed_filename)
-        info_error ((char *) _("No `Prev' for this node."), NULL, NULL);
+       {
+         info_error ((char *) _("No `Prev' for this node."), NULL, NULL);
+         return 1;
+       }
       else
         {
           window_message_in_echo_area ((char *) _("Moving Prev in this 
window."),
@@ -1025,9 +1151,12 @@ backward_move_node_structure (WINDOW *wi
           info_up_label_of_node (window->node);
           if (!info_parsed_nodename && (!info_parsed_filename
                                         || is_dir_name (info_parsed_filename)))
-            info_error ((char *)
-                _("No `Prev' or `Up' for this node within this document."),
-                NULL, NULL);
+           {
+             info_error ((char *)
+                   _("No `Prev' or `Up' for this node within this document."),
+                         NULL, NULL);
+             return 1;
+           }
           else
             {
               window_message_in_echo_area ((char *) _("Moving Up in this 
window."),
@@ -1087,6 +1216,7 @@ backward_move_node_structure (WINDOW *wi
         }
       break;
     }
+  return 0;
 }
 
 /* Move continuously forward through the node structure of this info file. */
@@ -1148,10 +1278,10 @@ _scroll_forward(WINDOW *window, int coun
           /* If there are no more lines to scroll here, error, or get
              another node, depending on BEHAVIOUR. */
           if (desired_top > window->line_count)
-            {
-              forward_move_node_structure (window, behaviour);
-              return;
-            }
+           {
+             forward_move_node_structure (window, behaviour);
+             return;
+           }
         }
       else
         desired_top = window->pagetop + count;
@@ -1185,10 +1315,10 @@ _scroll_backward(WINDOW *window, int cou
           desired_top = window->pagetop - (window->height - 2);
 
           if ((desired_top < 0) && (window->pagetop == 0))
-            {
-              backward_move_node_structure (window, behaviour);
-              return;
-            }
+           {
+             backward_move_node_structure (window, behaviour);
+             return;
+           }
         }
       else
         desired_top = window->pagetop - count;
@@ -4226,7 +4356,7 @@ info_gc_file_buffers (void)
 /* **************************************************************** */
 
 /* Move to the next or previous cross reference in this node. */
-static void
+static int
 info_move_to_xref (WINDOW *window, int count, unsigned char key, int dir)
 {
   long firstmenu, firstxref;
@@ -4270,7 +4400,7 @@ info_move_to_xref (WINDOW *window, int c
   if (firstmenu == -1 && firstxref == -1)
     {
       info_error ((char *) msg_no_xref_node, NULL, NULL);
-      return;
+      return cursor_movement_scrolls_p;
     }
 
   /* There is at least one cross reference or menu entry in this node.
@@ -4317,22 +4447,28 @@ info_move_to_xref (WINDOW *window, int c
      point, choose the first menu or xref entry appearing in this node. */
   if (placement == -1)
     {
-      if (firstmenu != -1 && firstxref != -1)
-        {
-          if (((dir == 1) && (firstmenu < firstxref)) ||
-              ((dir == -1) && (firstmenu > firstxref)))
-            placement = firstmenu + 1;
-          else
-            placement = firstxref;
-        }
-      else if (firstmenu != -1)
-        placement = firstmenu + 1;
+      if (cursor_movement_scrolls_p)
+       return 1;
       else
-        placement = firstxref;
+       {
+         if (firstmenu != -1 && firstxref != -1)
+           {
+             if (((dir == 1) && (firstmenu < firstxref)) ||
+                 ((dir == -1) && (firstmenu > firstxref)))
+               placement = firstmenu + 1;
+             else
+               placement = firstxref;
+           }
+         else if (firstmenu != -1)
+           placement = firstmenu + 1;
+         else
+           placement = firstxref;
+       }
     }
   window->point = placement;
   window_adjust_pagetop (window);
   window->flags |= W_UpdateWindow;
+  return 0;
 }
 
 DECLARE_INFO_COMMAND (info_move_to_prev_xref,
@@ -4341,7 +4477,16 @@ DECLARE_INFO_COMMAND (info_move_to_prev_
   if (count < 0)
     info_move_to_prev_xref (window, -count, key);
   else
-    info_move_to_xref (window, count, key, -1);
+    {
+      while (info_move_to_xref (window, count, key, -1))
+       {
+         info_error_was_printed = 0;
+         if (backward_move_node_structure (window, info_scroll_behaviour))
+           break;
+         move_to_new_line (window->line_count, window->line_count - 1,
+                           window);
+       }
+    }
 }
 
 DECLARE_INFO_COMMAND (info_move_to_next_xref,
@@ -4350,7 +4495,19 @@ DECLARE_INFO_COMMAND (info_move_to_next_
   if (count < 0)
     info_move_to_next_xref (window, -count, key);
   else
-    info_move_to_xref (window, count, key, 1);
+    {
+      /* Note: This can cause some blinking when the next cross reference is
+        located several nodes further. This effect can be easily suppressed
+        by setting display_inhibited to 1, however this will also make
+        error messages to be dumped on stderr, instead on the echo area. */ 
+      while (info_move_to_xref (window, count, key, 1))
+       {
+         info_error_was_printed = 0;
+         if (forward_move_node_structure (window, info_scroll_behaviour))
+           break;
+         move_to_new_line (0, 0, window);
+       }
+    }
 }
 
 /* Select the menu item or reference that appears on this line. */
Index: info/session.h
===================================================================
RCS file: /cvsroot/texinfo/texinfo/info/session.h,v
retrieving revision 1.6
diff -p -u -r1.6 session.h
--- info/session.h      1 Jul 2007 21:20:31 -0000       1.6
+++ info/session.h      17 Jul 2007 16:26:37 -0000
@@ -59,6 +59,8 @@ extern char *info_scroll_choices[];
 #define IS_NextOnly   1 /* Try to get "Next:" menu item. */
 #define IS_PageOnly   2 /* Simply give up at the bottom of a node. */
 
+extern int cursor_movement_scrolls_p;
+
 /* Utility functions found in session.c */
 extern void info_dispatch_on_key (unsigned char key, Keymap map);
 extern unsigned char info_get_input_char (void);
Index: info/variables.c
===================================================================
RCS file: /cvsroot/texinfo/texinfo/info/variables.c,v
retrieving revision 1.6
diff -p -u -r1.6 variables.c
--- info/variables.c    1 Jul 2007 21:20:31 -0000       1.6
+++ info/variables.c    17 Jul 2007 16:26:37 -0000
@@ -60,10 +60,19 @@ VARIABLE_ALIST info_variables[] = {
       N_("Controls what happens when scrolling is requested at the end of a 
node"),
       &info_scroll_behaviour, (char **)info_scroll_choices },
 
+  /* Alternate spelling */
+  { "scroll-behavior",
+      N_("Same as scroll-behaviour"),
+      &info_scroll_behaviour, (char **)info_scroll_choices },
+
   { "scroll-step",
       N_("The number lines to scroll when the cursor moves out of the window"),
       &window_scroll_step, (char **)NULL },
 
+  { "cursor-movement-scrolls",
+    N_("Controls whether scroll-behavior affects cursor movement commands"),
+    &cursor_movement_scrolls_p, (char **)on_off_choices },
+  
   { "ISO-Latin",
       N_("When \"On\", Info accepts and displays ISO Latin characters"),
       &ISO_Latin_p, (char **)on_off_choices },
Index: info/variables.h
===================================================================
RCS file: /cvsroot/texinfo/texinfo/info/variables.h,v
retrieving revision 1.6
diff -p -u -r1.6 variables.h
--- info/variables.h    1 Jul 2007 21:20:31 -0000       1.6
+++ info/variables.h    17 Jul 2007 16:26:37 -0000
@@ -60,6 +60,7 @@ extern int gc_compressed_files;
 extern int show_index_match;
 extern int info_scroll_behaviour;
 extern int window_scroll_step;
+extern int cursor_movement_scrolls_p;
 extern int ISO_Latin_p;
 
 #endif /* not INFO_VARIABLES_H */
        




reply via email to

[Prev in Thread] Current Thread [Next in Thread]