From 117d9991ecc400f834b4217d5a88764013386c0f Mon Sep 17 00:00:00 2001
From: Angus Gibson <angus.gibson@anu.edu.au>
Date: Fri, 10 Jul 2015 13:52:12 +1000
Subject: [PATCH] Handle hidden weechat buffers

This adds a new 'hidden' field to the Buffer model, which stays in sync
with weechat's notion of hidden buffers.
---
 js/connection.js  |  2 +-
 js/glowingbear.js |  4 ++--
 js/handlers.js    | 17 +++++++++++++++++
 js/models.js      |  2 ++
 4 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/js/connection.js b/js/connection.js
index 9f9b345..ce121b3 100644
--- a/js/connection.js
+++ b/js/connection.js
@@ -62,7 +62,7 @@ weechat.factory('connection',
                 return ngWebsockets.send(
                     weeChat.Protocol.formatHdata({
                         path: 'buffer:gui_buffers(*)',
-                        keys: ['local_variables,notify,number,full_name,short_name,title']
+                        keys: ['local_variables,notify,number,full_name,short_name,title,hidden']
                     })
                 );
             };
diff --git a/js/glowingbear.js b/js/glowingbear.js
index 55ac297..740ede4 100644
--- a/js/glowingbear.js
+++ b/js/glowingbear.js
@@ -654,9 +654,9 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout',
             if (buffer.fullName === "core.weechat") {
                 return true;
             }
-            return buffer.unread > 0 || buffer.notification > 0;
+            return (buffer.unread > 0 || buffer.notification > 0) && !buffer.hidden;
         }
-        return true;
+        return !buffer.hidden;
     };
 
     // Watch model and update show setting when it changes
diff --git a/js/handlers.js b/js/handlers.js
index deb88d3..094279e 100644
--- a/js/handlers.js
+++ b/js/handlers.js
@@ -81,6 +81,7 @@ weechat.factory('handlers', ['$rootScope', '$log', 'models', 'plugins', 'notific
         buffer.trimmedName = buffer.shortName.replace(/^[#&+]/, '');
         buffer.title = message.title;
         buffer.number = message.number;
+        buffer.hidden = message.hidden;
 
         // reset these, hotlist info will arrive shortly
         buffer.notification = 0;
@@ -145,6 +146,20 @@ weechat.factory('handlers', ['$rootScope', '$log', 'models', 'plugins', 'notific
         }
     };
 
+    var handleBufferHidden = function(message) {
+        var obj = message.objects[0].content[0];
+        var buffer = obj.pointers[0];
+        var old = models.getBuffer(buffer);
+        old.hidden = true;
+    };
+
+    var handleBufferUnhidden = function(message) {
+        var obj = message.objects[0].content[0];
+        var buffer = obj.pointers[0];
+        var old = models.getBuffer(buffer);
+        old.hidden = false;
+    };
+
     var handleBufferLocalvarChanged = function(message) {
         var obj = message.objects[0].content[0];
         var buffer = obj.pointers[0];
@@ -253,6 +268,8 @@ weechat.factory('handlers', ['$rootScope', '$log', 'models', 'plugins', 'notific
         _buffer_opened: handleBufferOpened,
         _buffer_title_changed: handleBufferTitleChanged,
         _buffer_renamed: handleBufferRenamed,
+        _buffer_hidden: handleBufferHidden,
+        _buffer_unhidden: handleBufferUnhidden,
         _nicklist: handleNicklist,
         _nicklist_diff: handleNicklistDiff
     };
diff --git a/js/models.js b/js/models.js
index efc93d0..58cb691 100644
--- a/js/models.js
+++ b/js/models.js
@@ -63,6 +63,7 @@ models.service('models', ['$rootScope', '$filter', function($rootScope, $filter)
         // weechat properties
         var fullName = message.full_name;
         var shortName = message.short_name;
+        var hidden = message.hidden;
         // If it's a channel, trim away the prefix (#, &, or +). If that is empty and the buffer
         // has a short name, use a space (because the prefix will be displayed separately, and we don't want
         // prefix + fullname, which would happen otherwise). Else, use null so that full_name is used
@@ -289,6 +290,7 @@ models.service('models', ['$rootScope', '$filter', function($rootScope, $filter)
             id: pointer,
             fullName: fullName,
             shortName: shortName,
+            hidden: hidden,
             trimmedName: trimmedName,
             prefix: prefix,
             number: number,