def _send_keycode(self, key, scancode, sym, modifiers): from kivy.core.window import Window print("Telenium: send key key={!r} scancode={} sym={!r} modifiers={}". format(key, scancode, sym, modifiers)) if not Window.dispatch("on_key_down", key, scancode, sym, modifiers): Window.dispatch("on_keyboard", key, scancode, sym, modifiers) Window.dispatch("on_key_up", key, scancode) return True
def process_as_mouse_or_keyboard(tv_sec, tv_usec, ev_type, ev_code, ev_value): if ev_type == EV_SYN: if ev_code == SYN_REPORT: process([point]) elif ev_type == EV_REL: if ev_code == 0: point['x'] = \ min(1., max(0., point['x'] + ev_value / 1000.)) elif ev_code == 1: point['y'] = \ min(1., max(0., point['y'] - ev_value / 1000.)) elif ev_type == EV_KEY: buttons = { 272: 'left', 273: 'right', 274: 'middle', 275: 'side', 276: 'extra', 277: 'forward', 278: 'back', 279: 'task'} if ev_code in buttons.keys(): if ev_value: if 'button' not in point: point['button'] = buttons[ev_code] point['id'] += 1 if '_avoid' in point: del point['_avoid'] elif 'button' in point: if point['button'] == buttons[ev_code]: del point['button'] point['id'] += 1 point['_avoid'] = True else: if ev_value == 1: l = keyboard_keys[ev_code][-1 if 'shift' in Window._modifiers else 0] if l == 'shift': Window._modifiers.append('shift') print(ev_code, l) Window.dispatch('on_key_down', Keyboard.keycodes[l.lower()], ev_code, keys_str.get(l, l), Window._modifiers) if ev_value == 0: l = keyboard_keys[ev_code][-1 if 'shift' in Window._modifiers else 0] Window.dispatch('on_key_up', Keyboard.keycodes[l.lower()], ev_code, keys_str.get(l, l), Window._modifiers) if l == 'shift': Window._modifiers.remove('shift')
def _real_screenshot(): import tempfile from kivy.core.window import Window from kivy.utils import platform try: fd = tempfile.NamedTemporaryFile(suffix=".png", delete=False) # XXX hack, Window.screenshot doesn't respect our filename screenshot_fn = fd.name.rsplit(".")[-2] + "0001.png" fd.close() if platform == "ios": from kivy.graphics.opengl import glReadPixels, GL_RGBA, GL_UNSIGNED_BYTE from kivy.core.image import ImageLoader # hacky, as Window don't have correct system size (why, i don't # know.) width, height = Window._win._get_gl_size() Window.dispatch("on_draw") data = glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE) # save using standard imageloader, but in rgba loader = [x for x in ImageLoader.loaders if x.can_save()][0] loader.save(screenshot_fn, width, height, "rgba", data, True) """ # strides issue data = list(data) del data[3::4] data = "".join(data) Window._win.save_bytes_in_png(screenshot_fn, data, width, height) """ else: Window.screenshot(name=fd.name) with open(screenshot_fn, "rb") as fd: data = fd.read() _result[:] = [width, height, base64.encodestring(data)] except: import traceback traceback.print_exc() finally: try: os.unlink(screenshot_fn) os.unlink(fd.name) except: pass _event.set()
def update(self, dispatch_fn): # dispatch all events from threads dispatch_queue = self.dispatch_queue n = len(dispatch_queue) for name, args in dispatch_queue[:n]: if name == 'mouse_pos': Window.mouse_pos = args elif name == 'key_down': if not Window.dispatch('on_key_down', *args): Window.dispatch('on_keyboard', *args) elif name == 'key_up': Window.dispatch('on_key_up', *args) del dispatch_queue[:n] try: while True: event_type, touch = self.queue.popleft() dispatch_fn(event_type, touch) except: pass
def _real_screenshot(): import tempfile from kivy.core.window import Window try: fd = tempfile.NamedTemporaryFile(suffix=".png", delete=False) # XXX hack, Window.screenshot doesn't respect our filename screenshot_fn = fd.name.rsplit(".")[-2] + "0001.png" fd.close() """ width, height = Window.size print(width, height) Window.screenshot(name=fd.name) """ from kivy.graphics.opengl import glReadPixels, GL_RGBA, GL_UNSIGNED_BYTE from kivy.core.image import ImageLoader # hacky, as Window don't have correct system size (why, i don't # know.) width, height = Window._win._get_gl_size() Window.dispatch("on_draw") data = glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE) # save using standard imageloader, but in rgba loader = [x for x in ImageLoader.loaders if x.can_save(fmt="png", is_bytesio=False)][0] loader.save(screenshot_fn, width, height, "rgba", data, True, "png") with open(screenshot_fn, "rb") as fd: data = fd.read() _result[:] = [width, height, base64.encodestring(data).decode("utf8")] except: import traceback traceback.print_exc() finally: try: os.unlink(screenshot_fn) os.unlink(fd.name) except: pass _event.set()
async def do_keyboard_key(self, key, modifiers=(), duration=.05, num_press=1): from kivy.core.window import Window if key == ' ': key = 'spacebar' key_lower = key.lower() key_code = Window._system_keyboard.string_to_keycode(key_lower) known_modifiers = {'shift', 'alt', 'ctrl', 'meta'} if set(modifiers) - known_modifiers: raise ValueError('Unknown modifiers "{}"'.format( set(modifiers) - known_modifiers)) special_keys = { 27: 'escape', 9: 'tab', 8: 'backspace', 13: 'enter', 127: 'del', 271: 'enter', 273: 'up', 274: 'down', 275: 'right', 276: 'left', 278: 'home', 279: 'end', 280: 'pgup', 281: 'pgdown', 300: 'numlock', 301: 'capslock', 145: 'screenlock', } text = None try: text = chr(key_code) if key_lower != key: text = key except ValueError: pass dt = duration / num_press for i in range(num_press): await self.async_sleep(dt) Window.dispatch('on_key_down', key_code, 0, text, modifiers) if (key not in known_modifiers and key_code not in special_keys and not (known_modifiers & set(modifiers))): Window.dispatch('on_textinput', text) await self.wait_clock_frames(1) yield 'down', (key, key_code, 0, text, modifiers) Window.dispatch('on_key_up', key_code, 0) await self.wait_clock_frames(1) yield 'up', (key, key_code, 0, text, modifiers)
def test_ime(self): empty_ti = TextInput() empty_ti.focused = True ti = TextInput(text='abc') Window.dispatch('on_textedit', 'ㅎ') self.assertEqual(empty_ti.text, 'ㅎ') self.assertEqual(ti.text, 'abc') ti.focused = True Window.dispatch('on_textedit', 'ㅎ') self.assertEqual(ti.text, 'abcㅎ') Window.dispatch('on_textedit', '하') self.assertEqual(ti.text, 'abc하') Window.dispatch('on_textedit', '핫') Window.dispatch('on_textedit', '') Window.dispatch('on_textinput', '하') Window.dispatch('on_textedit', 'ㅅ') Window.dispatch('on_textedit', '세') self.assertEqual(ti.text, 'abc하세')
def process_as_mouse_or_keyboard(tv_sec, tv_usec, ev_type, ev_code, ev_value): if ev_type == EV_SYN: if ev_code == SYN_REPORT: process([point]) elif ev_type == EV_REL: if ev_code == 0: assign_rel_coord(point, min(1., max(-1., ev_value / 1000.)), invert_x, 'xy') elif ev_code == 1: assign_rel_coord(point, min(1., max(-1., ev_value / 1000.)), invert_y, 'yx') elif ev_code == ABS_X: val = normalize(ev_value, range_min_abs_x, range_max_abs_x) assign_coord(point, val, invert_x, 'xy') elif ev_code == ABS_Y: val = 1. - normalize(ev_value, range_min_abs_y, range_max_abs_y) assign_coord(point, val, invert_y, 'yx') elif ev_code == ABS_PRESSURE: point['pressure'] = normalize(ev_value, range_min_abs_pressure, range_max_abs_pressure) elif ev_type == EV_KEY: buttons = { 272: 'left', 273: 'right', 274: 'middle', 275: 'side', 276: 'extra', 277: 'forward', 278: 'back', 279: 'task', 330: 'touch', 320: 'pen' } if ev_code in buttons.keys(): if ev_value: if 'button' not in point: point['button'] = buttons[ev_code] point['id'] += 1 if '_avoid' in point: del point['_avoid'] elif 'button' in point: if point['button'] == buttons[ev_code]: del point['button'] point['id'] += 1 point['_avoid'] = True else: if ev_value == 1: l = keyboard_keys[ev_code][-1 if 'shift' in Window. _modifiers else 0] if l == 'shift': Window._modifiers.append('shift') print(ev_code, l) Window.dispatch('on_key_down', Keyboard.keycodes[l.lower()], ev_code, keys_str.get(l, l), Window._modifiers) if ev_value == 0: l = keyboard_keys[ev_code][-1 if 'shift' in Window. _modifiers else 0] Window.dispatch('on_key_up', Keyboard.keycodes[l.lower()], ev_code, keys_str.get(l, l), Window._modifiers) if l == 'shift': Window._modifiers.remove('shift')
def process_as_mouse_or_keyboard( tv_sec, tv_usec, ev_type, ev_code, ev_value): if ev_type == EV_SYN: if ev_code == SYN_REPORT: process([point]) elif ev_type == EV_REL: if ev_code == 0: assign_rel_coord(point, min(1., max(-1., ev_value / 1000.)), invert_x, 'xy') elif ev_code == 1: assign_rel_coord(point, min(1., max(-1., ev_value / 1000.)), invert_y, 'yx') elif ev_code == ABS_X: val = normalize(ev_value, range_min_abs_x, range_max_abs_x) assign_coord(point, val, invert_x, 'xy') elif ev_code == ABS_Y: val = 1. - normalize(ev_value, range_min_abs_y, range_max_abs_y) assign_coord(point, val, invert_y, 'yx') elif ev_code == ABS_PRESSURE: point['pressure'] = normalize(ev_value, range_min_abs_pressure, range_max_abs_pressure) elif ev_type == EV_KEY: buttons = { 272: 'left', 273: 'right', 274: 'middle', 275: 'side', 276: 'extra', 277: 'forward', 278: 'back', 279: 'task', 330: 'touch', 320: 'pen'} if ev_code in buttons.keys(): if ev_value: if 'button' not in point: point['button'] = buttons[ev_code] point['id'] += 1 if '_avoid' in point: del point['_avoid'] elif 'button' in point: if point['button'] == buttons[ev_code]: del point['button'] point['id'] += 1 point['_avoid'] = True else: if ev_value == 1: l = keyboard_keys[ev_code][-1 if 'shift' in Window._modifiers else 0] if l == 'shift': Window._modifiers.append('shift') print(ev_code, l) Window.dispatch( 'on_key_down', Keyboard.keycodes[l.lower()], ev_code, keys_str.get(l, l), Window._modifiers) if ev_value == 0: l = keyboard_keys[ev_code][-1 if 'shift' in Window._modifiers else 0] Window.dispatch( 'on_key_up', Keyboard.keycodes[l.lower()], ev_code, keys_str.get(l, l), Window._modifiers) if l == 'shift': Window._modifiers.remove('shift')
def update_game_time(self, game_time): self.game_time_widget.text = "Time: " + str( game_time.day) + '-' + months[str(game_time.month)] + '-' + str( game_time.year) Window.dispatch("on_resize", 0, 0)
def handle_menu_transition(self, menu_name): self.parent.open_menu_screen() game_menu = self.parent.game_menu game_menu.screen_manager_game_menu.current = menu_name Window.dispatch("on_resize", 0, 0)