home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1996 September / Simtel-MSDOS-Sep1996-CD2.iso / disc2 / eel / winconf.e < prev   
Text File  |  1991-03-10  |  4KB  |  127 lines

  1. /************************************************************************
  2. * "Epsilon", "EEL" and "Lugaru" are trademarks of Lugaru Software, Ltd. *
  3. *                                    *
  4. *  Copyright (C) 1989-1990 Lugaru Software Ltd.  All rights reserved.    *
  5. *                                    *
  6. * Limited permission is hereby granted to reproduce and modify this    *
  7. * copyrighted material provided that the resulting code is used only in    *
  8. * conjunction with Lugaru products and that this notice is retained in    *
  9. * any such reproduction or modification.                *
  10. ************************************************************************/
  11.  
  12. #include "eel.h"
  13.  
  14. /* This file demonstrates how to save & restore a particular window
  15. configuration.  It provides two subroutines: do_save_window() saves, and
  16. do_restore_windows() restores, a particular arrangement of windows.
  17. The subroutines don't restore any buffer-to-window mappings, or deal with
  18. the possibility that the screen size may be different now.
  19.  
  20. For testing purposes, it provides two commands save-window and
  21. restore-window, on A-F-1 and A-F-2 respectively.
  22. */
  23.  
  24. #define WINFO_SIZE    200    /* size of char array with window info */
  25.  
  26. #define DEMO
  27. #ifdef DEMO
  28. char window_info[WINFO_SIZE];
  29.  
  30. command save_windows() on reg_tab[FALT(1)]    /* demo commands */
  31. {
  32.     do_save_windows(window_info);
  33.     say("Save as %s", window_info);
  34. }
  35.  
  36. command restore_windows() on reg_tab[FALT(2)]
  37. {
  38.     say("Restore %s", window_info);
  39.     do_restore_windows(window_info);
  40. }
  41. #endif
  42.  
  43. /*
  44. Window configurations are stored in a string as a series of commands,
  45. each consisting of a letter H, V, or G, and a number n.  H or V means
  46. split the current window horizontally or vertically, and make the
  47. size of the child window be n.  G means go to window n.
  48. */
  49.  
  50. do_restore_windows(p)    /* restore window pattern from p */
  51. char *p;
  52. {
  53.     int n, old;
  54.  
  55.     window_one();
  56.     for (; *p; p++) {
  57.         n = strtoi(p + 1, 10);
  58.         switch (*p) {
  59.             case 'V':    old = window_width;
  60.                     window_split(VERTICAL);
  61.                     window_width = old - n;
  62.                     break;
  63.             case 'H':    old = window_height;
  64.                     window_split(HORIZONTAL);
  65.                     window_height = old - n;
  66.                     break;
  67.             case 'G':    window_number = n;
  68.                     break;
  69.         }
  70.     }
  71. }
  72.  
  73. do_save_windows(p)    /* save window configuration in p */
  74. char *p;
  75. {
  76.     int orig = window_number;
  77.  
  78.     *p = 0;
  79.     get_win_info(p, 0, number_of_windows(), 0, screen_cols - 1,
  80.         0, screen_lines - 2);
  81.     p += strlen(p);
  82.     sprintf(p, "G%d", orig);
  83.     window_number = orig;
  84. }
  85.  
  86. /*
  87. Scan range of windows, looking for first that stretches to final column
  88. or line.  That tells whether the first split in the range was horiz or vert.
  89. Next, move forward until past that whole rectangle, then record the first
  90. split in p, and recurse for both subwindows.
  91. */
  92. get_win_info(p, from, to, fcol, lcol, fline, lline)
  93. char *p;
  94. {
  95.     int col, line, hitbot, hitright, w;
  96.  
  97.     if (from >= to)
  98.         return;
  99.     for (w = from; w < to; w++) {
  100.         window_number = w;
  101.         hitright = (lcol == window_edge(HORIZONTAL, BOTTOMRIGHT));
  102.         hitbot = (lline == window_edge(VERTICAL, BOTTOMRIGHT));
  103.         if (hitbot || hitright)
  104.             break;    /* look for top-right or bottom-left corner */
  105.     }            /* of some full-size rectangle */
  106.     if (hitbot && hitright)        /* easy, found bottom-right corner */
  107.         return;
  108.     p += strlen(p);        /* now get past other windows in rect */
  109.     for (w++; w < to; w++) {
  110.         window_number = w;
  111.         col = window_edge(HORIZONTAL, TOPLEFT);
  112.         line = window_edge(VERTICAL, TOPLEFT);
  113.         if (hitbot && fline == line) {
  114.             sprintf(p, "G%dV%d", from, col - fcol);
  115.             get_win_info(p, from, w, fcol, col - 1, fline, lline);
  116.             get_win_info(p, w, to, col, lcol, fline, lline);
  117.             return;
  118.         }
  119.         if (hitright && fcol == col) {
  120.             sprintf(p, "G%dH%d", from, line - fline);
  121.             get_win_info(p, from, w, fcol, lcol, fline, line - 1);
  122.             get_win_info(p, w, to, fcol, lcol, line, lline);
  123.             return;
  124.         }
  125.     }
  126. }
  127.