mirror of
https://github.com/irssi/irssi.git
synced 2025-01-03 14:56:47 -05:00
/LAST -away checks only lines that came after last time you went away.
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@355 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
cf75515274
commit
bc8848f965
@ -114,6 +114,11 @@ static void remove_first_line(WINDOW_REC *window)
|
||||
if (--chunk->lines == 0)
|
||||
text_chunk_free(gui, chunk);
|
||||
|
||||
if (gui->lastlog_last_check->data == window)
|
||||
gui->lastlog_last_check = NULL;
|
||||
if (gui->lastlog_last_away->data == window)
|
||||
gui->lastlog_last_away = NULL;
|
||||
|
||||
if (gui->startline->prev == NULL) {
|
||||
/* first line in screen removed */
|
||||
gui->startline = gui->startline->next;
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "levels.h"
|
||||
#include "settings.h"
|
||||
|
||||
#include "irc-server.h"
|
||||
#include "windows.h"
|
||||
|
||||
#include "screen.h"
|
||||
@ -84,10 +85,11 @@ static gchar *gui_window_line2text(LINE_REC *line)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define LASTLOG_FLAG_NEW 0x01
|
||||
#define LASTLOG_FLAG_NOHEADERS 0x02
|
||||
#define LASTLOG_FLAG_WORD 0x04
|
||||
#define LASTLOG_FLAG_REGEXP 0x08
|
||||
#define LASTLOG_FLAG_NEW_LAST 0x01
|
||||
#define LASTLOG_FLAG_NEW_AWAY 0x02
|
||||
#define LASTLOG_FLAG_NOHEADERS 0x04
|
||||
#define LASTLOG_FLAG_WORD 0x08
|
||||
#define LASTLOG_FLAG_REGEXP 0x10
|
||||
|
||||
static int lastlog_parse_args(char *args, int *flags)
|
||||
{
|
||||
@ -101,7 +103,9 @@ static int lastlog_parse_args(char *args, int *flags)
|
||||
if (strcmp(*tmp, "-") == 0)
|
||||
*flags |= LASTLOG_FLAG_NOHEADERS;
|
||||
else if (g_strcasecmp(*tmp, "-new") == 0)
|
||||
*flags |= LASTLOG_FLAG_NEW;
|
||||
*flags |= LASTLOG_FLAG_NEW_LAST;
|
||||
else if (g_strcasecmp(*tmp, "-away") == 0)
|
||||
*flags |= LASTLOG_FLAG_NEW_AWAY;
|
||||
else if (g_strcasecmp(*tmp, "-word") == 0)
|
||||
*flags |= LASTLOG_FLAG_WORD;
|
||||
else if (g_strcasecmp(*tmp, "-regexp") == 0)
|
||||
@ -118,23 +122,6 @@ static int lastlog_parse_args(char *args, int *flags)
|
||||
#define lastlog_match(line, level) \
|
||||
(((line)->level & level) != 0 && ((line)->level & MSGLEVEL_LASTLOG) == 0)
|
||||
|
||||
static GList *lastlog_window_startline(int only_new)
|
||||
{
|
||||
GList *startline, *tmp;
|
||||
|
||||
startline = WINDOW_GUI(active_win)->lines;
|
||||
if (!only_new) return startline;
|
||||
|
||||
for (tmp = startline; tmp != NULL; tmp = tmp->next) {
|
||||
LINE_REC *rec = tmp->data;
|
||||
|
||||
if (rec->level & MSGLEVEL_LASTLOG)
|
||||
startline = tmp;
|
||||
}
|
||||
|
||||
return startline;
|
||||
}
|
||||
|
||||
static GList *lastlog_find_startline(GList *list, int count, int start, int level)
|
||||
{
|
||||
GList *tmp;
|
||||
@ -183,7 +170,14 @@ static void cmd_lastlog(const char *data)
|
||||
if ((flags & LASTLOG_FLAG_NOHEADERS) == 0)
|
||||
printformat(NULL, NULL, MSGLEVEL_LASTLOG, IRCTXT_LASTLOG_START);
|
||||
|
||||
startline = lastlog_window_startline(flags & LASTLOG_FLAG_NEW);
|
||||
if (flags & LASTLOG_FLAG_NEW_LAST)
|
||||
startline = WINDOW_GUI(active_win)->lastlog_last_check;
|
||||
else if (flags & LASTLOG_FLAG_NEW_AWAY)
|
||||
startline = WINDOW_GUI(active_win)->lastlog_last_away;
|
||||
else
|
||||
startline = NULL;
|
||||
if (startline == NULL) startline = WINDOW_GUI(active_win)->lines;
|
||||
|
||||
list = gui_window_find_text(active_win, text, startline, flags & LASTLOG_FLAG_REGEXP, flags & LASTLOG_FLAG_WORD);
|
||||
tmp = lastlog_find_startline(list, count, atoi(start), level);
|
||||
|
||||
@ -209,6 +203,9 @@ static void cmd_lastlog(const char *data)
|
||||
if ((flags & LASTLOG_FLAG_NOHEADERS) == 0)
|
||||
printformat(NULL, NULL, MSGLEVEL_LASTLOG, IRCTXT_LASTLOG_END);
|
||||
|
||||
WINDOW_GUI(active_win)->lastlog_last_check =
|
||||
g_list_last(WINDOW_GUI(active_win)->bottom_startline);
|
||||
|
||||
g_list_free(list);
|
||||
g_free(params);
|
||||
}
|
||||
@ -378,22 +375,41 @@ static void cmd_scrollback_end(gchar *data)
|
||||
signal_emit("gui page scrolled", 1, active_win);
|
||||
}
|
||||
|
||||
static void sig_away_changed(IRC_SERVER_REC *server)
|
||||
{
|
||||
GSList *tmp;
|
||||
|
||||
if (!server->usermode_away)
|
||||
return;
|
||||
|
||||
for (tmp = windows; tmp != NULL; tmp = tmp->next) {
|
||||
WINDOW_REC *rec = tmp->data;
|
||||
|
||||
WINDOW_GUI(rec)->lastlog_last_away =
|
||||
g_list_last(WINDOW_GUI(rec)->bottom_startline);
|
||||
}
|
||||
}
|
||||
|
||||
void gui_textwidget_init(void)
|
||||
{
|
||||
command_bind("lastlog", NULL, (SIGNAL_FUNC) cmd_lastlog);
|
||||
command_bind("scrollback", NULL, (SIGNAL_FUNC) cmd_scrollback);
|
||||
command_bind("scrollback clear", NULL, (SIGNAL_FUNC) cmd_scrollback_clear);
|
||||
command_bind("scrollback goto", NULL, (SIGNAL_FUNC) cmd_scrollback_goto);
|
||||
command_bind("scrollback home", NULL, (SIGNAL_FUNC) cmd_scrollback_home);
|
||||
command_bind("scrollback end", NULL, (SIGNAL_FUNC) cmd_scrollback_end);
|
||||
command_bind("lastlog", NULL, (SIGNAL_FUNC) cmd_lastlog);
|
||||
command_bind("scrollback", NULL, (SIGNAL_FUNC) cmd_scrollback);
|
||||
command_bind("scrollback clear", NULL, (SIGNAL_FUNC) cmd_scrollback_clear);
|
||||
command_bind("scrollback goto", NULL, (SIGNAL_FUNC) cmd_scrollback_goto);
|
||||
command_bind("scrollback home", NULL, (SIGNAL_FUNC) cmd_scrollback_home);
|
||||
command_bind("scrollback end", NULL, (SIGNAL_FUNC) cmd_scrollback_end);
|
||||
|
||||
signal_add("away mode changed", (SIGNAL_FUNC) sig_away_changed);
|
||||
}
|
||||
|
||||
void gui_textwidget_deinit(void)
|
||||
{
|
||||
command_unbind("lastlog", (SIGNAL_FUNC) cmd_lastlog);
|
||||
command_unbind("scrollback", (SIGNAL_FUNC) cmd_scrollback);
|
||||
command_unbind("scrollback clear", (SIGNAL_FUNC) cmd_scrollback_clear);
|
||||
command_unbind("scrollback goto", (SIGNAL_FUNC) cmd_scrollback_goto);
|
||||
command_unbind("scrollback home", (SIGNAL_FUNC) cmd_scrollback_home);
|
||||
command_unbind("scrollback end", (SIGNAL_FUNC) cmd_scrollback_end);
|
||||
command_unbind("lastlog", (SIGNAL_FUNC) cmd_lastlog);
|
||||
command_unbind("scrollback", (SIGNAL_FUNC) cmd_scrollback);
|
||||
command_unbind("scrollback clear", (SIGNAL_FUNC) cmd_scrollback_clear);
|
||||
command_unbind("scrollback goto", (SIGNAL_FUNC) cmd_scrollback_goto);
|
||||
command_unbind("scrollback home", (SIGNAL_FUNC) cmd_scrollback_home);
|
||||
command_unbind("scrollback end", (SIGNAL_FUNC) cmd_scrollback_end);
|
||||
|
||||
signal_remove("away mode changed", (SIGNAL_FUNC) sig_away_changed);
|
||||
}
|
||||
|
@ -72,6 +72,10 @@ typedef struct {
|
||||
a screenful when started or used /CLEAR */
|
||||
int bottom; /* window is at the bottom of the text buffer */
|
||||
|
||||
/* For /LAST -new and -away */
|
||||
GList *lastlog_last_check;
|
||||
GList *lastlog_last_away;
|
||||
|
||||
/* for gui-printtext.c */
|
||||
int last_subline;
|
||||
int last_color, last_flags;
|
||||
|
Loading…
Reference in New Issue
Block a user