# HG changeset patch # User mikael # Date 1118517145 0 # Node ID 8e30b2bb380eef90ce52fb2b2677ebc5f4affeb6 # Parent c8df64f43625f4cfd8ad4057f5bf559ba638b284 [/trunk] Changeset 251 by mikael * Add /msay command (multi-line messages) diff -r c8df64f43625 -r 8e30b2bb380e mcabber/doc/mcabber.1 --- a/mcabber/doc/mcabber.1 Fri Jun 10 19:26:34 2005 +0000 +++ b/mcabber/doc/mcabber.1 Sat Jun 11 19:12:25 2005 +0000 @@ -140,8 +140,12 @@ Move the current buddy to the requested group\&. If no group is specified, then the buddy is moved to the default group\&. This command only works with users (not agents), at the moment\&. .TP -\fB/quit\fR -Disconnect and leave mcabber(1) +\fB/msay\fR begin|send|abort +Send a multi\-line message\&. To write a single message with several lines, the \fImulti\-line mode\fR should be used\&. In multi\-line mode, each line (except command lines) typed in the input line will be added to the multi\-line message\&. Once the message is finished, it can be sent to the current selected buddy with the "msay /send" command\&. + + \fBbegin\fR enter multi\-line mode + \fBsend\fR send the current multi\-line message to the currently selected buddy + \fBabort\fR leave multi\-line mode without sending the message .TP \fB/rename\fR nickname diff -r c8df64f43625 -r 8e30b2bb380e mcabber/doc/mcabber.1.html --- a/mcabber/doc/mcabber.1.html Fri Jun 10 19:26:34 2005 +0000 +++ b/mcabber/doc/mcabber.1.html Sat Jun 11 19:12:25 2005 +0000 @@ -353,6 +353,51 @@
+/msay begin|send|abort +
+
+ + Send a multi-line message. To write a single message with several + lines, the multi-line mode should be used. In multi-line mode, + each line (except command lines) typed in the input line will + be added to the multi-line message. Once the message is finished, it + can be sent to the current selected buddy with the "msay /send" + command. + + + + + + + + + + + + + + +
+begin + + +enter multi-line mode + +
+send + + +send the current multi-line message to the currently selected buddy + +
+abort + + +leave multi-line mode without sending the message + +
+
+
/quit
@@ -498,7 +543,7 @@ diff -r c8df64f43625 -r 8e30b2bb380e mcabber/doc/mcabber.1.txt --- a/mcabber/doc/mcabber.1.txt Fri Jun 10 19:26:34 2005 +0000 +++ b/mcabber/doc/mcabber.1.txt Sat Jun 11 19:12:25 2005 +0000 @@ -110,6 +110,18 @@ specified, then the buddy is moved to the default group. This command only works with users (not agents), at the moment. +/msay begin|send|abort:: + Send a multi-line message. To write a single message with several + lines, the 'multi-line mode' should be used. In multi-line mode, + each line (except command lines) typed in the input line will + be added to the multi-line message. Once the message is finished, it + can be sent to the current selected buddy with the "msay /send" + command. + + 'begin';; enter multi-line mode + 'send';; send the current multi-line message to the currently selected buddy + 'abort';; leave multi-line mode without sending the message + /quit:: Disconnect and leave `mcabber(1)`. diff -r c8df64f43625 -r 8e30b2bb380e mcabber/src/commands.c --- a/mcabber/src/commands.c Fri Jun 10 19:26:34 2005 +0000 +++ b/mcabber/src/commands.c Sat Jun 11 19:12:25 2005 +0000 @@ -38,6 +38,7 @@ void do_del(char *arg); void do_group(char *arg); void do_say(char *arg); +void do_msay(char *arg); void do_buffer(char *arg); void do_clear(char *arg); void do_info(char *arg); @@ -78,6 +79,8 @@ cmd_add("info", "Show basic infos on current buddy", 0, 0, &do_info); cmd_add("move", "Move the current buddy to another group", COMPL_GROUPNAME, 0, &do_move); + cmd_add("msay", "Send a multi-lines message to the selected buddy", + COMPL_MULTILINE, 0, &do_msay); //cmd_add("nick"); cmd_add("quit", "Exit the software", 0, 0, NULL); cmd_add("rename", "Rename the current buddy", 0, 0, &do_rename); @@ -116,14 +119,19 @@ compl_add_category_word(COMPL_GROUP, "expand"); compl_add_category_word(COMPL_GROUP, "shrink"); compl_add_category_word(COMPL_GROUP, "toggle"); + + // Multi-line (msay) category + compl_add_category_word(COMPL_MULTILINE, "abort"); + compl_add_category_word(COMPL_MULTILINE, "begin"); + compl_add_category_word(COMPL_MULTILINE, "send"); } // cmd_get // Finds command in the command list structure. // Returns a pointer to the cmd entry, or NULL if command not found. -cmd *cmd_get(char *command) +cmd *cmd_get(const char *command) { - char *p1, *p2; + const char *p1, *p2; char *com; GSList *sl_com; // Ignore leading '/' @@ -150,7 +158,7 @@ // send_message(msg) // Write the message in the buddy's window and send the message on // the network. -void send_message(char *msg) +void send_message(const char *msg) { const char *jid; @@ -182,6 +190,10 @@ cmd *curcmd; if (!*line) { // User only pressed enter + if (scr_get_multimode()) { + scr_append_multiline(""); + return 0; + } if (current_buddy) { scr_set_chatmode(TRUE); buddy_setflags(BUDDATA(current_buddy), ROSTER_FLAG_LOCK, TRUE); @@ -191,7 +203,10 @@ } if (*line != '/') { - do_say(line); + if (scr_get_multimode()) + scr_append_multiline(line); + else + do_say(line); return 0; } @@ -374,6 +389,54 @@ send_message(arg); } +void do_msay(char *arg) +{ + /* begin abort send */ + gpointer bud; + + if (!strcasecmp(arg, "abort")) { + scr_set_multimode(FALSE); + return; + } else if (!strcasecmp(arg, "begin")) { + scr_set_multimode(TRUE); + scr_LogPrint("Entered multi-line message mode."); + scr_LogPrint("Select a buddy and use \"/msay send\" " + "when your message is ready."); + return; + } else if (*arg == 0) { + scr_LogPrint("Please read the manual before using the /msay command."); + scr_LogPrint("(Use /msay begin to enter multi-line mode...)"); + return; + } else if (strcasecmp(arg, "send")) { + scr_LogPrint("Unrecognized parameter!"); + return; + } + + // send command + + if (!scr_get_multimode()) { + scr_LogPrint("No message to send. Use \"/msay begin\" first."); + return; + } + + scr_set_chatmode(TRUE); + + if (!current_buddy) { + scr_LogPrint("Who are you talking to??"); + return; + } + + bud = BUDDATA(current_buddy); + if (!(buddy_gettype(bud) & ROSTER_TYPE_USER)) { + scr_LogPrint("This is not a user"); + return; + } + + buddy_setflags(bud, ROSTER_FLAG_LOCK, TRUE); + send_message(scr_get_multiline()); + scr_set_multimode(FALSE); +} + void do_buffer(char *arg) { if (!strcasecmp(arg, "top")) { diff -r c8df64f43625 -r 8e30b2bb380e mcabber/src/commands.h --- a/mcabber/src/commands.h Fri Jun 10 19:26:34 2005 +0000 +++ b/mcabber/src/commands.h Sat Jun 11 19:12:25 2005 +0000 @@ -12,7 +12,7 @@ } cmd; void cmd_init(void); -cmd *cmd_get(char *command); +cmd *cmd_get(const char *command); int process_line(char *line); #endif /* __COMMANDS_H__ */ diff -r c8df64f43625 -r 8e30b2bb380e mcabber/src/compl.h --- a/mcabber/src/compl.h Fri Jun 10 19:26:34 2005 +0000 +++ b/mcabber/src/compl.h Sat Jun 11 19:12:25 2005 +0000 @@ -3,16 +3,17 @@ #include -#define COMPL_CMD 1 -#define COMPL_JID 2 -#define COMPL_URLJID 4 // Not implemented yet -#define COMPL_NAME 8 // Not implemented yet -#define COMPL_STATUS 16 -#define COMPL_FILENAME 32 // Not implemented yet -#define COMPL_ROSTER 64 -#define COMPL_BUFFER 128 -#define COMPL_GROUP 256 -#define COMPL_GROUPNAME 512 +#define COMPL_CMD (1<<0) +#define COMPL_JID (1<<2) +#define COMPL_URLJID (1<<3) // Not implemented yet +#define COMPL_NAME (1<<4) // Not implemented yet +#define COMPL_STATUS (1<<5) +#define COMPL_FILENAME (1<<6) // Not implemented yet +#define COMPL_ROSTER (1<<7) +#define COMPL_BUFFER (1<<8) +#define COMPL_GROUP (1<<9) +#define COMPL_GROUPNAME (1<<10) +#define COMPL_MULTILINE (1<<11) void compl_add_category_word(guint, const char *command); GSList *compl_get_category_list(guint cat_flags); diff -r c8df64f43625 -r 8e30b2bb380e mcabber/src/screen.c --- a/mcabber/src/screen.c Fri Jun 10 19:26:34 2005 +0000 +++ b/mcabber/src/screen.c Sat Jun 11 19:12:25 2005 +0000 @@ -43,6 +43,8 @@ static window_entry_t *currentWindow; static int chatmode; +static int multimode; +static char *multiline; int update_roster; int utf8_mode = 0; @@ -1086,6 +1088,75 @@ chatmode = enable; } +// scr_get_multimode() +// Public fonction to get multimode status... +inline int scr_get_multimode() +{ + return multimode; +} + +// scr_set_multimode() +// Public fonction to (un)set multimode... +inline void scr_set_multimode(int enable) +{ + if (multiline) { + g_free(multiline); + multiline = NULL; + } + if (enable) + multimode = TRUE; + else + multimode = FALSE; +} + +// scr_get_multiline() +// Public fonction to get multimode status... +inline const char *scr_get_multiline() +{ + if (multimode && multiline) + return multiline; + else + return ""; +} + +// scr_append_multiline(line) +// Public function to append a line to the current multi-line message. +// Skip empty leading lines. +void scr_append_multiline(const char *line) +{ + static int num; + + if (!multimode) { + scr_LogPrint("Error: Not in multi-line message mode!"); + return; + } + if (multiline) { + int len = strlen(multiline)+strlen(line)+2; + if (len >= HBB_BLOCKSIZE) { + // We don't handle single messages with size > HBB_BLOCKSIZE + // (see hbuf) + scr_LogPrint("Your multi-line message is too big, this line has " + "not been added."); + scr_LogPrint("Please send this part now..."); + return; + } + multiline = g_renew(char, multiline, len); + strcat(multiline, "\n"); + strcat(multiline, line); + num++; + } else { + // First message line (we skip leading empty lines) + num = 0; + if (line[0]) { + multiline = g_new(char, strlen(line)+1); + strcpy(multiline, line); + num++; + } else + return; + } + scr_LogPrint("Multi-line mode: line #%d added [%.25s...", num, line); +} + // scr_cmdhisto_addline() // Add a line to the inputLine history inline void scr_cmdhisto_addline(char *line) @@ -1371,7 +1442,7 @@ check_offset(-1); } break; - case KEY_DC: + case KEY_DC:// Del if (*ptr_inputline) strcpy(ptr_inputline, ptr_inputline+1); break; diff -r c8df64f43625 -r 8e30b2bb380e mcabber/src/screen.h --- a/mcabber/src/screen.h Fri Jun 10 19:26:34 2005 +0000 +++ b/mcabber/src/screen.h Sat Jun 11 19:12:25 2005 +0000 @@ -30,6 +30,10 @@ void scr_ShowBuddyWindow(void); void scr_LogPrint(const char *fmt, ...); inline void scr_set_chatmode(int enable); +inline void scr_set_multimode(int enable); +inline int scr_get_multimode(); +void scr_append_multiline(const char *line); +inline const char *scr_get_multiline(); WINDOW *scr_GetInputWindow(void);