/*

  screen.h

  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>

  Copyright (C) 1997 - 2000 Pekka Riikonen

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.
  
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

*/

#ifndef SCREEN_H
#define SCREEN_H

typedef struct {
  char *mode;
  char *nickname;
  char *connection;
  char *channel;
  char *channel_mode;
  char *umode;
  int away;
} *SilcScreenBottomLine;

typedef struct {
  /* Status line window top of the screen */
  WINDOW *upper_stat_line;

  /* Output windows */
  WINDOW **output_win;
  WINDOW **output_stat_line;
  SilcUInt32 output_win_count;

  /* Input window at the bottom of the screen */
  WINDOW *input_win;
  unsigned char *input_buffer;
  SilcUInt32 input_pos;
  SilcUInt32 input_end;
  SilcUInt32 cursor_pos;
  int virtual_window;

  /* Bottom line on screen */
  SilcScreenBottomLine bottom_line;

  /* On/off flag for insert */
  int insert;

  /* XXX */
  struct upper_status_line {
    const char *program_name;
    const char *program_version;
  } u_stat_line;

} SilcScreenObject;

typedef SilcScreenObject *SilcScreen;

/* Size of the input window. User can type this many characters into
   the window. After that no more characters may be added into the 
   window. */
#define SILC_SCREEN_INPUT_WIN_SIZE 1024

/* Maximum length of nickaname that will be shown on the screen */
#define SILC_SCREEN_MAX_NICK_LEN 16

/* Maximum length of channel name that will be shown on the screen */
#define SILC_SCREEN_MAX_CHANNEL_LEN 20

/* Maximum length of connection name that will be shown on the screen */
#define SILC_SCREEN_MAX_CONN_LEN 20

/* Maximum length of user mode that will be shown on the screen */
#define SILC_SCREEN_MAX_UMODE_LEN 20

/* Macros */

/* Macro used to insert typed character into the buffer. The character
   is not added at the end of the buffer but somewhere in between. */
#define SILC_SCREEN_INPUT_INSERT(__x, __y, __ch, __end)	\
do {							\
  unsigned char __tmp[SILC_SCREEN_INPUT_WIN_SIZE + 1];	\
  memcpy(__tmp, &(__x)[(__y)], (__end) - (__y));	\
  (__x)[(__y)] = __ch;					\
  memcpy(&(__x)[(__y) + 1], __tmp, (__end) - (__y));	\
} while(0)

/* Macro used to delete character from the buffer. The character
   is not removed from the end of the buffer but somewhere in between. */
#define SILC_SCREEN_INPUT_DELETE(__x, __y, __end)	\
do {							\
  unsigned char __tmp[SILC_SCREEN_INPUT_WIN_SIZE + 1];	\
  memcpy(__tmp, &(__x)[(__y) + 1], (__end));		\
  memset(&(__x)[(__y)], 0, (__end) - (__y) + 1);	\
  memcpy(&(__x)[(__y)], __tmp, strlen(__tmp));		\
} while(0)

/* Prototypes */
SilcScreen silc_screen_init();
WINDOW *silc_screen_create_output_window(SilcScreen screen);
WINDOW *silc_screen_add_output_window(SilcScreen screen);
void silc_screen_create_input_window(SilcScreen screen);
void silc_screen_init_upper_status_line(SilcScreen screen);
void silc_screen_print_upper_stat_line(SilcScreen screen);
void silc_screen_init_output_status_line(SilcScreen screen);
void silc_screen_print_clock(SilcScreen screen);
void silc_screen_print_coordinates(SilcScreen screen, int win_index);
void silc_screen_print_bottom_line(SilcScreen screen, int win_index);
void silc_screen_refresh_all(SilcScreen screen);
void silc_screen_refresh_win(WINDOW *win);
void silc_screen_input_reset(SilcScreen screen);
void silc_screen_input_backspace(SilcScreen screen);
void silc_screen_input_insert(SilcScreen screen);
void silc_screen_input_cursor_right(SilcScreen screen);
void silc_screen_input_cursor_left(SilcScreen screen);
void silc_screen_input_cursor_home(SilcScreen screen);
void silc_screen_input_cursor_end(SilcScreen screen);
void silc_screen_input_print(SilcScreen screen, unsigned char c);
void silc_screen_input_print_prompt(SilcScreen screen, char *prompt);

#endif
