aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-12-11 01:58:15 +0100
committerMattias Andrée <maandree@operamail.com>2014-12-11 01:58:15 +0100
commit623ebb2d3570795c3d405a8c293a8cad64d9b708 (patch)
tree36c26cc985f90598585872fbc294e2ed95f97fd4
parentm (diff)
downloadxpybar-623ebb2d3570795c3d405a8c293a8cad64d9b708.tar.gz
xpybar-623ebb2d3570795c3d405a8c293a8cad64d9b708.tar.bz2
xpybar-623ebb2d3570795c3d405a8c293a8cad64d9b708.tar.xz
add inotify
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rw-r--r--DEPENDENCIES1
-rw-r--r--Makefile5
-rw-r--r--examples/plugins/inotify46
-rw-r--r--src/plugins/inotify.py59
4 files changed, 109 insertions, 2 deletions
diff --git a/DEPENDENCIES b/DEPENDENCIES
index fd0f7ac..737bf3d 100644
--- a/DEPENDENCIES
+++ b/DEPENDENCIES
@@ -15,6 +15,7 @@ OPTIONAL RUNTIME DEPENDENCIES:
python-pytz: for timezone support
python-sysv-ipc: for ropty example
iputils: for ping support
+ inotify-tools: for inotify support
BUILD DEPENDENCIES:
diff --git a/Makefile b/Makefile
index a7d90e8..661d702 100644
--- a/Makefile
+++ b/Makefile
@@ -32,12 +32,13 @@ PLUGINS = chase clock cpuinfo cpuonline cpu df discstats ipaddress \
kmsg leapsec linereader loadavg lunar mem moc network \
pacman snmp snmp6 softirqs solar uname uptime users \
vmstat weather xdisplay xkb alsa dentrystate inodestate \
- files hdparm tzclock ropty ping
+ files hdparm tzclock ropty ping inotify
PLUGIN_EXAMPLES = chase clock cpu cpuinfo cpuonline df discstats \
ipaddress kmsg loadavg lunar mem moc network \
pacman uname uptime users xdisplay xkb alsa \
- dentrystate inodestate files tzclock ropty ping
+ dentrystate inodestate files tzclock ropty ping \
+ inotify
EXAMPLES = mixed moderate test xmonad
diff --git a/examples/plugins/inotify b/examples/plugins/inotify
new file mode 100644
index 0000000..d2a4afb
--- /dev/null
+++ b/examples/plugins/inotify
@@ -0,0 +1,46 @@
+# -*- python -*-
+
+# A xpybar configuration example testing the features of plugins.inotify
+# It also shows how you can monitor `featherweight`
+
+import os
+import threading
+
+from plugins.inotify import Inotify
+
+
+OUTPUT, HEIGHT, YPOS, TOP = 0, 12, 24, True
+
+
+def inotify(_line):
+ global news
+ semaphore.acquire()
+ try:
+ news = news_update_()
+ bar.invalidate()
+ finally:
+ semaphore.release()
+
+def news_update_():
+ try:
+ with open(featherweight_status_file, 'rb') as file:
+ status = int(file.read().decode('utf-8', 'replace').replace('\n', ''))
+ except:
+ status = 0
+ colour = '31'
+ if status <= 0: colour = '0'
+ elif status <= 5: colour = '32'
+ elif status <= 10: colour = '33'
+ return 'News: \033[%sm%i\033[0m' % (colour, status)
+
+featherweight_status_file = '%s/.var/lib/featherweight/status' % os.environ['HOME']
+news = news_update_()
+semaphore = threading.Semaphore()
+
+Inotify(inotify, featherweight_status_file, events = ['close_write'])
+
+
+def redraw():
+ bar.clear()
+ bar.draw_coloured_text(0, 10, 0, 2, news)
+
diff --git a/src/plugins/inotify.py b/src/plugins/inotify.py
new file mode 100644
index 0000000..5cf2d73
--- /dev/null
+++ b/src/plugins/inotify.py
@@ -0,0 +1,59 @@
+# -*- 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 Inotify:
+ '''
+ File access monitor
+ '''
+
+ def __init__(self, callback, *arguments, events = None):
+ '''
+ Constructor
+
+ @param callback:(str)→void Function that will be called everytime a line is read from
+ `inotifywait`'s standard output, the parameter will be that line,
+ note that this will not be asynchronously, you may want to specify
+ something like `lambda : async(fun)` for that, and use semaphores
+ in `fun`.
+ @param arguments:*str The files and directories you want to watch and any addition
+ argument you want to pass to `inotifywait`
+ @param event:itr<str>? Event you want reported, see "EVENTS" under `inotifywait`'s man page
+ '''
+ command = ['inotifywait', '-m']
+ if events is not None:
+ if isinstance(events, str):
+ events = [events]
+ for event in events:
+ command.append('-e')
+ command.append(event)
+ command += list(arguments)
+ def start():
+ with LineReader(spawn(*command)) as reader:
+ while True:
+ callback(reader.next())
+ async(start)
+