# -*- coding: utf-8 -*-
#*****************************************************************************
#       Copyright (C) 2003-2006 Gary Bishop.
#       Copyright (C) 2006  Jorgen Stenarson. <jorgen.stenarson@bostream.nu>
#
#  Distributed under the terms of the BSD License.  The full license is in
#  the file COPYING, distributed as part of this software.
#*****************************************************************************
import winconstants as c32
from ctypes import windll
import ctypes
# table for translating virtual keys to X windows key symbols

from common import validkey,KeyPress,make_KeyPress_from_keydescr

code2sym_map = {c32.VK_CANCEL:     'cancel',
                c32.VK_BACK:       'backspace',
                c32.VK_TAB:        'tab',
                c32.VK_CLEAR:      'clear',
                c32.VK_RETURN:     'return',
                c32.VK_SHIFT:      'shift_l',
                c32.VK_CONTROL:    'control_l',
                c32.VK_MENU:       'alt_l',
                c32.VK_PAUSE:      'pause',
                c32.VK_CAPITAL:    'caps_lock',
                c32.VK_ESCAPE:     'escape',
                c32.VK_SPACE:      'space',
                c32.VK_PRIOR:      'prior',
                c32.VK_NEXT:       'next',
                c32.VK_END:        'end',
                c32.VK_HOME:       'home',
                c32.VK_LEFT:       'left',
                c32.VK_UP:         'up',
                c32.VK_RIGHT:      'right',
                c32.VK_DOWN:       'down',
                c32.VK_SELECT:     'select',
                c32.VK_PRINT:      'print',
                c32.VK_EXECUTE:    'execute',
                c32.VK_SNAPSHOT:   'snapshot',
                c32.VK_INSERT:     'insert',
                c32.VK_DELETE:     'delete',
                c32.VK_HELP:       'help',
                c32.VK_F1:         'f1',
                c32.VK_F2:         'f2',
                c32.VK_F3:         'f3',
                c32.VK_F4:         'f4',
                c32.VK_F5:         'f5',
                c32.VK_F6:         'f6',
                c32.VK_F7:         'f7',
                c32.VK_F8:         'f8',
                c32.VK_F9:         'f9',
                c32.VK_F10:        'f10',
                c32.VK_F11:        'f11',
                c32.VK_F12:        'f12',
                c32.VK_F13:        'f13',
                c32.VK_F14:        'f14',
                c32.VK_F15:        'f15',
                c32.VK_F16:        'f16',
                c32.VK_F17:        'f17',
                c32.VK_F18:        'f18',
                c32.VK_F19:        'f19',
                c32.VK_F20:        'f20',
                c32.VK_F21:        'f21',
                c32.VK_F22:        'f22',
                c32.VK_F23:        'f23',
                c32.VK_F24:        'f24',
                c32.VK_NUMLOCK:    'num_lock,',
                c32.VK_SCROLL:     'scroll_lock',
                c32.VK_APPS:       'vk_apps',
                c32.VK_PROCESSKEY: 'vk_processkey',
                c32.VK_ATTN:       'vk_attn',
                c32.VK_CRSEL:      'vk_crsel',
                c32.VK_EXSEL:      'vk_exsel',
                c32.VK_EREOF:      'vk_ereof',
                c32.VK_PLAY:       'vk_play',
                c32.VK_ZOOM:       'vk_zoom',
                c32.VK_NONAME:     'vk_noname',
                c32.VK_PA1:        'vk_pa1',
                c32.VK_OEM_CLEAR   :'vk_oem_clear',
                c32.VK_NUMPAD0:    'numpad0',
                c32.VK_NUMPAD1:    'numpad1',
                c32.VK_NUMPAD2:    'numpad2',
                c32.VK_NUMPAD3:    'numpad3',
                c32.VK_NUMPAD4:    'numpad4',
                c32.VK_NUMPAD5:    'numpad5',
                c32.VK_NUMPAD6:    'numpad6',
                c32.VK_NUMPAD7:    'numpad7',
                c32.VK_NUMPAD8:    'numpad8',
                c32.VK_NUMPAD9:    'numpad9',
                c32.VK_DIVIDE:     'divide',
                c32.VK_MULTIPLY:   'multiply',
                c32.VK_ADD:        'add',
                c32.VK_SUBTRACT:   'subtract',
                c32.VK_DECIMAL:    'vk_decimal'
               }

VkKeyScan = windll.user32.VkKeyScanA

def char_to_keyinfo(char, control=False, meta=False, shift=False):
    k=KeyPress()
    vk = VkKeyScan(ord(char))
    if vk & 0xffff == 0xffff:
        print 'VkKeyScan("%s") = %x' % (char, vk)
        raise ValueError, 'bad key'
    if vk & 0x100:
        k.shift = True
    if vk & 0x200:
        k.control = True
    if vk & 0x400:
        k.meta = True
    k.char=chr(vk & 0xff)
    return k

def make_KeyPress(char,state,keycode):
    control = (state & (4+8)) != 0
    meta = (state & (1+2)) != 0
    shift = (state & 0x10) != 0
    if control and char !="\x00":
       char = chr(VkKeyScan(ord(char)) & 0xff)
    elif control:
        char=chr(keycode)
    try:
        keyname=code2sym_map[keycode]
    except KeyError:
        keyname=""
    return KeyPress(char,shift,control,meta,keyname)

if __name__=="__main__":
    import startup
    