diff --git a/js/websockets.js b/js/websockets.js index 22862bf..6d16d09 100644 --- a/js/websockets.js +++ b/js/websockets.js @@ -35,7 +35,7 @@ weechat.factory('handlers', ['$rootScope', 'models', 'plugins', function($rootSc } if (buffer.active) { - $rootScope.scrollToBottom(); + $rootScope.scrollWithBuffer(); } if (!initial && !buffer.active) { @@ -480,7 +480,7 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout', } $rootScope.$on('activeBufferChanged', function() { - $rootScope.scrollToBottom(); + $rootScope.scrollWithBuffer(true); var ab = models.getActiveBuffer(); $rootScope.pageTitle = ab.shortName + ' | ' + ab.title; @@ -576,18 +576,23 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout', } }; - $rootScope.scrollToBottom = function() { - // FIXME doesn't work if the settimeout runs without a short delay + $rootScope.scrollWithBuffer = function(nonIncremental) { + // First, get scrolling status *before* modification + // This is required to determine where we were in the buffer pre-change + var bl = document.getElementById('bufferlines'); + var sVal = bl.scrollHeight - bl.clientHeight; + var scroll = function() { - var readmarker = document.getElementById('readmarker'); - if(readmarker) { - readmarker.scrollIntoView(); - }else{ - var bl = document.getElementById('bufferlines'); - var sTop = bl.scrollTop; - var sVal = bl.scrollHeight - bl.clientHeight; - if(sTop < sVal) { - bl.scrollTop = sVal; + var sTop = bl.scrollTop; + // Determine if we want to scroll at all + if (nonIncremental && sTop < sVal || sTop == sVal) { + var readmarker = document.getElementById('readmarker'); + if(nonIncremental && readmarker) { + // Switching channels, scroll to read marker + readmarker.scrollIntoView(); + } else { + // New message, scroll with buffer (i.e. to bottom) + bl.scrollTop = bl.scrollHeight - bl.clientHeight; } } };