diff terminal-title.py @ 0:c54a46719c46

Initial revision
author Guido Berhoerster <guido+weechat@berhoerster.name>
date Tue, 10 Mar 2015 22:40:28 +0100
parents
children 98c1a683d9c1
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/terminal-title.py	Tue Mar 10 22:40:28 2015 +0100
@@ -0,0 +1,126 @@
+#
+# Copyright (C) 2010 by Guido Berhoerster <guido+weechat@berhoerster.name>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 3 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+import os
+import sys
+import re
+import string
+from collections import Mapping
+import weechat
+
+SCRIPT_NAME = 'terminal-title'
+VERSION = '1'
+AUTHOR = 'Guido Berhoerster'
+DESCRIPTION = 'Displays user defined information in the terminal title'
+DEFAULT_SETTINGS = {
+    'title': ('WeeChat %version [%buffer_count] %buffer_number: '
+            '%buffer_name{%buffer_nicklist_count} [%hotlist]',
+            'items displayed in the terminal title')
+}
+TERM_TEMPLATES = [
+    ('xterm', "\033]0;%s\007"),
+    ('screen', "\033_%s\033\\")
+]
+TERM_TEMPLATE = None
+
+
+class TermTitleMapping(Mapping):
+    substitutions = {
+        'buffer_title':
+                lambda : weechat.buffer_get_string(weechat.current_buffer(),
+                "title"),
+        'buffer_name':
+                lambda : weechat.buffer_get_string(weechat.current_buffer(),
+                "name"),
+        'buffer_plugin':
+                lambda : weechat.buffer_get_string(weechat.current_buffer(),
+                "plugin"),
+        'buffer_number':
+                lambda : weechat.buffer_get_integer(weechat.current_buffer(),
+                "number"),
+        'buffer_nicklist_count':
+                lambda : weechat.buffer_get_integer(weechat.current_buffer(),
+                "nicklist_visible_count"),
+        'buffer_count': lambda : buffer_count(),
+        'hotlist': lambda : hotlist(),
+        'version': lambda : weechat.info_get("version", "")
+    }
+
+    def __getitem__(self, key):
+        return self.substitutions[key]()
+
+    def __iter__(self):
+        return self.substitutions.iterkeys()
+
+    def __len__(self):
+        return len(self.substitutions)
+
+
+class TermTitleTemplate(string.Template):
+    delimiter = '%'
+
+
+def buffer_count():
+    buffer_count = 0
+    buffer = weechat.infolist_get("buffer", "", "")
+    while weechat.infolist_next(buffer):
+        buffer_count += 1
+    weechat.infolist_free(buffer)
+    return buffer_count
+
+def hotlist():
+    hotlist_items = []
+    hotlist = weechat.infolist_get("hotlist", "", "")
+    while weechat.infolist_next(hotlist):
+        buffer_number = weechat.infolist_integer(hotlist, "buffer_number")
+        buffer = weechat.infolist_pointer(hotlist, "buffer_pointer")
+        short_name = weechat.buffer_get_string(buffer, "short_name")
+        hotlist_items.append("%s:%s" % (buffer_number, short_name))
+    weechat.infolist_free(hotlist)
+    return ",".join(hotlist_items)
+
+def set_term_title_hook(data, signal, signal_data):
+    title_template_str = weechat.config_get_plugin("title")
+    if not title_template_str:
+        return weechat.WEECHAT_RC_OK
+
+    title_template = TermTitleTemplate(title_template_str)
+    title_str = title_template.safe_substitute(TermTitleMapping())
+    sys.__stdout__.write(TERM_TEMPLATE % title_str)
+    sys.__stdout__.flush()
+
+    return weechat.WEECHAT_RC_OK
+
+
+if __name__ == '__main__':
+    weechat.register(SCRIPT_NAME, AUTHOR, VERSION, 'GPL3', DESCRIPTION, '', '')
+
+    for option, (value, description) in DEFAULT_SETTINGS.iteritems():
+        if not weechat.config_is_set_plugin(option):
+            weechat.config_set_plugin(option, value)
+        weechat.config_set_desc_plugin(option, '%s (default: "%s")' %
+                (description, value))
+
+    term = os.environ.get("TERM", None)
+    if term:
+        for term_name, term_template in TERM_TEMPLATES:
+            if term.startswith(term_name):
+                TERM_TEMPLATE = term_template
+                for hook in ["buffer_switch", "buffer_title_changed",
+                        "hotlist_changed", "upgrade_ended"]:
+                    weechat.hook_signal(hook, "set_term_title_hook", "")
+                set_term_title_hook("", "", "")
+                break