aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile10
-rw-r--r--TODO1
-rw-r--r--examples/plugins/kmsg30
-rw-r--r--src/plugins/kmsg.py62
-rw-r--r--src/plugins/linereader.py4
5 files changed, 100 insertions, 7 deletions
diff --git a/Makefile b/Makefile
index d0d3fea..bba2721 100644
--- a/Makefile
+++ b/Makefile
@@ -17,13 +17,13 @@ PLUGIN_PATH = $(DATADIR)/$(PKGNAME)
SRC = __main__ util x
PLUGINS = chase clock cpuifo cpuonline cpu df discstats ipaddress \
- leapsec linereader loadavg lunar mem moc network pacman \
- snmp snmp6 softirqs solar uname uptime users vmstat \
- weather xdisplay xkb
+ kmsg leapsec linereader loadavg lunar mem moc network \
+ pacman snmp snmp6 softirqs solar uname uptime users \
+ vmstat weather xdisplay xkb
PLUGIN_EXAMPLES = chase clock cpu cpuinfo cpuonline df discstats \
- ipaddress loadavg lunar mem moc network pacman \
- uname uptime users xdisplay xkb
+ ipaddress kmsg loadavg lunar mem moc network \
+ pacman uname uptime users xdisplay xkb
EXAMPLES = clock mixed moderate plugin-test test xmonad
diff --git a/TODO b/TODO
index 68ef4c9..f99403c 100644
--- a/TODO
+++ b/TODO
@@ -17,7 +17,6 @@ List of plugins to implement:
Backlight control
hdparm
Thermal monitoring
- kernel console output
ESSID and link quality for wireless interfaces
News feed syndication
Keyboard layout
diff --git a/examples/plugins/kmsg b/examples/plugins/kmsg
new file mode 100644
index 0000000..bb2ddff
--- /dev/null
+++ b/examples/plugins/kmsg
@@ -0,0 +1,30 @@
+# -*- python -*-
+
+# A xpybar configuration example testing the features of plugins.kmsg
+
+from plugins.kmsg import KMsg
+
+
+OUTPUT, HEIGHT, YPOS, TOP = 0, 12, 24, True
+
+text = ''
+kmsg_ = KMsg()
+
+start_ = start
+def start():
+ start_()
+ def refresh():
+ global text
+ text = kmsg_.next()
+ if text is None:
+ text = ''
+ bar.invalidate()
+ import sys
+ sys.exit() # kill thread
+ bar.invalidate()
+ async(lambda : forever(refresh))
+
+def redraw():
+ bar.clear()
+ bar.draw_coloured_text(0, 10, 0, 2, text)
+
diff --git a/src/plugins/kmsg.py b/src/plugins/kmsg.py
new file mode 100644
index 0000000..da081f5
--- /dev/null
+++ b/src/plugins/kmsg.py
@@ -0,0 +1,62 @@
+# -*- python -*-
+'''
+xpybar – xmobar replacement written in python
+Copyright © 2014 Mattias Andrée (maandree@member.fsf.org)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+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
+
+from util import *
+
+from plugins.linereader import LineReader
+
+
+
+class KMsg(LineReader):
+ '''
+ Line reader for the kernel console output
+ '''
+
+
+ def __init__(self):
+ '''
+ Constructor
+ '''
+ LineReader.__init__(self, '/dev/kmsg')
+ self.__first = True
+
+
+ def next(self):
+ '''
+ Reads the next line
+
+ @return :str? The next line, `None` if stream has closed
+ '''
+ try:
+ if self.__first:
+ import time
+ self.__first = False
+ while True:
+ start = time.monotonic()
+ rc = LineReader.next(self)
+ end = time.monotonic()
+ if end - start > 1:
+ return rc
+ else:
+ return LineReader.next(self)
+ except:
+ return None
+
diff --git a/src/plugins/linereader.py b/src/plugins/linereader.py
index 643d7f9..103d15f 100644
--- a/src/plugins/linereader.py
+++ b/src/plugins/linereader.py
@@ -42,9 +42,11 @@ class LineReader:
if isinstance(channel, str):
self.__channel = channel = os.open(channel, os.O_RDONLY)
if isinstance(channel, int):
- next__ = lambda : channel.read()
+ channel = os.fdopen(channel)
+ next__ = lambda : channel.read(1)
buffer = ''
def next_():
+ nonlocal buffer
while True:
got = next__()
if (got is None) or (len(got) == 0):