/[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.36 by sysadm, Tue May 6 05:31:26 2025 UTC Revision 1.43 by sysadm, Sat May 10 14:37:04 2025 UTC
# Line 22  Line 22 
22  #include "screen.h"  #include "screen.h"
23  #include <string.h>  #include <string.h>
24  #include <ctype.h>  #include <ctype.h>
 #include <sys/types.h>  
 #include <sys/stat.h>  
25  #include <unistd.h>  #include <unistd.h>
26  #include <stdlib.h>  #include <stdlib.h>
27    #include <sys/types.h>
28    #include <sys/stat.h>
29    #include <sys/param.h>
30    
31  #define ACTIVE_BOARD_HEIGHT 8  #define ACTIVE_BOARD_HEIGHT 8
32    
# Line 81  int press_any_key() Line 82  int press_any_key()
82          prints("                           \033[1;33m按任意键继续...\033[0;37m");          prints("                           \033[1;33m按任意键继续...\033[0;37m");
83          iflush();          iflush();
84    
85          return igetch_t(60);          return igetch_t(MIN(MAX_DELAY_TIME, 60));
86  }  }
87    
88  void set_input_echo(int echo)  void set_input_echo(int echo)
# Line 101  void set_input_echo(int echo) Line 102  void set_input_echo(int echo)
102          }          }
103  }  }
104    
105  static int _str_input(char *buffer, int buffer_length, int echo_mode)  static int _str_input(char *buffer, int buf_size, int echo_mode)
106  {  {
107          int c, offset = 0, i, hz = 0;          int c;
108            int offset = 0;
109            int hz = 0;
110    
111          for (i = 0; i < buffer_length && buffer[i] != '\0'; i++)          buffer[buf_size - 1] = '\0';
112          {          for (offset = 0; offset < buf_size - 1 && buffer[offset] != '\0'; offset++)
113                  offset++;                  ;
         }  
114    
115          while ((c = igetch_t(60)))          while ((c = igetch_t(MIN(MAX_DELAY_TIME, 60))))
116          {          {
117                  if (c == KEY_NULL || c == KEY_TIMEOUT || c == CR)                  if (c == CR)
118                  {                  {
119                          igetch(1); // Cleanup remaining '\n' in the buffer                          igetch(1); // Cleanup remaining '\n' in the buffer
120                          break;                          break;
121                  }                  }
122                  if (c == LF)                  else if (c == KEY_TIMEOUT)
123                    {
124                            return -1;
125                    }
126                    else if (c == KEY_NULL || c == LF)
127                  {                  {
128                          continue;                          continue;
129                  }                  }
130                  if (c == BACKSPACE)                  else if (c == BACKSPACE)
131                  {                  {
132                          if (offset > 0)                          if (offset > 0)
133                          {                          {
# Line 142  static int _str_input(char *buffer, int Line 148  static int _str_input(char *buffer, int
148                          }                          }
149                          continue;                          continue;
150                  }                  }
151                  if (c > 255 || iscntrl(c))                  else if (c > 255 || iscntrl(c))
152                  {                  {
153                          continue;                          continue;
154                  }                  }
155                  if (c > 127 && c <= 255)                  else if (c > 127 && c <= 255)
156                  {                  {
157                          if (!hz && offset + 2 > buffer_length) // No enough space for Chinese character                          if (!hz && offset + 2 > buf_size - 1) // No enough space for Chinese character
158                          {                          {
159                                  igetch(1); // Cleanup remaining input                                  igetch(1); // Cleanup remaining input
160                                  outc('\a');                                  outc('\a');
# Line 157  static int _str_input(char *buffer, int Line 163  static int _str_input(char *buffer, int
163                          }                          }
164                          hz = (!hz);                          hz = (!hz);
165                  }                  }
166                  if (offset >= buffer_length)  
167                    if (offset + 1 > buf_size - 1)
168                  {                  {
169                          outc('\a');                          outc('\a');
170                          iflush();                          iflush();
171                          continue;                          continue;
172                  }                  }
173    
174                  buffer[offset++] = (char)c;                  buffer[offset++] = (char)c;
175                  buffer[offset] = '\0';                  buffer[offset] = '\0';
176    
177                  switch (echo_mode)                  switch (echo_mode)
178                  {                  {
179                  case DOECHO:                  case DOECHO:
# Line 183  static int _str_input(char *buffer, int Line 192  static int _str_input(char *buffer, int
192          return offset;          return offset;
193  }  }
194    
195  int str_input(char *buffer, int buffer_length, int echo_mode)  int str_input(char *buffer, int buf_size, int echo_mode)
196  {  {
197          int len;          int len;
198    
199          buffer[0] = '\0';          buffer[0] = '\0';
200    
201          len = _str_input(buffer, buffer_length, echo_mode);          len = _str_input(buffer, buf_size, echo_mode);
202    
203          prints("\r\n");          prints("\r\n");
204          iflush();          iflush();
# Line 197  int str_input(char *buffer, int buffer_l Line 206  int str_input(char *buffer, int buffer_l
206          return len;          return len;
207  };  };
208    
209  int get_data(int row, int col, char *prompt, char *buffer, int buffer_length, int echo_mode)  int get_data(int row, int col, char *prompt, char *buffer, int buf_size, int echo_mode)
210  {  {
211          int len;          int len;
212    
# Line 208  int get_data(int row, int col, char *pro Line 217  int get_data(int row, int col, char *pro
217          prints(buffer);          prints(buffer);
218          iflush();          iflush();
219    
220          len = _str_input(buffer, buffer_length, echo_mode);          len = _str_input(buffer, buf_size, echo_mode);
221    
222          return len;          return len;
223  }  }
# Line 243  int display_file(const char *filename) Line 252  int display_file(const char *filename)
252    
253  int display_file_ex(const char *filename, int begin_line, int wait)  int display_file_ex(const char *filename, int begin_line, int wait)
254  {  {
255            static int show_help = 1;
256          char buffer[LINE_BUFFER_LEN];          char buffer[LINE_BUFFER_LEN];
257          int ch = 0;          int ch = 0;
258          int input_ok, line, max_lines;          int input_ok, line, max_lines;
# Line 297  int display_file_ex(const char *filename Line 307  int display_file_ex(const char *filename
307                          }                          }
308    
309                          moveto(screen_rows, 0);                          moveto(screen_rows, 0);
310                          prints("\033[1;44;32m%s (%d%%)%s\033[33m  │ 结束 ← <q> │ ↑/↓/PgUp/PgDn 移动 │ ? 辅助说明 │     \033[m",                          prints("\033[1;44;32m%s (%d%%)%s\033[33m          │ 结束 ← <q> │ ↑/↓/PgUp/PgDn 移动 │ ? 辅助说明 │     \033[m",
311                                     (percentile < 100 ? "下面还有喔" : "没有更多了"), percentile,                                     (percentile < 100 ? "下面还有喔" : "没有更多了"), percentile,
312                                     (percentile < 10 ? "  " : (percentile < 100 ? " " : "")));                                     (percentile < 10 ? "  " : (percentile < 100 ? " " : "")));
313                          iflush();                          iflush();
# Line 309  int display_file_ex(const char *filename Line 319  int display_file_ex(const char *filename
319                                  input_ok = 1;                                  input_ok = 1;
320                                  switch (ch)                                  switch (ch)
321                                  {                                  {
322                                    case KEY_TIMEOUT:
323                                            goto cleanup;
324                                  case KEY_UP:                                  case KEY_UP:
325                                          if (c_line_current - line < 0) // Reach top                                          if (c_line_current - line < 0) // Reach top
326                                          {                                          {
# Line 316  int display_file_ex(const char *filename Line 328  int display_file_ex(const char *filename
328                                          }                                          }
329                                          c_line_current -= line;                                          c_line_current -= line;
330                                          line = begin_line;                                          line = begin_line;
331                                          max_lines = begin_line + 1;                                          // max_lines = begin_line + 1;
332                                          prints("\033[T"); // Scroll down 1 line                                          // prints("\033[T"); // Scroll down 1 line
333                                          // max_lines = screen_rows - 1; // Legacy Fterm only works with this line                                          max_lines = screen_rows - 1; // Legacy Fterm only works with this line
334                                          break;                                          break;
335                                  case KEY_DOWN:                                  case KEY_DOWN:
336                                  case CR:                                  case CR:
# Line 365  int display_file_ex(const char *filename Line 377  int display_file_ex(const char *filename
377                                          max_lines = screen_rows - 1;                                          max_lines = screen_rows - 1;
378                                          clrline(begin_line, screen_rows);                                          clrline(begin_line, screen_rows);
379                                          break;                                          break;
                                 case KEY_NULL:  
                                 case KEY_TIMEOUT:  
380                                  case KEY_LEFT:                                  case KEY_LEFT:
381                                  case 'q':                                  case 'q':
382                                  case 'Q':                                  case 'Q':
# Line 375  int display_file_ex(const char *filename Line 385  int display_file_ex(const char *filename
385                                  case '?':                                  case '?':
386                                  case 'h':                                  case 'h':
387                                  case 'H':                                  case 'H':
388                                            if (!show_help)
389                                            {
390                                                    break;
391                                            }
392    
393                                          // Display help information                                          // Display help information
394                                            show_help = 0;
395                                          display_file_ex(DATA_READ_HELP, begin_line, 1);                                          display_file_ex(DATA_READ_HELP, begin_line, 1);
396                                            show_help = 1;
397    
398                                          // Refresh after display help information                                          // Refresh after display help information
399                                          c_line_current -= (line - 1);                                          c_line_current -= (line - 1);
# Line 388  int display_file_ex(const char *filename Line 405  int display_file_ex(const char *filename
405                                          input_ok = 0;                                          input_ok = 0;
406                                          break;                                          break;
407                                  }                                  }
408    
409                                    BBS_last_access_tm = time(0);
410                          }                          }
411    
412                          continue;                          continue;
# Line 412  int display_file_ex(const char *filename Line 431  int display_file_ex(const char *filename
431                  line++;                  line++;
432          }          }
433    
434    cleanup:
435          free(p_line_offsets);          free(p_line_offsets);
436          fclose(fin);          fclose(fin);
437    
# Line 420  int display_file_ex(const char *filename Line 440  int display_file_ex(const char *filename
440    
441  int show_top(char *status)  int show_top(char *status)
442  {  {
443          char buffer[LINE_BUFFER_LEN];          int end_of_line;
444            int display_len;
445            unsigned int len;
446    
447          str_space(buffer, 20 - (int)strnlen(BBS_current_section_name, sizeof(BBS_current_section_name)));          char space1[LINE_BUFFER_LEN];
448            char space2[LINE_BUFFER_LEN];
449    
450            len = split_line(status, 20, &end_of_line, &display_len);
451            if (end_of_line)
452            {
453                    status[len] = '\0';
454            }
455            str_space(space1, 31 - display_len);
456    
457            len = split_line(BBS_current_section_name, 20, &end_of_line, &display_len);
458            if (end_of_line)
459            {
460                    status[len] = '\0';
461            }
462            str_space(space2, 30 - display_len);
463    
464          moveto(1, 0);          moveto(1, 0);
465          clrtoeol();          clrtoeol();
466          prints("\033[1;44;33m%-20s \033[37m%20s"          prints("\033[1;44;33m%s \033[37m%s%s%s\033[33m 讨论区 [%s]\033[m",
467                     "         %s\033[33m讨论区 [%s]\033[m",                     status, space1, BBS_name, space2, BBS_current_section_name);
                    status, BBS_name, buffer, BBS_current_section_name);  
468          iflush();          iflush();
469    
470          return 0;          return 0;
# Line 437  int show_top(char *status) Line 473  int show_top(char *status)
473  int show_bottom(char *msg)  int show_bottom(char *msg)
474  {  {
475          char str_time[LINE_BUFFER_LEN];          char str_time[LINE_BUFFER_LEN];
476          char buffer[LINE_BUFFER_LEN];          char space[LINE_BUFFER_LEN];
477          time_t time_online;          time_t time_online;
478          struct tm *tm_online;          struct tm *tm_online;
479    
480          get_time_str(str_time, sizeof(str_time));          get_time_str(str_time, sizeof(str_time));
481          str_space(buffer, 33 - (int)strnlen(BBS_username, sizeof(BBS_username)));          str_space(space, 34 - (int)strnlen(BBS_username, sizeof(BBS_username)));
482    
483          time_online = time(0) - BBS_login_tm;          time_online = time(0) - BBS_login_tm;
484          tm_online = gmtime(&time_online);          tm_online = gmtime(&time_online);
485    
486          moveto(screen_rows, 0);          moveto(screen_rows, 0);
487          clrtoeol();          clrtoeol();
488          prints("\033[1;44;33m[\033[36m%s\033[33m]"          prints("\033[1;44;33m[\033[36m%s\033[33m]%s帐号[\033[36m%s\033[33m]"
                    "%s帐号[\033[36m%s\033[33m]"  
489                     "[\033[36m%1d\033[33m:\033[36m%2d\033[33m:\033[36m%2d\033[33m]\033[m",                     "[\033[36m%1d\033[33m:\033[36m%2d\033[33m:\033[36m%2d\033[33m]\033[m",
490                     str_time, buffer, BBS_username, tm_online->tm_mday - 1,                     str_time, space, BBS_username, tm_online->tm_mday - 1,
491                     tm_online->tm_hour, tm_online->tm_min);                     tm_online->tm_hour, tm_online->tm_min);
492          iflush();          iflush();
493    
# Line 467  int show_active_board() Line 502  int show_active_board()
502          static int line;          static int line;
503          unsigned int len;          unsigned int len;
504          int end_of_line;          int end_of_line;
505            int display_len;
506    
507          clrline(3, 2 + ACTIVE_BOARD_HEIGHT);          clrline(3, 2 + ACTIVE_BOARD_HEIGHT);
508    
# Line 494  int show_active_board() Line 530  int show_active_board()
530                          break;                          break;
531                  }                  }
532                  line++;                  line++;
533                  len = split_line(buffer, screen_cols, &end_of_line);                  len = split_line(buffer, screen_cols, &end_of_line, &display_len);
534                  buffer[len] = '\0'; // Truncate over-length line                  buffer[len] = '\0'; // Truncate over-length line
535                  moveto(3 + i, 0);                  moveto(3 + i, 0);
536                  prints("%s", buffer);                  prints("%s", buffer);


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

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