mintmenu/usr/lib/linuxmint/mintMenu/plugins/filemonitor.py

123 lines
3.8 KiB
Python
Raw Normal View History

2020-03-30 16:11:23 +01:00
#!/usr/bin/python3
2014-03-28 15:44:13 +00:00
2009-07-27 11:45:34 +01:00
import os
import os.path
import threading
import time
2013-03-14 00:24:32 +00:00
from gi.repository import GLib
2009-07-27 11:45:34 +01:00
try:
2010-09-23 10:03:18 +01:00
import pyinotify
hasInotify = True
2009-07-27 11:45:34 +01:00
except ImportError:
2010-09-23 10:03:18 +01:00
hasInotify = False
2009-07-27 11:45:34 +01:00
2009-07-27 11:45:34 +01:00
if hasInotify:
2010-09-23 10:03:18 +01:00
class FileMonitor(object):
def __init__(self):
2010-09-23 10:03:18 +01:00
self.monitorId = 0
self.wm = pyinotify.WatchManager()
self.wdds = {}
self.callbacks = {}
self.notifier = pyinotify.ThreadedNotifier(self.wm, self.fileChanged)
self.notifier.setDaemon(True)
2010-09-23 10:03:18 +01:00
self.notifier.start()
def addMonitor(self, filename, callback, args = None):
try:
mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_MODIFY
mId = self.wm.add_watch(filename, mask, rec = True)[filename]
if mId >= 0:
self.callbacks[mId] = (callback, args)
except:
2016-05-21 17:11:36 +01:00
mId = 0
2010-09-23 10:03:18 +01:00
return mId
def removeMonitor(self, monitorId):
2010-09-23 10:03:18 +01:00
if monitorId in self.callbacks:
self.wm.rm_watch(monitorId)
2010-09-23 10:03:18 +01:00
del self.callbacks[monitorId]
def fileChanged(self, event):
2010-09-23 10:03:18 +01:00
if event.wd in self.callbacks:
#print event.path
2010-09-23 10:03:18 +01:00
callback = self.callbacks[event.wd]
if callback[1]:
GLib.idle_add(callback[0], callback[1])
2010-09-23 10:03:18 +01:00
else:
GLib.idle_add(callback[0])
2009-07-27 11:45:34 +01:00
else:
2010-09-23 10:03:18 +01:00
class _MonitoredFile(object):
def __init__(self, filename, callback, monitorId, args):
2010-09-23 10:03:18 +01:00
self.filename = filename
self.callback = callback
self.monitorId = monitorId
self.args = args
self.exists = os.path.exists(self.filename)
2010-09-23 10:03:18 +01:00
if self.exists:
self.mtime = os.stat(filename).st_mtime
2010-09-23 10:03:18 +01:00
else:
self.mtime = 0
def hasChanged(self):
if os.path.exists(self.filename):
2010-09-23 10:03:18 +01:00
if not self.exists:
self.exists = True
self.mtime = os.stat(self.filename).st_mtime
2010-09-23 10:03:18 +01:00
return True
else:
mtime = os.stat(self.filename).st_mtime
2010-09-23 10:03:18 +01:00
if mtime != self.mtime:
self.mtime = mtime
return True
else:
if self.exists:
self.exists = False
return True
return False
class MonitorThread(threading.Thread):
def __init__(self, monitor):
threading.Thread.__init__(self)
2010-09-23 10:03:18 +01:00
self.monitor = monitor
def run(self):
while(1):
self.monitor.checkFiles()
time.sleep(1)
class FileMonitor(object):
def __init__(self):
2010-09-23 10:03:18 +01:00
self.monitorId = 0
self.monitoredFiles = []
self.monitorThread = MonitorThread(self)
self.monitorThread.setDaemon(True)
2010-09-23 10:03:18 +01:00
self.monitorThread.start()
def addMonitor(self, filename, callback, args = None):
2010-09-23 10:03:18 +01:00
self.monitorId += 1
self.monitoredFiles.append(_MonitoredFile(filename, callback, self.monitorId, args))
2010-09-23 10:03:18 +01:00
return self.monitorId
def removeMonitor(self, monitorId):
2010-09-23 10:03:18 +01:00
for monitored in self.monitoredFiles:
if monitorId == monitored.monitorId:
self.monitoredFiles.remove(monitored)
2010-09-23 10:03:18 +01:00
break
def checkFiles(self):
2010-09-23 10:03:18 +01:00
for monitored in self.monitoredFiles:
if monitored.hasChanged():
if monitored.args:
GLib.idle_add(monitored.callback, monitored.args)
2010-09-23 10:03:18 +01:00
else:
GLib.idle_add(monitored.callback)
2009-07-27 11:45:34 +01:00
monitor = FileMonitor()