Package plugins :: Package core :: Package keycodes :: Module main |
[hide private]
[frames] | no frames]

# Source Code for Module plugins.core.keycodes.main

      1  #-*- coding: utf8 -*
      2  #
      3  # Max E. Kuznecov ~syhpoon <syhpoon@syhpoon.name> 2008
      4  #
      5  # This file is part of XYZCommander.
      6  # XYZCommander is free software: you can redistribute it and/or modify
      7  # it under the terms of the GNU Lesser Public License as published by
      8  # the Free Software Foundation, either version 3 of the License, or
      9  # (at your option) any later version.
     10  # XYZCommander is distributed in the hope that it will be useful,
     11  # but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     13  # GNU Lesser Public License for more details.
     14  # You should have received a copy of the GNU Lesser Public License
     15  # along with XYZCommander. If not, see <http://www.gnu.org/licenses/>.
     16
     17  import os
     18  import cPickle
     19
     20  import libxyz.ui as uilib
     21
     22  from libxyz.core.plugins import BasePlugin
     23  from libxyz.core import UserData
     24  from libxyz.core.utils import ustring
     25  from libxyz.exceptions import PluginError
     26  from libxyz.exceptions import XYZRuntimeError
     27
     28 -class XYZPlugin(BasePlugin):
     29      """
     30      Terminal keycodes handling
     31      """
     32
     33      NAME = u"keycodes"
     34      AUTHOR = u"Max E. Kuznecov ~syhpoon <syhpoon@syhpoon.name>"
     35      VERSION = u"0.1"
     36      NAMESPACE = u"core"
     37
     38      BRIEF_DESCRIPTION = u"Setup terminal keycodes"
     39
     40      FULL_DESCRIPTION = u"keycodes plugin is used to properly "\
     41                         u"configure terminal keycodes.\n"\
     42                         u"For each terminal type keycodes are stored "\
     43                         u"independently. Terminal type determined by examining "\
     44                         u"TERM environment variable."
     45
     46      HOMEPAGE = u"xyzcmd.syhpoon.name"
     47      EVENTS = [("show",
     48                 "Fires upon showing dialog"),
     49                ]
     50
     51 -    def __init__(self, xyz):
     52          super(XYZPlugin, self).__init__(xyz)
     53
     54          self.export(self.learn_keys)
     55          self.export(self.delete_keys)
     56          self.export(self.get_keys)
     57
     58          self._keysfile = "keycodes"
     59          self._keyssubdir = "data"
     60          self._terminal = None
     61
     62          self._ud = UserData()
     63
     64          self._keys = uilib.Keys()
     65
     66          self.keys = (("F1", self._keys.F1),
     67                       ("F2", self._keys.F2),
     68                       ("F3", self._keys.F3),
     69                       ("F4", self._keys.F4),
     70                       ("F5", self._keys.F5),
     71                       ("F6", self._keys.F6),
     72                       ("F7", self._keys.F7),
     73                       ("F8", self._keys.F8),
     74                       ("F9", self._keys.F9),
     75                       ("F10", self._keys.F10),
     76                       ("F11", self._keys.F11),
     77                       ("F12", self._keys.F12),
     78                       ("F13", self._keys.F13),
     79                       ("F14", self._keys.F14),
     80                       ("F15", self._keys.F15),
     81                       ("F16", self._keys.F16),
     82                       ("F17", self._keys.F17),
     83                       ("F18", self._keys.F18),
     84                       ("F19", self._keys.F19),
     85                       ("F20", self._keys.F20),
     86                       ("BACKSPACE", self._keys.BACKSPACE),
     87                       ("END", self._keys.END),
     88                       ("UP", self._keys.UP),
     89                       ("DOWN", self._keys.DOWN),
     90                       ("LEFT", self._keys.LEFT),
     91                       ("RIGHT", self._keys.RIGHT),
     92                       ("HOME", self._keys.HOME),
     93                       ("PAGE UP", self._keys.PAGE_UP),
     94                       ("PAGE DOWN", self._keys.PAGE_DOWN),
     95                       ("INSERT", self._keys.INSERT),
     96                       ("TAB", self._keys.TAB),
     97                      )
     98
     99      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    100
    101 -    def prepare(self):
    102          self._terminal = os.getenv("TERM") or "DEFAULT"
    103
    104      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    105
    106 -    def learn_keys(self):
    107          """
    108          Show LearnKeys dialog
    109          """
    110
    111          self.fire_event("show")
    112          _title = _(u"%s - %s" % (self.NAME, self.VERSION))
    113
    114          _pressed = self._load_data()
    115
    116          if self._terminal not in _pressed:
    117              _pressed[self._terminal] = {}
    118
    119          _msg = _(u"Please press key %s\nPress ENTER to skip key\n"\
    120                   u"Press ESCAPE to quit dialog")
    121
    122          for _label, _key in self.keys:
    123              _m = _msg % _label
    124              _p = uilib.MessageBox(self.xyz, self.xyz.top, _m, _title).show()
    125
    126              if _p == [] or _p[0] == self._keys.ENTER:
    127                  continue
    128
    129              if _p[0] == self._keys.ESCAPE:
    130                  break
    131
    132              _cur = _pressed[self._terminal]
    133              _tkey = tuple(_p)
    134
    135              if _p[0] != _key or (_tkey in _cur and tuple(_p[0]) !=_cur[_tkey]):
    136                  _cur[_tkey] = _key
    137
    138          _ask_msg = _(u"Save learned keys?")
    139
    140          if uilib.YesNoBox(self.xyz, self.xyz.top, _ask_msg, _title).show():
    141              # Save data
    142              self._save_data(_pressed)
    143
    144      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    145
    146 -    def delete_keys(self, all=False):
    147          """
    148          Delete learned keycodes data.
    149          If all is True, delete all saved data for all terminal types,
    150          otherwise delete only current terminal type data.
    151          """
    152
    153          if all:
    154              try:
    155                  self._ud.delfile(self._keysfile, self._keyssubdir)
    156              except XYZRuntimeError, e:
    157                  pass
    158          else:
    159              _data = self._load_data()
    160
    161              if self._terminal in _data:
    162                  del _data[self._terminal]
    163
    164              try:
    165                  self._save_data(_data)
    166              except PluginError, e:
    167                  pass
    168
    169      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    170
    171 -    def get_keys(self, all=False):
    172          """
    173          Return saved keycodes data as dictionary.
    174          If all is True, return all saved data for all terminal types,
    175          otherwise return only current terminal type data.
    176          """
    177
    178          _data = self._load_data()
    179
    180          if not all:
    181              try:
    182                  _data = _data[self._terminal]
    183              except KeyError:
    184                  _data = {}
    185
    186          return _data
    187
    188      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    189
    190 -    def _save_data(self, data):
    191          """
    192          Store learned keycodes
    193          """
    194
    195          try:
    196              _file = self._ud.openfile(self._keysfile, "wb", self._keyssubdir)
    197          except XYZRuntimeError, e:
    198              raise PluginError(_(u"Unable to open file: %s" % ustring(str(e))))
    199
    200          try:
    201              cPickle.dump(data, _file)
    202          except cPickle.PicklingError:
    203              _file.close()
    204              raise PluginError(_(u"Unable to save learned data"))
    205          else:
    206              _file.close()
    207
    208          # Update inputwrapper data to make it available without restarting
    209          self.xyz.input.update(data[self._terminal])
    210
    211      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    212
    213 -    def _load_data(self):
    214          """
    215          Load stored keycodes
    216          """
    217
    218          _data = {}
    219
    220          try:
    221              _file = self._ud.openfile(self._keysfile, "rb", self._keyssubdir)
    222          except XYZRuntimeError, e:
    223              # Skip open error
    224              pass
    225          else:
    226              _data = cPickle.load(_file)
    227              _file.close()
    228
    229          return _data
    230