forum

AbsoluteTouch - play osu! on your laptop touchpad

posted
Total Posts
39
Topic Starter
crossbowffs
You didn't ask for it, you got it anyways!

Remember https://osu.ppy.sh/forum/t/515? This is (kind of) the same thing, but now it actually works (hopefully)! Written from scratch (first in C#, then in C++ once the lag proved it unusable).

This program turns your touchpad into a "tablet" - basically, touches are mapped to an absolute position on your screen (e.g. if you touch the top left corner of your touchpad, your cursor will jump to the top left corner of your screen).

Prerequisites:
  1. Synaptics touchpad (other touchpads are not supported, sorry!)
  2. Synaptics COM libraries (if you installed the touchpad drivers, you likely have these)
  3. Visual C++ 2015 runtime (x86 version) (https://www.microsoft.com/en-us/download/details.aspx?id=48145)
Caveats:
  1. The emulation is done completely in user-mode, meaning that it will not work in raw-input mode, so disable that, obviously ;-)
  2. If you are not playing in fullscreen on your native resolution, you will have to specify some options (see below)
  3. You cannot actually click with your touchpad while the program is enabled, so you will have to use the keyboard.
Program arguments (create a shortcut or run it in command prompt/PowerShell):
  1. -t <x1,y1,x2,y2>: sets the mapped touchpad region. (x1,y1) is the top-left corner, (x2,y2) is the bottom-right corner.
  2. -s <x1,y1,x2,y2>: sets the mapped screen region. See above.
  3. -m: enables the touchpad on start, disables it on exit (for people like me who normally have their touchpad disabled).
  4. -w <weight>: sets the touch smoothing factor (0~1). Lower = less input lag, higher = less cursor vibration.
  5. -d: enables debug mode (useful for determining your touchpad coordinates).
Download link: https://mega.nz/#!1FhwSSLC!BoAEcD9hU6X2PgF6jLmvQFZktUY5gs2AvHKLCWZ9iWM
SHA-1 checksum: 8189437c8c0452d8b88b56835f3c0c8c2c837d49

I realize that some might be wary of downloading binaries from some random guy on the internet, so if that's the case you can compile it yourself (fully open-source!): https://github.com/apsun/AbsoluteTouch

Have fun! :-)

Changelog:

1.2: Added touch smoothing
1.1: Added ability to customize the mapped screen and touchpad regions
1.0.1: Fixed some potential crashes
1.0: Initial release
Sidetail
Cool project you got there!

Too bad my laptop uses ELAN touchpad instead of Synaptics version touchpads
due to this problem my fingerprint is unharmed

Hopefully you'll release an update for more support for additional touchpads!
Topic Starter
crossbowffs

BetaStar wrote:

Cool project you got there!

Too bad my laptop uses ELAN touchpad instead of Synaptics version touchpads
due to this problem my fingerprint is unharmed

Hopefully you'll release an update for more support for additional touchpads!
The program uses the Synaptics SDK to read the touch data directly, so unless there's an similar API for your model, I'm afraid that's not possible (without writing a custom driver, but that's far beyond my capabilities :-p)
abraker
>.> which version?

Topic Starter
crossbowffs

abraker wrote:

>.> which version?

Whoops, forgot to mention that. You'll need to install the Visual C++ 2015 runtime: https://www.microsoft.com/en-us/download/details.aspx?id=48145

Double edit: you need the 32-bit (x86) version, even if you are running on 64-bit Windows.
abraker
Currently it clips to the top left of the touchpad, is it possible to make it so the offset can be changed with the -x and -y arguments? For example, 0.5 would set it to the middle of the touchpad

Also the cursor shakes a lot if you keep it in one spot. I am guess rounding errors? If not, consider implementing cursor stabilization.
Topic Starter
crossbowffs

abraker wrote:

Currently it clips to the top left of the touchpad, is it possible to make it so the offset can be changed with the -x and -y arguments? For example, 0.5 would set it to the middle of the touchpad

Also the cursor shakes a lot if you keep it in one spot. I am guess rounding errors? If not, consider implementing cursor stabilization.
That's weird, the code should be detecting the dimensions of your touchpad automatically. I'm not too sure on what you mean by clipping to the top left, did you try using the -width and -height parameters? (If you don't explicitly provide them, they are calculated from your screen resolution when you start AbsoluteTouch)

As for the shaking, I believe it's due to the high resolution of the touchpad (for example, mine has a resolution of about 6000x3000 "units"), though it shouldn't be more than a few pixels, unless you have some kind of ultra-HD screen. The problem with "stabilization" algorithms is that they would cause input lag, which IMO is not worth the trade-off if you're using it in osu!
abraker

crossbowffs wrote:

That's weird, the code should be detecting the dimensions of your touchpad automatically. I'm not too sure on what you mean by clipping to the top left, did you try using the -width and -height parameters? (If you don't explicitly provide them, they are calculated from your screen resolution when you start AbsoluteTouch)
I mean I don't want to reach all the way to the top of my touchpad. Instead want to play on the bottom right corner. Allowing to move the mapped area anywhere on the touchpad.

crossbowffs wrote:

As for the shaking, I believe it's due to the high resolution of the touchpad (for example, mine has a resolution of about 6000x3000 "units"), though it shouldn't be more than a few pixels, unless you have some kind of ultra-HD screen. The problem with "stabilization" algorithms is that they would cause input lag, which IMO is not worth the trade-off if you're using it in osu!
Is it possible to allow it use a lower resolution by skipping every 2 units or so (not making it smaller, just skip units it reads)?
Topic Starter
crossbowffs

abraker wrote:

I mean I don't want to reach all the way to the top of my touchpad. Instead want to play on the bottom right corner. Allowing to move the mapped area anywhere on the touchpad.
Sure, I planned to add a calibration feature where you could draw a rectangle around the touchpad region you want to play on and it would map that to your screen. I have midterms this week though, so maybe sometime in the future :-)

abraker wrote:

Is it possible to allow it use a lower resolution by skipping every 2 units or so (not making it smaller, just skip units it reads)?
I'll have to find out what's causing the shaking first. If your display resolution is really high, an alternative solution would be to lower your screen resolution.
abraker

crossbowffs wrote:

I'll have to find out what's causing the shaking first. If your display resolution is really high, an alternative solution would be to lower your screen resolution.
I'm below 1080p
Igoorx
I never thought this was possible, it is very cool :v
Thanks for showing me this and by rewritten it in C++
NicoHolic777
THIS IS AWESOME! Now I'm able to play osu! in higher difficulties! Thanks a lot!
Topic Starter
crossbowffs
I've updated the program to allow customization of the touchpad area! Just pass the coordinates as a parameter, for example:

AbsoluteTouch-1.1.exe -t 2480,1855,4576,3583
You can determine the coordinates for your touchpad by running the program in debug mode:

AbsoluteTouch-1.1.exe -d
Note that in my example, (2480, 1855) is the top-left corner of the mapped touchpad region, and (4576, 3583) is the bottom-right corner. (0, 0) is at the top-left of your touchpad.



Igoorx wrote:

I never thought this was possible, it is very cool :v
Thanks for showing me this and by rewritten it in C++

Tatsuya Kaname wrote:

THIS IS AWESOME! Now I'm able to play osu! in higher difficulties! Thanks a lot!
Thanks, though I still suck even while using this app ;-p
abraker
Mapping a smaller area of the touchpad to my screen really makes it impossible to be precise. I suggest to implement an option to set how much averaging the program would do. I did some research and an exponential averaging technique looks best for this. I played around with the code and a weight between 0.3 and 0.4 is a decent range such that the latency and cursor instability are at equal trade-off.

const double weight = 0.4;
coordsAvg.x = weight * (double)coords.x + (1.0 - weight) * (double)coordsAvg.x;
coordsAvg.y = weight * (double)coords.y + (1.0 - weight) * (double)coordsAvg.y;
Topic Starter
crossbowffs

abraker wrote:

Mapping a smaller area of the touchpad to my screen really makes it impossible to be precise. I suggest to implement an option to set how much averaging the program would do. I did some research and an exponential averaging technique looks best for this. I played around with the code and a weight between 0.3 and 0.4 is a decent range such that the latency and cursor instability are at equal trade-off.

const double weight = 0.4;
coordsAvg.x = weight * (double)coords.x + (1.0 - weight) * (double)coordsAvg.x;
coordsAvg.y = weight * (double)coords.y + (1.0 - weight) * (double)coordsAvg.y;
That looks pretty straightforward, I'll get around to it soon. Thanks :-)

Edit: Done! I inverted the weight scale though, 0 = no smoothing, 1 = cursor literally unmovable.
abraker
For some reason I can't get it to work in osu! anymore. Made sure raw input is off and tried stable to make sure it's not of an update or something.
Topic Starter
crossbowffs

abraker wrote:

For some reason I can't get it to work in osu! anymore. Made sure raw input is off and tried stable to make sure it's not of an update or something.
There's nothing specific to osu! in the program, so if it only stops working in-game... I honestly have no idea. Can you post your args and a screenshot of the AbsoluteTouch window after initialization?
abraker
Hmmm... previous versions of the program don't work in osu! anymore either. I am not sure what I'm doing wrong. Can anyone else confirm the issue?


Tohru Kobayashi
Damn this looks cool. To bad I have ELAN ;-;
charizard
Touchpad is better without this :/
show more
Please sign in to reply.

New reply