comparison frontends/src/primitivus/primitivus @ 1947:be4b143cf123

primitivus: fixed paste detection/handling: - mouse and window events are discarded - input_ is used to get text - cursor position is used to paste buffer in the good place, and updated once finished
author Goffi <goffi@goffi.org>
date Fri, 22 Apr 2016 22:30:13 +0200
parents 827bb478d8af
children 373550000092
comparison
equal deleted inserted replaced
1946:827bb478d8af 1947:be4b143cf123
23 from sat.core import log_config 23 from sat.core import log_config
24 log_config.satConfigure(C.LOG_BACKEND_STANDARD, C) 24 log_config.satConfigure(C.LOG_BACKEND_STANDARD, C)
25 from sat.core import log as logging 25 from sat.core import log as logging
26 log = logging.getLogger(__name__) 26 log = logging.getLogger(__name__)
27 import urwid 27 import urwid
28 from urwid.util import is_wide_char
28 from urwid_satext import sat_widgets 29 from urwid_satext import sat_widgets
29 from urwid_satext.files_management import FileDialog 30 from urwid_satext.files_management import FileDialog
30 from sat_frontends.bridge.DBus import DBusBridgeFrontend 31 from sat_frontends.bridge.DBus import DBusBridgeFrontend
31 from sat_frontends.quick_frontend.quick_app import QuickApp 32 from sat_frontends.quick_frontend.quick_app import QuickApp
32 from sat_frontends.quick_frontend import quick_utils 33 from sat_frontends.quick_frontend import quick_utils
356 self._early_popup = popup 357 self._early_popup = popup
357 else: 358 else:
358 self.showPopUp(popup) 359 self.showPopUp(popup)
359 super(PrimitivusApp, self).postInit(self.main_widget) 360 super(PrimitivusApp, self).postInit(self.main_widget)
360 361
362 def keysToText(self, keys):
363 """Generator return normal text from urwid keys"""
364 for k in keys:
365 if k == 'tab':
366 yield u'\t'
367 elif k == 'enter':
368 yield u'\n'
369 elif is_wide_char(k,0) or (len(k)==1 and ord(k) >= 32):
370 yield k
371
361 def inputFilter(self, input_, raw): 372 def inputFilter(self, input_, raw):
362 if self.__saved_overlay and input_ != a_key['OVERLAY_HIDE']: 373 if self.__saved_overlay and input_ != a_key['OVERLAY_HIDE']:
363 return 374 return
364 375
365 if len(input_) > 1: # XXX: it may be needed to increase this value if buffer 376 if (len(input_) > 1 and # XXX: it may be needed to increase this value if buffer
366 # or other things result in several chars at once 377 not isinstance(input_[0], tuple) and # or other things result in several chars at once
367 # (e.g. using Primitivus through ssh). Need some testing 378 not 'window' in input_[0]): # (e.g. using Primitivus through ssh). Need some testing
368 # and experience to adjust value. 379 # and experience to adjust value.
369 log.debug(u"Paste detected") 380 log.debug(u"Paste detected (len {})".format(len(input_)))
370 try: 381 try:
371 edit_bar = self.editBar 382 edit_bar = self.editBar
372 except AttributeError: 383 except AttributeError:
373 log.warning(u"Paste discarded: there is no edit bar yet") 384 log.warning(u"Paste discarded: there is no edit bar yet")
374 else: 385 else:
375 # XXX: if a paste is detected, we append it directly to the edit bar text 386 # XXX: if a paste is detected, we append it directly to the edit bar text
376 # so the use can check it and press [enter] if it's OK 387 # so the use can check it and press [enter] if it's OK
377 buf_paste = u''.join((unichr(k) for k in raw)) 388 buf_paste = u''.join(self.keysToText(input_))
378 edit_bar.set_edit_text(u'{}{}'.format(edit_bar.edit_text, buf_paste)) 389 pos = edit_bar.edit_pos
390 edit_bar.set_edit_text(u'{}{}{}'.format(edit_bar.edit_text[:pos], buf_paste, edit_bar.edit_text[pos:]))
391 edit_bar.edit_pos+=len(buf_paste)
379 return 392 return
380 393
381 for i in input_: 394 for i in input_:
382 if isinstance(i,tuple): 395 if isinstance(i,tuple):
383 if i[0] == 'mouse press': 396 if i[0] == 'mouse press':