# HG changeset patch # User Mikael Berthe # Date 1300140971 -3600 # Node ID f309f343070c485d656a8e472c7ddd501e73efad # Parent fad27c72a229516a539b04ef09bd7d20149d0465 Add command /buffer readmark diff -r fad27c72a229 -r f309f343070c mcabber/mcabber/commands.c --- a/mcabber/mcabber/commands.c Mon Mar 14 15:04:00 2011 +0100 +++ b/mcabber/mcabber/commands.c Mon Mar 14 23:16:11 2011 +0100 @@ -1730,6 +1730,8 @@ scr_buffer_dump(arg); } else if (!strcasecmp(subcmd, "list")) { scr_buffer_list(); + } else if (!strcasecmp(subcmd, "readmark")) { + scr_buffer_jump_readmark(); } else { scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!"); } diff -r fad27c72a229 -r f309f343070c mcabber/mcabber/hbuf.c --- a/mcabber/mcabber/hbuf.c Mon Mar 14 15:04:00 2011 +0100 +++ b/mcabber/mcabber/hbuf.c Mon Mar 14 23:16:11 2011 +0100 @@ -428,6 +428,23 @@ return g_list_nth(hbuf, pc*hlen/100); } +// hbuf_jump_readmark(hbuf) +// Return a pointer to the line following the readmark +// or NULL if no mark was found. +GList *hbuf_jump_readmark(GList *hbuf) +{ + hbuf_block *blk; + + hbuf = g_list_last(hbuf); + for ( ; hbuf; hbuf = g_list_previous(hbuf)) { + blk = (hbuf_block*)(hbuf->data); + if (blk->prefix.flags & HBB_PREFIX_READMARK) + return g_list_next(hbuf); + } + + return NULL; +} + // hbuf_dump_to_file(hbuf, filename) // Save the buffer to a file. void hbuf_dump_to_file(GList *hbuf, const char *filename) @@ -522,12 +539,12 @@ blk = (hbuf_block*)(hbuf->data); blk->prefix.flags ^= HBB_PREFIX_READMARK; // Shift hbuf in order to remove previous flags - // (XXX maybe can be optimized out if there's no risk + // (maybe it can be optimized out, if there's no risk // we have several marks) hbuf = g_list_previous(hbuf); } - // Remove old marks + // Remove old mark for ( ; hbuf; hbuf = g_list_previous(hbuf)) { blk = (hbuf_block*)(hbuf->data); if (blk->prefix.flags & HBB_PREFIX_READMARK) { diff -r fad27c72a229 -r f309f343070c mcabber/mcabber/hbuf.h --- a/mcabber/mcabber/hbuf.h Mon Mar 14 15:04:00 2011 +0100 +++ b/mcabber/mcabber/hbuf.h Mon Mar 14 23:16:11 2011 +0100 @@ -49,6 +49,7 @@ GList *hbuf_search(GList *hbuf, int direction, const char *string); GList *hbuf_jump_date(GList *hbuf, time_t t); GList *hbuf_jump_percent(GList *hbuf, int pc); +GList *hbuf_jump_readmark(GList *hbuf); gboolean hbuf_remove_receipt(GList *hbuf, gpointer xep184); void hbuf_set_readmark(GList *hbuf, gboolean action); diff -r fad27c72a229 -r f309f343070c mcabber/mcabber/screen.c --- a/mcabber/mcabber/screen.c Mon Mar 14 15:04:00 2011 +0100 +++ b/mcabber/mcabber/screen.c Mon Mar 14 23:16:11 2011 +0100 @@ -2946,6 +2946,33 @@ update_panels(); } +// scr_buffer_jump_readmark() +// Jump to the buffer readmark, if there's one +void scr_buffer_jump_readmark(void) +{ + winbuf *win_entry; + GList *search_res; + guint isspe; + + // Get win_entry + if (!current_buddy) return; + isspe = buddy_gettype(BUDDATA(current_buddy)) & ROSTER_TYPE_SPECIAL; + if (isspe) return; + win_entry = scr_search_window(CURRENT_JID, isspe); + if (!win_entry) return; + + search_res = hbuf_jump_readmark(win_entry->bd->hbuf); + + win_entry->bd->cleared = FALSE; + win_entry->bd->top = search_res; + + // Refresh the window + scr_update_window(win_entry); + + // Finished :) + update_panels(); +} + // scr_buffer_dump(filename) // Dump the current buffer content to the specified file. void scr_buffer_dump(const char *file) diff -r fad27c72a229 -r f309f343070c mcabber/mcabber/screen.h --- a/mcabber/mcabber/screen.h Mon Mar 14 15:04:00 2011 +0100 +++ b/mcabber/mcabber/screen.h Mon Mar 14 23:16:11 2011 +0100 @@ -156,6 +156,7 @@ void scr_buffer_list(void); void scr_buffer_scroll_up_down(int updown, unsigned int nblines); void scr_buffer_readmark(gboolean action); +void scr_buffer_jump_readmark(void); bool scr_roster_color(const char *status, const char *wildcard, const char *color);