Page MenuHomePhabricator

No OneTemporary

diff --git a/lt_presentation.ico b/lt_presentation.ico
deleted file mode 100644
index 50db7c791fcdb265381869f0f6c8b65f51530855..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
diff --git a/lt_presentation.png b/lt_presentation.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b0d7e02e5abc2ba142e6448a4d2bcf222c73536
GIT binary patch
literal 16577
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
U>_0Q_zytt_vT8ClQlOCk1-zQw;{X5v
diff --git a/lt_presentation.py b/lt_presentation.py
--- a/lt_presentation.py
+++ b/lt_presentation.py
@@ -1,240 +1,240 @@
#!/usr/bin/env python
# This is lt_presentation
# A simple system tray tool to send LogiTech Presenter events
# directly to the desired presentation tool.
#
# It wraps around Atril, xdotool and wmctrl and requires python-evdev
# to communicate with the Presenter.
#
# Xfce's Presentation Mode is automatically activated and reset whenever
# a presentation is active.
import dbus
import evdev
import subprocess
import sys
import time
from PyQt4.QtCore import QTimer
from PyQt4 import QtGui
DEV_C = "Logitech USB Receiver"
class Manager():
def __init__(self, parent = None):
self.parent = parent
self.timer = QTimer()
self.timer.timeout.connect(self.check_events)
self.process = None
self.device = None
self.wid = None
self.pm_cookie = None
self.presentation_mode = False
self.presentation_active = False
def check_events(self):
if self.process:
if self.process.poll() == None:
try:
for event in self.device.read():
if event.type == evdev.ecodes.EV_KEY:
if event.code == evdev.ecodes.KEY_PAGEUP and event.value == 1:
self.send_key(self.wid, 'Page_Up')
elif event.code == evdev.ecodes.KEY_PAGEDOWN and event.value == 1:
self.send_key(self.wid, 'Page_Down')
elif event.code == evdev.ecodes.KEY_F5 and event.value == 1:
self.send_key(self.wid, 'F5')
elif event.code == evdev.ecodes.KEY_ESC and event.value == 1:
self.send_key(self.wid, 'Escape')
elif event.code == evdev.ecodes.KEY_DOT and event.value == 1:
self.send_key(self.wid, 'b')
except BlockingIOError:
pass
else:
self.stop_presentation()
else:
self.stop_presentation()
def stop_presentation(self):
print('Stopping Presentation')
self.presentation_active = False
self.timer.stop()
try:
self.device.ungrab()
except IOError:
pass
self.device.close()
self.device = None
self.wid = None
pm = dbus.SessionBus().get_object("org.freedesktop.PowerManagement", "/org/freedesktop/PowerManagement/Inhibit")
pm.UnInhibit(self.pm_cookie)
xfc = dbus.SessionBus().get_object('org.xfce.Xfconf', '/org/xfce/Xfconf')
xfc.SetProperty('xfce4-power-manager', '/xfce4-power-manager/presentation-mode', self.presentation_mode)
def check_viewer(self):
ret = subprocess.run(["atril", "--version"], stdout = subprocess.PIPE,
universal_newlines = True)
if ret.returncode == 0:
version = ret.stdout.replace('MATE Document Viewer ', '').replace('\n', '')
return version
else:
return False
def check_xdotool(self):
ret = subprocess.run(["xdotool", "--version"], stdout = subprocess.PIPE,
universal_newlines = True)
if ret.returncode == 0:
version = ret.stdout.replace('xdotool version ', '').replace('\n', '')
return version
else:
return False
def check_wmctrl(self):
ret = subprocess.run(["wmctrl", "--version"], stdout = subprocess.PIPE,
universal_newlines = True)
if ret.returncode == 0:
version = ret.stdout.replace('\n', '')
return version
else:
return False
def find_window_for_pid(self, pid):
print('Looking for window for PID: ' + str(pid))
ret = subprocess.run(["wmctrl", "-l", "-p"], stdout = subprocess.PIPE,
universal_newlines = True)
if ret.returncode == 0:
wpid = 0
wmid = 0
for line in ret.stdout.split('\n'):
args = line.split(' ')
pos = 1
for arg in args:
if arg == '':
continue
if pos == 1:
wmid = arg
elif pos == 3:
wpid = arg
pos += 1
if wpid == str(pid):
return wmid
return False
else:
return False
def get_window(self, pattern):
ret = subprocess.run(["xdotool", "search", "--name", pattern],
stdout = subprocess.PIPE, universal_newlines = True)
if ret.returncode == 0:
return ret.stdout.replace('\n', '')
else:
return False
def get_device(self, devname):
devices = [evdev.InputDevice(fn) for fn in evdev.list_devices()]
for dev in devices:
if dev.name == devname:
print('Found device: ', dev.fn)
return dev.fn
return False
def send_key(self, wid, key):
ret = subprocess.run(["xdotool", "key", "--window", wid, key])
return ret.returncode
def startPresentation(self):
print('Start Presentation')
if self.presentation_active:
QtGui.QMessageBox.critical(self.parent, 'Presentation already running!',
'There is already a presentation running.')
return False
device = self.get_device(DEV_C)
if not device:
QtGui.QMessageBox.critical(self.parent, 'Device not found!',
'Could not find presentation remote control')
return False
self.device = evdev.InputDevice(device)
try:
self.device.grab()
except IOError:
QtGui.QMessageBox.critical(self.parent, 'Error grabbing device',
'Could not grab Input device.')
return False
fname = QtGui.QFileDialog.getOpenFileName(self.parent, 'Open file', '', 'PDF (*.pdf)')
self.process = subprocess.Popen(["atril", fname])
# Give Atril some time to show its window
wid = self.find_window_for_pid(self.process.pid)
count = 0
while not wid and count < 10:
time.sleep(0.5)
wid = self.find_window_for_pid(self.process.pid)
count += 1
if not wid:
QtGui.QMessageBox.critical(self.parent, 'Atril not found!',
'Could not fin Atril presentation window in time')
return False
self.wid = wid
print('Found Atril Window: ' + wid)
# Inhibit power management
pm = dbus.SessionBus().get_object("org.freedesktop.PowerManagement", "/org/freedesktop/PowerManagement/Inhibit")
self.pm_cookie = pm.Inhibit("lt_presentation", "Presentation Starting")
xfc = dbus.SessionBus().get_object('org.xfce.Xfconf', '/org/xfce/Xfconf')
self.presentation_mode = xfc.GetProperty('xfce4-power-manager', '/xfce4-power-manager/presentation-mode')
xfc.SetProperty('xfce4-power-manager', '/xfce4-power-manager/presentation-mode', dbus.Boolean(True, variant_level=1))
self.presentation_active = True
self.timer.start(10)
class SystemTrayIcon(QtGui.QSystemTrayIcon):
def __init__(self, icon, m, parent=None):
self.parent = parent
QtGui.QSystemTrayIcon.__init__(self, icon, parent)
menu = QtGui.QMenu(parent)
presentationAction = menu.addAction("Start Presentation...")
presentationAction.triggered.connect(m.startPresentation)
exitAction = menu.addAction("Exit")
exitAction.triggered.connect(QtGui.qApp.quit)
self.setContextMenu(menu)
def main():
app = QtGui.QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False);
w = QtGui.QWidget()
m = Manager(w)
version = m.check_xdotool()
if version:
print('Running on xdotool version ' + version)
else:
QtGui.QMessageBox.critical(w, 'Tool not found', 'Could not find xdotool, will now quit')
sys.exit(1)
atrilVersion = m.check_viewer()
if atrilVersion:
print('Running on Atril version ' + atrilVersion)
else:
QtGui.QMessageBox.critical(w, 'Tool not found', 'Could not find Atril, will now quit')
sys.exit(1)
wmctrlVersion = m.check_wmctrl()
if wmctrlVersion:
print('Running on wmctrl version ' + wmctrlVersion)
else:
QtGui.QMssageBox.critical(w, 'Tool not found', 'Could not find wmctrl, will now quit')
sys.exit(1)
- trayIcon = SystemTrayIcon(QtGui.QIcon("lt_presentation.ico"), m, w)
+ trayIcon = SystemTrayIcon(QtGui.QIcon("lt_presentation.png"), m, w)
trayIcon.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()

File Metadata

Mime Type
text/x-diff
Expires
Fri, Jan 24, 8:38 AM (1 d, 15 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
532803
Default Alt Text
(30 KB)

Event Timeline