home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / OS2 / gnuinfo.zip / info / m-x.c < prev    next >
C/C++ Source or Header  |  1997-07-24  |  5KB  |  191 lines

  1. /* m-x.c -- Meta-X minibuffer reader.
  2.    $Id: m-x.c,v 1.5 1997/07/24 21:28:00 karl Exp $
  3.  
  4.    Copyright (C) 1993, 97 Free Software Foundation, Inc.
  5.  
  6.    This program is free software; you can redistribute it and/or modify
  7.    it under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 2, or (at your option)
  9.    any later version.
  10.  
  11.    This program is distributed in the hope that it will be useful,
  12.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with this program; if not, write to the Free Software
  18.    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19.  
  20.    Written by Brian Fox (bfox@ai.mit.edu). */
  21.  
  22. #include "info.h"
  23.  
  24. /* **************************************************************** */
  25. /*                                                                  */
  26. /*                     Reading Named Commands                       */
  27. /*                                                                  */
  28. /* **************************************************************** */
  29.  
  30. /* Read the name of an Info function in the echo area and return the
  31.    name.  A return value of NULL indicates that no function name could
  32.    be read. */
  33. char *
  34. read_function_name (prompt, window)
  35.      char *prompt;
  36.      WINDOW *window;
  37. {
  38.   register int i;
  39.   char *line;
  40.   REFERENCE **array = (REFERENCE **)NULL;
  41.   int array_index = 0, array_slots = 0;
  42.  
  43.   /* Make an array of REFERENCE which actually contains the names of
  44.      the functions available in Info. */
  45.   for (i = 0; function_doc_array[i].func; i++)
  46.     {
  47.       REFERENCE *entry;
  48.  
  49.       entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
  50.       entry->label = xstrdup (function_doc_array[i].func_name);
  51.       entry->nodename = (char *)NULL;
  52.       entry->filename = (char *)NULL;
  53.  
  54.       add_pointer_to_array
  55.         (entry, array_index, array, array_slots, 200, REFERENCE *);
  56.     }
  57.  
  58.   line = info_read_completing_in_echo_area (window, prompt, array);
  59.  
  60.   info_free_references (array);
  61.  
  62.   if (!echo_area_is_active)
  63.     window_clear_echo_area ();
  64.  
  65.   return (line);
  66. }
  67.  
  68. DECLARE_INFO_COMMAND (describe_command,
  69.    _("Read the name of an Info command and describe it"))
  70. {
  71.   char *line;
  72.  
  73.   line = read_function_name (_("Describe command: "), window);
  74.  
  75.   if (!line)
  76.     {
  77.       info_abort_key (active_window, count, key);
  78.       return;
  79.     }
  80.  
  81.   /* Describe the function named in "LINE". */
  82.   if (*line)
  83.     {
  84.       VFunction *fun = named_function (line);
  85.  
  86.       if (!fun)
  87.         return;
  88.  
  89.       window_message_in_echo_area ("%s: %s.",
  90.                                    line, function_documentation (fun));
  91.     }
  92.   free (line);
  93. }
  94.  
  95. DECLARE_INFO_COMMAND (info_execute_command,
  96.    _("Read a command name in the echo area and execute it"))
  97. {
  98.   char *line;
  99.  
  100.   /* Ask the completer to read a reference for us. */
  101.   if (info_explicit_arg || count != 1)
  102.     {
  103.       char *prompt;
  104.  
  105.       prompt = (char *)xmalloc (20);
  106.       sprintf (prompt, "%d M-x ", count);
  107.       line = read_function_name (prompt, window);
  108.     }
  109.   else
  110.     line = read_function_name ("M-x ", window);
  111.  
  112.   /* User aborted? */
  113.   if (!line)
  114.     {
  115.       info_abort_key (active_window, count, key);
  116.       return;
  117.     }
  118.  
  119.   /* User accepted "default"?  (There is none.) */
  120.   if (!*line)
  121.     {
  122.       free (line);
  123.       return;
  124.     }
  125.  
  126.   /* User wants to execute a named command.  Do it. */
  127.   {
  128.     VFunction *function;
  129.  
  130.     if ((active_window != the_echo_area) &&
  131.         (strncmp (line, "echo-area-", 10) == 0))
  132.       {
  133.         free (line);
  134.         info_error (_("Cannot execute an `echo-area' command here."));
  135.         return;
  136.       }
  137.  
  138.     function = named_function (line);
  139.     free (line);
  140.  
  141.     if (!function)
  142.       return;
  143.  
  144.     (*function) (active_window, count, 0);
  145.   }
  146. }
  147.  
  148. /* Okay, now that we have M-x, let the user set the screen height. */
  149. DECLARE_INFO_COMMAND (set_screen_height,
  150.   _("Set the height of the displayed window"))
  151. {
  152.   int new_height;
  153.  
  154.   if (info_explicit_arg || count != 1)
  155.     new_height = count;
  156.   else
  157.     {
  158.       char prompt[80];
  159.       char *line;
  160.  
  161.       new_height = screenheight;
  162.  
  163.       sprintf (prompt, _("Set screen height to (%d): "), new_height);
  164.  
  165.       line = info_read_in_echo_area (window, prompt);
  166.  
  167.       /* If the user aborted, do that now. */
  168.       if (!line)
  169.         {
  170.           info_abort_key (active_window, count, 0);
  171.           return;
  172.         }
  173.  
  174.       /* Find out what the new height is supposed to be. */
  175.       if (*line)
  176.         new_height = atoi (line);
  177.  
  178.       /* Clear the echo area if it isn't active. */
  179.       if (!echo_area_is_active)
  180.         window_clear_echo_area ();
  181.  
  182.       free (line);
  183.     }
  184.  
  185.   terminal_clear_screen ();
  186.   display_clear_display (the_display);
  187.   screenheight = new_height;
  188.   display_initialize_display (screenwidth, screenheight);
  189.   window_new_screen_size (screenwidth, screenheight);
  190. }
  191.