示例#1
0
    def show_injection_result(self):
        """Show if the injection was successfully started."""
        state = self.dbus.get_state(self.selected_device)

        if state == RUNNING:
            msg = f'Applied preset "{self.selected_preset}"'

            if custom_mapping.get_character(Key.btn_left()):
                msg += ', CTRL + DEL to stop'

            self.show_status(CTX_APPLY, msg)

            self.show_device_mapping_status()
            return False

        if state == FAILED:
            self.show_status(
                CTX_ERROR, f'Failed to apply preset "{self.selected_preset}"')
            return False

        if state == NO_GRAB:
            self.show_status(
                CTX_ERROR, 'The device was not grabbed',
                'Either another application is already grabbing it or '
                'your preset doesn\'t contain anything that is sent by the '
                'device.')
            return False

        # keep the timeout running
        return True
示例#2
0
    def on_apply_preset_clicked(self, _):
        """Apply a preset without saving changes."""
        self.save_preset()

        if custom_mapping.num_saved_keys == 0:
            logger.error('Cannot apply empty preset file')
            # also helpful for first time use
            if custom_mapping.changed:
                self.show_status(
                    CTX_ERROR, 'You need to save your changes first',
                    'No mappings are stored in the preset .json file yet')
            else:
                self.show_status(CTX_ERROR,
                                 'You need to add keys and save first')
            return

        preset = self.selected_preset
        device = self.selected_device

        logger.info('Applying preset "%s" for "%s"', preset, device)

        if not self.button_left_warn:
            if custom_mapping.dangerously_mapped_btn_left():
                self.show_status(
                    CTX_ERROR, 'This would disable your click button',
                    'Map a button to BTN_LEFT to avoid this.\n'
                    'To overwrite this warning, press apply again.')
                self.button_left_warn = True
                return

        if not self.unreleased_warn:
            unreleased = reader.get_unreleased_keys()
            if unreleased is not None and unreleased != Key.btn_left():
                # it's super annoying if that happens and may break the user
                # input in such a way to prevent disabling the mapping
                logger.error(
                    'Tried to apply a preset while keys were held down: %s',
                    unreleased)
                self.show_status(
                    CTX_ERROR, 'Please release your pressed keys first',
                    'X11 will think they are held down forever otherwise.\n'
                    'To overwrite this warning, press apply again.')
                self.unreleased_warn = True
                return

        self.unreleased_warn = False
        self.button_left_warn = False
        self.dbus.set_config_dir(get_config_path())
        self.dbus.start_injecting(device, preset)

        self.show_status(CTX_APPLY, 'Starting injection...')

        GLib.timeout_add(100, self.show_injection_result)
示例#3
0
    def test_dangerously_mapped_btn_left(self):
        self.mapping.change(Key.btn_left(), '1')
        self.assertTrue(self.mapping.dangerously_mapped_btn_left())

        self.mapping.change(Key(EV_KEY, 41, 1), '2')
        self.assertTrue(self.mapping.dangerously_mapped_btn_left())

        self.mapping.change(Key(EV_KEY, 42, 1), 'btn_left')
        self.assertFalse(self.mapping.dangerously_mapped_btn_left())

        self.mapping.change(Key(EV_KEY, 42, 1), 'BTN_Left')
        self.assertFalse(self.mapping.dangerously_mapped_btn_left())

        self.mapping.change(Key(EV_KEY, 42, 1), '3')
        self.assertTrue(self.mapping.dangerously_mapped_btn_left())