commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

r6002 - trunk/gnue-forms/src/uidrivers/curses


From: reinhard
Subject: r6002 - trunk/gnue-forms/src/uidrivers/curses
Date: Tue, 20 Jul 2004 15:07:06 -0500 (CDT)

Author: reinhard
Date: 2004-07-20 15:07:05 -0500 (Tue, 20 Jul 2004)
New Revision: 6002

Modified:
   trunk/gnue-forms/src/uidrivers/curses/UIdriver.py
Log:
Use keymapper.


Modified: trunk/gnue-forms/src/uidrivers/curses/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/curses/UIdriver.py   2004-07-20 19:20:19 UTC 
(rev 6001)
+++ trunk/gnue-forms/src/uidrivers/curses/UIdriver.py   2004-07-20 20:07:05 UTC 
(rev 6002)
@@ -24,6 +24,8 @@
 import curses
 
 from gnue.common import events
+from gnue.common.apps import i18n
+from gnue.forms.GFKeyMapper import vk, KeyMapper
 from gnue.forms.uidrivers._base.UIdriver import GFUserInterfaceBase
 
 # =============================================================================
@@ -37,6 +39,7 @@
   # ---------------------------------------------------------------------------
 
   def initialize (self):
+
     self.widgetWidth = 1
     self.widgetHeight = 1
     self.textWidth = 1
@@ -49,70 +52,137 @@
     curses.init_pair (4, curses.COLOR_WHITE, curses.COLOR_BLACK)
     self.__exiting = False
 
+    # This should go into the base driver:
+    KeyMapper.setUIKeyMap (self._keymap)
+
   # ---------------------------------------------------------------------------
   # Activate the given form
   # ---------------------------------------------------------------------------
 
   def _activateForm (self, form, modal):
+
     self.__currentForm = form
 
   # ---------------------------------------------------------------------------
-  # Clean up everything
+  # Key mapping for converting e.g. F13 into Shift-F3
   # ---------------------------------------------------------------------------
 
-  def _exit (self, formName):
-    curses.endwin ()
-    self.__exiting = True
+  __shiftkeys = {
+    #                   unshifted         Shift  Ctrl   Meta
+    #                   ------------------------------------
+    curses.KEY_F13:    (curses.KEY_F3,    True,  False, False),
+    curses.KEY_F14:    (curses.KEY_F4,    True,  False, False),
+    curses.KEY_F15:    (curses.KEY_F5,    True,  False, False),
+    curses.KEY_F16:    (curses.KEY_F6,    True,  False, False),
+    curses.KEY_F17:    (curses.KEY_F7,    True,  False, False),
+    curses.KEY_F18:    (curses.KEY_F8,    True,  False, False),
+    curses.KEY_F19:    (curses.KEY_F9,    True,  False, False),
+    curses.KEY_F20:    (curses.KEY_F10,   True,  False, False),
+    curses.KEY_SRIGHT: (curses.KEY_RIGHT, True,  False, False),
+    curses.KEY_SLEFT:  (curses.KEY_LEFT,  True,  False, False),
+    curses.KEY_SIC:    (curses.KEY_IC,    True,  False, False),
+    curses.KEY_SDC:    (curses.KEY_DC,    True,  False, False),
+    curses.KEY_SHOME:  (curses.KEY_HOME,  True,  False, False),
+    curses.KEY_SEND:   (curses.KEY_END,   True,  False, False)
+  }
 
   # ---------------------------------------------------------------------------
-  # Keys that simple generate an event
+  # Key mapping between curses codes and gnue codes
   # ---------------------------------------------------------------------------
 
-  __keymap = {
-    27:                   'requestEXIT',        # <Esc>
-    9:                    'requestNEXTENTRY',   # <Tab>
-    10:                   'requestNEXTENTRY',   # <Enter>
-    curses.KEY_UP:        'requestPREVENTRY',
-    curses.KEY_DOWN:      'requestNEXTENTRY',
-    curses.KEY_LEFT:      'requestCURSORLEFT',
-    curses.KEY_RIGHT:     'requestCURSORRIGHT',
-    curses.KEY_HOME:      'requestCURSORHOME',
-    curses.KEY_END:       'requestCURSOREND',   # <Backspace>
-    8:                    'requestBACKSPACE',
-    curses.KEY_BACKSPACE: 'requestBACKSPACE',
-    curses.KEY_DC:        'requestDELETE',
-    curses.KEY_IC:        'requestMODETOGGLE',
-    curses.KEY_NPAGE:     'requestNEXTPAGE',
-    curses.KEY_PPAGE:     'requestPREVPAGE'
+  _keymap = {
+    vk.F1        : curses.KEY_F1,
+    vk.F2        : curses.KEY_F2,
+    vk.F3        : curses.KEY_F3,
+    vk.F4        : curses.KEY_F4,
+    vk.F5        : curses.KEY_F5,
+    vk.F6        : curses.KEY_F6,
+    vk.F7        : curses.KEY_F7,
+    vk.F8        : curses.KEY_F8,
+    vk.F9        : curses.KEY_F9,
+    vk.F10       : curses.KEY_F10,
+    vk.F11       : curses.KEY_F11,
+    vk.F12       : curses.KEY_F12,
+    vk.INSERT    : curses.KEY_IC,
+    vk.DELETE    : curses.KEY_DC,
+    vk.HOME      : curses.KEY_HOME,
+    vk.END       : curses.KEY_END,
+    vk.PAGEUP    : curses.KEY_PPAGE,
+    vk.PAGEDOWN  : curses.KEY_NPAGE,
+    vk.UP        : curses.KEY_UP,
+    vk.DOWN      : curses.KEY_DOWN,
+    vk.LEFT      : curses.KEY_LEFT,
+    vk.RIGHT     : curses.KEY_RIGHT,
+    vk.TAB       : 9,
+    vk.ENTER     : 10,
+    vk.BACKSPACE : curses.KEY_BACKSPACE
   }
 
   # ---------------------------------------------------------------------------
-  # Generate and execute event for user action
+  # Generate and execute a requestXXX event for user action
   # ---------------------------------------------------------------------------
 
   def __action (self, name, **params):
+
+    # This could be in the base UI driver
     params ['_form'] = self._form
-    self.dispatchEvent (events.Event (name, **params))
+    self.dispatchEvent (events.Event ("request%s" % name, **params))
 
   # ---------------------------------------------------------------------------
+  # Handle a keyboard request for a character key
+  # ---------------------------------------------------------------------------
+
+  def __keypress (self, character):
+
+    # This could be in the base UI driver
+    if character < ' ':                 # control key
+      self.__action (KeyMapper.getEvent (ord (character), False, True, False))
+    else:
+      self.__action ('KEYPRESS', text = character)
+
+  # ---------------------------------------------------------------------------
+  # Handle a keyboard request for a function key
+  # ---------------------------------------------------------------------------
+
+  def __fkeypress (self, key, shift, ctrl, meta):
+
+    # This could be in the base UI driver
+    self.__action (KeyMapper.getEvent (key, shift, ctrl, meta))
+
+  # ---------------------------------------------------------------------------
   # Main loop
   # ---------------------------------------------------------------------------
 
   def mainLoop (self):
+
     while not self.__exiting:
       key = self.__currentForm.wait ()
 
       if key >= 32 and key <= 255:
-        self.__action ('requestKEYPRESS', text = chr (key))
+        self.__keypress (unicode (chr (key), i18n.encoding))
+      else:
+        if self.__shiftkeys.has_key (key):      # translate shifted f-key
+          (key, shift, ctrl, meta) = self.__shiftkeys [key]
+        else:
+          (shift, ctrl, meta) = (False, False, False)
+        self.__fkeypress (key, shift, ctrl, meta)
 
-      elif self.__keymap.has_key (key):
-        self.__action (self.__keymap [key])
+  # ---------------------------------------------------------------------------
+  # Set title of a form
+  # ---------------------------------------------------------------------------
 
+  def setTitle (self, event):
+
+    # Exactly this should actually be done by the base ui driver
+    ui = self._gfObjToUIWidget [event._form]
+    ui.setTitle (event.title)
+
   # ---------------------------------------------------------------------------
   # Display warning message
   # ---------------------------------------------------------------------------
 
   def formAlert (self, event):
+
     curses.beep ()
     curses.flash ()
 
@@ -121,6 +191,7 @@
   # ---------------------------------------------------------------------------
 
   def beginWait (self, event):
+
     pass
 
   # ---------------------------------------------------------------------------
@@ -128,22 +199,23 @@
   # ---------------------------------------------------------------------------
 
   def endWait (self, event):
+
     pass
 
   # ---------------------------------------------------------------------------
-  # Set title of a form
+  # Clean up everything
   # ---------------------------------------------------------------------------
 
-  def setTitle (self, event):
+  def _exit (self, formName):
 
-    # Exactly this should actually be done by the base ui driver
-    ui = self._gfObjToUIWidget [event._form]
-    ui.setTitle (event.title)
+    curses.endwin ()
+    self.__exiting = True
 
   # ---------------------------------------------------------------------------
   # Helper method for forms to get screen size
   # ---------------------------------------------------------------------------
 
   def screenSize (self):
+
     (y, x) = self.__screen.getmaxyx ()
     return (x, y)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]