[rmkit][input] copy old mt slots from previous event - #77

Merged
raisjn merged 9 commits into
masterfrom
fix_mt_slots
Feb 6, 2021
Merged

[rmkit][input] copy old mt slots from previous event#77
raisjn merged 9 commits into
masterfrom
fix_mt_slots

Conversation

@raisjn

@raisjnraisjn commented Feb 3, 2021

Copy link
Copy Markdown
Member
  • remove wonky backwards event coalescing, instead start with prev_ev for all events
  • remove MouseEvent, its not applicable since we started using resim
  • set lifted on TouchEvent when a finger is lifted (TRACKING_ID set to -1)
  • add count_fingers() to TouchEvent and use TouchEvent.fingers in gestures.cpy for figuring out how many fingers pressed

@raisjnraisjn changed the title [rmkit] copy old mt slots from previous event[rmkit][input] copy old mt slots from previous eventFeb 3, 2021
@raisjnraisjn mentioned this pull request Feb 3, 2021
12 tasks

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like this should work -- I haven't tried it out myself, but I'll give it a shot in a little bit on puzzles and let you know if something is obviously wrong.

Comment on lines -37 to +38
def marshal(T ev):
// marshal can update the event
def marshal(T &ev):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not seeing where marshal updates an event. Is this left over from a previous version, or am I missing something (likely since I don't know this code very well)?

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

ok, I did a little testing of my own, just in a mouse.down event.

  • fingers was always 0, even when the last slot was > 0
  • so is_multitouch was always false, since that's calculated from fingers
  • if I ran through slots myself and checked for slots with left > -1, I usually got the right number of fingers
  • ... but not always. sometimes I ended up with not as many fingers registered as were actually on the screen. I'd guess it just depends on how many fingers were in the event when the first EV_SYN was received, even if the next EV_SYN picked up more fingers, so I'm not sure what to do about that.
  • the worst part of all this is that if I took the stylus and put my hand on the screen as if to write, my hand only registered as 1 slot, so I'm not sure how to reject touch in that case :(

code I tested with:

 target->mouse.down += [=](auto &ev) {
auto touch_ev = dynamic_cast<input::TouchEvent*>(ev.original.get());
if (touch_ev) {
int f = 0;
for (auto s : touch_ev->slots)
if (s.left > -1)
f++;
std::cerr << "touch event with "
<< touch_ev->fingers << " fingers"
<< "; " << touch_ev->slot << " slots"
<< "; " << f << " slots with left > -1"
<< std::endl;
if (touch_ev->is_multitouch) {
std::cerr << "skipping multitouch" << std::endl;
return;
}
}
};

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

Ah, ok I found https://www.kernel.org/doc/html/v4.18/input/multi-touch-protocol.html (you might already be aware of similar documentation, this is all new to me) which describes what all those ABS_MT_* fields mean. I see we aren't capturing ABS_MT_TOUCH_MAJOR or ABS_MT_TOUCH_MINOR, but those describe the size of the touch on the screen. For me a finger shows up as around major=17;minor=8. The edge of my hand has a lot of different sizes, but it seems like it's always at least major >= 26 OR minor >= 17, so maybe that's a reasonable threshold.

@raisjn

Copy link
Copy Markdown
MemberAuthor

i did know about those docs and have read about the axis minor/major, but didn't think about how to use them for palm detection, nice!

it seems like this diff is not behaving like i thought it would - but at least you have ideas for how to fix palm touch :-D

i think that holding prev_ev and using it as the base makes a lot of sense, so i'd like to achieve that

@raisjn
raisjn marked this pull request as draft February 4, 2021 00:41
@raisjn

Copy link
Copy Markdown
MemberAuthor

ok, i think this works for coalescing the previous event (tested remux, harmony, mines, simple, genie) with touch and stylus. the major piece is in d96ebde.

genie gestures work and now use count_fingers() for filtering instead of the slot.

in addition to those docs, i also used https://elixir.bootlin.com/linux/latest/source/include/linux/input.h.

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 01:46
@raisjn
raisjn marked this pull request as draft February 4, 2021 02:18
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

have to do some more testing and debugging

was running into strangeness with remux due to remux touch flood, now fixed

i'll likely keep testing this and merge it on the weekend, but preliminary tests seem to show its working at least as well as previously

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 02:38

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works great on my end! The only thing that still seems off is the initial finger count (calling count_fingers() does always end up with the right number).

Comment threadsrc/rmkit/input/input.cpy Outdated
Comment on lines +65 to +66
prev_ev = event
event = prev_ev

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the event = prev_ev part is redundant? Also should this have a call to event.finalize() somewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

event.finalize() is called on EV_SYN

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh you're totally right, it's like 5 lines above this 🤦

Comment threadsrc/rmkit/input/events.cpy Outdated
self.x = t.x
self.y = t.y
self.left = t.left
self.lifted = t.lifted

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still seeing fingers=0 in a SynMotionEvent handler when going through dynamic_cast<TouchEvent*>(ev.original().get())->fingers. I think it's b/c that isn't copied here. Does this need an explicit copy constructor, or would the default work?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i removed explicit constructor, hopefully things improve, but it might be that count_fingers() is always useful to call before checking fingers (and we put that in to main_loop?).

Comment on lines -131 to +142
break
if self.left == 0:
self.lifted = true

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we see tracking_id -1 would we want to reset the slot to its initial -1, -1, -1 values? I assume tracking_id=-1 should mean that any existing x,y coords are invalid.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the tracking ID is set to -1, next time the slot is used it will get an X and Y coordinate, i believe.

one potential problem with setting to -1 at this point is that this event is still used (i believe) during mainloop's event dispatch.

* remove copy constructor
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

thanks for the help with this - it definitely is better code now. i just glanced at docs again and grepped "palm" and saw MT_TOOL_PALM. i'm curious if we will get this tool type or not. (accidentally put comment in wrong PR a moment ago)

UPDATE: nope, i think evtest says MT_TOOL_PALM is not supported (max of ABS_MT_TOOL_TYPE is 1, should be >= 2 when PALM is supported)

@raisjn
raisjn merged commit bcbf75a into masterFeb 6, 2021
@raisjn
raisjn deleted the fix_mt_slots branch February 7, 2021 13:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@raisjn@mrichards42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[rmkit][input] copy old mt slots from previous event - #77

Merged
raisjn merged 9 commits into
masterfrom
fix_mt_slots
Feb 6, 2021
Merged

[rmkit][input] copy old mt slots from previous event#77
raisjn merged 9 commits into
masterfrom
fix_mt_slots

Conversation

@raisjn

@raisjnraisjn commented Feb 3, 2021

Copy link
Copy Markdown
Member
  • remove wonky backwards event coalescing, instead start with prev_ev for all events
  • remove MouseEvent, its not applicable since we started using resim
  • set lifted on TouchEvent when a finger is lifted (TRACKING_ID set to -1)
  • add count_fingers() to TouchEvent and use TouchEvent.fingers in gestures.cpy for figuring out how many fingers pressed

@raisjnraisjn changed the title [rmkit] copy old mt slots from previous event[rmkit][input] copy old mt slots from previous eventFeb 3, 2021
@raisjnraisjn mentioned this pull request Feb 3, 2021
12 tasks

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like this should work -- I haven't tried it out myself, but I'll give it a shot in a little bit on puzzles and let you know if something is obviously wrong.

Comment on lines -37 to +38
def marshal(T ev):
// marshal can update the event
def marshal(T &ev):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not seeing where marshal updates an event. Is this left over from a previous version, or am I missing something (likely since I don't know this code very well)?

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

ok, I did a little testing of my own, just in a mouse.down event.

  • fingers was always 0, even when the last slot was > 0
  • so is_multitouch was always false, since that's calculated from fingers
  • if I ran through slots myself and checked for slots with left > -1, I usually got the right number of fingers
  • ... but not always. sometimes I ended up with not as many fingers registered as were actually on the screen. I'd guess it just depends on how many fingers were in the event when the first EV_SYN was received, even if the next EV_SYN picked up more fingers, so I'm not sure what to do about that.
  • the worst part of all this is that if I took the stylus and put my hand on the screen as if to write, my hand only registered as 1 slot, so I'm not sure how to reject touch in that case :(

code I tested with:

 target->mouse.down += [=](auto &ev) {
auto touch_ev = dynamic_cast<input::TouchEvent*>(ev.original.get());
if (touch_ev) {
int f = 0;
for (auto s : touch_ev->slots)
if (s.left > -1)
f++;
std::cerr << "touch event with "
<< touch_ev->fingers << " fingers"
<< "; " << touch_ev->slot << " slots"
<< "; " << f << " slots with left > -1"
<< std::endl;
if (touch_ev->is_multitouch) {
std::cerr << "skipping multitouch" << std::endl;
return;
}
}
};

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

Ah, ok I found https://www.kernel.org/doc/html/v4.18/input/multi-touch-protocol.html (you might already be aware of similar documentation, this is all new to me) which describes what all those ABS_MT_* fields mean. I see we aren't capturing ABS_MT_TOUCH_MAJOR or ABS_MT_TOUCH_MINOR, but those describe the size of the touch on the screen. For me a finger shows up as around major=17;minor=8. The edge of my hand has a lot of different sizes, but it seems like it's always at least major >= 26 OR minor >= 17, so maybe that's a reasonable threshold.

@raisjn

Copy link
Copy Markdown
MemberAuthor

i did know about those docs and have read about the axis minor/major, but didn't think about how to use them for palm detection, nice!

it seems like this diff is not behaving like i thought it would - but at least you have ideas for how to fix palm touch :-D

i think that holding prev_ev and using it as the base makes a lot of sense, so i'd like to achieve that

@raisjn
raisjn marked this pull request as draft February 4, 2021 00:41
@raisjn

Copy link
Copy Markdown
MemberAuthor

ok, i think this works for coalescing the previous event (tested remux, harmony, mines, simple, genie) with touch and stylus. the major piece is in d96ebde.

genie gestures work and now use count_fingers() for filtering instead of the slot.

in addition to those docs, i also used https://elixir.bootlin.com/linux/latest/source/include/linux/input.h.

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 01:46
@raisjn
raisjn marked this pull request as draft February 4, 2021 02:18
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

have to do some more testing and debugging

was running into strangeness with remux due to remux touch flood, now fixed

i'll likely keep testing this and merge it on the weekend, but preliminary tests seem to show its working at least as well as previously

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 02:38

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works great on my end! The only thing that still seems off is the initial finger count (calling count_fingers() does always end up with the right number).

Comment threadsrc/rmkit/input/input.cpy Outdated
Comment on lines +65 to +66
prev_ev = event
event = prev_ev

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the event = prev_ev part is redundant? Also should this have a call to event.finalize() somewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

event.finalize() is called on EV_SYN

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh you're totally right, it's like 5 lines above this 🤦

Comment threadsrc/rmkit/input/events.cpy Outdated
self.x = t.x
self.y = t.y
self.left = t.left
self.lifted = t.lifted

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still seeing fingers=0 in a SynMotionEvent handler when going through dynamic_cast<TouchEvent*>(ev.original().get())->fingers. I think it's b/c that isn't copied here. Does this need an explicit copy constructor, or would the default work?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i removed explicit constructor, hopefully things improve, but it might be that count_fingers() is always useful to call before checking fingers (and we put that in to main_loop?).

Comment on lines -131 to +142
break
if self.left == 0:
self.lifted = true

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we see tracking_id -1 would we want to reset the slot to its initial -1, -1, -1 values? I assume tracking_id=-1 should mean that any existing x,y coords are invalid.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the tracking ID is set to -1, next time the slot is used it will get an X and Y coordinate, i believe.

one potential problem with setting to -1 at this point is that this event is still used (i believe) during mainloop's event dispatch.

* remove copy constructor
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

thanks for the help with this - it definitely is better code now. i just glanced at docs again and grepped "palm" and saw MT_TOOL_PALM. i'm curious if we will get this tool type or not. (accidentally put comment in wrong PR a moment ago)

UPDATE: nope, i think evtest says MT_TOOL_PALM is not supported (max of ABS_MT_TOOL_TYPE is 1, should be >= 2 when PALM is supported)

@raisjn
raisjn merged commit bcbf75a into masterFeb 6, 2021
@raisjn
raisjn deleted the fix_mt_slots branch February 7, 2021 13:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@raisjn@mrichards42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[rmkit][input] copy old mt slots from previous event - #77

Merged
raisjn merged 9 commits into
masterfrom
fix_mt_slots
Feb 6, 2021
Merged

[rmkit][input] copy old mt slots from previous event#77
raisjn merged 9 commits into
masterfrom
fix_mt_slots

Conversation

@raisjn

@raisjnraisjn commented Feb 3, 2021

Copy link
Copy Markdown
Member
  • remove wonky backwards event coalescing, instead start with prev_ev for all events
  • remove MouseEvent, its not applicable since we started using resim
  • set lifted on TouchEvent when a finger is lifted (TRACKING_ID set to -1)
  • add count_fingers() to TouchEvent and use TouchEvent.fingers in gestures.cpy for figuring out how many fingers pressed

@raisjnraisjn changed the title [rmkit] copy old mt slots from previous event[rmkit][input] copy old mt slots from previous eventFeb 3, 2021
@raisjnraisjn mentioned this pull request Feb 3, 2021
12 tasks

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like this should work -- I haven't tried it out myself, but I'll give it a shot in a little bit on puzzles and let you know if something is obviously wrong.

Comment on lines -37 to +38
def marshal(T ev):
// marshal can update the event
def marshal(T &ev):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not seeing where marshal updates an event. Is this left over from a previous version, or am I missing something (likely since I don't know this code very well)?

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

ok, I did a little testing of my own, just in a mouse.down event.

  • fingers was always 0, even when the last slot was > 0
  • so is_multitouch was always false, since that's calculated from fingers
  • if I ran through slots myself and checked for slots with left > -1, I usually got the right number of fingers
  • ... but not always. sometimes I ended up with not as many fingers registered as were actually on the screen. I'd guess it just depends on how many fingers were in the event when the first EV_SYN was received, even if the next EV_SYN picked up more fingers, so I'm not sure what to do about that.
  • the worst part of all this is that if I took the stylus and put my hand on the screen as if to write, my hand only registered as 1 slot, so I'm not sure how to reject touch in that case :(

code I tested with:

 target->mouse.down += [=](auto &ev) {
auto touch_ev = dynamic_cast<input::TouchEvent*>(ev.original.get());
if (touch_ev) {
int f = 0;
for (auto s : touch_ev->slots)
if (s.left > -1)
f++;
std::cerr << "touch event with "
<< touch_ev->fingers << " fingers"
<< "; " << touch_ev->slot << " slots"
<< "; " << f << " slots with left > -1"
<< std::endl;
if (touch_ev->is_multitouch) {
std::cerr << "skipping multitouch" << std::endl;
return;
}
}
};

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

Ah, ok I found https://www.kernel.org/doc/html/v4.18/input/multi-touch-protocol.html (you might already be aware of similar documentation, this is all new to me) which describes what all those ABS_MT_* fields mean. I see we aren't capturing ABS_MT_TOUCH_MAJOR or ABS_MT_TOUCH_MINOR, but those describe the size of the touch on the screen. For me a finger shows up as around major=17;minor=8. The edge of my hand has a lot of different sizes, but it seems like it's always at least major >= 26 OR minor >= 17, so maybe that's a reasonable threshold.

@raisjn

Copy link
Copy Markdown
MemberAuthor

i did know about those docs and have read about the axis minor/major, but didn't think about how to use them for palm detection, nice!

it seems like this diff is not behaving like i thought it would - but at least you have ideas for how to fix palm touch :-D

i think that holding prev_ev and using it as the base makes a lot of sense, so i'd like to achieve that

@raisjn
raisjn marked this pull request as draft February 4, 2021 00:41
@raisjn

Copy link
Copy Markdown
MemberAuthor

ok, i think this works for coalescing the previous event (tested remux, harmony, mines, simple, genie) with touch and stylus. the major piece is in d96ebde.

genie gestures work and now use count_fingers() for filtering instead of the slot.

in addition to those docs, i also used https://elixir.bootlin.com/linux/latest/source/include/linux/input.h.

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 01:46
@raisjn
raisjn marked this pull request as draft February 4, 2021 02:18
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

have to do some more testing and debugging

was running into strangeness with remux due to remux touch flood, now fixed

i'll likely keep testing this and merge it on the weekend, but preliminary tests seem to show its working at least as well as previously

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 02:38

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works great on my end! The only thing that still seems off is the initial finger count (calling count_fingers() does always end up with the right number).

Comment threadsrc/rmkit/input/input.cpy Outdated
Comment on lines +65 to +66
prev_ev = event
event = prev_ev

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the event = prev_ev part is redundant? Also should this have a call to event.finalize() somewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

event.finalize() is called on EV_SYN

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh you're totally right, it's like 5 lines above this 🤦

Comment threadsrc/rmkit/input/events.cpy Outdated
self.x = t.x
self.y = t.y
self.left = t.left
self.lifted = t.lifted

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still seeing fingers=0 in a SynMotionEvent handler when going through dynamic_cast<TouchEvent*>(ev.original().get())->fingers. I think it's b/c that isn't copied here. Does this need an explicit copy constructor, or would the default work?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i removed explicit constructor, hopefully things improve, but it might be that count_fingers() is always useful to call before checking fingers (and we put that in to main_loop?).

Comment on lines -131 to +142
break
if self.left == 0:
self.lifted = true

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we see tracking_id -1 would we want to reset the slot to its initial -1, -1, -1 values? I assume tracking_id=-1 should mean that any existing x,y coords are invalid.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the tracking ID is set to -1, next time the slot is used it will get an X and Y coordinate, i believe.

one potential problem with setting to -1 at this point is that this event is still used (i believe) during mainloop's event dispatch.

* remove copy constructor
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

thanks for the help with this - it definitely is better code now. i just glanced at docs again and grepped "palm" and saw MT_TOOL_PALM. i'm curious if we will get this tool type or not. (accidentally put comment in wrong PR a moment ago)

UPDATE: nope, i think evtest says MT_TOOL_PALM is not supported (max of ABS_MT_TOOL_TYPE is 1, should be >= 2 when PALM is supported)

@raisjn
raisjn merged commit bcbf75a into masterFeb 6, 2021
@raisjn
raisjn deleted the fix_mt_slots branch February 7, 2021 13:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@raisjn@mrichards42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[rmkit][input] copy old mt slots from previous event - #77

Merged
raisjn merged 9 commits into
masterfrom
fix_mt_slots
Feb 6, 2021
Merged

[rmkit][input] copy old mt slots from previous event#77
raisjn merged 9 commits into
masterfrom
fix_mt_slots

Conversation

@raisjn

@raisjnraisjn commented Feb 3, 2021

Copy link
Copy Markdown
Member
  • remove wonky backwards event coalescing, instead start with prev_ev for all events
  • remove MouseEvent, its not applicable since we started using resim
  • set lifted on TouchEvent when a finger is lifted (TRACKING_ID set to -1)
  • add count_fingers() to TouchEvent and use TouchEvent.fingers in gestures.cpy for figuring out how many fingers pressed

@raisjnraisjn changed the title [rmkit] copy old mt slots from previous event[rmkit][input] copy old mt slots from previous eventFeb 3, 2021
@raisjnraisjn mentioned this pull request Feb 3, 2021
12 tasks

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like this should work -- I haven't tried it out myself, but I'll give it a shot in a little bit on puzzles and let you know if something is obviously wrong.

Comment on lines -37 to +38
def marshal(T ev):
// marshal can update the event
def marshal(T &ev):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not seeing where marshal updates an event. Is this left over from a previous version, or am I missing something (likely since I don't know this code very well)?

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

ok, I did a little testing of my own, just in a mouse.down event.

  • fingers was always 0, even when the last slot was > 0
  • so is_multitouch was always false, since that's calculated from fingers
  • if I ran through slots myself and checked for slots with left > -1, I usually got the right number of fingers
  • ... but not always. sometimes I ended up with not as many fingers registered as were actually on the screen. I'd guess it just depends on how many fingers were in the event when the first EV_SYN was received, even if the next EV_SYN picked up more fingers, so I'm not sure what to do about that.
  • the worst part of all this is that if I took the stylus and put my hand on the screen as if to write, my hand only registered as 1 slot, so I'm not sure how to reject touch in that case :(

code I tested with:

 target->mouse.down += [=](auto &ev) {
auto touch_ev = dynamic_cast<input::TouchEvent*>(ev.original.get());
if (touch_ev) {
int f = 0;
for (auto s : touch_ev->slots)
if (s.left > -1)
f++;
std::cerr << "touch event with "
<< touch_ev->fingers << " fingers"
<< "; " << touch_ev->slot << " slots"
<< "; " << f << " slots with left > -1"
<< std::endl;
if (touch_ev->is_multitouch) {
std::cerr << "skipping multitouch" << std::endl;
return;
}
}
};

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

Ah, ok I found https://www.kernel.org/doc/html/v4.18/input/multi-touch-protocol.html (you might already be aware of similar documentation, this is all new to me) which describes what all those ABS_MT_* fields mean. I see we aren't capturing ABS_MT_TOUCH_MAJOR or ABS_MT_TOUCH_MINOR, but those describe the size of the touch on the screen. For me a finger shows up as around major=17;minor=8. The edge of my hand has a lot of different sizes, but it seems like it's always at least major >= 26 OR minor >= 17, so maybe that's a reasonable threshold.

@raisjn

Copy link
Copy Markdown
MemberAuthor

i did know about those docs and have read about the axis minor/major, but didn't think about how to use them for palm detection, nice!

it seems like this diff is not behaving like i thought it would - but at least you have ideas for how to fix palm touch :-D

i think that holding prev_ev and using it as the base makes a lot of sense, so i'd like to achieve that

@raisjn
raisjn marked this pull request as draft February 4, 2021 00:41
@raisjn

Copy link
Copy Markdown
MemberAuthor

ok, i think this works for coalescing the previous event (tested remux, harmony, mines, simple, genie) with touch and stylus. the major piece is in d96ebde.

genie gestures work and now use count_fingers() for filtering instead of the slot.

in addition to those docs, i also used https://elixir.bootlin.com/linux/latest/source/include/linux/input.h.

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 01:46
@raisjn
raisjn marked this pull request as draft February 4, 2021 02:18
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

have to do some more testing and debugging

was running into strangeness with remux due to remux touch flood, now fixed

i'll likely keep testing this and merge it on the weekend, but preliminary tests seem to show its working at least as well as previously

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 02:38

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works great on my end! The only thing that still seems off is the initial finger count (calling count_fingers() does always end up with the right number).

Comment threadsrc/rmkit/input/input.cpy Outdated
Comment on lines +65 to +66
prev_ev = event
event = prev_ev

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the event = prev_ev part is redundant? Also should this have a call to event.finalize() somewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

event.finalize() is called on EV_SYN

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh you're totally right, it's like 5 lines above this 🤦

Comment threadsrc/rmkit/input/events.cpy Outdated
self.x = t.x
self.y = t.y
self.left = t.left
self.lifted = t.lifted

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still seeing fingers=0 in a SynMotionEvent handler when going through dynamic_cast<TouchEvent*>(ev.original().get())->fingers. I think it's b/c that isn't copied here. Does this need an explicit copy constructor, or would the default work?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i removed explicit constructor, hopefully things improve, but it might be that count_fingers() is always useful to call before checking fingers (and we put that in to main_loop?).

Comment on lines -131 to +142
break
if self.left == 0:
self.lifted = true

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we see tracking_id -1 would we want to reset the slot to its initial -1, -1, -1 values? I assume tracking_id=-1 should mean that any existing x,y coords are invalid.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the tracking ID is set to -1, next time the slot is used it will get an X and Y coordinate, i believe.

one potential problem with setting to -1 at this point is that this event is still used (i believe) during mainloop's event dispatch.

* remove copy constructor
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

thanks for the help with this - it definitely is better code now. i just glanced at docs again and grepped "palm" and saw MT_TOOL_PALM. i'm curious if we will get this tool type or not. (accidentally put comment in wrong PR a moment ago)

UPDATE: nope, i think evtest says MT_TOOL_PALM is not supported (max of ABS_MT_TOOL_TYPE is 1, should be >= 2 when PALM is supported)

@raisjn
raisjn merged commit bcbf75a into masterFeb 6, 2021
@raisjn
raisjn deleted the fix_mt_slots branch February 7, 2021 13:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@raisjn@mrichards42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[rmkit][input] copy old mt slots from previous event - #77

Merged
raisjn merged 9 commits into
masterfrom
fix_mt_slots
Feb 6, 2021
Merged

[rmkit][input] copy old mt slots from previous event#77
raisjn merged 9 commits into
masterfrom
fix_mt_slots

Conversation

@raisjn

@raisjnraisjn commented Feb 3, 2021

Copy link
Copy Markdown
Member
  • remove wonky backwards event coalescing, instead start with prev_ev for all events
  • remove MouseEvent, its not applicable since we started using resim
  • set lifted on TouchEvent when a finger is lifted (TRACKING_ID set to -1)
  • add count_fingers() to TouchEvent and use TouchEvent.fingers in gestures.cpy for figuring out how many fingers pressed

@raisjnraisjn changed the title [rmkit] copy old mt slots from previous event[rmkit][input] copy old mt slots from previous eventFeb 3, 2021
@raisjnraisjn mentioned this pull request Feb 3, 2021
12 tasks

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like this should work -- I haven't tried it out myself, but I'll give it a shot in a little bit on puzzles and let you know if something is obviously wrong.

Comment on lines -37 to +38
def marshal(T ev):
// marshal can update the event
def marshal(T &ev):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not seeing where marshal updates an event. Is this left over from a previous version, or am I missing something (likely since I don't know this code very well)?

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

ok, I did a little testing of my own, just in a mouse.down event.

  • fingers was always 0, even when the last slot was > 0
  • so is_multitouch was always false, since that's calculated from fingers
  • if I ran through slots myself and checked for slots with left > -1, I usually got the right number of fingers
  • ... but not always. sometimes I ended up with not as many fingers registered as were actually on the screen. I'd guess it just depends on how many fingers were in the event when the first EV_SYN was received, even if the next EV_SYN picked up more fingers, so I'm not sure what to do about that.
  • the worst part of all this is that if I took the stylus and put my hand on the screen as if to write, my hand only registered as 1 slot, so I'm not sure how to reject touch in that case :(

code I tested with:

 target->mouse.down += [=](auto &ev) {
auto touch_ev = dynamic_cast<input::TouchEvent*>(ev.original.get());
if (touch_ev) {
int f = 0;
for (auto s : touch_ev->slots)
if (s.left > -1)
f++;
std::cerr << "touch event with "
<< touch_ev->fingers << " fingers"
<< "; " << touch_ev->slot << " slots"
<< "; " << f << " slots with left > -1"
<< std::endl;
if (touch_ev->is_multitouch) {
std::cerr << "skipping multitouch" << std::endl;
return;
}
}
};

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

Ah, ok I found https://www.kernel.org/doc/html/v4.18/input/multi-touch-protocol.html (you might already be aware of similar documentation, this is all new to me) which describes what all those ABS_MT_* fields mean. I see we aren't capturing ABS_MT_TOUCH_MAJOR or ABS_MT_TOUCH_MINOR, but those describe the size of the touch on the screen. For me a finger shows up as around major=17;minor=8. The edge of my hand has a lot of different sizes, but it seems like it's always at least major >= 26 OR minor >= 17, so maybe that's a reasonable threshold.

@raisjn

Copy link
Copy Markdown
MemberAuthor

i did know about those docs and have read about the axis minor/major, but didn't think about how to use them for palm detection, nice!

it seems like this diff is not behaving like i thought it would - but at least you have ideas for how to fix palm touch :-D

i think that holding prev_ev and using it as the base makes a lot of sense, so i'd like to achieve that

@raisjn
raisjn marked this pull request as draft February 4, 2021 00:41
@raisjn

Copy link
Copy Markdown
MemberAuthor

ok, i think this works for coalescing the previous event (tested remux, harmony, mines, simple, genie) with touch and stylus. the major piece is in d96ebde.

genie gestures work and now use count_fingers() for filtering instead of the slot.

in addition to those docs, i also used https://elixir.bootlin.com/linux/latest/source/include/linux/input.h.

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 01:46
@raisjn
raisjn marked this pull request as draft February 4, 2021 02:18
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

have to do some more testing and debugging

was running into strangeness with remux due to remux touch flood, now fixed

i'll likely keep testing this and merge it on the weekend, but preliminary tests seem to show its working at least as well as previously

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 02:38

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works great on my end! The only thing that still seems off is the initial finger count (calling count_fingers() does always end up with the right number).

Comment threadsrc/rmkit/input/input.cpy Outdated
Comment on lines +65 to +66
prev_ev = event
event = prev_ev

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the event = prev_ev part is redundant? Also should this have a call to event.finalize() somewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

event.finalize() is called on EV_SYN

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh you're totally right, it's like 5 lines above this 🤦

Comment threadsrc/rmkit/input/events.cpy Outdated
self.x = t.x
self.y = t.y
self.left = t.left
self.lifted = t.lifted

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still seeing fingers=0 in a SynMotionEvent handler when going through dynamic_cast<TouchEvent*>(ev.original().get())->fingers. I think it's b/c that isn't copied here. Does this need an explicit copy constructor, or would the default work?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i removed explicit constructor, hopefully things improve, but it might be that count_fingers() is always useful to call before checking fingers (and we put that in to main_loop?).

Comment on lines -131 to +142
break
if self.left == 0:
self.lifted = true

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we see tracking_id -1 would we want to reset the slot to its initial -1, -1, -1 values? I assume tracking_id=-1 should mean that any existing x,y coords are invalid.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the tracking ID is set to -1, next time the slot is used it will get an X and Y coordinate, i believe.

one potential problem with setting to -1 at this point is that this event is still used (i believe) during mainloop's event dispatch.

* remove copy constructor
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

thanks for the help with this - it definitely is better code now. i just glanced at docs again and grepped "palm" and saw MT_TOOL_PALM. i'm curious if we will get this tool type or not. (accidentally put comment in wrong PR a moment ago)

UPDATE: nope, i think evtest says MT_TOOL_PALM is not supported (max of ABS_MT_TOOL_TYPE is 1, should be >= 2 when PALM is supported)

@raisjn
raisjn merged commit bcbf75a into masterFeb 6, 2021
@raisjn
raisjn deleted the fix_mt_slots branch February 7, 2021 13:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@raisjn@mrichards42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[rmkit][input] copy old mt slots from previous event - #77

Merged
raisjn merged 9 commits into
masterfrom
fix_mt_slots
Feb 6, 2021
Merged

[rmkit][input] copy old mt slots from previous event#77
raisjn merged 9 commits into
masterfrom
fix_mt_slots

Conversation

@raisjn

@raisjnraisjn commented Feb 3, 2021

Copy link
Copy Markdown
Member
  • remove wonky backwards event coalescing, instead start with prev_ev for all events
  • remove MouseEvent, its not applicable since we started using resim
  • set lifted on TouchEvent when a finger is lifted (TRACKING_ID set to -1)
  • add count_fingers() to TouchEvent and use TouchEvent.fingers in gestures.cpy for figuring out how many fingers pressed

@raisjnraisjn changed the title [rmkit] copy old mt slots from previous event[rmkit][input] copy old mt slots from previous eventFeb 3, 2021
@raisjnraisjn mentioned this pull request Feb 3, 2021
12 tasks

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like this should work -- I haven't tried it out myself, but I'll give it a shot in a little bit on puzzles and let you know if something is obviously wrong.

Comment on lines -37 to +38
def marshal(T ev):
// marshal can update the event
def marshal(T &ev):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not seeing where marshal updates an event. Is this left over from a previous version, or am I missing something (likely since I don't know this code very well)?

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

ok, I did a little testing of my own, just in a mouse.down event.

  • fingers was always 0, even when the last slot was > 0
  • so is_multitouch was always false, since that's calculated from fingers
  • if I ran through slots myself and checked for slots with left > -1, I usually got the right number of fingers
  • ... but not always. sometimes I ended up with not as many fingers registered as were actually on the screen. I'd guess it just depends on how many fingers were in the event when the first EV_SYN was received, even if the next EV_SYN picked up more fingers, so I'm not sure what to do about that.
  • the worst part of all this is that if I took the stylus and put my hand on the screen as if to write, my hand only registered as 1 slot, so I'm not sure how to reject touch in that case :(

code I tested with:

 target->mouse.down += [=](auto &ev) {
auto touch_ev = dynamic_cast<input::TouchEvent*>(ev.original.get());
if (touch_ev) {
int f = 0;
for (auto s : touch_ev->slots)
if (s.left > -1)
f++;
std::cerr << "touch event with "
<< touch_ev->fingers << " fingers"
<< "; " << touch_ev->slot << " slots"
<< "; " << f << " slots with left > -1"
<< std::endl;
if (touch_ev->is_multitouch) {
std::cerr << "skipping multitouch" << std::endl;
return;
}
}
};

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

Ah, ok I found https://www.kernel.org/doc/html/v4.18/input/multi-touch-protocol.html (you might already be aware of similar documentation, this is all new to me) which describes what all those ABS_MT_* fields mean. I see we aren't capturing ABS_MT_TOUCH_MAJOR or ABS_MT_TOUCH_MINOR, but those describe the size of the touch on the screen. For me a finger shows up as around major=17;minor=8. The edge of my hand has a lot of different sizes, but it seems like it's always at least major >= 26 OR minor >= 17, so maybe that's a reasonable threshold.

@raisjn

Copy link
Copy Markdown
MemberAuthor

i did know about those docs and have read about the axis minor/major, but didn't think about how to use them for palm detection, nice!

it seems like this diff is not behaving like i thought it would - but at least you have ideas for how to fix palm touch :-D

i think that holding prev_ev and using it as the base makes a lot of sense, so i'd like to achieve that

@raisjn
raisjn marked this pull request as draft February 4, 2021 00:41
@raisjn

Copy link
Copy Markdown
MemberAuthor

ok, i think this works for coalescing the previous event (tested remux, harmony, mines, simple, genie) with touch and stylus. the major piece is in d96ebde.

genie gestures work and now use count_fingers() for filtering instead of the slot.

in addition to those docs, i also used https://elixir.bootlin.com/linux/latest/source/include/linux/input.h.

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 01:46
@raisjn
raisjn marked this pull request as draft February 4, 2021 02:18
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

have to do some more testing and debugging

was running into strangeness with remux due to remux touch flood, now fixed

i'll likely keep testing this and merge it on the weekend, but preliminary tests seem to show its working at least as well as previously

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 02:38

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works great on my end! The only thing that still seems off is the initial finger count (calling count_fingers() does always end up with the right number).

Comment threadsrc/rmkit/input/input.cpy Outdated
Comment on lines +65 to +66
prev_ev = event
event = prev_ev

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the event = prev_ev part is redundant? Also should this have a call to event.finalize() somewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

event.finalize() is called on EV_SYN

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh you're totally right, it's like 5 lines above this 🤦

Comment threadsrc/rmkit/input/events.cpy Outdated
self.x = t.x
self.y = t.y
self.left = t.left
self.lifted = t.lifted

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still seeing fingers=0 in a SynMotionEvent handler when going through dynamic_cast<TouchEvent*>(ev.original().get())->fingers. I think it's b/c that isn't copied here. Does this need an explicit copy constructor, or would the default work?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i removed explicit constructor, hopefully things improve, but it might be that count_fingers() is always useful to call before checking fingers (and we put that in to main_loop?).

Comment on lines -131 to +142
break
if self.left == 0:
self.lifted = true

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we see tracking_id -1 would we want to reset the slot to its initial -1, -1, -1 values? I assume tracking_id=-1 should mean that any existing x,y coords are invalid.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the tracking ID is set to -1, next time the slot is used it will get an X and Y coordinate, i believe.

one potential problem with setting to -1 at this point is that this event is still used (i believe) during mainloop's event dispatch.

* remove copy constructor
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

thanks for the help with this - it definitely is better code now. i just glanced at docs again and grepped "palm" and saw MT_TOOL_PALM. i'm curious if we will get this tool type or not. (accidentally put comment in wrong PR a moment ago)

UPDATE: nope, i think evtest says MT_TOOL_PALM is not supported (max of ABS_MT_TOOL_TYPE is 1, should be >= 2 when PALM is supported)

@raisjn
raisjn merged commit bcbf75a into masterFeb 6, 2021
@raisjn
raisjn deleted the fix_mt_slots branch February 7, 2021 13:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@raisjn@mrichards42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[rmkit][input] copy old mt slots from previous event - #77

Merged
raisjn merged 9 commits into
masterfrom
fix_mt_slots
Feb 6, 2021
Merged

[rmkit][input] copy old mt slots from previous event#77
raisjn merged 9 commits into
masterfrom
fix_mt_slots

Conversation

@raisjn

@raisjnraisjn commented Feb 3, 2021

Copy link
Copy Markdown
Member
  • remove wonky backwards event coalescing, instead start with prev_ev for all events
  • remove MouseEvent, its not applicable since we started using resim
  • set lifted on TouchEvent when a finger is lifted (TRACKING_ID set to -1)
  • add count_fingers() to TouchEvent and use TouchEvent.fingers in gestures.cpy for figuring out how many fingers pressed

@raisjnraisjn changed the title [rmkit] copy old mt slots from previous event[rmkit][input] copy old mt slots from previous eventFeb 3, 2021
@raisjnraisjn mentioned this pull request Feb 3, 2021
12 tasks

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like this should work -- I haven't tried it out myself, but I'll give it a shot in a little bit on puzzles and let you know if something is obviously wrong.

Comment on lines -37 to +38
def marshal(T ev):
// marshal can update the event
def marshal(T &ev):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not seeing where marshal updates an event. Is this left over from a previous version, or am I missing something (likely since I don't know this code very well)?

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

ok, I did a little testing of my own, just in a mouse.down event.

  • fingers was always 0, even when the last slot was > 0
  • so is_multitouch was always false, since that's calculated from fingers
  • if I ran through slots myself and checked for slots with left > -1, I usually got the right number of fingers
  • ... but not always. sometimes I ended up with not as many fingers registered as were actually on the screen. I'd guess it just depends on how many fingers were in the event when the first EV_SYN was received, even if the next EV_SYN picked up more fingers, so I'm not sure what to do about that.
  • the worst part of all this is that if I took the stylus and put my hand on the screen as if to write, my hand only registered as 1 slot, so I'm not sure how to reject touch in that case :(

code I tested with:

 target->mouse.down += [=](auto &ev) {
auto touch_ev = dynamic_cast<input::TouchEvent*>(ev.original.get());
if (touch_ev) {
int f = 0;
for (auto s : touch_ev->slots)
if (s.left > -1)
f++;
std::cerr << "touch event with "
<< touch_ev->fingers << " fingers"
<< "; " << touch_ev->slot << " slots"
<< "; " << f << " slots with left > -1"
<< std::endl;
if (touch_ev->is_multitouch) {
std::cerr << "skipping multitouch" << std::endl;
return;
}
}
};

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

Ah, ok I found https://www.kernel.org/doc/html/v4.18/input/multi-touch-protocol.html (you might already be aware of similar documentation, this is all new to me) which describes what all those ABS_MT_* fields mean. I see we aren't capturing ABS_MT_TOUCH_MAJOR or ABS_MT_TOUCH_MINOR, but those describe the size of the touch on the screen. For me a finger shows up as around major=17;minor=8. The edge of my hand has a lot of different sizes, but it seems like it's always at least major >= 26 OR minor >= 17, so maybe that's a reasonable threshold.

@raisjn

Copy link
Copy Markdown
MemberAuthor

i did know about those docs and have read about the axis minor/major, but didn't think about how to use them for palm detection, nice!

it seems like this diff is not behaving like i thought it would - but at least you have ideas for how to fix palm touch :-D

i think that holding prev_ev and using it as the base makes a lot of sense, so i'd like to achieve that

@raisjn
raisjn marked this pull request as draft February 4, 2021 00:41
@raisjn

Copy link
Copy Markdown
MemberAuthor

ok, i think this works for coalescing the previous event (tested remux, harmony, mines, simple, genie) with touch and stylus. the major piece is in d96ebde.

genie gestures work and now use count_fingers() for filtering instead of the slot.

in addition to those docs, i also used https://elixir.bootlin.com/linux/latest/source/include/linux/input.h.

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 01:46
@raisjn
raisjn marked this pull request as draft February 4, 2021 02:18
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

have to do some more testing and debugging

was running into strangeness with remux due to remux touch flood, now fixed

i'll likely keep testing this and merge it on the weekend, but preliminary tests seem to show its working at least as well as previously

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 02:38

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works great on my end! The only thing that still seems off is the initial finger count (calling count_fingers() does always end up with the right number).

Comment threadsrc/rmkit/input/input.cpy Outdated
Comment on lines +65 to +66
prev_ev = event
event = prev_ev

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the event = prev_ev part is redundant? Also should this have a call to event.finalize() somewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

event.finalize() is called on EV_SYN

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh you're totally right, it's like 5 lines above this 🤦

Comment threadsrc/rmkit/input/events.cpy Outdated
self.x = t.x
self.y = t.y
self.left = t.left
self.lifted = t.lifted

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still seeing fingers=0 in a SynMotionEvent handler when going through dynamic_cast<TouchEvent*>(ev.original().get())->fingers. I think it's b/c that isn't copied here. Does this need an explicit copy constructor, or would the default work?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i removed explicit constructor, hopefully things improve, but it might be that count_fingers() is always useful to call before checking fingers (and we put that in to main_loop?).

Comment on lines -131 to +142
break
if self.left == 0:
self.lifted = true

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we see tracking_id -1 would we want to reset the slot to its initial -1, -1, -1 values? I assume tracking_id=-1 should mean that any existing x,y coords are invalid.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the tracking ID is set to -1, next time the slot is used it will get an X and Y coordinate, i believe.

one potential problem with setting to -1 at this point is that this event is still used (i believe) during mainloop's event dispatch.

* remove copy constructor
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

thanks for the help with this - it definitely is better code now. i just glanced at docs again and grepped "palm" and saw MT_TOOL_PALM. i'm curious if we will get this tool type or not. (accidentally put comment in wrong PR a moment ago)

UPDATE: nope, i think evtest says MT_TOOL_PALM is not supported (max of ABS_MT_TOOL_TYPE is 1, should be >= 2 when PALM is supported)

@raisjn
raisjn merged commit bcbf75a into masterFeb 6, 2021
@raisjn
raisjn deleted the fix_mt_slots branch February 7, 2021 13:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@raisjn@mrichards42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[rmkit][input] copy old mt slots from previous event - #77

Merged
raisjn merged 9 commits into
masterfrom
fix_mt_slots
Feb 6, 2021
Merged

[rmkit][input] copy old mt slots from previous event#77
raisjn merged 9 commits into
masterfrom
fix_mt_slots

Conversation

@raisjn

@raisjnraisjn commented Feb 3, 2021

Copy link
Copy Markdown
Member
  • remove wonky backwards event coalescing, instead start with prev_ev for all events
  • remove MouseEvent, its not applicable since we started using resim
  • set lifted on TouchEvent when a finger is lifted (TRACKING_ID set to -1)
  • add count_fingers() to TouchEvent and use TouchEvent.fingers in gestures.cpy for figuring out how many fingers pressed

@raisjnraisjn changed the title [rmkit] copy old mt slots from previous event[rmkit][input] copy old mt slots from previous eventFeb 3, 2021
@raisjnraisjn mentioned this pull request Feb 3, 2021
12 tasks

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like this should work -- I haven't tried it out myself, but I'll give it a shot in a little bit on puzzles and let you know if something is obviously wrong.

Comment on lines -37 to +38
def marshal(T ev):
// marshal can update the event
def marshal(T &ev):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not seeing where marshal updates an event. Is this left over from a previous version, or am I missing something (likely since I don't know this code very well)?

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

ok, I did a little testing of my own, just in a mouse.down event.

  • fingers was always 0, even when the last slot was > 0
  • so is_multitouch was always false, since that's calculated from fingers
  • if I ran through slots myself and checked for slots with left > -1, I usually got the right number of fingers
  • ... but not always. sometimes I ended up with not as many fingers registered as were actually on the screen. I'd guess it just depends on how many fingers were in the event when the first EV_SYN was received, even if the next EV_SYN picked up more fingers, so I'm not sure what to do about that.
  • the worst part of all this is that if I took the stylus and put my hand on the screen as if to write, my hand only registered as 1 slot, so I'm not sure how to reject touch in that case :(

code I tested with:

 target->mouse.down += [=](auto &ev) {
auto touch_ev = dynamic_cast<input::TouchEvent*>(ev.original.get());
if (touch_ev) {
int f = 0;
for (auto s : touch_ev->slots)
if (s.left > -1)
f++;
std::cerr << "touch event with "
<< touch_ev->fingers << " fingers"
<< "; " << touch_ev->slot << " slots"
<< "; " << f << " slots with left > -1"
<< std::endl;
if (touch_ev->is_multitouch) {
std::cerr << "skipping multitouch" << std::endl;
return;
}
}
};

@mrichards42

mrichards42 commented Feb 4, 2021

Copy link
Copy Markdown
Collaborator

Ah, ok I found https://www.kernel.org/doc/html/v4.18/input/multi-touch-protocol.html (you might already be aware of similar documentation, this is all new to me) which describes what all those ABS_MT_* fields mean. I see we aren't capturing ABS_MT_TOUCH_MAJOR or ABS_MT_TOUCH_MINOR, but those describe the size of the touch on the screen. For me a finger shows up as around major=17;minor=8. The edge of my hand has a lot of different sizes, but it seems like it's always at least major >= 26 OR minor >= 17, so maybe that's a reasonable threshold.

@raisjn

Copy link
Copy Markdown
MemberAuthor

i did know about those docs and have read about the axis minor/major, but didn't think about how to use them for palm detection, nice!

it seems like this diff is not behaving like i thought it would - but at least you have ideas for how to fix palm touch :-D

i think that holding prev_ev and using it as the base makes a lot of sense, so i'd like to achieve that

@raisjn
raisjn marked this pull request as draft February 4, 2021 00:41
@raisjn

Copy link
Copy Markdown
MemberAuthor

ok, i think this works for coalescing the previous event (tested remux, harmony, mines, simple, genie) with touch and stylus. the major piece is in d96ebde.

genie gestures work and now use count_fingers() for filtering instead of the slot.

in addition to those docs, i also used https://elixir.bootlin.com/linux/latest/source/include/linux/input.h.

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 01:46
@raisjn
raisjn marked this pull request as draft February 4, 2021 02:18
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

have to do some more testing and debugging

was running into strangeness with remux due to remux touch flood, now fixed

i'll likely keep testing this and merge it on the weekend, but preliminary tests seem to show its working at least as well as previously

@raisjn
raisjn marked this pull request as ready for review February 4, 2021 02:38

@mrichards42mrichards42 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works great on my end! The only thing that still seems off is the initial finger count (calling count_fingers() does always end up with the right number).

Comment threadsrc/rmkit/input/input.cpy Outdated
Comment on lines +65 to +66
prev_ev = event
event = prev_ev

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the event = prev_ev part is redundant? Also should this have a call to event.finalize() somewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

event.finalize() is called on EV_SYN

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh you're totally right, it's like 5 lines above this 🤦

Comment threadsrc/rmkit/input/events.cpy Outdated
self.x = t.x
self.y = t.y
self.left = t.left
self.lifted = t.lifted

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still seeing fingers=0 in a SynMotionEvent handler when going through dynamic_cast<TouchEvent*>(ev.original().get())->fingers. I think it's b/c that isn't copied here. Does this need an explicit copy constructor, or would the default work?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i removed explicit constructor, hopefully things improve, but it might be that count_fingers() is always useful to call before checking fingers (and we put that in to main_loop?).

Comment on lines -131 to +142
break
if self.left == 0:
self.lifted = true

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When we see tracking_id -1 would we want to reset the slot to its initial -1, -1, -1 values? I assume tracking_id=-1 should mean that any existing x,y coords are invalid.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the tracking ID is set to -1, next time the slot is used it will get an X and Y coordinate, i believe.

one potential problem with setting to -1 at this point is that this event is still used (i believe) during mainloop's event dispatch.

* remove copy constructor
@raisjn

raisjn commented Feb 4, 2021

Copy link
Copy Markdown
MemberAuthor

thanks for the help with this - it definitely is better code now. i just glanced at docs again and grepped "palm" and saw MT_TOOL_PALM. i'm curious if we will get this tool type or not. (accidentally put comment in wrong PR a moment ago)

UPDATE: nope, i think evtest says MT_TOOL_PALM is not supported (max of ABS_MT_TOOL_TYPE is 1, should be >= 2 when PALM is supported)

@raisjn
raisjn merged commit bcbf75a into masterFeb 6, 2021
@raisjn
raisjn deleted the fix_mt_slots branch February 7, 2021 13:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@raisjn@mrichards42