Beispiel #1
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):

            print(event.key_code, Screen.ctrl(event.key_code))

            if event.key_code in [Screen.ctrl("c")]:
                raise StopApplication("User quit")

            if event.key_code == KEY_C:
                self.mandelbrot.reset_coords()

            if event.key_code == KEY_MINUS:
                self.mandelbrot.zoom(1.5)

            if event.key_code == KEY_PLUS:
                self.mandelbrot.zoom(-1.5)

            if event.key_code in KEY_VECTORS.keys():
                self.mandelbrot.direction(KEY_VECTORS[event.key_code])

            self.mandelbrot.set_dim_from_termsize()
            self.mandelbrot.generate_mandelbrot()
            self.update_status()

        elif isinstance(event, MouseEvent):
            pass

        # Now pass on to lower levels for normal handling of the event.
        return super(Mandel, self).process_event(event)
Beispiel #2
0
    def process_event(self, event):
        # Look for events that will close the pop-up - e.g. clicking outside the Frame or Enter key.
        cancelled = False
        if event is not None:
            if isinstance(event, KeyboardEvent):
                if event.key_code in [Screen.ctrl("M"), Screen.ctrl("J"), ord(" ")]:
                    event = None
                elif event.key_code == Screen.KEY_ESCAPE:
                    event = None
                    cancelled = True
            elif isinstance(event, MouseEvent) and event.buttons != 0:
                origin = self._canvas.origin
                if event.y < origin[1] or event.y >= origin[1] + self._canvas.height:
                    event = None
                elif event.x < origin[0] or event.x >= origin[0] + self._canvas.width:
                    event = None

        # Remove this pop-up if we're done; otherwise bubble up the event.
        if event is None:
            try:
                self.close(cancelled)
            except InvalidFields:
                # Nothing to do as we've already prevented the Effect from being removed.
                pass
        return super(_TempPopup, self).process_event(event)
Beispiel #3
0
    def process_event(self, event: Optional[Event]) -> Optional[Event]:
        """Process either a keyboard or a mouse event. If the user pressed
        enter/space or double clicked on the widget, a popup will be shown
        to allow the user the make a selection among current options.

        Args:
            event: the event to be handled.

        Returns:
            The handled event, in case somebody else needs it.
        """
        if event is not None:
            if isinstance(event, KeyboardEvent):
                if event.key_code in [
                        Screen.ctrl("M"),
                        Screen.ctrl("J"),
                        ord(" ")
                ]:
                    event = None
            elif isinstance(event, MouseEvent):
                if event.buttons != 0:
                    if self.is_mouse_over(event, include_label=False):
                        event = None
            if event is None:
                self._child = FileBrowserDropdownPopup(self)
                self.frame.scene.add_effect(self._child)

        return event
Beispiel #4
0
 def process_event(self, event):
     if isinstance(event, KeyboardEvent):
         if event.key_code == Screen.KEY_ESCAPE:
             self._cancel_button_click()
         elif event.key_code == Screen.ctrl("n"):
             self._next_button_click()
         elif event.key_code == Screen.ctrl("b"):
             self._back_button_click()
     return super(WizardFrame, self).process_event(event)
Beispiel #5
0
def global_shortcuts(event):
    if isinstance(event, KeyboardEvent):
        key = event.key_code
        if key == Screen.KEY_F1:
            raise NextScene("Main")
        elif key == Screen.KEY_F2:
            raise NextScene("Commits")
        elif key == Screen.KEY_F3:
            raise NextScene("Working Copy")
        elif key == Screen.ctrl("a"):
            raise NextScene("Shortcuts")
        elif key == Screen.ctrl("x"):
            raise StopApplication("User terminated app")
Beispiel #6
0
    def process_event(self, event: Union[MouseEvent, KeyboardEvent]) -> None:
        """Process either a mouse or a keyboard event.

        Args:
            event : The event that triggered the function.
        """
        if isinstance(event, KeyboardEvent):
            if event.key_code == Screen.ctrl("n"):
                self.move_next()
            elif event.key_code == Screen.ctrl(
                    "b") and self.previous_form is not None:
                self.move_back()
        Frame.process_event(self, event)
Beispiel #7
0
    def process_event(self, event):
        if event is not None:
            if isinstance(event, KeyboardEvent):
                if event.key_code in [Screen.ctrl("M"), Screen.ctrl("J"), ord(" ")]:
                    event = None
            elif isinstance(event, MouseEvent):
                if event.buttons != 0:
                    if self.is_mouse_over(event, include_label=False):
                        event = None
            if event is None:
                self._child = _DropdownPopup(self)
                self.frame.scene.add_effect(self._child)

        return event
Beispiel #8
0
 def process_event(self, event: Event) -> Optional[Event]:
     if isinstance(event, KeyboardEvent):
         if event.key_code == Screen.KEY_UP and self._selection > 0:
             self._selection -= 1
             return None
         elif event.key_code == Screen.KEY_DOWN and self._selection < len(self._options) - 1:
             self._selection += 1
             return None
         elif event.key_code in [Screen.ctrl("M"), Screen.ctrl("J"), ord(" ")]:
             self._value = self._options[self._selection][1]
             return None
         return event
     else:
         return RadioButtons.process_event(self, event)
Beispiel #9
0
    def process_event(self, event):
        # Allow standard event processing first
        if super(PomodoroController, self).process_event(event) is None:
            return

        # check for my key handlers
        if isinstance(event, KeyboardEvent):
            key = event.key_code
            if key == Screen.ctrl("c"):
                raise StopApplication("User quit")
            elif key == config.keys['start_stop_timer']:
                if timer.is_running():
                    timer.stop()
                else:
                    timer.start()
            elif key == ord(config.keys['reset_timer']):
                timer.reset()
            elif key == ord(config.keys['time_pomodoro']):
                timer.set_total_time(config.time['pomodoro']['m'])
                timer.reset()
                timer.start()
            elif key == ord(config.keys['time_short_break']):
                timer.set_total_time(config.time['short_break']['m'])
                timer.reset()
                timer.start()
            elif key == ord(config.keys['time_long_break']):
                timer.set_total_time(config.time['long_break']['m'])
                timer.reset()
                timer.start()
            elif key == ord(config.keys['show_hide_instructions']):
                self._toggle_instructions_visibility()

        else:
            return event
Beispiel #10
0
    def process_event(self, event):
        # Key handling for the demo.
        if isinstance(event, KeyboardEvent):
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
                raise StopApplication("User quit")
            elif event.key_code == ord("+") and self._zoom <= 20:
                if self._desired_zoom < 20:
                    self._desired_zoom += 1
            elif event.key_code == ord("-") and self._zoom >= 0:
                if self._desired_zoom > 0:
                    self._desired_zoom -= 1
            elif event.key_code == ord("0"):
                self._desired_zoom = 0
            elif event.key_code == ord("9"):
                self._desired_zoom = 20
            elif event.key_code == Screen.KEY_LEFT:
                self._desired_longitude -= 360 / 2 ** self._zoom / self._size * 10
            elif event.key_code == Screen.KEY_RIGHT:
                self._desired_longitude += 360 / 2 ** self._zoom / self._size * 10
            elif event.key_code == Screen.KEY_UP:
                self._desired_latitude = self._inc_lat(self._desired_latitude, -self._size / 10)
            elif event.key_code == Screen.KEY_DOWN:
                self._desired_latitude = self._inc_lat(self._desired_latitude, self._size / 10)
            else:
                return

            # Trigger a reload of the tiles and redraw map
            self._updated.set()
            self._screen.force_update()
Beispiel #11
0
 def process_event(self, event):
     # Do the key handling for this Frame.
     if isinstance(event, KeyboardEvent):
         if event.key_code in [ord('p'), ord('P')]:
             raise NextScene("Players")
         if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
             raise NextScene("Main")
Beispiel #12
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent) and not self.__searching:
            if self.__scene_keybinds:
                for keybind, scene in self.__scene_keybinds.items():
                    if event.key_code in [
                            ord(keybind.lower()),
                            ord(keybind.upper())
                    ]:
                        raise NextScene(scene)
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl('c')]:
                raise StopApplication("User quit")
            elif event.key_code in [ord('a'), ord('A')]:
                self._add()
            elif event.key_code in [ord('e'), ord('E')]:
                self._edit()
            elif event.key_code in [ord('d'), ord('D')]:
                self._delete()
            elif event.key_code in [ord("r"), ord("R")]:
                self.__reverse_sort = not self.__reverse_sort
                self._reload_list()
            elif event.key_code == ord("<"):
                self.__sort_index = max(0, self.__sort_index - 1)
                self._reload_list()
            elif event.key_code == ord(">"):
                self.__sort_index = min(
                    self.table.get_num_columns() +
                    len(self.table.runtime_columns) - 1, self.__sort_index + 1)
                self._reload_list()

        # Now pass on to lower levels for normal handling of the event.
        return super().process_event(event)
Beispiel #13
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
                self._quit()
            elif event.key_code in [ord("r"), ord("R")]:
                # st = self.battle.battlescreen._disp_statline() # 2 lines
                # ar = self.battle.battlescreen._disp_armies() # 18 lines
                # co = self.battle.battlescreen._disp_console() # 3 lines
                # fo = self.battle.battlescreen._disp_footerline("") # 1 line
                # assert len(st + ar + co) == self.battle.battlescreen.max_screen_len - 1
                # for y, l in enumerate(st + ar + co):
                #   self._scene.add_effect(Print(self._screen,
                #                         StaticRenderer(images=[self._render(l)]), x=0, y=y, colour=7))
                # Force a refresh for improved responsiveness

                self.statline.value = [
                    self._prerender(l)
                    for l in self.battle.battlescreen._disp_statline()
                ]
                self.armystats.value = [
                    self._prerender(l)
                    for l in self.battle.battlescreen._disp_armies()
                ]
                self.console.value = [
                    self._prerender(l)
                    for l in self.battle.battlescreen._disp_console()
                ]

                self._last_frame = 0

        # Now pass on to lower levels for normal handling of the event.
        return super().process_event(event)
Beispiel #14
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            if event.key_code in [ord('r'), ord('R')]:
                self._toggle_answer()
            if event.key_code in [ord('b'), ord('B')]:
                Clue.allow_buzzer()
            if event.key_code in [ord('y'), ord('Y')]:
                self.clue.text = ""
                self.question.text = ""
                self.add_points()
                Player.clear_buzzed_players()
                Clue.disallow_buzzer()
                raise NextScene("Main")
            if event.key_code in [ord('n'), ord('N')]:
                self.clue.text = ""
                self.question.text = ""
                self.remove_points()
                Player.clear_buzzed_players()
                Clue.disallow_buzzer()
                raise NextScene("Main")
            if event.key_code in [ord('p'), ord('P')]:
                raise NextScene("Clue")
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
                self.clue.text = ""
                self.question.text = ""
                raise NextScene("Main")

        # Now pass on to lower levels for normal handling of the event.
        return super(ClueFrame, self).process_event(event)
Beispiel #15
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            if event.key_code >= 0 and event.key_code <= 255:
                self.cmd_string = self.cmd_string + chr(event.key_code)
                # print(f"{self.cmd_string}")

            if event.key_code in [ord("q"), ord("Q"), Screen.ctrl("c")]:
                self.cmd_string = ""
                console_mode.quickedit(1)
                raise StopApplication("User quit")

            elif self.cmd_string.lower() == "login":
                self.cmd_string = ""
                self.sf_login()

            elif event.key_code in (ord("\n"), ord("\r")):
                self.cmd_string = ""
                if self.focussed_widget.name == "radio":
                    self.get_org_details()

        elif isinstance(event, MouseEvent):
            # MouseEvent !!!
            print("MouseEvent")

        return super(org_list_frame, self).process_event(event)
Beispiel #16
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
                raise StopApplication("User quit")

        # Now pass on to lower levels for normal handling of the event.
        return super(DemoFrame, self).process_event(event)
Beispiel #17
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
                raise StopApplication("User quit")

        # Now pass on to lower levels for normal handling of the event.
        return super(DemoFrame, self).process_event(event)
Beispiel #18
0
 def process_event(self, event):
     if isinstance(event, KeyboardEvent):
         if event.key_code in [ord('q'), ord('Q'), Screen.ctrl('c')]:
             raise StopApplication("User quit")
         else:
             return event
     else:
         return event
Beispiel #19
0
    def process_event(self, event):
        if event is not None:
            # Handle key or mouse selection events - e.g. click on widget or Enter.
            if isinstance(event, KeyboardEvent):
                if event.key_code in [Screen.ctrl("M"), Screen.ctrl("J"), ord(" ")]:
                    event = None
            elif isinstance(event, MouseEvent):
                if event.buttons != 0:
                    if self.is_mouse_over(event, include_label=False):
                        event = None

            # Create the pop-up if needed
            if event is None:
                self._child = _TimePickerPopup(self)
                self.frame.scene.add_effect(self._child)

        return event
    def test_ctrl(self):
        """
        Check that ctrl returns the right values.
        """
        # Check standard alphabetical range
        for i, char in enumerate(range(ord('@'), ord('Z'))):
            self.assertEqual(Screen.ctrl(char), i)
            self.assertEqual(Screen.ctrl(chr(char)), i)
            self.assertEqual(Screen.ctrl(chr(char).lower()), i)

        # Check last few options - which mostly aren't actually returned in
        # Linux and so probably only of limited value, but what the heck!
        for i, char in enumerate(["[", "\\", "]", "^", "_"]):
            self.assertEqual(Screen.ctrl(char), i + 27)

        # Check other things return None - pick boundaries for checks.
        for char in ["?", "`", "\x7f"]:
            self.assertIsNone(Screen.ctrl(char))
Beispiel #21
0
    def test_ctrl(self):
        """
        Check that ctrl returns the right values.
        """
        # Check standard alphabetical range
        for i, char in enumerate(range(ord('@'), ord('Z'))):
            self.assertEqual(Screen.ctrl(char), i)
            self.assertEqual(Screen.ctrl(chr(char)), i)
            self.assertEqual(Screen.ctrl(chr(char).lower()), i)

        # Check last few options - which mostly aren't actually returned in
        # Linux and so probably only of limited value, but what the heck!
        for i, char in enumerate(["[", "\\", "]", "^", "_"]):
            self.assertEqual(Screen.ctrl(char), i + 27)

        # Check other things return None - pick boundaries for checks.
        for char in ["?", "`", "\x7f"]:
            self.assertIsNone(Screen.ctrl(char))
Beispiel #22
0
 def process_event(self, event):
     # Do the key handling for this Frame.
     if isinstance(event, KeyboardEvent):
         DEL_KEY = -102
         if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
             raise StopApplication("User quit")
         if event.key_code == DEL_KEY:
             self.prompt_delete()
     # Now pass on to lower levels for normal handling of the event.
     return super().process_event(event)
Beispiel #23
0
    def process_event(self, event):
        """User input for the main map view."""
        if not isinstance(event, KeyboardEvent):
            return

        if event.key_code in [Screen.ctrl("m"), Screen.ctrl("j")]:
            self._scene.add_effect(
                EnterLocation(self._screen, self._longitude, self._latitude,
                              self._on_new_location))
        elif event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
            raise StopApplication("User quit")
        elif event.key_code in [ord('t'), ord('T')]:
            self._satellite = not self._satellite
            if self._satellite:
                self._size = _START_SIZE
        elif event.key_code == ord("?"):
            self._scene.add_effect(PopUpDialog(self._screen, _HELP, ["OK"]))
        elif event.key_code == ord("+") and self._zoom <= 20:
            if self._desired_zoom < 20:
                self._desired_zoom += 1
        elif event.key_code == ord("-") and self._zoom >= 0:
            if self._desired_zoom > 0:
                self._desired_zoom -= 1
        elif event.key_code == ord("0"):
            self._desired_zoom = 0
        elif event.key_code == ord("9"):
            self._desired_zoom = 20
        elif event.key_code == Screen.KEY_LEFT:
            self._desired_longitude -= 360 / 2**self._zoom / self._size * 10
        elif event.key_code == Screen.KEY_RIGHT:
            self._desired_longitude += 360 / 2**self._zoom / self._size * 10
        elif event.key_code == Screen.KEY_UP:
            self._desired_latitude = self._inc_lat(self._desired_latitude,
                                                   -self._size / 10)
        elif event.key_code == Screen.KEY_DOWN:
            self._desired_latitude = self._inc_lat(self._desired_latitude,
                                                   self._size / 10)
        else:
            return

        # Trigger a reload of the tiles and redraw map
        self._updated.set()
        self._screen.force_update()
Beispiel #24
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
                rospy.signal_shutdown('user key exit')
                raise StopApplication("User quit")
            if event.key_code in [ord('r'), ord('R')]:
                self.update_lists()

        # Now pass on to lower levels for normal handling of the event.
        return super(TopicFrame, self).process_event(event)
Beispiel #25
0
    def process_event(self, event):
        if isinstance(event, KeyboardEvent):
            if self.__scene_keybinds:
                for keybind, scene in self.__scene_keybinds.items():
                    if event.key_code in [
                            ord(keybind.lower()),
                            ord(keybind.upper())
                    ]:
                        raise NextScene(scene)
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
                raise StopApplication("User quit")

        return super(GraphFrame, self).process_event(event)
Beispiel #26
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
                raise StopApplication("User quit")
            elif event.key_code in [ord("r"), ord("R")]:
                self._reverse = not self._reverse

            # Force a refresh for improved responsiveness
            self._last_frame = 0

        # Now pass on to lower levels for normal handling of the event.
        return super(PlotJobFrame, self).process_event(event)
Beispiel #27
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
                raise StopApplication("User quit")
            if event.key_code in [ord('a'), ord('A')]:
                self._attach()
            if event.key_code in [ord('d'), ord('D')]:
                self._delete()
            if event.key_code in [ord('n'), ord('N')]:
                self._new()

        # Now pass on to lower levels for normal handling of the event.
        return super(ListView, self).process_event(event)
Beispiel #28
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl('c')]:
                raise StopApplication("User quit")
            elif event.key_code in [ord('a'), ord('A')]:
                self._add()
            elif event.key_code in [ord('e'), ord('E')]:
                self._edit()
            elif event.key_code in [ord('d'), ord('D')]:
                self._delete()

        # Now pass on to lower levels for normal handling of the event.
        return super().process_event(event)
Beispiel #29
0
    def process_event(self, event: Any) -> Any:
        result = super(TopView, self).process_event(event)
        if isinstance(event, KeyboardEvent):
            # quit
            if event.key_code in [ord("q"), Screen.ctrl("c")]:
                raise StopApplication("")

            # toggle sort for current widget
            if event.key_code in [ord("r")]:
                if self.focussed_widget.name in self.onefuzz_reversed:
                    self.onefuzz_reversed[
                        self.focussed_widget.name] = not self.onefuzz_reversed[
                            self.focussed_widget.name]

        return result
Beispiel #30
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
                self._quit()

            elif event.key_code in [ord('t'), ord('T')]:
                self._treceback()

            elif event.key_code in [ord('p'), ord('P')]:
                self._popup()

            # Force a refresh for improved responsiveness
            self._last_frame = 0

        # Now pass on to lower levels for normal handling of the event.
        return super(GameFrame, self).process_event(event)
Beispiel #31
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]:
                raise StopApplication("User quit")
            elif event.key_code in [ord("r"), ord("R")]:
                self._reverse = not self._reverse
            elif event.key_code == ord("<"):
                self._sort = max(0, self._sort - 1)
            elif event.key_code == ord(">"):
                self._sort = min(7, self._sort + 1)

            # Force a refresh for improved responsiveness
            self._last_frame = 0

        # Now pass on to lower levels for normal handling of the event.
        return super(DemoFrame, self).process_event(event)
Beispiel #32
0
    def process_event(self, event):
        # Do the key handling for this Frame.
        if isinstance(event, KeyboardEvent):
            logger.debug("Keyboard event: {}".format(event.key_code))
            if event.key_code in [Screen.ctrl("c")]:
                raise StopApplication("User quit")
            elif event.key_code == ord("+"):
                if self._occupation_list._has_focus and self._occupation_list.value:
                    self._dh.command_handler.increment(
                        CommandType.OCCUPATIONS,
                        self._occupation_list.value,
                        1
                    )
                elif self._under_construction._has_focus and self._under_construction.value:
                    self._dh.command_handler.increment(
                        CommandType.BUILDERS,
                        self._under_construction.value,
                        1
                    )
            elif event.key_code == ord("-"):
                if self._occupation_list._has_focus and self._occupation_list.value:
                    self._dh.command_handler.increment(
                        CommandType.OCCUPATIONS,
                        self._occupation_list.value,
                        -1
                    )
                elif self._under_construction._has_focus and self._under_construction.value:
                    self._dh.command_handler.increment(
                        CommandType.BUILDERS,
                        self._under_construction.value,
                        -1
                    )
            elif event.key_code in (ord("r"), ord("R")):
                if self._available_research.value:
                    self._dh.command_handler.research(
                        self._available_research.value,
                    )

        # Force a refresh for responsive UI
        self._last_frame = 0

        # Now pass on to lower levels for normal handling of the event.
        return super(MainDisplay, self).process_event(event)
Beispiel #33
0
class Ctrl:
    HOME = Key(535, "Ctrl-HOME")
    END = Key(530, "Ctrl-END")
    LEFT = Key(545, "Ctrl-LEFT")
    UP = Key(566, "Ctrl-UP")
    RIGHT = Key(560, "Ctrl-RIGHT")
    DOWN = Key(525, "Ctrl-DOWN")

    A = Key(Screen.ctrl('a'), "Ctrl-A")
    B = Key(Screen.ctrl('b'), "Ctrl-B")
    C = Key(Screen.ctrl('c'), "Ctrl-C")
    D = Key(Screen.ctrl('d'), "Ctrl-D")
    E = Key(Screen.ctrl('e'), "Ctrl-E")
    F = Key(Screen.ctrl('f'), "Ctrl-F")
    G = Key(Screen.ctrl('g'), "Ctrl-G")
    H = Key(Screen.ctrl('h'), "Ctrl-H")
    I = Key(Screen.ctrl('i'), "Ctrl-I")  # noqa: E741
    J = Key(Screen.ctrl('j'), "Ctrl-J")
    K = Key(Screen.ctrl('k'), "Ctrl-K")
    L = Key(Screen.ctrl('l'), "Ctrl-L")
    M = Key(Screen.ctrl('m'), "Ctrl-M")
    N = Key(Screen.ctrl('n'), "Ctrl-N")
    O = Key(Screen.ctrl('o'), "Ctrl-O")  # noqa: E741
    P = Key(Screen.ctrl('p'), "Ctrl-P")
    Q = Key(Screen.ctrl('q'), "Ctrl-Q")
    R = Key(Screen.ctrl('r'), "Ctrl-R")
    S = Key(Screen.ctrl('s'), "Ctrl-S")
    T = Key(Screen.ctrl('t'), "Ctrl-T")
    U = Key(Screen.ctrl('u'), "Ctrl-U")
    V = Key(Screen.ctrl('v'), "Ctrl-V")
    W = Key(Screen.ctrl('w'), "Ctrl-W")
    X = Key(Screen.ctrl('x'), "Ctrl-X")
    Y = Key(Screen.ctrl('y'), "Ctrl-Y")
    Z = Key(Screen.ctrl('z'), "Ctrl-Z")

    Shift = CtrlShift