diff --git a/profanity.c b/profanity.c index 98331039..409bd801 100644 --- a/profanity.c +++ b/profanity.c @@ -12,13 +12,11 @@ extern FILE *logp; // area for log message in profanity static const char *prof = "prof"; -// chat windows -static WINDOW *incoming_border; -static WINDOW *outgoing_border; -static WINDOW *incoming; -static WINDOW *outgoing; -static int incoming_ypos = 0; -static int inc_scroll_max = 0; +// static windows +static WINDOW *title_bar; +static WINDOW *cmd_bar; +static WINDOW *cmd_win; +static WINDOW *main_win; // message handlers int in_message_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, @@ -34,18 +32,14 @@ void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status, // curses functions void init(void); -void print_title(void); -void close(void); - -WINDOW *create_win(int, int, int, int, int); -void create_conversation(void); +void create_title_bar(void); +void create_command_bar(void); +void create_command_window(void); +void create_main_window(void); int main(void) { - int ypos = 2; - int xpos = 2; - char user[50]; - char passwd[50]; + char cmd[50]; xmpp_ctx_t *ctx; xmpp_conn_t *conn; @@ -54,51 +48,83 @@ int main(void) logp = fopen("profanity.log", "a"); logmsg(prof, "Starting Profanity..."); + // initialise curses init(); - print_title(); - ypos += 2; - mvprintw(ypos, xpos, "Enter jabber ID (username@host) : "); - echo(); - getstr(user); - - ypos += 2; - mvprintw(ypos, xpos, "Enter passwd : "); - noecho(); - getstr(passwd); - echo(); - - char loginmsg[100]; - sprintf(loginmsg, "User <%s> logged in", user); - logmsg(prof, loginmsg); - //fprintf(logp, "Log in, user = %s\n", user); - - xmpp_initialize(); - - log = xmpp_get_file_logger(); - ctx = xmpp_ctx_new(NULL, log); - conn = xmpp_conn_new(ctx); - - xmpp_conn_set_jid(conn, user); - xmpp_conn_set_pass(conn, passwd); - - xmpp_connect_client(conn, NULL, 0, conn_handler, ctx); - - clear(); - print_title(); refresh(); - move(3, 0); + + // create windows + create_title_bar(); + wrefresh(title_bar); + create_command_bar(); + wrefresh(cmd_bar); + create_command_window(); + wrefresh(cmd_win); + create_main_window(); + wrefresh(main_win); - create_conversation(); + // set cursor in command window and loop in input + wmove(cmd_win, 0, 0); + while (TRUE) { + wgetstr(cmd_win, cmd); + + // handle quit + if (strcmp(cmd, "/quit") == 0) { + break; + // handle connect + } else if (strncmp(cmd, "/connect ", 9) == 0) { + char *user; + char passwd[20]; - xmpp_run(ctx); + user = strndup(cmd+9, strlen(cmd)-9); + + mvwprintw(cmd_bar, 0, 0, "Enter password:"); + wrefresh(cmd_bar); + + wclear(cmd_win); + noecho(); + mvwgetstr(cmd_win, 0, 0, passwd); + echo(); - xmpp_conn_release(conn); - xmpp_ctx_free(ctx); + wprintw(main_win, "Connecting as: %s/%s\n", user, passwd); + wrefresh(main_win); + + wclear(cmd_win); + wclear(cmd_bar); + wrefresh(cmd_bar); + wmove(cmd_win, 0, 0); + wrefresh(cmd_win); - xmpp_shutdown(); + char loginmsg[100]; + sprintf(loginmsg, "User <%s> logged in", user); + logmsg(prof, loginmsg); + + xmpp_initialize(); + + log = xmpp_get_file_logger(); + ctx = xmpp_ctx_new(NULL, log); + conn = xmpp_conn_new(ctx); - close(); + xmpp_conn_set_jid(conn, user); + xmpp_conn_set_pass(conn, passwd); + xmpp_connect_client(conn, NULL, 0, conn_handler, ctx); + + xmpp_run(ctx); + + xmpp_conn_release(conn); + xmpp_ctx_free(ctx); + + xmpp_shutdown(); + } else { + // echo it to the main window + wprintw(main_win, "%s\n", cmd); + wrefresh(main_win); + wclear(cmd_win); + wmove(cmd_win, 0, 0); + } + } + + endwin(); fclose(logp); return 0; @@ -116,18 +142,11 @@ int in_message_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, intext = xmpp_stanza_get_text(xmpp_stanza_get_child_by_name(stanza, "body")); - char in_line[100]; + char in_line[200]; sprintf(in_line, "%s: %s\n", xmpp_stanza_get_attribute(stanza, "from"), intext); - if (incoming_ypos == inc_scroll_max-1) { - scroll(incoming); - mvwaddstr(incoming, incoming_ypos-1, 0, in_line); - } else { - mvwaddstr(incoming, incoming_ypos, 0, in_line); - incoming_ypos++; - } - - wrefresh(incoming); + wprintw(main_win, in_line); + wrefresh(main_win); return 1; } @@ -138,10 +157,10 @@ int out_message_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, char replytxt[100];; echo(); - wgetstr(outgoing, replytxt); - - wrefresh(outgoing); - refresh(); + wgetstr(cmd_win, replytxt); + wclear(cmd_win); + wmove(cmd_win, 0, 0); + wrefresh(cmd_win); xmpp_stanza_t *reply, *body, *text; xmpp_ctx_t *ctx = (xmpp_ctx_t*)userdata; @@ -163,6 +182,10 @@ int out_message_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, xmpp_send(conn, reply); xmpp_stanza_release(reply); + wprintw(main_win, "me: %s\n", replytxt); + wrefresh(main_win); + wmove(cmd_win, 0, 0); + return 1; } @@ -207,76 +230,39 @@ void init(void) attron(COLOR_PAIR(1)); } -WINDOW *create_win(int height, int width, int starty, int startx, int border) -{ - WINDOW *local_win; - - local_win = newwin(height, width, starty, startx); - if (border) - box(local_win, 0 , 0); - wrefresh(local_win); - - return local_win; -} - -void create_conversation() +void create_title_bar(void) { + char *title = "Profanity"; + int rows, cols; - char *title = "PROFANITY"; - getmaxyx(stdscr, rows, cols); - curs_set(0); - attron(COLOR_PAIR(3)); - mvprintw(1, (cols - strlen(title))/2, title); - attroff(COLOR_PAIR(3)); - - int in_height, in_width, in_y, in_x; - int out_height, out_width, out_y, out_x; - - out_height = 5; - out_width = cols; - out_y = rows - 5; - out_x = 0; - - in_height = (rows - 3) - (out_height); - in_width = cols; - in_y = 3; - in_x = 0; - - incoming_border = create_win(in_height, in_width, in_y, in_x, 1); - outgoing_border = create_win(out_height, out_width, out_y, out_x, 1); - inc_scroll_max = in_height-2; - incoming = create_win(in_height-2, in_width-2, in_y+1, in_x+1, 0); - scrollok(incoming, TRUE); - outgoing = create_win(out_height-2, out_width-2, out_y+1, out_x+1, 0); - scrollok(outgoing, TRUE); + title_bar = newwin(1, cols, 0, 0); + wbkgd(title_bar, COLOR_PAIR(3)); + mvwprintw(title_bar, 0, 0, title); } -void print_title(void) +void create_command_bar(void) { int rows, cols; - char *title = "PROFANITY"; - getmaxyx(stdscr, rows, cols); - attron(COLOR_PAIR(3)); - mvprintw(1, (cols - strlen(title))/2, title); - attroff(COLOR_PAIR(3)); + cmd_bar = newwin(1, cols, rows-2, 0); + wbkgd(cmd_bar, COLOR_PAIR(3)); } -void close(void) +void create_command_window(void) { int rows, cols; - char *exit_msg = "< HIT ANY KEY TO EXIT >"; - getmaxyx(stdscr, rows, cols); - attron(A_BLINK); - curs_set(0); - mvprintw(rows-10, (cols - strlen(exit_msg))/2, exit_msg); - - refresh(); - getch(); - endwin(); + cmd_win = newwin(1, cols, rows-1, 0); +} + +void create_main_window(void) +{ + int rows, cols; + getmaxyx(stdscr, rows, cols); + + main_win = newwin(rows-3, cols, 1, 0); }