mirror of
https://github.com/weechat/weechat.git
synced 2026-06-30 23:06:38 +02:00
Added new display engine: doesn't cut words at end of lines
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
WeeChat - Wee Enhanced Environment for Chat
|
||||
===========================================
|
||||
|
||||
ChangeLog - 2005-02-22
|
||||
ChangeLog - 2005-02-26
|
||||
|
||||
|
||||
Version 0.1.1 (under dev!):
|
||||
* added new display engine: doesn't cut words at end of lines
|
||||
* added DCC send
|
||||
* connection to IRC server is now made by child process (non blocking)
|
||||
* added support for UnrealIrcd ("~" for chan owner, "&" for chan admin)
|
||||
|
||||
+241
-162
@@ -378,211 +378,285 @@ gui_draw_buffer_title (t_gui_buffer *buffer, int erase)
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_get_line_num_splits: returns number of lines on window
|
||||
* (depending on window width and type (server/channel)
|
||||
* for alignment)
|
||||
*/
|
||||
|
||||
int
|
||||
gui_get_line_num_splits (t_gui_window *window, t_gui_line *line)
|
||||
{
|
||||
int length, width;
|
||||
|
||||
/* TODO: modify arbitraty value for non aligning messages on time/nick? */
|
||||
if (line->length_align >= window->win_chat_width - 5)
|
||||
{
|
||||
length = line->length;
|
||||
width = window->win_chat_width;
|
||||
}
|
||||
else
|
||||
{
|
||||
length = line->length - line->length_align;
|
||||
width = window->win_chat_width - line->length_align;
|
||||
}
|
||||
|
||||
if (length == 0)
|
||||
return 1;
|
||||
else
|
||||
return (length % width == 0) ? (length / width) : ((length / width) + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_display_end_of_line: display end of a line in the chat window
|
||||
* gui_display_new_line: display a new line
|
||||
*/
|
||||
|
||||
void
|
||||
gui_display_end_of_line (t_gui_window *window, t_gui_line *line, int count)
|
||||
gui_display_new_line (t_gui_window *window, int num_lines, int count,
|
||||
int *lines_displayed, int simulate)
|
||||
{
|
||||
int lines_displayed, num_lines, offset, remainder, num_displayed;
|
||||
t_gui_message *ptr_message;
|
||||
char saved_char, format_align[32], format_empty[32];
|
||||
char format_empty[32];
|
||||
|
||||
if ((count == 0) || (*lines_displayed >= num_lines - count))
|
||||
{
|
||||
if ((!simulate) && (window->win_chat_cursor_x <= window->win_chat_width - 1))
|
||||
{
|
||||
snprintf (format_empty, 32, "%%-%ds",
|
||||
window->win_chat_width - window->win_chat_cursor_x);
|
||||
wprintw (window->win_chat, format_empty, " ");
|
||||
}
|
||||
window->win_chat_cursor_y++;
|
||||
}
|
||||
window->win_chat_cursor_x = 0;
|
||||
(*lines_displayed)++;
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_message_get_next_char: returns next char of message at offset
|
||||
*/
|
||||
|
||||
void
|
||||
gui_message_get_next_char (t_gui_message **message, int *offset)
|
||||
{
|
||||
if (!(*message))
|
||||
return;
|
||||
(*offset)++;
|
||||
if (!((*message)->message[*offset]))
|
||||
{
|
||||
*message = (*message)->next_message;
|
||||
*offset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_display_word: display a word on chat buffer
|
||||
*/
|
||||
|
||||
void
|
||||
gui_display_word (t_gui_window *window, t_gui_line *line,
|
||||
t_gui_message *message, int offset,
|
||||
t_gui_message *end_msg, int end_offset,
|
||||
int num_lines, int count, int *lines_displayed, int simulate)
|
||||
{
|
||||
char format_align[32];
|
||||
char saved_char_end, saved_char;
|
||||
int end_of_word, chars_to_display, num_displayed;
|
||||
|
||||
if (window->win_chat_cursor_y > window->win_chat_height - 1)
|
||||
return;
|
||||
|
||||
snprintf (format_align, 32, "%%-%ds", line->length_align);
|
||||
num_lines = gui_get_line_num_splits (window, line);
|
||||
ptr_message = line->messages;
|
||||
offset = 0;
|
||||
lines_displayed = 0;
|
||||
while (ptr_message)
|
||||
|
||||
saved_char_end = '\0';
|
||||
if (end_msg)
|
||||
{
|
||||
saved_char_end = end_msg->message[end_offset + 1];
|
||||
end_msg->message[end_offset + 1] = '\0';
|
||||
}
|
||||
|
||||
end_of_word = 0;
|
||||
while (!end_of_word)
|
||||
{
|
||||
/* set text color if beginning of message */
|
||||
if (offset == 0)
|
||||
gui_window_set_color (window->win_chat, ptr_message->color);
|
||||
if (!simulate)
|
||||
gui_window_set_color (window->win_chat, message->color);
|
||||
|
||||
/* insert spaces for align text under time/nick */
|
||||
if ((lines_displayed > 0) && (window->win_chat_cursor_x == 0))
|
||||
if ((line->length_align > 0) &&
|
||||
(window->win_chat_cursor_x == 0) &&
|
||||
(*lines_displayed > 0) &&
|
||||
/* TODO: modify arbitraty value for non aligning messages on time/nick? */
|
||||
(line->length_align < (window->win_chat_width - 5)))
|
||||
{
|
||||
if (lines_displayed >= num_lines - count)
|
||||
if (!simulate)
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
format_align, " ");
|
||||
window->win_chat_cursor_x += line->length_align;
|
||||
}
|
||||
|
||||
remainder = strlen (ptr_message->message + offset);
|
||||
if (window->win_chat_cursor_x + remainder >
|
||||
window->win_chat_width - 1)
|
||||
chars_to_display = strlen (message->message + offset);
|
||||
|
||||
/* too long for current line */
|
||||
if (window->win_chat_cursor_x + chars_to_display > window->win_chat_width)
|
||||
{
|
||||
num_displayed = window->win_chat_width -
|
||||
window->win_chat_cursor_x;
|
||||
if (num_displayed < 0)
|
||||
return;
|
||||
saved_char = ptr_message->message[offset + num_displayed];
|
||||
ptr_message->message[offset + num_displayed] = '\0';
|
||||
if (lines_displayed >= num_lines - count)
|
||||
num_displayed = window->win_chat_width - window->win_chat_cursor_x;
|
||||
saved_char = message->message[offset + num_displayed];
|
||||
message->message[offset + num_displayed] = '\0';
|
||||
if ((!simulate) &&
|
||||
((count == 0) || (*lines_displayed >= num_lines - count)))
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
"%s", ptr_message->message + offset);
|
||||
ptr_message->message[offset + num_displayed] = saved_char;
|
||||
"%s", message->message + offset);
|
||||
message->message[offset + num_displayed] = saved_char;
|
||||
offset += num_displayed;
|
||||
}
|
||||
else
|
||||
{
|
||||
num_displayed = remainder;
|
||||
if (lines_displayed >= num_lines - count)
|
||||
|
||||
num_displayed = chars_to_display;
|
||||
if ((!simulate) &&
|
||||
((count == 0) || (*lines_displayed >= num_lines - count)))
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
"%s", ptr_message->message + offset);
|
||||
ptr_message = ptr_message->next_message;
|
||||
offset = 0;
|
||||
}
|
||||
window->win_chat_cursor_x += num_displayed;
|
||||
if (!ptr_message ||
|
||||
(window->win_chat_cursor_x > (window->win_chat_width - 1)))
|
||||
{
|
||||
if (lines_displayed >= num_lines - count)
|
||||
"%s", message->message + offset);
|
||||
if (message == end_msg)
|
||||
{
|
||||
if (window->win_chat_cursor_x <= window->win_chat_width - 1)
|
||||
{
|
||||
snprintf (format_empty, 32, "%%-%ds",
|
||||
window->win_chat_width - window->win_chat_cursor_x);
|
||||
wprintw (window->win_chat, format_empty, " ");
|
||||
}
|
||||
window->win_chat_cursor_y++;
|
||||
offset = end_offset;
|
||||
if (end_msg)
|
||||
end_msg->message[end_offset + 1] = saved_char_end;
|
||||
gui_message_get_next_char (&message, &offset);
|
||||
}
|
||||
window->win_chat_cursor_x = 0;
|
||||
lines_displayed++;
|
||||
else
|
||||
{
|
||||
message = message->next_message;
|
||||
offset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
window->win_chat_cursor_x += num_displayed;
|
||||
|
||||
/* display new line? */
|
||||
if (!message ||
|
||||
((window->win_chat_cursor_y <= window->win_chat_height - 1) &&
|
||||
(window->win_chat_cursor_x > (window->win_chat_width - 1))))
|
||||
gui_display_new_line (window, num_lines, count,
|
||||
lines_displayed, simulate);
|
||||
|
||||
/* end of word? */
|
||||
if (!message || (message->prev_message == end_msg) ||
|
||||
((message == end_msg) && (offset > end_offset)))
|
||||
end_of_word = 1;
|
||||
}
|
||||
|
||||
if (end_msg)
|
||||
end_msg->message[end_offset + 1] = saved_char_end;
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_get_word_info: returns info about next word: beginning, end, length
|
||||
*/
|
||||
|
||||
void
|
||||
gui_get_word_info (t_gui_message *message, int offset,
|
||||
t_gui_message **word_start_msg, int *word_start_offset,
|
||||
t_gui_message **word_end_msg, int *word_end_offset,
|
||||
int *word_length_with_spaces, int *word_length)
|
||||
{
|
||||
*word_start_msg = NULL;
|
||||
*word_start_offset = 0;
|
||||
*word_end_msg = NULL;
|
||||
*word_end_offset = 0;
|
||||
*word_length_with_spaces = 0;
|
||||
*word_length = 0;
|
||||
|
||||
/* leading spaces */
|
||||
while (message && (message->message[offset] == ' '))
|
||||
{
|
||||
(*word_length_with_spaces)++;
|
||||
gui_message_get_next_char (&message, &offset);
|
||||
}
|
||||
|
||||
/* not only spaces? */
|
||||
if (message)
|
||||
{
|
||||
*word_start_msg = message;
|
||||
*word_start_offset = offset;
|
||||
|
||||
/* find end of word */
|
||||
while (message && (message->message[offset]) && (message->message[offset] != ' '))
|
||||
{
|
||||
*word_end_msg = message;
|
||||
*word_end_offset = offset;
|
||||
(*word_length_with_spaces)++;
|
||||
(*word_length)++;
|
||||
gui_message_get_next_char (&message, &offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_display_line: display a line in the chat window
|
||||
* if stop_at_end == 1, screen will not scroll and then we
|
||||
* exit since chat window is full
|
||||
* returns: 1 if stop_at_end == 0 or screen not full
|
||||
* 0 if screen is full and if stop_at_end == 1
|
||||
* if count == 0, display whole line
|
||||
* if count > 0, display 'count' lines (beginning from the end)
|
||||
* if simulate == 1, nothing is displayed (for counting how
|
||||
* many lines would have been lines displayed)
|
||||
* returns: number of lines displayed (or simulated)
|
||||
*/
|
||||
|
||||
int
|
||||
gui_display_line (t_gui_window *window, t_gui_line *line, int stop_at_end)
|
||||
gui_display_line (t_gui_window *window, t_gui_line *line, int count, int simulate)
|
||||
{
|
||||
int offset, remainder, num_displayed;
|
||||
t_gui_message *ptr_message;
|
||||
char saved_char, format_align[32], format_empty[32];
|
||||
int num_lines, x, y, offset, lines_displayed;
|
||||
t_gui_message *ptr_message, *word_start_msg, *word_end_msg;
|
||||
int word_start_offset, word_end_offset;
|
||||
int word_length_with_spaces, word_length;
|
||||
int skip_spaces;
|
||||
|
||||
if (window->win_chat_cursor_y > window->win_chat_height - 1)
|
||||
return 0;
|
||||
|
||||
if (simulate)
|
||||
{
|
||||
x = window->win_chat_cursor_x;
|
||||
y = window->win_chat_cursor_y;
|
||||
window->win_chat_cursor_x = 0;
|
||||
window->win_chat_cursor_y = 0;
|
||||
num_lines = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = window->win_chat_cursor_x;
|
||||
y = window->win_chat_cursor_y;
|
||||
num_lines = gui_display_line (window, line, 0, 1);
|
||||
window->win_chat_cursor_x = x;
|
||||
window->win_chat_cursor_y = y;
|
||||
}
|
||||
|
||||
snprintf (format_align, 32, "%%-%ds", line->length_align);
|
||||
ptr_message = line->messages;
|
||||
offset = 0;
|
||||
lines_displayed = 0;
|
||||
while (ptr_message)
|
||||
{
|
||||
/* cursor is below end line of chat window */
|
||||
if (window->win_chat_cursor_y > window->win_chat_height - 1)
|
||||
skip_spaces = 0;
|
||||
gui_get_word_info (ptr_message, offset,
|
||||
&word_start_msg, &word_start_offset,
|
||||
&word_end_msg, &word_end_offset,
|
||||
&word_length_with_spaces, &word_length);
|
||||
|
||||
/* spaces + word too long for current line */
|
||||
if ((window->win_chat_cursor_x + word_length_with_spaces > window->win_chat_width - 1)
|
||||
&& (word_length < window->win_chat_width - line->length_align))
|
||||
{
|
||||
/*if (!stop_at_end)
|
||||
wscrl (buffer->window->win_chat, +1);*/
|
||||
window->win_chat_cursor_x = 0;
|
||||
window->win_chat_cursor_y = window->win_chat_height - 1;
|
||||
if (stop_at_end)
|
||||
return 0;
|
||||
window->first_line_displayed = 0;
|
||||
gui_display_new_line (window, num_lines, count,
|
||||
&lines_displayed, simulate);
|
||||
ptr_message = word_start_msg;
|
||||
offset = word_start_offset;
|
||||
}
|
||||
|
||||
/* set text color if beginning of message */
|
||||
if (offset == 0)
|
||||
gui_window_set_color (window->win_chat, ptr_message->color);
|
||||
/* word is exactly width => we'll skip next leading spaces for next line */
|
||||
if (word_length == window->win_chat_width - line->length_align)
|
||||
skip_spaces = 1;
|
||||
|
||||
/* insert spaces for align text under time/nick */
|
||||
if ((window->win_chat_cursor_x == 0) &&
|
||||
(!(ptr_message->type & MSG_TYPE_TIME)) &&
|
||||
(!(ptr_message->type & MSG_TYPE_NICK)) &&
|
||||
(line->length_align > 0) &&
|
||||
/* TODO: modify arbitraty value for non aligning messages on time/nick? */
|
||||
(line->length_align < (window->win_chat_width - 5)))
|
||||
{
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
format_align, " ");
|
||||
window->win_chat_cursor_x += line->length_align;
|
||||
}
|
||||
/* display word */
|
||||
gui_display_word (window, line,
|
||||
ptr_message, offset,
|
||||
word_end_msg, word_end_offset,
|
||||
num_lines, count, &lines_displayed, simulate);
|
||||
|
||||
remainder = strlen (ptr_message->message + offset);
|
||||
if (window->win_chat_cursor_x + remainder > window->win_chat_width)
|
||||
/* move pointer after end of word */
|
||||
ptr_message = word_end_msg;
|
||||
offset = word_end_offset;
|
||||
gui_message_get_next_char (&ptr_message, &offset);
|
||||
|
||||
/* skip leading spaces? */
|
||||
if (skip_spaces)
|
||||
{
|
||||
num_displayed = window->win_chat_width -
|
||||
window->win_chat_cursor_x;
|
||||
saved_char = ptr_message->message[offset + num_displayed];
|
||||
ptr_message->message[offset + num_displayed] = '\0';
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
"%s", ptr_message->message + offset);
|
||||
ptr_message->message[offset + num_displayed] = saved_char;
|
||||
offset += num_displayed;
|
||||
}
|
||||
else
|
||||
{
|
||||
num_displayed = remainder;
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
"%s", ptr_message->message + offset);
|
||||
offset = 0;
|
||||
ptr_message = ptr_message->next_message;
|
||||
}
|
||||
window->win_chat_cursor_x += num_displayed;
|
||||
if (!ptr_message ||
|
||||
(window->win_chat_cursor_x > (window->win_chat_width - 1)))
|
||||
{
|
||||
if (!ptr_message ||
|
||||
((window->win_chat_cursor_y <= window->win_chat_height - 1) &&
|
||||
(window->win_chat_cursor_x > window->win_chat_width - 1)))
|
||||
{
|
||||
if (window->win_chat_cursor_x <= window->win_chat_width - 1)
|
||||
{
|
||||
snprintf (format_empty, 32, "%%-%ds",
|
||||
window->win_chat_width - window->win_chat_cursor_x);
|
||||
wprintw (window->win_chat, format_empty, " ");
|
||||
}
|
||||
window->win_chat_cursor_y++;
|
||||
}
|
||||
window->win_chat_cursor_x = 0;
|
||||
while (ptr_message && (ptr_message->message[offset] == ' '))
|
||||
gui_message_get_next_char (&ptr_message, &offset);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
|
||||
if (simulate)
|
||||
{
|
||||
window->win_chat_cursor_x = x;
|
||||
window->win_chat_cursor_y = y;
|
||||
}
|
||||
|
||||
return lines_displayed;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -700,7 +774,7 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
|
||||
while (ptr_line
|
||||
&& (lines_used < (ptr_win->win_chat_height + ptr_win->sub_lines)))
|
||||
{
|
||||
lines_used += gui_get_line_num_splits (ptr_win, ptr_line);
|
||||
lines_used += gui_display_line (ptr_win, ptr_line, 0, 1);
|
||||
ptr_line = ptr_line->prev_line;
|
||||
}
|
||||
ptr_win->win_chat_cursor_x = 0;
|
||||
@@ -709,9 +783,9 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
|
||||
{
|
||||
/* screen will be full (we'll display only end of 1st line) */
|
||||
ptr_line = (ptr_line) ? ptr_line->next_line : buffer->lines;
|
||||
gui_display_end_of_line (ptr_win, ptr_line,
|
||||
gui_get_line_num_splits (ptr_win, ptr_line) -
|
||||
(lines_used - (ptr_win->win_chat_height + ptr_win->sub_lines)));
|
||||
gui_display_line (ptr_win, ptr_line,
|
||||
gui_display_line (ptr_win, ptr_line, 0, 1) -
|
||||
(lines_used - (ptr_win->win_chat_height + ptr_win->sub_lines)), 0);
|
||||
ptr_line = ptr_line->next_line;
|
||||
ptr_win->first_line_displayed = 0;
|
||||
}
|
||||
@@ -729,15 +803,20 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
|
||||
ptr_line = ptr_line->next_line;
|
||||
}
|
||||
}
|
||||
while (ptr_line)
|
||||
|
||||
/* display lines */
|
||||
while (ptr_line && (ptr_win->win_chat_cursor_y <= ptr_win->win_chat_height - 1))
|
||||
{
|
||||
if (!gui_display_line (ptr_win, ptr_line, 1))
|
||||
break;
|
||||
|
||||
gui_display_line (ptr_win, ptr_line, 0, 0);
|
||||
ptr_line = ptr_line->next_line;
|
||||
}
|
||||
/*if (ptr_win->win_chat_cursor_y <= ptr_win->win_chat_height - 1)
|
||||
buffer->sub_lines = 0;*/
|
||||
|
||||
/* cursor is below end line of chat window? */
|
||||
if (ptr_win->win_chat_cursor_y > ptr_win->win_chat_height - 1)
|
||||
{
|
||||
ptr_win->win_chat_cursor_x = 0;
|
||||
ptr_win->win_chat_cursor_y = ptr_win->win_chat_height - 1;
|
||||
}
|
||||
}
|
||||
wrefresh (ptr_win->win_chat);
|
||||
refresh ();
|
||||
|
||||
+2
-1
@@ -1,10 +1,11 @@
|
||||
WeeChat - Wee Enhanced Environment for Chat
|
||||
===========================================
|
||||
|
||||
ChangeLog - 2005-02-22
|
||||
ChangeLog - 2005-02-26
|
||||
|
||||
|
||||
Version 0.1.1 (under dev!):
|
||||
* added new display engine: doesn't cut words at end of lines
|
||||
* added DCC send
|
||||
* connection to IRC server is now made by child process (non blocking)
|
||||
* added support for UnrealIrcd ("~" for chan owner, "&" for chan admin)
|
||||
|
||||
@@ -378,211 +378,285 @@ gui_draw_buffer_title (t_gui_buffer *buffer, int erase)
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_get_line_num_splits: returns number of lines on window
|
||||
* (depending on window width and type (server/channel)
|
||||
* for alignment)
|
||||
*/
|
||||
|
||||
int
|
||||
gui_get_line_num_splits (t_gui_window *window, t_gui_line *line)
|
||||
{
|
||||
int length, width;
|
||||
|
||||
/* TODO: modify arbitraty value for non aligning messages on time/nick? */
|
||||
if (line->length_align >= window->win_chat_width - 5)
|
||||
{
|
||||
length = line->length;
|
||||
width = window->win_chat_width;
|
||||
}
|
||||
else
|
||||
{
|
||||
length = line->length - line->length_align;
|
||||
width = window->win_chat_width - line->length_align;
|
||||
}
|
||||
|
||||
if (length == 0)
|
||||
return 1;
|
||||
else
|
||||
return (length % width == 0) ? (length / width) : ((length / width) + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_display_end_of_line: display end of a line in the chat window
|
||||
* gui_display_new_line: display a new line
|
||||
*/
|
||||
|
||||
void
|
||||
gui_display_end_of_line (t_gui_window *window, t_gui_line *line, int count)
|
||||
gui_display_new_line (t_gui_window *window, int num_lines, int count,
|
||||
int *lines_displayed, int simulate)
|
||||
{
|
||||
int lines_displayed, num_lines, offset, remainder, num_displayed;
|
||||
t_gui_message *ptr_message;
|
||||
char saved_char, format_align[32], format_empty[32];
|
||||
char format_empty[32];
|
||||
|
||||
if ((count == 0) || (*lines_displayed >= num_lines - count))
|
||||
{
|
||||
if ((!simulate) && (window->win_chat_cursor_x <= window->win_chat_width - 1))
|
||||
{
|
||||
snprintf (format_empty, 32, "%%-%ds",
|
||||
window->win_chat_width - window->win_chat_cursor_x);
|
||||
wprintw (window->win_chat, format_empty, " ");
|
||||
}
|
||||
window->win_chat_cursor_y++;
|
||||
}
|
||||
window->win_chat_cursor_x = 0;
|
||||
(*lines_displayed)++;
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_message_get_next_char: returns next char of message at offset
|
||||
*/
|
||||
|
||||
void
|
||||
gui_message_get_next_char (t_gui_message **message, int *offset)
|
||||
{
|
||||
if (!(*message))
|
||||
return;
|
||||
(*offset)++;
|
||||
if (!((*message)->message[*offset]))
|
||||
{
|
||||
*message = (*message)->next_message;
|
||||
*offset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_display_word: display a word on chat buffer
|
||||
*/
|
||||
|
||||
void
|
||||
gui_display_word (t_gui_window *window, t_gui_line *line,
|
||||
t_gui_message *message, int offset,
|
||||
t_gui_message *end_msg, int end_offset,
|
||||
int num_lines, int count, int *lines_displayed, int simulate)
|
||||
{
|
||||
char format_align[32];
|
||||
char saved_char_end, saved_char;
|
||||
int end_of_word, chars_to_display, num_displayed;
|
||||
|
||||
if (window->win_chat_cursor_y > window->win_chat_height - 1)
|
||||
return;
|
||||
|
||||
snprintf (format_align, 32, "%%-%ds", line->length_align);
|
||||
num_lines = gui_get_line_num_splits (window, line);
|
||||
ptr_message = line->messages;
|
||||
offset = 0;
|
||||
lines_displayed = 0;
|
||||
while (ptr_message)
|
||||
|
||||
saved_char_end = '\0';
|
||||
if (end_msg)
|
||||
{
|
||||
saved_char_end = end_msg->message[end_offset + 1];
|
||||
end_msg->message[end_offset + 1] = '\0';
|
||||
}
|
||||
|
||||
end_of_word = 0;
|
||||
while (!end_of_word)
|
||||
{
|
||||
/* set text color if beginning of message */
|
||||
if (offset == 0)
|
||||
gui_window_set_color (window->win_chat, ptr_message->color);
|
||||
if (!simulate)
|
||||
gui_window_set_color (window->win_chat, message->color);
|
||||
|
||||
/* insert spaces for align text under time/nick */
|
||||
if ((lines_displayed > 0) && (window->win_chat_cursor_x == 0))
|
||||
if ((line->length_align > 0) &&
|
||||
(window->win_chat_cursor_x == 0) &&
|
||||
(*lines_displayed > 0) &&
|
||||
/* TODO: modify arbitraty value for non aligning messages on time/nick? */
|
||||
(line->length_align < (window->win_chat_width - 5)))
|
||||
{
|
||||
if (lines_displayed >= num_lines - count)
|
||||
if (!simulate)
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
format_align, " ");
|
||||
window->win_chat_cursor_x += line->length_align;
|
||||
}
|
||||
|
||||
remainder = strlen (ptr_message->message + offset);
|
||||
if (window->win_chat_cursor_x + remainder >
|
||||
window->win_chat_width - 1)
|
||||
chars_to_display = strlen (message->message + offset);
|
||||
|
||||
/* too long for current line */
|
||||
if (window->win_chat_cursor_x + chars_to_display > window->win_chat_width)
|
||||
{
|
||||
num_displayed = window->win_chat_width -
|
||||
window->win_chat_cursor_x;
|
||||
if (num_displayed < 0)
|
||||
return;
|
||||
saved_char = ptr_message->message[offset + num_displayed];
|
||||
ptr_message->message[offset + num_displayed] = '\0';
|
||||
if (lines_displayed >= num_lines - count)
|
||||
num_displayed = window->win_chat_width - window->win_chat_cursor_x;
|
||||
saved_char = message->message[offset + num_displayed];
|
||||
message->message[offset + num_displayed] = '\0';
|
||||
if ((!simulate) &&
|
||||
((count == 0) || (*lines_displayed >= num_lines - count)))
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
"%s", ptr_message->message + offset);
|
||||
ptr_message->message[offset + num_displayed] = saved_char;
|
||||
"%s", message->message + offset);
|
||||
message->message[offset + num_displayed] = saved_char;
|
||||
offset += num_displayed;
|
||||
}
|
||||
else
|
||||
{
|
||||
num_displayed = remainder;
|
||||
if (lines_displayed >= num_lines - count)
|
||||
|
||||
num_displayed = chars_to_display;
|
||||
if ((!simulate) &&
|
||||
((count == 0) || (*lines_displayed >= num_lines - count)))
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
"%s", ptr_message->message + offset);
|
||||
ptr_message = ptr_message->next_message;
|
||||
offset = 0;
|
||||
}
|
||||
window->win_chat_cursor_x += num_displayed;
|
||||
if (!ptr_message ||
|
||||
(window->win_chat_cursor_x > (window->win_chat_width - 1)))
|
||||
{
|
||||
if (lines_displayed >= num_lines - count)
|
||||
"%s", message->message + offset);
|
||||
if (message == end_msg)
|
||||
{
|
||||
if (window->win_chat_cursor_x <= window->win_chat_width - 1)
|
||||
{
|
||||
snprintf (format_empty, 32, "%%-%ds",
|
||||
window->win_chat_width - window->win_chat_cursor_x);
|
||||
wprintw (window->win_chat, format_empty, " ");
|
||||
}
|
||||
window->win_chat_cursor_y++;
|
||||
offset = end_offset;
|
||||
if (end_msg)
|
||||
end_msg->message[end_offset + 1] = saved_char_end;
|
||||
gui_message_get_next_char (&message, &offset);
|
||||
}
|
||||
window->win_chat_cursor_x = 0;
|
||||
lines_displayed++;
|
||||
else
|
||||
{
|
||||
message = message->next_message;
|
||||
offset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
window->win_chat_cursor_x += num_displayed;
|
||||
|
||||
/* display new line? */
|
||||
if (!message ||
|
||||
((window->win_chat_cursor_y <= window->win_chat_height - 1) &&
|
||||
(window->win_chat_cursor_x > (window->win_chat_width - 1))))
|
||||
gui_display_new_line (window, num_lines, count,
|
||||
lines_displayed, simulate);
|
||||
|
||||
/* end of word? */
|
||||
if (!message || (message->prev_message == end_msg) ||
|
||||
((message == end_msg) && (offset > end_offset)))
|
||||
end_of_word = 1;
|
||||
}
|
||||
|
||||
if (end_msg)
|
||||
end_msg->message[end_offset + 1] = saved_char_end;
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_get_word_info: returns info about next word: beginning, end, length
|
||||
*/
|
||||
|
||||
void
|
||||
gui_get_word_info (t_gui_message *message, int offset,
|
||||
t_gui_message **word_start_msg, int *word_start_offset,
|
||||
t_gui_message **word_end_msg, int *word_end_offset,
|
||||
int *word_length_with_spaces, int *word_length)
|
||||
{
|
||||
*word_start_msg = NULL;
|
||||
*word_start_offset = 0;
|
||||
*word_end_msg = NULL;
|
||||
*word_end_offset = 0;
|
||||
*word_length_with_spaces = 0;
|
||||
*word_length = 0;
|
||||
|
||||
/* leading spaces */
|
||||
while (message && (message->message[offset] == ' '))
|
||||
{
|
||||
(*word_length_with_spaces)++;
|
||||
gui_message_get_next_char (&message, &offset);
|
||||
}
|
||||
|
||||
/* not only spaces? */
|
||||
if (message)
|
||||
{
|
||||
*word_start_msg = message;
|
||||
*word_start_offset = offset;
|
||||
|
||||
/* find end of word */
|
||||
while (message && (message->message[offset]) && (message->message[offset] != ' '))
|
||||
{
|
||||
*word_end_msg = message;
|
||||
*word_end_offset = offset;
|
||||
(*word_length_with_spaces)++;
|
||||
(*word_length)++;
|
||||
gui_message_get_next_char (&message, &offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_display_line: display a line in the chat window
|
||||
* if stop_at_end == 1, screen will not scroll and then we
|
||||
* exit since chat window is full
|
||||
* returns: 1 if stop_at_end == 0 or screen not full
|
||||
* 0 if screen is full and if stop_at_end == 1
|
||||
* if count == 0, display whole line
|
||||
* if count > 0, display 'count' lines (beginning from the end)
|
||||
* if simulate == 1, nothing is displayed (for counting how
|
||||
* many lines would have been lines displayed)
|
||||
* returns: number of lines displayed (or simulated)
|
||||
*/
|
||||
|
||||
int
|
||||
gui_display_line (t_gui_window *window, t_gui_line *line, int stop_at_end)
|
||||
gui_display_line (t_gui_window *window, t_gui_line *line, int count, int simulate)
|
||||
{
|
||||
int offset, remainder, num_displayed;
|
||||
t_gui_message *ptr_message;
|
||||
char saved_char, format_align[32], format_empty[32];
|
||||
int num_lines, x, y, offset, lines_displayed;
|
||||
t_gui_message *ptr_message, *word_start_msg, *word_end_msg;
|
||||
int word_start_offset, word_end_offset;
|
||||
int word_length_with_spaces, word_length;
|
||||
int skip_spaces;
|
||||
|
||||
if (window->win_chat_cursor_y > window->win_chat_height - 1)
|
||||
return 0;
|
||||
|
||||
if (simulate)
|
||||
{
|
||||
x = window->win_chat_cursor_x;
|
||||
y = window->win_chat_cursor_y;
|
||||
window->win_chat_cursor_x = 0;
|
||||
window->win_chat_cursor_y = 0;
|
||||
num_lines = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = window->win_chat_cursor_x;
|
||||
y = window->win_chat_cursor_y;
|
||||
num_lines = gui_display_line (window, line, 0, 1);
|
||||
window->win_chat_cursor_x = x;
|
||||
window->win_chat_cursor_y = y;
|
||||
}
|
||||
|
||||
snprintf (format_align, 32, "%%-%ds", line->length_align);
|
||||
ptr_message = line->messages;
|
||||
offset = 0;
|
||||
lines_displayed = 0;
|
||||
while (ptr_message)
|
||||
{
|
||||
/* cursor is below end line of chat window */
|
||||
if (window->win_chat_cursor_y > window->win_chat_height - 1)
|
||||
skip_spaces = 0;
|
||||
gui_get_word_info (ptr_message, offset,
|
||||
&word_start_msg, &word_start_offset,
|
||||
&word_end_msg, &word_end_offset,
|
||||
&word_length_with_spaces, &word_length);
|
||||
|
||||
/* spaces + word too long for current line */
|
||||
if ((window->win_chat_cursor_x + word_length_with_spaces > window->win_chat_width - 1)
|
||||
&& (word_length < window->win_chat_width - line->length_align))
|
||||
{
|
||||
/*if (!stop_at_end)
|
||||
wscrl (buffer->window->win_chat, +1);*/
|
||||
window->win_chat_cursor_x = 0;
|
||||
window->win_chat_cursor_y = window->win_chat_height - 1;
|
||||
if (stop_at_end)
|
||||
return 0;
|
||||
window->first_line_displayed = 0;
|
||||
gui_display_new_line (window, num_lines, count,
|
||||
&lines_displayed, simulate);
|
||||
ptr_message = word_start_msg;
|
||||
offset = word_start_offset;
|
||||
}
|
||||
|
||||
/* set text color if beginning of message */
|
||||
if (offset == 0)
|
||||
gui_window_set_color (window->win_chat, ptr_message->color);
|
||||
/* word is exactly width => we'll skip next leading spaces for next line */
|
||||
if (word_length == window->win_chat_width - line->length_align)
|
||||
skip_spaces = 1;
|
||||
|
||||
/* insert spaces for align text under time/nick */
|
||||
if ((window->win_chat_cursor_x == 0) &&
|
||||
(!(ptr_message->type & MSG_TYPE_TIME)) &&
|
||||
(!(ptr_message->type & MSG_TYPE_NICK)) &&
|
||||
(line->length_align > 0) &&
|
||||
/* TODO: modify arbitraty value for non aligning messages on time/nick? */
|
||||
(line->length_align < (window->win_chat_width - 5)))
|
||||
{
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
format_align, " ");
|
||||
window->win_chat_cursor_x += line->length_align;
|
||||
}
|
||||
/* display word */
|
||||
gui_display_word (window, line,
|
||||
ptr_message, offset,
|
||||
word_end_msg, word_end_offset,
|
||||
num_lines, count, &lines_displayed, simulate);
|
||||
|
||||
remainder = strlen (ptr_message->message + offset);
|
||||
if (window->win_chat_cursor_x + remainder > window->win_chat_width)
|
||||
/* move pointer after end of word */
|
||||
ptr_message = word_end_msg;
|
||||
offset = word_end_offset;
|
||||
gui_message_get_next_char (&ptr_message, &offset);
|
||||
|
||||
/* skip leading spaces? */
|
||||
if (skip_spaces)
|
||||
{
|
||||
num_displayed = window->win_chat_width -
|
||||
window->win_chat_cursor_x;
|
||||
saved_char = ptr_message->message[offset + num_displayed];
|
||||
ptr_message->message[offset + num_displayed] = '\0';
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
"%s", ptr_message->message + offset);
|
||||
ptr_message->message[offset + num_displayed] = saved_char;
|
||||
offset += num_displayed;
|
||||
}
|
||||
else
|
||||
{
|
||||
num_displayed = remainder;
|
||||
mvwprintw (window->win_chat,
|
||||
window->win_chat_cursor_y,
|
||||
window->win_chat_cursor_x,
|
||||
"%s", ptr_message->message + offset);
|
||||
offset = 0;
|
||||
ptr_message = ptr_message->next_message;
|
||||
}
|
||||
window->win_chat_cursor_x += num_displayed;
|
||||
if (!ptr_message ||
|
||||
(window->win_chat_cursor_x > (window->win_chat_width - 1)))
|
||||
{
|
||||
if (!ptr_message ||
|
||||
((window->win_chat_cursor_y <= window->win_chat_height - 1) &&
|
||||
(window->win_chat_cursor_x > window->win_chat_width - 1)))
|
||||
{
|
||||
if (window->win_chat_cursor_x <= window->win_chat_width - 1)
|
||||
{
|
||||
snprintf (format_empty, 32, "%%-%ds",
|
||||
window->win_chat_width - window->win_chat_cursor_x);
|
||||
wprintw (window->win_chat, format_empty, " ");
|
||||
}
|
||||
window->win_chat_cursor_y++;
|
||||
}
|
||||
window->win_chat_cursor_x = 0;
|
||||
while (ptr_message && (ptr_message->message[offset] == ' '))
|
||||
gui_message_get_next_char (&ptr_message, &offset);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
|
||||
if (simulate)
|
||||
{
|
||||
window->win_chat_cursor_x = x;
|
||||
window->win_chat_cursor_y = y;
|
||||
}
|
||||
|
||||
return lines_displayed;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -700,7 +774,7 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
|
||||
while (ptr_line
|
||||
&& (lines_used < (ptr_win->win_chat_height + ptr_win->sub_lines)))
|
||||
{
|
||||
lines_used += gui_get_line_num_splits (ptr_win, ptr_line);
|
||||
lines_used += gui_display_line (ptr_win, ptr_line, 0, 1);
|
||||
ptr_line = ptr_line->prev_line;
|
||||
}
|
||||
ptr_win->win_chat_cursor_x = 0;
|
||||
@@ -709,9 +783,9 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
|
||||
{
|
||||
/* screen will be full (we'll display only end of 1st line) */
|
||||
ptr_line = (ptr_line) ? ptr_line->next_line : buffer->lines;
|
||||
gui_display_end_of_line (ptr_win, ptr_line,
|
||||
gui_get_line_num_splits (ptr_win, ptr_line) -
|
||||
(lines_used - (ptr_win->win_chat_height + ptr_win->sub_lines)));
|
||||
gui_display_line (ptr_win, ptr_line,
|
||||
gui_display_line (ptr_win, ptr_line, 0, 1) -
|
||||
(lines_used - (ptr_win->win_chat_height + ptr_win->sub_lines)), 0);
|
||||
ptr_line = ptr_line->next_line;
|
||||
ptr_win->first_line_displayed = 0;
|
||||
}
|
||||
@@ -729,15 +803,20 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
|
||||
ptr_line = ptr_line->next_line;
|
||||
}
|
||||
}
|
||||
while (ptr_line)
|
||||
|
||||
/* display lines */
|
||||
while (ptr_line && (ptr_win->win_chat_cursor_y <= ptr_win->win_chat_height - 1))
|
||||
{
|
||||
if (!gui_display_line (ptr_win, ptr_line, 1))
|
||||
break;
|
||||
|
||||
gui_display_line (ptr_win, ptr_line, 0, 0);
|
||||
ptr_line = ptr_line->next_line;
|
||||
}
|
||||
/*if (ptr_win->win_chat_cursor_y <= ptr_win->win_chat_height - 1)
|
||||
buffer->sub_lines = 0;*/
|
||||
|
||||
/* cursor is below end line of chat window? */
|
||||
if (ptr_win->win_chat_cursor_y > ptr_win->win_chat_height - 1)
|
||||
{
|
||||
ptr_win->win_chat_cursor_x = 0;
|
||||
ptr_win->win_chat_cursor_y = ptr_win->win_chat_height - 1;
|
||||
}
|
||||
}
|
||||
wrefresh (ptr_win->win_chat);
|
||||
refresh ();
|
||||
|
||||
Reference in New Issue
Block a user