AfterDawn | News | Guides | Software downloads | Tech Support | Forums | HIGH.FI

Version history for StrokesPlus 32-bit

<<Back to software description

Changes for v2.8.3.1 - v2.8.3.3

  • - Added preference for Minimum Gesture Length. This tells S+ how far from the gesture start the mouse needs to have traveled before considering that a gesture has been started (drawn gestures only)
  • - Updated language file to include support for new preference:
  • language.Preferences.StrokeStyleFrame.GestureLength.Title - "Min. Gesture Length:"
  • language.Preferences.StrokeStyleFrame.GestureLength.Suffix - "px"

Changes for v2.8.3.0 - v2.8.3.1

  • Added option on Ignored tab (lower left) named Enable S+ If Non-Ignored App Becomes Active. This instructs S+ to enable itself if any window becomes active which is NOT in the ignored window list. This will happen even if you've manually disabled S+. The purpose is to have ignored apps that disable S+, but when you leave them, S+ will become re-enabled automatically. Since this behavior overrides even manually setting S+ to disabled, it is not for everyone.

Changes for v2.8.2.0 - v2.8.3.0

  • Compiled using platform toolset Visual Studio 2013 (v120). I have no idea how this may affect compatibility for older versions of Windows, but I have built a new PC and this is what I am running with from now on
  • Fixed issue with ignore buttons not being recognized properly and generally running amok
  • Removed keys from being Stroke buttons; the code was really messy and I do not feel it is in the best interest of productive maintenance and performance of S+

Changes for v2.7.8.1 - v2.8.2.0

  • *BREAKING CHANGE*: Changed the middle/X1/X2 mouse click scripts' logic to fire on mouse UP instead of mouse down, since that's generally when things do something in windows
  • *BREAKING CHANGE*: Aforementioned function names changed from "down" to "up", for example sp_middle_mouse_down is now sp_middle_mouse_up
  • Added similar code and options for firing on left and right mouse button up events
  • Note that for all of these mouse click events, they will NOT fire on mouse up of the stroke button; sp_right_mouse_up will not be called if the right mouse button is your stroke button
  • Also note that mouse click event scripts will not fire if the stroke button is currently being held down and S+ is either in an action or actively capturing the mouse (e.g. while drawing)
  • Added acSetNumber and acGetNumber; the only purpose for this action pair is for communicating between Lua states
  • Fixed bug where a few code blocks were waiting if either Lua state was executing, instead of only waiting when both Lua states were in use
  • Updated language file to include support for new preferences:
  • language.Preferences.AdvancedOptionsFrame.AllowLeftClickScript - "Allow Left Click Script*"
  • language.Preferences.AdvancedOptionsFrame.AllowRightClickScript - "Allow Right Click Script*"

Changes for v2.7.8.0 - v2.7.8.1

  • Added Cut option to actions
  • Updated language.xml, added language.Menu.Cut for new menu item

Changes for v2.7.7.1 - v2.7.8.0

  • Added Copy/Paste right-click menu to Actions tree along with some other menu items which perform the same action as the buttons below the action tree
  • The Paste menu item is only available when right-clicking on an App or Global Actions, the opposite is true for Copy
  • If you paste to an app or global where an action with the same name exists, the action will be copied with " (Copy)" appended
  • If there's already an action with " (Copy)" appended to it after the first try, you'll receive a name conflict error and will need to rename one of the actions in the destination
  • Updated Language.xml, adding language.Menu.Copy and language.Menu.Paste to support new popup menu
  • Prevented creation of or renaming to an app called Global Actions (appends " 2", then follows existing name collision code logic)
  • Adding missing Left node buildout on add action

Changes for v2.7.7.0 - v2.7.7.1

  • Added acSetDisplayGamma which allows you to set the RGB gamma across all displays (if supported by the video card)

Changes for v2.7.6.1 - v2.7.7.0

  • Added acGetMonitorBrightness/acSetMonitorBrightness, they only get/set values on the first physical monitor associated with the monitor handle (will cover 99% of scenarios)
  • Technically a monitor handle can have multiple physical monitors associated, for example when you duplicate a display on a laptop or projector
  • I don't think there's a lot of value in spending the time to handle all those scenarios at the moment
  • Not supported prior to Windows Vista
  • Not all displays or drivers support this function call
  • If this doesn't work for your laptop, I recommend using NirCmd (

Changes for v2.7.6 - v2.7.6.1

  • Fixed MOD_NOREPEAT line, wasn't properly ORing the var
  • Added acDisableHotkey(hkid) and acEnableHotkey(hkid). These let you temporarily disable and re-enable the hotkey (only within the life/scope of the hotkey's script).
  • Hotkey actions now executed in separate thread instead of the main one

Changes for v2.7.5.2 - v2.7.6

  • Fixed bug in mouse wheel scroll action code which caused the cancel timer to reset when in a wheel scroll fire action sequence
  • If Windows 7 or later, hotkeys are also registered with MOD_NOREPEAT to prevent keyboard repeat from sending multiple hotkey messages
  • Updated gesture name code to no longer compare names in a case-insensitive fashion. So you can now have a gesture names "e" and "E".
  • Added hidden setting in StrokesPlus.xml (ShowCopyData) defaulted to 0 (off) to control whether S+ displays string data in a popup upon receiving a WM_COPYDATA message

Changes for v2.7.5.1 - v2.7.5.2

  • Improved Metro window checks for mouse wheel relay

Changes for v2.7.5 - v2.7.5.1

  • Updated acCreatePopupMenu code to no longer clear its internal variables; this allows menus to be chained (create another popup menu from a popup menu item)

Changes for v2.7.4 - v2.7.5

  • Fixed tray icon, if S+ disabled, on resume from sleep the icon was recreated using the incorrect icon
  • Added code to check for Metro windows and skip relaying mouse wheel messages when Enable Mouse Wheel Relay is enabled
  • Added acCreatePopupMenu which lets you create a custom popup menu and have a Lua function called , See for details
  • Updated default configs to disable Keep Gesture Window on Top as it can be confusing and have interoperability issues with some apps

Changes for v2.7.3.3 Beta - v2.7.4

  • Reverted the prevention of S+ allowing multiple instances. The option is still removed from Preferences as it's not a support running configuration, but those who want to can still do it
  • Removed unintended duplicate trim timer
  • Changed message box calls in EXE to pass NULL instead of GetForegroundWindow(), possible culprit for issue with multiple instances, and ultimately a harmless change even if it doesn't fix anything
  • Upgrading to release status

Changes for v2.7.3.2 Beta - v2.7.3.3 Beta

  • Fixed issue where selecting a different stroke button from the tray menu would be lost (reverted) is you opened up the settings window and clicked Cancel (which reloads settings)
  • Config is now saved when selecting most tray menu options (except Disable StrokesPlus as there are other code paths which send the same message and shouldn't be persisted)
  • Removed multiple instance message suppression from Preferences since it's no longer stable or supported
  • Additional instances of S+ will quietly exit upon running if S+ is already running
  • Changed About tab to display all four version numbers, instead of only the first three

Changes for v2.7.3 Beta - v2.7.3.1 Beta

  • Update to fix missed code paths, resulting in LeaveCriticalSection never being called, locking up other threads

Changes for v2.7.2 (Windows 7) - v2.7.3 Beta

  • Added critical section block around action script init code. This eliminates race conditions which resulted in crashes during rapid actions in succession; subsequent actions will be queued, not discarded
  • Added critical section block in hotkey function, to prevent duplicate firing if the hotkey is still being pressed; hotkeys sent while a hotkey is still firing will be discarded
  • Also added a slight delay at the end of the hotkey fire function, again for the purpose of improving hotkey UX
  • Added option to fire a Global Lua function on middle mouse down (only if stroke button is not middle button), create following function in Global Lua to house your script:
  • function sp_middle_mouse_down()
  • --do something here
  • end
  • Note that this functionality and script are executed entirely outside of gesture logic, including modifier checks. Meaning if you have this option enabled and an action with a middle click modifier, you'll be able to use the action as always, but the middle click function will also fire.
  • You can certainly tweak the code in the sp_middle_mouse_down() function yourself to workaround any issues or conflicts as needed.
  • This new functionality follows the same rules where it will not be executed if over an ignored window, or only on defined applications when the "Only Capture On Defined Applications (no Global Actions)" option is enabled
  • This functionality does not consume the middle down click event. So if you middle click on something which responds to a middle click, it will still receive the middle down click event, and the sp_middle_mouse_down() will execute.
  • For example, middle-clicking on a tab in Chrome will normally close the tab, so if you turned on this option and made a call to close a tab (CTRL+W) and middle-clicked on a tab, the tab would be closed AND S+ would send CTRL+W, closing another tab
  • You may be able to leverage acConsumePhysicalInput(1) in sp_middle_mouse_down to prevent the middle mouse down event from being delivered, just make sure you call acConsumePhysicalInput(0) at the end of the script or you will lose the ability to interact with Windows!
  • Updated language file to include support for new preference: language.Preferences.AdvancedOptionsFrame.AllowMiddleClickScript - "Allow Middle Click Script*"
  • Updated the default StrokesPlus.lua file to include the updated sp_before/after function templates as well as the sp_middle_mouse_down() and sp_after_release() functions with descriptions
  • The setup package will NOT automatically update or overwrite this file is you already have one

Changes for v2.7.1 - v2.7.2 (Windows 7)

  • Fixed a bug in acSendWindowToBottom which also resized and repositioned the window, which was never intended to occur
  • Added gesture boundary variables to sp_before_action and sp_after_action. The new parameters are added to the end of the existing function template, e.g. sp_before_action(gnm, gsx, gsy, gex, gey, gwd, gapp, gact, gbl, gbt, gbr, gbb)
  • Quick fix to address bug with boost::regex, if you start a pattern with an asterisk, it would cause S+ to crash on the next recognition. If the first character is *, it will be replaced with .
  • (Internal) Added options.h to allow optional compiling of certain recent features

Changes for v2.7.1 - v2.7.2 (Windows 8)

  • Fixed a bug in acSendWindowToBottom which also resized and repositioned the window, which was never intended to occur
  • Added gesture boundary variables to sp_before_action and sp_after_action. The new parameters are added to the end of the existing function template, e.g. sp_before_action(gnm, gsx, gsy, gex, gey, gwd, gapp, gact, gbl, gbt, gbr, gbb)
  • Quick fix to address bug with boost::regex, if you start a pattern with an asterisk, it would cause S+ to crash on the next recognition. If the first character is *, it will be replaced with .
  • (Internal) Added options.h to allow optional compiling of certain recent features

Changes for v2.7.0 - v2.7.1

  • Updated mouse hook to have more checks for Training Mode, to prevent unexpected errors/crash
  • Added acDisableCapture() and acEnableCapture(), these are different than acDisable or acDisableNext as they control a global flag which tells S+ to forward/ignore the mouse events until acEnableCapture is called, or the Lua states are reinitialized. There aren't many use cases for this pair of actions, but there's at least one person who could use them

Changes for v2.6.9 - v2.7.0

  • Fixed bug where S+ wouldn't honor the CheckForOtherGesturePrograms setting
  • Reordered tray menu items for Actions, Hotkeys, Ignored to match the actual tab order
  • Add new preference Only Capture On Defined Applications (no Global Actions) which will instruct S+ to ignore all Global Actions (Hotkeys unaffected by this preference)
  • The mouse/touchpad will only be captured when drawing on a window which is defined as an application in the Actions tab; this is basically a white list mode of operation
  • Ignored app definitions are not processed when Only Capture On Defined Applications (no Global Actions) is checked
  • Note that S+ still maintains the mouse and keyboard hook even when an undefined app is clicked, but immediately calls the next hook. When S+ is disabled from the tray, via acDisable(), or due to an ignored app with the disable option checked, the mouse/keyboard hooks are removed as they always have been.
  • When this new preferences is checked, the Actions tab will still show all of the Global Actions (if any) and you can work with them, but they will not be recognized
  • Due to the existing code, Global Actions still must exist in the tree, even if it's being ignored when the new preference is enabled
  • The Ingored tab will be disabled when the new preference is enabled, since that was an easy on or off to add (it displays, but nothing can be clicked/edited; I'll come up with something better at some point)
  • Pressing the ignore key while the new preference is enabled will always switch the S+ tray icon to the disabled look, even though S+ is not intercepting or interfering with the key strokes in any way
  • When this new option is enabled, the S+ tray icon will show a green dot (blue dot is the normal mode, red dot is training mode, green dot is when running in white list mode)
  • Added language.Preferences.AdvancedOptionsFrame.OnlyDefinedApps ("Only Capture On Defined Applications (no Global Actions)") as a supported language.xml element for the new preference

Changes for v2.6.8 - v2.6.9

  • Couple minor layout tweaks to Preferences tab, removed the RGB color edit boxes as they're no longer necessary since the Pick Color button is there
  • Fixed TouchPad finger count default (only on a brand new installation) to 1
  • Fixed issue with Settings window not remembering its maximized state properly (only remembered when you click OK, by the way)
  • Updated Help to include the mention of TouchPad for the Release/Reinitialize on Suspend/Resume option
  • Added "(multiple instances are currently unstable)" to the option in Preferences; I don't recommend using multiple instances at this point in time, it's prone to cause S+ crashes.

Changes for v2.6.7 - v2.6.8

  • Added code to destroy the Synaptics object on SUSPEND, so it is recreated on RESUME (if Release/Reinitialize on Suspend/Resume is checked in Preferences)
  • There's an element in StrokesPlus.xml named , it's defaulted to 5000 (milliseconds), you may need longer to ensure the Synaptics software is ready

Changes for v2.6.6 - v2.6.7

  • Fixed minor issue with S+ not properly canceling a 1-finger gesture when number of fingers touching increases
  • Minor tweaks UI behavior in Preferences window regarding TouchPad style and availability
  • Default TouchPad finger sequence set to 1 (tap & hold) as it seems this is somewhat standard for right-click emulation on touch systems and ensures S+ doesn't conflict with 2-finger actions by default
  • Changed Cursor Movement Threshold code to allow for less than 25%, any number from 0 up (well, to C++ int type limit) may be entered
  • Fixed issue where first gesture dot stayed on the screen if the gesture timed out and the gesture draw window is configured to not be hidden
  • Updated TouchPad movement to ensure ForceMotion delta is never less than 1

Changes for v2.6.4 Beta 6 - v2.6.6

  • Changed About tab Release Date code to pull from LAst Modified instead of Create date
  • 1 finger (press and hold) Preference added along with associated options
  • TouchPads which only support one finger are now supported
  • Added to language templates:
  • language.Preferences.SynapticsFrame.Fingers.One
  • language.Preferences.SynapticsFrame.HoldDeltaText
  • language.Preferences.SynapticsFrame.HoldDeltaSuffix
  • language.Preferences.SynapticsFrame.HoldDelayText
  • language.Preferences.SynapticsFrame.HoldDelaySuffix
  • language.Preferences.SynapticsFrame.StrokeSequence

Changes for v2.6.4 Beta 4 - v2.6.4 Beta 6

  • Fixed stupid TouchPad movement threshold logic error. Seems much better now. Follow this post for full and new details:

Changes for v2.6.4 Beta 2 - v2.6.4 Beta 4

  • Fixed issue with S+ not being ready for capture on TouchPad gesture timeout, had to right-click once to reset
  • Changed acReload() to post message to EXE with 500ms delay for triggering reload (which now includes refreshing Lua engine). This resolves multiple issues.
  • Fixed issue with holding ignore key while starting a TouchPad gesture
  • Added new supported language elements: language.Hotkeys.Messages.ReloadSettingsOpenTitle ("I'm sorry Dave, I'm afraid I can't do that.") language.Hotkeys.Messages.ReloadSettingsOpenMessage ("Please close all StrokesPlus windows before calling acReload().")

Changes for v2.6.3 - v2.6.4 Beta 2

  • Aggressively Manage Memory setting now honored when saving Preferences. Due to the S+ Settings window being on a different thread, the setting wasn't being applied until restart (leftover code from < 2.0 versions)
  • Fixed issue with acSendKeys not forwarding the proper flags on KeyUp (updated download on 2/26/2013 @ 14:43 Eastern Time)
  • Synaptics TouchPad:
  • Movement Sensitivity form elements properly enabled/disabled based on Synaptic software presence
  • Fixed capturing TouchPad button modifiers while fingers are not in motion
  • General fixes to logic flow in various situations
  • Synaptics integration enable/disable no longer requires S+ to be restarted. But due to the COM interop loading of DLLs into the S+ process, some additional memory allocation will remain until S+ restarts. This is the same as when you click Browse... to find the no match sound file; Windows loads some DLLs into the S+ process that cannot be released.
  • The Synaptics UI elements are now disabled/enabled according to the Disable chackbox's state
  • Changed some calls to OutputDebugMessage that should've been using the template function (small performance increase, mostly in TouchPad function)
  • TouchPad init code now checks to see if the Synaptics device is a TouchPad and whether it's multi-finger capable; if not an error message is displayed and the functionality disabled
  • Changed default text of language.Preferences.SynapticsFrame.Disable to: "Disable Integration"
  • Added new supported language elements:
  • language.Base.Messages.TouchPadNotSupportedMessage ("TouchPad not supported.\n\nEither it's not being reported as a TouchPad, is not multi-finger capable, or an error was encountered while initializing the device.\n\nSynaptics TouchPad support will be disabled; you may enable support again in the Preferences tab.")
  • language.Base.Messages.TouchPadNotSupportedTitle ("TouchPad Not Supported")

Changes for v2.6.2 - v2.6.3

  • Windows with an extended style of 0x00200000L (WS_EX_NOREDIRECTIONBITMAP) [Metro Apps on Windows 8] are once again included as top-level in the sp_all_windows table returned by acGetAllWindows(1). NOTE: There are certain window classes which are considered top-level, meaning there's nothing I can find which definitively identifies them as actual Metro app windows or simply ghost/listener/placeholder windows. As such, you'll need to use some logic to test for and exclude these windows manually. I've posted a set of scripts which demonstrate this:
  • It should be noted that acPreviousApplication() and acNextApplication() only work with Desktop windows, not Metro (Windows 8) apps. acGetAllWindows can be leveraged to handle Metro apps as described above.
  • Also, windows with a TOPMOST flag are ignored by acPreviousApplication() and acNextApplication()...This functionality is very difficult to programmitcally put in place in a consistent fashion!
  • To be honest, your best bet is using acGetAllWindows(1) and handling the windows yourself until I can really go through and make Next/Prev work more like the scripts I created for acGetAllWindows(1), but I need a lot more time and testing of the scripts to make sure it's consistent and covers the exclusion list properly

Changes for v2.6.1 - v2.6.2

  • Updated setLastActive (internal function) to also exclude considering Charm windows in Win8 as top-level Desktop windows (doesn't affect scripts/actions)
  • Added new preference Allow After Release Script* which, if checked, will cause S+ to execute sp_after_release() if defined in Global Lua. This is useful as a cleanup function after mouse wheel scroll action pairs.
  • Added language.Preferences.AdvancedOptionsFrame.AllowAfterReleaseScript ("Allow After Release Script*") to Language.xml

Changes for v2.6.0 - v2.6.1

  • Updated the flow of acKillDisplayText to better handle rapid calls and eliminate ghost text
  • Made refinements to the code for the activate window below mouse wheel feature added in 2.5.8 to better handle the owner window activation.

Changes for v2.5.9 - v2.6.0

  • Added acGetAllWindows([0 or 1]) action which populates a global table (created in C++, not by you) named sp_all_windows. This allows you to loop through the table and do whatever you'd like. For example, you want an action which finds all windows of a certain title/class/EXE and do something. Passing 1 only returns top-level desktop windows (usually what you'll want to do), passing 0 returns ALL window handles (a lot); for example, I had 5 programs open, passing 1 returns 5 results consisting of just the main window handles for each app. Passing 0 returned a table of 380 handles! Remember, each button, text box, etc. is considered a window and gets a handle.

Changes for v2.5.8 - v2.5.9

  • Added acKillDisplayText() which allows you to force the acDisplayText window to close before the display duration timeout has been reached.

Changes for v2.5.7 - v2.5.8

  • Updated setLastActive to ignore Metro app windows and put the calls back when closing the Settings or Gesture Name window which were previously removed. This is just to set focus to the top window so S+ gesture window doesn't have focus, which can cause unexpected/confusing behavior.
  • Added AllowSetForegroundWindow call to the code executed when you click Reload Config and Lua Engine to (hopefully) allow for a workaround when/if S+ isn't able to bring other windows to the foreground.
  • Added currently undocumented action acActivateWindowUnderMouseWheel([0 or 1]) which allows you to tell S+ to activate the window under the mouse cursor when Enable Mouse Wheel Relay is enabled and the wheel is scrolled

Changes for v2.5.6 - v2.5.7

  • Ignore and Hotkey tabs now also remember the last selected item (instead of selecting the first one in the list [during the same run only, not after closing S+])
  • Fixed rename hotkey so if you click ok and the text hasn't changed, it doesn't give an error about a hotkey already existing with the same name.
  • Removed the hardcoded S+ hotkeys, they belong under the Hotkeys tab as hotkeys which can be changed or removed:
  • Exit S+: CTRL+SHIFT+ALT+WIN+END - equivalent script: acExit()
  • Disable S+: CTRL+SHIFT+WIN+Z - equivalent script: acDisableNext() acDisable() [use both calls in that order to ensure proper tray icon state if ignore key is part of hotkey definition]
  • Toggle Tray Icon (show/hide): CTRL+SHIFT+WIN+S - equivalent script: acToggleTrayIcon()
  • The ZIPs and installers will now have these as defined under Hotkeys. If you're already using S+ and want to use these, you'll need to create them yourself. The only difference in functionality is that previously these hotkeys were always active as long as S+ was running (S+ enabled or disabled); where now they will only function if S+ is enabled. I think it's in the best interest of most for S+ to not use hard-coded global hotkeys as they may interfere with some configurations or user preferences. However, that means that they will only work when S+ is active. I do believe if S+ is disabled, it should really be completely disabled; not interfering or intercepting anything other than processing tray icon clicks and standard program window interaction. So I hope this change doesn't upset anyone.

Changes for v2.5.4 - v2.5.6

  • If S+ doesn't have read/write access to StrokesPlus.xml in the same directory as StrokesPlus.exe, S+ will default to use the %APPDATA%\StrokesPlus\ directory.
  • ActionHelp.xml, Language.xml, StrokesPlus.lua and StrokesPlus.xml always used from the directory which StrokesPlus.xml was read/writeable.
  • All installers go to Program Files
  • All installers create Startup shortcut
  • Replaced default gestures and actions
  • 2.5.5
  • S+ Settings windows now supports Control+Tab and Control+Shift+Tab to change between tabs when S+ is enabled (was easiest to just add to the keyboard hook)
  • Fixed tabbing support and order within Settings tabs
  • May have corrected the random gesture thumbnail disappearing issue (with my luck, probably not)

Changes for v2.5.3 - v2.5.4

  • Added acInputBox() for accepting input during an action

Changes for v2.4.8 - v2.5.3

  • Updated learn gesture dialog to no longer call setLastActive() on close due to Windows 8 oddities. No significant impact to other versions of Windows.
  • Added the following nodes to language.xml to support added hotkey buttons:
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_BACK
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_FORWARD
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_REFRESH
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_STOP
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_SEARCH
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_FAVORITES
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_HOME
  • language.Hotkeys.HotkeysFrame.Keys.VOLUME_MUTE
  • language.Hotkeys.HotkeysFrame.Keys.VOLUME_DOWN
  • language.Hotkeys.HotkeysFrame.Keys.VOLUME_UP
  • language.Hotkeys.HotkeysFrame.Keys.MEDIA_NEXT_TRACK
  • language.Hotkeys.HotkeysFrame.Keys.MEDIA_PREV_TRACK
  • language.Hotkeys.HotkeysFrame.Keys.MEDIA_STOP
  • language.Hotkeys.HotkeysFrame.Keys.MEDIA_PLAY_PAUSE
  • language.Hotkeys.HotkeysFrame.Keys.LAUNCH_MAIL
  • language.Hotkeys.HotkeysFrame.Keys.LAUNCH_MEDIA_SELECT
  • language.Hotkeys.HotkeysFrame.Keys.LAUNCH_APP1
  • language.Hotkeys.HotkeysFrame.Keys.LAUNCH_APP2

Changes for v2.4.5 - v2.4.8

  • Added Win8LauncherMessage and Win8LauncherTitle to Language.xml. Used when S+ displays a message once about gesture lines not showing in Start screen if OS is Windows 8.
  • Added Windows 8 to the OSVersion variable assignment code block (internal)

Changes for v2.4.4 - v2.4.5

  • Added acGetFileVersion and acGetFileProductVersion

Changes for v2.4.3 - v2.4.4

  • The Lua editors (Actions, Hotkeys, Global Lua) will now save their zoom factor. So if you Ctrl+MouseWheel or Ctrl+ / Ctrl- to zoom the font size bigger or smaller, S+ will remember the setting (only if you click Apply or OK)

Changes for v2.4.1 - v2.4.2

  • Added acDisplayBalloonTip() action to display a custom balloon tip near the S+ tray icon

Changes for v2.4.0 - v2.4.1

  • Fixed rounding issue in acGetVolume()

Changes for v2.3.9 - v2.4.0

  • Added ability to specify the spacebar as a stroke button. This is not visible in the interface (just like the Shift key, -3), you must edit StrokesPlus.xml and set the MouseButton node to -4 (-4)
  • There are many usablility issues with this feature, which is why it will not be a regularly supported option. For example, it's impossible to press and hold the spacebar for multiple spaces with the spacebar as the stroke button, this is because the alternative is to have a ton of spaces be sent if the gesture times out, which I feel is absolutely impractical. Also, certain key combinations will not work, such as Alt+Space as S+ considers Alt a modifier and thus assumes you're trying to fire an action which only has Alt defined. Of course, you could create that action and have it use acSendKeys to send the Alt+Space...but again, it's messy and will be hidden from the UI.
  • Using the spacebar also adds extra CPU time when it's set as the stroke button since Windows will spam the space key over and over to the keyboard hook as it's being held down and S+ discards it.
  • Added to Language.xml to support Space bar as a stroke button (only for the tray menu, and only visible when the spacebar is set as the stroke button, like the Shift button) language.Menu.Spacebar

Changes for v2.3.8 - v2.3.9

  • Fixed bug with closing settings window without a tree item selected

Changes for v2.3.4 - v2.3.8

  • - Added some basic registry actions:
  • acRegistryCreateKey
  • acRegistryDeleteKey (will not delete if subkeys exist)
  • acRegistryDeleteValue
  • acRegistryGetNumber
  • acRegistrySetNumber (stores as DWORD)
  • acRegistryGetString (supports REG_SZ and REG_EXPAND_SZ)
  • acRegistrySetString (supports REG_SZ and REG_EXPAND_SZ)

Changes for v2.3.3 - v2.3.4

  • Fixed bug with Control Class Pattern field not being recognized

Changes for v2.3.2 - v2.3.3

  • Hotkey tab fields now maintain proper disabled state when appropriate

Changes for v2.2.9 - v2.3.0

  • S+ now ensures the auto-hide mouse function is stopped and the cursor shown before exiting
  • Added acSendKeyDown(VKey) and acSendKeyUp(VKey)

Changes for v2.2.6 - v2.2.9

  • Minor update to tray icon recreate code when swapping between shells
  • Added additional logic when checking for top-level windows (ensure client window is not empty rect)
  • Added acHideMouseCursor(), acShowMouseCursor(), acAutoHideMouseCursor(hidetimer, rehidetimer)
  • acAutoHideMouseCursor(hidetimer, rehidetimer):
  • hidetimer: How long (in milliseconds) to wait without mouse movement before hiding the mouse cursor. Passing 0 (zero) disables auto-hiding.
  • rehidetimer: How often (in milliseconds) to rehide the mouse cursor if it should be hidden (in case another applications re-displays the cursor)
  • Note: I only have WinXP running in a VM where the mouse cursor is managed by VirtualBox, so I can't say for sure if it works on WinXP, but it should.

Changes for v2.2.5 - v2.2.6

  • Removed the syntax highlighting of loadstring and added load (in place of it; same functionality)
  • Made stability improvements to actions which return strings

Changes for v2.2.4 - v2.2.5

  • Added acGetMouseCursorType() to retrieve the name of the mouse cursor as: ARROW, IBEAM, WAIT, CROSS, UP, SIZENWSE, SIZENESW, SIZEWE, SIZENS, SIZEALL, NO, HAND, APPSTARTING, HELP, or Unknown

Changes for v2.2.3 - v2.2.4

  • Fixed issue with Aggressively Manage Memory that I created during some recent code cleanup, the option was being ignored and assumed off

Changes for v2.2.0 - v2.2.3

  • Changed acDisplayText so its dialog is created on its own thread. This allows the script to continue executing while the text is displayed. If you want to have a delay, add a call to acDelay after your call to acDisplayText for the script to pause for a certain amount of time.
  • Updated MSI installer to default to USer AppData folder, to avoid the file virtualization if not running as Administrator
  • Updated MSI installer to create a shortcut in the Startup folder

Changes for v2.1.8 - v2.2.0

  • Added some calls to hopefully ensure the acDisplayText window always stays on top, and changed a couple things regarding its instantiation
  • Made a couple quick fixes to address the positioning of the gesture dropdown, gesture preview, and stroke color preview for those who have a DPI <> 100%

Changes for v2.1.7 - v2.1.8

  • Added acSetKeyboardHook(0 or 1) [will remain undocumented] to turn the keyboard hook on (1) or off (0)..this is only for troubleshooting scripts so you can use the keyboard if S+ crashes to close the program
  • Created an additional Lua state (total 2) and prevent more than 2 actions from firing concurrently. This is a compromise to allow some level of multi-threading, but preventing S+ crashes when actions were tripping over each other. This was only noticable when firing two actions back-to-back which had calls to acDelay (for the most part) leaving the Lua state unstable if another action fired in the same state, which caused S+ to crash. Now, only two actions can fire simultaneously, each with their own state. However, since these are separate states, they won't share the same values assigned to variables. For example, if you define a global variable named MyGlobalVar in the Global Lua tab and set it to 123, it will be 123 for each state initially, but if you fire an action which sets MyGlobalVar to 321 within a script that is still running while you execute another action which sets MyGlobalVar to 456, in Lua state 1, MyGlobalVar will be 321, but in Lua state 2 it will be 456. Lua state 1 is always the primary state used for actions, state 2 is only used if state 1 is currently executing a script. For the most part, no one will likely be affected by this change, and those who are will likely understand this contention and the necessity for it. Again, it's a compromise to keep some level of functionality prior to this change, even though it led to crashes.
  • If a gesture is completed and state 1 and state 2 are both executing, the gesture will be discarded; if you have Play Sound For No Match checked and a WAV file selected, it will be played when this condition occurs to let you know it was ignored.

Changes for v2.1.6 - v2.1.7

  • Removed duplicate gsx declaration in gestureComplete function (internal)
  • Added code to change any pure white color passed into acDisplayText to 254,255,255 since pure white is the transparency color key
  • Added a new parameter to the end of acActivateWindow named method. This allows you to try different methods of activating a window since Microsoft has made it very difficult.
  • Passing 0 uses the default SetForegroundWindow call
  • Passing 1 uses a method which calls AttachThreadInput to temporarily bind S+ to the target window
  • Passing 2 presses the Alt key temporarily during the SetForegroundWindow call (a known hack/workaround)

Changes for v2.1.4 - v2.1.6

  • 2.1.6
  • Includes changes from 2.1.51 - 2.1.54.
  • Help files updated
  • 2.1.54 (Test)
  • Updated setLastActive (internal function) to also not consider the acDisplayText nor Settings windows a valid top-level window for which to set focus
  • Mirrored 2.1.53's code change in the keyboard hook as well
  • Put the gwd variable back in..must've accidentally removed it in 2.1.51 (best guess)
  • Added dwExtraInfo to acMouseMove and acMouseClick for S+ to distinguish its own mouse event injections from others
  • 2.1.53 (Test)
  • Updated code so acConsumePhysicalInput consumes all input, regardless of whether the stroke button is still held or not.
  • 2.1.52 (Test)
  • Added acConsumePhysicalInput(bool) action. acConsumePhysicalInput(1) tells S+ to consume ALL physical input (mouse and keyboard). This may be useful if you're about to call a mouse or keyboard action where you don't want any physical input to interfere with the action. But make sure you call again, passing 0 [acConsumePhysicalInput(0)], within the SAME Lua script to enable input or your computer may become unusable!
  • 2.1.51 (Test)
  • Added bounding coordinates to the exposed variables:
  • gbl = bounding left coordinate (left-most X of the drawn gesture)
  • gbt = bounding top coordinate (top-most Y of the drawn gesture)
  • gbr = bounding right coordinate (right-most X of the drawn gesture)
  • gbb = bounding bottom coordinate (bottom-most Y of the drawn gesture)
  • Mouse Hook now uses CursorInfo coordinates instead of those from MSLLHOOKSTRUCT

Changes for v2.1.1 - v2.1.4

  • Fixed the acDisplayText window from creating a taskbar button in Windows 8

Changes for v2.1.0 - v2.1.1

  • Moved reset cancel delay check to inside the minimum segment length block. Basically, this means that the cancel delay will only be reset if the mouse has been moved more than the pixels defined for the minimum segment length (or if any modifer has been pressed, those always reset the cancel timer, if you have the option checked), instead of even a single pixel movement resetting the cancel timer. I can't think of a reason why this would be an issue, in fact it seems to make sense given the minimum segment length setting exists. Specifically, this addresses the issue of using a pen on a tablet where keeping the pen absolutely still is virtually impossible, leading to having no viable method to use S+ without significant compromise of general Windows usability while also being able to use S+. Unless you're specifically resetting the cancel timer by moving the mouse only a few pixels, this shouldn't affect anyone, or even be noticed (unless you defined a very large minimum segment length value, which doesn't seem practical). If this causes any issues, I'll break this functionality out into a new preference, but since this logic is in the mouse hook, I'd prefer to keep the checks to an absolute minimum for performance reasons; another preference means another CPU cycle for each mouse move. In fact, this change improves performance as the timer isn't killed and restarted every single mouse move, only when the mouse has been moved the minimum segment length. As I said, I believe this will be a completely transparent change, but make S+ far more usable for pen/tablet users.
  • acDisplayText now supports multiple lines of text (using \n for new line)
  • The Settings window now runs on its own thread, eliminating the resize lag and scrollbar drag issues (and just makes sense). Also changed the Settings window so it doesn't redraw itself on each pixel while resizing, to further improve responsiveness when resizing on lower end systems.
  • Moved the clear vars call in gestureComplete from before lua_load to just inside the block, in hopes to maybe fix Andreasvb's issue (fingers crossed, but I don't think it actually will!)
  • Added some checks to help prevent a crash if you have a long running action executing while trying to reload the Lua state (like clicking Apply or OK in the Settings window or Reload from tray menu. It's not air tight as you could have multiple long running actions set in motion and due to the nature of allowing actions running in parallel, they still could trip over each other, but I imagine that would be a very rare scenario; this fixes the most likely (albeit still rare) scenario

Changes for v2.0.19 - v2.1.0

  • Updated to Lua 5.2.1
  • Updated to Boost C++ libraries 1.50.0
  • Added additional licenses that were missing
  • Updated StrokesPlus.xml in the MSI packages to the cleaned versions
  • Fixed the missing Help page header image in the MSI install
  • Fixed the missing Action Report and Global Lua missing images in the MSI install
  • Ok, NOW that I've cleaned things up and done all the little maintenance stuff, I'm taking a development break for real this time

Changes for v2.0.18 Beta - v2.0.19

  • Upgraded 2.0.18 to release status
  • Fixed Allow After Action Script setting issue. If you change the setting and click Apply, the new setting is now recognized without having to click OK first.
  • For those of you who maintain a language file, note that the text for the Allow After Action Script* preference should no longer include mention about script errors

Changes for v1.9.8 - v2.0.0

  • Beta 1.9.903 upgraded to release status 2.0.0
  • Changed the way S+ determines the last active window prior to opening a S+ window, now it just starts at the gesture draw window's handle and works backward until a top-level. This hopes to prevent the S+ draw window from ever having focus, which can cause odd behavior.
  • Added check box in Ignored window that instructs S+ to disable itself completely (unhook mouse/keyboard) if the application becomes the active window at any point in time. Once disabled via this method, you must manually reenable S+ via single left-clicking the tray icon, right-clicking the tray icon and unchecking Disable StrokesPlus, or via the hotkey SHIFT+CTRL+WIN+Z. The main purpose of this feature is because I play EverQuest II and I want S+ completely out of the way when I'm playing, simply ignoring the window means S+ still checks all ignored windows every time I press the right mouse, which I do all the time in-game and I don't want the extra processing to occur..but sometimes I forget to disable S+ before I go in the game; this feature resolves that! Note that there's no reasonably deterministic method to reenable S+ after being disabled via this method. Meaning, S+ could disable itself by detecting the game gained focus, but what if I already disabled S+ before opening the game, how would S+ know to when to reenable? Basically, this is just a difficult task of state management that isn't worth the time for this rarely used feature.
  • Added language.Ignored. to Language.xml to support new checkbox in Ignored window.

Changes for v1.9.6 - v1.9.8

  • Added option Allow After Action Script* (may cause script errors) (default off) to enable the sp_after_action functionality removed in 1.9.7; enabling this setting causes script errors for some users for reasons yet unknown.
  • Language.xml template updated to support new preference

Changes for v1.9.51 - v1.9.6

  • Added sp_app_name (or gapp) and sp_action_name (or gact) as variables available to all scripts
  • Note - This change also updates the sp_before_action and sp_after_action function templates added in 1.9.5 as follows:
  • sp_before_action(gnm,gsx,gsy,gex,gey,gwd,gapp,gact)
  • sp_after_action(gnm,gsx,gsy,gex,gey,gwd,gapp,gact)

Changes for v1.9.3 - v1.9.4

  • Fixed a HUGE issue with App Pattern Recognition; the code was setting the regex expression to const variables...which would cause the first expression to be permanent in memory until S+ was restarted. To be fair, this was some of the earliest code written while I was really unfamiliar with C++, I only spot-checked the code which worked long as there were no other pattern matches for the same app qualifier!

Changes for v1.9.1 - v1.9.2

  • Updated yet some MORE code paths which led to incorrect tray icon states
  • When in Training Mode, S+ no longer checks for ignored windows as it's irrelevant in that state

Changes for v1.9.0 - v1.9.1

  • Added tray icon to indicate when in Training Mode (blue dot turns red)
  • Middle-clicking tray icon while S+ is disabled will no longer toggle Training Mode state
  • Cleaned up some other code paths which led to incorrect icon state
  • Tray icon caption now indicates training mode
  • Language.xml updated to include under for the tray icon text when in Training Mode
  • Added ability to specify a custom location for StrokesPlus.xml (main config file); StrokesPlus.lua and Language.xml are derived from the command-line parameter so the config must be name be "StrokesPlus.xml". See for more details

Changes for v1.8.9 - v1.9.0

  • Left single-click on S+ tray icon to toggle disabled mode (was double-click)
  • Left double-click on S+ tray icon now opens the Actions window.
  • Middle single-click on S+ tray icon now toggles Training Mode
  • Middle double-click on S+ tray icon now opens Preferences window

Changes for v1.8.8 - v1.8.9

  • Corrected key modifier capture logic which prevented some modifier keys from being recognized if pressed together after the stroke button was pressed
  • Added a try/catch around the DPI check and assign code; may address an issue one person was having that I cannot reproduce

<<Back to software description