/[LeafOK_CVS]/lbbs/src/screen.c
ViewVC logotype

Diff of /lbbs/src/screen.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.8 by sysadm, Wed Mar 2 16:33:49 2005 UTC Revision 1.20 by sysadm, Tue Jan 3 12:34:54 2006 UTC
# Line 15  Line 15 
15   *                                                                         *   *                                                                         *
16   ***************************************************************************/   ***************************************************************************/
17    
18    #include "bbs.h"
19  #include "common.h"  #include "common.h"
20  #include "io.h"  #include "io.h"
21  #include <sys/types.h>  #include <sys/types.h>
22  #include <sys/stat.h>  #include <sys/stat.h>
23  #include <unistd.h>  #include <unistd.h>
24    
25    #define ACTIVE_BOARD_HEIGHT     8
26    
27  int screen_lines = 24;  int screen_lines = 24;
28    
29  void  void
# Line 59  clrline (int line_begin, int line_end) Line 62  clrline (int line_begin, int line_end)
62  }  }
63    
64  void  void
65    clrtobot (int line_begin)
66    {
67      clrline (line_begin, screen_lines);
68      moveto (line_begin, 0);
69    }
70    
71    void
72  clearscr ()  clearscr ()
73  {  {
74    prints ("\33[2J");    prints ("\33[2J");
# Line 75  press_any_key () Line 85  press_any_key ()
85    prints ("                           \033[1;33m按任意键继续...\033[0;37m");    prints ("                           \033[1;33m按任意键继续...\033[0;37m");
86    iflush ();    iflush ();
87    
88    return igetch ();    return igetch_t (60);
89  }  }
90    
91  void  void
92  set_input_echo(int echo)  set_input_echo (int echo)
93  {  {
   char temp[256];  
   
94    if (echo)    if (echo)
95    {      {
96      outc ('\x83'); // ASCII code 131        outc ('\x83');            // ASCII code 131
97      iflush ();        iflush ();
98    }      }
99    else    else
100    {      {
101  //    outc ('\x85'); // ASCII code 133  //    outc ('\x85'); // ASCII code 133
102      prints ("\xff\xfb\x01\xff\xfb\x03");        prints ("\xff\xfb\x01\xff\xfb\x03");
103      iflush ();        iflush ();
104      igetch ();        igetch_t (60);
105      igetch ();        igetch_t (60);
106    }      }
107  }  }
108    
109  int  int
110  str_input (char *buffer, int buffer_length, int echo_mode)  _str_input (char *buffer, int buffer_length, int echo_mode)
111  {  {
112    char buf[256], ch;    char buf[256], ch;
113    int c, offset = 0, len, loop = 1, i, hz = 0;    int c, offset = 0, len, loop = 1, i, hz = 0;
114    
115    memset (buffer, '\0', buffer_length);    for (i=0; i<buffer_length && buffer[i] != '\0'; i++)
116        {
117              offset++;
118        }
119    
120    while (c = igetch ())    while (c = igetch_t (60))
121      {      {
122        if (c == CR)        if (c == KEY_NULL || c == KEY_TIMEOUT || c == CR)
123          break;          break;
124        if (c == LF)        if (c == LF)
125          continue;          continue;
126        if (c == BACKSPACE)        if (c == BACKSPACE)
127          {          {
128            if (offset > 0)            if (offset > 0)
# Line 140  str_input (char *buffer, int buffer_leng Line 151  str_input (char *buffer, int buffer_leng
151        buffer[offset] = '\0';        buffer[offset] = '\0';
152        switch (echo_mode)        switch (echo_mode)
153          {          {
154          case 0:          case DOECHO:
155            outc ((char) c);            outc ((char) c);
156            break;            break;
157          case 1:          case NOECHO:
158            outc ('*');            outc ('*');
159            break;            break;
160          }          }
# Line 160  str_input (char *buffer, int buffer_leng Line 171  str_input (char *buffer, int buffer_leng
171  }  }
172    
173  int  int
174    str_input (char *buffer, int buffer_length, int echo_mode)
175    {
176      int offset;
177      
178      memset (buffer, '\0', buffer_length);
179      
180      offset = _str_input (buffer, buffer_length, echo_mode);
181      
182      return offset;
183    };
184    
185    int
186    get_data (int row, int col, char *prompt, char *buffer, int buffer_length, int echo_mode)
187    {
188      int len;
189    
190      moveto (row, col);
191      iflush ();
192      prints (prompt);
193      prints (buffer);
194      iflush ();
195    
196      len = _str_input (buffer, buffer_length, echo_mode);
197      
198      return len;
199    }
200    
201    int
202  display_file (const char *filename)  display_file (const char *filename)
203  {  {
204    char buffer[260];    char buffer[260];
205    FILE *fin;    FILE *fin;
206    int i;    int i;
207    
208    if ((fin = fopen (filename, "r")) != NULL)    if ((fin = fopen (filename, "r")) == NULL)
209    {      {
210      while (fgets (buffer, 255, fin))        return -1;
211        {      }
212          i = strlen (buffer);  
213          if (buffer[i - 1] == '\n' && buffer[i - 2] != '\r')    while (fgets (buffer, 255, fin))
214            {      {
215              buffer[i - 1] = '\r';        i = strlen (buffer);
216              buffer[i] = '\n';        if (buffer[i - 1] == '\n' && buffer[i - 2] != '\r')
217              buffer[i + 1] = '\0';          {
218            }            buffer[i - 1] = '\r';
219          prints (buffer);            buffer[i] = '\n';
220          iflush ();            buffer[i + 1] = '\0';
221        }          }
222      fclose(fin);        prints (buffer);
223      return 0;        iflush ();
224    }      }
225        fclose (fin);
226    return -1;  
227      return 0;
228  }  }
229    
230  int  int
231  display_file_ex (const char *filename, int begin_line, int wait)  display_file_ex (const char *filename, int begin_line, int wait)
232  {  {
233    char buffer[260], temp[256];    char buffer[260], temp[256];
234    int i, ch, input_ok;    int i, ch, input_ok, max_lines;
235    long int line, c_line_begin = 0, c_line_total=0;    long int line, c_line_begin = 0, c_line_total = 0;
236    long int f_line, f_size, f_offset;    long int f_line, f_size, f_offset;
237    FILE *fin;    FILE *fin;
238    struct stat f_stat;    struct stat f_stat;
239    
240      max_lines = screen_lines - 1;
241    clrline (begin_line, screen_lines);    clrline (begin_line, screen_lines);
242    line = begin_line;    line = begin_line;
243    moveto (line, 0);    moveto (line, 0);
# Line 211  display_file_ex (const char *filename, i Line 252  display_file_ex (const char *filename, i
252        f_size = f_stat.st_size;        f_size = f_stat.st_size;
253    
254        while (fgets (buffer, 255, fin))        while (fgets (buffer, 255, fin))
255          c_line_total ++;          c_line_total++;
256        rewind (fin);        rewind (fin);
257    
258        while (fgets (buffer, 255, fin))        while (fgets (buffer, 255, fin))
259          {          {
260            if (line >= screen_lines)            if (line >= max_lines)
261              {              {
262                f_offset = ftell (fin);                f_offset = ftell (fin);
263    
264                moveto (screen_lines, 0);                moveto (screen_lines, 0);
265                prints                prints
266                  ("\033[1;44;32m下面还有喔 (%d%%)\033[33m   │ 结束 ← <q> │ ↑/↓/PgUp/PgDn 移动 │ ? 辅助说明 │     \033[m",                  ("\033[1;44;32m下面还有喔 (%d%%)\033[33m   │ 结束 ← <q> │ ↑/↓/PgUp/PgDn 移动 │ ? 辅助说明 │     \033[m",
267                   (f_offset-strlen(buffer)) * 100 / f_size);                   (f_offset - strlen (buffer)) * 100 / f_size);
268                iflush ();                iflush ();
269    
270                input_ok = 0;                input_ok = 0;
271                while (!input_ok)                while (!input_ok)
272                  {                  {
273                    ch = igetch ();                    ch = igetch_t (MAX_DELAY_TIME);
274                    input_ok = 1;                    input_ok = 1;
275                    switch (ch)                    switch (ch)
276                      {                      {
# Line 262  display_file_ex (const char *filename, i Line 303  display_file_ex (const char *filename, i
303                      case KEY_PGUP:                      case KEY_PGUP:
304                      case Ctrl ('B'):                      case Ctrl ('B'):
305                        if (c_line_begin > 0)                        if (c_line_begin > 0)
306                          c_line_begin -= (screen_lines - begin_line - 1);                          c_line_begin -= (max_lines - begin_line - 1);
307                        else                        else
308                          goto exit;                          goto exit;
309                        if (c_line_begin < 0)                        if (c_line_begin < 0)
# Line 275  display_file_ex (const char *filename, i Line 316  display_file_ex (const char *filename, i
316                          }                          }
317                        break;                        break;
318                      case KEY_RIGHT:                      case KEY_RIGHT:
319                      case KEY_PGDOWN:                      case KEY_PGDN:
320                      case Ctrl ('F'):                      case Ctrl ('F'):
321                      case KEY_SPACE:                      case KEY_SPACE:
322                        c_line_begin += (screen_lines - begin_line - 1);                        c_line_begin += (max_lines - begin_line - 1);
323                        if (c_line_begin + (screen_lines - begin_line) > c_line_total)                        if (c_line_begin + (max_lines - begin_line) >
324                          c_line_begin = c_line_total - (screen_lines - begin_line);                            c_line_total)
325                            c_line_begin =
326                              c_line_total - (max_lines - begin_line);
327                        rewind (fin);                        rewind (fin);
328                        for (f_line = 0; f_line < c_line_begin; f_line++)                        for (f_line = 0; f_line < c_line_begin; f_line++)
329                          {                          {
# Line 288  display_file_ex (const char *filename, i Line 331  display_file_ex (const char *filename, i
331                              goto exit;                              goto exit;
332                          }                          }
333                        break;                        break;
334                        case KEY_NULL:
335                        case KEY_TIMEOUT:
336                      case KEY_LEFT:                      case KEY_LEFT:
337                      case 'q':                      case 'q':
338                      case 'Q':                      case 'Q':
# Line 335  display_file_ex (const char *filename, i Line 380  display_file_ex (const char *filename, i
380            line++;            line++;
381          }          }
382        if (wait)        if (wait)
383          ch = press_any_key();          ch = press_any_key ();
384        else        else
385          ch = 0;          ch = 0;
386    
387      exit:      exit:
388        fclose (fin);        fclose (fin);
# Line 347  display_file_ex (const char *filename, i Line 392  display_file_ex (const char *filename, i
392    
393    return -1;    return -1;
394  }  }
395    
396    int
397    show_top (char *status)
398    {
399      char buffer[256];
400    
401      str_space (buffer, 20 - strlen (BBS_current_section_name));
402    
403      moveto (1, 0);
404      prints ("\033[1;44;33m%-20s \033[37m%20s"
405              "         %s\033[33m讨论区 [%s]\033[m",
406              status, BBS_name, buffer, BBS_current_section_name);
407      iflush ();
408    
409      return 0;
410    }
411    
412    int
413    show_bottom (char *msg)
414    {
415      char str_time[256], str_time_onine[20], buffer[256];
416      time_t time_online;
417      struct tm *tm_online;
418    
419      get_time_str (str_time, 256);
420      str_space (buffer, 33 - strlen (BBS_username));
421    
422      time_online = time (0) - BBS_login_tm;
423      tm_online = gmtime (&time_online);
424    
425      moveto (screen_lines, 0);
426      prints ("\033[1;44;33m[\033[36m%s\033[33m]"
427              "%s帐号[\033[36m%s\033[33m]"
428              "[\033[36m%1d\033[33m:\033[36m%2d\033[33m:\033[36m%2d\033[33m]\033[m",
429              str_time, buffer, BBS_username, tm_online->tm_mday - 1,
430              tm_online->tm_hour, tm_online->tm_min);
431      iflush ();
432    
433      return 0;
434    }
435    
436    int
437    show_active_board ()
438    {
439      char filename[256], buffer[260];
440      FILE *fin;
441      int i, j;
442      static long int line;
443    
444      sprintf (filename, "%sdata/active_board.txt", app_home_dir);
445    
446      clrline (3, 2 + ACTIVE_BOARD_HEIGHT);
447    
448      moveto (3, 0);
449    
450      if ((fin = fopen (filename, "r")) != NULL)
451        {
452          for (j = 0; j < line; j++)
453            {
454              if (fgets (buffer, 255, fin) == NULL)
455                {
456                  line = 0;
457                  rewind (fin);
458                  break;
459                }
460            }
461    
462          for (j = 0; j < ACTIVE_BOARD_HEIGHT; j++)
463            {
464              if (fgets (buffer, 255, fin) == NULL)
465                {
466                  line = 0;
467                  if (j == 0)
468                    {
469                      rewind (fin);
470                      if (fgets (buffer, 255, fin) == NULL)
471                        {
472                          break;
473                        }
474                    }
475                  else
476                    {
477                      break;
478                    }
479                }
480              line++;
481              i = strlen (buffer);
482              if (buffer[i - 1] == '\n' && buffer[i - 2] != '\r')
483                {
484                  buffer[i - 1] = '\r';
485                  buffer[i] = '\n';
486                  buffer[i + 1] = '\0';
487                }
488              prints (buffer);
489              iflush ();
490            }
491          fclose (fin);
492        }
493    
494      return 0;
495    }


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1