View Single Post
Posts: 986 | Thanked: 1,526 times | Joined on Jul 2010
#3
v0.1
Code:
#!/usr/bin/python
#n9-button-monitor v0.1
#Copyright 2012 Elliot Wolk
#based on:
#####
# Ye Olde Camerra Hack - Another fine Harmattan Hack Powered by Python(tm)!
# 2012-01-12; Thomas Perl <thp.io/about>
#####
# 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.
#

from QmSystem import *
from PySide.QtGui import *
from PySide.QtDeclarative import *

import sys
import os
import subprocess
import re

###############
###############
###############
def getActions():
  return ([ None
  , Action(volup, cond=appOnTop("camera-ui"), action=cmd("camera-click"))
  , Action(volup, cond=screenLocked, action=cmd("klomp-cmd pause"))
  , Action(voldn, cond=screenLocked, action=cmd("klomp-cmd next"))
  ])

def readProc(cmdarr):
  out, err = subprocess.Popen(cmdarr, stdout=subprocess.PIPE).communicate()
  return out

def screenLocked():
  return "locked\n" == readProc(['lock', '-g'])
def screenUnlocked():
  return not screenLocked()

def appOnTop(app):
  return lambda: isAppOnTop(app)
def isAppOnTop(app):
  winId = readProc(["xprop", "-root", "_NET_ACTIVE_WINDOW"]) [40:]
  winCmd = readProc(["xprop", "-id", winId, "WM_COMMAND"]) [24:-4]
  return app in winCmd

def cmd(cmd):
  return lambda: runcmd(cmd)
def runcmd(cmd):
  print 'running cmd: "' + cmd + '"'
  subprocess.Popen(['bash', '-c', cmd])
###############
###############
###############

evtPressed = 'pressed'
evtRepeated = 'repeated'
evtReleased = 'released'

stateOn = 2
stateOff = 0

power = 20
volup = 2
voldn = 3

class Action():
  def __init__(self, key, event=evtPressed, action=None, cond=None, stop=True):
    self.key = key
    self.event = event
    self.action = action
    self.cond = cond
    self.stop = stop

keysPressed = set()
actions = getActions()

def keyEvent(key, state):
  event = None
  if state == stateOn:
    if key not in keysPressed:
      event = evtPressed
    else:
      event = evtRepeated
  elif state == stateOff:
    event = evtReleased

  if state == stateOn:
    keysPressed.add(key)
  elif state == stateOff:
    keysPressed.discard(key)

  for action in actions:
    if action != None and action.key == key and action.event == event:
      if action.cond == None or action.cond():
        action.action()
        if action.stop:
          return

def main():
  app = QApplication(sys.argv)
  keys = QmKeys()
  keys.keyEvent.connect(keyEvent)
  app.exec_()

if __name__ == "__main__":
  sys.exit(main())
 

The Following 6 Users Say Thank You to wolke For This Useful Post: