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
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)
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())