Releases: wasiejen/Free-Snap-Tap
V1.1.5 some bug fixes
V1.1.5
bugfix:
- when active window returned empty the script crashed
- fixed
- evaluations with python code that hat spaces in it like (not is_set('var')) were not recognized correctly
- fixed
- if a line in the config file started with white spaces and could lead to wrong recognition of start arguments and commented out lines
- leading white spaces will now be removed
- fixed
- automatic shortening of active window name removed the name of e.g. the game because of some versioning info following it. So if the last part of the window name is not the game name, then it could happen that the game name would be removed
- now it will always check the full name for the focus name
- removed shortening due to many possible naming schemes
- fixed
added:
- eval
|(is_repeat_active('aliasname'))
-> True or False dependent on if a repeat is active
changed:
- changed default value of set to 1 and clear to 0 (in python 0 -> False and 1 -> True)
- to always work in variables with numbers and not mix numbers and boolean values
- status_indicator now starts with red as default and only changes when focus name is recognized
- cleaned up some code for the drawing of the status_indicator
V1.1.4b user variables
V1.1.4b
241023-1055
- removed some debug output
V1.1.4
Variables usable as invocation:
- variables can now be set, checked and cleared
|(set('variable'))
to set it to True- can be checked by
|(is_set('variable'))
: will return True or False - can be cleared by
|(clear('variable'))
- and all variables can be cleared by
|(clear_all_variables())
- variables will be reset on change of focus app
- variables with a bit more control over there content can be used by:
- can be used to adjust delays of key_events or
- to create custom sequences or key-sets with more than 2 layers (before only True and False possible)
|(set('variable',*value*))
to set a variable to e.g. a number|(get('variable'))
will just return the content of the variable - a check has to be done seperately or it will be interpreted as a delay|(check('variable',*value*))
to get the variable and check against the given value - will return True or False|(incr('variable'))
increases by 1: will set to 0 if not set before|(decr('variable'))
decreases by 1: will set to 0 if not set before
Typing longer texts via invocation:
|(type('text to write'))
and|(write('text to write'))
invocation added- will use no delay
- mainly for input/chat and not for controlling any aspects of a game loop
other changes:
-
None key_event (ke) can have manual delays - no default delays will be applied in any case
- if a delay is given it will be played
- if no delay is given the default delays will not be applied and no delay will be played
-
None can now also have the key_string
reset
anddelay
- no functionality in itself, but for better readability
reset|(macro_name)
ordelay|100
is easier to read
-
empty ke in trigger group might not correctly be handled as only a release key_event
- preventive fix to make sure the release ke will be added also to a trigger group
-
simplified release_all_keys() underlying function to not be as aggressive and only release currently pressed simulated keys
-
added
-macrodelay
as future replacement for-aliasdelay
- I do not know why I choose this misleading name first
- maybe I thought aliases are the same as macros ^^
- both now usable and will replace -aliasdelay in the future
- I do not know why I choose this misleading name first
general:
- automated creation of requirements.txt - should now stay up to date with each new release
- updated ReadMe installations instructions to include the package pygetwindow
bugfixes:
- key combinations did not reset when used and re-triggered itself on resuming - fixed
- if option 0 was activated before the first time start of the listener, then an error stopped the listener - fixed
- rebind will be executed despite some of the constraints of the trigger result in False
- the constraints will not even checked when replacement key is None, because they will not be saved in the trigger key_event
- the constraints are stripped when the conversion to a set of key_events takes place because of None being recognized as a Key instead of a key_event as it should
- None key now works correctly as key_event, but constraints will still be stripped if key_event is converted to Key
- on conversion to set of key_events now also copies the constraints
- fixed
V1.1.3 Changelog
241017-1721
- fixed error in example config file
241014-1943
- macro sequence reset via
|(*macro name*)
now also interrupts an active macro - small improvement on releasing all keys that are not currently pressed on window change and on hitting esc
- only reset a macro sequence counter if not already at 0
- easy evaluation for False ->
|()
or|(!)
is the same as|(False)
- removed
esc
combination to release all keys and stop all repeated keys, can now be used as invocations as needed- new invocations
|stop_all_repeat()
|release_all_keys()
# will never replace original esc due to |(!) but the invocations will be executed
(esc_repeat_stop) +esc|(stop_all_repeat())|(release_all_keys())|(!) : +esc
241015-1227
- macro playback: key event constraints will now again be evaluated a time to be played
- to make reset invocation work as expected
- removed playback of delay for None and empty ke
- updated ReadMe
- moved function documenattion in Wiki
- updated default FSTconfig.txt
V1.1.2b
Bugfix:
- error handling for repeat updated
V1.1.2
Bugfixes:
- empty/None key not correctly handled - now should work and only ever correspond to +ke
- now:
..., |(eval), ....
works correctly on its own
- now:
- wrong default config file name returned to normal
- removed some superfluous debug output
- removed alt+tab key release of all currently pressed simulated keys
V1.1.1
builds up on top of V1.1.0 link - so see there for how the write aliases and name macros
###NEW
- Repeating of Alias Groups
ke|(toggle_repeat('<*name of alias*>, *time in ms*)
- e.g.ke|(toggle_repeat('<scan_alias>, 6000)
- repeated alias work the same as macros
- playback can be interrupted by stopping, toggling on/off and resetting
- entirely independent of the key_event it follows as constraint
- if used in rebind, use it on a ke with a prefix (
-
or+
) or else it will be started as press and release- use new
None
key_event (description see below)- e.g.
-None|*constraint to be fulfilled*|(toggle_repeat('<*name of alias*>, *time in ms*)
- e.g.
- use new
- can not be used in tap_groups, can be used anywhere else where constraints can be used
- alias will be played like a macro:
- constraints checked at start and with defined delays
- repeat_time in ms is the time between 2 playbacks of the same alias as macro
- if macro delays are longer than the repeat_time, the restart of the repeat will interrupt the previous repeat
- multiple repeats can be started from the same key_event
- repeating can be control via following Evaluations:
- all will evaluate to true and only be evaluated if previous constraints are True
ke|(toggle_repeat('<*name of alias*>, *repeat time in ms*)
ke|(start_repeat('<*name of alias*>, *repeat time in ms*)
ke|(stop_repeat('<*name of alias*>)
ke|(reset_repeat('<*name of alias*>)
ke|(stop_all_repeat()
General
- FROM NOW ON: ALL evaluation will always evaluate to True
- if key_event should not be played add a
|(False)
constraint at the end or useNone
key_event - it is just simpler to keep in mind if all will result in True
- if key_event should not be played add a
None
=none
=NONE
=*empty*
=_
key_event that will never be played but the constraints will be evaluated (included delay)- use it as reset replacement with the name of the Seq as constraint or for Alias Repeat Evaluations
- empty -> e.g.
... , |(reset('sequence')), ...
- will always be seen as +None (release) so in a trigger it will always checked as True and only trigger Evaluations once
- default Names for Tap_Groups, Rebinds and Macros if no name is given (name is needed by macros to interrupt itself)
- names for macros MUST be unique and if used in other macros they will interrupting each other
- updated display of Macros and Macro Sequences: trigger group will be displayed on line with name of macro, key groups will each have its own line
- Evaluation can now also be used with functions calls that include commas - e.g. |(pow(2 , 2) can now be used to define now complex functions to calculate times (a byproduct of implementing alias repeat)
breaking changes to reset handling
- the previously in V1.1.0 introduced syntax for reset a Macro Sequence via Evaluation is now the only allowed way to do it
ke|(*name of macro sequence to be reset*)
None|(reset('sequence'))
or simply... , |(reset('sequence')), ...
also possible - a bit more verbose- can also be combined with previous constraints to only reset if they evaluate to True
None
key_event should be convenient replacementNone|constraint|(*sequence_name*)
- removed all reset vk_codes
reset
,reset_all
,reset_*number*
- using any of them will result in an Error
<hello> x|400,y|400
-z : -z|(toggle_repeat('<hello>', 2000))
-u : -u|(reset_repeat('<hello>'))
(stop all repeat on esc) -esc : -esc|(stop_all_repeat())
(sequence) a :: b : c : d : e
(reset of it) d : d|(sequence)
(alternate reset via None) tab :: +shift, tab, +None|(reset('sequence'))
(alternate reset via empty ke) tab :: +shift, tab, |(reset('sequence'))
See Release Notes on V1.1.0 for the other changes link
V1.1.3
V1.1.3 Changelog
241017-1721
- fixed error in example config file
241014-1943
- macro sequence reset via
|(*macro name*)
now also interrupts an active macro - small improvement on releasing all keys that are not currently pressed on window change and on hitting esc
- only reset a macro sequence counter if not already at 0
- easy evaluation for False ->
|()
or|(!)
is the same as|(False)
- removed
esc
combination to release all keys and stop all repeated keys, can now be used as invocations as needed- new invocations
|stop_all_repeat()
|release_all_keys()
# will never replace original esc due to |(!) but the invocations will be executed
(esc_repeat_stop) +esc|(stop_all_repeat())|(release_all_keys())|(!) : +esc
241015-1227
- macro playback: key event constraints will now again be evaluated a time to be played
- to make reset invocation work as expected
- removed playback of delay for None and empty ke
- updated ReadMe
- moved function documenattion in Wiki
- updated default FSTconfig.txt
V1.1.2b
Bugfix:
- error handling for repeat updated
V1.1.2
Bugfixes:
- empty/None key not correctly handled - now should work and only ever correspond to +ke
- now:
..., |(eval), ....
works correctly on its own
- now:
- wrong default config file name returned to normal
- removed some superfluous debug output
- removed alt+tab key release of all currently pressed simulated keys
V1.1.1
builds up on top of V1.1.0 link - so see there for how the write aliases and name macros
###NEW
- Repeating of Alias Groups
ke|(toggle_repeat('<*name of alias*>, *time in ms*)
- e.g.ke|(toggle_repeat('<scan_alias>, 6000)
- repeated alias work the same as macros
- playback can be interrupted by stopping, toggling on/off and resetting
- entirely independent of the key_event it follows as constraint
- if used in rebind, use it on a ke with a prefix (
-
or+
) or else it will be started as press and release- use new
None
key_event (description see below)- e.g.
-None|*constraint to be fulfilled*|(toggle_repeat('<*name of alias*>, *time in ms*)
- e.g.
- use new
- can not be used in tap_groups, can be used anywhere else where constraints can be used
- alias will be played like a macro:
- constraints checked at start and with defined delays
- repeat_time in ms is the time between 2 playbacks of the same alias as macro
- if macro delays are longer than the repeat_time, the restart of the repeat will interrupt the previous repeat
- multiple repeats can be started from the same key_event
- repeating can be control via following Evaluations:
- all will evaluate to true and only be evaluated if previous constraints are True
ke|(toggle_repeat('<*name of alias*>, *repeat time in ms*)
ke|(start_repeat('<*name of alias*>, *repeat time in ms*)
ke|(stop_repeat('<*name of alias*>)
ke|(reset_repeat('<*name of alias*>)
ke|(stop_all_repeat()
General
- FROM NOW ON: ALL evaluation will always evaluate to True
- if key_event should not be played add a
|(False)
constraint at the end or useNone
key_event - it is just simpler to keep in mind if all will result in True
- if key_event should not be played add a
None
=none
=NONE
=*empty*
=_
key_event that will never be played but the constraints will be evaluated (included delay)- use it as reset replacement with the name of the Seq as constraint or for Alias Repeat Evaluations
- empty -> e.g.
... , |(reset('sequence')), ...
- will always be seen as +None (release) so in a trigger it will always checked as True and only trigger Evaluations once
- default Names for Tap_Groups, Rebinds and Macros if no name is given (name is needed by macros to interrupt itself)
- names for macros MUST be unique and if used in other macros they will interrupting each other
- updated display of Macros and Macro Sequences: trigger group will be displayed on line with name of macro, key groups will each have its own line
- Evaluation can now also be used with functions calls that include commas - e.g. |(pow(2 , 2) can now be used to define now complex functions to calculate times (a byproduct of implementing alias repeat)
breaking changes to reset handling
- the previously in V1.1.0 introduced syntax for reset a Macro Sequence via Evaluation is now the only allowed way to do it
ke|(*name of macro sequence to be reset*)
None|(reset('sequence'))
or simply... , |(reset('sequence')), ...
also possible - a bit more verbose- can also be combined with previous constraints to only reset if they evaluate to True
None
key_event should be convenient replacementNone|constraint|(*sequence_name*)
- removed all reset vk_codes
reset
,reset_all
,reset_*number*
- using any of them will result in an Error
<hello> x|400,y|400
-z : -z|(toggle_repeat('<hello>', 2000))
-u : -u|(reset_repeat('<hello>'))
(stop all repeat on esc) -esc : -esc|(stop_all_repeat())
(sequence) a :: b : c : d : e
(reset of it) d : d|(sequence)
(alternate reset via None) tab :: +shift, tab, +None|(reset('sequence'))
(alternate reset via empty ke) tab :: +shift, tab, |(reset('sequence'))
See Release Notes on V1.1.0 for the other changes link
V1.1.2b Hotfix Alias Repetition - empty ke
V1.1.2b
Bugfix:
- error handling for repeat updated
V1.1.2
Bugfixes:
- empty/None key not correctly handled - now should work and only ever correspond to +ke
- now:
..., |(eval), ....
works correctly on its own
- now:
- wrong default config file name returned to normal
- removed some superfluous debug output
- removed alt+tab key release of all currently pressed simulated keys
V1.1.1
builds up on top of V1.1.0 link - so see there for how the write aliases and name macros
###NEW
- Repeating of Alias Groups
ke|(toggle_repeat('<*name of alias*>, *time in ms*)
- e.g.ke|(toggle_repeat('<scan_alias>, 6000)
- repeated alias work the same as macros
- playback can be interrupted by stopping, toggling on/off and resetting
- entirely independent of the key_event it follows as constraint
- if used in rebind, use it on a ke with a prefix (
-
or+
) or else it will be started as press and release- use new
None
key_event (description see below)- e.g.
-None|*constraint to be fulfilled*|(toggle_repeat('<*name of alias*>, *time in ms*)
- e.g.
- use new
- can not be used in tap_groups, can be used anywhere else where constraints can be used
- alias will be played like a macro:
- constraints checked at start and with defined delays
- repeat_time in ms is the time between 2 playbacks of the same alias as macro
- if macro delays are longer than the repeat_time, the restart of the repeat will interrupt the previous repeat
- multiple repeats can be started from the same key_event
- repeating can be control via following Evaluations:
- all will evaluate to true and only be evaluated if previous constraints are True
ke|(toggle_repeat('<*name of alias*>, *repeat time in ms*)
ke|(start_repeat('<*name of alias*>, *repeat time in ms*)
ke|(stop_repeat('<*name of alias*>)
ke|(reset_repeat('<*name of alias*>)
ke|(stop_all_repeat()
General
- FROM NOW ON: ALL evaluation will always evaluate to True
- if key_event should not be played add a
|(False)
constraint at the end or useNone
key_event - it is just simpler to keep in mind if all will result in True
- if key_event should not be played add a
None
=none
=NONE
=*empty*
=_
key_event that will never be played but the constraints will be evaluated (included delay)- use it as reset replacement with the name of the Seq as constraint or for Alias Repeat Evaluations
- empty -> e.g.
... , |(reset('sequence')), ...
- will always be seen as +None (release) so in a trigger it will always checked as True and only trigger Evaluations once
- default Names for Tap_Groups, Rebinds and Macros if no name is given (name is needed by macros to interrupt itself)
- names for macros MUST be unique and if used in other macros they will interrupting each other
- updated display of Macros and Macro Sequences: trigger group will be displayed on line with name of macro, key groups will each have its own line
- Evaluation can now also be used with functions calls that include commas - e.g. |(pow(2 , 2) can now be used to define now complex functions to calculate times (a byproduct of implementing alias repeat)
breaking changes to reset handling
- the previously in V1.1.0 introduced syntax for reset a Macro Sequence via Evaluation is now the only allowed way to do it
ke|(*name of macro sequence to be reset*)
None|(reset('sequence'))
or simply... , |(reset('sequence')), ...
also possible - a bit more verbose- can also be combined with previous constraints to only reset if they evaluate to True
None
key_event should be convenient replacementNone|constraint|(*sequence_name*)
- removed all reset vk_codes
reset
,reset_all
,reset_*number*
- using any of them will result in an Error
<hello> x|400,y|400
-z : -z|(toggle_repeat('<hello>', 2000))
-u : -u|(reset_repeat('<hello>'))
(stop all repeat on esc) -esc : -esc|(stop_all_repeat())
(sequence) a :: b : c : d : e
(reset of it) d : d|(sequence)
(alternate reset via None) tab :: +shift, tab, +None|(reset('sequence'))
(alternate reset via empty ke) tab :: +shift, tab, |(reset('sequence'))
See Release Notes on V1.1.0 for the other changes link
V1.1.0 Aliases, Naming of lines, a lot of internal Refactoring
Hello Everyone,
a new release with some changes, mainly a lot of internal improvements and changes to the general organization of the whole program.
Not much changes in usage or hopefully not much breaking of old functionality. :-)
Biggest ones are (WIP):
NEW:
ALIASES can now be used in Macros and Rebinds (still only one Key_Event allowed) :-D
<*name of alias*>
- Aliases are active for all Focus Groups
- Maybe will come to each focus group separately so you can have the same aliases with different key groups for each focus group
- mainly intended for Macro trigger_group and key_groups, but can be used in trigger_group of Rebinds (will not work in replacement keys :-) )
NAMING for Tap_Groups, Rebinds and Macros
- Macro Sequences can be reset by using there name as a Constraint (will evaluate to True)
- e.g.
ke|(crouch_macro)
will reset the Macro Sequence with this name - this will always eval to True, so if you do not want this key to be played just add |(False) after
- e.g.
- for all else mostly just for better overview
- will be shown in CLI
Refactor into different files for better overview and easier changes in future.
Evaluation of Constraints of a Trigger Group
- Eval of Constraints will only start if all key_events are fulfilled
- e.g. ´-c, +ctrl|(False), +space|(constraint2)´ :
-
- -c checked, 2. +ctrl checked, 3. +space checked ... if all True then constraints will be checked
-
- constraint (False) will always be False and 5. constraint2 will never be checked
-
- e.g. ´-c, +ctrl|(False), +space|(constraint2)´ :
- Eval of Constraints will abort as soon as one (starting from the first ke) will result in False
Eval of Key Groups Constraints
- in Macros will always take place at the start of the playback instead at the time of the key_event being played as before - so everything will be evaluated AT THE SAME TIME with the same internal state of pressed and released keys.
- lead to changed internal state when run and not deterministic behavior if other action where taken
- or the macro itself changed the state
New or changed evaluations:
- ap("key_string") : all press (checks if key is pressed for real AND simulated keys)
- a("key_string") and P("key_string") only check for real key press or release
- ar("key_string") : all release (same just for releases)
- stop_all_repeat() : will stop every active repeat; eval to False
- reset_timer() changed to reset_repeat() ; eval to True
Press state of all keys will be reset on esc
or alt+tab
- to make it easier for menu navigation in game and to hopefully not get stuck keys outside of the game any more
Simulated keys that contradict real key presses will now always be suppressed except for tap_groups
- e.g. holding shift can now no longer be released by shift release of a macro or rebind (simulated key)
Option 0 of the CLI menu is much more verbose and helpful now
Bugfixes:
- #59 fixed - can be run again without any focus group in config
- #60 fixed - focus group names will now be also stripped of comments and white spaces removed before and after
For details on smaller changes see WIP release notes after the example.
So here an example of my usage right now. :-D
#<arg>-debug
#<arg>-crossover=15
#<arg>-tapdelay=6,4
#<arg>-aliasdelay=6,4
<arg>-nomenu
#<arg>-nocontrols
<arg>-nodelay
<arg>-status_indicator=15
# Tap Groups
a, d
w, s
#----------------------------------------
### Horizon Forbidden West
<focus> Horizon
<arg>-tapdelay=6,4
<arg>-aliasdelay=50,50 # shorter delays lead to missed keys in game
<arg>-nomenu
<arg>-crosshair
# Aliases
<run_if_not> -shift|(ar('shift'))
<alias_in_alias> <run_if_not>, +ctrl|75|(ap('-ctrl')), -ctrl|150, +c|75|(ap('-c')), +ctrl, -shift
# Rebinds
(autospring_toggle) caps_lock : ^shift # naming possible for tap_groups, rebinds and macros
(autosprint_on_dc) +shift|(dc()<900) : +suppress # but only has added functionality of reset for macro sequences
(focus_toggle) p: ^alt # see also macro (stop_shift_on_menu_and_map_reset)
(esc_repeat_stop) -esc : -esc|(stop_all_repeat()) # easy way to stop ALL repeating keys still active
# example for reapting key `v`, reset repeat on manual v press and stop when holding v key for at least 500 ms
(repeat_scan) +v|(tr("+v")>500) :: +v, v|(stop_repeat())
(repeat_scan) u : v|(toggle_repeat(6500)) # stop also possible just by hitting again
(repeat_scan) v : v|(reset_repeat())
# Macros
(aiming) -left_mouse, -right_mouse :: -left_mouse|900, -alt|(p("right_mouse"))
(aiming_mod1) +left_mouse, -right_mouse :: +left_mouse, +alt, -reset_0
(aiming_mod2) +right_mouse, -left_mouse :: +left_mouse|50|(last('-ml')>800), +right_mouse, +alt, -reset_0
(crouch) -c :: <run_if_not>, +c|100|(ap('-c')), -c|100, +c, -shift # example of alias usage
(crouch_mod) +c : +suppress
(evade_1) -mouse_x2|(dc('mx2')<1000) :: <alias_in_alias> # example of alias usage: dc() -> double click (on same key it is like last key press)
(evade_2) -mouse_x2|(dc('mx2')>1000) :: <run_if_not>, +c|75|(ap('-c')), -c|150, +ctrl|75|(ap('-ctrl')), +c # example of alias usage
(heavy_attack) -mouse_x1 :: -g|50, +shift|50, -shift|50, +g
(heavy_attack_mod) +mouse_x1 : +suppress
(special_ability) i :: -f|50, space|50, +f
(map_open_close) -m :: m # the only macro sequence in this example
: esc
(map_open_close_mod) +m : +suppress
(stop_shift_on_menu_and_map_reset) -tab :: +shift|100, -tab|(map_open_close) # <- new reset option based on (names)
(interact_shift_mod) +e|(tr("+e")>500) :: +e, +shift
(interact_shift_mod) +e|(dc() < 1000) :: +e, -shift
# evade macro sequence as example
# see the usage of reset after long delays to reset them automatically before next
# sequence interrupts the reset if pressed in time
# first crouch slide and then 3 evades (with shorter reset times) instead of crouch slide
#-mouse_x2 :: -shift|200|(ar('shift')), +c|75|(ap('-c')), c |50, #c |50, +ctrl|(1000-last('-mx2')), -reset
# : -shift|(ar('shift')), +ctrl|75|(ap('-ctrl')), ctrl|50, #ctrl|50, +c|450, -reset
# : -shift|(ar('shift')), +ctrl|75|(ap('-ctrl')), ctrl|50, #ctrl|50, +c|450, -reset
# : -shift|(ar('shift')), +ctrl|75|(ap('-ctrl')), ctrl|50, #ctrl|50, +c|450, -reset
### Pls report or comment in discussion of the release on what is not working or what you would have expected to work differently
Preliminary Release Notes V1.1 (WIP - some of it is not up to date yet):
trigger_groups:
-trigger_groups can now be distinguished also via constraints - not only by the key_events in the trigger_group
-
-mouse_x2|(dc('mx2')<1000) and -mouse_x2|(dc('mx2')>1000) are now recognized as 2 different trigger for rebind or macros and the second will no longer overwrite the first one
-
reset can now also be used in a trigger_group to reset the macro sequence on trigger activation
- combined with constraints it can now work to flexibly reset a macro sequence
- e.g.
-c, +reset|(dc('c')>1000):: ...
(dc = double click to get the time since last press, when using it with the same key; last() should be used when using it with another key) - use always
+reset
because it is handled like a key event and must be fulfilled (in this case must be released which is for all reset keys always True) before the constraints will be checked - only if the constraints all result in True will the reset activated
rebinds
- reset key_events that reset macro sequences now also work in rebinds as replacement key
macro/ macro sequences:
-
the constraint check of a played group (rebind or macro) (not trigger group) will be all checked at the same time now.
- before it was always checked at the exact time of playback and could be way later than the original start of the macro due to before applied delays - this lead to some very strange behavior when using time evaluations because they could be updated while the macro was still running
- now it has consistent behavior
-
removed toggle option from played macro groups
- (maybe unnecessary????)
- I want to rework that because the key states tracking now allows a better solution for this
repeat keys
- stop_repeat will now again evaluate to False to suppress the playback of the stopped keys
general behavior
-
all key states (press or release) are now tracked - real keys states as well as simulated key states
- can now be used in invocations as
ap('key_string')
(all keys press) andar('key_string')
(all keys release) - with this now also the simulated key states can be used to create more complex macros/rebinds
- can now be used in invocations as
-
simulated key events that would release real key presses are now suppressed with the exception of the keys defined in the tap groups to allow the snap tap behavior.
GUI
- status indicator now has the option on doubleClick or middleClick to open the config file like in the contextmenu - just to get to it easier
- crosshair now will redraw itself if left clicked on it (hard to hit :-D )
- crosshair now waits 1 extra second after switching focus groups due to window changes to make it more likely to recognize the right window and its size better
On window change:
- all currently pressed simulated keys will be released on window change
- dependent on rebinds or macros it was possible to get stuck keys until the real key was pressed again to release the key state
- will ignore currently pressed real keys and not release these
esc
now also releases all not currently pressed simulated keys- even if manually paused
alt+tab
will now also try to release all currently pressed simulated keys
internal
- rename...
V1.0.4 small QOL + Bugfixes
V1.0.4
QOL:
- helpful error handling when reloading from files - now shows the error message and the tap_group, rebind or macro the error happened in.
- crosshair and indicator no longer trigger focus change if clicked on it
- indicator now has context menu entries to open config file and reload file
- added some transparency to indicator to no longer be so prominent and position changed to upper right corner

Bugfix:
- fixed: 2 reloads needed to apply changes from file; now one reload or focus change is needed like before V1.0.0
Maintenance:
- cleaned up crosshair code
Known bugs/limitations:
- centering of crosshair is off sometimes (may be because it updated the crosshair position when the window was not fully open or recognized the wrong window)
- toggling it 2 times over the menu from the game is a workaround atm
- not working with FACEIT AntiCheat since the last update of FACEIT
V1.0.3
New:
- <arg>-crosshair (to be used together with the <arg>-status_indicator)
- shows a simple crosshair as an overlay in the middle of the main screen
- can be used for for each <focus> group separately or will be always active if used before the first <focus> as a default start arg
- only works if the status indicator is active, because it is controlled by the same GUI loop
- status indicator now has in the context menu the option to toggle the indicator - but a change of the active window will reset the setting due to application of the start arguments of the default group or a focus group.
- <arg>-crosshair=x,y sets a delta to the window middle (same constraints as above argument apply)
- e.g. <arg>-crosshair=-20,-20 sets the middle of the crosshair 20 pixel left and above the center point of the window
- I use this for third person games where sometimes the middle target point for aiming is not in the middle point of the window

Bug fix:
- while holding a key that is a trigger of a rebind or macro, I could happen that on repeating the keys the original key was not intercepted
- for all key_events that are triggers of rebinds and macros the repeat on holding the key is deactivated. The key will only be send once.
V1.0.2.1:
New:
- listening now also for vertical and horizontal mouse scroll wheel input (vk_code 6 and 7); only listening, no sending of scroll events.
Bug fix:
- key event filter was active at start even without hitting enter to start. if you used -nomenu there was nothing different
V1.0.2:
- Option for a small graphical Indicator that simply shows if the program is active or not. It changes color to red if key listener is inactive and green if active.
- use <arg>-status_indicator=size in pixel in config before the first <focus>
- e.g. <arg>-status_indicator=20 # indicator circle with 20 pixel diameter
- control it via:
- left click to drag indicator to new position
- right click opens a context menu
- controls like on alt+* key combination: Toggle Pause, Return to Menu, Exit Program
- to separately close the overlay use: Close Indicator; the program will continue like normal without the indicator
- the indicator always stays on top, even in full screen apps
- atm it only works at the start, if you close it you have to restart FST to get it back
- it starts in the upper left corner of your main screen, so if you have your taskbar on the left side of the screen and clicked on the task bar after starting FST it can be obstructed by the task bar



-
When holding a key, now it will again send repeated keys like one would expect. Before the repeated keys on hold were intercepted to prevent multiple executions of a macro by holding the trigger key.
- Now every key hold should send repeated keys and only the first press or release will be able to trigger a macro
- Rebinds work for each key event on hold - so keys will be always replaced not only on first press or release
- Tap Groups only allow the repeating of keys if they are not contrary to the actual tap group state which decides which key should be send as idealized input
-
active window names should now be shortened to the actual program name
- so instead of "free_snap_tap.py - Untitled (Workspace) - Visual Studio Code" it should now only show "Visual Studio Code" and comparable
Bug fix:
- Toggle Pause control on ALT+DELETE that was unreliable in combination with the new <focus> groups
If you find any bugs or have ideas or request for features - just open an issue or discussion.
V1.0.1:
- all settings in one file (except start arg:
-file=...
to define from which file to load at start)- all start arguments supported via
<arg>*startargument*
- multi focus apps with own groups via
<focus>*name of focus app*
- all start arguments and groups before first
<focus>...
will be interpreted as default and applied to all focus app settings - every start argument and groups until the next <focus> will be added to the current focus name and applied AFTER the default start arguments and groups
- e.g. tap group
a, d
before first <focus> will be applied to all focus groups
- all start arguments and groups before first
- all start arguments supported via
- adapted cli output of groups to always show the currently active groups
- if a ke/key had more then one suffix, following suffixes of a ke or a trigger_group were not checked/executed as soon as one suffix evaluated to False (was a measure to prevent unnecessary checks) - fixed, now all will be checked
- starting times for keys was set to start time - now will be set 1000 seconds in the past, to guarantee first time execution of macros/rebinds with boolean time evaluations
- my cause problems in delay times if the key was not pressed before a time evaluation for a delay of this key
- reset_repeat() and repeat_stop() now evaluates to True
- file now supports multi line macro sequences, when new lines starts with
:
it will be added to the line above
V1.0.0:
- macro playback interruption and replaying by retriggering the same macro
- macro sequences and reset functionality
- macro notation now with
::
instead of:
- mouse buttons now also tracked,
- right_mouse, left_mouse, middle_mouse, mouse_x1, mouse_x2 now usable as constraints, and in suffixes
- repeating keys at set interval and management of the repeating function
- function invocation (similar to evaluations but will always return False, but execute the function to manage the repetition of the suffixed key_event or Key)
- toggle_repeat()
- stop_repeat()
- reset_repeat()
- function invocation (similar to evaluations but will always return False, but execute the function to manage the repetition of the suffixed key_event or Key)
- added evaluations:
- last(): returns time since last press or release
- dc(): "double click": on press returns time since last press, on release returns time since last release
- many other smaller improvements :-)
Function documentation (Version 1.0.1) see ReadMe
V1.0.3. crosshair option + bugfix hold keys
V1.0.3
New:
- <arg>-crosshair (to be used together with the <arg>-status_indicator)
- shows a simple crosshair as an overlay in the middle of the main screen
- can be used for for each <focus> group separately or will be always active if used before the first <focus> as a default start arg
- only works if the status indicator is active, because it is controlled by the same GUI loop
- status indicator now has in the context menu the option to toggle the indicator - but a change of the active window will reset the setting due to application of the start arguments of the default group or a focus group.
- <arg>-crosshair=x,y sets a delta to the window middle (same constraints as above argument apply)
- e.g. <arg>-crosshair=-20,-20 sets the middle of the crosshair 20 pixel left and above the center point of the window
- I use this for third person games where sometimes the middle target point for aiming is not in the middle point of the window

Bug fix:
- while holding a key that is a trigger of a rebind or macro, I could happen that on repeating the keys the original key was not intercepted
- for all key_events that are triggers of rebinds and macros the repeat on holding the key is deactivated. The key will only be send once.
V1.0.2.1:
New:
- listening now also for vertical and horizontal mouse scroll wheel input (vk_code 6 and 7); only listening, no sending of scroll events.
Bug fix:
- key event filter was active at start even without hitting enter to start. if you used -nomenu there was nothing different
V1.0.2:
- Option for a small graphical Indicator that simply shows if the program is active or not. It changes color to red if key listener is inactive and green if active.
- use <arg>-status_indicator=size in pixel in config before the first <focus>
- e.g. <arg>-status_indicator=20 # indicator circle with 20 pixel diameter
- control it via:
- left click to drag indicator to new position
- right click opens a context menu
- controls like on alt+* key combination: Toggle Pause, Return to Menu, Exit Program
- to separately close the overlay use: Close Indicator; the program will continue like normal without the indicator
- the indicator always stays on top, even in full screen apps
- atm it only works at the start, if you close it you have to restart FST to get it back
- it starts in the upper left corner of your main screen, so if you have your taskbar on the left side of the screen and clicked on the task bar after starting FST it can be obstructed by the task bar



-
When holding a key, now it will again send repeated keys like one would expect. Before the repeated keys on hold were intercepted to prevent multiple executions of a macro by holding the trigger key.
- Now every key hold should send repeated keys and only the first press or release will be able to trigger a macro
- Rebinds work for each key event on hold - so keys will be always replaced not only on first press or release
- Tap Groups only allow the repeating of keys if they are not contrary to the actual tap group state which decides which key should be send as idealized input
-
active window names should now be shortened to the actual program name
- so instead of "free_snap_tap.py - Untitled (Workspace) - Visual Studio Code" it should now only show "Visual Studio Code" and comparable
Bug fix:
- Toggle Pause control on ALT+DELETE that was unreliable in combination with the new <focus> groups
If you find any bugs or have ideas or request for features - just open an issue or discussion.
V1.0.1:
- all settings in one file (except start arg:
-file=...
to define from which file to load at start)- all start arguments supported via
<arg>*startargument*
- multi focus apps with own groups via
<focus>*name of focus app*
- all start arguments and groups before first
<focus>...
will be interpreted as default and applied to all focus app settings - every start argument and groups until the next <focus> will be added to the current focus name and applied AFTER the default start arguments and groups
- e.g. tap group
a, d
before first <focus> will be applied to all focus groups
- all start arguments and groups before first
- all start arguments supported via
- adapted cli output of groups to always show the currently active groups
- if a ke/key had more then one suffix, following suffixes of a ke or a trigger_group were not checked/executed as soon as one suffix evaluated to False (was a measure to prevent unnecessary checks) - fixed, now all will be checked
- starting times for keys was set to start time - now will be set 1000 seconds in the past, to guarantee first time execution of macros/rebinds with boolean time evaluations
- my cause problems in delay times if the key was not pressed before a time evaluation for a delay of this key
- reset_repeat() and repeat_stop() now evaluates to True
- file now supports multi line macro sequences, when new lines starts with
:
it will be added to the line above
V1.0.0:
- macro playback interruption and replaying by retriggering the same macro
- macro sequences and reset functionality
- macro notation now with
::
instead of:
- mouse buttons now also tracked,
- right_mouse, left_mouse, middle_mouse, mouse_x1, mouse_x2 now usable as constraints, and in suffixes
- repeating keys at set interval and management of the repeating function
- function invocation (similar to evaluations but will always return False, but execute the function to manage the repetition of the suffixed key_event or Key)
- toggle_repeat()
- stop_repeat()
- reset_repeat()
- function invocation (similar to evaluations but will always return False, but execute the function to manage the repetition of the suffixed key_event or Key)
- added evaluations:
- last(): returns time since last press or release
- dc(): "double click": on press returns time since last press, on release returns time since last release
- many other smaller improvements :-)
Function documentation (Version 1.0.1) see ReadMe
V1.0.2.1 small bugfix
V1.0.2.1:
New:
- listening now also for vertical and horizontal mouse scroll wheel input (vk_code 6 and 7); only listening, no sending of scroll events.
Bugfix:
- key event filter was active at start even without hitting enter to start. if you used -nomenu there was nothing different
NEW V1.0.2:
- Option for a small graphical Indicator that simply shows if the program is active or not. It changes color to red if key listener is inactive and green if active.
- use <arg>-status_indicator=size in pixel in config before the first <focus>
- e.g. <arg>-status_indicator=20 # indicator circle with 20 pixel diameter
- control it via:
- left click to drag indicator to new position
- right click opens a context menu
- controls like on alt+* key combination: Toggle Pause, Return to Menu, Exit Program
- to separately close the overlay use: Close Indicator; the program will continue like normal without the indicator
- the indicator always stays on top, even in full screen apps
- atm it only works at the start, if you close it you have to restart FST to get it back
- it starts in the upper left corner of your main screen, so if you have your taskbar on the left side of the screen and clicked on the task bar after starting FST it can be obstructed by the task bar



-
When holding a key, now it will again send repeated keys like one would expect. Before the repeated keys on hold were intercepted to prevent multiple executions of a macro by holding the trigger key.
- Now every key hold should send repeated keys and only the first press or release will be able to trigger a macro
- Rebinds work for each key event on hold - so keys will be always replaced not only on first press or release
- Tap Groups only allow the repeating of keys if they are not contrary to the actual tap group state which decides which key should be send as idealized input
-
active window names should now be shortened to the actual program name
- so instead of "free_snap_tap.py - Untitled (Workspace) - Visual Studio Code" it should now only show "Visual Studio Code" and comparable
Bugfixes:
- Toggle Pause control on ALT+DELETE that was unreliable in combination with the new <focus> groups
If you find any bugs or have ideas or request for features - just open an issue or discussion.
NEW V1.0.1:
- all settings in one file (except start arg:
-file=...
to define from which file to load at start)- all start arguments supported via
<arg>*startargument*
- multi focus apps with own groups via
<focus>*name of focus app*
- all start arguments and groups before first
<focus>...
will be interpreted as default and applied to all focus app settings - every start argument and groups until the next <focus> will be added to the current focus name and applied AFTER the default start arguments and groups
- e.g. tap group
a, d
before first <focus> will be applied to all focus groups
- all start arguments and groups before first
- all start arguments supported via
- adapted cli output of groups to always show the currently active groups
- if a ke/key had more then one suffix, following suffixes of a ke or a trigger_group were not checked/executed as soon as one suffix evaluated to False (was a measure to prevent unnecessary checks) - fixed, now all will be checked
- starting times for keys was set to start time - now will be set 1000 seconds in the past, to guarantee first time execution of macros/rebinds with boolean time evaluations
- my cause problems in delay times if the key was not pressed before a time evaluation for a delay of this key
- reset_repeat() and repeat_stop() now evaluates to True
- file now supports multi line macro sequences, when new lines starts with
:
it will be added to the line above
NEW V1.0.0:
- macro playback interruption and replaying by retriggering the same macro
- macro sequences and reset functionality
- macro notation now with
::
instead of:
- mouse buttons now also tracked,
- right_mouse, left_mouse, middle_mouse, mouse_x1, mouse_x2 now usable as constraints, and in suffixes
- repeating keys at set interval and management of the repeating function
- function invocation (similar to evaluations but will always return False, but execute the function to manage the repetition of the suffixed key_event or Key)
- toggle_repeat()
- stop_repeat()
- reset_repeat()
- function invocation (similar to evaluations but will always return False, but execute the function to manage the repetition of the suffixed key_event or Key)
- added evaluations:
- last(): returns time since last press or release
- dc(): "double click": on press returns time since last press, on release returns time since last release
- many other smaller improvements :-)
Function documentation (Version 1.0.1) see ReadMe
V1.0.1 all in one config file, mouse listener, repeating keys, macros sequences
NEW V1.0.1:
- all settings in one file (except start arg:
-file=...
to define from which file to load at start)- all start arguments supported via
<arg>*startargument*
- multi focus apps with own groups via
<focus>*name of focus app*
- all start arguments and groups before first
<focus>...
will be interpreted as default and applied to all focus app settings - every start argument and groups until the next <focus> will be added to the current focus name and applied AFTER the default start arguments and groups
- e.g. tap group
a, d
before first <focus> will be applied to all focus groups
- all start arguments and groups before first
- all start arguments supported via
- adapted cli output of groups to always show the currently active groups
- if a ke/key had more then one suffix, following suffixes of a ke or a trigger_group were not checked/executed as soon as one suffix evaluated to False (was a measure to prevent unnecessary checks) - fixed, now all will be checked
- starting times for keys was set to start time - now will be set 1000 seconds in the past, to guarantee first time execution of macros/rebinds with boolean time evaluations
- my cause problems in delay times if the key was not pressed before a time evaluation for a delay of this key
- reset_repeat() and repeat_stop() now evaluates to True
- file now supports multi line macro sequences, when new lines starts with
:
it will be added to the line above
NEW V1.0.0:
- macro playback interruption and replaying by retriggering the same macro
- macro sequences and reset functionality
- macro notation now with
::
instead of:
- mouse buttons now also tracked,
- right_mouse, left_mouse, middle_mouse, mouse_x1, mouse_x2 now usable as constraints, and in suffixes
- repeating keys at set interval and management of the repeating function
- function invocation (similar to evaluations but will always return False, but execute the function to manage the repetition of the suffixed key_event or Key)
- toggle_repeat()
- stop_repeat()
- reset_repeat()
- function invocation (similar to evaluations but will always return False, but execute the function to manage the repetition of the suffixed key_event or Key)
- added evaluations:
- last(): returns time since last press or release
- dc(): "double click": on press returns time since last press, on release returns time since last release
- many other smaller improvements :-)
Function documentation (Version 1.0.1) see ReadMe
V1.0.1 with an indicator overlay for active/inactive
Use <arg>-status_indicator=size in pixel in config before the first <focus>.
e.g. <arg>-status_indicator=20 # indicator circle with 20 pixel diameter
changes color if to red if key listener is inactive and green if active ^^
-
left click to drag indicator to new position
-
right click opens a context menu to separately close the overlay - cli program is still running.
-
indicator should close if cli program will be closed
-
indicator always stays on top - not tested with full screen programs yet